diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..629ad03 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ + +.git + +**/*~ +**/target/ +**/nb-configuration.xml +guacamole/customs.json + diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..91ff66f --- /dev/null +++ b/.drone.yml @@ -0,0 +1,32 @@ +kind: pipeline +type: kubernetes +name: default + +node_selector: + physical-node: dev1 + +trigger: + event: + - push +workspace: + path: /drone/src + +steps: + - name: pull image to dockerhub + image: docker.io/owncloudci/drone-docker-buildx:4 + privileged: true + settings: + cache-from: [ "safebox/guacamole-tomcat" ] + repo: safebox/guacamole-tomcat + dockerfile: Dockerfile.alpine + tags: latest + username: + from_secret: dockerhub-username + password: + from_secret: dockerhub-password + platforms: + - linux/amd64 + - linux/arm64 + when: + event: + - push diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bcc52fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*~ +target/ diff --git a/.ratignore b/.ratignore new file mode 100644 index 0000000..eac248a --- /dev/null +++ b/.ratignore @@ -0,0 +1,5 @@ +.github/** +CONTRIBUTING +doc/licenses/*/**/* +doc/**/html/*.html +guacamole-docker/*.pref diff --git a/CONTRIBUTING b/CONTRIBUTING new file mode 100644 index 0000000..9f005cd --- /dev/null +++ b/CONTRIBUTING @@ -0,0 +1,52 @@ + +------------------------------------------------------------ + Contributing to Apache Guacamole +------------------------------------------------------------ + +Thank you for contributing to the Apache Guacamole project! + +There are certain procedures that must be followed for all contributions. These +procedures are necessary to allow us to allocate resources for reviewing and +testing your contribution, as well as communicate effectively with you during +the review process. + +1) Create an issue in our JIRA + + All changes to Guacamole must have corresponding issues in JIRA so the + change can be properly tracked: + + https://issues.apache.org/jira/browse/GUACAMOLE/ + + If you do not already have an account on the Apache Software Foundation's + JIRA, you will need to create one before creating your new issue. + +2) Make and test your changes locally + + The Guacamole source is maintained in git repositories hosted on GitHub: + + https://github.com/apache/guacamole-client + https://github.com/apache/guacamole-manual + https://github.com/apache/guacamole-server + https://github.com/apache/guacamole-website + + To make your changes, fork the applicable repositories and make commits + to a topic branch in your fork. Commits should be made in logical units + and must reference the JIRA issue number: + + $ git commit -m "GUACAMOLE-123: High-level message describing the changes." + + Avoid commits which cover multiple, distinct goals that could (and should) + be handled separately. + + If you do not already have an account on GitHub, you will need to create + one before making your changes. + +3) Submit your changes via a pull request on GitHub + + Once your changes are ready, submit them by creating a pull request for + the corresponding topic branch you created when you began working on your + changes. + + The Guacamole team will then review your changes and, if they pass review, + your changes will be merged. + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..991f918 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,106 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# +# Dockerfile for guacamole-client +# + +# Use args for Tomcat image label to allow image builder to choose alternatives +# such as `--build-arg TOMCAT_JRE=jre8-alpine` +# +ARG TOMCAT_VERSION=9 +ARG TOMCAT_JRE=jdk21 + +# Use official maven image for the build +FROM maven:3-eclipse-temurin-21 AS builder + +# Use Mozilla's Firefox PPA (newer Ubuntu lacks a "firefox-esr" package and +# provides only a transitional "firefox" package that actually requires Snap +# and thus can't be used within Docker) +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y software-properties-common \ + && add-apt-repository -y ppa:mozillateam/ppa + +# Explicitly prefer packages from the Firefox PPA +COPY guacamole-docker/mozilla-firefox.pref /etc/apt/preferences.d/ + +# Install firefox browser for sake of JavaScript unit tests +RUN apt-get update && apt-get install -y firefox + +# Arbitrary arguments that can be passed to the maven build. By default, an +# argument will be provided to explicitly unskip any skipped tests. To, for +# example, allow the building of the RADIUS auth extension, pass a build profile +# as well: `--build-arg MAVEN_ARGUMENTS="-P lgpl-extensions -DskipTests=false"`. +ARG MAVEN_ARGUMENTS="-DskipTests=false" + +# Versions of JDBC drivers to bundle within image +ARG MSSQL_JDBC_VERSION=9.4.1 +ARG MYSQL_JDBC_VERSION=8.3.0 +ARG PGSQL_JDBC_VERSION=42.7.2 + +# Build environment variables +ENV \ + BUILD_DIR=/tmp/guacamole-docker-BUILD + +# Add configuration scripts +COPY guacamole-docker/bin/ /opt/guacamole/bin/ +COPY guacamole-docker/build.d/ /opt/guacamole/build.d/ +COPY guacamole-docker/entrypoint.d/ /opt/guacamole/entrypoint.d/ +COPY guacamole-docker/environment/ /opt/guacamole/environment/ + +# Copy source to container for sake of build +COPY . "$BUILD_DIR" + +# Run the build itself +RUN /opt/guacamole/bin/build-guacamole.sh "$BUILD_DIR" /opt/guacamole + +RUN rm -rf /opt/guacamole/build.d /opt/guacamole/bin/build-guacamole.sh + +# For the runtime image, we start with the official Tomcat distribution +FROM tomcat:${TOMCAT_VERSION}-${TOMCAT_JRE} + +# Install XMLStarlet for server.xml alterations +RUN apt-get update -qq \ + && apt-get install -y xmlstarlet \ + && rm -rf /var/lib/apt/lists/* + +# This is where the build artifacts go in the runtime image +WORKDIR /opt/guacamole + +# Copy artifacts from builder image into this image +COPY --from=builder /opt/guacamole/ . + +# Create a new user guacamole +ARG UID=1001 +ARG GID=1001 +RUN groupadd --gid $GID guacamole +RUN useradd --system --create-home --shell /usr/sbin/nologin --uid $UID --gid $GID guacamole + +# Run with user guacamole +USER guacamole + +# Environment variable defaults +ENV BAN_ENABLED=true \ + ENABLE_FILE_ENVIRONMENT_PROPERTIES=true \ + GUACAMOLE_HOME=/etc/guacamole + +# Start Guacamole under Tomcat, listening on 0.0.0.0:8080 +EXPOSE 8080 +CMD ["/opt/guacamole/bin/entrypoint.sh" ] diff --git a/Dockerfile.alpine b/Dockerfile.alpine new file mode 100644 index 0000000..d506c53 --- /dev/null +++ b/Dockerfile.alpine @@ -0,0 +1,122 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# +# Dockerfile for guacamole-client +# + +# Use args for Tomcat image label to allow image builder to choose alternatives +# such as `--build-arg TOMCAT_JRE=jre8-alpine` +# +ARG TOMCAT_VERSION=9 +ARG TOMCAT_JRE=jdk21 + +# Use official maven image for the build +FROM maven:3-eclipse-temurin-21 AS builder + +# Use Mozilla's Firefox PPA (newer Ubuntu lacks a "firefox-esr" package and +# provides only a transitional "firefox" package that actually requires Snap +# and thus can't be used within Docker) +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y software-properties-common \ + && add-apt-repository -y ppa:mozillateam/ppa + +# Explicitly prefer packages from the Firefox PPA +COPY guacamole-docker/mozilla-firefox.pref /etc/apt/preferences.d/ + +# Install firefox browser for sake of JavaScript unit tests +RUN apt-get update && apt-get install -y firefox + +# Arbitrary arguments that can be passed to the maven build. By default, an +# argument will be provided to explicitly unskip any skipped tests. To, for +# example, allow the building of the RADIUS auth extension, pass a build profile +# as well: `--build-arg MAVEN_ARGUMENTS="-P lgpl-extensions -DskipTests=false"`. +ARG MAVEN_ARGUMENTS="-DskipTests=false" + +# Versions of JDBC drivers to bundle within image +ARG MSSQL_JDBC_VERSION=9.4.1 +ARG MYSQL_JDBC_VERSION=8.3.0 +ARG PGSQL_JDBC_VERSION=42.7.2 + +# Build environment variables +ENV \ + BUILD_DIR=/tmp/guacamole-docker-BUILD + +# Add configuration scripts +COPY guacamole-docker/bin/ /opt/guacamole/bin/ +COPY guacamole-docker/build.d/ /opt/guacamole/build.d/ +COPY guacamole-docker/entrypoint.d/ /opt/guacamole/entrypoint.d/ +COPY guacamole-docker/environment/ /opt/guacamole/environment/ + +# Copy source to container for sake of build +COPY . "$BUILD_DIR" + +# Run the build itself +RUN /opt/guacamole/bin/build-guacamole.sh "$BUILD_DIR" /opt/guacamole + +RUN rm -rf /opt/guacamole/build.d /opt/guacamole/bin/build-guacamole.sh + +# For the runtime image, we start with the official Tomcat distribution + +RUN ls -al /opt/guacamole/ + +FROM alpine + +COPY --from=builder /opt/guacamole /opt/guacamole + +RUN ls -al / + +ENV TOMCAT_MAJOR=9 \ + TOMCAT_VERSION=9.0.78 \ + CATALINA_HOME=/opt/guacamole + +RUN \ + apk add --update --no-cache \ + openjdk8-jre curl mariadb-client bash openssl && \ + curl -jkSL -o /tmp/apache-tomcat.tar.gz \ + http://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_MAJOR}/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz && \ + gunzip /tmp/apache-tomcat.tar.gz && \ + tar -C /opt -xf /tmp/apache-tomcat.tar && \ + ln -s /opt/apache-tomcat-$TOMCAT_VERSION /usr/local/tomcat && \ + chmod -R a+rx /usr/local/tomcat/ + +# cleanup +RUN apk del curl && \ + rm -rf /tmp/* /var/cache/apk/* /usr/local/tomcat/webapps/* + + +# Create a new user guacamole +COPY /start.sh /opt/guacamole/bin/ +RUN chmod a+x /opt/guacamole/bin/start.sh +ARG UID=1001 +ARG GID=1001 +RUN addgroup -g $GID guacamole +RUN adduser -S -D -s /usr/sbin/nologin -u $UID guacamole --ingroup guacamole + +# Run with user guacamole +USER guacamole + +EXPOSE 8080 + +WORKDIR $CATALINA_HOME + +# Start Guacamole under Tomcat, listening on 0.0.0.0:8080 +EXPOSE 8080 +CMD ["/opt/guacamole/bin/start.sh"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3fa304c --- /dev/null +++ b/LICENSE @@ -0,0 +1,293 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +============================================================================== + +APACHE GUACAMOLE SUBCOMPONENTS + +Apache Guacamole includes a number of subcomponents with separate copyright +notices and license terms. Your use of these subcomponents is subject to the +terms and conditions of the following licenses. + + +Carlito (http://code.google.com/p/chromium/issues/detail?id=280557) +------------------------------------------------------------------- + + Version: N/A + From: 'tyPoland Lukasz Dziedzic' (http://www.lukaszdziedzic.eu/) + License(s): + SIL Open Font (guacamole/src/licenses/bundled/carlito/LICENSE) + + +DuoWeb Java SDK (https://github.com/duosecurity/duo_java) +--------------------------------------------------------- + + Verson: commit 56570d18a1f98642500e6c1158a3f41e448963ff + From: `Duo Security, Inc.' (https://duo.com/) + License(s): + BSD 3-clause (extensions/guacamole-auth-duo/src/licenses/bundled/duo-java-56570d1/LICENSE) + +Copyright (c) 2011, Duo Security, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +TOTP Reference Implementation (https://tools.ietf.org/id/draft-mraihi-totp-timebased-07.html#Section-Reference-Impl) +------------------------------------------------------------------------------- + + Verson: 07 + From: 'IETF Trust' (http://trustee.ietf.org/license-info) + License(s): + BSD 3-clause (extensions/guacamole-auth-duo/src/licenses/bundled/totp-reference-impl-07/license.txt) + +Copyright (c) 2011 IETF Trust and the persons identified as authors +of the code. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of Internet Society, IETF or IETF Trust, nor the names + of specific contributors, may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..b0fa030 --- /dev/null +++ b/NOTICE @@ -0,0 +1,5 @@ +Apache Guacamole +Copyright 2020 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/guacamole-branding-example/README b/doc/guacamole-branding-example/README new file mode 100644 index 0000000..8e78242 --- /dev/null +++ b/doc/guacamole-branding-example/README @@ -0,0 +1,18 @@ +This directory structure provides an example of how to apply custom branding +and HTML extension to the Guacamole Client web application. This makes use +of the guac-manifest.json file to specify the resources that are being provided, +and provides examples of changing colors, fonts, and the login screen logo for +the application. + +To use this, you need only to zip the file up into a JAR file, place it in the +GUACAMOLE_HOME/extensions folder, and reload the web application. For example: + +zip -r /tmp/guacamole-branding-example.jar ./ +mv /tmp/guacamole-branding-example.jar /etc/guacamole/extensions/ +touch /var/lib/tomcat/webapps/guacamole.war + +These commands assume that your current working directory is this example +directory, that your GUACAMOLE_HOME is located at /etc/guacamole, and that your +the Guacamole Client web application is deployed in the /var/lib/tomcat/webapps +directory with the name "guacamole.war". You should adjust the commands to fit +your installation and environment. \ No newline at end of file diff --git a/doc/guacamole-branding-example/css/0-font-raleway.css b/doc/guacamole-branding-example/css/0-font-raleway.css new file mode 100644 index 0000000..aed6c4e --- /dev/null +++ b/doc/guacamole-branding-example/css/0-font-raleway.css @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +@font-face { + font-family: 'Raleway'; + font-weight: normal; + font-style: normal; + src: url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.woff') format('woff'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.otf') format('opentype'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.ttf') format('ttf'); +} + +@font-face { + font-family: 'Raleway'; + font-weight: bold; + font-style: normal; + src: url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.woff') format('woff'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.otf') format('opentype'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.ttf') format('ttf'); +} + +@font-face { + font-family: 'Raleway'; + font-weight: normal; + font-style: italic; + src: url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.woff') format('woff'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.otf') format('opentype'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.ttf') format('ttf'); +} + +@font-face { + font-family: 'Raleway'; + font-weight: bold; + font-style: italic; + src: url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.woff') format('woff'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.otf') format('opentype'), + url('app/ext/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.ttf') format('ttf'); +} diff --git a/doc/guacamole-branding-example/css/example.css b/doc/guacamole-branding-example/css/example.css new file mode 100644 index 0000000..a3f0cba --- /dev/null +++ b/doc/guacamole-branding-example/css/example.css @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Changes the font of the login dialog to prefer Raleway, with some fallbacks. + */ +.login-ui .login-dialog .login-fields input { + font-family: Raleway, FreeSans, Helvetica, Arial, sans-serif; +} + +/** + * Set up the logo used at the top of the login dialog box, including sizing it + * appropriately and pulling in the custom image. + */ +.login-ui .login-dialog .logo { + width: 5em; + height: 3em; + background-size: 5em 3em; + -moz-background-size: 5em 3em; + -webkit-background-size: 5em 3em; + -khtml-background-size: 5em 3em; + background-image: url('app/ext/guacamole-branding-example/resources/images/saturn/saturn.png'); +} + +/* + * For our custom warning code, specify the font order, as well as the italic + * style, and size it down a little. + */ +.login-ui .login-dialog .warning { + font-family: Raleway, FreeSans, Arial; + font-style: italic; + font-size: 0.75em; +} + +/* + * Sets up the custom coloring around the header elements. + */ +.header { + border-bottom: 1px solid rgba(0,0,0,1.0); + box-shadow: rgba(0,0,0,0.75); + background: rgba(0,0,0,1.0); + color: rgba(255,255,255,1.0); +} + +/* + * Changes the default color and fonts of the submit buttons, along with font + * size and weight. + */ +input[type="submit"], button, a.button { + background-color: rgba(0,145,255,1.0); + border: 1px solid rgba(0,255,145,1.1); + font-size: 1em; + font-weight: bold; + font-family: Raleway, FreeSans, Helvetica, Arial, sans-serif; +} + +/* + * Changes the coloring on the submit-styled buttons when you hover over them. + */ +input[type="submit"]:hover, button:hover, a.button:hover { + background-color: rgba(0,255,145,1.0); + border: 1px solid rgba(0,145,255,1.0); +} + +/* + * Changes the coloring on the submit-styled buttons when you click on them. + */ +input[type="submit"]:active, button:active, a.button:active { + background-color: rgba(0,145,255,1.0); + border: 1px solid rgba(255,95,0,1.0); +} + +/* + * Provide a custom color scheme for danger-styled buttons. + */ +button.danger, a.button.danger { + background: rgba(255,95,0,1.0); + border: 1px solid rgba(255,0,0,1.0); +} + +/* + * Provide a cusotm color scheme for hovering over danger-styled buttons. + */ +button.danger:hover, a.button.danger:hover { + background: rgba(255,0,0,0.75); + border: 1px solid rgba(255,95,0,1.0); +} + +/* + * Provide a custom color scheme for danger-styled buttons when clicked. + */ +button.danger:active, a.button.danger:active { + background: rgba(255,0,170,1.0); + border: 1px solid rgba(255,95,0,1.0); +} + +/* + * Change the default font order of preference across the entire interface. + */ +body { + font-family: Raleway, FreeSans, Helvetica, Arial, sans-serif; +} \ No newline at end of file diff --git a/doc/guacamole-branding-example/guac-manifest.json b/doc/guacamole-branding-example/guac-manifest.json new file mode 100644 index 0000000..78192d3 --- /dev/null +++ b/doc/guacamole-branding-example/guac-manifest.json @@ -0,0 +1,34 @@ +{ + "guacamoleVersion" : "*", + "name" : "Guacamole Branding Example", + "namespace" : "guacamole-branding-example", + + "css" : [ + "css/0-font-raleway.css", + "css/example.css" + ], + + "html" : [ + "html/warning.html" + ], + + "resources" : { + "resources/fonts/raleway/Raleway-Bold.otf" : "application/x-font-opentype", + "resources/fonts/raleway/Raleway-Bold.ttf" : "application/x-font-TrueType", + "resources/fonts/raleway/Raleway-Bold.woff" : "application/font-woff", + "resources/fonts/raleway/Raleway-BoldItalic.otf" : "application/x-font-opentype", + "resources/fonts/raleway/Raleway-BoldItalic.ttf" : "application/x-font-TrueType", + "resources/fonts/raleway/Raleway-BoldItalic.woff" : "application/font-woff", + "resources/fonts/raleway/Raleway-Italic.otf" : "application/x-font-opentype", + "resources/fonts/raleway/Raleway-Italic.ttf" : "application/x-font-TrueType", + "resources/fonts/raleway/Raleway-Italic.woff" : "application/font-woff", + "resources/fonts/raleway/Raleway-Regular.otf" : "application/x-font-opentype", + "resources/fonts/raleway/Raleway-Regular.ttf" : "application/x-font-TrueType", + "resources/fonts/raleway/Raleway-Regular.woff" : "application/font-woff", + "resources/images/saturn/saturn.png" : "image/png" + }, + + "translations" : [ + "translations/en.json" + ] +} diff --git a/doc/guacamole-branding-example/html/warning.html b/doc/guacamole-branding-example/html/warning.html new file mode 100644 index 0000000..b1b72b3 --- /dev/null +++ b/doc/guacamole-branding-example/html/warning.html @@ -0,0 +1,8 @@ + + + + +
Beware of entering Saturn's gravitational field. + Few who enter it ever escape.
diff --git a/doc/guacamole-branding-example/licenses/LICENSE b/doc/guacamole-branding-example/licenses/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/doc/guacamole-branding-example/licenses/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/doc/guacamole-branding-example/licenses/NOTICE b/doc/guacamole-branding-example/licenses/NOTICE new file mode 100644 index 0000000..b0fa030 --- /dev/null +++ b/doc/guacamole-branding-example/licenses/NOTICE @@ -0,0 +1,5 @@ +Apache Guacamole +Copyright 2020 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/LICENSE b/doc/guacamole-branding-example/resources/fonts/raleway/LICENSE new file mode 100644 index 0000000..3219811 --- /dev/null +++ b/doc/guacamole-branding-example/resources/fonts/raleway/LICENSE @@ -0,0 +1,95 @@ +Copyright (c) 2010, Matt McInerney (matt@pixelspread.com), +Copyright (c) 2011, Pablo Impallari (www.impallari.com|impallari@gmail.com), +Copyright (c) 2011, Rodrigo Fuenzalida (www.rfuenzalida.com|hello@rfuenzalida.com), with Reserved Font Name Raleway + +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. diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.otf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.otf new file mode 100644 index 0000000..b6c56b3 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.otf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.ttf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.ttf new file mode 100644 index 0000000..156d4a1 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.ttf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.woff b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.woff new file mode 100644 index 0000000..39edd00 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Bold.woff differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.otf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.otf new file mode 100644 index 0000000..27dd342 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.otf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.ttf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.ttf new file mode 100644 index 0000000..d2db573 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.ttf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.woff b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.woff new file mode 100644 index 0000000..49fb336 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-BoldItalic.woff differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.otf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.otf new file mode 100644 index 0000000..48186de Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.otf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.ttf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.ttf new file mode 100644 index 0000000..a0157a5 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.ttf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.woff b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.woff new file mode 100644 index 0000000..48f8a74 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Italic.woff differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.otf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.otf new file mode 100644 index 0000000..52cc33d Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.otf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.ttf b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.ttf new file mode 100644 index 0000000..746c242 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.ttf differ diff --git a/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.woff b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.woff new file mode 100644 index 0000000..8773be7 Binary files /dev/null and b/doc/guacamole-branding-example/resources/fonts/raleway/Raleway-Regular.woff differ diff --git a/doc/guacamole-branding-example/resources/images/saturn/LICENSE b/doc/guacamole-branding-example/resources/images/saturn/LICENSE new file mode 100644 index 0000000..56620b5 --- /dev/null +++ b/doc/guacamole-branding-example/resources/images/saturn/LICENSE @@ -0,0 +1,229 @@ +Credit: Erich Karkoschka (University of Arizona) and NASA + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS +PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR +OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS +LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE +BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED +HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + +a. "Collective Work" means a work, such as a periodical issue, anthology or +encyclopedia, in which the Work in its entirety in unmodified form, along with a +number of other contributions, constituting separate and independent works in +themselves, are assembled into a collective whole. A work that constitutes a +Collective Work will not be considered a Derivative Work (as defined below) +for the purposes of this License. + +b. "Derivative Work" means a work based upon the Work or upon the Work and other +pre-existing works, such as a translation, musical arrangement, dramatization, +fictionalization, motion picture version, sound recording, art reproduction, +abridgment, condensation, or any other form in which the Work may be recast, +transformed, or adapted, except that a work that constitutes a Collective Work +will not be considered a Derivative Work for the purpose of this License. For +the avoidance of doubt, where the Work is a musical composition or sound +recording, the synchronization of the Work in timed-relation with a moving image +("synching") will be considered a Derivative Work for the purpose of this +License. + +c. "Licensor" means the individual or entity that offers the Work under the +terms of this License. + +d. "Original Author" means the individual or entity who created the Work. + +e. "Work" means the copyrightable work of authorship offered under the terms of +this License. + +f. "You" means an individual or entity exercising rights under this License who +has not previously violated the terms of this License with respect to the Work, +or who has received express permission from the Licensor to exercise rights +under this License despite a previous violation. + +g. "License Elements" means the following high-level license attributes as +selected by Licensor and indicated in the title of this License: Attribution, +Noncommercial, ShareAlike. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or +restrict any rights arising from fair use, first sale or other limitations on +the exclusive rights of the copyright owner under copyright law or other +applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor +hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the +duration of the applicable copyright) license to exercise the rights in the Work +as stated below: + +a. to reproduce the Work, to incorporate the Work into one or more Collective +Works, and to reproduce the Work as incorporated in the Collective Works; + +b. to create and reproduce Derivative Works; + +c. to distribute copies or phonorecords of, display publicly, perform publicly, +and perform publicly by means of a digital audio transmission the Work including +as incorporated in Collective Works; + +d. to distribute copies or phonorecords of, display publicly, perform publicly, +and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or +hereafter devised. The above rights include the right to make such modifications +as are technically necessary to exercise the rights in other media and formats. +All rights not expressly granted by Licensor are hereby reserved, including but +not limited to the rights set forth in Sections 4(e) and 4(f). + +4. Restrictions.The license granted in Section 3 above is expressly made subject +to and limited by the following restrictions: + +a. You may distribute, publicly display, publicly perform, or publicly digitally +perform the Work only under the terms of this License, and You must include a +copy of, or the Uniform Resource Identifier for, this License with every copy or +phonorecord of the Work You distribute, publicly display, publicly perform, or +publicly digitally perform. You may not offer or impose any terms on the Work +that alter or restrict the terms of this License or the recipients' exercise of +the rights granted hereunder. You may not sublicense the Work. You must keep +intact all notices that refer to this License and to the disclaimer of +warranties. You may not distribute, publicly display, publicly perform, or +publicly digitally perform the Work with any technological measures that control +access or use of the Work in a manner inconsistent with the terms of this +License Agreement. The above applies to the Work as incorporated in a Collective +Work, but this does not require the Collective Work apart from the Work itself +to be made subject to the terms of this License. If You create a Collective +Work, upon notice from any Licensor You must, to the extent practicable, remove +from the Collective Work any reference to such Licensor or the Original Author, +as requested. If You create a Derivative Work, upon notice from any Licensor You +must, to the extent practicable, remove from the Derivative Work any reference +to such Licensor or the Original Author, as requested. + +b. You may distribute, publicly display, publicly perform, or publicly digitally +perform a Derivative Work only under the terms of this License, a later version +of this License with the same License Elements as this License, or a Creative +Commons iCommons license that contains the same License Elements as this License +(e.g. Attribution-NonCommercial-ShareAlike 2.0 Japan). You must include a copy +of, or the Uniform Resource Identifier for, this License or other license +specified in the previous sentence with every copy or phonorecord of each +Derivative Work You distribute, publicly display, publicly perform, or publicly +digitally perform. You may not offer or impose any terms on the Derivative Works +that alter or restrict the terms of this License or the recipients' exercise of +the rights granted hereunder, and You must keep intact all notices that refer to +this License and to the disclaimer of warranties. You may not distribute, +publicly display, publicly perform, or publicly digitally perform the Derivative +Work with any technological measures that control access or use of the Work in a +manner inconsistent with the terms of this License Agreement. The above applies +to the Derivative Work as incorporated in a Collective Work, but this does not +require the Collective Work apart from the Derivative Work itself to be made +subject to the terms of this License. + +c. You may not exercise any of the rights granted to You in Section 3 above in +any manner that is primarily intended for or directed toward commercial +advantage or private monetary compensation. The exchange of the Work for other +copyrighted works by means of digital file-sharing or otherwise shall not be +considered to be intended for or directed toward commercial advantage or private +monetary compensation, provided there is no payment of any monetary compensation +in connection with the exchange of copyrighted works. + +d. If you distribute, publicly display, publicly perform, or publicly digitally +perform the Work or any Derivative Works or Collective Works, You must keep +intact all copyright notices for the Work and give the Original Author credit +reasonable to the medium or means You are utilizing by conveying the name (or +pseudonym if applicable) of the Original Author if supplied; the title of the +Work if supplied; to the extent reasonably practicable, the Uniform Resource +Identifier, if any, that Licensor specifies to be associated with the Work, +unless such URI does not refer to the copyright notice or licensing information +for the Work; and in the case of a Derivative Work, a credit identifying the use +of the Work in the Derivative Work (e.g., "French translation of the Work by +Original Author," or "Screenplay based on original Work by Original Author"). +Such credit may be implemented in any reasonable manner; provided, however, that +in the case of a Derivative Work or Collective Work, at a minimum such credit +will appear where any other comparable authorship credit appears and in a manner +at least as prominent as such other comparable authorship credit. + +e. For the avoidance of doubt, where the Work is a musical composition: + +i. Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive +right to collect, whether individually or via a performance rights society +(e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital +performance (e.g. webcast) of the Work if that performance is primarily intended +for or directed toward commercial advantage or private monetary compensation. + +ii. Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive +right to collect, whether individually or via a music rights agency or +designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You +create from the Work ("cover version") and distribute, subject to the compulsory +license created by 17 USC Section 115 of the US Copyright Act (or the equivalent +in other jurisdictions), if Your distribution of such cover version is primarily +intended for or directed toward commercial advantage or private monetary +compensation. + +f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where +the Work is a sound recording, Licensor reserves the exclusive right to collect, +whether individually or via a performance-rights society (e.g. SoundExchange), +royalties for the public digital performance (e.g. webcast) of the Work, subject +to the compulsory license created by 17 USC Section 114 of the US Copyright Act +(or the equivalent in other jurisdictions), if Your public digital performance +is primarily intended for or directed toward commercial advantage or private +monetary compensation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS +THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING +THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT +LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR +PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, +OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH +EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN +NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, +INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS +LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. Termination + +a. This License and the rights granted hereunder will terminate automatically +upon any breach by You of the terms of this License. Individuals or entities who +have received Derivative Works or Collective Works from You under this License, +however, will not have their licenses terminated provided such individuals or +entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, +and 8 will survive any termination of this License. + +b. Subject to the above terms and conditions, the license granted here is +perpetual (for the duration of the applicable copyright in the Work). +Notwithstanding the above, Licensor reserves the right to release the Work under +different license terms or to stop distributing the Work at any time; provided, +however that any such election will not serve to withdraw this License (or any +other license that has been, or is required to be, granted under the terms of +this License), and this License will continue in full force and effect unless +terminated as stated above. + +8. Miscellaneous + +a. Each time You distribute or publicly digitally perform the Work or a +Collective Work, the Licensor offers to the recipient a license to the Work on +the same terms and conditions as the license granted to You under this License. + +b. Each time You distribute or publicly digitally perform a Derivative Work, +Licensor offers to the recipient a license to the original Work on the same +terms and conditions as the license granted to You under this License. + +c. If any provision of this License is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this License, and without further action by the parties to this +agreement, such provision shall be reformed to the minimum extent necessary to +make such provision valid and enforceable. + +d. No term or provision of this License shall be deemed waived and no breach +consented to unless such waiver or consent shall be in writing and signed by the +party to be charged with such waiver or consent. + +e. This License constitutes the entire agreement between the parties with respect +to the Work licensed here. There are no understandings, agreements or +representations with respect to the Work not specified here. Licensor shall not +be bound by any additional provisions that may appear in any communication from +You. This License may not be modified without the mutual written agreement of +the Licensor and You. \ No newline at end of file diff --git a/doc/guacamole-branding-example/resources/images/saturn/saturn.png b/doc/guacamole-branding-example/resources/images/saturn/saturn.png new file mode 100644 index 0000000..2bf7f5a Binary files /dev/null and b/doc/guacamole-branding-example/resources/images/saturn/saturn.png differ diff --git a/doc/guacamole-branding-example/translations/en.json b/doc/guacamole-branding-example/translations/en.json new file mode 100644 index 0000000..8ffc8e7 --- /dev/null +++ b/doc/guacamole-branding-example/translations/en.json @@ -0,0 +1,5 @@ +{ + "APP": { + "NAME" : "Gateway to Saturn" + } +} diff --git a/doc/guacamole-example/.gitignore b/doc/guacamole-example/.gitignore new file mode 100644 index 0000000..c352b37 --- /dev/null +++ b/doc/guacamole-example/.gitignore @@ -0,0 +1,3 @@ +src/main/webapp/META-INF/ +target/ +*~ diff --git a/doc/guacamole-example/pom.xml b/doc/guacamole-example/pom.xml new file mode 100644 index 0000000..e4a4f1c --- /dev/null +++ b/doc/guacamole-example/pom.xml @@ -0,0 +1,131 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-example + war + 1.6.0 + guacamole-example + http://guacamole.apache.org/ + + + UTF-8 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + -Xlint:all + -Werror + + true + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.1 + + + + org.apache.guacamole + guacamole-common-js + zip + + + + + + + + org.apache.rat + apache-rat-plugin + 0.13 + + + + + validate + validate + + check + + + + + + + + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + org.apache.guacamole + guacamole-common + 1.6.0 + compile + + + + + org.apache.guacamole + guacamole-common-js + 1.6.0 + zip + runtime + + + + org.slf4j + slf4j-simple + 2.0.13 + + + + + + diff --git a/doc/guacamole-example/src/main/java/org/apache/guacamole/net/example/DummyGuacamoleTunnelServlet.java b/doc/guacamole-example/src/main/java/org/apache/guacamole/net/example/DummyGuacamoleTunnelServlet.java new file mode 100644 index 0000000..8bcfee0 --- /dev/null +++ b/doc/guacamole-example/src/main/java/org/apache/guacamole/net/example/DummyGuacamoleTunnelServlet.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.example; + +import javax.servlet.http.HttpServletRequest; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleSocket; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.InetGuacamoleSocket; +import org.apache.guacamole.net.SimpleGuacamoleTunnel; +import org.apache.guacamole.protocol.ConfiguredGuacamoleSocket; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.servlet.GuacamoleHTTPTunnelServlet; + +/** + * Simple tunnel example with hard-coded configuration parameters. + */ +public class DummyGuacamoleTunnelServlet extends GuacamoleHTTPTunnelServlet { + + @Override + protected GuacamoleTunnel doConnect(HttpServletRequest request) throws GuacamoleException { + + // guacd connection information + String hostname = "localhost"; + int port = 4822; + + // VNC connection information + GuacamoleConfiguration config = new GuacamoleConfiguration(); + config.setProtocol("vnc"); + config.setParameter("hostname", "localhost"); + config.setParameter("port", "5901"); + config.setParameter("password", "potato"); + + // Connect to guacd, proxying a connection to the VNC server above + GuacamoleSocket socket = new ConfiguredGuacamoleSocket( + new InetGuacamoleSocket(hostname, port), + config + ); + + // Create tunnel from now-configured socket + GuacamoleTunnel tunnel = new SimpleGuacamoleTunnel(socket); + return tunnel; + + } + +} diff --git a/doc/guacamole-example/src/main/webapp/WEB-INF/web.xml b/doc/guacamole-example/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..54d7089 --- /dev/null +++ b/doc/guacamole-example/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,46 @@ + + + + + + + index.html + + + + 30 + + + + + + Tunnel servlet. + Tunnel + org.apache.guacamole.net.example.DummyGuacamoleTunnelServlet + + + Tunnel + /tunnel + + + + diff --git a/doc/guacamole-example/src/main/webapp/dot.gif b/doc/guacamole-example/src/main/webapp/dot.gif new file mode 100644 index 0000000..9ac8a00 Binary files /dev/null and b/doc/guacamole-example/src/main/webapp/dot.gif differ diff --git a/doc/guacamole-example/src/main/webapp/guacamole.css b/doc/guacamole-example/src/main/webapp/guacamole.css new file mode 100644 index 0000000..e92bbc8 --- /dev/null +++ b/doc/guacamole-example/src/main/webapp/guacamole.css @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.guac-hide-cursor { + cursor: url('dot.gif'),default; +} + diff --git a/doc/guacamole-example/src/main/webapp/index.html b/doc/guacamole-example/src/main/webapp/index.html new file mode 100644 index 0000000..c47bbc4 --- /dev/null +++ b/doc/guacamole-example/src/main/webapp/index.html @@ -0,0 +1,85 @@ + + + + + + + Guacamole (EXAMPLE) + + + + + +
+ + + + + + + + + + diff --git a/doc/guacamole-playback-example/.gitignore b/doc/guacamole-playback-example/.gitignore new file mode 100644 index 0000000..c352b37 --- /dev/null +++ b/doc/guacamole-playback-example/.gitignore @@ -0,0 +1,3 @@ +src/main/webapp/META-INF/ +target/ +*~ diff --git a/doc/guacamole-playback-example/pom.xml b/doc/guacamole-playback-example/pom.xml new file mode 100644 index 0000000..8563e07 --- /dev/null +++ b/doc/guacamole-playback-example/pom.xml @@ -0,0 +1,98 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-playback-example + war + 1.6.0 + guacamole-playback-example + http://guacamole.apache.org/ + + + UTF-8 + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.1 + + + + org.apache.guacamole + guacamole-common-js + zip + + + + + + + + org.apache.rat + apache-rat-plugin + 0.13 + + + + src/main/webapp/recording.guac + + + + + + + validate + validate + + check + + + + + + + + + + + + + + + org.apache.guacamole + guacamole-common-js + 1.6.0 + zip + runtime + + + + + diff --git a/doc/guacamole-playback-example/src/main/webapp/WEB-INF/web.xml b/doc/guacamole-playback-example/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..9db9bb0 --- /dev/null +++ b/doc/guacamole-playback-example/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,30 @@ + + + + + + + index.html + + + diff --git a/doc/guacamole-playback-example/src/main/webapp/index.html b/doc/guacamole-playback-example/src/main/webapp/index.html new file mode 100644 index 0000000..5b21551 --- /dev/null +++ b/doc/guacamole-playback-example/src/main/webapp/index.html @@ -0,0 +1,65 @@ + + + + + + Guacamole Recording Playback (EXAMPLE) + + + + + + + +
+ + +
+
+
+

+ Seek in progress... + +

+
+
+
+ + +
+ + + 00:00 + / + 00:00 +
+ +
+ + + + + + + + + + diff --git a/doc/guacamole-playback-example/src/main/webapp/playback.css b/doc/guacamole-playback-example/src/main/webapp/playback.css new file mode 100644 index 0000000..bda4d3a --- /dev/null +++ b/doc/guacamole-playback-example/src/main/webapp/playback.css @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#player { + width: 640px; +} + +#display { + position: relative; +} + +#player .notification-container { + position: absolute; + z-index: 1; + top: 0; + right: 0; + left: 0; + bottom: 0; +} + +#player .seek-notification { + + color: white; + background: rgba(0, 0, 0, 0.75); + + display: none; /* Initially hidden */ + width: 100%; + height: 100%; + +} + +#player.seeking .seek-notification { + display: table; +} + +#player .seek-notification p { + display: table-cell; + text-align: center; + vertical-align: middle; + font-family: sans-serif; +} + +#player .controls { + + width: 100%; + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: center; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: center; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: center; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: center; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: center; + flex-direction: row; + +} + +#player .controls > * { + margin: 0.25em; +} + +#player .controls #position-slider { + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; +} + +#player .controls #play-pause { + margin-left: 0; + min-width: 5em; +} + +#player .controls #position, +#player .controls #duration { + font-family: monospace; +} + +#player .controls #duration { + margin-right: 0; +} diff --git a/doc/guacamole-playback-example/src/main/webapp/playback.js b/doc/guacamole-playback-example/src/main/webapp/playback.js new file mode 100644 index 0000000..0f3bf4f --- /dev/null +++ b/doc/guacamole-playback-example/src/main/webapp/playback.js @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +(function initExamplePlayer() { + + /** + * The URL of the Guacamole session recording which should be played back. + * + * @constant + * @type String + */ + var RECORDING_URL = 'recording.guac'; + + /** + * The element representing the session recording player. + * + * @type Element + */ + var player = document.getElementById('player'); + + /** + * The element which will contain the recording display. + * + * @type Element + */ + var display = document.getElementById('display'); + + /** + * Play/pause toggle button. + * + * @type Element + */ + var playPause = document.getElementById('play-pause'); + + /** + * Button for cancelling in-progress seek operations. + * + * @type Element + */ + var cancelSeek = document.getElementById('cancel-seek'); + + /** + * Text status display indicating the current playback position within the + * recording. + * + * @type Element + */ + var position = document.getElementById('position'); + + /** + * Slider indicating the current playback position within the recording, + * and allowing the user to change the playback position. + * + * @type Element + */ + var positionSlider = document.getElementById('position-slider'); + + /** + * Text status display indicating the current length of the recording. + * + * @type Element + */ + var duration = document.getElementById('duration'); + + /** + * The tunnel which should be used to download the Guacamole session + * recording. + * + * @type Guacamole.Tunnel + */ + var tunnel = new Guacamole.StaticHTTPTunnel(RECORDING_URL); + + /** + * Guacamole.SessionRecording instance to be used to playback the session + * recording. + * + * @type Guacamole.SessionRecording + */ + var recording = new Guacamole.SessionRecording(tunnel); + + /** + * The Guacamole.Display which displays the recording during playback. + * + * @type Guacamole.Display + */ + var recordingDisplay = recording.getDisplay(); + + /** + * Converts the given number to a string, adding leading zeroes as necessary + * to reach a specific minimum length. + * + * @param {Numer} num + * The number to convert to a string. + * + * @param {Number} minLength + * The minimum length of the resulting string, in characters. + * + * @returns {String} + * A string representation of the given number, with leading zeroes + * added as necessary to reach the specified minimum length. + */ + var zeroPad = function zeroPad(num, minLength) { + + // Convert provided number to string + var str = num.toString(); + + // Add leading zeroes until string is long enough + while (str.length < minLength) + str = '0' + str; + + return str; + + }; + + /** + * Converts the given millisecond timestamp into a human-readable string in + * MM:SS format. + * + * @param {Number} millis + * An arbitrary timestamp, in milliseconds. + * + * @returns {String} + * A human-readable string representation of the given timestamp, in + * MM:SS format. + */ + var formatTime = function formatTime(millis) { + + // Calculate total number of whole seconds + var totalSeconds = Math.floor(millis / 1000); + + // Split into seconds and minutes + var seconds = totalSeconds % 60; + var minutes = Math.floor(totalSeconds / 60); + + // Format seconds and minutes as MM:SS + return zeroPad(minutes, 2) + ':' + zeroPad(seconds, 2); + + }; + + // Add playback display to DOM + display.appendChild(recordingDisplay.getElement()); + + // Begin downloading the recording + recording.connect(); + + // If playing, the play/pause button should read "Pause" + recording.onplay = function() { + playPause.textContent = 'Pause'; + }; + + // If paused, the play/pause button should read "Play" + recording.onpause = function() { + playPause.textContent = 'Play'; + }; + + // Toggle play/pause when display or button are clicked + display.onclick = playPause.onclick = function() { + if (!recording.isPlaying()) + recording.play(); + else + recording.pause(); + }; + + // Resume playback when cancel button is clicked + cancelSeek.onclick = function cancelSeekOperation(e) { + recording.play(); + player.className = ''; + e.stopPropagation(); + }; + + // Fit display within containing div + recordingDisplay.onresize = function displayResized(width, height) { + + // Do not scale if display has no width + if (!width) + return; + + // Scale display to fit width of container + recordingDisplay.scale(display.offsetWidth / width); + + }; + + // Update slider and status when playback position changes + recording.onseek = function positionChanged(millis) { + position.textContent = formatTime(millis); + positionSlider.value = millis; + }; + + // Update slider and status when duration changes + recording.onprogress = function durationChanged(millis) { + duration.textContent = formatTime(millis); + positionSlider.max = millis; + }; + + // Seek within recording if slider is moved + positionSlider.onchange = function sliderPositionChanged() { + + // Seek is in progress + player.className = 'seeking'; + + // Request seek + recording.seek(positionSlider.value, function seekComplete() { + + // Seek has completed + player.className = ''; + + }); + + }; + +})(); diff --git a/doc/guacamole-playback-example/src/main/webapp/recording.guac b/doc/guacamole-playback-example/src/main/webapp/recording.guac new file mode 100644 index 0000000..5e9fda0 --- /dev/null +++ b/doc/guacamole-playback-example/src/main/webapp/recording.guac @@ -0,0 +1 @@ +4.size,1.1,1.0,1.0;4.move,1.2,1.1,1.0,1.0,1.0;4.size,1.0,3.978,3.682;4.rect,1.0,1.0,1.0,3.978,3.682;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.960,3.665;4.size,1.2,3.960,3.665;4.size,2.-1,1.1,1.1;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,120.iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA/wD/AP+gvaeTAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==;3.end,1.1;6.cursor,1.0,1.0,2.-1,1.0,1.0,1.1,1.1;4.rect,1.1,1.0,1.0,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,1.0,3.950,3.665;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,2.19,2.10,3.646;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.962,1.0,1.0;4.size,1.3,2.16,3.682;4.rect,1.3,1.0,1.0,2.16,3.682;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,1.2,1.0;4.size,1.4,2.12,3.678;4.rect,1.4,1.0,1.0,2.12,3.678;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492246878;4.size,1.0,3.978,3.682;4.rect,1.0,1.0,1.0,3.978,3.682;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492246897;4.size,2.-1,1.7,2.16;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,200.iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAABmJLR0QA/wD/AP+gvaeTAAAASUlEQVQYleWQSQ6AMAwDx6gPb18+vUCACvgAPkXyEmkCyIs2ABWV3nvdALk2VZJUs+0BlvnU7OfPH5iNZ/AeZoEeY5zQkzv4VROkCB4UXQdRZAAAAABJRU5ErkJggg==;3.end,1.1;6.cursor,1.3,1.8,2.-1,1.0,1.0,1.7,2.16;4.sync,10.6492247313;4.rect,1.1,1.0,2.19,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.0;4.blob,1.1,3600.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;3.end,1.1;4.sync,10.6492247450;4.rect,1.1,1.0,2.19,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,2.33;4.blob,1.1,7120.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.174;4.blob,1.1,2256.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.285;4.blob,1.1,2156.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;3.end,1.1;4.sync,10.6492247527;4.sync,10.6492248527;4.size,2.-1,1.1,1.1;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,120.iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA/wD/AP+gvaeTAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==;3.end,1.1;6.cursor,1.0,1.0,2.-1,1.0,1.0,1.1,1.1;4.rect,1.1,3.260,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.250,3.285;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492249141;4.rect,1.1,3.270,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.260,3.285;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492249226;4.rect,1.1,3.280,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.270,3.285;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492249324;4.rect,1.1,3.290,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.280,3.285;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492249395;4.rect,1.1,3.290,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492249472;4.rect,1.1,3.310,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.300,3.285;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492249643;4.rect,1.1,3.320,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.310,3.285;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492249750;4.rect,1.1,3.330,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.320,3.285;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492249898;4.rect,1.1,3.340,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.330,3.285;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492250096;4.rect,1.1,3.350,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.340,3.285;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492250394;4.rect,1.1,3.360,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.350,3.285;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAARVBMVEUAAACkpKSxsbFPT0/W1tb19fXFxcUxMTHp6enGxsZRUVFUVFTU1NTf398HBwcNDQ1FRUX///89PT3Q0NAiIiJSUlIgICAsta3pAAAAM0lEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLx8YCY/A4OAoBCIKQwkRARFYUwxQW4SmcQDANeaAmKUdPEqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492250610;4.rect,1.1,3.360,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492250701;4.rect,1.1,3.380,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.370,3.285;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492250970;4.rect,1.1,3.390,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.380,3.285;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492251057;4.rect,1.1,3.400,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.390,3.285;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492251185;4.rect,1.1,3.410,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.400,3.285;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492251274;4.rect,1.1,3.420,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.410,3.285;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492251372;4.rect,1.1,3.430,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.420,3.285;4.blob,1.1,336.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAAA4ODj///9CQkLR0dH5+fnT09N1dXUiIiL4+PjAwMBJSUlgYGDs7OyVlZXr6+sKCgpRUVHJycmhoaHi4uKMjIygoKCSkpLp6ekJCQlKSkofHx/29va9vb1ISEhcXFxBQUH6+vrU1NRiYmJO0CRKAAAAS0lEQVQImWNgIA4wMjHiZjKzsLKxg5kcnFzcPLxgJh+/AAODIJgpJAxXKyIKZwqJwZniEpIMDFJgprSMrJy8CMRcBTZFJWWEbUQBAOcFAsqG8+H3AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492251509;4.rect,1.1,3.440,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.430,3.285;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492251592;4.rect,1.1,3.450,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.440,3.285;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAARVBMVEUAAACkpKSxsbFPT0/W1tb19fXFxcUxMTHp6enGxsZRUVFUVFTU1NTf398HBwcNDQ1FRUX///89PT3Q0NAiIiJSUlIgICAsta3pAAAAM0lEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLx8YCY/A4OAoBCIKQwkRARFYUwxQW4SmcQDANeaAmKUdPEqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492251661;4.rect,1.1,3.460,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.450,3.285;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAmVBMVEUAAABERETS0tL5+flgYGD///88PDwiIiL4+PjAwMBJSUnm5uaVlZXs7OwKCgpNTU3JycmlpaU4ODji4uKQkJCkpKSTk5Pr6+sJCQlMTEwhISH39/e9vb1ISEhfX1/k5ORDQ0PT09N2dnYODg5oaGj+/v4XFxc9PT3o6Ohubm5CQkJvb2/u7u6ZmZliYmLPz8/d3d2FhYUICAhJ8YFkAAAAZElEQVQImWNgoAJgZGJmYmFlA7LYOTi5WLjBTB5ePgYGfjBTQBBICIGZwiJwpoAonCkmLsHAIAlmSknLyMrJg5kMCorMTEqsQiCmMhCrqKoBSXUNTS1tHV2wxXr6HAaGRihuAQA3HQWn8U4CFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492251754;4.rect,1.1,3.450,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492252624;4.rect,1.1,3.440,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.450,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253168;4.rect,1.1,3.430,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253239;4.rect,1.1,3.410,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.421,3.285,2.19,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253318;4.rect,1.1,3.400,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.410,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253392;4.rect,1.1,3.390,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.400,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253457;4.rect,1.1,3.380,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.390,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253476;4.rect,1.1,3.370,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.380,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253526;4.rect,1.1,3.360,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253605;4.rect,1.1,3.350,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.360,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253657;4.rect,1.1,3.340,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.350,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253671;4.rect,1.1,3.330,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.340,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253725;4.rect,1.1,3.320,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.330,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253798;4.rect,1.1,3.300,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.311,3.285,2.19,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253866;4.rect,1.1,3.290,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492253949;4.rect,1.1,3.280,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.290,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492254006;4.rect,1.1,3.270,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.280,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492254021;4.rect,1.1,3.260,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.270,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492254081;4.rect,1.1,3.250,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.260,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492254147;4.sync,10.6492254205;4.sync,10.6492254257;4.sync,10.6492254272;4.rect,1.1,3.260,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.250,3.285;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492254600;4.rect,1.1,3.270,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.260,3.285;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492254692;4.rect,1.1,3.280,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.270,3.285;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAACkpKS4uLiKiorq6ur19fWtra0XFxf///+xsbFGRkZqamr29va9vb3e3t4GBgZlZWUxMTHMzMwRERFiYmL5+fl6enpjY2Pa2toCAgIwMDCoqKhFRUVmZmb09PS7u7vPz8+Dg4Ps7OwVFRVBALzTAAAAUklEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGUTGEqDiIKSHJwCDOIQU2QVpGVk4ebIKCohIPmzIDXBsDbiYcAAD8fgNA4rJSBwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492254784;4.rect,1.1,3.280,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.304,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492255315;4.sync,10.6492255468;4.rect,1.1,2.31,1.4,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,1.6,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,1.3,1.6,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,1.3,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,1.3,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,1.3,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.33,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.33,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.33,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.33,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.33,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.33,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.41,1.6,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.44,2.17,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,2.61,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,2.60,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.60,2.18,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.63,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.63,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,2.82,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.424,2.79,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.4,2.98,2.25,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.98,2.48,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,2.99,2.66,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.101,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,2.96,2.69,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,2.98,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.570,3.114,2.50,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.670,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.750,3.114,3.200,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,1.1,3.136,2.37,2.27;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.136,1.8,3.167;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.136,2.58,3.167;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.136,2.28,2.27;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.139,2.20,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.160,2.27,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.160,2.27,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.160,2.47,3.143;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.160,2.27,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.160,2.17,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.204,1.8,2.96;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.236,2.17,2.64;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.285,2.27,2.38;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,10.image/webp,1.0,1.0;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6912.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,7008.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.172;4.blob,1.1,4160.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,3.212;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6052.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;3.end,1.1;4.sync,10.6492255711;4.sync,10.6492256711;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.570,3.114,2.50,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.670,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.750,3.114,3.200,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.950,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.3;4.blob,1.1,8064.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;4.blob,1.1,3236.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,2.39;4.blob,1.1,8064.iVBORw0KGgoAAAANSUhEUgAAAxUAAAA3CAIAAAD18/D9AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO2deXwTZf74n8l9t03T9L7SlvRIC5TWFnuIghxaFBQRVhYqgrIs53YBvy5LBRe05VJQsCxSXQ51BVzlkp8gh2wVC/S+Sy96N03SJk3SXPP7Y8xsaNrJNEkPdN6v/tGZZz6ZZz6f5/OZzzzzzPMAMG4QMpnDOp5Ho9HJ5BGqDAEBAQEBAQHBUJDGugK/MtPPL10sHpZIKI+3aeJEJoUyQlUiICAgICAgIBgUEptC2RAd/UFS0sqICAoEDXqQD5u9ViLZ//jj+x9/PF0s5lCpzq1EhJvbnICAY5WVw5K6J5W29PUNN+tynLi4uOvXr2s0mq6uro8//pjL5Y6O7PjEKVd07NgxGIYTExOdXr1RZjy3jRdFoswpU5z7m4mJiXl5eRqNpq6ubsOGDcMqtYlYLD5+/HhbW9uZM2fsqBue6xXxeDmpqSIez47fHy7juW2MPmOijeXh4X/H4QIj4SnYjOe2QWgDi7TAwE0TJ0r4/B3x8YmengAADpVKskik3BmMfVOnboiOnujunujp+U58/NtxcRSS0zquSBD0Tnz8dF9fO2S5VOrB5GQJn++sytgkICCgt7f3woULc+fOTU9Pb2lpOX/+/CjIjk+cckXJyckmk+k3kD+N87bBolDcGQwn/qCvr69Kpbp8+fJzzz2XlZUFw/DatWtxltpkxowZOp3uypUr6enpMTExdlQPz/WOWv40ztvGKDNW2sCZPzndU7AZ522D0AbKG5GRb06e/NCuFeHhT/r6AgBeCgmZFxQEAMiIiYkVCNADlk2Y8E58PJoweTCZh1NSUr29nVWnyQLBweRku0cyLZ0wYePQ4ZVBJjOcOkYqKyurvb2dRqMhm3PnzoVhWCKRjLTs+MTxK6JQKCUlJXl5eb+B/On31jays7M7OjoY5tiam5vb1dVFNrsbdik2XC5XJpO9//77I1FtS0Ytf/q9tQ1sxkobOPOnUYZoG5aMZ21Y50+UHr1exOXeoVIDOZx7UmkMn8+kUAqkUqQYAmCSQHC1pcVgMiF7ujSavI4OtvkV3vLwcA6V2tLXN9XTk04ml8lkp2pre3U6pPSVsLAIV9et+fnIZiCX+9bkyXuLi6sVCrQGjwmFFXJ5v9FoXV1fNnt+cLCIxzPBcG1Pz9f19R0azYBj7kql6yQSHo2GnhSFTibveuwxCIL+9ssvaoPBDn1Zk5SUdOvWLZ35XIWFhQCA5OTk0tLSEZW1qUk8unI6jlwRwsaNG93d3TMyMi5fvjysUw91vRNcXDImTsytqvq5owM9eMukSQwyefvdu8M6xXAZq7axPDycQSb/t719fnCwO4PxQKX6vLb2gUqFlKZ6e78SFob836vTbfr55+Ff2eDExsbevHlTq9Uim6dOnUL6igoKCmyWYrN06VKTybRlyxYAAARBMAzjr5XN6w13dX0pJMSLxepUq3+yaCQjypi0jXnBwcFc7v7iYgDAX2JiCrq7r7W0MMjkD5KS3i0oaFAqAQAJQuF0Pz8vJlNjNJZ0d3/d0NCn1ztwobgYK09BiOLzFwQHC5jMlr6+z2tqGkfeU7AZQ21g3DUIbVhqIyshwZVOR/7PSU1F/nnj5k3SjdbWcFfXPVOnutBo+Z2d80WiM/X1aLji0WgsCqVdrbY8zfHq6ktNTehmlJubJ5N5rLLyTF2dhM9/LTwcT11Rwlxc7vf2Wu/nUKkZMTEUCPq0svLz2loPJnNjTIz1aPH7PT0AgAkuLta/YIRhpV6v0uuNw4m/2Hh4eHR3dyP/x8XF3bp1CwAgsOiuGyFZbHDqyuk4eEX+/v6ZmZnr16/vHawBYIBxvdU9PY0q1RMW/aPeLJaIx7va0jKsU9jBGLYNEY8329//m4aG3MpKJoXyp8hItMO4sLt7d1HR7qKi252dw7ocm3A4nP7+fnSzvr4eAODn54enFJsnnnji9u3b+/fvVyqVGo0mNzeXgfsNAvb1ChiMtRKJ2mA4XFb2fXPzbH9/nD/rIGPSNpqUSl82GwBAgqBgHi+UxwMAeLNYRhhu7usDAEzx8Hg1PLyku/tQWdnZuroJrq7Djd72MYaewqfT0wICvm1szK2sZJDJq6KiqCPvKdiMlTaw7xqENiy1cbi8fHdRUbVC0aZWI2rZXVQEACB1ajRv/fLLtvz8t+/cmejurujvr5DL0R9FXn7pBuscQpFqtUfKy8vl8uutrV/evx/u6urP4eCpMQCATaVyqdTOwXpKArlcNpX65f37xTLZ3a6unPLy5r4+T6s5DrRGY69O58ViWf+CwWTKvHPn7/n5g3Zu2QeZTEaehleuXHnjxo3Dhw/39fVR8GUqjshig1NXTsfBKzpw4MDNmze/+uqr4Z4X+3qvNjeLeDy0ESZ7e6v0+lGIAmPbNj4oKSmQSu9Jpf++f9+dwQg2D5zs1elqe3pqe3oUFtmMU6ipqUlISIDMYyVFIhFyIXhKsRGLxbNnz/bz85s/f/7GjRsXLlyYk5ODs1bY1/u0n5/WaDxYUlIqk+V1dByvqcH5sw4yJm2jUaXiUqkcKjWAw1Hp9b/mT2x2a18f8j6hUal8t6DgXGNjpUJxVyq92NQU5ebGdvbnQU68IgdlAQAGk+lgaSniKadqa/l0Ovr2duQ8BZux0gZ2FCW0YamNBqWytqdHZTBojUZELbU9PQCZv0BvMnVoNGQISgsMPFNXBwAY/DO8IegzGAzmDp67XV0AgADc+ROHQgEAaAZ7udakVKr0+kWhoTHu7gwyuVOj+bC0FOlzHoDaYOCOvM+jMBiMTz755B//+EdaWtp77703arIY4NeV07H7itLS0mbNmrVmzRo7Top9vXe6uhT9/U/6+AAAKBCUKBT+2NamN7+AHlHGqm306HRa80NCl0YDAHD6R7LWHDt2LDQ09L333uPz+dOnT8/NzQUAqMxvQ7BLseHxeHfu3Jk3b96VK1cOHz68bdu2V155xcPDw/E6B3G5pTKZztwYeqxe+o8co982urXaPoPBl80OdXGpkMvpZLKAwfBmsZrMVpBqtW402puTJx9ISvooOflVsRiYn5lHmrHylF69Hh3L0alWAwBG894xFGOijTG8a2DzCGnjf6nZDD+/KoWCTaW+l5DApFAuNTV99+ABEpRpuD1KbTAYYJhnHsBlE6TvdND3a0q9Pquw8NmAgFfFYjqZXK1QfNvYWDfYix4TDFOd9z0gNkajcenSpT/99FNsbGxLSwsAAIIgA77BVY7IYoNfV87F7itiMpkHDx7Mzs5ubW1lMBjIiD8ajUaj0XQ4bmnY12uE4R9aW9MCA0/X1UW6uTEplOutrY5dKC7GSdtAfGlYj0D2ce3atYyMjKysrM2bN/f19eXm5q5Zs6aurg5PKTYkEik/P99kznKuXLlCJpPDw8O7urocrLMLjVbT0+Pgj9jBWLWNJqXSh80O5fFKZDJXGi3UxcWHxSqWyZBSCZ+/KirqTmfnhcZGpV4f5uKyQCSy9xKHwTjxFKR5jYKnYDNW2hiruwY2j5Y2fs2fuFTqU76+u+7dWyuR5HV0NKtUy8PDf+7o6NHp1AbDgLdjC0QieX//oANKWBQKBYLQodwmGCZjZjZ9BgMAYKiP7zo1mtyqKhIEBXG5s/39/xIT887du9bDomlksmrkxzwiSKVSmUw2bdo0vV4PAGAymSwWS2oebj9ysjY1iVNXzsXuK3r55ZeDgoIyMzMzMzPRnTdu3CgqKpo0aRKeU2Nf749tbc8GBEz19Izm8+91dSlGpZthrNrGGLJv375PP/3Ux8enrq5u2bJl7e3tyDgnPKUYtLW1WY6UQl4C9jvjPUKPTjcKPXPWjFXbaFSpfFmsUBeXs/X1PCo1hMfzYrHONTYipdN8fB6oVEfNE++54n7udZDfoadgMIbaGJO7BjaPljZ+vSXP9Pf/qaND1t/PZzDy2tvvSaXy/n53BgMGoKi7O0EoRIej8un0J319LUcUMclkNIWfLBAAAND+YYVOx6NSaWZZNyv/VOp0Rhh2M49st2SWv//fp0whQZAJhut6e/9VXU0lkUKsxomTIMiVTpcPEVudPn9BXl5eQEAAOoxj2rRpyM4Bh/F4PJ7VR9E4ZQcFW5M4deV07NbGxYsXp1qwYsUKAMCKFSv++Mc/4jmvzetVGwx5HR1P+fqGu7ldGfmR4whj1TbGFplMVlpaymQyN2/enJOTM+BbOexSMIQ2vv/++xkzZri7uyOb06dP12q1lcOcX3dQ6nt7JXw+2l3NGq3VC8aqbTQqlWEuLjAMd2o01T09wVyuK53e0teHlJIA0Fo8nfuw2cO8LDv5fXrKUIyVNsbqroHNeNZGn17PHjRi0M15xrYpU14IDo738PgwORl5HBEwGPsefxyZPzPOwyMzLm7blCnoTOXLw8NzUlNXRkREuLmleHsfSEraEB2N/qw3i3U4JeVVsTjCze0JH5/diYk5qakTXF0tT71l0qTFoaHWVfJjsz9MTl4dFRXN50v4/D9FRR1ISrJeI8+Hzc5JTR10xDqdTN43der+xx93YpQMCgpSKpXnz59/9tlnly1b1tzcfOnSpQHHsNlsqVQql8tdH75SPLJDga1JPLpaIBLlpKY690WnI9qwJDExcVjzP+G5Xg8m8+PU1C1D9GaNN2040jYGzGrjzmDkpKaiU7jxaLRQF5dQF5fl4eH7Hn8c+d+6R9k+bfB4vGefffb//u//Ghsbf/zxR9rDaT12KRhaGwKBoK2t7Zdffpk3b9769ev7+vqysrLwVgnzet0ZjA+TkzfGxETx+QlC4XsJCdbzP/2W2oaAwchJTX0jMhIAQIGgg8nJlk3lCR+fj1NT5/j7R7m5vSgSfZyampOa6uOktoHBOPEUHo2Wk5oabx5XN6KegsFYaQM7ihLasL6nJHp65qSmpgUGil1dE4RCDpX6a2KB9id9XlubLhaneHt/29CAvPWQarV7iopeDA5OF4shAAq7u7+qqzNYPEc+UKk6NZqV4eE0MrlUJjtp8UlLm1p9pKJifnBwnIdHm1r95f37KyMiBtS7TC5PEAqtr6e5r29vUdFzQUGvisUQBDUqlR+UlFh/qRfh6tqj0zUPNi4Vmb+ABEFOnL+goaHhqaee2rt37+nTp9Vq9dmzZzMyMgYcYzAYurq6KBSK/uG3inhkhwJbk3h0RYIgeIihZnbjiDYcAc/19un1/UbjUNMWjDdtONI2sJnk7o7O4wIA2DRxIgDgnlSaU16O7rRbG9HR0adPn66pqTly5Mi+ffsGjF3DLgVDa0MqlT755JP79u07fvy4Wq3es2fP9u3bcVYJ+3q7tdqDpaWLQkL+HBXVodGca2xcOmHCgF/4LbUNqVbbZzAgQ74MMNzQ29tlnpELAHCztZVDoTzh48OhUqsUimOVlfOCgtwZjFaLCWt+S9rAZkQ9BYOx0gZ2FCW0YX1Pud3R4c9mP+XrOycgQKrRNJv7ce1neXj4W7GxjvyCK412KCUlxN4pgN+KjX02IMCRCvxOeCMyckd8/FjXYvR4USR6LyHBciUiS35v2sCG0IYlhDYsIbRhCaENSwhtjNJnaxgodLprLS3zgoLs+A5ikru7C402ClMjPuowKZQoN7fR+QxtzAnictMCA2f4+p5rbDQN9mz0u9KGTQhtWEJowxJCG5YQ2rCE0IYTcLz/CQBAJ5P/FhuLrL6HH28WKzsxMcLNzcGz/x4gQVCsQDDmX+qODn+JidmdmIgxtfTvShs2IbRhCaENSwhtWEJowxJCG+MIDpU6Z5iv4cJdXaP5/BGqDwEBAQEBAQEBAQEBAQEBAQEBAQEBwShC9NUTEDy6YPsv4d12QCiNgIDABoEczsKQkEAuFwBwTyo95oypLAkICEYHbP8lvNshVkZEZMbFoZteLNaBpKTl4eEDDntRJMq0mHwMlc1JTc1JTf04NTUrIeFVsVjAYOA87474+JzUVFfz5OPI5FSWc0480hw7dsx6Tsi4uLjr169rNJqurq6PP/6Yy+Xil0Wmb7Zk9uzZjstSqdRt27Y1Nzf39/cXFxc/99xzDl32qJDq7Y20upzU1N24Z90caRgMxvbt21taWtRqdWFh4SuvvDLgAJFIdPr06a6urs7Ozi+++CLo4Q8msNtGYmJiXl6eRqOpq6vbsGHDgF+22TbEYvHx48fb2trOnDkz3OtiUyh7p07dPGmShM+f8JsYdEgmk59//vmLFy+yHp4PEGDq2UH7otjn3Y5YcBQQ8XjWM5GOHINaMCgoCB6MvXv3IgfgiXUYenYkeuOUtSZdLP671W13WGD7L07vnuXvb5kkjBwD5jh9BLDMn6gkUuaUKTvi463XpGNRKO5WudHKiIgd8fHI5KQJQmFmXNyuxx7DOd83kj894eODbP5ZIvnN5E/Jyckmk2mAFwUEBPT29l64cGHu3Lnp6ektLS3nz5/HKQsAOHfu3KVLl5ItsJ7R2w7ZY8eOSaXS1atXP/PMMydPnoRhePr06cO62DciI9+cPHlYIg7KWs6NO37ypxMnTshksrVr186cOXP//v0wDD///PNoKYPBqK6urqioeOmllxYtWlRTU1NRUcEwOxR22/D19VWpVJcvX37uueeysrJgGF67dq3lqbHbxowZM3Q63ZUrV9LT02NiYoZ7XfEeHjmpqda+/ygiFAq3b9/e3NyM3Fk5D69bgK1nR+yLYp93O2jBUWDU8icMC9Lp9OSHWbhwIQzDM2bMQA6wGesw9OxI9MYpOyiO50/Y/ovTuzPj4mYN/UWzE3m086elEyZ8mJzsh3shpJUREZbzF3izWDmpqYmennhkd8THH0xOXieRAACYFMpHKSl7p04dzfzJ6avjIVAolJKSkry8vAFelJWV1d7ejq5iMXfuXBiGJRIJHlkAwN27d7Ozs+04L4ZsWFgYDMNLlixBNiEIKi8v/+qrr4ZzuWOQP6G8EBw8TvInT09PGIZXr16N7snPz7eMkjNnzoRhODk5GdlMSUmBYXjOnDnIJnbbyM7O7ujoQG/Gubm5XV1dZIumi9E2uFyuTCZ7//337b60Of7+h1JS7BYfV6Snp9fV1W3dunXbtm3W+ROGnh20L4J93u24BUeBUcufsC04gJ07d1ZUVCD/24x12Hp2JHrjkR3yeh3On7D9F493B3A4H1u8KRpRHq386aGOokRPzyQvrxM1NZYTk6d6e6M5Ta9Ot+nnnzF+znJdYTxUKhSRrq50Mnmiu3ufXt/68ITofDp9gUgk4fONMFwolX5VV6c2GAAAEW5uG6KjLzY1Tff1bVOrb7S2vigS6U2m3KqqKoUC56npZPKuxx6DIOhvv/yitlhE03E2btzo7u6ekZFx+fJly/1JSUm3bt1CV7EoLCwEACQnJ5eWltqUBQD4+Pi0trYCAEgkkslkwn9eDFkOh3Py5MkffvgB2YRhuLKy0hNf+gsAyEpIQJ0qJzUV+eeNmzfRA4K53BdFoiAuV2s03unq+rq+Hm0hNmUThMLpfn5eTKbGaCzp7v66oaHPeSvAOB2pVOrh4dHT04PuUavVJIuVoSAIAgCgB8hkMgAAegB224iNjb1586bWvPLGqVOnkOfjgoICZA9G21i6dKnJZNqyZQtSB+sVfDH4+5Qp6KMUaqPdRUW15qt40sdnQUjIzrt3F4hEYa6uFAg6VFZWIpMhpUP5L57SEeLs2bOfffYZDMPIktUDwNCzg/ZFsM+7HbHgK2FhEa6uW/Pzkc1ALvetyZP3FhdXm+OkL5s9PzhYxOOZYLi2p+fr+nrLBeexbRTu6vpSSIgXi9WpVv/U0YG/Vo6AbUFLGAzG66+/vmPHDmTTZqzD1rMj0RuPLDYz/fye9vNjUijlcvmpmhqF+aew7Yvtvza9GyXR07NKoVD091vu9GKxFohEE1xcYAAKpdIz9fW9Fgs0YUdvbFkAQBSfvyA4WMBktvT1fV5T02ixPtuYxI2h+J97e7FYfwgNze/q+rGtzfKIwu7u3UVFu4uKbnd2DvoTEABUEolKInmzWMvEYnl/f1F3N87T;4.blob,1.1,8064.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;4.blob,1.1,4840.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,8064.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;4.blob,1.1,6072.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,3.172;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,7244.9LngBr3PyroJ5dkPQ6Xv71RLKqrUbN8Voerz6r7b5epodVq/T2lMszOhKFvThtDxDEOUonM8Kek+cdOG2M2k9gbBo6p1hsXZvEb9M9ym/IkmfjchO3q0mUbWTSgdZGo5eWlKrYVe9dXX53o36dMzejyu36csltm5um1VapYfQ8czFFGKzfEkAp+4qWf9kN4afZ62vdXOF3qGYyoR9Ux22chLZFnJh9o4Uwsjy8npMrUWDqo/H9P7gpq1wPX7lIQzOz+a4wfR8QxJlOJyPEU+cZMypPxd25qmf2e1WhjVX/3TqS8dJvf69Xa4WWqBlF+lt2YtsP0+JTENy6526uQ0j/Kj6HgGH6UIHU+RT9w0cz3af4FuzdO/s1ot9K5fSelQf96dunH7e32m3PMCYfp9ymEZlt1aZ8TzB/lhdDxDEKX4HE+RT6yeOx/qGaFvR/0jrs1Ta2HVCD0l188rPvptdI8+08g6thYOq/9Dk/z5AtvvUwrGsFw7umv7M2UPP46OZwiiFJ3jKfSJ6Xuqbw/SFtCNkbHrK6a195HipRcnmvs1c/LoTNI4YzKyjq0FZe3E5wn9j4VZC0y/TzkYw/LQ05HEwcdp4+h4hiFKsTmeQp9Y+6ytXTsrutfSv2FS+3yhe/hh4mX9j8CJquPGTCPr2FqY+7I2MqyfTVivkaDfJ4IsGaIHnecgyFIAawFBdLAWEARBEARBEATJL7xt91quYp032NqFObignuw3BFGKzvH0/BH0BM6260u5rAWvrtnWsbcL3bug3uw3+CjF53jK/195m2G2cLZdfcvdQGvB1i7MwQX1ZL8hiFJ0jqeL/ysfa4Gz7T68tT29FvLveDLY2oU5uKCe7DcEUYrO8RSORmsqewY3apfXmWYnk2HMaE7upiyGbdeROJohXPvkeOo424XuXFDv9htslOJzPEWj0fjdx9c2jFxmzU7IMBjNzd2UxbDtvm/I/PIBnxxPHZEXuIyKTTHzAl93Luhi9huqKEXneIpGo/Fqeh32GdbshAyD0ZzcTVkM2248UieqBT8cTwORFziuPUnWcEeKjqf82nA6nqLRKO3DVqc8Zs1Ophas0VzcTVkM2y42sjwWO6OcOcEN+uJ4moi8wE80self7JGi4+libTgdT9Golu2NyjXO7ORrQRvNwd2UxbTt2o1ryku5UT8cTwsHu9C1C+rRfoOOUoSOp2gUsp0xO0W14NrdlMWy7Tq3qEwqk7yZ44PjCdjbhe5dUG/2G3yU4nM8RfuAbGfNTjPDYNS1uylLmm2X/Xwhb44ng61dmIML6sl+QxCl6BxP4T4g21mz08wwGHXtbsqSZttlr4W8OZ4sdnZhLi6oF/sNQ5RiczyF+2DPCMDsNDOMGUV3E0EQBEEQBEEQBEEQBEEQJAQw5uRt7f376wEeAfbxXCqOJ6mvbFjnvAv3REud52SDcTx/Ok8/1z3mZjX28fQjSvE5np3LyxTlkOMuHMnMv0XUAut4Xmp2mi1xLIs5AuzjuVQcz/be0y+FrhZYxzN5haT3h8A+nmGIUnyOZ/Uy8l56LXx3a4CQthRtQ2U5npbZeX+MkJ+3kWrlBiErDiZKbp8iXP492JtYc5L28YyWXm8Z3PkHp4PPim5O1qfmWlMb0y5PxD6eIYhSfI6nSkYtdMZryKmSn5exjqdldl6Lk/rBteRC/2VyNLW8bcXH9NpQyL9TVfOV/z1Selld0aqu6JmKkRzRzcljJU/uHei9xZ/RYB/PMEQpOseTCGqBbFYWalo7COt4WmZnozJwY6qMfDNHSN1KtfYuKvSJwcq/+w8/Uf9IK5XqiqT6fPKqnp05wHZU3Kf3vLLAPp6hiFJsjicR1QJZlVIO0H/B8QSzc/TeL289rGum50yzOxPqK6NGOtPMv3Of0dvGQ8aKv+px3MN3VCx5xg1iH8+QRCkux5MIa+HrIb1/MziecKX2/m3Dk+cvNiwQsin1ZPONr/hauPObGUNb0cV3/JHGMie/PUpvS/7NjWIfz+CjFKHjSYS18Mdk/3v0X3A8oRae3o53n13Vq546772k3jcrel6gLKYWwJycTe1WX3OlsrxGwj6ewUUpPseTiGphRWrinwmqMYPjCbVw7UiSPJ8rVwOcv6ned1qvBTP/7rfSLnCtexZVC4w5GWupOHqgZ5o/A8c+niGIUnyOJxHUQuOaR6R+/o0XWccTaqFOWU9ODNIfF1Jn329OKW/TNWb+DcTvjh+oKI0tqhZYc7LjSdVgQwc/jn08wxCl+BzPzFqo3/jxOkIeRGizTsvxZMzO0V8JuUlPnZf9czrS8MMI/cwL8m93QyL5t06yyPMFBEEQBEEQBEEQBEEQBEEQRBq2j+cH0eRwoEeAjudScTxd/181LcLdlIVxPCf6x9pdXkGAjqcfUYrP8XT/f+VDLTCGZXXrDtfL0fH0I0rxOZ7u/698qAXGsNxVexkdz1BGKT7HUzRq63iqtfBhMlJDU2XVHfVmpfIqyUtHT92w/Kzht8TM72lyHDqeIYhSfI6naNTW8SRNyv7Nn45uJGwt5KOjp25Ylqa+m1gYPMkPoeMZhihF53gK92HneJKmW2pBPKbtQaAW8tDR0zAsR+bVkvxqqJMbQ8czFFGKzfEU78PO8dTOFy6ndrG14H1HT9OwnHqk3nyr8JcGo+MZkijF5XiK92HneOrnzg//lztf8Lqjp2VY7qRNlFcr/DMOOp7BRylCx1O8DzvHU6uFE/R54dEUMWvB446eYFh+mTilvkaK8E866HiGIErxOZ7Cfdg6nk1lJwg5Ss8Xrs6so77zq5539GQMy4Hk/OyVweP8ODqeIYhSfI6naB/2jmdT6qNNF1vpU+MXQycnFpK0Fjzu6Mkalg8aEvHlaZ8woOMZhijF53hm7sPB8WwauxqP1HxNZz7+eGbugPYaCTt6IgiCIAiCIAiCIAiCIAiCBAZjWNatr4qvbQzyCNDxRMczQMCwjB0+cvT1w0dcdfdBx9OPKOh4+gJjWG5X+gg5o2xysxwdTz+ioOPpC4xh+b6yj5C3lc3cODqeIYiyNBxPQYZNKF8m5turpvnua5CTlgsKvT2jHzXHB4dpR09mFFY4ohuWsd69jY0Nd9L7L6DjGXiUpeF4CjJsQnn2w1Dp+zvPcTu2chJcUOjtGVVqtu+KjBF2FFY4oxuW5MEaRXmYdtEfOp5hiLIkHE9Bhk0oHWRqOXlpituxlZPggkJvz2iv+urrc2U1OworHDEMy3Vzb4xXXppL72mLjmcIoiwFx1OQYbQWRpaT02Xcjq2cBBcUentGD6o/HaPdaJlRuNraAdOwXBhS6+jr/gXhftHxDDhK0TueogxzqAVwQaG3p1YLpPwqOypdC5ZhqblzpHeVeL/oeAYWZYk4noIMc6gFcEGhtyc8L8CobC2AYXm1XH25NVDO/z1AxzMEUZaG4ynIMIdaABcUentGD6v/V5P0fAFGJWuBMSw7kxtnH+9MZvlOGHQ8g4uyNBxPQYY51AK4oNDbM6qsnfg8sZ8blawFzvH8rrb2uwf8ODqeYYiyFBxPUYYxtXAipkHfP4CctFxQ6O0ZnfuyNjLcyY3KnzsjSPjZqf/FbHeap587I0jx8kA7EV55ymke1gKC6GAtIAiCIAiCIAiSDxjDcsvdSO+VQA/G1vzLwQX1ZL8hiLKUHc/mlqxD9j3cmjbIhGcBw/LPiR8rjyvbXK326pptHXvzz70L6s1+g4+ypB3PY6aBn5lrHtcCY1g2x2OE/F7leGUwi7e1YGv+5eCCerLfEERBx5OS91pgDMsxmmYT9Komhvw7ngy2dmEOLqgn+w1BlCXheN4fI+TnbaSaNsOxsu5dNb2S2jCTa5a7Cb09wfEkD/Ym1pykChuthYGeSy5ftOqG5c4ooX9993BDPjmeOs52oTsX1Lv9BhtlSTie1+KkfnAtudB/mcm6rr6+qF4LkGvgbkJvT3A8T1XNV/73SOllrRaqDx7mLzV1Rjcstatdtyuz3JBPjqeOyPxbpl2S9SJ3pOh4yq8tGMezURm4MVVGvpkjvJN5PGlsmLkG7ib09gTH8/7DT9Q/10olrYXYzaTEGw4chmF5Tzn+SluJ7iVY+ON4GojMv3HtqbGGO1J0POXXFo7jOXrvl7ce1jXTsyL2utKMWgB3E3p7guN57jM6p1F9lmrqWT/Ev+B3xjQsyS9DSuIdha8kXxxPE5EX+Il2Sda/uCNFx1N+bcE4nmT/tuHJ8xcbqGNsWwvgbkJvT3A87/xmLmxShpS/O/0SPJZhScgrb65bSPJNqvxwPC0c7ELXLqhH+w06yhJxPJ/ejnefXdVL+8ja1gK4m9DbExxP/XmB0jRzPdp/wem3YAHDknJqJO2p0QfHE7C3C927oN7sN/goS8PxvHYkSZ7PldN8E9aCmWvgbkJvT3A877eq++po3aOdOx/qGTnm9GsAjGFJqjefnXrhBD+ef8eTwdYuzMEF9WS/IYiyNBzPOmU9OTGoveyxso6+jzTa16fJlmaugbsJvT3B8RyI3x0/UFEa099TfXuwxvH3sGANy+eRitPpLlz+HU8WO7swFxfUi/2GIcrScDxHfyXkpvaBopV17+qPOf00AnLNcjehtyc4nmR3QyL5N/pOqvZZW7vzWRaCIAiCIAiCIAiCIAiCIAiSC7HlJZFS7Yq3oHorYh9PxyhLwvF072RKsIV+Ki37G0Vbt23fQS9xzclRxD6efkRZGo6nV7XA5aRWC5K/UZdCr3h9g87zxrtzDfbxdIyyNBzP/NWC5G9UP0CvdztHLTWh24d9PEMQZUk4nqyTaXmaoo6eTKdOgdnJ5GRbaXnLh7QW5B+Zy11XUuMki9uHfTxDEGVJOJ6MkwmepqijJ3TqFJmdkJN1My9vaq+ltSD/yCQUZSv9V+j2YR/PMERZCo4n42SCpynq6AmdOkVmJ+Tko6p1hgEq/8isbluVopKz0O3DPp6hiLIUHE9wMsHTFHX0hI5sIrMTcnL+JDHOF1w9Mh9R4Vro9mEfz5BEKX7HE5xMy9MUdvSETp0isxNycpr+tdZqQfI36mqnJk7zKMni9mEfz+CjLBHHE5xM8DRFHT3heUFkdjLPC/SvtVYLkr9Rt/KNenuehhe6fdjHMwRRlobjCU4meJqijp7QqVNkdkJO/iOu7WOL/G+0dnTX9mfaF4QJ3T7s4xmCKEvD8QQnEzxNUUdP6NQpMjshJxsjY9dXTNNakP2NDj0dSRx8rG2KvDvs4xmGKEvC8WScTMvTFHX0hE6dIrOTycl7Lf0bJrVrMLzOFwQJBdiRDUF0sBYQRAdrAUEQBEEQBEEQ/2EcT1Jf2bDO/yNgHM/b2icN1x2XyM6TBR1P+RWya/PheOrGZt4Ax7NzeZmiHHK32lvHk/x0nn4C7fzVyLLzJEHHU36F7Nq8OJ75rQXG8WzvPf1SALXAOJ7kUrPcGtl5kqDjKb8iyzx/HM/81gLjeFYvI+9l1IKvjidJXiHLHKYTN/MkQcdTfoV4nseO5769o/HhDzizE4zNfGI6niqCWvDT8axPzbWmNjpf6Ck7TxZ0POVXiOd563gO1O4fP1o6/QlrdoKxmU9Mx5OIa8FHx/NYyZN7B3pvOZ6/y86TBR1P+RWyaxfjeF5XvlBfO++9wZqdYGzmE9PxJOJa8NHx1Nin2XvOyM6TAB1P+RWyaxfjeHZWje3RngiZq1PB2MwzmuNJ7GrBF8dTp+SZ3CrZec6g4ym/QnbtYhxP0n2ytX//Fq4WwNjMG4zjSWyfF/xwPL89Sm9L/u20QHaeLOh4yq+QXbsYx1OlfktN5APuecEyNvMG43gS21rww/GcTe1WT81Tjq99ZOfJgo6n/ArZtYtxPLeWqhk2oGYmUwtgbOYPcDyJbS344XjGWiqOHuiZTu+fmIHsPFnQ8ZRfIbt2MY7nt5GazZu+T3SztQDGZv5gHE/bWvDF8ex4UjXY0CGxRnKeLOh4yq+QXbsYx/PCj7Wt+59z5wuMsYkgCIIgCIIgCIIgCIIgCIKEAHA8GdcyoCMgW+5Geq9kn2k5qA7zXIOOp/wKh3nmY8S6wxbwuAksXXB5oqXOO3eNxPUb4HgyrqU0XlyPBEfw58SPlceVbVnmgYNqP8896HjKr7CfB48RPKoA87gJLN3AawEcT9a1lMaDWmAs02Z6zcnvVVmuTQYH1X6ee9DxlF+RZZ5xxZH1GDGPKsA8bgJLN/BaAMeTdS2B/DuejGU6RgtxQlktnggOqv0896DjKb9CPM+84sh6jJhHFWAeN4GlC45ntPR6y+DOP6j3rbqj3qxUXqXrKsor2hUqUe7+LNH6Gt2dsKOnYJ68H8o4noZryeCL42kewc4ooc9Pe7JONGrBcZ5L0PGUXyGeZ11xxFzTxuaVDjxuIksXHM9o693H13qmYmwtaI7nLZrjnWUV1yaT54m4o6donrwfyjiehmvJ4IvjaR6B1nFluzKbdaLx/+w4zyXoeMqvcJxn1QKbVzrwuIksXXA8o0n1r/mrNMOgFh7VrqOvyNQcb16j/mluU/4k7ugpmifvGz7TvwAAAgNJREFUhzKOJ+ta6vjieJpHcE85/kpbiW5GCDH+nx3nuQQdT/kVjvOsWmDyyiDtcUuzdMHx1M4X/qocYGth/o+EvuZXc7xnOKYS2SXu6Cma58oPNRxP3rXU8MXxtI7glyEl8Y6S/c1D8//ZaZ5L0PGUX+E4j73u33SHTdIeN97SBcdTq4UuehU/1ML0DmLk+Kh+lvpU3NFTNE/SD2UdT8u1ZMi/48lZpq+8uW4hmf2rj6z/Z4d5LkHHU36F4zz9MeLdYQvzcRNZuuB4Qi08miLm8wI919ByvHf9SkqHuKOnaJ6kH8o4nuBaMuTf8eQtU3JqxObJmfmbYzvPJeh4yq+wX0vMx4h/VGHUeNxEli44nlALV2fW0RxXa+GdKnVv4zTHV43QHdDzWlFHT9E8WT/UcjwZ15Ih/44na5lWbz479cKJ7FPNWnCa5xJ0POVX2K8l1mPEusPWqPW4iSxdcDyhFr4YOjmxkNTeR4qMXf+0THt/KF56caK5f5+4o6donqwfajmerGsJ5N/xZC3T55GK03YWs1kLTvPcgo6n/Ar7tdZjxLrD1ig8bgJLFxxPqAXy+OOZuQPa5wttLeUVW7V87h5+mHiZ/mEQdvQUzEM/FCkqaNG9m+pi7xJ2bhPMQ5Bi4kzy17Yrrbe5+0S1IJqHIEXF5NxM73/4F8bC5wXBPDn+P4E2PHEXAdemAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492256853;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.570,3.114,2.50,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.670,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.750,3.114,3.200,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,10.image/webp,1.0,1.1;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6812.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,7008.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,3.172;4.blob,1.1,8064.iVBORw0KGgoAAAANSUhEUgAAAwsAAAHsCAMAAACqpsGbAAAC+lBMVEUAAAABAQEzMzPDw8P39/f29vajo6MICAiBgYHl5eXQ0NBbW1sFBQV+fn7k5OT5+fnS0tJOTk40NDTAwMDr6+uYmJgNDQ0wMDCxsbHs7Ozx8fGpqakiIiIDAwNPT0+2trYKCgqsrKzq6uqoqKggICCgoKDU1NQSEhLExMRJSUlAQEBLS0uLi4vT09M4ODj///93d3ekpKTu7u5tbW1GRkaPj4/IyMienp5qampKSkqlpaVDQ0MeHh7y8vK1tbVNTU1gYGC0tLQtLS3z8/O6urpXV1fMzMwcHBwWFhYMDAza2trX19dVVVVYWFjb29sREREXFxfLy8slJSVcXFzW1tarq6uJiYno6OgGBgYsLCyhoaHp6ekTExOcnJwODg7e3t58fHw8PDw9PT15eXn6+voyMjL9/f0bGxsUFBTBwcFsbGwrKyu3t7f19fX7+/s3NzeTk5MxMTEaGhqurq7CwsIdHR1oaGjf399dXV1eXl4LCwvv7+8QEBBkZGRHR0fNzc3t7e2tra0mJibR0dHV1dVCQkJ1dXWQkJC8vLwHBwdwcHBMTEx6enpERERUVFQYGBgnJye4uLhISEhiYmI1NTW/v7/m5ubZ2dmZmZnh4eHd3d0fHx/c3Nzi4uIPDw+amprGxsZfX1/j4+P4+PgEBAT09PSqqqpBQUGGhoZlZWV4eHiAgIAoKCjw8PDn5+cqKiqIiIiVlZVRUVGXl5dQUFAJCQmEhISMjIz+/v6dnZ0kJCSbm5vPz8/Ozs78/PwVFRW9vb2mpqbJycmHh4fFxcVzc3NpaWkZGRlxcXE5OTlFRUWKioqNjY3Hx8c/Pz+UlJQCAgJhYWEuLi7Y2Ni7u7t7e3vg4OCSkpIpKSl/f3+ysrKvr68vLy+wsLAhISFaWlo6Ojq5ubl9fX2zs7O+vr42NjZTU1NjY2NycnIjIyOOjo47OztWVlZubm6FhYVra2uioqKWlpafn5/KyspZWVlSUlKDg4Nvb2+CgoI+Pj52dnZmZmanp6d0dHScH8LLAAAgAElEQVR4nO2de3wUVbaoN2NCk6hJwIhEQSISHIRQJiDigBAIIgoCKhI0HCCSiZmRiI4PEFTCwQcQAgrCIQIOGiLMEeLI45yIvME4AnPFccR7feA4ijgjjqOOeuace3+/W7uqutbe3TtVuzrVVdWd9f3RVGrvvapCr5Xu6tSXRQiCJAzt/D4BBAkEPzkrJbW9N4cKdUhLTT/bm2OxnHNuRmZWR22z03kp2ed3tl8iO08Wd+LFL8oFXXIuvKhrbGutz8r5Cum13S7unhuxousl2T0u7clvmeT1sj7cZdk/7X15n4idffOtF/VT+hlbV/Rq6ZwFFBT2H3ClcrHtPJZLBjqaLuSqnEFX/0wZrG4NuWbosKK04bYrZOfJ4k68+EUZUTyy47WjelwXy1rrs3K+Qnbt6A4ZinI9vyJ0w5ixN44bE2K3ALtauFEJ1w6TdeN7iieHgVrodUUL5yxggjJIfbzJ2XPpQi3crNyivhGceKu6OalkMiHDlNvslsjOk8WdePGLcnupum/KNf8Sy1rrs3K+ooV5U6dG7CuaNv3cyFoYoJQRcofSm90C7GphRnl4y0HWmbXw84o7I8+5ZbpVnqM+/qI7v/eXmXfNrLqbvjLN+kVK6T3aN2duqZVPkT4xIfcW/Ep9vO9+9eGnl6gPDygP2i2RnSeLO/HiF6XLbPo456FY1lqflfMV4nlzc+Y9zO+b2o48ElkLjyojCLlL6cNuAbQWKifOp29gRgyv7rHgX+lOM9fS9VwrY7PuQfWfEn0x5OmAhZmP9dcq4PGFmflPhGvhyUVOvjdCFk9YUlHD7/qlkra0dtlyQp5KfXrFysKhhN16pmzVY2VlZfaBbZm8uq/6+G9r1Dd0dcp0u9my82RxJ178ojykXCl1GSJaa31WzleI5y0eM25u1NqoWgg9O3zt2qHrQuwWoNZC51HjRqtblTkja8amr3+OzbULyn6dqebaVDbrlpeVFYRrIZynN2du6PP8C7QCutaf17sox6iFjaUPOfneCGlQlCsidv1SMX4avXjDRlrOm9gtd64XKJuvoa9g684nv6n694aX7GbLzpPFnXhxjDK9vKF9vxYW2Ky1PivnKxysjaoFsuVCRdl6M79lktcrtKpR+4BghfKymtTDn+FzbXp9eCaTdb81a8HI0/MLO9O3YOr/1ivZuYRsM2qhT8NcJ9+b+nZl8PaKHfyuXyo79Y2G/6CP2f/JbrlWCzuabtHONO/V0k1E4lmQnCeLO/HiGWVX3zTltW6xrLU+K+crHKyNqoXc3TfVdJy/J5fdAvImXrL3Xm1rX/b+Yfr1B5trNrVg5OlNB4hxlXDwdgLXCxe1d/S9aTy9h//6l4r+OrZT+SX9Z2Ees0XcqoVOVYe0f/+t6bD68lA13W6+7DxZ3IkX3ygbr1Bej2Wt9Vk5X+FgbVQtNN+tvol5o7yZ3QLylL3K7/TNXbfPKx/5JuFzzaYWjPdb658kRgWs/09i1sJzKUecfG/LiyrVx6PV/F7zGFV6hR5jt1yqhbWN7fVfKB7+/Tn0+7e9spGdJ4s78eIW5Zz/+F/0n5vOiuUMrM/K+QoHa6Nq4a06+jhtO7sF5NWvaF8+y/ii25tdUp7ic02uFg7+jIRfF/KIWQuPZBx38r3tUt5WH2eO4veax1igv3OrZbcIWTPOJqoEz/UaeY6+1TdNPVhv5Q92K2TnyeJOvPhFefYs9Zls984fHa01PuW0PivnKxyshVowRpdmTlEvjDPfZbcA9dp57sQT49WtKxaqbwcraT6yuQa1wGRdVC3cUz2XnoFaAe+Vqm+brtZr4f6jgnO24KLqQQOOKcP4neYx/nfKzEefr36a2yJkjvJ/Nt1SaRfZko2LsnuXqahRehYP7/N8xkzbJbLzZHEnXvyi1N79/sU1H5Q/7mRt+FNO67NyvsLBWrMWwqOjSw7v2DawZB+7BdDPVO+q6qJufZjyUZ+rP2jYxeca1EI46+jnSNVlZVsIk6cnU+7v/fFqWgFrU/evuGW9Vgsnm26LPmcr5h6a3TBqW8RO8xjkTz9Nyd4+ld8i7Y5VZ44ZYRvaiuv0j4uVG9XtZ+5PqX5tqv0a2XmyuBMvflFmDc2eN/IOR2vDn3LanJXzFfJrzVowR7e8n5Pz/hZ+y0T7XVuRdlU065OceX/8E93J5BrUQjjrHtQzh/7OAPJ0cFZ5rxlaBWzKL++1Utv6s3kV7HbmIEiwgTsvdCYu8elEEMRnImsBQdoqWAsIgiAIgiAIgsSPNdqntSt8PANLAy8GF9SV4wYgSiI6no5H7VweB/Na9jnNfRn/Tr880dJdep/OpL//fVjujHTcumdbx9rAc+6CunNc/6MkouPpfNTFWmjR54R9NrUw/6jcyTC4WwuWBl4MLqgrxw1AlER0PK0ji0bdqwWBzxl1fja10LiEHI/cF3/Hk8HSwIvBBXXluAGIkoiOp3Vk0ajpeG7eT8hn/Uln5RSbdWYmMi7okBeLC696mBulRPuc0ednXQvdKvYUVhz+kN/pkeOpY2/gOXNB3Tuuv1ES0fG0jiwaNR3Pz0vJxqqLyKzyxUyuQSaCC7ovI2vZ6ZKZ3CgR+pzR55cxPaRS10ItjE87sOnaZ1fncjs9cjx1RAbecXrKIeOmbocuaGuOG6goCeh4Oh81Hc+eSuWpugzy9m4u18xMBBe07zVq8j+u/JwdJZY+J+wz3tNYfZcjlNPc1944nuEzFRh4Ndopf6R/4dAFbc1xgxUl8RxP56PgeFZv+uLVrSf7/guXa2YmwryJ96k/JnemDmJHiaXPCfsy7umkstryu0w7xn3pieMZRmTgPUdPudNftG2nLmhrjhu0KInmeDofBcdzZP/7Vs6cM7SZyzXzrmyYV63/bD/Ejlr7nLDP+nrhD2PpY9pfuZ1eOJ4mNgaeYxfUpeP6HSUhHU/no+B4HlpTevOM86ed4nINasGcN+1W7QfldYSrBSufE/ZZ18KOpiHqhXHTSm6nB44nYG3gOXdB3Tmu/1ES0fF0MGoAjueyMSXkyz2ZIS7XoBbMedtP0E+Y6BUkWwtCnzPqDKxrYWd+1tgzE9dzf7/JA8eTwdLAi8EFdeW4AYiSiI6n/GgYcDxPKreSyVXphMs1thaMeft6pM850rd8BDsq9jmjz8Dm9wvXHciuGvoAvy/+jieLlYEXiwvqxnGDECURHU/p0TCM41n9FSGrXqU7Ide4WjDm7Vqwtfi8wdyo2OeMPgObWkCQxAd9TgRBEARBEARBEARBEMQrehqf3x+zn+ou2MfTNkrCOJ5mL1hhNjHPNHmqfeMC+0PIUpDewkBsfylpMf2lbtkZ/d4KWbCPpxdREsfxNHvBCrMJnmlSW76oyLV7aFyvBZ2/jXE0Hft4ehElYRzPyF6wfDYxz3TnwiftwjsiHrUQyu7P78A+ngGIkjCOZ0Qv2IhsYp7pr3MWk3aRASHXtgwvvvDvVFI7f5360Em5nJsHXT7NeQXpK/KrBv6E7gPvk+vj6ZxHiiPuQ8E+ngGIkjiOJ98LNiqbSPiZfnHoN8X13/K3gUKuTcn+ruM/xixcLK4F6PIJ8woKN3y/7LG6EOt9cn08YyD/m4gd2MczCFESxvHke8FGZRMJP9MLK96vba66nR8yc23zVtrOll52iGoBunzCvILG8YRcTnMSvE+uj6dzBit3RezBPp6BiJIojifXCzY6m8xnevbB44S8vpfrywO5dv+L9HHt9eJagC6fME+7XviVcob1Prk+ns75dFXkHuzjGZAoieF4aoR7wUZnk/lM172lPnyo8Lehm/ddrzNfT4TXC+Eun8w8rRaW0/v5wftk+3g6Z1fF55G7sI+n/1ESx/HkesEKssl8pgfSP+ZwAf0DSAxmruk/7ylav8/IWjC7fMI8qAXwPtk+ns5574WNkbuwj2cAoiSM48n1gmWyyYgMz/QPDVPU90gp/KW1mWub56kDD8wbRsjS+lz1fRVfC9DlE+ZBLYD3yfbxdMzUa6ZH7cM+ngGIkjiOJ9MLlskmY5R5pisbv9vxY9UkPqCZa5U9fl9zJitd/erlvbfXNpfwtQBdPmEe1AJ4n0wfT+csyZwQtQ/7eAYhSsI4nkwvWCabjFH2md7Svbi0Q8RfLIVcG9K9ofE17cL6+3fq91xLa2Gy9jfjQvTzA+jyac6DWmC8T+jjiSBJxEC9jor8Pg8E8Zst2iVxpyl+nweCIAiCIAiCIAiCIBpdL8nucWlPzw+LjqdtlIRxPFvTx1OWPNPbadHgaTWhG8aMvXHcmJD9TAAdTy+iJI7j2Zo+nrJ4UQsDlDJC7lB6O1mDjqcXURLG8WxVH09ZvKiFR5URhNyl9OF2ouMZgCgJ43i2qo+nrOOZl/5ESWoXmjSM2ekyoWeHr107dF1k/wV0PH2PkjiOZ2v6eMo6nnnKyD7PVx8mrNnpOlsuVJStN/P70PEMQpSEcTxb08dT1vHMW72Yuptvsman2+Tuvqmm4/w9uRHnh45nAKIkiuPZmj6eso6ndr2wuGkQa3a6TfPd6svTG+XNEeeHjmcgoiSG49maPp6yjqd+7bz1v7g7tV1G8+nItO3i80PH07coieN4tqqPp6zjqdXC5Kav41kLSzOnEFKZ+a74/NDx9C9KwjiererjKet45mVMJmQsdXTiVwujSw7v2DawJPLvdKDj6XuUxHE8W9PHU9bxzGt6uvdDhfRFMn61QLa8n5Pz/pYWzg8dTx+jJIzj2Zo+nrKOZ96ipaWpXd4gca0FBAks6HgiiA46ngiCIAiCIAiCIAgSKPptSJm2xPvDouNpGyWQjifblZPlKv3PNgqMYVjR0toYuKIXfXQ5I+5s+KTjJKW//UQGdDy9iBJMx5PpyslS1qTVgsgYhhUtrI2FXlc4OGdZjpaqJ/5ttu2dwSzoeHoRJZCOJ/O8EfOOI0I25m/QakFgDMMKfm2r+HnFnfLnLM0iempHlHu5neh4BiBKIB1P5nmDO44IeWL1AK0WBMYwrODWmlg7npB/0MdT5clFDs5ZmoEFhHaTGMafHzqe/kcJpuNJ0Z835o6jBxrG6q1whMYws4LdMrB0PCHroI+nysbSh5yeswztx7WjL207Is4PHU//owTS8aTozxvDB93DbaFExjC3ImqtpeMJWQd9PFX6NMx1es4ybFImXTY4TfcSmPNDxzMAUYLoeBLzeQNqUrsatSA0htkVUWutHU/IOujjqXJRe6fnLMcXdysN9yj8R3foeAYkSvAcT3jeTHbOfikU+qfyz8ktGMPMiqi11o4nm3VmH09Cnks54vCcZbnsttzmxnbi80PH07coAXU84XkzKTJclPQWjGFYEb3WxvFksy7cx5OQRzKOOztnB0yZHfEyg45nAKIE0/GE581cO7qfymnl9IgIYziqjye3Noyl4wlZB3081ao5Kvg+3GBqnxl1Z01u4fzQ8fQvSiAdT+Z5Yz9TDbdUZo3hqD6e3FoTS8cTsg76eJKTTbdFfx+u8GVK1rs7I/ah4xmEKEF0PNnnDdYSs704YwxH9fHk1ppYOp5M1kEfzz/vEXwfCNIGmejD7XMIgiAIgiAIgiAIgiAIQrpd3D1X23DbnJQEHU/bKIF0PP3v46nhouM5ukOGomiKRCyeHDqeXkQJpuPpfx9PDRcdz6Jp08/VayEWTw4dTy+iBNLxDEAfT4qbjufUduQRvRZseiui4+lblEA6nl738TSzDvp4Ulx2PI1asO6tiI6nf1GC6Xh628cTsg76eBL3HU+jFqx7K6Lj6WOUQDqe3vbxhKyDPp7EfcczXAuWvRXR8fQzShAdT2/7eELWQR9P4r7jGX6PZNVbER1Pn6MEz/H0tI8nk3XQxzMOjqdRC9a9FdHx9C1KQB1Pb/t4QtZBH884OJ5GLVj3VkTH078owXQ8ve3jCVkHfTzj4HgatWDdWxEdT/+iBNLx9LiPJ2Qd9PGMg+Np1IJNb0V0PP2LEkTH0+M+npB10McTHU8EMUDHE0EQBEEQBEEQBEEQBPEF0/FktgIOOp7ya/1yPEXZZD3K0jff/vjOVki4oOB4wpY8bt2z7SweOp7ya/1yPEXZZD3KMb6nxSDA5IvdCgkXFBxP2JLHn1pAx1N+rV+OpyibrEdjQT7/ZFxQcDxhiyH+jidzDNl46HjKr/XL8RRlk+VorfJD8cGi7Bc2EfKgmgQlxt6szKwi2h6XycSzRzWkrZlC2HxhVpjZWdDl4olVh8NtaSVdUDgrQS144Hiax5CNh46n/Fq/HE8iyCbL0Vrl2Md70x8deD8hy8vKCvTM7lp/Xu+i1XothLNkbMVLg295h96lB/kCKyA7C0o3bFvWa/ZibbesC2pdC/F3PM1jyMZDx1N+rV+OJxFkk+VorXIdqetAztV6W5Hf6pn9Sk4ufU+j14KRJV07qbU3R6EvDGy+GCsgOwtKO9N+5fotjbIuqHUtxN/xNI8hXQvoeEqv9cvxJKJasBqltXDiJTI9Q/vKyOyDPyO0uYleC+Es2TGwWH1LpF0qR9cCZGcBdX66Kt9ru2VdUOtaiL/jCffqSsZDx1N+rV+OJxG9R7IaFdbC+icJ1IKRJVc3HejzzOst1AKTnVot9FSW0a+lXVCZWoin4+m4FtDxlD8DvxxPIsgmy1Hx60IBiaqF4fMJdd1aeF2A7GRrQdoFlaqF+DmebC3IxUPHU2Ktz44nYbPJelRHWAv3ZKtvjGr4Wpi5Sn2YrtcCky/GCshOthakXVCpWoib48nVglw8dDzt1/rteBImm6xHw98k1AL9VKi6rGwLISdT9q94PoOvheamGY/2rVDuotvhfIEVkJ1MLci7oFK1EDfHk6sFyXjoeNqu9d3xZLLJetSAqYUH9d8b0N8FDM7PzPpvzfM3s6Tdn9endv/4RB9t28gXZoWZnUwtoAuKJD40bR9smtDKKOiCIgnPHSVfPf5j4Rq/TwNB/Gfl7vpn/xayn4cgCIIgCIIgCBJnwrYd00/TLywNvBj6fbpy3ABESUTH0/Eo4yA4;4.blob,1.1,8064.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;4.blob,1.1,8048.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;3.end,1.1;4.sync,10.6492257920;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.950,2.19,2.14,1.1,1.0,3.627;4.rect,1.1,3.201,3.649,1.6,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.291,3.649,3.488,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.646;4.blob,1.1,2156.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;3.end,1.1;4.move,1.4,1.3,1.2,2.21,1.0;4.size,1.4,2.12,3.659;4.rect,1.4,1.0,1.0,2.12,3.659;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492258757;4.rect,1.1,3.260,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.250,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492259253;4.rect,1.1,3.270,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.260,3.646;4.blob,1.1,336.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAAA4ODj///9CQkLR0dH5+fnT09N1dXUiIiL4+PjAwMBJSUlgYGDs7OyVlZXr6+sKCgpRUVHJycmhoaHi4uKMjIygoKCSkpLp6ekJCQlKSkofHx/29va9vb1ISEhcXFxBQUH6+vrU1NRiYmJO0CRKAAAAS0lEQVQImWNgIA4wMjHiZjKzsLKxg5kcnFzcPLxgJh+/AAODIJgpJAxXKyIKZwqJwZniEpIMDFJgprSMrJy8CMRcBTZFJWWEbUQBAOcFAsqG8+H3AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492259343;4.rect,1.1,3.270,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492259420;4.rect,1.1,3.290,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.280,3.646;4.blob,1.1,300.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAV1BMVEUAAACsrKz///80NDQoKCg8PDxJSUnx8fHU1NQKCgqpqanz8/NsbGxXV1f5+fmUlJQRERHf39/KysoGBgYBAQGxsbHu7u4gICBzc3OHh4cdHR3AwMB8fHzmIQsbAAAARUlEQVQImWNgoBwwMoEBM5DJwsrKysbOwQmV4eJmgbJ4mHihLGY+fihLQFBIGMISERUThwpKMEkCzWCVAjKlIebKkOQYAJa4AdZkfyvpAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492259585;4.rect,1.1,3.300,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.290,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492259607;4.rect,1.1,3.310,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.300,3.646;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAACkpKS4uLiKiorq6ur19fWtra0XFxf///+xsbFGRkZqamr29va9vb3e3t4GBgZlZWUxMTHMzMwRERFiYmL5+fl6enpjY2Pa2toCAgIwMDCoqKhFRUVmZmb09PS7u7vPz8+Dg4Ps7OwVFRVBALzTAAAAUklEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGUTGEqDiIKSHJwCDOIQU2QVpGVk4ebIKCohIPmzIDXBsDbiYcAAD8fgNA4rJSBwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492259663;4.rect,1.1,3.320,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.310,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492259750;4.rect,1.1,3.310,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.320,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492260186;4.rect,1.1,3.300,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.310,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492260329;4.rect,1.1,3.290,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492260462;4.rect,1.1,3.280,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.290,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492260594;4.rect,1.1,3.290,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.280,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492260703;4.rect,1.1,3.300,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.290,3.646;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAACkpKS4uLiKiorq6ur19fWtra0XFxf///+xsbFGRkZqamr29va9vb3e3t4GBgZlZWUxMTHMzMwRERFiYmL5+fl6enpjY2Pa2toCAgIwMDCoqKhFRUVmZmb09PS7u7vPz8+Dg4Ps7OwVFRVBALzTAAAAUklEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGUTGEqDiIKSHJwCDOIQU2QVpGVk4ebIKCohIPmzIDXBsDbiYcAAD8fgNA4rJSBwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492260772;4.rect,1.1,3.310,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.300,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492260862;4.rect,1.1,3.350,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.310,3.646;4.blob,1.1,780.iVBORw0KGgoAAAANSUhEUgAAACYAAAATCAMAAADLVI+CAAABJlBMVEUAAACkpKTQ0NAoKCi0tLTz8/Px8fGioqIYGBhISEjT09P19fXIyMgzMzMeHh6qqqru7u6enp4QEBATExPr6+vKyspOTk5ZWVnX19fR0dEHBwfGxsZSUlJUVFTV1dXh4eEICAgVFRXk5OTS0tJjY2Po6Oi3t7eGhobw8PAPDw8nJyf///9PT0/n5+cRERFAQEBBQUGLi4vy8vJCQkIyMjICAgIFBQXCwsIfHx8MDAwaGhpWVlbW1taurq4JCQn29vZqampMTEywsLDc3NyWlpZYWFjt7e2Hh4c0NDQjIyPe3t6rq6scHBzv7+8ODg4dHR1NTU2Xl5fg4OAbGxsUFBTq6urHx8ddXV1FRUX6+votLS22trb09PSbm5skJCStra3AwMBDQ0OYCusOAAAA3UlEQVQokWNgGGDAyEQ/ZcwsrGzsHGBlnFzcPLwgMT5+VgFBIWRVwiKiYuISklJAZQLSMrJy8goMDIpKyrIqqmrIytQ1NBkYtLR1gMp09RgY9LUNGBgMjYCmG2ubMDCYKoCAGQODOT9IsYUl1G1W2tYMDDa2QDk7ewcGBkdtEHBiYHB2QfECh7YrA4MbWFLbnYFB0wMEPGGmoSrz8gbL+iC7zdePgcHfNwBZWWAQ0A0MwcheCAkNc7RWZlJAVqYYyhQeYRgZhayOLzpGN1YRxVKGuHgN1oREfKE9eAAAj5Ud/BmY0jIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492261031;4.rect,1.1,3.360,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.350,3.646;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAmVBMVEUAAABERETS0tL5+flgYGD///88PDwiIiL4+PjAwMBJSUnm5uaVlZXs7OwKCgpNTU3JycmlpaU4ODji4uKQkJCkpKSTk5Pr6+sJCQlMTEwhISH39/e9vb1ISEhfX1/k5ORDQ0PT09N2dnYODg5oaGj+/v4XFxc9PT3o6Ohubm5CQkJvb2/u7u6ZmZliYmLPz8/d3d2FhYUICAhJ8YFkAAAAZElEQVQImWNgoAJgZGJmYmFlA7LYOTi5WLjBTB5ePgYGfjBTQBBICIGZwiJwpoAonCkmLsHAIAlmSknLyMrJg5kMCorMTEqsQiCmMhCrqKoBSXUNTS1tHV2wxXr6HAaGRihuAQA3HQWn8U4CFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492261363;4.rect,1.1,3.370,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.360,3.646;4.blob,1.1,248.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACYmJjc3Nw0NDT///9AQECUlJTh4eF6enr4+PgKCgpQUFAqKir8/PyhoaFERERpaWno6OhSUlLY2NjOzs5XV1f5VN4yAAAAMUlEQVQImWNgoBwwMgEJZhZWEpls7HAmBycXAwM3mMnDy8cvIAhmMggJc4qIQphEAwBg8AFUd2BvDgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492261431;4.rect,1.1,3.450,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.370,3.646;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAAE4AAAATCAMAAAAJZMsGAAAB4FBMVEUAAABoaGj////o6Oh3d3fU1NQYGBg8PDykpKSIiIgyMjL9/f0bGxtbW1vMzMz09PTl5eWZmZkTExMoKCi0tLTz8/Px8fGioqJERESDg4PJyclgYGDr6+vj4+NBQUE3NzfBwcH39/fp6emTk5MMDAweHh6qqqru7u6enp4QEBCQkJC8vLxVVVWAgIBDQ0NcXFzY2Ni4uLjKyspOTk5ZWVnX19fR0dEHBweNjY1aWlr8/PzQ0NBHR0fIyMjCwsInJyf29vZISEhiYmK1tbUVFRXk5OTS0tJUVFRjY2O3t7cEBAReXl4iIiI0NDRdXV2Ghobw8PAPDw9PT08cHBzh4eGBgYF+fn7a2tqLi4vy8vJCQkJLS0sLCwtQUFAgICAfHx/g4OB8fHyEhISMjIzW1taurq4ICAgJCQlqamqpqamjo6NKSkr+/v6mpqY1NTVzc3Pc3NyWlpZsbGygoKDt7e2Hh4dFRUXNzc319fXe3t6rq6tkZGQCAgK/v7/v7+8ODg4dHR1NTU2tra2Xl5eKioppaWl5eXkrKysUFBTq6urHx8dMTExWVlYpKSlfX1/6+votLS0hISEsLCwBAQF9fX3i4uK2trbn5+ebm5s6OjrExMSsrKwkJCTAwMDOzs5wcHDpRaTxAAABxUlEQVQ4je2T1VNCQRTGj2ugomJdRcXAwO4WRAxU7BbFwMLCxu7u7v5X3XMxlhnGB8cXZ/weTnw7+5tzd/cC/Otb2RBCbK0t2Nn/BOcgEDhaxdnb/QRH5WQN5yx0odHVTeTu4Ym9lzfn4+sAjCcmfpx/gCQwiHrBIdLQsHBLXISMi4yKfsfFxNIQJ4xPSExKppWnJCU1LT0jk/HEJCs7R67IVQLkqZLzCyILLXBF6uKSUluN2SsLLaexohIgs4rQUapraukuUsd4YlIPDY3Q1AAgay4DUJAgFqdtod/SSpz5Ridqw9Sey9Gr6gBQyrDtDGc8xOnjoUsNIOrGVUkPi+vtMxgM/aoBvhkcwjhsHNGNjiFufOLjUD+9L1w/mcSVjCkWZyK8prGulc5g8p7Fab6ms/CY6ebM02WxuPmFSlQ91ovqJUyaZRq6EFe9sgqwtrLOeAxuw3x2Yha3qceTceFr5Rafto07Cq2Q7ALs7R8cHhXLDYzH4I6lGsWJCV8APmOTQOBFb3ZfXjWjPT2j5rnxgsddXl2rbrL1OnxFN6LbuyLWY3Bw/yCVbNL5+Z+M6pGWTxs13HMCYq5e4DfV+/qruL+gN5eDZUUaIEMDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492261546;4.rect,1.1,3.460,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.450,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492262017;4.rect,1.1,3.470,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.460,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAARVBMVEUAAACkpKSxsbFPT0/W1tb19fXFxcUxMTHp6enGxsZRUVFUVFTU1NTf398HBwcNDQ1FRUX///89PT3Q0NAiIiJSUlIgICAsta3pAAAAM0lEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLx8YCY/A4OAoBCIKQwkRARFYUwxQW4SmcQDANeaAmKUdPEqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492262085;4.rect,1.1,3.480,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.470,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492262154;4.rect,1.1,3.650,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.480,3.646;4.blob,1.1,1900.iVBORw0KGgoAAAANSUhEUgAAAKgAAAATCAMAAAAzmLYwAAACT1BMVEUAAACgoKDQ0NBoaGj////o6OisrKzIyMgYGBg8PDykpKSIiIiYmJjc3Nw0NDRAQEB1dXX29vaxsbEaGhpbW1vMzMz09PTl5eWZmZkTExPk5OQ3NzfBwcH39/fp6emTk5MMDAxsbGz5+fkrKyu3t7f19fX7+/tLS0tERETS0tJgYGAoKCi0tLTz8/Px8fGioqKDg4PJycnr6+vj4+NBQUEeHh6qqqru7u6enp4QEBC6urpfX1/t7e3FxcVVVVX9/f2AgIBDQ0NcXFzY2Ni4uLg1NTW/v7/V1dUnJydISEhiYmK1tbV6enpUVFQiIiL4+PjAwMBJSUnm5ubKyspOTk5ZWVnX19fR0dEHBweNjY1aWlr8/PxHR0fCwsIVFRVjY2NRUVE5OTldXV3a2toEBAReXl4CAgIICAgFBQWVlZXs7OwKCgpNTU2Ghobw8PAPDw9PT08cHBzh4eGBgYF+fn6Li4vy8vJCQkIyMjL+/v5qampQUFAgICCEhISMjIwJCQlMTEywsLClpaU4ODgfHx/g4OB8fHzW1taurq6CgoJKSkqmpqZzc3MjIyPi4uKQkJCWlpaHh4eUlJQGBgZra2vNzc3e3t6rq6vb29utra3v7+8ODg4dHR2Xl5cbGxsqKiqhoaFpaWnDw8N5eXl/f38UFBQpKSkhISG9vb3q6urHx8dWVlZFRUX6+votLS1SUlLOzs5XV1e8vLwZGRkBAQF9fX22trY6OjrExMTT09N2dnbn5+ebm5skJCQXFxc9PT1ubm5vb2/Pz8/d3d2FhYWfbkYsAAAC+0lEQVRIie2U91MTQRSAl7ABDgUNKiUaSgjmAkQlAlGJQmgKggFUakBFERUIgiIGS0AEOxZsgKioqNgLYu/+Ye7eDbfvgIzOiMM48n7YvLzb+953u3uH0HRMB/JQTLWBJ8ZY+etpE4t6eU+2jvvw4Tjff0KUxAy3ojP9yOCPZ1HR2UpVwBxanDsvMCg4hCRqLAStzV+gCQ0Lp1mENlIXtVAvw/AGrSEac5DHKCgm1rhosQ8k83iJMS7atDReRmaiCYlG87LlbkTxCn2SZSX5uyo5xZqalk6yDC5zNceR/miNKj0r27xWEMVBOXyuD6Sss+XlRxfIRRklxLR+w8bComJQ43FJaZnC7l0uI0uiFWpD7ialzo1oASFtxltIW3+EiiuxsBijW5+4dRtCdhwviFaJte3VNHaQbOeuGoRq5aKMUueoJz54N6jxuAE17kF7G2VkSbRpH1mHZrwf9IBbT7JiZwsZD3gbyYYfhKKBh+hoOiyIusRaq3Au2kgWd4QM7WO2XqKUJ9LZR8NBjYp2pKBOtYwsiR47TuxcqhbQY4wocpxA6KTzlD7jtEzUhSPoT5GHIFotitb70zhDsq6z40UZxe/c6P5JNSYKyZKoRXw3zoMeFxplot3OiwjFXqLPLl/RKPG5S6AoizjfUVHGYxRxRWlINbCigCyJXr4i+DWAFjm2GnorFVV3k9OO2xHSZZILnaJo8FVxXo94kviJRcNMLrpLHOQxSl1vH0LXemtBDYgCsiTa30HPyXXY4kbZTX5AKYg60/OrzLdIbcB5296UjCPp9Up8Jz51EKG7Gp09yULf4YlE72nuZyWpqSjjMcrg0IPWhwZFNagBUUamH3wLx8WQt35IUfmo6fET2ONpmu3Zc0H0RU6oKuAlKQ2/6lKNlHYIX8rhEou2kN7w+o3G1N/nRhRZ32oN7+huMB6gJIwEvv9QAclAlJE9xZPpRdKPPQ5jnnVcmz8PoY/z018gT258Vn5p/moOnmqN34jsb7bvP8afiP8vfgLA89TtRVcDeAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492262259;4.rect,1.1,3.660,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.650,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492262756;4.rect,1.1,3.670,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.660,3.646;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492262856;4.rect,1.1,3.680,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.670,3.646;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492262927;4.rect,1.1,3.720,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.680,3.646;4.blob,1.1,844.iVBORw0KGgoAAAANSUhEUgAAACYAAAATCAMAAADLVI+CAAABRFBMVEUAAAB3d3fU1NQyMjL9/f0bGxsSEhL4+PhtbW3c3NyampoeHh6qqqrz8/Pu7u6enp4QEBBsbGz5+fkrKyu3t7f19fX7+/tLS0uQkJC8vLynp6fIyMg2Njb///84ODgVFRXk5OTS0tJUVFRjY2Po6Ojl5eV6enpEREQYGBgEBATp6eleXl4kJCSPj4/V1dWLi4vy8vJCQkL09PQLCwsBAQHf399/f38CAgJ0dHTW1taurq4ICAgJCQn29vZqamqpqamjo6N+fn7a2tpBQUH6+voWFhbt7e2Hh4cPDw/39/dFRUWvr6/e3t6rq6s0NDQcHBxkZGS4uLiWlpZNTU2Xl5fg4OAMDAzCwsKKiopVVVXn5+fq6urQ0NBdXV0tLS0hISH+/v4sLCwGBgbr6+uJiYmtra3w8PDAwMBDQ0N9fX3Ozs5wcHAzVj+wAAAA8ElEQVQokWNgGKyAkYkoZUyMxKhiZmFlYGPnADE5uYAENw8vH78AiCsoJCwiKiYOUSYhCSSkpIGEjKwcA4O8gqKSsooIWJmsqpq6kgZYlaaWNpBUl9VhYNDVA7L0DYDihrLMYGXacDvFjYyBpImpGYO5qgWQZWllbW1tY2sHVmYDV2bvAKYcnRicXVyBDDdZMHAHK7OGqfLw9ALT3CwyXN4gho+vHwj4oyoLUDCHMAKD3IJBdEhoGJBkZUBVFh4BZUSyR2mCaPnomFgvfZc4FGXxCYlQVlJyCoShk5rGm56BalpmFu5wRwKW2UQpowUAAD/gH0P/RPbmAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492263126;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.720,2.19,2.14,1.1,1.0,3.627;4.copy,1.1,3.730,3.646,3.230,2.19,2.14,1.1,3.730,3.627;4.rect,1.1,3.720,3.633,2.10,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.649,3.207,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.210,3.646;4.blob,1.1,2636.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;3.end,1.1;4.move,1.4,1.3,1.2,2.39,1.0;4.size,1.4,2.12,3.641;4.rect,1.4,1.0,1.0,2.12,3.641;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492263456;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,188.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAIVBMVEUAAABoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwuQ5JRAAAAJklEQVQImWNgwACMSspAkiU0GcwrJolkCc0InQA0QUlpAabBEAAAgcEHSHIQjjIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492263694;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492263779;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.520,2.19,2.14,1.1,1.0,3.627;4.copy,1.1,3.530,3.646,3.430,2.19,2.14,1.1,3.530,3.627;4.rect,1.1,3.520,3.633,2.10,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.646,3.509,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.4,1.3,1.2,2.56,1.0;4.size,1.4,2.12,3.624;4.rect,1.4,1.0,1.0,2.12,3.624;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492263985;4.copy,1.1,1.0,2.95,3.960,3.551,2.14,1.1,1.0,1.0;4.copy,1.1,3.900,3.646,2.60,2.19,2.14,1.1,3.900,3.551;4.rect,1.1,3.280,3.554,2.19,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.554,2.18,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.614,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.557,2.18,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.611,2.18,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.573,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.573,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.30,3.592,2.69,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.592,2.18,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.611,2.48,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.611,2.67,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.614,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.630,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.631,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,10.image/webp,1.0,3.545;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,3556.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;3.end,1.1;4.move,1.4,1.3,1.2,3.129,1.0;4.size,1.4,2.12,3.551;4.rect,1.4,1.0,1.0,2.12,3.551;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492264090;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492264753;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,336.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAAA4ODj///9CQkLR0dH5+fnT09N1dXUiIiL4+PjAwMBJSUlgYGDs7OyVlZXr6+sKCgpRUVHJycmhoaHi4uKMjIygoKCSkpLp6ekJCQlKSkofHx/29va9vb1ISEhcXFxBQUH6+vrU1NRiYmJO0CRKAAAAS0lEQVQImWNgIA4wMjHiZjKzsLKxg5kcnFzcPLxgJh+/AAODIJgpJAxXKyIKZwqJwZniEpIMDFJgprSMrJy8CMRcBTZFJWWEbUQBAOcFAsqG8+H3AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492264824;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492264909;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.530,3.646;4.blob,1.1,160.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAG1BMVEUAAAAODg4LCwvs7Ozv7+8QEBAHBwfX19fb29sGouOmAAAAGElEQVQImWNgoBoQBBFMJgFAkq1CAacyACSRATYweAsBAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492264979;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.646;4.blob,1.1,160.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAG1BMVEUAAAAODg4LCwvs7Ozv7+8QEBAHBwfX19fb29sGouOmAAAAGElEQVQImWNgoBoQBBFMJgFAkq1CAacyACSRATYweAsBAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492265097;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.646;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAARElEQVQImWNgIA4wMsGZTIwwFjMLK4zJxg5jcXBywZjcPLwwJh8/jCUgKARjCouIwphi4jCWhKQUjCktA7dUVo5IhwIAlTAB1VUFrVQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492265217;4.rect,1.1,3.570,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.560,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492265396;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.570,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAARVBMVEUAAACkpKSxsbFPT0/W1tb19fXFxcUxMTHp6enGxsZRUVFUVFTU1NTf398HBwcNDQ1FRUX///89PT3Q0NAiIiJSUlIgICAsta3pAAAAM0lEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLx8YCY/A4OAoBCIKQwkRARFYUwxQW4SmcQDANeaAmKUdPEqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492265470;4.rect,1.1,3.590,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.580,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492265561;4.rect,1.1,3.760,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.590,3.646;4.blob,1.1,1900.iVBORw0KGgoAAAANSUhEUgAAAKgAAAATCAMAAAAzmLYwAAACT1BMVEUAAACgoKDQ0NBoaGj////o6OisrKzIyMgYGBg8PDykpKSIiIiYmJjc3Nw0NDRAQEB1dXX29vaxsbEaGhpbW1vMzMz09PTl5eWZmZkTExPk5OQ3NzfBwcH39/fp6emTk5MMDAxsbGz5+fkrKyu3t7f19fX7+/tLS0tERETS0tJgYGAoKCi0tLTz8/Px8fGioqKDg4PJycnr6+vj4+NBQUEeHh6qqqru7u6enp4QEBC6urpfX1/t7e3FxcVVVVX9/f2AgIBDQ0NcXFzY2Ni4uLg1NTW/v7/V1dUnJydISEhiYmK1tbV6enpUVFQiIiL4+PjAwMBJSUnm5ubKyspOTk5ZWVnX19fR0dEHBweNjY1aWlr8/PxHR0fCwsIVFRVjY2NRUVE5OTldXV3a2toEBAReXl4CAgIICAgFBQWVlZXs7OwKCgpNTU2Ghobw8PAPDw9PT08cHBzh4eGBgYF+fn6Li4vy8vJCQkIyMjL+/v5qampQUFAgICCEhISMjIwJCQlMTEywsLClpaU4ODgfHx/g4OB8fHzW1taurq6CgoJKSkqmpqZzc3MjIyPi4uKQkJCWlpaHh4eUlJQGBgZra2vNzc3e3t6rq6vb29utra3v7+8ODg4dHR2Xl5cbGxsqKiqhoaFpaWnDw8N5eXl/f38UFBQpKSkhISG9vb3q6urHx8dWVlZFRUX6+votLS1SUlLOzs5XV1e8vLwZGRkBAQF9fX22trY6OjrExMTT09N2dnbn5+ebm5skJCQXFxc9PT1ubm5vb2/Pz8/d3d2FhYWfbkYsAAAC+0lEQVRIie2U91MTQRSAl7ABDgUNKiUaSgjmAkQlAlGJQmgKggFUakBFERUIgiIGS0AEOxZsgKioqNgLYu/+Ye7eDbfvgIzOiMM48n7YvLzb+953u3uH0HRMB/JQTLWBJ8ZY+etpE4t6eU+2jvvw4Tjff0KUxAy3ojP9yOCPZ1HR2UpVwBxanDsvMCg4hCRqLAStzV+gCQ0Lp1mENlIXtVAvw/AGrSEac5DHKCgm1rhosQ8k83iJMS7atDReRmaiCYlG87LlbkTxCn2SZSX5uyo5xZqalk6yDC5zNceR/miNKj0r27xWEMVBOXyuD6Sss+XlRxfIRRklxLR+w8bComJQ43FJaZnC7l0uI0uiFWpD7ialzo1oASFtxltIW3+EiiuxsBijW5+4dRtCdhwviFaJte3VNHaQbOeuGoRq5aKMUueoJz54N6jxuAE17kF7G2VkSbRpH1mHZrwf9IBbT7JiZwsZD3gbyYYfhKKBh+hoOiyIusRaq3Au2kgWd4QM7WO2XqKUJ9LZR8NBjYp2pKBOtYwsiR47TuxcqhbQY4wocpxA6KTzlD7jtEzUhSPoT5GHIFotitb70zhDsq6z40UZxe/c6P5JNSYKyZKoRXw3zoMeFxplot3OiwjFXqLPLl/RKPG5S6AoizjfUVHGYxRxRWlINbCigCyJXr4i+DWAFjm2GnorFVV3k9OO2xHSZZILnaJo8FVxXo94kviJRcNMLrpLHOQxSl1vH0LXemtBDYgCsiTa30HPyXXY4kbZTX5AKYg60/OrzLdIbcB5296UjCPp9Up8Jz51EKG7Gp09yULf4YlE72nuZyWpqSjjMcrg0IPWhwZFNagBUUamH3wLx8WQt35IUfmo6fET2ONpmu3Zc0H0RU6oKuAlKQ2/6lKNlHYIX8rhEou2kN7w+o3G1N/nRhRZ32oN7+huMB6gJIwEvv9QAclAlJE9xZPpRdKPPQ5jnnVcmz8PoY/z018gT258Vn5p/moOnmqN34jsb7bvP8afiP8vfgLA89TtRVcDeAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492265691;4.rect,1.1,3.770,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.760,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492266447;4.rect,1.1,3.780,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.770,3.646;4.blob,1.1,188.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAIVBMVEUAAABoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwuQ5JRAAAAJklEQVQImWNgwACMSspAkiU0GcwrJolkCc0InQA0QUlpAabBEAAAgcEHSHIQjjIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492266518;4.rect,1.1,3.820,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.646;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAACcAAAATCAMAAAAkluS8AAAA/1BMVEUAAACLi4vT09MREREgICCsrKzIyMhoaGj////o6OgeHh6qqqrz8/Pu7u6enp4QEBCkpKSxsbFPT0/W1tb19fXFxcUxMTHk5OQYGBg8PDwVFRXS0tJUVFRjY2O3t7fp6enGxsZRUVHU1NTf398HBwc1NTW/v7/V1dWIiIjy8vJCQkIyMjINDQ1FRUU9PT2urq4ICAgJCQn29vZqamrQ0NAiIiJSUlLt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxuZmZnb29soKCjq6updXV36+votLS1/f39BQUFcXFwUFBQkJCStra3w8PDAwMBDQ0MBAQGNjY35+fnX19fyh/wFAAAA00lEQVQokWNgGEDAyEScOmYWPJKsbMQZAlPHzsHBwQlhcnHz8PLxAxkCgkLCIqJiQJY4BxgAWRKSkgIQdVLi0jKynHIgdfIKijJKyioMDKqSauqSkpIQczQg6hg1JRgYtDi0Qep0GBh0OfTQ3AdVJ6xvYGBgaGQMVGcC5JpymGFXZw5xiwVUHQuHDHZ1llbWIGBDSJ2tnT2QdGBAVefoBFEE8q+5pKQz0L8uJq66jG7uqOpcOTw8vbwh4QcErEAhH18/Hv8ANPMCg8yDQ9yJi5OBAwBIzhaGyqx1owAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492266781;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.820,2.19,2.14,1.1,1.0,3.627;4.copy,1.1,3.830,3.646,3.130,2.19,2.14,1.1,3.830,3.627;4.rect,1.1,3.820,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.649,3.308,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.411,3.649;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAADoAAAAMCAMAAAAERl6qAAABUFBMVEUAAABoaGj////o6OiLi4vT09MYGBg8PDykpKQREREgICCsrKzIyMiIiIgoKCi0tLTz8/Px8fGioqIeHh6qqqru7u6enp4QEBCxsbFPT0/W1tb19fXFxcUxMTHk5OQTExPr6+vKyspOTk5ZWVnX19fR0dEHBwcVFRXS0tJUVFRjY2O3t7fp6enGxsZRUVHU1NTf3981NTW/v7/V1dWGhobw8PAPDw8nJyfy8vJCQkIyMjINDQ1FRUU9PT3CwsIfHx8MDAyurq4ICAgJCQn29vZqamrQ0NAiIiJSUlLc3NyWlpbt7e2Hh4fe3t6rq6s0NDQcHBzv7+8ODg4dHR1NTU2Xl5fg4OAbGxuZmZnb29sUFBTq6urHx8dMTExWVlZdXV36+votLS1/f39BQUFcXFy2trb09PTn5+ebm5skJCStra3AwMBDQ0MBAQGNjY35+fnKcSWaAAABGklEQVQokWNggANGJiYmZhiHhZWBBMDGzs4B18rJhUclNw+mGC8zphgerXz8AoJCbChakZwuLCIgKiYOZHBISEpJy8gCWXJMYMDAIK+gqKSsoqqGrBXhdHU5DU0tZm2QVh1dPU19A6A6Q3YjY3Z2dgYGE1MzBgZzJkk0B0NZLBZA91gyWYG0WjMw2DDZIjnYTgRE2jtg1yrl6OTk5OziCtTqBuS6M3kgafX0whpMUJY3xF8+UK1cTJoYtuLS6uvnDwIBWLWaBAYxMAQHhmDXGhoG8kk4A6rWiEiwZFR0TGychpsTJFy92dn5kFnq0W7xNiwJiaha45mSklOigDGXmpaeoQ6NTSDgRmYxZGaZCmTnoNmam+edr5IIAJZSJXPYY/pVAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.141,1.0;4.size,1.4,2.12,3.539;4.rect,1.4,1.0,1.0,2.12,3.539;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492267516;4.sync,10.6492268516;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAmVBMVEUAAABERETS0tL5+flgYGD///88PDwiIiL4+PjAwMBJSUnm5uaVlZXs7OwKCgpNTU3JycmlpaU4ODji4uKQkJCkpKSTk5Pr6+sJCQlMTEwhISH39/e9vb1ISEhfX1/k5ORDQ0PT09N2dnYODg5oaGj+/v4XFxc9PT3o6Ohubm5CQkJvb2/u7u6ZmZliYmLPz8/d3d2FhYUICAhJ8YFkAAAAZElEQVQImWNgoAJgZGJmYmFlA7LYOTi5WLjBTB5ePgYGfjBTQBBICIGZwiJwpoAonCkmLsHAIAlmSknLyMrJg5kMCorMTEqsQiCmMhCrqKoBSXUNTS1tHV2wxXr6HAaGRihuAQA3HQWn8U4CFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492268790;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492268868;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492268937;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492269024;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492269119;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492269189;4.rect,1.1,3.570,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.560,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492269292;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.570,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492269368;4.rect,1.1,3.590,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.580,3.646;4.blob,1.1,248.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACYmJjc3Nw0NDT///9AQECUlJTh4eF6enr4+PgKCgpQUFAqKir8/PyhoaFERERpaWno6OhSUlLY2NjOzs5XV1f5VN4yAAAAMUlEQVQImWNgoBwwMgEJZhZWEpls7HAmBycXAwM3mMnDy8cvIAhmMggJc4qIQphEAwBg8AFUd2BvDgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492269449;4.rect,1.1,3.600,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.590,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492269529;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.600,2.19,2.14,1.1,1.0,3.627;4.copy,1.1,3.610,3.646,3.350,2.19,2.14,1.1,3.610,3.627;4.rect,1.1,3.600,3.630,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.646,3.589,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.4,1.3,1.2,3.153,1.0;4.size,1.4,2.12,3.527;4.rect,1.4,1.0,1.0,2.12,3.527;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492269780;4.copy,1.1,1.0,2.57,3.960,3.589,2.14,1.1,1.0,1.0;4.copy,1.1,3.260,3.646,3.700,2.19,2.14,1.1,3.260,3.589;4.rect,1.1,2.20,3.595,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.614,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.614,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.611,1.6,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.616,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.611,3.248,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.633,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.627,3.148,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.590;4.blob,1.1,2404.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.608;4.blob,1.1,6340.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;3.end,1.1;4.move,1.4,1.3,1.2,3.186,1.0;4.size,1.4,2.12,3.494;4.rect,1.4,1.0,1.0,2.12,3.494;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492269804;4.sync,10.6492270804;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,188.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAIVBMVEUAAABoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwuQ5JRAAAAJklEQVQImWNgwACMSspAkiU0GcwrJolkCc0InQA0QUlpAabBEAAAgcEHSHIQjjIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492271683;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492271755;4.copy,1.1,1.0,2.76,3.960,3.570,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.520,2.19,2.14,1.1,1.0,3.570;4.copy,1.1,3.530,3.646,3.430,2.19,2.14,1.1,3.530,3.570;4.rect,1.1,3.521,3.574,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.595,2.19,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.592,2.18,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.611,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.611,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.611,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.630,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.646,2.19,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.590;4.blob,1.1,7568.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.611;4.blob,1.1,8064.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;4.blob,1.1,716.NJOPxfZ1TCYzISEBOdna2hqCIPTaTAzfji35fSMlJaW6ujo6OprNZvN4vPT0dCWlSW0BXps501o/Kyur0tJSPp/PYrHOnTs3bVQGANDQ0IB8iyEsX748PT2dy+X29fUVFRVt2jSp/WppaeXk5PT397e1tSUmJgppBQAgEAixsbFdXV2Dg4O1tbXGxsYABwQCITIysqmpicfj5eTkbN++nclkCu3QBi9l4HA4+fn5SEgMT+5MFqHXOTKZzMOHDwMAIiIikIhaUlISg8H4+uuvOzo64P3Mli5diohFvwcJAXn7BYy8vHxvb+/WrVuntVpCQqK2trahoQHpgwIAiETinTt36uvrkemeBgYGfD4fnhMvUmc8Wi2wwAJgSrdmTEpKBeP8Bf5+kEiUkBCBicmX863IAn8NUlJS5noxBIVCEQgEX365UCfnkG+//ba5uVloveC8MP8aLLDAu8PSpTYODr9UVZ3gcJ4oKBibmUXV1iby+XjnkC7wl0ZCQkFBwYhEkjYy2gsAePEifb41WuB9R0FBwcjISFpaeu/evQCA9PSFOjknmJubu7q67tu3j0ajITuYLLDAAu8KBga7Nm+uDgkR+Pk9X7fuOLzR1wLvA5qaLrt3jwQH87y976mrvyvvPF7g3WfuYmYuLi4jIyPwi3nenfdw//0oKChob29/F1b7wfwfiL49RtoPX84AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.630;4.blob,1.1,5180.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;3.end,1.1;4.move,1.4,1.3,1.2,3.224,1.0;4.size,1.4,2.12,3.456;4.rect,1.4,1.0,1.0,2.12,3.456;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492272007;4.sync,10.6492273007;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAdVBMVEUAAAASEhL4+PhtbW3c3Nyampqnp6fIyMg2Njb///84ODhEREQkJCSPj4/V1dUBAQHf399/f38CAgLl5eV0dHR+fn7a2tpBQUH6+voWFhYeHh79/f2vr6+4uLiWlpbt7e1NTU1VVVXn5+cEBAQGBgbr6+uJiYnUmxMqAAAATklEQVQImWNgoBgwMjGDKBZWIMHGDiQ4OLmAJDcnDwMDLx9Iil9AkEFIWASsWlSMQVxCEsyUkuZglYEaIisnrwBlKjIpKUOZKqpqpLoGAPrdAv4A46ytAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492273900;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492274012;4.sync,10.6492275012;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.646;4.blob,1.1,260.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAS1BMVEUAAABERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUGNjY1aWlr8/PzQ0NBHR0fIyMjCwsIcHBzh4eGBgYF+fn7g4OCAgIB8fHzk5OQ8pdV9AAAAMUlEQVQImWNgoBgwMjGzsLKxc3CCmFzcPLx8/AIgpiCDkDCDiBCEKSrGIC5BNpMEAAA2MAN/HXsSagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492275112;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492275282;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492275884;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.646;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492276021;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492276332;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492276480;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.646;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAmVBMVEUAAABERETS0tL5+flgYGD///88PDwiIiL4+PjAwMBJSUnm5uaVlZXs7OwKCgpNTU3JycmlpaU4ODji4uKQkJCkpKSTk5Pr6+sJCQlMTEwhISH39/e9vb1ISEhfX1/k5ORDQ0PT09N2dnYODg5oaGj+/v4XFxc9PT3o6Ohubm5CQkJvb2/u7u6ZmZliYmLPz8/d3d2FhYUICAhJ8YFkAAAAZElEQVQImWNgoAJgZGJmYmFlA7LYOTi5WLjBTB5ePgYGfjBTQBBICIGZwiJwpoAonCkmLsHAIAlmSknLyMrJg5kMCorMTEqsQiCmMhCrqKoBSXUNTS1tHV2wxXr6HAaGRihuAQA3HQWn8U4CFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277024;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.646;4.blob,1.1,248.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACYmJjc3Nw0NDT///9AQECUlJTh4eF6enr4+PgKCgpQUFAqKir8/PyhoaFERERpaWno6OhSUlLY2NjOzs5XV1f5VN4yAAAAMUlEQVQImWNgoBwwMgEJZhZWEpls7HAmBycXAwM3mMnDy8cvIAhmMggJc4qIQphEAwBg8AFUd2BvDgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277110;4.rect,1.1,3.570,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.560,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492277196;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.570,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277282;4.rect,1.1,3.590,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.580,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492277355;4.rect,1.1,3.600,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.590,3.646;4.blob,1.1,260.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAS1BMVEUAAABERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUGNjY1aWlr8/PzQ0NBHR0fIyMjCwsIcHBzh4eGBgYF+fn7g4OCAgIB8fHzk5OQ8pdV9AAAAMUlEQVQImWNgoBgwMjGzsLKxc3CCmFzcPLx8/AIgpiCDkDCDiBCEKSrGIC5BNpMEAAA2MAN/HXsSagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277424;4.rect,1.1,3.610,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.600,3.646;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492277493;4.rect,1.1,3.620,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.610,3.646;4.blob,1.1,188.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAIVBMVEUAAABoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwuQ5JRAAAAJklEQVQImWNgwACMSspAkiU0GcwrJolkCc0InQA0QUlpAabBEAAAgcEHSHIQjjIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492277606;4.rect,1.1,3.630,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.620,3.646;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492277675;4.rect,1.1,3.640,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.630,3.646;4.blob,1.1,176.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAHlBMVEUAAAACAgIICAgFBQVMTEz///+wsLAPDw80NDQjIyMiD9ApAAAAH0lEQVQImWNgIBEwKikpMzCwhIaGMTCwd3R0kqqfAQCm4wMNa0s9BgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277750;4.rect,1.1,3.650,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.640,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277835;4.rect,1.1,3.660,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.650,3.646;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492277905;4.rect,1.1,3.670,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.660,3.646;4.blob,1.1,260.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAS1BMVEUAAABERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUGNjY1aWlr8/PzQ0NBHR0fIyMjCwsIcHBzh4eGBgYF+fn7g4OCAgIB8fHzk5OQ8pdV9AAAAMUlEQVQImWNgoBgwMjGzsLKxc3CCmFzcPLx8/AIgpiCDkDCDiBCEKSrGIC5BNpMEAAA2MAN/HXsSagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492277972;4.rect,1.1,3.680,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.670,3.646;4.blob,1.1,260.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAS1BMVEUAAABERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUGNjY1aWlr8/PzQ0NBHR0fIyMjCwsIcHBzh4eGBgYF+fn7g4OCAgIB8fHzk5OQ8pdV9AAAAMUlEQVQImWNgoBgwMjGzsLKxc3CCmFzcPLx8/AIgpiCDkDCDiBCEKSrGIC5BNpMEAAA2MAN/HXsSagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492278108;4.rect,1.1,3.700,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.680,3.646;4.blob,1.1,496.iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAsVBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAykpKSxsbFPT0/W1tb19fXFxcUxMTEnJyf29va4uLhISEhiYmLu7u61tbXGxsZRUVFUVFTU1NTf398HBweqqqra2toEBARHR0f///9BQUENDQ1FRUU9PT309PSEhITr6+uMjIzQ0NAiIiJSUlIJCQlsbGzR0dGgoKAgICCNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg66sJOgAAAAfklEQVQYlWNgGDDAyMTMwsoGZLBzcHJx8/ACWXz8AoJCwiIgMRZRMXEJSSkGBmkZWQYGOXkFkJgiA4OSvDIDg4oqyAA1daCYBpChKa/FoC2vAxLT1YOK6cuLMzBwQ9QZIIsZQswzQhYzZjaRMzUTYEAWYzC3YFaztEIVoyoAAMVaCwV74BotAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492278231;4.rect,1.1,3.710,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.700,3.646;4.blob,1.1,176.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAHlBMVEUAAAACAgIICAgFBQVMTEz///+wsLAPDw80NDQjIyMiD9ApAAAAH0lEQVQImWNgIBEwKikpMzCwhIaGMTCwd3R0kqqfAQCm4wMNa0s9BgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492278799;4.rect,1.1,3.720,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.710,3.646;4.blob,1.1,284.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAUVBMVEUAAAABAQHc3NyBgYEjIyMPDw+oqKj///+cnJwnJyc8PDzh4eHY2Njb29uYmJgLCwv4+Ph2dnYSEhI9PT1HR0eysrJJSUn8/Pz29vbJyclEREQ5C/XhAAAAPUlEQVQImWNgIAYwMjHD2SysGNJs7OzsHBAmJxcXNwdcgodiJi8fjMUvIAimhYRFRAVYwEwxcQlJKTS3AAB9jQIAbHisUAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492278994;4.rect,1.1,3.740,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.720,3.646;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAMAAACqTK3AAAAA2FBMVEUAAAB3d3fU1NQyMjL9/f0bGxstLS20tLTt7e3q6uqtra0mJiaQkJC8vLwUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw8EBATp6eleXl5ISEj///8qKiolJSU1NTVLS0v09PQLCwsVFRXr6+u9vb1NTU0ODg6pqamjo6MkJCShoaHv7+/6+vo5OTn39/dFRUUDAwOxsbEnJydkZGTk5OQCAgLR0dFhYWHCwsKKioovLy+wsLBKSkqvr68hISH+/v4sLCw3Nze5ubm7u7s6Ojp9fX3Ozs7W1tZwcHCvcK8MAAAAkUlEQVQYlWNgoBZgZMIQYmJEF2FmYQWSbOwcnFzcUCEeXiDBxy8gKCQsIgoWEROXAJKSUtIMDDLssmAhOXkFIKmopKyiCjNKTR1MaWhqaQvogJmiunpQOX0dA11DEMPI2ATsNlN9oB1SZiC2uQVYiaWulZy1jbwGkGlrZw/R5uDIr+XkDGK5uGJ4xs2dqGDABQBftwuoBdP8+QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492279118;4.rect,1.1,3.750,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.740,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492279673;4.rect,1.1,3.760,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.750,3.646;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492279767;4.rect,1.1,3.780,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.760,3.646;4.blob,1.1,564.iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAMAAACqTK3AAAAA2FBMVEUAAAB3d3fU1NQyMjL9/f0bGxsoKCi0tLTz8/Px8fGioqIYGBiQkJC8vLwTExPr6+vKyspOTk5ZWVnX19fR0dEHBwcEBATp6eleXl6Ghobw8PAPDw8nJyf///9PT09LS0v09PQLCwvCwsKqqqofHx8MDAypqamjo6Pc3NyWlpb39/dFRUVkZGTk5OQCAgLv7+8ODg4dHR1NTU2KiooUFBTq6urHx8dMTExWVlbS0tLQ0NAICAghISH+/v4sLCweHh62trbn5+ebm5sVFRV9fX3Ozs7W1tZwcHD9rMo5AAAAiklEQVQYlWNgoBZgZMIQYmJEF2FmYQWSbOwcnFzcUCEeXiDBxy8gKCQsIgoWEROXAJKSUtIMDDKycmAheQVFIKmkDGKrqIKF1NRBpIYmwnBpLW0GuCoI0NHVA1GS+gYMDIb6RmBpY7CMiamZuYWllTWQaWNrB1Ft76Dg6OQMYrm4YnjGzZ1QCOAFANb1Cuo2LQBTAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492279905;4.rect,1.1,3.830,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.646;4.blob,1.1,876.iVBORw0KGgoAAAANSUhEUgAAADAAAAATCAMAAADh5H4tAAABRFBMVEUAAACLi4vT09N3d3fU1NQREREgICAyMjL9/f0bGxtERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUFbW1vMzMz09PTl5eWZmZkTExNoaGjo6OikpKSxsbFPT0/W1tb19fXFxcUxMTGQkJC8vLyNjY1aWlr8/PzQ0NBHR0fIyMjCwsJVVVWAgIBDQ0NcXFzY2Ni4uLgYGBg8PDzp6enGxsZRUVFUVFTf398HBwcEBAReXl4cHBzh4eGBgYF+fn4iIiI0NDRdXV2IiIgNDQ1FRUU9PT1LS0sLCwvg4OB8fHzk5ORQUFBSUlKpqamjo6NKSkr+/v6mpqY1NTVzc3MPDw/39/e0tLTNzc1kZGQCAgK3t7e/v7+KioppaWl5eXkrKyvt7e0oKCghISEsLCwBAQF9fX3i4uL29va2trasrKzOzs5wcHDLv682AAABB0lEQVQokWNgGDqAkQmbKDMLTg2sbNhEWZhJs5adg5OBi5uHl49fQFAIyBcWERUTlwAyJLm5uaXASqRlZOXkFRShGpSUGYAaVFTV1DU0tRgYtDl0dPX0DYAShkZG0lANxiamZizmFmCOpbEVSIM1g40tg50NA4O9AwODhSO3BFjSCabBmYHBhdsVzHETdYdo8NBh8PQCCnhr8gLdwoaiQR1I2HP7gDm+fgwoGvwDAt2CgrFoYOM2A7FDQl1QNYSFg2zBrSHCKxJVQ1Q0kO+JW4NWDAOqhtiAOA1GDu54SCglGBklomhICkhG05CSmpaeoerhBokHIMhE0ZCaRVosM8hlk6iBXgAAWXYqQGyamTcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492280098;4.rect,1.1,3.900,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.830,3.646;4.blob,1.1,1356.iVBORw0KGgoAAAANSUhEUgAAAEQAAAATCAMAAAAeRlvPAAAB3VBMVEUAAACgoKDQ0NB3d3fU1NQyMjL9/f0bGxuGhoa9vb2+vr5tbW0NDQ3///82NjYeHh6qqqrz8/Pu7u6enp4QEBB1dXXo6Oj29vaxsbEaGhpbW1vMzMz09PTl5eWZmZkTExOkpKS4uLiKiorq6ur19fWtra0XFxeQkJC8vLxTU1Pp6ekEBASpqak3Nzf6+voHBwcVFRXk5OTS0tJUVFRjY2O3t7e6urpLS0tfX1/t7e3FxcVVVVWAgIBDQ0NcXFzY2NhGRkZqampeXl4gICAUFBTh4eFhYWHPz8+Li4vy8vIYGBhCQkLm5uZRUVE5OTkiIiI0NDRdXV3e3t4GBgZlZWUxMTELCwtBQUFycnKdnZ3w8PAhISGcnJzW1taurq4ICAgJCQn+/v5QUFDIyMgRERFiYmKjo6O1tbVpaWmHh4eCgoJKSkqmpqY1NTVzc3P5+fl6enoPDw/39/dFRUUlJSV5eXmYmJirq6scHBxra2u0tLTNzc1kZGQCAgLX19c7OzvOzs6Xl5fg4OAMDAw4ODi/v798fHza2towMDDCwsItLS1JSUnDw8NHR0crKyuoqKhmZma7u7ssLCxubm4kJCTAwMAZGRkBAQF9fX3i4uK2trZaWlqDg4Ps7OxwcHAzzl9DAAAB1UlEQVQ4jeWS/TuTYRTHv94mL0fmZc9iYWzSyLZsZqS8W4psq2TDPKQo70skIi8lQuUlFf7Wzj1yPfuli6v91veH+/6c5zrne5/73A/wHygq+gLJMbERMImN+XeTOFU8LiUAiUlIphTgcqo6LT0jZJKpkbRXRE5Wtu5qTi5Dnj6/wGAsDCOha0XAdROKDSW4UWqGxXqzzKaxCxMqd1Q4K5mqVLeqb9/Ri1LS1tRKCWHEKjbVAfXUkNJoRVMz4LrbAtyjODa5bwZaqQ140A6Y3cSt5Hm8wEN6pCSWQ/eYV2fHk06f39UFdPcEAoFeqfZ0JmaZCX39aiKq59Jsjp7SgJJYJc/EWp7UM2B3Px9kOwpp6M9gfS+Al/KwY2T0zARj40oCJiaDYhvKMb2aeu3huXqm24VmTk288htg9q3oRtGJTUnAnHVebGXvNFhYHAsA75eWOY4Xg7XyratoBbCvcvghZPKR0220piTgU37oUn6ahtcgjrYURLuDrtJ1NpH1G3Vpn/nboDy16VLRlniT7eAX3VcoCX7528kjOXeA1U5Bu0afeq9adFI0bpK0+0zfD35IP38tObi0+fBIMlqgJBwsnv+vFDoZZzih+zgCJhdVREz+ot+61F4NjkdZnwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492280241;4.sync,10.6492281241;4.rect,1.1,3.910,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.900,3.646;4.blob,1.1,260.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAS1BMVEUAAABERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUGNjY1aWlr8/PzQ0NBHR0fIyMjCwsIcHBzh4eGBgYF+fn7g4OCAgIB8fHzk5OQ8pdV9AAAAMUlEQVQImWNgoBgwMjGzsLKxc3CCmFzcPLx8/AIgpiCDkDCDiBCEKSrGIC5BNpMEAAA2MAN/HXsSagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492282035;4.rect,1.1,3.920,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.910,3.646;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492282153;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.920,2.19,2.14,1.1,1.0,3.627;4.rect,1.1,2.20,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.31,3.646,3.899,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.921,3.630;4.blob,1.1,772.iVBORw0KGgoAAAANSUhEUgAAACYAAAAMCAMAAAA51D/MAAABI1BMVEUAAAA4ODj///9oaGjo6OgYGBg8PDykpKSIiIhCQkLR0dH5+fnT09N1dXWYmJjc3Nw0NDRAQEAeHh6qqqrz8/Pu7u6enp4QEBAiIiL4+PjAwMBJSUlgYGDs7OwVFRXk5OTS0tJUVFRjY2O3t7eVlZXr6+sKCgpRUVGLi4vy8vIyMjLJycmhoaHW1taurq4ICAgJCQn29vZqamri4uKMjIzt7e2Hh4egoKCUlJTh4eHe3t6rq6scHBySkpLp6elKSkp6enpQUFCXl5fg4OAMDAwbGxsfHx+9vb1ISEhcXFwqKir8/PxERERpaWkoKCjq6urQ0NBdXV1FRUX6+votLS1BQUHU1NRiYmJSUlLY2NjOzs5XV1esrKwkJCStra3w8PBDQ0O1/hpPAAAA20lEQVQYlWNgAAFGJkYGJMDMxMTEwoAJ0JSxsrGxE6EMCDjQlXFycfPwgpTx8QN5AkyCKMqEhEVExcQZGCQkpaRlZHEpk5NXUFRiUWZgUFFVY2BQx6VMQ5MVaB+TFoO2Dsxt2JTp6unr6xsYGjEYm+BTZsoEBmYM2uYwZRaWmMqsrAVAwIbB1s6AgcEepMxBEuhKR1RlTs4uQNKVgcHN0N3D0xikzMtbx8eXBaQMFLymbGx+QJ/6BwQGaQSHMDCE8gSHhYODNyJSMioapIwZ4qIYoFhsXLyIVAIDAIDSF26/N+1XAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.646;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAA2FBMVEUAAAB3d3fU1NQyMjL9/f0bGxstLS20tLTt7e3q6uqtra0mJiaQkJC8vLwUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw8EBATp6eleXl5ISEj///8qKiolJSU1NTVLS0v09PQLCwsVFRXr6+u9vb1NTU0ODg6pqamjo6MkJCShoaHv7+/6+vo5OTn39/dFRUUDAwOxsbEnJydkZGTk5OQCAgLR0dFhYWHCwsKKioovLy+wsLBKSkqvr68hISH+/v4sLCw3Nze5ubm7u7s6Ojp9fX3Ozs7W1tZwcHCvcK8MAAAAkUlEQVQYlWNgoBJgZMIQYmJEF2FmYQWSbOwcnFzcUCEeXiDBxy8gKCQsIgoWEROXAJKSUtIMDDLssmAhOXkFIKmopKyiCjNKTR1MaWhqaQvogJmiunpQOX0dA11DEMPI2ATsNlN9oB1SZiC2uQVYiaWulZy1jbwGkGlrZw/R5uDIr+XkDGK5uGJ4xs2dqGCAAACN1wuouY63JAAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.233,1.0;4.size,1.4,2.12,3.447;4.rect,1.4,1.0,1.0,2.12,3.447;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492282254;4.rect,1.1,2.30,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.20,3.646;4.blob,1.1,488.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAulBMVEUAAAAwMDCxsbHs7Ozx8fGpqakiIiItLS3z8/O6urpOTk5XV1fMzMzq6uocHByhoaHp6ekGBgYTExPy8vKcnJzf399dXV1eXl7///+Pj48NDQ18fHz6+vr09PSjo6M4ODgkJCSLi4vl5eWbm5sDAwMEBAR3d3dzc3MFBQWEhIQ/Pz/Ly8vDw8Pd3d0CAgIBAQHY2Ni7u7tERET7+/uysrJPT09MTEyvr69CQkI3Nze1tbXr6+vv7+89PT04UAVlAAAAb0lEQVQImWNgIAwYmZhZWNlALHYOTi5uHl4+IJNfQJCBQUhYBMhkEgXJiYkDCXEJSSmYNmkZWTl5KFtBUUlCWQXKUVWTUGdg0NDUAnG0dYCEro4eA4O+gSGQaWRsYmpmLmMBkrO0srbhtCXChUgAAMI7B/4cJYIeAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492283153;4.rect,1.1,2.40,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAsLCy2trbv7++goKAUFBQgICDs7Oy7u7tPT09dXV3b29vV1dUHBweenp4jIyP7+/tnZ2cCAgLu7u5/f3+bm5t6enoZGRn///9WVlYnJydMTEyMjIxwcHDa2toeHh75+flkZGQhISHt7e26urpOTk5XV1fU1NTS0tIGBga1tbXw8PATExMwL5ciAAAAXklEQVQImWNgIAwYmZiZWVhBLDZ2Dk4ubh5eIJOPG0jyCwgyMAgJi4DkRMUYGMQlJGGapCSksTCRFAgxg7XJyAIJFjmgYfIKikCmkrKKqpq6hibYYi1mbRYdIlyIBADPsQTpSQwO1AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492283284;4.rect,1.1,2.30,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.40,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492283663;4.rect,1.1,2.40,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492283766;4.sync,10.6492283915;4.sync,10.6492284246;4.rect,1.1,2.30,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.40,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492284857;4.rect,1.1,2.40,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,3.646;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492285096;4.rect,1.1,2.50,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492285344;4.rect,1.1,2.60,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492285495;4.rect,1.1,3.220,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.60,3.646;4.blob,1.1,1924.iVBORw0KGgoAAAANSUhEUgAAAJUAAAATCAMAAACulb+4AAACRlBMVEUAAACLi4vT09OUlJT////+/v7i4uKdnZ0cHBw4ODgBAQHc3NyBgYEREREgICDk5OQ8PDw9PT1fX1/a2toNDQ0jIyMPDw9xcXFoaGjo6Og3NzfBwcH39/fp6emTk5MMDAykpKSxsbFPT0/W1tb19fXFxcUxMTEeHh6qqqrz8/Pu7u6enp4QEBAoKCi0tLTx8fGioqIYGBhsbGz5+fkrKyu3t7f7+/tLS0tCQkLR0dF1dXVERETS0tJgYGCoqKicnJwtLS3t7e3q6uqtra0mJiYnJyf29va4uLhISEhiYmK1tbXGxsZRUVFUVFTU1NTf398HBwf6+vp6enoVFRVjY2MTExPr6+vKyspOTk5ZWVnX19fl5eUiIiL4+PjAwMBJSUns7Ozm5ubh4eEUFBS6urpMTExVVVXQ0NCIiIgEBARHR0dBQUFFRUXd3d0ICAjy8vIyMjKGhobw8PBeXl6VlZUKCgpNTU3Y2NgqKiolJSU1NTX09PSEhISMjIxSUlLb29s2Njaurq4JCQlqamrCwsIfHx/JycmhoaGlpaW9vb0ODg6goKDj4+M0NDSHh4eWlpaQkJAkJCTv7+85OTmNjY0/Pz/e3t6rq6sDAwPOzs6Xl5fg4OAbGxsdHR2SkpJKSkp3d3dhYWEpKSlXV1cvLy9dXV3Hx8dWVlZcXFwhISELCwuwsLCvr6+srKw6OjrExMSnp6dDQ0O2trbn5+ebm5t2dnaYmJi5ubm7u7sXFxdubm5vb2+ZmZkSEhKysrLPz8+FhYX8/PxnFT0jAAADGElEQVRIie2Uh1MTQRTGH7BEMEoSEAQMHaVIEQJCTFACJgQhSECjIoGoYJASBRELIooSBEQlWBALFmyoKCr2+p+5e5vj7sIkDswoM45vJrndt/d997t9bw/gf/wD4eXtdskHIV/REr/5Ovoj/985C2KpeNmc3PIA91QSqSwwSLxigVQenIURHDIfex8xkfiuXCDVgiMUIRRGh+Gr5BGRUXgQHRMbF796DUsFEh/8l5CYlLw2hUxT05LS12UIFJCpyMqOX5+DR7lKhfcGQsU5c36gUivUeUgqQNiIb9zEjPLTNAWFm/EgQyqNplqtrkhfnLyFuESUlBrKtpY7qUKMFQCVErVhW1g2nm437di5q0pZzldAJtpdoTJg1GpzTW2ehVBxzpwfs7rHhUorle5lqPZZ6ur3W0W0mg1Umxh0AKARNREX3EjNSIapWmy2rLp03O5eB/Ejc9EhgNY2LNOiWL4CUx2mj2g3HQEodVawgaVi/doteLXDhQrHUYZKj44BHE87wdd2niT/pi7sYsWDanSKOYMIdZ/G07gzNputR3cW4Fwiua83iq/AVD3U394HXF+xVLN+9vPMqhuqSlN/xwCbotoelEkuykGnSwAyYKoLQ0M1JSSvQUxcBBBfcup4Ckxlo0lRlxsqxk902RMVDPc5jHUjfCqIp29+RUAlJlt/FU+vXR8i4cfulVDBUdkHPVHZoz1SAYyOxMi1fG0h7RKVKxXcID0+dpOctVv41+rAu3zb0cFXcFR3InApx91RRZrwar2TamC2Wk6qu8pR3PLoHj0pGqk0FeC+PLsxUFMEc6geoAlc8wLrw2YvYz6WFTyqf6y22vgKjqpX169/ImLPIHXm/J7K+/WBEko1aXGkCKkm5M9yxp93DtOvCo4XODn1Um4aG5hLNSp+RWpe2JZUM03ECa8737ytBL6Co4Imb2NZMfu9os6cH0x7K9QzdCfLq7onWarud8wl/L3F8WHKtbx/PsgrhPp+dMlOmmf+PgoXsrBPuZ+TvwhyX2WN38zBiwREo/i7ueWHTZCq/amzqxYJZz7xC6RbvgHTRT10AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492285641;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.220,2.19,2.14,1.1,1.0,3.627;4.copy,1.1,3.230,3.646,3.730,2.19,2.14,1.1,3.230,3.627;4.rect,1.1,3.220,3.633,2.10,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.12,3.649,3.197,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.4,1.3,1.2,3.241,1.0;4.size,1.4,2.12,3.439;4.rect,1.4,1.0,1.0,2.12,3.439;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492286374;4.rect,1.1,1.0,1.3,3.959,3.642;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.646;4.blob,1.1,4532.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;3.end,1.1;4.sync,10.6492286412;4.rect,1.1,3.670,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.0;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6852.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.402;4.blob,1.1,8064.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;4.blob,1.1,1500.P8g/aj1A3JutDum1DHKmfB1ta/e3Us+ZZT1ivnhPQBCCqnGwfpzkxbgAnQZGZpSi5Mr0WU89YIU9U8IR+JKkeiCo9gf5R70HiHuz1SEF5EzZOo6W/TnhnGHW57tszbumJ7bnGeZMG4hszbumJ7bnGeZMG4xszbumJ9rzTHOmVlZWVlZWVuayr8JWTU2WYWzAUhiHONVlSsrlvlpdViIwEmMYUaSBc6GRJnx7I6TWUjS8XerEh0EPg2xCo2SVPlF2I051mZJyua9Wl14E6dScYwwjijRwLs2szzBvF7LyrGR9smwKGSX9rNcQhCG7YUTK5b5aXe6yPtWqhWlmfYYVZdaLJNkUMkr6WZ9IEB5/UIi/Py6edHYynk15JdLwZ3lUrY5HQJQdoPvYKHJeRvz54pXuZMygHWMYUaTMSRkL9ArQlqiunjFvR+4i76VDbEXaWPQVGVkPvx3PK870+dlE49Fu0Sj6WFIUIAj/r7VoNfoUsbSoivFsyiuRhj/Lo2p1LAKi7BDdR6PQvIyTlKJKdxQzakcMI4qUzlEsyCtEW6K6eqZukLvIe3KIVqSPRV+RkXrIdjyvONN3eyKHSLHQKPpYUhUgCG9yxuy8vlhc8lkCoachA7nyplodi4AoO0T30Sicsgu+zlOlO74idD/A/gJ8IFI6R7EgrxBtGVJXz8gNxk4C7zkT6a9IH4u+IiP1kO14XgE3aDyKhUZJRqGmKEAQ1qz+x4cjLhjyVgKhpyEDufKmWh2PXlJ2iO6jUThlF8xmqnTHV2SY9ZxiC5CGyCtEW4bU1TNyg/GFwHvORPor0seir8hIPahdQl4luMHGk7HQKMko1FQVJAi3P/7eM4v3Pns44Zu8GjKQK2+q1bEIGPEH6D45ikLZgWyWle74ilLIev/brgHSEHmFaMuQunpGbjB2EnjPmUh/RdpYklRklD1Yu4S8Ut1g7SgWmjcZhZqiAEF48vzWN8y5c+POZFkPq9DlT7U6FoFC/AXoPhqFU3Ygm2WlO76iNLJexoK8QrRlSF09IzcYOwm85w75K9LHoq/ISD2oXUJeJbhB7SgWGiUZhZqiAEE4tetI8bt+MyuSZT2u7ZY31epYBETZIbqPRuGUHeMLpfxKd3xFqJ1Z1lMsyCtEW4bU1TNyg7GTwHvORPor0seir8hIPahdQl4luEHtKBYaJSSWQJXG+usC5xNxdLQXGO2GngzkyptqdSwCouwQ3UejcLpPcpJMfqU7viLUzs96FCkiDZFXiLZEdfVM3WDsJPCe1/PzV6SPRV+RkXpQu4S8SnCD2lEsNAqOJVilMQ3VfCHExA8F340kZCBT3lSrYxEwyg7QfWwURvdJ4o9JVrpjK0Lt/KxHkSLSEHoFaEtUV8+4+iK5C7zn9fzkivTkp7YiI+tB7dS8SnRDtmOx0CgwlmCVxiamSKjCBlPpzjKWTUJRUIUNp9KdZSybiCKgChtQpTvLWAL9P+ay6wA45nTuAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.518;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,3676.wQM7Ozt/f3/8y5vMGpFvoRT3hENu+3KuGyT1dXNzKygoIErGb5gbE/L0IEXz5893cXHZv3+/5IehoaEBAQFr1qwZMsuhQ4cmT568c+dOAwOD+fPn//LLLwihUV/dMQqLFi368ssvV69eLXXdHUJo7ty5fn5+Bw8e3LFjBzHAlZlKXqPOzk4LC4tly5YVFRUdPXp00aJFZmZmS5cuVWQVAfirkbn3HnLMoIwQOnr0aF1d3dq1a//rv/5L6kIuOp3OYDCkTmk0NTXJ/xCZkZYsFouRxAVYV65ccX/ZZ599RnHRLBZr1qxZDQ0NGRkZ+A+IUqfMEUK6uroLFy7Eh2UjzYsQGvIchrm5OZvNlvykvr5eas8+3HLJBQcHnzhxora2dsmSJR4eHp9//vmIskuSamfyqEpKSlxcXLy9va9du1ZcXOzt7S05PjYxMYmIiCC+wPT29tLpdCsrqyGXKxAIJE/sjahGnZ2dQqFwuIu5h0wdRTvLXGPNzMzGcHQiibwl5VmfcTU1NevWrbOxsfnyyy9TUlKIJ0zJs1yKW8pgcu4ZEEINDQ34PuHSpUv49RJEEnmNSLZQ6lENue2P4bohVV/FrXWj7kHq1q5de/HixYcPHxKf0On0vXv37t69u6mpSUNDAz+jo6amRpzaKSoq+uyzzz799NP29vbs7OwTJ04ghGpra8c2sOG4ubn99ttvu3btkrwignDv3r3z58+vWrXq7NmzmzZtopg6ohrdv3+/qakJP6mPX/wNzwsDgNxIjynEmEEZIXTq1CknJ6fk5GQPD4+ysrLr168TN+rihxCpsYW5uXl7e7ucEctZMofDufMy/LQKRTU1NYmJiUwm8+233+bz+RcuXHB0dJScISoqqr29fcjrVmXmHQ6V7xUkyyWxevXqe/fuLVu27MyZM7dv3x5RU1AxXFT4+HjOnDlXrly5fPnynDlzpk6dSoyPORzOsWPHpL7GSJ0rIqipqeno6OAXNI+0Rvr6+mpqakReKqmjaGeZa2xzczNJ/4pEouEuAZJJZkuObn1WVVXdvn3722+/TUS4a9euO3fuECe35Fzu6LYU+fc5AoEA3yd8++23s2bNIioos0YkW6icUZGvG/JQXMlIjn0dFZMnTw4ODt63b5/khzExMba2tps3b8a/wFy6dAkhdOnSJckvOf/4xz9MTExcXV2NjY0rKipaWlrq6urGKioSNjY2p0+fPnHiBHE5O87U1DQpKUmyF8rLy21sbKik4khq9MYbb0RFRUlFgl+M0dra2tXVNXXqVMmk77//fvATlAH4Oxvp3psYM/znJIRYLMYPG35+fjwe78CBA8Ss+fn50dHRktdtMJlMyZtaRk1xJZNbv359WVkZft9DcXFxcnKyhobG7NmzJedJSEg4cuQIfqpmpHmHc/XqVX9/f+JOFCsrq87OTuI+DPLlkqPRaPi5BJyLi8uIsss0XFQlJSXz5s3DMKy6uvry5cseHh4WFhbl5eV4akFBgbu7e2VlJfEdprm5mfilGyHEZDKJ00Lh4eFKSkrE2FpmjXR0dIhTaIsXL8aDoZhKUiNy5GvszZs3g4KC6HQ6PmlgYCCZt6mpycTEhDjZM6JnDJO35KjX5/7+/qVLl27fvp1oKyUlJW1tbeJWenmWK8+WMlZ7hrNnz967d+/LL78kPiGvEfkWKk9U5OuGPG7duhUQEECUPNxYWUdHR+oeOJnk6UEqPvroo6ampuzsbMkPc3NzZ0lISUlBCKWkpMTHx0vO1tHR8eDBAzqd/sUXX+CvzxirqIajq6t75syZ+/fvr1ixQmpxWlpav/zyi+Se3NXVlRjgkqcShquRvb390aNHra2t8UlHR0czMzP8FT9isTg7Ozs2Npa4i8Pa2vrDDz8cz6tNAHgtyNx7yxwz/B9XV1fi76lTp/L5/Ly8vICAAPw5A8STBCTvZ3r69Cn+LJ6NGzfixxvyVPKSEUKZmZmSz8fF7waLjIwcabsMvu9k+vTpfD7/1KlTISEhwcHBJ0+e7OnpmTx5MjGDnZ2dWCwecpQpMy9+j86Qr2xhMpltbW3FxcWhoaHR0dHl5eWlpaWScw63XJktuWrVKrFYvGHDhoCAgLS0tIGBAQzDpk2bhqdK3h3f3t6O/+3k5ISnymxnktaws7PDMAy/4FJNTY3H40kWZWRk1NbWVlpaGh8f7+/vn5aWJhQKiVUrPT1dLBbn5+cHBQUlJCR0dHRcuXKFyEteI/xu099//93f3/+9997r6ek5e/YskZc8VZ52Jl9jbWxs8PteAwMD4+Linj17JnlrkbOzs0gk+vXXX/38/FatWtXS0iJ5fx55H5G3pDzrs5+fX39//59//hkeHh4aGnry5P9v73xCUgniOL6RELFg0C2IQOjYPSg8ZFFPOhX9o0vQKTpYJ6E/niK6FHiriKCDGEHyIFgPJRTUJRCFXTHBovJSsW4rabubhL7D8oZ9q/7W51qmzuckzs7O/GZ/M/t1nPnN73Q6bbFY9JcLp8L26hkZVPErJicns9ks2vIPWwT3ULhWBNj3Yd/Q00NNJpMoivKdZ2Zm5GMIVPvzSJKMx+M8z+cGWESUME7qwWg0vr29ra6uwpflDRRtNBqHh4eXlpYeHx8vLy/Rb2zi7/68X/+CWlJmc3Oz0GMqhMFg8Pl8LMtarVblOR3o18jR0RHHcfPz84ODg1tbW8oAFJqpsEXNzc0Mw9A0PT4+PjExEQ6HY7EYqrzJZOI4Dp3vEwqFaJpWZseUF2CPnaZf4f1530Pe/Xma7xRYM0D09PRcXV2Josiy7Pb2NpqH0KmPgTsT5dPH0Wh0Z2dH9WV3d7e8QJvn+bOzM9WkiMPhCAQChW4I5wXekQRBdHR0eL3eVCr19PS0t7en2gZXqFzNlmxoaHA4HLFYTBAEr9c7PT398PCA1p7nPXpRXoFOFNHOcGtwHGez2eTP5+fn+/v7ytTOzk6Px5NIJJLJ5MXFhfLEqYODA5/Pt7y8/PLyIsc/bmtrQ6mwRS6XKxgMrq2txeNxQRA8Ho+yJeFUPe1MgB5LEERfXx/DMOl0OhQKyfNMylf76OhoJBKRJCkQCMi6Delj+BnBLUno9meKoliW5Xn+9PRUFbpET7lAqqa9JY8MKn3c2Nh4e3t7eHhYpEVwD4WfPtz3Ad/Q2UP7+/sZhpHjH9vt9lxB2dTUdHNzE41Gc6OXIEoYJ/WwuLj48fFRKDA5Iq8+7u3tFUWRpumVlRU0cS4j62MVTqdTeY3T6cxkMmgmqRja29tzb5vNZqempuQLSJLc2Ni4v79PpVJ+v39kZESZHU6FLZJLd7vdLMu+v79TFKXawtHV1UVRFM/ziUQCBz/+agCNq+lXWB9/D4XOB4HfKbBmqE1IkpQkyW63/1eucDhckSVclSoX5gfWyuVy+f3+0lKJH2nRl1Jv9tYbyoF+bm4uk8lo6k4VpY2TVcrx8XEkEql0LTC1Bvar6kVTM9QUra2tZrN5aGjo5OREkiTl6VmYGkCnPsZgagaz2fz8/Gyz2SwWy8LCwuvr6+7ubpF563CcbGlpSSaT6C8vDKYsYL+qaupLM1it1s/PT0EQrq+vBwYGKl0dTJnB+hiDQczOzgaDQUmS7u7u1tfXi19ZW4fjpMFgGBsbQ4dxYDBlAftVVVNIM/wBMVJEyHPISCkAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492286597;4.rect,1.1,1.0,2.19,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.0;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAARElEQVQImWNgIA4wMsGZTIwwFjMLK4zJxg5jcXBywZjcPLwwJh8/jCUgKARjCouIwphi4jCWhKQUjCktA7dUVo5IhwIAlTAB1VUFrVQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492287141;4.rect,1.1,1.0,2.19,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,2.38,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492287690;4.rect,1.1,1.0,2.38,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,2.57,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492287759;4.rect,1.1,1.0,2.57,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,2.95,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAa0lEQVQImWNgYGBgZGJmYQABVjZ2Dk4Qg4ubhwECePn4GQTALEEhYRFRMXEgS0JSilVaRhbIkpNXYGBQVFJmYFBRBXLV1DUYGDS1gCxtdR0GBl09faCsgSEDgxGzsYmpjBnIGHMLEUsrBQYAG0wHUAjXVT8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492287840;4.rect,1.1,1.0,2.95,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.114,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492287912;4.rect,1.1,1.0,3.114,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.152,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,468.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAbElEQVQImR2M6RaBYBRFNyG6yFgZUpkLUYby/i/mfvafs886ax2g0bRabZSO3e050lcbDF0YjScwnWmdiwd+oLaQJazWIWwkglicZLuTvS6Ho9gnOZufJM0u15A/t/xu4lGUz9fb2Meq6i/8ADM5BxVJTBj7AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492287990;4.rect,1.1,1.0,3.152,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.171,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.781,3.649;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAACQAAAAPCAMAAAC7tZ1fAAAA5FBMVEUAAAADAwNPT0+2trYKCgo0NDTAwMD39/fr6+uYmJgNDQ0WFhaBgYHk5OT///8MDAweHh7y8vK1tbVNTU1gYGDl5eW0tLTe3t58fHx+fn6JiYno6OgGBgYsLCwODg4BAQFkZGTExMSsrKwdHR1oaGjZ2dmZmZnh4eHc3NxlZWX19fV4eHj09PSAgICgoKCdnZ3p6elBQUH+/v7FxcUbGxvHx8cFBQUJCQmLi4sICAhJSUkuLi4gICDz8/NLS0tfX1+3t7eMjIw1NTXCwsLt7e2bm5uQkJAEBATY2NgPDw9ubm5UVFR+WSDOAAAAuUlEQVQokYXO5xLBQBQF4KNGkFUSnYTonahBdKK8//sgMmOjxPmxu3fON7MXgMPpcuMRj5fxsX5YY7SBIEdI6DGGI1FeiMUtxGyFRDL1ROlMFuBJjkZmK0rIP1FBvh9FUqLRqzWvcuW+VpUk35ayohqLeqPZatujTrfXxx9UVgZDoGH/3WA0BibWxT/QNKYCMzK3RQstvlxxa6PZEPU7wnbH7A+i8Twq+hv6Evn0o6By1i7/kX6V6PEGVPUT9OgakGoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492288060;4.rect,1.1,1.0,3.171,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.190,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAM1BMVEUAAAADAwNPT0+2trYKCgoWFhaBgYHk5OT///8MDAxgYGDe3t58fHx+fn4ODg4BAQFkZGRj/53qAAAAKUlEQVQImWNgYGBkYmZhYGBgZWPn4OAEMri4eXjBDD5+BgEwAwiowQAAYWcBu6p1dmgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492288129;4.rect,1.1,1.0,3.190,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.209,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288144;4.rect,1.1,1.0,3.209,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.228,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288203;4.rect,1.1,1.0,3.228,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.247,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288277;4.rect,1.1,1.0,3.247,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.266,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,420.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAACZmZn///9ISEizs7O3t7c8PDwQEBDNzc2Kiorn5+dwcHACAgIDAwP9/f3Ozs7u7u7FxcUvLy8RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgotLS1jY2ONjY0uLi5VVVWOjo5QUFD+/v4eHh4nJydiYmIJCQnT09PS0tJWVlbW1tbi4uIICAgcHBzr6+v19fW1tbUdHR1v3ovhAAAAXklEQVQImTXKRxKCUAAE0SapIBIkCQaC5Oz9L+eXwl69qhlAkn8pgKodREehk86eccbccLFsx3KvQp4fhNEtTvbHXX78z/4TXummDPLiDWVRQd20adcPoximYF7WD1/BsQVyvPN55AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288294;4.rect,1.1,1.0,3.266,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.285,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,464.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAZklEQVQImWNgYGBkYmZhAAJWNnYOTiDNxc3DAAa8fPwMAiCGoJCwiKiYOAODhKQUq7SMLAODnLwCA4OikjKDiipQXk1dg0FTC8jQVtdh0NXTB0oZGDIYMRubmMqYAYXNLUQsrRQYAAJaB1AhQ7/5AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492288346;4.rect,1.1,1.0,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.304,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288419;4.rect,1.1,1.0,3.304,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.342,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,908.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABUFBMVEUAAAA4ODjGxsb39/fe3t5wcHA0NDTAwMDr6+uYmJgNDQ0DAwNPT0+2trYKCgobGxv09PS5ublOTk6JiYn///9tbW0eHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAyKiorp6ekICAifn5/o6OgGBgYsLCx8fHx+fn68vLyrq6tFRUUxMTHExMSsrKwdHR1oaGgODg4BAQFkZGTIyMikpKQkJCTZ2dmZmZnh4eGjo6Pb29tGRkZQUFDc3NxlZWX19fV4eHiAgIACAgIFBQVBQUESEhJDQ0NERESgoKCdnZ1MTEywsLBycnL7+/uTk5MiIiL+/v7FxcUPDw8jIyNpaWnn5+fHx8cJCQkTExPf39+Li4tJSUkuLi5LS0t5eXnDw8OMjIwgICDz8/NfX1+3t7c7OzvS0tJ7e3uQkJAEBAQ1NTXCwsLt7e2bm5t5WKmrAAABE0lEQVQokW2QR1/CQBTER4MIohDNUwxBUaKAXRIrFkQU7AVs2FDB3r7/zd1wcJdf5rC7b+Z/mLcAWloVTxtkedsVn7+jyQx0dgWBkNrdo1GvlPSF+/WIEZW8gcEY0RAwHDeBEV9AzLTRBKBTUvQintQY58cn2DBJU2I2PcOOWUqLnmVjjvPzC2xYJF3MlpbZChlKNS3g8CurNrBG62KQ9WMjt6nmgS2Ta1vgC6QVdwzalfi9/XgBnD8grkOBx9ExqSd0KvUplUNAjvU583KdizyKyeDFpS3y5SvWoCLv+88D1zd5Kbg12B/f0b0rb1UfMo8Jx3gi07lr9Wj1OfYCV/5VeXuvNIyP0mfj8fWt/PxaLvwfav4lVKq2DdsAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492288504;4.rect,1.1,1.0,3.342,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.361;4.blob,1.1,332.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAZlBMVEU+mZk+kpI+QEA+c3M+Sko+YmI+Xl4+UlI+hoY+Pj4+hYU+gYE+jIw+ZmY+TU0+mJg+SUk+bGw+SEg+b28+S0s+goI+kZE+jo4+Pz8+W1s+WFg+Y2M+RUU+fn4+e3s+RkY+lpY+aGiP81AGAAAATklEQVQImWNgoBgwMjGDKBZWIMHGDiQ4OLmAJDcnDwMDLx9Iil9AkIFfSBisWlCEQZRJDMwUl+BglYQaIiUtIwtlyjHJ80OZCjKKpLoGAN0SApdzQR2pAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,832.iVBORw0KGgoAAAANSUhEUgAAACcAAAAMCAMAAADWFlTyAAABOFBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk40NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgqenp7s7OxqampKSkqlpaX///9DQ0MeHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYEMDAwlJSVcXFwBAQHW1tarq6uJiYno6OgGBgYsLCze3t58fHwxMTGkpKQaGhqurq7CwsLExMSsrKwdHR1oaGgODg5kZGTm5uaLi4vZ2dmZmZnh4eGGhoYbGxvc3NxlZWX19fV4eHj09PSAgIBQUFD+/v6goKCdnZ3p6elBQUGHh4fFxcUfHx/n5+ejo6PHx8cJCQkPDw/U1NS6uroICAhJSUkuLi4EBAS8vLw8PDwUFBQgICDz8/NLS0tfX1+3t7eMjIwcHBxYWFg1NTXt7e2bm5uQkJAcDpQvAAAA8UlEQVQYlWNgYGRiZmFlYwABdg5OLm4eBlTAy8cvAKIFhYRFRMXEgSwJSSlpGVk5FFXyCsxiYopAhpKYMgODiqoakKmuocnAIC2mhaxORluHCaxOV08fSBoYAgkjYyBhImaKrM5MhcEcrA4MNC0sgaSVNdCJNmI6aA5EUmcraQck7bkZHBydnF1wqnN1UwZR9u4enl4MuNWxO3qDaSs3H6Cxjrjs9fXzVwEzfAIYGRgCUf2BUBcUHMIIEbCUDWVgCBMLx6ouIpIrLAoIohkYYmLl4uKZE8CSiWKhqOqSxCAgGchOMeRMTTMDS6a7RaCoAwADzCFWB9Y6AQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288575;4.rect,1.1,1.0,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.361;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAdVBMVEUAAAAHEhJk+PgsbW1Z3Nw+mppDp6dRyMgWNjZn//8XODgbREQPJCQ6j49W1dUAAQFa398zf38BAgJc5eUvdHQzfn5Y2toaQUFl+voJFhYMHh5m/f1Hr69KuLg9lpZg7e0fTU0iVVVd5+cCBAQCBgZf6+s3iYk2DsV5AAAATklEQVQImWNgoBgwMjGDKBZWIMHGDiQ4OLmAJDcnDwMDLx9Iil9AkEFIWASsWlSMQVxCEsyUkuZglYEaIisnrwBlKjIpKUOZKqpqpLoGAPrdAv4A46ytAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,652.iVBORw0KGgoAAAANSUhEUgAAAC4AAAAMCAMAAAAqA384AAAA51BMVEUAAAADAwNPT0+2trYKCgo0NDTAwMD39/fr6+uYmJgNDQ0WFhaBgYHk5OT///8MDAweHh7y8vK1tbVNTU1gYGDl5eW0tLTe3t58fHx+fn6JiYno6OgGBgYsLCwODg4BAQFkZGTExMSsrKwdHR1oaGjZ2dmZmZnh4eHc3NxlZWX19fV4eHj09PSAgIACAgIICAgFBQWgoKCdnZ3p6elBQUFMTEywsLD+/v7FxcUbGxsPDw8jIyPHx8cJCQmLi4tJSUkuLi6MjIwgICDz8/NLS0tfX1+3t7eQkJAEBAQ1NTXCwsLt7e2bm5vNZvoOAAAAu0lEQVQokYXP5w6CMBQF4OtARKUOhrhw4sCBG9x7+/7PY0ESARXOj7Y5/ZLeAoDPHwiCPUSIDFMRR2m4aIxGKG6/SCRTDMvxts50bFrIOHk2lwdgUMHamU4sQsnJyxW8VFHN2n3cF5fqePwGEhzD/+NNClpyu9MF6Cl6+h58MByNQecTpGfqziVVmwHIeJg5oWfhzrUlfn5l/6oLX3MKwAZtPfgOKca+P/DHE30GD35Rr+/D7U4+nuIP/gJSpBT1M6s6AwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288629;4.rect,1.1,1.0,3.380,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.399;4.blob,1.1,300.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAV1BMVEU+mZk+b28+Tk4+h4c+Pz8+kJA+ZmY+VlY+mJg+RkY+eHg+fn4+QkI+lZU+XV0+X18+lJQ+QUE+gYE+dXU+R0c+VFQ+aGg+jY0+ioo+bGw+T08+TU0+cXEKV5F2AAAAQ0lEQVQImY3OSwJAIABF0X5IIYSi9r9Oo9u4Nzqzd4Xom1SNSiJtBjhOyM4O+mWFW0D7ccJ4WXg/KJkM36+dltoZ+gOJNgGm29GPlwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,532.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAAwFBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk4DAwNPT0+2trYKCgqenp7s7OxqampKSkqlpaX///9DQ0MWFhaBgYEMDAwlJSVcXFwBAQHW1tarq6tgYGDe3t58fHwxMTGkpKQaGhqurq7CwsIODg5kZGQGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBSMjIwICAgcHBxYWFiQkJB7P/PoAAAAiklEQVQYlWNgYGRiZmFlY0AD7BycXCCam4eXj19AEEVOSJhZQEAEyBAVEGNgEJeQRJGVkpZhAsvKyskDSQVFFFklcQZlsCwYqKiqoVuMJKuuoYlbVktbDF0SIaujq4chCZfVNzAUxylrZGzCiCkJlTU1M7ewBAIrkJC1gA2qrK0ABNiBhOy1TVFkAdgRDGZMGS8tAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492288644;4.rect,1.1,1.0,3.418,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.399;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAARElEQVQImWNgIA4wMsGZTIwwFjMLK4zJxg5jcXBywZjcPLwwJh8/jCUgKARjCouIwphi4jCWhKQUjCktA7dUVo5IhwIAlTAB1VUFrVQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288700;4.rect,1.1,1.0,3.418,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.456,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,420.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAACZmZn///9ISEizs7O3t7c8PDwQEBDNzc2Kiorn5+dwcHACAgIDAwP9/f3Ozs7u7u7FxcUvLy8RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgotLS1jY2ONjY0uLi5VVVWOjo5QUFD+/v4eHh4nJydiYmIJCQnT09PS0tJWVlbW1tbi4uIICAgcHBzr6+v19fW1tbUdHR1v3ovhAAAAXklEQVQImTXKRxKCUAAE0SapIBIkCQaC5Oz9L+eXwl69qhlAkn8pgKodREehk86eccbccLFsx3KvQp4fhNEtTvbHXX78z/4TXummDPLiDWVRQd20adcPoximYF7WD1/BsQVyvPN55AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492288789;4.rect,1.1,1.0,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.475,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,464.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAZklEQVQImWNgYGBkYmZhAAJWNnYOTiDNxc3DAAa8fPwMAiCGoJCwiKiYOAODhKQUq7SMLAODnLwCA4OikjKDiipQXk1dg0FTC8jQVtdh0NXTB0oZGDIYMRubmMqYAYXNLUQsrRQYAAJaB1AhQ7/5AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492289171;4.rect,1.1,1.0,3.475,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492289723;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.532,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,468.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAbElEQVQImR2M6RaBYBRFNyG6yFgZUpkLUYby/i/mfvafs886ax2g0bRabZSO3e050lcbDF0YjScwnWmdiwd+oLaQJazWIWwkglicZLuTvS6Ho9gnOZufJM0u15A/t/xu4lGUz9fb2Meq6i/8ADM5BxVJTBj7AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492289833;4.rect,1.1,1.0,3.532,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.551,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,744.iVBORw0KGgoAAAANSUhEUgAAABMAAAAMCAMAAAC3DnawAAABI1BMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1s0NDTAwMD39/fr6+uYmJgNDQ2kpKTu7u5tbW1GRkaPj4////9PT08eHh7y8vK1tbVNTU1gYGC0tLQXFxdqamrLy8uJiYno6OgGBgYsLCwDAwMUFBQFBQXBwcG2trbExMSsrKwdHR1oaGgHBwdwcHD9/f1MTEzZ2dmZmZnh4eF8fHz09PR3d3fc3NxlZWX19fV4eHiAgIAxMTFDQ0OXl5dQUFCgoKCdnZ3p6elBQUG4uLjOzs7+/v7FxcUbGxsYGBiKiort7e3Hx8cJCQkkJCRhYWG3t7fMzMyLi4tJSUkuLi6pqamNjY0gICDz8/NLS0tfX1/k5OQLCwuHh4ff399RUVE1NTXCwsKbm5sODg6NfyUkAAAAxUlEQVQImSWN11YCYRCDg4siIm0sS+9iQ5Gl96qsBWwgoCK8/1OYH+Yi8yXnTAaw7GjW3T2ose3bDxyHBKfL7fHKEen45FT3aX4gIEHaEAnhSBTQJYZ4IkmbOqOkzykXcqlqrgLXmRvu2ywr7ySnMkMkr3bBgWKpbFQUV2v1TENlzVa7g23G6fbUbX9wD5RyePAlaIcmZfDId0/88SwvtKMx5VWzAG/yDnyYQc+n6MwmU//XbD4iLb5/jPHvpnX5ZzdXa/wDCPcXZA+M1LgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492289902;4.rect,1.1,1.0,3.551,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.570,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAM1BMVEUAAAADAwNPT0+2trYKCgoWFhaBgYHk5OT///8MDAxgYGDe3t58fHx+fn4ODg4BAQFkZGRj/53qAAAAKUlEQVQImWNgYGBkYmZhYGBgZWPn4OAEMri4eXjBDD5+BgEwAwiowQAAYWcBu6p1dmgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492289960;4.rect,1.1,1.0,3.570,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.589,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492289971;4.rect,1.1,1.0,3.589,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.608,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290055;4.rect,1.1,1.0,3.608,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.627;4.blob,1.1,492.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAt1BMVEX////X19dOTk4REREPDw9cXFzl5eXg4OAVFRVAQECurq6lpaUpKSkjIyPz8/NfX18kJCT39/cFBQWGhob7+/sNDQ2EhISTk5OmpqbZ2dkAAAC2trbJycnDw8P4+Pj6+voDAwNLS0vb29uvr6/MzMzLy8tCQkL8/PwQEBB4eHhRUVFKSkpqamoXFxft7e1PT09JSUnp6ekgICAuLi6oqKi7u7t+fn7j4+NZWVkUFBQLCws6Ojqrq6v3BZS4AAAAc0lEQVQImWNgIAwYmZhZWNlALHYOTi5uHl4+IJNfQBDIFxJmYBARFQPJiUswMEhKScM0yUjJMjDICQrKQ5kKUlKKDAxKUsoMDCqqakCmuoYmSJ2WNpDQ0dUDkvoGQMLQyNjE1AxkLgODuYWllbUNES5EAgDtoAhRVV1UNwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290112;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.630,1.9,2.12;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.11,3.628,3.627,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.649,3.668,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.649,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.611;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAt1BMVEUAAAAoKCixsbHu7u7w8PCjo6MaGhofHx/q6uq/v79RUVFaWlrW1tbc3NwMDAygoKDb29sICAj6+vp5eXkEBATy8vJ7e3tsbGxZWVkmJib///9JSUk2NjY8PDwHBwcFBQX8/Py0tLQkJCRQUFAzMzM0NDS9vb0DAwPv7++Hh4eurq61tbWVlZXo6OgSEhKwsLC2trYWFhbf39/R0dFXV1dERESBgYEcHBympqbr6+v09PTFxcVUVFSuPdqKAAAAbElEQVQImSWMVxKCQBQE24ARwUVQeAbAgIqYELP3P5dLMV891VMD1OqNptEC2p1ur28OLLCHSldnhOuNtWDiE8iUKjOZw0KpsKJIJGYpK1hvkpjtbl+O0gNkx5Om8wWu+a24P/QfPF/vz/fHH1jOCFE2r3K8AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,1216.iVBORw0KGgoAAAANSUhEUgAAAKAAAAAPCAMAAABUWzQkAAABoVBMVEUAAACZmZn///9ISEg0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgoSEhK6urry8vKpqakGBgazs7O3t7c8PDwQEBAeHh61tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAx+fn7Dw8NJSUnY2NheXl4UFBTNzc2KioqJiYno6OgsLCze3t58fHympqZtbW2Ojo6FhYW/v79TU1Pn5+dwcHACAgLExMSsrKwdHR1oaGgODg4BAQFkZGSlpaUVFRXCwsJubm5MTEzOzs79/f3u7u7FxcUvLy/Z2dnh4eEkJCTa2trU1NREREQRERFBQUFXV1fd3d3m5ubc3NxlZWX19fV4eHj09PSAgIAICAgFBQUnJye5ubktLS1jY2OgoKCdnZ3p6emwsLDj4+ONjY3+/v4bGxsPDw8jIyOioqLi4uIuLi5VVVXHx8cJCQnq6urT09OCgoIaGhpQUFBiYmKLi4shISE6OjrS0tJWVlbW1taMjIwgICDz8/NLS0tfX1+IiIhYWFgcHByQkJAEBAQ1NTXt7e2bm5s+Pj50dHRUVFSExl2SAAABqUlEQVRIicWT+TcCURzFr4cQESIkoZClZN9CkoqQUJR9yb7v+77/1WbGaXqTc/jBmXF/mJlz3/2e+znz3gMQR1jFg1ZCoiwpOQVCyVPTFBBXkd70DGVmVsTMVuUwyqVzamVefoGmUDCrLdIRUiwuH99bUqo3lKFczrkVxm/ByioGP59U015BjalEbEC+11wLSx3qGzi3sQnNMcGWVubRRtppr8OKTrEB+V5LV7etx95rZU25o7fP4XQJgu445jj0E1PMvOiAfO9AI/FoB4c4c1hj9o74RgXHfywZ4/7AxCTQHGQVkggw2hucCnVOUyszZFYQnJtf8IIN2rkrvigVIN8LKJZcsEaXNMt00B12rgB+ZotXE1itSQQY7QVM694NZYD52NziAC100LnNbOqO8JJIAUj1anfVe/sNsgPgMKwGpsJHdPBYEwT0ZFNqQKrXaITyBJ5TBnjvbOv8YiPIBi4J98LVdeHNrU4VOy86INVbnIKzu3v2D+LBnOTPa+MCj+Gnr+SzTfby2iE5oLD3zdf3HrPeahAZ4I9ave75b4Sf9fRh/T0ksT4BQqNQJ9ZIpZ4AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290129;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.611,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.630;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAAwd3dW1NQUMjJm/f0LGxtCpKRHr686kJBMvLw8lZVAn58CBARe6ekmXl4iVVUucXEGDw82hoY6j48ECQkoZGQfTU0eS0tj9PQECwsyfHxh8fFX19dV09Nf7Oxl+vo3h4dEqalCo6MBAwMbQ0Nk9/cfTEwcRUVBoqJJtLRSy8s4iopc5OQBAgIqZ2cPJiYZPT1n/v5OwsIjVlY1goJAnp4hUVENISESLCwyfX1Tzs5W1tYtcHB753Y9AAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAABwAAAAMCAMAAABGBS09AAAA2FBMVEUAAAAnJyejo6Pn5+etra0DAwNPT0+2trYKCgpERET6+vq8vLxgYGAuLi4WFhaBgYHk5OT///8MDAwNDQ3u7u6QkJDe3t58fHx+fn5ra2vs7OwHBwcBAQEODg5kZGSqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cUFBTKyspQUFBvb2+JiYmMjIwoKCjp6en+/v4EBARKQZe0AAAAk0lEQVQYlWNgYGBkYmZhQAOsbOwcIJqTi5uHF1WKj19AUFAIyBAWEUXXxsAjJi4BlpSUkmaQQZOUlWGQA0vKKygqKauoomuGSKqpa3Bqamljl9TR1WNg0DcwxCppZAwkTARNsUqamQMJC0FLrJJW1jZAY21lsUraMds7OGo5gUWcBVVRJRlc2JVc+fXAIqJu7iiSAGzfDdkRCdBCAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492290184;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;4.rect,1.1,2.42,3.630,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.632,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.71,3.628;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290261;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.71,3.628,3.446,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAt1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICAICAja2trX19dVVVVYWFjb29tGRkb///88PDw9PT1JSUlHR0ctLS0rKytLS0vd3d20tLQfHx+1tbXc3NwoKCjx8fHw8PAlJSUKCgrPz8/Ly8tMTExOTk7Nzc3Ozs5paWn7+/sYGBgZGRn6+vqUlJTh4eHe3t6Xl5d6enr5+fkTExMUFBR7e3sWFhbo6OjFxcVQUFBRUVHIyMgVFRWysrLs7Ow9QRCDAAAAbklEQVQImRXL6RJCYBhA4dMqqVelUAptSotQ2rj/6/L5d2aeOUCr3en2+oA20IfGSNdgLCZMZAozsWAuC6W247rLlVK8tcjGVxGE293+cAwgOp0hvkRwvSngnsAjzSBPn/Aq3p/vr/g3b1lVpUcNcVII+u7rkvcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290277;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;3.img,1.1,2.14,1.1,9.image/png,2.70,3.630;4.blob,1.1,1488.iVBORw0KGgoAAAANSUhEUgAAAE8AAAAPCAMAAACSsmLYAAAB/lBMVEUAAAAFDAw4iopb4eFj9fVLubkSLCw4i4tV09MDBwdOwMBNv78iVFQdSEg7kpJf6+sMHh4HERENICBFrKxRyMgwdnZHsbEJFxdPw8Nm/Pwwd3c+mZkBAgJc5OQLHBxCpKRFqqolXFxOwcEECwta399KuLhf6upGra0sbGxl+fkRKytKt7dl+/seS0sqaGhn//9e6OgHEhJk+PgsbW1Z3Nw+mpolW1tSzMxj9PRc5eUIExNi8/Ng7u5Anp4GEBAVNTVPxMRg7e0UMTFa4OAcRkYrampj9vZMvb0xenobREQKGBgYPDxDp6cWNjYXODgiVVVm/f00gIAbQ0NX2NhW1dUIFRVV0tIoY2MmXV0/nJwTLi4dR0c9lpYECQla3t4CBgYpZWUmXl43iIgPJCQ6j48OIiIVNDRi8vIbQkIUMjIucXE1goJHr68AAQFY2tooYmIzf38vdHQgUFBW1tZGrq4DCAgqaWk5jIwNHx85jY1Fq6szfn4aQUFl+voJFhYeSkpn/v5DpqYuc3M3h4coZGRJtLRTzc1f7OwYOzsKGRkIFBQTMDAfTU0yfHxY29s9l5cLGxsqZ2dh8fEye3sra2tEqKgcRUUpZmZMu7sQKChd5+cCBAQxeXlU0NASLS0kWlpTzs5k9/dUz881g4M3iYkyfX1b4uJKtrZX19dh8PDkx3m9AAACGElEQVQ4jWNgYGBkYmZhZWPACdg5cMthAZxc3Dy8fPwCOBUICuHRLSyCLiIqJi4hKSUlTZIjcJsnIysnr6CopKzCwCCvyqTGoi4OEtXQ1NJm0dFlYNDT19c3AIkYGhmDKBNTIGFmbmEpbQVkyOqDAUhCQMHaxtaOgcHegdOR0UmYwZmTQV5fzMXVzR1snr6lhyePFwODl7e3PNg8Bh+QS3z1/RgY/AMCgxSDVYFce2/uEG9vbyArVDaMJ9xAm4EhIjJKgiE6hiEslkE+Lp6BIUHfCWxeItwHSRDzPPWTGRhSQoCs1DRgqEfoWyH7lz0daHmGfiZDVrZLDkNEYG4e0L/mQAlB/XywebHo5uWqFDDIWBaCmEUi1kBfCiGbV1xSWloa6+bKUFbuZ1KhWplYBTWPQdMDbF4punkM1XkMNbV1QEZ9Q6OufROqeY6QkGxm8OSON6ltcbPQgrsvHId5AgG+pjkgRmsbyI2o5sVVpYGAHENpe4dyJ0NnF1BMPk+GgSFcvxuHeQyqMY49IFqbG0j0QsyT7oPI9TszAskJQDxx0mTPoikgMXn9qdOmW8xgQDYPFL+O3t4zQWx/o1mzQXRZw5xo9gB9LRA7Qr+gRhHomFC1uRHT2GvnAYXmL1g4aw7YvEWL293UQ1HM04OEizCIHc+/BBIzS5e5LZ/vrAtmVzpqrgCZkqy+0poriAEZQOKDemAwmgcA5RhzXag+Yk8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,460.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAZklEQVQImQ2K1xKCQBAEW044YM1iREVMmMFE+P8fc+dhqqtnoOWYtgt41g9C6UC314fBcMQ4Uj2RKbO5wkKWxKs1bCRhK2G628sBjiexmZz1kF6ut7vumscz1y5e78/3p1Caqm7gDxd5BxVT9omaAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492290344;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.121,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.629;4.blob,1.1,3200.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,636.iVBORw0KGgoAAAANSUhEUgAAABMAAAAMCAMAAAC3DnawAAAA7VBMVEUAAACenp7///84ODg0NDTAwMD39/fr6+uYmJgNDQ08PDz+/v4eHh7y8vK1tbVNTU1gYGDl5eW0tLQEBATT09PGxsaJiYno6OgGBgYsLCx1dXXm5uZGRkbExMSsrKwdHR1oaGj09PRVVVXZ2dmZmZnh4eF8fHyvr6+2trbc3NxlZWX19fV4eHiAgIBMTEz29vYiIiKgoKCdnZ3p6elBQUEJCQnf398ICAg+Pj7FxcUbGxvQ0NDHx8cFBQUWFhZjY2MtLS2Li4tJSUkuLi4gICDz8/NLS0tfX1/k5OS3t7c1NTXCwsLt7e2bm5sODg5/YgJ+AAAAqUlEQVQImU3O1xKCMBAF0GuwoKgUexcLFsSO2LF3/f/PMQnjjPdhN3Me7gZg8RGBLX8gGBLDXBCRuEVjcVlRNU6JZIpbOpMFZJJjli8UuZXKdFRIlU29JnCrN2hlkxj02WrDs46IrtnTLaA/GP5sNJ5MQc2eWY4zJ3NaX5cWS8A0oBAvK2Cx3gA2vbEVaFzi7oC96gAHcvQ+7fWdztrlervj3/B4Bl/vD76DQQ+rwlaeAwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290416;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.70,3.629,3.338,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.62,3.630;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAM1BMVEUAAAADAwNPT0+2trYKCgoWFhaBgYHk5OT///8MDAxgYGDe3t58fHx+fn4ODg4BAQFkZGRj/53qAAAAKUlEQVQImWNgYGBkYmZhYGBgZWPn4OAEMri4eXjBDD5+BgEwAwiowQAAYWcBu6p1dmgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290429;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.630;4.blob,1.1,3104.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAAJUAAAAMCAMAAABcFQ/2AAAAwFBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk4DAwNPT0+2trYKCgqenp7s7OxqampKSkqlpaX///9DQ0MWFhaBgYEMDAwlJSVcXFwBAQHW1tarq6tgYGDe3t58fHwxMTGkpKQaGhqurq7CwsIODg5kZGQGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBSMjIwICAgcHBxYWFiQkJB7P/PoAAAAqUlEQVQ4jc2Oxw6DMBAFF0ivm4bTeyc9Ib38/18FRHBkJHxcMwcfdizNA9B0IxZPQIBkKp0J3ijwu9lcvlDEkuDKFQOxSr+Jd2toArB6Q7DNVltXsYp3O92e8/YHgh0yGKlYJXbHk2nwg5JVYnc2X0gsKf/u0jIllhbeXa03EkuM393u9izcUvPrHo4nLdyS43Xt8+V6c7i7pwc+o7HqhR5v9/Sx7Eis+gLp8xATACekxQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290513;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.40,3.630,3.207,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,896.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABTVBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1s0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgqkpKTu7u5tbW1GRkaPj4////8eHh7y8vK1tbVNTU1gYGC0tLQWFhbk5OQMDAwXFxdqamrLy8uJiYno6OgGBgYsLCze3t58fHx+fn4UFBQFBQXBwcHExMSsrKwdHR1oaGgODg4BAQFkZGQHBwdwcHD9/f1MTEzZ2dmZmZnh4eH09PR3d3fc3NxlZWX19fV4eHiAgIACAgIxMTFDQ0OXl5dQUFCgoKCdnZ3p6elBQUGwsLC4uLjOzs7+/v7FxcUbGxsPDw8jIyMYGBiKiort7e3Hx8cJCQkkJCRhYWG3t7fMzMyLi4tJSUkuLi6pqamNjY2MjIwgICDz8/NLS0tfX18LCwuHh4ff399RUVGQkJAEBAQ1NTXCwsKbm5sjQstTAAABDElEQVQokW2PV1fCUBCEJ0RFRMCCqyaIYEGKDQuoUbGBFbAQC9h7//+PboBzZDmZh3t3Z76HHUBxqC2tbZBytrs63J1Npsfr6wK6e3r9feQVSf/AoKarAeENOYJEwwhRmJcRmY2OjQMaRRo9fSIaY94TT/Ay6RP81DQ/MzTb6CXnMM88ayG0mEoLfmmZK6xQtKlAnTeIVmWw5sZ6ZsPYBLYUSwnBb+9kUznJ7+7tH8Di02TpUPCso7y8p1A8BjJ8z4nT0uk/f6bHeSqZgi+e8wUXsm+dv6QrnsoVEVyrCnBDt3Z978yw/560qvFASvV/fAo8vwTLsONf396NykfN+Cx81YbvH5f5m7Th/wCWiCPceRESHAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290527;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.821,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.630;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAAwd3dW1NQUMjJm/f0LGxtCpKRHr686kJBMvLw8lZVAn58CBARe6ekmXl4iVVUucXEGDw82hoY6j48ECQkoZGQfTU0eS0tj9PQECwsyfHxh8fFX19dV09Nf7Oxl+vo3h4dEqalCo6MBAwMbQ0Nk9/cfTEwcRUVBoqJJtLRSy8s4iopc5OQBAgIqZ2cPJiYZPT1n/v5OwsIjVlY1goJAnp4hUVENISESLCwyfX1Tzs5W1tYtcHB753Y9AAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAAh1BMVEUAAACenp7///84ODgDAwNPT0+2trYKCgo8PDz+/v4WFhaBgYHk5OQMDAwEBATT09PGxsZgYGDe3t58fHx+fn51dXXm5uZGRkYODg4BAQFkZGQdHR309PRVVVWvr69MTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgbQ0NBjY2MtLS2MjIyQkJCjaCuzAAAAdElEQVQYlWNgAAFGJmYGVMDCysYOZXJwoslycfMwMfFC2Hz8AmiygkLCIjBZUTFxNFkJSQYpqKy0jCwzhr1wWTk2Btyy8gqKuGWVlFVUVdWY1NSxygoyQYAGVlkuZiDQZNLUwuEqIIDZq82kikdWh5MPRRYAD9IGcUTnc9kAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290589;4.copy,1.1,1.0,2.38,3.960,3.589,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.589;4.rect,1.1,2.42,3.630,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.632,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,3.609;4.blob,1.1,3292.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.628;4.blob,1.1,1528.iVBORw0KGgoAAAANSUhEUgAAAGAAAAARCAMAAAAVOFluAAACE1BMVEUAAAAAAQEVMzNPw8Nk9/dj9vZCo6NBoKBW1NQHEhJf6+tPxMQdSUkaQEAeS0skWFhn//8NICAxeXll+voIFBRW1tZTzc0FDQ0MHh5Fqqpi8/Ng7u5Anp4GEBAZPz8mXV1QxsZV09NU0NAYPDwsbGxl+fkRKytKt7dj9fVl+/slW1tSzMxj9PRc5eU+mZkIExMbREQ1g4NRycknYGBc4+MaQUESLS1JtLRg7e1f6upGra0PJiZY29sJFhYIFRVc5ORV0tIiVFQoY2Ne6OhQx8cRKiooZGQTMDA+mpoGDg4xenoKGBgiVVVm/f00gIAbQ0MlXFxX2NhKuLg5jY0kWlpm/PwdR0dRyMhOwsJf7OxLurofTExb4uIGDw8DCAhNv79d5+cOIiI4i4ti8vIbQkIUMjIUMTE5jo4yfHxk+PgmXl4VNDQDBwcLHBxb4eE0gYEzfn4dSEgPJSUVNTVFrKxGrq4ECQkramoCBQU/nJwCBgY2hYUgUFBa4OBMvb0fTU0ucXE3h4cwd3cjVlYLGhoeSkpn/v5DpqYuc3MPJCRBoaFh7+8XOTkWNzda3t5Fq6stb28BAwNHsbEQJycECwsHERE9l5cFDAwLGxs7k5MWNjZU0dEnYWEcRUUOIyMqaWkTLy9HsLBHr69h8PBOwMAjV1cyfX1KtrZLublMu7sXOjpX19c4iooCBAQzf39Nvr4weHggq/gzAAACIUlEQVQ4jWNgIAwYiVBDAWBiZmFlo0A/Owd+eU4ubh5ePhpawC8gSIHpRFggJEyZ+WALRETFxIFMCUkpaRlZBgY5AXmQjIIiA4OSABgoA7kqqmrqGpqgwNLS1tHV02dgMBAwlDIy5jIxRdLLwGBmbmFpZY1igbi2jS2QZWfv4OjkrA5kabsACVcBNwYGd2UPVWVlZU+QBQK6XgaO3gwMPr5+/gGBQSALgkNClcLCI5D1ikRGRfsoxcQiWRAXn5AIYiUlA3WnCKQCnSiQxsCQzhUHEs3IhCpUEciCMBKzGRhy5AX0gRbkMuTlMxTkIestFHBlYCgyL0ZYIFoSmgZmiZbGxcWVsZYzMFTYVzJUcVUzoFlQBmXVhEsBg00QbEGtH0OGPbJeO666ek+UOBAIFWgAsywg4d0IZDZpyDYLt6BbEAdhtLa18xV3oFqApLezq1s4qgfJgsxCNuFeEKuvPxsEcoFMWZ0JUe0MOCwwFwP5AtUCJL0MDBN7JrFMRo7kKaK1U4GsabXTgeQMsOjMPt9ZuCxQjwcJo1qA0Ns0eyIwpgXmgJV6ekKSqZrGJCDPzlJJfm6SsBlIZp6vCwMuC+a3CYUl+QqoIVuA0LuAZSFf6yKdTpDKKZHdspCMZizQAQo9q8VSS/zBhsgmL8VpAeOyGNblIbV8yBYg6e1dEdm9chVYZc5qmykM2MEak7U4ZKgCiteFOtHSfIb1zhuoZhYANCGLegVRRmwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAa0lEQVQImWNgYGBgZGJmYQABVjZ2Dk4Qg4ubhwECePn4GQTALEEhYRFRMXEgS0JSilVaRhbIkpNXYGBQVFJmYFBRBXLV1DUYGDS1gCxtdR0GBl09faCsgSEDgxGzsYmpjBnIGHMLEUsrBQYAG0wHUAjXVT8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290677;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.71,3.628,2.96,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290753;4.copy,1.1,1.0,2.38,3.960,3.589,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.589;4.rect,1.1,3.151,3.614,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.609;4.blob,1.1,2164.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,828.iVBORw0KGgoAAAANSUhEUgAAAJUAAAAMCAMAAABcFQ/2AAABL1BMVEUAAAA4ODjGxsb39/fe3t5wcHADAwNPT0+2trYKCgoFBQV+fn7k5OT5+fnS0tJOTk4bGxv09PS5ubmJiYn///9tbW0WFhaBgYEMDAyenp7s7OxqampKSkqlpaVDQ0OKiorp6ekICAifn5/r6+tgYGB8fHwlJSVcXFwBAQHW1tarq6u8vLxFRUUxMTEODg5kZGSkpKQaGhqurq7CwsLIyMgkJCRNTU0GBgbm5uaLi4ujo6Pb29tGRkZQUFCGhoby8vJBQUESEhLl5eVERET+/v5ycnL7+/uTk5MiIiI0NDT19fWHh4csLCxpaWnn5+cfHx8TExPf39+AgIAPDw/U1NS6urpLS0t5eXnh4eHDw8OMjIwEBARJSUk8PDwUFBQ7Ozt7e3sJCQmQkJAcHBxYWFgrbBIJAAAA90lEQVQ4jcWOaVdBURSGdxnKTDZlLCmuDCEyxy00GkuT0uT//wbbZS0639nvh/e8az/nwwMAG5sqtQaEaLe2deJt9dEbjCazZbqsth2LHR3/qHPXiLi3fiuX2+P1oZ/W/kEA4DCoXaZH6mMDg1UIwwBS5IRmdFoxjC/jhASnDFbxZIo6fUaVSVJl8Vz4wWGlJJcvUBdLEkAZKwJks7qoWqlraJf9l3glQC6rSj2svI0m2q7xRqBMVrd39/MlP+habUnAPFaddnEh0u31Rc5i9fg00M9n4vnl9S2nzHcMcFoNo8GPT8qI9pfK/P0zO//Wh5xWfzjLeALA3R3rzXwMtgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492290831;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.121,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.629;4.blob,1.1,1872.iVBORw0KGgoAAAANSUhEUgAAAH8AAAARCAMAAADDnYMLAAACXlBMVEUAAAAJFhZKtrZHsLAnYWFY2dkbQkJIsrJY2toXOTla4OBW1NQAAQFk+PgyfHxBoKBU0NALGxtCo6Nh8fEIFBRFrKxRyMgKGBhn/v4jV1dn//8iVFRl+fkECQkramoTLy9l+vpX2Ng9mJhc5OQZPz8mXV1QxsZV09NCpKRKuLg4iopf6upj9fVGra0JFxcMHh5Fqqpi8/Ng7u5Anp4GEBAfTEwQKChUz88gT09l+/tZ3NwVNDQaQEAbREQ1g4NRycknYGBf6+tc4+MaQUEvdXVe6Ohj9vZHsbELGhosbGwRKytKt7ceS0sVNTUYPDxNv79W1dVSzMxQx8cRKiooZGQcRkZMvb0IFRVV0tIoY2MPJSU+mppJtbVSy8tm/Pw5jY0kWlodR0dOwsJLuromX19g7e1QxcVc5eUxenpTzs5DpqYlW1sUMTE5jo4DCAha3t4CBgYpZWU4i4ti8vIUMjItcHAECws+mZkWNjYeSkpm/f0LHBxb4eE0gYEzfn5d5uYDBwchUVEmXl4CBQU/nJw2hYUHEREoYmJW1tZGrq5b4uI/nZ00gIAfTU0HEhIwd3cjVlY3h4cweHg9l5cXODgcRUVh8PA1goJj9PQtb29Fq6s9lpZLubk8lJQra2tY29s7k5MBAgITMDAFDAwucXEGDg48lZUXOjoECgogUFAiVVUzf38lXFwOIyNEqKgpZmZMu7sSLS0QJydBoaEqaWkdSUlPw8NDpaVX19df7OwPJCROwMAbQ0MhUlJMvLxe6ekKGRkCBAQgTk41hIQ2hoYSLCxNvr4qZ2cGDw8IExMzvCvPAAAC2ElEQVRIiaXUZ1cTQRQG4GujhGIAJcslhEBEqSIYhYigAZMQSpSgYhSDgmBQCQgqVUGwKxaaWLBhx4KCXRG7/itnZymZPYqY3A93ZvbsvM+Z3T0L4FTNmDnLuY2TNXuOm/Ob3T08SZd4eZPu4/vne+ZKp4zw8w+YRyfzA/+bl3FB/CDBYNLlzvkQIlc467thqOBLyQNQOulDWDhpKqQFsAAj+IsLFwFERkXHxMYt5pfxSxISl6rFO5fhcuonYTKAhvjhK8gyBVdCKqYlrFqtTc/g/TU6vSGTTTHKs7JjNTk0RepPWq5p7TqTyURmeWbS8nE98dGwQaHfSJYFqk3BFl222E/GzdTfUrgVwMr6Rdus0u2BxcTHkpwdpWVsihF32lKDZTSlfBcdxp//btwDUKG1E7+yCmAvv6yukfFPe5/I3685QP3aOqyHBtZvhKaDcKiJ+M0tAIfRk0kxYutEiruZ8dtUR6BKe5TMIvNIO4bHAU6ctNvtIXoFo7eYTp2mE0k4ZJuBE/uSM+CrGnv/LZyCSTFiyEROO6c46+DDuVj1eWXmuA9yG0Cp8HVcYPwOLLMLfid0YTdO5UPPRSbFiPbJIBtKHX1176US+krGzm8BqLycwlcj4zdatBWCfwXgajHv9zX9xa/irjEpjr6bsjqXDLXXxy/cqGyoo77HTQAL3gLolPSTtR+I6rbmDvXvAtxD3rf53Ad4IPJV5Ct6iF1MiqNfKBw8AgcyHtFf0eMG4YuIxCfdT3sHyawgRhrRXa18JvLb8Tn1+0gb5P1861DqsE7kc1EvWhNfsimOftIrOngXlcpfU0FdEyT4SWlv9HEF/PRtXE/Cu/fi89dj1oRv4n34EOZTHiTyR2wf9YZRNsXR9xoSxUanfxL8PDEoqlD8/I87plFtAV+Yde6A1QLT8709zPGu8v1fuW/Mhe+6DpimDynpI676PzTDLuxuG3XV//mL778B0mS3GjFyDxwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,720.iVBORw0KGgoAAAANSUhEUgAAABMAAAAMCAMAAAC3DnawAAABFFBMVEUAAACZmZn///9ISEg0NDTAwMD39/fr6+uYmJgNDQ2zs7O3t7c8PDwQEBAeHh7y8vK1tbVNTU1gYGDl5eW0tLTNzc2KioqJiYno6OgGBgYsLCzn5+dwcHACAgLExMSsrKwdHR1oaGgDAwP9/f3Ozs7u7u7FxcUvLy/Z2dnh4eF8fHwRERGmpqZBQUFXV1fd3d3m5uYKCgrc3NxlZWX19fV4eHj09PSAgIAtLS1jY2OgoKCdnZ3p6emNjY3+/v4bGxsuLi5VVVWOjo7Hx8cFBQUJCQlQUFAnJydiYmKLi4sICAhJSUnT09PS0tJWVlbW1tbi4uIgICDz8/NLS0tfX1/k5OQcHBw1NTXCwsLt7e2bm5sODg5hqBXTAAAAwklEQVQImT2NazcCYRSFn16pNEo1I0lpiFF0EeNapia56yYh/v//cN6y7A9n7fOctfcBAkprCQguh8KRFTFEjVVRDOJriWTKtDRbT7PQRmYTkiorditHfs62CzJstQO7xb39onMgaykglWV1CEdmpVqrHzfgJMKpe3Z+8Vd1qa6EXTdbVf4Z5o1kPacNrmQ7/px1wbntwZ3+ce/F4cF7hCfzGV5URw6vfX8wHMk6frMm71NDxz4qYTdha/f5FZp9//AL69MVNbElvJ8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290908;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.70,3.629,3.138,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.62,3.630;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAM1BMVEUAAAADAwNPT0+2trYKCgoWFhaBgYHk5OT///8MDAxgYGDe3t58fHx+fn4ODg4BAQFkZGRj/53qAAAAKUlEQVQImWNgYGBkYmZhYGBgZWPn4OAEMri4eXjBDD5+BgEwAwiowQAAYWcBu6p1dmgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492290964;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.630;4.blob,1.1,5168.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492291198;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.40,3.630,3.347,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,896.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABTVBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1s0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgqkpKTu7u5tbW1GRkaPj4////8eHh7y8vK1tbVNTU1gYGC0tLQWFhbk5OQMDAwXFxdqamrLy8uJiYno6OgGBgYsLCze3t58fHx+fn4UFBQFBQXBwcHExMSsrKwdHR1oaGgODg4BAQFkZGQHBwdwcHD9/f1MTEzZ2dmZmZnh4eH09PR3d3fc3NxlZWX19fV4eHiAgIACAgIxMTFDQ0OXl5dQUFCgoKCdnZ3p6elBQUGwsLC4uLjOzs7+/v7FxcUbGxsPDw8jIyMYGBiKiort7e3Hx8cJCQkkJCRhYWG3t7fMzMyLi4tJSUkuLi6pqamNjY2MjIwgICDz8/NLS0tfX18LCwuHh4ff399RUVGQkJAEBAQ1NTXCwsKbm5sjQstTAAABDElEQVQokW2PV1fCUBCEJ0RFRMCCqyaIYEGKDQuoUbGBFbAQC9h7//+PboBzZDmZh3t3Z76HHUBxqC2tbZBytrs63J1Npsfr6wK6e3r9feQVSf/AoKarAeENOYJEwwhRmJcRmY2OjQMaRRo9fSIaY94TT/Ay6RP81DQ/MzTb6CXnMM88ayG0mEoLfmmZK6xQtKlAnTeIVmWw5sZ6ZsPYBLYUSwnBb+9kUznJ7+7tH8Di02TpUPCso7y8p1A8BjJ8z4nT0uk/f6bHeSqZgi+e8wUXsm+dv6QrnsoVEVyrCnBDt3Z978yw/560qvFASvV/fAo8vwTLsONf396NykfN+Cx81YbvH5f5m7Th/wCWiCPceRESHAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492291751;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.821,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.630;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAAwd3dW1NQUMjJm/f0LGxtCpKRHr686kJBMvLw8lZVAn58CBARe6ekmXl4iVVUucXEGDw82hoY6j48ECQkoZGQfTU0eS0tj9PQECwsyfHxh8fFX19dV09Nf7Oxl+vo3h4dEqalCo6MBAwMbQ0Nk9/cfTEwcRUVBoqJJtLRSy8s4iopc5OQBAgIqZ2cPJiYZPT1n/v5OwsIjVlY1goJAnp4hUVENISESLCwyfX1Tzs5W1tYtcHB753Y9AAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAAh1BMVEUAAACenp7///84ODgDAwNPT0+2trYKCgo8PDz+/v4WFhaBgYHk5OQMDAwEBATT09PGxsZgYGDe3t58fHx+fn51dXXm5uZGRkYODg4BAQFkZGQdHR309PRVVVWvr69MTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgbQ0NBjY2MtLS2MjIyQkJCjaCuzAAAAdElEQVQYlWNgAAFGJmYGVMDCysYOZXJwoslycfMwMfFC2Hz8AmiygkLCIjBZUTFxNFkJSQYpqKy0jCwzhr1wWTk2Btyy8gqKuGWVlFVUVdWY1NSxygoyQYAGVlkuZiDQZNLUwuEqIIDZq82kikdWh5MPRRYAD9IGcUTnc9kAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492291824;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;4.rect,1.1,2.42,3.630,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.632,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.628;4.blob,1.1,3608.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,420.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAACZmZn///9ISEizs7O3t7c8PDwQEBDNzc2Kiorn5+dwcHACAgIDAwP9/f3Ozs7u7u7FxcUvLy8RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgotLS1jY2ONjY0uLi5VVVWOjo5QUFD+/v4eHh4nJydiYmIJCQnT09PS0tJWVlbW1tbi4uIICAgcHBzr6+v19fW1tbUdHR1v3ovhAAAAXklEQVQImTXKRxKCUAAE0SapIBIkCQaC5Oz9L+eXwl69qhlAkn8pgKodREehk86eccbccLFsx3KvQp4fhNEtTvbHXX78z/4TXummDPLiDWVRQd20adcPoximYF7WD1/BsQVyvPN55AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492291889;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.70,3.628,3.707,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAJQAAAAMCAMAAACz12TIAAABQVBMVEUAAAAnJyejo6Pn5+etra0DAwNPT0+2trYKCgoICAiBgYHl5eX29vbQ0NBbW1tERET6+vq8vLxgYGAuLi4WFhbk5OT///8MDAykpKTu7u5tbW1GRkaPj48NDQ2QkJDe3t58fHx+fn4XFxdqamrLy8u0tLRra2vs7OwHBwcBAQEODg5kZGQUFBQFBQXBwcGqqqq1tbWWlpbz8/P4+Pifn59wcHD9/f1MTEzR0dGysrJpaWn19fWhoaH09PR3d3ff39/JyckCAgJzc3P8/PwVFRUxMTFDQ0OXl5dQUFDh4eGUlJQvLy89PT24uLjOzs7IyMiwsLAwMDA2NjYYGBiKiort7e2Dg4MTExP39/ckJCRhYWG3t7fMzMzKyspvb2+JiYmMjIypqamNjY1NTU0oKCjp6en+/v4EBAQLCwuHh4dRUVFp+nWnAAABAElEQVQ4jWNgYGBkYmZhQAOsbOwc6GK0B5xc3Dy8fCAWv4CgkDCqpAiXqJiYOP0dJSEpJS0jxsbAICsphyEpJK+gOACOUhJTBpIqqgwMauoaDJposlqaDNoD4ChWHV0gqcfOwKBvYGhkbMKJrmAgHAUEGkqmZuYMDBZmlvxW1jaDxFG2YmJ2QMrewZGBwcnZZXA4ytXN3cyDgcHTC8j2FvMZHI4CAl8/Bgb/ACAjUCwITWogHBUspAMkQ0IZGMJsw4HRF6E1CBwVKRYFJKNjGBh0mGM94qzjwaIJYvBcOCDRlxiqLJ0klgxkpbAbpXI5ggXl0tIH1FEZmfa2MVkMDADtVR8LkDCNuAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492291902;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;3.img,1.1,2.14,1.1,9.image/png,2.70,3.630;4.blob,1.1,1488.iVBORw0KGgoAAAANSUhEUgAAAE8AAAAPCAMAAACSsmLYAAAB/lBMVEUAAAAFDAw4iopb4eFj9fVLubkSLCw4i4tV09MDBwdOwMBNv78iVFQdSEg7kpJf6+sMHh4HERENICBFrKxRyMgwdnZHsbEJFxdPw8Nm/Pwwd3c+mZkBAgJc5OQLHBxCpKRFqqolXFxOwcEECwta399KuLhf6upGra0sbGxl+fkRKytKt7dl+/seS0sqaGhn//9e6OgHEhJk+PgsbW1Z3Nw+mpolW1tSzMxj9PRc5eUIExNi8/Ng7u5Anp4GEBAVNTVPxMRg7e0UMTFa4OAcRkYrampj9vZMvb0xenobREQKGBgYPDxDp6cWNjYXODgiVVVm/f00gIAbQ0NX2NhW1dUIFRVV0tIoY2MmXV0/nJwTLi4dR0c9lpYECQla3t4CBgYpZWUmXl43iIgPJCQ6j48OIiIVNDRi8vIbQkIUMjIucXE1goJHr68AAQFY2tooYmIzf38vdHQgUFBW1tZGrq4DCAgqaWk5jIwNHx85jY1Fq6szfn4aQUFl+voJFhYeSkpn/v5DpqYuc3M3h4coZGRJtLRTzc1f7OwYOzsKGRkIFBQTMDAfTU0yfHxY29s9l5cLGxsqZ2dh8fEye3sra2tEqKgcRUUpZmZMu7sQKChd5+cCBAQxeXlU0NASLS0kWlpTzs5k9/dUz881g4M3iYkyfX1b4uJKtrZX19dh8PDkx3m9AAACGElEQVQ4jWNgYGBkYmZhZWPACdg5cMthAZxc3Dy8fPwCOBUICuHRLSyCLiIqJi4hKSUlTZIjcJsnIysnr6CopKzCwCCvyqTGoi4OEtXQ1NJm0dFlYNDT19c3AIkYGhmDKBNTIGFmbmEpbQVkyOqDAUhCQMHaxtaOgcHegdOR0UmYwZmTQV5fzMXVzR1snr6lhyePFwODl7e3PNg8Bh+QS3z1/RgY/AMCgxSDVYFce2/uEG9vbyArVDaMJ9xAm4EhIjJKgiE6hiEslkE+Lp6BIUHfCWxeItwHSRDzPPWTGRhSQoCs1DRgqEfoWyH7lz0daHmGfiZDVrZLDkNEYG4e0L/mQAlB/XywebHo5uWqFDDIWBaCmEUi1kBfCiGbV1xSWloa6+bKUFbuZ1KhWplYBTWPQdMDbF4punkM1XkMNbV1QEZ9Q6OufROqeY6QkGxm8OSON6ltcbPQgrsvHId5AgG+pjkgRmsbyI2o5sVVpYGAHENpe4dyJ0NnF1BMPk+GgSFcvxuHeQyqMY49IFqbG0j0QsyT7oPI9TszAskJQDxx0mTPoikgMXn9qdOmW8xgQDYPFL+O3t4zQWx/o1mzQXRZw5xo9gB9LRA7Qr+gRhHomFC1uRHT2GvnAYXmL1g4aw7YvEWL293UQ1HM04OEizCIHc+/BBIzS5e5LZ/vrAtmVzpqrgCZkqy+0poriAEZQOKDemAwmgcA5RhzXag+Yk8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492291987;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;3.img,1.1,2.14,1.1,9.image/png,2.81,3.630;4.blob,1.1,1236.iVBORw0KGgoAAAANSUhEUgAAAE4AAAAPCAMAAAB9cAnmAAABwlBMVEUAAABFrKxRyMgQKChJtLRi8/Nh8fFBoqIKGBgWNzdOwcFk9/de6ek7k5MFDAxCpKRHsbEgT09W1tZj9fVQxcUUMTESLS1g7e1f6upGra0PJiZc5ORn//8lW1tSzMxj9PRc5eU+mZkIExNf6+tSysogTk4kWVlX19dU0dEDBwcQJydj9vZKuLgdSEgoYmJg7u5JtbVQxsYhUVEiVFRW1NRa398IFBRf7OxLurofTEwiVVVU0NBb4uIGDw8VNTUYPDxNv79W1dVm/f00gIAbQ0MlXFxX2Ng2hoZh8PBFqqpY2toCBAQdR0caQUEFDQ0cRUUZPT0RKioPJSUOIiIVNDQmXV1OwsINHx81hIQ5jIwhUlIIFRVMvb0fTU0GDg4gUFANICBZ3Nw9lpYECQksbGxBoKAPJCRBoaFh7+9l+voXOTkeSkpn/v5DpqYeS0suc3M5jY0BAwNTzc0MHR0bREQwd3cnYWFY29tKt7cyfHxQx8cjVlZV0tIDCAgRKSkmX18TLy9HsLBHr68zf38qaWkxeXk4i4sRKysMHh5KtrZd5+c/m5sXOjpPxMQ9l5dLublMu7sAAQFl+fkyfX0kWlpa4OChrlk4AAABmElEQVQ4jWNgGCjAyES+LNnGMbOwsrFzgFicXNw8vHxABr+AoJCwiChITIxFXEJSCsiQlgEDkJisnLyCohKKOriskrKKqpq6hiYDg5a2jq6evgFIGY+hkbGJKVDMzNzC0sraxpaBwc7ewdHe3h4oa+Xk7OLqpoOiDi7r7gFUqyUjyMDg6eXNwOAj4wtS5sfA4C8TwMCgKxPIwBDEYofsneAQBgbNUBklZHVw2TBPEBkO9KN8BIilHAlUZg3SJRPFwBCtHBMbhx528UysQI8lIKuDyyYmQRUly6SAKI1UqLIEGWMgmZaekWmRhWJcdk5unl0+3DiIOlTXgYAwxHUFqMoYCrMEuLWQjWMpArkQh3HuGUDPFGfEMjBIQsKuBFlZqUYhMD5kykAqFcshxlU4AIlKdOOgsmYSVZbVNda1DAx13BU+9eLgGIMra+BuzMtukk8DqQyVafZ1NWNgaMlp9WlzkmlHNQ4m29Ep39UdDRLp6eVW7otDMY6Bs988Y0IP2OKJBeKT1MWA9GQb7c4pU/NQjYPJjiAAABlfWRD362M+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAt1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICAICAja2trX19dVVVVYWFjb29tGRkb///88PDw9PT1JSUlHR0ctLS0rKytLS0vd3d20tLQfHx+1tbXc3NwoKCjx8fHw8PAlJSUKCgrPz8/Ly8tMTExOTk7Nzc3Ozs5paWn7+/sYGBgZGRn6+vqUlJTh4eHe3t6Xl5d6enr5+fkTExMUFBR7e3sWFhbo6OjFxcVQUFBRUVHIyMgVFRWysrLs7Ow9QRCDAAAAbklEQVQImRXL6RJCYBhA4dMqqVelUAptSotQ2rj/6/L5d2aeOUCr3en2+oA20IfGSNdgLCZMZAozsWAuC6W247rLlVK8tcjGVxGE293+cAwgOp0hvkRwvSngnsAjzSBPn/Aq3p/vr/g3b1lVpUcNcVII+u7rkvcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492292003;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.121,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.629;4.blob,1.1,1872.iVBORw0KGgoAAAANSUhEUgAAAH8AAAARCAMAAADDnYMLAAACXlBMVEUAAAAJFhZKtrZHsLAnYWFY2dkbQkJIsrJY2toXOTla4OBW1NQAAQFk+PgyfHxBoKBU0NALGxtCo6Nh8fEIFBRFrKxRyMgKGBhn/v4jV1dn//8iVFRl+fkECQkramoTLy9l+vpX2Ng9mJhc5OQZPz8mXV1QxsZV09NCpKRKuLg4iopf6upj9fVGra0JFxcMHh5Fqqpi8/Ng7u5Anp4GEBAfTEwQKChUz88gT09l+/tZ3NwVNDQaQEAbREQ1g4NRycknYGBf6+tc4+MaQUEvdXVe6Ohj9vZHsbELGhosbGwRKytKt7ceS0sVNTUYPDxNv79W1dVSzMxQx8cRKiooZGQcRkZMvb0IFRVV0tIoY2MPJSU+mppJtbVSy8tm/Pw5jY0kWlodR0dOwsJLuromX19g7e1QxcVc5eUxenpTzs5DpqYlW1sUMTE5jo4DCAha3t4CBgYpZWU4i4ti8vIUMjItcHAECws+mZkWNjYeSkpm/f0LHBxb4eE0gYEzfn5d5uYDBwchUVEmXl4CBQU/nJw2hYUHEREoYmJW1tZGrq5b4uI/nZ00gIAfTU0HEhIwd3cjVlY3h4cweHg9l5cXODgcRUVh8PA1goJj9PQtb29Fq6s9lpZLubk8lJQra2tY29s7k5MBAgITMDAFDAwucXEGDg48lZUXOjoECgogUFAiVVUzf38lXFwOIyNEqKgpZmZMu7sSLS0QJydBoaEqaWkdSUlPw8NDpaVX19df7OwPJCROwMAbQ0MhUlJMvLxe6ekKGRkCBAQgTk41hIQ2hoYSLCxNvr4qZ2cGDw8IExMzvCvPAAAC2ElEQVRIiaXUZ1cTQRQG4GujhGIAJcslhEBEqSIYhYigAZMQSpSgYhSDgmBQCQgqVUGwKxaaWLBhx4KCXRG7/itnZymZPYqY3A93ZvbsvM+Z3T0L4FTNmDnLuY2TNXuOm/Ob3T08SZd4eZPu4/vne+ZKp4zw8w+YRyfzA/+bl3FB/CDBYNLlzvkQIlc467thqOBLyQNQOulDWDhpKqQFsAAj+IsLFwFERkXHxMYt5pfxSxISl6rFO5fhcuonYTKAhvjhK8gyBVdCKqYlrFqtTc/g/TU6vSGTTTHKs7JjNTk0RepPWq5p7TqTyURmeWbS8nE98dGwQaHfSJYFqk3BFl222E/GzdTfUrgVwMr6Rdus0u2BxcTHkpwdpWVsihF32lKDZTSlfBcdxp//btwDUKG1E7+yCmAvv6yukfFPe5/I3685QP3aOqyHBtZvhKaDcKiJ+M0tAIfRk0kxYutEiruZ8dtUR6BKe5TMIvNIO4bHAU6ctNvtIXoFo7eYTp2mE0k4ZJuBE/uSM+CrGnv/LZyCSTFiyEROO6c46+DDuVj1eWXmuA9yG0Cp8HVcYPwOLLMLfid0YTdO5UPPRSbFiPbJIBtKHX1176US+krGzm8BqLycwlcj4zdatBWCfwXgajHv9zX9xa/irjEpjr6bsjqXDLXXxy/cqGyoo77HTQAL3gLolPSTtR+I6rbmDvXvAtxD3rf53Ad4IPJV5Ct6iF1MiqNfKBw8AgcyHtFf0eMG4YuIxCfdT3sHyawgRhrRXa18JvLb8Tn1+0gb5P1861DqsE7kc1EvWhNfsimOftIrOngXlcpfU0FdEyT4SWlv9HEF/PRtXE/Cu/fi89dj1oRv4n34EOZTHiTyR2wf9YZRNsXR9xoSxUanfxL8PDEoqlD8/I87plFtAV+Yde6A1QLT8709zPGu8v1fuW/Mhe+6DpimDynpI676PzTDLuxuG3XV//mL778B0mS3GjFyDxwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,460.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAZklEQVQImQ2K1xKCQBAEW044YM1iREVMmMFE+P8fc+dhqqtnoOWYtgt41g9C6UC314fBcMQ4Uj2RKbO5wkKWxKs1bCRhK2G628sBjiexmZz1kF6ut7vumscz1y5e78/3p1Caqm7gDxd5BxVT9omaAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492292059;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.70,3.629,3.138,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.62,3.630;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.649;4.blob,1.1,772.iVBORw0KGgoAAAANSUhEUgAAABIAAAAMCAMAAABYzB2OAAABMlBMVEUAAAAnJyejo6Pn5+etra00NDTAwMD39/fr6+uYmJgNDQ1ERET6+vq8vLxgYGAuLi4eHh7y8vK1tbVNTU3l5eW0tLTu7u6QkJCJiYno6OgGBgb///8sLCxra2vs7OwHBwcBAQHExMSsrKwdHR1oaGiqqqqWlpbz8/P4+Pifn58ICAjZ2dmZmZnh4eF8fHzR0dH9/f2ysrJpaWn19fWhoaHc3NxlZWV4eHj09PSAgIDf39/JyckCAgJzc3P8/PwVFRWgoKCdnZ3p6elBQUGUlJQvLy89PT3+/v7FxcUbGxvIyMiwsLAwMDA2NjbHx8cFBQUJCQmDg4MTExMODg6Li4tJSUkUFBTKyspQUFBvb28gICBLS0tfX1/k5OS3t7coKCi2traBgYE1NTXCwsLt7e2bm5sAGwU5AAAAzElEQVQImSWOa1sBcRDFT6iNxdbuYvlLJFblvpRbaCmXIqySXKL0/b9Cs5kX85z5PXPODIADi9UGsw6PuGO7gwTvdLkFk5ycipJb9gAOrw/7UvwBQGJBnIXOEf5HkQtqUXaJmBhXE1fXNN0kKS7F0shkc3xeKxAq2nGr3ZXKqFRrwH29Qaj5oLdAKNWmhUf2RMZOtwdoafSfCb2wAdAdvgIjih+XJmTkDGAq05E3JuDdOvuYawqtfqqexXK1JvW1UfVtzXzs+4fb/Rr4AxBSGWjijbB9AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492292131;4.copy,1.1,1.0,2.38,3.960,3.589,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.589;4.rect,1.1,2.70,3.611,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.51,3.630,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.610;4.blob,1.1,4228.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,876.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABRFBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk40NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgqenp7s7OxqampKSkqlpaX///9DQ0MeHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYEMDAwlJSVcXFwBAQHW1tarq6uJiYno6OgGBgYsLCze3t58fHwxMTGkpKQaGhqurq7CwsLExMSsrKwdHR1oaGgODg5kZGTm5uaLi4vZ2dmZmZnh4eGGhoYbGxvc3NxlZWX19fV4eHj09PSAgIACAgIICAhQUFD+/v6goKCdnZ3p6elBQUFMTEywsLCHh4fFxcUPDw8jIyMfHx/n5+ejo6PHx8cJCQnU1NS6urpJSUkuLi4EBAS8vLw8PDwUFBSMjIwgICDz8/NLS0tfX1+3t7ccHBxYWFiQkJA1NTXt7e2bm5v6IMq1AAABCElEQVQokW2PV1MCQRCE+zjxBMxhFAkGzoCiiAEEA5zgeWYwixgwh///7i6U1s0W/bBV2/3VzDSgefQ2bzu4jA6fP9CpmF3dPb1AX//A4BANs2QkOBoKR6LMGxvXiSYwSTHAnJpm2cxsHAjRnNsLzyc8gl9YTIrPUorxyyviWaU1t5c2kRF8Q/H1LONzG6LCJiWUAv/8VnCbBfkACtZOsQTs2lIa5/ecGB+U3z84PILkj0nqhPGGdaoszjllsdAS91QMqTM3f35xaSp8+UpccM37/vGVm1tN8ZGN2ECV7lrwtXt/9UHoURpPZDeC+nP05VV/U8dI/p2a+pDGp1NrJl8p3/dPugX/C4YIJUro3qRlAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492292199;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.821,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.630;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAAwd3dW1NQUMjJm/f0LGxtCpKRHr686kJBMvLw8lZVAn58CBARe6ekmXl4iVVUucXEGDw82hoY6j48ECQkoZGQfTU0eS0tj9PQECwsyfHxh8fFX19dV09Nf7Oxl+vo3h4dEqalCo6MBAwMbQ0Nk9/cfTEwcRUVBoqJJtLRSy8s4iopc5OQBAgIqZ2cPJiYZPT1n/v5OwsIjVlY1goJAnp4hUVENISESLCwyfX1Tzs5W1tYtcHB753Y9AAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,708.iVBORw0KGgoAAAANSUhEUgAAAJUAAAAMCAMAAABcFQ/2AAAA81BMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1sDAwNPT0+2trYKCgqenp7///84ODikpKTu7u5tbW1GRkaPj48WFhbk5OQMDAw8PDz+/v4XFxdqamrLy8u0tLRgYGDe3t58fHx+fn4EBATT09PGxsYUFBQFBQXBwcEODg4BAQFkZGR1dXXm5uYHBwdwcHD9/f1MTEwdHR309PRVVVV3d3evr68xMTFDQ0OXl5dQUFAiIiK4uLjOzs4JCQnf39+AgIA+Pj4GBgYYGBiKiort7e0kJCRhYWG3t7fMzMxjY2MtLS2pqamNjY1NTU2MjIwLCwuHh4dRUVGQkJBZmdNQAAAA2klEQVQ4jc3S1xKCMBAF0MWOLir2gr137L337v9/jRHUGeK74T4w2b15ODMBgDMYTWYLULHaeDu9+08cKJCv0+UWPWjTNF6DD9HPBBUIvlQhDJNzJKqppFg8wUaVTKVfKmsmS4Ycr+nyBSiyUZXKovKCAJVQtVanazaqhtwU3ioZsfXTs1G1efioOt1erU/3TFR10+CrIhmO6AssVOPJlONmOJvDQsqQebnSg0pCNWZY44bM250eVF6BZI/7A8BxFRZPeFbWF+RYqpSo/9X1NpF3d3XzCCZ1oXoCiQwUc1tYl1kAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492292276;4.copy,1.1,1.0,2.38,3.960,3.589,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.589;4.rect,1.1,2.42,3.630,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.632,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,3.609;4.blob,1.1,2824.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,420.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAACZmZn///9ISEizs7O3t7c8PDwQEBDNzc2Kiorn5+dwcHACAgIDAwP9/f3Ozs7u7u7FxcUvLy8RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgotLS1jY2ONjY0uLi5VVVWOjo5QUFD+/v4eHh4nJydiYmIJCQnT09PS0tJWVlbW1tbi4uIICAgcHBzr6+v19fW1tbUdHR1v3ovhAAAAXklEQVQImTXKRxKCUAAE0SapIBIkCQaC5Oz9L+eXwl69qhlAkn8pgKodREehk86eccbccLFsx3KvQp4fhNEtTvbHXX78z/4TXummDPLiDWVRQd20adcPoximYF7WD1/BsQVyvPN55AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492292348;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;3.img,1.1,2.14,1.1,9.image/png,2.70,3.630;4.blob,1.1,1488.iVBORw0KGgoAAAANSUhEUgAAAE8AAAAPCAMAAACSsmLYAAAB/lBMVEUAAAAFDAw4iopb4eFj9fVLubkSLCw4i4tV09MDBwdOwMBNv78iVFQdSEg7kpJf6+sMHh4HERENICBFrKxRyMgwdnZHsbEJFxdPw8Nm/Pwwd3c+mZkBAgJc5OQLHBxCpKRFqqolXFxOwcEECwta399KuLhf6upGra0sbGxl+fkRKytKt7dl+/seS0sqaGhn//9e6OgHEhJk+PgsbW1Z3Nw+mpolW1tSzMxj9PRc5eUIExNi8/Ng7u5Anp4GEBAVNTVPxMRg7e0UMTFa4OAcRkYrampj9vZMvb0xenobREQKGBgYPDxDp6cWNjYXODgiVVVm/f00gIAbQ0NX2NhW1dUIFRVV0tIoY2MmXV0/nJwTLi4dR0c9lpYECQla3t4CBgYpZWUmXl43iIgPJCQ6j48OIiIVNDRi8vIbQkIUMjIucXE1goJHr68AAQFY2tooYmIzf38vdHQgUFBW1tZGrq4DCAgqaWk5jIwNHx85jY1Fq6szfn4aQUFl+voJFhYeSkpn/v5DpqYuc3M3h4coZGRJtLRTzc1f7OwYOzsKGRkIFBQTMDAfTU0yfHxY29s9l5cLGxsqZ2dh8fEye3sra2tEqKgcRUUpZmZMu7sQKChd5+cCBAQxeXlU0NASLS0kWlpTzs5k9/dUz881g4M3iYkyfX1b4uJKtrZX19dh8PDkx3m9AAACGElEQVQ4jWNgYGBkYmZhZWPACdg5cMthAZxc3Dy8fPwCOBUICuHRLSyCLiIqJi4hKSUlTZIjcJsnIysnr6CopKzCwCCvyqTGoi4OEtXQ1NJm0dFlYNDT19c3AIkYGhmDKBNTIGFmbmEpbQVkyOqDAUhCQMHaxtaOgcHegdOR0UmYwZmTQV5fzMXVzR1snr6lhyePFwODl7e3PNg8Bh+QS3z1/RgY/AMCgxSDVYFce2/uEG9vbyArVDaMJ9xAm4EhIjJKgiE6hiEslkE+Lp6BIUHfCWxeItwHSRDzPPWTGRhSQoCs1DRgqEfoWyH7lz0daHmGfiZDVrZLDkNEYG4e0L/mQAlB/XywebHo5uWqFDDIWBaCmEUi1kBfCiGbV1xSWloa6+bKUFbuZ1KhWplYBTWPQdMDbF4punkM1XkMNbV1QEZ9Q6OufROqeY6QkGxm8OSON6ltcbPQgrsvHId5AgG+pjkgRmsbyI2o5sVVpYGAHENpe4dyJ0NnF1BMPk+GgSFcvxuHeQyqMY49IFqbG0j0QsyT7oPI9TszAskJQDxx0mTPoikgMXn9qdOmW8xgQDYPFL+O3t4zQWx/o1mzQXRZw5xo9gB9LRA7Qr+gRhHomFC1uRHT2GvnAYXmL1g4aw7YvEWL293UQ1HM04OEizCIHc+/BBIzS5e5LZ/vrAtmVzpqrgCZkqy+0poriAEZQOKDemAwmgcA5RhzXag+Yk8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,464.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAZklEQVQImWNgYGBkYmZhAAJWNnYOTiDNxc3DAAa8fPwMAiCGoJCwiKiYOAODhKQUq7SMLAODnLwCA4OikjKDiipQXk1dg0FTC8jQVtdh0NXTB0oZGDIYMRubmMqYAYXNLUQsrRQYAAJaB1AhQ7/5AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492292429;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,3.121,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.627;4.blob,1.1,3508.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492292489;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,2.70,3.627,3.428,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.62,3.630;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAt1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICAICAja2trX19dVVVVYWFjb29tGRkb///88PDw9PT1JSUlHR0ctLS0rKytLS0vd3d20tLQfHx+1tbXc3NwoKCjx8fHw8PAlJSUKCgrPz8/Ly8tMTExOTk7Nzc3Ozs5paWn7+/sYGBgZGRn6+vqUlJTh4eHe3t6Xl5d6enr5+fkTExMUFBR7e3sWFhbo6OjFxcVQUFBRUVHIyMgVFRWysrLs7Ow9QRCDAAAAbklEQVQImRXL6RJCYBhA4dMqqVelUAptSotQ2rj/6/L5d2aeOUCr3en2+oA20IfGSNdgLCZMZAozsWAuC6W247rLlVK8tcjGVxGE293+cAwgOp0hvkRwvSngnsAjzSBPn/Aq3p/vr/g3b1lVpUcNcVII+u7rkvcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492292503;4.rect,1.1,2.42,2.22,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,2.44,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.41,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.44,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.41,3.298,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.62,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.79,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.139,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.117,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.101,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.107,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.101,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.101,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.101,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.196,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.138,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.193,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.196,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.139,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.136,2.59,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.136,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.193,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.193,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.193,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.191,3.488,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.212,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.326,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.233,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.250,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.329,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.307,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.291,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.326,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.326,1.9,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,3.386,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.326,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.326,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.326,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.326,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.328,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.383,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.383,2.69,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.386,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.383,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.386,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.381,2.86,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.383,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.386,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.404,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.500,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.478,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.90,3.462,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.497,1.8,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.497,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.497,2.29,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.497,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.497,2.79,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.554,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.497,2.68,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.554,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.554,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.557,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.575,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.592,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.630,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.610,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.614,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.608,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,1.0;4.blob,1.1,6448.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.22;4.blob,1.1,2868.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.79;4.blob,1.1,3844.iVBORw0KGgoAAAANSUhEUgAAAuEAAAAjCAMAAAANISQ2AAACzVBMVEUAAAAwd3dW1NQUMjJm/f0LGxtCpKRHr686kJBMvLw8lZVAn58CBARe6ekmXl4iVVUucXEGDw82hoY6j48ECQkoZGQfTU0eS0tj9PQECwsyfHxh8fFX19dV09Nf7Oxl+vo3h4dEqalCo6MBAwMbQ0Nk9/cfTEwcRUVBoqJJtLRSy8s4iopc5OQBAgIqZ2cPJiYZPT1n/v5OwsIjVlY1goJAnp4hUVENISESLCwyfX1Tzs5W1tYtcHAAAQEVMzNPw8Nj9vZFqqoqaGhn//9e6Og4i4tU0NBBoKAXODgHEhJf6+tPxMQdSUkaQEAPJSUCBQUKGBgYPDwHERENICBFrKxRyMgkWFgvdHQbREQ3iIgxeXk7kZFHsbEgT09j9fVQxcUUMTESLS1g7e1f6upGra0sbGxl+fkRKytKt7dl+/s9mJhZ3NwVNDQQKChi8/MWNzdOwcE7k5MFDAxMvb1Nvr4sbW0FDQ0WNjYdSEglW1tSzMxc5eU+mZkIExNk+Pg+mpoMHh5g7u4GEBAvdXULGhobQkJU0dE1g4NRycknYGBc4+MaQUEIFBRm/Pw5jY1a3t5QxsYiVFRa398DBwdLurpb4uIVNTVNv79W1dUxenpSysogTk4kWVkQJydKuLgoYmJJtbUiU1MhUlJb4eEDCAg0gIAlXFxX2NhDp6cIFRVV0tIoY2MmX18OIiJOwMATMDAGDg4kWlodR0ccRkYRKiph8PBY2tonYWFUz89d5+cmXV0PJCRi8vJd5uYXOTkECgoLHBw0gYEzfn4weHgNHx81hIQ5jIwucnI/nZ0/nJwgUFAzf39Grq4rampBoaFa4OBh7+89lpYqaWkeSkpDpqYuc3MJFhY8lJRTzc1Fq6sCBgYra2tY29sMHR0YOzs9l5c7kpITLy9HsLBQx8cRKSkZPj5LublMu7sXOjojV1dKtrY/m5ssbm43iYkKGRku7kkkAAAIMElEQVR4nO2b+X9MVxTAr4goFYqQIBFbEI0Sa9EQvVk0RI01lKghkVqipcQau9IQIhK0tZSgURS11FJUtVX70lali+5VXf6Gvvdm3j3nzjvzJPOh+UTv94d5J3c5+8xb8nmMaVTyYwrFI4xfpfL2QKF4iFT2r+ISAqqaQyApFBWex6q5heqPM4ukUFR0agTW1A+1nqhdp25QvfpYUigeAYJDGuiHho1CQsMahzfBkkLxCNC0mevYvEVESMsGsqRQVHhqR7RyS60j2zzpKSkUFZ16UW1dwlPh7dpHt5QlhaLC08H8te7YibHOXWRJoajodI1+urxdUCgeIt26l7cHCsXDpMcz5e2BQqFQKBQKhUKhUCgUiv83MeXtgELxEOnZKyK2WXk78QAJ7W0cnuWcx3lIEvFhD9auz/oCEuy0SLM2Y/YklnlHKejD+3idezDZsOCllrY8l9S3X3Kwj+74AuSFypBd1kpFf97oef04wOEIcOUCJImBg2y0DB5SOmtona0+O6SaWrRU0A4vczbMTNrH5qWWFi2YodzXyvhIGTvctteId9eGNeIpbnG4yMXwsn7vfehwn7GvaQXt8DJTug5n96klVY8R4b765CMPssOJd9c6NPN7wS3adDic7QJGjuqROvpFXRwT6Rw7rp0mRHEDfSwtfXxG6kvaOW7CRO2vSTxZ+5wcmdmo9QBpHTp7Tnk5IvCVqV40C+pMY+zV6WwGz9JqOjMsdUhPWYuwAbMAGps1O2TO3HnaqTh7uv7nxPnax4LemQs7L5J2JCYsjosduYRJs0JCngIicrTDtMbY0mXpYYs9aiWiJLMrIqL8g0yi2Ih1DGoJvlB1EyS4xhxSRObeFP5a5vIVSa/nkNZQjShrCCovIIFmImvIZ9E5JuS7aytXzcpd7ZELosPhbBcQuKZLnt/afG1r43UtayUU1Gas0LF+g8OhJ4Wl8TkbU/IG4A6fl/TGm2+FLsvH60DfptjNM7cs3OpFs+DtQFYjtSmbEp7PAhau2Za3YXsR1gI2YBaAsVr+O1rs3LVZG3tH/yXI0rNXHLU77924DCneRL4ueI9zNMOzIIGnCBE5rANre7P39VvRWK4VREllFyKi/INMQmzUOqgl+ELWTfCeY366NrYfRyT2pvDcA6sSDg7pQFpDNaKsAVReQALNVNbAZ+gcE/LdtT3Rxe/z8VIuGH1mG27WYAZjrXh7xmbyQ9plfGShPirOHGm8pkuADq9zWAtvEx8lrRP6eh+pwdhBnuNNs5tBfGXW9ih29ANt3bGBjCXrO0AL2JBm3cDY3kmM5R/nxs/RCcbqbtBm409qRVzKK+MdiR9qrdWFn8KzIIGnCBE5rANr1ZNO6/qkWklRWrILEVH+oasUERu9ztQMvpB1QzTM9oxI7E3hZ9j2j9jZ7aQ1VCPamgmVF5BAM5U18Bk6R0C9uzauDSuK/VjKBbPvcP26by/fpn3XkqbV3+9hVctKkEuADu9gPKw5N1VaJ/SFfKJ/Jn3qTbOJM+ez84e7xn/uXreEd8RawIY06waNXRiSqZ3jtFupmLUXWds5w7ShHpeKioqCYi/jHcZ1eH70ZTwLEniKEJEjfcLa8ivMckUpRWnJLkRE+edxHW7ERq8TtRS+kHVDoA53RyT26h1+dQdrGEVbgxrR1gREXkACzVTWwGfoHMD67lp+SO6iRdNGy7m4f4cP4nna54kr18LXnZIzlcbd1wfQ4ROvW70T+oJ4mn5YluhNs8m66Ze2ZBzfesO9bgAfir0CG9KsZexm9BfBhV8aDwvOHmE54V9pgtN1ZdcE73DdaR7uhGdBQp4CInJYB9YK9Dp41gpHackuRET559HhRmz0OlMzipyqGwJ1uDsisRd1OGUNakRbM6HyAhJoJrNm+ow6R0C8u3bTUOZfjHPBStvh2lnh1MiITVKmRFZuaWcy/BsueYf0pbq+ibneNJs0mRvYf8SE1Vl0h4MN+w6P/FqTLhiZX+CfNd94tLT69iSdM3iH0eEl0d/gWZDsOxzWgbXleh2sTwogSkt2ISLKP6rD6XWmZhQ5VTeEtcPFXtThlDWoEW3NhMoLSKCZzprpM3SOgHh3bcKx5OTkC3wPzgUrZYdXWtZcu5HgR/XRud96ZmVj9mk9Cv06/Jp2lvruWn1pndA3znU1leJNs0leaBz7vnt6Ed3hYMO+wzPWa1JDV+Y3X3caPt25ql9AVZGCTYwq0W6I9NzCLEj2HQ7rwNoPgUH6z4lUKylKS3YhIso/yCTERq8zNYMvZN0Q1g4Xe1GHU9agRrQ1EyovIIFmKmvgM3SODTFzbumH2YNd9/NOh2MylgAYgxr8GPFT8M2qISf0+eP8Ys7OlTgrh1ZdSbkRp3f4yrE/t+y4O6EIrwN9v0RkHNzj1O+rac0mXfltVpKawHBNQQvYsO/wG9EjDsb7u26ta2Ufq6Efi8cmHG8VHz4G70iM3tyv5sJe0ixI9h0O68DaudhpM3cWyLWCKKnsQkSUf5BJiI1aB5rBF7JuCGuHi72owylrUCPamgmVF5BAM5U18Bk6x4ZC/qt+GHGyxHgmqzGYIQmAMVTdKb81vvb7XWM+JteZHjoGZ4Vt25Xd/Q/jefiCeyHH/iyW1iEbd/tGJN3R70VozQLnX4ytP89wTZEWYcO+w2O6FcTeO3DV+J90SdLfrukT4w5n7mshGUustjEwduQ/8qyQ7Dsc1iFrOWHhfls8aiWiJLMLWSP8g0yieIl1oBn5QtUNYe1wsRd1OOmVqBFtTfhO5QUk0ExlDXwWnaNQKBQKhUKhUCj+a/4FRCbSu2eRA44AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.115;4.blob,1.1,8064.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;4.blob,1.1,6844.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.250;4.blob,1.1,5600.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.326;4.blob,1.1,8064.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;4.blob,1.1,1264.e3I87XzmzJmoqCi5k6GhofhlzpHgcDidnZ3u7u5SqRQAQKVS1dXV5XqRofzW4Qiam5mFhfPj4y3Xrq09fRovQaJQJNgTFwAmMGZXaWmpt7c3Njo1MzPr6upaNeRNK8NCoVB6cFotGItWxHkV0YrL5co9DkC5fv26s7NzbW1t5Rva2tqwu5mYzz///PHjxxQKpb+/v7y8PCEhQU1N7cMPPwQASKXSiIiIAwcOYAMEEomkqak50ih6TBDbOx6LiNuZwF6MkdoZzyeffIIgCH68MKrO3d3dZ86c2bZtm6en59GjRxWxRRHGc0+Op53T0tKch1BUVKRI3rKyMhqNhk113d3d0ZOK6m0ZGprY1xfT1kZWGrSJw3rLlqSBgUW7d5v5+CzOyNjU35+EILo2NpgAuq5BGbyepAj6+vodHR3l5eUBAQFhYWFPnjypqqrC1qXkZuPGxsYIgoSHh6OHW7ZsGRgY2L17t4+PT0ZGRn9/P4IgNjit0Pmn2nBaEecl1goFXehKT09fsWJFdHQ01lcbGBh0dHRUVVXFxMR4e3tnZGRIJBJbW1tFtLKzs+vt7b106ZK/v7+fn9/FixcFAgH9zRK1l5eXVCq9fPlyYGBgQEDAxYsXJRKJh4cH1jjYMxQul4t+t7KyGrYl58yZg18tI7aX2CJ0XWPlYLB6iduZ2F7idpbbG5qcnIy3aNSrAAD44IMPUG819EIABdY1xnpfjbquoYjOk8GcOXP4fH5+fr6/v39cXByTyRz22c3hw4eHt5qsohLHZrsOHiMBAACJ5JCWFtXcnCAS+RUU0CMjIxsb8Tsy3tprAABoNFpBQYFAIGhrazt16pSBgQGWROw1SCRSWlpac3OzSCQqKCiIjIxsbGzEPzknuLqj5iXQCishMzOTy+WKxeKamhr81aXT6RcuXOju7ubz+bdv3/b09MRnJNAKAODq6nr9+nX02XhhYaFcx+vq6nrlyhU2m93V1XXjxg3sIQgYvF8DAxugEnuNUe0lsAj1GnJgvfeo7UxsL0E7y3kNMplcXl7e2tqKPQkivgoAAB0dnZ6ennXr1g17Id7OaxDYO6rXUETnScLZ2bmkpKS3t5fL5Z46dWrYlemjR48ODAwoKcFNoZA/MYcOHWppaYE/AwXJycmpra2dai0gkCnC2dk5PT1dJpMlJCRMtS7TA21tbT6f/+mnn061IhDIFFFcXNze3r5r166pVmTaoKSkFBISgg818v8gs8T6huEaSQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.421;4.blob,1.1,3828.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,3.457;4.blob,1.1,3280.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.497;4.blob,1.1,8064.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;4.blob,1.1,632.lhZHR0d8rmPHjllaWlZVVVVVVSleD/KUVzby+PwmZF8FRewqco0UqQ0AgI2NzdmzZ/38/DZt2vTdd99du3attrZWnowtLS3Vw5Bz2TM9PV1XVzcnJycwMDAmJubUqVMFBQUPHjyQEjty5Ij0Q0VEMjmGyXR/ffwAAAAEgnNKSmRbWxyfT83Pp0RERLS24lfw0HlO0utzffIw4uNOWOdOIBBSUlLa2tr4fH5+fn5ERERrayt+Nczd3b2wsBBdLSkqKlq4cOEwxwlHjx7t7u4WiUR1dXXYb0LqmTIikVhRUdHR0YFNf1MolNzc3L6+Pi6XW1pa6uPjI6VZX1+fw+GsXbt2xHKNOs+pPlJdySgvfmavtbUVnTpLTk7Gxsny+AzkWN+TugqK2/3T10iR2qDRaPfu3UtNTWWxWHw+Pzc319jYeMTLoXRcXV3LysoEAkF3d/epU6fwy0sYx44dGxoaUlGZyMda3mMOHz7c3t4Oq+/dhEajVVdXT7QXbyQnJ6e+vh5M7DNl7yOurq5UKnXHjh0JCQkyprAgkBHR09Pz9/f//PPPJ9qR95CSkpLOzs5du3ZNtCOQN/Iu93sqKiohISHoU+z/D1zEoqtsYJNOAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.592;4.blob,1.1,5672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,960.iVBORw0KGgoAAAANSUhEUgAAAJUAAAAMCAMAAABcFQ/2AAABYlBMVEUgICD///+NjY0AAAAnJyejo6Pn5+etra04ODjGxsb39/fe3t5wcHAHBwc8PDxWVlZERET6+vq8vLxgYGAuLi4bGxv09PS5ublOTk6JiYltbW2FhYXX19cNDQ3u7u6QkJCKiorp6ekICAifn5/r6+sDAwNra2vs7OwBAQGrq6tFRUUxMTFkZGTz8/MODg6qqqq1tbWWlpb4+PjIyMikpKQkJCRNTU3T09PR0dH9/f2ysrJpaWn19fWhoaHb29tGRkZQUFBDQ0MrKyvf39/JyckCAgJzc3P8/PwVFRVBQUESEhLl5eWzs7O/v7/h4eGUlJQvLy89PT1ycnL7+/uTk5MiIiJTU1OwsLAwMDA2NjYsLCwKCgqSkpLj4+MEBASDg4MTExOAgIDy8vJ8fHyMjIwUFBTKyspvb29LS0t5eXnDw8MGBgb5+fkXFxf+/v4oKCi2traBgYE7OzvS0tJ7e3sJCQk7fvYAAAABKElEQVQ4jWNgYIQAJmYUwMLKxs5Mf8DBycXNw8zMwMsHAvyMAiiyAoJCwiL0d5SomLiEJKMUMwOEKy2DIisrJ09/JwGBgqISM7OyiirEVUoqUiiyauq8zBoD4CohTSChxagNcZWOrh6KrL6Boa6RshLdXWVsAiRMGc0grjI3RJW1sLQSsLaxpburWO2AMWTP6AB2lSOjE6qss4srM7Obuwe9XeXJKOnl6M0oAHaVjy+arJ8/kAhgDKS3q5iDghnFQhhDQa4ytQxDkzQOBxIRjJF0dxWzV1S0NZsGyFUxsXFocvFiCcAY5NLDpo/WIME5EVRe6SUlw0RSGCH5LpUtzSHdRpL+TtLLyPTLyga5iicnFyYonwcNtfwCXcVCV/q7qoiruKSUmRkANzY1EPsHF9gAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492292966;4.rect,1.1,2.40,2.44,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.22,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,1.2,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,1.6,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,1.6,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,1.0,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,2.99,2.29,3.201;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.101,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,2.98,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.38,3.116,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,2.98,2.98,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.96,2.38,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.98,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.98,3.438,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.118,2.10,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.120,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.291,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.138,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.155,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.183,1.4,2.44;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.215,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.193,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.174,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.185,1.8,2.96;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.177,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.173,1.8,3.108;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.267,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.291,1.8,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.215,2.49,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.209,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.269,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.270,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.269,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.269,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.272,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.269,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.269,2.67,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.212,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.272,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.267,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.269,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.269,3.178,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.291,2.10,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.309,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.326,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.386,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.364,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.348,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.348,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.386,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.440,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.443,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.443,2.27,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.386,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.381,1.8,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.383,2.29,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.440,2.28,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.438,2.79,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.438,2.58,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.443,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.443,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.440,2.48,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.443,2.18,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.383,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.383,2.87,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.383,2.39,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.383,2.38,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.386,2.18,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.386,2.28,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.440,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.441,2.69,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.459,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.462,1.9,2.70;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.480,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.497,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.557,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.535,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.519,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.614,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.611,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.612,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.552,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.557,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.557,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.555,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.614,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.614,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.628,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.614,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.611,3.128,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.611,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.554,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.557,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.554,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.557,2.18,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.554,2.88,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.611,2.38,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.611,2.39,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.614,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.611,2.48,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.611,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.609,2.69,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.630,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.0;4.blob,1.1,5336.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.43;4.blob,1.1,4668.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.98;4.blob,1.1,7708.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.155;4.blob,1.1,4080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.193;4.blob,1.1,8064.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;4.blob,1.1,7408.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.326;4.blob,1.1,3864.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,3.364;4.blob,1.1,2220.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.385;4.blob,1.1,7664.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.497;4.blob,1.1,3996.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.535;4.blob,1.1,3080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.556;4.blob,1.1,8064.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;4.blob,1.1,896.Tng22RdvBjU//2wTHT0kkTS//D/ReOHCtKVL5+/ePd3Xd2FKilNSEgBAIXluc3Nzra2ts7Ky/P396XT6Tz/9xOfzb9y4ga9TUlJiaWm5b98+Dw8PBoOBHZ0uXLiwdOnS3bt3+/r6pqSkoCcY1McT1at6RqHDsra2VuZAgZ0pNTU1VVZWRv+2tbVFS1NTUzU1NbOzs1esWMFgMI4dO4Zvu3fvXhqNVlJSEhER4ePjk5KS0tDQYG9vj5YmJCRMnz794sWLvr6+kZGR6enpeXl5BI+f8qOST35Uk/gaWVlZpaen+/j4bN68+fvvvy8oKKisrCTSsKGhoWwEhXwtfO5co5IS+ccf3b29TbZutTt2bAm+FLsCwdRUXVmZjP5tazuFSCnm0KFDIy8LAwAAMpUayWa7vjzPAQAAEskxMTG8qSlGIKDn5FiGhYU1NuK/4UTP31JG9kiAq6sreiKkp6cnPz9f5o0ZAEAikVJTU7u6usRi8ePHj7H/GxKJlJiY2NTUJBAIcnJywsLCGhsb8WdT0PO3o+znWD2j0MuG/vrXv8q0GvVSO/zEycPD4+HDhxKJpKqqKjo6Wub6IUtLy6ysrN7eXh6PV1xc7OXlhe988eLFJSUlQqGQzWb/+OOP6FfVMkY9fysnKvyZ0sbGxv379wMAEhISsCPkmFFNxGs0ZlRMJrOioiI5OZnD4QgEgqysLH19/ZHPhsIxmZ6VlS/O9M6YoYkgcUFBFtiaNWtm1tSsE4li799fu27dLPz5W/wVfNgjM9OHSCnm8OHDUqkUm0ZB0NuIyWSWlZVNdhSTIDMzs6amBluEGWsh6G2hra3t6+v797//HVsDD6MQ9Lbg8/kbN27MysrC1vw/9RNSGLmG+kkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.649;4.blob,1.1,1104.iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAMCAMAAACk9fQBAAABjFBMVEUAAAA4ODjGxsb39/fe3t5wcHAnJyejo6Pn5+etra0DAwNPT0+2trYKCgoICAiBgYHl5eX29vbQ0NBbW1sbGxv09PS5ublOTk6JiYn///9tbW1ERET6+vq8vLxgYGAuLi4WFhbk5OQMDAykpKTu7u5GRkaPj4+Kiorp6emfn5/r6+sNDQ2QkJB8fHx+fn4XFxdqamrLy8u0tLSrq6tFRUUxMTFra2vs7OwHBwcBAQEODg5kZGQUFBQFBQXBwcHIyMgkJCRNTU2qqqq1tbWWlpbz8/P4+Pj9/f1MTEzb29tQUFDR0dGysrJpaWn19fWhoaF3d3dBQUESEhJDQ0Pf39/JyckCAgJzc3P8/PwVFRWXl5dycnL7+/uTk5MiIiLh4eGUlJQvLy89PT24uLjOzs4sLCywsLAwMDA2NjYYGBjt7e0TExOAgICDg4NhYWG3t7fMzMxLS0t5eXnDw8MGBgaMjIzKyspvb2+pqamNjY07OzvS0tJ7e3sJCQn+/v4EBAQoKCgLCwuHh4dRUVFAC4cRAAABaUlEQVQ4jcWU2VcBYRiH30Jkb5nyEi0IpWhRSNEipaiQ9rQvtGjf93+8b0ya4b6v5+I3z5m5ec43ZwagolIklgALbwKqpLLq8nt/h1yhVLFXtUZbU1tHpJ5paNShvsQEGJqMpmZacS2aVsQ21swWvbUdFQA2uxrA0SEXGk+nxUmrjWASd3UX8lzoJtvTC2DsI9KPHqHxDAx6wUctz++DoUKePDBMdkQJEDQTCeGo0HjGxifCkw41tcCfPILXJYlMAUinyelYMSo0npnIrCEWn/uHPAZxnlwWUJdIatEgNJ7UYhpgaXmFfp4nuRphT2ptHZkN3CyxXzJbZLZxh34eYXeP3cS+KibzlVqR4AGZQzyinHdsCpC1Zbl7udQJlBvHKZMjL1fkp5wXwjOy53ky/ovLzNU1lBjcIPe1BmS30bu4jlpd8eXeZ93Wh8JP5FH09PxSeMQbOF/fOHlXhu2aNPW8j88Uk/8C+AbWwEHUfLQKlwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492293156;4.rect,1.1,2.70,1.1,3.679,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.22,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,2.20,3.367,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.43,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.60,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.120,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.98,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.82,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,2.82,1.9,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,2.79,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.120,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.115,2.16,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.117,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.175,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.120,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.120,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.120,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.120,1.9,3.240;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.120,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.117,3.128,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.115,2.18,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.117,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.117,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.117,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.121,2.18,2.65;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.117,2.88,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.117,2.38,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.117,2.38,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.117,2.18,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.117,2.49,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.174,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.174,2.79,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.196,2.10,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.253,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.214,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.231,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.291,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.269,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.253,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.249,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.291,1.8,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.291,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.297,1.8,2.60;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.291,1.8,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.291,1.8,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.345,1.8,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.348,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.291,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.291,2.29,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.288,2.19,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.291,2.29,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.288,2.18,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.286,2.89,2.74;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.288,2.29,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.288,2.19,3.243;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.286,2.58,3.242;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.343,2.38,3.185;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.343,2.28,3.185;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.345,2.38,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.348,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.348,2.38,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.365,2.49,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.364,2.65,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.402,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.404,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.402,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.459,3.217,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.519,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.514,3.448,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.535,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.538,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.535,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.535,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.573,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.592,2.40,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.595,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.595,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.633,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.631,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.630,3.108,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.633,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.630,2.46,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.3;4.blob,1.1,4300.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.60;4.blob,1.1,4012.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,2.98;4.blob,1.1,3080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.119;4.blob,1.1,8064.iVBORw0KGgoAAAANSUhEUgAAASkAAABZCAIAAADtrkWgAAAABmJLR0QA/wD/AP+gvaeTAAAZFklEQVR4nO3daVwT19oA8JMEwiYEVDZBEAjgCyIKAmrBBUHKYhEpVDYBQaNoq7XldSm4XGrrerVVbqu9LhdT7bWAaCmyi0Jd2ayKyC4EiCQsIWQFMu+HkTGyhESC6Ov5//KBmbPMMxnHmTmTeQYAqblSqR5XrkhfH4IgCRSkrypksUS9veMXCgR9UPCj1jANCJj95ZdEEknIYgm7uhRUVGZGRxuvWPEWgoOg/8dwo9awi4uzjY3FEwg9TU2ivj5VfX2ihsbfR4/e27nzLcQHQR80HIFgsGxZNI8X1dNj7OOjoKY20RFB0HuPIFUtBJm3bx+PTu/j8QCCNGZkjHNUEAQBAACwolDWCYUkCwt9FxeKSGTs4zPREUHQe0+q456GmRmrqqouObmnsVHd2Li7pqarsnK8I4MgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIKgcaQ4adL8Q4dCnj+P4nC8s7Imz5ol3/7nHz4c8OiRfPuEoLdg9GeIxoKgpOSdlYUgyJPExN6eHiMvL3JQUIq9fU9jo7wWoaSlRSSR2A0N8uoQ5Z6cPMnQ8Mr8+fLtFoIwoz87i3mDnBE2W7YIWKzc1atttmzxTE/nNDc/PHLE7ptvZAxSEkFnp9x3PAh6tzgnJi45d076+jg8PpRGUzM0dKVS3S9fNg8N/eTmTQU1teD6erSCK5XqlZk5/9Ch8La2KA5neUqKiq6ueA+zNm9eJxBoWVt7Xb8exeGs6+018vZGi6w2bKAgCPpZQ6eLt1KaPDmaz5/1+efiM4NqahadPo1NmoeErCoujurpCW1uXnTqlPKUKVhRKI2G9Yx9xLuaZGTkfvnyWjY7oqNjydmzRE1N6b8TCMKMnq/FNCBgkqFh5dmzQhZLJBQqqKiQQ0J4L148/+MPyQ2n2tuzGxr4DIaRp+evxsYkc3Meg9HH4QAcjqCk1C8QAACme3j0CwR5oaEkMnn+kSPLLl5MX7ZMvBM8keidnf0kMfHh0aNKmprMkhJ0fkNaWsfjxwAAqw0bDN3cxJsIOjrqr1wxDwl5fOIEOkfH0VHDzCw/NBRbo6VJSaUJCfe2b1fV17eLi3P99deMjz9GS7P8/AhKSg4JCSo6OrcolEErpaytvfL2bUFHR0FkJJFEcty/X1VfP8PTc9SvEYIGGX3f07S0tI2NdUhIQHNGhISFoTkjRt33tGbO7Kqs1LS07Kyo6O3pUdHR4be1AQB6u7tx+Jfnuuz6+pyAAJFQSMvOFvX2Ljp9eurcucyyMvF+7u/cWZWUNKhzLp3OpdMBAMM+TFh55oxPTg6JTGbV1AAAyEFBnRUVL+7eRUuZJSVXnJwYxcUAAIKSEg6HW5qUpDxlCr+9HQDAePAAAMBvb1dQUaEXFQ3qec7//i9RQyN13jx06ez6ep+8vKl2dszS0lG/SQgSN/r1Xum3356fPDnT11d9xgwNE5OCiIhzWlrSJGtRnjqV29KioqfHZzIBACo6Ory2NoDDEZSV+3g8tA6/o0MkFKJ/1yUnAwCmzp07qJ+633+XaZUAAM15eeyGBnJICAAAh8ebBgY+Eztb7q6rUzM09Lt7dy2bHc3nL01KAgAoqqtL07ORtzctN1fQ1UVQViYoK7+4c6ePx9OFQzKQ7KQaa0H6+y3Cw5vz8jqfPtVftKiPw5GmVR+fr6Cq2tvdPdnGRt3YmBwSoqiubhEW1v7w4bD1BZ2dIqFQRU9v8NJfv9ySCoI8O3fOPCQEAKC/eLGKtrb4kdPIy8sjNbW7ri539epUR8c7X38tfcequromfn7RPB76ieJyFVRUJk2fLnOE0AdPqvycVhQKefXqy7NmqerqfnLzZuutW8/T00dtxaquNgsMvLdrFwBgdXV1YUzMRz/+CESiVCenYesraWnhiUTeixcyrcBInp0/b79nj46jIzkoqPHPP3ltbViRdUwMs6wsLzgYnVQzMJC+WyGL1ZyfX37woPhM7uuDPRAkDan2PUFnZ/mBA6yqKlZV1bPz5/GKitK0ohcVTbax0XFw+N3WlqihwW1tbfzzT1FvL3oKiiJqaODweEQkAgCYrFoFAGAMjKaMUU9jIy0nxzIiwtTf/0ZEhHgRjkAQdndjk8Pe7he0t0+xtR06vykra7qnZ1dlZW9PDzpHzcCA09wsl5ihD4pU+Vo6nzxpuXED/bvh6lUpk7UgfX29LNaS8+dBf3+/UDhl9mwdJ6fWmzexCiarVk1bskRz5kwhi2Xg5vbR8eOtt249PHwYq6Dj6Gjk5VW6fz/S1zeoc1U9vSlz5kwyMjJwddW0tKTfvj3JyEhBVVV8x+4XCBwSEno5nKKYGHT3RilqaMyKiREJhYpqalYbNszdtQuHwz3997/5DAZWR0lLa2ZUFAAAh8frOTtzW1r6uFwAQNv9+7O3bjUNCOjjcFR0da02bnS7dKkhLU38uApB7wRycLB/aWk0jxfW2jr39REaVyr107Iyh4SEcCYzistdnpKirK0tXmHW5s0UBCEoKw/tVvz+HvZxT04Wr4MnEsMZDKfXzw8BAACHs4uPD2lsjOJyvTIyyMHBwQ0N2J1DrM6Co0cj2tvXCQSfPX062cYGKyGRyctTUiK7utay2Z8UFBi8flMEgt4DrlTqquLiiY4CgiaGDL8pgyBIjuC+B0EQBEEQBEEQBH14VHR0vDIyPNLSJjqQsbKMjFz97JmBq+tEBwK9ReOdM2JcfXzt2uqqKt0FC7A5wQ0NgY8fA9yr5/2j+Xy7uLixL2vp+fOflpePvZ9hqRkYuF64EMliKU+dOk6LgGQ1vuOcBCUlz/R0bQeHO199le3v3/Xs2YobNyYZGYnXcU9O9ht4uuedoqqnZ+zj8yA+/sWdO+LztaytTf39sUkcbnzzbsgFp7n51vr1CsrKZoGBEx0L9NJ7nzNi/GhZWQEcbtgf0NnFxb069L0P+x4AoI/H666vnzx79kQHAr0kw74nZLEEXV3S18fh8bO++KJo06YFR49yW1tvREQYeXk9PnnScPlytAKancHU31/HyWlQdgb9xYspCGIRFibe4crbt7GUZKPmmxh7ZgcFVVUAAPp8vbj28vIptrYzPvlkYD1f7XsuP/8cVFODTWrPm0dBkGlLlgAADNzcKAjikJCwls32u3fPMiIinMEIbWqatnSpeOe2sbFr6PQoLtfj6lW1adOkXyMJ+TUw/Xy+Inxf9ztj9H3PNCBg9pdfEkkkIYsl7OpSUFGZGR1tvGLFqA3Fc0YUrF3b+eSJeM4IAECWn99VF5eWgoLOioqrLi7oB23bevMmo6TEKiYG603Lykp3wYJHP/yAzZnu4UGytMwLDb0bGzvd03PZxYtYEZrZQXPmzILIyLuxsUZeXm6XLkn/paBwBAIAAOnvHzS/7cGDxowM7BpPpnNOBVXVWxSKtr29zdat+aGhnObmefv2YaVTbG0N3d0LoqIKN27Ud3Z2F3toWJo1QvNrtBYWZvr65gUFMYc8EYKIROhKQe+CicwZITk7w6Njx1ypVCyFxMzoaD6TWU2lYhUk5JuQS2YHdRMTUV8fp6VlcAGClOzb53fvnpGXV2NGhkznnH8fO8ah0Zy+/77h6tWmrCwdJyf0aQkUt7U1c8UK9Ejb2929PDVVd8EC9GpTyjUaNr8GhkOjqZuYSB8tNK4mOGeEBLWXL3Oam603bQIA4IlEi7Cwp6dP9/P5WAUJ+SbGmNmBoKSk5+w8e9u2qqSkoQ/pIwjSdv9+U2amXXw8eKOxFgRBAIKAIQciXlsbdorbmJEBEETWNZKcX+PpL7/oOjlZx8QoTZ4sa8yQ3L1DOSMGEfX2Pj5xghwURNTUNFm5kkgiPUlMHKnyoHwTY8zsYPPll76FhZympqJNm4YpRhAAQMm+fbrz5xu6u4/TWEu/QCDs7laVcY0k59d4/scf9+PinBMTV+Tnj0fMkEzeoZwRQ1WcOmUfH28ZHm7k7V2XnDzM6d+AQfkmxpjZoZpK5TMYTgcOOH733Z1t2wYXIwgA4MXdu7TsbPTQ96qkr0/Kh/pHhScSiRoaXDmtEcrA1XXe3r0PjxypvXxZLkFCYzHBOSPAyNkZAADCrq7Kc+dstmyZZGycJnaDGyUh38QYMztwaLTKM2eIGhpOhw6V7N0rnmACiB1bivftW/nXX681bGlR0dVVUFVFH3JXMzSUcoko5alT8UQieiI9w9cX4HBMOa0RavZXXzFLS+/GxsrUChonUp1z1l6+/GD3bvTvgrVr66W7y9fP5z/45hvPjIzZW7dqWVvPWLnSZNWqQTseAIBeVEQik+337Jm2dKl5aOigH148On58krFx2/37bffvD2pIMjdfdvGiobv7/6xf/9EPPzTn5rYP/C7kwe7diqqqvkVFFmFhhu7u8w8fDq6vF3/2XBqsmhq8goKqvv7ggoF978Xt2825ueIlDWlpeAUFl59+MnBzs9q4cdHPP8u0RLVp0z6+dm26p6fFmjWLTp2iFxVhOUXlskZq06Z119bK1AQaP1Id995YxalTQjbb9uuv7eLiBF1dj3/8cWidKip1ypw5Nl98YbdrV3ddXfvDh+L7J7+9vY/DeXT8+NCG7eXlrOrqZZcuKaiqNl2/fmvDhletGIy0hQudDh786MQJHIHALCnJ8PTskPF1RejdBZyCpK+oeN8+A7Gs2J0VFTmBgY7ffWf22WedFRV/bdni9ttv0i+xOT+/9datpefPK6qr03JyCuW9RnhFRdGQzDcQNLz5hw6FNjXhh+wAbyHfxBRbWwqCvLqH/p7DKypGslgO33470YFAL43vcW8stB0cjLy8Zm/bdotCmZD/rdv//ptVXT1n505mebkcX1o2IRQnTZq7axdRXb1WluMw9IFakZ+/hk6fs2PHsKVvJ8+S9rx5oU1NPq9f1L2PrCiUdb29Vhs3TnQgECQ1vKLiMMMt7xsiiST+njMIgiAIgiAIgiCZzdm+PfDx44mOAoLeA3LOGWERFlZ14YJ8+4SgD92oOSOm2tmt7++X6XV2EPTBkuHeupDFEvX2SqhgsWZNy40b8GV0ECQNueWMwCsokIOCJDw0DUGQbOzi4iJZrKiens+ePg149CicyVwnFDp9//2gakbe3lE9PQowFQ8EyRGOQDBYtiyax4vq6TH28Rl2B3P7739d4SgLBElNPjkjiCTSjE8+gSecECRnVhTKOqGQZGGh7+JCEYmMfXwGVZgZHR1Ko6HZxyAIkoZ8ckZYrFlTc/Eimr4BgqC3RN3EhCISvV8vOYGgCSeHs0Tz0FBmeXkH/CkZBL1lgRUVNlu3TnQUEARBEARBEARBEARBEARBEARBE+rkyZMIgiAIIhKJGhsbz5w5YyjjK01GsmHDBmQA/fVXCIkXDaKsrCxe8/Dhw49kTAUPycuGDVYD7yan0OlrZCp9/yQnJ98deB/I2+n55MmTNBrN2dnZxcUlPDy8qqqqpqZGXV197EvU09NzdnZ2dnamUqmD9j2syNnZua2t7T//+Q82OejdmlpaWjNmzBh7MDIZv63wftHTU3V21nN21qNSXYfuXZJLh3p3c8JPID6fX1RUBAAoLCwsKiqqrq6Ojo4+duzYGLul0+noLucz5MfoWBEAQCgUNjU1FQ15CTaqs7Ozs7NzjJFAb4ZO59LpXACAj4+xrKUYDQ0NAEB3dzdeafLkaD5/1uefixcH1dQsOn0amzQPCVlVXBzV0xPa3Lzo1KlBGY5nbd68TiDQsrb2un49isNZ19tr5O0t5crY2Nikp6e3t7e3tbWlpKRYWFhgRTQaDUEQf39/Jycn7ARMvG1ISEhxcXFPT09zc/OpU6emvB7V5s2bBQKBtbX19evXORxOb2+v90BUo/Ysrra2tqWlxczMDJtjZGR0+fJlNpvd0dFx9uxZTU1N6aN6YxLOV93c3BAESUhIYLPZ9+7di4iIYDAYTU1NS5culTLm8dgKo0ZFpVIzMzMPHTrU1tbG4XBSUlJ0dXXl8l1JRqW6Xr3q4es7o6IikMOJ+uuvlXPnvnrt3M8/u9TUBGGT8+ZpIwhlyZJp8lq6mppaXV3d8+fPNTU18YKOjvorV8xDQrBiHUdHDTOzZ2fPopOmAQFLk5Ia09MzfX3vbd+uv3ix66+/DuoRTyR6Z2e3FhZm+vrmBQVhb2yUbOrUqTdu3CASieHh4Zs2bTIzM8vNzSWRSGipn5+fi4tLQUFBRUWFywCsbUBAQFJSUnp6uq+v7/bt2xcvXvzrkKiIRGJ2dnZhYaGvr29QUFDJQFSSex6ERCLp6Oi0DLzyVltb+/bt2zNnzoyMjIyNjfXy8rp06ZJMUb2ZtLQ0NM6ROlRVVaVQKPb29lu3bg0NDW1ubt63b580MY/rVpAQFQDAw8PD0tIyNDQ0NjbW09Pz4sWLUn4bioqKykPgpX6Ebf583e3b53zzzYPw8BskEjE1dbmSEmH0ZvLQ19fHYDCYTGYvmvrIwM2NgiAkMhktXnjsWOCTJ1htDVNT7Xnz0L8JSkoWYWEUBBE/9M3avJmCIBZrZL64/PjjjxEEsbKyQifNzc3T09MdHBzE64x0pWFqajpvIColJaWwsDAEQcQPMps3b0YQZM3IUUm43qutrUU3p7W1dXZ2NovFwoZbDh8+3N3drTfwGnRXV1cEQezs7KSMCnXgwAH6yK9rptFo3478pq6hbdEjDBrh8+fP0X/cu3fvfv78uTQxj9NWGDUqKpVaV1dHJBLRyXXr1iEIMnfu3JFWXByVSh06KPXpp59K19b1xYs16uovn4NzdzdEEIqLy8tXbkh53DtwwEnCFZ3kUgweANCcl8duaCCHhAAAcHi8aWDgs3PnsBrddXVqhoZ+d++uZbOj+fylSUkAAMUhYw91v/8+6sIGKSkpYTKZJ06cWLFihYaGRnV1tY+Pz4MHD6RpW1dXZ2hoePfuXTabzefzk5KSAABDR0R+lz0qAICpqSmPx+PxeI8fPzYxMXF3d6fRaGiRt7d3bm5uV1cXunPeuXOHx+PNnz9fpqjGD3ZOKBKJCASCNDG/ha0wbFQAgI6ODqFQiP6dnJwMAJBy34uPj3cYIi8vT5q2AIDWVi6b/TLjXm1tNwBAW1tZYotxgQcAAAR5du4cetqpv3ixira2ePYHIy8vj9TU7rq63NWrUx0d73z99bAdSbhkGgmDwViwYAGNRktKSmIymdnZ2QuGvFR9JF5eXqmpqXV1datXr3Z0dPxaflEBAGg0Gro5b968yWAw7ou9blpXV9fPz483gMvlqqioTJ8+Xaao3jLJMb+FrSCNzs5OoVCIHZwlo9Foj4dgsVhvsFyRCAEA4PG4UWvK3ctxzmfnz9vv2aPj6EgOCmr8809eWxtWwzomhllWlhccjE7KN/VtTU1NeHg4gUBwdHTcsWNHfn7+nDlznj17NmrDmJiYsrKy4IGoDOQalUAgKC4uBgDs378/Ozt78eLFN2/eRItYLFZ+fv7BgwfF62MngeMa1RuTHDN4N7aClpYWkUh88eKFNJXPnTsXIjZCgQoICEAPnmPR14coKr6l1Ccv972exkZaTo5lRISpv/+NiAjxGjgCQdjdjU3K8fn07du3BwcH29nZ9ff337lzJyoqisFgLFy4UHyrt7e329raDm1LIBC6xaKaJXtUI/UsLicnp6ysbMeOHdi+l5WV5enpWVlZ2dPTg84xMDBoHkgHPPaoxoPkmCdwK2hoaODxeJFIBABYtWoVAKBEulG6+Pj448ePD5pZW1sr09KH1dLC0dVVUVVV4HL7AACGhuOY8/LV/b3KM2dcL1wQdHY2Xb8uXqPh2jWXxMS5O3cyS0sN3Nxmb9sGAJBLHs7MzMy9e/empKT88ssvCIKsW7eOw+EUFhaK1ykqKlq/fv2ePXtu3bplYGCQmZnJZDIBANeuXUtMTNy5c2dpaambm9u2bdsAAGqyRDVSz4McPHjwt99+s7W1ffjwIQBg9+7d/v7+RUVFR48epdPpy5cv37Jli729PfpbE8lR6enpkclkAIChoaGioqKzszMAgMlkVlZW;4.blob,1.1,600.jhrtWNpKjnkCt4K5ufnFixfPnDljYmLyz3/+Mzc3t7y8XJqG9fX19fX1Ui5FJmlpDf/4h8NPP7lcuFBlbk7as2eeeKmeniqZrAEAMDRUU1TEOzvrAQCYTH5lZdeopZgjR4589dVXKioqr2bhicRwBsPp9TMTAADA4ezi40MaG6O4XK+MDHJwcHBDg/gdPHSck6D8JlerTk5OWVlZTCazs7MzJydn4cKFQxaOO3r0aHt7u0AgePr0qY2NDTY/Pj6+sbGRy+VmZGQEBwc3NDR4i0WFjnMqjxzVSD2fPHmypqYGq0YgEGpqasQH5clkckpKSldXF5vNLigoWLZsmXifEqIa9odjQ0+Thh3nlNBWfESxoaFh7969AIC4uDhsfEhyzOO0FUaNikqllpWVJSQkMJlMLpebkpKira090saSIyrVtbz81YjojBnqCEL59FNTbM6qVSaVlZ/x+dGlpf6ffWYmPs4p/qsx7JOc7C5NKeb48eMikUhBAf6sBZogVCoVvaj+0CQnJ6NnKzCjJgS9PSQSycPD41//+heAv+eEoLeJw+FERkampKQAAP4P44b2/xb9HswAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.231;4.blob,1.1,5496.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.288;4.blob,1.1,8064.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;4.blob,1.1,2888.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.420;4.blob,1.1,7120.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.478;4.blob,1.1,8064.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;4.blob,1.1,1616.E+xZ+X/+85+goKADBw4MDw9XyiOygOlP4Xk8HvZ/nTzsyqFDhyYnJ48fPx4cHJybmzsxMQEhXL9+PTH/VatWYaZVKDcvL29ycrKsrCw0NDQ1NZXP598iRKBB50yj0QYGBurr68PDwxMSElpbW1taWogPGPF1zevXrxeLxcXFxXjOTk5OPB6voqIiMjJy165d9+7da21txa8QaH3RqVZWVgMDAy0tLSkpKUFBQbm5uaOjox7yeBMKK1uxxztx02NGYE+0cnJytm/fnpycrNDJmpiYcLlcgUCgsDTHyclJKpXeuHEjJCSEyWRi6+GIKzQQUqHLJb5ycunSJQghcfYAXRuvvvqqVCq9evVqWFgYg8G4cuXK8PAw/rWEhfI6jLq6OsTcGgDA3d1d6WNJhBXU6ku0vo2NDYRw9+7d2Karq6tUKr1+/XpwcDC2Wom45sTJyQlCiE3aUqlUsVhMzArtz25ubuPj499//31gYOChQ4f6+vqUPgZUenuO1ggtMzpnDLQVVD0GPOR2aDJz8vhrx4Ptg3M35U4cmICZcL3llPWJr5zw0njY/3UWcp9c9qp0n/Rq8NUwhzCGA+NK8JXhjGEX8ymNrIysBpgDLXEtKWtSglYG5W7KHd0/6rFUMfwYwjcAAJ9//jla61nAYrGam5s//vhjLpcrkUiKioqIz6aIa1dxCuVhV/T09LKzs589eyaRSEpLS/fs2fP06VOFRwEWFhZDQ0O7du1SKDcvL6+qqurEiRP9/f3YuuYVK1bgqWpzdnBwKC0tHR4e7u3t/eabb4gyK7xygq3z/dOf/oTvcXd3v3btmkAgEAqFCoua0fqiUwEALi4uRUVFQqFQJBLdvHkzgBBmhkzXrKend/r0aR6PJ5PJHj58qNCBIpbmBAQE3L17F1vX/N5770EIiQ/6EFKhy8Vf1B4cHKyqqmIwGMSz1NaGr68v9nRIIBBUVlYSh5AL5XUYH3zwQXt7u9IkjCNHjvT09Ch9EoCwAlpfRNcMANiyZUttba1UKuVwOF999ZXCqJzH473zzjvY/5qamm+//ZaYivBnAEBsbGxbW9vIyMivv/66a9cu8l0zWiO1MqvtmtFWUNU16wG97A3Zz5KeSTIkpYzSPS57nu55ir/GTXxRG/8VBhF8crlveVg5l8kV7BVUhlfiQ2YMF3OXoh1Fwr1CUbroZuTNADsl4ccQvgEA+PLLLycnJ/GbCY1gsViN2gycc+rUqefPn8+PrDpUQGwVBw8enJycnO3rEi+YhfU6W1vb0dFRxGxDY2Njdna21qTTAQAJK7ycoH2jsLCwra1tfkrSXiPx9vbOyckZHx/PyMjQRv46MPz8/Pr6+t555x1/f/8jR47w+fxz584ttFBqWHCvO336dE1NjZ6ekg9ORkdHd3d3z9frtjoQIKzwcoL2DXNzc5FIhN/faIr2Gkl1dXVfX9+x6UG1dWiD9PT05ubmkZGRJ0+efPLJJy9gZY+GLLjXmZiYNDU1ffLJJwr7XV1de3p6goKCtCGbDgVUWeHlRK1vGBgYxMXF/T+60ujQ8TJCo9FOnDihsNPf33/mexM6tIdSK7ycvGDf+D+PEARtz1O3CAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.533;4.blob,1.1,8064.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;4.blob,1.1,2548.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.590;4.blob,1.1,3272.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,3.609;4.blob,1.1,7072.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.628;4.blob,1.1,492.iVBORw0KGgoAAAANSUhEUgAAAA8AAAASCAMAAACzQHQ9AAAAq1BMVEUYGBgLCwsAAABUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb0ODg5ISEj///8XFxfs7Ozv7+8QEBBWVlYHBwfX19fb29vo6Oh/f3+VlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTGMjIwICAhvb2/m5uYCAgKQkJD+/v4EBATMzMx9fX2srKzY2NhQUFDl5eXz8/Nubm4pKSlFRUUBAQFCQkJLS0vD44LFAAAAgElEQVQYlVXQyRKCMBAE0Mkg4haDoLjvCiLu+/9/mWORVNlze9XdlyFS/H/kVXwwVwN0rd4Ac7PloPXPbROWVJ0oFmvTLd1L+krMgyHsORmhxxP0dAaeL5bglVlbbMxWnGY763xfiA9HVz6dpX+5akv/dmd6ZE8XF96L6f2Bf3wBa5IIkwN3jD4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.649;4.blob,1.1,1220.iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAPCAMAAAAiYYavAAABsFBMVEUAAAADAwNPT0+2trYKCgoICAiBgYHl5eX29vbQ0NBbW1snJyejo6Pn5+etra0iIiKsrKzr6+vq6uqoqKggICAWFhbk5OT///8MDAykpKTu7u5tbW1GRkaPj49ERET6+vq8vLxgYGAuLi7a2trX19dVVVVYWFjb29ve3t58fHx+fn4XFxdqamrLy8u0tLQNDQ2QkJA8PDw9PT1JSUkODg4BAQFkZGQUFBQFBQXBwcFra2vs7OwHBwdHR0ctLS0rKytLS0twcHD9/f1MTEyqqqq1tbWWlpbz8/P4+Pifn5/d3d0fHx/c3Nz09PR3d3fR0dGysrJpaWn19fWhoaEoKCjx8fHw8PAlJSUxMTFDQ0OXl5dQUFDf39/JyckCAgJzc3P8/PwVFRXPz89OTk7Nzc3Ozs64uLjh4eGUlJQvLy/7+/sYGBgZGRmKiort7e3IyMiwsLAwMDA2NjYkJCRhYWG3t7fMzMyDg4MTExP39/d6enr5+fl7e3upqamNjY1NTU2MjIzKyspvb2+JiYno6OjFxcVRUVELCwuHh4f+/v4EBATp6enY2NgPDw9ubm5UVFSoRrXmAAABnElEQVRIicWVZ0/CUBiFX4Xi3uKriAMn7gWi4gQVFwpYJ7gHKAruvbe4/rIXCLTFoB+09Xw4uXlyk/MkN00BICJSJAYSShIVHRMLvgQYO3HxCYmh7K8T3E1KTklNSweQSjIQM70kS5Ytz8FIYDNWcvPyFQX8yjG7VGFRcUlpEQUKZVm5D1VgJemqalJBxkqNrJZfN86uHOsA6rEBVGpo9KEITRPpZhGpIGOlRdsKap71mN02bAfowE7vOajSWtGl0/uPX/S6e3oNff0Uz4KBXWqgenCwZ4jiqBgRh7nXmIzoTLlmy6hAekCPIY5PcFUmp6Z11jB6tplZgLn5BWH0xItV+qXlFXGoyupKGD27g9Qa1gujZ153AmzkmRnkVGhIb7rC6Lm3SG3jjjB6Dru3ldMM2sU90vsHYfQOjUfkcY9VwuidnJI1zekZC527KuUXeBmid4X+r1WTcG29sdzybBfYld7dWx/cdwss9PhkMx48cK8B1D57/AdaZHiRzAqkB7RJqzXRP99PfuVZ6Fd5M7z/t8J38Xzw/Sf7Np+eZElYHBJtEgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492293369;4.rect,1.1,2.40,1.0,2.29,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.23,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.25,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.60,2.78,3.586;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,2.79,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,2.77,3.108,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.98,3.265,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.98,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,2.98,3.146,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.136,1.8,3.487;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.194,2.19,3.429;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.196,1.9,3.408;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.251,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.269,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.272,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.269,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.329,1.8,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.348,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.609,2.26,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.424,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.424,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.538,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.611,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.424,1.8,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.424,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.614,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.495,1.8,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.481,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.478,2.18,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.481,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.478,3.269,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.481,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.481,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.497,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.538,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.538,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.538,1.8,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.609,3.125,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.538,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.535,2.98,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.538,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.535,3.108,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.538,2.28,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.533,2.39,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.538,2.48,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.554,3.118,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.552,2.28,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.595,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.593,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.590,2.68,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.592,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.592,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.611,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.612,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.614,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,1.0;4.blob,1.1,4928.iVBORw0KGgoAAAANSUhEUgAAAhsAAAATCAIAAAC2iViuAAAABmJLR0QA/wD/AP+gvaeTAAAOI0lEQVR4nO2deVATZx/HnxAI9yFyQxAil1Te1yICWsASRW4QBXyBSDiNbXWmM621tgg6WKrFox2HojLVDlLGoni0CEQQVGjFCxXwLBXkECGcBgIBZN8/VrYBkmeXLBSn3c/kD3azz/P7/o5nnz2eKM3j6FEgm2s8HuRbCgoKCgoKDIW5FkBBQTEFGm2uFVBQyAM1o1BQvEXoL10aXFGRIBLFi0TskyfnWg4FxfSQNqM8fAguXpTVYMn27eF1dcQNzF+yxPvCBW5nZ2xf3+qff9ZiseRQ+S/E0NWVhyCGrq5zLWQCb6eqfwzKurp+xcWARuOvW1fk51d/6tRcK5p1XNPTw2prZ69/+Sp2tlW9bcygv9JmlIYGYGkpq4HNxo1PCV866To4BFdUKKqqXo2Lu7Zpk9bChSFVVepmZpLHeJ05E1JVNR3NFBRzyexVLHPNGhU9vTIOp7mo6MWVK02yL+z+MdxNSysODJxrFZOZJVVzda7DtTuD/ipO3tHdDfr6ZM0oeo6OOosW/ZGTQ7D3/3766ahIVBQQMDY8DABoLS2NbGhw2rXrakICCc0UFP9MNC0tx0ZGhI2Ncy3k70Pc0yPu6ZlrFZN5O1XNHjPo75R7lIYGYGgIVFWlHm0THf2ivHygtZVg7wwdnVGRCJ1OAABDXV2VH33Udu0auslpaeEhCGv9egMXFx6CoB/J5gYuLkFXryYMDka3t793+LCShobkt4u3bEkUi+e9845fUVH8wEDiyIi5vz/2rYa5uVdeXpxQGNPd/f7x4wwdHYKa4XbZOTl+xcWu33zD7eiIHxhYk5+vamgo2VbHzs63oCBOKIzt6/PMzlYzMiLukSmbHXr/fqJYHFZba+TuPkkVGY+so6LW3b4d39/PaW31OHpUZf58SY+8L1ywCA4Of/gwfmBg7W+/6b37LnFVctsFeBk0Xb06rKYmUSwOq6mxjYnhIYiRmxv6lfuRIxH19diR+k5OPAQxef99tBUPQZalpsYJhSE3btjGxHAFAk5zs4mnJ3Y8JJLwaOBWrK6Dg29BQUxXF7ejY01+vraNDcFAhd67x0MQ57Q0BSUlrGfMX0BuLMAhM47g1Q5pa795M+Zm9MuXkq2UdXUThoYWb90quTOivt7j2DGCquSuWIgqQGCkQLKPWzmQLECqHQWSBbhduL8A70woNRoT71EQBDQ2AkdHqeFWUFS0ioio2rZN6rdSacjPtwgKWnHo0K3k5BGhEAAg+cSMHxJCV1ZelpqqamAwdZmyjq1tYHl527Vr/JAQdRMT1/37tVisoonjRIHB8L906UFGxv0DB5R1dDrv3EH3q+jrr/39d3F395XYWIa2tvNXX6kZGxf6+hLRjGuX6e39Wiy+zOFoW1m57t+/Kje3YNWqN3bnzw+uqBA2NJRFRSmqqy9NTvbj8885O78Wi3F71mKxfAsLO6qqiteuVTM0dN2/X1IVGY9YYWGe2dnVqak3tm9XMzZ2TEpi//RToY8PdoChq6uqvv6tL7+k0elOu3atOXv2Zzs7VDNcFUm7QHYGtVgs34ICzK5zWhpxuwAARTW1azweOzvb4eOPyzgcp927nXbv/qW8HBCIJCQa8IpV0dMLLC/vrK4u53LpqqqOX34ZUFp62sFhuK8PV3B5TIyShoZNdLQtl/vreDl119Sgf5AZC0SQbxzBqx3etvH8+e66OgCA/ebNZqtXS4oRd3c3nDtnHRVVd/gwusfA2Vlr4cIyDoeIKjIVC1GFAqkNePbhlQPPAhx4FuB24f7iVp3UaACPo0f/+iQne7DZHhkZ2B5JA+b+/vH9/Yrq6kT8xHBMSkocHo7v72efPCn1/ZisZ3xeeXn/e/pUQfHNnMf09uYhiOSV5uItW3gIYhMdPbWta3p63KtX2FxtymbzEERPxkw5LbvsnJzIZ88UGAx0c1FiIg9BsEsV57S02N5ehrY2uqlja8tDEIvgYCI9u2VkcAUCRTU1dNMyJETyjSIZj7RYLH0nJ/RvurKyzcaNPATBbhfYOTnR7e1KmproppmXFw9BjMev7OCqyNgF0Ay6ZWRwOzsxuwsCA6d1j4K+q4t6/txp924AwNLk5Kjnz9GD4ZGERwNFVsUyfXx4CDLP3h7d1La29i0o0F+2jEisUByTkhKGhqbuJzMWcJF7HMGrnWDFuuzdO/XqGE2itpUVurni0KHwBw8IqiJTsXBV8Nogkn3I+wxIFuD3KPAs4NqF+It7JpQajYlPvRoaAJMJFKe8XAEAAGATHd1w7tzowABE2VSq9+zJs7d/kJlpwmavvX59ZVYWjU4n0tDcz+/PvLyx0VF0s5nPH+rsXDDlXv7Z6dNS2vr7t5SWint76SoqdBWV9uvXRwcHCVYVrt2h7m7sOd6zM2cAANiMYuTm1nLpEnZN2vvkSa6FRevly0R61ndyaiosHBWJ0E1RW9tMefTq2TN1M7OQqqo4oTBhaMgzOxsAgJUCagu9gwQAvPrzTwCAir4+EVUk7aJIzaC+k1MLn4/ZHRIIiNvFQBAEIAgAABkbw6oON5KQaMAR3Lkz1Nn53uHDCwIDGVpafX/8URQQILh1Sw7lkyAzFggixzjCqXYSFdt6+bKwsdEqKgoAQFNQYIWHPzlxgqAqMhWLC6Q2ZiT7cmQQngUy4Fad1GhITB4jI6ClBUg8npOEoa1tERRUHBQkh7K++vqqbdtu7tjxn08+cdm7t+fx45oDB+BNFFVVFdXVBydOmwMvXqjo6U06Epn4OBJFzdBw3qJFCYODkjs1mExcqcTtooh7esaGh1XHL5fUTUx6Ji6tFo5fGuP2rGZs/LKiQpYwuT0CAJj7+XmfPVt/6tSd1NTBjg5jD4/lsh8FIGNjAACaggIRVTNiV3oGjY3br1+Xzy6caUVyUjTgDAkE55cvd9y5k52draiu/uLKldspKeS9IDkWCCLHOIJUO25bXDVPTpyw5nDu7N5tvHKlqr7+0+xsgj2TqdhpMak2ZiT7cmQQngW5me6ZEIuGxIzy/DlgMMDE98wYrLCwoa6uaU19CkpKS1NSWkpK2q5eBQCMjY7e27ePFRpquXYt7owyOjg4KhKpTnzRp25i0lpaSsT0cF9fa1nZvX37JHeKpL16ImlXed48BQZjsL0d3YREHLdnUVubrLaAhEcAgHc+/LDz7t3LkZFvjJqaEmlFRNVc2UVGRxWUlORTRSaSuPTV15dzuTQ63cDZecnnnweWlZ1ZsqT3yRMyfZIcC2SAxwpS7bhtcXny449LU1IMnJ2tIiKaLl4c7Ogg2DOZiiXJbGQf4FU7PAtyI3fVSVx8oT9DkfHPP9hER9fn5qITEUHGRkasIiKc9+z56xKPRlPS1Hw98UmxuKtLeeISIJTm4uKF4eGST/FU9PSaioqImG7m8/WXLet9/Fhw+zb6EbW1DbS0EGqLZ5ehpYV5ZLluHQBAMP4O7WVlpZmXF0NLC93UYDJje3oWjC/0hvfcceMG09dXcXyVnbKu7kx5RKPTh1+9wjZ1Fy8m0oqIqlm0e/Mm09sbsztpzAy8eKFqaIg9K5/0Cyc4ZCKJIqtil2zfHnr/Po1OR16/br9+/Wp8PF1FxXDFCuI9y9RMYiyQsguNFU61k4tzf1NTS0mJbUwMa/36x8ePE1dFpmLJQCT7sioHDrza4VkgY1e+qhs/1/f3A4EAyPhBu6alpbGbm+SNJ0Gu8XgGrq7e589bBAcvCAjwPntWi8W6+/XXkse8rKzUtrJampJi4ulpzeFg545bSUkaTKbPr78yvb1tuNxVubnNfD7B67JbyclKamrBlZU2GzeaeXm5pqdHNjToOjgQaotnV9vaelVurpmX16JNm9777rvW0tKue/fQr2oOHhwbGfHj8xcEBCwMD/e9eFH4/HlLSQmRnmsOHFDS1PQpKGD6+FhzOO5HjsyUR42//GKycuW7O3Ywvb1d09PRl9UEV1jAVc2i3YMHlTQ0ULs2XO4ku43nzysoKrpnZpquXm3/wQce01FFJpIosiq2ubhYx8ZmTX6+ub+/uZ/fyqys0YGBGXkCQ2YskLILjRVOtUPbqhkZGbm5Gbm5qZuZKSgpoX/r2NlJWn/8ww+2cXGvh4ebJ57FcFSRqFgiqmRBJPuyKgcOvNrhWYDbhfsrZ9W9Wda1ZYtHcPCEdV8Sa70cd+5cX11NxPmpGLi4+F68yBUIYnt6/C9dMp66PJxGW37gQExXV6JYvOHRI8mxbbhiRXBlZcLgIFcgcM/MxOZhFHR1BF1FRapdbSurNfn5sb29cUJh0JUrpuMrMokAscvOyQm9e3dZaiq3szNeJFqTnz/pta2GublfYWF8f//GtraVWVmTvoV7ZOLpGVZbmzg8HF5XZxcXN2mNivwe0WiOO3dGNTXFi0R+hYVWkZGRjY3Yand2Tk7o+IwIANC0sOAhCCs0lKAque0CvAyarloVVluL/h5lyWefTbJruW7dhsePE4aG1ldXL9ywQepar8jGRqdduwAAjklJHImrY0gkcaOB+iWrYg1cXPz5fG5nZ2xPT0BJyXRvUGSt9QLkxgIcMuMIXu2QtpK/hMA+XmfOSDZXYDC4AoHLxKdbRFTJXbFwVbi1gZ992ZUDz4KsakeBZwFiFzcLOGdCadGgvZk2CgqAlRWYMhujS5jDHz58dOxY7bffSvX2XwU7J0fHzu7s+KJYitmDoaWFPTSz37zZ/fvvs42NsVdWFBQUbyHjb+YDAiAH5Y0vsqag+Hswdnf3On26Oi2tp65O18FhaUrKo6wsajqhoHjLkf7TEwqKuaWtouLmF18s3rpVZ9GigdbWh5mZd1JT51oUBQUFDjTq/3CkoKCgoJgR/g8Q57k9Tn5F8AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,2.20;4.blob,1.1,7072.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,2.39;4.blob,1.1,2292.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,2.77;4.blob,1.1,3580.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.117;4.blob,1.1,3216.iVBORw0KGgoAAAANSUhEUgAAAocAAAAPCAMAAAChtpVMAAACr1BMVEUAAAAwd3dW1NQRKipKuLhh8fFa4OA1hIQDBwc4i4tV09MXODhn//8qaGhe6OhCpKRU0NALHBxf6upLurogTk4rampg7e1Anp4HERENICBFrKxRyMgKGBgYPDwUMjJm/f0LGxs+mZlZ3d0DCAgfTEwTLi43iIg6kJBMvLwAAQFf6+szf39d5+c1goJHsbEgT09W1tZj9fVQxcUUMTEQKChJtLRi8/NBoqIMHh5Fqqpg7u4GEBAlW1tSzMxj9PRc5eUIExMSLS1Gra0PJiYZPz8mXV1QxsYsbGxl+fkRKytKt7dl+/seS0sHEhJk+PgsbW1Z3Nw+mpobQkJU0dEvdXVc5OQWNzdOwcFk9/de6ek7k5MFDAw9mJgVNDQaQEAdSEgVMzMCBAQmXl4KGRkgUFBHsLAhUVEiVFRa399SysokWVlX19cIFRVV0tIoY2MiVVU0gIAbQ0MlXFxX2NgIFBRf7Oxb4uIGDw9Qx8coZGQxenobRERDp6cWNjYOIiJOwMAdSUknYGAVNTVNv79W1dUQJydj9vYoYmJJtbUhUlJb4eEECwtOwsIFDQ0cRUUZPT02hoZh8PBi8vIPJSU5jo4PJCQ6j488lZUECgpY2todR0caQUFEqalCo6MNHx9Grq4ECQlMvb0fTU0GDg4CBQU/nJwCBgY2hYUBAgIvdHRRyclBoaE5jIwLGhojVlZLubk9lpY3h4ceSkpn/v5DpqYuc3Nh7+9l+voXOTkzfn4JFhZBoKAkWFha3t5Fq6tTzc0BAwMtb29Hr685jY08lJQ4iooMHR09l5cyfHwnYWE7kpJY29sNISESLCwqZ2cqaWkxeXkTLy8OIyMRKSkmX19m/PwyfX1Tzs5KtrY/m5skWlpMu7sXOjojV1c3iYlPxMQtcHBc4+Msbm5Nvr4weHiEJrabAAAGeElEQVRoge1Y+V9VRRQfNkUcAUGfCjwRn2k8CKWEUBKQQpSIVMLAAqRULLcUxYXUQsUwMrUolTLUShMXEgNbLNPMditzqbT9D2nm3eXMvHvmCqiQn/z+8N7hvjnf7/ecOXeDEAYfX6IDIg1+/gE9egaSbkCvoK5g6U17Xw8ZFfpQSoO9IgnXp8rrw9fp3JBQu18VlWPw9bFGHvQNC+/X3zGgE96uGQMHdQVLu+YwIrKz8lFOZ0iwVyTB1l97dYV119K1DucauvZzqKjcwkLI4OghlkhDzFAXIcPobR00ePPgBs8hw/Bga9ROdGIOuxTtm0NylcrB/YjbrZEHse44/hl/B9NKGDkq8c67+NHRSckBd0fxKGVM8tgBqTLtPePS0mMy5GPjkxxhmfcSch/N4n9OCFLwmRCu5UauiOyJk3IS78+VHCCuTJYH8h7kX5OnSBlT8ycGPaScQ1O3gHrAj017uLBo+iMqB3gPbOYQqhS6gemaao9OZn8V0xKxXlgndM10ijFjVaJebHcadENCS4MSI2co1gmVQ1+wKsuKHtPXQ6ThcTqTf4XPYlpFE2aX+85hj4oZ7if6PTk3n0XzCuaXLwjOkVIWRj+1aHGFv3RsydLwYQtDK5cRMm45+9OPrsD5AHAth1wB2TR9ZVV5lOgAcwUsT/NzbhWfOfh1dd6aZ55dqppD0K12rl3ndDrZsfU1/qUbxj6ncKDogc0cgj/oBqYLajCHUC+sAz5wijFjVWJe7HcadEPGTqgtX7fRha+DyqEvaJW5ac/r6yHS4Oc580hEHXf3AiGb6IuEbN7C0tfTkezBditrzVQ6WExZXUxIYBbNEI+VUj9CXkqqZicEZefZy24Xzod5h1wB2VQ/X8CBwpXOUkXrCXllnZTxqnsbIbNVcyjqGneOMdvLCNlBG3AHih7Y35eHG3tvdAPTBTWYQ7Frwn1Z5wOnODNWpdWL/U4L9+X4gYSUcDV8ncEMfUGrfO11Yok0iHPInwFW01pC6sbwYzvZRX/UGy6Xq7Gmv5QzMzKZXWelR9557l2793iiNwveIm+79xKcD/MOuQKyaaMWgAOFK50ldk4c2Zf+jpSxv4nYPB+Kukan0nryT/cB3IGiB+2bQ7MbmC6owRyKXbPOITjFmbEqrV6ustPy8+FBeki1zqzc7AtW5bLCTcQ70qHflw8n6FqDaDl7ymo2fnZo9/Z3xZQjLUdzq9+T55DUN7W2hR/jkU9i6qG2gwTnQ71DLiCburwdKFwZLO9vJw1tH0i/VvJ5Ur+nCLp6pxppNv/K/xB3oOhB++fQ0w1EV1CDORS7ZplDwSnOjFVp9WK/015zGEU/Uq0zmIW+IFWuKNhHvCMdsWH8PYWk7xXdaWcJx/GPizn6iilJn7CPmdT7XwAnjiUUrmffqWmfhh+VqwU+zLuQCzD3BRwoXBksKdGrppyUf93P58nufdnUNTqVqF1lTuEOFD3o6BwiuqD22UYiXQ81WK+H4BRnxqq0erHfaWwO8XUGs9QXS5V1p43lEBloHhrIb+YzRHebW9kV9fPW3YSc6cFvC0OkjJy17OMLeQ598k+wR1P6JY+nH49eJVcLfJh3MdeEuS/gQOHK3Hv/ZsduOeOrokZ2iqrmUNSN+Vo7lqk9dVXhDhQ96OAcYrqgtjJvG9/JErlr5jqTD5zizFiVVi/2Ow26MIf4OoMZ+oJU+U3Lt/pqiEz0LQrv9527SXK3JGz5sEPzQ/nbUVho1qZebePFjLMt3+/oFU0nicd+KJyVe+RkWj2Pf4xe7lUt8AH425vD6Rwt55ow9wUcYK6Ahb2r5cWXyRk7a3aVLq7U5vAAleS9PGfRuIbFSwg5V5iz4yeHv8IB1gNwIHqxVgndwHRBze98U9XZYD6HYteMdcAHTnFma5WYF/udBl2YQ2wdMENfkCovXDQSIAKcywmo3Bwo1UNSLqXF/zyP/1qfuSV5zSIpIfZCZc2lX3rkSgenHV7a+utlT5i69YrnG+Uz0Ud7zoiQc02Y+yI4QFwJLOzt6DfvjIagNt8N2hyOaCnzrlzQjT3lmDiX9/by74XuM3tUDpAegAPRi7VKoRuYLqjVVuRdvOJ5exS6ZqwTNEynOLO1StSL7U6DLswhtg6YhdmwVjnqDyMBohuI039advw/gIiK7nZwC12J6rjzC7rbA4JlyX91t4Vb6Er8HfxPd1vAUFYe290W/u/4F825/XYWBz/bAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.134;4.blob,1.1,5616.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.191;4.blob,1.1,7872.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.248;4.blob,1.1,8064.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;4.blob,1.1,3400.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.286;4.blob,1.1,1964.iVBORw0KGgoAAAANSUhEUgAAALoAAAASCAMAAADbnzRAAAACTFBMVEUAAAABAQEkJCQYGBgLCwszMzPDw8P39/f29vajo6N1dXXFxcVUVFTPz88PDw8SEhLr6+vExMRJSUlAQEBLS0ukpKTQ0NBERETu7u4hISGioqKvr69YWFj///8gICADAwPa2tpwcHAVFRX19fV5eXn6+vpSUlIMDAycnJy9vb0ODg48PDxsbGz5+fkrKyu3t7f7+/tbW1vMzMz09PTl5eWZmZkTExODg4Pz8/PJyclgYGDj4+NBQUEeHh6qqqqenp4QEBAtLS20tLTt7e3q6uqtra0mJia4uLiKiooXFxeYmJjc3Nw0NDRISEjT09PIyMirq6uwsLDs7Ozv7+8wMDCampp6enpVVVX9/f2AgIBDQ0NcXFzY2NiNjY1aWlr8/PxHR0fCwsLk5OTS0tJjY2Po6OgUFBS6urpMTEzi4uKxsbFGRkZqamrGxsbV1dXh4eEICAh2dnZWVlYHBwfX19fb29t8fHz4+PheXl4iIiJdXV0cHByBgYF+fn6Li4vy8vJCQkIyMjIqKiolJSU1NTXe3t4GBgZlZWUxMTHn5+cRERF/f38JCQlQUFDg4ODW1taurq5NTU1iYmIaGhonJyeVlZVKSkr+/v6mpqZzc3OHh4ehoaE5OTkuLi4+Pj6dnZ3Nzc2UlJSIiIi/v7+Xl5cbGxt3d3fR0dFhYWECAgIKCgppaWlFRUUvLy+oqKhmZma7u7ssLCyMjIx9fX22trbw8PDAwMA3Nze5ubk6OjrOzs5XV1dvb2/m5uaQkJAEBASsrKxubm6FhYUpKSkoziYKAAADMElEQVRIib1XB1MTQRR+NIkaEEkBhRUkJEpCQAEhdkoiotSAoUgTKYJgolIUBBEpioCFpoKKYkNQUWyoiOWPuXtpd5RJsjB8M7l52fve+7683XtzASBwgrWEsyVyTNfFddGS2zp33voVG7IbGzZS6vI9PBesbPLa7C0QrpKvJSESs774+G6h1d3qt2DBH21bmTObYFsPCNxOrRsk8eYuBEtXYssesK3LJDvodXeGmCO5HECMGCjw11BlWLhkF9nC3RGRUXui8eaiGNXefV77D+C1g4dUvodjSVpcfIJac4RrLvGoWqJJwtGx4/iSjARsnkickipJc2OY6RnGDApdgBSUZAxctZmxkKU4oVQoFHJSAkXpfPguANk5uXkn8xNJiYLCInFx2im8WSWn+aVl4ZhWrq04ky2u5DwyIlR1tpoXwrFu5Yl8a2T8c3oDYarPGzMc1yW9RheMwcXaOjJu6htM+qHokjG4nIxvNqJoXKIJ9FegWQ/QchXXbkXXyE9vA7ge386x3tEJ0IVusK1beaKb3QACRHoYjWTmHEd1CcpucTabVaLHFPWmqfBmbmNK9OVCfQnA7TsGg6GHV4374BVyVw5ciCLwpRvdY1u38piz3s90bAC10uoS1A4uZ91gDIaG7wvbH3BLJBjP5kN823kkU1oxutg6KHWcs27hMdZdkD++PkKPqXUxUp/YsB4/RjrALdGRnkzQxBACRqvcB5boeinAU73FuoXHst6ELPONQhc6ntmwHj5OlrklnveRofYCf16+CsDPIHrNUOWmIxE4AVCKsgB0DW+IvIDNY1nvlHbR6pJWKENtWJ8cDi5uyUFh7BJBanHjVIs0DuCte4ZwyC+SeRNhhhSxjt5NvY+cxlFb0YjPZBmxbuWxrEPNIK0uxgcyCBh8ZHIWl3CaqeR9KuwTskuAs+az6kseuf31mzZzepZhmoYUiDxitDxNEAll+Q3ffzAHxsJjW2+uW966DV2An3MTppxfw/OwOjA+pvagXzpLLxMxY45+59NX4cJ+61AwTv2K3RtlHsqeqj+0RRbCAeuuY38pRf7NTZnDef7a/sUwoVxHmdjKfUP+D2zkEb8ngHV2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.324;4.blob,1.1,4916.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.362;4.blob,1.1,2248.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.381;4.blob,1.1,8064.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;4.blob,1.1,5912.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.160,3.419;4.blob,1.1,6648.iVBORw0KGgoAAAANSUhEUgAAAVEAAAA3CAIAAAA6zu7mAAAABmJLR0QA/wD/AP+gvaeTAAATLUlEQVR4nO2deVAUxx7Hm1MOBVEIPEVARIIipSIrajCigsoholk8uDQPLxBNKiElJiCmNKkgakwR66HESHQrUQIoFioogtENoMESUa4ngqu7gHtw7SXsQr8/Jpk3LruzA8Oyws6n+GOne7r79/v19Bw9018AGICent7ARJ2FigbFWGbBggX37t2TSqUSieTChQvaNkfLUNGgGJMYor8mTZpUWFjY0NCwYcMGqVRqbm6uRbPUkpWV5eXlNWfOHA3VP7qiQUFBnP+P+VWrVllbW9NotBcvXmjPnncFXYtGjn+O/Xj7RZcXadsQCo2jj/6aPn26TCbTkUNcLVQ0RgwLCwsLCwttW6FjVFVVwQH4+PigO8THx/f09Li7u9+4cUMsFstksqCgIDQ3IiKisrJSJBJxOJzTp09PnjwZSffz84MQHj58WCgU3r9/f9u2bTwe79WrV8uXL0fLOjg4ZGdnC4XC9vb2n3/+eeLEiQRtzsrKevr0KfLb2tq6trb24cOHEyZMUFvzsmXLIIRRUVHY2srKyp48eTJ6o0EGdiQb7oIKf9gd4ufE9+zocbdyvxF4Qxwjlu2QBTn87W/G0ozGLY3onl42XnAX9J3i+3+Pxjtk+2cL/y1s39b+s+/PE40VPTI3N+fz+R0dHSPjLMXfzJs3z8fH58yZMz09PT7/gD31xsfHQwg5HM6XX37p5+dHp9Pt7OyQrLCwsL6+vkOHDq1cuTIyMrK+vr6wsBDJQo7y48ePh4eHy+Xyqqqq1atXV1RU3L17F9nBxsaGzWZXV1fT6fSYmJi2trYbN24QtBkd8xMmTKisrHz27Nl7772H5uLXXFlZWV5ejm7Onj0bQrh9+/bRGw0jIyOTAejr66svCQDNhuZj51O6trRmY42PnQ/yh90hfk483AU5kZwv53/pN9WP7ky3M/vbX/wxb2Niw45kV4dV053pMW4xbdFtNwIVPRo3blxdXd2zZ8+oGRMtkJSU9ObNG6VZyFEeHR09MMvZ2dnLywv5PW7cuKioKAghcnFDjnJ7e3sAAIvF+vrrrwEABw8eZLFYyP5paWnd3d3ogFmxYgWE0NPTk4i1yJg3MTEpLS1tbW11dnbG5uLXHBERASGcP38+snnixAkej2diYjJ6o8FgMAbem9DpdCJlEXL8cyrWVyj3d0483AWjXZX4iz/m0xaldf+7Gz1BrJi6Au6CntaEPKLQHIQuBQi///77wMSmpiZ7e/uKigqhUPjmzZvz588DALD32AjIUQgA6O/vNzAwQBKDgoKKi4s7OzuR61J5eblUKl20iOg0kr6+PoPBWLp0aWBgYFNTEzYLv+bs7GwOh7Nnzx4AgLGxcVRU1JkzZ1SNcFW8U9FITk6mDeD27duD8gif35uU+ItPkENQMbu4s6fTxMDExMCk/HW5VC5dZEtNE2oZQ/W7/ANymCoQGBiYl5d38eLFw4cPc7ncDz/88NixYwQrtLW1nTVrllQqxSZOmzaNYPFZs2a5uroaGBj4+vo+evSIeM0ymSw9Pf3gwYMJCQmrVq2ytLQ8deoUwUZR3qlosNns1tZWhcTe3l6CTRNBqb/42JrZzrKaJd3+tkfjifYvhYYYxJhXSlxc3KNHj8LDw5HNqVOnEi/b1dVVUlKSmpqKTWxrayNYvKenJzQ0NCIiIjU1tays7P79+8RrPn36dHJy8tatW4OCgnJyclpaWoibjYO2onHu3LmIiAiFxLCwsJycHOIGDAE5lBvpG6nK7ertKuGUpFa97ZGEaP9SaAiyY97AwKC7uxvdHNRHMkVFRQEBAfX19SKRCEmZOnUqh8NR2A2ZP8O2gtDY2FhYWHjv3r0FCxZcunRp/vz5HR0dBGvu7Ow8d+7cJ5984ujouHjxYuI24zMC0VBKcnLyyZMnFRKfP39OvHVBj2Du5LnE90doEbfYmtqaGZpJ5BIAgL25PTa36FVRwLSA+s56kewfj8yncsSEPKLQHIN4nlfK1atXly1bduDAgdWrV6elpSFTUwTnYA8ePGhmZsZkMqOiovz9/dPS0pqbmz08PLD7mJubNzU1sVgsVe9yxGJxWFiYjY1NVlbWoGo+efKko6PjgwcPHjx4MFivVaHpaKiiubm5cgDoGZAIzDami6VLyoKU5VOWR86MtDaxJlLqyosrhvqG/1n6H7+pfrGzYzM+zHjLo78OmhmZMdcxo1yj/O390xalNYc3e0xS9OjYsWMQQoU5VArNQXbMZ2RkpKSkxMbGXr582d3dPSoqisViOTk5ESnL4/GWLFny/Pnz9PT0vLw8Go0WEBCAvidHkMvlPB6Pz+fLZDJV9dTU1OzZsyckJOTzzz8nXrNAIBCLxQMvj2TQdDQ0B+O/jBPVJ/Z57CsMKvzK86t/mf2LSKnajtqNtzZ6v+ddEFCwY9aOT/78BJvLe8NbcmXJ8+7n6R+k563Ko71HC7ge8KRd0SNDQ0MIoVwuHzZnKCiUcvTo0VevXhkakn26oSBJTk5OfX29tq2gGNPQaLSUlBS5XB4TE6NtW3QdS0tLoVC4b98+bRtCMaYpKSlpa2tLTEzUtiEUwNDQkE6nUyIFFBQUFBQUFBQUBKFuHSkodAVK34qCQgm7d+9GF2MR//SVPBcvXkTXwAMA3NzchEIhg8EYrvonTZrE4/GYTGZAQICvry92lfvIgw2yAgqfo6SlpY3Ya3ldRqfjbGdnh6wSZzAYmhjzOTk5FRVK1mlix7ypqemTJ0/q6+vHjx8/XO1u3rwZQkjwkxhNgwbZx8eHy+X+8ssv6KbCo4eVldXI26yqj0Yvaj3S2TgbAgDa2tqQoR4cHKwtO3788UcXFxdvb2/0a3PyvFP6VmiQAQC9vb2vXr1iMplK9+zo6BjUZ7MUQ0PX4qx83cp3332n9DqvSu8JwcPDo6CgQCAQcLnc3NxcV1dXNIvNZg+8lUVz0es8oi2xc+dOhXbHqr4Vm80+cuSIQiLOExb5dofcR2SiwWAwCgsLjx49yuVyxWJxbm6ura3twGgMO/ge6WacVWqQKR3zOHpPAABra2s+n3/z5s3g4OCwsLCqqqqXL19aWloiuTQazcfHp7S0tKamBr2VRcsiY97NzU0kEv32228K7Y5hfSulYx7nCYtku2T6iEw0EPWe/Pz8VatWxcXFSSQS4jIepNS+cD3SzTir1CBTOuZx9J4AAGvWrIEQzp49G9mcOXNmQUEBjUbD1oDzPN/Y2FhdXQ0h/OCDDxRyx7C+ldIxjzKwF0i2S6aPyESDwWA0NTUZGxsjmzt27MB2GT7DoPal7slZZ+Os/sSJr/f08OFDPp+fnp6+du1aCwuLZ8+eBQcH//XXX2qrRZgxY4aTk1NLS8uJEycUzuK6pm9FkCG0S6aPyEQDANDe3o7K9SACHgTH/AiofeEzhuOsfswjek9NTU2bN29euHBhQkICNpfH4y1evJjNZp8/fx65sRmUBIVcLv/oo49iY2MXLlwYHx+PzbK1tV2/fr30HyQSiampqYK+1ZYtWyZOnBgaGjrs+laq/MUH32bNgd8umT4iEw0FOjo6ent70YskPmw2++kAurq6htz6sDA24qx+JalavafGxsatW7caGBgsXLgwMTGxpKRk3rx5DQ0NROxraGi4desWACAvL+/IkSN5eXlsNhvJ0jV9KzKobXfIfUQmGgpYWVkZGxu/fv2ayM7aUvvCZ2zEWf2Yx9d72r9/f3h4uKenZ19fX3l5eUxMDKL9gPVTIBDMnatGd2nv3r11dXWnTp1at24dkqJr+lZkwG+XTB+RiQYAwMLCQl9fv7+/HwCwYcMGAMDDhw+JFBwGtS8CR91gGRtx1geYmUx7e3sjIyPkt5ubG7IHvt5TYWGhq6trbm5uUFBQYGBgZmamWCy+d+8etg0mk+ni4pKSkrJ8+fLIyEhrayW6Sy0tLQcOHAgJCUHnaXRN3wq/F8i0S6aPyEQDADBz5sxff/3V399/586dP/zwQ3FxcVVVFZGCw6D2pcIjnY3zWxpkSj8LRW+i9PT0kpOTX758KZFIrl+/Hh4e/uLFC+zbbG9v76KiIuTt361bt5YsWaLQmJ6e3vHjxwUCQU9PT11dHRojhW9v9fX1y8vLW1pa0NcbLi4uubm5nZ2dQqHwzp07K1euVKh54sSJ3d3dmzZtUhoItfP2SjXYcPzFzqC+ePHi0KFDSCvo8wgRmwGB9/MKvUC+3SH3EZloMBiMR48eHT58mM/nSySS3NxcGxsbpd2hCVR5pLNxPnnyZH9//6gXhqL0rd5lGAxGZWWltq0Y+xCMM6pBNlpHC41GCwwM/Oyzz3bt2kXJJ1JQ4GNpabl69eqvvvoKjN4xn5qaOnv27KSkpLNnz2rbFgqKdx2xWPzxxx/n5uZq2xAKCgoKCgoKCgpdh1I3o6DQFSh1My3AYDAIfkehI8ybNy8/P5/P53d1dV26dMnZ2XngPiOsu5SQkKB07YCm0Sl1M03j5eV1584dqVTK4/EyMjIGLrAZOd7lMT/ySkMeHh5CofDmzZshISGbNm2qrKzkcrnI9xJYRlh3SdNjnlI30zQODg7d3d3Xrl1bu3bttm3bOBxOQUGBhtoare/qtEVCQoJEIgkODkaWLhYXFzc3Nx86dAiV60DQNd0loAPqZhplz549Eolk/fr1yHElEAiuXr06Z84c7G0UUP1/2YeCm5tbQUGBUCjs6uo6f/48diEecp1fs2bNkydPxGJxRUXFggULsGXxlbOGpkKl1iq1SkP4Gkb4VuEoHOXn5zc3N2OrioqKQrU38BWEGQxGfn7+unXramtrxWLxn3/+qbDIGcdffI/UXucpdTMkfbjUzYYdJpOJXTI4bdo0COHu3bux+6jUtxoCkydP5vF4Dx48CAkJ2bJlS11d3ePHj8eNG4fkMhiM9vb2srKyDRs20On0mpoaFouFfqmOr5wFhqpCpdYqfKUhtRpVOFbhKxxFR0dDCL///nulj1v4CsIMBuP169dlZWXr16+n0+lPnz5tbm5GPcL3F98j/DFPqZsNu7qZUsjoeTU0NJw+fRr57eXlxWKxIIRJSUnYfVTqWw2Bb7/9trOzE+3m999/H0KIrmllMBitra1WVlbIpq+vL4QQPS/iK2eBoapQqbUKQdVzplqNKhyr1CocJSUl9fb2ikSiCxcuqNLAUaoyhox59GTh7+8PIVy6dCkRf/E9wh/zlLoZHG51M6WQ0fNqbGzMyMgAAOzYsUMsFicmJopEImQ5jUa4e/dudnY2NsXR0RGdiVGYw5syZQqEcOPGjWhKaGgooumD+omddEH6xtTUVGnTOGXxrUJQdSzW1tbm5eWh51pTU1OJRBIXF0fEKhsbGx6Pd/v2bUThSKnZLi4uaWlpHA4HQpiZmYlVKUJQNeaxkXR2doYQIqud1fqL75Hae3ucOBPxF2fMQwi7u7s5HM79+/cVrmn4NhsZGbHZ7J9++gkAYGxszOPxvvnmG4X61Y75wR5XateoqT1ycJg+fbrXANCLJT6NjY1ZWVlnz559/fo1ckHV3JjXBwBMmTKFz+djU1kslqqZGGRdPtq7BDV9lB6R+GUHZZUCBDWqlFpFROGosbHxiy++cHR0TExM3L59+6effkrEKgUUIonvLxnVLUrdjHiFZOJMRs+rr68vOjrazc3N09OztLQUAKCnp6ehxWOGAICWlhalOhZEIKPpg1+WjFUkNapUKRwZGRmlpKTcunXrjz/+AADI5fLU1FQ6nR4aGnr8+PGhmYqC7y8Zjyh1M+JlycSZjJ4Xn89vb2/39fWVyWQAAFNTUzMzM4VrwHChDwBgMpn+/v7ofd20adM6OjrWrl1LpDwZTR/8skSsEggEClPQCEVFRTQarb6+HpVYaW1txSof4LB///7Hjx8bGBigCkcmJiaI+IFMJtuyZcuRI0fQi7Oent6ECRMGq7erFHx/yXikVt1Mlb8oquKMZe/evRBC7LVarc2outnKlSsHKmENGZLqZkOOMxmt3rKyMgcHB/Qh0dfXF0kkbvngsLa25nK55eXlwcHBGzdurK6urqqqQmdTFJ5C7ezsIISbN29GNmNjY/v7+1FNn76+Pgihu7s7uj+OIg1+WXyrEJDpmYFKQzY2Nlwut6qqCtUw6u3txWpU4Vg1d+5cqVR65coVROHo8uXLIpHIxcUFyfXz85PJZFevXl23bl1wcPDly5d7e3tXrFiBBgedtxcIBAq6SwqRdHJyws7x4PuL7xHyPL/mbdB28eOM7y9+nBW+w4uLi8N6pLYXAAAzZsxAzjUDOwIMVekIx1+1z/NEbNYETk5OQqGwoKAgKCho69atbDZb6fuCt/StSOLg4HD9+nWRSNTa2pqZmYnV1sEf82qVs4amQqXWKrQGpUpDQJ2GEY5VQJ3Ckbe397Vr13g8XkdHx82bN9GJd6BOZQx/zKv1F8cjZMwrgF45KXWzYVc30wQ0Gu3u3btSqVQgEGRmZiqdTx0j+lYUugylbjYoUH0rCorRB41GS0lJkcvlMTEx2rZldGBpaSkUCvft26dtQygohkRJSUlbW1tiYqK2DRk1GBoa0ul08lIC/wN5gxaNM+9xPgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.477;4.blob,1.1,3316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.532;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAALAAAAASCAMAAADMvaSJAAACIlBMVEUAAAACBQUDCAgBAwMCBgYBAgJFrKxn//8sbGxW1NQbRERPw8MVNDQIFRURKysdR0eLi4vT09NJtLQKGBgREREgICCsrKzIyMgODg5oaGj////o6OikpKSxsbFPT0/W1tb19fXFxcUxMTEtLS20tLTt7e3q6uqtra0mJibk5ORsbGz5+fkrKyu3t7f7+/tLS0uYmJjc3Nw0NDRAQEAoKCjz8/Px8fGioqIYGBg3NzfBwcH39/fp6emTk5MMDAwLCwvs7Ozv7+8QEBA8PDzGxsZRUVFUVFTU1NTf398HBwcUFBS6urpMTExVVVXQ0NDi4uIPDw81NTW/v7/V1dXl5eV6enpEREQTExPr6+vKyspOTk5ZWVnX19fR0dEnJyf29va4uLhISEhiYmLu7u61tbUFBQUICAgCAgLb29uIiIgNDQ1FRUU9PT0qKiolJSVeXl6Ghobw8PCqqqra2toEBARHR0dBQUEiIiJSUlIVFRW9vb1NTU0JCQnCwsIfHx/09PSEhISMjIwhISEkJCShoaH6+vo5OTmWlpagoKADAwOUlJTh4eGNjY13d3dhYWGZmZn4+PgKCgpQUFAdHR0vLy+wsLBKSkqvr69dXV1/f39cXFz8/PxpaWnHx8dWVlbS0tIpKSlfX1+5ubm7u7s6OjoBAQHY2NjOzs5XV1ceHh62trbn5+ebm5vExMSXl5eQkJD+/v5KtrYNHx9ubm4OIiIFDQ0dpvJ3AAAChElEQVRIiWNgGKSAkYmJGcJiYWJiHVi3EAXY2Nk5ICxOdnaugXULUYCNm4cXwuLjR3ewgCB17aKKeWxCcKYwuoNFRPFoFBMnzgIkdXjNIxbgczCxDqGKOmIBVgdLSDAwSEpJSUmDeTKycvIKikogprKKqpq6BpChKQUGIDEtbR1dBT19BgYDQyDPSMoYSJqomJqZW6CoQ5jHYGllbWNrh8Nkchxs7+DoxGDh7CwDdbCNi6ubu4cnA4OXg7ePr59/AANDoHNQsLOzM9jBUiGhYW4WyA4Oj4iMio6J9URWhzAvLj4hMSk5BYfJCJCaBgbphB3sGZNhD6IzYQ7OYmDIlsphYEiUymVgyFMJBInCo1pLKh/CQDi4oBBoc5yUHIo6uHlFxSUMDKVSZbhMhgEZSOy4EXYwmgUyfkCiXKqCgaEyoqpaAiqJ5OAadAfXFoH4dXbYHVzfACIjGnGZDANNRmAgQp6DRcE+bW5xbPVuQ3dwGrqDDdsRhmA4uEZKC0TFduAyGQaITxK4HczA0Nkmax2H3cFd3QwoIYzDwQwKDSAyogeXyTBAWZIAG9sb2wnMH1J9INH+DHQHh06YyMAwCZyGHYHRO9mxGkUd3Dx1SBoOw2UyDJCYJEC5WtXZ2QTZ2CnWU/WnTa9vBsnPkJpZNssL2cG5s1vC5kiDHOylNtdn3ny/NGR1CPMWWOuWLlRNYMBlMn6A1cGNQDdIQiJEDCXiLBc5OC5eAlaztEdVO0YZ2cEMFcsmLF8BLodXrqpfvaYSRR3CPIYla60j1kkw4DKZDAev31BChNaBAWwb4c3LTXAHiy0bMPcQBNialwGmmwfOQYTAFh5485KHZyuEVeK2lAEAw0izwRbfnHwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.571;4.blob,1.1,8064.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;4.blob,1.1,628.rhAkeicLEr1TS/QOSS0SUBl18LLwWOHweDy569oKyc7OptFo58+fxze7u7ttbGyIa/pq5VFfX394eJjYVPjQJEmv5KC4D5IZk3CZxjkj4ohE75DonZZE75DUIr5JZdTBy8JjhYPfsczOzvb19U1MTCR+GGT/jvSf//wHwzDZqyVr1qwZGxv76quvAgIC3nvvPTabrfCWqcJIvvfeexMTE0eOHAkKCsrJyRkfH8cwbO3atWS8gseZyj6IAxmTOHCZRrj1j3/8o7KYzDRI9A6J3mlJ9A5JLRKfUBl18LLwWAEA9PT0Tp8+zePxJBJJS0sLMekTiwcMDQ2Vl5eHhobKFYyJiWltbRWLxffv39+5cyf5aV1PTy8rK6ujo0MoFBYXF8fHx7e3t8vduFbmFTzOgMI+iAMZkzhwmUa49cyZMxMTE8TJBGLmQKJ3MwaSWiSgkqNZm9+5iMoxCZdphFsLCgpaW1upuohQFyR6N8MgqUVALUezPL9zEciYhMs0wq0WFhZ8Pv+DDz6YTl8RJEGidzMJklrEoZKj2ZzfuYiyMQmXaVQp4mhgYMBkMt/wIxjEmwKSWkTMNhSOSbhMowYijv8PoPo0qn5fAiEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,1084.iVBORw0KGgoAAAANSUhEUgAAAJUAAAAMCAMAAABcFQ/2AAABgFBMVEUAAAAnJyejo6Pn5+etra0FBQV+fn7k5OT5+fnS0tJOTk44ODjGxsb39/fe3t5wcHBERET6+vq8vLxgYGAuLi6enp7s7OxqampKSkqlpaX///9DQ0MbGxv09PS5ubmJiYltbW0NDQ3u7u6QkJAlJSVcXFwBAQHW1tarq6uKiorp6ekICAifn5/r6+sDAwNra2sHBwcxMTGkpKQaGhqurq7CwsJFRUWqqqq1tbWWlpbz8/P4+PgGBgbm5uaLi4vIyMgkJCRNTU3R0dH9/f2ysrJpaWn19fWhoaGGhoby8vLb29tGRkZQUFDf39/JyckCAgJzc3P8/PwVFRX+/v5BQUESEhLl5eXh4eGUlJQvLy89PT00NDSHh4dycnL7+/uTk5MiIiKwsLAwMDA2NjYfHx8sLCwKCgqDg4MTExMODg4PDw/U1NS6urqAgIAUFBTKyspvb28EBARJSUk8PDyMjIxLS0t5eXnDw8MoKCi2traBgYEcHBxYWFg7Ozt7e3sJCQklhb2TAAABZklEQVQ4jbWT6TsCURTGj0YoIiGcSkihBWVPZCtb2ZLs+1KWyL7717tjRndu+eieD2fe59zzPu/vuTMDAFCkEorJA9QlpWUaLbBVXqGrrAKuRXMVBPpqQ02tKOqM9Q2NaGIcZkuT1orNXKloLlUtrTbpsA3tAI72DsbR6XQBuD1dHKForoKg29gDDvHU6+slva+fsRjElQH0cqSiuQqCwaFh/4jbJa8ERscYS9BH2jhOcKTKy5XU5NS0PhSekWezc2ZmWzVP7nEBI7ypaK6kootLAMsrqz+jSMzObq+hNW5aRz1nKJorq8QGaZu4Jert8E7+/u4eWvbxgC8Uzf1VwUPSjvCY9BNB5ShwxE/PQkLh+D+L5ubUuSVJ3qAuBXBxeaX+y5SMXnOForlUpYWbyG3YCpAxeO7uSaXF6QPKf2Xq8SnxHOAJRXOVBC+vfucb+eLfUaoPcdUWy0ieT53m65snlCI3p7IsxkWr2FmE6wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492293669;3.img,1.1,2.14,1.1,9.image/png,2.80,1.0;4.blob,1.1,540.iVBORw0KGgoAAAANSUhEUgAAAAoAAAAmCAMAAADKgvrCAAAAw1BMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHA+mZk+kpI+QEA+c3M+Sko+YmI+Xl4+UlI+hoY+Pj4+hYU+gYE+jIw+ZmY+TU0+mJg+SUk+bGw+SEg+b28+S0s+goI+kZE+jo4+Pz8+W1s+WFg+Y2M+RUU+fn4+e3s+RkY+lpY+aGj2kk6XAAAAjElEQVQYlWNgIA4wMsGZTIwwFjMLK4zJxg5jcXBywZjcPLwwJh8/jCUgKARjCouIwphi4jCWhKQUjCktA7dUVo5IhzLIwwG5TAVFJRCtrAIUVVUDstQ1NIFMLQ1teXkdXZBaPX0DeT1DI7A2A2N5E0VTMNPMXF3FAmqYpZW1DZRpq2inB2XaWzuQ6hwAVVsbbX0S7DcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492294470;3.img,1.1,2.14,1.1,9.image/png,2.80,2.19;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAAAoAAAA5CAMAAAA4AkqMAAAAn1BMVEUAAAAHEhJk+PgsbW1Z3Nw+mppDp6dRyMgWNjZn//8XODgbREQPJCQ6j49W1dUAAQFa398zf38BAgJc5eUvdHQzfn5Y2toaQUFl+voJFhYMHh5m/f1Hr69KuLg9lpZg7e0fTU0iVVVd5+cCBAQCBgZf6+s3iYn///90dHQsLCzu7u7f39+Xl5cXFxfn5+fDw8NbW1t3d3cSEhLX19dTU1OmezQvAAAAfElEQVQokWNgoBgwMjGDKBZWIMHGDiQ4OLmAJDcnDwMDLx9Iil9AkEFIWASsWlSMQVxCEsyUkuZglYEaIisnrwBlKjIpKUOZKqpqlLtvqAN1OMDD1NCEM7W0MRToAI3RhTD19PUNdOEKDMlggkww0tc3hpoLBCb4XIbBBACTRB91Dd+6zwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492295025;4.rect,1.1,1.0,2.95,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,2.57;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,920.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABWVBMVEUAAAAnJyejo6Pn5+etra00NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgpERET6+vq8vLxgYGAuLi4eHh7y8vK1tbVNTU3l5eW0tLQWFhaBgYHk5OT///8MDAzu7u6QkJCJiYno6OgGBgYsLCze3t58fHx+fn5ra2vs7OwHBwcBAQHExMSsrKwdHR1oaGgODg5kZGSqqqqWlpbz8/P4+Pifn58ICAjZ2dmZmZnh4eHR0dH9/f2ysrJpaWn19fWhoaHc3NxlZWV4eHj09PSAgIACAgIFBQXf39/Jyclzc3P8/PwVFRWgoKCdnZ3p6elBQUFMTEywsLCUlJQvLy89PT3+/v7FxcUbGxsPDw8jIyPIyMgwMDA2NjbHx8cJCQmDg4MTExOLi4tJSUkUFBTKyspQUFBvb2+MjIwgICBLS0tfX1+3t7coKCgEBAQ1NTXCwsLt7e2bm5tZTp5yAAABE0lEQVQokWNgYGBgZGJmYUAFrGzsHJxcaILcPLx8QIpfQFBIGFVGRFRMXEhCEkVMSlpGVlaOgYFLXoEBHSgqKTMwiMuqIIsJqaqpg9RraGoxaKOp19EFEnqy+shiBtoMhiD1RmLGJqZm5ijqLSyBXrCSVUMzBqze2saW387eAUXCkZPByd7ZxZWBwc0cBNyR1Ht4ujEweHn7oKj39fMPYACpD5QFgSAk9VbBQFaIbCiKe8LCIxgY7IHuiWQFgSgk9dEgzTGyscjqw+OALohH9S9MfYJLItA97AbIEkkSQP8nywpjU5/CnJqWbq8IFsiQhYRTpolkVrZMDgM29Qy5vCb+0m5gAYWwPIhMfgF7YZEBFvUA+DMoCqAT2SgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492295151;4.rect,1.1,1.0,2.95,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,3.114;4.blob,1.1,300.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAV1BMVEU+mZk+b28+Tk4+h4c+Pz8+kJA+ZmY+VlY+mJg+RkY+eHg+fn4+QkI+lZU+XV0+X18+lJQ+QUE+gYE+dXU+R0c+VFQ+aGg+jY0+ioo+bGw+T08+TU0+cXEKV5F2AAAAQ0lEQVQImY3OSwJAIABF0X5IIYSi9r9Oo9u4Nzqzd4Xom1SNSiJtBjhOyM4O+mWFW0D7ccJ4WXg/KJkM36+dltoZ+gOJNgGm29GPlwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAA/FBMVEUgICD///+NjY0AAAA4ODjGxsb39/fe3t5wcHAHBwc8PDxWVlZEREQbGxv09PS5ublOTk6JiYltbW2FhYXX19eKiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTFkZGTz8/MODg7IyMikpKQkJCRNTU3T09OWlpajo6Pb29sBAQFGRkZQUFBDQ0MrKytBQUESEhLl5eWzs7O/v79ycnL7+/uTk5MiIiL9/f1TU1MsLCwKCgppaWnn5+eSkpLj4+MEBAQTExPf39+AgIDy8vJ8fHyMjIxLS0t5eXnh4eHDw8MGBgb5+fkXFxeQkJD+/v47OzvS0tJ7e3sJCQnwR+ETAAAAtUlEQVQYlWXPZQ/CQAwG4JUiA4YNGQ6D4QyGu7vb//8vcDtIOHg/NNc+aZPjOKAx4HeMJrOFR+SsNhI7CN/ocLrcHhCRo63Xx6z6AxJiMBSmKoVERiPRV4lBnGoiKTOaSr+KAhmq2RyDmC8UEUtQ1lWFCqtV8GhqDQRd6w38SbMFzjZ0iCrd3q+i1h8MR0Wi48n0TxFn8wX5r7xcfSZrkOhD3mx3+wNR/nj66PnyvnI13+4PxCcloBJAanJAzwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492295209;3.img,1.1,2.14,1.1,9.image/png,2.80,3.114;4.blob,1.1,500.iVBORw0KGgoAAAANSUhEUgAAAAoAAAAmCAMAAADKgvrCAAAAtFBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHA+mZk+b28+Tk4+h4c+Pz8+kJA+ZmY+VlY+mJg+RkY+eHg+fn4+QkI+lZU+XV0+X18+lJQ+QUE+gYE+dXU+R0c+VFQ+aGg+jY0+ioo+bGw+T08+TU0+cXHEvJLTAAAAfklEQVQYlY3OxxKCUBBE0QcqRlDMARFExJwT8P//Rbm4s6Rer85iarqV0othCk0DVao1aNVRo9mC7Y4NnS7quX04GI7geIKmszlceFK69DWHqpWklEEoDAO4jjYw3nKb7PbwcDzB84Vn19sdPp4JfL1p+0Rf+EtlQ5ZrjPynAAF/Gnw0mgKgAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAt1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICAICAja2trX19dVVVVYWFjb29tGRkb///88PDw9PT1JSUlHR0ctLS0rKytLS0vd3d20tLQfHx+1tbXc3NwoKCjx8fHw8PAlJSUKCgrPz8/Ly8tMTExOTk7Nzc3Ozs5paWn7+/sYGBgZGRn6+vqUlJTh4eHe3t6Xl5d6enr5+fkTExMUFBR7e3sWFhbo6OjFxcVQUFBRUVHIyMgVFRWysrLs7Ow9QRCDAAAAbklEQVQImRXL6RJCYBhA4dMqqVelUAptSotQ2rj/6/L5d2aeOUCr3en2+oA20IfGSNdgLCZMZAozsWAuC6W247rLlVK8tcjGVxGE293+cAwgOp0hvkRwvSngnsAjzSBPn/Aq3p/vr/g3b1lVpUcNcVII+u7rkvcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492295225;3.img,1.1,2.14,1.1,9.image/png,2.80,3.133;4.blob,1.1,424.iVBORw0KGgoAAAANSUhEUgAAAAoAAAAmCAMAAADKgvrCAAAAh1BMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHCZmT5oaD5NTT6Tkz6Ojj50dD4+Pj5GRj6RkT6EhD5fXz5FRT6Liz5cXD6f6nQFAAAAcElEQVQYlWNgIA4wMsGZTIwwFjMLK4zJxg5jcXBywZjcPLwwJh8/jCUgKARjCouIwphi4jCWhKQUjCktA7dUVo5IhzLIwwEepoIinKmkjKFARVVVVQ3CVNfQ0FRDaCODCTJBS0NDG2ouEOjgcxkGEwDQMxnV3rrEKAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,460.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAZklEQVQImQ2K1xKCQBAEW044YM1iREVMmMFE+P8fc+dhqqtnoOWYtgt41g9C6UC314fBcMQ4Uj2RKbO5wkKWxKs1bCRhK2G628sBjiexmZz1kF6ut7vumscz1y5e78/3p1Caqm7gDxd5BxVT9omaAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492295279;4.rect,1.1,1.0,3.171,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,3.152;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLizjT01UREQcgIA1oaCr//2fo6F4YGAo8PBikpEKIiDft7WAoKBCsrEXboENLAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,840.iVBORw0KGgoAAAANSUhEUgAAADkAAAAMCAMAAADvceWpAAABKVBMVEUgICD///+NjY0AAAA0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgoHBwc8PDxWVlZEREQeHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAyFhYXX19eJiYno6OgGBgYsLCze3t58fHx+fn4ICAhtbW3ExMSsrKwdHR1oaGgODg4BAQFkZGTz8/PZ2dmZmZnh4eHT09OWlpbc3NxlZWX19fV4eHj09PSAgIACAgIFBQVDQ0MrKyugoKCdnZ3p6elBQUFMTEywsLCzs7O/v7/+/v7FxcUbGxsPDw8jIyMkJCT9/f1TU1PHx8cJCQmSkpLj4+MEBASLi4tJSUkuLi5LS0tfX1+3t7eMjIxwcHD5+fkXFxc1NTXCwsLt7e2bm5uQkJBzHJYqAAABCElEQVQokWNgYIQAJmZmZhZWNnYOTmYUgE2MmYubh5eBjx8EBBgFmZmFhEVExcQlUNRgE5OUkmZklGGAcGTlgIS8giIzsyijErIqbGJiyiqqMJ1q7OpAUkMTSGgxaiOrwiamo8usB9Opp68DJA0Mgd4yYlRBVoVNDKQBptPYBESacjCbmVtYWiErQYhZq4GADapOW0Y7sCp7B0cnZjSdcDFncBS4oOp0dYO4zN3Dk5nZHNW1cDEvFhDwRtHp4+sH5nr4A90SgBoa2MQQOgODgsHcEHE1ZuZQxjBkJdjE4Dp1hKHuY9CXCI+QjgSzoxjVMMQwdEbHxEL5cfFsCYk6YGaSezCGGKpOANwjLNjZbIBxAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492295350;4.rect,1.1,1.0,3.171,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.190,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAABwAAAAMCAMAAABGBS09AAAA2FBMVEUAAAADAwNPT0+2trYKCgo4ODjGxsb39/fe3t5wcHAWFhaBgYHk5OT///8MDAwbGxv09PS5ublOTk6JiYltbW1gYGB8fHx+fn6Kiorp6ekICAifn5/r6+sODg4BAQFkZGS8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29tGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCxpaWnn5+cTExPf39+AgICMjIxLS0t5eXnh4eHDw8MGBgaQkJD+/v4EBAQ7OzvS0tJ7e3sJCQn25buOAAAAkklEQVQYlXXJ1xKCQBBE0UZRMIyiGFHWnMWccwL//49ci6fFdR56btUBoITCKsSLRDU9xn88kSRKiZY2MlmTckBeLxSDWCpbQKWqwGaoBbHe4NOk1rd/sN3h06WeFPsDBgxpJMUxmc5kSjMpYr4gY0krOcJZq5st+4PAbn+AgEey/LBP58v1JuL98fTjpbneG/gA7LoNXGvGd54AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492295411;4.rect,1.1,2.80,3.190,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.209,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492295424;4.rect,1.1,2.80,3.209,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.228,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,896.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABTVBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1s0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgqkpKTu7u5tbW1GRkaPj4////8eHh7y8vK1tbVNTU1gYGC0tLQWFhbk5OQMDAwXFxdqamrLy8uJiYno6OgGBgYsLCze3t58fHx+fn4UFBQFBQXBwcHExMSsrKwdHR1oaGgODg4BAQFkZGQHBwdwcHD9/f1MTEzZ2dmZmZnh4eH09PR3d3fc3NxlZWX19fV4eHiAgIACAgIxMTFDQ0OXl5dQUFCgoKCdnZ3p6elBQUGwsLC4uLjOzs7+/v7FxcUbGxsPDw8jIyMYGBiKiort7e3Hx8cJCQkkJCRhYWG3t7fMzMyLi4tJSUkuLi6pqamNjY2MjIwgICDz8/NLS0tfX18LCwuHh4ff399RUVGQkJAEBAQ1NTXCwsKbm5sjQstTAAABDElEQVQokW2PV1fCUBCEJ0RFRMCCqyaIYEGKDQuoUbGBFbAQC9h7//+PboBzZDmZh3t3Z76HHUBxqC2tbZBytrs63J1Npsfr6wK6e3r9feQVSf/AoKarAeENOYJEwwhRmJcRmY2OjQMaRRo9fSIaY94TT/Ay6RP81DQ/MzTb6CXnMM88ayG0mEoLfmmZK6xQtKlAnTeIVmWw5sZ6ZsPYBLYUSwnBb+9kUznJ7+7tH8Di02TpUPCso7y8p1A8BjJ8z4nT0uk/f6bHeSqZgi+e8wUXsm+dv6QrnsoVEVyrCnBDt3Z978yw/560qvFASvV/fAo8vwTLsONf396NykfN+Cx81YbvH5f5m7Th/wCWiCPceRESHAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492295487;4.rect,1.1,1.0,3.228,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.266,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,756.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABI1BMVEUAAACZmZn///9ISEg4ODjGxsb39/fe3t5wcHCzs7O3t7c8PDwQEBAbGxv09PS5ublOTk6JiYltbW3Nzc2Kiorp6ekICAifn5/r6+sDAwPn5+cCAgK8vLyrq6tFRUUxMTH9/f3Ozs7u7u7FxcUvLy/IyMikpKQkJCRNTU0RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgqjo6Pb29sBAQFGRkZQUFAtLS1jY2MSEhJDQ0NERESNjY1ycnL7+/uTk5MiIiIuLi5VVVWOjo4sLCxpaWn+/v4eHh4nJydiYmITExPf39+AgIAJCQnT09PS0tJWVlbW1tbi4uKMjIwODg5LS0t5eXnh4eHDw8MGBgYcHBz19fW1tbUdHR2QkJAEBAQ7Ozt7e3s4sEuOAAAAz0lEQVQYlWNgYGBkAgFmBmTAwsrGzgFmcXJxAwEPsiQvH7+AIJMQiCkswoAORETFGBjEJSSBTCkOBmk0WRlZICHHJM/AIKmgqKSgrIIiq6oGJNSZNBgYNLW0dXT19A2QZQ2NjBkYTJhMoVwzJnNkWR0mQQtLLSYrGF/LGsVoG1smPjsmewYGB0ewrBOquyycDVykgMaburoxMLi7eqD7ytPLG0j6+Po5+gcEioFEgpjEIFLBIaFh4REgVqS2RFR0DFgw1jUOIhvP5pfgw8AAAPZMFlBDHSL4AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492295575;4.rect,1.1,2.80,3.266,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.285,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,464.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAZklEQVQImWNgYGBkYmZhAAJWNnYOTiDNxc3DAAa8fPwMAiCGoJCwiKiYOAODhKQUq7SMLAODnLwCA4OikjKDiipQXk1dg0FTC8jQVtdh0NXTB0oZGDIYMRubmMqYAYXNLUQsrRQYAAJaB1AhQ7/5AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492295653;4.rect,1.1,2.80,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.304,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,808.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABKVBMVEUgICD///+NjY0AAAA0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgoHBwc8PDxWVlZEREQeHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAyFhYXX19eJiYno6OgGBgYsLCze3t58fHx+fn4ICAhtbW3ExMSsrKwdHR1oaGgODg4BAQFkZGTz8/PZ2dmZmZnh4eHT09OWlpbc3NxlZWX19fV4eHj09PSAgIACAgIFBQVDQ0MrKyugoKCdnZ3p6elBQUFMTEywsLCzs7O/v7/+/v7FxcUbGxsPDw8jIyMkJCT9/f1TU1PHx8cJCQmSkpLj4+MEBASLi4tJSUkuLi6MjIxLS0tfX1+3t7dwcHD5+fkXFxeQkJA1NTXCwsLt7e2bm5tfnEU9AAAA7klEQVQokWNgYIQAJmZkwMLKxs7ByYwKuLh5eBn4+EFAgFEQWUZIWERUTFwCRbWklDQjowwDhCMrhyInr6DIzCzKqIQsJqasogpTr8aujqJeQxNIaDFqI4vp6DLrwdTr6eugqDcwBHrBiFEFzQNw9cYmqBKmHMxm5haWVszM1mogYIOq3pbRDk29vYOjEzNIvTM48FxQ1bu6oVls4O7hycxsDnSPFwsIeKOo9/H1Q1Pv4Q90QQCqfxHqA4OC0SRCxNWYmUMZw7Cq1xGGh0M4oxqYZtCXiIiUjmLGqj46JhYmEOcOtSk+gS0xSQeLegBC2B+UbQROKAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492295710;4.rect,1.1,1.0,3.304,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.323,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,816.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABO1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICA4ODjGxsb39/fe3t5wcHAICAja2trX19dVVVVYWFjb29sbGxv09PS5ublOTk6JiYn///9tbW1GRkY8PDw9PT1JSUmKiorp6emfn58DAwNHR0ctLS0rKytLS0u8vLyrq6tFRUUxMTHd3d20tLQfHx+1tbXc3NzIyMikpKQkJCRNTU0oKCjx8fHw8PAlJSWjo6MBAQFQUFAKCgrPz8/Ly8tMTEzNzc3Ozs5BQUESEhJDQ0Pl5eVERERpaWn7+/sYGBgZGRn6+vpycnKTk5OUlJTh4eGXl5csLCzn5+d6enr5+fkTExMUFBR7e3vf39+AgIAWFhbo6OjFxcVRUVEVFRWMjIwODg55eXnDw8MGBgaysrLs7OyQkJD+/v4EBAQ7OzvS0tIJCQllN4RYAAAA40lEQVQYlWNgYGBkYmZhZWNAAewcnFzcIAYPLx+/gCAfD7KkkLCIqJi4BJAlKS7FwCAtLoMsKysHVCzPrMDAoCiuxMCgLK6CLKuqBiTUxTWAJmtqaWvr6KKYrKcPJAzEDYGkkbG4uIkpiqPMBM1BVlowMFhaWduI2tpZIsvai4s5ODqJOzMwuLi6MTC4e7igaPZ0FRf2EmdkYPD2AXG5fFE97OBn6eIPND4gMIiBITgwhAENBIWGAcnwiEiLKL2IaJBIjDjU6bEqcT7xCSCWUWJSUqIRWDA5JRUim8aZHpLBwAAA9UAcjauUKaYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492295724;4.rect,1.1,2.80,3.323,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.342,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,460.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAZklEQVQImQ2K1xKCQBAEW044YM1iREVMmMFE+P8fc+dhqqtnoOWYtgt41g9C6UC314fBcMQ4Uj2RKbO5wkKWxKs1bCRhK2G628sBjiexmZz1kF6ut7vumscz1y5e78/3p1Caqm7gDxd5BxVT9omaAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492295784;4.rect,1.1,2.80,3.342,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.361,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.790,3.649;4.blob,1.1,792.iVBORw0KGgoAAAANSUhEUgAAABMAAAAMCAMAAAC3DnawAAABO1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICA0NDTAwMD39/eYmJgNDQ0ICAja2trX19dVVVVYWFjb29seHh7y8vK1tbVNTU1gYGDl5eW0tLRGRkb///88PDw9PT1JSUmJiYno6OgGBgYsLCxHR0ctLS0rKytLS0vExMQdHR1oaGjd3d0fHx/c3NzZ2dmZmZnh4eF8fHwoKCjx8fHw8PAlJSVlZWX19fV4eHj09PSAgIAKCgrPz8/Ly8tMTExOTk7Nzc3Ozs6goKCdnZ3p6elBQUFpaWn7+/sYGBgZGRn6+vr+/v7FxcUbGxuUlJTe3t6Xl5fHx8cFBQUJCQl6enr5+fkTExMUFBR7e3uLi4suLi4WFhZQUFBRUVHIyMgVFRXz8/NfX1/k5OS3t7eysrLs7Ow1NTXCwsLt7e2bm5sODg6C17q+AAAA0klEQVQImRWO11oCYQxEj4AoiGChrFFcLIiC4loQsFFta0Oxdynq+z+B+XM130xOJsCAx+sb9KMzNBzwBkdUhEbDkbHxcAgmJqOxeMJSb0qmYUaSMGunICZzMC8LsChpWPLoSkaWlV2xstloTtnVNT2Zl3VNnA2RzS0VuSDbhZ1iCcq7e/sHh5WyetVavYHxmkfHcHLaVPbMPYeCshd589rlFbjXLbgxHbftO7hvP8BjQouS8gTPtvvy+ma/g//DSn9+fRvM6XS7HceoXj/w8/vHP42zHAq1zEpTAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492295853;4.rect,1.1,2.80,3.361,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.399,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492295920;4.rect,1.1,2.80,3.399,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.418,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296001;4.rect,1.1,2.80,3.418,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.437,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296061;4.rect,1.1,2.80,3.437,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.456,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,420.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAACZmZn///9ISEizs7O3t7c8PDwQEBDNzc2Kiorn5+dwcHACAgIDAwP9/f3Ozs7u7u7FxcUvLy8RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgotLS1jY2ONjY0uLi5VVVWOjo5QUFD+/v4eHh4nJydiYmIJCQnT09PS0tJWVlbW1tbi4uIICAgcHBzr6+v19fW1tbUdHR1v3ovhAAAAXklEQVQImTXKRxKCUAAE0SapIBIkCQaC5Oz9L+eXwl69qhlAkn8pgKodREehk86eccbccLFsx3KvQp4fhNEtTvbHXX78z/4TXummDPLiDWVRQd20adcPoximYF7WD1/BsQVyvPN55AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296075;4.rect,1.1,2.80,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.475,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,464.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAsVBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYkoKCi2trbp6emBgYHASx9cAAAAZklEQVQImWNgYGBkYmZhAAJWNnYOTiDNxc3DAAa8fPwMAiCGoJCwiKiYOAODhKQUq7SMLAODnLwCA4OikjKDiipQXk1dg0FTC8jQVtdh0NXTB0oZGDIYMRubmMqYAYXNLUQsrRQYAAJaB1AhQ7/5AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492296131;4.rect,1.1,2.80,3.475,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,808.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABKVBMVEUgICD///+NjY0AAAA0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgoHBwc8PDxWVlZEREQeHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAyFhYXX19eJiYno6OgGBgYsLCze3t58fHx+fn4ICAhtbW3ExMSsrKwdHR1oaGgODg4BAQFkZGTz8/PZ2dmZmZnh4eHT09OWlpbc3NxlZWX19fV4eHj09PSAgIACAgIFBQVDQ0MrKyugoKCdnZ3p6elBQUFMTEywsLCzs7O/v7/+/v7FxcUbGxsPDw8jIyMkJCT9/f1TU1PHx8cJCQmSkpLj4+MEBASLi4tJSUkuLi6MjIxLS0tfX1+3t7dwcHD5+fkXFxeQkJA1NTXCwsLt7e2bm5tfnEU9AAAA7klEQVQokWNgYIQAJmZkwMLKxs7ByYwKuLh5eBn4+EFAgFEQWUZIWERUTFwCRbWklDQjowwDhCMrhyInr6DIzCzKqIQsJqasogpTr8aujqJeQxNIaDFqI4vp6DLrwdTr6eugqDcwBHrBiFEFzQNw9cYmqBKmHMxm5haWVszM1mogYIOq3pbRDk29vYOjEzNIvTM48FxQ1bu6oVls4O7hycxsDnSPFwsIeKOo9/H1Q1Pv4Q90QQCqfxHqA4OC0SRCxNWYmUMZw7Cq1xGGh0M4oxqYZtCXiIiUjmLGqj46JhYmEOcOtSk+gS0xSQeLegBC2B+UbQROKAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296201;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.513,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,816.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABO1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICA4ODjGxsb39/fe3t5wcHAICAja2trX19dVVVVYWFjb29sbGxv09PS5ublOTk6JiYn///9tbW1GRkY8PDw9PT1JSUmKiorp6emfn58DAwNHR0ctLS0rKytLS0u8vLyrq6tFRUUxMTHd3d20tLQfHx+1tbXc3NzIyMikpKQkJCRNTU0oKCjx8fHw8PAlJSWjo6MBAQFQUFAKCgrPz8/Ly8tMTEzNzc3Ozs5BQUESEhJDQ0Pl5eVERERpaWn7+/sYGBgZGRn6+vpycnKTk5OUlJTh4eGXl5csLCzn5+d6enr5+fkTExMUFBR7e3vf39+AgIAWFhbo6OjFxcVRUVEVFRWMjIwODg55eXnDw8MGBgaysrLs7OyQkJD+/v4EBAQ7OzvS0tIJCQllN4RYAAAA40lEQVQYlWNgYGBkYmZhZWNAAewcnFzcIAYPLx+/gCAfD7KkkLCIqJi4BJAlKS7FwCAtLoMsKysHVCzPrMDAoCiuxMCgLK6CLKuqBiTUxTWAJmtqaWvr6KKYrKcPJAzEDYGkkbG4uIkpiqPMBM1BVlowMFhaWduI2tpZIsvai4s5ODqJOzMwuLi6MTC4e7igaPZ0FRf2EmdkYPD2AXG5fFE97OBn6eIPND4gMIiBITgwhAENBIWGAcnwiEiLKL2IaJBIjDjU6bEqcT7xCSCWUWJSUqIRWDA5JRUim8aZHpLBwAAA9UAcjauUKaYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492296261;4.rect,1.1,2.80,3.513,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.532,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,460.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAZklEQVQImQ2K1xKCQBAEW044YM1iREVMmMFE+P8fc+dhqqtnoOWYtgt41g9C6UC314fBcMQ4Uj2RKbO5wkKWxKs1bCRhK2G628sBjiexmZz1kF6ut7vumscz1y5e78/3p1Caqm7gDxd5BxVT9omaAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492296274;4.rect,1.1,2.80,3.532,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.551,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,936.iVBORw0KGgoAAAANSUhEUgAAADgAAAAMCAMAAAAAs46XAAABUFBMVEUAAAA4ODjGxsb39/fe3t5wcHA0NDTAwMDr6+uYmJgNDQ0DAwNPT0+2trYKCgobGxv09PS5ublOTk6JiYn///9tbW0eHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAyKiorp6ekICAifn5/o6OgGBgYsLCx8fHx+fn68vLyrq6tFRUUxMTHExMSsrKwdHR1oaGgODg4BAQFkZGTIyMikpKQkJCTZ2dmZmZnh4eGjo6Pb29tGRkZQUFDc3NxlZWX19fV4eHiAgIACAgIFBQVBQUESEhJDQ0NERESgoKCdnZ1MTEywsLBycnL7+/uTk5MiIiL+/v7FxcUPDw8jIyNpaWnn5+fHx8cJCQkTExPf39+Li4tJSUkuLi5LS0t5eXnDw8MgICDz8/NfX1+3t7eMjIw7OzvS0tJ7e3s1NTXCwsLt7e2bm5uQkJAEBASUZjwOAAABJ0lEQVQokW2RV1PCUBCFjwYRRCGatYSgKKhg12DFgljAXsCGDXsv///NTWYMN5l7XrL3y/lmNrlAXb3ia4AVf6MSCDbBFRlDqLkljIja2qZROx87Orv0qBFzVWSsuydO1Iu+RBLoD4QAbWAQ0CkllmQs6ksPsTg8wvMojQHjEzxN0pRYkjEzg2kWZ2Z5niMdmF/gT8pSWizJGMcSF5cywDKtALkgVvNr6rrYqLGNpJXNmlggrbhl0DaXdnYTBXhEh+2Rlf2aiINDUo/omNcqlSNA3r2qw078Vk4FEcVU+Oyc9y1f8CIV94+QMUcELq+s/a4NvpgbuhUbMvYvmtW77D3fFh4eY9Wn+LP95oWS9lNkXvFVeXuv2MePT+Xr27THn9IvvMwt/gEFizPj+MGvfwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296330;4.rect,1.1,1.0,3.551,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.570,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAABwAAAAMCAMAAABGBS09AAAA2FBMVEUAAAADAwNPT0+2trYKCgo4ODjGxsb39/fe3t5wcHAWFhaBgYHk5OT///8MDAwbGxv09PS5ublOTk6JiYltbW1gYGB8fHx+fn6Kiorp6ekICAifn5/r6+sODg4BAQFkZGS8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29tGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCxpaWnn5+cTExPf39+AgICMjIxLS0t5eXnh4eHDw8MGBgaQkJD+/v4EBAQ7OzvS0tJ7e3sJCQn25buOAAAAkklEQVQYlXXJ1xKCQBBE0UZRMIyiGFHWnMWccwL//49ci6fFdR56btUBoITCKsSLRDU9xn88kSRKiZY2MlmTckBeLxSDWCpbQKWqwGaoBbHe4NOk1rd/sN3h06WeFPsDBgxpJMUxmc5kSjMpYr4gY0krOcJZq5st+4PAbn+AgEey/LBP58v1JuL98fTjpbneG/gA7LoNXGvGd54AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492296400;4.rect,1.1,2.80,3.570,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.589,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,408.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAk1BMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk6enp7s7OxqampKSkqlpaX///9DQ0MlJSVcXFwBAQHW1tarq6sxMTGkpKQaGhqurq7CwsIGBgbm5uaLi4uGhoby8vIbGxtQUFD+/v40NDT19fWHh4cfHx/n5+ejo6MPDw/U1NS6uroEBAS8vLzr6+tJSUk8PDwUFBQcHBxYWFjsiqRhAAAAWElEQVQImS3JVxKCQBQF0TuAxCFnCUrO6P5X59Q8++tUNcAUVXvoEBmmZTvcBTzuA0EYAXGSipHloIry+VdVN4T25RPeXU8YximQmJeVSWz7cV6iGx9OfX/vngWg6Zuk8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296459;4.rect,1.1,2.80,3.589,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,796.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABGlBMVEUAAACenp7///84ODg0NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgo8PDz+/v4eHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OQMDAwEBATT09PGxsaJiYno6OgGBgYsLCze3t58fHx+fn51dXXm5uZGRkbExMSsrKwdHR1oaGgODg4BAQFkZGT09PRVVVXZ2dmZmZnh4eGvr6/c3NxlZWX19fV4eHiAgIACAgIICAgFBQVMTEz29vYiIiKgoKCdnZ3p6elBQUGwsLAJCQnf398+Pj7FxcUbGxsPDw8jIyPQ0NDHx8djY2MtLS2Li4tJSUkuLi6MjIwgICDz8/NLS0tfX1+3t7eQkJA1NTXCwsLt7e2bm5tY3Mu8AAAA9ElEQVQokYXPazdCQRQG4Nc+SSgHnUoKkUoXKrdkJN0UKiFU+P9/w8w5rGZGa3k/zMx65/mwNyAyRwaUuObdC55FtcPSstdnP1ZMza+urfutQFDpQhthok3xikS3NL+9EwP8tCt31l583/GJZErzB2l+ZCgrd7lDHNk+ky8Ymi8e8xVOKK4t4PhTL3R/5sF56SJfBi6ZyJXkK9fVv/6mVm9A+AqJNKe+dVtmrE3tmDKP2bkDSnyee5fIw9Rb5KQr+06PT9BS9/3xIYOnT/1H+WMQYMATPc/cl+d3/hdi9j18Db69h0f4z4/NiFNMPtyfX7kZ/hsRABrTTlTe4QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296521;4.copy,1.1,1.0,2.19,3.960,3.133,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.152,3.310,3.475,2.14,1.1,1.0,3.133;4.copy,1.1,3.320,3.152,3.640,3.494,2.14,1.1,3.320,3.133;4.copy,1.1,3.310,3.171,2.10,3.475,2.14,1.1,3.310,3.152;4.copy,1.1,2.10,3.627,3.300,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.310,3.133;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAflBMVEU+mZlCoqJc4uJa399b4OBh8PBHsLBCo6Nn//9MvLxJs7NGrKxLt7dEqalLublEqKhQxsZm/f0/nZ0/nJxHsbFi8/NX2NhRycle6OhCpKROwcFk9/dU0tJRxsZBn59KuLhFqalKt7dFqqpLuLhe6elDpaVGrq5j9PRc5OQ/m5v2xg85AAAAXElEQVQImXXNNQ7AMBBEUQccbxgcZob7XzBFPO6y1dPXSMvY/xmmBdrcURLkInrkgwGFYEQxmKTZB5kXpWoV1VKxabtePxvSEZxoBhdaQZ82Peb7AZ7XrfMjGHsBFGUD0XLCD/oAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,3.627;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEU+mZlNwMBh8PBJs7NCpKRY2tpk+flBoaFAnZ1m/f1Pw8Ng7+9W1tZf7Oxf6+tZ29tb4OBe6elKuLhn//9BoKBRyspU0dFGrq5b4eFg7Oxg7u5Y2dk/m5tTzs5Anp5Tz89Fq6tPwsJOw8NAn5/yM4PiAAAAVklEQVQImXXORw6AMAwEwEBIwIHQTO/l/3/kYjsnfBppVysr9XNRrJmJsSk7AyeVvBB6IywrYd0IW3Qdu0dP0jCMxCl057CwrKzN7qTjxIt4w8P5Sy9+1PsC+zww9V4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,756.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABI1BMVEUAAACZmZn///9ISEg4ODjGxsb39/fe3t5wcHCzs7O3t7c8PDwQEBAbGxv09PS5ublOTk6JiYltbW3Nzc2Kiorp6ekICAifn5/r6+sDAwPn5+cCAgK8vLyrq6tFRUUxMTH9/f3Ozs7u7u7FxcUvLy/IyMikpKQkJCRNTU0RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgqjo6Pb29sBAQFGRkZQUFAtLS1jY2MSEhJDQ0NERESNjY1ycnL7+/uTk5MiIiIuLi5VVVWOjo4sLCxpaWn+/v4eHh4nJydiYmITExPf39+AgIAJCQnT09PS0tJWVlbW1tbi4uKMjIwODg5LS0t5eXnh4eHDw8MGBgYcHBz19fW1tbUdHR2QkJAEBAQ7Ozt7e3s4sEuOAAAAz0lEQVQYlWNgYGBkAgFmBmTAwsrGzgFmcXJxAwEPsiQvH7+AIJMQiCkswoAORETFGBjEJSSBTCkOBmk0WRlZICHHJM/AIKmgqKSgrIIiq6oGJNSZNBgYNLW0dXT19A2QZQ2NjBkYTJhMoVwzJnNkWR0mQQtLLSYrGF/LGsVoG1smPjsmewYGB0ewrBOquyycDVykgMaburoxMLi7eqD7ytPLG0j6+Po5+gcEioFEgpjEIFLBIaFh4REgVqS2RFR0DFgw1jUOIhvP5pfgw8AAAPZMFlBDHSL4AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492296595;4.copy,1.1,1.0,2.38,3.960,2.95,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.133,3.310,3.494,2.14,1.1,1.0,2.95;4.copy,1.1,3.320,3.133,3.640,3.513,2.14,1.1,3.320,2.95;4.copy,1.1,3.310,3.152,2.10,3.494,2.14,1.1,3.310,3.114;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.589;4.copy,1.1,2.90,3.627,3.220,2.19,2.14,1.1,2.90,3.589;4.rect,1.1,1.0,3.608,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.80,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.310,2.97;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAARCAMAAAA4ynbUAAAAilBMVEUAAAAJFhZKtrZHsLBIsrJY2toXOTkKGBhn/v4jV1cbQkJn//8TLy8fTEwQKCggT08PJSUtcHBl+/sECwsDBwcYPDxb4uI/nZ0weHhQxcUDCAgLHBwoY2Nf6+s5jo4ucXEGDg4fTU0QJyceSkoRKysgTk4AAQFQx8cMHh4VNDRc4+NMvLwCBQUKGRnXeAnPAAAAX0lEQVQImTXLVxKDQAwDUIcevJCw9NBLgFDuf70MrNCP32hkojMPTScVw7QUbOeJymUBeexDL35DgQyvG8VJqpqM849SUVY1ZtTIFuq4hwYeIcFfaDLnBfyt2/29H/QHEqoEccDt8BUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.591;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAC4AAAA3CAMAAABEvohWAAAAvVBMVEUAAAAnYWFY2dkbQkILGxtCo6Nh8fEIFBQECQll+fkrampX2Ng9mJhU0NBTzs5DpqZIsrJQx8cfTU1n/v4HEhIxenpn//9l+vo4i4sVNTVJtbVRyMhUz89DpaVW1NRBoaECBQU1hIQFDAw2hoYSLCwqZ2dl+/sqaWkGDw8IExMODg4LCwvs7Ozv7+8QEBAHBwfX19fb29uMjIz///8ICAiQkJD+/v4EBASsrKzY2NgPDw/z8/Nubm5UVFQBAQF1MornAAAAqUlEQVRIie3VtxaCQBSE4VWSoiiKghmzBANGzO//WB4b3O7udHrcqb9iup8xweXyiih9T9V0A/GFoolwVipD3NIgXqlC3K5BvO6YDcQ3XQvQitdqA7zTRa6wXh/iAx/RQ30E6PHEmQJ8Nl8gX4IQ0XJycr+1ry1aFAnwrGjxcrWmeVa0TbKNaf6XRdvtDzT/FO14SknNFe18ITVXtOvtTnKuaOnjSXKsaC/iswv7wIat1QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAC4AAAAMCAMAAAAqA384AAABWVBMVEUAAAAnJyejo6Pn5+etra00NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgpERET6+vq8vLxgYGAuLi4eHh7y8vK1tbVNTU3l5eW0tLQWFhaBgYHk5OT///8MDAzu7u6QkJCJiYno6OgGBgYsLCze3t58fHx+fn5ra2vs7OwHBwcBAQHExMSsrKwdHR1oaGgODg5kZGSqqqqWlpbz8/P4+Pifn58ICAjZ2dmZmZnh4eHR0dH9/f2ysrJpaWn19fWhoaHc3NxlZWV4eHj09PSAgIACAgIFBQXf39/Jyclzc3P8/PwVFRWgoKCdnZ3p6elBQUFMTEywsLCUlJQvLy89PT3+/v7FxcUbGxsPDw8jIyPIyMgwMDA2NjbHx8cJCQmDg4MTExOLi4tJSUkUFBTKyspQUFBvb2+MjIwgICBLS0tfX1+3t7coKCgEBAQ1NTXCwsLt7e2bm5tZTp5yAAABEUlEQVQokWNgYGBkYmZhQAWsbOwcnFxogtw8vHwMDPwCgkLCqBIiomLiQhKSKGJS0jKysnIMXPIKDOhAUUmZgUFcVgVZTEhVTR2oXENTi0EbTbmOLpDQk9VHFjPQZjAEKjcSMzYxNTNHUW5hCXS+lawamikg5dY2tvx29g4o4o6cDE72zi6uDAxu5iDgjlDu4enGwODl7YOi3NfPP4ABpDxQFgSCEMqtgoGMENlQFMeEhUcwMNgDHRPJCgJRCOXRIK0xsrHIysPjgNbHo3oVqjzBJRHoGHYDZPEkCaDXk2WFsShPYU5NS7dXBPMzZCEhlGkimZUtk8OARTlDLq+Jv7QbmK8QlgeRyC9gLywywKIcAE5EKApot6pXAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492296662;4.rect,1.1,1.0,3.608,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,3.627;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEX////x8fH09PQTExMQEBDv7+/4+PgoKCgkJCRzc3MAAAD39/dvb28BAQH7+/tTU1MnJyfw8PAMDAyRkZGrq6v+/v4Tm/DyAAAANElEQVQImWNgIB8wMsJYTMwsrFAmGzsHEwVmggAnFzeMycPLB2PyC8BYgkLCMCafiCiaZgAxhwD5ASJtGAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAA/1BMVEUgICD///+NjY0AAAAnJyejo6Pn5+etra0HBwc8PDxWVlZERET6+vq8vLxgYGAuLi6FhYXX19cNDQ3u7u6QkJAICAjr6+ttbW1ra2vs7OwBAQFkZGTz8/MODg6qqqq1tbWWlpb4+Pifn5/T09PR0dH9/f2ysrJpaWn19fWhoaFDQ0MrKyvf39/JyckCAgJzc3P8/PwVFRWzs7O/v7/h4eGUlJQvLy89PT0kJCRTU1PIyMiwsLAwMDA2NjaSkpLj4+MEBASDg4P09PQTExP39/fy8vJ8fHyMjIwUFBTKyspQUFBvb2+JiYlwcHD5+fkXFxf+/v4oKCi2trbp6emBgYGTmngbAAAAsklEQVQYlV3OZxOCMAwGYGoVUdyCExQHigv33ntv//9vsaXgXX0/JJc8d7kwDCCxQSp2B+uEkOFcOG7AU8h7vD4/UjIFghSGwoLRiYqRKKWxOAcTP01KMqWptCJlsqKpOYX+Ka8W+KJWIloGFVqrNR3CeqNpaKtNI+x0UemBPtaBOvzT0RiVCZhinc0Xf7pcrdHljYxU3u6s7R6IRj+wx9NZu+Cvrre7pcLDvPJ8Se+PDr/nfRK1F97W2QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296673;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.50,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.60,3.627,3.900,2.19,2.14,1.1,2.60,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.42,3.627,2.18,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.53,3.613;4.blob,1.1,240.iVBORw0KGgoAAAANSUhEUgAAAAQAAAANCAMAAAC5ID+EAAAAQlBMVEUAAAAODg4LCwvs7Ozv7+8QEBAHBwfX19fb29uMjIz///8ICAiQkJD+/v4EBASsrKzY2NgPDw/z8/Nubm5UVFQBAQGd7GnHAAAAK0lEQVQImXXBBQEAIBAAsXvcnf5VScAGIqC0sTgfFH8xZSi1QR8w14Z2Lg8RkQD5SBazewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,952.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABaFBMVEUAAAAiIiKsrKzr6+vq6uqoqKggICA0NDTAwMD39/eYmJgNDQ0DAwNPT0+2trYKCgoICAja2trX19dVVVVYWFjb29seHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYHk5OT///8MDAxGRkY8PDw9PT1JSUmJiYno6OgGBgYsLCze3t58fHx+fn5HR0ctLS0rKytLS0vExMQdHR1oaGgODg4BAQFkZGTd3d0fHx/c3NzZ2dmZmZnh4eEoKCjx8fHw8PAlJSVlZWX19fV4eHj09PSAgIACAgIFBQXPz8/Ly8tMTExOTk7Nzc3Ozs6goKCdnZ3p6elBQUGwsLBpaWn7+/sYGBgZGRn6+vr+/v7FxcUbGxsPDw8jIyOUlJSXl5fHx8cJCQl6enr5+fkTExMUFBR7e3uLi4suLi5QUFBRUVHIyMgVFRWMjIzz8/NfX1+3t7eysrLs7OyQkJAEBAQ1NTXCwsLt7e2bm5vqU4lGAAABHElEQVQokW2QZ1PCQBiEV1AQLInYKEFeC0bBgooKSkSxYxcLsYu9g/XvewfjzJ2T/XBzs/t82H0BVNns1TUOSHLWuuzuOtlDfUOjAqhNnuaWVo8qJm3tXp8/oEl0sCNE1Al0UTfQQ2Ex69X7AB/1i54/Eh3g/CANAcMUE7MRG3tGaUz04uOY4Lw6qSUS3qTUZ2qaTUhR9N+AMg9jhig9KwVJN+Yy8wuLwJLKtSzwyspqdm19Q5H4za3tHXA+S1y7Ap/b2wcODnNSn7x5BGRYn2Mn14nAn6b4N3Im8uY5a3Ah7/3jLwtXwHXhRgxuA2x+mO6s+KBu3j886k/ceKbKmRwvWuw19AYrHkaxVCoaZeM9/1FJPr9c3z9xC/4X3H4rcWoU/8gAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492296757;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.627,3.950,2.19,2.14,1.1,2.10,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.627;4.blob,1.1,748.iVBORw0KGgoAAAANSUhEUgAAABwAAAATCAMAAAC0hZ1zAAABJlBMVEUAAAA+mZkwd3dW1NQUMjJm/f0LGxtCpKRHr68+X18+W1s6kJBMvLw8lZVAn58+ZGQ+YWECBARe6ekmXl4iVVUucXEGDw82hoY6j48ECQkoZGQfTU0+e3s+cHA+lJQ+amo+ZmY+lpY+dXU+fn4eS0tj9PQECwsyfHxh8fFX19dV09Nf7Oxl+vo3h4c+bW0+Q0M+QkI+TEw+TU0+REQ+QEA+aWlEqalCo6MBAwMbQ0Nk9/cfTEw+mJg+gYE+QUE+fX0+lZUcRUVBoqJJtLRSy8s4ioo+WVk+UFA+aGhc5OQBAgIqZ2cPJiYZPT1n/v4+dHQ+i4s+g4M+Pz9OwsIjVlY1goJAnp4hUVE+eno+a2s+YGA+fHwNISESLCwyfX1Tzs5W1tYtcHAIXVhxAAAAxElEQVQokWNgwACMcIApR5IkEzMeSWYm3JIsrGwQYXYOmCQnF0ySmweqh5cPJskvAJUUFBIGiYmIiolLSEpJMzDKyMrJKygqKYMkVVTVQJLqGqqaWto6ugyMevoGhkbGJqYgSTNziKEWllaq1mogY21s7QzsHUDGilk5Qq10cnZxhdjJ6ebuAbZTytMLIuet4+PrZw2S9DcJCAyyB0kGu0I1hoQyMISFgyQjIhkZo6KBkjF+sbiDLy4eT9gmJFISK2RJAgCfUBWsZpOThwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,1128.iVBORw0KGgoAAAANSUhEUgAAAIoAAAAMCAMAAACKsNWTAAABm1BMVEUAAAA4ODjGxsb39/fe3t5wcHAgICD///+NjY0FBQV+fn7k5OT5+fnS0tJOTk4ICAiBgYHl5eX29vbQ0NBbW1sbGxv09PS5ubmJiYltbW0HBwc8PDxWVlZERESenp7s7OxqampKSkqlpaVDQ0OkpKTu7u5GRkaPj49PT0+Kiorp6emfn5/r6+sDAwOFhYXX19clJSVcXFwBAQHW1tarq6sXFxfLy8u0tLS8vLxFRUUxMTEaGhqurq7CwsIUFBTBwcG2trbIyMgkJCRNTU1kZGTz8/MODg4GBgbm5uaLi4v9/f1MTEyjo6Pb29tQUFDT09OWlpaGhoby8vJ3d3dBQUESEhIrKyv+/v6Xl5dycnL7+/uTk5MiIiKzs7O/v780NDT19fWHh4e4uLjOzs4sLCwKCgppaWnn5+dTU1MfHx8YGBhgYGDt7e0TExPf39+AgICSkpLj4+MEBAQPDw/U1NS6urphYWG3t7fMzMxLS0t5eXnh4eHDw8OMjIx8fHxJSUmpqak7Ozt7e3sJCQmQkJAcHBxYWFgLCwtRUVHP7DoBAAABbElEQVQ4jWNgYGRiZmFlQAZs7BDAwUBDwMnFzcPLB2LxCwgKCYsAGaJi4nwS7JLIqqSkQUCGXZaWTpGTV1BUYlcGslRUJdXU2TUYGDS1+BkYtHV0MdTq6dPSJQbshgwMRsYmDAym7ApAvpk5A4MFkMdgyW6FrpZfRxJDPxWBlYo1kLSxZWDQteMEsuwdGBgcVYAMJ3ZndLUurm60dAoYuHt4gmkpU1YvbwYGH18jBgY1dj90Zf4BNHcJQ2CQKJgWY2cPBlIh7BKhyoIYSVSZPYzmLvELN4QwrJQjvEBhERnFLhbNHoOmLDaO5i6JT0hEcJKSQWRoSmpauhGqMievDFq7JDPdB2xpVrYdkNTMgYjm5uWjqSsoLKKxS4pLSjnBDCf2MiBZXgEk3CqrqmvcwaK17PwQdW5BdTR2SZGFTj2oIAWGSEOOghoHOAs3MvM2NUPkW8KhYcHKY0pjp7RCK5c2Bob2xDyxig4GBgCo5DML49QEowAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492296814;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.60,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.70,3.627,3.890,2.19,2.14,1.1,2.70,3.608;4.rect,1.1,2.42,3.630,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.61,3.613;4.blob,1.1,5624.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.649;4.blob,1.1,1000.iVBORw0KGgoAAAANSUhEUgAAADEAAAAMCAMAAAD8pqVdAAABcVBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk40NDTAwMD39/fr6+uYmJgNDQ04ODjGxsbe3t5wcHCenp7s7OxqampKSkqlpaX///9DQ0MeHh7y8vK1tbVNTU1gYGDl5eW0tLQbGxv09PS5ubmJiYltbW0lJSVcXFwBAQHW1tarq6vo6OgGBgYsLCyKiorp6ekICAifn58DAwMxMTGkpKQaGhqurq7CwsLExMSsrKwdHR1oaGi8vLxFRUXm5uaLi4vZ2dmZmZnh4eF8fHzIyMgkJCSGhobc3NxlZWX19fV4eHiAgICjo6Pb29tGRkZQUFD+/v6goKCdnZ1BQUESEhJERESHh4fFxcVycnL7+/uTk5MiIiIfHx/n5+fHx8cJCQkKCgppaWkPDw/U1NS6urpJSUkuLi4TExPf398EBAQ8PDwUFBQgICDz8/NLS0tfX1+3t7eMjIwODg55eXnDw8McHBxYWFg1NTXt7e2bm5uQkJA7Ozt7e3vI72tTAAABOElEQVQokVWR6TsCURSHT1LMZF9OkqkMDUpRZIlSSERRZEu2kCVkX/56Z2aex73zfvjNe85z9wEwNZgbLVZQaWoWRFuL0RitbUJ7hyqdXd09vWgn63P0Owckl8EYbs+gVcYhgGH0Aigjo9STx3wATvTzxhgPBAEmxEkIhaeonI5QzMxSzOE8b4youugChvTKtxijjC/RBRKY5I2xHKZYQaderTrclCkbrKXXPRu8MTKbCsAWZrUim/Oqn9T2TiAP2ox/Y+RRLtgl3NWeMr2n9eK5Im2VTvLGsX+AnkM8IjsuZRStVTwxAZTV+zLjKfhPz0o09Pzi0qR3YhK9XwWveDNyfUMHrUbFyi1xB3D/4Ko9mp+AN4BnDOrD67WXxCv9pzfUeafeR0T4/KqDweA7V9Vn/AiW3zLAH0UpO+cWPimXAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492296833;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.91,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.630,3.338,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.614;4.blob,1.1,5708.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAAM1BMVEUAAAADAwNPT0+2trYKCgoWFhaBgYHk5OT///8MDAxgYGDe3t58fHx+fn4ODg4BAQFkZGRj/53qAAAAKUlEQVQImWNgYGBkYmZhYGBgZWPn4OAEMri4eXjBDD5+BgEwAwiowQAAYWcBu6p1dmgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492296920;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.71,3.627,3.356,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,3.627;4.blob,1.1,332.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAb1BMVEU+mZk+X18+W1s+ZGQ+YWE+e3s+cHA+lJQ+amo+ZmY+lpY+dXU+fn4+bW0+Q0M+QkI+TEw+TU0+REQ+QEA+aWk+mJg+gYE+QUE+fX0+lZU+WVk+UFA+aGg+dHQ+i4s+g4M+Pz8+eno+a2s+YGA+fHziCT01AAAARUlEQVQImWNgIB8wMsGZzCwQmpWNnYOTi5sHyOTl4xcQFBIWAQmLionzS0hCdUlJy0BYssJy8goSYKaiEgODsgoFboEDABGsAtZ0VmvhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,752.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABKVBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk4nJyejo6Pn5+etra2enp7s7OxqampKSkqlpaX///9DQ0NERET6+vq8vLxgYGAuLi4lJSVcXFwBAQHW1tarq6sNDQ3u7u6QkJAxMTGkpKQaGhqurq7CwsJra2sHBwcGBgbm5uaLi4uqqqq1tbWWlpbz8/P4+Pifn58ICAiGhoby8vIbGxvR0dH9/f2ysrJpaWn19fWhoaFQUFD+/v7f39/JyckCAgJzc3P8/PwVFRU0NDSHh4fh4eGUlJQvLy89PT0fHx/IyMiwsLAwMDA2NjYPDw/U1NS6urqDg4P09PQTExP39/cODg4EBATr6+tJSUk8PDwUFBSMjIzKyspvb2+JiYkcHBxYWFgoKCi2trbp6emBgYFkhFA3AAAAxUlEQVQYlWNgYGRiZmFlY0AD7BycXCCam4eXj19AEFVSSFhEVAxIiwtIMDBISkmjSMrIykEY8gqKQFJJGUVWhUeVQRLOU1PXQJHV1NLW0dXTh/IMDI1QZI1NTIXMzC0gHEsrCVRHWdvYMjDY2TuA2I7mTmj+cXYBEq4CbkDSnZNDEk3WwxNIeAl4MzD4+Poxokky+AcEAk0OCmYIEQkNCweCCJBopADEnRGcUZbR5jEMDLECEBAHEpWzCoFojk/QSUyyZQAA7UwXwXosBSIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492296932;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.50,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.60,3.627,3.900,2.19,2.14,1.1,2.60,3.608;3.img,1.1,2.14,1.1,9.image/png,2.50,3.627;4.blob,1.1,1724.iVBORw0KGgoAAAANSUhEUgAAAGMAAAATCAMAAACzx0NmAAACW1BMVEUAAAA+mZkFDAw4iopb4eFj9fVLubkSLCw4i4tV09MDBwdOwMBNv78iVFQdSEg7kpJf6+sMHh4HERENICBFrKxRyMhCpKRHr68wdnZHsbEJFxdPw8Nm/Pwwd3c8lZVAn58BAgJc5OQLHBxFqqolXFxOwcEECwta398+X18+WFg+aGg+RkY+QkI+W1s+kZEsbGxl+fkRKytKt7dl+/seS0sqaGhn//9e6OgHEhJk+PgsbW1Z3Nw+mpolW1tSzMxj9PRc5eUIExNi8/Ng7u5Anp4GEBAiVVUucXEGDw82hoY6j48ECQkoZGQfTU0VNTVPxMRg7e0UMTFa4OA+Pj4+Wlo+gIA+c3M+QUE+VlYxenobREQKGBgYPDxDp6cWNjYXODhm/f00gIAbQ0NX2NhKuLhW1dUIFRVV0tIoY2MyfHxh8fFX19df7Oxl+vo3h4cmXV0/nJwTLi4dR0c9lpY+Sko+lpY+dXU+iIgmXl43iIgPJCQOIiIVNDRi8vIbQkIUMjIBAwNk9/cfTEw1goIcRkYAAQFY2to+UVE+k5M+dnYzf38vdHQgUFBW1tZGrq4DCAhj9vYrampBoqJJtLRSy8sqaWk5jIwNHx85jY1Fq6s+bm4zfn4aQUEJFhYeSkpn/v5DpqYuc3MqZ2cPJiYZPT0CBgZTzc1a3t4jVlYhUVEYOzsKGRkIFBQ+S0s+mJhY29s9l5cLGxsye3sra2s+XV0+gYEQKChd5+cCBAQxeXlf6upU0NAcRUUSLS0kWlpTzs4+T08+amo+REQ3iYkyfX1b4uJKtrZGra1h8PBa0RwWAAACa0lEQVQ4jWNgwAsY4QC/OkrAULeDiZmFlY0dtx0cnBRbwcXNw8vHLyCI0w4hYTy6RUSxCIqJowlISEpJy8jKMpIXVljtkJNH5SsoKokpq6iqqTMwamhqaevo6oHs0DcwNGI1NmFgMDUzMzMHqbOwtAJR1jZAwtbO3oHREchQNAMDkISgspOziyuQ4ebu4enl7eOLZIefP1cAU6AIQxAXo0ZwSGhYeATYDjOHyCjeaAaG6JgYMbAdDLEgF8eZxQNNSUhMUklOAWmO4UmNiYkBstIU03kzzI2ArMws+2zOnNw8JDvyCwqlGYqKGdK9GTVKShkZy4LLwXZUwFVUQuyIMqtiYPBKBbKqa4CxmG/miBxWHLVAB9WZ1QOZDUmN9k1qyGHl3twizpCf2NoGDKt2YFx0BHeC7fBGt6NVvYtBwaEbxOwRdQKGkDCyHb19/f393hMmgtiTJk9hRomPqdPiraenzKiYCbWDMXwW2I5+dDsYZrcxzMmdC2TMm7/AxG8hqh0BkJgBhdCi3MVL5jch2xHFs9Q612eCvSGaPzDtEEyIswEnysnLQH5BtWP5zBoQUAIyVzQzMLisRLajP2eV2mqG1WuAeVBj7TpGxk5ofGDawZBSHABOLUY8QCITYgfjeojchiAmILmRATtYlLUpqmczSLlG8JatZTrQdAW1A5SuAmJitoHYbpbbd4CDd/7OIo4EM0MQO9+sa44K0IFpu3bn7+HI3YvDkn37G7fvBNtx4OChcGj+gNlhCglnERB7qcBhsFjrkaMTju0LMgGzZwQYZINMrjp+wok7CYcVcACNc9qWu8PFDmrUHwAW45zNFyxT0QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,752.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABHVBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1s4ODjGxsb39/fe3t5wcHCkpKTu7u5tbW1GRkaPj4////9PT08bGxv09PS5ublOTk6JiYkXFxdqamrLy8u0tLSKiorp6emfn5/r6+sDAwMUFBQFBQXBwcG2tra8vLyrq6tFRUUxMTEHBwf9/f1MTEzIyMgkJCRNTU13d3ejo6Pb29sBAQFQUFBDQ0OXl5dBQUESEhJERES4uLjOzs5ycnL7+/uTk5MiIiIYGBhgYGDt7e0sLCwKCgppaWnn5+dhYWG3t7fMzMwTExPf39+AgICpqamNjY2MjIwODg5LS0t5eXnh4eHDw8MGBgYLCwuHh4dRUVGQkJD+/v4EBAQ7OzvS0tJ7e3sJCQn0StQZAAAA0ElEQVQYlWNgYGRiZmFlY0AF7BycXNwgBg8vH7+AoBCKpLCIqJi4IB8Dg4SgJJArJY0iKyPLyMAgJ6/AoKCoBOQqq6DIqqoBCXVBDRBbU4JbSxtFVocHSOgK6oHYIoKC+qiOMjA0YmDgFzQGsTVMTLWMUWTNBMXNTZgFLaBcSytUzdY2giK2gnYM9g6KIEc6onnY3MnZxdUIaLcbkOPuwYAOPL28gaSPoyS/L8R5DH6CjBAp/4DAoOAQICM0zEvEIxwiGBEZBWFEc8bExjEwAACSnBXiBym7KQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492297013;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,3.131,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.614;4.blob,1.1,2884.iVBORw0KGgoAAAANSUhEUgAAAO4AAAAgCAMAAAAi0rTUAAAC3FBMVEVCpKRKuLg4iopf6upj9fVGra0JFxcAAAAsbGxl+fkRKytKt7dl+/seS0sqaGhn//9e6OgHEhJk+PgsbW1Z3Nw+mpolW1tSzMxj9PRc5eU+mZkIExNc5OQMHh5Fqqpi8/Ng7u5Anp4GEBBHsbEcRkYrampj9vZMvb0xenobREQiVFQKGBgYPDxDp6dRyMgWNjYXODgiVVVm/f00gIAbQ0MlXFxX2NgVNTVNv79W1dUIFRVV0tIoY2Na3t4CBgYpZWUUMTEmXl43iIgPJCQ6j48OIiIVNDQDBwcmXV1FrKw4i4ti8vIbQkIUMjIHEREoYmIECQkAAQFa398zf38BAgIvdHQgUFANICBW1tZGrq4DCAgzfn5Y2toaQUFl+voJFhYeSkpn/v5DpqYuc3Ng7e03h4dHr69JtLRTzc1Fq6sLHBwTMDA9lpYfTU0yfHxY29s9l5da4OAFDAwLGxtEqKgcRUUpZmZMu7sQKChd5+cCBAQqaWkxeXkdR0cIFBRU0NASLS1Uz881g4Nf7Oxf6+s3iYkyfX1b4uJKtrYkWlo5jY1X19dh8PBOwMBHsLAnYWFY2dlIsrIXOTlW1NRBoKBCo6Nh8fFV09MjV1cTLy89mJg+X18+WFg+aGg+RkY+QkI+W1s+kZFRycknYGBc4+MfTEwgT08aQEAvdXULGhoPJiY+Pj4+Wlo+gIA+c3M+QUE+VlZm/PxOwsIPJSVJtbVSy8tLuromX19QxcVTzs4GDw8+Sko+lpY+dXU+iIhb4eE0gYEtcHAECwtd5uYhUVFQx8cdSEgRKio+UVE+k5M+dnY/nZ0GDg4+bm4weHg1goJBoaFh7+85jo5Lubk8lJQra2sBAwNk9/cQJyc+S0s+mJgucXE8lZUXOjoECgowd3dU0dE+XV0+gYEdSUlPw8NDpaU+T08+amo+REQhUlJMvLxe6ekKGRkWNzcgTk4CBQU1hIQ2hoYSLCwqZ2c1Tix1AAAFUElEQVRYhe2Y+18UVRjGh5BeV8CDJAkjhEWsu7CBoIISYkoBEhmkaSEga5sUCTkaUZGsCImaaSKasJVd1C5UhBqpZXQjy26Ypt3sfjXLLv9A58zsnDkzOyDs9Fk+pe8PZ959d953n+/Oztndh+P8zvEfEnAu4BhqGhY4JCgYYDhCKIRURoSeRw4jw/By/qjwCH40TiKRGOSJqAuix1x4Efx3guNQzMWx5rEkH4oiLNa4eIB4m40TceGSBLwkonEAScnjJ0xM8cMPU22TJttsNpylRV4alx4SOFjavQiOm5IBMBVdBgR3Gq1Pl3CtKBPg8sk4uyILIDsHkcsLMxKkk3KvxO9NHrrK16K9D44bhdeZ6GoguPm07sYtuGYWzI64lqRzEqLxR3guSWXc664vLCzMN8f6VrKRkHDBZAGCW0jrblyYVwTFJfNxUmpfEJx6gxrXId3FN/pUsaGQr2466ONGJSeGLSRJ2U14maPGnXJzFolyXwo2FhxXNBsgHd0C+rjgt8hRQY6Bk/BSKeHyt0rPLRaW4HWpD+UaDbwz31Z1e3g1ySku2ZkdNtsdJE8KvfMucqyx370sNxkNI3kOmlU8sRbvzP7OnKrckuWDI92b4Li6FfXmgDSSU9zh0j05g+QZDfeItYKVjeZVq4VgMV/jMN1LIDMD1kbfN2EwdHsZ7q3qTImzuP/n4AZbgG+D4+UYbCU+ibO4A4v5q9YZ1bD+/jyjI/obhnE3FDXhVdhYgNfQSv1zmp19jli6aXNtX8/nPuClNs8wihtv30IOAorDq8k7XMg3ef6pkn+X45g5t19SmI5ewyhuHmohBwE58eUt8RIXUlo9Sv0RP/AOzvXgQw9vfeRRgkvtGcXGoTUrWhH92OMN24o1/duR+MtaqEM7AIIwbutI/DALPcF2NDufDDHHPEVOVOwe5TUAnJs0YxWDiBpJrAJlyvIyh3/A06oOPc2yRcW52p559rn25zGuYs8oNg6tWdGa1R3OZQk7Nbp2oF0ibtjuFwA61Li0oxl1Br/o2AMqu4e+Bo69CzRjFYOIGknMPGVKbX3n9iRn4z62Q0+zbFFxrpde5vn9ba/wrD1DbRxas6Jy6HoV5nVpdL0W9LqIyyeiUkhW49KO5jeyAd5ETSq7h7WKNnSDNpiP5nQ3Lp2nTHkLHQDYVZbKduhpli0qzvU2vm/faTvIs/aMYuPINdIqjIfKSJWmbFvju2IitEJgN9i1uO4O8d7Ntseq7B7WKqqwx47oD657njIlrWFsxXvaDh3NskUl4fLt7/OsPUP/CtKaPu4HaI90orAYxqEq1BcurP1QZfewZgJYkHY36wuXmZLZc6iks0nVoadZtqiYq8vYM1QKrenjlqc3fCThLgI4vJPgHunqBTfD/rHK7mFx80pyUweAqzKNjjbFHPuE7dDTLFtUnOvTz3j+ILl3GXuGSqE1fVyAz4PEz5LwBcBxRHAtoV+SF1PjRuI7J4m41Yzdw+Lu9vwOkQ0iPVxlyldfH8X7FVrPduhpli0qvDN/8+3+rWRnZuwZKoXWesOtQOI7KxzBSzXBPdDRY60J0eDa/b6bNuZ7UNk9LG7dDx64skFEjSRmnjKl5di64NKF4Zlsh55m2aLiXD/+9HO7+L3L2DNUCq31hlsquVciro3gwi8poXu3aHBPWH41x5wkJyp2D4u7sccDVzaIqJHEKlCm/Ha4/lD1cVWHnmbZonJvVV7/qmpBv3vXyMapzX8YH9JnyCaGUdyCou4oo1qW/Gn/y+iM08S/hQtZ204Y1fJ3UI3REacLimv47/2pk0a17BttdEK/4x+jhXw2jMWoNAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492297027;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.70,3.630,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.633,1.8,2.12;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;4.rect,1.1,2.91,3.633,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.629,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.110,3.629;4.blob,1.1,2460.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,420.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAACZmZn///9ISEizs7O3t7c8PDwQEBDNzc2Kiorn5+dwcHACAgIDAwP9/f3Ozs7u7u7FxcUvLy8RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgotLS1jY2ONjY0uLi5VVVWOjo5QUFD+/v4eHh4nJydiYmIJCQnT09PS0tJWVlbW1tbi4uIICAgcHBzr6+v19fW1tbUdHR1v3ovhAAAAXklEQVQImTXKRxKCUAAE0SapIBIkCQaC5Oz9L+eXwl69qhlAkn8pgKodREehk86eccbccLFsx3KvQp4fhNEtTvbHXX78z/4TXummDPLiDWVRQd20adcPoximYF7WD1/BsQVyvPN55AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492297115;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.80,3.614,2.10,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.630,3.487,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,3.627;4.blob,1.1,332.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAb1BMVEU+mZk+X18+W1s+ZGQ+YWE+e3s+cHA+lJQ+amo+ZmY+lpY+dXU+fn4+bW0+Q0M+QkI+TEw+TU0+REQ+QEA+aWk+mJg+gYE+QUE+fX0+lZU+WVk+UFA+aGg+dHQ+i4s+g4M+Pz8+eno+a2s+YGA+fHziCT01AAAARUlEQVQImWNgIB8wMsGZzCwQmpWNnYOTi5sHyOTl4xcQFBIWAQmLionzS0hCdUlJy0BYssJy8goSYKaiEgODsgoFboEDABGsAtZ0VmvhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,976.iVBORw0KGgoAAAANSUhEUgAAAIoAAAAMCAMAAACKsNWTAAABX1BMVEUAAAAnJyejo6Pn5+etra0FBQV+fn7k5OT5+fnS0tJOTk6enp7///84ODhERET6+vq8vLxgYGAuLi7s7OxqampKSkqlpaVDQ0M8PDz+/v4NDQ3u7u6QkJAlJSVcXFwBAQHW1tarq6sEBATT09PGxsZra2sHBwcxMTGkpKQaGhqurq7CwsJ1dXXm5uZGRkaqqqq1tbWWlpbz8/P4+Pifn58ICAgGBgaLi4sdHR309PRVVVXR0dH9/f2ysrJpaWn19fWhoaGGhoby8vIbGxuvr6+2trbf39/JyckCAgJzc3P8/PwVFRVQUFBMTEz29vYiIiLh4eGUlJQvLy89PT00NDSHh4cJCQmAgIA+Pj7IyMiwsLAwMDA2NjYfHx/Q0NCDg4MTExP39/cODg4PDw/U1NS6uroWFhZjY2MtLS0UFBTKyspvb2+JiYmMjIzr6+tJSUkoKCjp6emBgYEcHBxYWFgr29TmAAABN0lEQVQ4jbWTV1PCQBRGr0RsbChiIYqAsRcsaFBssYGo2Bv2LmJv/3/couMS93H3POzNPfkevplNAKDMpZWDA5GTi7uisqq65nfzIB2fXp8/UOvIiZxkPMG6+gbUyJaQQao0NYf/xUROMi0oAhCNtdLFbGsnVTqCnRB15EROMl3dPfjs7aNLf3yAVBkcGk6MjFolOZFTQTI+RsZ4akInVSanpr0z9mxJRORUMDe/QMZiGmiVzFIWYHlllY+InAJyRoSMtfUNVmVzC2/baIfPiJx8du09MvYzB5aVR/kkHB7h9Rid8CGRk86p5qK/RgAxzuA8dYEv4/KKT4mcbK5vbt304U7HFFDhHoraQ+7RfqL2GbG/hneKMP0vryFMka30W4G3dOL9I0tF2DDZG84p4vPnWr7+qnwD0ogxrdG60skAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492297130;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.50,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.60,3.627,3.900,2.19,2.14,1.1,2.60,3.608;3.img,1.1,2.14,1.1,9.image/png,2.50,3.627;4.blob,1.1,2336.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAA/FBMVEUgICD///+NjY0AAAA4ODjGxsb39/fe3t5wcHAHBwc8PDxWVlZEREQbGxv09PS5ublOTk6JiYltbW2FhYXX19eKiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTFkZGTz8/MODg7IyMikpKQkJCRNTU3T09OWlpajo6Pb29sBAQFGRkZQUFBDQ0MrKytBQUESEhLl5eWzs7O/v79ycnL7+/uTk5MiIiL9/f1TU1MsLCwKCgppaWnn5+eSkpLj4+MEBAQTExPf39+AgIDy8vJ8fHyMjIxLS0t5eXnh4eHDw8MGBgb5+fkXFxeQkJD+/v47OzvS0tJ7e3sJCQnwR+ETAAAAtUlEQVQYlWXPZQ/CQAwG4JUiA4YNGQ6D4QyGu7vb//8vcDtIOHg/NNc+aZPjOKAx4HeMJrOFR+SsNhI7CN/ocLrcHhCRo63Xx6z6AxJiMBSmKoVERiPRV4lBnGoiKTOaSr+KAhmq2RyDmC8UEUtQ1lWFCqtV8GhqDQRd6w38SbMFzjZ0iCrd3q+i1h8MR0Wi48n0TxFn8wX5r7xcfSZrkOhD3mx3+wNR/nj66PnyvnI13+4PxCcloBJAanJAzwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492297212;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.70,3.630,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.633,1.7,1.9;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;4.rect,1.1,2.91,3.631,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.82,3.614;4.blob,1.1,4184.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAt1BMVEUAAAAiIiKsrKzr6+vq6uqoqKggICAICAja2trX19dVVVVYWFjb29tGRkb///88PDw9PT1JSUlHR0ctLS0rKytLS0vd3d20tLQfHx+1tbXc3NwoKCjx8fHw8PAlJSUKCgrPz8/Ly8tMTExOTk7Nzc3Ozs5paWn7+/sYGBgZGRn6+vqUlJTh4eHe3t6Xl5d6enr5+fkTExMUFBR7e3sWFhbo6OjFxcVQUFBRUVHIyMgVFRWysrLs7Ow9QRCDAAAAbklEQVQImRXL6RJCYBhA4dMqqVelUAptSotQ2rj/6/L5d2aeOUCr3en2+oA20IfGSNdgLCZMZAozsWAuC6W247rLlVK8tcjGVxGE293+cAwgOp0hvkRwvSngnsAjzSBPn/Aq3p/vr/g3b1lVpUcNcVII+u7rkvcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492297230;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.82,3.614,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.633,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.630,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.110,3.628;4.blob,1.1,3172.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,460.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAMAAABoQAyvAAAArlBMVEUAAAA4ODjGxsb39/fe3t5wcHAbGxv09PS5ublOTk6JiYn///9tbW2Kiorp6ekICAifn5/r6+sDAwO8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29sBAQFGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCwKCgppaWnn5+cTExPf39+AgIAODg5LS0t5eXnh4eHDw8MGBgY7OzvS0tJ7e3sJCQkucowcAAAAZklEQVQImQ2K1xKCQBAEW044YM1iREVMmMFE+P8fc+dhqqtnoOWYtgt41g9C6UC314fBcMQ4Uj2RKbO5wkKWxKs1bCRhK2G628sBjiexmZz1kF6ut7vumscz1y5e78/3p1Caqm7gDxd5BxVT9omaAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492297315;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,2.80,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.628,3.606,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.60,3.627;4.blob,1.1,300.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAV1BMVEU+mZk+b28+Tk4+h4c+Pz8+kJA+ZmY+VlY+mJg+RkY+eHg+fn4+QkI+lZU+XV0+X18+lJQ+QUE+gYE+dXU+R0c+VFQ+aGg+jY0+ioo+bGw+T08+TU0+cXEKV5F2AAAAQ0lEQVQImY3OSwJAIABF0X5IIYSi9r9Oo9u4Nzqzd4Xom1SNSiJtBjhOyM4O+mWFW0D7ccJ4WXg/KJkM36+dltoZ+gOJNgGm29GPlwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,760.iVBORw0KGgoAAAANSUhEUgAAACYAAAAMCAMAAAA51D/MAAABGlBMVEUAAAADAwNPT0+2trYKCgo0NDTAwMD39/fr6+uYmJgNDQ0gICD///+NjY0WFhaBgYHk5OQMDAweHh7y8vK1tbVNTU1gYGDl5eW0tLQHBwc8PDxWVlZERETe3t58fHx+fn6JiYno6OgGBgYsLCyFhYXX19cODg4BAQFkZGTExMSsrKwdHR1oaGgICAhtbW3Z2dmZmZnh4eHz8/Pc3NxlZWX19fV4eHj09PSAgIDT09OWlpagoKCdnZ3p6elBQUFDQ0MrKyv+/v7FxcUbGxuzs7O/v7/Hx8cFBQUJCQkkJCT9/f1TU1OLi4tJSUkuLi6SkpLj4+MEBARLS0tfX1+3t7eMjIw1NTXCwsLt7e2bm5uQkJBwcHD5+fkXFxfLSVYjAAAA2klEQVQYlWXP+1cBQRQH8K8k5FZYryTltZZab5Ge5F2ehZD//99gzR5nZ/r+MPecO58zcy8A05H5GFosJ1ab/RSGOIjlDOcXTiKX1nNLHq/PHzCyy6CWKwrBdx2+Yew2EgW8FIOYeAKQk1AYS6V3xx3di0q1ZfZVZ9ncbrw8hUWmFGQjK9pRKj9UqiJ7rIFjT88vr/jH3uidY9l64wMoi582W+BYo90BuuIKvf4nz778KjCgIc9G4wnPHIXA9Nv5s2/NSGV3snQYQmeYL6y/S7b8qq6/sf7baGULjwsYyZhrn7wAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492297329;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.60,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.70,3.627,3.890,2.19,2.14,1.1,2.70,3.608;3.img,1.1,2.14,1.1,9.image/png,2.40,3.611;4.blob,1.1,6108.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAABwAAAAMCAMAAABGBS09AAAA2FBMVEUAAAADAwNPT0+2trYKCgo4ODjGxsb39/fe3t5wcHAWFhaBgYHk5OT///8MDAwbGxv09PS5ublOTk6JiYltbW1gYGB8fHx+fn6Kiorp6ekICAifn5/r6+sODg4BAQFkZGS8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29tGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCxpaWnn5+cTExPf39+AgICMjIxLS0t5eXnh4eHDw8MGBgaQkJD+/v4EBAQ7OzvS0tJ7e3sJCQn25buOAAAAkklEQVQYlXXJ1xKCQBBE0UZRMIyiGFHWnMWccwL//49ci6fFdR56btUBoITCKsSLRDU9xn88kSRKiZY2MlmTckBeLxSDWCpbQKWqwGaoBbHe4NOk1rd/sN3h06WeFPsDBgxpJMUxmc5kSjMpYr4gY0krOcJZq5st+4PAbn+AgEey/LBP58v1JuL98fTjpbneG/gA7LoNXGvGd54AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492297413;4.copy,1.1,1.0,2.19,3.960,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.627,2.80,2.19,2.14,1.1,1.0,3.608;4.copy,1.1,2.90,3.627,3.870,2.19,2.14,1.1,2.90,3.608;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.40,3.627,3.668,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.612;4.blob,1.1,248.iVBORw0KGgoAAAANSUhEUgAAAAgAAAALCAMAAAB1RTwXAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAAM0lEQVQImWNgYGBkYoAAKIOZBQwYGFjZ2DnY2NiQpPAyOLmgDG4WHl4+fiBDQFBIWEQUAB7qASGj7YbBAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,876.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAMCAMAAADFwRQGAAABRFBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk40NDTAwMD39/fr6+uYmJgNDQ0DAwNPT0+2trYKCgqenp7s7OxqampKSkqlpaX///9DQ0MeHh7y8vK1tbVNTU1gYGDl5eW0tLQWFhaBgYEMDAwlJSVcXFwBAQHW1tarq6uJiYno6OgGBgYsLCze3t58fHwxMTGkpKQaGhqurq7CwsLExMSsrKwdHR1oaGgODg5kZGTm5uaLi4vZ2dmZmZnh4eGGhoYbGxvc3NxlZWX19fV4eHj09PSAgIACAgIICAhQUFD+/v6goKCdnZ3p6elBQUFMTEywsLCHh4fFxcUPDw8jIyMfHx/n5+ejo6PHx8cJCQnU1NS6urpJSUkuLi4EBAS8vLw8PDwUFBSMjIwgICDz8/NLS0tfX1+3t7ccHBxYWFiQkJA1NTXt7e2bm5v6IMq1AAABCElEQVQokW2PV1MCQRCE+zjxBMxhFAkGzoCiiAEEA5zgeWYwixgwh///7i6U1s0W/bBV2/3VzDSgefQ2bzu4jA6fP9CpmF3dPb1AX//A4BANs2QkOBoKR6LMGxvXiSYwSTHAnJpm2cxsHAjRnNsLzyc8gl9YTIrPUorxyyviWaU1t5c2kRF8Q/H1LONzG6LCJiWUAv/8VnCbBfkACtZOsQTs2lIa5/ecGB+U3z84PILkj0nqhPGGdaoszjllsdAS91QMqTM3f35xaSp8+UpccM37/vGVm1tN8ZGN2ECV7lrwtXt/9UHoURpPZDeC+nP05VV/U8dI/p2a+pDGp1NrJl8p3/dPugX/C4YIJUro3qRlAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492297469;4.rect,1.1,1.0,3.627,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.649,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,3.608;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEX///9TU1M3NzcbGxsAAADKysrDw8NAQEAqKipmZmYkJCSioqKAgIC+vr6jo6Pr6+v+/v5ycnISEhIGBgYoKCjS0tJCMVh9AAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAA2FBMVEUAAAADAwNPT0+2trYKCgo4ODjGxsb39/fe3t5wcHAWFhaBgYHk5OT///8MDAwbGxv09PS5ublOTk6JiYltbW1gYGB8fHx+fn6Kiorp6ekICAifn5/r6+sODg4BAQFkZGS8vLyrq6tFRUUxMTHIyMikpKQkJCRNTU2jo6Pb29tGRkZQUFBBQUESEhJDQ0Pl5eVERERycnL7+/uTk5MiIiIsLCxpaWnn5+cTExPf39+AgICMjIxLS0t5eXnh4eHDw8MGBgaQkJD+/v4EBAQ7OzvS0tJ7e3sJCQn25buOAAAAk0lEQVQYlXXJVxKCQBBF0YeiYGhFMaKMOYs55+z+d+QoXzNCf7y6XQcAlEBQhXihsKZHvhGNxYkSIiaNVNqkDK+snsvLWihaQKmsADZDRdZqjU+dGr/nT5stPm3qeGu3x4A+Dbx1SKYzGtPEWzGdkTGnhY/CWaqrNfNTYLPdQdQ9WW7Yh+PpfJH0eru78dCerzfwASViDVwRIOxJAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492298001;3.img,1.1,2.14,1.1,9.image/png,2.60,3.589;4.blob,1.1,568.iVBORw0KGgoAAAANSUhEUgAAAB4AAAAmCAMAAADkx9tQAAAAyVBMVEU+mZkAAAA+b28+Tk4+h4c+Pz8+kJA+ZmY+VlY+mJg+RkY+eHg+fn4+QkI+lZU+XV0+X18+lJQ+QUE+gYE+dXU+R0c+VFQ+aGg+jY0+ioo+bGw+T08+TU0+cXGsrKzIyMgsbGxl+fkRKytKt7dj9fVl+/seS0vk5OT///9n//9c5eUxenobREQiVFQKGBg1NTU8PDy/v7/V1dUmXl4ECQkDCAiZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS2dt9GRAAAAmklEQVQ4jWNggANGLICBGtJMzHilmZnwSbOwsuGTZufAZzcnFzc+aR5ePnzS/AL4PCYoJIxPWkSUE5+0mDi+UJNglcQnLSWNN8xlZGkcoTilsQkOsLScPJHSCopKyiqqasiS6hpgAJHW1NLW0dVDltY3MDQyMDCAShvjNVzTBL+0KbWlzczxSltoWFpZ2+CUtrWzd3B0GtAIBQCUKBHFMlsAxQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,668.iVBORw0KGgoAAAANSUhEUgAAABwAAAAMCAMAAABGBS09AAAA/FBMVEUAAAA0NDTAwMD39/fr6+uYmJgNDQ0gICD///+NjY0eHh7y8vK1tbVNTU1gYGDl5eW0tLQHBwc8PDxWVlZERESJiYno6OgGBgYsLCyFhYXX19fExMSsrKwdHR1oaGgICAhtbW3Z2dmZmZnh4eF8fHxkZGTz8/MODg7c3NxlZWX19fV4eHj09PSAgIDT09OWlpagoKCdnZ3p6elBQUFDQ0MrKyv+/v7FxcUbGxuzs7O/v7/Hx8cFBQUJCQkkJCT9/f1TU1OLi4tJSUkuLi6SkpLj4+MEBARLS0tfX1/k5OS3t7eMjIw1NTXCwsLt7e2bm5uQkJBwcHD5+fkXFxfHOvCKAAAAs0lEQVQYlWWQ1RLCUAxEF0rhIqW4QylW3Glxd5f//xcqPMBlHzY7OTNJJoDJzFhYK75kI4bscDhdnJv3fEOvT5OfBBAMhQGOREArGgPiCTUkSYpmgiUNiBnAlCU5GuYLElBkUSpXqjUa1huqFZutdgd/sEt6qouy0gfK9NjBUHNlNAYm9EHT2VwrC14AlmT1C9ebrf6Ogme3Pxz11okIBpOcnzXnC3O9SXq8y1uj93i+tPIGrooROQ1jAWoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492298557;4.rect,1.1,2.80,3.570,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,2.60,3.589;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAXVBMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwyfX1Tzs5W1tYtcHAJt9e2AAAARElEQVQImWNgIA4wMsGZTIwwFjMLK4zJxg5jcXBywZjcPLwwJh8/jCUgKARjCouIwphi4jCWhKQUjCktA7dUVo5IhwIAlTAB1VUFrVQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.649;4.blob,1.1,824.iVBORw0KGgoAAAANSUhEUgAAACYAAAAMCAMAAAA51D/MAAABLFBMVEUAAAA0NDTAwMD39/fr6+uYmJgNDQ04ODjGxsbe3t5wcHAeHh7y8vK1tbVNTU1gYGDl5eW0tLQbGxv09PS5ublOTk6JiYn///9tbW3o6OgGBgYsLCyKiorp6ekICAifn58DAwPExMSsrKwdHR1oaGi8vLyrq6tFRUUxMTHZ2dmZmZnh4eF8fHzIyMikpKQkJCTc3NxlZWX19fV4eHiAgICjo6Pb29sBAQFGRkZQUFCgoKCdnZ1BQUESEhJDQ0NERET+/v7FxcVycnL7+/uTk5MiIiLHx8cFBQUJCQkKCgppaWnn5+eLi4tJSUkuLi4TExPf398gICDz8/NLS0tfX1/k5OS3t7cODg55eXnDw8OMjIw1NTXCwsLt7e2bm5s7OzvS0tJ7e3uQkJAEBAQd2sskAAAA+UlEQVQYlV3Q51bCQBAF4AsBBJUQEs0oTQQVESkiigUELAg2SlSwgKjv/w5uCOzZOL9mvrnn7JkFHE7J5faA1YJX8i3CXnNbWvbLASXIOlVbWdVpzZbipq+HAJnCQCQaAzZccTHGbTPBpiRtAds7rEvRrhjjlt4DHBnaB7I5RnmSxRi3ghsHxUOtBBwdl4ETOhVj3Apn59EKzFiF9OqFQjUxxi1db6hAkT2KyyvSrunGdurcGs1boGWeAFTD7bv7sv3jZvagsJMf6cnCTreE/zW1Xj9oPL+8mvPAGGbeQtPVO8WsDLePT2k0Hpj0JU2+W9b2p/5rNTP7AxSjJTj3RTuZAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492298629;4.rect,1.1,2.80,3.570,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,3.532;4.blob,1.1,200.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAMFBMVEU+mZk+cnI+QUE+iYk+V1c+QkI+Pz8+fn4+Pj4+SEg+bm4+gYE+e3s+kZE+eHg+lpbhjZp4AAAAIElEQVQImWNgIAYImYQVMDBIzNpzAUg+AIlIfCBMYgcAJ/IKc1Xa9FIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAY1BMVEUgICD///+NjY0HBwc8PDxWVlZEREQAAACFhYXX19cICAjr6+ttbW1kZGTz8/MODg7T09OWlpZDQ0MrKyuzs7O/v78kJCT9/f1TU1OSkpLj4+MEBATy8vJ8fHxwcHD5+fkXFxdM4ZFWAAAAQ0lEQVQImS3GVRaAMAwEwARbvLhL739KXtnM14goRRInQaqZ4JcX4MqqtjWts3U9uEFH2zSDW9bNth8n564b3PP6sA+2uAPq96ZV9QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492298702;3.img,1.1,2.14,1.1,9.image/png,2.50,3.513;4.blob,1.1,1100.iVBORw0KGgoAAAANSUhEUgAAACgAAAAmCAMAAACBKikvAAABwlBMVEU+mZkAAAA+X18+W1s+ZGQ+YWE+e3s+cHA+lJQ+amo+ZmY+lpY+dXU+fn4+bW0+Q0M+QkI+TEw+TU0+REQ+QEA+aWk+mJg+gYE+QUE+fX0+lZU+WVk+UFA+aGg+dHQ+i4s+g4M+Pz8+eno+a2s+YGA+fHwFDAw4iopb4eFj9fVLubkSLCwDBwdOwMBNv78iVFQdSEg7kpJf6+sMHh5CpKRHr68wdnZHsbEJFxdPw8Nm/Pwwd3c8lZVAn58BAgJc5OQLHBxFqqolXFxOwcEECwta398sbGxl+fkRKytKt7dl+/seS0siVVUucXEGDw82hoY6j48ECQkoZGQfTU0VNTVPxMRg7e0UMTFFrKxa4OBn//9c5eUxenobREQKGBgyfHxh8fFj9PRX19dV09Nf7Oxl+vo3h4cmXV0/nJwTLi4dR0c9lpZV0tImXl4BAwMbQ0Nk9/cfTEw1goIcRkY0gIAAAQFY2tpBoqJJtLRSy8sqaWk5jIwXODhZ3NwNHx9KuLg5jY1Fq6sDCAgqZ2cPJiYZPT1n/v4CBgZj9vYjVlZAnp4hUVEYOzsKGRkIFBQye3sgUFAra2skWlpTzs5d5+cxeXmROLVkAAABMklEQVQ4jWNggANGvIBhqChkYiZSIQsrMQrZ2Dk4ubh5eAkq5OMXEBQSFhElbLWYuISApBQxbmSSlpElxjNyIvIKipJEKFRSZmBQUR3sUThACvFLD4BCNXUNTS1twgp1dPX0DQyNjNEVmpiiKTQzt7C0srZmQFdoY4uqzs7ewcTRydnFFch2c/fw1PTyBir08fXzDwgMCkZSGBKqE6YWHsEYqQNUGBUdE6sfB1QYn5CYlJySmoakMD0j05IxK5sxJxCkMBdmdV5+QWKhC7LVvkXFpozpJaVlIKujAuFuLK+oVEdxY1V1TW1dfUNuI1hhE0xhc2pLa1shssJYvfba1KCORA9UhZ1FjIxd3cgKm1J6XHoZe/sYURViAc0J/bETJjISVsg4aXLBlKnEKMQEA6gQACFDQngBKB6YAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,528.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAAulBMVEUAAAAnJyejo6Pn5+etra1ERET6+vq8vLxgYGAuLi4NDQ3u7u6QkJBra2vs7OwHBwcBAQGqqqq1tbWWlpbz8/P4+Pifn58ICAjR0dH9/f2ysrJpaWn19fWhoaHf39/JyckCAgJzc3P8/PwVFRXh4eGUlJQvLy////89PT3IyMiwsLAwMDA2NjaDg4P09PQTExP39/cODg4UFBTKyspQUFBvb2+JiYmMjIwoKCi2trbp6emBgYH+/v4EBAQrNcQ3AAAAjUlEQVQYlWNgYGBgZGJmYUADcDFWNnYOTjRJuBgXNw+6RiQxXj5+BgE0WYSYoJCwiKiYOIosQkxCUopVWkYWRRYhJievwMCgqKSMLIsQU1EFctXUNZBlEWKaWkCWtroOsixCTFdPH2iKgSGyLELMiNnYxFTGDCxqrg5xO5KYhaWIlbUCWJTHxhaiGSoGAMorD6EVj9MQAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492298774;4.rect,1.1,2.80,3.494,2.10,2.19;5.cfill,2.14,1.1,2.62,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,3.513;4.blob,1.1,340.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAclBMVEUAAABCpKRHr688lZVAn58iVVUucXEGDw82hoY6j48ECQkoZGQfTU0yfHxh8fFj9PRX19dV09Nf7Oxl+vo3h4cBAwMbQ0Nk9/cfTEwECwtBoqJJtLRSy8s4iooqZ2cPJiYZPT1n/v4jVlY1goJAnp4hUVGY06IoAAAARklEQVQImWNgIB8wMsGZzCwQmpWNnYOTi5sHyOTl4xcQFBIWAQmLionzS0hClEhJy8hCWHLC8gqKEmCmkjIDg4oqBW6BAwAecwL61bLX9QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.649;4.blob,1.1,752.iVBORw0KGgoAAAANSUhEUgAAABwAAAAMCAMAAABGBS09AAABI1BMVEUAAACZmZn///9ISEg4ODjGxsb39/fe3t5wcHCzs7O3t7c8PDwQEBAbGxv09PS5ublOTk6JiYltbW3Nzc2Kiorp6ekICAifn5/r6+sDAwPn5+cCAgK8vLyrq6tFRUUxMTH9/f3Ozs7u7u7FxcUvLy/IyMikpKQkJCRNTU0RERHl5eWmpqZBQUFXV1fd3d3m5uYKCgqjo6Pb29sBAQFGRkZQUFAtLS1jY2MSEhJDQ0NERESNjY1ycnL7+/uTk5MiIiIuLi5VVVWOjo4sLCxpaWn+/v4eHh4nJydiYmITExPf39+AgIAJCQnT09PS0tJWVlbW1tbi4uKMjIwODg5LS0t5eXnh4eHDw8MGBgYcHBz19fW1tbUdHR2QkJAEBAQ7Ozt7e3s4sEuOAAAAy0lEQVQYlWNgYGQCAWYGZMDCysbOAWJwcnEDAQ+yHC8fv4AgkxCQJSzCgA5ERMUYGMQlJBkYpDgYpNEkZWSBhByTPIOkgqKSgrIKiqSqGpBQZ9Jg0NTS1tHV0zdAljQ0MmZgMGEyhfDMmMyRJXWYBC0stZisoFwtaxRzbWyZ+OyY7BkcHMGSTqhOsnA2cJEyZjB1dWNgcHf1QPeOp5c3A4OPr5+jf0CgGEggiEkMIhMcEhoWHgFkRGpLREXHgMViXeMgkvFsfgk+DAwAq9YWUBskXZIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492298841;4.rect,1.1,2.80,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.80,3.475;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAV1BMVEU+mZk+X18+WFg+aGg+RkY+QkI+W1s+kZE+Pj4+Wlo+gIA+c3M+QUE+VlY+Sko+lpY+dXU+iIg+UVE+k5M+dnY+bm4+S0s+mJg+XV0+gYE+T08+amo+RES1uremAAAATElEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGHlE0UTFxBgYRiFoOCUkBVogJUtIyPFBzhRC2YWXCAQDcmgK3auNapgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAXVBMVEUAAACenp7///84ODg8PDz+/v4EBATT09PGxsZ1dXXm5uZGRkYdHR309PRVVVWvr6+2trZMTEz29vYiIiIJCQnf39+AgIAICAg+Pj4GBgZgYGDQ0NAWFhZjY2MtLS1z7CdSAAAASUlEQVQImTXNRwKAIAxE0TGxN+xgwfsfU2Xwb/JWE+ArEQ0XaRaVF2VUVTdU2/VKmQHUOM3Usm7WOnE7DmEnLn3z4m9O6/8j6AF5xQJz9apuCQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492298857;3.img,1.1,2.14,1.1,9.image/png,2.80,3.456;4.blob,1.1,556.iVBORw0KGgoAAAANSUhEUgAAAAoAAAAmCAMAAADKgvrCAAAAw1BMVEU+mZk+X18+WFg+aGg+RkY+QkI+W1s+kZE+Pj4+Wlo+gIA+c3M+QUE+VlY+Sko+lpY+dXU+iIg+UVE+k5M+dnY+bm4+S0s+mJg+XV0+gYE+T08+amo+REQAAABCpKRKuLg4iopf6upj9fVGra0JFxdn//9HsbEcRkYrampj9vZMvb1a3t4CBgYpZWUUMTFSzMwHEREoYmJl+fkxenooY2NY2toBAgITMDBEqKgcRUUpZmZj9PRMu7tUz881g4Nf7OwIFRXXsuc+AAAAl0lEQVQYlWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGHlE0UTFxBgYRiFoOCUkBVogJUtIyPFBzhRC2YWUigCwckM2Uk1dQVFJWATNV1dQ1NLXATG0dWVldVT0QUx+ozkDVEMaUNTJGiJqAmKZmsrImquZgEywsraxtwCbY2tlrKjvIwrXJ4mbCAQDZlRt8oyVelwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAllBMVEUAAAAICAiBgYHl5eX29vbQ0NBbW1ukpKTu7u5tbW1GRkaPj4////9PT08XFxdqamrLy8u0tLQDAwMUFBQFBQXBwcG2trYHBwdwcHD9/f1MTEz09PR3d3cxMTFDQ0OXl5dQUFC4uLjOzs4YGBhgYGCKiort7e0kJCRhYWG3t7fMzMypqamNjY1NTU0LCwuHh4ff399RUVGWDMn/AAAAZElEQVQImS3J2xaBABSE4V8lqa0inYQOqCTk/V/O1jIXs75ZAwvDtJY2mpWzdj3ZgC+BznALu2ivipPfTepn+WFWIXKcwelc5hX/1A1crpHq1kInveo+aD3awB3lqXq9p2L4wBf72QXEw/rKzQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492298913;3.img,1.1,2.14,1.1,9.image/png,2.50,3.437;4.blob,1.1,1204.iVBORw0KGgoAAAANSUhEUgAAACgAAAAmCAMAAACBKikvAAAB5lBMVEU+mZkAAAA+X18+W1s+ZGQ+YWE+e3s+cHA+lJQ+amo+ZmY+lpY+dXU+fn4+bW0+Q0M+QkI+TEw+TU0+REQ+QEA+aWk+mJg+gYE+QUE+fX0+lZU+WVk+UFA+aGg+dHQ+i4s+g4M+Pz8+eno+a2s+YGA+fHwFDAw4iopb4eFj9fVLubkSLCwDBwdOwMBNv78iVFQdSEg7kpJf6+sMHh5CpKRHr68wdnZHsbEJFxdPw8Nm/Pwwd3c8lZVAn58BAgJc5OQLHBxFqqolXFxOwcEECwta399KuLhf6upGra0iVVUucXEGDw82hoY6j48ECQkoZGQfTU0VNTVPxMRg7e0UMTFFrKxa4OBn//8cRkYrampj9vZMvb0yfHxh8fFj9PRX19dV09Nf7Oxl+vo3h4cmXV0/nJwTLi4dR0c9lpZV0tJa3t4CBgYpZWUBAwMbQ0Nk9/cfTEw1goI0gIAAAQFY2tpSzMwHEREoYmJBoqJJtLRSy8sqaWk5jIwXODhZ3NwNHx85jY0mXl5Fq6tl+fkxenoqZ2cPJiYZPT1n/v4bREQRKysoY2MjVlZAnp4hUVEDCAgYOzsKGRkIFBQTMDAye3sgUFAra2tEqKgcRUUpZmZMu7skWlpTzs5d5+cxeXlUz881g4MIFRXyKvCsAAABW0lEQVQ4jWNggANGvIBhqChkYiZSIQsrMQrZ2Dk4ubh5eAkq5OMXEBQSFhElbLWYuISApBQxbmSSlpElxjNyIvIKipJEKFRSZmBQUR3sUThACvFLD4BCNXUNTS1twgp1dPX0DQyNjNEVmpiiKTQzt7C0srZmQFdoY4uqzs7ewcTRydnFFWiGm7q7pocFSKGnl7ePr59/AJLCwCCdYLWQUMYwHUaTcPOIyKhokMKY2Lj4hMSkZCSFKalplozpGYyZfowmWdmMjDnhISCrc/Py4wpckK32KowwZUwpKi4BWl0K5JeFl4PdWFFZpY7ixuqa2rp6t4bGJqhCxuYWkMLWpLb2jgJkhZ162XVJ/lFxXXATu0EKewoZGXv7kBX2J05wmcg4cRIo5ErsGBm7wyfjCPDW2CmdU6eBgzh8+oyZcbNwRuHsOflz54EVzl+QGOWxkHCigHiGcSAUwgEAraVMxr10fGUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.649;4.blob,1.1,752.iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABKVBMVEUAAAAFBQV+fn7k5OT5+fnS0tJOTk4nJyejo6Pn5+etra2enp7s7OxqampKSkqlpaX///9DQ0NERET6+vq8vLxgYGAuLi4lJSVcXFwBAQHW1tarq6sNDQ3u7u6QkJAxMTGkpKQaGhqurq7CwsJra2sHBwcGBgbm5uaLi4uqqqq1tbWWlpbz8/P4+Pifn58ICAiGhoby8vIbGxvR0dH9/f2ysrJpaWn19fWhoaFQUFD+/v7f39/JyckCAgJzc3P8/PwVFRU0NDSHh4fh4eGUlJQvLy89PT0fHx/IyMiwsLAwMDA2NjYPDw/U1NS6urqDg4P09PQTExP39/cODg4EBATr6+tJSUk8PDwUFBSMjIzKyspvb2+JiYkcHBxYWFgoKCi2trbp6emBgYFkhFA3AAAAxUlEQVQYlWNgYGRiZmFlY0AD7BycXCCam4eXj19AEFVSSFhEVAxIiwtIMDBISkmjSMrIykEY8gqKQFJJGUVWhUeVQRLOU1PXQJHV1NLW0dXTh/IMDI1QZI1NTIXMzC0gHEsrCVRHWdvYMjDY2TuA2I7mTmj+cXYBEq4CbkDSnZNDEk3WwxNIeAl4MzD4+Poxokky+AcEAk0OCmYIEQkNCweCCJBopADEnRGcUZbR5jEMDLECEBAHEpWzCoFojk/QSUyyZQAA7UwXwXosBSIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492298984;4.rect,1.1,2.10,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.780,3.649,3.170,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,3.437;4.blob,1.1,340.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAclBMVEUAAABCpKRHr688lZVAn58iVVUucXEGDw82hoY6j48ECQkoZGQfTU0yfHxh8fFj9PRX19dV09Nf7Oxl+vo3h4cBAwMbQ0Nk9/cfTEwECwtBoqJJtLRSy8s4iooqZ2cPJiYZPT1n/v4jVlY1goJAnp4hUVGY06IoAAAARklEQVQImWNgIB8wMsGZzCwQmpWNnYOTi5sHyOTl4xcQFBIWAQmLionzS0hClEhJy8hCWHLC8gqKEmCmkjIDg4oqBW6BAwAecwL61bLX9QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.651;4.blob,1.1,156.iVBORw0KGgoAAAANSUhEUgAAAAQAAAAKBAMAAABh1eI9AAAAG1BMVEUAAAAODg4LCwvs7Ozv7+8QEBAHBwfX19fb29sGouOmAAAAFUlEQVQImWNgFGBQdmVIb2JABjBBACQ+AsUS18NYAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492299729;4.rect,1.1,2.20,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.10,3.646;4.blob,1.1,340.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAABGRkbR0dH5+fnV1dVtbW3///84ODglJSXGxsZLS0tfX1/j4+OYmJju7u4NDQ3Ly8umpqbi4uKQkJDJycmlpaWTk5Pt7e0LCwtJSUkhISH39/fCwsJaWlrm5uZDQ0PS0tL6+vrU1NR5eXkk9GblAAAATklEQVQImWNgoAJgZGJmYWVjB7I4mDm5uHnATF4+fqAMmCkgCCTYwUwhYThTRBTOFBOXYGCQBDOlpGUkZeXATAZ5BUUlZQiTAa4WDxMEAPnEA00Xhd1aAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492299950;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.646;4.blob,1.1,3348.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;3.end,1.1;4.sync,10.6492300807;4.sync,10.6492301807;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.500,2.19,2.14,1.1,1.0,3.627;4.rect,1.1,3.211,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.231,3.646,3.279,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.630;4.blob,1.1,3196.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.646;4.blob,1.1,2304.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;3.end,1.1;4.move,1.4,1.3,1.2,3.249,1.0;4.size,1.4,2.12,3.431;4.rect,1.4,1.0,1.0,2.12,3.431;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492301932;4.rect,1.1,3.220,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.627;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAdVBMVEX////t7e0HBweSkpIjIyNlZWVYWFg3NzfJyckAAADHx8e7u7vb29twcHAqKir+/v4gICCAgID9/f0aGhqLi4uBgYElJSW+vr4FBQXp6enh4eECAgJQUFBHR0dpaWkSEhKysrKqqqoYGBj7+/v5+fkUFBR2dnYH+78OAAAATklEQVQImWNgoBgwMjGDKBZWIMHGDiQ4OLmAJDcnDwMDLx9Iil9AkEFIWASsWlSMQVxCEsyUkuZglYEaIisnrwBlKjIpKUOZKqpqpLoGAPrdAv4A46ytAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492302584;3.img,1.1,2.14,1.1,9.image/png,3.500,3.627;4.blob,1.1,456.iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAMAAACnUt2HAAAAkFBMVEUAAAD///90dHQsLCzu7u7f398SEhL4+PhtbW3c3NyampqXl5cXFxenp6fIyMg2NjY4ODjn5+fDw8NbW1tEREQkJCSPj4/V1dV3d3cBAQF/f38CAgLl5eV+fn7a2tpBQUH6+voWFhYeHh79/f2vr6+4uLiWlpbt7e1NTU1VVVUEBATX19cGBgbr6+uJiYlTU1MzyGeiAAAAgElEQVQYlWNggANGOGAgV5CJGYsgCytu7WzsHCARTi4GRm4gzQNRycsHZPMzCjAwCgoJCUMFRRhFGRjExCHaJaCCkqxSDNIyTKiCDLJyDPIKimiCSsr8XCoMaIIMqmrqGhiCmuyCWiBBkO1sQkLaYEEdXT2w47khntAnP5TwCAIARgQGb2OJVtYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492302838;3.img,1.1,2.14,1.1,9.image/png,3.510,3.627;4.blob,1.1,372.iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAMAAACnUt2HAAAAclBMVEUAAAD///+Li4vT09MREREgICBoaGjo6Oi7u7t8fHwMDAw2Njafn58UFBQcHBy+vr4YGBg8PDykpKRycnKlpaUDAwMvLy+4uLg3Nzc9PT2IiIjj4+MeHh5+fn6BgYEfHx9/f3+Dg4MbGxvt7e0oKCisrKzAM4G2AAAAX0lEQVQYlWNggANGOGAgTZCJGYsgCytR2tmAJDtIkIOBk4ubh5ePHygoICgoBBUUFhEVE5eQhGiXggpKM8rIMsrJoAvKKzAqKlEuCLJdWVBQBUWQDeJgVXTtFAYduiAAOy4H2nWPHjoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492303010;4.rect,1.1,3.530,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.627;4.blob,1.1,260.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAS1BMVEUAAABERET///+Dg4Pz8/PJyclgYGDr6+vj4+NBQUGNjY1aWlr8/PzQ0NBHR0fIyMjCwsIcHBzh4eGBgYF+fn7g4OCAgIB8fHzk5OQ8pdV9AAAAMUlEQVQImWNgoBgwMjGzsLKxc3CCmFzcPLx8/AIgpiCDkDCDiBCEKSrGIC5BNpMEAAA2MAN/HXsSagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492303155;4.copy,1.1,2.20,3.646,3.940,2.19,2.14,1.1,2.10,3.646;4.rect,1.1,3.520,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.530,3.627;4.blob,1.1,3060.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.649;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAgAAAANCAMAAACjHN8KAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQklEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovKwemAEi+AdWfGTt0AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492303348;4.copy,1.1,2.20,3.646,3.940,2.19,2.14,1.1,2.10,3.646;4.rect,1.1,3.510,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.627;4.blob,1.1,3080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.649;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAMAAABM3rQ0AAAAulBMVEUAAAAwMDCxsbHs7Ozx8fGpqakiIiItLS3z8/O6urpOTk5XV1fMzMzq6uocHByhoaHp6ekGBgYTExPy8vKcnJzf399dXV1eXl7///+Pj48NDQ18fHz6+vr09PSjo6M4ODgkJCSLi4vl5eWbm5sDAwMEBAR3d3dzc3MFBQWEhIQ/Pz/Ly8vDw8Pd3d0CAgIBAQHY2Ni7u7tERET7+/uysrJPT09MTEyvr69CQkI3Nze1tbXr6+vv7+89PT04UAVlAAAAbElEQVQImUXJ2RZCUABA0ZMGaaLRVRoQRRoRTf//W1j3ofO01zpAQ2m22h1A7Wq9/mA4At0Yw2Q6A2VeDRYmmMJaIlvZ681Wcue4wttL+4E4cAyj2qcYzvEFrrc7PJI0e+Z2UY3X+/PVfvwrAY4NB/4eUHFDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492303496;4.copy,1.1,2.20,3.646,3.940,2.19,2.14,1.1,2.10,3.646;4.rect,1.1,3.500,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.627;4.blob,1.1,3224.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.649;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAU0lEQVQImYXLxQGAMABD0UBxp0Bxd91/PFoW4J/eIQF+kmSiqBqHbpiW7bhcnh8AIY2AOGGMpVkOFPSrBKq6EbVA1w98PYrvNC+rt+2cx3mR+8ELtd0FYj3M92wAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492303646;4.copy,1.1,2.10,3.646,3.940,2.19,2.14,1.1,2.20,3.646;4.rect,1.1,3.510,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.627;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.649;4.blob,1.1,724.iVBORw0KGgoAAAANSUhEUgAAABMAAAAMCAMAAAC3DnawAAABI1BMVEUAAAAwMDCxsbHs7Ozx8fGpqakiIiItLS3z8/O6urpOTk5XV1fMzMzq6uocHByhoaHp6ekGBgYTExPy8vKcnJzf399dXV1eXl4eHh6qqqru7u6enp4QEBD///+Pj48NDQ0VFRXk5OTS0tJUVFRjY2Po6Oi3t7d8fHz6+vr09PSjo6M4ODiLi4sYGBhCQkIyMjIkJCTl5eWbm5sDAwPW1taurq4ICAgJCQn29vZqamoEBAR3d3dzc3Pt7e2Hh4cFBQWEhIQ/Pz/Ly8vDw8Pe3t6rq6s0NDTd3d0CAgIBAQHY2Ni7u7uXl5fg4OAMDAwbGxtERET7+/uysrJPT09MTEyvr6/Q0NBFRUU3Nze1tbXr6+vv7+89PT2tra3w8PDAwMBDQ0Mq6/UfAAAAtUlEQVQImWNgYGBkYmZhZWNABuwcnFzcPLx8yGL8AoIMDELCIshiTKIgUkwcSEhIckhJywAZ4rJy8hBZBUUlZRVVNRBTXUNTSxvE0BHWZWDQk9UHsQ10DGWNjBkYTEzNzMzMLSwhuqysZW0YGGxlwcCOwd7BESTq5MzA4OLqBgJAV7k7ezAweHp5MzD4+PoBZf2BOCAwKDgkVEMPaC9vmFi4jgY7UDAiMiqaMwZsWWwcR3wCAwC1HBag0yqUmAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492303805;4.copy,1.1,2.10,3.646,3.940,2.19,2.14,1.1,2.20,3.646;4.rect,1.1,3.520,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.627;4.blob,1.1,3120.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.649;4.blob,1.1,648.iVBORw0KGgoAAAANSUhEUgAAABMAAAANCAMAAAB8UqUVAAAA/FBMVEUAAAB3d3fU1NQwMDCxsbHs7Ozx8fGpqakiIiItLS3z8/O6urpOTk5XV1fMzMzq6uocHBwyMjL9/f0bGxuhoaHp6ekGBgYTExPy8vKcnJyQkJC8vLzf399dXV1eXl4EBAT///+Pj48NDQ1LS0v09PQLCwt8fHz6+vqjo6M4ODgkJCSLi4vl5eWbm5sDAwMPDw/39/dFRUVzc3NkZGTk5OQCAgIFBQWEhIQ/Pz/Ly8vDw8PCwsKKiord3d0BAQHY2Ni7u7shISH+/v4sLCxERET7+/uysrJPT09MTEyvr69CQkJ9fX3Ozs43Nze1tbXr6+vv7+89PT3W1tZwcHA092hIAAAAo0lEQVQYlWNgAANGJhDJzMLKxs7BAAVMjECCk4ubh5ePXwAiJCgkDCRFRMUYGMQlJCFiUtIgkkUGRMrKgYXkRcG0nIKiEswwBmUVVTCtpq6ioQkVY9eAMrS0dRR09UAsfQNDuBZ5RgUjEG1sYgqizMwtQJSlFYi0toGosbUCytnZOwCZjk7OEDEXVzd3D091LyDT2wdmmK+ffwB3IIgVFMyACgCfzw9LThcgcwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492303898;4.copy,1.1,2.10,3.646,3.940,2.19,2.14,1.1,2.20,3.646;4.rect,1.1,3.530,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.627;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.649;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAA2FBMVEUAAAB3d3fU1NQyMjL9/f0bGxstLS20tLTt7e3q6uqtra0mJiaQkJC8vLwUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw8EBATp6eleXl5ISEj///8qKiolJSU1NTVLS0v09PQLCwsVFRXr6+u9vb1NTU0ODg6pqamjo6MkJCShoaHv7+/6+vo5OTn39/dFRUUDAwOxsbEnJydkZGTk5OQCAgLR0dFhYWHCwsKKioovLy+wsLBKSkqvr68hISH+/v4sLCw3Nze5ubm7u7s6Ojp9fX3Ozs7W1tZwcHCvcK8MAAAAj0lEQVQImWNgQAWMTAzogIkRXYSZhRVIsrFzcHJxQ4V4eIEEH7+AoJCwiChYRExcAkhKSkkzMMiwy4KF5OQVgKSikrKKKswoNXUwpaGppS2gA2aK6upB5fR1DHQNQQwjYxOw20z1gXZImYHY5hZgJZa6VnLWNvIaQKatnT1Em4Mjv5aTM4jl4orhGTd3MAUA0pALqBpM8ssAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492304075;4.rect,1.1,3.121,1.3,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,2.20,3.359,3.246;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.20,3.438,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.58,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.39,3.338,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.63,2.45,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.82,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,2.79,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,2.80,2.66,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.98,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,2.96,3.128,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.116,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.158,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.156,1.8,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.158,1.9,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.153,2.18,3.109;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.177,1.8,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.177,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.171,2.78,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.212,3.208,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.215,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.212,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.210,2.58,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.234,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.234,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.250,2.78,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.250,2.78,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.248,3.118,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.287,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.325,1.6,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.366,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.386,3.209,3.259;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.386,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.384,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.386,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.386,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.383,2.18,3.260;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.386,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.383,3.118,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.384,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.383,2.28,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.384,2.28,3.106;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.383,2.36,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.383,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.383,2.37,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.400,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.403,2.27,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.400,2.18,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.402,2.69,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.440,2.39,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.443,1.8,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.458,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.459,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.460,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.462,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.459,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.460,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.462,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.462,2.89,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.478,3.118,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.481,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.516,2.39,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.519,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.515,2.76,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.538,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.538,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.536,1.9,3.106;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.538,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.556,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.592,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.554,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.552,3.257,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.554,2.49,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.593,2.19,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.595,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.595,1.9,2.43;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.590,3.179,2.56;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.595,2.18,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.590,3.278,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.592,2.58,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.633,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.630,2.18,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.1;4.blob,1.1,4120.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.22;4.blob,1.1,1984.iVBORw0KGgoAAAANSUhEUgAAALQAAAAiCAMAAADBLANeAAACVVBMVEUAAAB3d3fU1NSkpKSvr68yMjL9/f0bGxuVlZWfn5+QkJC8vLxVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU0EBATp6eleXl58fHzx8fH09PTX19fT09Ps7Oz6+vqHh4dLS0sLCwsDAwNDQ0P39/dMTEypqamjo6OioqK0tLTLy8uKiopFRUVnZ2cmJiY9PT3+/v7k5OQCAgJWVlaCgoKenp5RUVHCwsIhISEsLCx9fX3Ozs7W1tZwcHBoaGj////o6OjQ0NCLi4usrKzIyMgYGBg8PDwREREgICCIiIgODg4SEhL4+PhtbW3c3NyamppbW1vMzMzl5eWZmZkTExNsbGz5+fkrKyu3t7f19fX7+/uYmJg0NDRAQECxsbFPT0/FxcUxMTEeHh6qqqrz8/Pu7u4QEBBISEgzMzMtLS3t7e3q6uqtra3v7++np6c2NjY4ODiAgIBcXFzY2Ni4uLh6enpERERUVFQ1NTW/v7/V1dXGxsbf398HBwcVFRXS0tJjY2MFBQUICAhSUlLh4eEUFBS6urri4uLb29skJCQiIiJdXV0NDQ3y8vJCQkLn5+dBQUEqKiolJSUBAQF/f390dHRQUFCurq729vZqamoaGhrr6+u9vb1+fn7a2toWFhZKSkqmpqZzc3NYWFihoaE5OTnNzc2UlJTe3t6rq6scHBwnJyeWlpYKCgqXl5fg4OAMDAzR0dFhYWFpaWl5eXlHR0f8/PwoKCgvLy+wsLCMjIwGBgaJiYm2trZaWlqNjY1XV1fw8PDAwMA3Nze5ubm7u7s6Ojpubm5VhHH4AAADNklEQVRYhWNgwAkYmXDLDVrAxDjQLiASMLPAmaxs7APoEFIAByecycU9gO4gHvDw8vELCAoJgzkiomID7BzigLiEpJS0jKwcmCMvqTCwriEWKCopS6ooQNiqagPqFBKAuoamFoTFp6w9sE4hGujI6urpq4CZQgaGA+wYYoGRMQODiSmYaaY1wG4hA5jrWwy0E0gHllYD7QIygLXNQLtgFIyCUTAKhhawtbOzsydJB7MDEsdRmhqOcHImTb2LqyszcY6GmYziaDd30qzDbzQJwIMCR2MDnp5gysvbB0T5+gEJ/wDJwKBgEDckNCw8IlIeWb2BHRgAWVG+QCLaLgZoSWycdUR8AgMyiyExKTnFJJUERyNMZnZIk45wTmdASVoZGplZ2bpgpoJMDsTgXJAv8+zygd0ttgKlwqJisKPtAktKy1yQjS53rah0dXVFdbRolWkZU3UNMqvWoK6s3j4ch6MbGsHAELvJzClVTWWVzY3ISatFplWFx6GND8SukWpXAAuW2nUwMAhUAlmd0UDhLrtgsKOx9BBhkYjs6G4GBm07PWSWYw/Qr712rNgdzQwJ1TLsJjP3uTEwxNj1I+tNs5vAwDBRoxxFw6TqyQyGgVNAzKnOyUAD3cGOFiTK0Q4gv9o1IbOspwFDUnD6DOyONo8GAzccjgaZMtPOCFlv7azZwp4Ybpkzl6Ffdh6QMV9/gXz5QqijG4l2tDso3BCsTEhYymF3NLbkgeZoF7tFKHo7FufIti5BMyeRLc8PPEajsRRITCXs6GXN+By9fAU4LFdidzSB5IHN0cAO95JY5VVoBhWvzgSPdYRXAAlx3I4OaofQJd5rQJ7D4ei169YDmdDRKSKTB8xkbI5m3KAIzI12G9EM4vHuEwHRm/Q3b3FkswvD5eguu8n9hS0MDBO2Li7dZI/L0bVZDl3ajrIZkBIg09V1G6ZJuExGOBqhd7vyDvn5LJIdYIU74e7aNWs3mJ5k2TZ9z9518rgcPWlfZqgU0DEMTUXeVvtxOZqhI/tA8kElBkhZCwROhB0NMxnhaCS9hw7L5Bw5ClHIpS9C2LTBBpyKBtoFpAO+5GMD7QTSgUjZJBAFAOrb7miXK+g/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.77;4.blob,1.1,2656.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.98;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAKcAAAAjCAMAAADG6eoQAAACAVBMVEUAAAB3d3fU1NTIyMj////w8PC8vLxJSUmkpKTQ0NCLi4vT09PCwsI8PDxOTk6hoaH+/v50dHSsrKwREREgICAyMjL9/f0bGxuwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpI3NzfBwcH39/fp6emTk5MMDAyxsbFPT0/W1tb19fXFxcUxMTHk5ORISEgzMzNoaGjo6OhERETS0tL5+flgYGAEBAReXl60tLTJycknJyf29va4uLhiYmLu7u61tbXGxsZRUVFUVFTf398HBwc1NTW/v7/V1dVSUlLh4eEICAgYGBgiIiL4+PjAwMDm5uZLS0v09PQLCwuVlZXc3Nyqqqra2tpHR0dBQUENDQ1FRUU9PT3n5+dAQECIiIjs7OxNTU2pqamjo6OEhISMjIwaGhpWVlalpaU4ODgPDw8JCQlsbGzR0dGgoKBYWFji4uJkZGQCAgKNjY2KioqDg4Otra2ZmZnb29tMTEwhISEpKSm3t7dfX1/t7e1dXV1/f39cXFwUFBQoKCi9vb3Ozs7x8fFKSko6OjrExMSXl5cODg4BAQHX19ctLS1DQ0N2dnZwcHAXFxdubm5CQkJvb2/Pz8/d3d2FhYVhYWHZ2dlqamrY2NiYmJjv7+8QEBCmpqaysrLHx8cSEhJ6enr6+voFBQWGhobz8/NnZ2f7+/tpaWkTExOgdF/cAAACtElEQVRYhe2X+VsSQRyHR3ZSFDcJLTORCrSkIBCkKAUjTfOoxErTyrMUuq00S0pLOtAuyQ7tvo+/sl3WhR2Gth0ec/qh94flA9/9zrzA7Dy7ABCQocJTDAbCFZlZJEMlUGdL3uRo0hsERZWBpxhMLrsyT7uKaDAdI7winvkFacslWL2mEEsCzFruULSumGS0lJ5Lgj4TTwIxzxLDeu64YaPRVFqGVNWbNpebt2wF0qoFxoh5WjVmZhuXbNwH9uSOCofTUQlZAk2XaTuWpJ5ghxuAnbuqrNUeL+ppqtntU+2plVbr2L31LMtPr/bUNPjq9zUC0MSyantSR3PL/qzKA0SeB1v9WEI82w4BcPiIC4B22IF6HgWgE3ah1fj/fiwfgOOLHSfsSR1t3SUA9BB59vbhCfNs7eeTYQDx5FdgM2xAq8j6PAlPIZ7xDvcgl4ZIPAPGTiyhnl43CMLTfDpzFvMsgD60ing2wXOYJ98BzutJPS9YLmIJ8XTZuevILPxiwyk9kaoyT7ea1DP3Ep4Qz8v8vnRFWIEVqT2l1ZFRJZ6lhiAAVwk8x7TFWEp4cvt8L+T3+WvG6+3joSqkmphVWr0Bb3ZMTEo9+es9xLK3pB1jxtvWcQuBZ9EUnhKeEIYz78Ti3XtGw/3Ibzyl1enhkHPmgdTTJuypOqTjocbpeASHFHuWP8bTcsB/KZv2yXJOmQ5d9tnoU88IbY0/Uz3X8ux5I22L/9DixcsobQVFFPaFJ2k7KCLonKetoIyFV2KKROTOo022eDfp7379hqqJPFNvF0PtzKhf9ky6vHtP20AZPdr5D7QdFPERLvkj9N8g+imnjraDErwMbQNlzA2KaQD+yzdQqjwx6bUumiLyfA73i1G3QFNEnrIv8cfHwNdZqiqyfPv+Q4wu3zRNE3kCP2kbKOIXIfeDzuV5MFIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.153;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.174;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAKcAAAAjCAMAAADG6eoQAAACAVBMVEUAAAB3d3fU1NTIyMj////w8PC8vLxJSUmkpKTQ0NCLi4vT09PCwsI8PDxOTk6hoaH+/v50dHSsrKwREREgICAyMjL9/f0bGxuwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpI3NzfBwcH39/fp6emTk5MMDAyxsbFPT0/W1tb19fXFxcUxMTHk5ORISEgzMzNoaGjo6OhERETS0tL5+flgYGAEBAReXl60tLTJycknJyf29va4uLhiYmLu7u61tbXGxsZRUVFUVFTf398HBwc1NTW/v7/V1dVSUlLh4eEICAgYGBgiIiL4+PjAwMDm5uZLS0v09PQLCwuVlZXc3Nyqqqra2tpHR0dBQUENDQ1FRUU9PT3n5+dAQECIiIjs7OxNTU2pqamjo6OEhISMjIwaGhpWVlalpaU4ODgPDw8JCQlsbGzR0dGgoKBYWFji4uJkZGQCAgKNjY2KioqDg4Otra2ZmZnb29tMTEwhISEpKSm3t7dfX1/t7e1dXV1/f39cXFwUFBQoKCi9vb3Ozs7x8fFKSko6OjrExMSXl5cODg4BAQHX19ctLS1DQ0N2dnZwcHAXFxdubm5CQkJvb2/Pz8/d3d2FhYVhYWHZ2dlqamrY2NiYmJjv7+8QEBCmpqaysrLHx8cSEhJ6enr6+voFBQWGhobz8/NnZ2f7+/tpaWkTExOgdF/cAAACtElEQVRYhe2X+VsSQRyHR3ZSFDcJLTORCrSkIBCkKAUjTfOoxErTyrMUuq00S0pLOtAuyQ7tvo+/sl3WhR2Gth0ec/qh94flA9/9zrzA7Dy7ABCQocJTDAbCFZlZJEMlUGdL3uRo0hsERZWBpxhMLrsyT7uKaDAdI7winvkFacslWL2mEEsCzFruULSumGS0lJ5Lgj4TTwIxzxLDeu64YaPRVFqGVNWbNpebt2wF0qoFxoh5WjVmZhuXbNwH9uSOCofTUQlZAk2XaTuWpJ5ghxuAnbuqrNUeL+ppqtntU+2plVbr2L31LMtPr/bUNPjq9zUC0MSyantSR3PL/qzKA0SeB1v9WEI82w4BcPiIC4B22IF6HgWgE3ah1fj/fiwfgOOLHSfsSR1t3SUA9BB59vbhCfNs7eeTYQDx5FdgM2xAq8j6PAlPIZ7xDvcgl4ZIPAPGTiyhnl43CMLTfDpzFvMsgD60ing2wXOYJ98BzutJPS9YLmIJ8XTZuevILPxiwyk9kaoyT7ea1DP3Ep4Qz8v8vnRFWIEVqT2l1ZFRJZ6lhiAAVwk8x7TFWEp4cvt8L+T3+WvG6+3joSqkmphVWr0Bb3ZMTEo9+es9xLK3pB1jxtvWcQuBZ9EUnhKeEIYz78Ti3XtGw/3Ibzyl1enhkHPmgdTTJuypOqTjocbpeASHFHuWP8bTcsB/KZv2yXJOmQ5d9tnoU88IbY0/Uz3X8ux5I22L/9DixcsobQVFFPaFJ2k7KCLonKetoIyFV2KKROTOo022eDfp7379hqqJPFNvF0PtzKhf9ky6vHtP20AZPdr5D7QdFPERLvkj9N8g+imnjraDErwMbQNlzA2KaQD+yzdQqjwx6bUumiLyfA73i1G3QFNEnrIv8cfHwNdZqiqyfPv+Q4wu3zRNE3kCP2kbKOIXIfeDzuV5MFIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.229;4.blob,1.1,2528.iVBORw0KGgoAAAANSUhEUgAAAZcAAAASCAMAAACgsmPgAAACiFBMVEUAAAABAQEkJCQYGBgLCwszMzPDw8P39/f29vajo6N1dXXFxcVUVFTPz88PDw8WFha2trawsLCkpKTQ0NCLi4vT09M4ODj///8SEhLr6+vExMRJSUlAQEBLS0tERETu7u4hISGioqKvr6+ysrLa2to5OTmsrKzIyMgREREgICBYWFgDAwNwcHAVFRX19fX+/v5XV1d5eXn6+vpSUlIMDAycnJy9vb1CQkIvLy/k5ORISEhoaGjo6OgtLS20tLTt7e3q6uqtra0mJibR0dH5+fkoKCjz8/Px8fE3NzfBwcHp6emTk5OxsbFPT0/W1tYxMTEeHh6qqqqenp4QEBA8PDyYmJjc3Nw0NDSrq6sXFxdMTEw1NTW/v7/V1dXGxsbh4eEICAgUFBTs7Oy6urpVVVXi4uIiIiL4+PjAwMBgYGATExPKyspOTk5ZWVnX19cHBwcnJye4uLhiYmK1tbVRUVHU1NTf39/S0tJjY2O3t7cFBQUCAgIwMDCampoODg52dnZWVlYlJSXn5+dBQUGIiIgqKiqVlZUKCgqGhobw8PAEBARHR0cNDQ1FRUU9PT3y8vIyMjJ8fHx/f3/7+/saGhpNTU3JycmhoaHCwsIfHx/09PSEhISMjIyurq4JCQlqamqdnZ3v7++WlpZsbGygoKCHh4cuLi4+Pj54eHiNjY3e3t4cHByUlJSOjo6ZmZnb29t3d3dhYWGSkpJKSkodHR2Xl5fg4OAbGxt6enpQUFAGBgZlZWVxcXFdXV1cXFzHx8cpKSlfX1/8/PxpaWksLCy5ubm7u7s6Ojqbm5tDQ0PY2NjOzs5+fn5vb2/m5uYrKyvMzMx9fX3l5eXNzc2FhYXj4+O8vLwZGRk9TiwsAAAEmUlEQVRYhWNgGKqAcaAdQBFgApPMLAPsDKoDVjZ2Ds6BdgT5gIsbTPHw8mGT5RcQROIJCSNxRETxGywmLkaUOhoBCUkpaRlZkrQQ71La+01OXgHCUFTCJq2sogok1dQhPJR40dDEbzLM7YTUkQhgbiEEtMSJsxfJPOJdSnO/aavoQFm6etKYCpn1DZDVo8QLIQBzO5UBsfFiaERd81AAzf1mrGcCY5qaYSo0F7dgYLAUBwMGULxYieqpswJZ1kABG4gaWzt7B0cnNH3OLqJcILdjVedq5+auyAxieXiye3mDXCDk4+unx+2PwmIICHSTDwpG0YFwC34gDFEXwsAQGgbkhovLoJiMxTwkl2JxFb39FoGoPqzEIzG8FyXuysAQHRITGxISAjJXPs6YJzY+AZiRQkKEIG5KTEqOShFORamd0tIzpDOTQG7Hpi5LMjsnN885n4GhgKPQqki+GGSyV1wJT2lZPjJL17Kcp8KmkgFZB8ItCFCVAAbVyGI1IbUuQHV1KPECNxmbeQiXYnMVvf3mUA+3sE68ASNefMUbQRS8HGvSYGCQEW8Gc1psoNHZysDQaBeNrK1Nsp2BoQSa1zHUdXQCPVAg7svAEKjSxcDQDTJPyKuHgaFXvA+ZJdLPDMqxE5B1YCt3hCDpjAdVdGI6hEaOF5jJOMyDuhSbq+jstyxxY4SNNpMw4kVnMgtKvIDqlynQ+IO6SVfSbGodmrZp0xkQZTCGuhmBIHImMIvPmg1iSc6BmpwGcg2C5TcXmAvmccxH1oEtXhTCwUADVRRLvMBNxmEe1KXYXEVnvxWImyNszGtD83B+SOoCBmT1YHOZxbWQ3cTANH2hUbIqisbUOZhuR6gLWwRVNk98MYhyXgI1WROU5hEse0g+WIqkgwFbvGArx3DGC9hkHOZBXIrVVXT22zLx5QhR0QVoHl4hzp2Aoh5rvAAbdao+7AXIGqctweJ2uDpICgEBPUiaWond7asiwPlgNbIO0suxNfEMGPGCwzyoS7G5is5+Wy2O1Dhe1YLm4dUVkmvBjHXroSGAJV42OGsDKz7xjWBOHSQ3b/Kax8CwGdXtCHUdC4GqtiycysDgCCmD5bC7fes2UObezoCsA+EWBMBfju1IB9YHO1HjBYd5UJdicxUC0MVvu4x2wy3UdlmM7mOGPZPBAb1XfFLzvkTkeAG1RexDQoCtNQt2QdnNSrPAozksSQvBTb+ZHGZW+1JhbRZ0dYkO+6MayoUTGBgOsFd2H7QvZMDudl0H4b29Ika2yDoQbiEEYPHSemi63GEb1HjBZh7CpdhchQD08Vscok45Io7WUAeCqeLg8olxpb1Lni1yvFhDyg41IN/jaNLCY8fByvPz1kOG2ZpFjUqLYG18DHUBArOaTuiCWMel2CW31uFwOwOTY6dbxklUHXC3EBsvDMan0k8boMYLNvOQXIrFVUiALn47g8jFZ8+h1ZwMoPx6nnAIjALqgylGx2HMCxcxpS3Ec+jpmlEABytjoLMUOy+h90KAgFFlfwB93TMKIIDl8hUwfeBcLzbp8KvX6OqcUQADiTvAlDmOqYqq6wAHSAVQXbT2LAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.250;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAKcAAAAjCAMAAADG6eoQAAACAVBMVEUAAAB3d3fU1NTIyMj////w8PC8vLxJSUmkpKTQ0NCLi4vT09PCwsI8PDxOTk6hoaH+/v50dHSsrKwREREgICAyMjL9/f0bGxuwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpI3NzfBwcH39/fp6emTk5MMDAyxsbFPT0/W1tb19fXFxcUxMTHk5ORISEgzMzNoaGjo6OhERETS0tL5+flgYGAEBAReXl60tLTJycknJyf29va4uLhiYmLu7u61tbXGxsZRUVFUVFTf398HBwc1NTW/v7/V1dVSUlLh4eEICAgYGBgiIiL4+PjAwMDm5uZLS0v09PQLCwuVlZXc3Nyqqqra2tpHR0dBQUENDQ1FRUU9PT3n5+dAQECIiIjs7OxNTU2pqamjo6OEhISMjIwaGhpWVlalpaU4ODgPDw8JCQlsbGzR0dGgoKBYWFji4uJkZGQCAgKNjY2KioqDg4Otra2ZmZnb29tMTEwhISEpKSm3t7dfX1/t7e1dXV1/f39cXFwUFBQoKCi9vb3Ozs7x8fFKSko6OjrExMSXl5cODg4BAQHX19ctLS1DQ0N2dnZwcHAXFxdubm5CQkJvb2/Pz8/d3d2FhYVhYWHZ2dlqamrY2NiYmJjv7+8QEBCmpqaysrLHx8cSEhJ6enr6+voFBQWGhobz8/NnZ2f7+/tpaWkTExOgdF/cAAACtElEQVRYhe2X+VsSQRyHR3ZSFDcJLTORCrSkIBCkKAUjTfOoxErTyrMUuq00S0pLOtAuyQ7tvo+/sl3WhR2Gth0ec/qh94flA9/9zrzA7Dy7ABCQocJTDAbCFZlZJEMlUGdL3uRo0hsERZWBpxhMLrsyT7uKaDAdI7winvkFacslWL2mEEsCzFruULSumGS0lJ5Lgj4TTwIxzxLDeu64YaPRVFqGVNWbNpebt2wF0qoFxoh5WjVmZhuXbNwH9uSOCofTUQlZAk2XaTuWpJ5ghxuAnbuqrNUeL+ppqtntU+2plVbr2L31LMtPr/bUNPjq9zUC0MSyantSR3PL/qzKA0SeB1v9WEI82w4BcPiIC4B22IF6HgWgE3ah1fj/fiwfgOOLHSfsSR1t3SUA9BB59vbhCfNs7eeTYQDx5FdgM2xAq8j6PAlPIZ7xDvcgl4ZIPAPGTiyhnl43CMLTfDpzFvMsgD60ing2wXOYJ98BzutJPS9YLmIJ8XTZuevILPxiwyk9kaoyT7ea1DP3Ep4Qz8v8vnRFWIEVqT2l1ZFRJZ6lhiAAVwk8x7TFWEp4cvt8L+T3+WvG6+3joSqkmphVWr0Bb3ZMTEo9+es9xLK3pB1jxtvWcQuBZ9EUnhKeEIYz78Ti3XtGw/3Ibzyl1enhkHPmgdTTJuypOqTjocbpeASHFHuWP8bTcsB/KZv2yXJOmQ5d9tnoU88IbY0/Uz3X8ux5I22L/9DixcsobQVFFPaFJ2k7KCLonKetoIyFV2KKROTOo022eDfp7379hqqJPFNvF0PtzKhf9ky6vHtP20AZPdr5D7QdFPERLvkj9N8g+imnjraDErwMbQNlzA2KaQD+yzdQqjwx6bUumiLyfA73i1G3QFNEnrIv8cfHwNdZqiqyfPv+Q4wu3zRNE3kCP2kbKOIXIfeDzuV5MFIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,10.image/webp,2.40,3.303;4.blob,1.1,8064.UklGRtY4AABXRUJQVlA4IMo4AABwoACdASrIAlAAPjEUiUOihNYLdwoAwS0mQxfpLwAVWFEeCM+nnwD//zD+gX/8/v+i+D/4r+E/7d+pH9M/lv9P/Uv+nf8f/Ff/r4//Ffl/57+P/9n/9f+h///3YfAn6J+TH5D+MB8A/t/5Vfx74C/hv0y+a/1n9Zf6d/9v9F///jv+mfzD9ef2m9dff9+z/y39Yvxz+wL8Z/i38+/p/68/1X9pvaH/c/7f+6X9D8WLUf7D/X/yP+AL1E+M/1X+zf3b+//2P9o/ip9F/rH9R/aj99fkr6X/zz8W/3g/AD+JfxL+pf2L9mv7N/9fmj+e/7/+1eYT9m/q/+y/u/46fYH/Ef5X/b/7b/lv95/cv/3/xvw6/Rv77/cv9F/pv8f///+f8RPxr+of4T+9f47/af5H///9D9A/4z/Iv7L/XP8X/pv7r//v+T9sXrg/XT7//ou/U7/VfnoZh5Y5LWCVW4eW4m/ttPnqwupcrz1YXUuV56sLqXK89WF1LleerC6lyvPVhdS5Xd+rw11JDOukPe+mDH1+Rr3GrSoilr0S0qIq4J4QtM7IzUGmhYfWnoo7xVOrXWxdeFX3LQwSeJ6gHH6nFCRVmNYAz/sF3W9/GqYcOQq12N8hW/Ta60R6zS64GekYFgjOry1p4fAvDO641RbhpxO/usQ3zmO3C8EAHhvgIk1hUXmK9RPBGAIVWq505ezgRUnv5UhsvXOE3wGD/FcwGsgUXRYw7vx+UH8wyKPo2PbUfkAyfr/cvMxGBVVVfbueSDEfjGVbuIGPkYeXc0kz4Cy+rsf/LChy/8MydKmY56e1F/EHF+tIudehIvbmy7gBpDDrDvFn5GtzjAunqT54vzXgpSob5EraqAsiO83wYrCuDFo/Jtj2XScOdnT6Q6I+d8/+b/0F/QlPq0SIlcjTw+glYiNlz6CGPpDcCKVtrL8XCtowtbF+04Cb7wIyeAS0x2gfbLUraK6bBlwG3FQdpW/tszv/ZrVW4omailvHkCHTv2IeHGiYFqs7ZtFpMQM2QP6WQlN8pb7JbII3XseYGHAeDUsILzKw93UXJ37OXokJ8dj+JS0LGsvSaAgKnb55pVm4Jq3EaAe/D0HSm38QfXZltf0jqps1qDAch0iWUoOWx9+IdqerdmjumFXmdqNmzRrXAR7uL7ArjDyt/w94T3a4zLJ84DkqPIBvlI3NCtZuXU/q0SjOifpfr4BIHbd2Rg5X7gCoZTEe1DkWPotXs+prO44K0iAoCh5mKYER4GIJdojnOnnxP33inIkWzu3Zjp6J8QhMi++DzpuFJqkqxN3Rv4UHYGqUka5p9lY8KxSyTN5+gnw+4hAU9oc7AlulBPM+9eUmd0IIozYhM4sXFKrJXpdTHkBOJHlXggSWfPjurBKti49Dv+axybK6l8BFNr1qsctLZ77aC2/aT4D+jsNOWiIfSebMqSJkRNvKi6YBcqkACZxGEvcPfE6K1/MFGkhY/2Yh8JfgifEVpV7Ok2ugbS+gCIYKBt2egjvMFR8TQ2j9uFVzfAQpX4UPfvjToBdkluC7RyxCKEGsdCHk5y7phfS+/JlFpwkicSYY5voIt5LMrGcsw+8iZGRBROG1mertg8RgsXCJcQ+03OI+oiTM/+hofKmB8m379cfNsG/Ys6NxHkPTIDlYdw3xr13nkDBJgGWuUNCAe7ELxtTtP3egZBUnALfE1K3Tsc31hKMD8PgcCuWBdf2GAAD++RbLxCjgCh0SvLy+zkm0EKauEXqqC68j5IHrtJrs/3rhaDsWOkV3jnzP72NYdZr2/lOIntozg+rG+43pE8nOOk/XfFzaUEqpJXhVmUgR9O937aJWVIN6GJf7fehkNLeppJ7ALsOxuWSPrbGISquyb8Uy2bUfjLUGc1WzvNfKtShFjYY2nATWho5/BjwXzhWW9tTLHVVfzCdXgiTTxGBtXZGqccBs2DEmGdk/MplQTTO459NL0oQahgt/o1XpVmaaxs0VpxCQnyHy1jZorTiEhPkPlrGzRWnEJCfIfLWNmitOISE+Q+WsbNFacQkJ8h8tY2aK04hIT5D5axs0WCbhQyyqTBv3t3oSk2SOhRHDiVpx84FX4lswyaJZTpbsBQqn9wTBgSFsiLKJf733FoGL2Bo8LIaTJqG0V6xEN33hILcyUgL+hpyPKgPztVtUPGgj+tYSioo4mUcb4hiAALVaXcmFQnXWUAFlMecIG8LIHn3q0aToJonrY+awYggWF6HhL0OQ2WkA3cTeT8kIrGBEfUBTYhqiJ9SHEePgqHc0ABhZdcLkYvA7rSGWElG59QZKtPqOop7kRWiSIPRa+PkAYhkd0gdxxbnVV4nm4bwKvlL89pOFpRIMy/ZISHpyLoYRHBhJQ85W/bVoytiEUN1UjaeKp8ju7m0rFLPnoU7vtF92QRIEovoUwYE0RQX+cmDwZ8eZ3TnU47+Cf9uCR1GwBfUAMAhdreU8pws/CYpti0TXYj+9CwutWbzSYSym08j0JVjGUavfF98Ja/RoyjdMy5aEJelLbrDZXG6tD2qvkkIMSBS2xUY/sLtzmc4jb3gVAQicjLglcuK5hX4Owim4j51tYqv1ayy/z27vWwiYluOdiXwSpDWJyjyWGYuOV+O5lX8cyPgk7qVzKEBwmj/sQSNYYVhrIyz7SacJaEZGLvr9WSAkjQe8dsOszZqxlmVwQ3MLbEg9rqsKwy4j9EKNYdVvUnAkHtTx2Ts8eqckyHK/L53Tr8STLFj3rrCw12CcJEipmU6tvgGM7WwcikZrj8wvTq2UC5YfdwbfMnnwXGD7WhfFiEIvZMlXcBuHdyzRt3tdOJXXhUIN196qWoArNgPLbbYBpRgUjS68XyH5zh1bpIttY7+6aoAbIswiIYsP0QcsnYESNKnN5+tnEZo+zYyZQNrbTQQXak3IXva9IAxHuiMqboGnqE3eD4Ihqbb0tKYqF9yD+X4iYPu1T79ParsQEnTv7rkjqE+y8+C5mD81jFFkWPrRxLhI+3aA8xATPKInQpi4fDbuiy0OyKdX5HCGLNQpfaoKSbpy0ncBW1uF8EqrzAYV7e6ABB9DhLXyWYs1SQZYro0wF0llK1dKmEAF9X+Y7It3Kc9vYRP7q6uo2XzoPSz+agzJuHXyCQO/TRlgFkc7wneEZHU9Ak0qEWjU9Z6Kvw7mWf3zCi58izYXDbNZ67Kp/2tlUU1SI/IthiQANPBFhED4LNsGvDcfoYiPiEtxfq9Kg1X5l++qYEJALUJQ+yj3xAJISmcgWDKNS/1HlA/4DjmV0/jFr7QruOWmd9bYDgUz9iWZ/YCrIedUy1xjDH1llCooYiz9rca9YwsIASBlE+/tYhKIX0gj5N0RXYH1tx1s1EyJrW4Oz6CjUTFXkw/aRkuUWvbR71zA3RUNEDlaShpgKTNf6APYO7AG34ZHxUhmRPKS9lnPPEYT6liZnfQGh+0Yw1zeju37JGW1c88EKHFcs/SIhhfXM9SxcVtefW/U9r8Y9oA/3lQqg11WW2czlv4Eyxodq/buRpxXItz76etqiUgiKhCZMLkYvA7rSGWElG6L6IhNdw2Qi09ETyBHaK6H4PrzGzOVieCcen7Wdby1SPI4QxZqFL7VBSTdOWk7gK2twvglVeN+s/3ce37utt4PJrhLciUtQbj6Fn65lyaYMDaRJ8zYV1e+VwvNtSDaTmCzIVnp//xCGLO3VoprjlCDEBfqQ2qAHf5HaZh7tLWyvGkZLlFr20e9crisD9Or0gvxgKvlqhqy06Aa7tF9NQ6PpXIP5fiJW0RldGWrjrxwXjCEPVLPq94xWZ9i+7SthbVikAEwopGLRefz37ICAOKL0g/fydtTwCIPkGZ5g7ipkykJvgCp2SL5YJzR/GIsBUXblLjEtegdibcQiXrmlTWAFttWS0QmPUCA3FgYndSZ9rlagcsmc3zFhTMdJ8LBdNNg9mpU3k+ZJL9MysIstr4+YEUD4fIP5fiJdtVHyrfPvgx8jDk1IfzYK419N748GMvcISKUtC9etBpiy3wFT0mKeuGkYkOVestGuf++YrCF8lcqVUkj3SDTgNentu3TT4d0ecmOUvesHWFlyI+/I7OdJEDtnlAtPYM5BtwGH17pyOgMmElJPhjQwjBvu5BxqrJlvnMcMOwU8d1nIg5o6pIx+rz6PZJ15wc1/5ryL2wiACCMbbvwt1Jl96yt4jRDd94SC3MlIC/kIjyADlWBEFWlrod4n2tOhDuYlfVBSRQViJ28CumYaaTZ0EItuGOzepY1RYc/dNM6emJPSuiMrhSAvstN0CwnhpRoU+StdJh5n+hFXIxxqJ8R10nLL5FzPgXX3aLwkRCH/HVkBiE56SqVwH1XqZrnUBtG+6oa+4YtCPNmxeUpe6nF06fZrYcT10wtbElHUl4wy+2TuxGNBfXqm5+5KM6BX/wYLuI5/ZZCdJTLdBTzN8Mh2606x/3Mj/pZR8x3MfuIiIRjb4VxszSgxjaa0u0CcmQ/wrbMOW/eq9T8RFJAS52bKUizzjPsWBCQCCuSJ7YE3ieD11YHRvWmteDpPT5gIyPVi9MmOKqNqXDl/2GnS7WYr57d3rYRMS3HOxL4JUhrE5R5LCupVVoUbJum/lMygdev3IMoRIf/5411yngRpP2SfzOp/Cb14A3fa4hot8Gjjd0r1bXAf0A1UCHFbXn1v1Pa/GPaAP95UKoNdVakIOGgi4tEYgj0Nh34bCXTeu94jn7eoyu+oWdBAW5+cHl+i7OfXNYkuCnhxMwaFL2dXb6/kaZ2NCVyXergn/Fs4vW0gCmpU3k+ZJL9MysIstr4+YEUD4fIP5fiJdtVHyrfPvgx8jWfEdeKUgyA0NZKYTgzCEilLQvXrQAXFoXxYhCL2TJV3SXeVyt2t/gw5IlVL2/LSmsc84KpOqCjOwn9IF0xyNZUujLa51prsadzarVwO9oLEJA5r3bzy1iAMz7Z0lZ15lKAn6A8Ct+B33j+9gfH21uuVPRpY0kn32lSDOt+VJnYfcil86Y8NBhLXtmHpdR+SDQnAARTT9ZdyiYnWUMgS1ee6NsQKJe6n0eVaQBbWvvWNgKeyMaLMCV9U63IHrEou/3/AoU4df6th3ndLsBiOvoy4x6GSvpoP86Se6YdT1pT+Jvh7WUw+Rmqqsysyz2SDLBt7rHC0sSRcXD4v6yd5OeuyqfBZh9NdoY19xG7BEm1NESV0T3c5TTjQK3JWH4FpbCXQsVhwtJ1sOqqZ6wsG48EtjI2SFONOIc0Z9oFPtch6UZsSI9ir0Oy6Gdc6/386jw420s11/wGNCjHx4xK8x4BbS+dtFFKy1Ztg9hp/HxJYH7DF1tYokuW3fBsAmJZvHHinSuuE73hGR1PQJNKhFo1PWeir8Fdsw/aRkuUWvbR71yuKwO2ZibjUOLZFhwWKPGxEJY3myovSXoA86kV/f2GKBPK5+rQSVDDjo4HPbAZkalXuBk9Rd74LVM8jW3/pPpVGS3rM638cglvZHGdAo1sJ44t9TfG54138LFbnyyEEQlOFLr5ORPij9VZP4BxHjiWil1JnDCwJcpU5YPqMgImhLLgMNgCVMkdzLNrc6y8sQHICxaLU2F3TloN5l+eM92uHz4/irK9Ivrd9Jua0yjxwsVLeEZWJPjlVd9o15mssh2c6SIHbPKBaewZyDbgMPr5RE5hNOU6XmB2zWrmeAazabEVXeCu2GQRqXfGh8E6JAJ2pg9YBFPmKMgUFdP6H2s7nML5Eg9rqsKwy4j9EKNYdVvUnAkHtTx2Ts8eqckyHK/L53Tr8STLFj3rrCw12CcJEipmU6tvgGM7WwcikZrj8wvTq2UC5YfdwbfMnnwXGD7WhfFiEIvZMlXcBuHdyzRt3tdOJXXhUIN196qWoArNgPLbbYBpRgUjS68XyH5zh1bpIttY7+6aoAbIswiIYsP0QcsnYESNKnN5+tnEZo+zYyZQNrbTQQXak3IXva9IAYRH2Uox6+1r5cLxuVesCi9qONuCTHpJvsLYoUAe2cUkMLL8GA0ScFI0nLZo91p7Cyzt1IKAc2/lz9D13VqwN//a03p7EwmLdo5VRVA8Xr3GAfG1Yzk4IVgtIqiEw1QoWdJxqv7RFuMIeR+2zQaFMwucF5k3ZVj/XwbdFBcPBnSVgNdlrX2fR51dX8obCPZhrJTqEk5ryr0XJsW24Atw4Uqc5lZxfcH89qPAJtgAiA1a52VTfjq0pnrezEJQX6oNOGvbvTLr43QmdpLmXB/UDBiDb18liExLA3cmSTntqZXEqH03ydZ+H1N7urYmn7ZNFttFhG38QxMU6cIY+gPDMK/Tla6Wk5I/KtR5f05Ldg80epzo42fT7cphjs4RgZfJnB+6qBAcefSE41aEycYcqAT90gSQ4Og9Sg02sMJMbIZaC4qoWNjLox9ahD6wQA77XoBTBYC8EOuyS3SnQ/iVBkZnOLqqe6Mm1HBK4Itt6CyG8ags0wT5IaNAFsPb7eNGBN1PG3pfIAKCPihqHK+PcjFzQ+aRYo2d/4PknK41iU9G/EdFQXA7/Txgm9sDj/KVsU8mj9ujHtuTbKwaMN2FimPinSCBV6mStJPJ+dKbtxHWEq3F1YmKvj8oiBVzqQPlxWFZDNxel/W5uRqvytYbFiYsVUGqVzmA6MKd+9R1w0T20q1vh9KWHBeQ9RM+ORSKbeb0EYCfMrHDPgjQExqsnQ1DgzAHtSIJzRaEoACDraaRwiypHYcsSwr8+vRIGLe9y0MU0zNxTMzQfUOmvWrnFXF4F8Mm+obAGY2zU1C8a9IHli5gqLfV2/sWWVk+GhDSuCfQ72nXzejakpO9vUTjIaht7/LX+D2d2AeCzKc+UjuGaygp4bjucy+aeVLyP6ez6Qz5F+awdY/ZFuwxhTZTTaUaPTGNgW57WQW4uvu+m+7GrcbVIr+7PbqL2+a+dk0ep3qBEYstTZh5JhtNwtBAm340Louc6Y+qr/Plj3qOE/3oythmDlp+oXd3jz2oF+580Z9LCywtVfxI3AX8Xfj5mItxZ3VsHQJN9bE22pITfFvwb0KaKoTSDwZ0TNBCIWGdWeOt2dWOyLNKBLeoQSKbkh6Um6Q09hL34mw9bKEG9wFbswQCwN6LhIZDEFUYM6lOUflbxWivRDZui0QYO6KvFemxaixK94g/LMPP9nD6ZTdI3jVjKJb9WVRnpmI2ymnKvBXl4nW2q1Ha2lIESp14uiJDEmmrTYQ3aZHuWi3QjwFvRW5l2F8XZERj2kWc27NwQJr5bZKGtFth1tffPjfc6S2t1lrurIrslcTGTjpFZdRlcFlqFPLFQmOOmJEU8xqVMr3Ufhfd8/8ghuzdxDOLv6pk4VUk7Ip3qx9tMldmUG+nL7MMUoalsyCcd1SO0NsJLiqcANHuB85hqQZdCB/LN0TU35mJCJZJnfpkU15uSPoKFl+jGpolPlOtME+P9y3qXnia+XlY3Dz0pDmKzf2bt9T9gHamqbZIx+NFj5QfEXtYB8nj+FNS8q/02/Hw2Z9GSmPXYj8Aqq+RnfcJ4f0Myr03NYdvbgdSSVxJRz9xrA6r7I1Xuw5DFJudYthNL/yhVYxSY9oMBLXkjsl5rnhDsHelECsR73oyVZkDGmZTVDb5Ak/imeKMM5Dm2LDVRNh7ui+7Py+AVVfIt/YlclZjZmNEV4Av7noy7CEfYtPnI72y4eXnpWwxICr8NWRKhvkSeDJLn8JRWWL0dyZu4XzBDbwAUtAy65byhoSoYsp0PjUOt/Ao16ES96z1YOJmdozivxHRdocBv4I6mCU6fBTIwIeYNIYy5duR4rlWp/evxY3fMgOHmc1yhQSTGQ2DaXiumTMMEc514SsX7ZmrJYtRvNc/v0Yb1dhjPxrZ5QQkP1c30GTpMhs8Bqw9rFRZzy2ZWOxKDDzjffWKfbYU40RPxKSik4WP3leNoEF7czIcamsV+Zg/M9sgYUcsiTgnpo38ULq4FpgcnIlLeQBTGnq7emtuXPJLCJ7SDcjk7Da2iZ5tqYBkcKD7q7Te0cXVJC9W3fOlP79eA/4o8h0VfVrCsOIMyA2FOi4ZYARx;4.blob,1.1,8064.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;4.blob,1.1,3284.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.381;4.blob,1.1,2136.iVBORw0KGgoAAAANSUhEUgAAAPgAAAAfCAMAAAD9TvADAAACUlBMVEUAAAABAQEzMzPDw8P39/f29vajo6MSEhLr6+vExMRJSUlAQEBLS0uLi4vT09OkpKTQ0NBYWFj///8gICCsrKzIyMgRERGvr695eXn6+vqVlZWfn588PDyYmJjc3Nw0NDSxsbFPT0/W1tb19fXFxcUxMTEoKCi0tLTz8/Px8fGioqIYGBjk5ORoaGjo6Og3NzfBwcHp6emTk5MMDAxISEhbW1vMzMz09PTl5eWZmZkTExMtLS3t7e3q6uqtra0mJiYeHh6qqqru7u6enp4QEBBVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU0wMDCampr5+fkODg7GxsZRUVFUVFTU1NTf398HBwfKyspOTk5ZWVnX19fR0dE1NTW/v7/V1dUnJye4uLhiYmK1tbVSUlLh4eEICAj9/f2AgIBDQ0NcXFzY2NgUFBTs7Oy6urpMTEzi4uIVFRXS0tJjY2O3t7d8fHyHh4f4+PgNDQ1FRUU9PT3w8PCIiIja2toEBARHR0dBQUHn5+ciIiJdXV0qKiolJSXy8vJCQkIyMjIDAwMLCwvCwsIfHx+EhISMjIwaGhpWVlZQUFC9vb2urq5qamrLy8uKioqWlpZsbGygoKBKSkr+/v6mpqZzc3MkJCShoaHv7+85OTlnZ2eUlJSNjY3Nzc3e3t6rq6scHByCgoJ6enoKCgodHR3b29tERER3d3dhYWGXl5fg4OAbGxv8/PxpaWnHx8d/f38pKSlfX18rKysvLy+wsLDOzs5XV1e2trabm5s6Ojp9fX1aWlq5ubm7u7vAwMAF0IinAAADqUlEQVRYhe2Y+VtMURjH3zIxaRunUsPViilRKEaa9iIJKUI7NURJpCi0WspWdkXGvmff9/X/ck438947c26T9Hgw8/lh7jvnPe97v9+59547zwFQwkkx87fhxIlGjPMYlcvY32/zB0Clo6F5nNp1vJv7L5V4eA5jkpdmZHqUQaUj0GzNBOI9rHk+vuZw4nAqRt84Kh1as0QpqvGzGvLXDu+0vHZDMfrGUenQmnlKJ022GNCQAQSAKQH0ayBxo5KDgkNCp05j6em6sPAZETSYKc6j0Sx6iBSLo2ar5syNBlmFGS9NjGeorzML583XL4hdyKI4nSE+IVE+D2vN/SQkJYelpKbJlGKEWZ5SM+mLFmcsyVyaJR1bJixfIQhCtsz4nJU5uatW5wEsVK9Zuy6/gEaFQlExnUenRAiCl2i8xKU0Zn3KBpBWSAylrCzLLS430vNu3FSxeUspHaus2lqdrtm2WDbPXIv9kJqZ23N3RNbKlGKEWZ5SMzvD9fmeVdo6+U+6s148So3vAthNGgAyGqnGEhLM8pIbaI9oPHnvPoAm0iytkBhqmQjgxrKtgQB5bYRe8hjSDrBfVyg3/rMW+yEeB+hVPEgOSZVihFkFpYN0VKj01Z0Wgxzj7OlsJWUAh5NZ5kg037j+KPtUH5NWSAyxseOki352+4bRm4+uRzXqE1nZFufHWuyHhJw0Go2ZLqf4xjGroPQnM3Snz1iOKRj3JrkAAWdxnpXxTHKOHQrOSyssDEWQCQA9vRfcCy8OLMR9l0zarZetjbNaST/EID6xdXzjmFVQOsgVbWJDb7WC8avl1sbF31HBOISKV+iaLeO66zTqHnwDdVwOUpVwjUv6ITduBjJu8Y1jVkHpIF23AVJzFIzfqb/L5MmMZ5jojXnPNLAcxt63NJ4gPpP9tozXFrHTMOMPCjroCkce8o1jP+TRY3b3PpEpxQizCkqzLR8sjvH2p5f6n0XKjVfGP6/u2q4xsnwbedG8uVJc1Q2CMB3gpaq26ZWhFGwZf9br3+SxkbwGeKN6697jp+/jG8d+SE28pm23hzaObxyzPKUAnVWmNJvGoWxL/bv3cuOQ9EHf8rFmIO10zbAiP058j1N86NAnV5X6UbZN406ft7l8+PKY/cWM+lpl+vYJrOaJteZ+EvoSGsO+V8iVYoRZjlL6Lsm/b7mWO3DgwIEDBw4c/Ctwtp7sA6utJ7uAt/VkF/C3nuwB7taTXcDberIHuFtP9gB36+n/5weMmhNaPUONfQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.420;4.blob,1.1,4044.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.461;4.blob,1.1,5016.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.533;4.blob,1.1,3400.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.552;4.blob,1.1,3132.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.591;4.blob,1.1,3772.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;3.end,1.1;4.move,1.4,1.3,1.2,3.616,1.0;4.size,1.4,2.12,2.64;4.rect,1.4,1.0,1.0,2.12,2.64;5.cfill,2.12,1.4,3.160,3.160,3.160,3.143;4.sync,10.6492304412;4.size,2.-1,1.7,2.16;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,200.iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAABmJLR0QA/wD/AP+gvaeTAAAASUlEQVQYleWQSQ6AMAwDx6gPb18+vUCACvgAPkXyEmkCyIs2ABWV3nvdALk2VZJUs+0BlvnU7OfPH5iNZ/AeZoEeY5zQkzv4VROkCB4UXQdRZAAAAABJRU5ErkJggg==;3.end,1.1;6.cursor,1.3,1.8,2.-1,1.0,1.0,1.7,2.16;4.sync,10.6492305019;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.40,2.44,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.22,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,1.6,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,1.3,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.41,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.43,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.45,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.1;4.blob,1.1,3888.iVBORw0KGgoAAAANSUhEUgAAAl8AAAASCAMAAABSOEu0AAACzVBMVEUAAAABAQEzMzPDw8P39/f29vajo6OUlJT////+/v7i4uKdnZ0cHBwSEhLr6+vExMRJSUlAQEBLS0ukpKTQ0NCLi4vT09MoKCixsbHu7u7w8PAaGhpoaGjo6OgwMDDs7Ozx8fGpqakiIiI4ODiAgID4+Pg/Pz+goKDU1NQICAjk5OQ8PDw9PT1fX1/a2trc3NwNDQ1YWFggICCsrKzIyMgREREfHx/q6uq/v79RUVFaWlrW1tYMDAwYGBgtLS3z8/O6urpOTk5XV1fMzMyqqqr9/f0+Pj6hoaEjIyNxcXF5eXn6+vrb29uIiIjp6ekGBgYTExPy8vKcnJzJycnGxsaEhIQeHh6enp4QEBBsbGz5+fkrKyu3t7f19fX7+/tPT0/FxcUxMTG0tLSioqI3NzfBwcGTk5NISEjt7e2tra0mJiYEBAR7e3tZWVmYmJg0NDRbW1v09PTl5eWZmZlERESDg4NgYGDj4+NBQUHf399dXV1eXl5CQkLR0dF1dXXS0tIUFBTNzc0PDw96enoVFRVUVFRjY2OampoODg4HBwfKysrX19c1NTXV1dUnJye4uLhiYmK1tbVSUlLh4eFMTExVVVVDQ0NcXFzY2NiNjY38/PxHR0fCwsKPj4/AwMDm5uawsLDHx8cqKipkZGQWFhbd3d0yMjJ8fHxFRUWGhobn5+clJSU2NjYFBQWBgYF+fn6VlZUKCgpNTU1zc3OOjo45OTmurq4JCQlqamqMjIxWVla9vb1QUFDg4OAkJCSbm5sDAwOlpaVycnKFhYWHh4eWlpbv7+9KSkqmpqZ3d3eQkJCCgoLe3t6rq6vLy8tvb29ra2vOzs6Xl5cbGxsdHR1hYWG2trYCAgK7u7uSkpILCwsvLy9/f38pKSmvr69paWmysrIhISGnp6c6Ojq5ubl9fX12dna8vLwZGRkXFxeKiopubm7Pz8++vr54eHg8xgKdAAAIUElEQVRoge1a+19URRQfFWQg3ZQFBIwgBddlVVJRUFQQJcpFUFETFDUyQa02dENEEUoxyfcjH2i+0nyk5iMfqSBloZZlWlnZO3u//oZm7uucuc7CFpUf/XB+uDv3nDvf+c73fu+9cy8Q4jFaeC41R3M0MVq28vFtfatJNMftH36U+gfc1caUbWu5u137wP+bizUI7QSHeD6wQ2hYeOuOTRztHkpphOfyvaGRUfd18gaoAaZydRuNzrRzY8iyiGYzimnVhTQ2N1uQxxKvdtUaHEQJu9cMbh7XL9bRrXuPuPvF43rSXl5jehO9472pCv7q45lB34TEfv2T4gY0jdNAh8Pq+RwMSk4ZnDokwRtrNMBUrm6jofurAWRZRCc7HIFD0x5obG5e+ouBOBLS2cb7pdLN4/rFsc2D/g+Jxw1zeg3pVfwDfzUQtgx2RfV1DmsqKzLc8zlIz8wiZMTIUU0bQK5uo6H7629GdDjbtMgerew0MDcv/cUjdszfJTFc4i8S68c2Y4cmhz08jjWC1NuiA+dITu74CXkTA3HOGjopKW/yI7zaIT856tGBROgBJFU83pzymE/m1AEeqtaggpC8+JZEuM8Oyi9MmDYdd5gx8nGF0BOEPMnZu2h7tn1qSNHMWSNELnrOTZ9Ozi62zC4xMdC1kHAOncO3pXOFKnAxWoipgQy6yNRF/IALqDuvLDdkPvcXICOd3eW55cXKmZGE4i8SXCjMTdegCy3lu6NDuL/mR/iGdsRVxIr7qyLpGfWeq/kLdAYuiBXWT+avZ50LCFkYW165KGIC273X8Vwuuy0uxjmSQ2cucFcOxDlr5uh+lV3nVLEL3fL84CeWlFUJPYxY6khcxvBYa7nvioKVYas8VK1ho1dXLltjx/fZisiUtS8EBTyLOkyn7fQmzPuFtOh16zesIJiLkXPTjf2rgzbFbzYx0LSQcZ5LX9SealAFLtACpoAMusjUBX6Ii6Fup5gt7Yojub8AGfCU6taG/bUtBM8NdBmynW120JeYg2hKYPfCyUSuGvPX/UMydqqQN/vL4AItQT+zv3bZ7eNTotg6I3gkm948+jLP7o5RqyiXQ+eac9ZMdgr20G6E7A1nUi+nk0QUCP0JOLTHDEI20RJ51bqvDyHttarGs4DuIOSV/KXo8P1c3yq7/QCedycXy5XSEZiLkXPTNmTNQfLqGhMDbQwp593OotadxSpwEVhpKIAMusjUBX6Ii6HuIcthQvppz8fhur90vEORrHrEs7/s9p1HaTHuC7o8Rdm95jULu3ptW6v4GMfkqtm62hP36S82En/pXKAl6Gf2F382ZexnraTjdrv9hO9JRVzNXyiXQ0+Yc8p6qRNdTcjmobzSd4CIAqE7qEiha3ldXlXwOtJTmOdCy+kji8XDFX9VU5ovPB/PxCezmfTCXIwc91dNNNkda2KgjSHnXBs8k56tw1XgIrDSUAAZdJGpC/wQF0Pd7HQC6y/dXwZe9htK1ZO/+GhRbwqsQJcDsaNIluUc0dZfVf4n5arZknpXP6JD3uwvgwu0BP3M/prtcm1RVoSF6jroLd7W/YVyOfprKuSUEXrRSkLi3tbxMAqE5qATNIf/lNmkVRVvIO0p8KxNr3emHMOH19IzhLR0nRb8dd7/QuDSo1wp4GLkwF8iA20MOWe20LtIjwpV4IJZqSgIGXSRqWvww1wMdQO422T+UvAC3iEN+SvZ5ZpeRzArpAu5mDfulJOvutT1ffi7ctVstJoaLyRyfylcoCXoJ1l/7aH8m8ml91w8lDdy3V8oZygAORhBdb+pBwrdQXnqFbtRXpX6i5C6Y6E+y9HhdfXKTI6zhYvfGn3e+c+w1hm4EnkYOXT/EhhoY0g4HxjDJSHvtzJVgQu0NBRARv6SqAv8EBdD3WzuNo/+yraShvwVjna0vqALGVd0OeUCzyn+yvL/QK6aLaagtXOKtqP5C3SW+UtQSLa+v8LXZldr+CPlQyWr+wvlDAUgByPsrWdPi4/qj4goELMy1N9p6orDLa/K/HWxrI4tp+nH+PhDEW3Zdts1QhbEHOb6sHlPSOS0uVLAxcghfwkMtDEEzovV596uVp+wd/0Nn+IqcBFYaSiALPrLrC7wQ1wMdT/LZA/K8578NdXCqms1fy02rRuk/gJdWO9LafxRTWyxWWxpz8eQqcbW99eTavqoKJq/QGeZvwT9wF8KP0WBVPo5W1MkBJXuCXYO4iXdXyhnKAA5GKEiYfvaU+VBdhEFopR+UbK+gpAvfSZs6l64gsir4C/+7lTocHQg5HOfbYHnvyqqxcfvnFOW6j7Iv3/tqE53fx3B5/21/7BNwWl0POZi5JC/gAGMgTlfj6xXXrTdE7+ZtPYr5zxcBS7QAhRANvnLpC7wQ2oY6vb1PV2wPkB/f1SRAe9bn9MF3WNVf+lMZf6CvqALIQ+mbVeqNv8V7eaGsVuzVDX+fWJ8XqjgL9BZ5i+YG4yr81MUqIv7jm1rp4Unb1lHsL9QzlAAcjACGXutaN/ZhWIPFC02FuYu4efvxt0+lqvm606vgr+0P030ZvtTvo+s//SG2KHNBUvRZD4sWb0h5koqn3eLHwJ8r/WvCcRcjBzyFzBAYyDOVUsyriuNKass9SndxBkBF6OFUAxkk7/M6oJWoAaoWxLi7LpS//6lIiOd14Xklv+o3t10pll2Jeqwv6Av0oWMG5mqVG0/Lcj0Df2ZyFVTvq8W85Unge+rhs4yf8HckBqgZHPcPqFcGP6/4FS8ek6LG+/86+wZ/xGt5rgzolvEb/Muh80Sch2UxbVrRGN9l35Rveg/I9Ycd0as/D1m1znv/58Bxx8Rf/7LZJqjOW5t/AXQKpd3ED/12AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.41;4.blob,1.1,1624.iVBORw0KGgoAAAANSUhEUgAAAGIAAAAPCAMAAAAoEeq4AAACIlBMVEUAAAAMDAyKiorh4eH19fW5ubksLCyLi4vT09MHBwfAwMC/v79UVFRISEiSkpLr6+seHh4REREgICCsrKzIyMikpKSvr692dnaxsbEXFxfDw8P8/Px3d3eZmZmVlZWfn58CAgLk5OQcHByqqqpcXFzBwcELCwvf39+4uLjq6uqtra1sbGz5+fkrKyu3t7f7+/tLS0toaGj////o6OgSEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eUTExPz8/Pu7u6enp4QEBBVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU01NTXExMTt7e0xMTHg4OBGRkZqamr29va9vb16enpEREQYGBg8PDynp6c2NjY4ODj9/f2AgIBDQ0PY2NjV1dUVFRXS0tJjY2N8fHzx8fHX19fs7Oz6+vqHh4ddXV2cnJwuLi5HR0eWlpbe3t4GBgZlZWVeXl6IiIgkJCQiIiI0NDTy8vJCQkIyMjIDAwP39/dMTEyCgoIBAQHa2tpiYmJ/f390dHRQUFDW1taurq4ICAiioqK0tLTLy8tpaWmMjIwfHx+NjY2rq6t+fn5BQUEWFhZKSkr+/v6mpqZzc3NnZ2cmJiY9PT3Nzc1WVlZRUVE7OzsZGRkUFBQwMDDb29uXl5cbGxt7e3tra2uoqKhFRUVmZma7u7soKCjn5+cEBAR5eXnQ0NAtLS1aWlrOzs7Pz8+Dg4OJiYl9fX3i4uK2trbw8PD1E8feAAACW0lEQVQ4jWNgwAYYmZhZWNmwSoEBOwduOeIAJxc3Dy8fvwBOBYJCeHQLi2CKiYqhCYhLSEpJy8jIkuU+rFbIyaPyFRSVRJVVVNXUgbZrMGmyaEmCRLV1dPVY9A0YGAyNjIyMQSImpmYgytwCSFhaWdvI2gIZikZgAJIQULazd3BkYHBydnF1c/fwRLLCy5vTh9FXmMGPk0HUSMI/IDAIbIWRTXAITygDQ2hYmCjYCoZwkHsjjCKBpkRFx6jEaoA0h3HHhYWFAVnxigk8icZ6DAxJydYpHKlp6UhWZGRmSTFk5zAkuDOI5uYxMOQb+YKtKICrKIRYEWJUxMDgFgdkFZcAYzDDyBY5oNhLge4pMypnYKiIqbSuUkMOKOdqfzGGjOiaWmBAWQH5gkZ1YCvc0a2oUa9nULBpADEbReyAwSOEbEVTc0tLi3tgAJDZ2tbOhBIXHZ2R5l0a3QU9UCsYdILBVrSgW8HQW8vQl9YPZEyYOMnAazKqFT6QWAGGz5S0qdMmViFbEcKdZ57mEWitC/dFIg4rBKIiLMDJsW06yCeoVuT2lICAEgPDjGoGBoeZyFa0pM5Sm80wew6QKVqrwMCQaDQXhxUMGjk+4ISixw0kkiBWyM6DyM33YwSSCxiwginJC0MaF4FYokaLlyy1XsaAbAUoRfmEhS0HsZ1MV6wEh+3EVdnsUUa6IHaGUX2fCtB98ZqrM5awp63BbsfadZUrVoGtWL8hNVArHsUKQ0gYC4PYefwbwWI1mzYHblnrZwBmd/vopIAMLtLaascVg90GBIBEN03BELECAGGuiQtgcdjSAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.613,1.0;4.sync,10.6492305713;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,3.421,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.24,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.41,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.1;4.blob,1.1,4052.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.41;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.611,1.0;4.sync,10.6492305792;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,1.0,1.3,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,1.1,3.578,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.41,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,1.3;4.blob,1.1,3440.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;3.end,1.1;4.move,1.4,1.3,1.2,3.608,1.0;4.sync,10.6492305867;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.22,2.41,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,1.6,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.30,2.22,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.21,2.57,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,2.22,2.79,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.21,2.17,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,1.1;4.blob,1.1,3568.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,2.41;4.blob,1.1,1488.iVBORw0KGgoAAAANSUhEUgAAAE8AAAAPCAMAAACSsmLYAAAB/lBMVEUAAAAMDAyKiorh4eH19fW5ubksLCyLi4vT09MHBwfAwMC/v79UVFRISEiSkpLr6+seHh4REREgICCsrKzIyMh2dnaxsbEXFxfDw8P8/Px3d3eZmZkCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf39+4uLjq6uqtra1sbGz5+fkrKyu3t7f7+/tLS0toaGj////o6OgSEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eUTExPz8/Pu7u6enp4QEBA1NTXExMTt7e0xMTHg4OBGRkZqamr29va9vb16enpEREQYGBg8PDynp6c2NjY4ODhVVVX9/f2AgIBDQ0PY2NjV1dUVFRXS0tJjY2NdXV2cnJwuLi5HR0eWlpYJCQne3t4GBgZlZWVeXl6IiIgkJCSPj48iIiI0NDTy8vJCQkIyMjJxcXGCgoKvr68BAQHa2tpiYmJ/f390dHRQUFDW1taurq4ICAhpaWmMjIwfHx+NjY2rq6t+fn5BQUH6+voWFhZKSkr+/v6mpqZzc3OHh4dkZGS0tLTNzc3s7Ow7OzsZGRkUFBQwMDBNTU18fHzb29uXl5cbGxtnZ2fx8fF7e3tra2uoqKhFRUVmZma7u7soKCjn5+cEBAR5eXnQ0NAtLS1aWlrOzs739/fPz8+Dg4OJiYl9fX3i4uK2trbX19fw8PAs5zA3AAACGElEQVQ4jWNgYGBkYmZhZWPACdg5cMthAZxc3Dy8fPwCOBUICuHRLSyCLiIqJi4hKSUlTZIjcJsnIysnr6CopKzCwCCvyqTGoi4OEtXQ1NJm0dFlYNDT19c3AIkYGhmDKBNTIGFmbmEpbQVkyOqDAUhCQMHaxtaOgcHegdOR0UmYwZmTQV5fzMXVzR1snr6lhyePFwODl7e3PNg8Bh+QS3z1/RgY/AMCgxSDVYFce2/uEG9vbyArVDaMJ9xAm4EhIjJKgiE6hiEslkE+Lp6BIUHfCWxeItwHSRDzPPWTGRhSQoCs1DRgqEfoWyH7lz0daHmGfiZDVrZLDkNEYG4e0L/mQAlB/XywebHo5uWqFDDIWBaCmEUi1kBfCiGbV1xSWloa6+bKUFbuZ1KhWplYBTWPQdMDbF4punkM1XkMNbV1QEZ9Q6OufROqeY6QkGxm8OSON6ltcbPQgrsvHId5AgG+pjkgRmsbyI2o5sVVpYGAHENpe4dyJ0NnF1BMPk+GgSFcvxuHeQyqMY49IFqbG0j0QsyT7oPI9TszAskJQDxx0mTPoikgMXn9qdOmW8xgQDYPFL+O3t4zQWx/o1mzQXRZw5xo9gB9LRA7Qr+gRhHomFC1uRHT2GvnAYXmL1g4aw7YvEWL293UQ1HM04OEizCIHc+/BBIzS5e5LZ/vrAtmVzpqrgCZkqy+0poriAEZQOKDemAwmgcA5RhzXag+Yk8AAAAASUVORK5CYII=;3.end,1.1;4.move,1.4,1.3,1.2,3.606,1.0;4.sync,10.6492305937;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.11,1.1,3.706,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.44,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.2,2.22;4.blob,1.1,3976.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;3.end,1.1;4.move,1.4,1.3,1.2,3.604,1.0;4.sync,10.6492306015;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,1.2,2.22,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.41,3.668,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.44,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.30,2.41,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.2,1.2;4.blob,1.1,548.iVBORw0KGgoAAAANSUhEUgAAADcAAAA3CAMAAACfBSJ0AAAAsVBMVEUAAABhYWHZ2dlCQkIbGxujo6Px8fEUFBQJCQn5+flqamrY2NiYmJgODg7Q0NALCwvs7Ozv7+8QEBDOzs6mpqYHBwfX19fb29uysrLHx8dNTU3+/v4SEhJ6enr////6+vqLi4s1NTW1tbXIyMjPz8+lpaWMjIwICAjU1NShoaGQkJAEBAQFBQWEhISsrKwMDAyGhoYsLCwPDw/z8/Nubm5nZ2f7+/tpaWlUVFQBAQETExPU1G8VAAAApUlEQVRIie2Wtw7CQBAFF4wN2NgmpwOTo4km8/8fRnMngWSk3S2g2ammeNM/ACSZrIWdfpCznTwrLBRdVgdeyZjvU7rA1hKWK1VCV6traTRbIaFrdwjjN7rK7bHCfhRwMmswHHG68YRTAUxnxubRgtAtV8bWKsZnG2drdOfhs/1BHbUmpzO+u1xvRuP7A98lT/xWEAThH8hP+Ib8hHTkJ6Tx45/wAnpYD1sJtXvqAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.601,1.0;4.sync,10.6492306079;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.42,1.2,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.40,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.82,2.22;4.blob,1.1,1356.iVBORw0KGgoAAAANSUhEUgAAAHMAAAAPCAMAAADgfQBuAAABy1BMVEUAAACLi4vT09OsrKzIyMgREREgICAODg5sbGz5+fkrKyu3t7f19fX7+/tLS0seHh6qqqrz8/Pu7u6enp4QEBDk5OT///+YmJjc3Nw0NDRAQECkpKSxsbFPT0/W1tbFxcUxMTEtLS20tLTt7e3q6uqtra0mJiZoaGjo6OgLCwvs7Ozv7+/l5eV6enpERERUVFQYGBgVFRXS0tJjY2M1NTU8PDy/v7/V1dXp6enGxsZRUVHU1NTf398HBwcUFBS6urpMTExVVVXQ0NDi4uIPDw8oKChJSUnx8fEKCgrX19fb29teXl7y8vJCQkIyMjINDQ1FRUU9PT1ISEgqKiolJSWIiIipqakJCQmurq4ICAj29vZqamoiIiJSUlLr6+u9vb1NTU1XV1eHh4ckJCShoaH6+vo5OTmUlJTe3t6rq6scHBzh4eEDAwP39/cnJyfKysoGBgaXl5fg4OAMDAwbGxuZmZn4+PhQUFB3d3fR0dFhYWEBAQFdXV1/f39BQUFcXFz8/PxpaWkvLy+wsLBKSkqvr6/09PRzc3MdHR2MjIzw8PDAwMBDQ0ONjY3Y2NjOzs43Nze5ubm7u7s6Ojp8fHyQkJD+/v4EBARubm6SNOUXAAAB6ElEQVQ4jWNgoDpgZCJLGzMLBXaystHfTvyAnZ2BgYOTi5uHlw/I4xcQFBIWATJExcAAyBKXABKSYlIMSOqkZWTleOQVUE1SVFJWUVUDMtSBGjUg7oaYIolsMgODppa2CAOHmI6unr4BA4OhqJG+sQY3UNzE1Mzc1NQUzU6YOmkLSyt9axtbZCvttOwdHJ2cXRgYDExNpSF2ugKNcHO39kA2mYHB1tNLE2iWN0Qfow/QQF8xP7AboWGLYidUnbSFPwNDgFggsp1BYsEMDCFKJmBOqAZcPEzQFc1kMOAQC4cw5CIiIyPDo6Jx2glVJ+0EJGLEYpHtNIyLT2CHcRB2coglopsMFY+EMJQh4Z+E085IJDvZxPSR7WRITtFOtU9Ds1OSMx3DZFQ7MzIlQSAL2c70bCLtZGDISZPJzUOxk9UmvwDDZFQ7C4uKgWQJmF3qBRHTLQMmgXLCdlZU5gATklgVsp3VMkJsmCaj2mmo4lQTwJiqCGLXiNXW1dsxMAQ3pOg1ahC2sym3ma+ltS0Zkm6VTU2BSaddLAmYck07UE1m6ASaAzeLIVm1S7C7B+LGXmVOT5Ca2L6y/kQiwnbCRC3tSZMZIPkTCJgZGLohrCmoJjNMnTadgd6AuY/uVroIzqC7ndP1qxkABxNmYSg8dOwAAAAASUVORK5CYII=;3.end,1.1;4.move,1.4,1.3,1.2,3.599,1.0;4.sync,10.6492306179;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,3.111,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.82,1.1;4.blob,1.1,2492.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,2.20;4.blob,1.1,3804.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;3.end,1.1;4.move,1.4,1.3,1.2,3.596,1.0;4.sync,10.6492306403;4.copy,1.1,1.0,1.0,3.960,3.494,2.14,1.1,1.0,3.171;4.rect,1.1,2.82,1.1,3.297,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.25,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.20,3.326,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,2.50,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.44,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,2.50,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.154,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.116,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.5;4.blob,1.1,4576.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.77;4.blob,1.1,2716.iVBORw0KGgoAAAANSUhEUgAAAVsAAAASCAMAAADCMY3PAAACo1BMVEUAAAABAQEkJCQYGBgLCwszMzPDw8P39/f29vajo6N1dXXFxcVUVFTPz88PDw8WFha2trawsLCkpKTQ0NCLi4vT09MwMDCxsbHs7Ozx8fGpqakiIiISEhLr6+vExMRJSUlAQEBLS0tERETu7u4hISGioqKvr6+ysrLa2to5OTmsrKzIyMgREREgICAtLS3z8/O6urpOTk5XV1fMzMzq6uocHBxYWFj///8DAwNwcHAVFRX19fX+/v6hoaHp6ekGBgYTExPy8vKcnJx5eXn6+vpSUlIMDAy9vb1CQkIvLy/k5ORISEhoaGjo6Oi0tLTt7e2tra0mJibS0tL5+flgYGA8PDweHh6qqqqenp4QEBDf399dXV1eXl40NDSYmJjc3NxPT0/W1tYxMTEoKCg3NzfBwcGTk5Orq6sXFxdMTEw1NTW/v7/V1dXGxsbh4eEICAgUFBRVVVXi4uL4+PjAwMDm5uZjY2O3t7ePj48NDQ3U1NQKCgoFBQUCAgKampoODg5RUVEHBwfKyspZWVnX19fR0dEnJye4uLhiYmK1tbV2dnZWVlYlJSXn5+dBQUGIiIgqKiqVlZVNTU0yMjJ8fHz09PQ4ODhFRUU9PT2Ghobw8PAEBARHR0d/f3/7+/saGhrJycmlpaWurq4JCQlqamrl5eWbm5tsbGzCwsIfHx+EhISMjIydnZ3v7++QkJCHh4d3d3dzc3OUlJSWlpagoKAuLi4+Pj54eHje3t4/Pz/Ly8uNjY2Ojo6ZmZnb29thYWGXl5fg4OAbGxvd3d3Y2Ni7u7t6enpQUFAdHR1lZWVxcXFcXFxKSkpfX1/8/PxpaWnHx8cpKSksLCy5ubk6OjpDQ0POzs5+fn5vb28rKyt9fX1ubm6FhYXNzc3j4+O8vLwZGRlqm+nOAAAFC0lEQVRYhWNgGLyAcaAdQAAwgUlmlgF2BhmAlY2dg3OgHYEPcHGDKR5ePmyy/AKCSDwhYSSOiCi5VoqJS0hKSVNqCoOMrJy8giJJWiiwDQ6Id72SsgqEoaqGTVpdQxNIamlDeChhq6NLoqNgpujpGxgaGZuYkmcKApiZE6cXZi9ltpHuegsNSyjLyloeU5rZxgjZXJSwJdt1tnb2DAwOjk6UmAUCzi6k2UsZIN31rtZuMKaTO6a0h7knA4OXORgwgMLWW9RamxXI8gEK+ELU6Pn5mwQEoupTCgoOCjEPBbLCwvWVIyIZkE0RjwIpiY5BNkULIhuLrAM/EIboANoRFw/kxporAN0nnpBozZ0Ekk7205dUZUaxF8nNKansdmkgnyPpoLrr0xHFqbd5BoYHMs2TGRiyQrNzQkNBVgkp57ry5OTlAxN0aKgQxNwCCYPMQuEilNJaurhEPqQU5DorryCeMt9yBmRTYswrKiHqEKYkA6XkJauqkXUgQE0+GNQii4mF1gUDNdWjhK1dbgNPVVQjMGHJNhk2t7Q2ItuLsK2No927Q7mTAVkH9V1v0gU3st68GyNsE8x7wPECKxN6dRgYFMz7wJx+X2iUTGBg6PHLQtY2UQJozSSQ60QcmUGpfzKyKQxTXKZyToOyoaaAgJQ+MCJRdMCAECRd8KA6bkoxhEYOW6C3p5vPYGCYOQsY2W3mCSj2wm0L15jNwDAH5A+EDqq73sHcFWGm71wGdGA5jwXZXHB5Ox8aB1BzrWTdJ9WjaVuwEEhMA7kucREwvS3mWILqRyaRpebLLNBct9wcXLYj64ABlVgw0EG1BUvYgtwnDfLTinCQzEo3VHthtk1dBSJlVyProLrr28w9EGa2TEQLosbQojUMyOaCXcJsboZiLpPtWhcDTRSNRetgrvOHpLj1aH5kmL3BfCOq62KDN4FpZB0wgK1MwBm2uqD0Hb8ZoQ4jbBebLwdRrVuQdVDd9VvNtyF0iK5BdTvDdnPufBTXYQ1bYGNDU5y9DVnjAiGY63akg1OcKZIpNat2gqhdbCim6EQ12YMZyDpgAH+ZsCmPASNsIemWAcX1CNusIel2N/awpZLrTc2RGl47+lHdzmBaJrsHzNi7D+pHLGG7oRWYPQrM94M59ZDSIU12MageBLruwEFQtjyEYsphNmACZDxyFNkURnFlaFMRWQcM4C8TjhUDy8fjqGE7cy3QJSfWTkK2F2FbAKS8VcIetlRyvb3LSbiRFsHLGdDBqXngwIo2n9t3ugA5bEF1pH9oKLD49mQXVDyjNhXcc2aRWAtufqiwu3uf9QLXtCbC0dNFXPSQTVGap56QqebigWzKRvP1wLo29ASqDvwAFrYTztkqnfdFDdsCkwuZ3UHC+cj2Imy7yF4+56x/OwP2sKWW63MRZewlc7RmHgOotgTndcbd/sEteshh6wPJpVpAfsplibVHr4CVN7bsgwxLXBUNDuoyB9WmTAGz9EuuMiCbwpDSKbvWAFQ1I0wpgbCmoOogLmwZXI8UXzNCDVuGMIGpvcusUOxFcvMVOXbZA/U4wpZarr+OyC83StHqCiA4Y36TCE9iApCzfWww28tDA1DJ9fNdrsCYxrcwpT3NDckxdYbvbY8bynvJd9aAAqq5fnc2dAz0+FL0VioQMGpcCCPH1A7e4sN38ilx10ACarme5e4dMH2xdDo26dh79ym3Y8SCgmNgygPHQGjNAwCJs/sCNi0E9gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,3.115;4.blob,1.1,3540.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;3.end,1.1;4.move,1.4,1.3,1.2,3.589,1.0;4.sync,10.6492306496;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,3.190,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.44,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,2.44,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.44,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.44,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.3;4.blob,1.1,6432.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;3.end,1.1;4.move,1.4,1.3,1.2,3.587,1.0;4.sync,10.6492306516;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.51,1.3,3.708,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.20,3.678,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.42,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,2.42,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,2.42,2.26,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,2.22;4.blob,1.1,3780.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;3.end,1.1;4.move,1.4,1.3,1.2,3.584,1.0;4.sync,10.6492306534;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.42,2.22,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,2.39,3.469,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.42,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.44,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.0;4.blob,1.1,3204.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;3.end,1.1;4.move,1.4,1.3,1.2,3.582,1.0;4.sync,10.6492306548;4.copy,1.1,1.0,1.0,3.960,3.551,2.14,1.1,1.0,3.114;4.rect,1.1,2.70,1.0,3.158,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.44,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.41,3.108,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.43,2.26,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.79,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.81,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.101,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.101,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,2.98,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.98,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.98,2.87,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.98,2.88,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.98,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,2.96,2.19,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,2.98,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,2.98,3.119,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.3;4.blob,1.1,2048.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.60;4.blob,1.1,3668.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;3.end,1.1;4.move,1.4,1.3,1.2,3.577,1.0;4.sync,10.6492306604;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.41,2.23,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,1.3,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.25,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.25,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.22,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,2.25,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,2.22,2.37,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.1;4.blob,1.1,2772.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.22;4.blob,1.1,2360.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;3.end,1.1;4.move,1.4,1.3,1.2,3.575,1.0;4.sync,10.6492306662;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.70,1.3,2.10,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,1.1,1.8,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,1.4,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,1.3,3.206,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.24,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.40,3.108,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.40,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.3;4.blob,1.1,1936.iVBORw0KGgoAAAANSUhEUgAAAOUAAAAPCAMAAAAsyPjAAAACN1BMVEUAAACLi4vT09OkpKTQ0NAREREgICCsrKzIyMgODg4SEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7f19fX7+/tLS0toaGj////o6OixsbFPT0/W1tbFxcUxMTEtLS20tLTt7e3q6uqtra0mJibk5OSYmJg0NDRAQEAoKCjz8/Px8fGioqIYGBg3NzfBwcH39/fp6emTk5MMDAxISEgzMzMLCwvs7Ozv7+8QEBCnp6c2NjY4ODhVVVX9/f2AgIBDQ0NcXFzY2Ni4uLh6enpERERUVFQ8PDzGxsZRUVHU1NTf398HBwcUFBS6urpMTEzi4uIPDw81NTW/v7/V1dXr6+vKyspOTk5ZWVnX19fR0dEnJyf29vZiYmLu7u61tbUFBQUICAgCAgJSUlLh4eHb29skJCSPj48iIiJdXV1eXl6IiIgNDQ1FRUU9PT0qKiolJSWGhobw8PCqqqra2toEBARHR0dBQUHn5+cBAQF/f390dHRQUFAJCQkVFRW9vb1NTU3CwsIfHx+EhISMjIwhISEaGhpWVlZ+fn76+voWFhZKSkr+/v6mpqZzc3OhoaE5OTmWlpagoKBYWFgeHh6vr6/Nzc0DAwOUlJSNjY18fHx3d3dhYWEKCgodHR1paWl5eXkvLy+wsLD8/PzHx8fS0tIpKSlfX18GBgaJiYl9fX22trZaWlrg4OC5ubm7u7s6OjrOzs5XV1ebm5vExMSXl5eQkJBubm70VsRhAAADLklEQVRIidWV51cTQRTFHySUiKChxzCASgIqRYNBEKIICiEJSi9RKaKhCTZUCE1AVBQRFFAQsWFvWLD/ce5syM5MXAI5cuB4P8zM7r7323t3ZxMAF+Tm7kr1ivAk0uXlcfLwdHLRy3tpEKrOKW9pFCblP/Bcve9y1S2NwqQUk0yGxzU+a/Hk68cN69bL/QMC8WFQcEioYoOSLg9DCIXbyBGRGxWbNuNllEodHbOFW2xFvJjebb7cUSyK48Z4VcL2HRqmjvAgcac2aVcyS3YqQpFIU9wV3rtZnuAKIDVNtwfPe/FTSUf7ADIy9x/IytbzTpF/jsGoockak0kynzIp96DxUF4+QEFaYVGGtLgEoNRUVm4ymZhekjLQfPjI0YrKfLqO8Kqq9SnHao4zZKITFl619DlCkdTk1hnL6y00j7gCyK9oSMWzATUCnCznVk2x3NlmFMg7PSXyCE/bU54BOIvOAaSgFoDzqlJ8VtiJQi9JeeEid8sqFMnUCbzWNitAO+qgyUQS23szslaEHdvpARCHewmPdmVXV1431Ppfwsse7wSO58k77XWSEn8LTagOoM98uV/mcF/SS1JeacXHV5PFU8qv4dE8QJOJrsfy8lggJe64gQZpHu1K0M026Bi6xS2GR24rS+/Mp7QsktKTf7qNo7qhwjHHlBbHlL7jf/sTeL0oCE+VdxmyILEd65BSg+7R/mhXgiYy0/0m8UJ1nxt6XEoJMDUWoa0ST/mgHph3uUBKUNje5bR4ykV2rFhKyhWRflzdj+fQMm546ErKR5VT3MeOHuOzAQ2OKXN8nuCnhr9LHbeDnur6mTqBF2P7Lg3iKcV3rJ0ilpJ2RZTh02nF88zIs3a3TBQinhL/hqlNpnjay3PtC+XwpLwRX29G3R1ZBXRvy8tRw0w4TlkQ/apo8LXUQtcR3httaPtbtR7EU4rLTiEpCY92BQN2N+/M7/m560Nx9ezHT0rxlGG2nePFeEn8nKb7MmfrnlYHV0QxvXXZPl+/8f+XE7Pyzu99TB3hwdwPrfmnzKWUdgpJSfEoV/BrxLo47b+XV/ZqO1gBlST8Xm0LKyCrsYsb/wDsmdzGo3jQPwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.41;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.572,1.0;4.sync,10.6492306738;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.40,1.6,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,1.6,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,1.3,3.116,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.3;4.blob,1.1,4440.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.61,2.41;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAgAAAANCAMAAACjHN8KAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQklEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovKwemAEi+AdWfGTt0AAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.570,1.0;4.sync,10.6492306754;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.70,1.3,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.41,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,2.22,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,1.3;4.blob,1.1,3952.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;3.end,1.1;4.move,1.4,1.3,1.2,3.568,1.0;4.sync,10.6492306832;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.42,1.3,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.43,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.3;4.blob,1.1,4456.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;3.end,1.1;4.move,1.4,1.3,1.2,3.565,1.0;4.sync,10.6492306911;4.size,2.-1,2.11,2.16;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,232.iVBORw0KGgoAAAANSUhEUgAAAAsAAAAQCAYAAADAvYV+AAAABmJLR0QA/wD/AP+gvaeTAAAAYklEQVQokY2RQQ4AIQgDW+L/v9y9qCEsIJ4QZggoJAnDYwAwFQwASI4EO8FEMH95CRYTnfCDOyGFK6GEM6GFo7AqKI4sSSsCJH1X+roFkKdjueABX/On77lz2uGtr6pj9okfTeJQAYVaxnMAAAAASUVORK5CYII=;3.end,1.1;6.cursor,1.0,1.0,2.-1,1.0,1.0,2.11,2.16;4.sync,10.6492307597;4.sync,10.6492307608;4.sync,10.6492307618;4.sync,10.6492307675;4.sync,10.6492307688;4.sync,10.6492307699;4.sync,10.6492307709;4.sync,10.6492307719;4.sync,10.6492307729;4.sync,10.6492307740;4.sync,10.6492307801;4.sync,10.6492307870;4.sync,10.6492308175;4.copy,1.1,1.0,1.0,3.960,3.627,2.14,1.1,1.0,2.38;4.rect,1.1,1.0,2.22,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,1.3,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,2.25,2.38,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,2.22,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.23,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,2.20,3.197,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,1.0;4.blob,1.1,4740.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;3.end,1.1;4.sync,10.6492308192;4.move,1.4,1.3,1.2,3.561,1.0;4.sync,10.6492308357;4.copy,1.1,1.0,1.0,3.960,3.570,2.14,1.1,1.0,2.95;4.rect,1.1,1.0,2.60,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,2.41,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,1.0,3.139,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,2.22,3.487,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,2.63,2.38,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,2.60,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.60,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,2.63,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.63,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,2.58,3.357,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,1.2;4.blob,1.1,3556.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,2.58;4.blob,1.1,2928.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,2.81;4.blob,1.1,336.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAclBMVEUAAACkpKSvr6+VlZWfn59VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU18fHzx8fH09PTX19fT09Ps7Oz6+vqHh4cDAwNDQ0P39/dMTEwLCwuioqK0tLTLy8uKiopnZ2cmJiY9PT3+/v5WVlaCgoKenp5RUVEs0VdGAAAAQ0lEQVQImWNgYGBgZGKAAGYWEMnKxs7BycXNw8DLxy8gKCQswsAgKibOLyEJkpSSlpEF0XLC8gqKEkCGkjIDg4oqAwBJVAL65DLqnQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492308375;4.move,1.4,1.3,1.2,3.549,1.0;4.sync,10.6492308385;4.copy,1.1,1.0,1.0,3.960,3.380,2.14,1.1,1.0,3.285;4.rect,1.1,2.11,1.3,2.38,3.124;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,1.3,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,1.6,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.158,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.153,2.47,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.44,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,2.63,1.9,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.63,1.8,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.63,1.8,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,2.63,1.9,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.158,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.118,1.8,3.106;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.117,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.158,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.158,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.44,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.40,3.137,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,2.60,2.19,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,2.60,2.19,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,2.61,2.38,3.163;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,2.60,2.79,3.167;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.117,2.28,3.109;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.118,2.39,3.106;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.120,2.59,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.153,2.39,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.155,2.25,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.60,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,2.63,2.39,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.101,2.98,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.101,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.158,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.117,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.118,2.38,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.136,2.39,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.155,1.8,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.155,2.28,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.155,3.158,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.158,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.155,2.48,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.250,2.10,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.250,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.251,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.269,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.269,2.59,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.268,2.76,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.271,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.270,2.18,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.269,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.269,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.269,2.29,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.269,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.272,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.269,2.97,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.50,1.1;4.blob,1.1,5604.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.40;4.blob,1.1,4372.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.173;4.blob,1.1,5120.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;3.end,1.1;4.move,1.4,1.3,1.2,3.542,1.0;4.sync,10.6492308415;4.copy,1.1,1.0,1.0,3.960,3.513,2.14,1.1,1.0,3.152;4.rect,1.1,3.101,1.6,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,1.4,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,1.6,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,1.6,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,1.6,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,1.6,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,1.3,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,1.6,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.25,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,2.22,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,2.22,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,2.22,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,2.22,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.41,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.41,2.36,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.79,2.49,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.78,2.76,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.140,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.117,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.136,2.36,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.136,3.128,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,1.1;4.blob,1.1,3384.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,2.20;4.blob,1.1,2756.iVBORw0KGgoAAAANSUhEUgAAAbYAAAASCAMAAAAALQsOAAACi1BMVEUAAAABAQEzMzPDw8P39/f29vajo6OkpKTQ0NCLi4vT09MSEhLr6+vExMRJSUlAQEBLS0soKCixsbHu7u7w8PAaGhpoaGj////o6OisrKzIyMgREREgICBYWFgfHx/q6uq/v79RUVFaWlrW1tbc3NwMDAwYGBg8PDx5eXn6+vqgoKDb29sICAiIiIjk5ORISEj19fUeHh6qqqrz8/Oenp4QEBC4uLiKioqtra0XFxdsbGz5+fkrKyu3t7f7+/v4+PhtbW2ampo3NzfBwcHp6emTk5OYmJg0NDQtLS20tLTt7e0mJiZbW1vMzMz09PTl5eWZmZkTExNERESDg4PJyclgYGDj4+NBQUFPT0/FxcUxMTEEBATy8vJ7e3tZWVnx8fGioqI1NTXV1dXGxsZSUlJUVFTh4eEVFRXS0tJjY2NGRkZqamq9vb16enqnp6c2NjY4ODgnJydiYmK1tbUUFBTs7Oy6urpMTExVVVXi4uIPDw8wMDAODg79/f2AgIBDQ0NcXFzY2NiNjY38/PxHR0fCwsLU1NTf398HBwfKyspOTk7X19fR0dHn5+dCQkIyMjLe3t4GBgZlZWVeXl4kJCSPj4/a2toqKiolJSV8fHwiIiJdXV0cHByBgYF+fn4NDQ1FRUU9PT0FBQWGhoZWVlaurq4JCQl/f38CAgJ0dHSEhISMjIxNTU1QUFDg4OCHh4cWFhahoaHv7+85OTlKSkr+/v6mpqZzc3OWlparq6uvr6+UlJQDAwPNzc2Xl5cbGxsKCgp3d3dhYWGVlZWwsLC2trYdHR2oqKhmZma7u7spKSlfX19paWkvLy9XV1fHx8cLCwvAwMDPz8+JiYk6OjrOzs65ubl9fX2bm5tUSypoAAAFQUlEQVRYhe2X/19TVRjHH2xzQ6YgoAcBBQEZyAKEIhIJMQyYOWRWqJgFMpCECAXFBL8ABgWYFmEKGqWiFZDOL5mRfZPKMrOyL39O99xt9zmHHV7eAb6M12vPD/ee1znPzvP+fJ57zzaA/0f4PGwAb3geMx7RaGc+bIhpGjr9FG3kO8vDD/gZZs/xD3iQ1e6jbW5gUPDMeRMEcMV8QkjIJPeQQ51/C0Id9ylrW1i4hx9YSDz9hNpq6rQtiohcHBUds2TiEDRijUbdlLRNnX9T3jaPIy7+Qe2sTtvSBJPUu/i4SZd7dErapiYSiRxApSXNSg6dQSeXpaQGPfY4l6dLeyIiOf1JOlyesSIz+akAJs8vayVdiMnmjopVT2tyVtNH+JkY6ZJL/KVrXr45In0Nt7PeQWDkdn52raVgXSGAlaxPfe55wwtFYiqspgvcEJ28cdNEtBVvflGWtYUjdRFIR2h+6ksvx8I4VIpKwLYJSBnluIpzykjkn0BbiTGy1GiknumCtpbZSsulB68icZutMiSTbxsJfGW7tkrWRwqqrbZYNu9V+lTXkNfYo6JWm5a0I2gn17a6+l27G/R7Xmd33mvMzpAIGtmdG5r27T9wMI0a1BzVom8NPSSmwmq6nK2LbW+0tU9A2xoyxzVEUoUACg1vvrWlo7NdTIUqsW0iUlSOqziHI5F/Im14kHSFAfgT6Qny3Sw5d5i8zbXtyFGAd8gm2dx3HXOYZyXdAO+VcvApPcUArXQ/NCOJHAN4P7+EA4DjWc6BsvOJXID2XlIobdwH5SfhVLmYCqvpcj4A6Ccf8ouqtNXQN73dZPqIJVUI4HSw5GYt2SCmQpXIIiJF5biKc5wvbv4JtXHn/zxyBiD6rMlkGtBu59q2VrqEkR2yuQOOOczzaTsH5ws+5oy0fEKvhk9ZMyoMVYONMDaYtjl3hqHQVOm0CJcNGt4HxxPFVFhNpj9ByvhFVdrktrUQks8dki4COJRCkxYtEVOhSmQRkaJyXMU5zhc3/4TaOGmxZCGA2fGd8BmbJbcNMqplc02OOSbvVA8UxV9gyw6Q5fTWuZQzo/uiPX7XpTHOM21z7nz5ytWAks95g0RUwLctnNj4RVXausmQ9Ncxt4prm0IAMddciQIqRiWyCEkV5cwqusH64uafUJu7tCNf5NLoY7Ocb1slay6Tt6ypJvs6b2Sy42lpBviy3GWGFCOXAjW1vLnubcv/SroM8W0TUYHHbRPsMmKXDT67kyVVCJxv23hUqBJZxiF1KudW0Q0cufkn1LYuYay0G8P0RPiay9L1nAeoJHtZc9m8tGvmQd7IdMfZbAWozvqGypXM+LZzRPr+Jd/xetzblhlJp3mDRFRwn7ap0/Z9iJ90vTnKkioEcNouHV8/2AfFVKgSWUQ1UDmu4hzni5t/nLZG52HaS84VHahjpVVE6Hv7fePz2LI68mP/T5ZbnLlsXkNWVzG9019CZqNxLsDPmszWX8z0t9ixlovW2yHUjF81NwMuX7d08+a6t+32lbhW3yaygjVIRIXVxG1Tp+1CW+cd60n6vw1JFQKoi/ht95ltepOYClUii6gGKsdVnMORyD9W2916u+OfhU+zOaMjj5UG3enBqb/v5wzQ/bG+XptewZnL5h01/Cnf5ztO7gXS8N5sjeGG/GyUHcz66458SK76u95+6x7vraBtPv/s0Y5GDQewBomosJq4beq0Qd9Vg2WjjSNVCKQvgFFL178V41EpKhnlohqoHFdxThmJ/GO1tXck3AX14fhJ4o1pFt62Tcvwts0b3phk/AdrkUurhefZKAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,2.57;4.blob,1.1,4004.iVBORw0KGgoAAAANSUhEUgAAAiQAAAATCAMAAACXzeZ+AAAC31BMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NREREQWFha2trawsLDDw8M0NDQVFRUrKytHR0dhYWHZ2dlCQkIMDAyKiorh4eH19fW5ubksLCyysrLa2to5OTkoKCixsbHu7u7w8PCjo6MaGhpoaGjo6OgwMDDs7Ozx8fGpqakiIiKLi4vT09OUlJT+/v7i4uKdnZ0cHBw4ODiAgIB8fHykpKQ8PDy0tLQYGBgbGxsUFBQHBwfAwMC/v79UVFRISEiSkpLr6+seHh7IyMhXV1cfHx/q6upRUVFaWlrW1tbc3NwtLS3z8/O6urpOTk7MzMwREREgICDk5OQ9PT1fX18NDQ329vYdHR0mJib5+fmhoaEODg4JCQlqamp2dnYXFxf8/Px3d3eZmZkvLy+goKDb29v6+vp5eXmIiIjp6ekTExPy8vKcnJwjIyNxcXH09PT4+PiEhITY2NiYmJiqqqpcXFzBwcELCwvf398/Pz9dXV3Gxsa4uLitra2enp4QEBBMTEwEBAR7e3tZWVlAQEBbW1vl5eWioqKDg4PJyclgYGDj4+NBQUE3Nzf39/eTk5NeXl7t7e1PT0/FxcUxMTG3t7f7+/tLS0vR0dF1dXXS0tLQ0NA1NTXExMTg4ODV1dXHx8cqKipkZGRGRka9vb1jY2MlJSVJSUlVVVX9/f1DQ0PKysrX19eNjY3CwsInJydiYmK1tbWPj48PDw96enrm5ubOzs6mpqYuLi6WlpaOjo7e3t5lZWUyMjJwcHA2NjaGhoaBgYF+fn5FRUXd3d2VlZUKCgpNTU2CgoKvr68BAQGFhYWurq5QUFCMjIwkJCSbm5tSUlKlpaUSEhJpaWmrq6tWVlaHh4d4eHgzMzNKSkpzc3Pv7++QkJBvb2/Nzc3Ly8s7OzsZGRmXl5e7u7tnZ2dra2t/f3+oqKhmZmYpKSkhISHPz8/n5+d9fX06Ojqnp6dubm6+vr68vLzR8TrEAAAIlUlEQVRoge1a/V9VRRp/OCCDN+QqBUorgboRJAIh3ouJQFcBFUEL3ZsQJmjewrdLpqEoi9bmhi8oGsgCuVpQ6Wpqmm65u9qqsVJGL9a2xra7Vtu+2LYvf8DOzLnnPHPuzrl4kc9H2w/PD3PmzMz5Ps/zne+dOWcAYMAGTLUARQlUa0GKMujGxjJgN6kFExKi1gYTYulX6FtCh/Qr3oDdKAsOsw5Va8PCPSK59bYItSVy+Iio27/XZ+iR0XewS0zsqNFjvn99UcKdhJA48+67YuMT7h57LUCJ40y7kghJTrkn1d/QxpPxvSHLLI1wm+CvO2Y29Vl7X541MZ/RB6fr1Ykekdw7JmESu2ZMzszKvs8xhQ+b6rfbick57JKblzlt+oz8SL+fN4LZ7TZzkcwsKJyVMzvvWub3/gdMu5KK7HPmRuf/wM/QNJH4QJZZmtPO7EE/vXGbZ7cXl9jtD5n1X+tsCeN8Ri8RCZQWz2eXh2MXhJWVly/0x61gEWQRuzyyWKFKcT3q9/Pe9pi5SEoqggCWLF12fQ6S8mmxPHmFn49pIvHT0tx9eUq3ysd9dPZBJL7HSUQCK5+gxaCiVNuq1U9WrQEoUpc3gLWkmvWvo2uTbf3wvKiaBex2yqqCUT+s9UbeQGJouXHpU+wm5GmAJ9gkWMmPaPnMbPemhUtYR0x6QcKPJ4LQZiHPFtRtdmzZStu2PVlfsd2zCGkikXiLXcPK6h2G3pnpDXk18ww1YdPSkW2xO2dE7XoOPCKBoiQDCsaHsYQUD2uMatpNaxHNxeN+wkSCyIgHlpbils1mm4IgEsSTcSBn1yMSwZuepT5bArLAvZ4RjvPNi4lIWsfQou35jIbI54JhTwa02TN/SpdG2jh7Ly32kRfYvhj74nxnO70dWtSS1RHX6J3GTvISLeeRl7UGDPSV/WkHVq9cT2+XOH426+mDzRlCm4Ucml7WGj71VYDDzvXZR0YdVR/3iETmbQd5zbNJYO+k+MINr7SmHBNruGkhsq1i3bSswWsyPCI55jouomB8QiwhZNNxSxbleWzl5Jc3xzORIDLi8d7Xr0UkGp6MAxN2NZHo3jBLnC1ERu4xIxznmxcTkZw4SYvqZT8Pg/A3oKUUcGF6hlBtvemgO4jtFF3if8FuE5dOZJvLL73S+FVTFS1PM5IyFCVADHSslbZVE/qTOTOaZnWY7BTaLCQVRrwFvx4BsCp6I0A42SqKROptgss9ZryxN5vsA3gpvU2sIQoi2yqovs6SOVQk5xRlWGFCqoiC8QmxhJAdqtvzjrcBpnm2m8c0kWh45+Npb6e5SBSF0yLgyTgwYVcXieZNzFLfRnRk5B4zMmw3PngxEclItl6s+M2LF6A6rStahAsoWgZBjndYeLNpcT85AjDjXZptqXO+IYkMe8o97MpFUkZIumHJuzi1gK5w9F3p1VVsUG6k0MYI2pMGE4oA3JwJx3tiGlJv0J24ibwfKPYOdbR3qm92WEMURLa1stkhH/CvG0IWnzb4wPiEWEJIqQpWVwL4TqKJRMer+5D3momEr/X8kEDHk3Egz1cXie5NzFIQiQcZuRcYl4hExouJSDqT538El94bn5+7/tCOjw1w5VG1n7jYBy0XCRTTxblB3dt+a0jiU7JLYdduchHgd9Z2g0guJ5/c3fYZE0n+G9oDehsSVKoe4TQ/IqYh9UZtYzn5zNDbXdLjKuQf4VjTUARkTsYDJIuKZIvVOnmd0YcenxhLCFHUxhQmGZlIOF7K78GXSJxWastBxJNwYJavKBLuTcxSEIkHGblHxiUikfJiIhI4TlrBkhmU73rB6R5mgKt1f154koenriQdAKc+ZulajR+gqR2ON9k1sIen9y7d5pJGaIGm/4HWLuJKwkxvEwiKUnV9SEhD5i3g8bXs8scwr97AO2LrD3vVPCiILIgkn62vaw0+MD4hFp36OiYZU5HU2cCXSMR3EsWcAym7MpEIWf6vSJB7zEi2ksh4MRFJhCuxDZT4P1VdgSv8yAQWLtZGbT+1/zQPL3oQQAe5C+CLPWztutebhRVNfPU7H/cRLYeEUuVVvs0ooIE2ZtKmCUwkZ3rooAd7OoU2gaAadYe0iGkYvD2kLrDnwmgsXSu/FHvLm+nuM4ncKtYQBZGNIoETjQYfGJ8Qi079fRV0Nb9sJpLtjlL2jWcXI0WTiUTGgSxfkIhEzFKfLR0ZuceMxFn1xYuJSI5yhX2V8JTl4p/Vlmry9dbVXC/L9+9VwyN/OftXN50XGJrXWn020TXTi4VOwlV9y5rmHMtb7JxkX1mJ5VIcC/RS8qPhifsJXaMm5e3d8ElLqyK0CQT9rb4xfG4D+wpi798NdnuM0VtVfE8tu1qaRu7ccMEVIfYuqh+y+/IFd7dYQxRE9hJJDjvdQRSMD59A6nOd7dmrU7SvGxUZ8f5e3549t0gViRapb5HIOJDli4dp6A2zFGZLR0buMSMc55sXE5Fc/ZBfpp+o/8ZzCNZ1qKH4IA+0dmmOKpKrz8Y7a/iRfnfN6ILJB7w0Qn9hfKOC1JMO9y7u64OVlSdyWKBd/0hxhk7fw04GpoS6v3mfoehtAkHw7fP1ji/Yr+dOdWcONnrLOLi4ile2HXX0FM4xxrLt9vieL7811AQUHdlLJIH5/zSg6PHhE0g9bB3nGnxEOydRkQVyD4wrbnlYXWe0SIMUboFykUg5kOSLx/KCN8wXZwsj1bkXMtLH+ebFRCSDS7xnHG34lo38qr64+rBFZFYvI/7fjas7eYHYNFWdjs03JqC+WnCo/q8CuZpIAhJMz3zbvi7rUGu9iqQreu+Ufgjwu2tz4v4V8fmohYa2GP4Wal1yg0Lqo0n+VSDyTLLpn37/Hfepp9arSMC65T/XH9932Y5crTz3jtL7uJvexlr1fxWwWtWz7a+aLvUPdsCV/sEZsJvPjvHF8L+iynUBMYjWmAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.79;4.blob,1.1,2000.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.136;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABwAAAANCAMAAACNWf6YAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAh0lEQVQYlWNgAAFGJgbcgIkRtxwzCyuEwcYOE0KwODihDC5uBnQWDy8fiOIXEBQSFhEVQ2YxMIhLSIIoKWkJGVk5eQVkFgODohLEBGUVVQk1SVSWoKo61HwNTS1tNJaoji5ERE9e38BQDZVlBFXNYGzCwGBqhsIyN7TAHQKWVrjlGKxtcEoBABngDTZuVTtzAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.523,1.0;4.sync,10.6492308448;4.copy,1.1,1.0,1.0,3.960,3.209,2.14,1.1,1.0,3.456;4.rect,1.1,2.51,1.5,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,1.6,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,1.1,3.267,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.22,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.22,2.78,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.20,2.48,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.22,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.22,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,2.22,2.89,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,2.22,2.76,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.63,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.158,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.59,3.278,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,2.63,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.60,2.78,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,2.57,3.168,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.325,2.38,3.127;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.99,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.98,1.8,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.158,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.158,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.158,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.177,1.8,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.153,1.8,3.261;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.158,1.8,3.256;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.156,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.175,1.8,3.220;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.158,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.155,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.158,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.158,2.10,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.153,2.48,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.156,2.18,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.156,2.18,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.156,2.38,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.156,2.19,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.153,2.88,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.158,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.155,2.78,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.158,2.58,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.156,2.28,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.155,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.174,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.193,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.231,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.230,2.79,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.230,2.47,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.253,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.250,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.269,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.289,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.288,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.288,2.98,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.386,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.383,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.383,2.17,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.383,2.79,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.383,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.386,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.383,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.383,2.98,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.383,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.386,2.48,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.384,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.405,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.400,2.19,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.441,2.39,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,1.1;4.blob,1.1,2884.iVBORw0KGgoAAAANSUhEUgAAAfIAAAARCAMAAAAR6N56AAACnVBMVEUAAAABAQEzMzPDw8P39/f29vajo6OkpKTQ0NCLi4vT09MSEhLr6+vExMRJSUlAQEBLS0soKCixsbHu7u7w8PAaGhpoaGj////o6OisrKzIyMgREREgICBYWFgfHx/q6uq/v79RUVFaWlrW1tbc3NwMDAwYGBg8PDyvr695eXn6+vqgoKDb29sICAiIiIiVlZWfn5/k5ORISEj19fUeHh6qqqrz8/Oenp4QEBC4uLiKioqtra0XFxdsbGz5+fkrKyu3t7f7+/v4+PhtbW2ampo3NzfBwcHp6emTk5OYmJg0NDQtLS20tLTt7e0mJiZbW1vMzMz09PTl5eWZmZkTExNERESDg4PJyclgYGDj4+NBQUFPT0/FxcUxMTEEBATy8vJ7e3tZWVnx8fGioqJVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU01NTXV1dXGxsZSUlJUVFTh4eEVFRXS0tJjY2NGRkZqamq9vb16enqnp6c2NjY4ODgnJydiYmK1tbUUFBTs7Oy6urpMTEzi4uIwMDAODg79/f2AgIBDQ0NcXFzY2NiNjY38/PxHR0fCwsLU1NTf398HBwfKyspOTk7X19fR0dF8fHyHh4fn5+dCQkIyMjLe3t4GBgZlZWVeXl4kJCTa2toqKiolJSUiIiJdXV0cHByBgYF+fn4NDQ1FRUU9PT0FBQUDAwMLCwtWVlaurq5/f38CAgJ0dHSEhISMjIxQUFDg4ODLy8sWFhahoaHv7+85OTlKSkr+/v6mpqZzc3OWlpZnZ2erq6uUlJTNzc2CgoKXl5cbGxsKCgp3d3dhYWGwsLC2trYdHR2oqKhmZma7u7spKSlfX19paWkvLy9XV1fHx8fAwMDPz8+JiYk6OjrOzs65ubl9fX2bm5vfTZyyAAAFkUlEQVRoge2X+1sVRRjHX+zgcjkKAjoIKArIkSMnAxRDAokwilseBCs1TCWRALlIQqSCeEMBgwKitMC8hSFqhelRzG52kcoyu9jlb2nnXPadYYfHc1bMeuT9YXeemXdnPt/vuzu7C/D/D7d7DTAe/25MeEDnPvFeQ9yHIXmM0USeXi5e4K2fNNnH926udhttU/z8AyZO1QjgiGmEkMA7nMMaLvvnckwPsp3HrOTBIS5eMIO4eoWzqzmnbWborNlh4RFztEPQiDQYpDEpuZP+SXM1rzDmJXc5oox3a2bntM2LNsl1N0bd8XIPjknJnYz5D2m8MIZYA6gtsV5xQRNo54KF8f6LHubypITFoXGJj9BmUvKSlLhHfZk879TH6EBEGre9LX1cl/4EfXSejJAPGcRHPmZmZYcm5nAze9gIDNzMTy0z5y7PA8gnK+Kffkb/7EoxFa4m+a0Kj1v9nBZtBWuet8pay5E6CORtPyt+3fpIGIVKUQlYcgEpoxxHsU9pifwTaCt8YUPRxuIXS0BDlBpmlRkM1G/Jf1N5RVmlfMNXxWyuqA5M4fIk4vfSFvcaqzcktza/IpLNe5k+TXXkFXZ72+qeELvNfzuwRtY37Ggs9Ni5gZ15lyEtWSbYzc5cuGdv0779CdTc5rAWj9agA2IqXE1K3zS74tW2dg3acshkRxNJFQLI07/2+tqOznYxFaoEpeQiUlSOo9iHLZF/Am1d68wdXg3GN1T1dCqUza87GMCHyHeu5xrZ9TfJW2yWdPAQwNuE3mpJ5B1bH+blkx6AjWWc8IW9BQCtdD40MpYcBng3q5Qn6Eq1N5SZj2QAtB8lefLEx6DyOJyoFFPhalL6ewB95KQGbXV0h2k3md5nSRUCKAqQK7GVrBJToUpkEZGichzFPs4XlX8ibf1NOnPjKdAW3PtuKhkACD9tMpmK3bewWdIy+RBMtgEtTLGtD/Pc2s7A2dwPgEU2f0iP+o9YI6v0NSW7VQRMye0zw2BQvLzDhVjNPbcXumLEVLialf4IKdegzVryFkKyuI3dQQAHFtKkmXPEVKgSWUSkqBxHsY/zReWfUNv6rI8Xq5x0MjhbIskMgGzbO5DbNawlh+RaoIUx2fqYvBO9sNJ4nkUuJkn01DmPM7LngsW44+IIAqbk9pkvDV32Lf2EN1dEBXzJQ0iFBm09ZBBgQkYNV3KFACKuOBIFVIxKZBGSKsqZUXSD9UXln0jbp8ack0ONoC3Uthz8LIPGMTbL/pRXA1MYJm/Bnro0x0+DXXic7S5tBvhc3gDtJZd3pIt+uq08gbrkWV/Ih0G+5CIqcLnkgln6LdbinN7OkioE9qd8NCpUiSyjkNqVc6PoBrZU/om0DXwJsGg2aIvl0SNtuXqO7mJfcVlS71mAarILmMKweQlXsh2fj3bkRNu7KB+gNvVrapVs5Ded/fK3CvmWJ1CXPGUW7ebNFVHBbUrunLb5gd7y8dowS6oQQJFF3nK/s5SIqVAlsojWQOU4in2cLyr/OG271S9Gl+MoObNyXz1rS1Wox9E+T2MmmyWR7/t+MF+nTaUwbF5hancBPdMvzmyDYQrAj7qU1p+y6Tfv4ZYL+TcCqZE/6675Xppr7uEJ1CW/MRTV6rmHLGHNFVHhauKSO6ftfFvnzfzj9L8cSRUCqA/9pXFgs4dJTIUqkUW0BirHUezDlsg/VtupBsuIvz8N4dacndyRydoCPYkB8b82cVnSbysa3BOraFMpDJt3SP+79TzN9qaaLjdvTdLpr1rvyfL9qX/ctG7sS/9ssFy/NYJAXXK3v3a6D4ed82XNFVHhauKSO6cNjl3Wm1dXcKQKgfzSGjZ3/101GpWiklEuWgOV4yj2KS2Rf6y29o5ord/probt82087qMYL/l9F+Ml/y/FP7y8bD++uWIGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,2.22;4.blob,1.1,4360.iVBORw0KGgoAAAANSUhEUgAAAwoAAAAjCAMAAAADrQ1wAAAC31BMVEUAAAB3d3fU1NSkpKSvr68yMjL9/f0bGxuVlZWfn5+QkJC8vLxVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU0EBATp6eleXl58fHzx8fH09PTX19fT09Ps7Oz6+vqHh4dLS0sLCwsDAwNDQ0P39/dMTEypqamjo6OioqK0tLTLy8uKiopFRUVnZ2cmJiY9PT3+/v7k5OQCAgJWVlaCgoKenp5RUVHCwsIhISEsLCx9fX3Ozs7W1tZwcHABAQEkJCQYGBgzMzPDw8P29vZ1dXXFxcVUVFTPz88WFha2trawsLAoKCixsbHu7u7w8PAaGhpoaGj////o6OgwMDAiIiKLi4uUlJTi4uKdnZ0cHBw4ODiAgIASEhLr6+vExMRJSUlAQEBERESysrLa2to5OTkfHx/q6uq/v79aWlrc3NwMDAw8PDwtLS3z8/O6urpOTk5XV1fMzMwREREgICBfX18NDQ0dHR1YWFisrKzIyMgVFRX19fWgoKDb29sICAh5eXmIiIihoaEGBgYTExPy8vKcnJwjIyNSUlK9vb1CQkIvLy97e3tsbGxZWVmYmJg0NDRbW1vl5eWZmZmDg4PJyclgYGDj4+NBQUE3NzfBwcGTk5MeHh6qqqoQEBDf399dXV3t7e2tra1PT08xMTH5+fkrKyu3t7f7+/vR0dHS0tLQ0NCrq6u4uLgXFxdISEhcXFzY2NjKysoHBweNjY38/PxHR0cnJydiYmK1tbVjY2MUFBTGxsZ6enr4+PjAwMDm5uYFBQWampoODg41NTXV1dV2dnZGRkZqamolJSU2Njbh4eGBgYF+fn4qKird3d0KCgre3t5lZWV/f39QUFDg4OCEhISMjIyurq6bm5ulpaVKSkqmpqZzc3OWlpbv7+8uLi4+Pj54eHjNzc0/Pz+Ojo6Xl5e7u7thYWGSkpJpaWnHx8cpKSmoqKhmZmbn5+c6Ojq5ubmnp6dvb29ubm6FhYUZGRkk43eOAAAJoElEQVR4nO1c+19UxxUfXWOpVQwBxAU2ghAlWoXaqFEDRCJGHiaDAiLZmA2KkhVEY1OVuD4wESwp1eCj0SpYRCAWLb7iA6XaNIlJjInmUZPSNmlsk7S1TdI/oHfu3XvP3N2zC7sgl0+c7w+7w8ye7/meM3PuzN5dlhCP6Nff85iAwG2E/v2MViAgYBhMA7TmHQO/Z6AQAQFjEfB9rTnoBwbqEBAwEoOHBA69M+iuYPmPkNBhBssREDAKYcPN4RGRlrvlP0aYo4xVIyBgHKJHxphjo5T2PaMMlSIgYChGx907RmkFxow1VoqAgIH4oWXc+PhYuXlXwo8MFiMgYBwm/JiQ+ybKzUljDNYiINAnMDn+fqMlCAj0BUyZarQCAYE+gWkPGK1AQEBAQEBAQEBAQEBAQEDgNkOi0QJQJBktoBeRHGW0AgEJD06PSemDX+16aIbRCnoRqTMDse6HZ6VJj+kZmbNHPdJND49SSrM8D8/JiBx+z9yuEGVHeBzKoTQ+d16er9Lm0/mdMWPIpzLCfHXnGY9ZH1/wxAifTHpDsy1zcnf9+oWe9tFFvtEDsN4nCxYSsqhw8cQl04qe6p6OZLvd5LkUlhaXLCtdXtiVVbziaY9DOQn28SsLin7iozS1FLwwY8hPsTM846M3L/gp7ZqCVau1Zi9oji5QP0Py3S9n4Tu8+ugqs++a15QtcO9Mji+VHp9d65DqwbKua669YL3nUtgQupGQ8k3Pdc9BTpH08Hz8EB/N1FLwEflmf6y8YZ2la6/zf4H5o3lzmXoV9N1vt0qhR5j9UPBchXtfJd1CSMimn7F21QuE/JwttWr6hPT4i+XmrdvK2UB6XPHw0cmE67PRF4trtlt37JT6dv0yJvQlZyrVUti9pzjzvl/pPGXsZY/7hulGl8bVFtaN07W4Y5bGbMrYP61sxq+JsxRIQo6OBfSBlqr6Aw1lB9lRpLKxPuIhVgrADHzE1lTftJ3a8Yxxywr4sBwg8WJoVg4vdj7PnBYtjgTldZ1mo6c0v5ymGCB+cQtttsAC82E6NKawrO43HpSi84Exa3Fwq9P3XMFaI6SFuouKpemEjKPafgHOBg/MH3n4yCHpz3Lrb5e9EN7YyvXZ6NElx5qPr55EyImUQy0nM19RzJ2lsCahKfVUVoPO0zB6p/NYA6OnI0tiBzfnBvItOGYBsyn0zMTU/ntbnaUQaDnLs4A+TksV3XrWlirlam7buQXbI1kpADPwyaPnu1IKKh+WAyzedocM3ffc59h/Vy8dXi7oSkHTAnFctC/+vfQ60lk2ekpz4auKAeIXtYDZAgvMh4lm/OG1FOQKLAObD4wZ4oCs+Z4rYJZwgU5wk7Ofvk7IG2wptDoc7byzudVS3z4qlfnQ2ZL9Cbqf67PRPHLpTfLWJUL2FIQQcpzulOmcpZC9KZltOHfoXIVZzKPm60db6NuEvB53kW8BCzCbQqUqGkvHS6Vw2eE4UDI8j2cBfZyWKur8v+wA6zuETHQekNarqVf5AiKl0WDPpcBWczvh+bAcYPGalKtVqp4xrE155ktB1QJx6DZ9L9noIc3ldLNq7eYXteBnS7XAfJiuSIfid6mnDQyZD4wZ4oCs+Z4r3QojWe+5aXngYJSzFI5RGqfbgq6uLpamUnofMmkPe+Wip7g+Fu61fBKWQIj5fTZq/YCXMu1DaTaCUl7T+0rK3ko/iuZH11grgi/IY9ACFmA2NbNcswnLYctr7Rs6H6CP01JFgxSymg0E3iuoqdf4av4oj3oqBXk1pxGeD8sBFu/kahkr9IxIKWhauDwj04tlo4c0n6CVqjVaCm4W/GxpFogP03KpfwU9iSslyHygzFockDXfc6VbYSQ8wEVJqz13nvSURK8S8mB1ha4Ursd/POLiJ6wUiv6kvl7rg3CDaBUbaXyWl1KrXBHvdo08pB/9RDeatKHDUrKQ6FoqC8csB/Q0u8Lm7KiuPndG70PTx2upog6lM5cVBlYKMl/uIOKtFFLYan6e8HxIDtB4sQOSx1KQtUCekelFs9FDmv9M/+LRL27BzZZqgfmQS4HUn8WVEmQ+MGaIA7LmR674FUYi5rko+SudwZxEd8iT+KF0uMq5pDqL+1RqXYVdgUHr48ItUyrwKB/alZflKyJ/47T9/c/Y073TXUajF2bEnHBpOVmAmSuFIrbffabzAfo4LVr6alhheCyFGhPxVgr8udvhOQdIvJ0ckCDPoAXiwK50WDZ6SHMevFf0Vgr4vKkWmA/nrnAKV0qwUkCYIQ7Iml+5ghVGrqx3UZJ3yvo39hyQ9Zj0mDaLkLNt77CAJGcNi6WuMFYKQzukjeWZjmCujwu3TjmX2Xgpn19jO5fzl/UuKNvS5enSBTLxyA1+tF+jdF46Tf/Ot4AFmPWlQKY26HyAPk6Llr5/hEq763VPpfCSNYjdO7DzSgHYssJyoIvXCe8HJMgzaIE4CNm2VjPxkg0MfmjeaHlXNXHzi1rws6VaYD5MBdKcn6JzcKUEmQ+MGeKArPmeK90Ki66vctMy5CCb/of3Npba3mSfK7x9bIPtiyzm7Iv4dcezB9IDkn3hl7ETmpodXB8X7lcxDcdX1rI7TewdfK3dni6dywqb943NtixlHqIiO+T7b7aDT+6PHWCp5Ee3xKSNuD7AnMS3gAWYXUqhlN0BBhbQBxaQvkUpFS2Hc9U7SAoz8E2OqWhZmaCUgqoUgC0rLAd8vN6hlgLkGbRAHITso+/tPHy6s2xg8EfzGe3k7OYXtYDZAgvMh4n+c+y/zDdk5g9UMRqw+cCYIQ7Imu+54pnJ/chb+WAq7xh5H1vNM+Tcbj7SNrWUOUuckpsya8k1dld69yzzvz9aQ7g+Llxy8/EY6+esoB5VjgSrpGZS3ezicyNlD63ha6Pkxq5XrB0l8m0PGN31n8iOGzd1LY5FY3Ypheii/+pYNH1gAekjOyMs/U+qnysozNxiGhlR3/SqsmeoSjcqp/xofFmhOeDi9Q61FCDPnBaIgyQera0PX9pZNgDd0/yWdl1184tbwLxpFpgP08wXI1PqlIgGxYe45AKdD4SZm0sta37kimMmX593/zGX6+yyfztDruF43Qcuq5WUbjdIkV/onuZHLDd7Vo4TyttmBauO3BIX/mH5FPe+LXRZ7wvpQxif9U3l15nbdH3pyim/3CBJfqGbmo8uviVfHedKIbD4m1vhwT9c3er6rlBCYsGXu3tfSh/CyZltl791PcXedoj69NtbQcuVQkhq3/k/ja/Ooz/7WL1D/HC8ADnt+d7/dw+VHr4l3/6//wPT8gTgR885QQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,10.image/webp,2.39,2.75;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,3316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.62,3.153;4.blob,1.1,3524.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.248;4.blob,1.1,1976.iVBORw0KGgoAAAANSUhEUgAAANgAAAARCAMAAACIGZKjAAACNFBMVEUAAAABAQEzMzPDw8P39/f29vajo6OkpKTQ0NCLi4vT09OgoKDU1NQSEhLr6+vExMRJSUlAQEBLS0toaGj////o6OisrKzIyMgREREgICBYWFgYGBg8PDx5eXn6+vqIiIgODg7k5ORISEj19fUtLS20tLTt7e3q6uqtra0mJiYUFBTW1tbNzc0NDQ0eHh6qqqrz8/Pu7u6enp4QEBA/Pz9dXV3GxsZsbGz5+fkrKyu3t7f7+/tbW1vMzMz09PTl5eWZmZkTExNERESDg4PJyclgYGDj4+NBQUELCwvs7Ozv7+81NTW/v7/V1dVSUlJUVFTh4eEICAi6urpMTExVVVXi4uIPDw/b29sWFhYVFRXS0tJjY2PHx8cqKipkZGQwMDCampp6enr9/f2AgIBDQ0NcXFzY2Ni4uLiNjY1aWlr8/PxHR0fCwsIFBQUCAgIHBwfX19fn5+clJSUiIiLy8vJCQkIyMjIxMTGOjo58fHz4+PheXl40NDQcHByBgYF+fn4aGhpWVla9vb1NTU2urq4JCQlqamqcnJwGBgaFhYVQUFDg4OAhISEkJCShoaE5OTlxcXGHh4d3d3dKSkr+/v6mpqZzc3MDAwOxsbEnJyc3Nzfe3t6rq6tvb2/R0dFhYWGXl5cMDAwbGxuTk5M2NjZ/f38oKCgvLy+wsLCvr69FRUUjIyNpaWmMjIy5ubm7u7s6Ojrw8PDAwMBXV1d9fX22traQkJAEBASKiopubm6+vr54eHiLi7f4AAADT0lEQVRIic2VZ1cTQRSGbxBIAholDKEtMSEQkKLBGJpSlQ6GIEUELDQhWEBQBEFBxUJElC7YFXtvWP6cs7tkdxY35UA8h/fD5M7s3GfvOzM7Afgfkqxz3irltcHbx3cd8aQyoiP3czjPf6NzzibF5i0ByjUU4pIXiBAKcp2oCmZ/BcZCQh3Od2UsDDnOXY3+5YVTlHS1xpzIlbEItXscdyXK2+rUmEYDoEWMgDYW6acL9gLBVkdF62NitwmyaGNx8QmJONy+w5C00wiwC5noJ8n4/MpYHoW7Kalp6brd9CHak5GZlZ0DkIv2GvblKfILiFwXInh2CmmMr4/gFRYVG6GEKi2jKDpPmpS831xWbiG3Oq6o4kClrKp6hbHEjJqDOKrVHjLXBaXjKKMeNw3oMMAR6mgq5mloYyjrWK45HKCysam5pfU4bayt3SrrCD5B5vI6aWF0ihzjeRyFMMbXR/JOd9YUAnEUu0IAAlABmRiJGgDORJcIjVlKu7rpSN6Dqz6LzuHFRL0A5xUWerSvf3liCrrABt0D+GUmlIONDUL5RbhUTubykrK7YxbumZ3HUUTrE+EJvrEhNEwm1iouX9EI3wP+8SprLxPFX8XrO+JzDa+19jrcUNwUFIKNjSxHo8EGXHAoY8zWBH1aMpfXrQFGIeLGOIpofSI8gbFwFEYmwtjtYnXFuNAYsqI7TKRnV/guDid0xmH10EpjFjaYnJpWlswIjRG5nMSOIs/jKKL1ifCcGgOYHZ/zvicw1h/pq56no4X7zAoP4tCY+aBiWlgIbyw6ATejQmNELifnR5GjiNYnwsuucWxs4uEs/kLRI6ZDX6LAXB6F8Tb6vDy2PcHtU2b02ULjc0fG0kvpYaExMtcu50eRo4jWJ8IzocWCljjSGH0r6inqBcBL71fKydeZY/Q85hJljUGabg5HtTEy0xu5OooefdtYv6IQ3ti7qYgOeSNKI42Ruc5l53EU0foEvPfMmyVt+tTOKNJYIHskVLg//6Go+OMnZvbyJcr+QeehGdyOxX42fGlmnhp7vjo0JvlW5fO93aYkjZG57hnjKOL1kbwfU0tugN3Tz3zPsdYsVaunSCWL1jpPsdauasMvT6F+B/3xFMoDWjJL4C9EFwNj/MWAQAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.288;4.blob,1.1,3936.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.324;4.blob,1.1,3908.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.440;4.blob,1.1,520.iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAMAAADAkV+TAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAiElEQVQYlWNgAAFGJgbcgIkRtxwzCyuEwcYOE0KwODihDC5uBnQWDy8fiOIXEBQSFhEVQ2YxMIhLSIIoKWkJGVk5eQVkFgODohLEBGUVVQk1SVSWoKo61HwNTS1tNJaoji5ERE9e38BQDZVlBFXNYGzCwGBqhsIyN7TAHQKWVrjlGKxt8EiSCwAYSQ02IU6VZgAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.522,1.0;4.sync,10.6492308496;4.copy,1.1,1.0,1.0,3.960,3.627,2.14,1.1,1.0,2.38;4.rect,1.1,2.22,2.22,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,1.0;4.blob,1.1,5700.iVBORw0KGgoAAAANSUhEUgAAAu0AAAAlCAMAAADBRCelAAAC+lBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NREREQWFha2trawsLDDw8M0NDQVFRUrKytHR0dhYWHZ2dlCQkIMDAyKiorh4eH19fW5ubksLCyysrLa2to5OTkoKCixsbHu7u7w8PCjo6MaGhpoaGjo6OgwMDDs7Ozx8fGpqakiIiKLi4vT09OUlJT+/v7i4uKdnZ0cHBw4ODiAgIB8fHykpKQ8PDy0tLQYGBgbGxsUFBQHBwfAwMC/v79UVFRISEiSkpLr6+seHh5XV1cfHx/q6upRUVFaWlrW1tbc3NwtLS3z8/O6urpOTk7MzMwREREgICDk5OQ9PT1fX18NDQ329vYdHR0mJib5+fmhoaEODg7IyMgJCQlqamp2dnYXFxf8/Px3d3eZmZkvLy+goKDb29v6+vp5eXmIiIjp6ekTExPy8vKcnJwjIyNxcXH09PT4+PiEhITY2NiYmJiqqqpcXFzBwcELCwvf39+4uLitra1bW1vl5eW3t7f7+/tLS0uDg4PJyclgYGDj4+NBQUFMTEwEBAR7e3tZWVlAQECioqI3Nzf39/eTk5Oenp4QEBBdXV1eXl7t7e1PT0/FxcUxMTHR0dF1dXXS0tLQ0NA1NTXExMTg4OBGRka9vb1VVVX9/f1DQ0N6enqNjY3CwsIlJSVJSUnKysrX19cnJydiYmK1tbVjY2OPj48PDw/Gxsbm5ubV1dXOzs6mpqYuLi6Wlpbe3t5lZWWBgYF+fn5wcHA2NjaGhoYyMjIqKipFRUXd3d2VlZUKCgpNTU3Hx8eCgoKvr68BAQFQUFCMjIyurq4kJCSbm5tSUlKlpaUSEhJpaWmrq6tKSkpzc3N4eHgzMzOHh4fv7++QkJBkZGTNzc2Ojo4/Pz/Ly8s7OzsZGRmXl5e7u7tnZ2dra2uoqKhmZmZWVlYpKSkhISF/f3/Pz8/n5+d9fX06Ojqnp6dubm5vb2+8vLyFhYVYWFh0dHSRkZG+vr5tbW2amppTU1NycnI+Pj6JiYkBmnkqAAANdElEQVR4nO1caXhU1Rk+DCFHhmVYCiSWSAANiQQSthkwgcRhD4QlYCQIyCaDYTGRRRZZZNVIKCEgJSxhp2xCgUK1oSxCCYLIIphaUdS2lKUuVSt0eZ7e/TvnznfvZDITJukz74+Zm3vufb/lvDP3zMx9Q0gQQehRxWKpKm+FWCzVAptLEEGUL0IpfUTeqk6pNbC5VFTUqFkr0CkE4ReE1rbVkbfq1lPUXv9nDQKYkP/QsFFY+KM/9wNR44jHxKcmkU2bNX/cR64nKKVRxsMtIqNjnmxZGqLYVoZDrSmNi2/T1tvU2tF2npgxtKcSOngbToRdPtdRlnMNYJp9aEdts5Oi9qeaxyR4yeLvrPyBxM5dkpKfdnb1mahTXDfxqXuPLj179U5p6COZw2E3Vnufvqn9uvXvURqhDhhoONQ6zTFocETKM16mpqrdhBlD+3SHiGe9jCZhiMORMdTheM5oPHRY6XiY40yzR9ROhmeMcD/QnMXPWfkDz0eOrD1q9OgxPhM1oGPFpxfGWQTJu8b7zPeisdqHZoYQMmHiJN8CtE4RHibHveTlaaravUT7rLKcpSH7ZZPBMujK/DhE7WTK1NKd7H20Uh7nB1RLa2ufNv2VGTOF6+WsRj3CZ48U977aP2vOmAni1iMZdeeGz5vP7LPS1/ouWOhctFjHtIQ2ER6XTnxdOu0NQqaKarLRHI6vSce+MW92IgZ8y17JzVyuXBZUtXed1rfpL1ZwoSJnio95K7nRPh3ze8wewm0x6yGN2R65qnf46reIonaS1ppjgfwgF+hBgzUZrX4pqh2YgY9Y12asXWi03mDUbt5TpF6iqZ2JplWZJq9zOGam91pFcJx5XwzUXtBclxLag/LLCua37Fi3PjG/4VuhZEOisDqM3DgivVDYuWlz+y3Tp8ySMqVztlqTOjH7rHRbr1EF9YZt1zGtojuExyF0p7oDagO+Cc5f9Xtj15pEnG93+qzkPU33yqcraq+TtjZpX9RcLtRK+ray/oDRhOjUJZsK4vezW7AeAmZ75oGeSdVnJipq3+/ayrJAfkwuWg9aZnfeuTBaVDswA580+uvSqN2sp1i9BNSuRYMq1zm6HBTWSBwz9B4qguPM+2Kg9kOHdSlhPSi/rIDZB+RN+k1tUu8IWTuc2I8K64PfUuGF1NImrOfz6AQp05Xygdo+K21Lwt4h74bpmH43b4bwWCTOdqLFUoWtDfiONRPS3U1X4XzTIpYSUo/KVw1F7bETO4mrpN9zsTq4spq340eT6XFCdnRcx24BCzDbM4UXygk6SFD7SYulbmpMW5YF8mNy0XpwyvkeIT2VlcyL6kyrfKeihdHTxmq3WKS2eOgpWi+jdjUaW6W2FtCYofdQEbdmMOmLgdobn3Evyq0H5ZcVN6tlxUt/2HiW5LUvjhCY+wt/D6B7hMdzw/oKl5WBUqbDlSPVfeLMbGhPOqRxPImO+Dbis6T2UZR25K5bGt/2aeJB3RvifFnSlDrfZyvvfV4QyfB03UekC7Fz6AdV2dE6zsLT8sc42AIWYLYXCBst6UXpOxlKxxVxMSA/JhetBwuGEli3qzOt8S34UBo1Urt0wZa+ozXtKV6vpnYtGlsloyuFGXrPdBzRFdYXA7WfjhtxSV+UWw/KLytuVsuKy++3S+k+a9vKK4raSYZwZb8ad3j+uo8UtVvkA7V9uNqv0dXSgRfoOUKu2wo5tQNfyhH1BIRvuPybxpoX2Mrz5XXdx/rEl46mH3GjF4aWuFKl70BhS2VhmKX+DaRJgtoX2WydD/AxtPzYXLQexIvax9Qu8cX/kZipPd0mYDLx1FODelm1S9HYKhldKczQe+g4oiu0LwZqJ1tpgb4otx6UY1bsrJYV1i4hKa5P0rPqau/t+wjp+Cdh6xyvdm0frva2+5yfis9VS6R5Oi8sulqHqbUBn/yaNuILl1/T25jKydErokps7LeNVV6+IT59Vls3WvWxyNzdui2FBZgZtaeIF8kbXAzIj8lF68ECUfuGal9gJ2ZqZ9ftJj1F6hXhrnamSnddQe+hIuxdFOuLgdobuGLdlhHuai/HrJhZLSss0Z/PuEluir8c2COqEbKPtiBkbhfhzw682rV9uNqFNdE86UJzKkq83tWqKbwXZL8nzmUOy3esRDjo2ZLTON9seb1mZSv/YoN4uXtKjvGcfC07WVvItHjKl+zo6DXCwiaB1me3gAWYebWTQ3O5GJAfk4vWg6czhUvyVSO1L3cOF7+ZcrCZAjC1Yz3A6iWI2tkqx4zTM0PvoSLmONO+GKh9L/JFoVsPyi8rblbLjK9iXree+7OUM/3Lib9mCRIil+PG14vdTOuymWr7jNR+mkqvuxoz13SzviN+33581FDr5SixNuBL6HFmya21BRac72+5c+sNzhe/uxE/n+c7HE2E9VqPgrwTsa4+IveM6BLpqznrvMarlpx1NWBHx+bWmn/1bNYFdgtYgFmn9m7irwTAAvnBGdCD7umFydPj1e9kZGbgu51bmDw4TVa7mikAUzvWA6xe+HUJokGVhOTRO4unJ7DM0HuoCI4z74uB2u9+qJtwrAfllxXL7AN6Hcq9J/0WZL/7WnT6bPEGieK/x6fX7LVhPpupts9I7VelV4ewpjnszFotNe3ilOxD3cTaGL6uNbPufVDHiO/r9bnOL8T3syfk1WuosHlhdrO+nbdI1Im7xs2QNpbtdZakSl8fwOiyR6NLvvya22JYNGad2qumfMOxaPnBGdADsriVq/oe9ft2mZlRyZZWGWufl9/51UxDLBKq4mpHe4DUC3cOMNGgXlK8LT9jVx8uU633TEXaceZ9MVB79aG6CUd7UH5ZMcz+gPwptcwYS/v5KZHKCullGjeS3TVMnsGFgUmorAitqd3x211Ve5UYs19zKx98VHtxxBnfb7apzBgU9W2D75ryt2A0kT5y2iYEKKUyArnjt+GxOH/cOVhx4KPaiW3RP/yTSGXFnrvZJ7+3eD6uwqOlTbvj12aTf7X+at7lACZUEVHlZqAzCKK8sL+SXZ6CCCKIIILwB4oDnUAQQTwkXK+dm66/JbhyY5f8cy/ch2zgp6sw/i07e2OHGws3GgQC8/6xuORcvzNnvr/ievBpPgRHHyE7aIx0wyrch2zgp6sw/i1uttxYKr7ay8/VY86sjpr3j8UP1J8eO1xX3ivCl/79GKP9rgYuOhM/nW8Z+GOmzfUcVLun0dJ3aLzLt3zcgOjK+2740r/tzav/0y0Xt6wC7t86VkjIT/fJM7RImK3kVuHDrvMsWgwYZYB5FBHvHJMB5vIz9Q8iMW7QPPHPA9wFmukV62BUAb5ALRqalbsvkGVGaoNRtH+IY64A/ieC9y5EvM+qrpCctVwuZd8Xn1IeeKoD7Z85Eka9uu0o4XNB1B5w/9a/MsnS8CfJMlcisTc9cDHpYJiFZYEYMArAPIqYdw4ywFx+5v5BLEZ/0Rh0nH7CxoAecA5GBeALhGhYVogvkGHGaoNRrH+YY66F40GGQ/6fCN67EPE+K7rCcoZcvhHfu4vEO5PM68D65wGD4+psVG788rCSCax/ayBNKApLI/XvCsfdG0BIDu/8gxjcqALMo4h55yADzOVn7h/EYrwqGiQ/dep+iFV7wDkYFYAvEKJhWSG+QIYZ9wVqKxmkf7hjrkO2suG9CxHvsxINyxlGrfQCIW8f9FgH1j8PmP0ZsaRf46IRc7UHyL+Vv/jfbZrdjp2kHPc4vcWyQAxuVAXiUcS8c5AB5vLz4B9EYlRJm0RCnN/rKlF7wDkYFYAvEKJhWSG+QIYZ9wVy63Zd/3DHHKN2b12IeJ9VXSE5w2jxzDuk2pwfPdaB9c8ciVnbVqwoXM1FI57VHgD/Vur983vm5u29rBzXif7AZgUxuFEFmEcR885BBojLz4N/EItBRoevuOXS/4c1pQe8g1EB+AIhGpYV4gtkuov7Ajm16/qHO+YYtXvrQsT7rETDcmZyeTeCLHbV8FQH2j9zXJXoNtfhopVW7Q/Vv/XxmMwd46ceLcJnC2Jgasc8iph3DjLAXH7m/kEsBlmR9V2q/l9YaD3gHIwKwBcI0bCsEF8gw4z7Ak3Vjjrm3NVeahci3mclGpYzk0vXzUUPznquA+ufOabey8nJOUcH6yovldofrn8raVcU+fxQhgWfLYiBqR3zKHLeOQWQAebyM/cPYjEIWX50c5G+kWoPOAejerzmC4RoWFaIL5BhxmqDUax/uGPOXe0eXYhEfwY3qkTDciaM6mYdyT/tuQ6sf6YoniP+Ty3SP5R1VMEWIPD+rdv0CgkJLyDsbAELxMDUjnkUWe+cCsgAc/mZ+wexGIRM3uz+/1rUHjCuQahS8wVCNCwrxBfIMGO1wSjWP9wx5652Ty5EDUifIRqWM6u6Tdn3lhrNkXn/TLGO/kd8Gj8xhHFUMd4qDRXAv5X/LSFd2hB2thgWLQamdsyjyHrnVLCfHBCXn6l/EI1BVkzs5tZ0rVfgGgSAL1CLhmbl7gtkmZHaYBTtH+qYc1e7JxeiBqTPEA3LmVVdiPO/unNL3b8gAohGi5Z6dwLiCwwiiMqAdXdG7fPuDMwXGEQQlQE/RV3z9pT/G1/gw8P/ADHyOCN4xfcUAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.510,1.0;4.sync,10.6492308513;4.copy,1.1,1.0,1.0,3.960,3.380,2.14,1.1,1.0,3.285;4.rect,1.1,2.30,1.0,3.749,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,2.24,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.39,3.436,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,2.79,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,2.60,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.78,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.50,2.82,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,2.88,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,2.80,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.82,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.77,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.136,1.9,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.136,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.139,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.136,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.139,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.137,1.9,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.139,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.156,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.139,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.136,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.136,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.136,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.136,2.39,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.136,2.38,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.136,2.29,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.155,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.158,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.155,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.155,2.78,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.155,2.68,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.155,2.89,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.155,2.29,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.156,2.79,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.155,2.69,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.172,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.233,2.17,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.234,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.2,1.2;4.blob,1.1,8064.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;4.blob,1.1,7080.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;3.end,1.1;4.move,1.4,1.3,1.2,3.504,1.0;4.sync,10.6492308557;4.copy,1.1,1.0,1.0,3.960,3.532,2.14,1.1,1.0,3.133;4.rect,1.1,1.2,1.2,2.27,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,2.58,3.388,2.74;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.82,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,2.63,1.9,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,2.82,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,2.58,3.179,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.63,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.60,2.48,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,2.60,2.68,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.60,2.28,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.82,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,2.98,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,2.98,2.19,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.117,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.121,1.3;4.blob,1.1,2660.iVBORw0KGgoAAAANSUhEUgAAAQoAAAAiCAMAAACQnWcUAAACf1BMVEUAAABKSkr///9BQUGysrLZ2dmLi4vT09M4ODhoaGgICAjo6OisrKzIyMj19fWMjIwREREgICAYGBg8PDzq6uqhoaEBAQGkpKSwsLDX19dLS0tAQEDk5OSEhISIiIgODg4tLS20tLTt7e2tra0mJiZbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7f7+/tkZGQiIiKXl5fv7+8EBARCQkLR0dF1dXUeHh6qqqrz8/Pu7u6enp4QEBA3NzfBwcH39/fp6emTk5MMDAxERESDg4PJyclgYGDr6+vj4+O4uLiKiooXFxexsbFPT0/W1tbFxcUxMTGYmJjc3Nw0NDQLCwvs7OwUFBS6urpMTExVVVXQ0NDi4uIPDw81NTW/v7/V1dX9/f2AgIBDQ0NcXFzY2Nh6enpUVFQZGRn+/v5tbW2mpqb4+PjAwMBJSUkVFRXS0tJjY2MnJyf29vZISEhiYmK1tbWNjY1aWlr8/PxHR0fCwsJGRkZqamq9vb0FBQUCAgLGxsZRUVHU1NTf398HBwfb29sqKiolJSVdXV1eXl7KysovLy+VlZUKCgry8vIyMjLa2tocHBzh4eGBgYF+fn7e3t4GBgZlZWUNDQ1FRUU9PT1NTU1QUFAJCQl7e3uurq7g4OB8fHwhISFSUlIkJCT6+vo5OTlzc3PHx8eHh4egoKADAwPNzc2vr690dHSrq6uUlJR3d3dhYWGSkpIbGxswMDB/f39paWl5eXkoKCgfHx8pKSlfX1+oqKhmZma7u7u5ubk6Ojp9fX22traOjo7w8PDExMTPz8/Ozs5XV1eQkJBubm6dnZ0jIyNxcXHd3d3x8fE2NjY/Pz+np6ft7BijAAAFB0lEQVRoge2YjVtTVRzHfxwKbIMBDpisJbKV+AIYL1LOtFETxwqNGJNkYCiwlhDBIJCSfEkMJQtIS0wKE6wka73ai2X2qr2//EGdc7bdc+5e7nafpo3n2fd5uBzu2ffc3/ncc88uXwC5SkLJ5NdNN9O/UlJZzyK0KKTjFuSTItDxP4gUowxohVBautQgvl6FKkM4AmRmsQ+EQ7FYrVZn5+BDbqAj8tViLlyMRhnQkn15f++SPHzQoluDPhAOBZHutmjqjLqW/6SlyuBWfj4+LCvQZxtuxw2ddxWTjjuWF65YuYq0VhcVl6jWaPneO1EpQFl5hWiJra0sSr2Lorh7nXH9PRvIuY33mqruu9/b70MhOMxok7F6s6UmWeSQqoVzaKwPZKsMD0acs6Z2y1bVQ3W49XA9Pth8ty8EigZ7+QbYZm98ZHuToxmgRb3jUbyKccf21p272tqtFAVa0WF2LuZ7H3M9DuDYDfwSK+3semKznaDo1j3p7FGW4HO9bmtf//qnRCgEhxkNDO5pGkp/mndI1sI5NKj2mb3uYdG0n1VQ7ROhqNp/wHnwuUORURzKG2mAPnQY4PmCFnLCvyhLbbhzFK2iKI74fcKSPWqFMTQoGuwFyzGAAwRFyouY21r0EsC6cbxwhrybLPeALPWhmIDJl+H4JO+QrIVzaE68AvAqqhNN27uOnGIUJwGm0KnIKKi6LcOv5QdO9nS6EQ+bRVFMB6E43tnw+ppM0WDVOeDbK7a+ge/NtHsvQCGdvSUjLIqZnXBGxzska+EcmuX4fCbq5+fxpo0qU4SiibBEZ6NEAbM55XON50SXT3Lt1ra85UOhCEJRh7a83SUezJHhR6H33p13YBqtJj2V5yOhEBzStQSigKIOfhohHxCCIouslOhQAMyfqzX18pcveBcfTodFATUXWt8TD1Z93o/ixPv07kwAqLyrYiASCuaQrCV4VfSIph3qARFQeCajQPFB5Tzer9CHpL1yxHuuZAc+nAlE4e/FjBHqFQ/2UdU0efnCKMpmyHfGx/jH4N0rzJFQMIdkLTyK8X0APegTfh5hHxCKoqPzGAEqjWLMtESbdKFwlrRH0afJbdsALro+G0ppRcViFP5e8lIxTs+Q7wO9Wv05wBfu4b42B/0GyW4anUqZWwbwpalk6JLeCjwKwcFNjDkka+FRoK+mvi68DJHEUBzek2O+qCQoWM2shZVB5rnxG3v55Sv079wBfVEeLin3W4f7u8EZrRiFv5e8an5Pz/jeqNNwMzl17mA/fa+YNfxg7NpFuq/8aLKU5YtQCA5uYpxDqhYexU+b7G5DtwwUcLa98+o1goLVzFUP8LOrIuJw8SjvthlTpbXHfMgbotijaDb+Eushb4xij6LCmRvrIRNKKKGE/PIg5HL8OhGmV0gkFmKMxxRdiuXRqU9dGq8/GfpTQiKxEGO8aAsRUJD/8n5z/R72g+zNfkHEeEyyAz2KAnQe4KM45giBIq5jPCb5gR5F0TzXwUdxnCMEiriO8ZjkB3qePxSK4sY/J/gojnOEfkDiN8Zjkh/oecjFR/4CPorjHJFQxF2MxyQ70PPU2Gxd+0mLRXGcI0oU8RTjMckM9MheMYX+Bj6K4xxRooibGI9JfqBHt82rZMNjURzniBJF3MR4TPIDPYriGhrjozjmEMVkCyLGY5Id6FEU8/X/ABfFMYcoJkvEeNdHiRhPUCLGE3S9Y7x/AV+LY5/CS6gXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.59;4.blob,1.1,552.iVBORw0KGgoAAAANSUhEUgAAADEAAAA3CAMAAACSG1IzAAAAsVBMVEUAAABhYWHZ2dlCQkIbGxujo6Px8fEUFBQJCQn5+flqamrY2NiYmJjQ0NDOzs6mpqaysrLHx8dNTU3+/v4SEhJ6enr////6+vqLi4s1NTW1tbXIyMjPz8+lpaXU1NShoaEFBQWEhIQMDAyGhoYsLCxnZ2f7+/tpaWkPDw8TExMODg4LCwvs7Ozv7+8QEBAHBwfX19fb29uMjIwICAiQkJAEBASsrKzz8/Nubm5UVFQBAQGceE/HAAAAqElEQVRIie3VyRLBUBSE4UMkSMR0iVnMIjET0/s/mCqLuMvunSq31/2tfxF4ubyFnz8r2E6RJKWySwrxKqzwbVZUa6yoN1jRVG6LJO3A54DV6fY40R9wf5HhiBXjkAQTZ8qB2VwtOLFcrTkg0YYEZmZmf7Xfb2gcYyJraLLd7SGRNfRwPCWQMA0VOQcXSHwbelUpArSG3jwEaA2N7g9EaA1Nny9EkA19A91JC2PsUfzQAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.495,1.0;4.sync,10.6492308572;4.copy,1.1,1.0,1.0,3.960,3.456,2.14,1.1,1.0,3.209;4.rect,1.1,1.2,3.135,2.38,2.70;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,1.6,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,1.4,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,1.6,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,1.3,2.36,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.23,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.25,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.22,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.23,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.97,2.37,3.108;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.191,3.208,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.193,2.18,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.191,2.48,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.1;4.blob,1.1,2536.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,2.39;4.blob,1.1,3084.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,2.58;4.blob,1.1,2764.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,2.96;4.blob,1.1,2876.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.115;4.blob,1.1,2776.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.174;4.blob,1.1,3512.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;3.end,1.1;4.move,1.4,1.3,1.2,3.465,1.0;4.sync,10.6492308597;4.rect,1.1,2.41,1.3,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,1.1,3.468,2.75;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.41,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.344,2.38,3.315;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.96,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.99,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.101,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.424,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.403,2.28,3.182;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.120,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.117,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.139,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.139,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.134,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.191,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.405,2.19,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.174,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.177,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.191,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.194,2.49,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.195,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.174,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.174,2.39,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.174,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.174,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.193,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.215,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.212,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.215,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.215,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.402,1.9,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.405,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.232,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.231,2.77,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.232,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.234,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.231,2.26,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.405,2.18,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.400,3.128,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.268,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.306,2.39,3.263;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.405,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.405,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.405,2.18,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.402,2.29,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.424,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.400,3.219,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,3.178,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.440,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.462,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.462,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.459,1.8,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.462,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.459,2.98,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.478,3.228,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.478,3.128,3.110;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.481,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.481,2.19,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.476,3.109,3.112;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.519,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.576,2.27,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.536,2.19,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.538,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.571,1.8,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.553,3.158,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.573,2.10,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.633,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.633,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.630,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.633,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.631,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.652,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.2;4.blob,1.1,8064.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;4.blob,1.1,8064.Br2+Z4YMS1FR1jrKfUf58CjnHh2jHhA7MPimW+XeO4wCmzdPClEeCyf2E8HEkAGx1xpilzn3VLFf3LO0es7XRkM+g15uv5BhlZx2lLVO5r5T8uHJnHvKMdkDYgc2oswx9Aft5uhj6N/xrJAjyHwE4kCUshqzr3vUD9icPSA79JE0iB3EgWhldfTbi6MN4fvnnhd6CGIHqUj/r6MdYeCgWMQBAAAAAABAe8S8ea1pBcF71q0nNjY6Rw9bVJ7Gi3IdPPOMvw57jSAaanKj6u41PrMdeQQUt0C0q7T2KuXYVFtbu6if/jImWpHExkbnGMUWlet4bI9YYZ1AjytqvbuKF7vn8bzuuNmOPAJU8jEKT9zFHk22vKrgH3xiJZLY2Oj8SzchYvcZi3+iFLt/5DNISik64i72aLLlSbE3VDT2ud4okrVOEjcb3YD1Qvzsp+Je7TF2FIqKajkzHteDW4diFqTaJ6YWdrxik31t1C5jc2bFFuMEshE0rcpctVqr5WNRxiPkrikRyJIh9k6z7rnXx3gS1x1STJS2SxaH2JVaLlJmr5TZ5F4pfWNLlNnyLLGv2LGz6JldBTZrnSRuNrr/WypGNV4m7s/JZ0ehqKiWM+NxPbh1kFmQagfV/eLmXw7fnK9GSu3m1j83f3WecQK5CAK1u+1ip1iU8SS0axQBlXSx37twxNPC+3iE6w4pJkrbJYtD7FTLRcrtVchuBPaK+saYKLPlWWLfu0SImwyzm2Ktk8TNRrdU6/TYrirxnb78KBQV1fJmPGcPbh1kFqTaAYf0c/KsYSinSKnduLoDhuVwHh/BuLwDxpOhNrFTLMp4Eto1ioBKNbkF2/bOFcL7eDbC75DddsldvDhKXKTcXim7IffKpo2YEl22PPWa/RVtus1aJ4mfjW7l/t+8dmhGr9v5USgqquXNeM4e3DrILEi10+42/v362Wqk1O6I8cDmvBCxywiOnBmoDSN2ZTwJ7RpFQKWaWaMPO78twW08G+F3yP5Uqyexc5Fye6XshtwrmzZiS1TZ8lSxb9JutVnrJPGz0S346b9v37j8jPP4USgqYT+Vjgd7nT24ddCDx1S75m2zTl2bbLfVkBYn9kAEW0eK8GJXxyPkrlEEVKrRDmuXiFBcx1MJv0OtEDsXKbdXym7QXqnaiCnRZctziF2x1kniZ6P74bHSX91x6sHH+FGiETu3DhIx1QbfreyRUrsjhrTCiv1IiXB5Z7ftFWHuGkVApZr6hg4594e0jzQeEVuxM5Fye6XshrpXpI2YEl22PIfYFWudJH42uqLhzeI/u2UW8KN4F7uzB7cOEjHVDhiq/8L9/dAeaqTU7oPSzoaFJYzYH6jrbHyRVIjYrViU8SS0axQBlfQPqENmHV8ivI9nI6Zi5yLl9opmo72yaWNwnC5oWoFD7Iq1ThI/G90M7V2xrDEwOTMKRUW1vNidPbh1kIipttOi7pOnr8oqUCOldq9Xr2/4aKt1NyY0ghmV6xtOVoWK3YpFGU9Cu0YRUMm49fh44xwRebzz1S9vCOC6Q4rYqZ17iYuU2yuajfaK+goxJG9oyP3f5OEQu2Ktk8TRRrfyAiG2vRZmFIqKanmxO3tw61DMglR716fle38dsjZqt78iJ3e7dZ/dEcHlFZmrPgn9M4oVizIeIXdNiUCWAn9UWq29EXm8kdmj7I3cd0gRO7VzL7GRMnulzCb3Sukr8oePaPXdk6QAs0UYjLP9YPajiZ94dNfEz9lOgNh5rmm+IOOzFdF/WbJvBhZekPhJ2wkQexi2961///PQq+cEMKpoTOInBQAAAAAAAAB/jI3O2QVA2yF3bLIjACCOKLa8C4tPcWkIQFtHseWNvDh5YQAQZ2y2vFGl4yM0B6DtYrPllZW3rYduAPCFasu7LDS9LgBpBdnyBlZOSW4oAMQVxZZ3adVVSQ4GgHii2PKmtd54DUCbYoYjnwsAacrMbsmOAIAEMeu6ZEcAAAAAAAAAAAAkkOQ721+Ky6ib8GARsHP97MrqJD+Cs2VtXIYt6st+ff7Tn34Yl+mAb/xnlOPwnqft9Lob599U5mvwGGSZs8XXtGJGq+d1jeUKNjnV9/bF48uXgQ/8Z5Rzw7vYb9V854yLLv9aADW+Sfs8/j3Bdw6/JxvnOw9uyr7F23QgbsQ2P5x3sd+R461dbHO8qfHtbAyXRCvqWG5f7zyWof3B53QgtrhnlGOzlfnO08aRFZy3VohT1+j/PKrdZMuXJrOp+c6b5yO+d81L6Djk8GvQnF9SOll7ItKugLjinlGOy1bmP09b/4IAtqeGb6h9KFOfd7BN7DJfGmVT8503z0d8iz4J9ohDDr/BZv4mlYe1X3k9KyBOuGWU47KV+c/TVhJ8Rwz5JvSJ9cGfqtitfGmUTc133jzv8Q2yUmPFI4df86uOjb7uXNyRTDZuGeW4bGX+87TNCKTSORqS9YQRu8yXRtnU/OfN8xzfs1qGufI45PAbPi5kE/Jrt74mQJJxS7LFZivznaeNu4wJK/ZA7gWZTU34z5vnOb5/aP80Vx6HHH4Vocr+u7Y2CV9JDey4ip3PVuYzT5v7ZcxXRgLZELFTNjX/efM8x7dYM+8PxiOH38EXQ2Ja/FTdXwRIMm4Z5bhsZf7ztLlfxvSsPyDEl3axUzY1/3nzPMe3LOdlc+Wxz+E3KXODY6MvOTd10r21V9wyynHZylqTp43DEvvzh/s1nddsFztlU/OfN897fDvM6+o45PA7R3MmmO6hxSGfJ/CFW0Y5NltZK/K0cVhiFzu71ne7xS52JZua/7x5nuN7y/qdFvscfp/tdn49wwnt8ci7AkBceCUn+N84DpmeFs50HvuDdnPM5wHAI+9tCzxkHHuxf7mHuTwfs6/7XbGeCACPDLnnc+NHzMX+x93sF6od/fbiGE8EgGc69YzLsBlhnlzu/3VcpgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA1mTfS36+PgBagf/seymQrw+kKmNznaUAfTTt0MVMzqxYEiZbk8xa5z/7Xivy9XklBnn9QHLJHessBegzrfbmftn/4Wswv4nBwohdZq3zmn2P8N/DM0wuvdgmQgNx5sLiUxylIH2MVFwzD5/jZ7QYiV3iNfteND2iAWJvU4y82FkKEhD7gboPhJpvTqLkkZO1lHlOwXcePspaR9n33OcllB4bMh/f2HiucUHzxcLyPccGCdGk/bnwyOq6b/fbYuFyB8ra7+3uJERG8RY+2yC7XpCyjCod7yiZBMQuph5Rs8cRlEeOainzHOE/Dx9lraPse+7zEkqPDdqenk1Fm4SYUNxy+Udd1xlif++bw1kv9JmmRsDlDqTap0vniEF7fnYVn22QWy9IXcrKhzhKJkGxj1ujZo8jKI+cWuv8te4/D59QsmLI73uPMC8he2zQzP+8c48Kkb9cG6SLfbHY9b/irV1qBFzuQKoVZdp5H65YbItK7YHLmLbEZR2cJRMSO2WPIyiPnFrrPPn+8/AJd7Gz8xKK2DubpS/7FOoXG0sDYj/eIiZWqRFwuQOpVojfFcvsp0y2QYi9DTGwcoqjZBEU+xlHbPnmJDInha2WOfm+8/CJyGJ3zEsoYjcT2Z3IPq2s9xt2sVMEXO5ApVZ8ffiZ0KiUHhB7G+LSqqscJYuA2Ec1fxCSb86EErCotezJ95mHT3gTOxsVJ/ap9wgjmZlN7BSBYHIHqrVnNudcGhoV9YDY2xDTrnSWLAJi/7Nx65GyxxEkOrVWyTxn4j8Pn/Aodi4qTuwbtxmH7WKnCGwZ9EyoVnyRPWVm+dW2qNQezvWCVGVG9jmOksT4o9JlmvFHJcoeR5Do1For8xzhPw+fmsnOTexcVJzYz8u+44VexdrjqtgpAjV3oAXVLu34lRj1ix/1D5dt0LlekKrM7OYsSfpoWseLTwSKlG9OouSRU2qtzHMKvvv5h40AACAASURBVPPwqZns3MTORcWJfczMrdWffnO8TBW7EouSO1Bi1U5a+90DQjxR+WK4bIPMekGKMus6ZwkAAAAAAAAAAEgynJ3tJdfatsGmIZHbgHYFa2fbstatto1Q1Hdg5EYg/XE3wDWtmOFS6xPliXCPBO6pt5ajz1XWnRp8UP6Ki6IYB6QNrga4Sfuuc6n1Cz0RHgnriZNoxH7XbWf0WL1naqD8ZGOcrbSgbcHZ2XY2nu1S2wpeTJzY/6d5mRA9tOBDELevb/1AID1wN8AJ8e6HIrQ2GrMbiV22U0x2TasyV6025iCzW0lWQ0Vjn+tbtbYbjT/s/157MPCPBu3RVg0C0gd3A5wQiz4RobVRmN0E2R9kOzLZza1/bv7q3YbYyexWsmLHzqJndhWoQ/QvCHAVXyK+e0y/bN+lTQz8Y7A0YIB2jMvDtGKQ4QcKqY3C7EazUTsy2Y3LO2BcdgR+t8jLmL1LhLgpxA4YfN8v4kvEmlPFy41/L28J/qv5Vd87A9ION7E/q2WI0NoozG40G7Ujk92RM/XSvBCxG7Wv2N+VZwR8FUeX8CViTc1rpfuFJfbh47xvCUhX3MT+D+2fIrQ2CrMbzUbt6IHdrSMFL/ZN2q3qEJ4vY7LXniJEY/AyRlS85mdTQHriJvbFmrxjFwuzG81G7UjsR0qEJ7F7vYxZ272/EJ3ND6ji4IteNwSkL25iX5bzsgitbY3ZbbC8oDFno3Yk9gfq9OujyUGxW2Y3TuxeL2N67dEDna/9I/CPSZkbfO4LSDfcDXBC7JBXutGY3YbkDR1mn43akdhnVK5vOFkVFLtlduPE7pWlhVPLTlZtDP7jHI35vg7QrnA3wAnxlrQTR2N2yx8+YkjIbLKdYrK7vCJz1SfavMDYptktGrGL3tMqV/7a/J3y2e7Qr04AwM4rOR9HbhQrDF0+mB2fP/4snBmXYUE68d62hD3Ye03zBRmfrTgWl7G/3MPcBgXAxpB7Pk/YXNv71r//eUHkdv754+7QLzsDwEmnnsmOIAZkxCcRBwAAAAAAAACAFAFf1wzaDZ7FPhh3uUHbgcx40lBH5rlT1+gvR7Wb1HaK3U4+GwNAW0Ca8chQR+Y5VexWO7Lb0bMxALQFpBlPySMnL2NsYjfbkd0OgLaFNOOpeeRYsZvtyG4HQNtCPtir5pFjxW62Ux7dBaBNIUWsGu8ssX+1S0DsIG2QIlbyyEnzXM/6A4YbFWIHaYEUMRnqyDz3/OF+Tec1u4j9fC0uT+4CEA+kiBXjHWWK29m1vtstLmIfmT0q0QEDkBxGd012BAAkhoGFFyQ7BAASw6iitpuhBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFKQsbnOUoAWTdPqZ78T5fAP6qM0h62tyXLrW5PrVhszelX4at4GVgTCkDvWWQrQUlhbW3Z38T+jG35TbW1JiktjyVJfzeO5Ii4pG7ISxowLi09xlIK0HNJfxhzZEfUUL6a42P0TtxVB7HFl5MXOUpCA2EWvlfrLFwvL9xwbJGxZNn4ydeWi+642msgMekTJuisXNd73aPAfljSsUd7Rlhv/3FFhSGNLc/WcV9RaIZ6YWtjxik0iKI1Os+65l49cmYPJ5sfGZ7U7vf6nxj/XPKRelCgZ/ppWZa5ardUmaEUyUspASH2VY8w+Az+MKh3vKJkExf6hfgInFLdc/lHXdUIVe6e8BZMnZG0dqGbQI0q0OT/vUr0++A9TGjTKwu76y/PapfrJ1xaUnVy51lY7qO4XN/9y+Ob8gDTuXTji6TChK3Mw2fzY+GS7fzPeLR/T5qkXJZThb279c/NX7w4Re9xWRJFSBkLqS8e4fQZ+KCsf4iiZtBwqKHj6DW21fvKPCpG/XBukir1Be16IX03tbc+gZ1FycJkQL2vBRKimNGiUL4yKv9QV6Cd/t66Aa7U31doBh/Tz/qz2sCGNgm1754YLXZmDyebHxifbNWkvCfGDZ4QaH2X4G5d3QIgeIWKP24ooUrpkob50jNtn4IfLOjhLJsbdGK3jb4zil30K9fJSVexP1q3vEcxcrWbQsyhZqL8s0bYH/mH90pej9K+6XSyr+1yYV7j52V3U2ml3G41fP1uvnTX68CNhQ1fmYLL5sfHJdmPufFVctec/hBofZfg7cqZemhci9ritiCJVrs9lXzrG7TPwwcDKKY6SRUvh0aNXTzJKJ7JPK+v9hl3s4qV+Q3MW6G9gtgx6FgFpiMyegX+Y0qBRxNjGYdNzjOva4Me5Qz9Wa9e8bY1Sox3WLgkbuzIHl82Pi48yiLy1T+zPMS8nVLEHsoVsHSl4scdnRTJSErYysjzG7TPwwaVVVzlKFsFrdoOp9wgjRdhSW2Y8ISa9OafyWXsGPQvzffCpwD9MadAoYlj5ZwtOM44FpLEs+69qbfB9MFBb39Ah5/5wsStzsNn8mPhI7HcVP/bQRWbZIfYjJSLcO3t8VmRGSsJWRpbHuH0GPph2pbNkQWLfuE1/mWhsPWXGG7tZf9PvpH3HnkHPomSf/l/nKe2GwD9MadAoQjxwsPgx42dNlX4lPMH4oEi1A4bqv9R/P7RH4OPckFnHl4SJXZmDyebHxkdiF+veXtnDLDrE/kCdfrUzOUTscVsRRUoZCNWRrWPcPgPvzMg+x1GSkNjPy77jhV7F2uNqZrw/VH5YduKi8pfsGfQsSrT/mvLf5b8VwbsdK2trn1BHEeJvxd0D7Wqy180fv2K2bY5Oi7pPnr4qqyB4o+7xxjmBls6UezQHl82PjU8R+4T6vYG0ZhQfiX1G5fqGk1Whd2NivSILipQyEKojW8e4fQbemdnNWZKQ2MfM3Fr96TfHjfvYlBnv/j/lDf3tx0a1kkHPoqTvn/Oq73tSBO9j64y2jSKG3XZLoF3NxT1Lq+d8bZ/jrk/L9/7a6Bv4E8xq7Q2jpTPlHs3BZvPj4lPEvqzufwI/KT4lw9/lFZmrPjHeneO5IglFKjMQqiPLrITMPgPvzLrOWYoJwY9z4bnyW7/ZIp0p9yLNEQXGzZEHsx/1M5v/FYE0wV0avV89/JTPAZmUe/ET+zXNF2R8tuKYj9lasSKQLrhL42fNf/c7IJNyL47v7Nv71r//uf0zQsxXBAAAAADQrgjcoBSbhkRoBkCbZ8vawI+ivgOTHEi7g7OzuVjc6MlxzthGJkB325v7HHFhnnnH3eu8jnYxW1vTihnBwhUXuTUDsYezs7lY3OjJcc7YRiZAd9ub+xxxwRK713kd7WK1tkn7rL+GPNk431ssIGmQnc1hbLOZAF1sb0lgnv1vqf6J1dp2Np5tFW9fb5UGD+YbAxuKOU2xkJHFjbj/XytLHzjbVqv8QpYmNtbiRiM7xa7Y2RQToKvtzauNjoWz70nLHLdKkbE5s2KLIXav8yr7Iu12sVrbux/KaRo08++7Q/KGwqnnBTKnkQ2MrGvEs9XrGravOMNWS7+QycTGWdyUkZl3drKzkQlQuNrevNro+hcEsD+3zNj3yDLHrTIwcp4f+x61I7tdrNa26BM5zWBterCQP3wEbs14gcxpig1MWteIu/eNEuIFbX9IrXnabCY2h8VNNZg5xU52NjIBClfbGzcHa6MLPq5VZFsIY98jyxy3ynF1BwyT3Tzv81I7stvFaG2DDBeVRfOroWcJuKKY08gGJq1rRPlZxmvd+SG15omxmdgcFjfVYOYUO9nZFBOgq+2Nm4Oz0c0IOB2O2h8dZ+x7ZJnjVnmkn6Brdk/zUjuy28Vobc9qGTTJ8HEC+EKa0xQb2AbHg+OdtQ3Gj801IbXmibGZ2BxGCNVgxnxAlXY2MgFSLWd74+bgbHRhLmMc9j1pmWNXufV8wYs97LzK2qTdLkZr+4emfGFVxWsC+EKa0xQbmFPsojH4nveeYMVuM7E5TpZqMGPELu1s9PQ81XK2N24O1kbHX8Y47HtkmeNWeaRGuIidm9e2StNuF6O1LdaU+40HXxTAH5Y5TbGBMWK/L3g12yRYsdtMbI6TpRrMuFuPlp2NEwRne+Pm4Gx0YS5jHPY9ssxxq/ygVB/5RDix2+alW4BmO7LbxWhty3JelqNMytwggD8sc5piA2PE/sfKjS+c;4.blob,1.1,8064.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;4.blob,1.1,2256.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;3.end,1.1;4.move,1.4,1.3,1.2,3.434,1.0;4.sync,10.6492308651;4.rect,1.1,2.82,1.2,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.40,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.101,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.79,2.37,3.105;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.98,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.127,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,2.98,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,2.96,3.249,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.98,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.101,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,2.98,2.79,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.101,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.101,2.38,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.101,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.101,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.101,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.98,2.38,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.101,2.29,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.98,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.117,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.117,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.136,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.139,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.136,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.139,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.158,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.222,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.212,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.196,2.58,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.192,3.398,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.212,3.138,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.193,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.214,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.251,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.249,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.291,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.633,2.28,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.327,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.329,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.364,1.8,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.364,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.364,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.367,1.8,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.633,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.364,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.367,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.367,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.367,2.39,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.367,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.364,2.78,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.381,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.364,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.364,2.78,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.364,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.374,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.364,2.67,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.386,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.386,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.386,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.405,2.47,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.400,2.76,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.404,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.572,2.37,2.89;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.462,1.8,3.202;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.443,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.462,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.462,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.460,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.497,2.18,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.633,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.497,1.8,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.498,1.8,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.500,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.538,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.538,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.633,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.630,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.630,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.630,2.98,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.633,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.652,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.652,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.652,2.68,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.3;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,196.1c51unwT7ZjC+tmP+2Rl2McrWA7IOViO1YLJ3E37O4o+c5sL+/sPWtccV5bF/u9OInOwHKvlkkENyt6ljpDkpUX+fzufVPdl7RfjbknJHCzHasFksJyL3/na/v7x6j7KsU3Dm776OoRLXGIOlmMxKWHFOvtbbY8cnyPb+P8anrkcinEqyAAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.403,1.0;4.sync,10.6492308728;4.rect,1.1,3.432,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,2.21,2.58,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.22,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.25,1.8,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.20,1.8,3.128;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.58,2.47,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,2.58,3.279,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.77,2.58,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.136,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.134,3.138,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.136,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.136,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.134,2.78,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.139,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.136,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.156,2.27,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.158,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.156,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.158,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.156,2.10,3.128;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.152,1.8,3.133;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.153,2.58,3.188;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.250,2.89,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.250,2.48,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.248,2.98,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.253,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.253,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.250,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.253,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.233,2.68,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.248,3.219,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.252,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.269,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.384,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.291,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.291,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.289,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.291,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.291,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.291,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.307,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.291,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.310,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.310,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.307,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.310,1.7,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.310,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.307,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.310,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.326,3.128,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.327,2.38,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.324,2.38,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.329,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.326,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.324,2.38,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.329,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.326,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.326,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.348,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.348,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.383,2.38,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.387,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.386,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.424,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.421,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.386,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.381,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.381,2.76,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.382,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.424,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.419,2.98,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,3.424,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.424,2.15,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.424,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.424,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.419,3.117,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.421,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.421,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.421,3.127,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.424,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.497,1.8,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.500,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.457,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.462,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.462,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.457,2.18,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.459,2.20,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.459,2.78,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.462,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.459,2.27,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.457,2.68,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.459,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.460,2.28,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.497,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.498,2.28,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.497,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.497,2.57,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.495,2.18,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.525,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.576,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.538,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.538,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.533,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.576,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.571,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.614,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.573,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.573,2.19,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.571,3.519,2.74;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.652,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.652,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.1;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6860.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;3.end,1.1;4.move,1.4,1.3,1.2,3.391,1.0;4.sync,10.6492308799;4.copy,1.1,1.0,1.0,3.960,3.380,2.14,1.1,1.0,3.285;4.rect,1.1,2.41,1.4,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,1.1,3.377,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.25,1.8,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.101,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,2.98,3.116,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.40,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.101,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.98,3.108,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.81,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.79,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.98,3.208,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.194,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.174,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.156,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.158,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.158,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.158,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.191,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.191,2.26,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.193,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.193,2.88,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.196,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.193,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.191,2.76,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.214,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.3;4.blob,1.1,8064.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;4.blob,1.1,7040.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;3.end,1.1;4.move,1.4,1.3,1.2,3.388,1.0;4.sync,10.6492308832;4.copy,1.1,1.0,1.0,3.960,3.589,2.14,1.1,1.0,2.76;4.rect,1.1,2.51,1.3,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.20,3.377,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.59,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,2.22;4.blob,1.1,3844.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.60;4.blob,1.1,2012.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;3.end,1.1;4.sync,10.6492308848;4.sync,10.6492309062;4.move,1.4,1.3,1.2,3.389,1.0;4.sync,10.6492309073;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;4.rect,1.1,3.201,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.649,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.647;4.blob,1.1,3000.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;3.end,1.1;4.sync,10.6492309087;4.move,1.4,1.3,1.2,3.383,1.0;4.sync,10.6492309179;4.copy,1.1,1.0,1.0,3.960,3.532,2.14,1.1,1.0,3.133;4.rect,1.1,2.42,1.3,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,1.5,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,2.44,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.22,2.39,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.25,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.23,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.25,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.23,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.77,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,2.25,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.20,3.148,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.44,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.44,2.38,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.41,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.44,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.78,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.79,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.79,3.118,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.77,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.96,3.196,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.116,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.2;4.blob,1.1,3860.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.41;4.blob,1.1,3260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.97;4.blob,1.1,500.iVBORw0KGgoAAAANSUhEUgAAAA8AAAARCAMAAAA11AaTAAAAsVBMVEVhYWHZ2dlCQkIAAAAbGxujo6Px8fEUFBQJCQn5+flqamrY2NiYmJgODg7Q0NALCwvs7Ozv7+8QEBDOzs6mpqYHBwfX19fb29uysrLHx8dNTU3+/v4SEhJ6enr////6+vqLi4s1NTW1tbXIyMjPz8+lpaWMjIwICAjU1NShoaGQkJAEBAQFBQWEhISsrKwMDAyGhoYsLCwPDw/z8/Nubm5nZ2f7+/tpaWlUVFQBAQETExNJitLbAAAAgUlEQVQYlVXP1w6CQBQE0CsjqCDFXlZBsYsVu///Ya7J3uTuvJ1M5mGIKg5EqOp6NWnUG75lBE1GGP4duYZx0mprd7rGvf4g1h6O7P1Y+RNpTNNI2slmc+l8Ye+XK8Y63Whvd+y9KggH78g+BaDzRV0Ny9sd9Hi+uC7eH1D5lffxA9RCCdJGSqyFAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.378,1.0;4.sync,10.6492309198;4.copy,1.1,1.0,1.0,3.960,3.551,2.14,1.1,1.0,3.114;4.rect,1.1,2.51,1.2,3.218,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,2.22,3.467,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.61,1.8,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.41,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.61,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.60,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,2.82,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.77,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.80,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,2.22;4.blob,1.1,5320.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.77;4.blob,1.1,3064.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.100;4.blob,1.1,336.iVBORw0KGgoAAAANSUhEUgAAAAgAAAANCAMAAACjHN8KAAAAclBMVEUAAACkpKSvr6+VlZWfn59VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU18fHzx8fH09PTX19fT09Ps7Oz6+vqHh4cDAwNDQ0P39/dMTEwLCwuioqK0tLTLy8uKiopnZ2cmJiY9PT3+/v5WVlaCgoKenp5RUVEs0VdGAAAARUlEQVQImWNgYGBgZGKAAGYWEMnKxs7BycXNw8DLxy8gKCQswsAgKibOLyEJkpSSlpEF0XLC8gqKEkCGkjIDg4oqA0kAAM9GAvrWg0PWAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.366,1.0;4.sync,10.6492309223;4.copy,1.1,1.0,1.0,3.960,3.380,2.14,1.1,1.0,3.285;4.rect,1.1,2.42,2.22,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.24,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.44,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,2.44,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.44,1.8,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.44,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,2.41,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,2.63,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,2.63,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,2.42,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,2.41,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,2.41,2.48,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,2.41,2.29,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.41,2.18,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.41,2.98,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,2.41,2.59,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,2.41,2.29,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,2.44,2.18,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,2.41,2.79,3.110;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,2.39,2.29,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,2.41,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,2.44,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,2.44,2.28,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.41,2.99,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.60,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.77,2.59,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.118,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.117,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.116,3.108,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.120,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.116,2.48,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.136,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.175,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.155,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.177,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.177,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.177,2.48,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.172,2.78,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.174,2.28,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.177,2.78,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.172,2.76,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.272,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.272,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.267,2.68,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.269,2.48,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.272,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.269,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.267,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.269,3.127,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.269,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.1;4.blob,1.1,3720.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.22;4.blob,1.1,3352.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.136;4.blob,1.1,3928.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.174;4.blob,1.1,5492.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;3.end,1.1;4.move,1.4,1.3,1.2,3.342,1.0;4.sync,10.6492309252;4.copy,1.1,1.0,1.0,3.960,2.76,2.14,1.1,1.0,3.589;4.rect,1.1,2.51,1.3,3.108,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,1.1,3.376,3.169;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.24,2.68,2.27;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.61,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.60,2.39,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.90,2.63,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.155,2.38,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.155,2.38,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.155,3.179,2.73;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.193,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.195,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.270,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.250,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.231,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.234,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.234,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.231,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.231,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.329,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.329,2.38,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.326,2.19,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.272,2.48,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.269,2.96,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.326,2.39,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.329,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.329,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.326,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.348,1.8,3.218;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.329,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.326,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.348,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.326,2.78,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.345,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.345,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.343,2.79,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.345,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.345,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.345,2.99,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.345,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.346,3.129,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.367,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.364,1.9,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.385,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.405,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.402,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.401,3.119,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.460,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.440,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.421,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.424,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.424,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.424,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.424,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.457,2.78,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.459,2.78,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.462,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.457,2.28,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.457,2.47,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.479,2.48,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.557,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.552,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.576,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.121,1.1;4.blob,1.1,2860.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,2.59;4.blob,1.1,4028.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.173;4.blob,1.1,8064.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;4.blob,1.1,8064.CktP6nlV5NwAIEik9KTUjMG1dAeg8SGlJ2Vm4asdIArh6UnX44dxQFRC6Ul9ckZF1hUAgoKlJw3NHRthZwAIBpaeNC74hFEAGgUTcK4AiHZuaxtpDwAIkYm3R9oDAAAAAAAAAAAAAACiD+mUitDO2YkAfs4LAmcGyqNWQjtnJwL4OS8InBnU63lBDYnqx0xPux8fBQpU5wUpz9khFKfruKrHrCxZZf4eHp0XRGcI0dlAqlOHyEaAJ/OQXfY78koRn34/PgoUqM4LUp2zQ6hO13FpZT+1yFtoNFvnBVE/djaQ4tQhsqGydlGKifTNULJbm4jx46NnCPbzgoTinB1CdbqO6+QpIf6hGRdH67wg6sfOBlKcOkQ2VNZc7lcK6TeGyW5tIgZnCPbzgoTinB1CdbqOa4lemqbtE+y8IOrHzgZSnDpENlTWJpiHShycxuvILkQMTOxHrQjFOTsWytN1TBGL2I6Cfhud9WNnAylOHWI2FCfzKG8nLLsQMTBxFLHirBzV6TqeK/FGwWRK/djZQIpThyQbNmvK2wnLLjtbCSI+k7GfFyQU5+wI6+Mq1ek6rmP6pXKj9pxgMqV+7GwgxalDZEOy5sHv7YRpl52tBBGfydjPC1Kds0MfV6lO13Fp/xn136yvjWZLptSPnQ2kOHWIbHBrTpBdOltJdUqQUB1FBE5H7OcFKc/ZoY+rFKfruLo+Gp+3yjx7h84LojOE6Gwg1alDZINZc4Kd6mOdraQ8JUh1FBEAatxv7PzCzgZqYHAUEQgUZxGzs4EaGBxFBAKmlisxnQ3UwOAoIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHBnaPtAcAhEj3gZH2AIDQuDL9bHfBNchbRSUAooGeV3kKV/9K2EoARAGpGeZhMEOu6dP72uZDO/ASANFBZpb5u8PDmmW1y45Pvo6XAIgOrm/q/jt8RE7WyNZyCYBooE/OKE/phtG/HuNbAiAKGJrrOV/r8uQbb0oaKZcAiAbGea+5428W4pZb5RIAUcCEpEsj7QIAoXFb20h7AECITLw90h4AAAAAAAAAAAD1BE5yBFHOHZNy8ppG2gkQMvnuE+uHmU86ZTt3vlO7U93giguzWxZTdeeK/LYWOtotrCUn6/yCuyZPyVS31cuKvPGrLc7154EKv7saNeTnFRvcbT6ZNt25cwREPKO42FVfIr5Hs6+3Vxf333oVcW1xDtoDr/d1ao06EduSkvKz6jA6AiLWmVVfIp6ZbK9rEBEHBETsD1tSEomYvXDPjp0zt+QK44X23nl959/SxqhrsiA2+z5pub0XCnH/IvGAtlgPeGl2SZc7BB/hKntwYslDD/O686sWGU9Xr5FmJmsWruoxK0tWfe9+4hXxI0uyli4bIMT/tEPG083ZhojvK8ore4K3CvHk6L7Nbpgh3CKOmfjRA9KC1z6Vk7HuEr0Q576RKuaNue46wwPFihiqCFl2yQbrZ8WP4swiVL4+dv0K2RfmAa3t8dGVK1fdKPti1ZH3bITlAWt12tXGjiopiUTMXrhna0s7lqfp+7Ehd33axqK5etWmqqcnr4iXlvubDJFacr1Ym5woXPM3P5O2ZWsKH+HK2HxrWvdnE3ndb41rwWJjFqoja4RLK/upRd5C9xOPiIek54/Y1rJaLy1prz+8qg3VZartytxT+ZDUOqDgd7//Q7sFiaaIH1hy3vtSDPbmVZfum3+BXnqueE2sfiPVird2Lt6/Ra8zPFCsiKGIENklG9SP4kdxpgiZrS/4iNjygNYWE79r5JC43X14P6oj72kEeUCtjrva2FElJeVnpehc5H4yyxLxYHeh04v66ptoV+qX8IKXhLhVWu50LWbx1lxxVlc94AemCTFFq+AjXBn6JXCUdhOvK9cOC3HtFmlmska4Tp4S4h/aw9yrTQeFSDyk6ZeXR4yGfxXo21v4QqLh1RHe2vuovp97tQcNEafsP7BJnnnesVQhdhqe6vGossfIup1QrIihiBDZZTasflL8ZnlF7I3Q1fF6awcfEVse0NpKtVeFeG10Z96P13m9pxE8ut5Wx11t9CiSktyfTrzufkIibu4uTHxDV3jzvBZCLO8hbHdPlRV/evPohE5vee7fntDG8xFm3SbtGV7X/9m3xdilf5ZmJmuEa4n+ME3bJ3l1vEtf3VX9PdFFuW+JUwU/Cs89cWJSC946bp7R+R391bxwYq8dD/vMnHWx8VjQzXh0FLFiRQxFhMgus2H1k+LnFbEVoeUXmq0+txNeD2htGwoWdpBeOoRcZ931WiN4dL2tzrva6LEnJeXnHdR51/2ERJziLlS676P0a/duY0t8lrtr0Rv75h66oJ8n4DO0e/gIs266lsbrxCvHREXy+9LMZI0wRSxiO3KvTiSdm9n5PXNjBpa0GZ9s3Am739gdvZm3rv7AO0uhtkO7Rp64uTbb+LOg0HisVcQ+K2IoImTZ5TasflL8uIjNCO3uKdQiNj1gKz/cIyF51xHZZVbn9Z6NYNH1tjrvamNHkZQkfTphE/HJDw2JH3xZ/zdrbInPcq9blvHazHNOLuYBpxG0RVQn7k1fvGaQPLNfEU/TNnKvRn+kPxw3N6ZN1g+7zjXqTBGfSvqYt7qviGZrVWnT5LXyzCXuq+R24zEwETNPCUWEyC6zYfWT4mcT8XKXcBAxW7n+anqkLGevj9NWndd7NkIhYuddbewokpKcRfxJjfEe2/j1oE8z9FelE/Jy09oVic/axqbwgNMI2iKqE6L6g8oO8sxKER8bK8RG7Tnu1dz9+sMw91auO5m+2PhbmKvfOw8xvKLW3gn6i+vdCR3MN3atJ9ZMk2Ze5b5fLTfKKhEvO8/jgWJFDEWEyC6zYfWT4mcT8boCvXWkPxHT2gYuGK6/k9PO4v14ndd7FisWXW+rn11t5XujEjXIn05UFhc/KdjCN6yMOzSqU/Lj+r1e3sLSbbtlEU/QPhSnSoxYU8BpBG0R1emKqzqQKs+sFLH2n1H/zfpa8qpf0sydndK1OUb7u+ntzX6FSdWTB8+fJHhrzMr2I8evj0txf8Q2p6RMmvmLnLk791Sa79uVIj6kvV2xLUa9IoYiQmSX2bD6UfxoRRShCTkLS/fk+hMxre3znNczTwzKOsz78Tqv9yxWLLreVvWuto5P8PkcMWqQPyfW6SX4wg+vOtr36RFGqSI7ufs+nxeeysuE2P+m4AGnEbRFbBb9DdlffGdWibjro/F5qzZIXvW/bXfel8/XmJ8nt3nxZ7Nf4VUdM/LKvhVS671fZh34qzHW/M+OFdp70tTf3JVT8In7mqMScf/tlbHtHleviKGKkGWX2aB+VvxoRSxCI7Jj138nR5c8YGtb+1V8wtffyL6wOq/3bASLrrdVvauJ7c7DD5GEE/cbO/+MeSy1YRxpKAzFT036PtJugDDiLOLOb+/Y2FCeNAw3FV3W5If5yyLtBggnziK+v+ifDeVIQ7Gva9XffrTdVQEAAAAAAAAAAACARgjOTAJRD85MAtENzkwCUQ/OTALRD85MAtEPzkwC0Q7OTAJRD85MAgAAAAAAAAAAAAAAAAAAAKCxccmYrSVfXRppLwAInsSn96eVflpwb13GOB9vAkD9YktP+q7s+0k7Bg6s0y8oQcQgkvimJ43Nfdk1b9tTrZ8VtZxxRCf9sFN4AGhoFOlJne9KrLzk4V6iJrGWM47opB86hQeABkeRnnTorb9PEjs/EOub13LGEZ30g9sJEEns6UnX3PzTIHEov/+x2s44opN+IGIQUWzpSf263bn6nertgz+s7Ywj9qvmEDGIIPb0pPL9p1YnD83LmlPbGUcQMWgc2NOTUuI/a/2t+DZG1HbGERex9xQeABoFlzf7v/LjHxsl5zOOuIi9p/AA0Dh4vm3OgZlmyfGMIy5i6xQeAAAAAAAAAAAAAAAAANHMwO6R9ko7tKkAABCdSURBVACAEOk+MNIeABAELD3pyvSzI+gIAMHC0pN6XhU5NwAIEik9KTVjcITdAaDuSOlJmVk4gQZEITw96fqmkfUFgOCg9KQ+OaMi6woAQcHSk4bmjo2wMwAEA0tPGofz7ECUMyEJvyEIopzb2kbaAwBCZOLtkfYAAAAAAAAAAAAAAIDow/wpKi+dsoOcZaqmaUXhcMc2X7hnBqcR3p9ilUQ8bXqQs80oLnaFU2o0X7hnBqcRShGHwqwwS43mo1KrVuG1AaIZOu3IFVeaXdLlDiG9cD8+unLlqhvlIWufyslYZ/wyMZ2Z5Koes7Jk1ffudq/UHlmStXTZACH+px0ynm6u9Q6F5jtntf5wUJsizcdKreMT2gS3XnAaQqcdueZvfiZty9YU/sIdE79r5JC43X34iL151aX75l8g+JlJLq3spxZ5C90dPFIbkp4/YlvLar20pL3+8Ko2lM9yUYqJ9I1Pmq82ESe2Ow+ZJ4CwbicOTBNiilZhPvHIpVR7VYjXRnfm/ecdSxVip9GPzkxynTwlxD+0h/nYTQd1sR3S9EvxI0bDvwpS+Cwu9ytAmlRnzVebiAGQkO6Jn9DGm088ctlQsLCD791n1sXGY0E3fmaSa4lemqbt42PF8S59dZnq7xAvyn1LnCr4UZplgnncx8FpvI7mg4hBnZBEPEO7x3zilcvhHgnJu47w7s212cafBYX89+FNEYvYjnzsiaRzMzu/Z4hYDCxpMz75Ccmq8nbCmg8iBnXCUcRCDD9SlrOX9y9xX4m320Q8TdvIx47+SH84boq4TdYPu86VrSpvJ6z5/r1VQMQgcLynHalEPHDBcP3dnXaW+cTzsdYq9z1xuSTiY/oldaP2HB87d7/+MMwUsVh3Mn2xbNXv7YQ5X8eql4x/ABAxCAzvaUckYuPTicri4ieF+Dzn9cwTg7IOG/28H2t9kTN3555K41MHJmLtP6P+m/W14GP7Jc3c2Sldm2OMeTe9fQCe0Hyv7uhR3q/IEDHNRyWdblqK81zgjMJ72hGJeKr7pb6X/nztV/EJX39j9rM+1vrmrpyCT4yrMhNx10fj81ZtEHxs/9t25335fE2mMaTNiz8H4Ak7g+mZllVtfzZETPMxr4TomZQa5jCAMx33Gzv/jHkszJrr1TK88wHgLOLOb+/YGF57ffpeFt4JAXAW8f1F/wyzvdS0/mGeEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCMZGD3SHsAQIh0HxhpDwAIjSvTz3YXXIO8VVQCIBroeZWncPWvhK0EQBSQmjHY+DPkmj69r20+tAMvARAdZGaZvzs8rFlWu+z45Ot4CYDo4Pqm7r/DR+RkjWwtlwCIBvrkjPKUbhj96zG+JQCigKG5nnO4Lk++8aakkXIJgGhgnPeaO/5mIW65VS4BEAVMSLo00i4AEBq3tY20BwCEyMTbI+0BAAAAAAAAAABQT+DERxDl3DEpJ69ppJ0AIZPvPtl+mPmkU7Zz5zu1O9UNrrgwu2UxVXeuyG9roaPdwlpyss4vuGvylEx1W72syBu/2uJcJw+cYxBG/O3+VM1DiuxzQKsMC/l5xQZ3m0+mTXfuHAERzygudtWXiO/R7Ovt1cX9t15FXFuc6+RBxEWsb1Hxyh76Q3/Z54BWGQy2pKT8rDqMjoCIdWbVl4hnJtvrGkTEARE1IjbIvdj8U686sLAlJZGI2Qv37Ng5c0uuMF5o753Xd/4tbYy6Jgtis++TltF7oRD3LxIPaIt150uzS7rcIfgIV9mDE0seepjXnV+1yHi6eo00M1mzcFWPWVmy6nv3E6+IH1mStXTZACH+px0ynm7ONjbwvqK8sid4qxBPju7b7IYZwi3imIkfPSAteO1TORnrLtELce7XwGLemOuuMzxQrIihipBll2ywflb8KM4sQuXrY9evkH1hHtDaHh9duXLVjZIrLAbki2oXVNG1Zj5ntf5wUJsi2XDafRlLxF6fmZrsPpdrj/ZdvqLgsQqh3FVHVElJJGL2wj1bW9qxPE3fjw2569M2Fs3VqzZVPT15Rby0jN9kiNSS68Xa5EThmr/5mbQtW1P4CFfG5lvTuj+byOt+a1znFhuzUB1ZY2HWyn5qkbfQ/cQj4iHp+SO2tazWS0va6w+vakP1DdR2Ze6pfEhqHVDwu9//od2CRFPEDyw5730pBnvzqkv3zb9ALz1XvCZWfw1sxVs7F+/fotcZHihWxFBEiOySDepH8aM4U4TM1hd8RGx5QGuLid81ckjc7j68H8WAfFHtgiq6NDOJmGw47r6MV8SWz7RKhc/l2vbnd8Tt7DJOvauOqJKS8rNSdC5yP5lliXiwu9DpRT3+TbQr9Ut4wUtC3CotY7oWs3hrrjirq+78gWlCTNEq+AhXhn4JHKXdxOvKtcNCXLtFmpmssTCfPCXEP7SHuVebDgqReEjT/9E+YjT8q0APVeELiYZXR3hr76N6vPZqDxoiTtl/YJM887xjqULsNDzV41Flj5F1O6FYEUMRIbLLbFj9pPjN8orYG6Gr4/XWDj4itjygtZVqrwrx2ujOvB/FgHxR7YIqujQziZhsOO6+jFfEls+0SoXP5drLYusfxStb1bvqjCIpyf3pxOuCm9VD39xdmPiGrvDmeS2EWN5D2O6KKiv+9ObRCZ3e8twLPaGN5yPMuk3aM7yu/7Nvi7FL/yzNTNZYmJfoD9O0fZJXx7v01V3V3y1clPuWOFXwo/DcDyYmteCt4+YZnd/RX80LJ/ba8bDPzFlmtAu6GY+OIlasiKGIENllNqx+Uvy8IrYitPxCs9XndsLrAa1tQ8HCDtJLhxQD8kW1C8roWjOTiMmG8+5L8Htit8/WKhU+GyKuyRfDcoVyV2vBnpSUn3dQ513Bzeqh9/x7qHTfI+rX7t3d7MvYteiNfXMPXdDP4/wM7R4+wqybrqXxOvHKMVGR/L40M1kjzDCL2I7cqxNJ52Z2fs/8QGFgSZvxycZdoPtNzdGbeevqD7yzFGo7tGvkiZtrs40/CwqNx1pF7LMihiJCll1uw+onxY+L2IzQ7p5CLWLTA7bywz0SkncdkVyhGJAvql1QRZdmZvfElg3n3ZfgIjZ9plUqfGYiVu2qM4qkJOnTCZuIT35oSPzgy/q/xUL7Mq5blvHazHNOLubO0wgKH9WJe9MXrxkkz+xXxNO0jdyr0R/pD8fN5bbJ+mHXuUaduYGnkj7mre4rotlaVdo0ea08c4n7KrndeAxMxMxTQhEhsstsWP2k+NlEvNwlHETMVq6/mh4py9nL+1EMyBfVLrCZrejSzP/WX9o9IrZsOO++hJOI7T4zEat21RlFUpKziD+pMd5jG78e9GmG/rp4Ql5GWrsi8Vnb2BTuPI2g8FGdENUfVHaQZ1aK+NhYITZqz3Gv5u7XH4a5t3LdyfTFxt/CXP3ubojhFbX2TtBfvO5O6GC+sWs9sWaaNPMq9/1quVFWiXjZeR4PFCtiKCJEdpkNq58UP5uI1xXorSP9iZjWNnDBcP2dknYW70cxIF9Uu6CKLs3cseolQ0xTuA0/u9/K94ZGOIpY4TMTsWpX64z86URlcfGTgoV+w8q4Q6M6JT+u3+vlLSzdtlsW8QTtQ3GqJE5ynkZQ+KhOj3bVgVR5ZqWItf+M+m/W15JX/ZJm7uyUrs0x2t9Nb2/2K0yqnjx4/iTBW2NWth85fn1civsjtjklZdLMX+TM3bmnstosq0R8SHu7YluMekUMRYTILrNh9aP40YooQhNyFpbuyfUnYlrb5zmvZ54YlHWY96MYkC+qXVBFl2Z+dUeP8n5FhojJhnr3W8cn+HzeKBQiplUqfGYiVu1qnZE/J9bpJbisDq862vfpEUapIju5+z6fF5TKy4TY/6bkPI1g4aNZ9Fv3v/jOrBJx10fj81ZtkLzqf9vuvC+frzE/T27z4s9mv8KrOmbklX0rpNZ7v8w68FdjrPmfHSu096Spv7krp+AT97VEJeL+2ytj2z2uXhFDFSHLLrNB/az40YpYhEZkx67/To4uecDWtvar+ISvv5FcoRgwX1S7oIgum/mZllVtfzZvJ8iGcvcT251n/8ESm4iZmuw+MxGrdvU0;4.blob,1.1,1592.wf3Wwz9jHkttGEcaCkPxU5O+bxhjtUU3Upxmu+oc5s5v79jYUJ40DDcVXdbkh/nLGsha4xTxaberzmG+v+ifDeVIQ7Gva9Xffqz1c/4w0ThFfBruKgAAAADqBfdHbTPwi6wgarnvIfNPWtc+tXSsC+H+GnPd56uHBKSgE2MkX1Sz2OqcvQ8Sp//gtXkQyg6S9/WyDjvl8ye4CzeE88iYyIu4HhKQgk6MkXxRzWLVeb9j4ex9kDiJ2OZBKDtI3qvX4bURLoYf8/6k2oaSyUHPYktPiryIRT0mIIXXFw7b3gBH1IGA0pjClEhF3ivWEW4RP1Nyibf41sKgZ7GlJ6mSYCh9hSWyOCW8BJ6oRHbrLQHJMTGGefXLF2KEaJJ+n9oXNotljeoojckaoUyvCUsiEIuuygMWcYJiRVD6FG91EDFbJSVchbI28eHr1vBSzf//T6rSu7yo0pNUSTCUvkIlx4SXgBOVmN16S0ByTIxhXr2fUSYGLL1/rNoXmoWsUR2lMdEIVXpNWBKBWHRVHlDE2U5b1ghah9TqIGKywRKuQlibECu/s4a38nx1XoEqvctClZ6kSoKh9BUqOSa8BJyoxOzWWwISzadK5mHJRplav9fnv+zHFyqRNd5qv51QpdeEJRGIRVflgZQS5IGsEbQOqTWg2wme1BX82sQAnmFS9LbNnLBZU6SuKdKTVEkwlL5CJeeEl0ATlZjdektAovlUyTw82eiTdPfVQOmLVSJrwlHEqvSa8CQCUXRVHkgpQV4sawRbB28NSMQ8qSv4ten/hJrQ+HZX28wJmzVF6poiPUmVBEPpK1RyTngJNFHJJwT1kYDE5lMl8/Bko293bPHrC5XImnAUsSq9JjyJQBRdlQfSF9E9sEha0Dqk1kBELCV1Bb828Xft/9H47Ddt5oTNmuJruor0JFUSDKWvUMk54SXQRCWfENRLApLg22FL5uHJRhcWJQ/154vwuRL7zqwQsSK9JjyJQBRdlQcqEUsJTR5oHVJrQFdintQV/NrEyxr7XO3kLJs5YbOmELEiPUmVBEPpK1RyTngJNFGJ2a23BCSaT5XMw5KNHkkadVvWjX58oRJZ463eNCZeZ0+vCTERyBZdlQcqEfNIeqF1SK2OIvba4Eldwa9NnEr+hzV8eOxsmzlhs6YQsQJVEgylr1DJOeEl0EQlZrfeEpAcE2OYV9Ob/Vuk/u7XF6l9oRJZYwlcVhoTr7On14SWCGSPrsoDlYh5JL3QOqhVtV6O1wZP6gp+bUJspvvgSz1vpEU3m05V6V2OqJJgKH2FSs4JLwEnKpHdektAckyMIa+GP/SLl4R4MmeW2hc2i2WN1VlpTLzOnl4TWiKQPboqD1Qi5pG0sNZBrcr18nk8NnhSVwhrE6/Q69cPL3hOCO2ZZMvnUKV31RX60nT9fX26MSUghWuVdp8b59fPw0Mwa3si2bqkLLnNU+jVMkwOyURexA2bqhKeVap8hoh92L7f89v8x5d6rut9+l4WNpc4kRdxw6aqhGeVKp8hYh9af+T+IP2LF0Z5alLTcOQEiC5i3J/GN/HzA/1++P9vlVsuqAxNrAAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.296,1.0;4.sync,10.6492309292;4.rect,1.1,2.42,2.59,2.77,3.131;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.101,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.234,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.557,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.99,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,2.98,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.231,2.49,3.335;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.231,2.18,3.338;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.139,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.139,1.9,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.234,2.18,3.332;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.229,3.398,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.234,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.234,2.49,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.212,2.39,3.297;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.231,2.27,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.231,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.253,1.8,2.70;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.326,2.86,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.289,2.48,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.310,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.310,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.326,2.18,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.326,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.329,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.329,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.329,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.326,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.367,2.26,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.364,3.145,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.424,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.422,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.421,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.424,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.424,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.424,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.421,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.419,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.421,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.421,2.48,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,3.118,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.421,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.462,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.500,2.18,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.500,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.557,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.497,3.418,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.537,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.535,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.554,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.573,1.9,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.576,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.576,2.10,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.576,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.592,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.593,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.592,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.121,1.1;4.blob,1.1,3440.iVBORw0KGgoAAAANSUhEUgAAATwAAAAlCAMAAADodaXTAAACx1BMVEUAAAABAQEzMzPDw8P39/f29vajo6N3d3fU1NSgoKDQ0NA4ODj///8SEhLr6+vExMRJSUlAQEBLS0uLi4vT09OsrKzIyMhYWFggICAREREyMjL9/f0bGxt5eXn6+vqQkJC8vLwoKCi0tLTz8/Px8fGioqIYGBiYmJjc3Nw0NDRsbGz5+fkrKyu3t7f19fX7+/seHh6qqqru7u6enp4QEBCkpKSxsbFPT0/W1tbFxcUxMTHk5OQtLS3t7e3q6uqtra0mJiZbW1vMzMz09PTl5eWZmZkTExN1dXXo6OgaGho/Pz9dXV3GxsZCQkLR0dE8PDxoaGg3NzfBwcHp6emTk5MMDAwEBAReXl7KyspOTk5ZWVnX19cHBwd6enpERERUVFQVFRXS0tJjY2NRUVHf3981NTW/v7/V1dUUFBTs7Oy6urpMTExVVVXi4uIPDw+AgIBDQ0NcXFzY2Ni4uLhfX1/Hx8cqKipkZGQiIiL4+PjAwMBgYGAwMDCampoODg4nJydISEhiYmK1tbULCwuGhobw8PDy8vINDQ1FRUU9PT0lJSXm5uY5OTmOjo4ICAiVlZUKCgp8fHyIiIja2tpHR0dBQUGpqanCwsIfHx8JCQmurq5qampSUlK9vb1NTU1QUFD+/v4FBQWcnJwGBgaFhYXJycmhoaGEhISMjIyWlpaHh4ckJCTv7+9KSkqmpqZzc3OCgoJWVlYCAgKUlJTh4eHe3t6rq6scHBwDAwPNzc1ra2tvb2+NjY2KioodHR2Xl5fg4ODb29thYWE2NjaSkpIhISEsLCz8/PxpaWl/f38vLy+wsLCvr68jIyMpKSl9fX3Ozs62trbn5+ebm5tXV1e5ubm7u7s6OjpaWloZGRlwcHDj4+O+vr54eHjPz8+ysrKDg4MXFxd2dnYWFhaBgYF+fn4uLi4+Pj6dnZ2lpaVlZWXLy8vZ2dlc8URAAAAHB0lEQVRoge1a+V8TRxQfayIQpxEDWjSaKigVEaoUUUTwCEIsQrQo2ioBtSiiiIoX2gKepcXiBVVbjyCKbUFbb6x49FC0qGhrq1Z7195/RGezx8zsDtmYTxSwfn/YfbyZ9+bNN3sk3wcAjzvatXQBbRdPtddoOzzcJby8lVarg49OdUpH2JF2PK3v5NvZ4DD9/JXzXfU5hbeX0vIAunR90FFnEe6Q9wwMEM1uAfLZhI9YlzXPGbobeygsT6DlyetpUo1RXVcFz/ZSWgJ6Bwb16RuMjOf6oUMI7IyO/UMHhIU/b6CsgYOCIl6IRMbgqCFDw6OHISsGOkDnGx4YGzdiJD06arQ5fkwC7ZPyYfjoEi3aqLEAvAiTuL/H0fdXckqof6KDPClWx+ezAjAenSyOabg+7MPrYh+Y8JImdeIkKoKFtNTJCktAgn7Ky69MTZlGkwfj020ZwaSVGTM9Y4YljFsqddzMDO9XUUSWddZsq9VK5cuekzN3ni53Pjk6z5i3YOGifED6cD6CPJhjWBwbjazRS9BhKVxGji4vWOG7cg5HHo59zfp6KMpXCECw1TpYIE+qD/vwuthXpM0vXhWxmopgwWBeo7AErF2H9lkEh8jIEymWLL/1iMFk2J1b6g0ASuCbnFd5MxTDpQC8FZhFji4PAWBaEkwgfTgfQV4pqn8m3IAuVYiug7f1ZeToRv0mbrQjHbu5QJqwRSQP1yf6qEoF36CtaQCUwwpZhALvdFBaArYN4o7bJ8nI2yEMS9bQd8vKynZo30NLcU+m5XCnrCQBmfpduwvlBe/pGoTulgDSh/NhOJ550+zIVxmzF1Tp91GZ91cD4ZlHxjLII+pzRp75AHfUvy+LkGO+pkRhiej3gWhR5ImfuWTF8k+ND4WlAmCGrCQRNdW1ppwNVMEH7YcMWR/R5OF8GPwLY93H6OAVHnnYNJZKnIu2yZNHxjZDnlCfE/J2wP7cKcVHFiHHspgjCksEf+VxOHoMOCHv+IkQDidVyQOgbkOUpogcDTyFDnto8nA+DAd5VfZP0DHSfDrnEJ12P9omTx4Z6zZ5IJy/8upVyNt2RmmJWFuLbrKztbsBSC/YxG2xGfLOnefeSz1kxY35VJ7PK6UOvTXgZ+Ro2Cxulzx5og/nw/CJqUJvF/7LyMTjxs/pzF+koifIQW6UjHWVPKJSwTeCf+bZnJN3wX5RYUnIjlsy9/B0HaJoaUO17ZKlOfIy43RJJX6m4fRSSfByxcJsMt+XmkbDwSvmGnL0kr1nuZ8RDiB9OB9Bnj3fd3JEe4d91bhEVul27a7ihbmOty0RK5LHvUVjrdbeZH3Yh9fFvmuasPLFsflyumVouq60MAbeMH/1dSZn7VxUcP1mc+SBmhHrglYskC3Vrj42dCpFAJjwzZzab28BcrRdU672xu3zBipCykeQ1ys9VRt1x2FHrr8pr7TC3+S9ynFdErEieeP552AXsj7sw+sSvludNPpzhSrkDf1OabV6nLmb1tIltFVkXW6Y0dI1tFncs3zf0iU8wRO0IrBE65pHXkXrR/AahYspWidGP5Jy2hYyfpjPG5LwTIjWGLaIC+7lHyypaTIoJMuWRh5f6eYHiel7hT9LwjMhWkuo26r89ueaQjzSag2tdqhpMrQa8sRK87RWDmcfJDYz3Jd2sETrneGTml3UeUkIBQdYE1ofeWY3gvfuIoVnHfM2O9EoGE4FdCzIU+K7QB4hZDPE8h9L0Y/KZGOiGxvwUJuAIA9HiHuzwZ+C9q/U360AdHOgGP5MCM9YtCYR9wt/di6gY0GeEt9F8iQhmyWW/5oaBRLi71FqWGWZA0fYFoZn2gQkeWKEtDcbrL/doCvvuk3WHCiEh7mTJMwQAo5UnaigqgjoWJpn3LZYyGaK5QZ4qTGCku7El00G28LwTJsgz8x9KpVUhLQ3GzwJjv0G7h+TNwcsl9XIK4LJvKEioGNpnkWeJGSzxfJzRv5TxLjg0DNDurEtDM+0Cfi3bSMVIe2NI+98HtgcI28OTN2oRt7v8A/Bci6gY3GqOfIcog5bLL/TMFu2rKu3rWfaBHla7lO5SkVIeyPIo5sD/n+qkXcS4jeyMwHdRfLYYvlfFhPVRnT9tvVMm4B65pXJ9kaQRzcHjm9RI6/K9DdvqAjoBHmEpK0gjymWj7KXNJlHUsu6ett6pk3AIk/aG0Ee1RyoC+1PidEM8sC4jfxZRUAnyBNH8ZdkXDBLLA/ocxSkTfmnUrm2OjzTJmCRJ+2NII9qDlyEwygxmkXeffE6ci6gE+SJo/jnGVGwUiyvi/4XXTO9NVvcIc8zbQIWedLeCPKo5sDpUnmrUYmxpltu7eqxx+gmFybVz3ryv5UM7IlX/mhXYs2pfeqT/ne4Vir/5wo2stMfciFtEcncg/4/h6kanq6FKsQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,2.41;4.blob,1.1,3424.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,2.98;4.blob,1.1,2804.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.134;4.blob,1.1,3188.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.155;4.blob,1.1,1340.iVBORw0KGgoAAAANSUhEUgAAAF8AAAAjCAMAAADFciZ9AAABy1BMVEUAAACgoKDQ0NDU1NQODg51dXXo6Oj29vaxsbEaGhpsbGz5+fkrKyu3t7f19fX7+/tLS0seHh6qqqrz8/Pu7u6enp4QEBBbW1vMzMz09PTl5eWZmZkTExMUFBTW1tbNzc0NDQ0LCwvs7Ozv7+////+6urpfX1/t7e3FxcV6enpERERUVFQYGBgVFRXk5OTS0tJjY2NVVVX9/f2AgIBDQ0NcXFzY2Ni4uLjb29sWFhYHBwfX19fm5uZRUVE5OTleXl6Li4vy8vJCQkIyMjIiIiI0NDRdXV0ICAi/v7/n5+f+/v5qamoJCQmurq5QUFDIyMggICCsrKz8/PwxMTHw8PCCgoKHh4dKSkqmpqY1NTVzc3NxcXEGBgZra2ve3t6rq6scHBy0tLT4+PhISEijo6P6+vo3Nzc4ODiXl5fg4OAMDAwbGxt8fHwRERFJSUnDw8Pq6upFRUUtLS1paWl5eXlHR0eMjIy8vLzp6ekZGRkkJCStra3AwMABAQF9fX3i4uK2trZaWlpgYGCQkJAEBAQPDw9ubm5hYWHZ2dnx8fGYmJjOzs6ysrLHx8dNTU0SEhK1tbXPz8+lpaWhoaEFBQWEhISGhoYsLCxnZ2e2utArAAAB3ElEQVRIiWNgIA4wMhGpjplIA4eC+SwsJJjPysbOwQlicnHz8PLxCwBZgkLCIqJiIDFxCUkpaRmo+bJy8gogQUUlZTGizVdRFVBT1wCbryKlqaWtw8Cgq6evbcDGCxQyNDI2MTUzh5ivIGFhCdZjZW2hSLT5NlYMDLYqdmDz7SFiDo5AS5xUnBkYXFyBprmpyIDMd/fwdCHWVCTzQeFv5eUNNt8HIibn6+7u7sMOEvPzF1ZRUQkAqpMLDAom3Xho/IaEgs13h4ipq4BBGANDuFeEQGQU2HyVIJVocs2P8YpFNj8u3hUEEhgYEuVBfgCbn5SckppGhvl6McBoVElHNj8jMwtIZgMxrweQyAGbz8ygKJeZS7r5XuZ59iL5DMjm6xYwuRU6pBYxMBR7lZQ6GKnwQNInDx8HREEZTCUR5pdrVrBzVKKYz1BVHSJcYwJk1NbVszc0ZgpA81eTShRYvtmrhWSPkAICzWhqfKtwG03Nb9Gupan5wwK0dzjR1PzslE5Zmlrgw+1NU/MZzLpoaz5TCm3N746grfk9vbQ1v8/Lu5+mFmiqENm4IQ84pTpE0tL8Cf60NJ2BYeIk2prPPJmmxk/pnEpL47OmeU2npfkz+ItpaTxDqwxNjQcAOLJLf+YJqUIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.211;4.blob,1.1,3200.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.269;4.blob,1.1,1636.iVBORw0KGgoAAAANSUhEUgAAAH4AAAAPCAMAAAAVg4veAAACHFBMVEUAAACkpKT///88PDw4ODisrKzIyMgmJib5+fmhoaEODg74+PiEhITk5OSMjIwtLS20tLTt7e3q6uqtra1bW1vMzMz09PTl5eWZmZkTExNsbGwrKyu3t7f19fX7+/tLS0uxsbFPT0/W1tbFxcUxMTFCQkLR0dHT09N1dXUeHh6qqqrz8/Pu7u6enp4QEBCysrLm5uYUFBT9/f0LCwvs7Ozv7++6urpMTExVVVXQ0NDi4uIPDw81NTW/v7/V1dWAgIBDQ0NcXFzY2Ni4uLh6enpERERUVFQYGBjp6enGxsZRUVHU1NTf398HBwciIiLAwMBJSUlgYGAVFRXS0tJjY2Po6OgWFha+vr4CAgLX19fb29tISEgqKiolJSU0NDRdXV1eXl4NDQ1FRUU9PT2VlZXr6+sKCgqLi4vy8vIyMjJpaWmwsLAcHBwICAiPj48FBQW9vb1NTU1QUFAgICAJCQlSUlLJycmurq729vZqamqXl5dWVla8vLwkJCT6+vo5OTlKSkr+/v6mpqZzc3OHh4cZGRn8/PwDAwOjo6P39/cnJyfNzc2goKDe3t6rq6ulpaVkZGR3d3dhYWF8fHySkpLg4OAMDAwbGxt9fX0vLy+vr69/f39BQUF5eXlHR0cfHx/x8fGUlJQEBATKysrLy8s3Nze5ubm7u7s6OjoBAQGNjY22trZaWlpiYmLw8PDZ2dkoKCiIiIiQkJBubm7R7ctyAAACaElEQVQ4jWNgIBkwMoEBM4YECxML6aYhAVY2YmTZmZk5OJmZuQbIeiDg5sGmAJ/1vHyYLC6QD/gFBIWE2UHikEAFSYiIiolLSIJYUhzSMrJy8iiycOsZFRSVZJVVQExVNQ51DbD1mlraOrp6QIa+gSFQ3EgDl/XGJqZ6DIYmZuYWllbWDAw2zLZ2zMygKLUwsndwdHIGW88k7uLq5o4si2S9h6eXm7ePLwODH7d/QKAJyPog3mC3kFAZoGyYhwKDpHh4BC7rfSOjjBmimWIYGGIFbJCD1y8OKBnPJAm2PgGmDzPwGT0SGRiSmJIZGFJS0xgYvEDWp2cA3arKlAmUlmfKytbJATJyc3N583Jz85FZUBCUWlDIhW5BEZs2MKCLwdaX4LHeEuRWplIGhjJOBmjcK5UDrSipqATJVxkxVQMpPUi8MdUgseCgltO0zqwexYKGxiZ5m2ao9bkErC9mcmNgsOKDWS8IsaAFJN/aZgei2uPi4jw64uLYkVhIoL1eobML2QKBblAIkGJ9WQ/M+t6+OBAAhTlDf2jdBKgObCkfBCaqtTMwGDJNArEloiBiMrZAYjK69TBZbNZP8QDGUQPI+qqp04CC00HSIo1JM8TY8Vs/szNbvmGWWC2IHc80e44jMLdkNc6dl27EJI1qPUwWUewgrJ9fURDtaAVO+UKW8UnpdfxAiQULGRYtXpKP03o+kNlLl5mYLl8B5q9cJcgRCdS4coZVxeo1U+VRrYfJIgpdhPUMc9TrvNeC832t8DptfwdglCqvB+aGDZ0bGXCBTY2LcMrRAbA6DaTt1tqbB9L6RW4rGQD8e4WgqjExqgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.305;4.blob,1.1,4644.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.381;4.blob,1.1,2864.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.402;4.blob,1.1,1916.iVBORw0KGgoAAAANSUhEUgAAAM4AAAAPCAMAAACbdQDnAAACN1BMVEUAAACAgID///98fHyLi4vT09M4ODisrKzIyMj29vY8PDwdHR0REREgICD09PQODg4oKCi0tLTz8/Px8fGioqIYGBiYmJjc3Nw0NDRAQEBsbGz5+fkrKyu3t7f19fX7+/tLS0seHh6qqqru7u6enp4QEBCkpKSxsbFPT0/W1tbFxcUxMTHk5ORbW1vMzMzl5eWZmZkTExNERESDg4PJyclgYGDr6+vj4+NBQUFoaGjo6OhCQkLR0dF1dXWysrLm5uYUFBT9/f0LCwvs7Ozv7+/KyspOTk5ZWVnX19cHBwd6enpUVFQVFRXS0tJjY2Pp6enGxsZRUVHU1NTf3981NTW/v7/V1dVVVVVDQ0NcXFzY2Ni4uLiNjY1aWlr8/PzQ0NBHR0fCwsIFBQUICAgCAgIiIiL4+PjAwMBJSUkWFha+vr7b29uGhobw8PAPDw8nJydeXl7y8vIyMjINDQ1FRUU9PT1dXV0cHBzh4eGBgYF+fn6IiIiVlZUKCgppaWmwsLAfHx8MDAwJCQmurq5qampSUlJQUFDg4OAhISGhoaGXl5dWVlaWlpbt7e2Hh4cjIyNKSkr+/v6mpqZzc3Pi4uKMjIwZGRmUlJTe3t6rq6vNzc2goKClpaX6+vpkZGRNTU0bGxuSkpJ9fX0mJibq6urHx8dMTEwqKiotLS1/f395eXm9vb1ISEgEBATLy8u2trbn5+ebm5vOzs5XV1ckJCStra0BAQFiYmIDAwPZ2dn39/eQkJBubm6cFO+YAAADH0lEQVRIidWV+z/TURjHn31NbMxlEuXSkGvEhBjKXAojEUKYS6hcugkllxRCyop000UqXaSrrn9c55xt33POXtv0w8qrzw9nj7PX8/k87+/37ABwiCQCkZNj3IikztZ2NwmbHJhhKRdX46dEJsdyc6C1u8La7j/C8fiLIazs4Xh6osXLW+mz2RcVW/zQ4i9sReu2gMCg4O0qrgoJVYbtCEdFRGRUdHDMTlTFGo8YcDi0I26XR3yCGiBR2K1MSk7Zk8q62FcastWQiqZBekaAcybBEV327stC+9pM/HV2Tm44qFPy9h/IzyjgcYT4wkSdL1sVxRbrDmqCcEDJoVJd2WHUUS6vqERHzALH3HFEK6mqrjmKcWrr6vUNro2sC1VTM9Exds9XLo8w4YhpLa1tx5NzMA51OVESCer4k6S3IL89Gzo6uwBOCVEWOKfF4UyV9AyaMF04iwPOAXQL5/EuPWx4oiauo8UfRfQIaoTTC30X4GIf60IVYXzHOosX1G/GMaddShkAKMU4jItKGBwK66VdjaF4Hb5sgTMi4piq6Cto3hHZVRSgx7MKoxwOmWiI64AxVyXaVBCccQk4xbIuVNf8idxt4IhpSRNg+u2wLpNaYYrp8rturjicZhHHVE0bn+ENU4DC+DTpzYYnusl1zBhuqcpv8zjUhcraYbPAIWmzc2Yc1uVOfSXbZXw7WPN99nDu3iPPsNcGDvvbMXV430fLGI9DXajWOWxiWtIDMw7r8lCz8Ijp6shF15tb7mOAwtYBHG8DZ3IcnUd4AjxOQrttnKAKtDjxONSF6g8OG0l7WoJO8QzGYVziDN2LHs9oV9bS8xdTxXo0wsv6icRBjS2coiV9T7d0YZnH6RFepVZnWccZNLxukGqFQBaHutgXvtmm5XIvNm1Y9uZt9Sy52UQXhc88rOS9I3cQzOHkkFWP9x+K8J+jNa0fP9nCgc9fOpVtVcDjrNVOB+QvW8dZW5yVrdaNq1gc6mJfacYD6MKlpTovlH0l/3fMLt9ivqMT5fWjnzT9NKysa/wfyaVmoydwpLqUvzZ6BEdqRbcGvwFyANlISTkzhgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.438;4.blob,1.1,4368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.515;4.blob,1.1,7044.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.649;4.blob,1.1,1208.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAPCAMAAABqUpkvAAABrVBMVEUAAACLi4vT09MREREgICCsrKzIyMikpKS4uLiKiorq6ur19fWtra0XFxdsbGz5+fkrKyu3t7f7+/tLS0toaGj////o6OgSEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eWZmZkTExPk5OQeHh6qqqrz8/Pu7u6enp4QEBCxsbFGRkZqamr29va9vb16enpERERUVFQYGBg8PDynp6c2NjY4ODhVVVX9/f2AgIBDQ0NcXFzY2Ng1NTW/v7/V1dUVFRXS0tJjY2Pe3t4GBgZlZWUxMTFeXl6IiIgkJCSPj48iIiI0NDQHBwddXV3y8vJCQkIyMjJiYmIJCQkBAQHf399/f38CAgJ0dHRQUFDW1taurq4ICAh+fn7a2tpBQUH6+voWFhZKSkr+/v6mpqZzc3Pt7e2Hh4evr6+0tLTNzc2rq6scHBwwMDCWlpZNTU18fHzb29uXl5fg4OAMDAwbGxuoqKhFRUVmZma7u7soKCjn5+cEBARpaWl5eXlHR0cUFBTQ0NAtLS3Pz8+Dg4Ps7Ozr6+uJiYl9fX3i4uK2trZaWlqNjY3X19fw8PDAwMCJwP5DAAABl0lEQVQ4jc2R+TdCURDHJ6qXRKWuvYVkK8pDWVpU9mSJsiQR2fd9J/v+N7v3PZyKnOPwg/lh5nvvnPOZDeBr46QkSfzEUrnfJHn8P6jwCUIJ0oTpogwiM8USaXqWDECOEMomPzm5eSTkF2BXqFCq1EVYFCPGSEJToi0tK8cQVFGp01cxEKSqNhhrAGpommIgUEtq1qF6AJO5obGpWYCfFtpqo2kaK3txi9GRLcUQpwugFbUxkPaPBjtYiAF1AnTZsOp2A/R4UFHsOJxeXLEP9QOlwK9UNMBAvImQwSEf+FXDRI7wtXgIbixkdCwQCHj1OhYC4moGEkiEwHgQJkKTWEyFp2WWmXhIhN3O7HsnjiQQjbmuYI6I+QXSTTzEuegmtgRU0A/gQMtJICBYiaySKLVit8ZC1OtsbmNzC/ttcp2d3T3lPsRCyHUiNH1AtCn38IjE4/DJKceMJER7kG+i6QxfR3ju2eWEokBdXF7pRfY4iJydlUe06/qGXfHtnf7+YVPG6MeI+CmKRafoWfvSCG+L/aX9G8grMmBDI+3eqc0AAAAASUVORK5CYII=;3.end,1.1;4.move,1.4,1.3,1.2,3.252,1.0;4.sync,10.6492309344;4.rect,1.1,3.211,1.4,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,1.3,1.8,3.145;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.25,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.23,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.41,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.41,2.26,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,2.82,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.80,1.8,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,2.80,1.8,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,2.89,1.8,2.59;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,2.82,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.82,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,2.79,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.77,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,2.82,2.29,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,2.79,2.29,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.79,2.28,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,2.79,2.48,2.73;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,2.82,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,2.80,2.48,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,2.79,2.38,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.77,2.68,2.75;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,2.82,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,2.99,2.39,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.115,2.18,2.75;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.115,2.87,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.251,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.251,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.248,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.248,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.251,2.37,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.251,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.253,2.27,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.250,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.251,2.68,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.253,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.269,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.307,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.310,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.310,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.310,1.8,2.26;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.307,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.310,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.329,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.310,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.307,2.29,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.307,2.48,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.310,2.58,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.307,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.305,2.59,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.324,2.77,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.573,2.10,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.348,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.348,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.348,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.515,2.27,3.144;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.383,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.384,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.383,3.137,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.405,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.402,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.402,2.76,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.440,1.8,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.443,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.443,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.443,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.443,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.457,2.18,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.576,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.573,2.18,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.576,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.573,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.573,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.573,2.56,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.592,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.595,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.592,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.590,2.48,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.592,3.228,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.593,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.609,3.178,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.609,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.652,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.650,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.652,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.1;4.blob,1.1,8064.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;4.blob,1.1,8064.DE+rQaSoOhx6WV91iLIl5o/BVwxo++MhVk6jx3QvGXah/wC7Oq4aXjNi5Cgh/mlssP7sYD1FXjm0uvuwM5R4ZYYPK0rVtFYl3X4geGSC7tkKx0+YWNL0p4LHoyhiW/Hr80p2ms/9H1qZrjdOM3++OnTAvrMaKcexe8BD/8ip/fL8EJEZ9oz4XmrJKDQaG0P2ZZnSLMeOK251snI9HG0vxLlfiIeNYyyKdq0iXkmRP6d4zkCjiOV3SsUX1q+91/EebDUkVf4xivg6y7nlG5cN6DMw7/JBIcYlaNV0o8nV0J5zmX2YmdP50IwWD3R6WV91tCjdI0S/sjnN5lbOs3Iyxt+6OLe9/4BAddww5cabbr5ltNkaftz8sc54WojJ8xcsvKFqUQseb3rRjF5FRdZkC9t26N+s19oCHpmge7bC2g53Nlt+Vx2PR1HENmPEnvxmjXh1jMp76/N/7RpXx4+jeNtzR09b1vbrEJHZasgZ0V5qURQajcagvpQBzfL2ijtaD5yvVMf/1oqVJV+JQ6V1LIpurSJfSd9ok6zriyL/2nrsPWZlwM6qXA3i2qLris0x+vJ1lnPLN2ZeNKtqdrfr9eMStGq60Wg1dOecsnefOZ0P3WjxQKeXXfK3goLXF+wzX5a3PNNcmrHGz82cNm4S4n7D/zATqI7b1wtRt8EwH1KusnZ8k2dmPM1YJ8R9Q6ero8hnxSMdhTjNGMQjK6yyV8p80bPFeESNJ+9Xthkf+RtUHUffsS5fY4JynIx3RZeVQsy2xtVHtqEZ0V5qURQ+mnM1KAOa5YN5Dwlxp1IdnYzJx9aWiZeb8yi6tYp8JR+cb47WO3B9BSLnGw2F+GsvJStaDc7qiuB1lnPLN9aItT8R964NeQYD0KrpRlNWw3HOlexdZk7nQzdaXNDoZZdYz2H7j5mtib8sKCjYmrvYzGm4+WdHYxmfj3i82wDzSPNF1cGyi8WmvPfNTf3y2vfu6xhEuWd8z7iHR1awV8o67najvxqPVcdWf4Oq4/orrL/fOF85TsarucD6mfdsqMgSOSPaSy2KwkdzrgZlQLPs00M47rSrB/3huXfatbxYiaJZq8hXss9LvtGU6mhw12NixYjfK1nRanBYdWwNWherOnbcKFaXhTyDAWjVdKMpq+E450r2LjOn86EbLT449bJLLl+//o4OVqvaf7f3m0B1iOI9fD7XlD/VZvpvfdfDgZIh95S+Z21s2GN36YJHg8ZQZtbI+BGPrMBXqpPRTI3HqiNwv0HVsfdb52gy3lZjm/VrXH2oyDZsRrTXbrEofDTNasgMaJaLzHMYXB0Lvvjlsnkbvt7Mo+jWKvKVXPSpcFSHuLeLGFR6t5IVWw0Gq46CoHVh1RHiDNrI9dONpqyG45wr2YeeOTsfutHigkYva73u2GL802xtvGS9xRr53DGXz2foC+aPx33Xw5Ca2xY8Feje+dHxOdvDzIxFVnBWB4vnrI4l5jM8f+5QR6N4Jf5HmZmhItuwGfG9gRZF4aNpVkNmQLPsY53DoOr4zcja+877cOMxHiXy6tCtZJ9C4ayOwVOOXXe2mpXX6pBzY9UR4gwSgVXTjaashuOcK9m7zJzOh260uKDRy/pelfe0Xtk8ucO6ebC+M7Gwywoh5hrX8vnMm2H+WO2/Hr7cOMV3lg+M62y+SDJeVgcZuT94ZhRZwbFSPJ4dhc7anoqHrLNmve7YbT6zPrG7t3KcjDfMf4eaHyqyDc2I9lKLovDRdKthZ0Cz/GOteZNyjVodzXZVin/3LC7gUXRrFflKfplnjrYwqDrE6G+re6tZea0OOTdWHSHOYABaNd1oymo4zrmSvcvM6XzoRksUvuo4bLxm3s91r9qwpWXpldZ7Vr/b8qeapcL/LkN1UdGrQmwuP292yynG61afT6Yc9/V9LefSNtecXdNQjbjBeGzQzZP5zCgyQZFppXg8OwqdtXWzeuRvrrSqY3L34wvvmVNVwI+jeB/kzJv9ZrX1fpI+sg3NiPZSi6LQaPrVsDOgWb6R237azYvU6mhnXCI2lVQpM9etVeQr2S6n/bQ3y+z3rOzIN1QcWWn9ZmfVY3XIubHq4OM+axSoIdiq6Uaj1dCdc8refeZ0PnSjJQpfdXTe+2vzZ8Nh7wy44yazUdj8svm5w/oJ/zvUJl3N13mvLMqdetEO32cOhpx52N/50J/n7176blDEBjOri3ddqZxxGZmgyOyssXh2FDprov8tFT0P+/7fMXhqzZEX+ynHUTzx7qk5eU9ar9v0kWWeNCPaSy0ZhUbTr4bMlGY5qFXp8mVB//+q/kyIGc8pUbRrFfFKiptaFc/5mf3/BDvyprz/8++ls+qxOuTcWHXwcT8tXymCoFXTjSZXQ3vOZfZhZk7nQzNaMvG/Kg/NmMsd6wNSh3XJ/LD8wmQN1/WWuIZLcvax414d0x+bNTdZmYDwPFL52djb2o5M1nAtBnwWz3BJzj4OuFfHuZXfJysR4IVlzSv+9n7wa4GEsbJZfPUgyc0eAAAAAAAAANKPDFGwelXCuKt9612j1Lta8yqRk6HTBakn5QpW9zEi1Ym5q31jqQ4lclxWDaQVETvNJkPBGt/qEK5q31iqwz0yB9WRkTiUs6lXsLIxSB2p2euuH/Wq9q2vOrkyd/x7fC+bh1Udkye+oH4HhdxLkdksNVpRNiOQMeiUs6lXsFJf6qHb664f9ar2rTcWtHmzuqmyl+ZhVsfDw/ffrUSmvRSZZqnTirJVAxlDCKfZFCtYqS/10O111496VfvWT6qzdJyP8r00j/rlBTOO3K6Or1POUkuvTMWdVQaid5pNtYJV9qUeur3u+lGval/f64668sV8L82jfmLXWeq3doRQzsqWXpmK6shEtE6zKVawyr5cHencG0Y/6lXt639V/s7f+V6aR70xywj+ai+dcpZaemUqqiMD0TvNpljBSn0VdaRjr7t+1Kva11cdm8r/y/fSPOorpjUpPaSOr1POUkuvTEV1ZCB6p9kUK1ipL/XQ7XXXj3pV+9aXma9PbrDUNrSX5mG+Km88cUdHJbJOOUstvTKVrUZf550kyBRSr2ClvtRDt9ddP+pV7VtfPrr1R21PEnwvzcN6R/f1kvHK+DrlLLX0ylS5aqLx/N3x+rI+kHRSr2BlY5A6UrPXXT/qVe1b//Ge2tzxzwtlr5yH77+BA43fKqE1ylk2S60yVc5I1O3a73gbBIDkArUvAKGA2heAUEDtCwAAAAAAAAAAAAAAOOGIWDkLQNbgUM4CACx0ylkAgEUI5SwAIJRyFgAgQihnAQChlLMAgFDKWQAAAAAAAAAAAAAAAAAAAAAAACC7OH/M2pI/vx16P7xVQdZSd8eMZtP+mDc45AHwVgXZgkM5+7PxF54068CBkdGFQ3WAE4hg5eyKsjWFV9z8j8Z3Ka6t0l9WequeUvGF9WvvdYJ5tTJvVY0LLACZhEY5O/3Uuurzf9pV7Kjjrq3SX5a8VX9tPUscs1xhyKuVvFV1LrAAZBIa5eyGi391kpj9rZizlbu2Sn9ZIT2O8o2GQvy1l+BerXRnpXOBBSCjcCpnv/v7rWeLDTc26KK4tkp/WSGro8Fdj4kVI35vNaVXK1WHzgUWgMzCoZzd/Ozpe98YPfOjSxTXVvJ5Iqe8e7uIQaWWzz1zcpXVoXOBBSCjcCpn82ds2lv6dG7N64prq646Bk85dp3vDS/m5CqrQ+cCC0BG4VTOFsz/d+PnxfOWASRzbdVVhxj9bbXv9Tx3crW9VXUusABkOv/Z9//yH/+v1SLXVqoO8lYV4oaKIz7rPe7kanur6lxgAch4LuqZc+Q8q0GurVQdzFtVbMr7P9827uQqvVU1LrAAnDiEc20FIHtBdQAQClQHAAAAAAAAIN25e+qlsYZ4+S9j45EJAHEinHLWM1d3edT8uWN5A/NnxWr9MfVVriGeabJvsnOrXrt7uvVpejGxbO4AACAASURBVAASSVjlrFcalR+2fu0wmpk/i6OrDrG1WPMxX712F9UB4k2clbOMscZr1q8dRpX55FEaZXWIWz70Oh6qA8Qbb8pZqY0lDa3clm9cNqDPwLzLBwVFXmj4Po21o7kxQYidZnV8uNf8c71xGu9RX3VyZe7496wDSWtLYwhR1SQorNTuisLxEyaWNLXEWWLsuOJWJ/uqQ0a5epJ5TzZ2ysnxWSaQfXhVzpI2ljS0clu+MfOiWVWzu10fFHyCcZ/1a8d1Xz8gxCy1OmSPemNBmzermwpFayvHMOn5VFBY0u4W1na4s9nyu+qEuL3ijtYD51vVQVHurh0vRo04d0WclwxkDV6Vs0wbKzW0clu+sUas/Ym4d21Q8HN2+kSHO0YeM64RU9TqkD3qJ5kX953Go4rWlut0rz7uTHuVXR0PC7HFeMR8Asx7yIpyuhKljbH50rYQmICo8aqcJW0saWjtbda1vuNGsbpMiVxXtOg5X2PHh2LecVEeXB2BHr7XHXXlixWtLdfp9i5ffEpw1nZ1WH1vN/oL0aeHCLzu4IrdJ6cY98RhjUDW4k05y7Sx8rPscpu+Or43mvoP3PGked1uMdyqQ7zzd0Vry7VWYo/heOHOq6OT9ZbYomdFoDq4Yvf5Wb1iXh+QxXhUzjJtrLxy5TZ9dayZm/eNr7HjWyH+fL1VHUusey9ddWwq/6+iteXVMba05fTgrB3V0adeBKqDK3Zfqix9Og5rBLIVj8pZpo2VV67cpq8O8x5tZ1/r144HhXjXsKpjT8VDVj2p1VFmvra5wbqumdaWV8fXmi9XdFTHH2vNW7FrgqJcVb7llZozYl0hABg65SzTxsorV24LVR29je3Wrx1LzB9LrepYN6tH/ubKoOooH936o7YnCUVry6uj+UtBYUm7S9XxRm77aTcv8r1nJaN02rdErHzrgYMJWCKQvWiUs0wbK69cuS1UdVzjV5r7qqPIqg7R/5aKnoeDquPjPbW545+3DiStLa+O5T2CwpJ2l6pDDGpVunyZ7/8ddpTOTf9iPlO9mrMqvosDgJ8Y1U+vGZ/HnsPBfRfEHgSAuBNjdTTocjzmD2udf7Q8Hp+HBCDexKqcXX/5x7Gm8J+dm2MNAUBacvD5WCO0GBWPPAAAAGQvDVLUN7lkTqYgffjBSTm5wR9nT0bf5JI5mYLQBP7tYBgF/v87uBEXpespeae2Pq2Nfl+4DNz6RoBjHsq4nrx4k5RpHHCfm/s83PeSQsdH0HUQVg+XCTQqKirq3sP80SB8dcRF6fojwxnF9kMIl4GubxTIeWjH9eTFm6RM44D73GKpDlLo+Ejn6nAoZyOgzP+furDVoSfC6jiv1LnN6zWn6xsLXseNvEe8M42eWK7/sOuyKkOqI1g5GwmyOqa1Kun2A6upcZqNSel66B85tV9anyus8t/GFSnDS4db9wxYX3fdr7Pv0fZCnPuFeNg4xuahG1c7y2RkeuXQ6u7Dgj5rqdM5O+P909hgHdKB3zSx+ermJl4dOmDfWY3UeRAyF7ZXnkGpX7Cwq4OuA4lWS50SNMrZSLCro22H/s16rS3QO83GonTdnjt62rK2X5uta4uuKzZv4/ryveRw654B6+uq+9X0/d9asbLkK3GotI7NQzeubpbJyHTy/AULb6ha1IJH0emcNfHEcEt2uc7gn/Jn89XNbVTeW5//a9e4Oj4PgnKhvXQGddVB1wGh1VKnBI1yNhLs6jjSUYjTjEEhnWajVrpe0WWlELMN3/c5rK5wJiDvV8JkIPu66n41fTsZk4+tLRMvN+fz0I2rm2UyMp1mrBPivqGKBEanc9bEE1dZouhv8vgVzuarm9vRd8xLf7v1LRrK3gCUC+2lM6irDroOCK2WOjU4lbORwF93vGepVEM4zUatdK3xDZBnKf/cqyNMBuyac9H96vpWD/rDc++0a3kxn4duXN0sk5Fpv7z2vfuKIHQ6Z2c8cbDsYrEp732lK81XN7frr7B+vnF+0N4AlAvtpTOoqw66DgitljpFOJSzkcCro5Hxo5BOs9EqXbca26xf4yzlX/jqcMmAXXMuul9d3wVf/HLZvA1fb+bz0I2rm2VSMm3YY3fpgkeVGDqdsyaeEAdKhtxT+p7Sl+arm9veb+3jlL02Mhe5l51BXXXQdUBotdSpwamcjQRHdYRwmo1a6Vrif+SZaf30Vh36DJzXnE73q+v7m5G195334cZjfB7xqY64Zdr50fE523kMnc5ZE0+IITW3LQj6QiSar25u/ucOx8yJQC60l86g1E2zeHQdEFotdWpwKmcjwVEdIZxmo1a6DvPfteZbbV112A634TJwXnM63a+ub7NdleLfPYsL+Dx04+pmmYxMD4zrbL4cNl7mMXQ6Z008ky83Tjmmjk/z1c3t6G7zzumJ3b311UG50F46g1I3zeLRdUBotdSZiKM6dE6zsShdP8iZN/vNat+7L9rqsB1u3TPQXXM63a+ubzvjErGppEqZh25c3SyTkelrOZe2uebsmoY8hk7nrIln8smU4G8Lo/nq5ja5+/GF98ypCq6dAJQL7aUzKHXTLB5dB4RWS52JOKpD5zQbk9L13VNz8p70v9LTVYftcOuege6a0+p+dX2rPxNixnNCddt1jqudZTIyPfTn+buXvquOpdE5a+KZDDnzcPCSyvnq5iYGT6058mI/EeLOSubC9tIZtHXTPB5dBxKtlhqApDPm8pWpTgGAtGT6Y7PmpjoHANKTcyu/T3UKAAAAAAAAAAASQpA60h04/oGsIkgd6Q6qA6QnsShn3VmF6gAZTvTKWdJiSoUjc6ml6tApNUkTqdFOApAOxKSclVpMUjiSS62Q1aFTalIPnXYSgHQgJuWs1GKSwpFcagVphzVKTeqh004CkBbEopyVWkxSODKXWrqz0ig1qYdOOwlAehCDclZ+JpoUjuRSK2R16JSa1EOnnQQgLYhFOSurgxSO5FIrZHXolJrUQ6edBCAtiEU5K6uDFI7kUitkdeiUmtRD0U72dXy7BgCZiawOUjiSSy2pI3VKTerBtZON5+9O3RffARBPSJUpFY7kUkvqSK1SkzSRTDtZt2t/1F+tBUC6E85pEEpNkL24VweUmiCbca8OKDUBAAAAAAAAAICQHFie6gwASFeWH0h1BgCkE0w5+/MpGftt8AAkAqac/fTjFOYBQJqhKGdX1n4U5nAAsghFOdumBp8BBIDgytmvmqQ2FwDSDFLOtsjZktpUAEgvmHL26bIVKU4GgLSCKWevj963HIATm3blb6c6BQDSlFd6pjoDANKVieekOgMAAAAAAAAAAACkLw1SnUCcaBhlv0b4IBwIwQ9Oysk9IT4KdnLTKDs2a95Ct/nuqZfGkA1IBO6usjf6vyl0dfzGOyXv1NantYmoS8tWMY+agFnmt20XaOnzc/lG+rO0Jo9Xd3k0ogRA4nF3lb0xt8jiifiN9yP/17iHpWs32ezorYcb8Z9l5y7yP0v6/Fyqo19Ja02K5YcjGR8kCRdX2Rtr4j3YeaXejmPVER/iPMv+Jee7H+DmZnJxe+e2scZrkWcBQnBKxRfWr73XCfKD5Q6yRAyusuy6oSj2cfnGZQP6DMy7fBCP7E6V/x6mSIgP95p/rjdOM3MZP2FiSVOfSeGrQwfsO6uR2SjzHyeUe6JD/8ip/dK6JlmPlM3yksCLBMqPZUUOvLLH1ZMmm9unnOw7dJpxoWNpFhqvhl0+4JlfW4+ux6xzQH6w5CDLiMFVll83dhR5XL4x86JZVbO7Xc8jEwcLfCgfqL+26Lpi8x6mr1IdtR3ubLb8rjohRuW99fm/do0zW9OLZvQyjxP8nmh77uhpy9p+LXiP1M2y+8/8HSg/yooceKnH3bXjxagR5/pXo69xj+N0TjDuc2wDUZNvNBTir70E94MlB1lGDK6yN9ZYF/hBJYo8Lt9YI9b+RNy7lkcmCv2P/83UZFZX+H/z6nhYiC3GI0IcfaeFWQTGBGs/u7MK5HdFl5VCzDYG8R4pm+Uoo39wfpQVOfCyHm2MzZe2XRPoUvmY4yydsxNv9MaRBnc9JlaM+L3VlH6w5CDLiMFV1v9uzqVKFHmcdd3suFGsLuORiXY+U8H1HdVkNNVRZbZu;4.blob,1.1,8064.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;4.blob,1.1,4516.oEU9CmvNAtxiPMLHIKYZ64S4b+h0vvf29ULUbTBG8W26DPi4qyucE5fb5Dxk5HxjjVj7E3Hv2nCReX6ayPI4yvnB+Q8J0duqCWrRGA/mmdvuVKuD+upG46thU7+8YMaR29V1ucown5+/ySuIeebZxVdNnC1Jw5YjjBc7Wy37Oqzx2X3kPSustd3q3zbxlwUFBVtzF/Oe119h/XzDdwvmrA7qUWhZet5u9OdjEP3y2ve2H/Ll3se7DTDvDDrxbboMhPfq2BoU2bpGdtwoVpeFi8zz00SmDGTOfSyrrdOtmqAWjdGnh3C+7pB9taOx1bCpn9h11k+D1uVg2cViU977sc88q2iRs8XR4qw8YPzW+h24Drca26xf4+qFtbYF/mOq/Xeyv+H99n7L/nBUB/XwVUcnoxkbg9Owx+7SBY8Kvvea8qfaTP+tWh26DIT36igIisyukTCRWX6ayPI4ynnRpyJQE9SiMRY9KxzVwearGY2vhk29Mcv4LnhdDpQMuaf0vdhnnlU8XbbC0Qpw8IJ/Wr8eOMn6aV+HJf7njpmCre3GS9ZbrOGd/c8dARzVQT3CVIcQnR8dn7Od7x36gvnjcbU6dBmIiKtDRmbXSLjIlJ8msjyOcu5TKOznDtmiMfrUC0d18Pk6R1P2BqivmNak9FDQugypuW3BU3GYeVZx/Rhny+ZvJ5n10uCWpVZ75H7/tmH+1x35gq3tkzusGyj13eCju817gCd29/b94agO6sGrwx6DODDOvK2bbLzM986bYf5Y7b8e7G26DETE1SEjs2vEPTLPTxNZHkc5f5ln3swstGqCWjTGH2vNbdeo1UF9daPx1bAxX5U3nrijY9C6fLlxyrE4zDybaCeN0do5LdLyd149YeHZpWOt9gbjsUE3Txbig5x5s9+s9r1HIte2X/eqDVtall7J+07ufnzhPXOqCvzv8FQXFb3KW9SDV4c9BvFazqVtrjm7piHfu7n8vNktpxiv8226DGg0r9UhI7NrxD0yz88ZmY6jnNvltJ/2ZplVE9SiMd7IbT/t5kVqdVBf3Wh8NWysd3RfLxkfdGY+mXI85plnGa/0dLaIQ1/n7V7geztJNJhZXbzLWql3T83Je9L32lCurWg47J0Bd9yk9h08tebIi/2E/78DJl15i3rw6pBjsAz+PH/30neVDBq8sih36kU72ig9NBmw0TxWh4zMrpEwkVl+zsh0HMv5plbFc37mu/6pRWMMalW6fJlaHayvZjS+Gja+/wYO9L1eZNkPOfNwzDPPMiae42yBRGI9sPyw/EKllRTGXL4yWUMBEBWPVH429ra2I5VWMpj+2Ky5SRoKgGhZ1rzib+8XqK0kcG7l90kaCQAAAAABdHrKhq57EzduJo4RO42CP+oG0gStnvLkpm57EzduBo4RD5o1b6HbfPfUS5OdCbBwVZeK/LbtXPZ6IoE6zjPan9nhjKAWY4j1ge1Yx5BEoQCOQnl81tm6rVd3Cf4sF0gKrurSzl3OcdnrjQTqOHv26n1un6AWg6ojHlrRyBXA4ZTHum39Slprhi4/7NwIkolOT9m/5HyXvd5InI7zQuMi0bu8QGlxqDripBWNUAEcTnms/dTlxe2d28Yar3lNEcQPd3WpEJcEbndjUVsmTsc52BgozqtVWxy7OmLSisagANYqj8PpfqcZzv+eLzRedWwDCcddXSpE95+J4L0Rqy0TqOOcuPSq0mVBLYZdHbGMEYsCWKc8Dqv77Wvc4zhNE4z7HNtAMnD7lPcov2ZP2Rux2jKBOs4JxqzFwS0G3VlFP0ZMCmCN8ji87rfyMcdEztmJN3pTg1t1bDfGiuC9EastE6fj3NTEaPtEUIujrY4Ix4hNAexUHofX/e56MGgadUWLnnPMDSQFt+r4lfELEbw3YrVl4nSczw24aO8DBReVNmAtjrY6IhwjVgVwkPLYg+63VXApfG80TdansUAQbtWxxpBvL0avtkyYjrNF+e/F9rb/M/Ik1gpB9NnHoADWKo/D6343rgpKfs3cvG9CTQwkFrfq2FR6vwje611t2df/Ej9hOs5RxkAhTiuddStrhSD67GNRAOuUx2F1v52LtznS/26n84tPQMIJpy7tIO+BI1dbNp6/2/cmZeJ0nEvL3mw9Jqd8LG8pbLfvSKLPPhYFsE55HFb3+7bxU8dp6G1sd2wDCSecuvRe+T0Ikast63bt973Tkjgd56iRZRWnFk0tG8VanH7V9gvs6LOPSQGsUR6H1f3eNinoq2GE9T0Mrzu2gZTzXmmwZjpeQMcZguGvOLe9Znye/ERAWGbOSMgnv6HjDMXjIzQvMRp0OT44+amAcDR+4f1EhIWOMwQfTNJ9IaVYf/nHus0gxUzek+oMsoqxIT5mf/D55OYBAAAgfiRDR5zuNAx/iBaogk9wkqAjTnvkGkRKFqiC3X1U66vc+jId1NtTd++unxwcL5mOtNH46caiI07U3GJZyZjWIHJOfFWwu4+q1+roNH/phA37e9XFz5HWK7GoWiPXEbMornML09eFWFYytjVwPy5rVcEu+lGv1fHj/ebp/GTnf8LF48S3OqJRtUauI44lZ299Y1nJ2NbA/bhsUgUXjh7TvWRYQNIZ7KPKdLD1VSdX5o5/j+9l2lOpoV3R1qfweXEPjxeFI6087upJ5r3F2CknK5lq3HFjU7U6dcQf7jX/XG+cxjOl+VIUNjeZFetB6Dx23Vx+Y1rJWNYgKjfgE1QVXGiMv3VxbqDyHT6qpIOtNxa0ebO6qbKXtKdSQ/u8og6N2pGWjru7drwYNeLcFTxTnTtubKpWp46YVYfMlOZLUWhulBX1IHQeu64uvzGtZCxrEJUb8AmqCi7caD4H3x/49KjDR5V0sPWT6izP1Ef5XtKeSg3tdmMhCx61Iy1TnLYxNl/ado2Sqc4dNyZVq0ZHzKvDzpRrbVnOgblRVnxuNjqPXVeX39hWMoY1iM4N+MRUBRcON390NPzfa+DwUSUdrO91R135Yr6XtKdSQxvmnHp1pOWK0yen+B+XKFOdO25MqlaNjphVh8yUa22d1UFZ8bnZ6Dx2XV1+Y1zJ6NcgOjfgE1MV7LvmRLFyd8s0oFIH639V/s7f+V7SnkoNrfZ+QESgRxVBx5khZ/VSM9W648akatXoiIOqw5cp19o6qoNlxecmcXrsurv8xrySUa9BVG7AJ6YqOPCI7P9crcNHlXSwvurYVP5fvpe0p1JDu2K37xn22XN4PGp5daTlitOXKkufVjPVuePGpGrV6IiXrBWO6uBaW+dzB2WlrQ6Nx66ry28sKxnjGkTjBnxiqoILu5gveOca1/r+cPiokg62vsy867/B8r2jvaQ9JQ1tfRfz9cng4qd5PGqFdaQNqFqZ4vSq8i2v1JyhZKpzx41J1arREe+peMi6HpTq4FpblnNgbpSVrjp0HrvuLr+xrGQsaxCVG/AJqgouNH635U811jLqfFRJB1tfPrr1R22tByPaS9pT0tC2q17w+eHlczZF50hrq1rpuE77loiVbz1wkGeqc8eNTdXq1BGvm9Ujf3OlWh00X4pCc6OsdNWh89h1d/mNZSVjWYOo3IBPUFVwYfPL5ucOU/WjXANq62DrP95Tmzve+rQ12yu1p0xD+/bXu9+pHyWic6SVqlb7uM5N/2I+hr+as4pnqnXHjUnVqtER97+loudhtTpovhSFzU1mpb2z0njshnH5jWUlY1mDaNyAT1BVsP+1bmjSRwcbLtNYSJyOOHOIaQ1OUFWw+zWXTjrYRFZHonTEGUUMa3CiqoLdr7l00sEmtDoSpCPOKKJfA6iCT3CgI45hDaAKBgC4gXtzAPRksaYUAHcyx90VgGSTOe6uXol3PJC9ZJC7q0c8x+ub8R8YAgklo9xd3YhCF2p/+gsAPRnl7hrgYIEP5RNA0ehC5ae/AAhBJrm7+in0PxMonwaMThcKgDuZ5O7qp51PnrO+I98WnS4UAHcyyd3Vj+7OKjpdKADuZJK7qx/dnZWIShcKgDsZ5O4aQHdnFZUuFIAwZJC7qwtR6UKfNTL/6zVAQskgd1c3otGFflqeLgJJANKNrrekOgMA0pQWAz5LdQoApCkrm0HYAgAAAIAIgXMoACov/8X+dv4QzqEAZC3PNNk3OdDUO4cCkL1sLbY/iKp1DgUgm7nlQ7tFzqHQigJgUSW/hkc6h0IrCoCPnk/ZLekcCq0oAD6uPi6bGudQALKZ3uWLTwk0Hc6hAGQ5e4yqQMvhHApAdjO2tOX0QNPhHApAdvO1/IIDnXMoANlM85fsFjmHQisKgMXyHnaLnEOhFQXA5OC+C+wmOYdCKwqAEOcfLX870CTnUGhFATD5z87NgRZzDoVWFACTFqPsVijnUAAAAACAbIcUsQAAFaaIBQCokCIWABAEKWIBACqkiAUAqJAiFgCgwhSxAAAFpogFAKiQIhYAoMAUsQAAha+7hT8GgOyEFLEAABVSxAIAFJgiFgDAYYpYAIACKWIBACqkiAUgK/j/6hGQyJZyIwQAAAAASUVORK5CYII=;3.end,1.1;4.move,1.4,1.3,1.2,3.189,1.0;4.sync,10.6492309411;4.rect,1.1,2.42,1.1,2.78,3.299;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,1.6,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,1.3,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,1.3,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,1.1,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,2.24,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.20,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.32,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,2.22,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.550,2.23,2.39,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,2.20,2.27,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.60,2.18,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.60,2.47,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,2.63,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,2.63,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.61,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,2.61,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.63,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,2.82,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.196,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.196,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.196,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.291,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.193,2.78,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.194,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.193,2.99,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.193,2.16,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.193,3.108,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.191,2.28,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.196,2.35,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.193,2.48,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.212,3.118,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.215,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.212,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.253,1.8,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.272,2.19,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.269,1.9,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.286,3.459,3.112;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.309,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.310,2.28,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.348,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.348,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.421,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.422,1.9,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.424,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.424,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.424,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.424,1.9,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.481,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.476,2.64,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.90,3.421,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.424,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.424,1.8,2.45;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.424,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.421,1.9,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.424,2.19,2.70;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.422,1.8,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.419,2.88,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.424,2.45,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.478,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.438,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.438,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.440,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.440,2.47,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.443,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.443,2.27,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.440,2.99,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.459,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.478,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.481,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.496,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.536,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.536,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.533,2.68,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.538,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.535,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.533,2.68,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.533,2.98,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.552,2.18,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.557,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.554,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.573,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.573,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.576,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.576,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.574,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.576,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.573,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.572,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.595,2.45,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.592,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.592,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.593,2.98,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.594,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.629,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.121,1.1;4.blob,1.1,3340.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.20;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,732.Pkn7htzPxzyqF2A7Z/bA2m+S0x+3NsucEZ59ZZ6IT7UNMvPwEdkW2BxYx7zJ+ByAqMRMKn3YtPnksz2etcIC30dE9Fj8lLMECCjzss3PEIVqvTPzBg7XN6urbn+Vfr3tKu1fkx27GCvhT6tebtmddlH/K9sx1nMf8wDU3li5+UiudXXQyhno2WkrEfEBW4ZmHvDiyDx8RLYFNgeuVdp73mR+Nz4HICoxk3A2bOLyurV11AoLfB8RUeNA5XOOkgB+k+4r816KH7hoRtZ0j3pn5h2ubL+oaRq/Fa66iZ2Tyjc3Te/I2PPxL6RuezF3i+rlD2nnjL+yHWPl/OCQqSWwlaxte2YvG/rZF2fN645Zbvch1bO0fcQOSyDiA7ayBLG9iFq/I7ItsDlw8Tc2/yn3OMPnQEYlZxLOhs1j/BdujXeVWmGB7yMiahw56iwJ4K/HfGUeO3F5fMp+zysDzsyLOzI+4eQ9Valw1bEt2dtzXrlLr+79cmn18RMeXm64/5RZkO1Y3IKsgmPKqhO1u2b+5lnGDsVfbX7XptFK9Sxtr6kc6tGXiA/YAi+wpeVF1PodkW2BzYHr/G2lCdkTvcyBjErOJJwNm1fMWFYrtdIC3UdE1Fj/mrNUp3jqDs/8CBWtpoXJcdDQk9+Jusawgwsnh8n1hJzvw+Q5aCjziLrGv5J/HS7XQ4vqzN2DlHkNhf8PVQXjEaAhxvkAAAAASUVORK5CYII=;3.end,1.1;4.move,1.4,1.3,1.2,3.155,1.0;4.sync,10.6492309483;4.rect,1.1,3.151,1.1,3.628,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.22,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.20,3.718,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.39,2.78,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,2.63,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,2.61,2.10,3.182;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.58,3.517,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.77,2.98,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.82,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.80,2.48,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.118,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.120,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.121,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.177,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.175,1.8,3.109;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.175,1.8,3.106;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.177,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.174,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.231,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.177,1.9,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.405,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.174,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.177,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.172,2.29,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.177,2.18,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.177,2.28,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.174,2.18,3.111;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.174,2.89,3.110;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.175,2.28,3.106;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.177,2.19,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.172,2.59,3.113;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.172,2.38,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.177,2.29,3.237;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.402,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.174,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.174,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.175,2.48,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.231,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.229,2.77,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.253,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.259,1.4,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.269,2.67,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.272,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.272,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.383,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.405,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.405,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.405,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.421,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.424,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.442,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.459,2.40,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.459,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.479,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.481,2.10,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.481,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.481,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.497,3.108,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.500,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.497,3.296,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.557,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.554,3.158,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.552,3.239,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.557,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.554,3.218,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.574,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.571,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.576,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.576,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.576,1.9,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.574,1.8,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.573,1.8,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.612,2.49,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.611,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.611,3.118,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.611,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.614,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.610,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.611,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.609,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.612,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.649,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.652,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.652,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.3;4.blob,1.1,4000.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.98;4.blob,1.1,5496.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.155;4.blob,1.1,4736.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.288;4.blob,1.1,3276.iVBORw0KGgoAAAANSUhEUgAAAVIAAAAjCAMAAADxAnINAAACr1BMVEUAAAB3d3fU1NQwMDCxsbHs7Ozx8fGpqakiIiJoaGj////o6OigoKDQ0NCLi4vT09M4ODgtLS3z8/O6urpOTk5XV1fMzMzq6uocHBysrKzIyMgYGBg8PDykpKQREREgICAyMjL9/f0bGxuhoaHp6ekGBgYTExPy8vKcnJyIiIiQkJC8vLzf399dXV1eXl7k5ORbW1v09PTl5eWZmZlsbGz5+fkrKyu3t7f19fX7+/tLS0u4uLiKioqtra0XFxc/Pz/GxsZ1dXX29vYaGhooKCi0tLSioqIUFBTW1tbNzc0NDQ0eHh6qqqru7u6enp4QEBBPT0/FxcUxMTE3NzfBwcH39/eTk5MMDAxCQkLR0dEEBASPj481NTW/v7/V1dVVVVWAgIBDQ0NcXFzY2Nh6enpERERUVFRGRkZqamq9vb3Hx8cqKipkZGRfX1/t7e3r6+vKyspZWVnX19cHBwfb29sWFhYVFRXS0tJjY2NRUVEnJydISEhiYmK1tbX4+PjAwMBJSUlgYGALCwt8fHz6+vqjo6M0NDTe3t5lZWWOjo4ICAjm5uY5OTmGhobw8PAPDw/n5+dFRUU9PT3a2tpHR0dBQUGVlZUKCgokJCSbm5sDAwNQUFAJCQkFBQWFhYX+/v7CwsIfHx/8/Pyurq5SUlKEhISMjIzJyclzc3NKSkqmpqZWVlaCgoLc3NyWlpZxcXGHh4fi4uICAgLLy8vDw8Nvb29ra2urq6uNjY3d3d0BAQG7u7s2Njbv7+8ODg4dHR1NTU3g4OCXl5eSkpIhISEsLCyysrJMTEyvr69/f39paWl5eXmoqKhmZmYjIyMpKSl9fX3Ozs62trZaWlrPz8+Dg4MZGRk6OjrExMRwcHDj4+O+vr54eHhnZ2ewsLB2dnYuLi4+Pj6dnZ1+fn5ubm52oOWUAAAGpUlEQVRoge1a+V8TRxQfMCgdIigoiASQCngCgiKRo0o8wANBLYpUtB5QtUpaoIjigRjFxgpS1HpHrbe9tFotNrRaqdJDrbVae19/SGd2d/bNhpAIbkg/yPeH3bf79n3fm+/uzg55IETh4YkkgCWih8arZy9v9HR4DmPs06ZX29tRrNbTkVfB7OvX7spURx/cRzQ8PdgpsAT09Q/o1z8waAC1gwc64nLkDdHpQl0jqYI5LNzBlY6rbz/a4GOSDop4XjoDlojBkVEIRQ8Z6rwoJyUPc42kjpl5dLKkw0ewM2CJ0Iyk25hYhOKwAHo4KjA+YXQ0tcYkjk3Sj0tWeGWEpqQG6dNeEA/YwFnseBxDDyf4UUnTfQyaiUrmSZP9e04JQaKkGZlTpymoZS8wc1PA9Bn+WTOzaQWanEz9rNnIfn0cy5wXcyPnzlNEgAV8EMHxgTdvfqJfuihpfmSslAQsCbH4JWkwC3QFC3U6HbEWRby8eMnSFEFSnLCssCiE93KSYs0ryw0rFAOH2MCVZPMqXkVEwwHJq4tnKbzRxtf6vV4yv1SQdFpg2RsKZvACM0wB5XFriip8kmgFkRPWFnmOLLVfH7CsM6RUrs/aoIgAC/ggAvjA671xU9VmL1HS5PhqKQtYDFtM8VulCZc96t7bECqNwdGCpPItaP0ihNaQSWM7ns0PHGJHUcebRjMRbQepcS1+i/furK0jI8U5VFJzwS6b7yN4Ef/iS5bvEHKP8/AgKgt5Hurx2/brA5YZDfkI7cZ7+AiwgI/Py/jAu9f4Dh2HoFavrSwLWDL2+Sbg/QcURR0c6E8e+nBB0kMOJA0kmzC8XjFwOfZw3FAUZTyCpLm01LKc9x6dQS8+Rt5FbWbw8dk2zOC1J2nmu2az+ZCB8IVSZm98wn59wBJ/klrGU3wEWMDH52V84D09GLG5tC63XkoCFo98D3yGJzlrOZe84IwkqdmJpChxGT9cLtZDn33eNJFJimrf473vf8BYtPg4/tCGGbzIjqTF4jz3kSRLOC6yX5/McgiPobv5Wj4CLODj8zI+8F4gt0SSdFXcRekysCQcPjme7j6+xJNMnko2B59Q0jBcwQ+Xi82Ovxxwjp4TJI2yfMJ7xedB8G6s3Gqao2QGL7Ijac2VbRQDnEkKLHrxKb1qX1Lg4/MyPvCeJrdEkvRoqpwkFdng00tE5Mal16g9ukw8l1RANltsJWVeQGgDia3APfjhcrFobk3EZ3SvjSNz7iJaCnh3WpsQ+tz6hfB5qs68HqZgBq89SW9cp28mXQzykrauD1jSxLm00L6kwMfnZXzg/TKSzIJn6ThuWpqlHGDJKBz3Vc6t26Y8asfglj1LMhD62vLNbt8IPFYpKfNykuJv67+Lp3eDfo2LdbpJilh0J2KlcJ3WklIVm0VfBPBmBK28dX5Nb7O4iBqr1yiqAi8wg1Ue1Dum3tfUVylp6/qA5W5u0u7VxSnIvqTABxHAB95jhhWVSy5QSe99z3KABZizwWgNED6ZqPFqcWIJCW28d8Fw/4fryUpJmZeT9MGPXoa0ciSuGQmCFbEoe0h/UdIRyyINmodI4Z1+P37XfhorLPU3i7O5DNkLzGChfWm1/psWI6WkresDFvTop1zjjaY2JAU+LgL4wLvHz+S5nkqa+ZilAEsViJ+ntpH6c76q+Z4BOJZ0Qcvxis6qpMvAsaS/+PzaWYV0oxvdeOawT9iG2P540Y0OI32WsCt6UOeG5Cq1M5rvW63aDFs+dzUxCrNuisaU227Irk47I9zrWk5M2cLS/0cT40ADW2uX66vUTfKEUKGdMbOMqHln3G/O+Hi4TtIT+nnMHLqCWU1N6qazhcrtjItZLdSxX/GTntuaGOjK7zJjJZYGWe1lzX563RxA5XbGQ3yeI3dzEwOhoD9kyiZWWWlJmWs//yq3M9bhWxy5m5sYKFr8RV+ET4tamjmByu0MJ5J2bhODVJMHnCV7OyxS+6ByO8Pui4/c1MRAf+K/4Kzf3+0SpuNQuZ1x0Sq8Xqce83zITU0MNABXwdmaYe2UpqNQu52hbSBz7vTEVTwfevImhrTAUaeJgaJM22XmA4ljVBHMOdRuZ9wsDujX33NNVMeaGGyBo04Tgyz/YP5sxqx3fQp6Ea6RVO12RvMGa602GnWsiSEvcNRpYqB/4Pm/vIO1f4dbXNtO6NrtjImmR8wMvMes4KWuTdrF2xlXCxpF42AC+zO0zv9f1+bs4u2M6qlHhP3dHfI/0uQXNbqtnC6BDHHFnZfcaRn/A2inIkKHhMo3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.344;4.blob,1.1,4972.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.400;4.blob,1.1,4912.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.457;4.blob,1.1,3268.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,3.476;4.blob,1.1,4368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.495;4.blob,1.1,2292.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.533;4.blob,1.1,3576.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.571;4.blob,1.1,3228.iVBORw0KGgoAAAANSUhEUgAAAocAAAARCAMAAACYavanAAACr1BMVEUAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBweLi4vT09M4ODj///9oaGjo6OikpKTQ0NAcHBzq6uq6urpOTk5qamrt7e2enp4REREgICCsrKzIyMgYGBg8PDwyMjL9/f0bGxuZmZnd3d0ICAhMTEwuLi6IiIiQkJC8vLwBAQHr6+t/f3/n5+eCgoKxsbFPT0/W1tb19fXFxcUxMTEoKCi0tLTz8/OioqIeHh6qqqru7u4QEBBbW1vMzMz09PTl5eUTExMtLS2tra0mJiY/Pz9dXV3GxsZsbGz5+fkrKyu3t7f7+/tLS0sSEhL4+PhtbW3c3NyamppCQkLR0dF1dXXk5OQ3NzfBwcH39/fp6emTk5MMDAyYmJg0NDRAQEBISEgzMzMEBAReXl4ZGRlQUFCwsLBRUVFUVFTf39/KyspZWVnX19cVFRXS0tJjY2NVVVWAgIBDQ0NcXFzY2NgUFBTs7Ozi4uIPDw/Hx8dkZGR6enpERESnp6c2NjYiIiLAwMBJSUlgYGA1NTW/v7/V1dUnJyf29vZiYmK1tbVSUlLh4eELCwvCwsINDQ1FRUU9PT2Ghobw8PDy8vIlJSWOjo4kJCSPj4+VlZUKCgra2tpHR0dBQUGpqamjo6MfHx+urq4JCQm9vb1NTU0ODg4FBQWcnJwGBgaFhYUCAgJ0dHTJycmhoaGMjIwaGhpWVla5ubmWlpaHh4dKSkr+/v6mpqZzc3Pv7+/6+vo5OTl+fn4WFhagoKBYWFje3t6rq6vNzc0DAwNvb2+vr6+NjY2UlJSKioodHR2Xl5d8fHxhYWGSkpLb29shISEsLCxnZ2dpaWl5eXkvLy8jIyMpKSlfX1/8/Px9fX3Ozs62trabm5taWlq7u7s6OjpXV1eJiYnExMRwcHDj4+Nubm6+vr54eHjN1D7xAAAGgElEQVRoge1Y+V9UVRS/LCrgld1RgRFxSJuBVEoIJUEtFolIJQwsRQrFcktBXEgtVAwjQotSKEOtNFEkMbDFMs1stzKXStv/kN6dN++de+ed+wREyE/z/WHm8Oae7/d7zj1vgxAPPPDAAw90eHkbIxU+vgMGDvLraz8M/gF9wTKYDu4NGRmGUEoD3SIBvVNl7/D1ODco2OxXSeUYvL2MkRMhoWHhQy3DeuDthjF8RF+wdGkOIyJ7Kh9ltQYFukUCTP11VZdbdyNd63aupms+h5LKDSyEjIweZYhUxIy2ERJLb+umwVsHN3kOFYwJNEZdRA/msE/RtTkk16kc3I+93Rg5YXfEsc/4OxStceMnJNx5Fzs6MTFpwN1RLEqelDR5WIpIe8+U1LSYqeKxaYmW0On3EnIfTWd/ZgRI+HRw13Itl0dm1ozshPtzBAeIK53lgdwH2dfMWULG7LysgIekc6jr5lMn2LE5DxcUzn1E5gDvgckcQpVcNzBdXe3Rmcpf8+h8vl5Yx3VNd4oxY1WiXkx3GnSDgosCEiIXSNZxlUNfsCqLCx9zrYdIxeO0hH2FLVS0CjMWlXovVh4VpzqeCH9ySZ4SLc1fVro8MFtIWRH91MpVZb7CsfLVYbErgivWEDJlrfKnD12H8wHgWg65HDJp2vrK0ijeAeYKWJ5m59wGNnPw68bcTc88u1o2h6BbZd28xWq1Kse2VvsWbZv8nMSBpAcmcwj+oBuYLqjBHEK9sA74wCnGjFWJeTHfadANmpxRU7pluw1fB5VDX9Aqc1Kfd62HSIWP88wjEbXM3QuE1NEXCanfoaRvpeOVB9udSmtm05F8ysZ5hPil06n8sSLqQ8hLiVXKCUGV8+xlhw3nw7xDLodM6jpfwIHElYulkjYQ8soWIeNVxy5CFsnmkNfV7hyTdhcT0kibcAeSHpjfl8doe691A9MFNZhDvmvcfdnFB05xZqxKoxfznebuy/HDCZnP1PB1GjP0Ba3ytdeJIVLBzyF7BthIawipncSO7VEu+hPesNlszdVDhZySyCTlOis88i517N233xm9mf8WedtxgOB8mHfI5ZBJm9UAHEhcuVjsi+PIwbR3hIxDLcTk+ZDX1TqVOoh9Og7jDiQ96Noc6t3AdEEN5pDvmnEOwSnOjFVp9HKdnRafD4/QVtk6vXK9L1iVawrqiHvkguu+fHScS2sELVWestq0ny3qvf1dPuVY+/GcqvfEOSQNLR2dYSdY5JWQ0tp5hOB8qHfIBWRSm7sDiSuN5f3dpKnzA+HXCjZP8vcUTtfVqWaayb7yPsQdSHrQ9Tl0dgPR5dRgDvmuGeaQc4ozY1UavZjvtNscRtGPZOs0Zq4vSJXr8g8S98gFeyh7TyFpB3h36lnCcPLjeQwhfEriJ8pHCXX/F8CpE+MKtirfKamfhh0XqwU+zDuXC9D3BRxIXGksydEbZp0Wfz3E5snsfVnX1TqVoF5lzuAOJD3o7hwiuqD22XYiXA9VGK+H4BRnxqo0ejHfaWwO8XUas9AXQ5W1Z7XlEGloG+3HbuYLeHf1HcoV9fOOfYScG8huC6OEjOzNyscX4hx65Z1SHk3plyyeezJ6g1gt8GHe+Vwd+r6AA4krfe992yz7xIyvCpuVU1Q2h7xuzNfqsenqU1cl7kDSg27OIaYLautzd7GdnC92TV+n84FTnBmr0ujFfKdBF+YQX6cxQ1+QKr9p/9a1GiIdIYVh4d85WgR35aFrY1uXBbO3o9Dg9Dr/zml8xvn27xv9o+kM/tgPBQtzjp1ObWDxj9Fr3aoFPgB7e7NYrRPFXB36voADzBWwKO9qufHFYsae6r1FqyrUOTxMBXk3z+k0rmlVOSEXCrIbf7L4ShxgPQAHvBdjldANTBfUfC62VJ4PZHPId01bB3zgFGc2Vol5Md9p0IU5xNYBM/QFqfLSZS0BIsCF7AEV9X5CPST5Smr8z0vZrw3TdyRtWikk2C9VVF/5ZWCOcHDO0dUdv151hik7rzm/UT4dQ9TnjAgxV4e+L5wDxBXHorwd/eae0RTQ6b1NncOx7cXulXO69jOWrCWst1d/L3Cc2y9zgPQAHPBejFVy3cB0Qa2mLPfyNefbI9c1bR2noTvFmY1Vol5Mdxp0YQ6xdcDMzYaxygl/aAkQ3USc/dOw4/8BRJT1twMP+hJVcReX97cHBGuS/upvCx70Jf4O/Ke/LWAoLrX3t4X/O/4F0sn9dht7UcMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.590;4.blob,1.1,3136.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.647;4.blob,1.1,2860.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;3.end,1.1;4.move,1.4,1.3,1.2,3.150,1.0;4.sync,10.6492309548;4.copy,1.1,1.0,1.0,3.960,3.532,2.14,1.1,1.0,3.133;4.rect,1.1,2.70,1.3,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.22,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.64,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.41,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.60,3.178,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.60,2.36,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.100,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.118,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.120,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.117,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.115,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.117,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.117,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.120,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.120,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.120,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.115,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.115,3.128,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.117,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.117,2.79,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.118,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.118,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.120,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.117,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.117,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.117,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.117,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.118,2.38,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.3;4.blob,1.1,2716.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.60;4.blob,1.1,4008.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,2.98;4.blob,1.1,3080.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;3.end,1.1;4.sync,10.6492309568;4.move,1.4,1.3,1.2,3.146,1.0;4.sync,10.6492310042;4.copy,1.1,1.0,1.0,3.960,3.570,2.14,1.1,1.0,2.95;4.rect,1.1,2.40,2.25,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,1.3,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,2.77,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,2.22,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.25,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,2.25,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,2.82,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,2.82,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,2.82,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,2.79,3.128,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.79,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.79,2.88,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.79,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.79,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,2.79,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,2.79,2.48,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.1;4.blob,1.1,3640.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.22;4.blob,1.1,3192.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.43;4.blob,1.1,2780.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;3.end,1.1;4.move,1.4,1.3,1.2,3.143,1.0;4.sync,10.6492310070;4.copy,1.1,1.0,1.0,3.960,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,2.70,1.3,2.10,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,1.1,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,1.1,3.478,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.24,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.22,3.118,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.23,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.22,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.3;4.blob,1.1,1808.iVBORw0KGgoAAAANSUhEUgAAANsAAAAPCAMAAABa8kpLAAACHFBMVEUAAACAgID///98fHwDAwNPT0+2trYKCgqsrKzIyMj29vY8PDwdHR0WFhaBgYHk5OQMDAz09PRgYGDe3t5+fn4ODg4SEhL4+PhtbW3c3NyamppbW1vMzMzl5eWZmZkTExNsbGz5+fkrKyu3t7f19fX7+/tLS0soKCi0tLTz8/Px8fGioqIYGBiYmJg0NDRAQEAeHh6qqqru7u6enp4QEBCkpKSxsbHW1tbFxcUxMTFERESDg4PJycnr6+vj4+NBQUEBAQFkZGQLCwvs7Ozv7++np6c2NjY4ODhVVVX9/f1DQ0NcXFzY2Ni4uLh6enpUVFTKyspOTk5ZWVnX19fR0dEHBwcVFRXS0tJjY2Po6Ojp6enGxsZRUVHU1NTf3981NTW/v7/V1dWNjY1aWlr8/PzQ0NBHR0fCwsIFBQUICAgCAgLb29skJCSPj48iIiJdXV1eXl6Ghobw8PAPDw8nJyeLi4vy8vJCQkIyMjINDQ1FRUU9PT0cHBzh4eF/f390dHRQUFAgICAJCQkfHx+urq5qampSUlKwsLDg4OAhISERERFMTEza2tr6+vpKSkr+/v6mpqZzc3OWlpbt7e2Hh4cjIyOvr6/Nzc2UlJSrq6tNTU2Xl5cbGxvn5+cEBARpaWl5eXkUFBTq6urHx8dWVlYqKiqhoaEtLS2MjIwGBgaJiYl9fX3i4uKbm5vOzs5XV1etra3AwMCQkJBubm4yOCdDAAAC6klEQVRIidWUZ1cTQRiFJxPpJVQjKESKyCpGUBFdRSJGJBCIGglioYeuCIgFAQUVUcQo2BUQLNjrH3Rml50Sd414iBzvh5k3c+a9d57dyQLwb6WDkvT+8F4REBjkD19fCg6RZ11oGFb40idERBogjFp6X98ibNH+SoiJ1ccRtvh4PK40rsJTQiIaVq+JTko24Z9rU1LT0tdlcM3rM4UNG7NQsSkBDWa4mdtHq+wcYcvWbajI3R6Ql75jJ6oM8k3k2WiHkivCXcLumPw9BazLnyreAvYqbIX7rFLrfvxEi+ABAIptupJSe5mUC5PKRUcW22vKP3josPNIBc9G9pHKZah0HK1Kw2zHjp9wnKxGHTVhtXXoJnqxKR0kV4T1DY3uppBm1oWqpVVSmyYeYatwthfiWYQdAJyqQ9VpM1rthCYp94x3Y1d3DwBnYYAXm7KPVL3n0HHPwwuY7SIAffASXqV3Eh+vhesguSLsBwORIG6AdaHKld++g11rayV+DJsiS/UgaEu6jMsrIQLqHZJyh73ZmnPweDXKi03ZR6q8ayhsOPQ6OosbHxyOcGzS8W5wHSQXs43qgN7AulDdNEu6xa6NUT8VNhB3GxSMR6DijuduRs29BbZWb7aECaXi2JR9pJqUn+79BbYh+TnT7yQ+3gOug+QybNSFSu1O9piJnxpbtq0o8SEuMh/hZ6jFJr83rMcDv2OLfSLF9Wuwsf+3hQ6Sy7BRFyq1O8npVzZQNjH5FM9ptWjQa7F1WdF3NdyKdpYbg/BZNNiejeKA54BnS27XZiO5DBt1oVK7k77Yio1T03ie8bxo6rXBVHW22bmXY68q3Wj9deMbcaZKi8015+7s6x2f59k64WBB6aw6G8ll2KjLIkTZ3ire7/LfS7Plw8fQwIbRDHU2kB0YPfXJhasRu/HzFy020PG1W/hWAng2S/1kinNenY3kMmzU5a/YvnumF9f6HynYvtwn8Jt6hB/LfQS/adphQeNPlgfQBmeRstgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.41;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.134,1.0;4.sync,10.6492310084;4.copy,1.1,1.0,1.0,3.960,3.437,2.14,1.1,1.0,3.228;4.rect,1.1,2.40,1.6,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,1.6,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,1.3,3.106,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.60,2.10,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.58,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.61,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,2.58,1.9,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,2.58,3.118,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.81,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.79,3.138,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.82,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.79,3.246,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.177,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.155,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.117,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.174,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.135,1.9,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.175,2.38,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.177,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.174,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.176,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.174,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.3;4.blob,1.1,3464.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.58;4.blob,1.1,3512.iVBORw0KGgoAAAANSUhEUgAAAkMAAAASCAMAAABvqirSAAAC3FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9oaGj////o6OigoKDQ0NDU1NQsLCy2trbv7+8UFBSLi4vT09MoKCixsbHu7u7w8PCjo6MaGhpEREQhISEICAiioqKvr688PDykpKQgICDs7Oy7u7tPT09dXV3b29vV1dUHBwcRERGsrKzIyMgfHx/q6uq/v79RUVFaWlrW1tbc3NwMDAwDAwPa2tpwcHChoaEBAQEVFRX19fVJSUmIiIienp4jIyP7+/tnZ2f6+vp5eXlSUlLk5OSEhIScnJy9vb0ODg4SEhL4+PhtbW2amppbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7dLS0u4uLiKioqtra0XFxc/Pz/Gxsb29va0tLTz8/Px8fHNzc0NDQ0CAgJ/f3+bm5t6enoeHh6qqqoQEBAxMTGGhoa+vr42NjYEBATy8vJ7e3tZWVmYmJg0NDRAQECDg4PJyclgYGDr6+vj4+NBQUE3NzfBwcH39/fp6emTk5Orq6uwsLBISEinp6c4ODhVVVX9/f2AgIBDQ0NcXFzY2NhGRkZqamrHx8cqKipkZGS6urpfX1/t7e3KyspOTk7X19fR0dEWFhYZGRlWVlbS0tJjY2Pf3981NTUFBQVTU1OpqakmJiaNjY38/PxHR0fCwsInJydiYmK1tbV2dnaPj48iIiJeXl7e3t4GBgZlZWWOjo7m5uY5OTnn5+dMTExCQkIyMjJFRUU9PT3h4eFhYWEcHByBgYF+fn50dHRQUFAJCQmFhYX+/v6urq5ycnKdnZ3g4OB8fHyMjIyVlZVKSkqmpqZzc3N3d3eCgoKWlpZxcXGHh4dpaWkzMzMuLi4+Pj5vb29ra2slJSWUlJRNTU0wMDAdHR2Xl5cbGxs7OzvOzs4KCgqoqKhmZmbDw8NXV1ctLS0pKSmJiYl9fX3i4uK8vLzAwMBubm46OjrExMSQkJB4eHhXbFSKAAAHKElEQVRoge1Z+19URRQ/gqDNLspDAVkoQAUBBQVFYX2FkiIqICAgJZCCICqYorli4qPERz5wE1+oFeCjFMzUiNAwTNS0TCsry7IHmpVW/0Azd3dn7t0dlsULH/iB7w/3zs7cc+Z7vnPuPO4CdKFTo1tHEzCBlXVHM+hCq9DdpqMZmMC2R0/5Tp5CCCmabVXambNV9qLF3vYODkpHY39OfeQTtBR9nV1c+7nJdGJeDZlRqlzcW9ObhdoTJwI8LGNh1O/Tz1hs1iysPD295OeQd/8BA318B/kZ+fP3NmMdMLg1PFvCkMCgocOCQ4bL82JeDXlRjggd2areLNQeO/EMHIUvYeYeb7bfcPVoi+3MYIz8HBrri4UdN/7ZlvyJ0bY5pPTF7+GQiAmyHZlhLy/KiWpOgreB9hiRz1nEhdvvpMmGUlQUuU6JnkpuIdPwZXpMbNyMePIzIXFmknp8stiFV8qsQHXq81J/BosXkA/5ObsPiaO7Is3ZDST++qZnvPi0lT4Ox+A5cyHTJYs0zMsW+xPNmDnzM1zG5pJ+nQcGq20WkLB1E3CLwTIL6mUhjnrRVJiL8thj+YtfEkJdArA0BBcK0DI+Z1qnQsszXl6hWVmI61a9srpozXCpGpQzhcwo165rF+0J9DnEImcMOPqJ+wVYj/RUrPs7CI2vkqzPQ68BbCjeuGnzlhRBWBSXrbK1kowMcn59a9pkiT9mEbMNX7ajHZgpKkneqbWRtMZr3ti1pHS3nxDH3BjfPQB70T6Rc70/NmOGR+63LVMkkX6LZg+17XUA2x70DBqEJ2AxKTjkISBTwpRaUC9vFkG++i1YFeHHHnsb0SmZKcnjTOtUqHxYhV3l4MMAR9JS1h91OSZhzzhTyIwy8J120Z7ANIcoA45+on4xogxR+ZX6Coc0FcLHx3cH4dLxAlzrg0jyJqATYASvqmqAk2iB2B+zmE4a3tPgxUF5Cnc+FL0vbl3oirfyR9BAEodH0OnjQH6dMVWXlZwW4wQ+iz4gEeEXpwZ9SGpN1zIv3VtrK6mjFtSLN3LMq42Ej3qIHstDeKD8PDwOiZXkcaZ1KlQHtefgfC3A/NB8gEpUyOdMIS/KeDSxXbQn4OSQgQFHPyl7UGRJRyHsQBZkxn1MivWDM/B4kO1eArpgMlox+OKPjkr8UYtDkZOgWvMJ6Ndkv4at4tbD88nDQ/DUrwwOqFhggbrBF/HsciENe/Ei/o7r1DTNIfcCAf4SptSCedEWfnrJ1d1pkugxIYcqEEqXrGUczrSO5FDjRrgcCRArDIHmCp8zhbwoj6Cz7aI9gWkOUQY8/STsofSq0TCcD4XCCDLDfdZwLfngdX0OmRz7hDggUbKyiyw+V+fui3AzxAGuX4hbQ24YvChRBfqSFLizPCtpdfPLTX1E3rqZxjSHuGsZtWBeSqZePJrkc+yW6LFuqB7gq4LJ6WIleZxpHcuhCyiBtOxW8jlTyIvya/SNPqK21Z6An0MCA55+EvbQ55LRMOQU500TTvzpc/Cl3mwO+aMysT+RRW7s7ZJrYIijuuFbcavuXRBao9f3i1iFC5kOwnx4ZSRf3aq1wvxS11IOcdcyasG83JxR9N2EpVWiLTWMcBC0uYg3Nd/XGpTkcaZ1onlIrZuHyvmcKeRFWWfYsbWx9gT6HGKR83JIEpEoh6rGGI9Dyg3tHXJPCsKXy83mUCh+2cvQD2J/IgtYU1UsjJAyEq/dG8genbUudMBnwB8d7gj7OuvgRrL0KEPx2p2TuIOv7t1Gsoj8BFJ1Z/gas2p2LRMsmBfbUgX8fC9REtVVxRR8XWcPkB39C1F8GZ8zrRPlUKpuP6TicwbDqVdelNURJ9tHe6A5xCLn5ZAkIsZ+RGKC8ThsiD6dT+63GiZUOhWjmcDPIfRrzW+xA0B3rtB6evaVWMC44m061RpSRp9w+V3izzFw25l9++08dOfLmWpn3OquLdnV1Gt/tdgfK4UH2vnUOEXcl6rrg7IKNzsaMzNhSi2YF3e0FqrV0s8new7sblKdI9+HtleMUt1SECV5nGmdKIcerE6q3KlNAT5nduqVF+Xsq+2jPcshFjkvhxg/1i9Gb2TYVl0x5Em15g/hHvbwzzT7YY3JzeRQj+X901LDgX4qD5BYQO7iJl0cf2UXpTnvlfrLsY89PY/YCt+5VqDrhMkxB1dlvMQfK0G3VNeMvzeBVN2wcm1i6X3Lc4h5Ae0jgCCjZbzumibWRnA8cUv0vSaiJI8zrRPlEDz+Z7XmbhTwObNTr7woz/u2k/bsGyONnJdDjJ+IM8DtU4b9578N+S2NhmRkYsy3z1rZKnddsABuEY+FeyfTPuahoRSwpVWG5uM4mFVR9oSMutA8yoOEv7Q6l/b1cVH6Us+MR62yNB/HIsV/T0qpC83Deg757NO5tH9wqsZQzLe1/F/bLnQUHLM7moEJziYbVfwPiLxJyXNyPs8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.98;4.blob,1.1,3860.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,3.135;4.blob,1.1,2228.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.174;4.blob,1.1,2876.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;3.end,1.1;4.move,1.4,1.3,1.2,3.130,1.0;4.sync,10.6492310108;4.copy,1.1,1.0,1.0,3.960,3.570,2.14,1.1,1.0,2.95;4.rect,1.1,2.51,1.3,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.21,3.238,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,2.63,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.41,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.64,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.60,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,2.63,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,2.62,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.60,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.60,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.60,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,2.60,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,2.58,2.68,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,2.60,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.58,2.16,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,2.22;4.blob,1.1,4080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.60;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAAHYAAAAdCAMAAABISmi6AAACBFBMVEUAAAA4ODj///+Li4vT09MREREgICCkpKSvr6+VlZWfn59sbGz5+fkrKyu3t7f19fX7+/tLS0seHh6qqqrz8/Pu7u6enp4QEBAoKCi0tLTx8fGioqIYGBg3NzfBwcH39/fp6emTk5MMDAxCQkLR0dF1dXVoaGjo6OixsbFPT0/W1tbFxcUxMTFERETS0tJgYGA8PDxVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU3l5eV6enpUVFQVFRXk5ORjY2MTExPr6+vKyspOTk5ZWVnX19cHBwcnJyf29va4uLhISEhiYmK1tbUiIiL4+PjAwMBJSUns7OzGxsZRUVHU1NTf39/m5uZ8fHz09PT6+vqHh4deXl7y8vIyMjLw8PDa2toEBARHR0dBQUEKCgqIiIgNDQ1FRUU9PT0DAwNDQ0NMTEwLCwuurq4ICAhqamrCwsIfHx+EhISMjIzJycmhoaHQ0NBSUlKlpaXLy8uKiort7e3c3NyWlpagoKDi4uKQkJBnZ2cmJib+/v7e3t6rq6s0NDQcHByNjY1WVlaCgoKXl5fg4OAbGxvv7+8ODg4dHR2tra2SkpJKSkrq6updXV0tLS0UFBTHx8cpKSlfX1+9vb1cXFwhISEkJCS2trbn5+ebm5s6OjrExMSsrKx2dnbb29sXFxdubm5vb2+ZmZnPz8/d3d2FhYXUDPzBAAACaklEQVRIiWNgoB5gZGIE08wsVDSUeGtZ2YhSzs5BXWuJBJxc6CLcPLx8/AKCQJaQsIiomDhITEJSREpaBsSSlZNXUFRCVaeswsOiCrJWjYmJSR1sCLuGpha/tg6IqavHo6fPZIBkg6GRsYmpmbkFqrVMlla61kA7bGz1rO3U+YBC9g6OTs4uKq4MDG7uHp5eot4o6nx8/fz1A0DWyhgYsEOtVQgMsg4OcYXKhqJYGyYV7sISEBGJZm0UhMEcDTRTmSmGgcEk1hhoI5MmA4NwXDwDQwJTIrI6TockBoYgaCAnw6xNYWBIZUoDygYAZS1QrGVIz5APz8xCC2QmMwhDKzsnJ8fMPZeBIU8YxM8Hhm14AYjlUIisrqiYARG3MGtLgIQPUylQtgwsi2Itg7RkeQWqrUDjciCMSiYwAIZFVTVUzoyJG0Sp1CCrqy3EYS0bkzVQtg7T2vqIhrTGTBzWNjW3gEArzLcgwA/xbRuyuqIafNYWsWNa297BwCAWhMPazi5Qiu0GYpOeXgaGvh5g0uuHxK0usroJCsDQnojLWkUHoGwm1NreXgZcAG6czaSSyanMEVMYGKZOmpbZrlcCFJ8uz5cwo9IDRV2++0zPWbWwlFxpYCCBbO1s+ZmeM2wh1mYF9IgTtJZhTn+siF8GiCU0N3zefBsQa8FCeYfOXlR1iSwRwV6wfAsEi5CtZchg4dFbDAkLV5claOmXdgDkRrXGpfSyDgrS1JcpLxddQWdbGRi8VvquWp1DWN0oGAVDEFCrUUMiwGzU0B5gbdTQHmBt1NABYGvU0ANgadTQAWBr1NABYGvU0BwAAEfZgWhqZsIjAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.122,1.0;4.sync,10.6492310131;4.copy,1.1,1.0,1.0,3.960,3.475,2.14,1.1,1.0,3.190;4.rect,1.1,2.70,2.41,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.39,3.388,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.22,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.41,3.208,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.158,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.60,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.157,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.98,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.116,3.157,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.153,2.36,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.155,2.38,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.153,3.438,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.1;4.blob,1.1,2508.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,2.41;4.blob,1.1,5672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,3.116;4.blob,1.1,4472.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.155;4.blob,1.1,4372.iVBORw0KGgoAAAANSUhEUgAAArkAAAAjCAMAAACn4uKKAAAC9FBMVEUAAAB3d3fU1NSkpKSvr68yMjL9/f0bGxuVlZWfn5+QkJC8vLxVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU0EBATp6eleXl58fHzx8fH09PTX19fT09Ps7Oz6+vqHh4dLS0sLCwsDAwNDQ0P39/dMTEypqamjo6OioqK0tLTLy8uKiopFRUVnZ2cmJiY9PT3+/v7k5OQCAgJWVlaCgoKenp5RUVHCwsIhISEsLCx9fX3Ozs7W1tZwcHAkJCQYGBh1dXXFxcVUVFTPz89oaGj////o6OigoKDQ0NAICAgoKCixsbHu7u7w8PAaGhowMDAiIiKLi4uUlJTi4uKdnZ0cHBw4ODiAgID4+PjDw8M/Pz9EREQ8PDzq6uqhoaEBAQEfHx+/v79aWlrc3NwMDAwtLS3z8/O6urpOTk5XV1fMzMwREREgICBfX1/a2toNDQ2qqqo+Pj4VFRX19fVJSUmIiIiEhITb29t5eXkGBgYTExPy8vKcnJwjIyPJycnGxsZSUlK9vb0ODg4SEhJtbW2amppbW1vl5eWZmZlsbGz5+fkrKyu3t7f7+/u4uLitra0XFxddXV329vYUFBTNzc2YmJg0NDRAQEBPT08xMTEeHh4QEBC+vr42NjZ7e3tZWVmDg4NgYGDr6+vj4+NBQUE3NzfBwcGTk5Pf39/t7e1CQkLR0dHS0tKrq6uwsLBISEjv7++np6fIyMhcXFzY2Nh6enpGRkZqamrHx8cqKirKysoHBwcWFhZjY2MFBQVTU1ONjY38/PxHR0cnJydiYmK1tbXAwMDm5uZ2dnbV1dXe3t5lZWWOjo45OTnn5+fh4eFhYWGBgYF+fn4lJSU1NTXd3d0KCgpzc3N/f390dHRQUFCFhYWsrKyurq5ycnLg4OCMjIybm5ulpaVKSkqmpqaWlpZpaWkzMzMuLi5vb29ra2sdHR2Xl5c7Ozu2tra7u7uSkpKoqKhmZmYpKSmysrIvLy+JiYkZGRlubm46OjrExMS5ubl4eHge5LDBAAAJlklEQVR4nO1ce1wU1xW+iCHUEHyBssAKCCrRym5MlChFxVxgXTACIigvkQgBFA1rgqABISYoEghgqI/QhBWqPBRipGpRK4qakqqJ0Wh9xKQaW9vUtE3Tatt/emdmZ+69OLvugj+HP+73x3Dmnjnf/c6cszN3hgUAzMJukHkfA8PAxSA7pRUwMFgL+8GS+YTDkwoKYWCwCY4/kcwhTymog4HBBjg97Tx02PARI/kdF9dRCsthYLASo91U7h6e6jH8jpfKW1k1DAxWw2esr8rPW7DHjVdUCgODLZjg/8xEwXL2naSsFAYG6/FT9eQAjR9vjtA+q7AYBgarMeU5AJ6fypvTJiqshYGhLwjUvKC0BAaGPmD6DKUVMDD0BUE/U1oBAwMDAwMDAwMDAwMDAwPDQEMwv53prawKBgYbMWs2/yNkjnN/mV6EEIaa9YaFW4oNE/9EiCPhoXtE8/YBc/URkePn9ZPkIape0nu6jZtvDVGUh1lXNISamAWxtkpbCBc+jFkOcSij+EWLwQCpdEJEoGBMGGzueGsxMzHRvt/5IJLEpGS0SXlE89qOJUmpU5cGpb3cPxbLqpalZ7ySmZVkTdNlLzfritYmBqzISVtpozSxcy0wyyEuPTHRa5XDqwOj0j454u8Wcg2rrWYwi9f6nQ8H7euPcF7bEZaHrgJL1Gv6TWRBVbJrPgAFa9f1b4LoNLR5Q/O0jWFi59qIuEi0SSks4ncUr/R6g3RpWVcsWiUlALwZv4Ez095Cm7ezVKUbC7jdTWWbyw3veJFU9hUTkwyV79K8YsRiWMXtFnlw+cwKrdbPAxTfXP90twkzTfnUBG1ZSebzHleXWvhzNId+a5Bh9jZAWmD7qvSI53f0yscSZGKHopzf3wBWwjp8mMvaX/CpfkAqkNMsjSXAD9ML6407G9BY4y99XXe9TKsilZqg381tq0ZR3mX+TUmVkymLuD9KzDgPvnOBNppiwfqwFly35pYyj1lc52Jm4rwktJa11sNE+fPHdy6IaqJyU6zSe/ZKwtqgqf28PdvRYR/tQ2Ydl6OTQ9zYj/dX8GcAlnYkhMwk87GH+l8dqC6meHFE1kG0OQRHIMUww2tF02zKW2D89SsfuLd08vmszMo7DMzk41o0NWTQ7k7SytW2hhwJLe+Vj4ijOh7UVzJlYn/jClwM40CjuhMfNhlKNx+sQE6zNJYAjy3tCj++bxoAJ6or2rojTlKqKKUmjILDTPd47K3xzPBzCo9xJi18f8TMOA++c53VHSQL1kdokeo2P/7U6npPrqqYGfPx3tOWO3evx8CodNInkrASOEUwOt3zvLlyBAMw7Ldof34tGquCBfwZeOCv0Ox70H3vU7iN5MURb3OO3xnR7TfsNBIxFZ4hvUMjUXFOwK1cPrrUs+IDi0w+qMyTYABpRa1FhWiGT9D5SKqExX8INfZg7HJYU3dOCz6bQxxWx1WuU6c7SiqQ0yyNJcBYcO5zcP4cAKtyXAA4DhtIVZRSEaPVqvELaW8bPATAF/4XSAuzYGacR/RFnW5zhlssyYL1EVqkujkav+SqsJBkxnyOnsg70nzn6nSHL8H6AVHpArgeKwu9TOpM2X0ZPFv6e868si8ddcFy/gwM752PfRbaZMNuileKOKpdB/KNV4Fp9dOpOUB6p63iDl6CbmhhQde6tomUD+bDxc7ntGIr6Dq6pg6vPkDNKyGwlkc2pVQmtqnhqwWRgVHkepPv3C4I/anVgoxmaYzr3BtxYLQWABUv3fg1qYpSKiE4qhR+40N6c43FI0t4H7YwC2bGeURzn868OmoOrI/QItWtMBngda7YuRJf4R94r7nO5WZz+4pSpVilT8BmrMzdkRJ6Pgc0qLmr+k3NLa8Ll0yd+8ArDL5zQVkHyUtE2Bl2TFHPE/MBkc+R3rRvRZYw2AWlBw35fJZzV1BsNQlX1TFUPhJkVwsysRkbrneXV528TRwWDK8A8MfaYqpz5TRLY7hzh8NNnKcljFRFKSXgYgcvUd7g5HZ1xhlAWSILwYzziN5ZW3uqiJ5D0kdqkeoWw/WxXOfyfDFDgKXOTa+tnewDSFXKVfpP8FWszGMBJXS7Q91b/Jsy/y1oc8Vi52bDIyQvEbFDdSfjFhDzydf8mfQKn0TeG982Xt1I5xN9zlI+PXv4q2oslQ9WJbdakIkds9H1izXv9RAPaMCnnT9H10+SCuQ0S2PENdcgXOeOkaoopQKOvs69FgXPLOrl9Tmj9z3RyzKxYGaic9O4G+piag6sj9Ai1a2Q62OznVtoDyx1biSxo3SlYyHxKqznNVppxbdN/P9YKE9Fm9FmOzcHXdiOwJdIXiIC7Opx4PsiTIvWw07cOcPeoe3onviX9pH8ut076EY2lU9H/Jdc3mby+e4Gd8N+kjqPGGZXC71iQ9xDwV9nlFFZOYa+ibZ775IK5DRLY0TnVgprywRSFaW0RFgFXFyEzlrK/u9Jr10LuqDVwM9IC7NgZrpzwYxyag6sj9Ai1e1vrmjZcNNc5+4yIq+fqXNLpPWKCXKdq1il89WfSlp8yjbRSp3iz7pwP29r1hyPcoCbgXznwr9P+ocKlYB/Wm1KTJxLRYA3HA7yx4VpKlaPilhE8dUkHfSb0hquE96VbDboqXwOdSUn3A41l09uUnjVpCj1MnJey5CLDYR7QL6BfgF5eHdLZsLn3PtcrEBOszRGdO4PvuXHVzRVUGcDzya+t0HPv+/8c6vfYHUz6f3Rd6/XzcGqYNLCLJi5V+dmwh9JFqwPR+C6Lakubvs4Rny3IDBjvkDf4rYVWqFzRaUYuHMHQqWL8Nr2BSgunL8W8sw3/ovfTZkeU3136Q0vIN+5cz70rK7MBdKv865REWDH2kwhn6c6XKv1/6b5tt9Vnf2Gi+XfT9dz6z6cD1i/P35Gprl8QHBlZPqpsdS8liEXC5ruAZBKL5NA7C2janYIpUBOszRGdC64/x9f43cltCo8m+m9DULjSWN7RgCgvI3/9Wz//j5lESwSc6/O9Un7iGKR9OEIom4NHupB3eL7XIGZOC9jPcpaPxGuyKLSfOGJwYfs3IFQ6fN5Ur3unBafZ4ZoXCz3AAnhCc08Ju60gYxBWfAfOc275NA+oVvqHx78eCs9T31fNLOmi9a1/TYwWO7cC5e7jvRBFoMiCAi913wnYiM1Nld4Yih4WOxjr/SxVNMXHq6Uiity5/R7NhBY7tz3Q//XN10MSqB7TvzFq9Z/d4vEY6+095ar/M8fTkv/dsklxPpv7zAwKIUa4XcIzdTXaMD/AQTcQekCoWCPAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.121,1.0;4.sync,10.6492310159;4.copy,1.1,1.0,1.0,3.960,3.646,2.14,1.1,1.0,2.19;4.rect,1.1,2.40,1.6,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,1.1,3.256,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.3;4.blob,1.1,504.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAt1BMVEUAAAB3d3fU1NSkpKSvr68yMjL9/f0bGxuVlZWfn5+QkJC8vLxVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU0EBATp6eleXl58fHzx8fH09PTX19fT09Ps7Oz6+vqHh4dLS0sLCwsDAwNDQ0P39/dMTEypqamjo6OioqK0tLTLy8uKiopFRUVnZ2cmJiY9PT3+/v7k5OQCAgJWVlaCgoKenp5RUVHCwsIhISEsLCx9fX3Ozs7W1tZwcHDQ4TovAAAAfElEQVQImWNgQAWMTAzogIkRTDGzwEVY2djBNAcnXIiLG0jw8PLxCwgKCYNFRETFgKS4hKSUtIysHFhIXlIBRCkqKUuqKED0qapBaHUNTS0Ii09ZG0zryOrq6auAmUIGhmDayJiBwcQUzDTTQnemub4FupClFYZnrG3AFAA35QhZnmKVJAAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.117,1.0;4.sync,10.6492310178;4.copy,1.1,1.0,1.0,3.960,3.570,2.14,1.1,1.0,2.95;4.rect,1.1,2.40,2.25,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,1.3,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,2.82,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.22,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,2.25,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.25,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.26,1.8,2.65;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,2.80,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,2.80,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,2.79,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,2.79,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.79,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.79,2.27,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.82,2.37,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.79,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,2.82,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,2.79,2.39,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,2.79,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.1;4.blob,1.1,3480.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.20;4.blob,1.1,3404.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,2.43;4.blob,1.1,2780.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;3.end,1.1;4.sync,10.6492310199;4.move,1.4,1.3,1.2,3.116,1.0;4.sync,10.6492310210;4.copy,1.1,1.0,1.0,3.960,3.646,2.14,1.1,1.0,2.19;4.rect,1.1,2.70,1.1,3.717,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,1.3;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492310222;4.sync,10.6492310233;4.sync,10.6492310243;4.sync,10.6492310253;4.move,1.4,1.3,1.2,3.115,1.0;4.sync,10.6492310264;4.copy,1.1,1.0,1.0,3.960,3.627,2.14,1.1,1.0,2.38;4.rect,1.1,2.70,2.22,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,2.20,3.386,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.24,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.20,3.268,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,2.25,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.1;4.blob,1.1,2832.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;3.end,1.1;4.sync,10.6492310278;4.sync,10.6492310289;4.sync,10.6492310299;4.sync,10.6492310309;4.move,1.4,1.3,1.2,3.116,1.0;4.sync,10.6492310681;4.copy,1.1,1.0,2.38,3.960,3.627,2.14,1.1,1.0,1.0;4.rect,1.1,2.70,3.630,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.649,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.648,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.630;4.blob,1.1,2092.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;3.end,1.1;4.move,1.4,1.3,1.2,3.117,1.0;4.sync,10.6492310703;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;4.rect,1.1,2.40,3.649,3.217,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.4,1.3,1.2,3.118,1.0;4.sync,10.6492310715;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;3.img,1.1,2.14,1.1,9.image/png,2.42,3.649;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAt1BMVEUAAAB3d3fU1NQyMjL9/f0bGxukpKSvr6+QkJC8vLyVlZWfn58EBATp6eleXl5VVVVxcXEPDw+GhoaPj48JCQlkZGRNTU1LS0v09PQLCwt8fHzx8fHX19fT09Ps7Oz6+vqHh4epqamjo6MDAwNDQ0P39/dMTExFRUWioqK0tLTLy8uKiork5OQCAgJnZ2cmJiY9PT3+/v7CwsJWVlaCgoKenp5RUVEhISEsLCx9fX3Ozs7W1tZwcHCOTyUpAAAAhUlEQVQYlWNgAAJGJgacgIkRpxQzCyuEwcYOE4KzODihDC5uBjQWDy8fiOIXEBQSFhEVQ2YxiEtIguSkpCVkZOXkFZBZDIpKEP3KKqoSapIoLEFVdaglGppa2qgsUR1diICevL6BoRoKywiqlsHYhIHB1AyZZW5ogdPjllY4pRisbXBKAQDYjQ02A4MU1gAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.122,1.0;4.sync,10.6492310727;4.copy,1.1,1.0,2.95,3.960,3.570,2.14,1.1,1.0,1.0;4.rect,1.1,2.40,3.614,1.9,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.592,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.576,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.572,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.614,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.613,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.612,2.68,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.614,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.614,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.611,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.571;4.blob,1.1,3644.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.592;4.blob,1.1,3080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.613;4.blob,1.1,2776.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;3.end,1.1;4.move,1.4,1.3,1.2,3.126,1.0;4.sync,10.6492310754;4.copy,1.1,1.0,2.95,3.960,3.570,2.14,1.1,1.0,1.0;4.rect,1.1,2.70,3.571,3.669,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.595,2.10,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.595,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.595,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.592,3.176,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.613,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.630,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.652,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.573;4.blob,1.1,2708.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.630;4.blob,1.1,4012.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;3.end,1.1;4.move,1.4,1.3,1.2,3.156,1.0;4.sync,10.6492310772;4.rect,1.1,3.121,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.22,2.49,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.23,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.41,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.44,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,2.41,1.8,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,2.40,3.397,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.60,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.79,3.178,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,2.82,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,2.79,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.117,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.119,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.139,1.9,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.139,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.139,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.134,1.8,3.185;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.139,1.8,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.139,1.8,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.137,1.8,3.182;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.139,1.9,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.139,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.139,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.136,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.137,2.28,2.87;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.139,2.18,2.89;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.139,2.28,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.136,2.18,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.136,2.89,3.186;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.136,2.29,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.136,2.20,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.134,2.56,3.185;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.136,2.38,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.136,2.28,3.183;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.139,2.38,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.158,2.37,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.155,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.164,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.212,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.212,2.49,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.211,2.77,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.254,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.253,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.250,3.138,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.250,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.307,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.305,3.238,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.329,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.326,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.326,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.364,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.421,1.6,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.421,3.198,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.423,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.459,2.40,3.202;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.479,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.478,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.481,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.476,3.108,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.479,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.476,2.28,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.476,3.438,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.497,3.146,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.535,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.557,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.554,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.652,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.658,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.649,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.649,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.647,2.18,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.592,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.592,2.26,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.649,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.652,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.654,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.649,3.108,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.2;4.blob,1.1,3668.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.79;4.blob,1.1,5500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,3.136;4.blob,1.1,1824.iVBORw0KGgoAAAANSUhEUgAAALMAAAAMCAMAAAAeVnxhAAACQ1BMVEUAAACLi4vT09NoaGj////o6OigoKDQ0NA4ODgREREgICAYGBg8PDykpKSsrKzIyMiIiIiGhoa9vb2+vr5tbW0NDQ02NjaxsbFPT0/W1tb19fXFxcUxMTE3NzfBwcH39/fp6emTk5MMDAzk5OR1dXX29vYaGhoeHh6qqqrz8/Pu7u6enp4QEBASEhL4+Pjc3NyamppbW1vMzMz09PTl5eWZmZkTExNCQkLR0dH5+flTU1MEBASpqan6+voHBwfGxsZRUVFUVFTU1NTf398nJye4uLhISEhiYmK1tbU1NTW/v7/V1dW6urpLS0tfX1/t7e0VFRXS0tJjY2O3t7enp6dVVVX9/f2AgIBDQ0NcXFzY2NgiIiLAwMBJSUlgYGDs7OwUFBTh4eFhYWHPz89FRUU9PT3a2tpHR0dBQUHm5uY5OTny8vIyMjJEREQkJCSPj480NDRdXV2VlZXr6+sKCgpycnKdnZ3w8PAhISGcnJxSUlKEhISMjIz+/v5qamqurq4ICAgJCQkBAQF/f38CAgJ0dHRQUFDJycmhoaFpaWlsbGyCgoKHh4d+fn4WFhZKSkqmpqZzc3Pi4uIlJSV5eXmYmJje3t6NjY0GBgZra2urq6scHByvr6+0tLTNzc3X19c7OzvOzs6tra3b29uXl5fg4OAbGxuWlpZNTU18fHySkpIODg4oKCgpKSleXl7Dw8Pq6uotLS3n5+crKysfHx8LCwvv7+9ubm46OjrExMS8vLx6enoZGRmJiYl9fX22trZaWlr73lfsAAAC0ElEQVRIia2U+VsSQRjHX2xAw1XLFBMzKCSPyiyPNANFQxSPtUjT1LQypUOTKLUSBS3LsstMyQ7Lo8vusvv605phfR6ZZZcefHp/mPe78+7s+9mZ9x0AyiRBHrcMISTlqcBNFhzoCirbAovHQlCI6KLlco8LZZgwKU/9y8Ij+DOBM1PZFlg85o950VZIfZVf+x/Motlo5pWRAKuiIBop6JPxwxwWszpWGbeGyPi1KvW69VhokMd4zAlSbcwGIhOTklM2bvIObk6NIm5LGh62bkvPyMyisnmxbM/OCUqgmHeoIVe5E+J1evpk/DGr8/INBYV6gF1aY5EppRjPlTDmUoZhaGZUVl7BxmFVqdlt2CO1UNG95FwUhKWqel9N7X4jlW2RpS61vuFAI8UsR02Kgxo4dFiUVIA5GqAZHQFIaskFaEVWMitQG0fxb+WjY7idjofi/UInvKNtqB3gZCmh6gDQ21CWcN5T9tPkK1Q9s9YznV3dkrMBMJM6rUPnANLPk2d7jwgzeU/v6AWI7XM6nS5tr3e0v3AALmRcJHIwIhmXglw476XL4NODZVF9JouteChAZjkygAtdIc/ZMj/M0HUV7wtX7cNU+FoLWHXXsbjhuFleckuMeaTHl3k4U3179M6YYgnMoOT2edwPs9txF2BsooPYPSqcWK1Iu0/Eg4d4GBTdZ5kvs2FSCo8e5ziXwjzF1XMbmc2c9mHWuHGDkWwzs+RuecKLG5+yz4i3mPHwXIz5hdqFj2KBeW7O47rRBLiVBIP0KsswL4WVEPMrlaW1guU63oYGrLVNFLPD2PA65Q1WlW+Dbc0S3TuauSr1fS7xQ47RVkk1+iCc96M2sqh2hGOeb/zEXZjsZwBzJ3B3IrZwYSXEDF++quwz3L/3j7M5kxSV7Nt3tTbmB5HtU13J9TW8fXbbf3Irf41of/+ZLRfJaw3SFZg4Zv3k9DzAX+wTkmJSPnMQAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.174;4.blob,1.1,4040.iVBORw0KGgoAAAANSUhEUgAAAQsAAABICAMAAADWMCAWAAAC6FBMVEUAAAAMDAyKiorh4eH19fW5ubksLCyLi4vT09MHBwfAwMC/v79UVFRISEiSkpLr6+seHh4REREgICCsrKzIyMikpKSvr692dnaxsbEXFxfDw8P8/Px3d3eZmZmVlZWfn58CAgLk5OQcHByqqqpcXFzBwcELCwvf39+4uLjq6uqtra1sbGz5+fkrKyu3t7f7+/tLS0toaGj////o6OgSEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eUTExPz8/Pu7u6enp4QEBBVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU01NTXExMTt7e0xMTHg4OBGRkZqamr29va9vb16enpEREQYGBg8PDynp6c2NjY4ODj9/f2AgIBDQ0PY2NjV1dUVFRXS0tJjY2N8fHzx8fHX19fs7Oz6+vqHh4ddXV2cnJwuLi5HR0eWlpbe3t4GBgZlZWVeXl6IiIgkJCQiIiI0NDTy8vJCQkIyMjIDAwP39/dMTEyCgoIBAQHa2tpiYmJ/f390dHRQUFDW1taurq4ICAiioqK0tLTLy8tpaWmMjIwfHx+NjY2rq6t+fn5BQUEWFhZKSkr+/v6mpqZzc3NnZ2cmJiY9PT3Nzc1WVlZRUVE7OzsZGRkUFBQwMDDb29uXl5cbGxt7e3tra2uoqKhFRUVmZma7u7soKCjn5+cEBAR5eXnQ0NAtLS1aWlrOzs7Pz8+Dg4OJiYl9fX3i4uK2trbw8PCwsLBhYWHZ2dmysrI5OTnU1NSgoKCjo6NXV1cvLy+YmJg/Pz/GxsZPT09AQEDJyclgYGDj4+N1dXUaGhrHx8cqKiolJSW1tbXCwsK6urpfX1/FxcWOjo5wcHCBgYHm5uYFBQWFhYWdnZ14eHhvb2+UlJSTk5MODg46OjoKCgojIyMnJyehoaFJSUmlpaVSUlK8vLzp6elOTk6EhIS+vr6QkJCpqakhISENDQ03Nzfv7+/KyspZWVnR0dEdHR0pKSmbm5tubm4Tu/GUAAAIqUlEQVR4nO1beXxMRxz/iWisRINYDQlNHBFEEhNpsIRIiCOWNLElzggrGtQRNCRUGve5qKMU1RSROupoS+IoLW3U3WrV0dI6WnW0evzbmfd238zj7Xtrz4T9/vHe7JuZ3858P/Pm7fvu9weggEoelT2rvGC+3quqUoRnBqpq3j7VX/StYbZBzVoyvf1q239EToO6zmMXXvKvWy8gMLC+deEqNBcNXhZ/DgpuqG7UuElIU0xTqEczz+Z1ydUWYS3DPSMiAVohhKLIldbRr5BTTBt8aNtO075+B1wIRhxIRY1GsR07xTlzJjaic3xCl66J3bozl3r0VCVV6uUHWhWokX/vPsmvkqstUPuUVJ++AH11OjXHBbxGVkA/1B9HSRswsPGgUNJZ5z1Yp9Ph0pDgoT7pUeFOn5H1GJahGV51hH4kcylz1Ov1IGs0DE0E9ZixAG+gXkC4GCe0GM9zkYomAHQdjEsTs/Euk4nIwhDuEa9JmLjJaIqTJmIPvDkwRzM1hL0SP613HcgckJuH75F2+HNNNB0IF4lCCyMXuU1nQFD7t0hxZu1YfGdwW6qJi/y3CwoKEpP7OGEOdsOs2XM8RBfmzusfMz90wbiFRi4gLAUIFwVCCyMXsCgPFuuX4MJSw7LIHsvFXCTxO8dIqDhYoX9npWEqeyXVe2yMvluypqWwLtJBmosaaf3acA+h2avwYaaYizELswkaOn4KdsPqaQCd1rBXCka8G7IW1q7DRXVeEEA6eg+kuYDQ0UncrhvujQ/DeC7qr+frNmgr4eNGx47e4ViR8X7qzE2kpEYfFH6o2UyKAhfkOZKk020h5c7RW4vIea5hW5ZXGmpJyploxuLGmMghzYozC730H7liBnbE9h05W7eRgnrnrhHJzYeQosBFK34f8CPlsb4fc9dyd+9J3rtdG8mVFySFDScMTGi+L7baQOeP3kHg9043CNxcULi5cMMNNxyLJXs/sTXEp59NtsdI7AAljU8B+/MO4KO2JBcfo4dJtyktlg2x8WDGOqu/355gNT4rVKq+hkPkpEU++BhmHReQGOaSF1xZjc8KLiajw+SkRcV4Yeit5AIGHXnqL7YDZDQ+QbH7HGWSqqNVRbqftIo3FXHvKtqd6BhABObiSAz+mI2+gFS0K/bL474nFhMuvopK9v9aHEXQETGKDzpuxmYgr/FRxa5dGT6cRN2A0f3MqHjH0DfkpG1zag5AgJiLBdsDirNqn8ZcoDORZ5POiaMIOiLGjmUOnvmTkNf46D3Slgh9533x+xnV/cyoeBciOJlMW78fWgppYi4aQuVvYVFlzMV3KoA16IAoCqsj7i9z5LSlIavxUS4uBo/Cb6XfA6v7Sap4Kt2eH7iC9giEl4HhcS60A2BYsHG/UBn6iKKwOmJ3Q5/WjpqzWchpfMzeGegZt1pP7m+q+0mqeJfQOf7lXrsB+qNCJMcF7JsmisLqRZCClLZXu0NW42O4iNP8eIa7hanuJ6niNUz3Pc8VtKMBqpwmXFzG94QkF2MNm0RRWC4m6716OGbG5iGr8VHFDuDKmLR+5Ex1PzMqXnzEVXLSNgC4hggXKdE/ETVUzEUw3nU6k/9WmCgsF6fKx99vVOOjih3Az2n8bkZ1PzMqXnd0nZy0l/FhM+HiZMCN1LlRj3FhCP1lXMd64igsFzt/dfAsLYSg8TGKHcRN4n5OsrqftIq3lNc9OS50hAu4OSh6x6HHuLiVcjvZf604CstFyQ3Hzc9meJzgZF5lfecwumP7t13M+M32IA5CjxkB6XxJkYvcvDLzdgULUamLwfp3Q0fj96hLxpKy7pd94patX7ciYq6tIcoJLq61NUJCB3uMww033HAkAktcPYLyg5JAV4/AtWA0vilpG103jvIARuO7a/MPg4oMkcZXdHucQvNnGiKNL1ITotD82Qar8f3hfO25fIFqfAk5ha4diqvBaHzdgoNcOhSXg9H4TnsotH1+cK8cSwbOxu4drh5B+UH+BVePwA033HDDDTeeAwjZh5KQd1+VmoRDY4oB4v8qdGLGLx29/DwsA80+lIKFXOAgumY38IG4HeUzfqVgfeYrHb38PCzGeJu5IAi2/n9Sm7KA6ehp6epVM1m2IhedEYxnj8Yw9WC8fYwrj8bbMjs2YxYxohEu1uWvus/1NnIhrFXG28c4+h40ybl9hfgyBE8PmwUsC7X/sXzPc71EfaW5CBnxME46y1bkojPFpbm6Qgzag3r7qCuP1nbw/fPOX8MfqTgu7rdbvwRYLoS1ynj7qKPvenJo9ekdT4nmQz2FFBcLOASJxnz76BqfkqYqZS5Uw9eHmMmyZV10prg0V1eIQXtQbx915dHaLvsS8KSIx7O0pMB760QQcSHEY7x91NHXKK8IIAstFs/nyXtEza8VHzEXeAEWopXKXPCQzLJlXXSmuDRXl8YQelBvH3Xl0drTjUjj+Xihl+b7BfQyhZTiwuhPoY4+DdfId54SF/c4q1d2TdGYyVgmopuWciGZZSty0TFc8Lm6Qgymh+Dto648Whsz2hSlFAWgeAu4EBx9iagFqXpUqsSF5D1CxlKLrBULuZDKsjXHBZ+rK8RgegjePurKo7X8uuBqo6sf1D9Q5oI6+jz5dbGA8QBKciF5jwhcsH1luJDKspXigubqCjHYvFyTt4+68mhtl4f4ifX3w+7c3hmSr62pyAV19DXn94tUxgMIrKfQBLP3CMcF21eOC4ksWykuBM8ezdBl83JN3j7qyqO165qVTV09tLiAf6a29PQXcSHEY7igjr5/csKzziaRp5HgAQTWUygHygXtS0fPZhrDPH7GElm2UlwInj2aocvm5Zq8fdSVx9TW2KvZ+i/py/3WOo6Ws1wI8RguGEfftZ45vhs4m6jJAwisp9AyLmhfOno20xjuGoqUojFxFbxZJm9fBYXfoKdoLM8F9fZVTCTE/vcUreW5oN6+iokin1z4H/E8ge/MNQi5AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.269;4.blob,1.1,3276.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.326;4.blob,1.1,4968.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.381;4.blob,1.1,4912.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.438;4.blob,1.1,3264.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,3.457;4.blob,1.1,4368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.476;4.blob,1.1,2296.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.514;4.blob,1.1,3576.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.553;4.blob,1.1,3228.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.571;4.blob,1.1,3136.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.628;4.blob,1.1,4140.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;3.end,1.1;4.move,1.4,1.3,1.2,3.170,1.0;4.sync,10.6492310831;4.copy,1.1,1.0,3.323,3.960,3.342,2.14,1.1,1.0,1.0;4.rect,1.1,2.41,3.343,3.456,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.383,3.117,3.225;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.384,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.457,2.86,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.400,3.377,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.443,1.9,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.443,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.459,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.459,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.462,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.459,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.457,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.459,2.88,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.498,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.498,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.499,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.519,2.18,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.516,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.519,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.514,1.8,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.576,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.554,3.128,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.555,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.557,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.554,2.57,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.633,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.595,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.590,3.157,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.633,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.633,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.653,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.647,2.97,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.646,2.16,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.120,3.362;4.blob,1.1,5460.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.400;4.blob,1.1,1964.iVBORw0KGgoAAAANSUhEUgAAALwAAAASCAMAAADWgUQHAAACTFBMVEUAAAABAQEkJCQYGBgLCwszMzPDw8P39/f29vajo6N1dXXFxcVUVFTPz88PDw8SEhLr6+vExMRJSUlAQEBLS0ukpKTQ0NBERETu7u4hISGioqKvr69YWFj///8gICADAwPa2tpwcHAVFRX19fV5eXn6+vpSUlIMDAycnJy9vb0ODg48PDxsbGz5+fkrKyu3t7f7+/tbW1vMzMz09PTl5eWZmZkTExODg4Pz8/PJyclgYGDj4+NBQUEeHh6qqqqenp4QEBAtLS20tLTt7e3q6uqtra0mJia4uLiKiooXFxeYmJjc3Nw0NDRISEjT09PIyMirq6uwsLDs7Ozv7+8wMDCampp6enpVVVX9/f2AgIBDQ0NcXFzY2NiNjY1aWlr8/PxHR0fCwsLk5OTS0tJjY2Po6OgUFBS6urpMTEzi4uKxsbFGRkZqamrGxsbV1dXh4eEICAh2dnZWVlYHBwfX19fb29t8fHz4+PheXl4iIiJdXV0cHByBgYF+fn6Li4vy8vJCQkIyMjIqKiolJSU1NTXe3t4GBgZlZWUxMTHn5+cRERF/f38JCQlQUFDg4ODW1taurq5NTU1iYmIaGhonJyeVlZVKSkr+/v6mpqZzc3OHh4ehoaE5OTkuLi4+Pj6dnZ3Nzc2UlJSIiIi/v7+Xl5cbGxt3d3fR0dFhYWECAgIKCgppaWlFRUUvLy+oqKhmZma7u7ssLCyMjIx9fX22trbw8PDAwMA3Nze5ubk6OjrOzs5XV1dvb2/m5uaQkJAEBASsrKxubm6FhYUpKSkoziYKAAADMElEQVRIiWNgAAFGBnoCJjiLNHuZWbAIsrKxc3BS6CASABc3mfby8PJhiPELCAoJi1DFXTiAqBgSR1xCklx7paQxhGRk5ShxGREA2fHyCopk26ukLIQupKJKvrOIA8iOV1NWJ99eDU0YS0sLRIrJgoE2kKmjq6evbACKSEMjYxNTM2AUy5pbWFoJWNsAxWztLCTsHUBaHJ2cXVzdUJ3n7uGi7OoJZHl5AwkfWWFkdaJivn7K/qxglQGBEB1k2MvA4CvrCWGwBAWDhEK0Q3W1tbVBHtGRNQkT52FmYAiPiIyKjnEHGRIbFy+W4J8IjLKkZJ6UVH2gsrSg9IxwsUyUzCMqm5Wdw6GJ4niEOlGJXDWevPwCkEqXQogO0u0FhbdsEYRRXFIKKXrKyqEu0JGtgDAqfYDSVbJmQEOqGfJrGGrzGRjq6oGmN8g2grzfxMDQ7NSC4vjWNgaGdtkOZMcj1Il2djEwCMuCwtFMVg2mh1R7QSC1mwEVIBnSA2X1+lsAo1QObEhfJENZEgND/4SCgoIejhxgWAhoTtRCM0PUCEh0yU5CdjxCHTjNTwaH2hTZBnLtBYGSqbgdXwBhTJs+Q6RlJqohzpA0OgsozTQ7WDV9DqbjGXTDUNI8XB3Y8cyyMkByruw8su0FAr/5BB3vtAAUCqiGtAb4gEA1WIH8nCz2KVhCPoWBYWE+3PFwdUiOr5aFl3Zk2MvQuoig4/UXg4RRDVnSByrilgLxsuXywNwouwKsVAuaMBRWMjCkyIYwMISVrwI5QBhZHZLj21TbybUXFBi6OgQdv3q6SkJdhKwesiFKLmJVa+pUHRkY1rIHikyTNga3UKBFFrC0WbdmvfEGIKspfrb46lSQ4xHqkBzPkDuVXHuBYCOoSACDTVA9mIYwbs7k2BLXJ4JsCAOT61aLbVEg6e07goI37ASrhBVZorzmQRyuSiCmWkz5rt3gZANXh+z42lLcjidgLwPDnr0roXr2Td/PQC0AybDEgMmqO8m3xmgzjHUghnxT0AHxjmeIXUx2A7zXBFZE81kcJNcQTECC41kWHCLTksN718CY+3no2wWBg7QwMjU2oLefAc8iEb99s+TKAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.438;4.blob,1.1,4912.iVBORw0KGgoAAAANSUhEUgAAApIAAAAkCAMAAAANWioVAAAC1lBMVEUAAAABAQEzMzPDw8P39/f29vajo6N3d3fU1NRoaGj///8ICAikpKTQ0NCLi4vT09MSEhLr6+vExMRJSUlAQEBLS0vo6Og4ODigoKAYGBg8PDzq6uqhoaEREREgICBYWFisrKzIyMgyMjL9/f0bGxvk5OSEhIR5eXn6+vqIiIiQkJC8vLxISEj19fUtLS20tLTt7e2tra0mJiZsbGz5+fkrKyu3t7f7+/tbW1vMzMz09PTl5eWZmZkTExNERESDg4Pz8/PJyclgYGDj4+NBQUEeHh6qqqru7u6enp4QEBA3NzfBwcHp6emTk5MMDAyYmJjc3Nw0NDRCQkLR0dF1dXX4+PhtbW2ampqxsbFPT0/W1tbFxcUxMTE/Pz9dXV3GxsYaGhooKCjx8fGioqIUFBTNzc0NDQ3S0tIEBAReXl5SUlJUVFTV1dXh4eHs7Oy6urpMTExVVVXi4uIPDw8wMDAODg56enqAgIBDQ0NcXFzY2Ni4uLiNjY1aWlr8/PxHR0fCwsIVFRVjY2MnJydiYmK1tbUiIiLAwMCnp6c2NjZRUVHf398HBwc1NTW/v7/Hx8cqKipkZGRfX1/KyspOTk5ZWVnX19fb29sWFhbm5uYLCwvn5+clJSV8fHwcHByBgYF+fn7y8vLa2tqVlZUKCgokJCSPj49FRUU9PT2Ojo45OTmGhobw8PBNTU2pqalWVla9vb0JCQlQUFDg4OCurq5qamqMjIx/f38CAgJ0dHQFBQWcnJwGBgaFhYX+/v4fHx+lpaXv7+9KSkqmpqZzc3OHh4eCgoKWlpZxcXEDAwPe3t6rq6uUlJSvr69vb29ra2uKiophYWGXl5eSkpIdHR0hISEsLCwvLy+wsLBpaWkpKSkjIyN9fX3Ozs65ubm7u7s6Ojq2trZXV1eJiYkZGRmbm5t2dnZwcHAXFxdubm6+vr54eHjPz8/d3d1GRkZlZWWoqKhmZmb39z+PAAALSUlEQVR4nO1b+2MU1RW+0QTiJCGukLgkgGCaGjCBpAQqAWLAQAoNlocpMVrAFk0kECAoAsFAgGLR8BCtilSrKMUiFJACto2xoK2VVkttbWur9dGnrX39B53Z3bnfuTNn7w6ZLAnNfj8sNzNzz/nOY3dml/MJEQ8kxcVqAk50T577QLUuuTQ5pV9Pk+gD6J4899Jq9U91ryxcZkSQJtIzyPEBmRpjlweuGDgoyx8hxZsLFq1s/HmlcaU/b3ofDm8OBLVM/SCYqj/vK8+ygnGtlo/KpPZ3rywMzsnJyR1iviSpbocO0xi7ytCd9QZ9S5q00rujJYeP8OLD4c2BnmtJX3mWFYxrtVyV0WVcwdV5n3KtJPI/rXfrwjUFXq+MjpjeRsa7JRUfI3tjS3ZHnuNcra635Khr3SsJ2ZKFmUUjLhHKjWz0mOLcks8ol2eE7/Q55nJs6bjxRZ+1bgrXTSibOGmyEOXG9RVTpgZuqDSPTZteUfW5GaovaQ/exMzPJ1fPutFcfGG2+TLHGBS60m6SufNKM29yBG5bvrzmi9afs+dTb+m1N9cV3XKrFViYqWrZZkp92KsvGQusfxYqTy3BjJuyU2oXUb9C3Dam4stfGUzZx4qc+rUtmy25uO72O8gOwsBPnlFBYsWdP5Irtgrl9aX1U629pFoAKiNjQ8a5eCkaqu90rQC7JasWLmlcuiyN3sgWNy1fsTKjeRW9/K6c+aXmnf5uK1XGxNXljWZlVubds2btuhYrVevvbc3YMGKjEG359Y2bsscrrmAP3jantBRuqfqq4Ftya819A6c2qS0Jy1+z3pPbrLM4ll698P7G1Afahdies2OpyVSxLJkSH1hN2Gm+7DIepN6CxvKs3cW3KH4nBx56+OuPzGsn7GNErvi1LaeKOyY8+phiGQz85BkVJFaY/CFXXBVCud8TaklZLQCVQWzIOBcvRVbZ464VYLfk3qFCDDIqQ39ESlRo7BLiG2O2qxueqIksxhqRBt86R4j2BcZkM1VPimXfFE8tM5+vnzZzONe4mu6EPXibvq9BiA3WimvJZwLPCnG/2pKwXG7sF+JbS5Vj6dXmx84B4znrSvs2QtJsMyU+sLrOMD8xvh1QUh/c024xOEh9PH/IfFdtNm4m7GNErvi1Laem7di7VY2IMuh6nmls0gqTP+SKq8IzTWbuD4dakvZGBKgMjc3OOBcvxXf6uVcAfZZcZByhAbUFjh6+27WBpOpYZPXCiArzA3tYKFXH7xFP5AtR9920tLRjKSfoTtiDt7KQ+8BJviWnDBGuJxZYTnrglHhx4veUYyHLW40lNEHEss2U+MDq+/k/EB2Bl5RoQ8+S7Z0nqI+N060zL99I2MeIXPFrW64b3nqrIyLKoOt5FtqW5HLFVWHKD0O5z3H0RgSkMiQ2+SzJxEuwKvmAa0VAW3KwcZUS0P4hpwuWH3RsIKmKfJ6c6Xwla/uraqqKw88VP1K2SnvS2zFjrHViXpBvyeaTwtWSxPJT+0RlwWPKsZDlYUYjTRAsS6Y0Sqz6F804UrBIoRz+enPox9TH7NciJ8E+RuSKX9uy0Wr8xBkRYeAjz9qWZHLFVqF5lKAtafdGBKgMjc3OOBcvwYP5L7pWBLqWFOL1g7XJm9UN7lSNud18eUFN1dmfzrHwpMNbxB68FYXfn+uF+Nky4f6UDApXSxLL0/K2zX9DPca1JCxLpmqU9mpG2ZvLX1EJh1qyo/Pn1Ef4U9KCZB8jcsWvbbmmsF/BTEdEhIGvPGtakssVV4Up6ULTkqgMjc3OOBcvwcZz7hWBpiX7z3vd/E5i/ELd4E7V+B3WYTVVbx23vr+pPznBHryVhJ9iyoVYXfOsFYbSkr+sNu9ZZ9SWpJZbXis+rB6jLTnp0fAOWJZMiQ+6mnU2b5sabTC/w3xatxjAx/OnzcePX50+TNjHiFzxa1tOFY/XHR/qiAgMup5noW1JLldcFWYFzNyviNaSqAyNzc44Fy/wduevXSsKV0ta39eKc3JuE+I3yb/NOvNG2X51gztV73Res2FAnjGOpqotN2PBgQEFo+lO2IO33yWP37C72Pputqt1SPk72VYywODllKOFa5sd37iJ5ZU1exvUY7QlFxinKtcuppYlU+IDKyF+n7fTkZ5gZ8vAO6suVXwszt254kh9RhphHyNy+CWWU4UYV1TriAgMup5nGpG7JblccVV4O/lo4e78aC2JytDY7Ixz8QLvvudeUbhaMvK/jMPNv2f+oen0+x84NrhTlfRuc8qH9x7PoqkS+0sOVdy3Rt0q7ZEgP7giOfBW6EvPknU1731kJYMwqMwsSN3i+F2SWO4I/NFxjLZk0vri0kdGU8uSKfFBvIkZT3/kiDZ47erqlNo/qX6nfVi2989tgrCPETn8EsvWT+VTjVfVHWDQ9TzTiNwtyeaKqYJYk1la/xcr91xLojI0NjvjXLxA3V/dqwSi4NwNDX2egYTVoZd1/q2nafRpbD/VuqmvMwCey/547ptVk3qaRt/G37P/0ecZEGz5pOafL6XFvi6BBBJIIIEEEvg/RR8QXSRwMYGILqIJHTwP7sZvkPW84HWY17c0wvtAc0zYXLTiERaedpw/U72wIyq6nlNWdBFN6JBoySiIQ0tqxSMAmcv2tOP8meqFHVHR9ZxyoovoQodES/KIQ0t6hGepQARdYqoRdkRFN4jyiOgiutCBjLBjNJ2RN7Dj/tzAPCy3nMstKgn99I9BfTlOT6QCsAe/WOEsJ3mQnAkDnTTC32g/4tBJHuh1kgtuloSB9AZAKiB3xBA1eK2gstduSeQP1fKae4CLXIIXXWiEDhhhx2g6J2/gxv25gXli2aj914mUoyGi9qA+xukhFYAV+MUKZznJAziDgV4a4We0H3FoJQ/kOnDBzdLBdI/akpAKyB0xRA1eK6jsjbQkyZ+sltfcA1zkAC+60AgdMMKO0XRO3sCN+/PiAmn5bIcQ/7bm9jGoj3F6SAVgBX6xwllO8gDOYKCXRvgZ7UccWskDuU7hMtJuSclUeqMgN+6RkZbUihq8VlDZayubkD9ZLa+5B7jIFTCDchqhAxlhl6PpnLyBG/fnxQXS8gTzZaixRZBBfYzTQyoAK/CLFc5ykgdwBgO9NMLPaD/i0EoeyHUKF7slwVR6o2BbUiNq8FpBZa/dJMifrJbn3EtwkStwt6RO6ICxIzKazsgbuHF/XlwgLVtBitLVAsNVZJxeSgXooD78yhXOcpIHcAYDvTTCz2g/hsS0kgdyncKFtmSYqfRGoWtJTtTgtYLK3ggXkj9Uy2PuJdjIFbhbUid0QEDKaLpL3sCN+/PiAmk5/L7bRIlinB5SAWVQH34jK5zlJA/gDAZ6aYSf0X7EoZU8kOsULq6WhDcKXUtyogavFVT2RriQ/KFaHnMPcJErcLekTuiAgDCazskbuHF/XlwgLe8z23+TcRclinF6SAVgBX6xwllO8gDOYKCXRvgZ7UccWskDuU7h4mpJeKOwpQKCaUlO1OC1gsreCBeSP1ktr7kHuMgVuFpSK3RAQBhN5+QN3Lg/Ly6Qlo3/HPhv2fuCEsU4PaQCsAK/WOEsJ3kAZzDQSyP8jPYjDq3kgVwHLpAegAG8UdhSAbkjhqjBawWxF1xI/mS1YuX+pKvruMgBTnShFTogIDKazsgb2HF/VlwgLX9yfVNKSZtKFOP0kArAHvxihbOM5AGcCQOtNMLXaD/i0Eke6HWSC6QHhIH0psQUkQrIHTFEDV4riL3gQvKHasXI/ahO19Q7F7kEJ7roIaFD+IH5IsOFHe3vRUIC79Uavi6ePOKKi7ElL+xof28SEniu1qqKj+NKJJ64GFvyAo/29yIhgedqNTT6nnj8HxZAjcl7b+gFAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.476;4.blob,1.1,2248.iVBORw0KGgoAAAANSUhEUgAAAVsAAAAPCAMAAAB9eZyKAAACT1BMVEUAAAABAQEzMzPDw8P39/f29vajo6N3d3fU1NSkpKTQ0NCLi4vT09OgoKBoaGj////o6OgSEhLr6+vExMRJSUlAQEBLS0usrKzIyMgREREgICAYGBg8PDxYWFgyMjL9/f0bGxuIiIh5eXn6+vqQkJC8vLzk5ORISEj19fUtLS20tLTt7e3q6uqtra0mJiYeHh6qqqrz8/Pu7u6enp4QEBBbW1vMzMz09PTl5eWZmZkTExN1dXWxsbEaGho3NzfBwcHp6emTk5MMDAyYmJjc3Nw0NDRsbGz5+fkrKyu3t7f7+/tERESDg4PJyclgYGDj4+NBQUEEBAReXl41NTW/v7/V1dXGxsZSUlJUVFTh4eEICAgUFBTs7Oy6urpMTExVVVXi4uIPDw8VFRXS0tJjY2OAgIBDQ0NcXFzY2Ni4uLhfX1/FxcUnJydiYmK1tbUwMDCampoODg56enqNjY1aWlr8/PxHR0fCwsILCwvn5+cqKiolJSXy8vJCQkIiIiIHBwddXV3m5uZRUVE5OTna2tp8fHz4+PgcHByBgYF+fn6pqalWVla9vb1NTU3W1taurq4JCQlqampQUFD+/v6EhISMjIzg4OBFRUUkJCShoaHv7++Hh4dKSkqmpqZzc3Pw8PCCgoLR0dFkZGQCAgIDAwPe3t6rq6vNzc0GBgZra2uUlJSKiorb29thYWGXl5c4ODgKCgohISEsLCx/f38oKCgvLy+wsLCvr69paWkpKSl9fX3Ozs7X19e5ubm7u7s6OjrAwMC2trYZGRlXV1dwcHDJ4EorAAAEAklEQVRYhe1W+VdMURy/aUY1yc2oET2imJYRypIlZKlkLJGlRlmyZq/IrojsiSEhkn3NToRsf5j3eu/d+73v3bk95zicg+8P03f6fj/L+5z37huE/sEK+kPYv796BNvsPX8bNiTU3BkqzAG+hPcSsYmnPD5BRQj3emOMI60Rkerj7BsV7epqLTkNgLVaoSHmTqt+MepfJov+A0RswimXT1DibGMlKcycra7Br4GY+LPkNADWYg2KG2zqjApWs+iufm22cg352WzjE6wp81isYmkNHWbu1HLjrkJKFom9kmJ6IOY5TE7xDE8dwSDEUx4fGjkqLX30GFZ47LiM8RMmIiXbSZH2zMks35Sptqxp09VNLdsZM+WPbBwNNXjMDnUqMU5zcmflJc12QQ3AwsEChO7Ui+ekzZ3nnJ/P6C7IWqiBaadVgbRosSQpZGHpS5YWLi7ywedwWXHJ8hWOlasgQjzl8ZW6VxeuicxjdFfErV23fkOZki0ucW30bGL4NtvLErekbw2QLdXgMW+TtufK03LmPMnB4yu8hbFQg7LwsBRBnHpx5Y6djqqYXYyuK2O3BqYdKfIM7+mPUDTOh9eTiPcitC+lwAARTs184ftliwfwILh1MBuh6hos3w4Rh6oROoxrId+oIwsQqmK90GypBo8ZoaN1RqdyUto9BT3zzgSCJQji1IuPoaLj6EQRo3uS/Kg4af55wZyPk/Ep6KnUefpMudmAcGrmqz/r8/ka7OeYtfMxafLTN0A7b6v95yBfxgXl03kRqvGy5TLzs21AJs/dZNtgcKpk27gWHXVD3VW2S9oa7QJkEYsHMp6aLl9JKKk1QoRTM59HPcWuwq1m/zVXwXWSLWq5AfgacI7yv9YIqMbLlsccIFsfMnnuJlufwSnIluredN/SALQTZYHgu/l2baZtswEinJr57tzNVuoY3Eq5J3+cJ9ne9z+AfEnqfVsJ1R7Kz6IxWx5zN9kCz9ayJU5BtlR31yMdSTtaEx4bs6CeQlpvy8c/fmKACKdmvrZG5Y0/mNnKW6RcSFe27vvyCwM/hXyp6nnrhWoVdc+Ua4yGGjxmcbbQs87CxRIEcQqyJbrP/S+0fdqBqsEv89cvg1ko71ePJL1C6LXtjav5bUYT3BdPeXylwx01l8ITkuFWuz++KjwOz5Kz9ZdFLUwPRpDvnS2vaqOnjFHbu/Oytz1SzVbX4DHTfCiWJgU96yzibIlTkC3Rfd+hA2kHKqjSk/shGWbRWz1N+snfp3wsvvKpk9kXT3l8qCm1Je3zOnbr/Ur7lx2N8u/HiGEVWfbMr4jh6+xrc7aVs2pLN9R1fFOz1TV4zDQfgKVnAvBMWITZEqcgW6Jb/10H0u5//ZL6AWf2b//E1ZuGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.495;4.blob,1.1,6004.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.533;4.blob,1.1,3820.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.591;4.blob,1.1,3320.iVBORw0KGgoAAAANSUhEUgAAAkMAAAA2CAMAAADzl23yAAACoFBMVEUAAABhYWHZ2dlCQkIbGxujo6Px8fEUFBQJCQn5+flqamrY2NiYmJjQ0NDOzs6mpqaysrLHx8dNTU3+/v4SEhJ6enr////6+vqLi4s1NTW1tbXIyMjPz8+lpaXU1NShoaEFBQWEhIQMDAyGhoYsLCxnZ2f7+/tpaWkPDw8TExMBAQEzMzPDw8P39/f29vZ3d3e2trbv7++goKBoaGjo6Ojr6+vExMRJSUlAQEBLS0vT09MgICDs7Oy7u7tPT09dXV3b29vV1dUHBwcYGBg8PDykpKSsrKxYWFgREREyMjL9/f2enp4jIyOIiIh5eXmQkJC8vLwCAgLu7u5/f3+bm5seHh6qqqrz8/MQEBBbW1vMzMz09PTl5eWZmZlsbGwrKyu3t7f19fUtLS20tLTt7e3q6uqtra0mJibk5OQ3NzfBwcHp6emTk5OxsbHW1tbFxcUxMTHc3Nw0NDQoKCiioqK4uLiKiooXFxfm5uZ1dXVERESDg4PJyclgYGDj4+NBQUEEBAReXl4ZGRlWVlYVFRXS0tJUVFRjY2NVVVWAgIBDQ0NcXFy6urpMTEzi4uK/v78nJydISEhiYmIwMDCampoODg7GxsZRUVHf39/KyspOTk5ZWVnX19fR0dFGRka9vb0WFha+vr6NjY1aWlr8/PxHR0fCwsILCwvy8vIiIiIqKiolJSXa2tp8fHz4+PgNDQ1FRUU9PT3w8PDe3t4GBgZlZWWwsLAcHBzh4eGBgYF+fn6pqamurq4ICAhQUFCMjIxSUlIfHx+Xl5fg4OCHh4dKSkpzc3MkJCQ5OTmWlpZkZGRwcHCrq6vNzc0DAwOUlJQKCgodHR19fX0hISFXV1cvLy+vr68pKSlfX1+oqKhmZmbLy8vAwMC5ubk6Ojrn5+esgbmAAAAG00lEQVR4nO2d+1sUVRjHj6II6npDDuAFzRtgLboIJoGiuGuKaYEX0vUCcgkjvIYVVqIi3u9ZaZqlYmlqpKaWoaaZpqWldi/7V5rZnZ33nZnjsAvrM888z/v5Ac6cM+d7vud9X2ZmeR4GxlibthGMIFpDu/aRHaz2QNicqOiOVlsg7E6nzlY7IOyOo73VDgi706Wr1Q4Iu9Otu9UOCLvTI6ZjT6s9EDYnljustkDYm4i4+ASrPRD2pldvqx0QdqdPX6sdEHYnsZ/VDgib0z/yCastEPZmwMCYQVZ7IOzN4CFJVlsgbE5yitUOCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIIB0OtNmAjHl+s7JyFJ59yptJr2YLj8cWqJcrDEo0tP4OGu1xp8ntjR3DO01vvrhl6Zox8elSmrjP+mfAuErpeuB2EZTVhrMJCi5QThxlbPrKyR4/JGTsul7HxbrcnHDU0wfQlI8/yLGPnREFfkHrC80z1hIQ+I2RC9yeMVWvWbZXypLx2hpafyWOl8nluyGDfwZTHX0NT48KrF/p5VhG6v9BjFey6LVF+/gVjy0d+wTT52/RY31GghmbMLCyY/KLcmjXbO2eu7+9k50XPLyoeor3+LSgpLSt/STOjgvvQLr/wZWflKwOkhsM/6saDcA/1VI1ZVLx4iUYZ6akOOi+VjpbxUdLX5SWFka+O15yH7snquiLlZhyoeKpXlBWXv6aNgbpfNCqKldoXtD8VFCv1PFEW0FzVVbfXpaeTiLw3xPlAykanNXxl4ZtvZby9CutJ1FauZvqWnzV8LTpSaqiuYl39+vQiqbUhb+OmzZ2qfe75nNia+vF4cofsLVs3OLYl4xkJ7u3j3G5NkbAdqdU7dxX0klq73e9ES6N78CjcQz2V775Xn/h+LlZGeqoDqKGUjL37Pth/IBefB3qwrkjZ3AHKEa/6sGPqQY0D2C+MimIFfcH6AyBWcJ4oCzAXXH1UWcVS5nycL84HyoLRaQ0/dPiIo6H3Uawnken9hOlbSnr5VnSk1FD8p5JoBJ/E2LFljOXm8BTfatrqk9jJjzP2WUkCniG6ds48UctYA5crm508pR+FdT2VnzPWyL/AykhPdQA1NPB0sryHMbp1FT1YV6xs5gDwnDnL2Jd8CXYA+4VRUaxQX5D+MIFYofgJsgBzURYyedK5gvNMt65BWeC0hp9nF75iX1/QZpVdVD/GXdR9oBPW0KJvmpqaolLlf9BwqXehdNXL8q0WpXdSl3Gwxx79DIFnr+/1RxmXNe4xgQzKLx49xq9gZU0NKQ6gho7OlI+/HaBbV9GDdcXKZg4Az2zpy0S+CzuA/aJRUaygL0h/mECsUPwEWYC5OAtX8wJ3mGZqSO9UrqFrG9nJCq1esrNRORFaCsJ7Wan/fvkdY9djumYmfK/Epclg5UY/V9yWm5oZAs9RfJ787UCaxj0GZzCL12NlTQ0pDqCGlv4AIoYcoXXFyqYOVHxVwqJjsQPYL4yKYoX6gvWHUGKF4yfIAszFWVhzZJwxLnplkVNUQ1jvVkW+MgVaCvku3zP15dtob+zMj8tkpEthyU/S4aVH1hBjd25WOXfgGSLPxf6fo0Ma9xhRBhVlUQ3dla6z+Drkx/hzDuuKlZtxoKBcadZjB7BfGBXFCvUF708lECsUP9Mawlnomx53yxAXg7LAKaohrHd0RWAutAKknZAexmZE38J7u3pNvjnIvwMo2i4v+KgaGnbgjvSQytvgGYzNHas/r9x/P6/RuMcYMgjKSE91EHvqZ3m/8vOQS7ov/eLqoVtX0YN1xcpmDgDPCennbj3fjR3AfmFUFCvUF6Q/TCBWKH6mNYSyMCum8Z7X/+nTmA9RDalOUQ0hvfvqq/TuG1+qd790y74HievO+j8vlLrdy6VnhjJHTmN83ALGkmKmNsTn8fli9786z2Ve/817A89gLIdPW7VZ8w/TfncWNfxRWq11rwLrQjRAGempDo4f6VeTlC7XUIey7lvXrnM04fNAD9YVK5s5ADz8z8a/vKM1EYf9wqgoVqgvSH+YQKxQ/ExrCFxlRd5ltXv/7i/Oh6iGVKeohlBW73UJTIUWMKiX63Sa/MFhhP/uN0Fq3ig/XfjPJqkx9N621OGHr2WK3bOF/2a7Rj9keIY051Bp9P4FmvMejnRmXN2jda8C66JIgjLogYMrnU51eeD7/dCM4d7/ptdpzkP7UNcVK5s6UPH0WZmdWl6niTjsF0ZFsUJ9wfpDqLGC+JnWkOrqzuK20pV6uXPKI/IhqCHVKaohlNVFtwNToUUEjf+puWWjBCFDNUS0Fqqh/wEK8zzcCVqxwAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.646;4.blob,1.1,1600.iVBORw0KGgoAAAANSUhEUgAAALMAAAASCAMAAAAnih+KAAAB6VBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0eLi4vT09O0tLQYGBgREREgICDIyMgODg5oaGjo6OikpKSxsbFPT0/W1tb19fXFxcUxMTEtLS3t7e3q6uqtra0mJibk5OT5+fm3t7f7+/tLS0uYmJjc3NxAQEAoKCjz8/Px8fGioqI3NzfBwcH39/fp6emTk5MMDAwLCwvs7Ozv7+8QEBA8PDzGxsZRUVFUVFTf398HBwcUFBS6urpMTExVVVXQ0NDi4uIPDw81NTW/v7/V1dXl5eV6enoTExPr6+vKyspOTk5ZWVnX19fR0dEnJyf29va4uLhISEhiYmLu7u61tbXb29uIiIgNDQ1FRUU9PT0qKiolJSVeXl6Ghobw8PCqqqra2toEBARBQUEiIiJSUlK9vb1NTU0JCQnCwsIfHx/09PSEhISMjIwhISEkJCShoaH6+vo5OTmWlpagoKCUlJTh4eGNjY13d3dhYWGZmZn4+PgKCgpQUFAdHR0vLy+wsLBKSkqvr69dXV1/f39cXFz8/PxpaWnHx8dWVlbS0tIpKSlfX1+5ubm7u7s6OjoBAQHY2NjOzs5XV1ceHh62trbn5+ebm5vExMSXl5eQkJD+/v5ubm6lO0uCAAACgklEQVRIic2WaVfTQBSGr0EzpaZUW7BQsEpBQURQDEJjtLZgBRWrthVURHHBAoJUBHFBxH3fARX3X2oyQ9aTlFh7Tnw/TG4md955mrmdDMD/qhUUVUCilRS1yl4Wq6IRcpCoECGnvSxWRa9mXCQqchswr1mb3+ny4kd75NBrwFxckm3sOotzKHlZ/axqGWarLHnJszyvEbPPhy+lCKEyHPnLK9YHNmwUw0pPsKp6kxBsRlhin6OmqDawpQ5ga71wx6BtQtvgady+w6vJU/ygaSfbvKvFxDkX5tYQtxt38Lx/ibl5z95w4b4IQDTU1r4/dqADoJM/eIjnecyMDnc5w14185H40WPHE8mIOk/xS53o7jl56rSJsyJhVxOl28+MmCOJ3talvjMScx/AWXQOoAf1A5z3dOKx0po70AUSKMwXLwmTp1CFJk/2G7icBnCjQTNnSX6yRuHlmVWSmGNCM4SGAVzxKyM+aazCPKpnvjog3o+1GDNnroltfNzMWdJ1Bqs4Z+YS/HsnJrkbbVN6ZkrPXH9TNYeeeZR8E5K3zJwlWa+NrMwABVPlbMqY+fYd0LxnE2YIkPc8beYs6Z9rAzvfTQqf+iiaEXvv9eqZu2bvAzzA9cwJ6/yQG9HkyX7VpJ6dZs6S/r42xP95kOcb1M6P2Md1T55mJsTnz9DzwRdRNXP/y0nnqzKROVr1uv3N2xilzlP83rG17vfBbjBzzi5D5nHCUEpWhtasYNOHEPdxDqfNTwdrEpVqZhhemP30Ge/PXxYzX7+5NHmKH8x9Z+M/fGDmnAPzz19pC0NtE70on0XHZGZ6wTYeKzI6i3Y0/rYPyIKGGPksyjB9JEqH54X2D6VZiX3trY8LAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.233,1.0;4.sync,10.6492310876;4.rect,1.1,2.41,1.3,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.25,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,1.3,3.198,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.22,2.39,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.22,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,2.22,1.9,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,2.20,1.8,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,2.20,1.9,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,2.60,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.63,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,2.63,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.134,3.186,3.398;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.63,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.61,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.60,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.60,2.58,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.60,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,2.61,2.48,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,2.63,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,2.58,2.68,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.78,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.60,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.63,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.60,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.58,2.88,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.117,2.29,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.120,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.120,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.120,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.117,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.120,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.139,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.136,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.139,1.9,3.256;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.139,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.117,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.120,2.49,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.115,2.58,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.139,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.117,2.78,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.117,2.88,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.136,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.137,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.134,2.27,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.136,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.136,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.153,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.177,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.174,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.172,2.76,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.172,2.96,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.234,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.193,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.196,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.234,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.193,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.196,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.196,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.231,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.232,2.37,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.231,2.77,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.232,2.38,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.231,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.231,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.231,2.16,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.231,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.234,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.231,2.58,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.253,2.57,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.248,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.269,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.269,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.310,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.326,3.119,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.323,3.176,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.367,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.367,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.367,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.364,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.367,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.364,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.364,2.38,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.362,2.38,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.386,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.383,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.386,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.386,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.386,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.400,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.400,3.116,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.443,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.443,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.440,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.443,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.443,1.9,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.443,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.438,2.48,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.440,2.35,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.441,2.40,2.89;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.481,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.478,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.462,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.459,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.478,2.57,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.476,3.168,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.481,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.479,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.481,2.37,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.500,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.500,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.501,1.8,3.141;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.516,2.10,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.500,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.500,2.10,3.145;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.500,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.498,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.500,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.497,2.19,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.517,2.29,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.521,2.28,2.64;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.517,2.28,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.514,2.48,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.519,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.516,2.48,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.519,2.39,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.516,2.59,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.516,2.29,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.533,2.39,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.591,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.552,2.78,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.2;4.blob,1.1,8064.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;4.blob,1.1,6008.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,3.267;4.blob,1.1,6056.iVBORw0KGgoAAAANSUhEUgAAApsAAAA4CAMAAACFW8M/AAAC6FBMVEUAAAB3d3fU1NQwMDCxsbHs7Ozx8fGpqakiIiJoaGj////o6OiLi4vT09OkpKTQ0NAtLS3z8/O6urpOTk5XV1fMzMzq6uocHBwYGBg8PDwREREgICCsrKzIyMgyMjL9/f0bGxuhoaHp6ekGBgYTExPy8vKcnJyIiIiQkJC8vLzf399dXV1eXl64uLiKior19fWtra0XFxfk5OS0tLTt7e0mJiYeHh6qqqru7u6enp4QEBBbW1v09PTl5eWZmZlsbGz5+fkrKyu3t7f7+/tLS0soKCiioqJISEgzMzNERETS0tJgYGA3NzfBwcH39/eTk5MMDAxPT0/W1tbFxcUxMTGGhoa9vb2+vr5tbW0NDQ02NjYSEhL4+Pjc3NyampoEBASPj49GRkZqamr29vY1NTW/v7/V1dUUFBRMTExVVVXi4uIPDw8VFRVUVFRjY2OAgIBDQ0NcXFzY2Nh6enrr6+vKyspZWVnX19fR0dEHBwfGxsZSUlLh4eEICAjAwMBJSUnm5uYnJydiYmK1tbVRUVFTU1P6+vqnp6c4ODgLCwt8fHyjo6Pe3t5lZWUqKiolJSVCQkI0NDTw8PDn5+dAQEBBQUGVlZUKCgpNTU3a2tpHR0dFRUU9PT1hYWHPz88kJCSbm5sDAwMODg6urq4JCQlQUFDCwsIfHx8aGhpWVlbJycmlpaWEhISMjIxycnKdnZ0hISEBAQF/f38CAgJ0dHRzc3Pv7+85OTmHh4dKSkr+/v6mpqaWlpZYWFigoKBpaWl+fn4WFhZkZGQFBQU/Pz/Ly8vDw8Orq6vNzc2NjY15eXmYmJivr6/d3d27u7vb29uXl5fg4OAdHR07OzvOzs4sLCyysrKoqKhmZmYvLy+wsLDHx8dfX18pKSl9fX2Dg4O5ubk6Ojq2trZaWlp2dnbExMRubm6JiYlwcHBvb2+FhYV1dXWzs7Pj4+P8/PyBgYGUlJQZGRkuLi4+Pj6SkpLZ2dkjIyNxcXFBZ4VQAAAOkUlEQVR4nO1deXwURRYuMEGshIRECQwEgYCCIgZDVNQAAVEMuhFBUDAY1gBBIAghLoeMXBoRcCUiyKFgkENRF9AVJasLioIYFN1Vd3UV13O9zd7/bvdMd71XVW96rp5lgv39fgxvuupVvVf1Tdd0T38pxjx48ODBQwxo0VK3gjglJbXVqa2lQ6dxztPsN+ltXAwjIzMGp0gjcDVSABWzNEIe4kPLFroVQNus7NPPaJfTHh/r4PNliJHv2MkycjvHH0ZM3BQRRF/POebIMqJilkbIQ1w4s0tXzQqiW153xnqcdbbi0FMf+RPGzTiQKG4ycoQ8xIJe5+hWECnnmq+9zzPmoM/5Ofl9LwgetkYe1q4CHoDs3LZfYU7fC03roouz+l9yqWld1q5owMAepjWoePCQ/MuHGtYV/bJaXdmBmfM8rE1+56vkVqAetFIyvHj41dwnrZ7X/KI079oRZisp143MH3W91AjUg1IUs/AFiNLRYxi74UY2lo8j66GYITd7hG4qu9H8b/zNUvQwLh7CoTzvPM2ycB6fMDZoZfCUX95SMSb4xuImrF0TfZMm+3w+ybcyNXvKrZlTpzE2vWB41Yy0IcaxW7vcNnNWdR+zeBAfMLukyqBkj5rbT//VnLnzjD76z7+javICv9SMqAettC67c+HVi0xuQgSLK/oMW9J/qRlp3vy7qlqeOw83AvWgFGIGX4AovTuPleefyq6pnUfWg5hRbmKE7jHPveP4Mhw9jIuHsBhadK9m2VheW7RimWlkrDRW9/t48HQEK5aw9BVwGP81Y/f3m2hchpxlUGsVP9NgVR1j83pz8+QyiFufg9EPGNO0mF9n9LG6I2MP8jVSM6IetLI29SHG1nEfjuDi9eWMbTB9M/KMj9NG/rASTk+bm1Bqxwy+GFZpJ145bkEBe2QTXQ9iRrmJ3kr4ZsYmTJaih3HxEBanrtAtgc3pA/ij9cYctDPedORLAgcj4ub0mjHrtgSskY/5/f6tFbcY5rbOWcZKaV6WDOJbg/W2X2y+7hhhfXd7nD8hNSPqQSs7nzTeLpO5WfSU+VrztNVKa36HEo7NTVRqxwy+GHZp4Zrf7Hpgd/rZdD0UM+Qmettz7jPs2QG/laKHcfEQDtNKN2oWRnkL/pzFTVY8O3AoIm6yzd321mY/bxiFwe9uLzC2r+F3Qyc+Z3HTWrvHv2g7BOa5A39JakXUg1am9mIqN7fyQeZ/c39vtdKJVynRYG5apVbMyBfDzij7xseWDOm9dD9dD2JGucG4HFjP1tS+LEUP4+IhHF4peFazLBx86lXzv9cOifPmjMDxyLjJWP3zKaWLGVt5uM5Ee8b6vW4c3SZzM3jeNOHMTWhlZwbTzpv5wXPakRi4iXwx7NIXBubd/0bjynF0PYgZ5QbjclGXcTcflaOHcfEQDtvP1y0bbx4y2Lqn+i1jDtYb1gx+SuAwwc2Bx1TfFnONrwKV/BHG3n7HvLbtavwbMsl4WS5zc/ReY4X7w9514bgJrVxbYyzzU2Ru9g1+FyyJhpt2zOCLYZdWzUljf3y32E/Xg5hRbmhc+rxYuE6OHsbFQxjsbnhPswRKLn//uilHa1eZ1+l/2vjnIoOkgWveQp/vCmwx1ps/s2ZWJfb9oPTDofuOFhkXA9NzMntvTK9ty9j+hjc2pHfhgxniXGXOX6Y8MTzTH46b0Mru0jHDPiqwr9ODEXxcOmTDR4XmVTLFTaiHS+2YwRfDLt3ND7Pu+aYbVQ9ihtzwuNxatrpcjh7GxUMYHH9XtwDXLK3Zm21e1GZs+iS1ou90FrxXaCAXW8bJ9Uhh8Zy2su9fU/e+9alpbe77QNadM81ax6dWfPb5O+bdSsE5dtFnRasfNVt25ia0wma2KR7+hXlnBkXw6ZelNW9vYTQ3oR4uFTELXwxRWvgVY5N2MboexAy54XHpXvM3NXoYFw/OGPm1bhEIXgslCUx6nNZwwYkOw0NyIJm4+XDaV6u+6T/wRIfhIUmQTNxkSzaVvfmtP3w9Dx48ePDgwUPzxJ6oPTYTVvNFB/VxiAR4eIgFVx0qrdAfCHDEd6N0qxmjalO0TzdF75HswPqGZeZ9xozgHT2fVjNQGj2qeVfzAb1GupR+nvemmi8XPjg0KkVESf/dmgXQVBxuZ+mMWHq78ih5WFHaHDxQUDz8dEeP5gusbwiM1IU+X3E3n09/vCZmbu5n7HuVm/Yv3DQ3X7J+LoxcEVG//mvNQtBUHG5n6YxYepuev5A6rChtLkm9Zd+TfKaTx8kBe6TKnnIqjRLV+UPYtOKaqLj5Rq0wI1RE3JE/QrPCIJ4sC54OXyfe3s4eQxxUlDb381nGV/ORh1WPLUn25B5WDVB6CRsl/JOsnVfX/LBGWjNXzS1u853MTaSIgFKhR3h/UaVxvMt34cKq/r5sRO9F2Y04KtBQUNqNTLwC2twEDQVYKLfDH9relkVmKWk84slS5SbqDbKUfKPvbRgnfi1TlDbXZzxuvD62ncke96buvVT3PZEA1QCllxAo4Uc+/zFzQ+fteM0MaCNSFW4KzQOUgh7h5bwU1mPADdKjeAf9AUjHqn9KuzulaVIjjgo0FJR24xTfzcU+ewXsqeo0kJoC5Zbzhe1tWWSWksYj5iwZxU3RG2Qp+Ubf2xblyWwTmtLGRPdF6Uz2mDfnWJJdtINqgNJLoGrt2YKf2IEFgXfW3K+teYixu1Ru2poHKAU9AhvK93/YX5IU29/5pWczqr999GjZq6MaZaWDWNMp7QZbXiZMTaeB1BSQWw/xbLxtkVlKGo+YszQ+fQUT/P6D9JiiLLFvDL2lPcNU6EobA6PP6hraI0kAqgFKLyFgjuM7t7HlBYF31qzt7Ma075ugeYBSpMlgb3dRP9m7Aw/d1nXEx6rTp/C0Z19rlKKSv2+q2g2Cm6ChQGoKyG0xX6VYZJaSxiPWLC8NfgA5Xl1xbyhL5BtDb3PWMhWE0oZta5jl4JEsEKoBSi8hQM7aVHOuKW4GnkGDUqRHYH//cbLSNLmmT/AXvcg2NcpKB4mb6rN0OjdBQ4HVFJDbP/g/FSs0N+1n7mLNst749OWtqKvD0l/UG84S+cbQW5tdTAGltKnLf8HBI2kgVAOUXkKAPm+acx2Sm1CK9QhPptW+IjdNrum92PGJLLNRVjpEyU2koUBqCsitPV+oWDFwM9IsGfV9U/SGs0S+MfS2sqfaraa0YWzH6hXwE5rukTywVQOUXkKAnLV/5RnL475Q3IRS0COwyxo2Hi+S/24AuaabarUAN7HSwVZJSNwUdz50boKGAqkpILfutfcpVgzcjDRL5shNlCX2jb63+uJBare60mZay2z43kt4JA9s1QCllxBA4wiKgx0VY4bNmirfe4dxhFLQI3Rq1cTKb3/toBaEAuAmikqoJDA34c6HzU1Kp4HUFCi3+WsVi8wSMoozSwduQpbgG1Nv7/HrlV51pU35OTULfQYqFY+ntVk/4bBVA6RewgYaR6Q4WNOmtuUS+TdLdJYRpUKPUD/q38Z15hWlYVcR4CaKSqgkMDfhzofNTUqngSyU24FjikVmCRm5nCXqTWSJfGPq7ZtF6gKuK23aW9dlLykevRrKw0Ts4f+Gx2s/1axmjnbH1SOOShvJI7fa/Xg8xIojk/ZoVrPGtgHR/u4IHtOyvnI7HA+x497Xv9Ws5oyPF1F/mCVCj/Kqk+LjedKgcrZuNWOsGhq+TrweHjxEgYN+f31iWu6u/Cbi4WcF0ILEvKTmcp6ge5QtufqXeBIITx+SZBBakBgUJTZyD9VNdy0gCYO1vxKVQLijD1E1GdbNQB68dZigHSkiRRPnDVN3yU8BhdVphI45sbkJLYitKIkFuf2Ig+7oZjo4ctPl0XBFH6JqMjr4fL6cbsbLHrXUAW7sXkC10lTge/ij9ePH4mO0TgP5ho45obmBFsRWlMQCkpvu6GYIbkY0aqE8HOG6PsTOrIDUDzggYdwcb7z8p+G/yuF49vZIWG6gBUGKkqhBchMjdt2MMzcjRMQesj7EPU2GNX+iFCsOiD0i0C4Vdr/IQ9qVwwHUXhcBbrKCJqlf4Cah8RAx0/taJDA3WxWCFCUw9oQvvduGxc1E6GY0bhKj5t5MK/oQ1zQZ1vyJUuRB7REBCgvRL/KQduWwQD3nSe11EeDmtNrZuF8muElpPCAjal+LROZmq0KQokSMPeVL77YhuOm+bkbjJjFq7s20og9xTZMB617PNMWD3iPCPtOLfpGHtCuHBeo5T2qvi6Y3/f7B2a3aS7oFETOl8YBSal+LBOYGqhB4wk+MPeUbojebm+7rZpzXdNdnWtaHuKbJoObP8qD3iBA52v0iD2lXDgvUc57UXhdNJoOPjWOybkGs6YTGA0qpfS0SmBuoQjA3t4b2DdEbcNNt3Uyk3HRpphV9iFuaDIf5o/eIsCMW/aoR27tyWKDWdGqvi6Yf6urunG++w7oFO2ZK4wGl5L4WicsNVCGYm/7QviF6c+BmnLqZKLkZ70wr+hC3NBkO80fvEWFHLPrVP00zcAjOazqoLszvmxu5ucGH1K8VM6XxgNIQ+1okKjdQhRDcpHxD9OZ03oxPNxMlN+OdaVUf4pImw2H+6D0ibIWF6BdHjHflsECv6fpeF4FroXfN7+NItyBipjQeUErta5HA3EAVQnCT8qV7c+JmnLoZ4KbQvmij5t5Ma/oQNzQZTLqWDZQiD3qPCFthIfrFEYtdOcJB3+siwM0z+Ae4X4iZ0ng472uRyNxAFaJzk/Kle9O56ZpuRnATtC/aqLk305o+xA1NBpPuAQZK8aeY3CPCVliIfnHEYleOcND3ughws378PbhfiJnSeITZ1yKBuYEqROcm5Uv3pnPTNd2M4CZoX7RRc2+mm4U+JKn+urzLwLm5owXJ/Sxhz8jtSPSzHtJMNwt9yM+Fm+5oQZrzM3J4NJqHPuRnw01XtCCt6xL2jFxd3djwteIBGg1PH5JkOCm0IO5A0Yf8DwDNRKn3tErxAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.343;4.blob,1.1,3148.iVBORw0KGgoAAAANSUhEUgAAAqUAAAARCAMAAADTwiVKAAACo1BMVEUAAAABAQEzMzPDw8P39/f29vajo6N3d3fU1NSkpKT///88PDwSEhLr6+vExMRJSUlAQEBLS0uLi4vT09PQ0NBoaGjo6OgmJib5+fmhoaEODg5YWFggICCsrKzIyMgREREYGBgyMjL9/f0bGxv4+PiEhIR5eXn6+vqIiIiQkJC8vLzk5ORERESDg4Pz8/PJyclgYGDj4+NBQUEeHh6qqqru7u6enp4QEBAtLS20tLTt7e3q6uqtra1bW1vMzMz09PTl5eWZmZkTExO4uLiKior19fUXFxeGhoa9vb2+vr5tbW0NDQ02NjZISEixsbFPT0/W1tbFxcUxMTFsbGwrKyu3t7f7+/soKCjx8fGioqLS0tIEBATp6eleXl4wMDCampo1NTW/v7/V1dWNjY1aWlr8/PxHR0fCwsIVFRVUVFRjY2MUFBTs7Oy6urpMTExVVVXi4uIPDw+AgIBDQ0NcXFzY2NhGRkZqampTU1Opqak3NzcHBwfGxsZSUlLh4eEICAhRUVHf3996enrKyspOTk5ZWVnX19fR0dEiIiLAwMDm5uYLCwt8fHwcHByBgYF+fn7y8vJCQkIqKiolJSU0NDRdXV3e3t4GBgZlZWVhYWHPz8/n5+dFRUU9PT3w8PAnJyeVlZUKCgpNTU3g4OCurq4JCQlQUFBiYmJycnKdnZ0hISGcnJwaGhpWVlYfHx8MDAylpaU4ODiHh4ckJCTv7+85OTlKSkr+/v6mpqZzc3O1tbVpaWnc3NyWlpZkZGQCAgKrq6sDAwPNzc2YmJjb29uXl5fa2to7OzvOzs4dHR2Tk5MsLCx/f38vLy+wsLCvr6+oqKhmZma7u7uMjIzHx8dfX199fX25ubk6Ojq2trZubm6bm5t2dnZwcHBvb2/d3d2FhYUoDr85AAAGUUlEQVRoge1a+18UVRS/GqRzN1JwxVUR0Eg0EA215JGIipIPpJQsIPOVsoJvzRRlzcpHaWWKpiIWvpKyUlEqe2hPe5eVpT3/lGaWmXvOnTk77Oxn9tOn4PsDn+M995zvuV++3Jndj4w5QBcnmzthQad+kcCZal1viom9OUqTdAR06hcJQLVu3Y01iIJQeBAeLb4l7tYePeNDdkvoFZUhHXS27FO84XXprR4x0fFYZkhsROd29HOBrV1EXckQFQ73hVCtezdjA0RB9PF4fH09nn5a3J8nWfoNSBZhijVLAVWEizA7wz6DQ1LApkuqx6NEx6W4M6Wfu2ztIupKhqiwZAHhqzZw0G2WSCDtdj0YnB4Oa3uIwKWOYa8UiSHRcSnuTOnnOpvLcK6kGy5lpGpD77BGArpLvejZbyCjbY2hOzqTD8saPiLuzmw1Hjkqa/Rdd2urY3Jy8/L7SBXsnrEF4wrHSxXKhIl5RfmTJHp0+4suApOLGbt3CpvKp6F9wKF4p/cqSu4qdVFKZpQW3Xd/KFWImVEE2Zm+WWVFD0jPb2ATZ0OdKf0QKA7oAmyzc7IefChVZgNARWa5r3xEkE2s2WrgkpJUBUyAfvvOVauofFgvgQigu3SO5xGfR3/2G5jrmTdfXWPojs7kCxY+6l2UvJixqoxy/5LEMnWxumbpsuXeFStxxfJBq1avWTtBqlB4yWPrYoslerj9oYvA45Wsomg925Bei/YBhzJ64yb//LoA7qJUbtzs7/5EremUuirUzBBBls3k47Zk+lMlvQWbOBvqTOkHoDhQF8E2Pu7Jp57euq0WswGgYnvajh4jntF+u7Bmq4FLSlIVMAFkI1AtvuBZvQQigHji70yzqotu8CG6S3exuufY83XqS/YLqqy7+UDGpvMXGduTMxdXbN/LWG09H48rlH37GXuJmy86fWLcRUcSr55Wl8EOHMT70FPnUApjPXk2ziqVUxlr4IdpDmpmiCCr+sby9wxs4mzSVJR+BigO1EWwTW5UjXyEzzCdjZk0ZS/XvMJYk+ZSahZCA9eUtFbgCYgnfriqrRdfj6wnvihx7tKjq9jODMZKjwUCgeOx69T7Ia64qZ+54kRylnqXJ+EKZay6nsJPmkiMew51MZCb/eqpxuaE1+STSe9Gr/PTOBtc28430RzUzBBBVvXNcbMWiM04mzSVnUtJDugi2BaP0n6+8abpbAZExfC31H+dCT4piVkoDdxSkqhAE4R4Lw1DtZUxDcwcIUTs0ty2d4qz6uq5vi3pS89LFRda346f+w7hUubbYiIxJkZdDCydcuxkWf27F+WTSUql8v44G1xL4n6ag5xZRCg7kwdMHRCbOJs0lZ1LKQ7URbC9976VDQAVK4Yy3aXULJQGbilprcAThHBpGKp9kPEhM0cIEbt036W9GnYFs5fPl8QcwRU5H6k/TpB36RITCXz+Fl0MnC2s3DP4433T5H2Ru5Se2YhQ1tal4mzSVLYuJThQF8HWdpdazqYDKoYrTHcpNQulgVtKWivwBHYutVdt8USjAiIEW5cWfiJCi0s/Pao+mJj2zVa3bZfVDwj8AK4om6e1NLn0M/WvZAmfYyLRJ8ZdDPi3JrLPr/gC8skMDucupWaGCLL2LhVnk6aycynFgboItskt6nvBFy1NtEuh4ss49RVhmeZSahZKA7eUtFbgCZBfnKnW3PqVvgCRAP5Wn1K5nn+dvaa67ZNfrsczG3uuKs9b35CQPoaxb2K+jb/wXcE5XHGxdfCihEF8luRS/n3DDwVXJQbRWepioJlfYvuLvNI+4AAFIEtpC1lqZogga+9ScTZpKtDvR0sxxQFdgK0676dlp8u9AdqlUNEcUzz95wzNpdQslAbuKElVoHOIrGPVrl0xCiCCHuhbPsqlXRbk+raOafsWTcUA7Dl2Lr8xa8dqbduGX2parv4qVXS5tiL2+sKj8ZJLDw6ric2vkhhEZ6mLQO4NxuadkvcJDlAAspS2qJaaGSLI2rpUnE2aCvQb2lphLiY4oAtiG3m94NBvVYx2KapY3ctX/js/Q89C+ssVJakKNJXIOlat9A+jAKJ/CW2fnv7/GLA26hTa069366R293XCMTqIS1dm3Yg2xeHEG7v/HF0YbZoOiQ7i0gp/9P+f6cmDaX/9bXkp+c/iH2Md7xtIGLnsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.362;4.blob,1.1,3916.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.419;4.blob,1.1,3172.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.438;4.blob,1.1,3948.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.495;4.blob,1.1,3484.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.516;4.blob,1.1,2484.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.572;4.blob,1.1,5384.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;3.end,1.1;4.move,1.4,1.3,1.2,3.264,1.0;4.sync,10.6492310951;4.rect,1.1,2.70,1.3,2.39,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,1.2,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,1.6,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,1.4,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,1.6,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,2.50,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.25,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.20,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.25,1.8,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,2.25,1.9,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,2.25,1.8,3.146;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,2.22,2.38,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,2.25,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.22,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,2.23,2.48,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.23,2.58,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.22,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,2.22,2.59,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,2.25,2.48,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,2.22,2.49,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,2.22,2.59,3.149;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,2.20,2.19,2.90;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.39,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.79,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,2.82,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.101,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,2.81,2.29,2.86;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.78,3.107,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.78,2.16,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,2.98,2.10,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,2.98,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.98,3.148,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.117,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.120,2.26,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.158,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.155,1.8,2.73;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.159,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.153,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.158,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.156,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.193,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.210,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.210,3.217,2.36;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.291,1.7,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.272,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.291,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.345,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.291,1.9,3.180;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.310,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.305,2.38,3.128;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.307,2.40,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.308,1.8,2.87;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.310,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.305,2.48,3.131;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.304,3.228,3.132;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.310,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.345,3.178,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.345,1.9,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.345,2.59,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.345,1.8,2.89;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.343,2.28,2.90;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.364,1.8,2.70;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.572,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.441,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.440,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.457,1.8,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.462,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.459,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.459,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.462,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.457,2.28,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.498,2.29,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.500,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.633,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.497,2.57,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.497,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.497,2.69,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.497,2.59,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.495,2.18,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.497,2.99,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.497,2.37,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.536,2.27,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.535,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.537,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.631,2.38,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.633,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.628,2.28,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.630,2.78,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.630,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.633,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.633,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.611,2.27,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.630,3.178,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.633,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.630,2.68,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.650,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.649,2.98,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.110,1.1;4.blob,1.1,3212.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.22;4.blob,1.1,3688.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,2.95;4.blob,1.1,2128.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.134;4.blob,1.1,5312.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,3.191;4.blob,1.1,3648.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,3.211;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,1228.W5trJOcfBLcsZ2N7TvYI1dVIk5ntq5dw4A06L+xKZvFd5Z+1fwvyj3m1Rv/X4s9sHpcfahfKIQOD0/g7bap9405Yxpceecz3zeik+/WHV5vMbFkp7N33fK+iw3mrsG5Ji+xbAucFXs2oZpjlCjRgWc7G9pzsEc5XIz/q7+7Bme1/zfYTQSWzeK5yuEZf3Nkye4ZRedCX2TwuZ+VnbzGHvHtdkO/DVxS8IIDJ4jcqfb8xMm6B/rCtqcymSmEfNRhv9MYvSFFL/2y1dUpD4JIhsOdUM0y153I2tudkj3C+GulQ97yROZbM7tGoX0983Ohbk+tKZolZ5ajsvwb7R179rky/pDloZDYbcXfWzmNVd/lH7EsfI4J5qydKsklW1+2Zb/ztlXX9ho6l2lihzGyqFLZ8WObonR2zL+Ut4/uwsRV5/lMDe041w1R7Lmdje072QmFm9lO13ap75Vszu9WwdqsOzc70zeO2klmiVvlA4EqZ/COvXs7dv+TRNb7vRuSIK1v+KOY/9E5336BztaCvLHXaa4tCR+9EYVTB//j+9j22Jvf44w3Gt7CqqxFZKUzsnbaj6IlHLC3f/2HM1F73nWl+0ytrhqn2XM7G9pxZDoGZ2eKVjLq2l1szW4w/XrXnxeX+WVxWMkvUKp8NvKeQf8yrWQOzuy71fZ9tjtg39WT9Per2HP9VyPub7D8wcND3ygRAgnk7+8vIBw89Zj/2uXZZ5AYBiBrrF0R8N+6r0xWX1H23txvvxR8AosPW+1+LcOTvNyl/xmvXffgRXdAcaNUhwoFpTdzE2/2HiH0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA86JE1uYIwqlGCwAJxLn+kdl7V3FxejdfbY4gkNmgmeIus3Xqgut0+XDK7HX4MV0QFSKoQUaVvVQjWK/MbPd1tbb2bwxdggwAF4Rfg4wqe6lGUK+gzHZdV6tm5WZUGgJRIfwaZHS9oR5hvxoJp64WANEh/BpkLHeVIxSZHUZdLQCiRNg1yCh31SOayGyXdbUAiBJh1yCj3FWPcMrs0HW1AIgW4dYgo8pe6hGs7pcts0PW1QIgaoRbg4wqe6lHmL30PzVh1NV6SfluAUAEhF2DTFb2Uo8we+l/18Ooq3VD1vwYLxeARDAiI9EeABADehd9k2gXAIgB85dFXGwOnBD8HzbdjwL5bkRyAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.317,1.0;4.sync,10.6492311009;4.rect,1.1,2.51,1.1,3.678,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.22,3.135,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.43,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.58,3.426,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.101,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.102,1.8,2.84;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.136,1.9,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.155,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.139,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.139,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.137,1.8,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.139,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.139,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.139,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.196,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.191,2.45,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.136,2.87,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.136,2.18,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.136,2.18,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.136,2.59,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.136,2.48,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.136,2.48,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.139,2.28,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.136,2.38,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.134,2.58,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.139,2.78,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.194,2.18,3.110;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.193,2.68,3.111;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.155,2.27,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.177,2.29,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.440,2.10,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.193,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.196,2.28,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.382,2.29,3.222;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.211,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.272,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.253,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.248,3.158,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.267,3.238,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.272,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.272,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.443,1.8,3.199;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.288,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.291,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.288,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.289,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.286,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.307,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.310,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.307,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.310,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.344,2.19,3.298;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.324,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.443,2.10,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.443,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.443,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.441,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.443,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.441,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.459,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.459,3.168,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.459,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.457,3.139,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.462,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.462,2.76,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.500,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.516,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.516,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.515,1.9,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.538,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.538,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.535,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.535,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.533,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.533,3.258,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.538,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.535,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.535,3.118,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.554,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.592,2.39,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.590,3.158,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.632,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.631,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.630,2.67,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,2.21;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,2948.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;3.end,1.1;4.move,1.4,1.3,1.2,3.351,1.0;4.sync,10.6492311069;4.rect,1.1,2.42,2.21,1.6,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.62,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,2.82,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,2.77,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,2.82,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,2.79,2.56,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,2.77,2.59,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.79,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.82,2.47,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.82,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,2.79,2.89,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,2.79,2.18,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.98,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,2.98,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.101,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.101,1.9,3.256;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.101,2.10,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.101,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.101,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,2.98,2.79,3.202;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.118,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.120,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.115,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.120,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.120,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.115,2.98,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.115,3.128,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.196,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.155,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.196,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.193,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.196,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.196,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.196,1.9,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.193,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.291,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.232,2.79,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.229,2.78,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.234,2.18,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.248,2.29,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.288,2.88,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.288,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.286,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.250,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.291,1.7,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.291,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.286,2.69,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.286,2.67,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.291,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.291,2.48,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.305,2.68,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.348,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.367,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.405,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.440,3.186,3.149;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.402,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.362,1.8,2.90;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.367,1.9,3.240;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.364,1.9,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.441,1.8,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.405,2.10,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.443,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.405,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.403,2.17,3.186;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.402,2.28,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.403,2.18,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.402,2.99,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.402,2.59,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.405,2.29,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.405,2.19,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.402,2.78,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.403,2.29,2.87;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.402,2.29,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.402,2.19,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.405,2.28,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.402,2.47,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.419,2.38,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.443,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.481,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.481,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.478,2.37,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.478,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.478,2.48,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.497,2.37,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.519,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.519,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.555,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.519,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.519,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.554,2.77,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.555,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.552,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.552,2.79,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.554,2.59,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.554,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.554,2.88,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.554,2.78,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.573,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.576,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.573,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.595,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.595,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.610,2.14,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.611,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.609,2.27,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.648,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.1;4.blob,1.1,3500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.22;4.blob,1.1,6496.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.174;4.blob,1.1,3768.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.214;4.blob,1.1,2820.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;3.end,1.1;3.img,1.1,2.14,1.1,10.image/webp,2.40,3.303;4.blob,1.1,8064.UklGRmo4AABXRUJQVlA4IF44AACwoACdASrIAlAAPjEWiUOioYncUwwUAYJaQyygWwB/APwA2fjWaBf/6BfgH//L6Lc/Bn8X/DT9tvUR+efzr+q/qj/b/+X/g///8f/iPyz9I/Xb+/f13/1/674H/3jzReXfs39e/Jn3B/hf04+af0T9bP6z/9v87///mf+tfif+Wns373f0/8gP6f/zv8N9gX4r/GP6D/U/19/sf7Pe0v+x/lV/MPFtzf+x/4D9M/7l8AXp98c/qn9q/xH+M/sn7V+wV+ofzP9jP3/+UfyP+X/0X8Y/73/5vwA/h/8W/qH9b/vf+c/tf/3+af6X/hvH0+xf3H/Wf439t/8B9gP8T/k/9v/tn+b/2H92//3++/D79R/wP9k/xv+x/yP///4nw+/Gv6d/if7//kf9n/mf///6P0D/jH8k/tH9e/wn+r/vH///5f3A/932sfrr9+30T/qp/t/z8OG+QnhtlB5K2z2JwMzhzWJmT4Ec3lxBNs/ThI58JmT4Ec3lxBNs/ThI58JmT4Ec0P71cfMoiC6Q9Be9x65zRq9hMLCe02kPVmnXdQ7OlglJwC+vt2/rsVHgL2a+tiaEKqkpHl/mceXYGYqXMKC5RtNTQXxQnj7dk3/SZdNDM//O2WGH1gtac5gWeVumwdGx1nx+V+i5gu1HFsYw0njkmz74q6UVBkrhNXkvEQpMJ+tERoIeYMzyH01cHtQOrJl+ZAEL4f5AXu+e5pFZ+fH81fQbRX00AxqQ44H7f6aKEmZTNwJsm3pWTPXAgucbqBi2/Jo+5WOMS0ix2+Y2otsHW6/pxy+cRxAHmw5ItZr13lw817a5Gj57Jlt98UxQgOs6KL3YNVyX8Gt/Ru8aFd8jmldYqf6beZ0Ct/0nlWeVjaeZY+ffyMGmdlR4a/5+t32/R9msK57hH+dBDV7EIk0nIuXPa5WI5VM3p7A+yrq6O7XZJ5c364HdJjaa5I5ycDp3lmNZMpasOotTtk6bGYQcFl1sfIkO+sjXXFEz6UMN2gnGg8+WqZLfQvbPgHO6VoXaafiZW1ZOAjf1W1j3jmMzu/U3zA9++fTaaPPrDr561MqRI9uTNKeq8DpqbApRxn2y9UneykQ/gzybE7ry0B1aziVR/UJN/RF9Np9S6RHL9OX2KgRfijDFSwiC6okwJrdmEyCCJkfhtI6Bc8ERZlhF1U5zgy133GLFtPqKI8bBqN/hIH/su4xr3Xgxp559AzNORgn4PdUaJlkLcvOYHyiUfmm3/uPQEQYu8UKl2G2iyjpoAUt6fchTGrs9hrKD4I4buHRW+vfaVo2nbCVpeIXMsrLYbJ77L68NLbCod1zZJ9uVTUDn1D1tPiZD+4U98pEuS1vKpC0NcLNJ5TeAJ+8GryycZl5KEHracKa2KEGrafko8dsHzHJ1sS2hUI+zPeGM/uv7VWc5SwFlETFkutvI2ftcuUFbc0hXaHCEYYYoqWFpl82aPVn5MOOWDwunGd4nkslQGS+NDZzUSrY/AGzDJO471fa2sg3UXaC5XecOTSysbjC5ri3uPNnxyz2IiUas3NyA5HRWH8znLPJP0iSAL0Zj7LcjKqu1T3g/Ep07ma2oISpLjXhXLPc/I0J356BSQuSeGhueBavIB5ruttZy9mXJHvunhMcufP66wnNj8PFgynOLI1l+3CxZUZ2HrBhZp4dc1E2FrK7NZnMT0aMI5eBfDA5w6meDhbzX91AoHNws+eX+mJ1JWPwAAP75FsYDKRdEOajol93wX1OrpqNj1Q7Oed9WFTyKwPbgcPipnUKO94p2Yo8xa2XZhNLIMMhf5JXVway0FHD+5CESNHvS+v8lDS7c8+RKqIo0csQbp3CANqAY/b70RIH0UN1VrUAov9T1JYqNaqHI51WXoiZ6J7+Km3orHmO2qvK6lY6fyp6l6dUtV3i+e6pcyYowgHzI3c4toqxqjiVBYj0dFo2MUCWqCg0hEWwW1H2pPKk2tCPCZyQs2uAmx9nFftuD8o2LUo9+K/bcH5RsWpR78V+24PyjYtSj34r9twflGxalHvxX7bg/KNi1KPfiv23B+UbFqUe/FftuD8y5LgkVI+QjfRYnXp5H4r0McWSgRvy2KD1w7RPX0XdwWDfwDB/4l70BHW79xDig6cbnK5W0F1Zic5Gv2326Vq/XKT9ePMtCHTB1AyooVnANC76eFKlvA9AalHAAGJmxYsZJ47Z4iYp1Jdun5AghM167Q2LxxgZ6y6RFM2ZgzuIAVavGU4/KuvB3dslB/S+xekGOZWa4MS1lLzxJBvwDzEkiNPgHJ2Jrc/IAdKCiE38rUdXoat530lYajwjfncBdpcf1VFweV+5QdIWRHsxUMe8iHS0A88SBvCzxLRz1BBq5L5KCpcDffqSlj+DTx1tdvcuvNHLXKIOI3Yw4drz6XMUQlAprkEt1m06TMooVWIBoMUTmHPTu6Nry1S2AzMjLDHbgsL7j5FQKS49NHtQswib2Avb7fHt9sKXum7B0iJcm0G52/7zYWyoLuUoocpINu5CKB8LgRwDHtkI2WsgOrMdtLNnNLBuiWqcL6IkXJNaJZP+2Uf6l83u/TaLrPPlx67mM2aBXQwZ6MCNVdNKsUxLtiK7SdsP8+S0QubNe9BfKDYrwlRRTbEEAXIUsUwaMUw5vFuqVconBhwSEdw6ZjZzSLuEumBKVB7gRsIo6OGWm4AhK7NAcTFgZdGx/xSHADC38MMKLwtH69OBqy+ZSdV4pDem8xfgtDPLdqe5lWMhY82lQKqsch+nkBWRAEeXxTLBSyUsmRf65nilr82Ep8mHor3eXxxbqVBXfkGa1+fETPYOJgk+iVmZoPA2p6NhFwvAWEdExsYnCZ/1D1SErCjvF3qbRDmgPI5uMT48HIrHkWaELdTum0Gx8MvUojlerYRUfRbSMGYj6wa3qUEMIf51UIQhm6GM9pVBJwylIvXO7WSMDqtOrHZMiLxynADCV1aTIQDbq+MlwlRm5omGl+a8hQukbhcOIEXu21wVOfrDZlwxW6da3PKp/npzDAp0f39PXPTYze8Teiy99mxl10TdFUjCmGrDehQ3+YgYPqvLASYGJCmc9oRZeAlZFQO+zIW0Y5mnxD5gVeK3nOPuUT7/lCzB+4p/azKxEebXN4RfG5VQZORrZNHFD7G3wrGds5JATNyGCzCM34eIBBvnc80huEaL2xnPxTH7bvFOEvbSGnh60fxth/01akHyTX2khzaC3XohdLuPP2AaivIdP9JsS+TceUdOnpCSbJO8TFyJUv/0p7UlYhKrM0LiId/C99jYNwjHlWiyQM8ZYJl7vAdIh6qaMU+VMbqV8D8mzG+ssZmtXKzEeB3bX79gOD83vxmPnn6M3KaMMk2POulTYwcc3v1OTAfSbzWCQkCKxmxXm01IHfWKWxRsqoO6V/M6KM3t+KqdPH6Td11wEymJpwOrL8Fsrw6LUT2QzYiuuXZJ2GJj91arfpiugACF0kU7kzmuaH8V32wGOG4QUOkruztIn3vbF3+66Hn7cMf31rs1zNOmrAPmo1WYjFPihSHZiO8a/enBu34V3xMuWS7na047CpHIWxCUAKhIEj/XZNijig0wszZeETB6ysXop5xlC9OZzv/jNf0Y4o/FrS5UVb2NfEWq0WtiRaZGAMI8WkCz/GGGux2V4s0A3VXJ+jzviVJ840tNbxFiKyAvi+YjLTb5bF71wGykNqV6ZPsrXkaUPH3DqWuXwfvS7g66lmbOdDL2oVrizXnDPMiQ7H1HxM/8/Zr/U2SMPZyFrp9Zf0e3p2Sg4GBseBCSn+Tu+WYCL373JBxuAN4/tbJF8CqacmQcxgTm4I5MVBzXdzjJFRzcIIw9PDFFNXMPGDBMgqMzcAHKkFRzdKnLUjZOEkIUOxeGo1WUnBa9sL8R/YtfjwIIcLXym6psIfNVDzWs7dVfoJFHS/U0jBI+MhVwBPbVNajb3Wn8xRVd1bfPmdQy5bV9d212owkqrYo8uzUKBjWBdDuk/fuKvjE5XFh3MFlOGax1ip+I70cDNA+szDdxv+Xlwfnirtps9yq1buaZ1lEcyQ3Fv1UulkfVFxCNFg36IQEjBpo0NiboMYT+KFtrRznfmKXCqhuSh/yuK+7aZopT411K2tMM3HaF/tJW1ucfmkEVNW/RVXh5KY/Y4KoF1bK2FIooyh13/IN1snSIw9T/tQFSIELdTum0Gx8MvUokrz/BFnMkGpa/NhKge9YcUGmFmbYiToxiVi9FPOMoXg7OL7qGqTWt+2I5m4XN+y1Id9PeX/8TK+fuhl7UofiJ/8AktD+ePjefs6etrZfOlP8Vw7+ABfYiQn6uNcSAZXJqHe5UcfIlrxNUZmJhnSvdrlsAA22ww7YGBi3U5WdoD3jn65sO9IXuAKMkHxcT+ZlFLzfi2zzwVdBySTI6cjE0aNMLUaam0W4PNfvBbT+UEWuOTGOUl4Kw7txP5xT8LAi4A8a1l5ohjpWgxZj3iHmKRPESikuYVwDzN/z8m0aO9DOmuMWS8BO+/VhI3DwHsmcGDgbwhm04JsAI4JUWEuALsNuiC9xy+2/GdBqHyve31kjY7eaaKqHPkblRJbZwWPbvuPo1OtYQ34uCAmVIHNWSX9+zNdG71rI977adup5vg/VVE2qDKdiDYrvvnWoRt9R3mfn7xDyE5AcLITdxuYLfVdIsuEdgWQxvSGc3Pg6UvAij/lac4LfPTI7LTqQq+nzQ58RBraWdya7Un1OSqysJauTlNbSzdWBvzIVssyo8v3gK5x5YMyR/EX4oj5oJs+ADQanu0LjN438BherJY6bBXNkpoakj0figZ9xfFYdjngfrRSktQhwmGUf+EZx9ZvJBgzpj1UZjyN5YqFdkWPHuqg4ARu52KAOf8XUsruqCsHEFCCvwf7al5Xnvqqzq4EUisEAvCD6tkQebBHSuhnxxKQ4e4bf05us9HeDOCXp478zKXzllncHyPO3gr9vqxYt+QvX+yjDGqnmbDs5T9kpRuSqbtMURyZkwRmkwKX3/Ukmxev3pubSjlLr9fU8Xu5SocTN9UE3ffqwblEPf09c9NjN7xN64/uuYn6ePtl4mbo2lXkwMSktbwjlUf6IRpMaFWAzVzNOZKLSK9A5xFT7vPIJtc9hNLA0LUoAyCl8prWUEulqKfpFC9ygE0OK7UfgR7fB3Hcn8SP/K7/vmYTZ2gEv+/oVE5oUTsnn4GX3+6zzkCnQdw37WrLVakgH2Sn5UyvrTBShyQyLP9y7H94EWd6MWNt5h40GsdomNlgy8UDAwADNMQb2HkR7gY63ffvJEFfzAcisBMh2jvShJdIRR/GRZ31eJZoO4BVjHePuqlW7MmRHWGa8Va5mbXYRGIrQOxJJrHawPUfi4ZMv6Fn9E5+A7h1seLp5Ob1aZiRrnP3T6+nv2HFG/YK0wffFTcb5LGUslFzZ0Sqn513OlzONIZm9CVzqiuMa0xtTsEkeHyTvES2AJsLE+Jwr5UZuaJj1r675myre50BBR/np9J6u0udLfanIv24d8K2EVH0W0jBmI+tH9swuWGivFUG+E0J1BxE0jKdiDYZV7DRAODkgJ6vm0LyQdcK1MxMv9u5aCkfIWpzfuSlo39PmC5VimvRmhC4W/4aq/08P5xKwps7uRa1+Bdqdtb1V2cCHKGHdgXulEolhMeXNQ53nlL44sCM0lQnJGRSsWZaFPmPIbTkvwN0yD99fv4M2r65O1hMfxOCHvMkYSbSs+C9vsHHVJQy5Fk93h4Lhku2y5CjShinghDvlinjilGEiFp7WT53cNJ8dHiy6PXTnb6qyfGuRFc0zylYQGju37vW4ZC0eU7O5I/XljieIAk1MU51+xko4eg1S34VumbyGS5SYjP20E9O4icHzn32rWq5edlRIYf5uOmHqZE6ijs49URnvqUyDlAnXfylySrafAT+YiZvptThayGbyTM1ZeA6w+XEPbjnMTwLUDSef/VCdtlry/s+ii9B2HtF9EkXbgP95hwUd3z7xaU1O1W4CjfiFJvUJC47+N4dzCwGki4I8EXYynfJf8oUt1AT0ALa1rgafv1UanyDX/s+LR6SYmcSZbjWxRziTYyAqfAFgHVfdfxbJyt0e/qCeOfg7Nk+ZI7hJ4PkkICOIrLM4/8rwFQ/g608qxqK7Z/uwGXGr4SP74R7OSlsw24cd2F4iFzWEnRzX34u6fW2dUSnRyeEIN7GPSasFkY8tZWu4iA38YXdlHjonDksCQKPDJPtBPFg1V4u7CVaukC1gPBOdw+jeJ1oj6HSkxBbx5JWFZTi+iIFfWmS4YxigYG/yeSXYF31ZaumBmFBm6sAgGZu4s3wNbdNoKsAy+sG82Fi2kUoSBB7wXRmX1ZvMjOrFB52665X4A5feLcM3JIQXvNF2xzF9Bgh+e57dXvfzwU/W+bZZROS73Xp4zAO9qV48bi356dLu2RjdYa3a5NDpAYaumyIgG0eG4/U13QO+Y5RmeT67ej4p35lKdgALJ1hyZg3p8V5O3jEUAu0aiyE1qpEkCK0NVWs5cby0k7BDXT3gd1NnPSXA3N4xgJlMO35V5d/hV8uAIu6c6LbvsKEaX1p3NnnwkP+eS/gt4P8adj7E3XNZ9O2Pxt1OnCeU1z75Zo4wWE0Nn+i8wF8nqBnDGSv3JjqbN+7buWhNLixWA8wt163G3lC+3oz1bksU/KgQIrPc4K1P1lg/WT4E5PQnRNUp6chnl+7yzZSasFkY8tZWu4iA38YXdlHjonDksCQKPDJPzkf1z76lrZiS5zpgn6aZMMHflTSU6dz/g21hDdFZlodN+k8wv30SYMNnJIfKyHyPHNxYfIH+5Fulh5xbmhS232K7KqDGzZhKzPZNvqc9ZP4fKxGmhKEgeGUhs+rIozvu9OeZanNAGNw+4WZ0N6DJcZXrODxJuHDpcO32dte9o/RrnGLGqaHevabH2KOraWPefEZFuZqG2q26Th9irE9pRV5WpbJ0xbPYq3K9rag3aIec7qNmRSdx1M+A5glGHL6eE5ei9NvLyKhgYwetAdqBmMowKfLlw39WPZC5WszbpPlXt4r8jVc+iR8rvQx81Y1+RAZ9MW5fmqhu+pPi06x7JMHtvO4BYSJuc+njgOOmYwEyXQU1PD6SmUBx07AKXfPliD4NBOIIxNndg55Yi9qFfyumVMlFSC/PUvJ4SXCrFcmcRhtLsVjVpTLkJcF5hMTGKN8VMsDcz2h7Sm6wDXOSC/WM/TL7mKleDkx5Fwv6g09iPClLzxWIC6Y9evw4QDDx6RfdsaTZk8BLiV377zGXYysl8QyF6RysOu8mRFGkx7SrLy2sdBa6OddPZ4TLV2qBcefzGUtqPCehwWZyUisgeUbJ7rqwmnqRI801lnyH3azoDY8yhDOzTYvaiTizlnhWiUz7HrpzQq97HTG237K6IN/xKtGHq7xS1WQuvTD7EmZYbW7ptMeBRjbP+oG3tRdgJVNO4XgRhT/zuWL3oGml7QTWMWJQrjYY2kNZ0Vt50LkEKDGYFH2N70mNnsL87qH3KxzvixRrZp8AgACGlNjboTfw8APH1GLbHeAgnLNj9oOlWXPvW6/+XDCDkPk3OAIN7y7iR+ozKeyPA5yNZvT4zAr0JTeZOhwqePuvTDOIxz35YKlIKyZjc8Owho8Vav9P6pms+3Fnv6fhQZr0ZkN4Q/Y+AYcW35pscNiP9DaRKaWaIOBfOzjEX0QtxTEzk7pZV61FqfsJI0YAbMoksIglT6DSC/MAtACIV70qyrHA2UtriYPN8ysPEmenSgRqCyanzxpB0k3hPXHbBSONh6+lG9sN+a4SWNNo7RhSSRHfGPKbG/3Lw6v1NKL3stt+WENknjXx6YOtoCCAiwlM9iW78pdbKcq/m/+0mFYwQg6wDL6lqvttOjYyWTqut9SulNdVjdtM+0yIl7UzYVdZvgQ9dAYnMBBmvgoesMKyUAJUWPyD9Sn19LcfG97JZB28rvLIy2XbRh/5F9DmjTt3dkTUw7HfJNSOYLD/JJIWCQnFLzOc3iL3WtsDfkFJwq+fa/0657+GJ53sQ86v1BtwFh13P/;4.blob,1.1,8064.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;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.383;4.blob,1.1,3352.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.497;4.blob,1.1,3932.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.537;4.blob,1.1,5484.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;3.end,1.1;4.move,1.4,1.3,1.2,3.408,1.0;4.sync,10.6492311137;4.rect,1.1,2.71,1.1,3.658,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,2.25,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,2.60,2.39,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.79,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.101,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.61,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.98,2.87,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.101,2.48,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.101,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.82,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,2.82,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.98,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.100,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.139,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.98,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.117,2.78,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.136,3.115,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.136,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.174,1.8,3.107;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.176,1.8,2.87;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.193,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.193,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.196,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.194,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.196,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.272,2.38,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.272,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.271,1.8,2.70;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.326,1.9,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.326,2.10,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.269,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.269,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.307,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.329,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.326,2.39,3.145;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.329,1.9,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.329,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.326,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.327,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.345,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.329,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.329,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.329,2.58,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.348,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.345,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.348,2.19,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.345,2.18,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.345,2.78,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.345,2.30,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.345,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.345,2.68,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.348,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.348,2.29,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.364,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.386,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.364,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.364,2.29,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.364,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.383,2.46,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.519,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.462,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.519,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.462,2.59,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.459,3.518,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.499,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.497,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.516,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.611,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.576,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.592,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.595,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.602,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.592,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.572,2.89,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.573,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.572,2.47,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.573,2.48,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.592,3.108,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.592,2.38,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.592,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.592,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.592,2.56,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.592,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.633,2.38,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.633,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.630,2.66,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,2.21;4.blob,1.1,4552.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,2.60;4.blob,1.1,4216.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.116;4.blob,1.1,5504.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.230;4.blob,1.1,4428.iVBORw0KGgoAAAANSUhEUgAAAsIAAAAjCAMAAACpS5zlAAAC4lBMVEUAAAAWFha2trawsLBhYWHZ2dlCQkKysrLa2to5OTng4ODU1NQBAQH4+Ph8fHygoKDQ0NAbGxujo6Px8fEUFBSsrKzIyMgYGBj+/v5XV1f///9UVFT5+fkJCQlqamovLy/6+vrY2NiYmJhsbGwrKyu3t7f19fX7+/tLS0seHh6qqqrz8/Pu7u6enp4QEBDk5OTc3Nw0NDRAQECkpKSxsbFPT0/W1tbFxcUxMTEtLS20tLTt7e3q6uqtra0mJiZMTEwoKCjPz89ERESDg4PJyclgYGDr6+vj4+NBQUF1dXXo6Oj29vYaGhrl5eV6enoVFRXS0tJjY2M1NTU8PDy/v7/V1dXp6enGxsZRUVHf398HBwfs7Oy6urpVVVXi4uIPDw8lJSWampq1tbXLy8v8/PyNjY1aWlpHR0fCwsJfX1/Ozs6mpqZeXl6Li4vy8vIyMjINDQ1FRUU9PT1ISEgqKipwcHALCwuZmZk2NjZKSkr9/f0cHBzh4eGBgYF+fn7m5ubHx8eurq4ICAgiIiJSUlK9vb1NTU0ODg6dnZ2AgIASEhKHh4cgICAkJCShoaHv7+94eHiXl5c4ODjw8PCCgoLe3t6rq6uUlJQDAwP39/cnJyeOjo6Wlpa5ubkGBgZra2sMDAzb29sKCgpQUFB3d3fR0dFxcXGVlZU6OjpdXV1/f39cXFxpaWmvr6/09PS7u7u4uLhJSUnDw8OlpaXAwMBDQ0PX19c3Nze8vLwZGRlOTk4FBQWEhISGhoYsLCxnZ2cTExNoaGjT09MRERGIiIgzMzOioqKKiooXFxdbW1vMzMw/Pz/Nzc3BwcGTk5O+vr5tbW3KyspZWVlGRkZkZGRiYmJTU1MEBASpqann5+dlZWVWVlYfHx+cnJyFhYWMjIxycnIhISFYWFhzc3OQkJBvb295eXkdHR0CAgIwMDA7OzuSkpKoqKhmZmYjIyMpKSmbm5t9fX3ExMRubm52dnbd3d1qI4bBAAAJ0ElEQVR4nO1ca0AU1xU+MZboAkIUZXNZFEUWFSIxi2gEqhBcCSQIrsEEEK3F+EhINVhRtA1ZxZhGJWJNgkmomhglWjRN1CTWxkDatDY16YNaax61efT9tP3fubM7c+7snhmXXRZSmO/HzGXuved+98y3M3dm9wMgDLhuyPWhhhj6pYjeYGLCRFC4YdhwaWuJjJK20SPoNjGxhiFuHDkqrtd5mRhEGD0mhM7x1pv4zsISpK0tOAlDom1sCBRMDHqEJOEINo7vLCxWugwnBSlhGD8hBAomBhOSbRNT7KmTpNLkKWnpN0+VChlMhlSacIu0mcZuFds5Mqdn2WfM5H1vm5Wdk/tl34iz2Ry+s+Sx6QCpI4Qo+ez2tIK5znmFXMJ3FBVn3gniuAIXgNiR4Z+7iQGBZHZXSX5CPMD8jNKEsqIU6dAC18K7XS4XaCWstHOUL7onIfLeCoC4yqrZi2Orl/hEnM6W8p3lK8u+ClCjlfDy+2piV4xZKUmYVU1alT0DxHFxDAmr7++jBJj4f0cye8BTqH0wni8CvsbLykJCI2FvO0f5GoC17CGAOrYOYOmsBT4Rv566nu8s9RvYRmjQSngTbP4GfHOzJOGHpc/APWy4Zlx1DAk3NIZtyiYGFpJZoqeQ9Yjb7U4slp+iSAl72zn4KnYL2ypdP51N2x71jVfhqt4uFywTIKURrL4StjwGIzK8a+EK61jNuOoYErZZx34rPDM2McCQzNyeQrZnBfw4L5MS9raTJbxDft2wc1dzUtVwbbwn2AxPQ8tuaGFrmZGEYc+3NeOqY3CUsGs98ZkwwaHKZu+T0zg28bIi4aekW76BhAGeHp7Zuk8Tb1OZ8xm5YHkW4LmVXMJqFF8Jt1m/oxlXlHBEUq3vCsWECQqqbHZb9kvbG+Vy/QHPsZLogwDP60n4hUNPS890bKhPxBdT5dWF5TDAEcYlrEYRJZzRBrCYtWjGFSW8LJT3eiYGE1TZzM+JbV9bm3QbL7ezlwqPxgGsq9mVf6xIT8LjWq+ftPG7HTt9Im5j8nXZ8pS0Oc4lrEYRJWw98fID6d/TjitKOO+VsE7bxMABymZn7p60V0/Kxajl2bZTXFRbx0evvkl3IXH6ucrm40d8I25kE/lOlrCLS1iNIkr4tZLy4szXteOKEo7cFZbpmjBxbYxjb4Qe5Myo74cexISJoBA1rHFyqDH2n7X+oDe4mDARDKbNey3UEG+mHusNJiZMBIczr4caYcm5XqBhwoQJEyZMmDBhwkTQeIt54fa8De4nCkW6tcY/nI+JDGLA2s7AjvUwiiZ/AcULS8Zb+PehgTLQINAe3nZ43jRnsOfjilDY9wDxLpcrZ5e0iQqrhI08IhIFR59KuGuHPyv1WPBRNPkzjEf26C0oIghhRoG1w/OmOYM9H1dEEBLmyPB8xdBfEpbwdp9KWEVI5iu/KIHnr08k3BfA82ZwBnuEUCVc12kf80NeRKMQYs6stFE/4nYLyqpEmZvQvoQ2J4TjxDs59twfe/5QEvCT8x131Z8D+Clr538u6tTYl5RagQuXcFzWu2t0Ip/+WWv5hf28pBqo8KaHrIQbodpDMF8pONsE8N77sIZtIKNg/rCWiEL2IDNO5BRnLswN20UcsnXewUVAMsgvtZXOZS4gYchZsJNpFg1+EhZq0bJmyF4YTWWvY3czgCLh9EVbE+7e7NYYhVScc/78jV+cOlRBW5UocxPal9DmhHCwzF+OLW7SJGBxw2Mnj44/IZXON0qbdexXon0Ja5GLJOE15w9cpxN5X/GJuu70ZSAaqPCmh6zwGPZA9ip+XQ4X7b+B00kVZBTMH9YSUcgeVMapnOLMkSm22xL96stzK7kIKAZy7cN6EjbkLNjJNIsGPwljLWbcmL0PP5m9jt3NAIqEL3UB3MoKtQYlBWf3SBH3cbsnZVWizE1oX6Ju2Y69bQC/ZTPFBGyZBlDRzs5JF1xe8YzTLdqXsBa5xES6F17aohd5yrCLACv4jDQGKjXxAivvMewhsvdiB4vbsDkDhubRUTB/WEtEIXtQGadyijNHptjusPMgz1ULzeBw5UH+G0MdCRtyFuxkQC8f/EqYcWP2Aj+VvY7dzQDiWvhOdllrUFKwcgrffrCftipR5ia0L5ESPi9tuli3JgHPj0mT7kTS88CZjA+hzfkRiPYlrEUuMVmja2bqRu6QJ+b82MdAZSBh7CGyV5Bd+Lvte67UfkhHwfxhLRWF6kFlnMopzhyZYrsC/tO/Fh8JqwwKXpFrry1hf87C7w8hQAljxo3ZC/xU9qTdzRCihOPZ77UGJQW3PKuUKKsSZW4SvR86EgZbiTjtjdb7Jy34hIsUXrBPvZzEV8BoX8Ja5BLDatiLepETWTIvHYoBrYFKX8JCD41zxYuq9x/pTmlfdoyOgvkDrRx8olA9qIxTOVVnLs5NbVfNBU1JWGZQ/SkELmEt5yAkjBk3Zi/wQ/aU3c0QfhIWDUoKPJ8gDsqqRJmbApBwFysTpz3rXeDeDy7hqR2fVckefbQvYS1yiYmuG5l0Wi+y3fNZXy4fRgOVwVUYe1Die7y+fOnnE/ZuoKOEImEq41ROcebC3NR2BVzQuhIucEBfSljNuDF7gZ/I3t/uZgg/CYsGJQVnm6VL+x+at9FWJcrcJKZCsTkhHMP+CFDG/iROO2WhtBkhSxgu7G2QpYL2JaxFLtLj3PosS5dO5FzPiivfx0ClJllg5T2GPSjxJZwqgj+vtrnpKIFL2L8HlXEqpzhzZIrt/lKeyO0IOhK+4Ezk/8SmjySMGTdmj6Mhe83ZejSQJYWfhEWDkoK4nMbZl0tj3bRViTI3ialQbE4IB/vr2r91HAfPU2y2yzUH4Jj18xW1DR5HyN8bGuV2aF/CWuTCX6pNtGcCHfkfrSkrVmXzdxhooMLRkBUewx6U+K6wJ6HNHgt0FMwf1tIS9u9BZZzKKc4cmWK7D4qb6o5WK28kfBlcaW2qW5XhkfDHopFchiFnQcLYzriEGTdmj6Mhe9Hutr6y2eddIwU/CYsGJRWTh3Rc+ud8XiKsSpS5SUyFanNS4ci7vbI4l8fzfsc9Wmr1r+riIfdZ5H9XNfVB+T8PCvYloVblIn+1MZd9QkeGI/9ude6WP8WqgQpHQ1bCMbUHKb7sqwALt+tEwfxhLS1h/x5kxinDGJ4FnBu2K+xMiuxW3gv7MTjZaSv9j+ca/an1onYsY86ChLGdcUmwrBmyF0ZT2Yt2t4pTB9bDFxOehy59vDPPN8m9FXnQgivmLav8nc/o8f3MZSDAWGgLXqopC0/kwYuHiq5GfJZez4tL0q72N5sBAGOhvVf0RJgiD2J050X/9yN5zXExIaq/yfQE/wNHLqrTPVESnwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.269;4.blob,1.1,2944.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.324;4.blob,1.1,3472.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.343;4.blob,1.1,2500.iVBORw0KGgoAAAANSUhEUgAAAO4AAAAkCAMAAAC5Q/bCAAACdlBMVEUAAAABAQEkJCQYGBgLCwszMzPDw8P39/f29vajo6N1dXXFxcVUVFTPz88PDw+Li4vT09MSEhLr6+vExMRJSUlAQEBLS0tERETu7u4hISGAgID///98fHwDAwNPT0+2trYKCgqioqKvr68REREgICBYWFja2tpwcHCsrKzIyMg8PDwdHR0WFhaBgYHk5OQMDAwVFRX19fV5eXn6+vpSUlL09PRgYGDe3t5+fn6cnJy9vb1oaGjo6OjQ0NCrq6uwsLAoKCi0tLTz8/Px8fGYmJjc3Nw0NDRsbGz5+fkrKyu3t7f7+/seHh6qqqqenp4QEBCkpKSxsbHW1tYxMTFbW1vMzMzl5eWZmZkTExODg4PJycnj4+NBQUEODg5kZGRISEgXFxcwMDCamprq6up2dnbKyspOTk5ZWVnX19fR0dEHBwd6enrS0tJjY2Pp6enGxsZRUVHU1NTf3981NTW/v7/V1dVVVVX9/f1DQ0NcXFzY2Ni4uLiNjY1aWlr8/PxHR0fCwsIFBQUICAgCAgJWVlaIiIj4+PiGhobw8PAnJydeXl7y8vJCQkIyMjINDQ1FRUU9PT0iIiJdXV0cHBzh4eF/f38fHx8JCQmurq5qampQUFDg4OBMTEyVlZUuLi4+Pj6Wlpbt7e2Hh4cjIyNKSkr+/v6mpqZzc3OdnZ2UlJTNzc0GBgZlZWXv7+9NTU2Xl5cbGxvb29sUFBTHx8cqKiqhoaFpaWktLS0sLCzn5+ebm5vOzs5XV1etra3AwMB9fX3i4uJvb2/m5uYaGho6OjqFhYUpKSm1tbWJiYns7OzZ2dl4eHigoKBfX1+MjIyQkJAEBARubm5AnLfXAAAEl0lEQVRoge2Z+V8TRxjGB6EFS0oUMWgGQWtaIWggcrYkKilEpKjUI1Al9qAHBetRaFWKCqiolUoLKC2oFZV6gorW+2htta297H/Umczuzk4ya1aSLOHz4flh82Yy88773Uxmd58AwCoC+GoCp22sKTKK0/jc89ExE70bX4jVoJxQS/dinBjqJwnB5PgpCVMNXh0Tp00P3qxG6FFS8DI+XTOSU2aSaNZLYttskxC8DE2+A16ZE4RpU9PIqzHGjJUehJQqNHeeBcIMEmdaE7w/np/lOyTbmhGEiSXcnCAkU63cvKR8ERe8+ho+FqC1ZfO8t5OFZmaHLFgoBIsKHa/PikRBUTE6OOFUdFxcsqTU+oaBicqWOqYtW46C8jeTV1hjV6LIQjIDBpeOWLU6x1VRiX428C3Hmtz4tVXyLIHIHQHWSbhvw3fQMdJsLie475rfK0ELzc0OqX6fvFbGf/DhRzUf17K40FWXqIuUR5mW9bpPbKUYd8PGTbrNn6IR9eaGz1BmL1xxxOdbjFu3NX6BcZu277DvTGuWZ6FqafVoFz9SEMV1w90k2GMTWpLafLpXwmwS7N2Htrb9MNkL90upeCHSH0AE7fArjHsQgA74NW6lixlX18KM+MYJQG0nrES4XaB7HsjvlmehKidrRMePqHa1SnPIcYHtkH/c/bCdBM1L8fFwhhduj4QrRCu+RXP1xHyHSrFjFnK6JFxPdQuZEaA3zYEaTR7cPiNIssizUE13ejSbH1EdoXMwuDVH/eMeg9+ToPi42MTgtkq4QtRPzvcJAddEzjzdmXF1J5kRpwZ+MNSfZnFpFiq1iznOKc3B4E464x+3Cwr7N/l2sc52Pw03b4Fnti4FXPlvVxhReA4dellcmoVK7WJmJMPN2+Mf93zWBRLsHUR7WPrgEAB1bTNxeQq4F/tw/kuAxa24rIxb2oCnZnFpFiq1i1kBd0bJYkB25n6zeZECLtgorPjh6itHdq+3oxKv7vgx8ZpNCTez2t7Zoc+6zuJ2wkNV24b5uNcG5u/Ub4FL5Lg0S4CiuDcgviYWkOWQqoSbL3wvoCwl5+atTBxlN7bdvqOECybc3ee4txWwuBFN/SU11/m4Efd/iknZ3meQ49IsQcP9+YHy5Yrql6xfA580HLT6vqpuTQ28h8Ixp16X238npKhzD0NciRZ69KBDZc/hupAWoo3avZ9rxzWucT2TnPei44sOjnYVI5V4L6xWZQd+G8p1FYammNDrWXF/t50HYAje8Lxxq7sSjo449gw1ZXiGDjVvqKbgm9V0WIDjqD8GA3VnQiiOPUNNGZ6hQ80bqscVqFs3MV5ray7zvO4wEceeoYuZZ+jIzRtRxUXggvXPHKNWRY9cHHtGAVfoJzdvRBX/dWZDFRgbuD72jAKu0E/+ACjq8UAsema3avYvwsjFsWcoLs/Q4eHGXmkBoIdsVeEtjj1DTRmeocPD1bvQhwnwmCYVBySOPUNNGZ6hw8M1OQoNf1sEu/wfyQEJQ3HsGWrK8AwdHi6ob47uvyXcXvw78ESLwsNFqY2jXYGWinP8N9olaKknOu1NsP8BuRWMrDJGjXQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.402;4.blob,1.1,3344.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.419;4.blob,1.1,4272.iVBORw0KGgoAAAANSUhEUgAAAkoAAAAlCAMAAACKwDYNAAACzVBMVEUAAAABAQEzMzPDw8P39/f29vajo6N3d3fU1NQSEhLr6+vExMRJSUlAQEBLS0ukpKTQ0NA4ODj///+Li4vT09OsrKzIyMhYWFggICAREREyMjL9/f0bGxt5eXn6+vqQkJC8vLwtLS20tLTt7e3q6uqtra0mJibk5ORbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7f19fX7+/s3NzfBwcHp6emTk5MMDAw8PDxISEgeHh6qqqrz8/Pu7u6enp4QEBAoKCjx8fGioqIYGBhCQkLR0dF1dXVoaGjo6OixsbFPT0/W1tbFxcUxMTFERETS0tJgYGAEBAReXl4UFBTs7Oy6urpMTExVVVXi4uIPDw81NTW/v7/V1dWAgIBDQ0NcXFzY2Ni4uLh6enpUVFQnJydiYmK1tbUwMDCampoODg7GxsZSUlLh4eEICAgVFRVjY2PKyspOTk5ZWVnX19cHBwciIiL4+PjAwMBRUVHf39/m5uYLCwsqKiolJSU0NDRdXV3a2tpHR0dBQUF8fHzn5+fy8vKGhobw8PCVlZUKCgqIiIgNDQ1FRUU9PT1NTU2pqam9vb1QUFAJCQmEhISMjIwaGhpWVlaurq5qamrCwsIfHx/JycmhoaGlpaUkJCTv7+85OTlKSkr+/v6mpqZzc3OgoKCHh4fc3NyWlpZkZGQCAgIDAwPNzc2NjY3e3t6rq6scHByKiophYWHb29uXl5fg4OAdHR2SkpIhISEsLCwvLy+wsLCvr69/f39paWkpKSlfX1/Hx8d9fX3Ozs65ubm7u7s6Ojq2trZaWlqbm5t2dnZwcHAXFxdubm5vb2/Pz8/d3d2FhYUFBQUGBgaUlJSdnZ0jIyNxcXGcnJyYmJhtbW2Dg4Pj4+Onp6c2Njb8/PxGRkaPj4+BgYF+fn5lZWV0dHQWFhYuLi4+Pj4/Pz9XV1eoqKhmZmaJiYlE0NUnAAAJcElEQVR4nO1c+2MU1RW+0UTiCtl4SVCkhppHUwIkJLXIBpL6SNAgNiElYMIbApXXhrZAUGKXJFAfECjgk4dE0kcsEcUiFgWUQgVrq6hE+1CxLfZl27+h9+7MvefMzJ3ZDZlJBOb7YXLYc849Z89+mTsz+xFC+goJfVbJxyWNK65MTLqqv5vw4T0GJFstV3F14JqBg1LUvmCqBwWvpddGfw5O82BxH/ZIHmC1LEgf4rSEs/c6er1thqdUGmqt68ND3DDsKxbLit5Q6cYM+wxPqeSjbzH8q1ZLx02ZWdk5X2NGLo2Cv/b1EXkjR43mVn7BmMKib6QYvICbv5k49pZxzEjVvCHshIxganFa0ZAr+IvjJ5SUfutW4yqyBvLellly+x1lhhoornxiQdqdnEp3sQIV0UWCk+6eXHTPt7lZWVVQNcXYiw+3UD32OxZLx9SaadPvTa2tI2RGaOasUIh/AvcOmz1n7rz53J1PRy6orC/DXsDCpPnFi0q/y6z7QosLmHcJ9kJGsHTpsvpZy8OENORW1a+oKDS2IGuAd3Tge9//wcqJq3ANiFvduGbglBpOpbJQKKhTaezS++uTH1ile9f6VPIGKXlNFktHMX2QkB9mzuC22JBWRwhZtY7y01I+ldSzbnATmqsJaaGt3F7faC0rN7gNQwkZxOMG/4gxoZzeYAiTNcD70MOM2wvp3YYaMu6RwKOE3K9vcBsFlTYR0kY3M28N827xqeQNfnyV1dLRENi6RZxMJFm2DSlhOwe/ns2n24nZK5H3GD8GHudHRyrxa6Un6JOETH4qHA5vT3raECZrgHfHBP7vneMMNWTcrt0ErpUElXiN1XQZ8z4T9fpU8gJ1iW0WS2LP7vaMac9GTfHR7+34ScqMn+pUCotAC5W203z+Y+LP+DEmlcrodYRkaddPPzeEyRrg7XxOUUPG1XJiqah0Pa1n3uHEp5JX+EXuPouF0PXspMSF3BAffebz7LAtJpVIkXbG2M+P8VHphRcjHAcMYbIGeLWzkqmGjNvFiWVLpV1B4lPJK+x4yWoJDJjYxa696S+5Peqg9lrhTHZYb6aS8AJytOuYSm6rqCQygEovH+L3YqbHEbIGeB9qZ5vuK+1bDDVk3K/Gsp1urx2Vbgkw73SfSl7gcMerFkvitcQjKXuP5u3h9jp6rHXuVEJe77ixZfAwOoYYqCS8gDcSC1uOZ0Xv9JRUEhlApYbs1HVtgzNuMoTJGuCdmv3r6U9WpYYNNWTczqStxXNrxR1cVih0G6bS4cStxcdzfSp5gRMnrRbg5t/UtL95Kmom7M8qWMk+yIQTtUmn3zrEn+AgKgkvwqlrEgMvaxftKiqJDKAS2ZPzcMmaOcYwqAHe8afzNvy2wVgD4lrTMpIXiedKDOmYSmROWkHV2/4DTC8w+XdW61IG591dHb/v7zZ8XPTYXPFO+bulo/q7DR+XABadaXzv/XDsOB8+fPi46PFBONzVvx2cDYcVjwZ99C32SOuCpcPpVHv63n9IptpzvD5BWVPsmMsRd96jG72QDqdfGWlwraELwpiWPqRS/Zm6PqrUTWlH7YfGb0FAQWQDewGt/pCIao+P3BbaVpYe1gwn6XAspGe61xAhs7W3u75HSWWOVHJ5anccjSPIWRMZX0Z3bmjz8ebOTfg1UBDZ5NoLaFlqKHs3OyQ4x8XoSo2uZvFMTSUdjhfuUEn0PDspxPFKj5IVVIprunYZjmgoGujeYk4Z3Z3s8FHHH0wvb3SkkjNyH+t1V2osKxqnWyrpcNzV3KVS3gUkO1Ophx3ExB+3CmsJf/KrELyCWPZPnA4ROgjHIXGrBBLkSolslEokt5sYhbaCSlLWC7ly+7u68c/8R+diU65OJRlXST8u2TUl8EmrIc5JRIwygvNfyi7K0R57v3hEK4CkwzAXRa6qGqKSFAyr5qeaOMwUekZUircXBZUU03VtaqSY6kZTTfutSsEriGXxKEQciFsBkAES2SiV6jIWmIS2OpVA1gu5sP19yn8vzvFvygy5OpVkXCXd/9ZnqS1DduA4RxExygjSSX95Okn7vcp+WyuApMPy/apyVdWASiAYVs1PNXGYKfSMqRRfLyoqKabr2tTIEi5Y5Fi18mCTUvAKpzjDKPQ4ELdiiAyQyHa/Fw6PmXb7AZPQVqcSkvXiE6ruraTs3vyvs0xdoQ1uoz6UA2T538j55TjOUUSMMoIvnCXkc8pPBaO5vlKD/OJZvl9Vrk01nUogGFbNTzVxPFPY4MIMH/SgFxJrg3N3agwVx3AlheDVhkp6HIhbVQ2DRLabnyYPnjOtLDc4kPUqqJTwwDGyb+TfzbkqKh2aTdbn4jhHETHKCI5grw+liwj/2MvFwohK2+1zbarpVALBsGp+qonjmUoqRfeZIz3ohcRPJTemxrDyEVxJIXi1oZIehwQb1oaRRLb7k0hkzVLzyoIsSNaroBI530xaM/5hznWgEopzEhGbh0IK2AZM/kn/JRZGVArb59pU06kkBcPK+akmjmcKd3BcNPpRT3rpMZV6NTWGtA9xJYXgFRbrXm4dhSOVkESWXyu10X+bVhZkQbJeFZXGDzu3+Ki5KycqGeLsRcTW368V7HiAyrtaK5VUuTbVDGclu/mpJq6kEr5WireXHlKpV1Pj72AjrqQQvIJYdkHjo3yxOKgkMkAiG73sPlloWlmQBcl6sZhXPiqY/1zWFnNXTlSCOEcRMR5K8z5CVtD7mOdsxudiYSuVVLnqavJaSQqGVfNTTRzPVPSsopJzLwRTaYnYrizTdWtqjHwFhi+KFIJXEMs++Nnuytcr4qGSyACJbJRKX9DX8MogkUWyXpkLXnb30Lih2twVvoOLxqG3CHGOImI8FPqftv/mvRldcanc861UUuWqqwkqgWBYNT/VxPFMRc8qKjn3QhCVtNtz5XRdmxp5VVx+k8d5hyrBK8hrl81rPPlFPFSSGVIiG6VSV+eneGWQyCJZr8wFLztRBP5n6Qo/V4rGobeI4pxExHgoZz6uScrRvjQ7L39zrVRS5aqryedKIBhWzE81cTxT0bOKSjF6QVTSbs+V03VtauTdtUKHMLyjmly+0C4gNTyRccqFFdNP97vIZKfXX+fiqZERJ4SVPs/bsl9uGIayf6YLf5XuchCZ4KltGymux+pK3vG27JcbBio1Pf9+71dcHel3kUkksil2VG+ApvbGWvmfuavr/b8PKTF1QX93cNGh3KjF+T/kps5kw1L0OgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.477;4.blob,1.1,5764.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,3.591;4.blob,1.1,3888.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.630;4.blob,1.1,3036.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;3.end,1.1;4.move,1.4,1.3,1.2,3.460,1.0;4.sync,10.6492311205;4.rect,1.1,2.41,1.5,2.78,3.105;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.44,1.8,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,2.39,3.156,3.169;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.39,3.177,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.44,2.27,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.41,3.155,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,2.77,3.158,3.128;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.82,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.79,2.48,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.98,3.188,3.110;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.116,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.175,2.28,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.177,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.157,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.176,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.289,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.269,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.253,1.8,3.313;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.250,2.26,3.316;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.230,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.234,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.253,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.326,1.8,3.126;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.550,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.250,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.253,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.253,2.19,3.313;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.291,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.286,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.288,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.286,2.47,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.288,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.288,2.48,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.292,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.289,2.38,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.291,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.288,2.98,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.326,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.326,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.329,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.329,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.329,1.8,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.329,1.9,3.123;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.327,1.8,3.239;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.327,1.9,3.220;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.343,2.27,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.345,2.77,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.349,2.47,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.343,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.405,2.18,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.402,2.39,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.402,2.28,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.403,2.18,3.163;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.402,3.128,3.167;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.367,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.402,2.28,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.477,2.39,3.184;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.441,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.405,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.424,2.10,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.405,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.405,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.421,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.424,2.27,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.443,2.47,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.443,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.440,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.440,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.441,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.533,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.536,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.535,2.19,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.538,2.28,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.557,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.535,3.218,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.535,3.178,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.557,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.554,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.614,1.9,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.591,3.156,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.611,3.118,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.611,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.611,2.66,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.612,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.652,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.652,2.16,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.652,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.3;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,3096.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;3.end,1.1;4.move,1.4,1.3,1.2,3.466,1.0;4.sync,10.6492311258;4.copy,1.1,1.0,3.133,3.960,3.532,2.14,1.1,1.0,1.0;4.rect,1.1,2.81,3.552,3.546,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.614,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.614,1.9,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.612,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.628,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.633,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.633,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.652,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.553;4.blob,1.1,7492.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;3.end,1.1;4.sync,10.6492311279;4.move,1.4,1.3,1.2,3.502,1.0;4.sync,10.6492311612;4.rect,1.1,2.42,2.21,2.77,2.89;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,2.77,3.269,3.131;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,2.79,2.99,3.168;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.80,1.8,3.166;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,2.82,1.9,3.161;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,2.79,1.9,3.168;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,2.98,3.179,3.149;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.101,1.9,3.142;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.98,2.48,3.145;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.119,2.28,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.115,2.29,3.128;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.139,1.8,3.104;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.174,2.19,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.176,2.18,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.269,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.272,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.270,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.286,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.291,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.292,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.348,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.348,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.345,1.8,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.348,1.7,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.345,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.345,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.348,2.18,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.345,2.78,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.348,2.69,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.345,2.89,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.345,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.346,2.67,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.424,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.445,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.450,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.443,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.443,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.438,2.57,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.443,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.440,2.66,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.440,1.6,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.443,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.438,2.56,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.442,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.497,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.495,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.519,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.519,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.518,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.614,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.611,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.614,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.614,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.614,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.633,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.633,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.640,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.630,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.652,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.658,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.652,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,2.22;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,7316.3pDN3KoIyQXl6bTSEdTjNf29lk7Ob5S53xDD9xupKmKJnEYGR4/zn9tufK78v0mcP9scb33tP0BEcv60q0KUHFKiQH6QC3iobp/SMOQMqypIl9TGnQ07X7VdVwnQDgvtyUoBHq8wzygXOQ5wbA3vg5pOzm87D9REv3QLuVrQguoDueUSkOtBRZbjQLsz/Fxhz91Rhj+pbcZZyv+bxPlzgPFd57knivOnXRXzapfjKJAfykV6qLZf++6OV9uqnqwQz756dZCqCOvJurjORvkwPni8oqqQucA4wLE1vA9qOjl3/32iAdEv2QJWC1pQfSC3XAJqPajIMA6YtfBzpXjuPmz5Gnq4zvhE+X+TOH+KK2vLp05Tr4Z3/jz0YF3dU13a9cBRID+Ui/RQfb/6AyGucZ6gfC6p77c1r25KXhXWxl4sRBqerIWJ72EeFwzXXwNXhZsLjEN5Kgjpg5pGzn3BPdLXL9kCr5bbguoDueXS+NaDigzjgFkLP1eq526Hx3y5/Hqr+gPbJnH+FGLBwlOM6xdFc/48ZO20yzYofUB+KBfpobq/j4D3FT6X1P3/sq8mqwp7Y9uPF6E9WbfYlnWzb1IjElUhc0HzTKx0UB/UNHI+19jutiarwtcCr5ZsQfSB3HJpfOtBRpbjgFkLP1eq5+7k9z2Z1BTs/Ug90zTOnyaVrYyfRHP+PPTa7Nnvnq72IfPDuUivo71WjVBVYcfbe6zQVUWFtbGfFiINT1bqCSppVdi5wDwTKx3YBzWNnP9k/E/SfukWaLXcFlQfyC2Xxu9ESESGccCspTFXiufuEE8JiNeNS+vUM03h/Ln4htOsf+5fFc3503pfcYdxmtIH5IdykTO536qRpFWxv1DoqgI/o4f0ZNU/QcE8Qy4wDur7X1Af1DRy7gHvK3VVQa+b24LqA7nl0lD+nL7IMA6YtbTmCnnuzjrGk0mPNdU/9pzKqPOn49T54Crz2+a68Q9Fc/60323vWq/0AfmhXORM/qXIfPm9M1lVnFC91PrpQwHOFKB2WFBPVv0TFMwz5ALjAMdW/WxQpJFzce0P3Sa+fskWeLXcFlQfyC2XxrceVGQYB8xa+LlSdtiihmW+XO7d6ln+TDp/uk6djVsfuW7bo7Xbozl/2lXR1frJMkSB/KAFzOTtFeNGXbTX/RmU1yV1S+m4UZNKElXh9xSldlhQT1YatypgniEXGAc4tqbyQfWTTs6nv+828fVLtsD+tW4Lqg/klituNDxPKOR6UJFhHDBr4edK8dz9BfETgE2Gx7s9k86f0qlz4NjqjV3sH5xEcP60q2LRyn8qUWR+yGsV3FlnDqltPdr9fYXPJfXCIQ07f594JXEzLU68I1hE77Cgnqw00uNVzjPKBcYhHVtT+aC6RMv5Q/nd1tcv3QL517otqD6QW644tr7SMxfkehCR0VqCg274ucKeuw9c7f/zNXdarwCMjV3O9crvdI5KzO6rWcooLaLlfGat16E5HrADYs/xGekiPbo94z/3uXFk0yeSmzzb4dPtD4w5VTl3VuIdQd8spZQWEXNePTIjn29HVTGv86eZ6CE9bj7F+w7SZN30Ca80fSq5yejdax+81fvE2+K44ju3ZiIsqorKfbmjK/nl1eQfxZz9Gv8JfgYzLPnvFJof25N8lH/xy02bB8MwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwwWnVOtsZMEyu0bpVtjNgmBzj672dv0hfKE2LC0n7YoZpMRzr/tnB9/+P8B0xTEukssh27jv/3nlzvrv0kk34iGFaKBPLbY+HK9uVTx7StvaP+IhhWiiHT038u+jC0vJtV6hHDNMimVfq/pHzbw+9/yTvEcO0RC4pcayT/l372bP129QjhmmR3Oa+Ktz9UyF+e416xDAtkS31v8h2CgyTYzyzK9sZMEyuMfzX2c6AYRiGYRiGYRiGYZimJ3fcznOVeGaI5zl/+HJVacXUbCeR08QzQzzPwejfe5H4zm/FEcYRorCT7kb91ZQtFg7R3PlF9fM7DkwMG1/Tm4+vGYbRAf47zZiGr3YMPTYPnnjh6ZhCQBxphuTcxxEF5sozp8mwbrOpC7Ej6DABeouHA8bL91XcL0YZ85Lsq55HJf4NXhVki5tu0bT4j6G7Ggx9fr0KCgrzuSoizZCc+ziiwFx55jQZ5m0F3fuYX9aF2BFkmCC9pYdXl/q08fWnjbL71vRLtq9iqgotT9YGvTM5KXs7Jp+rIo4ZiieKMlfHBNynJTfY/4R/3lAI2lt4vLrU4vqJR87a+tmH51g5jxpSdtSX1tlXruo85rcrzIOSxIufoK+KZQ1PrS/bqrwmUy3Qq98RQ6u6D/5MSaFTokWBEu/kbuWnnNpXiEbjV533v1r92kylX0DGQ/kN/GZp0QknmgdvrTS/zDYO2He6c7p9SsOQM7xVcUaHijZnqmOToCiQPdxHxJPZk+NFVyEDsyqGDf/O2SjyaUZ/68rpQ6LNEMw9iiIpHHRS97LB31JmDeUsjyAKmiuYU2plMLIqAu2IL9a+af2z8ivPXDm9ofVI1W8gKF1qh0te/3j8705db+Y85vQ39p1zsE6IPSU7963pYJ4SIwpGnmO++An6qlhmnLK8cV8vHI9qAa9+w9p22XZ+p73zcIvDCr5qMFs8jOOd3/uCCy8aP8ha89UvLek046jblH4lEA96O7di0KjRY8YKuirar313x6ttPVVhdJk4qepSQfcBUaA3uI+KJ7MnxwtXUQatxdndLrtcyaDbBPPLxcYl0WYI5h5FkRQabb53XsU4gWcNcoYjiAJzBXNK9avgVkXAHfFP62ljgzWnylz5qiJlv4GgdKn3PzP1Vx9fMNSsy8L5N1nvM8zvOQv7mdO+3fi6dV0+D1FXlxkD/L34W8CIRhkXC/HJ0BGevNY6BzJe+9lC1PQ3+ppr3kMc/IP48KCalQvEg96uml4pxAzriKqK96s/EOIaT1VcXWOdu5buA6JAb3AfFU9mT44XrqIMWteNnN/eOoLIJxs/EuLH1XXRZkigJw8ZRVI4q1iIH1odwaxBzkr2ThSYKziXpF/ArYqAO6LRWCDEd8/xzpWvKlL2GwxClzr4nl0/uPXj3c84T31nGncLMfzjurq6pRXnWdeVdwneq8uMpf5O/C1gRHuqx2162NcCrbkb7+ajOpsvsrfYa775AnFliZqVC8SD3srtJai+ka6K/X0E/b6ipv48ug/0vUn2BvdR8WT29HjlVZTB8J5LfuSJvLjkaFFcfWvEGRL6quhmfrnJGI1nDXJWsnerQs4VnEvSL4DfVwTYEeuOf0zcd8rfvXPlq4qU/QbEr0s9tk3Fn06+rPskJ+dexn+EqEo8gdqvKcoe915dZtT5+/C3gBGJBX021na51tMCrbkT7876uyaO+Im65jgriYwne1tqLLMuTOlIV8Vec93pd9tzf0r3gaLI3uA+Kp7MnhwvugoZGEuMe+0jlEGrshV3154ZdYZSV4VoWI5nDeWMs8dVYc8VnEvSL4CrIsiO+HC6mFl7uXeufFWRst9gELrUn3RfUvP13vXbcc6z3p5t0cO67t/j6Gr4qjBfr65tU3qu2sK/5kO/Y365WV1znBXCiQe9lSW+660W4pD5VOF7rbDWnaqK4vqf0X0oUZze4D4qnsyeHK9y1c1g7aiptQOtI5TBivIHutwVwwylfq1Yg2dNyRmOcFXYcwXnkvQL6KqC2hGv9N7w1aPKKFELWI+U/QaD0KWeb/xVfFBvfIJzfmGz9bOIxF8bPPUy4RkRukpWhb8FjKjVlEXmGyzjPbWFf83Xj7ROq2uOs3KBeNDb4MQTcqMQy9d+YM2pUhV/KTIfQe70VEVJsTUR0+g+IAr0BvdR8WT25HjhKsqgtbhi+GbzqVvJ4IRZvTdEnSGhr4rp9wmxxjgMzxrkrGTvVoWcKzin9Puw/wlZVxX0jhh0T9Um31w5LWA9kow3BqYZZlEeb8015Lyne6f+dyysPcK63t94bOZFw5JcJavC38L6iUNVQcFZQnxe+s7EOx8tX6C28K/5E/VPzljY23gKrznOygXiQW+/LF0/Y1KV9XOLi5f0aXyigzV/kMHtFeNGXbTXUxX1g3YMGLNK0H1AFOgN7qPiyezJ8cJVlEFrIZ4qa+PJ4OneEyLPEIycrArj8Tv+q/whgWcNcoYjiAJzBedwv1e03ej/UamvKlLtiPPXzq9U5wpawHpQ442Hbxjm+7mx3ZWcxYLBczu/e6F9fd3qqobJRyS5SlaFv4XzS/+e5v8H/qPtxoee87Twr/m6Z/ZWvPjS5ol4zXFWEhkP5ffc86XVL9jfsd4Yv3ZXV2v+UAYzh9S2Hu2piuOWF1W0eVkk6UNGQdnDfUQ8mT05XnQVMrB+i/eq8RM1gxX9ukaeITRyqip2/6ptxeA9Qpk1yFkeQRSYKxQZ9Vsz+TL/nxnzVUWqHVFc/b+euUItYD2o1WKaOSe9VpnhHhLvthkmXxjx2JI1me6Dq4LJL37T4fWM98FVwTAMwzAMwzAMkzFCagUpQukH/Rqd6Bkk00HGRVJdkTLyYOM4rE3bdoe3jyevJgJGqV/pyPqtNPvNACG1ghSh9IP+HRY9g2Q6SC3uJ7YCkLQqlJFrx+H2dkTnLkd27dZd+ZRZmlk1WVsYpX6l466KoP1GJHPOqcH1g5H1nEkIrYOMoypE4JG7vfUpKhaib7+jk2WQi1Uh8Cg14427KoL2GxGfc6pePQoKRvR5alBJYoVgImekq0SAztDVcyIVIpkB6CXd3ujIGJ8OUq9pBS0t0VsqDepZQzu3+3YvPHI8Dtm2sM11w8su/ZHSW5vjrVv6D1AykDOEzvmzR2pUSjeL2gJuFKz71OaHIhP6UKFdaa3WF2tpZWTIIEq/UaAUqnqtICgYcVW4KklFIehkD7pK1K/UGYKeE1SIVAagl4TeqMgKPh2kXtMKWlqqN70GtW/194/8weQpNXjkMA5oW1h0+jX7Wh9fg3sbYHz37EQUOAczBOeI7JEaldLNQlsAosCM6/ODyJQ+VL/SWq0vyh4iQwZR+o1CEudUjVYQFIxKVTgqSUUh6ETBukoX0BmCnhNUiFQGoJeE3qjICj4dpF7TCs8MVG96DeqcuVbpGtfh7OEI2hYWmQVwh/Es7k1cWVs+1YnmnsNKTPcckT1So1K6WeopCKLAjOvzg8iUPlRoV1qr9UXZQ2TIIEq/kaCdUzVaQVAwKlXhqCQVhaATBesqJVJnCHpOpEIkMgC9JPRGRsb4dJB6TSvsA6o3vQb1tqusr7efiLOHI2hr59LeeAP3JsSChacY1y9SziElpnuOyB59PpbSzVJVAVFgxvX5oZUm9KFCu9JarS/+dK+MDBlE6TcapHOqRisoFYxqVTh1qigE3ShIV+kCOkOk55QqRCIDrJeET6sTkRV8n1fWa1rlPiB702tQV96D/uNbN2hr53KLsQ/1ZlPZyv7UuDyHlZjuOSJ7siqIESFQFDnj+vwgMqUPFdqV1mp9UfYQGTKI0m8kaOdUjVYQFIxIpyl3jqIQdKMgXaUL6AyRnlOqEKkMkF4SqoKIrOCrCr2mFfYB1Zteg5p4rfBl71NsErtu8Q2nWf/cvwpngJWY7jkie7SvKN0sVRUoipxxbX4oMqUPFdqV1mp9UfYQGTKI0m8kaOdUjVYQFIxI7Sl3jqIQlNmDrtIFdIZYz+mqEKkMQC+JlU0ociAdpF7TClpaqje9BnXORrP/n2/cpI7cr9jEu87t7cFV5pyuG/8QPoeVmO45Inu0ryjdLLQFcBR3xvX5QWRKHyq0K63V+qLsITJkEKXfuNFrBUHBCLpA2DmgEMQ6SNBVuoDOEOs5XRUilQHoJXFVQORgOki9phW0tFRveg3qsO4Ttt29s1Mdzp5SbOJd5/bWuPWR67Y9Wrsdn8OqVfcckT3aV5RuFtoCOIo74/r8IDKlD9WvtFbri7KHyJBBlH7jRq8VRApG0AXCPpUKQayDBF2lC9JkIj2nq0IkMwC9JKoKiBxMB6nXtIKWluxNq0EVr7xYPv/6PUr2lGIT7zrZ28Cx1Ru7PKtkgFWr8j5/9vj9KqWbhbYAiuLOeIr8ZGRKH6pfaa3WF2UPkVEGEfptWtJRpWROV5l5xSYThmytR7b3QfiqyJyusikUm0xwsrUe2d8H4asic7rKplBsMsHJ1nrwPmAYhmHyjrgdOFuuo2e2Rs5OrHETtwNny3X0zNbI2Yk1dsI6cKZS/8ThnEqR+y53cYz8ccOoL+mzRXeLbxy6foMrQDO1brkPpcsK6sAZ1C0yiqOnTjeW+1URh2fs4+MLCk5uffxNmlt849D1ixWgelVeHNlHI4rikCSgQpXqN6gDZ9CqiOLomd9VEYeX6ePWz8wvphzYJL5xpOj3mGBVEY+faxRirwqfQpXyBaWUjsiBk9JzSqCtXikaxReU1JZKmrMjKmBXxStmVdCKTRiHjIL6lTlTblCkzlWSRvb6WaP1zg6gX4WV1ucXHkqhSvmCUkpHcOCk9JxACtdVIl54X1BSWyppzo6owOPfqau7+DgrF0qxCeOAKNAv5ExVBbX6QPjsU8warXd2AP0qrLQ+v/BQClXKF5R+jXLdDyg9J0brukrES8cXlNCWSpq5I6rD49b3y35mM1KxCePAUdx+IWfSkTzFE0rY7FPMGq13dgD9Kl7pmJ+gCIUq5QuqrwpKz4nRuq4S8dLxBSW0pZJm7ojq8Pjw2bO/16XodlqxCePAUWS/MueIVREo+xSzRuudHUC/ilc67vcVhEKV8AXVVgWtHkVoXVf98dLyBSW0pZJm7ojqYL+vWFr0F0EqNmEcOIrbL+QcsSqCZa+fNVrv7CA/Z66sdMxVQStUfb6g+tcKUj2K0LquEvHS8QUltKWSZu6I6mBXhVg1SJCKTRgHjuL2CzlTLrPhqyJl9rpZo/XODqC+wCsdc1UQClXKF5RSOsJs0OpRQOu6SsRLxxeU0JZKmqUjqk+Ra1fFvI33qJFdYBw4itsv5Ey5zNKrD4TNPsWs0XpnB6gKvNL6/OKA8gWllI4wG7R6FNC6rhLxwvuCktpSSXN0RPUrcq3f4r0xoeoVNbILjANHcfuFnCmXWbz6NxILHDb7FLNGaIIBqAq80tTujBnKF5RSOsJskOpRQOu6SsUL75xKaUslzdER1a/ItX4G1b3nWZ7IEhgHiuL2i3KmXGbR6h9b71e9hc5eP2uUJliC9KtopandyeQn+ajc7Tk+Q4EZRuSpcnde508zFJlhRJ4qdyv35ZmS4v8DJkbjBmyMayIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492311675;4.move,1.4,1.3,1.2,3.557,1.0;4.sync,10.6492311691;4.rect,1.1,3.122,2.22,3.157,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.192,1.6,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.44,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,2.44,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.41,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.61,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.61,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.61,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.83,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.63,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.82,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.79,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.80,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,2.82,2.19,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.82,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.79,2.26,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.154,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.250,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.253,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.250,1.9,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.251,1.9,3.410;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.267,3.438,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.279,1.7,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.269,2.79,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.269,3.188,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.310,2.19,3.313;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.288,2.40,3.278;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.288,3.368,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.307,1.8,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,3.310,1.9,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.307,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.310,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.308,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.307,2.49,3.354;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.326,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.329,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.326,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.324,3.377,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.384,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.421,3.108,3.148;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.384,2.48,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.386,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.405,2.10,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.403,1.8,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.405,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.405,3.328,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,3.108,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.443,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.419,2.48,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.481,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.481,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.477,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.481,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.478,1.8,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.481,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.475,3.119,2.95;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.481,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.478,2.59,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.210,3.478,2.40,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.478,2.89,2.90;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.478,3.118,2.90;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.500,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.516,2.48,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.514,2.78,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.557,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.554,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.554,3.108,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.557,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.554,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.592,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.594,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.612,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.609,1.8,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.611,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.614,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.614,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.614,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.611,2.69,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.611,2.29,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.611,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.611,2.97,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.611,2.38,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.611,2.38,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.609,2.88,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.609,3.119,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.633,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.630,2.68,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.647,2.48,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.647,2.97,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,2.22;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,4900.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;3.end,1.1;4.move,1.4,1.3,1.2,3.565,1.0;4.sync,10.6492311758;4.copy,1.1,1.0,3.190,3.960,3.475,2.14,1.1,1.0,1.0;4.rect,1.1,3.132,3.496,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.498,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.497,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.497,1.9,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.496,2.46,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.536,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.535,1.8,3.127;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.538,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.593,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.595,2.10,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.595,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.593,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.631,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,3.478;4.blob,1.1,1432.iVBORw0KGgoAAAANSUhEUgAAAKYAAAAPCAMAAABZRURjAAAByFBMVEUAAACkpKTQ0NCLi4vT09OsrKzIyMgREREgICAODg7k5OT///9ISEj19fUzMzNoaGjo6OgtLS20tLTt7e3q6uqtra0mJiZbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7f7+/tLS0tERETS0tJgYGA8PDwLCwvs7Ozv7+8QEBA1NTW/v7/V1dXu7u7GxsZSUlJUVFTh4eEICAgYGBgUFBS6urpMTExVVVXi4uIPDw/9/f2AgIBDQ0NcXFzY2Ni4uLh6enoiIiL4+PjAwMBJSUnm5uYFBQUCAgIHBwfX19fb29vn5+dAQEBBQUGIiIgqKiolJSU0NDRdXV1eXl6VlZUKCgpNTU0aGhpWVlYVFRXr6+u9vb1QUFDz8/MJCQnJycmlpaU4ODghISFYWFgkJCShoaH6+vo5OTlKSkr+/v6mpqZzc3OQkJADAwOxsbH39/cnJyfNzc13d3fR0dFhYWF8fHyTk5N/f38oKCgvLy+wsLCvr69paWl5eXlHR0dfX1+MjIwBAQGNjY03Nze5ubm7u7s6Ojp9fX329va2trZaWlrg4OB2dnYEBAQXFxc9PT1ubm5CQkJvb29iYmLPz8/d3d2FhYUGFmwQAAACJElEQVRIiWNggANGJgSbgZmFYZABVjYIjeJMdo4BcQsegNWZgwlwcjIwcHGDAQPImTwsvGx8QBY/UEAAokRQSFhEVAxVm7iEpJS0DIglKyevwKuoBGQpq8ipqHKr4dCBDRBtirqGphaDtpqOrpoaSIZRT9/AUNfImIHBRE2NEeJMUw0zcwsmSytk8y2sbWzt7B3AFnBLOSobmjAwODm7uKq6gSzApsPdGAw8yDPF08tbnQEp0n3YGRh8uf3AHH+IM3m4AxgYAoW0kS1wCgJqDeaWAVsQAhEL1QhjYAgHWYBNByMkxgwpMgUlbUZwRyI7Myo6JpyTAQ3EssUBLeUAWxAPEUpIBBJJIAuw6UgOAgN2ikxBcaYJdwqyMxlS0zTTzTJQ1GdmZStp50AtMIaIWebCLMCmA1ukk2wKXmcyMORl5BcUIqsXKgKFBaoFCYxwC7DowBbpJJsi7Y3bmcUlecD0zF0K5nBCokFBB0iUoVpQHg2MN3OQBSg6oABbpJNsSjB3hZ+dKbIzQTldWE2tkoGhqqBaKbNGMhWkDlwwAEFtVl09szW3PLIFyQUxPA1cIAuQdeADJJjSCJZvahaW8xJEdiY/JJJYgfyWVg3NtnawamjBwNDUYdnZ1d2jhGwBgy2LnEovdxKqDnyABFNys/oIGkckAKUH/qx+mpjCak+hsXAwQWDipMl60jQxxSpuIoXmIsCUqc7TphsTVkeGKX2GTQwAlfGcZ3sxMI4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.516;4.blob,1.1,3780.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.554;4.blob,1.1,6600.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.627;4.blob,1.1,3968.iVBORw0KGgoAAAANSUhEUgAAAkoAAAAlCAMAAACKwDYNAAACu1BMVEUAAAAWFha2trawsLBhYWHZ2dlCQkKysrLa2to5OTng4ODU1NQBAQH4+Ph8fHygoKDQ0NAbGxujo6Px8fEUFBSsrKzIyMgYGBj+/v5XV1f///9UVFT5+fkJCQlqamovLy/6+vrY2NiYmJhsbGwrKyu3t7f19fX7+/tLS0seHh6qqqrz8/Pu7u6enp4QEBDk5OTc3Nw0NDRAQECkpKSxsbFPT0/W1tbFxcUxMTEtLS20tLTt7e3q6uqtra0mJiZMTEwoKCjPz89ERESDg4PJyclgYGDr6+vj4+NBQUF1dXXo6Oj29vYaGhrl5eV6enoVFRXS0tJjY2M1NTU8PDy/v7/V1dXp6enGxsZRUVHf398HBwfs7Oy6urpVVVXi4uIPDw8lJSWampq1tbXLy8v8/PyNjY1aWlpHR0fCwsJfX1/Ozs6mpqZeXl6Li4vy8vIyMjINDQ1FRUU9PT1ISEgqKipwcHALCwuZmZk2NjZKSkr9/f0cHBzh4eGBgYF+fn7m5ubHx8eurq4ICAgiIiJSUlK9vb1NTU0ODg6dnZ2AgIASEhKHh4cgICAkJCShoaHv7+94eHiXl5c4ODjw8PCCgoLe3t6rq6uUlJQDAwP39/cnJyeOjo6Wlpa5ubkGBgZra2sMDAzb29sKCgpQUFB3d3fR0dFxcXGVlZU6OjpdXV1/f39cXFxpaWmvr6/09PS7u7u4uLhJSUnDw8OlpaXAwMBDQ0PX19c3Nze8vLwZGRlOTk4FBQWEhISGhoYsLCxnZ2cTExMzMzNoaGjT09PExMQRERFYWFh5eXlbW1vMzMyKiooXFxfBwcGTk5OioqJGRkZiYmK+vr4CAgIwMDDKyspZWVnn5+dlZWUEBASIiIipqalWVlaMjIwfHx9zc3PNzc1kZGR9fX0dHR2oqKhmZmYpKSmbm5uQkJBubm7ottclAAAInklEQVR4nO1b+V9UVRz9uuuIiAEyXlBBZFEoQjBLIFELFRSXSVLcyr2UiixNtDJUzJXUTDEzyywtQ8x9K6ysbLWy0mzf/4zunTfvfr935r7RmBmBPu/88Ob65r7zPd97D/Pe4AHAhg0bNv73aNGyVaAUrdu0DYYSG80c7dp34EdHxzB+7BSun9M5wi9Flxsio4Kuy0YjILprABfHOLuJFweL5ce4hlkJusf1CECCjSaDgKzUlvUULw4WwT+W4htoJUjoFYAEG42BxLjeSckpqXzUp29a+o038UEGc4OPet3MD5msH52Xld3/luQBt4prbxuYk5t3uzfjIJYvXhyDWX+AlHDCMoQNTbvjzoJhw4WVRhQWZY8EWpdoAYi4IfS92wgqEtmo4iGxMQCjM8bEji1M4qfGue4a73K5QLWSOS+r5O4JsR0nlgJETZo8aErE1GlejP3ZPeLFce/0GQAzVSvNmj0zYk7XudxKbHLqfTkDgNbFGhz3z7tOC2AjWEhk841B2QMx4ub0oBibNzjFSp55WSUPAZSzhwEWsEcA7hk4zovx0ZSF4sWx6DG2GCpUKy2BpY/DE0u5lZ7kXpzAOih1ZQ2OdstC1rKN0CCRdTcGtzxVWVnZvcj9tKu1kmdelnjKWc5W8M+TgpVVq7z5Sl1Tn3YPHL0gaRk4va3kWA3hGZ5npVJnD6WurMFR5eyxJjQd2wgRElmlMcgxnpDWirHWSp55biutc389W7+hOn5yB5XvGTbAmOjYCJtYOfNnJdj8rFJX1hAoZld7MrfRtCC3b8tzmQJLxNi00lZ+K/JjJYBtHbJrtit8S8YWPO8eOHYAvDBXWEmyeFtpp/NFpS61Utv4Mu87p42mDbl9Gx27+LGLe7zoJeNccaeXAXZbWemVPdv4szdr7cX4aor7rud4DWAvE1aSLNRKGTsBprBNSl1qpemB/D7CRmNAbt/o3Ih95WXxt4nxPvb68DeiAB6ZuWHI/kIrK/WsaZW6+M3a9V6MVcz9OeXYyg8HhJUkC7WSs+7g/PS31LrUSoMPhbRtG8EHbt/6vM1ph4+4h2GzcuKOis1dkdDp/m6WN7hjL0yqPrDXm3Ex6y1e3FZyCStJFmql48UlRdkn1LrUSh03hKRdG80JPdnJwElORZ4OnMRGM0dY+2V9AuXYdcb5djC02GjeyBx2PFCKd1L2B0OJjeaOUycCZZhWHwQZNmzYsNHsENbYAmz8P3D2rZoiO8tyXfAu86DS+G1SqFD2XqOwrCl4/2C/VP17Sr/+mYOjPhC+a7oipDt4VcS4XK7cDfwQFloh59b5efOaE51+WXT4gPleYVZT+vXPHBT1ZN5/7uParmjIDgaUpvVBxukGCwkOgtsOxYfx1tWC1W8DrBQiNCErLXgvuetZMcQALeKj87WjFtWLeXUf5ybnfaKMSND22Kc1JZ/t4oN2T0YBtK0YYdxFC8UsEtdFPgwHa+vKSLBkgWjjikyLK6SCCGOeS2lWVsN+kVkXQMZ3dUFlol6uAQnu5A9Mi/w8RplHqkmlhFkDrQKErEF2UK4u2Rk8p1GlDU3r49h+YFop/e4VseOXVioBWokpFauPvJFQJ+ax7C96FK1URhi03V5Ut+BC+nR+qkVJNtSP+vIr9100y2MlGddFPgwH6+piJFiyQD6ffjCy48v6K1DB16574/hUJbuH1bBfZNYFkPFdXVAZ+XAN0Er1BRdPfnN0Tymdh3yoFJl10ClAYA3sCFcXVeE5nSpdaNoiju0HppW+PQfQjw1Xg7smlvPPgNJ9rJ7P27IT4Dt2Kx1h0LZv+0sAcwQLpLL9rdKXGKcve6wk47rIhx+yurpKJPhyoTz/fVq+xRVEAYR38m1X3uBkv8hsEUC+bG6kLqgsbxFyDdBKZzbzfdgu/phCuZV4+FApMlvARwECa2BHZHWlKjynU6ULTVushh/QZ6WR7Ioa3JXY3TWNfxTyp7+s8/xf59gFOsKgba2brOAHcdxYIdjIUpDcAPJhO7q6SiQYrZTIulldQRX4tZLsF5m1AWTcSG1QmVjJswZopbl9xb9/3KXMk3yoFJkt4KMAgTVIR7i6GIGW53SqdKFpi9XwA2qlGPaBGtw1sdg5L3XcT9JKEFdMRzI80p0lipc9ncXxxMzx6lIQKyEftqOrq0SCpZUy47ZaXaEouKqV3P0SZl0AWd1In6AysZInQINWunmHb13JR5QquVUdfBVIYA3siKyuVIXndKq0oWn9aviBj5VocNfEwJ9B5CTxU2ksHWH5ZOMnbZY4HiqM/0VZCmIl5MN2dHWBRoLNDT838eJOyyuogv9sJV0AWb+Rcp6vlTDkbPz8q3WRD5UGYiWsgR2R1ZWq8JxOlUVoWrcafuBjJRrcNZF0Fz+Eu63Unj9Jj2Vf0xGWzzPu/0P48CNn+a+1t9OlIFZCPgwH6+oqkWDPgoZlp6+zvoIo0FrJrKazkkUA2Wcj6TyTD9cAQ85nqvkN4rfqKmWe5EOlgVgJa2BHZHWlKjynU6ULTSursepabnU+VqLBXRP7nR/OKasQ6cks9nv5H7UHgI6w/J81SXPuyxHfE9ZFboVLF2ecMr6B5Lhc+dRKyIfhYF1djARLFviJreVfO1y/6a9ABXormdWwX2TWBZDxXX1Q2eTDNcCQc1TuskFXxkRU0nnIh0qpRX6gf5RjqQCBNbAjsrpSFZ7TqdKFpmmXCydVe/3ORQcfK9HgromwX6cWtZztEH8GPnjopKK80UBH5ENx7/s1BRu5g7cNaMN/NvNrLsv/nYmmVkI+Eg7W1MVIsGSBw8Yo3OIKUwHorWRWw36RWRdAxnf1QWWpHtcAQ859WtZ++9doZR6pJpVSi/ztvOSlWKsAIWtgR2R1pSpyTqNKG5omXZYefWmh71oGCONhWx3ZCB6iExpbwXWDbaWQYlraP40t4brBtlJIcSm2ySas/gU1E9Lef6o7TwAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.590,1.0;4.sync,10.6492311796;4.copy,1.1,1.0,3.608,3.960,2.57,2.14,1.1,1.0,1.0;4.rect,1.1,1.0,2.60,2.49,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.58,3.767,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.117,3.316,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.98,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.117,2.40,3.164;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.120,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.118,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.120,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.158,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.450,3.173,3.148,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.155,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.156,2.28,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.177,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.174,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.174,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.174,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.174,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.174,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.213,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.212,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.212,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.269,3.268,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.272,1.9,2.85;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.269,2.58,2.91;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.267,2.48,2.93;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.307,2.19,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.309,2.18,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.554,2.28,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.405,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.405,1.8,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.403,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.403,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.403,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.405,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.423,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.439,2.57,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.437,2.25,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.481,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.535,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.538,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.535,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.557,1.9,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.533,3.368,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.538,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.536,2.79,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.535,3.168,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.557,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.554,3.348,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.576,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.595,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.576,1.9,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.573,2.29,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.592,2.88,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.593,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.590,2.38,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.592,3.419,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.633,1.8,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.649,2.96,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.649,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.647,3.438,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,2.60;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,1208.FhaXDPRam3lLftYmr5YVhSIzZS8x3rDfdPRB+bFcpLJ3Gzr3q+zdicJN2TvYC2tf5raT42wquyT7P+pRq6ue0yV9ufXCUjaNs0rZjhEiZc9OH7ZCnWi84+oWI++XEPccaGG8YTMHmR8/2Lm7zClAy1LjXW7oEP2qUP2IcWZGcFdZ61p9ow9q27JlTNlzPXPbQjOedRYcvW3wzDLeG6jn0u/w+3xts436BXGN9jZvURSK7FS26LPO0Qflx3KRyv5Lkj4t+cifsu8paGPcIargmRIqZXO3nT3OdTn655lzjD5Uo6Z/gszo++5YTxRL2TTOKmU7xo+U/cTp9JNe5BYj75cQ/27h+axBDjI/frC2mnmVvG7RxvGFPxr3s585PqXw41JjxMlVtmbiic6XzcurYsuYsj/JWrfzWJlxN4C8aby3jLRa8/ZV4a6bl3Zunj6br70za2inj5qn9OctikKRvZQ93rgLT1EoP9qDlL0vd9acD9fa90Y8kSle76xZc47leJRtZ0qQsmlf7razx7kue/Pw9iP1tyPlqBl3/b4ozvcEspRN46xSNh0b9/uJa59viETiFekWY94vsXCa+a9F7iBT+8E+8pwhMen7gpRBg43WjMPVfcYbI85cZXcNSdn6khFFLmPKFp/elFXwjnG1Y9401ltNx0MZZmP5EwW143o4c1n++7Ta9z91tFgUGdlL2ZlL/uaIIvOjPZjLeVtqesIW+362JzLFExemls970nNFtzMtqTLJ5Mqmfbnbzh7nurOPJOXmfyvUo2b+p2a+8QlD0H9q5DirlE3Hxv1+ImGKqxROBy79xjTzBnYj3KndHvFkGjfmn2T2fXzRGI+a5gfe2R7n6LA+ud7/v2xirHj2+EOeVkBl9xt1wv8PFJ8O9Cj9cvbnI50/ZbvM/PhWOTXQvjTOUWFm6+yGf/OtafCH0jesVmAHWeU3Z0c4m0bOlmur3/sq+O/ecWico8JPdn0cze7invXfxjoDEBytAr6JAAAAAACAcNAsIfA2AMQfCc1inQEA4YK5xc5ogV8FBk0G5hY76zS/EQ2aDg63WLuk9gE2ByBOcLjFOqVkxDYbAMIGd4td1FR9zOB0hNxirbK6xTYVAMIHc4udn9MzxskAEDaYW6zXpQG2BSAe6X3af1UXNE2u7BPrDACIBH2vinUGACj5/+0LFkIcs2FdAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.4,1.3,1.2,3.596,1.0;4.sync,10.6492311843;4.copy,1.1,1.0,3.133,3.960,3.532,2.14,1.1,1.0,1.0;4.rect,1.1,2.42,3.554,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.576,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.576,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.576,1.8,2.68;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.573,3.246,2.73;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.594,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.611,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.612,1.8,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.630,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.630,3.126,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.630,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.611,2.29,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.614,2.19,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.614,2.69,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.632,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.535;4.blob,1.1,1708.iVBORw0KGgoAAAANSUhEUgAAALEAAAAPCAMAAACcN97yAAACIlBMVEUAAABoaGj////o6OikpKTQ0NCLi4vT09OsrKzIyMgYGBg8PDwREREgICCIiIgODg4SEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7f19fX7+/tLS0vk5OSYmJg0NDRAQECxsbFPT0/W1tbFxcUxMTEeHh6qqqrz8/Pu7u6enp4QEBBISEgzMzMtLS20tLTt7e3q6uqtra0mJiYLCwvs7Ozv7++np6c2NjY4ODhVVVX9/f2AgIBDQ0NcXFzY2Ni4uLh6enpERERUVFQ1NTW/v7/V1dXp6enGxsZRUVHU1NTf398HBwcVFRXS0tJjY2MFBQUICAgCAgJSUlLh4eEUFBS6urpMTEzi4uIPDw/X19fb29skJCSPj48iIiJdXV1eXl4NDQ1FRUU9PT3y8vJCQkIyMjLn5+dBQUEqKiolJSUBAQF/f390dHRQUFAJCQmurq729vZqamohISEaGhpWVlbr6+u9vb1NTU1+fn7a2tr6+voWFhZKSkr+/v6mpqZzc3OHh4dYWFihoaE5OTmvr6/Nzc2UlJTe3t6rq6scHBwDAwP39/cnJyeWlpZ8fHwKCgqXl5fg4OAMDAwbGxt3d3fR0dFhYWEEBARpaWl5eXlHR0f8/PwoKCgvLy+wsLCMjIwGBgaJiYl9fX22trZaWlqNjY3Ozs5XV1fw8PDAwMA3Nze5ubm7u7s6OjqQkJBubm65ZyAHAAACmElEQVRIiWNgoB1gZGJiYiZJBwsrEoeNnWIXcHCSpp6Lm5uFOBfDTEZxMQ8vadbhMZcEwEeBi7EBfn4GBgFBIRBTWARIiIqJS0hKgbjSMrJy8gqKyIqVmMAAyFIWBhIqTKpAG9TUNeQ1tRiQWQzaOrp6+gYkuBhhMgurIbs8pxEDSooyNjE1M7cAMy2trIEG24D8Z8tkx8Bg7+Do5OziCnYxk4SbuwcXsrme3F7e3NzcqC728fXz8A8IRGYFKQV7hDDL4XBxaBgYhGM3mUXPN8LDOzIMOUVFWUXH2LPGxoHYgfEJlgwM7kyJDAxJ3kB+sgpQLIVJCuziVMywgMUdsovTGBjSmTKQWWyZQI9mMWVjdzELJDw9sJvMksPDwKDKlIus15Apj4Eh38QTobogoJAhXKIIxCzm1AWaxgt2cQlRLgalu2SmCGSWRikwDEvKyrG7uEIFDHhwuBhkSiVTFbLeoOqaWn5U5XX1DLkNjUBGU3OLomcr1MVhRLuYFxRiCJYpJBTbsLsYW6pAczEXUzuK3sQO64boTmTl2g62Il0ghkk3kCgm7OKeSHwu7u0Dh2I/dhcTSBXYXMzAMKFTbeIkZPWuk01rQbScF5CYgtvFkgkQ2k1wKshnOFw8bfoMIHMmA3YXY08VMJOxuXjW7AnA7Mc0B1m9vWDOXBA9r3n+AjYHJllcLk5hKsx1jmJgyFvY4T6PGZeLg8xYU9LZGowh+d2Um3sRpkm4TEa4GKF38cQlik1d4olghUsh7lpWvRzMLVgRW7Zy1XRFXC4uWG0qEw90CUOEi+CatbhczJBovk53vRMDpEwFAg7CLoaZjHAxkt4NG62sN22GKNzSPJewaYMKcLgMtAtIBHG6WwfaCSSCuR4FDABL0IkJE39o2gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.571;4.blob,1.1,2656.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.592;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAKcAAAAjCAMAAADG6eoQAAACAVBMVEUAAAB3d3fU1NTIyMj////w8PC8vLxJSUmkpKTQ0NCLi4vT09PCwsI8PDxOTk6hoaH+/v50dHSsrKwREREgICAyMjL9/f0bGxuwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpI3NzfBwcH39/fp6emTk5MMDAyxsbFPT0/W1tb19fXFxcUxMTHk5ORISEgzMzNoaGjo6OhERETS0tL5+flgYGAEBAReXl60tLTJycknJyf29va4uLhiYmLu7u61tbXGxsZRUVFUVFTf398HBwc1NTW/v7/V1dVSUlLh4eEICAgYGBgiIiL4+PjAwMDm5uZLS0v09PQLCwuVlZXc3Nyqqqra2tpHR0dBQUENDQ1FRUU9PT3n5+dAQECIiIjs7OxNTU2pqamjo6OEhISMjIwaGhpWVlalpaU4ODgPDw8JCQlsbGzR0dGgoKBYWFji4uJkZGQCAgKNjY2KioqDg4Otra2ZmZnb29tMTEwhISEpKSm3t7dfX1/t7e1dXV1/f39cXFwUFBQoKCi9vb3Ozs7x8fFKSko6OjrExMSXl5cODg4BAQHX19ctLS1DQ0N2dnZwcHAXFxdubm5CQkJvb2/Pz8/d3d2FhYVhYWHZ2dlqamrY2NiYmJjv7+8QEBCmpqaysrLHx8cSEhJ6enr6+voFBQWGhobz8/NnZ2f7+/tpaWkTExOgdF/cAAACtElEQVRYhe2X+VsSQRyHR3ZSFDcJLTORCrSkIBCkKAUjTfOoxErTyrMUuq00S0pLOtAuyQ7tvo+/sl3WhR2Gth0ec/qh94flA9/9zrzA7Dy7ABCQocJTDAbCFZlZJEMlUGdL3uRo0hsERZWBpxhMLrsyT7uKaDAdI7winvkFacslWL2mEEsCzFruULSumGS0lJ5Lgj4TTwIxzxLDeu64YaPRVFqGVNWbNpebt2wF0qoFxoh5WjVmZhuXbNwH9uSOCofTUQlZAk2XaTuWpJ5ghxuAnbuqrNUeL+ppqtntU+2plVbr2L31LMtPr/bUNPjq9zUC0MSyantSR3PL/qzKA0SeB1v9WEI82w4BcPiIC4B22IF6HgWgE3ah1fj/fiwfgOOLHSfsSR1t3SUA9BB59vbhCfNs7eeTYQDx5FdgM2xAq8j6PAlPIZ7xDvcgl4ZIPAPGTiyhnl43CMLTfDpzFvMsgD60ing2wXOYJ98BzutJPS9YLmIJ8XTZuevILPxiwyk9kaoyT7ea1DP3Ep4Qz8v8vnRFWIEVqT2l1ZFRJZ6lhiAAVwk8x7TFWEp4cvt8L+T3+WvG6+3joSqkmphVWr0Bb3ZMTEo9+es9xLK3pB1jxtvWcQuBZ9EUnhKeEIYz78Ti3XtGw/3Ibzyl1enhkHPmgdTTJuypOqTjocbpeASHFHuWP8bTcsB/KZv2yXJOmQ5d9tnoU88IbY0/Uz3X8ux5I22L/9DixcsobQVFFPaFJ2k7KCLonKetoIyFV2KKROTOo022eDfp7379hqqJPFNvF0PtzKhf9ky6vHtP20AZPdr5D7QdFPERLvkj9N8g+imnjraDErwMbQNlzA2KaQD+yzdQqjwx6bUumiLyfA73i1G3QFNEnrIv8cfHwNdZqiqyfPv+Q4wu3zRNE3kCP2kbKOIXIfeDzuV5MFIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.647;4.blob,1.1,3140.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;3.end,1.1;4.move,1.4,1.3,1.2,3.603,1.0;4.sync,10.6492311862;4.copy,1.1,1.0,3.171,3.960,3.494,2.14,1.1,1.0,1.0;4.rect,1.1,2.51,3.497,2.29,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.500,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.496,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.496,3.357,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.516,2.37,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.538,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.535,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.538,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.573,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.576,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.576,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.573,2.78,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.571,3.117,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.592,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.592,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.592,2.68,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.610,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.497;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAKcAAAAjCAMAAADG6eoQAAACAVBMVEUAAAB3d3fU1NTIyMj////w8PC8vLxJSUmkpKTQ0NCLi4vT09PCwsI8PDxOTk6hoaH+/v50dHSsrKwREREgICAyMjL9/f0bGxuwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpI3NzfBwcH39/fp6emTk5MMDAyxsbFPT0/W1tb19fXFxcUxMTHk5ORISEgzMzNoaGjo6OhERETS0tL5+flgYGAEBAReXl60tLTJycknJyf29va4uLhiYmLu7u61tbXGxsZRUVFUVFTf398HBwc1NTW/v7/V1dVSUlLh4eEICAgYGBgiIiL4+PjAwMDm5uZLS0v09PQLCwuVlZXc3Nyqqqra2tpHR0dBQUENDQ1FRUU9PT3n5+dAQECIiIjs7OxNTU2pqamjo6OEhISMjIwaGhpWVlalpaU4ODgPDw8JCQlsbGzR0dGgoKBYWFji4uJkZGQCAgKNjY2KioqDg4Otra2ZmZnb29tMTEwhISEpKSm3t7dfX1/t7e1dXV1/f39cXFwUFBQoKCi9vb3Ozs7x8fFKSko6OjrExMSXl5cODg4BAQHX19ctLS1DQ0N2dnZwcHAXFxdubm5CQkJvb2/Pz8/d3d2FhYVhYWHZ2dlqamrY2NiYmJjv7+8QEBCmpqaysrLHx8cSEhJ6enr6+voFBQWGhobz8/NnZ2f7+/tpaWkTExOgdF/cAAACtElEQVRYhe2X+VsSQRyHR3ZSFDcJLTORCrSkIBCkKAUjTfOoxErTyrMUuq00S0pLOtAuyQ7tvo+/sl3WhR2Gth0ec/qh94flA9/9zrzA7Dy7ABCQocJTDAbCFZlZJEMlUGdL3uRo0hsERZWBpxhMLrsyT7uKaDAdI7winvkFacslWL2mEEsCzFruULSumGS0lJ5Lgj4TTwIxzxLDeu64YaPRVFqGVNWbNpebt2wF0qoFxoh5WjVmZhuXbNwH9uSOCofTUQlZAk2XaTuWpJ5ghxuAnbuqrNUeL+ppqtntU+2plVbr2L31LMtPr/bUNPjq9zUC0MSyantSR3PL/qzKA0SeB1v9WEI82w4BcPiIC4B22IF6HgWgE3ah1fj/fiwfgOOLHSfsSR1t3SUA9BB59vbhCfNs7eeTYQDx5FdgM2xAq8j6PAlPIZ7xDvcgl4ZIPAPGTiyhnl43CMLTfDpzFvMsgD60ing2wXOYJ98BzutJPS9YLmIJ8XTZuevILPxiwyk9kaoyT7ea1DP3Ep4Qz8v8vnRFWIEVqT2l1ZFRJZ6lhiAAVwk8x7TFWEp4cvt8L+T3+WvG6+3joSqkmphVWr0Bb3ZMTEo9+es9xLK3pB1jxtvWcQuBZ9EUnhKeEIYz78Ti3XtGw/3Ibzyl1enhkHPmgdTTJuypOqTjocbpeASHFHuWP8bTcsB/KZv2yXJOmQ5d9tnoU88IbY0/Uz3X8ux5I22L/9DixcsobQVFFPaFJ2k7KCLonKetoIyFV2KKROTOo022eDfp7379hqqJPFNvF0PtzKhf9ky6vHtP20AZPdr5D7QdFPERLvkj9N8g+imnjraDErwMbQNlzA2KaQD+yzdQqjwx6bUumiLyfA73i1G3QFNEnrIv8cfHwNdZqiqyfPv+Q4wu3zRNE3kCP2kbKOIXIfeDzuV5MFIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.552;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.571;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAKcAAAAlCAMAAAAQsAkNAAACAVBMVEUAAAB3d3fU1NTIyMj////w8PC8vLxJSUmkpKTQ0NCLi4vT09PCwsI8PDxOTk6hoaH+/v50dHSsrKwREREgICAyMjL9/f0bGxuwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpI3NzfBwcH39/fp6emTk5MMDAyxsbFPT0/W1tb19fXFxcUxMTHk5ORISEgzMzNoaGjo6OhERETS0tL5+flgYGAEBAReXl60tLTJycknJyf29va4uLhiYmLu7u61tbXGxsZRUVFUVFTf398HBwc1NTW/v7/V1dVSUlLh4eEICAgYGBgiIiL4+PjAwMDm5uZLS0v09PQLCwuVlZXc3Nyqqqra2tpHR0dBQUENDQ1FRUU9PT3n5+dAQECIiIjs7OxNTU2pqamjo6OEhISMjIwaGhpWVlalpaU4ODgPDw8JCQlsbGzR0dGgoKBYWFji4uJkZGQCAgKNjY2KioqDg4Otra2ZmZnb29tMTEwhISEpKSm3t7dfX1/t7e1dXV1/f39cXFwUFBQoKCi9vb3Ozs7x8fFKSko6OjrExMSXl5cODg4BAQHX19ctLS1DQ0N2dnZwcHAXFxdubm5CQkJvb2/Pz8/d3d2FhYVhYWHZ2dlqamrY2NiYmJjv7+8QEBCmpqaysrLHx8cSEhJ6enr6+voFBQWGhobz8/NnZ2f7+/tpaWkTExOgdF/cAAACtElEQVRYhe2X+VsSQRyHR3ZCFDcJLTORDLSkIBCkKAUjTfOoxErTyrMUuq00SypLytAuyQ7tvo+/sj1c2GFo2+Uxpx98f1g+8N3vzAvMzrMLwArEyFDhiYOCcJU6M71BNVmiN9na9AZBUWXgiYPKoVfn6tYoGkxP8a+IZ15+2nIJ1q4rwBIPtZ45FG4oUjJaSs8lwaDGEw/nWWzcyBxLNpnMpWVIVbN5S7ll6zYgrlohB+dp01qo7UyyMx84kjsqnC5nJaQVaLrNO7Ak9gQ7PQDs2l1lq/b6UE9zzR6/am+tuFpH76unaXZ6jbemwV+/vxGAJprWOJI6mlsOZFYeVOR5qDWAJcSz7TAAR466AWiHHajnMQA6YRdajf/vx/MAOLHYcdKR1NHWXQxAjyLP3j48YZ6t/WwyDiCe7Apshg1oFVmfp+BpxDPe4Rlk0pASz6CpE0uop88DQvAMm86ewzzzoR+tIp5N8DzmyXaACwalnhetl7CEeLodzHVk4X+x4ZSeSFWep0ej1DPnMp4QzyvsvnSVX4EVqT3F1ZFROZ6lxhAA1xR4jumKsJTwZPb5Xsju89dNN9rHw1VINTGruHoT3uq4PSH2ZK/3ME3fEXeMme7axq0KPAsn8ZTwhDCivsfF+1Mm44PoHzzF1enhsGvmodjTzu+peqTjkdblfAyHZHuWP8HTcsB+Kbvu6XJOmQ5djtnYM+8IaY2/Uz3X8vxFI2mLFUjx8lWMtIIsCvoiE6QdZBFyzZNWkMfCayFFo1LnkSZLuJsMdL95S9REmsl3i6F2ZjQgeSZZ3n8gbSCPHt38R9IOsvgEl/wR+l8Q+5xdR9pBDj6KtIE85gaFNAD/5xsoVa6QDDo3SRFpvkT6hahfICkiTdnX+ONj8NssURVJvv/4KUS3f5qkiTTBX6QNZPEbI0eDznJ/pk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.630;4.blob,1.1,3728.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;3.end,1.1;4.move,1.4,1.3,1.2,3.606,1.0;4.sync,10.6492311887;4.copy,1.1,1.0,2.76,3.960,3.589,2.14,1.1,1.0,1.0;4.rect,1.1,2.42,3.591,1.6,2.52;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.632,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.659,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.649,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.652,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.649,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.650,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.649,3.118,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.649,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.652,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.647,2.28,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.652,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.652,2.28,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.647,2.38,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.649,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.649,2.28,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.650,2.18,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.649,2.68,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,3.590;4.blob,1.1,4900.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.628;4.blob,1.1,1932.iVBORw0KGgoAAAANSUhEUgAAAOIAAAAOCAMAAAAFSDAcAAACN1BMVEUAAAABAQEzMzPDw8P39/f29vajo6MSEhLr6+vExMRJSUlAQEBLS0uLi4vT09OkpKTQ0NBYWFj///8gICCsrKzIyMgRERF5eXn6+vo8PDyYmJjc3Nw0NDSxsbFPT0/W1tb19fXFxcUxMTEoKCi0tLTz8/Px8fGioqIYGBjk5ORoaGjo6Og3NzfBwcHp6emTk5MMDAxISEhbW1vMzMz09PTl5eWZmZkTExMtLS3t7e3q6uqtra0mJiYeHh6qqqru7u6enp4QEBAwMDCampr5+fkODg7GxsZRUVFUVFTU1NTf398HBwfKyspOTk5ZWVnX19fR0dE1NTW/v7/V1dUnJye4uLhiYmK1tbVSUlLh4eEICAhVVVX9/f2AgIBDQ0NcXFzY2NgUFBTs7Oy6urpMTEzi4uIPDw8VFRXS0tJjY2O3t7d8fHz4+PgNDQ1FRUU9PT2Ghobw8PCIiIja2toEBARHR0dBQUHn5+ciIiJdXV0qKiolJSXy8vJCQkIyMjLCwsIfHx+EhISMjIwaGhpWVlZQUFC9vb1NTU2urq4JCQlqamqWlpZsbGygoKBKSkr+/v6mpqZzc3MkJCShoaHv7+85OTmHh4eUlJSNjY3Nzc0DAwPe3t6rq6scHBx6enoKCgodHR3b29tERER3d3dhYWGXl5fg4OAbGxv8/PxpaWnHx8d/f38pKSlfX18rKysvLy+wsLCvr68LCwvOzs5XV1e2trabm5s6Ojp9fX1aWlq5ubm7u7vAwMCdbrXTAAADK0lEQVRIidVW+z9TYRz+TlMTY17Xk2vZikiUMELKpFTuxchdJInKtXuRdKGYkq4UpXtKuv1xva+jfd+zndn2+eiHnh/O+e483+f7Ps/OOe8GwKCA/wUKmcoBuKxSuq5ecTP/AujUOc9rVG5r3T2cWkrt6UCTl8apmQ4AnTrp2Zv4ONTn62cu/R1RrHxEdLq8Z86piIBAxxawEtrBykdEp8t7tnCqIYsQANYF0Y/BxJ2aCwkNC1+/gdERWt3GTZG0iBL7aLWZnqJFccwWZezWOJAozPDSxHuG+7mwctv2hB2JSaxK1upTUndK+1BrnschLV2XsStT4hQrZOWcLmG3sCdLEASDJGJs9t6cfftzAZJUBw4eysunVYFQWET7aEukIHiJEYtdS+IPZxwBXsFZz8guzSkqMwKUVxytrKouoddqauvqyzUNxyR9Zi3OQzRGNeUcj26WOMUKWTmnZpxoEc98xJMAreQUQFs7dVNMQhnP3f7TYsT0M2cBOkgnr+Csd/kDuDO2Oxggt4fQ2xhPegHOaQukEf9qcR5CfZ7emQvkIu8UK2RtOLUZkb1F3aQU4FI6Yy7HyUdMuMKOqqu8grPOrl0jffTY76ejjw7dIRpV1wcMFuujFuchwm4YjcZB15vyEZG14XTZiD4kByDoFvZZRRwkt9kp/w6vsLAeSbwBhobvehTcW9wER0ZNgXVj1hGZlpuH0Itv1n35iMjacCptf1BmHVH8bmxEhHDxWx+3F1H7kFb9S/v8xFiIslg2IjcP8ehxMMMT+YjI2nAqbX/a8owZkURsM9HH6rlpgPGJk5YRU8V3Z8pexOZCtgyL+CJ/gu455KV8RJyHmJ5hz94riVOskLXh1GDg23tfj07NRksj1qS8qe9r0hgZ30PedlbViDuqXhAiAN4pmzve60vAXsTZ4YAOdQX5APBR+clj6HPCiHxEnIdoTNH0tKoDk+UjIivnFGCu1pTJC0urW758lUaEtPmErm+Ni7RiXJ+Vlyz+LlL40ksLbkrVtMFuRMX3Btf5HzPsD1fMz1rTrwWw6hO15nkcRlLbdb8rJcG4ClkZp3Qfz5uc+wPZTOwYHqFjawAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.4,1.3,1.2,3.608,1.0;4.sync,10.6492311906;4.copy,1.1,1.0,2.38,3.960,3.627,2.14,1.1,1.0,1.0;4.rect,1.1,3.130,3.633,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.639,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.628;4.blob,1.1,3920.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;3.end,1.1;4.move,1.4,1.3,1.2,3.609,1.0;4.sync,10.6492311921;4.copy,1.1,1.0,2.38,3.960,3.627,2.14,1.1,1.0,1.0;4.rect,1.1,2.70,3.629,3.219,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.649,3.217,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,3.646;4.blob,1.1,2456.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;3.end,1.1;4.move,1.4,1.3,1.2,3.610,1.0;4.sync,10.6492311935;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;4.rect,1.1,2.70,3.649,2.39,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.648,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.110,3.646;4.blob,1.1,3332.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;3.end,1.1;4.sync,10.6492311950;4.move,1.4,1.3,1.2,3.611,1.0;4.sync,10.6492311960;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;4.rect,1.1,3.110,3.649,3.567,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.62,3.649;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492311972;4.move,1.4,1.3,1.2,3.612,1.0;4.sync,10.6492311983;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;3.img,1.1,2.14,1.1,9.image/png,2.41,3.647;4.blob,1.1,3396.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;3.end,1.1;4.sync,10.6492311998;4.sync,10.6492312009;4.move,1.4,1.3,1.2,3.613,1.0;4.sync,10.6492312020;4.copy,1.1,1.0,2.38,3.960,3.627,2.14,1.1,1.0,1.0;4.rect,1.1,2.41,3.630,2.38,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.652,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.652,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.647,3.257,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.628;4.blob,1.1,3136.iVBORw0KGgoAAAANSUhEUgAAAYQAAAAlCAMAAAB1VG4eAAACnVBMVEUAAAABAQEkJCQYGBgLCwszMzPDw8P39/f29vajo6N1dXXFxcVUVFTPz88PDw+Li4vT09MSEhLr6+vExMRJSUlAQEBLS0tERETu7u4hISFoaGj////o6OiioqKvr68REREgICBYWFgDAwPa2tpwcHCsrKzIyMg8PDykpKQVFRX19fV5eXn6+vpSUlIMDAyIiIicnJy9vb3Q0NCrq6uwsLDk5OSYmJjc3Nw0NDSxsbFPT0/W1tYxMTEeHh6qqqrz8/Oenp4QEBA3NzfBwcHp6emTk5MtLS20tLTt7e3q6uqtra0mJiZsbGz5+fkrKyu3t7f7+/soKCjx8fFISEgXFxcwMDCampoODg52dnY1NTW/v7/V1dXGxsZRUVHU1NTf398HBwfS0tJjY2MnJye4uLhiYmK1tbUUFBTs7Oy6urpMTExVVVXi4uLl5eV6enoTExPKyspOTk5ZWVnX19fR0dFWVlZ8fHz4+PgNDQ1FRUU9PT3y8vJCQkIyMjIEBARHR0dBQUEqKiolJSVeXl6Ghobw8PB/f38iIiKurq4ICAgJCQlqamr09PSEhISMjIxNTU3CwsIfHx+VlZUuLi4+Pj6Hh4egoKChoaHv7+85OTmWlpadnZ0cHByUlJTh4eHe3t6NjY0GBgZlZWWZmZnb29sKCgpQUFCXl5fg4OAbGxt3d3dhYWEdHR1dXV1cXFz8/PxpaWkpKSlfX18vLy9KSkrHx8csLCx+fn7Y2NjOzs5XV1fAwMBDQ0M6Ojq5ubm7u7u2trbn5+ebm5tvb2/m5uYCAgIaGhrMzMx9fX3Nzc2FhYU4ODiKiopbW1tgYGBGRkb9/f2AgIDJycmlpaX+/v6mpqZzc3OQkJCSkpKoqKhmZmaDg4NaWlpubm7d3d0RktGLAAAGTElEQVRoge1a+0MUVRQ+ArWbotCqgFxUwnABAQM131KG8oiVjAwhNRAIVIQKlDASNB+hpEkPsCx8oj0kNSpKSEvMV5kRZS/7W7qzszP33J3dZfYBo6PfD7vXOfd+55z77dxd5hOAxzBQws/BtTsX/gFaVzAA7rvfYHzA/uLwEVqUMmgIHDlK6xIcISjYNnjQNHrM2BC7aGjYOM9owwkhEW5W4CO45Bs/wbfJfIOJkbbBQyRSEYya9LBtFD3ZPVp/szlGpQhyBY6gNi+a55IvNm6MOkJtMCVeeS0hLtE2clcEiqkqRXAJD0RwjUeSPK5lkMAOjWRihZmPT5suvs8Qo3T06Ez6MouMBYiZPWdu3Ih5gEcwf0FK2GOPi4uUIix8wpC6KJFbwSpALIvT0jMyn+TyQpZlSXbcUyG4AlialvL0eH9uHjoGHWSjyCHPeL1tvgU7NJaZn7WYzeZcPp6xXHzPM+c/R6PAiZC6YmXgqucL8Ch2RmHg6ohscZFChCJjcU5J2AuAV7AK2LXSsjVr1yWXj8J5IYusrwgN9McVVJpefOnlquoCPI/xOcpGkUs2+GjzfAh5qzbWKGKVJEEaSrc7FuEVgFqyCY+CXqW7VEde45klLJi0GaCeNOAVbB67lkO2AGxNy8N5qQiv21ewbTvVqYjM4ebJfE6yQcQON3doCOBKhCJSJw0diJBMRzsFmdho7huNjY27jLt5ZglNbwqvpj14BZvHrsWakvZKtyQSYZd9BW8tEP69L5GbJ/M5yQZVzSp2ZYjhSoS3yTvS0IkIkSQQj9LFs/ldntmGXSRLeKt+D68AXgTxml9La/ya/VxeKkKjfQUz32fkChGcZYPgDwbelKGGKxEOEPn3nNTkhx+BCxHaps0ScIBnlhAnfjYPDigC/W28f7ahCOdlIrAKxDuBr4/xOckGbVNd7ocmcCXCofjD0vDIUfG9ouYYQLszEY6fEM6Gj+2YIVc8XDLFUzp0IBE+qY6i387kU5yXicAq2NZKeT9r3cvNk/mcZIuyZLm9R4ML4bdEutm8VBg7EAFWyOfnSbKjoaMUYMvnLaGnIpyJEJuRfLI2KH4xzxxQ1mr91XrakF1/Jr0Y8Ao2j137wjA9pHNCkx/Oy0RgFZRmfLl2Q2FyI57H+Bxlo/iKzBuEjfQG4eIZHi2MHYnwtfz5GnYw3VJFNxcSumq++daZCOCXuT3lbLcdc0HVUfG5Wc9og+m4cFewFWweYln4XVnruR4+rywCqwDmn2/6/odYbh7K6yAbxYXeiz7bvqHBj/E9Wpfga1y6rHUFbuNgvqPH23cw2tfnDjzpNkPAlatal+BTnO6t1boED1BaoXUFPkWd/bP6e7iHuxbaGra3vcE6JNDYsB1Kg/V2tTc9MmyvkWseV6OAFwarXuxNZti6AZ+K4IXBqhd7kxm2bsCnIiCDNdetv1n0Y29Khi2KFv+UEZdp9TxlPhaFumpL8HCrCLg3JX6+1LT+SCVXKYQWWgqvWy1juSNABqv0TE0l9GNvSoYtipLZv+w2Cp9OxseiO2vOjrleJojA9abAuhu/dnd0FXOVWtf2CiKwjgAZrPIzNbXQib0pG7Yo2nYI4LDwbJXxsWiz6RjASkEErjcFds6im3qSVOJKm8vo2r2CCLgjLwxWndibsmGLopfoYCIpwXws2tcCtu8Erjcl2ien0JMwElfa95t1rZnvyAuDVSf2pmTY4qggAlgqEB+KllMhRBG43hTo7P89JO8Pmwi2Sstvgk0E3JEXBqtO7E3ZsEVR8U5YjflYtI8KIYrA9aZA2hUQ/L5IXGlfDEgioI68MFh1Ym/Khi2KTroIsJosw3ws+mcqPVs6BRG43hTIzqcvG3kRFpno2rWCCLgjLwxWvdibkmGLouSv2r+bzgHmY9F9xqScjnLrryO5N4A9ss0n4VT/lPqgG2QJrnScISnnzAxBBNwRMliVNK6hF3tTNmxZdOQ/ZcZMKwvjk6PQEBy/qsT6d4LcG8DN/s32+3O53Hj+3xMhXKXdwZbC5da1qCNksCpp7g4oDVvxi9k9RHepmiaoGN5v/39fmcGqkkZ/UBi2HogwKuWWmmmbIm7VXQg7YneVGawqaXQIhWHrgQibA9U57yUja/67anfsI4NVLY0OobFhqzBY/wcnivjXwzKa8AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492312035;4.move,1.4,1.3,1.2,3.614,1.0;4.sync,10.6492312045;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;4.rect,1.1,3.121,3.647,3.346,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.42,3.648;4.blob,1.1,500.iVBORw0KGgoAAAANSUhEUgAAAA8AAAARCAMAAAA11AaTAAAAsVBMVEVhYWHZ2dlCQkIAAAAbGxujo6Px8fEUFBQJCQn5+flqamrY2NiYmJgODg7Q0NALCwvs7Ozv7+8QEBDOzs6mpqYHBwfX19fb29uysrLHx8dNTU3+/v4SEhJ6enr////6+vqLi4s1NTW1tbXIyMjPz8+lpaWMjIwICAjU1NShoaGQkJAEBAQFBQWEhISsrKwMDAyGhoYsLCwPDw/z8/Nubm5nZ2f7+/tpaWlUVFQBAQETExNJitLbAAAAgUlEQVQYlVXP1w6CQBQE0CsjqCDFXlZBsYsVu///Ya7J3uTuvJ1M5mGIKg5EqOp6NWnUG75lBE1GGP4duYZx0mprd7rGvf4g1h6O7P1Y+RNpTNNI2slmc+l8Ye+XK8Y63Whvd+y9KggH78g+BaDzRV0Ny9sd9Hi+uC7eH1D5lffxA9RCCdJGSqyFAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492312058;4.sync,10.6492312068;4.sync,10.6492312078;4.move,1.4,1.3,1.2,3.615,1.0;4.sync,10.6492312146;4.copy,1.1,1.0,2.19,3.960,3.646,2.14,1.1,1.0,1.0;4.rect,1.1,2.42,3.648,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492312168;4.move,1.4,1.3,1.2,3.616,1.0;4.sync,10.6492312218;4.copy,1.1,1.0,2.38,3.960,3.627,2.14,1.1,1.0,1.0;4.rect,1.1,2.42,3.629,2.15,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.2,3.629;4.blob,1.1,3640.iVBORw0KGgoAAAANSUhEUgAAAecAAAAjCAMAAACZ3TJwAAAC1lBMVEVhYWHZ2dlCQkIAAAAbGxujo6Px8fEUFBQJCQn5+flqamrY2NiYmJgODg7Q0NALCwvs7Ozv7+8QEBDOzs6mpqYHBwfX19fb29uysrLHx8dNTU3+/v4SEhJ6enr////6+vqLi4s1NTW1tbXIyMjPz8+lpaWMjIwICAjU1NShoaGQkJAEBAQFBQWEhISsrKwMDAyGhoYsLCwPDw/z8/Nubm5nZ2f7+/tpaWlUVFQBAQETExMDAwMGBgYCAgJsbGxERETDw8M0NDQVFRUrKytHR0eAgIC0tLTc3NyBgYGKiorh4eH19fW5ubk4ODjT09OgoKBoaGjo6OgYGBiUlJS7u7sjIyPAwMC/v79ISEiSkpLr6+seHh4REREgICA8PDykpKRGRkbw8PB2dnaxsbEXFxf8/Px3d3eZmZmIiIgNDQ3t7e2zs7MZGRkaGhq2trby8vKDg4PJyclgYGDj4+NBQUGoqKicnJxAQEC4uLjq6uqtra2qqqru7u6enp63t7dLS0vk5OQcHBxcXFzBwcHf39/R0dF1dXX4+PhtbW2amppPT0/W1tbFxcUxMTEoKCiioqL29vZbW1vMzMz09PTl5eU3Nzf39/fp6emTk5PS0tImJiZSUlKNjY1aWlrCwsInJye9vb1jY2PExMTg4OAiIiJJSUmnp6c2NjbGxsZRUVHKyspOTk5ZWVm6urpfX19VVVX9/f1DQ0PV1dViYmLm5uYuLi5kZGQpKSl+fn7e3t5lZWUyMjJeXl5dXV2WlpaVlZUKCgokJCSPj49FRUU9PT05OTna2tpmZmZ8fHyurq5xcXGCgoKvr69/f390dHRMTEywsLAfHx9QUFCfn5+Ojo6Hh4erq6vi4uIWFhZKSkpzc3N4eHhra2vNzc0wMDCXl5c7OzsdHR0qKiotLS17e3vn5+dWVlZ5eXkhISFXV1eJiYmbm5u8vLx9fX06Ojpvb2/d3d2FhYW52Q6TAAAHjUlEQVR4nO1b91sURxi+8FkoCljOwsmAop4tYMTCKXggKApRxC7qnYj1YsOgYglivdgvoiARC6IxpthrFEs0lqgxmsSSmJimppf/IDN7tzOzsEcOnls3T559f7hndvab93u/7+Vm924Pne4FH9Dwv4euVu06ddUWoUFx6MDXz19tERoUhw4goJ54UL++mlI0KAjsc2Bt1zgouEFDVcVoUAzY50aNXWN9k6ZBqorRoBiwz82aqy1Cg+LAPocY/FuoLUODwsA+QygKVFuGBoWBffYJC2+ptgwNCgP73CpCbREaFAf2uXUb8aAtMqqpRYNywD63ay8edDB0VFOLBuWgg051XhQPIgPUlKJBQeiiOhteco27RHdVVYsG5aDr1r2HOO4YY1JTigYFoevSU20JGp4D8PXZaOyltgoN3kas0RjHH+sgEqHeaqnRoBTaIWTmj7HP8Ql91FKjQSkkJlGf+0aC4HM/mTBTcv8aJogakJL6sngHDwPRwGqtrnleHuGDPAhKU/1L/cEIofTqxnlUG8YQ0edeQ4fFuvUZhnfxjK4i9CNGxowanTHGdVhdn2ucV4Kx4zwIkvc5MsIL+T3EEIvF6onPkrgqa+PUiz6PT0coM8StzzXFhKyJ8ZMmT57iOqy2z88P6vuMMdUTnz2Pq+zzNNsr02fMnNWC+mxGs6Oz52S8moPHc/FGMY9M1kvGLwloPn/WmjtgQerCieT0mEXRi18TfmrU2y8xL7X7EojLX2pdtGx50Ao857PSb9AqwWcxroX9dRKcvJqT5p28HNguZ81aszZ13Xoy3NAvus7GITwz9nlVuiNrBjn7xqaCzVPI58t8JIDMbVleWLQ1yk0OMBf7Fc9BFp6PsbBsdI6vkjEz/1hFDIyFxnE7OF3BquTUU58taAvAm2gb53PJ9kmBSRE78HinxZJSsd/0rBVljfd37MIn+uQXx5Sm5wm9QJtDzTFDoOVuvS1qfSSU6WGPfcTeOcHEZxb3VgR+2Sd5j3snLwe2y1mL3t4f026FHqBnxjvvvtdkpV7iM3p/yQHbOnx48FDfw8sCcvGopWXkEYvFQqQ4ckcdXdzKTQ6htmNSnxkLy0bnuDo4ZuofVxEFY2FxrDa2glXJ1DOfj6MYgLgTJzmfl0JKfziV4gwLqNhvetZ6Gl/WP0D4Dyh8Fi7eB50RenFWWFY+73g8JJ2DYl84n3EBYD/xlMWZ0UWAD4/gwDgjQSdv5ZViqujzNIBL6DJA50x82d+J1kh8PqYn+j7CriXg+4pyJLwVxZ1v0ZWOAEkoh89BNcP5YFxbiNRnxsKy0TmuDo6ZKmUVsRyMBfh9u9IKVqXcvh0Xb7tKfvQn8bmsL1zLd9tv11nrJjw3Fh0FWHsdS/J1+Au98BWWfXxj/E0o72u6ApBNHoMJ12cWZ1pxC+I2f4JP3Ba2mE+9lVfeZ3IF3oO2AexYRI7vREn3bTzSGwjL3YhoLGYc36kC4eFORls+B9UM2W2E2qT7NmVh2egcVwfHTJWyilgOjkXGZ7aCVSl7H9bws7DMz6fV1GfwCwWwOa8HXwi9cD657tF2YPKd3JKz9wDutxV95uJOXYGcsAd40CWBYLi38rr3eRzZuJLPiacq+AyZNwAeGhovafmlxGdf53dHK9P4HFQz3O9Q2WfGwrLROVYHz0yVsopYDsYi5zNbwaqU9RngwVeZRy5U7fPQFDf9HotKAU7fE0Qt5XphHhmbHHbCUZCI/+bTRJ+5uDGH9q2+KfHEO3mlqOSz870hYXb6HGt4BNDvazy6K30/pzrfdSXyObKt4PKZ8TEWlo3OcXVwzFQpVxEFYwEZn9mKqn2uS/6paj0qrdrnUPsFolPa7ytxAKXoG4DHZWRTqQVcL4zB3wZNh+mEfHQR3u4eEp+5OMg9ZwuRtMw7eaWo5HPnBvUBvmsQwjFDWj6+3h8k+vJG4rhrTp+nNHVSLHReRc3yObZm+JIt1sLzMRaWjc5xdXDMVCnfIRGMBWR8Zit4n0X1QH2+XoxfTKm3qvb5+0ntzT3SK/Qbzb10tWAYPttnQWD5pfCwH/hedKvzo/nuIzK649g1atl94X6bxcFB+xPpb1a8lJeB3JPaLJYNfAfqLmh++2lxoJFjhjRD7t6zi+NxSA/Ds6TwQyiRrC5Ht3KW4T/Tk4V5SQds5O5ZLsdPhbtGHcgnPjM+xsKy0TmuDsbMlPIdEsFYWJzcCt5nUT3z2d/wFExdUYg7n5s6/+lqW4C90c8V+t16drBjofCV+MWFmdEjDkt7sb1R4ZNnwihnUFi7o8JnKBYHsRm/SFvmrbwUg51XrkhJB8bMLHjyax+eGdJ+Cy1yZE3HU6bf7ztmbi8TPiGbSmx+TUi//9hdmPG4vpsccHiQX/EEoTbKx7HQbHSOr5IyM6V8hygoC4uTW8H7TNVTn3v1Q09saCO5D5sp81wyyD6h0pwLzvshhaBW3upCsMkwUW0Z7hF7R7wPmx+Rd0b+uWSLy0nN7MPdMSjXb7XyVh+X07v6/Ll4yr8HqgbuuWTaVCA+70mo+Fxy7yRHtrniQgrl+q1W3hrgaGv7X3//l38EnZiQMI0//gcA/y9bYoXZrwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492312233;4.sync,10.6492312249;4.sync,10.6492312259;4.sync,10.6492312269;4.sync,10.6492312280;4.sync,10.6492312290;4.sync,10.6492312300;4.size,2.-1,1.1,1.1;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,120.iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA/wD/AP+gvaeTAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==;3.end,1.1;6.cursor,1.0,1.0,2.-1,1.0,1.0,1.1,1.1;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,188.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAIVBMVEUAAABoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwuQ5JRAAAAJklEQVQImWNgwACMSspAkiU0GcwrJolkCc0InQA0QUlpAabBEAAAgcEHSHIQjjIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492313077;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492313185;4.copy,1.1,1.0,2.76,3.960,3.570,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.520,2.19,2.14,1.1,1.0,3.570;4.copy,1.1,3.530,3.646,3.430,2.19,2.14,1.1,3.530,3.570;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.646,2.19,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.590;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,80.9JzEC+DgAAAms0/Uzc1tcHAQPvhQeBYvzsSSl5fX2tr6PqxO/jD5/0SET7X+V3TrAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.629;4.blob,1.1,5204.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;3.end,1.1;4.sync,10.6492313356;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492313976;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492314061;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492314190;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.530,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492314323;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492314477;4.rect,1.1,3.630,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.646;4.blob,1.1,980.iVBORw0KGgoAAAANSUhEUgAAAEUAAAATCAMAAADxhDDxAAABWVBMVEUAAACLi4vT09MREREgICBGRkbR0dH5+fnV1dVtbW3///84ODiYmJjc3Nw0NDRAQEBbW1vMzMz09PTl5eWZmZkTExNsbGwrKyu3t7f19fX7+/tLS0toaGjo6OhERESDg4Pz8/PJyclgYGDr6+vj4+NBQUElJSXGxsZfX19VVVX9/f2AgIBDQ0NcXFzY2Ni4uLh6enpUVFQYGBg8PDykpKSNjY1aWlr8/PzQ0NBHR0fIyMjCwsLu7u4NDQ0iIiIHBwddXV1eXl6IiIgcHBzh4eGBgYF+fn7Ly8umpqZQUFAJCQng4OB8fHzk5OTi4uKQkJBKSkr+/v41NTVzc3MICAilpaWUlJS0tLTNzc2Tk5Pt7e0LCwtJSUn4+PgKCgq/v78hISH39/fm5uYqKiqhoaFpaWl5eXkoKCjS0tL6+vrU1NRSUlLOzs5XV1cBAQF9fX329va2trasrKwBEZ9gAAABQUlEQVQ4jWNgGNGAkYkapjCzUMMUfICVjZ2Dk4ubgYGHF8jj4+IHkgKCQsIioiBZMXZxCUkpaQYGGS4uLlmwBrg6OS55BUUlZRVVBgY1dnVpDRVUUzS1tHV09fTBpnAJG8gZGjEwGBkbm2CYYmpmbmFpZQ0Us7EFugfVFDs+BgZ7By5RsCmOcFc7YZjizODiyuDmwsDg7gEU40bzkaeVAtADLGBTvPCa4q3N4OPLwODnj2lKQKCHdFAw1JQQYkxRDIWZEuYCMyU8AuQeXKbA1SGZEhkVzcAQAzLFIDYOpBdoikQ8UJ0PLlPg6pBMSUi0jjFLApmSbJ4ilyoLMiU1MM2SUYtLHNkUUBxFGRunI6lDMoVBJyMzKw1kCkO2XmxOLsiUvHy/gkIzb2lkU0DpBQiKkNQhm8IACxeKwWAyhUIAAHD7OgJm51JBAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492314753;4.copy,1.1,1.0,2.19,3.960,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.646,3.630,2.19,2.14,1.1,1.0,3.627;4.copy,1.1,3.640,3.646,3.320,2.19,2.14,1.1,3.640,3.627;4.rect,1.1,3.630,3.630,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.646,3.609,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492315324;4.rect,1.1,1.0,1.0,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,3.153,3.255;4.rect,1.1,2.10,1.3,3.889,3.642;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.534,2.10,3.131;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492315779;4.rect,1.1,1.0,1.0,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.646,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,2.90;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAA8AAAAARCAMAAAAlgjW+AAAAaVBMVEUAAAAEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwUAAQEkWVk8k5M4iYkaPz8jVlYGDg4WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcZPT0XOjoLHBw0gIA+mZk9l5cJFxcECgqmtRByAAAAcUlEQVRoge3WNw5CQRBEwcHDx3v3sfc/JGhFsCnhSFVJvyN0RKdb9KIqIIn+oBjWBSQxGheTugAAAAAAAAAAAPhLo5TKWs10Nl98d7lSSmWrWG+2u/3heDpflFLZKq5txO3+eLZKqXT1+9Gvt1IqX30Aq/3hMVFF0VsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.117;4.blob,1.1,488.iVBORw0KGgoAAAANSUhEUgAAA58AAAAHCAMAAAC4Egn9AAAAV1BMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDR765d9AAAA0ElEQVRYhe2QNw4DUQhE+c72Oq5zuP85Hbagw4OYCjEVQhOkJyJtNJZB9qVCfZEEJ4u2+Ps4G0WStZGX5GQ6awJcKtQXSXCyaIu/j7NRJFkbeUnOF8vV8LEvFeqLJDhZtMXfx9kokqyNtCS79Wa7+z3sS4X6IglOFm3x93E2iiRrIy/J/aH1x07+XirUF0lwsmiLv4+zUSRZG3lJns5yud6+H/tSob5IgpNFW/x9nI0iydpIS/L+eIr0r8/DvlSoL5LgZNEWfx9no0iyNtKSfAOjAFcQPmHw0AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.136;4.blob,1.1,448.iVBORw0KGgoAAAANSUhEUgAAA6kAAAAHCAMAAADd//uCAAAAV1BMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDR765d9AAAAsklEQVRYhe2QSRKCUAxE+wtOoKIgON7/nA7so1XpZJP0KpVF96sHoCwqzJEvTew2OH0eLGmSxRLVZL1cFfxxaWK3wenzYEmTLJaoJtebbTN/5EsTuw1OnwdLmmSxBDXZ7vaH7vuQL03sNjh9HixpksUS1eTxVPqhxc9LE7sNTp8HS5pksUQ1eR4xXa6fj3xpYrfB6fNgSZMslqAmb/cH0D/fD/nSxG6D0+fBkiZZLEFNvgCsh0KUdCIlKwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.155;4.blob,1.1,468.iVBORw0KGgoAAAANSUhEUgAAA70AAAAHCAMAAADzutoQAAAAV1BMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDR765d9AAAAw0lEQVRYhe2QOQ7CUAxE/Ql7gEDYl/ufE0KKL5ALW2O5mqlGLt5YT0TKpJExtSHReLkbMRT/Bk3SJEr2+pvO5kX+GhKNl7sR/al1gyZpEiV7/S2Wq/V4qQ2JxsvdiP7UukGTNImSnf7azXbXfQ+1IdF4uRvRn1o3aJImUbLX3/5Q+mMrPw2JxsvdiP7UukGTNImSvf5OZ7lcb8OlNiQaL3cj+lPrBk3SJEp2+rs/niL963OoDYnGy92I/tS6QZM0mWzyDfbgSx11HDoSAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.204;4.blob,1.1,808.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAdCAMAAAANS8U4AAABOFBMVEUAAAAGBgIICAMDAwHIyFH//2dgYCcoKBA0NBUTEwggICD///8bGxsTExMiIiIFBQVKSh62tkojIyP39/eBgTR5eTESEgcsLBJtbSwEBAJbWyXS0lVvby329mP19WOUlDwkJA8CAgE3NxZ+fjOZmT54eDEJCQRsbCzf31r4+GSjo0I5ORcPDwZpaSrLy1L9/WawsEc+PhkFBQJBQRqGhjaVlTxiYigiIg6np0P7+2UuLhO3t0pISB1kZCmXlz1NTR8LCwVQUCDa2ljx8WEMDAVkZCioqEQbGwswMBODgzWRkTtZWSQcHAtUVCLGxlBcXCUtLRKbmz/z82KNjTkeHgwBAQAyMhR6ejF3dzBDQxu7u0ycnD/g4Fpyci4ODgZwcC2SkjsnJxAeSh5l+WUiVCIgTyBc5FwJFwn9pU4fAAAA4ElEQVQ4jWNggANGJjBgRmbhAyysYMCGzMIH2DnAgBOZNQqQARc3D4nqeUlSz8fNT5xCAUEwJSSMLiEiKobMFZcAEpJS0qwsOAySkZWTV4CyFZWUVVQZ1NQ1NLW0cdqso6unb2AIZBgZm5iamTMwWFiKEEgnVtasNgwMtnb2DiCeo5OzqRUe1S6uLJZu7gwMHp5e3j5gZ/nqsfr541AdEBjkHBwCZoaGhatEKIGZkVFBONRHx8TGIXjs8Qkwc3CoT5RE5btjVUVcfkQA4vIjAozmR+wgKTmFNA2paekEVAAAS5EZBZXN7hkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.345;4.blob,1.1,1532.iVBORw0KGgoAAAANSUhEUgAAABwAAABHCAMAAAAjmteSAAACeVBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwQCAgEICAMFBQKpqUSjo0JMTB///2ewsEcPDwb392RFRRw0NBUjIw5kZCjk5FzCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0KGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwkBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViMCBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzMpZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8AAQAUMhQxejEwdzD19fWNjY1a3lo3iDcQKBAtcC07kjutra1EREQBAwFl+WUsbCwLGwspKSm3t7dfX1/t7e0UMRQ6OjrExMSXl5cODg4tby1d5l1SzFIyfTIgUCBc5VwRKREcRRwbQhseSx4MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkXIyFFgYCcoKBATEwgHP0siAAABvUlEQVRIiWNgwAUYmXBKMTAwMeKWY2ZhxS3Jxo5bjoOTC7ckNw8vbkk+ftxyAoJCuCWFRURxS4qJ45aTkJTCLSktg1uOQVYOj+RQAfIKeCQV5HHLKSop45ZUUcUtp6augVtSU0sbROnogoAemqS+AZgyNAIBY1Q5E1MzCG0OAhaokpZWOrittLbBLWdrZ49b0sERtxyDkzMeyYEFLq54JN3cPfDIenrhkfT28cUj6+cPZwYEgsig4JDQsHCISERkFJiOjomNiwfSCYlJySmpaRDJ9MgMIJmZlZ2Tmwfi5xcUMjAUFZdAZEvLgER5RWUVhFtdAyJr6yC8+hwg0dDY1NwC4rUWt4Go9g6IZGcXiOzu6Y3riwEy+iE6J0AkJ06COnbylKlAchrEzulgoRkzZ8H9MhuI54TMLZo3PwnqucgFqB5fuCikdvESCHvpsmjcIbR8BW65lavSccqtXrYGt8a163DLURWs37ARj+ymzXgkt2zdhlty+46deLTu2o1Hco/dXjyy+/bjkTxwEI/kocNH8MgePYZH8viJk7glT50+AyRPgss+3e3osmfPAYnz4LLP6AJW/RfBZZ/5JQBwP2eDfsR+AgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.772,3.421;4.blob,1.1,1324.iVBORw0KGgoAAAANSUhEUgAAALoAAABGCAMAAABMgH6hAAABlVBMVEUAAAAZGRk+Pj4CAgIMDAX19WNKSh4GBgYPDw85OTknJyekpEKoqEQ3NzcgICBGRhz29mMODgYDAwHm5l1jYygBAACLizjBwU4CAQGUPDz1Y2PlXFxpKiqQOjoYCgotLRL+/mcfHw1aJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBATQ0FR8fDJmKSlgJycvExPWVlb/Z2f7ZWVyci7Z2VgnEBAQBgYYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUxMTEYGBhHRx1/fzQBAQCGhjZLSx4HBwOTkzwsLBIpKRGZmT6FhTZiYihlZSkeHgyYmD4QEAdkZCltbSyXlz0oKBAqKhGUlDwICANWViNxcS4KCgQrKxFraysCAgGKijg7OxiMjDk4OBdBQRqIiDcvLxNTUyJ0dC+SkjtQUCFAQBobGwsTEwgSEgc0NBV9fTNERByCgjU8PBiJiTchIQ1ubiwUFAgaGgs1NRaOjjkEBAEFBQKRkTswMBOAgDRDQxteXiZmZilmuZ8HAAACB0lEQVRoge2ZZ1NTURCGr0oJRSFKqNItiPQqSm9JIBpJjAhGBELvCBZ653eTOfdeYOaec8PJOGd3hn0+ZHf2zYfnSzLzztE0Cw8eGjyyZihISEwSJMkOhyMlNfqh1EeGtHSb8PETZR5xkJHpFIe41Z8+yxKHprrr+uISfBOE7Bxxpqvn5uUXPI/OwqKbTY1bDIpLSoWZrl5W/uLlq9cVbyrf3mzK9GypqhZGunpNrabV1Tc01t7acNDULIxu/UxdLa2WDZx3be9FEe5/mCgf2kUJevWOzi5Bgl69u6cXWiFu+vqhDQiCuIcMDEIbxA2pQ0DqEJA6BKQOAalDQOoQkDpBEP8ft4cN79Awm76PnyBtpPC42fB/HvGyJRCEtJHhS+grm6PfxsbZ8j38A9JHgomfbEy2T03rb2SRmVlIn7sTmZtnc2HRuxSeZOvyCqCPBMWrPjar17RI9jpbN0KbkEZ3Jhhgw5f0S9OWtvTbtug9HhXdYb/1+PuPehF5/v7zWo/OsR31JtKsLPOuux2qPeTZC+3zzgeHR6pNpBnmP14fn5wqFpHn7Jx/v7hU60EQBIEEo9bZgbXqGbXOFpxVz6x1tuCsekatswdl1TNrXQwwVj2z1sUAY9Uzal1M8FU9bq3jga/qcWsdD3xVj1/reGCreoJaxwNb1RPUOh7Yqp6o1vHAVfWuAMe+UYwDydkIAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.643,3.497;4.blob,1.1,7476.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.234;4.blob,1.1,3464.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.552;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAABw0lEQVRoge2X104CURRFB6yIXhQbFsAGYgF7wV7+/58MiQ9z95nMTHL28cGc9cS9IWsShmRnJYkZlaqde8LU9IztA2bnbP3ztQXbB9QXbf1LoWLqb4RlU3+y0rT1r67Z+tfrtv6NTVN9a2vb1L8Tdk397U7X1L+3b6o/OGxY6o86PUt90j821f9isWKD1GeDFTs5TZ/oK9Y7O08f2SvWGrbjC/KKjWrwRskrdnEJF+QVu7rGG+qK3YQRXlFX7Db08Yq6YnfhHq+oK/YQ8O/OXbHH8RPckFfsGd8mecWaQ7ggr9jL+DU601fs7T39e/BXrPrxmToZrNjXN11ZBvZSoo+9lMLHXkr0sZdS+Ni9hz5276GP3XvCx+499LF7D33s3kMfu/fAx+499LF7D33s3kMfu/fAx15K8LGXEn3spfybfpwwKP6Kxhf3nh7wQe+pAZ/oPSXoE72nBH2i95SgT/aeDvBl9J4K9GX0ngr0ZfSeCvTJ3tOBPtl7OoRP9J4S9IneU4I+7D0twhf3nh70xb2nR/jYvef9WArvxyK8HwvwfszH+zEX78c8vB9L+rwf83zej7k+78cY78cCvB8L+Ff9+APpqDnRApnbgQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.590;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAUUAAAASCAMAAAD7VjyUAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABLElEQVRYhd2WSVPCUBAGh+cuKgIRn6IS2RRccMF91///n5yXYzLHPkzRt3yHruoJlUKkFhaapdIz3Vv4ZHllldX6Ym29NNC9hU/CxiZq9UV9a7s80b3JJ2GnsctqHdFstSsb3Zt8EkK2h1o90WkYX0G6V316xf0orNYPB4fGSPeqT4XdeIRaHXF8Yox0r/rSa+nlqNUPp7FjzXRvL09X7A9YqxuGcWTNdG9/kK44zlirG87iuTXTveMsXXEyZa1uuIjmnxq6dzLVKzYvr1irG65nN8ZK96pPr3gb71CrI+6tLyDdqz69Ynv+gFodkbeMke5Vn17x8QmVeuJ59lId6V71SXh967JWT7x/VH53dG/yyee8jkp9Ufv6Li10b+GT0Q8q9cbvX2mgewvfP0kUQfiFK6hVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.628;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAUUAAAASCAMAAAD7VjyUAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABLElEQVRYhd2WSVPCUBAGh+cuKgIRn6IS2RRccMF91///n5yXYzLHPkzRt3yHruoJlUKkFhaapdIz3Vv4ZHllldX6Ym29NNC9hU/CxiZq9UV9a7s80b3JJ2GnsctqHdFstSsb3Zt8EkK2h1o90WkYX0G6V316xf0orNYPB4fGSPeqT4XdeIRaHXF8Yox0r/rSa+nlqNUPp7FjzXRvL09X7A9YqxuGcWTNdG9/kK44zlirG87iuTXTveMsXXEyZa1uuIjmnxq6dzLVKzYvr1irG65nN8ZK96pPr3gb71CrI+6tLyDdqz69Ynv+gFodkbeMke5Vn17x8QmVeuJ59lId6V71SXh967JWT7x/VH53dG/yyee8jkp9Ufv6Li10b+GT0Q8q9cbvX2mgewvfP0kUQfiFK6hVAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492315905;4.copy,1.1,2.20,3.190,3.940,2.38,2.14,1.1,1.0,3.190;4.copy,1.1,2.20,3.342,3.940,2.19,2.14,1.1,2.10,3.342;4.copy,1.1,2.20,3.380,3.940,2.19,2.14,1.1,2.10,3.380;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,3.941,3.215,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,2.79;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAMAAAALzYw2AAAAgVBMVEUHBweTk5MsLCwAAABiYmJlZWUqKiqUlJQICAgCAgKKioo7OztTU1N0dHQbGxuYmJgTExN9fX1KSkpERESCgoIODg6Xl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDAEBAEFBQICAgFeXl5mZmZ4eDGZmT46OhcYGAofHw0LCwXV9tylAAAAX0lEQVQYlX3MNw6AQAxEUYPJOeec4f4HZLXNVvYvrJGeZABNRypAw2TQsh0aXc+nEYOQwShOaMQ0YzAvGCyrmkZsWga7fqBxnGZxl1W2qSUR90Oc85LdaoF68ryyT60fpAEM2l7dhYQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.903,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.345;4.blob,1.1,3664.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.364;4.blob,1.1,3084.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;3.end,1.1;4.sync,10.6492315989;4.copy,1.1,2.20,3.190,3.940,2.19,2.14,1.1,1.0,3.190;4.copy,1.1,2.30,3.209,3.930,2.19,2.14,1.1,2.10,3.209;4.copy,1.1,2.40,3.228,3.920,2.19,2.14,1.1,2.20,3.228;4.copy,1.1,2.30,3.342,3.930,2.19,2.14,1.1,2.20,3.342;4.copy,1.1,2.30,3.380,3.930,2.19,2.14,1.1,2.20,3.380;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,1.1,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.421,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,2.79;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAMAAAALzYw2AAAAgVBMVEUHBweTk5MsLCwAAABiYmJlZWUqKiqUlJQICAgCAgKKioo7OztTU1N0dHQbGxuYmJgTExN9fX1KSkpERESCgoIODg6Xl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDAEBAEFBQICAgFeXl5mZmZ4eDGZmT46OhcYGAofHw0LCwXV9tylAAAAX0lEQVQYlX3MNw6AQAxEUYPJOeec4f4HZLXNVvYvrJGeZABNRypAw2TQsh0aXc+nEYOQwShOaMQ0YzAvGCyrmkZsWga7fqBxnGZxl1W2qSUR90Oc85LdaoF68ryyT60fpAEM2l7dhYQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.215;4.blob,1.1,2432.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.364;4.blob,1.1,1264.iVBORw0KGgoAAAANSUhEUgAAACYAAAA0CAMAAADR/boMAAABy1BMVEUAAAB3dzDU1FYMDAX19WNKSh6kpEKoqEQyMhT9/WYbGwtGRhz29mMODgaQkDq8vEwDAwHm5l1jYygEBALp6V5eXiaLizjBwU5LSx709GMLCwQCAgEICAMFBQItLRL+/mcfHw2pqUSjo0JMTB///2ewsEfQ0FR8fDIPDwb392RFRRw0NBUjIw5yci7Z2VhkZCjk5FwYGAr8/GY3NxbCwk6Kiji3t0qVlTwhIQ0sLBJZWSTs7F8GBgJ9fTLOzlMJCQTy8mJQUCDW1lZwcC2cnD+qqkUKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwknJyf29va4uLhISEhiYmLu7u61tbUGDgYjViOqqqra2toEBARHR0f///9BQUFe6F4zfzP09PSEhITr6+uMjIxX11c8lTxsbGzR0dGgoKBV01U/nT/19fWNjY1a3lo3iDetra1EREQBAwFl+WUsbCwpKSm3t7dfX1/t7e0SLBIUMRQ6OjrExMSXl5cODg4tby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx7IyFFgYCcoKBATEwiyKpRLAAABpElEQVQ4jc2V1VIDQRBFO7i7J7gT3N3dJUiA4JDg7u7u+rlkp7PsbNVM2CeK+zB9u/bU1D6dARCisgF2bO3sqc1GxcHAwVHqTs4uPMzVzf2ne3jyKPDy9hGrr58/F4OAQLEFBYcIQ60REiprAGHhERYsMoqM6BghsbJmTlw8zoTEJJxaIcmyZk5KKs60dDX/1wAyMrPIzM6xRgHk5glnfniBdaywqNh8lpRap6CsvMJ8Vlb9gkF1zW/Ev0ltnSKsvqFREdfUrAhraW1TxLV3cD91dum6e3qx9+n7OdTAoGFoeGQUlzH9OAebmJwCMJqmcZuZ5WBz88K5sIjb0jIHM60I5+oabusbHGwTb9vCbXuHg+3iv+2RZf/gkIMd6Y6NJ6cGXM705xwMLi51C1fX2G9u73gYnfsHJdTj05gC6vn2Rcllr29KqD+M3NXMEM/TrmaHeJ52NTPoecrV7Fg8L7maGdHzkquZsXhecjU7Fs9LrmZG9LzkamYoz6Or2aE8j65mhvY8urqYvFQaL7rJPU9c/U5eqpgPujE8/0leKu0X3cR8A6FxSUq81lqBAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.421;4.blob,1.1,3644.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;3.end,1.1;4.sync,10.6492316092;4.copy,1.1,2.20,3.190,3.940,2.19,2.14,1.1,1.0,3.190;4.copy,1.1,2.30,3.209,3.930,2.19,2.14,1.1,2.10,3.209;4.copy,1.1,2.40,3.342,3.920,2.19,2.14,1.1,2.30,3.342;4.copy,1.1,2.50,3.361,3.910,2.19,2.14,1.1,2.40,3.361;4.copy,1.1,2.60,3.399,3.900,2.19,2.14,1.1,2.50,3.399;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,3.883,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,2.60;4.blob,1.1,848.iVBORw0KGgoAAAANSUhEUgAAADEAAAAzCAMAAAAJihAlAAABIFBMVEUAAAAHBweTk5MsLCxiYmJlZWUqKiqUlJQICAgCAgKKioo7OztTU1N0dHQbGxuYmJgTExN9fX1KSkpERESCgoIODg6Xl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5c8PBiJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsBfxfbAAABFUlEQVRIie2T11LCUBRFr72gKKKCBRCIFUTslaL0IhZUUEH+/y8g98GTYfYE9rOuh9w1maxJJjNbqZHRMUUyPsEWk1PTZDEz62BfMjfPFs6FRTZxLbGFe5ktVlY9bOJdY4v1jU2y8PkD7Eu2gmzxz1DIapFBZLXIELJaZAhZLTKIrBYZQlaLDCKrRYaQ1SJDyGqRQWS1yBCyWmQIWW2/hcIaw2oaWW2fbe9odq1mz96+5sBqf5xIlC2iETI4jB2RRfyYDIyTU32e/d6xN6XOLy7NO1fXN7e98y5ha7pIpsxr+v4hk83lC8WSrZmPlitV83isKfX0/PJaG2A96m/v8rEfjSGs+Un+qa/YN1m02mSgfjrU410lODWHe5EqTAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.863,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.326;4.blob,1.1,1432.iVBORw0KGgoAAAANSUhEUgAAACYAAABHCAMAAABcS8VjAAACE1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVnZypqaisjIyP39/c0NIExMXkHBxKMjDlHRx0tLW9jY/ZjY/U8PJQPDyQLCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4XFwkoKBATEy5KSrdnZ/8dHUgcHAslJQ8FBQwoKGRRUchlZftERKgLCxsREQcsLBISEi0/P5tiYvNhYfE5OY0MDB4EBAGWlj09PRk/P5xaWuAuLnIGBg53dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR6np/f1AAAB2ElEQVRIiWNggANGJmYGYgALK1HK2Ng5iFHGycVNlHE8vEQp4+MXIEqdoBBRyoRFiFImKiZOlDoJSaKUSUnLEKNMVk6eKOMUFIlSNtyBkjIKV0VVDasyZSVUvroGNlWaWtqoAjq6eliU6RugCRgaGWOqMjQxRRcyM8dUZmGpgi5kpWWNoUxDHVOrjS26iJ2uPaYyB0d0ESdnF0xlrm7uaCLmZpiqGBg8PFH5Xlre2JT5+Pqh8P0DsKliCAwKRuGHhGJVxhAWjl180IMIolRFRhGjKjomFsKIi0/ArSoxKZkBpiwFt7LUtHQoKyM+E7eyrGwYKycXQuflF2AqKyxCFykuKS0rRxOrqEzF0FlVXVNbV48i1FDZiM0pTc0trcj8tsp2TEUdnV3dPb3IIn2V/eiKJkycNHnKVFSxadNnoCubOWv2HAwL5s5DF5m/AMrwCwQDQxB7YRKm26Bg0WIwWAJiL52+DJey5SvAYCWYs2r1GpzmIYH0teuIUcawfgNRyugEcJXa6KU79lIbo3THXmpjlO5YS20spTu2UhtL6Y6t1MZWumOW2lhLd8xSG2vpjllqYy/d0UttHKU7eqmNo3SHlNpIyR1H6Q4utZGSO67SHQRQkjsaAADPJGcvSQ0EXgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.381;4.blob,1.1,884.iVBORw0KGgoAAAANSUhEUgAAADoAAAASCAMAAAA9mj1BAAABX1BMVEUAAAAKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwkBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViMDAwEFBQIBAQACBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNiYiiZmT4yMhQpZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cUFAgfHw0KCgQTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8AAQAUMhQxejEwdzD19fWNjY1a3lo3iDcQKBAtcC07kjutra1EREQBAwFl+WUsbCwLGwspKSm3t7dfX1/t7e0UMRQ6OjrExMSXl5cODg4tby1d5l1SzFIyfTIgUCBc5VwRKREcRRwbQhseSx6Fl8a/AAAA8klEQVQ4jWNgwAYYmbAKEwOYWVjJ1svGTrZWDk4usvVy8xCpkJcPRPILCAoJi0BERMXEidAnISklLQOkZeXkFRSVlCGCKmKquNSrqYOBBoOmlraOrh5ISN/AkIHByNgEosDUDJdWcwswsGSwsraxhQjZ2YNIB0cIz0kHl1ZnFzBwZXBz9/D0Aol4G/uAKF8/iAL/AIIOZggMCpYOkQQKhUJsDYMoCI8g6GAQiIyKBpIxEL/GgoXi4hMIOhgCEoE4STDZKCVVHiLAK5aGSys2kJ4h6JCZBWFn50iQohUZ5OaRqzO/QIVMnYU5ReRaWlxChCIADNgmNijrcd8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.402;4.blob,1.1,4984.iVBORw0KGgoAAAANSUhEUgAAAFcAAAD0CAIAAABhIi17AAAABmJLR0QA/wD/AP+gvaeTAAAOTUlEQVR4nO2dW2wTVxrHvxmP42tix3Y8SZxbE5OQhOBA4kshjbQBNcsDWSS2CCq2oGqrPlRiFy1VpZV2YVddVl0hVSptUaq+tLtCarXtSqgqUWmFUL1NiKCkbIEANSzd3HxJnJvvl9kHR2nqOL7MnPHY9PzkB+Qz55yPf+aMZ775n3MAsqa/tvZkd3f2xxcRZPaH2mh6xOnkLxQByVaFOqWySi6/6nLxGo1QZKuCjabvzs/Ph0K8RiMUWalAEoRFrx9+TIcDZKlCe3l5CUne8Hj4jkYoslLBRtNjs7OhWIzvaIQiswoyijJptY/xcIBsVOjS6XyRyLjXm4dohGJFBZFIKhJJUx5ho+lRt5vZuIk0dTOWFggkAIhEEovltNX6V4qSJxXrpFKjSpVmOKSpm7G0sfGXvb2DJCnm9l9AAAUADBOLRJYIgmSY5OufVa+fWF6e8vk2qp+mbsZSgiABmJRFhcWp7u5dBgNPjbe1vWg2/5mnxosDipLt3PmGwdAndCCCQhCkTrcdgBA6EAwGgykWRCJJT89ZjWZL/nrMW0/ZwzAxubxKqazzeL7OT4855B3zidM5otWa8vYAUqAqzM+PR6P+ioqu/HRXoCowTNzlukrTT+anuwJVAQCczhGVyiiVavPQVyFeHRNEIks63TaCIBcW7vPdV+GeCwDgdA7TtC0PHRW0Ci7XqFRaUVr6BN8dFe6IAIBYLFRW1iSVaubmvuW1o4I+FwDA5RquqDATBMVrL4WugsczRpIivu+mC3pEAADDxGUyfWlpvcdzXehYMBgMJiV6vUzoEPgi21/Kp5+uOXq0hddQCp3W1vLXX9+h0yHOeTQ0NDAMY+Dt3Vf2ZD4XSJJ49lnjJ5888niCfEQQDPLSbE5kVsFk0qrVErt9Bn3fJAkAi4uLyFvOlcz35xaL/s4dbyiE/s0yQRDBYDASieRUq7v7T7FY8PbtwVBoDlUkmc+FTZtUDgcvfy6HwyGT5fy7EwrNbd/+h8OH/9fT86ZKZUQSSYbnCIVCPDBQf+XK9MyMH0l/3HG5rt669abfP11fv9diOa3Tbff7p5aXH3FpM8O5oFRSABAIRLn0gZxweOH27XMff2z+6KNtIpFkYOBKbe3PuTSY4bogFpMAEIulsTUJg1isbGo62Nr6a52uy+H4YG7uP1xay6CCzxcFAImkgB7ANZqOjo5jTU0HGSY+Pv7upUsHlpe/59hmBhWWlsKxGFNeLuHYDUI6On5jMOy+du3k+Pi74XC+fmVfeaXz0CE0l2IkqNUtJIk4AZf5l/LWLW9bWznaXrkwP383Hkd8tc6sgt0+rdVKm5rK0HZcUGS+7AWDMbmcslr1IyOPrRU6q4u/w7HY21ut0UjGx+f5DqigUSrFe/bUCR0FBoN5jKjt7+8+eZJl3dr+7m6WdbMkT+8paZvNOTLCsi5tczpZ1s2SfKigrKuTV1W5rl5lU1dZJ5dXuVxs6mZPPlSgbbb5u3dD82zuNWjaNj9/NxTi9z6FdxUIktRbLM7hYTZ1CVKvtzidbOrmBO8qlLe3kyUlnhs32NQtbyfJEo+HTd2c4F0F2mabHRuLsZqgTdO22dmxWIz3yd38qkDJZFqTid1woCiZVmvKw3AAvlXQdXVFfD7v+DiburquSMTn9bKpmyv8qkDbbO7RUWDYJG9p2uZ2jwLkI/HLowpSnU5lNLIbDlKpTqUy5mc4AK8q6K3W5YkJ39QUm7p66/LyhM/Hpi4L+FTBbGZ3IgCAXm/O24mAwWAwGEw6ysoad+58AwCqq3+2devx9QdIpdre3kGJRJ2+nZQ5tfR1s2w5CT7mnJIAEI+vOIvi8fBGx60esxFpcmrp62ZsOYlYLOTx3EA7vY4EIGKxIAAQBBGNpnyGJQAgGk3nx9s4p5a+buaWU4J8zikJANFoIBFTQo4kCIKIxyPpV0/ZKKeWvm42Lackz3NOs4IgySfPnKFt+Zjstkpj436T6QSq1hA8R3DJqbEG7ZxTBCpwyamxxueb9Pkm9Xorkta4qsAlp8YRhHNOuarAJafGEYRzTrmqwCWnxpFweNHrvYPkdOCkApecGhJQzTnlpAKXnBoSUM055aYCh5waEuLxiNt9Xa+3CBgDBoPBYDCpEUkkPWfParYgyHxxccAlwS4q9vcLsVDIc+MG/SSCzBcXB1wS7KLidNfkHBnRmkwiKafMFxcHHKqoOKkwPz4e9fsrujhlvrg44FBFxUkFJh53Xb3KZVBwccAhjIrrk7VzZERlNEq1LDNfqbN1BEGKxWs/hEiUbSmrqLg+k/omJ32Tk3qr9ftPP2VRPWW2TtPRseWll9Z+M/vNN7fefjubUnZRIZiM5hwerurtZaFCIlt36623kr5fvH//xunTa7+J+v1ZlnKPiiUlZWVPnTtX+kTOma/Knh7ra68BwcvC2DlFhSAHHV5c9N65w+J9BK/ZupyiQuNrcg0PV5jNBJXD+MpDti77qNCo4BkbI0WinO5b85Ctyz4qNCrEIxH39et6Sw6Zrzxk61hEhcFgMI8LqJbpKWJMppf37fu30FEIisGw++jRuTysk1y4EITo4MF7HR2/RdJaoa8BvBENDb9QKAzj4+8iaY29CvV799bu2UMpFEjiyBWj8dDExKVIZHl9kdVqvXLlSiAQcDqdZ8+eVSqVq0V76/fuqd2joJJjZr8Qk7K2tmFgoGb37hK1OuByRX+8SxshEpEURYhEaz8MusfHp556y+H4YGYm+dLY0tIyPDzscDiOHz8+Ojp64sQJm812/vz5RGmtsnagYWB3zW51idoVcPmiKzFzeranZDK9xULv3FlaVzd78+bEpUsL91fW99/8/PN6a7L16vbgoOdrBJukSKXaI0c8n322/+HDj5OKPvzww87Ozra2tmg0CgD9/f1DQ0N9fX2XL19OHCCjZBa9ZSe9s6607ubszUsTl+6j2pNAUVOz5dix3sFBTXv7SqA6XWl9fdKHkqfYmZAFanXLiy8yKXdvW15efvXVV9d+43a7z5w5s/7IGkXNsS3HBnsH2zXtXDNuIomkwmyu6ulR1te7r13zTU4mvg95veGFhaSD41E06yyJRBIAWL9qk0wmUygUMzM/WpBzampKp9Ot/UYikpgrzD1VPfXK+mvua5O+SfYqKAwGQ19fhdkMDDNtt99+553Q3A/LTrYcOcLfiAgG5wCAWneRCwQCfr+/srJy7ZfV1dWff/554t8GhaHP0GeuMDPA2Kft79x+Zy40B1yyr4Zdu9SbNz+6cGHabo+tW7v1vxcuTH7xRXKUbjfr7n7UTsAVj0eUypr1RUNDQwcOHDh16tTqdUGn0128eDFRusuwa7N684VHF+zT9mAq03fOyGiaIAW73di376uenuTkNQC0trYGAoGLFy/29/cfOXJkdnZ2aGhotZSW0SRRrLdIKejq+uPBg6mv7Tt27LDb7YFAwO12nzt3rqzs8V17TaGofuGFME3vQNJaAS1fmRORyJJEot606fC9e+8LHYugUJRi//7rFstfhA5EaKRS3bZtvxc6CgwGswE5+dQQ+uPSk2VUyG6kcvKpIfTHpSfLqNCowMKnhsQfhyoqNCqw8Kkh8cehigqBCux8atz9cQijEnJWKUd/HMKohJxVuupE4x4Dx6gEnlXqHB7mY4J2rlEJPKvUNToqrahg4Y9DG5XAs0pZ++PQRiX8rFIW/jjkUQk/q3S9E42gqCSnMykWr+Y405eyi4rTX0BvNk9/+SWXFmCNE212bCzxTeeJE+uvFHffe8/51VcZS9lFxYv7liPyykqRJHkPl6DHE/H5MpZiMJiiQVbY+5zm43VVzdM1LT/xfU7LW8t3vL5Dinqf01U6X+k88O0Bjo3wey4QJGF81vjok0dBfvY5BYDmXzXf+/s9jo3wq4LWpJWoJTM87HOaQLddp25V3/8HV0sOvyroLXrvHW+Mh31OEzQ/1zx1eco3yfV+iV8VVJtUi/zscwoAJEUaDxnvvc91OACvKogVYnGpOOAK8NR+TX+NWCF+8NED7k3xqAKlpAAgyts+p83PNT/818OoD0H7PKpAikkAYPjZ57REVdIw0IBkOACvKiT+SiJ+9jltfKYxOBuc/GISSWs8qhBeCjMxRsLPPqfNzzV/d/47Jo7mRONRBSbKLD1aUtSgt4uXPlFa1VOFajgA37+U3lvech72Od10eJNnzDP3bR73NufCtH1aqpWWod7nFNVtQv5ofKZx6++2FmRm7wd4d/otOhare6slGsn8T3yfU7FSXIf3OS18BPO+lpSVAG93lrkimEG8zFhmetlEyRDvUs4Owc4F/7S/rKlM3613X0MzaYILQk4WePDPB+Vt5ZotGgFjSCCkJz4ejksrpJotGqfQu6YLPHHEc92j3qxOXCkFRGAVFhwLAKBqVgkbhsAqxIKx8GJYXolmniVrhJ9KFfVHxaViYWMQXgUmziRycwIivAqiElFkObdthpAjsAoESUjUkpA3r/uQrEdgFeSVcoIiFr/j681NlgisgrpVHV4IL0+kWEwinwisAm2lp65M5WWH3nQIqYK2U1uiKkH1TqEokVfJbX+zlbeiz1AXE+rNak2H8E+TmLyDPW7Y48a/xw0JRe9xQ0Jxe9xQUdweN1QUsccNIUXscUNIEXvcEFKsHje0FKvHDS3F6nFDS1F63JBTlB435BSlxw05/F66YsEYJaf0Vr3gb6XTgz1u+QJ73IoD7HEDwB63BNjjBoA9bgmwxw1A8Le12OMGgD1uCbDHbQXscQPAHrcE2OOGPW4AgD1uCbDHDQB73AB73AB73BJgj9tPFexxwx437HED7HFLgD1uANjjlgB73LDHDQCwx22laexxA+xxS4A9bgDY47YK9rgBYI9bAuxxWwF73FYofI/b/wFuRzTMjb0W2QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.513;4.blob,1.1,1732.iVBORw0KGgoAAAANSUhEUgAAAC8AAAA5CAMAAACRdoIYAAACqVBMVEUAAAABAQECAgIqKio+Pj4aGho0NDQREREvLy8NDQ0FBQUKCgosLCxHHUd/NH8GBgYeDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnwxMTEXFxeANIBDG0MICAgDAwMwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0SEhIrKytEqURCo0IfTB9n/2dHsEdU0FQyfDIEBAQJCQkGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PpkEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2tpHR0f///9BQUE4OIsfH0ynQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFlQICDaWFjxYWGVPDwuExNsbGzR0dGgoKAzM38CAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEtEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1jnGvEAAACJElEQVRIiWNgQAKMTEyMDGgAKIYuBAfMLCys6GJsLCzsONVzcHKhi3Gz41HPg8Th5YPQ/ESq5+MlSb2AoBBJ6oVFGEhRLyomTpJ6CUkpktRLy8BYRKmXlZMnSb2CohJJ6pVV4ILEqFcVVMOlHpj+QIARRb26BgMu9ZosYKAFUQ9Nz9o6CPN0UdVzc4IBOF2Smp51ObGkZ05OPVzqhwHQN8AhYWhkjE3YQB+XSSamWATNzC1wqbe0ssYUtLHFpZzBzt4BQ8zRyRmnegYXVzCFSG4MDG7uHiDK0wsEvFFYDAw+vn5A0h+c3AIg6gODwFRwCAiEorCAICwcSESAk1skWCAqOgZCx4JAHAoLCOIT0FyYmOSJ2/kMDMkpqagCaen4lDMwZGSicLN8s/Grz8nNQ+bmF+BXzlBYVIzMLSkloJ6hrJyQiqEJKipJU19VXUOahto60tTXNzSSpqGpGZ9sSyuIbGvv6Ozqhoj09FbgUtzXP2HiJCA9ecrUadNnzIQIzuqdjV31nLnz5i9YCGItWhzBwLBk6TKI+PIV2NWvXLV6DYS1dh2IXL8Bwtu4Cbv6zVu2btsOYkQu3QGidu6CiO9uwuH8PXv3Tdx/AMg4CDH/EET48BEc6oHg6LHjQPIExP0nwUKnTp/BrZ6B4SwQn+s4v+TCxakQgUu9l/GpB4MrVzvWX7sOYd+4eYugemRw+w5Jyu/em0WK8vs3H5Bk/MNHuGQAI+d/3ch52G0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.552;4.blob,1.1,740.iVBORw0KGgoAAAANSUhEUgAAAFUAAABeCAMAAABl7KirAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAABGklEQVRYhe3YWU5CYRBE4RaQWcUfHEAFFQUcURRnHGD/ezK5fZdQx8SkawHf+ykzYGsEWigCaGm9rEcr1ZoetXqjCagbmwBqWy0A3U51QG2nDqDupF1A3Uv7gNrtHQCqHR4Rar9KqIPeMcGenA4BtXl2Dqg2GhNqLBaLxWLo1M2ReermyDx1c2SeujncUzeHe+rmcE/dHJmnbg731M3hnro53FM3h3vq5sg9dXO4p24O99TNkXvq5nBP3Ry5p26OP2iYCfHC2MXlFcFe3xDqbYO4IWx6R6j3aQKos/QAqPbYJ9Q58sQ8TQn1+QVAK69vgPqePgC1tiA+o88vAP3+menR5aKkR62zAlD5omGkaDRMNEw0TDTMf2uYX7MHGO4yjNnqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.571;4.blob,1.1,724.iVBORw0KGgoAAAANSUhEUgAAAUUAAAASCAMAAAD7VjyUAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABDElEQVRYhd3WC1LCQBCE4WEVFUEREsIKKuGpATSgiG9RuP+dmM0dpruKPsB+VX9ltyJScge9I+Pzi35yXD4xdqg7PTMGin7iKufGDnPV2oU1EfqJu6xfWUO0NZqRuRH6iXNxy1xiLakDXn3tpxXbXuwpzq47AET7acCuvwFYlN3eARDtFz7DXgqwGOv7BMH00lBxMERYhI38GMEMhqHiJEZYhN37BwQziUPFbIqwCJt5yE9cNtWKjfkjwiLsKV8AFO2nFZf+GWBR9oJ48bWfVoxWrwCLsrQJQLSfVly/ASjO3vMPe0T7ifv86tpLrH3/mN+z0E9+V1Vrh7jS5s9YKPrJ+N+Y4W67MwaKfnsJCT0JKV1z+AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,1900.iVBORw0KGgoAAAANSUhEUgAAAPcAAAAlCAMAAACppI9FAAACIlBMVEUAAAAJFgkqKio+Pj4aGho0NDQREREcRhwwdjAvLy8NDQ0FBQUKCgoRKRE6jzoIFAgxMTEYGBgsLCwGBgYFDAVj9WMeSh4wdzBW1FYBAgE1gzUbQxtCpEJEqEQUMRQ8kzwDBwNj9mMGDgYUMhRm/WYLGwsqZyoraisBAwFd5l0oYyg6kDpMvEw5jDkdRx0BAQECAgI4izhOwU4CBAJe6V4mXiYFCwU+mT4oKCgUFBQSLRJn/mcNHw0eSx5j9GMECwQJFwkQKBASEhIrKysICAgEBARU0FQyfDJEqURCo0ILHAsPJQ8JCQkuci5Y2VgGDwZk92QcRRwHEQcSLBIKGApm/GYWNxYoZChc5FwBBAE9lj0ZPRlKt0o8lTxOwk44ijgkWSRf7F8CBgINIQ0fTB8ECQRi8mIgUCADCAMyfTJTzlMGEAYOIw4XFxc/nD9FqkVRyFFn/2cnYCdW1lYtcC0iVSIucy4AAQAVNBUIEwgyezIDAwMeSR4nYScraSsMDAX19WNKSh4FDQWkpEKoqEQucS5GRhz29mMODgYSKxIDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw00gTTQ0FR8fDIzfzNyci7Z2Vg2hTYhUiEYGAr8/GY3NxY9lT0aQRq3t0qVlTwLGgsMHQxZWSTs7F8GBgIEBAEFBQICAgEJCQTy8mJQUCAyejJ4eDGZmT46OhecnD+qqkUTMBM4iTgLCwUKGQqtET3EAAADKklEQVRoge1Z91cTQRBeEwWlKCAaAgoRLFgjKp6CqNEg9oYVSyKCxN4FK/besIu9967/n1f2snfvNruZZJN79/T7Ye7by8x8M/f2uDcLQjJ6IB2EOQQut7unxnq53Rmw2MzeVuYUuPpkZWssJwPYd27ffhaWly+sMhDAuq6CKO2v9V04YCAvyFMkG29xCV4S5uS+0aDBvKAij2xKy3x4SZij+84cUs6OqRg6TLbDR+hrwhzdd+XIUeyY0WMUO3acviaMpe8fr4JbUbx+JoB1KX2jqglMjYmTqmU7WSrFa8KIvirlN4VNcauYyswN8DPB2ne0Ano+Wt81tdNYGnXTZ8h2phTAa8Ki+rNUqdmmsGCWinpeC/H6mWDpm1RAz0frG81pYGnMnafY+dICvCYsql+vSi00haV3n5MK4t/naNFihsSSpcuUy3KpEd8gjPmepXmfc/JR+16xclVsidVrvMplbdM6fIMwpn569zkvH7VvtH5DbImNIe3qCet3CHP0d0xGeFNzrIDNtXhXtxTrtwiD6uN3z8/35ADrsvMZf6X33bqlTbbNERWVRoa2bsM+25t2WBi07zzt3dsJCqImyo8jn/FXV4H+dPxBw1yya7ds9uxVsc/I0P4Dus/BQ+0WBuw7R3v3skFBNGBddj7jr6w5NNCh4rCRGeA70mZhjnm/g9GnIz+No7DYwmNW9h//EMp9dldgDyoaWu0uwR4cP2GTsNC/p50nTwEjTpc18p1SAbHfkTNnoRHV50Tqxw+xfZ+/cBEYcUninFGlCGL7vnzlKjAiInUol4Rm6GRg6ZtdAa++a9ehBVS1KJY68woaQaiw9M2e4nkz/o2bXcACboUVS5t5aWdPwmDpmz3Fc2f823eABdxVzhyp+4h29iQMgvc5uncfWMCDh4pN6KwoGQje56j70WOQvvfJU+WS0FlRMhC9z9Gz5yD9F9JLkL8oCJ9/X71+A3EvCbXznQjevlPxns4A4P+/BPgh+fDxE8T9cx0o+5evKr7RGQCMvhM8y/r+A+D881cElLy7S8VvOgOA0bews6zY+BPKTWF2Fuw639IQqLFTPS34C0HjxthqgrkTAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAUUAAAASCAMAAAD7VjyUAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABLElEQVRYhd2WSVPCUBAGh+cuKgIRn6IS2RRccMF91///n5yXYzLHPkzRt3yHruoJlUKkFhaapdIz3Vv4ZHllldX6Ym29NNC9hU/CxiZq9UV9a7s80b3JJ2GnsctqHdFstSsb3Zt8EkK2h1o90WkYX0G6V316xf0orNYPB4fGSPeqT4XdeIRaHXF8Yox0r/rSa+nlqNUPp7FjzXRvL09X7A9YqxuGcWTNdG9/kK44zlirG87iuTXTveMsXXEyZa1uuIjmnxq6dzLVKzYvr1irG65nN8ZK96pPr3gb71CrI+6tLyDdqz69Ynv+gFodkbeMke5Vn17x8QmVeuJ59lId6V71SXh967JWT7x/VH53dG/yyee8jkp9Ufv6Li10b+GT0Q8q9cbvX2mgewvfP0kUQfiFK6hVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.609;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAABkAAAA4CAMAAAA/x6PCAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAA30lEQVQ4je3Tx27CUBCF4Uvvpl06hGpa6D0QSijv/0ogz1xNJHIWbCNmgf6jT0beWKnHuZQ5KefcnudyzuvzP1Ug+PgJhSM8pUiiMYunFEk8YaYUSTJlppQjaR3lJUWS0VleUiQ5neclRVLQRV5SJKVyhZcUv9tH1UwpklrYTCmSernBU4pENVs2bykSq93hLUWiuj3zJ1IvX99C8jkYIhqNkUxiRUTTGZK57gNZ6CV6aFVDsq4i2UyRfG0BhHbfQPb6ACRytIGcfgCcL4u/4Xr0gkeyNwC/7v1t/6tv+w7G7RjOT2pUEwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.647;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAUUAAAASCAMAAAD7VjyUAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABLElEQVRYhd2WSVPCUBAGh+cuKgIRn6IS2RRccMF91///n5yXYzLHPkzRt3yHruoJlUKkFhaapdIz3Vv4ZHllldX6Ym29NNC9hU/CxiZq9UV9a7s80b3JJ2GnsctqHdFstSsb3Zt8EkK2h1o90WkYX0G6V316xf0orNYPB4fGSPeqT4XdeIRaHXF8Yox0r/rSa+nlqNUPp7FjzXRvL09X7A9YqxuGcWTNdG9/kK44zlirG87iuTXTveMsXXEyZa1uuIjmnxq6dzLVKzYvr1irG65nN8ZK96pPr3gb71CrI+6tLyDdqz69Ynv+gFodkbeMke5Vn17x8QmVeuJ59lId6V71SXh967JWT7x/VH53dG/yyee8jkp9Ufv6Li10b+GT0Q8q9cbvX2mgewvfP0kUQfiFK6hVAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492316202;4.copy,1.1,2.20,3.190,3.940,2.19,2.14,1.1,1.0,3.190;4.copy,1.1,2.40,3.209,3.920,2.19,2.14,1.1,2.20,3.209;4.copy,1.1,2.50,3.228,3.910,2.19,2.14,1.1,2.30,3.228;4.rect,1.1,1.2,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,2.60;4.blob,1.1,956.iVBORw0KGgoAAAANSUhEUgAAADoAAAAzCAMAAADxauvSAAABIFBMVEUHBweTk5MsLCwAAABiYmJlZWUqKiqUlJQICAgCAgKKioo7OztTU1N0dHQbGxuYmJgTExN9fX1KSkpERESCgoIODg6Xl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5c8PBiJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxuckKq/AAABZklEQVRIie2UZVMDMRBAA8Hd3WmxluLubqW42///F3C5hL292YS9fGGYYT/03rZ507nKE6KoWIYDxBshS0oNAzHVsvIKzUBMtbKqWjMQU5U1tWYBYqp19Q16AWKqsrHJbEBMtbnFbEBMtbWtXW9ATFV2dJoViKl2dffoFYip9vb16xWIqcqBQbMDMVWv+VeTqlRqXNGJviuVGkd0oiqVGkd0oiqVGkd00MdEpcYeHaRSqbFHB385VGqs0cEqlRprdLBKpcYandiviUqNLToxlUqNLTpiaFhNKlyp1IQE5wyJ9IiaUX2OSo0iOGdIjI2rmaDvBwbOGfr1/+vfVDNZbzWb8VUnc1O+6vQM24ypqdk5dZ3/fsZBWF1YXApeWl5ZXfu6rm84CaubW8Hj9s7u3v7B4dHxiZOQenqWDy7nBSkvLq+uC25C6s3tHdzQ/cMPhNTHJ5lgoupz7sVXfX1LYiL1/SOR+gn6RVlyNKGuJAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.214;4.blob,1.1,6876.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;3.end,1.1;4.sync,10.6492316300;4.copy,1.1,2.20,3.190,3.940,2.19,2.14,1.1,1.0,3.190;4.copy,1.1,2.40,3.209,3.920,2.19,2.14,1.1,2.20,3.209;4.copy,1.1,2.60,3.342,3.900,2.19,2.14,1.1,2.50,3.342;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,2.12,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.383,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.478,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,2.41;4.blob,1.1,1288.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAABj1BMVEUHBweTk5MsLCwAAABiYmJlZWUqKiqUlJQICAgCAgKKioo7OztTU1N0dHQbGxuYmJgTExN9fX1KSkpERESCgoIODg6Xl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxdWVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwxMTFvb2/m5ubMzMxQUFDl5eUpKSlFRUVCQkJLS0sEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5c8PBiJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxu3/3a0AAAB8UlEQVRYhd3U1W4DMRBA0W1dZmZmTpmZU2ZmZmamD2/sTToPmXFreStVnYfsOMpehXQMw8OT6Y7BvLwtiPj4+ulH/AMC9SMsKNiCSEhomH6EhUdYEImMsiASHROrH2Fx8RZEEhKT9CPJKan6EZaWbkFEc/5dJCPTgkhWdo5+hOXmOdcvKFXJdETyCwrNHaBUJJN/sUXF5g5QKpLJIyW2UrEDlIpkCgpsZeYBoFQjU/xPyivMA0CpRqaIVFY5TwClEpkiUl3jPAGUSmSKSG2d8wRQKpHJI/UNja4jQKlCJo942ppcR4BShUweaW7xdx0BShUyeaQ1HM4ApQKZjkhbe/SPX05FOlo6NRuOSFe3buNPGftbEQxKGZn4O8GglJCJRzAoJWTiEQxKCZnEF4tBSZNJRDAoaTKpnxiDkiSTimBQkmRSEQxKkkzyH4tBSZFJRjAoKTKNnl4xdsZg44NBaW7udxh9/WIGGINNDAal2NzvMAaHxAwzBpt83O/44578x8jIqAWR0RH9yNj4hH5kcurHDTJin54R19mvZyQbFZmbX+AvWlxaXnFcV9ekGxVZ3+CPm1vbO7t7+weHR9KNiByfnPLL2TljF5dX1+fyjYjc3N7BB79/+GYjIo9PxMdEB488j7/oR17fVBpE5P1DKfIJiEed6WpwWS8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.823,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.326;4.blob,1.1,2592.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.364;4.blob,1.1,1956.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA0CAMAAAAE725BAAACu1BMVEUAAAB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxsKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwltbSwBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViN+fjOZmT54eDECBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNBQRqGhjYiIg4pZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cKCgRkZCmXlz1NTR8LCwUTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8wMBODgzWRkTscHAsAAQAUMhQxejEwdzD19fWNjY1a3lo3iDd6ejEQKBAtcC07kjutra1EREQBAwFl+WUsbCwoKBALGwspKSm3t7dfX1/t7e0UMRQ6OjrExMSXl5cODg4tby1d5l1SzFIyfTIgUCBc5VwRKREcRRwbQhseSx6TkzwqKhE7OxgTEwh9fTNERByCgjVubiw1NRaOjjkEBAHIyFFgYCdmZikt4P6pAAACu0lEQVRIiWNgQAWMTAzYATMLK3YJNnYMISZGHIYwcHBiF2dnQxfh4ubBZQgvHz82YQFBIXQhYRFcZjCIioljE5aQRBeRkpbBaQiDrBwWQXkFRXQhJWUVsIwqCKihsBgY1DU0MQ1R19JGF9LRBVN6+iBggMICAkMjTEOMTdBFTM3MIbQFCFiisIDAyhrDDBtbO3Qhewd5TLsQwNHJGV3IxdUNXcjdA58ZDAyeXugi3j7oIr4afvgN8Q8IRBUIEgxGVxMSit8MBpuwcFQBJcygjogkYAhDVDQqPyaWkI5RgALi4qlgSEJiEhVMSU6hgiGpaelUMCUjk2QtWdkgMic3L7+gECJSVFxCpF6/UhBZVl5RWQWkq2tq6+obGiFSTcXNuHSJqoEBuAyQd25pbWNgaO/o7OruAQn09vUzMEyYOAmidPIUXIaYtIIBFwOD2tRpXibTgUIzZs6aDZGcMxdEzpsP4S3owmVIkCYYLGRgWLR4yVKw0LLlK1auAjFWT1wDotaugyhdv4GwdzZu2uy/BSy2ddv2yh3lQMZOiEt2QZTu3kPYOwxuXHtbGaFl5r79B4DkQUiYHAILHT5ylLB3QOBYpBZM4jgQn8g7OeHU6VqIQFbxGVyGoAPUivfsubx55y9A2BcvlRFrCG5w+QrlZly91kSxGdcv3aDcITdvUW7GsAA424cIgNa21L6NWXnjah8iAHrb0sQYQwmO9iECYLQt79iqoqvB0T5EAIy2pbzHXQxFWNuHCIClbenjjaEKa/sQAaBtS2TAI3gPQxm29iECQNuWKOA+ZoxiaR8iAKxtiQIePMQQwtI+RACsbUv+xb4YYpjtQwTA3rZ85I8hhNE+RAAcbcvHT56iC0Hah4HgFr2qKDILV9tSbfNGDDFw+/AZuEWv/xyZhbNtKfMCu/gxcIve4h4yCx8AAGfOqOuJ/Ku1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.421;4.blob,1.1,4308.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.513;4.blob,1.1,2652.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;3.end,1.1;4.sync,10.6492316406;4.copy,1.1,2.30,3.190,3.930,2.19,2.14,1.1,2.10,3.190;4.copy,1.1,2.50,3.209,3.910,2.19,2.14,1.1,2.30,3.209;4.copy,1.1,2.60,3.228,3.900,2.19,2.14,1.1,2.40,3.228;4.copy,1.1,2.70,3.342,3.890,2.19,2.14,1.1,2.60,3.342;4.copy,1.1,2.80,3.361,3.880,2.38,2.14,1.1,2.70,3.361;4.copy,1.1,2.70,3.380,2.10,2.19,2.14,1.1,2.60,3.380;4.copy,1.1,3.110,3.399,3.850,2.19,2.14,1.1,3.100,3.399;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,2.22,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.345,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.367,1.8,2.67;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.383,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,2.39;4.blob,1.1,1264.iVBORw0KGgoAAAANSUhEUgAAAE4AAABICAMAAABvLTMyAAABnlBMVEUAAAAYGBgLCwtUVFTPz88PDw+ioqKvr68HBweTk5MsLCwVFRX19fVJSUliYmJlZWWcnJy9vb0qKiqUlJQICAhISEj///8XFxcCAgKKioo7OzsODg5WVlZTU1N0dHTo6Oh/f38bGxuYmJgTExPX19eVlZV9fX1KSkrT09OdnZ1ERESCgoLe3t6IiIiXl5chISEDAwP5+flsbGxubm5ZWVkxMTE1NTWOjo4EBARvb2/m5uYFBQWRkZEwMDDMzMxeXl5mZmZQUFDl5eUpKSlFRUVCQkJLS0sGBgbIyMhgYGAoKCg0NDQEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5c8PBiJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxuufJsNAAABz0lEQVRYhe3W50/CUBQF8OdW3IqI4h64Fbfi3nsL4sK998a913+tfQU04dpS7zXRyPnAOyXt+dT8Usa8vBllfHz9SPf8A8QzMEhFMRccEiqWsHCKORYRKZ5R0WqKuRhNLD+1cfEUczpNglgSkyjmWHKKeKampVPMZWTaiz6LYi47x15y8yjm8gvsRVdYhF8zFJc4amkZfk6lKXfUisoq9Fy1UeuoNbV16Ll6/UdvaMSuNTXrsBOf0mJsJVxjbe2Uaz+XP8c8CnyAeRT4rsyjwHdlHgU+wDwKfFfmUeADzGPAB5jHgA8wjwAfZP774IPMKwK/Q81j4Bcg84rA79TwdPELmHkl4Hf38PCXy8P8/wnEPAZ8iHkE+BDzCPAh5jHgQ8wjwIeYx4APMY8AH2IeAT7EPOYLH2Ie8YUPMf8l+L19PP1wEwIxLzbgiYFBniEGNh6Ied6AJ4ZHeEYZ2KSj/AlPflVMZtI5s4lybcwyTjk3MUm51j81zU+r8x/pJpOZ2Tnh9vmFxaX3c3lFssnPra4Jv+sbm1vbO7t7+weSTXbt8OhYOE5sjJ2enV/YZJpcLq+und16c+tWk8jdvfw97ufB8kg59/RMucZeXhXd/gYn8I6sCRsnYAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.203;4.blob,1.1,7836.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492316509;4.copy,1.1,2.30,3.190,3.930,2.19,2.14,1.1,2.10,3.190;4.copy,1.1,2.50,3.209,3.910,2.19,2.14,1.1,2.30,3.209;4.copy,1.1,2.80,3.342,3.880,2.19,2.14,1.1,2.70,3.342;4.copy,1.1,2.90,3.361,3.870,2.38,2.14,1.1,2.80,3.361;4.copy,1.1,3.130,3.399,3.830,2.19,2.14,1.1,3.120,3.399;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,2.32,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.326,2.35,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.383,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.444,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,2.20;4.blob,1.1,1320.iVBORw0KGgoAAAANSUhEUgAAAFgAAABbCAMAAADA37KoAAABnlBMVEUAAAAYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgLMzMx9fX1QUFDl5eUpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJQICAiKioo7OztTU1N0dHQbGxuYmJgTExNKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQGBgYFBQWRkZEwMDDIyMhgYGBeXl5mZmYoKCg0NDQEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5c8PBiJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxtSddnhAAAB+klEQVRYhe3XVW9CQRCG4a07pe5K3d3d3aHUqLu7u//rlm26kDDlnA0zJCV8F2VoOO8VyRMY8/BkNPPy9iEq+/oRhf0DAonKQcFE4RBNKE1YqwmjCbPwCKJwZBRRODqGKBwbR9ONT0ikCSdpkmnCKalpNOF0HU03I1NL0s1KzSbpspxcmq4z9o+RystPwg0LpAoKccMCqaLiEtzwL1JppWW4YYFUeQVuWCBVWVWNGxZI6WpwwwKp2jrcsEBKW9+A2bVCqrEJM2yFVHNLq2OtthK+eP7GCqn2jk7Hwl0avm7+xhqpnl7Hwn39fPxr60bKiXMJpJC4ApBC4soWKSSubJFC4gpACokrW6SQuAKQwuEKQAqHKwApFK5ApDC4ApGS4spCkzJSUlxZaFKBlAxXFprcSLknOwgpHK4gpFC4gpBC4QpCCocrCCkUriCkcLiCkELhCkIKhSsIKZxfVxBSKL+uIKT+5GpgkG9I6TIPQurnAp4YHuEbZQoXH4QUv4Anxsb5JpjCZX/yT7jnMtMbiMIGPU130jhFE56eoekOzc7xV5P4j/1L9eYXFs0PLi2vrH6/rq3bvWTCG5vmv1vbO7t7+weHR8d2L4nuyemZ+eX8grHLq+ubC4VL/W7v7sVtenhUdana07PMp9XvxfhKE357p+myj0+pj38BRbSrthUaxGIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.783,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.316;4.blob,1.1,8064.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;4.blob,1.1,444.SNqTGvxtAUl7EoS/LSBpT4LwtwUk7UkQ/raApD0JwtwW5q1mtVGNKpIYrAWQtAc4QNIeAIALJO3JCCTtAUwgaU92IGkPcICkPcABkvYAB0jaAxwgaQ9wgKQ9wAGS9gAHSNoDHCBpD3CApD3AAZL2AAdI2gMcIGkPcICkPYAPJO0BIHuQtAc4QNIe4ABJe4ADJO0BDpC0BzjgvzQZkvYkCH9bQNKeBOFvC0jakyD8bUFA0p70SKItIGlPaiTxjwFJe1KDvy0gaU+C8LcFJO1JEP62gKQ9CcLfFpC0J0GQtAckBpL2AAdI2gMAcIGkPRmBpD2ACSTtyQ4k7QEOkLQHOEDSHuAASXuAAyTtAQ6QtAc4QNIe4ABJe4ADJO0BDpC0BzhA0h7gAEl7gAMk7QEOkLQH8IGkPXn5PzACealdpHnJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.513;4.blob,1.1,1956.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA5CAMAAAC4cX2fAAAC6FBMVEUAAAABAQECAgI0NDQ+Pj4REREqKioaGhoKCgovLy8NDQ0FBQUGBgZHHUd/NH8sLCweDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnwICAiANIBDG0MDAwMwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCAxMTEXFxdW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi2bhcbOAAACjElEQVRIiWNgQAKMTEwM6AAoxohFDEMdHDCzsLCii7GxsLATow4OOFixGMLJxU2MOgTgQZLk5YMYwk9AHV5JPl7KDREQFKLcEGERBooNERUTp9wQCUkpyg2RlmGg2BBZOXnKDVFQVKLcEGUVmBD5hqgKqlFuiLoGXIhkQxg1oZJa2kiGYCkKNPEYQp2igItLB11MkwtLUYBF3SjAD3T1cEjoGxgSrUNPF5fxRsbYxTF1mJia4TLE3MISmzAWHVbWuMxgsLG1wyaMqcPewRGnIQxOzlgEsehwcXUDUe4eIOCJwmJg8PL2wTQEqgMZ+PqBKf8AEAhEYQFBUDCmIVAdSCAkNAxCh4NABAoLCCKjMMyA6UAC0THumHYhQGxcPBE6EhLxmcHAkJRMWEeKdyp+Q9LSM7DrADZYQABUemVm4TeDITsnF1UApiOPBQzygcyCQgKGMBQVo/JhOoClFAhglF6jAA2UlFLBkLLyCiqYUllFBUOqa2qpYEpdPclaGhpBZFNzS2tbO0Sko7OESL2GXSCyu6e3rx9IT5g4afKUqdMgUtM7Z+DS5Qku7TzAZYD9zFkBsxkY5sydN3/BQpDAosVLGBiWLlsOUbpiJS5DjMClXcAqYIZcvWat3zqg0PoNGzdBJDdvAZFbt0F423fgMiQFXNqF72Rg2LV7z16w0L79Bw4eAjEOLzsCoo4egyg9XkfYO7knTiafAoudPnO279x5IOMCxCUXIUovXSbsHQb3VVcCrl6DCF+/cRNI3oKEyW2w0J279wh7BwTuP3gIk3gExI9bnix9+mwSROB55wtchqADLxTey1ctW1+/gbDfvntPrCG4wYePlJvx6fN0is348u4r5Q759p0k5QDPk7AJq/NA6wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.570;4.blob,1.1,1780.iVBORw0KGgoAAAANSUhEUgAAAPYAAAAmCAMAAADA8pbVAAACClBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsxMTEYGBgFDAVj9WMeSh4wdzBW1FYFDQU8kzwSLBJCpEJEqEQmXiYucS4cRhxj9mNm/WYLGwsSKxI+mT4BAwFd5l0oYyg6kDpMvEwDCAMVNBUBAQECAgI4izhOwU4CBAJe6V4fTB8oKCg+Pj4UFBQSLRJn/mcNHw0eSx5j9GMECwQ0gTQkWSQSEhIrKysICAgNDQ0EBARU0FREqURCo0IzfzMJCQkuci5Y2VgGDwZk92QcRRw2hTYhUiEKGApm/GYWNxYoZChc5FwBAgE9lT0aQRpKt0o8lTxOwk44ijgLGgsMHQxf7F8CBgINIQ0bQxsAAQBi8mIgUCAyfTJTzlMyejIXFxc/nD9FqkVRyFFn/2cnYCdW1lYtcC0TMBM4iTgKCgoFBQUQKBAIEwgKGQoRKREJFgkwdjA6jzoIFAgMDAX19WNKSh41gzWkpEKoqEQUMRRGRhz29mMODgYqZyoraisDAwHm5l1jYyg5jDkdRx2LizjBwU4FCwUtLRL+/mcfHw0JFwnQ0FR8fDILHAsPJQ9yci7Z2VgHEQcYGAr8/GY3NxYBBAE9lj0ZPRm3t0qVlTxZWSTs7F8GBgIEBAEFBQICAgEJCQTy8mJQUCAGEAYOIw54eDGZmT46OhecnD+qqkUiVSIucy4LCwUyezIeSR72/57BAAAC6ElEQVRoge2Z91cTQRDHjwAqaBAUsRyWEFFRQdRYsPcWW1QEsXeNYkexYhe7qNh7r/+jcZMLuczu7E5yl3uXx+eH8H07O9+ZeW+Py100rRuDHI/THThCbl6+0y04Qo+eDhXuVUDaXti7j2yLt0g9o29xCam8ZRDH1vr1l+0o8hIySgfQylsFdeyygTn4htxBgwkZQ3SJnU1Qxy4fOgzfMHwEJcOnV4hC/pEMaUeq+0wgY/P9KkehfqPHlCYvoRmVVewPq+Q3RcaOY4xHyxH2mYBjxzvg+1XXTMD8aidOSl5CMyYH/n9OYZWmmiLTpjPqsGqUfSbA2F0dCPxm5GF+M2fBNSxjNjscdazSHFMks4e8qwOB39x5iN38BQvhIpaxaLEokuFDLvNbsnSZ2G75iiBcRDKCK1eJQpk95HK/1WvEdmtDvFVxxjp9PdqeXVBvYBECG+pFoY013G9d4oyGUCOldOy688t3SoiNjfuZo/mbmiKf9T5GeaLSNm/h5kczeGytpXUbve62kZK4RgUKfknR7TsiHzt3MXYnKm3PXr4By+Cwb7+P1O2B6HV3kJTEIzY27seLhisYhxIVlcOhZnqSJaRwbVtHuNrB4t3YzBGOyn7KjkKV/TQfOw6UU/9aUq574uQpml+wpQEo942tnT5D82st9gDlwrHPnjtP8rtwESoXjn2p7TLJ78pVqJK+G6faCh3QJt5BYvTadRU/gxt6K1Dx7dxnXIueOriANvGn9sTozVvtCn4Gt/UwUPHtvGdc3osmywBt4k/tpuiduwp+Bvf0+0Chh5z3osky0jjk2oOHCn4Gj/QSoPBDbidpHHKt4/ETuZ/B085nQKGH3FbSOeTa8xdyvzjeAFQuvIFFePnqtbpfVQtU1PJv3jLe8RUB+a8iyC3k/YeP6n6fOj8DRR37y1fGN74igNRVeHH1/QfB7+evRqCIY3e0M37zFQGkbkovrhA/z58moFx5bRP9Cv9CleX8A7Wp2nSUDRzyAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.571;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAzFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR5IT15yAAAAm0lEQVQokeXPRxaCYAwE4J9YAQ2KqFgAG1jBXrCX+9/JySlcuPkWecnkjVIaEalMNgcpXxCLugHJLIllVtDiCqSqLdYcsW6KjSZ0W23Y4S70/AD2+rgdDC1SIz9EZjSWL0S/cyJOZzCcLxS5sYd5omtwuZKd9QZuOYE7juCeD/DIBjylZ9m5OKIdi9f0Jsn3h/TVni/Jf3/+oeMX26AU+VKA3H8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.590;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.609;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABkAAAA4CAMAAAA/x6PCAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4rKYypAAAA40lEQVQ4je2TRw7CMBBFQ6ghYCC00EINvXcIvdz/SkDGZpCSWbBE4i+s9/1ky4uxJLnEI7vtvuL1+SkVCFImpIQppUYoE2UewsRYnDqU0CiTTFEmrVImkyWEnssTpsCKhCkZZcJUqoSo1WPuomGYxJFmixAfabuQnU7XSXbMXt9Bg+Fz0UclXpHAjBUxQ0hgJlNRkcDM5qIi2WbBxrwhgVmyJm9IYFZszRsSmA0T44gEZmvteEPib9u/5wcJjDYSFQnMwTryigRGOp3FNCCBkS9X3pHASLe7uATp6/z/tp1f/dsPN/sbhOdWwQ0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.628;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492316616;4.copy,1.1,2.50,3.190,3.910,2.19,2.14,1.1,2.20,3.190;4.copy,1.1,2.70,3.209,3.890,2.19,2.14,1.1,2.40,3.209;4.copy,1.1,2.80,3.228,3.880,2.19,2.14,1.1,2.50,3.228;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.890,3.532,2.70,2.38,2.14,1.1,3.880,3.532;4.copy,1.1,3.900,3.570,2.60,2.19,2.14,1.1,3.890,3.570;4.rect,1.1,2.42,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1420.iVBORw0KGgoAAAANSUhEUgAAAGIAAABsCAMAAACmcZdMAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTEGBgYICAhvb2/m5uYCAgLIyMhgYGDMzMx9fX0oKCg0NDQTExNQUFDl5eUpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXAcLwAAACRklEQVRoge3Z51MTQRzG8Q0qihRjLLQoGkGJgCKCUu1dwYiaAAKRroCVGgQBkfZf461xk5n82M1e9mEcZp8XuQ3D3fflZybHGGOeLIaeTdiETdiETdjp7MBBeOJQ9mF440gOPHE0Nw/eyC+AJ455j6MTPu8JdIKdPAVPnC6EJ4qK4YmSUnTBf+YsOlHmPQd46vkAn59/uVBeAUhc9PJd4l8qg4ACu1zFV+2ca674EImkXS2vBRfYtTp0YW+3z4i9Xl+GSghiG26gEoLYm40BVOIfsRVNzaiEILalFZUQxLbdqkYlBLHB26iEIPbOXVRCEOu7dx9TSCL2wUNMIonYR4+fZPasBKy7Efv02fPMEglYdyX2RXtmiQSsltj/fPuWWOPYEsQaxzaVWOPYphJrHFuCWOPYphJrHFuCWNPYEsSaxpYg1jC2JLFmsSWJ1cKWglVNrBa2FKxpEKuDLQWrJdYuo2n+8k8Rq8JW9+UCRawCW90ERawCW90ERawCW+23MBSxcmy1ExSxcmz13yVRxEqx1U9QxEqx1U9QxEqxdfHSjSJWhq2LBEWsDNt4ouMlX0h1ckYR+/dE3xFPeF7xdapOfBSx/ETfEU+8fsP3VnWSj77DvmO1UywcgSciYXShq7sHnXjXiy6E+vr5NSr+Ij+52PuBQecRQ8Mjo3+uYx+kJ3eJj+PO58Tkp89fvn77PjUtPbkqzMzOOZf5GGMLPxaXYoqTm2X9XBbn6MpqWifN/Vpzd1/6+929jk5sbKILbGtb6993AHiAtYl9dFsRAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.203;4.blob,1.1,1000.iVBORw0KGgoAAAANSUhEUgAAAC4AAAA8CAMAAAAueXiVAAABd1BMVEUAAABUIlSZPpkFAgVWI1aYPpgCAQJnKmeCNYIJBAmSO5JCG0IyFDIBAAEIAwgHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwEAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxtHRx1/fzQsEiyVPZUvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxuVVK/pAAABMUlEQVRIiWNgYGRiZoAABAsPYGFlw2DhAewcmCzcgJOLG4OFB7Dx8GKwRgFZgI8PHwsd8AsICuFkCYuIiolLICuXlJLmx8WSkZWTV1BUItadyiqqDAxq6hpEKtfUApHaOsSp1lXXA1H6BkSabggx3QhZDE9AGkPcboKkGl9AmoqaqZlbyCEbji8gGSytRLWtbYh0+igYRAB/5kPPhngzHxILCGztCKQZJJa9g6OTM7EudnF1c/fwJFY1g5e3jy/RihkY/PwDAoNIUB8cEuoU5sBAQkCGR0SSFJAMUcQH5CigOoiOAVOxcTxQAQQLG4iJhtDxCYkM6CxMkJScQopbUtNIUZ2ekUmK8qzsHFKU5+aRojq/oJAU5UXFJaQoLy0jRXV5cgUpyiurSFHNUF1DimoAs9wthEySJjkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.326;4.blob,1.1,7544.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.513;4.blob,1.1,964.iVBORw0KGgoAAAANSUhEUgAAABIAAABcCAMAAABUQhV5AAABd1BMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnwBAQECAgKANIBDG0MxMTE+Pj4XFxcKCgoNDQ0FBQUBAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnESEis+PpkDAwgVFTQ4OIsfH0w0NIEkJFkzM382NoUhIVIBAQI9PZUaGkELCxoMDB0bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0CBgIBAwFRyFEnYCcQKBAIEwgMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWjz5KeAAABFUlEQVQ4je3TR09CQRiF4aHYC/aCqIgFRRELouhFBBUbCth7r9h7/fHmTm7i5JylcUHiuzo8+XLDZoT4VSYzkdmEYrFmIWXnoOTm5SMVFBYhFdtQSkrLkMorKpGqqlFqrLVI9jpjOOplDiEaGg1yNslcynlzi6wVP5Nhtbn12tXV4dHrFMrq8up1C3VlUL4eot6+fjL/AFFgcIgsOEw0ovmQQtoonYXHiCJRovEg0cQkSmxqGmlGm0Wai88jLSRQkqkQyGJ8CY+WV+hP/We0Kl+Oe01Z6/LleDbEz9qUL8e7JZT1t23v7JLt7RMdHB4hHZ+c0tnZOdFF+pLs6pro5pbo7v6B7PGJ6PnlFent/YPOPr+UH99bVC8iDch9ZAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492316715;4.copy,1.1,2.40,3.190,3.920,2.19,2.14,1.1,2.20,3.190;4.copy,1.1,2.60,3.209,3.900,2.19,2.14,1.1,2.40,3.209;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,2.50,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.90,3.361,3.790,2.19,2.14,1.1,2.90,3.342;4.copy,1.1,1.0,3.380,2.40,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.100,3.380,3.770,2.19,2.14,1.1,3.100,3.361;4.copy,1.1,3.160,3.399,3.800,2.19,2.14,1.1,3.150,3.399;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,1.4,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1500.iVBORw0KGgoAAAANSUhEUgAAAGwAAABsCAMAAAC4uKf/AAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAACgElEQVRoge2a+TdVURTHL5KxvJ4UUoTnqQxNqCgZMlVoMlRCCmVsRoM0qP5r3WM591hvO2+fd/e+1uJ8fnh3r+/y3ufXz1qX46gkJTvBYWVWZmVWZmX7Sba3SDmA20hIPZiG2mhIz8BtJGRmZaM2Gg4dxm0k5ISOoDYSwqFc1EbD0TzcRsKx47iNhPwC3EZC4QncRkHRyVOojYTiUAlqI+F0aZn7KI8IitSNnoqoeFSGBGfUjZyz58LiWVUtqFE3ampLz6M2Ei5cxG17DbZAgOALBIitQLh0uZhfJgOhrp5fJgOh4UqEX7YVCGVXr/HLZCA0NvHLZCBcv1HDL5OBEG3ml8lAuNnCL5OBEG5t43YpgdB+i1umBEJHZ5e/3/JiALqcbYHQ3XPbn8yLAehytgfCnbv+ZF4MQBdfIECwBQKEDQRidjsQGFMBCATGVIgNBMZUiA0ExlQAAoExFWIDgTEVgEDgSwUgEPhSAQgEtlQAA4ErFcBAMEoFfRbEDwSjVNBnASIQTFJBnwU2ECy7huFbJigQ8Klg+koLCgR0KpjKoEBAp4KpDAoEdCoYvxmEAgGbCsYyKBCwqWD+zhMKBGQqmMugQECmgrkMCgRkKiTw6hgKBFwqJCCDAmHHVOjtE/SrMm/TXy5QIGxewDeS7gnuqzJv018CKBDEBXzjwUPBI1XmbfpLT7xv2P8tsJAzMBigbHAgONfQ8OPgZE+eBufqH3kmnqNy0V++GBt/7v7YxIuXk/+fU9Pay6/s1Wv3c2Z2bn5h8c3bd++1l0/Xh4+f3MfSsuOsfP7ydTnO5Y/kb6vyHv2+hroS5sdPv7+A59fw7+Bk63+Cczl//xn9+QaSqsg5YhT2hQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.733,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAAEMAAABHCAMAAABrhQpXAAAC+lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4MBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVe2x4JAAACf0lEQVRYhWNgwAsYmZjxKyAGsLBSbgYbOwfFZnBycVPuEB5eys3g4xeg3BBBIcrNEBah3AxRMXHKDZGQpNwMKWkZis2QlZOn3CEKipSbMQoGE1BSRuGqqKqRboayEipfXYNkIzS1tFEFdHT1SDVD3wBNwNDImEQjDE1M0YXMzEk0w8JSBV3ISsuaNDM01DHFbGxJMsJO1x5T0MGRJDOcnF0wBV3d3Ekxw9wMm6iHJwlGeGl5YxP28fUj3gz/AKzCgUHBxJsREopdPCyceDNGAT4QQbkRkVEUGxEdEwthxMUnkGlEYlIyA8yMFDLNSE1Lh7Iy4jNxqMnKzsFrRm4ejJVfAKELi4rR1JSUlpVXgFmVVWBQjSpfU4tual19Q2MTqlBzS2tbeweQ0dkFBt0osj29qRhO6+ufMHHSZDTBKVO7pjEwTJ8BBjNRpGb1zsYwAwjmzJ03H5m/YOGixUuW4vDLst7lmCasWLlq9Zq1CP669Rs2btrMgMsvW3q3opuwbfuOnbt2I4vs2btvP4SF1S8HDh5CN+PwkaPHUEWOn8B0KzI4eQpd5PQZ/DogwC8QDAxB7LNJxOjABOfOg8EFEPviwUtkmXH5ChhcBXOuXb9BnkuQQPrNWxSbwXD7DuVmDG2Asw2I1la8e+8+bkNwtQHR24oPHuI2A0cbEKOt+OjxE5xm4GgDYrQVnz57jtshWNuAWNqKL17iNgNrGxBLW/HV6ze4DcHWBsTWVnz7DrcZWNqAWNuK7z/gNgNLGxBrW/Hjp8+4DcFsA2JvK375itsMjDYgjrbit+8/cJoBaQMilYo42oo/f/3G7RBwGxCpVMTVVvzzF7cZYIBSKuICAM+rwi6za9N1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.345;4.blob,1.1,1872.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAAC61BMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxsKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwltbSwBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViN+fjOZmT54eDECBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNBQRqGhjYiIg4pZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cKCgRkZCmXlz1NTR8LCwUTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8wMBODgzWRkTscHAsAAQAUMhQxejEwdzD19fWNjY1a3lo3iDd6ejEQKBAtcC07kjutra1EREQBAwFl+WUsbCwoKBALGwspKSm3t7dfX1/t7e0UMRQ6OjrExMSXl5cODg4tby1d5l1SzFIyfTIgUCBc5VwRKREcRRwbQhseSx6Y4HkFAAACS0lEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDQlKKckOkZSg3g0FWjgqGjILBCeQVcEgoKiljl1BRxRBSkMdlvJo6dnFVFXQRDU0tXIZo6+hiE9bTN0AXMjTCZQaDsYkpNmEzc3QRC0srnIYwWNtgEbS1s0cXcnB0Ass4g4ALCouBwdXNHdMQVw9PdCEvbzDl4wsCfigsIPAPwDQkMAhdJDgkFEKHgUA4CgsIIiIxzIiKjkEXio2zxbQLAeITEtGFkpJT0IVS0/CZwcCQnoEukpmFLpLtloPfkNy8fFSBAv1CdDVFxfjNYIgqKUUVcMAM6rJyAoYwVFSi8quqCekYBSigppYKhtTVN1DBlMYmKhjS3NJKBVPa2knW0tEJIru6e3r7+iEiEyZOIlJvzmQQOWXqtOkzgPTMWbPnzJ03HyK1YOJCXLqMXcAAXAbYJi5avISBYemy5StWrgIJrF6zloFh3foNEKUbN+EyJGgxGGgwMLhs3pIRtBUotG37jp0QyV27QeSevRDevhW4DClwB4P9DAwHDh46DBY6cvTY8RMgxsn1p0DU6TMQpWfPEfbO+QsXcy+BxS5fuTr92lQg4zrEJTcgSm/eIuwdhhSN24vloWXmnbv3gOR9SJg8AAs9fPSYsHdA4Em5B0ziKRA/63m+7sXL2RCBjomvcBmCDlAr3tdveva8fQdhv/8whVhDcIOPnyg34/OXBRSb8fXDN8od8v0HScoBp8CqBRExuPEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.402;4.blob,1.1,5620.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;3.end,1.1;4.sync,10.6492316819;4.copy,1.1,2.50,3.190,3.910,2.19,2.14,1.1,2.30,3.190;4.copy,1.1,2.70,3.209,3.890,2.19,2.14,1.1,2.50,3.209;4.copy,1.1,2.80,3.228,3.880,2.19,2.14,1.1,2.60,3.228;4.copy,1.1,3.110,3.342,3.850,2.19,2.14,1.1,3.100,3.342;4.copy,1.1,3.120,3.361,3.840,2.19,2.14,1.1,3.110,3.361;4.copy,1.1,3.140,3.380,3.820,2.19,2.14,1.1,3.130,3.380;4.copy,1.1,3.180,3.399,3.780,2.19,2.14,1.1,3.170,3.399;4.copy,1.1,3.830,3.418,3.130,2.19,2.14,1.1,3.820,3.418;4.copy,1.1,3.880,3.551,2.80,2.19,2.14,1.1,3.870,3.551;4.copy,1.1,3.890,3.570,2.70,2.19,2.14,1.1,3.880,3.570;4.rect,1.1,2.14,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.402,1.6,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1576.iVBORw0KGgoAAAANSUhEUgAAAHYAAABsCAMAAACINLbeAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAACuUlEQVRoge2aV3fTQBCFN6F3YzoEAgkh1NB7Cb2X0BJCC733Hnov/xq8HMvK0Wi4I11bYPQ9eOdczfq+fseyczINjTEPqktem9fmtXltXpvXZlNb/wwajGVkhgwdBmVsho/AMjIjR42GMjZjxmIZmXGF8VBGpliYAGVsJk7CMjKTp2AZmanTsIzM9BlYxqVp5iwoI9NcmA1lZOa0tJaOuW2epnBWTea1+2N+wbMgnFWRhYuK/ly8xNMRzqrH0pZlUEZm+Qos+5dBtYWsN6i2sPUG1Zby3spVzYxaVFuCvdVrGLWwtpT31q5rY9Si2lLea12/gVGLakuwt3EToxbWlvLe5i0djFpUW4K99k5GLaotwd7WbYxaVFuCveL2HelbUW0J7e3clb4W1ZbQ3u49e1PXRlRGmtwAvdm3/0Dq2ojKSJMbqDcHD6VtjaqMNLH1BtUWst6g2lJveoNSg19vJGrx641EVG9IoqMj6A1JdHSiekMSHZ2o3pBER0fQG5Lo6ET1hiQ6OoLecERHR9AbjujoCHpDER0dUW8YoqMj6o1JdHSVseiNSXR0lTHpjUV0dJWphd6g1ODXG4n/VW/qBeMbTUlvkoiO9UWqpDcJRMdaK+lNAtGx1kp6k0B0zG+rJb2xi465VtIbu+jY381LemMWHXutpDdm0bHXSnpjFp0Ef4CQ9MYqOglqJb2JFZ3DRzxd4alSKz2NuSHqze9JuNFw1HPMhaZKrfQ05oasN34Sbhw/4TnpQlOlVnoac0MBv5H/pybnL6C7J5Panu4sWk/1ns6i9szZLFq7zp33Z1+Q6BOJCxcvlb728pWr136d12+oE6/25q3S5+07d+/df/Dw0eMn6kRrffrseel40e/cy1ev3/T/YWLR+PZdMPe9/wBNBD5+4n0XzufeL1nUfv2WRav7/sO0/hNtr9bs1WjXMgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.193;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAADkAAABGCAMAAABBssyjAAAB2lBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgJUIlSZPpkFAgUJBATyYmJQICBWI1aYPpgCAQKcPz+qRUVnKmeCNYIJBAmSO5JCG0IyFDIBAAEIAwgHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwEAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxtHRx1/fzQsEiyVPZUvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxshvihZAAABqElEQVRIie2UVVMDMRRGC8Hd3d2d4hR3d3d39+Lu7vxXoJtMupRZbu8b0Puwe77MnIncTGQyPX2CKhkxMMSaRsYmSNPUzBxpEgtLrGllbYM0ia0d1rR3wJqOTs5Ik7i4Yk03dw9V8PTypsOcpE0fXz9V8A8IpMOcpE0SFKz6hYSyYU4/mEKFhUdoEMwMjIzSIJipXelMiBkdzZI0aZgxsXHxQpCkhER5UnKKyExNS48RghRlZCqysnNyxasFVV5+ASGFRcXamyWln9+ycq3NiqLKz19VtfZz1ghz1opMUFfqhH3Wq5uwrjTIGwubmhVE3YR1hbS0ysva2kUmsnTm3zOhr4n4XYG/Jmr0UR2d8HurRl3dPb19iH32DwwODY9gTmh0bHyCoM52cmp6ZhbXlbn5hd7FbmRXlpZXsF0hq6iuqOr33fj/Y64pWaa0vhFJBzh9ayrXWGa0ubVNvtI35s7uHo2cYKvdP2CRE8g8PDqmiRPMPDk9o4kTzDy/YIkTyLy8uqaBE8y8ub2jgRPMvH9ggRPIfNx9oswJZj6/MOYEM1/fGHOC1DtDf5lsD2YJ5wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.326;4.blob,1.1,7100.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.513;4.blob,1.1,2300.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.222,3.552;4.blob,1.1,1096.iVBORw0KGgoAAAANSUhEUgAAAJEAAAA4CAMAAADKFeo3AAABEVBMVEUAAAAJFgkcRhwwdjAwdzBW1FYRKRE6jzoIFAgBAgE1gzUbQxsUMhRm/WYLGwsUMRQ8kzwDBwM6kDpMvEwqZyoraisCBAJe6V4mXiY5jDkdRx0eSx5j9GMECwQFCwU+mT5EqURCo0IJFwkQKBAGDwZk92QcRRwLHAsPJQ8oZChc5FwHEQcSLBJOwk44ijgBBAE9lj0ZPRkNIQ1n/mckWSQyfTJTzlMfTB9W1lYtcC0GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYyfDIECQQnYScraSsFDQUucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQwyejITMBM4iTgKGQoSLRJJkf8+AAAB4ElEQVRYhc2Y2U7CUBRFUQvKoIAjiloVZxFRUZxRccZ51v//EINNiz33Nr3p3fS43nrSrOwH0mx2JPIv6OAOQOnsIgcjypLDIdbdQy5RgyWITTyRJJdUbx9LEpt0Jksu/QMsQRwGh8hheCTHEsRhdIwc8uMTLEFsJs00uUxNswRxmDEL7sPs3DxPEpsFc9F9WFqO8ySxWTGL7sNqiSeIw1p53fW8sVn0eDM0jIrrcWubKUeLasL1uLPLlKPFXnmfOwLl4PCIOwIhWzvmjkA5OeVOAKZOuwO7OXV2jg2ib764xAbRN19l2vWZD2zOXWOD6JtvzDo2iLa5Yd6Ck2ib76rYIPrm+4r/O+GaH9r27yWo+fEJm0PbHH9+AQfRNb+ab+AkuuZkqV0NK6j5PQ8Oomv++GyAg2iav0oxdBJNc+EbHCQEc3jQRRXXbwNutcKiCuu3glkNcVFF9VuJWQVxUUX1W5lZBXFRjYD6rdSsgLCoNoH0W6lZAWFRbQLpt1KzP+Ki+gug33qYfREWVQtAv/Uw+yIsqhaAfuth9kVYVC0A/dbD7AtdVC0Q/VZuVsCQ/WIg/VZqVoAsqhaQfis1KyBdVCH9NvBWK1lUQf026FYrLqqofht4qxUWVVgL/Wv+AbKgM8ZXcisXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.609;4.blob,1.1,588.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAApklEQVQoke3SVxKCQAyA4QUrootiL4ANrGAv2Mv97+Sb4+/ojAcwb1+SyexkI8QzFFUgItEYE/EEndRSTOhpOiMV2JBZNuRMOl+gizpdKoOVag2uywZs2Q7cbIHtjvHKru2i7PXEl+iTgyHojsZ4pG+hHGjc82TKabM5uJABvJQevJJreCP5Kdtwx/n7tx2bPn0Ij0ycztyiermy4XYXv8T/vj7c1wNLlg5Fy+iO5wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492316924;4.copy,1.1,2.50,3.190,3.910,2.19,2.14,1.1,2.30,3.190;4.copy,1.1,2.70,3.209,3.890,2.19,2.14,1.1,2.50,3.209;4.copy,1.1,3.120,3.342,3.840,2.19,2.14,1.1,3.110,3.342;4.copy,1.1,3.130,3.361,3.830,2.19,2.14,1.1,3.120,3.361;4.copy,1.1,3.160,3.380,3.800,2.19,2.14,1.1,3.150,3.380;4.copy,1.1,3.200,3.399,3.760,2.19,2.14,1.1,3.190,3.399;4.rect,1.1,2.24,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.402,1.6,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.421,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1672.iVBORw0KGgoAAAANSUhEUgAAAIAAAABsCAMAAACVZkoAAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADA0lEQVRoge2a5XMUQRDFN8H9OBwCgYQQNLi7OwRLCBbc3YO7/NdwQ932bm2z1z3dfVsc8z5kul71ZN7HX73bKKqlpuaaK7YKAUKAECAECAFCgBDg/9SgwTTPTEOGDiN5dho+guaZaeSo0STPTmPG0jwzjSuNJ3lmKpcmkDw7TZxE88w0eQrNM9PUaTTPTNNn0DwrtcycRfLM1FqaTfLMNKetvXLM7XBqSXr10bxOd8wvOS1IenXRwkVldy5e4tSV9OqhpW3LSJ6Zlq+geY0hQC0qdCnDGaAWFbq04QxQiwpd1b2Vq1o1AgBqUaEr3lu9RiNAArWo0FXdW7uuQyMAoBYVuqp77es3aAQA1KJCV7y3cZNGgARqUaGrurd5S5dGAEAtKnTFe51bNQIAalGhK97btl0jAKAWFbrivfKOnfL3AbWo0JXY27VbHgBQiwpdib09e/eJAwBqZUAMm1I3ov0HDooDAGplQAybojScHTosfR9QKwti2KQNZ4BaVOhShjNALSp0NRqcSQBLBc4kgKUDZ5L2KwtnHpgmab8QOPPANEn7lYUzD0yTtF9ZOPPANEn7hcCZB6ZJ2q8snHlgmqT9QuCMj2mS9guBMz6mSdovBM7YmCZpv1A442KapP1C4YyLaSQQ48AZF9NIIMaCMx6m0UDMDs4kgKUCZxLAajQ4C8LF/PUcgzNZm8b9+R6DM1Gbxg2AwZmoTeMGwOBM1Kaxv6DA4EzSprEDYHAmadP435BgcCZo0/gBMDgTtGn8ABicCdo0j894MDjzb9M8AmBw9ldMO3LUqRufIED+XuoGCmd/JuRG0zGn4xE6QYD8vdQNHM7chNw4cdLpVIROECB/L3UjR/wb4VuyoH9UPb0FB+jtKfb9031nig1w9lyx73efv+DO/tjJn9R18dLlygNXrl67/vu8cTN3sghw63bl75279+4/ePjo8ZOnuZPB+8+ev6gcLwei6NXrN28Hakz6an73Pp77P3wkTar69Nniv9L1pe9rsQG+fS/2/ejHT9b6L0NZ5pNZWGQGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.693,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.61,3.326;4.blob,1.1,3316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.72,3.438;4.blob,1.1,4144.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,920.iVBORw0KGgoAAAANSUhEUgAAAOsAAAAlCAMAAACUNu4jAAABEVBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgwdzBW1FYBAgE1gzUbQxsUMRQ8kzwDBwMUMhRm/WYLGwsqZyorais6kDpMvEw5jDkdRx0CBAJe6V4mXiYFCwU+mT4eSx5j9GMECwQJFwkQKBBEqURCo0ILHAsPJQ8GDwZk92QcRRwHEQcSLBIoZChc5FwBBAE9lj0ZPRlOwk44ijgkWSQNIQ1n/mcfTB8yfTJTzlMGEAYOIw5W1lYtcC0iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYyfDIECQQnYScraSsFDQUucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQwyejITMBM4iTgKGQoSLRJ80XW5AAABW0lEQVRoge3Yx1bCUBSF4ahoCNVe8KKiYheNir0BdrB33/9BdKLLcE9mnr2X0W947uQfMCDbcT60OH9Gaxu7ACbW3sFO+HFuXDx7iSQ4BCDuiudUOgMO0Zft7BLv3T3gEIDePvneP4DtABgcyon3YZMCl+jLj4yK9zFTAJfoG5+Q75OmiA3RNzU9Iz/Mmjlsib75BU9+WCwtYUv0LfthL+4KsgNgdS30l1pOIEMA1jdCnzZLW8AQgO2d8LfdvX1cCFnm4JCdgFOpsgv+KapF79su4PvSlD06pnUABJemk1NWB0DT0nSWjtxf4y/W0pQ754QAWEvThalxSvRZS1PdNCghAPbSdFlmdAAIS9NV1L7vPglL07W8v/1+wtJ0c8sIAbCXJu/unlKiz16aHswjpQTAWpqSfmS/2q2l6SlP6UBoXpqeX+qkEoDg0vTqx2gl+oJLU+GN1QFRqb4DuU8ZPh0fEJ4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,696.iVBORw0KGgoAAAANSUhEUgAAABkAAABeCAMAAADhak+FAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAA80lEQVRIie2TyVLCUBBFH4oDIQkiD4QIEmVQkMEAziKI+P+/REj3s60id8HKzbuL1Dl1KqlsWql4GWUmlOzgcJeSZY+Od+jkNH7knDyrEBXX81mFqBTOjApRKZ4bFUpKSbtsQlTKusImROVCV9mEqNR0wCZE5bLeYBPif7tqGhWiEjpGhahc129YhaioVrvDLkTF796yC1FRdz3zEaG91/dRuR8MURqNUXnwApSiCSpT3Qdlph/RS08hKs9NVF4iVF7fQMi9f4Ay15+g5BcdUJZfIKy+Z+lhvciCVyo/IPyZvW1722mzt72dvW1727/lv297A959KSbSl5fJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.647;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492317027;4.copy,1.1,2.60,3.190,3.900,2.19,2.14,1.1,2.40,3.190;4.copy,1.1,2.80,3.209,3.880,2.19,2.14,1.1,2.60,3.209;4.copy,1.1,2.90,3.228,3.870,2.19,2.14,1.1,2.70,3.228;4.copy,1.1,3.130,3.342,3.830,2.19,2.14,1.1,3.120,3.342;4.copy,1.1,3.140,3.361,3.820,2.19,2.14,1.1,3.130,3.361;4.copy,1.1,3.170,3.380,3.790,2.19,2.14,1.1,3.160,3.380;4.copy,1.1,3.210,3.399,3.750,2.19,2.14,1.1,3.200,3.399;4.rect,1.1,2.34,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1716.iVBORw0KGgoAAAANSUhEUgAAAIoAAABsCAMAAACCRNrJAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADJElEQVRoge2aV3PUUAxGndD7snQIBBJCqKH33juElhBa6L330Hv517Bm7OuMtbLkT7ZnWJ+HrCaSdr/HM5rreXKamhXD2VJGoSijUJRRKMooFGUUijIKRRml0RkyVNvlNwCGDR+h7PIbCCNHabv8BsDoMWOVXX4DYdx4bZffAJhQmajs8hsA1cokZZffQJg8RdvlNwCmTtN2+Q2A6TO0XX4DYOYsbZffSE/L7DnKLr8B0FqZq+zyGwDz2tqTu/M7fFoEGwALOgXdhRWfRYKN9CxeUhV0ly7z6UreSM/ythXKLr8BsHKVtstv/G84UZQqYw5qKVXGPNRSqozB3Oo1rbZRnChKlTGcW7vONkpEFKXKGMyt39BhG8WJolQZg7n2jZtsozhRlCpjOLd5i22UiChKlTGY27qtyzaKE0WpMoZzndttozhRlCpjOLdjp20UJ4pSZQznqrt2WyZxoihVxsjcnr2WUZwoSpUxMrdv/wHs1+uIYkwjqWrQhnfw0GEsSh1RjGkkVXmD1fLIUSwKLYpxjaSqPNRSqow5qKVUGRtBLRE9NFZLRA+t1RK5PMbVEpJM5PJIqCUkmcjlMa6WkGQil8e4WkKSiVweCbWEJBO5PMbVEpJM5PJIqCUimcjlkVBLRDKRyyOhloBkIpdHUi3TSyZyeSTVUiWZlB7yGqlRS5VkUnrIa6RKLTWSSekhr5F5qCWih8ZqiehhI6hliRzlSw1KLa0umdpHI5RaGl0ytVEotTS6ZGqjUGppdMlUv+qh1NLmkqmOQqmlzSVT/9aJUkuTS6Y+CqWWJpdMfRRKLU0umSkeo1FqaXHJTBGFUsu6knnsuE93UuWiKDZItfxXERtNJ3xOegmVi6LYoNXSr4iNU6d9zngJlYui2GDQb0Qp31CWNAg9vUUnCOntKTpBwNm+c0VHCDh/oegEAd0XL/mf/eF/+CpDLl+5Wvupa9dv3Pz7ees2W2Ub5c7d2t979x88fPT4ydNnz9kq0yQvXr6qfbwe8Lw3b9+9H0iosqT5w8ew7v/0WVRlxJev2X6/nG9934uOEPDjZ9EJQn79Vo3/AdjB+H0mYCpMAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.183;4.blob,1.1,1344.iVBORw0KGgoAAAANSUhEUgAAAEEAAABQCAMAAABxo+hJAAAB7FBMVEUAAAAOBgYLBATsX1/vYWEQBgYHAwPXV1fbWFhKHh4MBQX1Y2OoRESkQkL2Y2NGHBzmXV1jKCgDAQGLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgJUIlSZPpkFAgUJBATyYmJQICBWI1aYPpgCAQKcPz+qRUVnKmeCNYIJBAmSO5JCG0IyFDIBAAEIAwgHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwEAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxtHRx1/fzQsEiyVPZUvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIaGgsUFAh8fDJLSx5DQxuAgDSE7OPjAAABvklEQVRYhWNgYGRkoAwwMbOwUmYCGzsHE4WOGAXDCHBCaS5uTrzqcAMeGIOXB58yPIAPli34+cjMIAKCUIYQnEUiEBbBZJEGRMXEMVgkAglJTBZpQEoak0UakJGVw2CRCOQVMFmkAUVmJTSWsooqVATBwgfU1DXQWJpa2lARBAsv0NFFY+npwwQQLJKAgaERBos0oG1sgsEaBUMDmJqSykIDZuYWliSxrKxtbO3skUxwcHQyI4Xl7OLq5u7hSaQHsQEvbx8GBl8/f/JNCAgEkUHBZBsQ4hcKosLCyXdDBMQNkUhCJMZmFCQcohEGkBqbMTaxvnHxrkhOIDU2GRISbYKSkonz8igYBeQA0ks5tPKO5FIOiQUEKamk5wskVlp6RmYWcT7FCrJzcvPyCygwgKGwqLiEEv0MDKVl5RWVlBlRVV2TWZtOYWzW1TdQGpsMjRTF5igYlqCpGSerpdUYKoBgYQHNTbhZbe0dDOgsDNDZ1Y2HRQzo6cXHIgL09U/AwyIGTJw0GQ+LGDBlKj4WEWDa9Bl4WMSAmbNm42ERA+bMxcciBnTNgzLmY2ERBRbAGAuxsIgCi2CMxVhYxAAAJHmVHjGVTogAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.326;4.blob,1.1,3316.iVBORw0KGgoAAAANSUhEUgAAAIkAAABsCAIAAADRzwavAAAABmJLR0QA/wD/AP+gvaeTAAAJaklEQVR4nO2cW2zb1hnHeZN1iWzZlkTGUCw5kZw4F9dprJsXzwWSNWldtEiBZYuDJiniYXkZMqAY0IdiyLaHrU8psOyhLvKyABmwtsCKtOgegrxkxiQbSW24aCw7dZt0VlxSkqU4om2JIrkHITddYlGHpETl/CAgACl+5zP/4SfyfOdPBFEMndk8yrLO4WHlhmhscOVCC9ls265dthdf/O7TT5UbBVIlWw4dGl1dbWppqXUikCJQHD9x717P6GitE9EkmKLRRZ6/ffny9pMnFR0FUiXtvb1nBKHZ5ap1ItpDwXuBPGsMs/XNNzGdbun6daXHgkjmhXfeOTY3V+ssIKUwbd7861yODARqnYjGULymIQjCpdPUwIDZ6fzhyy9VGA4iDc/IyKl4HGtqqnUikCIIo/H0ykrXkSO1TkRLqFHTEAQRcrkWt5v0er/75BN1RoRAIBAIBAKBQDRA5+FO7zlvhV/G9fjghcH2Pe2KpqRp5OzfUEGKDtMVfpnP8PGpODVAyZhAgyGbNman2dRhYiaYyg+hw7S1z4obVHr+1RyyaUMFqdRcKpPKVH5IKpLKrebs/Xa5cmgw5NEGxVDST9KhSgtaHlEQmQkGlrVyyKNN2+42rAmLT8WlHkiHaYvHYrAaZEmjwZBHGypIJaYTfIaXeiAbZdkoSwZIWdJoMGTQhjAS1j6r1IL2CDpEU0FY1koggza2fhvHcslIsrrDmUnGYDc0b20Gz6TBkEEbKkjFJmOIWOXh2ZVscjYJL51iQLUx2AwWj6XqgpaHCTF2nx0lUMBkGgxQbcgAmV5Ms/dYkCDx6TiGY3D+pgBgbXySH2uKETghdjNG+uHdGgQCgUAgDQxJGmudgsZQ1hv1iEOHtrz99g51xoJIYOfOtg8++InNVmKyuaurSxRFh8Ohflb1j+LXDYahx497vvjibjy+Xu476+tldz3PKK5NX5+1tVU/Pv5j6eExDEGQlZUVpdPQIsTrrtdzQu760nU2BzTvUg6/n5ydTWbKtHZQFF1fX+c4rmC71/tHnl+/dWssk1lWIitNgK3mVl9zvfZ+8P0RzwhpLJw1wVFch+kKPigiYVKyu9uysFD2slhYWDAaS9y/ZTLL+/b9/q23/jc4+DeLxVP5cI0EiiCIkTD6Sf9+ar+z2TmTmLm6ePX2/dv53ad7TgfIQi/g2K2xr+JfVRJ90ybd+fMDH354a0p6u7qpyeLxHO/pOW2z7bt79/OZmfNLS8+xm3fLpi1n95wdGxrb3b47v8VmsLmaXQUfE2GqMCBFGcfGhnp6WkGyslpfGB7+95kzYmfnKyBxNAeR/0eP631232DHoMvsuhG7EWWj+e3JTPJ+9n7BMTkhV2F0nQ5DEITnq+y76XRmt/vYzp2/stn6Fxb+ubz8dXVxNArh2OQ44Djgs/tERBxfGv/o1kfLT/z8ntpxCqSmsWwOQRC9XvLqwPb23t7es273MVEUIpGLV6/+Ip3+QWoQrUMcdBzsae25cvfK+NL4Ol/4nHHlzpVr0WsFG2NrsQqjP3iQ5XmxrU0vNa3e3t86HD+7ceNcJHIxm31e77ApI4WhCj7lvPvu3pERyTdara07MIxQIh8NQdBr1XctUQJF0cL7aZEXReHxD8w33yQD0pefpVLwPR4I0P/Nvb/bW7x2ae7vc/R/H+s9Pr40POx0u1ue8ZQDKQnQ0hbTZhNe9Du/Hl/n2Kee848e3eZ0ms+fnxGrXScFUQq9Hn/vvX1HjnTVOhFIKcxm3auvOmudBQQCgUC0iYxeZ0keaxDMOh07Ojrs1MCPH9CMgIxeZ0keaxDSHPev778/uX27CmMBAjpbI4vXuQqPNQiX5uffcLla6v5Fe6DayOJ1rsJjDcK1aDSVzR7dtk2d4aoGVBtwr3N1HmsQeFG8fPt2/Zc1GWagAb3OVXusQbg0P//Tjg5Xc10bGWXQBtDrXLXHGoSvl5dnEokT3d1qDioVeTo3VXudAT3WIFyanz9R32VNHm2q9joDeqxB+Me337pbWgJk/Zrl5NGmaq8zoMcahB9XV68uLtbzHYFs3egqvM6yeKxBuDQ//0u3uwlTyUwhFdnSKvY6owSK6bCCD4o9Fk8WjzUIn92504TjdTt/I9t6iUde58R0Ir9lw4416SOX/rMkVwJVsJbLfbywcLy7+7M7d2qYRjkUfN1ChR1rCAQCgUAgEEhtOdzZec6rRtcZhLrqWKv3SBykqDBdsymACqmrjrVK2jjN5g6TaYJRqesMQv10rFXSJkhRc6lUKqNS1xmE+ulYq6ENhqJ+kgzVfUHLUz8dazW02d3W1oRhU3FVu84g1EnHWg1tghQ1nUhkeFW7ziDUScdacW2MBNFntWqloD2iHjrWimvTb7OxHBdJ1qDrDEI9dKwV1yZIUZOxmEJNZxw34HjZtVcge5/dsQaJXDnKamMzGDwWi0IFDcf1fv+fA4G/EKXeEwKyN0+5jjVI5G3bfj40NIZhug3+NgRBlNYmQJKL6fQ9VpGusyjyHPeA49KiWOIuA2RvnnIda5DIKIohiPiMQdXjD17vQS2/U/DiSy99/PLLMgbcteuMz/cnGQNC5IEgjPv3/9XhOFDrRCBFoChms+1TdI0GBAKBQCByo8f1FwYv7Gnfo/RAnZ2Hvd5zBRsNBuvQ0JheD/RKSU2A4/rBwQvtT5/nDZ49M3xmKj41QA0omRiCIAhFBWk6XHKXIDT+OlCez8TjU9TT53njeYEwHe6z9hnkmCAqh9nsNJk6GGaiaA+KIEgu91y8dZ2mw1Zr35MTcRtrE0lFVnOr/fZ+5dKiqGAqNZfJpAq2oygqCFxdzHAoTyoVyeVW7U+c5421EURhgplQrqyhKEaSfpoOFe9aW4uNj/9GoXHrDVEUGGbiybJW0VxnmA57LB6rwapETm1tuzGsKR6fUiK4tqDpsMXiMTw8zxVpE2WjUTZa/DJiWaCoYCIxzfMaWIKjNCwbZdko+fA8V9ojCNGhIBWUPRuCMFqtfSUL2vMJTYeoh+e5Um0mmUm7wb61eau8qdhs/RzHJpMRecNqF4aZNBjszc1bkcq1WcmuzCZnZb90KCoYi00iNTFK1yXZ7EoyOZu/dCT0PUNMyGf3EahsFlGDwWaxeGBBK4BhQna7D0UJCdpMx6dxDJdx/oYkA+n0IsvekytgYxCPT2MY3t6+R4I2nMDdjN30k365kiBJH7xoihEELha7SZL+/wNzKK54OxEkrwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.421;4.blob,1.1,692.iVBORw0KGgoAAAANSUhEUgAAACUAAABuCAMAAACX3yqeAAAA5FBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUBAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQU0NDQREREGBgZHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnwICAiANIBDG0MDAwMOe2xuAAAA3UlEQVRYhe3S2XIBURSF4Y5tJqYQiSnRtG5Tp4WYYowxvP/7UK1UoXGWKldq/9ffxT6nliQ92UiYRHYHopwuN6A8Xh+gyP+MqEAwBCgKRxD1EkVU7DUOKHp7R1QimQJUOvMBKPrMIkoUK1asWLFixYoVK1YPoOScmXxd5RWzwnWlambFe9x1u9q+BFAlRSmLlVpGFFXOqqqOKL0KqC+jBqjvOnBX46cJqFa7A6juL/ATvf4AUMPRGFB/ExKrqTG7pA5WPl/QqZKXO3Ww8v+VRe2XY1n58XI0bX16vdkGO0BHqSLjGHYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.438;4.blob,1.1,4428.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.535;4.blob,1.1,2220.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;3.end,1.1;4.sync,10.6492317131;4.copy,1.1,2.60,3.190,3.900,2.19,2.14,1.1,2.40,3.190;4.copy,1.1,2.80,3.209,3.880,2.19,2.14,1.1,2.60,3.209;4.rect,1.1,2.44,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1760.iVBORw0KGgoAAAANSUhEUgAAAJQAAABsCAMAAAC7I2uSAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTEGBgYICAhvb2/m5uYCAgLIyMhgYGDMzMx9fX0oKCg0NDQTExNQUFDl5eUpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXAcLwAAADQ0lEQVRoge2aVXMVQRBGJ8H9cnEIBEICBIK7BncJlhAsuLsHd/nXsMNa1XR6pne6Zx/ungfuhO6v5ns8NbVKKdXUrIjQE2SqUnJXVKXkEmSqUnJXVKXkEmSqUnJXNGqpCirDhlOneIKFESNHEad4gofRY6hTPMHC2HHjiVM8wcOEidQpnmBhUm0ycYonWKjXphCneIKHqdOoUzzBwvQZ1CmeYGHmLOoUT7Awew51iic4aJk7jzjFEyy01uYTp3iiKAvaNC36j4XtHchqPCUkirKoplms/1jSia3GU0KiKEuXabqi8/IVdWQzmbonOFjZvoo4xRMsrF5DneKJRiDTXFfhDSrGrsIbVoxdhTfZW7uuVaJQRKa5rsKb7q3fIFNJ5TXXVXiTvY2b2iQKRWSa6yq8yV7H5i1CnXKa6yq86d7WbTKVVF5zXYU32du+o0uiUESmua7Cm+51dgv00WSa6yq86d7OXQJ9NJnmugpvulffvUegkMprrqvw5vb27pOolNdcV+HN7e0/cNDv9kxuh9BcQ4KtCXXo8BG/UpncDqG5hgRbE0odPeZXKpNbWHNNCbYlpMg011V4g4qxq/A2qhj7yK2YGPvIrZwY+7z6mmLMpMg+r76AGDMpss+rrynGTIrs8+prijGTIvu8+gJizKTIPq++phgzKbLPqy8gxjyK7PPqC4gxjyL7vPoCYsyiyD6vvqAYcyiyz6svKMYkRcblFpdgihiTFBmXW1yCSWJMUWRcbnEJDivGPnIrJsY+ctuoYlyRR/yrIEiMbYos/6kSJMYWRZYvBYmxRZHlS0FibFHkAF+aQWKMK3KAUpAY44oc4ps8SIxRRQ5RChJjVJFDlILEGFXkIJ9UQmKMKXKQUpAYY4ocX3H8hKbHdiqUAMX4/wlOxFc0ndScsp0KJWAx1ic4EV9x+ozmrO1UKIEAJ6pvhysq2OjtK7sBQF9v2Q1MzvWfL7uCyYWLZTcw6bl0Wf8OpP+Dn4Jw5eq16NLrN27e+vd7+w56ClXq7r3o3/sPHj56/OTps+cv0FOgTi9fvY5+3gwq9fbd+w+DllMYmj9+Ss8Dn784ncT5+i3UTe587/9RdgWTn7/KbgDw+w9p/S8t5QDXDka61AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.653,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.383;4.blob,1.1,3476.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.478;4.blob,1.1,2500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492317229;4.copy,1.1,2.60,3.190,3.900,2.19,2.14,1.1,2.40,3.190;4.copy,1.1,2.80,3.209,3.880,2.19,2.14,1.1,2.60,3.209;4.copy,1.1,3.140,3.342,3.820,2.19,2.14,1.1,3.130,3.342;4.copy,1.1,3.150,3.361,3.810,2.19,2.14,1.1,3.140,3.361;4.copy,1.1,3.210,3.380,3.750,2.19,2.14,1.1,3.200,3.380;4.copy,1.1,3.250,3.399,3.710,2.19,2.14,1.1,3.240,3.399;4.rect,1.1,1.4,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.54,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.402,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.444,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.557,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1768.iVBORw0KGgoAAAANSUhEUgAAAJ4AAABsCAMAAACsAftbAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADSklEQVR4nO2aV3PVMBSEndD7JXQIBBJCqKH3EnovoSWEFnrvPfRe/jVcM9eS44Pu2ivJD+h7sDVnzo738RuNo0inoTHKSf4EQajHEOoxhHoMoR5DqMcQ6jGEegGfDBmKzZgEwbDhI6AZk2AYOQqbMQmC0WPGQjMmwTBuPDZjEgQTKhOhGZMgaKpMgmZMgmHyFGzGJAimTsNmTIJg+gxsxiQIZs7CZkyiOM2z50AzJkHQUpkLzZgEwbzWtuprfntMsz6zliBY0BG/FlZiFukza4niLF7SFL+XLovp1Ge2EsVZ3roCmjEJgpWrsBmT+F9Rko7qujOtl1CSjuq6O62XUJKO6nptb/WaFheF0ihJR3U92Vu7zk2lFErSUV2v7a3f0O6iUBol6aiu1/baNm5y1ElDSTqq68ne5i1uKqVQko7qem1v67ZOF4XSKElHdT3Z6+hy0GcQStJRXU/2tu9w0GcQStJRXU/2mnbuclAohZJ0VNe1vd17XFTSUZKO6rq2t3fffu7rSsilU6RLekbh6yaiAwcPcfWUkEunSJf0jMLXTUTR4SNcPSXk0kmX9KzC10u4R0k6quvOtF5CSTqq60HrFYyae9B6Rs19aD1z457VeuuCz9y4C1pvXfCZG/es1lsXfObGPav11gWfuXEXtN664DM37lmtty74zI27oPW2BZ+5cRe03rbgMzfugtZbFnzmxl3UeruCz9y4i1qfS/BRNTfv5dH6XIKPqrl5L5fW5xF8VM3Ne2VpPaPmHrSeUfOg9QEc53+gSVqPC777H+QkrYcF3309SethwXdfT9J6WPA9/P0oaT0q+B7qSVqPCr6Pf0clrQcF30c9SetBwfdRT9J6UPC9/BgsaT0m+F7qSVr/T8E/eiymW/+YmplPhRKi1v89CYmG4zEn9I+pmflUKCFrfXwSEidPxZzWP6Zm5lOhhIF6ifDPfCBQIj29ZTcw0ttTdgMTZ/rOll3BxLnzZTcw0X3hYvzuTybmk2cuXb5S/fzVa9dv/HnfvGU8+a93+071effe/QcPHz1+8vSZ8eS93fMXL6uvVwNR9PrN23cDdU6+aXz/ITn3f/wEnTzy+Yv/b+J87ftWdgUT33+U3cDIz1+51n8DobwUdV9X9HIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.10,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.633,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.112,3.383;4.blob,1.1,1612.iVBORw0KGgoAAAANSUhEUgAAAIgAAAAzCAMAAAB7abDWAAACRlBMVEUAAAAdRx00fzQMBQX1Y2NKHh6kQkKoREQMHgw+mD4HEAdGHBz2Y2MOBgYjViMucS4DAQHmXV1jKCgBAgE5jDkXOBeLODjBTk4SLRI7kjsDBwMtEhL+Z2cfDQ0pZSkoYijQVFR8MjIECQQ8lDwRKRFyLi7ZWFgYPBg3iTcAAQAYCgr8ZmY3FhYvdC8iUyK3SkqVPDwIFAgLGgtZJCTsX18GAgICBQIeSx4yfDIJBATyYmJQICA+mT4XOhc0gDQbQxucPz+qRUUNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWZJtRPHAAACLUlEQVRYhWNgQAGMTAyUAWYWVgpNgAAmRkpNYGOnhjs4OLkoNYKbh5cKDuHjp9gIAUEhyt0hLCJKuSFi4pSbISEpRbkh0jKyFJshJ0+5OxgYFBQpNUFJWYUaDlFVo9QEdQ1NajhES1uHQhN09ajhDgYGfQPK9BtyGlHHIcYmpmToMgMDYSDL3II67mCwtLImQ5cNGNgCWXb2VHIIg4MjGZqcwMCZWm4YBaNghAAXVxoYSk6j0dWFBg4ho9Ho5u5BC4eQ3mj09KKFO0hvNHr7+NLEISQ3GqX9/GnjEFIbjQGBtHEHqY1Gy6BgWjmEtEZjSGgYrRxCWqMxPIICqyIj8bEQjUassqggyj2afHfExMbF42YhGo3YZBMSk1DMSqakF5KSmhaDm4VoNGKTTc/IRDErK5sChxAEeBqNObm0tJh4kJdfMNBOgIDMwqKBdsIoGLKguKSUkJKycjBVkVhJRXtjqqrRRGpqCekpL4M6pI6KDmGob0ATaGxqxq+jJQMSEq2JbdR0SHsHWvXT2dWNX0d6D4Tu7aCmOxgy+/rRRCZMxK9h0mSqOgAOpkxFE5g2fQY+9TPzY/BJkw9mZVSgicyeg099Qz1t3MHAMHcemsD8BXhU53UspJVDFqFXxIuXLMWtetlymtVSK1auQhNZvQa36qlTaOUOBoa169AE1m/YiEtta8Ym2jlkc+wWVIGt27bjUrtjJ+3cwZC0azeayJ69uNTu209DhzAcOAgA/FRvT2Yr9VYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.438;4.blob,1.1,4428.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.513;4.blob,1.1,2224.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.590;4.blob,1.1,1108.iVBORw0KGgoAAAANSUhEUgAAALEAAAASCAMAAAAjf8+3AAABdFBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsxMTEYGBgMDAX19WNKSh4BAgE1gzUbQxsFDQU8kzwSLBKkpEKoqEQUMRQmXiYucS5GRhz29mMODgYqZyoraisSKxI+mT4DAwHm5l1jYyg5jDkdRx0DCAMVNBUBAQECAgKLizjBwU4FCwU4izgfTB8oKCg+Pj4UFBQtLRL+/mcfHw0JFwkQKBA0gTQkWSQICAgNDQ0EBAQSEhIrKyvQ0FR8fDILHAsPJQ8zfzMJCQlyci7Z2VgHEQc2hTYhUiEYGAr8/GY3NxYBBAE9lj0ZPRk9lT0aQRq3t0qVlTwwdzALGgsMHQxZWSTs7F8GBgI4ijgAAQAEBAEFBQICAgEJCQTy8mJQUCAGEAYOIw4yejIeSx54eDGZmT46OhecnD+qqkUXFxciVSIucy4TMBM4iTgLCwUKCgoFBQUyezIgUCAKGQoFDAUeSR4SLRJVrUNpAAABhklEQVRIic2UZ1MCMRBAI9iwKyAq2GNDbNgQUbBXVOwNe++9/nkvYcYhyep5QzL4PuQ2m+zk5SYJQhopiMVkRv+b1DQukZ6RmRSRv2LJyuZTObnJENHIy+cSBYVFwiSrzS7kih0lipR0EIxRaZkwyekATq2rXImQLqJxRWUVn6quASprsUmFkC6icV19A59qbAIq3biZfDwtFAVqPyAao9Y2LtGOnVBph5e0nV2UbmaIbsIjSZEDMO7p9bGJPuyHSvsDpB0YpATjR0J0E0PSJBkAYzQ8wvZH8RhUOu4iLXQqgnQTE5IUOSDjySm2P43Bh2xmlrTgqVAJZByem2f6C5FFoNK6tEw+0KlQCmSMVlbZ/loAmLSON1QI6QIab25tM32vDZhkj+4YWWh3j7IPRwYAjQ8Oj9D3ndIeqePIiTjp9MzQQucXlEs4StQYXV2TodidutHC2zvhf94/uA0tFPZRHuEoYWPKU+xOPWuh+eWVG3yLWgytI49fjON5/+AS/k/5LtL4AvsmSKQFGNqkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492317336;4.copy,1.1,2.70,3.190,3.890,2.19,2.14,1.1,2.50,3.190;4.copy,1.1,2.90,3.209,3.870,2.19,2.14,1.1,2.70,3.209;4.copy,1.1,3.100,3.228,3.860,2.19,2.14,1.1,2.80,3.228;4.copy,1.1,3.150,3.342,3.810,2.19,2.14,1.1,3.140,3.342;4.copy,1.1,3.160,3.361,3.800,2.19,2.14,1.1,3.150,3.361;4.copy,1.1,3.220,3.380,3.740,2.19,2.14,1.1,3.210,3.380;4.copy,1.1,3.260,3.399,3.700,2.19,2.14,1.1,3.250,3.399;4.rect,1.1,2.14,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.64,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1788.iVBORw0KGgoAAAANSUhEUgAAAKgAAABsCAMAAADJ7AkkAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADWElEQVR4nO2bZ1MUQRCGB8z5PLOiKIgYMeecs2ICMZ0554w5h38tt1bRW+57S/d234yW83xgp/r6rX2/PjWLc5iGxho/1ESeMCEWtSYWtSYWtSYWtSYWtSYWtSYWjfyNDBrMm2kSJgwZOow10yRsGD6CN9MkTBg5ajRrpknYMGYsb6ZJmDCuNJ410yRMKJcmsGaahA0TJ/FmmoQJk6fwZpqECVOn8WaahAnTZ/BmmoQFTTNnsWaahAnNpdmsmSZhwpyW1upjbltCU3pmljBhXnvymF9KWJCemSUsWLionDwXL0noSM+sEhYsbVnGmmkSJixfwZtpEv8DXHWgPXnCBK460J48YQNXHWhPmli5qllaCsFVB9oTJ1avKdArC1cdaE+aWLuuTVoKwVUH2pMmWtdvKFLsT7jqQHvixMZNBXpl4aoD7UkTm7d0SEshuOpAe+JE+1ZhJwhXHWhPnNi2XdgJwlUH2hMnyjt2CksBuOpAe/KE27Vb3CsDVx1oT55we/buE5VCZHQCnVxaMeQJt//AQXXRjE6gk0srhjzh3KHD2p5ZnUCntGLIExZw1YH25AkTuOpAe/JEBKERCw83JYRGLHzclBCa246slBjpCUJz2wGkxEhPEJrbjqyUGOkJQnPbkZUSIz1BaG47gJQY6QlCc9uRlRIjPUFobjuAlNjoCUJz2wGkxEZPEJrbDiAlJnqC0Nx2QCmx0BOE5rYDSolIT/J1AokFNzGwlIj0JF8nkFhwEwwpkehJvk4gseAm/N6UEBqx8HBTQmjEIkpJxJ66f+2IpKSIntT/s0wkJQX0pP5FkZQU0JP6F0VSUkBPPHyRi6REriceiiIpkeuJj2+ckZSI9cRHUSQlYj3xURRJiVhPvHzejqREqideiiIpqaknR44mdKZP9Fr0q1kCSsnvE0g0HEs47lInei361SyBpSQ5gcSJkwmnXOpEr0W/miVy4Cfi/4pEIv8UXd2hGzDp7grdgMfpnjOhK/A4ey50Ax6d5y8kz0r/JP8UjIuXLvf9rVy5eu163/PGzdxTyKK3blf/3rl77/6Dh48eP3maewrY89nzF9XHy17nXr1+87Z3gFM4Gt+97z9XPnxknYLw6XPIt/P50vM1dAUe376HbsDkx0/R+i84wiMoSTeqSQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.176;4.blob,1.1,1344.iVBORw0KGgoAAAANSUhEUgAAAEsAAABXCAMAAAB7hEg4AAAB7FBMVEUAAAAOBgYLBATsX1/vYWEQBgYHAwPXV1fbWFhKHh4MBQX1Y2OoRESkQkL2Y2NGHBzmXV1jKCgDAQGLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgJUIlSZPpkFAgUJBATyYmJQICBWI1aYPpgCAQKcPz+qRUVnKmeCNYIJBAmSO5JCG0IyFDIBAAEIAwgHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwEAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxtHRx1/fzQsEiyVPZUvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIaGgsUFAh8fDJLSx5DQxuAgDSE7OPjAAABvUlEQVRYhe3U1W6EQBSA4am7u7u729bd3d3d3d3d3V+0bQqB7C6TMzAXTcN3sftnLk6AHEBIQwPRoqmlrUNrlq6eviatWTJC3E5I3g5uJ6RvB7cT8nbI6DNg/g2NVIuUMRsmaoqQKfsSmqkpQuYWTFiqKUJW1rgiY2NrhylC9g64IuPohCsyzi6umCLk5o4rMh5anoLl5e3DnHCF4+vnL1gBgUHMCVdYwSGCFRrGHnAlUnhEpEqJFRQVrVKy/y8mRnwpiY2LTxBZiUmK5JRU3qy09IxYcZWZlZ2Tm5cveMMkCgqLECouKaUxq6z857eiksKoqpLqn7+aWgqzUN3vddXzjkTvRMPv82rkRonfiSZFc3FLazbvssTvBGprV1R0dAo9ApnsL5PyjVb6Wkv4RvPqW1e3lPeRVz29ff0DQndOZHBoeGR0jMooND4xOUVnEkLTM7Nz87SGLSwu9S/3UtuJldU1ejuB1inthEwmaGMTUFvbUcwBV2psbkBqZ3cPKZeK/YNDUEEcHcMK4OT0DFQQ5xeXoIK4uoYVwM3tHagg7h8eQQXx9AwriIMXJl6xBfLGxju2QD7Y+MQWxBd9grPX59wzrgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.383;4.blob,1.1,1612.iVBORw0KGgoAAAANSUhEUgAAAIgAAAAzCAMAAAB7abDWAAACRlBMVEUAAAAdRx00fzQMBQX1Y2NKHh6kQkKoREQMHgw+mD4HEAdGHBz2Y2MOBgYjViMucS4DAQHmXV1jKCgBAgE5jDkXOBeLODjBTk4SLRI7kjsDBwMtEhL+Z2cfDQ0pZSkoYijQVFR8MjIECQQ8lDwRKRFyLi7ZWFgYPBg3iTcAAQAYCgr8ZmY3FhYvdC8iUyK3SkqVPDwIFAgLGgtZJCTsX18GAgICBQIeSx4yfDIJBATyYmJQICA+mT4XOhc0gDQbQxucPz+qRUUNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWZJtRPHAAACLUlEQVRYhWNgQAGMTAyUAWYWVgpNgAAmRkpNYGOnhjs4OLkoNYKbh5cKDuHjp9gIAUEhyt0hLCJKuSFi4pSbISEpRbkh0jKyFJshJ0+5OxgYFBQpNUFJWYUaDlFVo9QEdQ1NajhES1uHQhN09ajhDgYGfQPK9BtyGlHHIcYmpmToMgMDYSDL3II67mCwtLImQ5cNGNgCWXb2VHIIg4MjGZqcwMCZWm4YBaNghAAXVxoYSk6j0dWFBg4ho9Ho5u5BC4eQ3mj09KKFO0hvNHr7+NLEISQ3GqX9/GnjEFIbjQGBtHEHqY1Gy6BgWjmEtEZjSGgYrRxCWqMxPIICqyIj8bEQjUassqggyj2afHfExMbF42YhGo3YZBMSk1DMSqakF5KSmhaDm4VoNGKTTc/IRDErK5sChxAEeBqNObm0tJh4kJdfMNBOgIDMwqKBdsIoGLKguKSUkJKycjBVkVhJRXtjqqrRRGpqCekpL4M6pI6KDmGob0ATaGxqxq+jJQMSEq2JbdR0SHsHWvXT2dWNX0d6D4Tu7aCmOxgy+/rRRCZMxK9h0mSqOgAOpkxFE5g2fQY+9TPzY/BJkw9mZVSgicyeg099Qz1t3MHAMHcemsD8BXhU53UspJVDFqFXxIuXLMWtetlymtVSK1auQhNZvQa36qlTaOUOBoa169AE1m/YiEtta8Ym2jlkc+wWVIGt27bjUrtjJ+3cwZC0azeayJ69uNTu209DhzAcOAgA/FRvT2Yr9VYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.132,3.438;4.blob,1.1,5908.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,608.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4rKYypAAAAr0lEQVQ4je3Stw7CQBBF0cFkDGtyzmCTc875/38JISHkWyBRUflVe2ZXqymeyCcuTRC3x8uBz08HgiEO9DAdUS7YUFE+iMXpRJJO6XQ6A2ZzebiginCpXIGrNbDeMOxslk1cWy35kjbZ6YJmr/8+DYavJUclsXsc1ODJVODZHF6oMbxUFrxSa3ijQvB2t+f/hyQdH9HH3QmW86UCa9cbLPeH/BKnX06/xOmXLX/o1xMmrSQ6C0QMtwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.590;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.628;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492317442;4.copy,1.1,2.70,3.190,3.890,2.19,2.14,1.1,2.50,3.190;4.copy,1.1,2.90,3.209,3.870,2.19,2.14,1.1,2.70,3.209;4.copy,1.1,3.160,3.342,3.800,2.19,2.14,1.1,3.150,3.342;4.copy,1.1,3.170,3.361,3.790,2.19,2.14,1.1,3.160,3.361;4.copy,1.1,3.240,3.380,3.720,2.19,2.14,1.1,3.230,3.380;4.copy,1.1,3.280,3.399,3.680,2.19,2.14,1.1,3.270,3.399;4.rect,1.1,2.24,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.74,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1832.iVBORw0KGgoAAAANSUhEUgAAALIAAABsCAMAAAD5YBgFAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADeUlEQVR4nO2bV1MUURCFB8x5XbOiKIgYMeecs2ICMa0554w5h38tjFVcqqZn9vSc3jso93vY6eqaU3Vev+rZKKpGXX3VV+iEMaGyD0JlH4TKPgiVfRAq+yBU9kGoHPiXGTIU2zEJY4YNHwHtmIQ1I0dhOyZhzOgxY6Edk7Bm3HhsxySMmVCaCO2YhDHl0iRoxySsmTwF2zEJY6ZOw3ZMwpjpM7AdkzBm5ixsxyRsaZg9B9oxCWMaS3OhHZMwZl5Tc+9jfktMQ/+dWcKYBa3xY2EpZlH/nVnClsVLyvFz6bKYtv47q4Qty5tWQDsmYczKVdiOSQwunO6g4sMkTHC6g4oPk7DB6Q4qPvkTq9c04sXScbqDig+RWLtOVy4Fpzuo+ORPrN/QghdLx+kOKj75E80bNynbiTjdQcWHSGzeoiuXgtMdVHzyJ7Zua8OLpeN0BxUfItG6He6VgdMdVHyIxI6dcK8MnO6g4kMkyrt2w8VScbqDig+TiPbs1ZSTcbqDig+TiPbtPwAWS8fpTkKGpIlMRAcPHaYrO91JyJA0kYkoOnKUbex0JylD0sQlLHC6g4oPkzDB6Q4qPkxisKKXHEaLTJRKLzmMFtkolf5uxFyakkqVQ670dyPm0iQoVQ650t+NmEtTUqlyyJX+bsRcmpJKlUOu9Hcj5tIkKFUOudLfjZhLU1KpcsiV/m7EXJoEpdLLlf5uxFyaBKXSy5X+bsRcmgSlUsuV/m7EXJpEpdLKlf5uxFyaRKXSyhUkQ5IWoYnqSqWVK0iGJC1CE4BS6eQKkyFJi9CEtVLpJYfRIhOl0ksOo0VBqQLFUfMvayWl4i5Xtf8YWFIq6nJV+8qSUlGXq9pXlpSKulx5+EpcUirmcuWhsqRUzOXKx7f4klIRlysflSWlIi5XPipLSkVcrrz8SUNSqvyXKy+VJaVKlatjx2Pa5ckVyH6PTIhK9XcSEnUnYk5G4uQKZL9HJmSliichcep0zJlInFyB7PfIRAb6RPiPVCDw39PRWXQDNZ0dRTfQcrbrXNEVtJy/UHQDLe0XL8XPSt8mexoAXL5ytee3cu36jZs9z1u3M6dCm/Zx527v7737Dx4+evzk6bPnmVPRZWNevHzV+3jdHUVv3r57311lGgjUf/jYN1c+fYamgvnytegGWr51fS+6gpYfP4tuoObXb9XrfwBSzDLP60vKrgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.593,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.132,3.383;4.blob,1.1,1660.iVBORw0KGgoAAAANSUhEUgAAAJIAAAAzCAMAAABL5aH3AAACRlBMVEUAAAAdRx00fzQMBQX1Y2NKHh6kQkKoREQMHgw+mD4HEAdGHBz2Y2MOBgYjViMucS4DAQHmXV1jKCgBAgE5jDkXOBeLODjBTk4SLRI7kjsDBwMtEhL+Z2cfDQ0pZSkoYijQVFR8MjIECQQ8lDwRKRFyLi7ZWFgYPBg3iTcAAQAYCgr8ZmY3FhYvdC8iUyK3SkqVPDwIFAgLGgtZJCTsX18GAgICBQIeSx4yfDIJBATyYmJQICA+mT4XOhc0gDQbQxucPz+qRUUNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWZJtRPHAAACUUlEQVRYhWNgQAGMTAzUAswsrFQxh4mRKsaAARs7NUzh4OSihjEQwM3DSwVT+PipYAgMCAgKUW6IsIgo5YYggJg45WZISEpRbggCSMvIUmyGnDwVHIIEFBQpNUFJWYUaDkEAVTVKTVDX0KSGQxBAS1uHQhN09ajiECSgb0CZfkNOI+o4BAGMTUzJ0GUGBsJAlrkFtV3EYGllTYYuGzCwBbLs7KntIgYGB0cyNDmBgTPVHTMKRsEowAVcXGlqPDlNXlcXGjgECZDe5HVz96CFQxCA9CavpxdNHIIAJDd5vX18aeMSBCC1ySvt508bhyBZQWKTNyCQRg5BAqQ1eS2DgmnlEAQgrckbEhpGK4cgAGlN3vAIqlgaGYmPhWjyYpVFBVHu0dRwUUxsXDxuFqLJi002ITEJxaxkivtaYJCSmhaDm4Vo8mKTTc/IRDErK5sqTiII8DR5c3Lp4wTiQV5+wUA7AR1kFhYNtBNGwQgCxSWlhJSUlYOpisRKKtobU1WNU66mlpDu8jIwVZFYRz0XMTDUN+CUamxqxq+3JQMSOq2JbVR0EUN7B65qj6Gzqxu/3vQeCN3bQU0XMWT29eOUmzARv9ZJk6nqFDiYMhWn1LTpM/DpnJkfg0+afDArowKn3Ow5+HQ21FPdMVAwdx5OqfkL8OjL61hIdbdAwSLcjYLFS5bi1rdsOc3qyRUrV+GUW70Gt76pU2jgGChYuw6n1PoNG3FJtWZsoolrwGBz7BZcUlu3bccltWMnbVwDBkm7duOU27MXl8y+/TRxDBQcOAgA7dlvT+PoWxwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.152,3.438;4.blob,1.1,4448.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.513;4.blob,1.1,3068.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;3.end,1.1;4.sync,10.6492317543;4.copy,1.1,2.90,3.190,3.870,2.19,2.14,1.1,2.60,3.190;4.copy,1.1,3.110,3.209,3.850,2.19,2.14,1.1,2.80,3.209;4.copy,1.1,3.120,3.228,3.840,2.19,2.14,1.1,2.90,3.228;4.rect,1.1,2.34,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.84,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1824.iVBORw0KGgoAAAANSUhEUgAAALwAAABsCAMAAADnqSi2AAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADc0lEQVR4nO2bV1NUQRCFB8x5XbOiKIgYMeecwYgJxLTmBOaIOYd/LVyrGIvbe2/3nJ47W9Z8D+wUzak6r18d1hg+dfWCP3ZMeCOWD0UsH4pYPhSxfChi+VDE8qGI5SP/ByNGSq/aCYBRo8cIr9oJhLHjpFftBMD4CROFV+0EwqTJ0qt2AmBKaarwqp0AKJemCa/aCYTpM6RX7QTAzFnSq3YCYPYc6VU7ATB3nvSqnXCnYf4C4VU7AdBYWii8aicAFjU1518XtyQ0eEkALGllXJeWEpZ5SbizfEWZcV25KqHNR8Kd1U1rhFftBMDaddKrdiJiZY2rbUhCGStrXG1DEtpYWeNqm3ti/YZGfjEOVta42gYkNm6SlcvFyhpX29wTm7e08ItxsLLG1Tb3RPPWbcJ2OVhZ42obkNi+Q1YuFytrXG1zT+zc1cYvxsHKGlfbgETrbnYvFlbWuNoGJPbsZfdiYWWNq21AorxvP7sYAytrXG1DEubAQUm5PKyscbUNSZhDh9uZxapQRdZSKke9wITpOHIUK19F1lIqR73AhDHHjmPlaVlLqxz1whK6WFnjahuSUMbKGlfbkETEIlc0ROqUhVCuaIjUaQuhfLNDVr60EEJqKN/skJWPEEJIDeWbHbLypYUQUkP5ZoesfGkhhNRQvtkhKx8hhJAayjc7ZOVLCyGkhvLNDln5CCFE1FC+2SErHyGEiBrKNztk5SOEEFBD+WaHrHykELqroXyzQ1Y+UghFakgpWrbKIYl8IRSpIaVo2SqHJBhCKFFDStGyVQ5J+BNCuaIhUqcshHJFQ6QuCmGk9vH+X9yUEGqthv7/BZ0SQqXV0H95SgiVVkP/5SkhVFoNC/jmAiWEOqthAeUpIdRZDYv4zgglhCqrYRHlKSFUWQ2LKE8JocpqWMhXjSgh1FgNCylPCWFVNTxxMqEz72WreE2QQvj3RSTqTiWcNjkvW8VrghbC5EUkzpxNOGdyXraK10QG8sS/xO8GRiKRYXR1h24A0N0VuoE753suhK7gzsVLoRu403n5SvJZGfpN9qumuHrt+sDPyo2bt24PfN65m/kK2pTg3v3Bn719Dx4+evzk6bPnma/QZYfx4uWrwY/X/ca8efvufX/Oq7ao//Bx6F359Jn1qhm+fA3dwJ1vPd9DV3Dnx8/QDQB+/Rb9+R97a0S5XaY2jgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.174;4.blob,1.1,1560.iVBORw0KGgoAAAANSUhEUgAAAFcAAABZCAMAAAB8HEguAAAB7FBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUIAwgHAweOOY6POo8KBAoEAgSBNIGDNYNUIlSZPpkFAgVWI1aYPpgCAQJnKmeCNYIJBAmSO5JCG0IyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxtHRx1/fzQsEiyVPZUvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxtL2K4pAAACYUlEQVRYhe2V+TsVURjHb52WW1zSokVZQpH2UiRdheziKtKitCFLWcpSslyRJdEupOUfxcwc7xmOe9+ZOeeHeZ55f7g+X885n4e57zNfl2vDRiJhXGTTZjneLVvdK8ntDnDUoHfb9hAaQj1h4cK8ZEcEDTt37Q4V590TuVeQTO8l+/bL8R6IkuM9eChaipfExGoJ9szqxineOM9hJcCeWd44xRufkKgE2DPLG6d4yZGjliTresWP47W9FxqJR+a9TCPxyLg3KUllaCQeGfYmH0s5rjA0Eo8Me0+cPJWsBmgkHhn1wkAj8ci8l2kkHpn3QiPxyLwXGolH5r3QSFwy6D195iyNtJF4BMeYC4G8586n0kgbiUdwjLkQyHvhImRopDUEx9gL63vT0i8FPUbYY5gLS97UjMsYLxzDXLDxe93xSvLSHrJGa7wrPWSFMq94s65e03mhh8xTdk7u9bz8Av1zEDCFRcWElJTeEO0tK1/+9FUI9t4svbX8o7JKsJfcVv/eap1XwJ7dUZ/vXdYrYs/uee+X1DzIhX9A0J6Rh7Ve36PHOq+UcbyO1+5eMT2kbyRRPcTQ0jx5Kur9wNCzuvqG58Kfb2NTc8uLl+K/t9a29g4iYR9eve7s6paxZz1v3jb01knZs3d9/XL2jAxI2DNl7Ph+cLx29Q76aUbR0PsM7RdAXK9/kGYcDY98IKuJ4x0dG9ciloKO4p34SCOWUN7JT1NawhLOO/35i5awhPN+/UYTllDe7z9+agFLOO/Mr1ktYAnnnZunAUso7++xBY2xhPP++UsZSzjvv/+UsYSZRUOHGnMqjrNqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.142,3.383;4.blob,1.1,3516.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.478;4.blob,1.1,3392.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.513;4.blob,1.1,3200.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;3.end,1.1;4.sync,10.6492317648;4.copy,1.1,2.80,3.190,3.880,2.19,2.14,1.1,2.60,3.190;4.copy,1.1,3.100,3.209,3.860,2.19,2.14,1.1,2.80,3.209;4.copy,1.1,3.180,3.342,3.780,2.19,2.14,1.1,3.170,3.342;4.copy,1.1,3.190,3.361,3.770,2.19,2.14,1.1,3.180,3.361;4.copy,1.1,3.270,3.380,3.690,2.19,2.14,1.1,3.260,3.380;4.copy,1.1,3.310,3.399,3.650,2.19,2.14,1.1,3.300,3.399;4.rect,1.1,2.44,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.94,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAAMYAAABsCAMAAAAGwj3nAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTEGBgYICAhvb2/m5uYCAgLIyMhgYGDMzMx9fX0oKCg0NDQTExNQUFDl5eUpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXAcLwAAADlElEQVR4nO2bV1cUQRBGG8x5XbOiKIKKYs4Rcw6YQExrzjljzuFfC+NKP0xtT31T1Tt9OH0fdmup+c5WPfBwT501xpiGRgNSjwRMXMNjAiau4TEBE9fwmICJa3hMwMQ1PCZg4hoeEzBxDY+JyJBg2HC0q51QYcTIUWBXO6HD6DFoVzuhwthx48GudkKHCRPRrnZChUmlyWBXO6FCuTQF7GondJg6De1qJ1SYPgPtaidUmDkL7WonVJg9B+1qJzRomjsP7GonVGguzQe72om8LGhJaEo+LGxtczxa7XpN5GVRKWFx8mFJu+vRatdrIi9LlyV0DNTLV5QdT/7v+kxosLJ1FdjVTqiweg3a1U5EKKxqcqVTkvCGVU2udEoS/rCqyZXO/Im165r5g2FY1eRKpyCxfgM2HIBVTa505k9s3NTCHwzDqiZXOvMn2jZvAadjY1WTK52CxNZt2HAAVjW50pk/sX1HB38wDKuaXOkUJNo72XOBWNXkSqcgsXMXey4Qq5pc6RQkyrv3sAeDsKrJlU5JwuzdhwzHx6omVzolCbP/wEHmYDWwgllDNVMi6iFhDh0+IlvDCmYN1UyJqIeEMUePydawgkmrZlpE9RO+sKrJlU5JwhtWNbnSKUlE3OCCKVFSbzqLC6ZESf3pLH4vlVxY0zqrJLb4vVRyYSV0Vkls8Xup5MKa1lklscXvpZILa1pnlcQWv5dKLqyEziqJLX4vlVxY0zqrJLb4vVRyYSV0Vkds8Xup5MJK6KyO2OL3UsmFldBZFbHF76WSCyupsxpii99LJRdWUmchsXULpltEJYlsnYXE1i2YbhGVJBg6i4itWzDdIipJ1ENnccGUKKk3ncUFU6KkUWcjoRLgLwYonc0S2wDXIHU2Q2xDXIPS2QyxDXENSmczxDbENUiddYttkGtQOusW2yDXIHXWKbZhrkHprFNsw1yD0lmn2Ia5BqmzLrENdA1KZ11iW/2K4ycSurKqOiVInf1X0YnqVzScTDiVVdUpQetsUtGJ6lecPpNwNquqU8IBnQj0fyMSiQxtunuKnkCFnu6iJ9DgXO/5okfQ4MLFoifQoOvS5eS9MvgXdxUoV65e63+tXL9x81b/++07zqrQSZ3cvTfwev/Bw0ePnzx99vyFsyp62Jq8fPV64O1NnzFv373/0JdRhUrjx0+DdeXzF1YVIF+/FT2BBt97fxQ9ggY/fxU9gQq//0CP/wXjMEwWeez3ngAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.543,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.152,3.383;4.blob,1.1,3516.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.421;4.blob,1.1,316.iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAMAAACn6Q83AAAAZlBMVEUAAAAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkXvUqYQAAAAQElEQVQImT3IRRKAQBTFwDe4Owwu978kq5+suiK5IJQVxTBJM2NelOyqhk3b4X6A4wTnxeN1g/txGq/7Yb+f9ANrUgIyePBg8wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.478;4.blob,1.1,2500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492317748;4.copy,1.1,2.90,3.190,3.870,2.19,2.14,1.1,2.70,3.190;4.copy,1.1,3.110,3.209,3.850,2.19,2.14,1.1,2.90,3.209;4.copy,1.1,3.120,3.228,3.840,2.19,2.14,1.1,3.100,3.228;4.copy,1.1,3.190,3.342,3.770,2.19,2.14,1.1,3.180,3.342;4.copy,1.1,3.200,3.361,3.760,2.19,2.14,1.1,3.190,3.361;4.copy,1.1,3.290,3.380,3.670,2.19,2.14,1.1,3.280,3.380;4.copy,1.1,3.330,3.399,3.630,2.19,2.14,1.1,3.320,3.399;4.rect,1.1,1.4,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.54,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.104,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1856.iVBORw0KGgoAAAANSUhEUgAAANAAAABsCAMAAAAscsxIAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADi0lEQVR4nO2bV1MVQRBGB8z5illRFESMmHPOWTGBmK4554w5h38trFXMWtssX0/P7Rmr5jzc7erar7b7gYdTXRiTp67eMNFICEgLpYXSQjLSQmmhtJCMtFBaKC0kIy0U+0KJGBkyFOvpJgQMGz4C6ukmJIwchfV0EwJGjxkL9XQTEsaNx3q6CQETKhOhnm5CQENlEtTTTUiYPAXr6SYETJ2G9XQTAqbPwHq6CQEzZ2E93YQ7jbPnQD3dhICmylyop5sQMK+5pe8xvzWjMd8LmBCwoC17LKxkLMr3AibcWbykIXsuXZbRnu+FS7izvHkF1NNNCFi5CuvpJhIoVpRRZZYkFLCijCqzJKGBFWVUmd0Tq9c04YO5YkUZVWZBYu063nBOWFFGldk9sX5DKz6YK1aUUWV2T7Rs3MSczgEryqgyCxKbt/CGc8KKMqrM7omt29rxwVyxoowqsyDRth2eyxkryqgyCxI7dsJzOWNFGVVmQaJh1254MEesKKPKLEmYPXs5w7lgRRlVZknC7Nt/ABxsAKwUU5XJi3JBo2uQMAcPHZYtZKWYqkxelAsaXYOEMUeOyhayUkxVeVEuarT/RO2xoowqsyShgBVlVJkliQQfvh5LhFpBxvl6LBFqDRnn36ol1+2ijHvXcv6tWnLdJmTcu5bzb9WS63ZRxr1rOf9WLbluF2Xcu5bzb9WS6zYh4961nH+rlly3izLuXcv5t2rJdZuQcd9azr9VS67bhIz71nL+rVpy3SZk3LOW82/Vkus2KeN+tZx/q5Zct0kZZ2k5qsfl70kSg8s4S8tRPS5/T5IAZJyj5agel78nSejKOF+PJUKtION8PZYIdZLxxP9OhP+dQsk4ruURLkTKOKzlMS5EyTis5TEuRMk4rOUxLkTKOKrlUS5EyTiq5VEuRMo4qOVxLkTJOKjlcS5EyTio5XEuRMo4puWRLkTJ+IBafux4Rkf+Y7ZXXiklSBn/WxGJuhMZJ/Mfs73ySilBy3hWEYlTpzPO5D9me+WVUqKEwRKR/g0lEonEv3R2hZ7AM12doSfwy9nuc6FH8Mv5C6En8EvHxUvZs9rfKa+i5/KVq72/1WvXb9zsfd66XVoFnRTkzt2+33v3Hzx89PjJ02fPS6vQwwK8ePmq7/G6x5g3b9+97xmkip/6Dx/76+qnz1AVNV++hp7AL9+6v4cewS8/foaewDO/frNe/wOUamCiZjRENwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.174;4.blob,1.1,1512.iVBORw0KGgoAAAANSUhEUgAAAGAAAABZCAMAAAD2M9FvAAAB7FBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUIAwgHAweOOY6POo8KBAoEAgSBNIGDNYNUIlSZPpkFAgVWI1aYPpgCAQJnKmeCNYIJBAmSO5JCG0IyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxssEiyVPZVHRx1/fzQvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsgMiuiAAACO0lEQVRoge2V91MTURDHn5WoiWJDUUDBlthQMKiAxhbAElTsHWuIKHbsihosEXvBAtZ/FJPzbt/FPeb2bt8MzrzPD3mfJG93c5Od+QphMmz4CKGWkaMUDxhdELA8EBjkolfGjB1najA0foKCCYUTTZs0eUpQwYCpRdMUdJWZXqx4wIyZigeUlJYpnjBr9l+BNeVd2PJQRe6ENWVe2Dlz5+VOWFPuhZ2/gLObRqMOCE/MOIDwxMwH4bBxQnhi5p3IwkWLcwLhiZl3liytjBgG4YkZAxCemHEA4YkZAxCemDEA4YkZB1Z4okZi2fIqRM3wxAyuSQXOVK+IImqGJ2ZwTSpwpmYlplJ4/mNwTS5wYtXqWkTdVbgqiNbVI+quwmWBRuMfMyi5LB8rKHlszdrYuvUb5AEQlBy2cVO8obFps9PT+GfL1m1CJJq3KxuwY2f2tWWXqv67m/dkj737VA0Q+40nOIB/y7CmB43/4JDc1so9jjU9HDuSOHosbvvdVu6xLGzr8VjLiZO2AW5yzw8ug9I7Ovc0/wPckZkfnsyRKdkfTp3mjkzZziTbUmeFMtrPne+4cFFdf3Hp8pWrCtsLca3z+o2bSifcun0ndTdp+4h9Te/d7xLMkZm3puKB4I5MyUx0ZGqGPg8f1cGbdDfJoNbWJY/HT55a3p2mGdTKXZx5lnlONCI9L6hG4+Wr10Qj8ubtO6IRef+BajQ+9n4iGpHPX74SjUhfP9VofMt8JxqRHz+pRuTXb6q5YQDHoNfe1iSefgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.162,3.383;4.blob,1.1,3528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,3.421;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAMAAACejr5sAAAAtFBMVEUAAAAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4BAAAtLRL+/mcfHw0CAQGUPDz1Y2PlXFxpKiqQOjoYCgrQ0FR8fDJaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARyci7Z2VhmKSlgJycvExPWVlb/Z2f7ZWUYGAr8/GY3NxYnEBAQBga3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkXZGaULAAAAbklEQVQYlWNgYGRiZsAELKxYBNnYOTAFObm4sSjl4YUy+JAE+QUEQZSQsIioGJAWlwCLSkqBSGkZWTl5BUUlZRWwoKoaiFTXYGDQ1NLW0YDo19XThxnFZ2AIYxoZY7HfxNQMU9DcwhKLUitrZB4A5IYHIbN8/TYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.478;4.blob,1.1,2500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.513;4.blob,1.1,2552.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.571;4.blob,1.1,620.iVBORw0KGgoAAAANSUhEUgAAAOEAAAASCAMAAACaa0n/AAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAAAv0lEQVRIid3PBRLCQBQE0Z/FPSTI4u4S3J373wnYnGFqqngn6Bax1F8LSDAUZkcgRaKiYnF2BVAimRKVztjsDpis4ypRKpdnh8AUMtbvsKiFXYJSKqvfYUVX2SUotbo5VI0muwSkpQv+YbvDTgHp6p5/2M+xU0AGeugfjsbsFJCJts1hdjpjp4DMvYU5XOoVOwVl3TGH7mbLLkFpOuZwt2eHwBy84/fwdK6wQ3Au163cNgl2BpB1f0jvya6Aer0/fMEqChxtyPMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,2564.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.647;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492317857;4.copy,1.1,2.90,3.190,3.870,2.19,2.14,1.1,2.70,3.190;4.copy,1.1,3.110,3.209,3.850,2.19,2.14,1.1,2.90,3.209;4.copy,1.1,3.200,3.342,3.760,2.19,2.14,1.1,3.190,3.342;4.copy,1.1,3.210,3.361,3.750,2.19,2.14,1.1,3.200,3.361;4.copy,1.1,3.310,3.380,3.650,2.19,2.14,1.1,3.300,3.380;4.copy,1.1,3.350,3.399,3.610,2.19,2.14,1.1,3.340,3.399;4.rect,1.1,2.14,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.64,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.114,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1912.iVBORw0KGgoAAAANSUhEUgAAANoAAABsCAMAAAA7UFyBAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADtUlEQVR4nO2b11MUQRDGB8z5xKwoCiJGzDnnrJhATJhzzphz+K/l1ip6q7Zvrvump2eumN/D7VRvf7XTDzx8XzXG4DQ0VnhREQ2FCGk0ZYUIaTRlhQhpNGWFCGk0ZYUIaTRlhQhpNGWFCGk0ZUViSDFsOK2mqxBhxMhRpJquQobRY2g1XYUIY8eNJ9V0FTJMmEir6SpEmFSaTKrpKkRoKk0h1XQVMkydRqvpKkSYPoNW01WIMHMWraarEGH2HFpNVyFB89x5pJquQoSW0nxSTVchwoLWtvJjYXtGc74WUCHCoo7ssbiUsSRfC6iQYOmypuy5fEVGZ74WTiHBytZVpJquQoTVa2g1XUUCg2rfoU9DIQLVvkOfhkIGqn2HPv+KtetaaAI7VPsOfQqK9RtI/dWg2nfo86/YuKmdJrBDte/Q51/RtnkLqb8KVPsOfQqKrdtI/dWg2nfo86/YvqOTJrBDte/Qp6Do2EkT2KHad+hTUOzaTRPYodp36FNQNO3ZS1PYoNp36NNQmH37SQorVPsOfRoKc+DgIZLERsHSYyeTt/kaCnP4yFHn0QqWHjuZvM3XUBhz7LjrZEVLj53yNl9DIQHVvkOfhkIEqn2HPg1FQga+uXeJAxS2EgC+uXeJAzS2EgD+noDLZkExShAKFTD4ewIumwVIlCAUKmDw9wRcNguKUYJQqIDB3xNw2SwoRglCoQIGf0/AZbMAiRKEQgUM/p6Ay2ZBMUoQChUw+HsCLpsFSJQgEypg8PcEXDYLkChBJlTA4O8JuGwWIFGCSKiAwd8TcNksQKMEiVABg78n4LJZgEYJrFDBbukxc+9PUT1KYIUKdkuPmXt/CkKUwAkV7JYeM/f+FLpbCQDf3LvEAQpbCQDf3LvEASlKSAwVIvxPKCxKqCVUiHA0NEqoIVSIcTQsSqghVIhxNCxKqCFUiHE0NErghwpRjoZFCfxQIcrR0CiBHSrEORoWJbBDhThHw6IEdqgQ52holMANFSIdDYsSKoYKJ05mdOVP8FnsbUAFGiX8PyGKhlMZp03uBJ/F3gZU4FFCdkIUZ85mnDO5E3wWextQYYGuiPRvLZFIJFzp7gl9A2/0dIe+gS/O914IfQVfXLwU+ga+6Lp8JXv2DVbspzri6rXrA799N27euj3wvHPXegp6Uzb37pd/Hzx89PjJ02fPX7y0nkJflsWr12/Kj7f9xrx7/+Fjf5VTPdH46fPgue/LV9KpTvj2PfQNfPGj92foK/ji1+/QN/DGn7+s9n/nYm9VyaD9jQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.172,3.383;4.blob,1.1,3548.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,3.421;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAMAAACejr5sAAAAtFBMVEUAAAAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4BAAAtLRL+/mcfHw0CAQGUPDz1Y2PlXFxpKiqQOjoYCgrQ0FR8fDJaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARyci7Z2VhmKSlgJycvExPWVlb/Z2f7ZWUYGAr8/GY3NxYnEBAQBga3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkXZGaULAAAAbklEQVQYlWNgYGRiZsAELKxYBNnYOTAFObm4sSjl4YUy+JAE+QUEQZSQsIioGJAWlwCLSkqBSGkZWTl5BUUlZRWwoKoaiFTXYGDQ1NLW0YDo19XThxnFZ2AIYxoZY7HfxNQMU9DcwhKLUitrZB4A5IYHIbN8/TYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.478;4.blob,1.1,1936.iVBORw0KGgoAAAANSUhEUgAAAEQAAABHCAMAAACJWREuAAACqVBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwmXl4pZmY0gIAbQ0MPDyQvL3VQUMUbG0RgYO4BAQNYWNotLXAhIVJjY/UFBQwfTU0dSUkECwtFRatHR7A3NzfBwcH39/fp6emTk5MMDAxNH01JHUkLBAsJFhZfX+owMHYnJyf29va4uLhISEhiYmLu7u61tbVDG0OUPJSTPJNZJFkWCRYaPz8xenoPJSUUMjJnZ/+qqqra2toEBARHR0f///9BQUEJBAk/Gj96MXqYPphqK2olDyULHBwSKysECgoQECcbG0L09PSEhITr6+uMjIwcCxxuLG6ZPpkrEisxeHgTEy4ZGT4JCQlsbGzR0dGgoKAHAwc8GDx4MXiXPZdlKWUQBxAmXV0iVVUHEhILCxwdHUn19fWNjY0bCxtdJl2SO5KRO5FVIlUSBxI2hoYCAgZlZfqtra1EREReJl6GNoZEHEQIAwgJFxdQUMY8PJUpKSm3t7dfX1/t7e0XCRcCAQIzM35YWNs6OjrExMSXl5cODg4LCxoXFzo5OY1NTb8AAAEEBAtTU802NoUICBQxMXoXOjoKGBgFCwtKZ7dOAAACvElEQVRYhWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomTgVTJCSpYIiUtAzlhsjKyVNuCIOCIhUMGQV0BkrKKtglVNVI0KGugV2tmioue7Ho0NTSxqZSR1cPlyFYdOgbGGJTaWSMywysOkxMsSk0M8dpCDYdFrqWmOqsrJVAlI0tCNihsLDrsHfANERDHUw5OoGAMwoLuw4XVwwhNy13CO0BAp4oLOw6vLx90IV8/WwwXYdXB4N/ALqIqQk+M7DpYAgMCkYVCNENxW8Ihg4GBtuwcFSBiEj8ZmDqAIKoaFR+TCwBQzB0jAKKQBwVzIhPoNyMxCTKWwXJKamUOyQtPQOXVGZWNpGG5ORCGXn5BYVFxUBGSWkZRCRWSzmgHMyyA5ddtjjLgIpKCF1VXVNbV98AZDU2Nbe0gsXc2tp1nTuADHVw2eXUicMMga40CKO7p5eBoa9/ApA5cdLkKVOnQYSn+zvNAOZ/cNnlMROHIbO6ZkMYc+aCyHnzIbwFCxctBlJKvku8NfQIemdp1zIwvbx/BYhauQpErl6zdt36DQwWG63DNm1mIOydLV1bIYxtEJdsZ2DYsXPX7j17gZyofS7Q+oyAd/YfgHYzDkLC5BADw+EjR4+BhY7r49CEAU6chNCnCk73nTlbA2SdO0+sXji4cBHKuHS5YN6VqyTrB4NrB66TpxEF3Lh5i3JDbt+5S7khDPfuU8GQoQLQWoo4W5Q4dYAAeksRV4sStw4sLUUcLUo8OrC0FHG0KPHowNZSxNqixKsD2lJEBlhblHh1QFuKKABbixKfDlhLEQVgaR/i1YG1pYitfYhPB/aWIpb2IR4dOFqKWNqHeHTgaClC2ofBkGpEH5mFTQeuliK4fbgEUo08QGYR0bZEBQ8h1cgjZBYmAACRhbbORGif9AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,964.iVBORw0KGgoAAAANSUhEUgAAAGoAAABxCAMAAAAK7sb9AAABEVBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSswdzBW1FYFDQU8kzwSLBImXiYucS5m/WYLGwsSKxI+mT46kDpMvEwDCAMVNBUCBAJe6V44izgfTB8eSx5j9GMECwQ0gTQkWSREqURCo0IzfzMGDwZk92QcRRw2hTYhUiEoZChc5FwBAgE9lT0aQRpOwk44ijgLGgsMHQwNIQ1n/mcbQxsAAQAyfTJTzlMyejJW1lYtcC0TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7TEhU4AAABe0lEQVRoge2Xx1ICQRRFGzAMIoZWDGDOomLArOAYwBww6/9/iDvL6Z7d494qrHd27y7mFBuqjzG/JJKGRaqtnebq6AR+PEj/vboy3ThVOoic2R6YKdXbF7n7bQKlGhiM3jk7BDINj2SdZTQPUhXGxp1lYhKkmpp2lxn3ZzaJ2bl5d1pYxKiWlovOUlxZxajWSu6ybjcgps0t77+hXNqGqHZ2vWmvADGZ/QN3OTzKYVQex6UKyWSqJywTh5BmOj1jmSrnFyRTsVYmmUw9Q3uUXV6xTOb6hmW6tXWW6s5WWap7+8BSPVrgkzbKU+OZpTIB6kHmk6/RVC+NV5rr7R3zeIkh+fHJUpmvb5qKjxa+FGjhOwAL3wVY+C64wveBFb4PrPB9UIUfA6rwfWCF74Mq/BhQhR8DqvB9tPBbgJBm0sIXoYUvQwtfiBa+FC18KVr4TUILX4oWvhQtfCla+DK08GVo4bcAIc2khS9CC1+GFr4QLXwpWvhS/mHh/wDO4zNP5l/fXAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492317955;4.copy,1.1,3.100,3.190,3.860,2.19,2.14,1.1,2.80,3.190;4.copy,1.1,3.120,3.209,3.840,2.19,2.14,1.1,3.100,3.209;4.copy,1.1,3.130,3.228,3.830,2.19,2.14,1.1,3.110,3.228;4.rect,1.1,2.24,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.74,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.124,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,1880.iVBORw0KGgoAAAANSUhEUgAAAOQAAABsCAMAAABNau4KAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADnUlEQVR4nO2bZ28UQQyGJ6H34+gQCCSEUEPvvXcILSG0o/feQ+/lX5NbpPNJa/be2fV4JmieD7eW5Ucaf8iXV44xjWhqbjjiwRAmLunNECYu6c0QJi7pzRAmLunNECYu6c0QJi7pzRAmLunNiERqDBmK9XQNYYYNHwH1dA1pRo7CerqGMKPHjIV6uoY048ZjPV1DmAmliVBP1xCmXJoE9XQNaSZPwXq6hjBTp2E9XUOY6TOwnq4hzMxZWE/XkKVl9hyop2sI01qaC/V0DWHmtbVXP/M7Elrqex4NYRZ0Jp+FpYRF9T2PhiyLl5ST79JlCV31PX+GLMvbVkA9XUOYlauwnq4RQUHDB5rTMIRBwwea0zCkQcMHmnNvrF7TigkoaPhAcwrG2nXQPA4aPtCce2P9hg5MQEHDB5pzb7Rv3ATNw6DhA80pGJu3QPM4aPhAc+6Nrdu6MAEFDR9oTsHo3I4JKGj4QHMKxo6dmICChg80p2CUd+3GDAw0fKA5DcPs2QsZIGj4QHMahtm3/wCkYKQCCa4y9SGFhmEOHjosuGQqkOAqUx9SaBjGHDkqt2M6kOCq+pBCw5AFDR9oTsMQBg0faE7DiKDYBw0ahoxbwz5o0DBkXML+4kLDSLsUhOSIROwvLjQMxqUgJEckYn9xoWGkXQpCckQi9hcXGkbapSAkRyRif3GhYTAuBSE5IhH7iwsNI+1SEJIjErG/uNAwGJeCEPtIxP7iQsNgXApC7CMR+4sLDYNxKQixjkTsLy40DNalIMQ2ErG/uNAwWJeCENtIBAokuGjCndE4CLGNRKBAgosm3BlAEGIXiWCBBBdNuDOkgxD7oEHDkHFr2AcNGoaMG4n8jwT4X3dcEFLsSiTAJdkgpNCVSIhLckFIoSuREJfkgpBCVyIhLskGIUWuRIJckgtCilyJBLkkG4QUuBIJc0kuCClwJRLmklwQUuBKJMwl2SAk/5VIoEtyQcg/I5FjxxO6+YoekD2nbrBByN+KMZpOJJw0bEUPyJ5TN/ggJKkY49TphDOGregB2XPqRgb2RrB/k5FIJKJPT6/vFyjQ2+P7Be4523fO9xPcc/6C7xe4p/vipeRbqXWyq0HJ5StXB34r167fuDnwvXU7s/L60gLcuVv9vXf/wcNHj588ffY8s/L92Jy8ePmq+nndb8ybt+/e9zeoBifNHz7W6sqnz1A16Pjy1fcL3POt77vvJ7jnx0/fL1Dg12+r8T/n1HrRitGXYAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.12,3.174;4.blob,1.1,1512.iVBORw0KGgoAAAANSUhEUgAAAGAAAABZCAMAAAD2M9FvAAAB7FBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUIAwgHAweOOY6POo8KBAoEAgSBNIGDNYNUIlSZPpkFAgVWI1aYPpgCAQJnKmeCNYIJBAmSO5JCG0IyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4SLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxssEiyVPZVHRx1/fzQvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsgMiuiAAACO0lEQVRoge2V91MTURDHn5WoiWJDUUDBlthQMKiAxhbAElTsHWuIKHbsihosEXvBAtZ/FJPzbt/FPeb2bt8MzrzPD3mfJG93c5Od+QphMmz4CKGWkaMUDxhdELA8EBjkolfGjB1najA0foKCCYUTTZs0eUpQwYCpRdMUdJWZXqx4wIyZigeUlJYpnjBr9l+BNeVd2PJQRe6ENWVe2Dlz5+VOWFPuhZ2/gLObRqMOCE/MOIDwxMwH4bBxQnhi5p3IwkWLcwLhiZl3liytjBgG4YkZAxCemHEA4YkZAxCemDEA4YkZB1Z4okZi2fIqRM3wxAyuSQXOVK+IImqGJ2ZwTSpwpmYlplJ4/mNwTS5wYtXqWkTdVbgqiNbVI+quwmWBRuMfMyi5LB8rKHlszdrYuvUb5AEQlBy2cVO8obFps9PT+GfL1m1CJJq3KxuwY2f2tWWXqv67m/dkj737VA0Q+40nOIB/y7CmB43/4JDc1so9jjU9HDuSOHosbvvdVu6xLGzr8VjLiZO2AW5yzw8ug9I7Ovc0/wPckZkfnsyRKdkfTp3mjkzZziTbUmeFMtrPne+4cFFdf3Hp8pWrCtsLca3z+o2bSifcun0ndTdp+4h9Te/d7xLMkZm3puKB4I5MyUx0ZGqGPg8f1cGbdDfJoNbWJY/HT55a3p2mGdTKXZx5lnlONCI9L6hG4+Wr10Qj8ubtO6IRef+BajQ+9n4iGpHPX74SjUhfP9VofMt8JxqRHz+pRuTXb6q5YQDHoNfe1iSefgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.182,3.383;4.blob,1.1,3548.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.478;4.blob,1.1,2500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.513;4.blob,1.1,3048.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;3.end,1.1;4.sync,10.6492318060;4.copy,1.1,3.100,3.190,3.860,2.19,2.14,1.1,2.80,3.190;4.copy,1.1,3.120,3.209,3.840,2.19,2.14,1.1,3.100,3.209;4.copy,1.1,3.220,3.342,3.740,2.19,2.14,1.1,3.210,3.342;4.copy,1.1,3.230,3.361,3.730,2.19,2.14,1.1,3.220,3.361;4.copy,1.1,3.340,3.380,3.620,2.19,2.14,1.1,3.330,3.380;4.copy,1.1,3.380,3.399,3.580,2.19,2.14,1.1,3.370,3.399;4.rect,1.1,2.34,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.84,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.134,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,1.3;4.blob,1.1,1880.iVBORw0KGgoAAAANSUhEUgAAAOQAAABsCAMAAABNau4KAAABnlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwVHRx1/fzQeHgyYmD4QEAdWViNxcS6MjDk4OBcAAQEtLRKSkjsHBwMkWVk8k5M4iYkaPz8jVlYGDg5lZSliYigWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcJCQSUlDwpKREZPT0XOjoLHBw0gIA+mZk9l5eJiTcBAQAJFxcECgp0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsXgGbvAAADnUlEQVR4nO2bZ28UQQyGJ6H34+gQCCSEUEPvvXcILSG0o/feQ+/lX5NbpPNJa/be2fV4JmieD7eW5Ucaf8iXV44xjWhqbjjiwRAmLunNECYu6c0QJi7pzRAmLunNECYu6c0QJi7pzRAmLunNiERqDBmK9XQNYYYNHwH1dA1pRo7CerqGMKPHjIV6uoY048ZjPV1DmAmliVBP1xCmXJoE9XQNaSZPwXq6hjBTp2E9XUOY6TOwnq4hzMxZWE/XkKVl9hyop2sI01qaC/V0DWHmtbVXP/M7Elrqex4NYRZ0Jp+FpYRF9T2PhiyLl5ST79JlCV31PX+GLMvbVkA9XUOYlauwnq4RQUHDB5rTMIRBwwea0zCkQcMHmnNvrF7TigkoaPhAcwrG2nXQPA4aPtCce2P9hg5MQEHDB5pzb7Rv3ATNw6DhA80pGJu3QPM4aPhAc+6Nrdu6MAEFDR9oTsHo3I4JKGj4QHMKxo6dmICChg80p2CUd+3GDAw0fKA5DcPs2QsZIGj4QHMahtm3/wCkYKQCCa4y9SGFhmEOHjosuGQqkOAqUx9SaBjGHDkqt2M6kOCq+pBCw5AFDR9oTsMQBg0faE7DiKDYBw0ahoxbwz5o0DBkXML+4kLDSLsUhOSIROwvLjQMxqUgJEckYn9xoWGkXQpCckQi9hcXGkbapSAkRyRif3GhYTAuBSE5IhH7iwsNI+1SEJIjErG/uNAwGJeCEPtIxP7iQsNgXApC7CMR+4sLDYNxKQixjkTsLy40DNalIMQ2ErG/uNAwWJeCENtIBAokuGjCndE4CLGNRKBAgosm3BlAEGIXiWCBBBdNuDOkgxD7oEHDkHFr2AcNGoaMG4n8jwT4X3dcEFLsSiTAJdkgpNCVSIhLckFIoSuREJfkgpBCVyIhLskGIUWuRIJckgtCilyJBLkkG4QUuBIJc0kuCClwJRLmklwQUuBKJMwl2SAk/5VIoEtyQcg/I5FjxxO6+YoekD2nbrBByN+KMZpOJJw0bEUPyJ5TN/ggJKkY49TphDOGregB2XPqRgb2RrB/k5FIJKJPT6/vFyjQ2+P7Be4523fO9xPcc/6C7xe4p/vipeRbqXWyq0HJ5StXB34r167fuDnwvXU7s/L60gLcuVv9vXf/wcNHj588ffY8s/L92Jy8ePmq+nndb8ybt+/e9zeoBifNHz7W6sqnz1A16Pjy1fcL3POt77vvJ7jnx0/fL1Dg12+r8T/n1HrRitGXYAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.463,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.326;4.blob,1.1,1580.iVBORw0KGgoAAAANSUhEUgAAADgAAABHCAMAAABlLHQ4AAACPVBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/dDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0JBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBAHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8bCxtdJl2SO5KRO5FVIlUSBxIREQcsLBJeJl6GNoZEHEQIAwgEBAGWlj09PRkXCRcCAQJ3dzBZWSQECwth7+8GEBBMTB8DBwdX19dY29sxeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5efu6uAAACHklEQVRIiWNgwAsYmZjxK8AJWFjJ1MjGzkGeRk4ubjKt5OElUyMfvwCZOgWFyNQoLEKmRlExcTJ1SkiSqVFKWoY8jbJy8mRaqaBIpsZRQD2gpIzCVVFVI1KjshIqX12DOH2aWtqoAjq6ekRp1DdAEzA0MiZGn6GJKbqQmTkxGi0sVdCFrLSsidCooY4pZmNLWJ+drj2moIMjYY1Ozi6Ygq5u7gQ1mpthE/XwJKTPS8sbm7CPrx8Bjf4BWIUDg4IJaAwJxS4eFk5A48gDEWTqi4wiT190TCyEERefQIq+xKRkBpjGFFI0pqalQ1kZ8ZnIElnZOXg15ubBWPkFKBKFRcUlpWBWWTkYVKBqrKzCZWR1TW1dfQOQ0dgEBs0osi2tqXic09be1MHA0NkFBt0oUj2tvTi19fVPmDhpMg6nTmmdikPbtOkzZs6azYDLqXNa5+LQOG/+goUQFlanLlq8BIsmDmDLcOkynH4Ag+UrMMVWSq9ajVWxXyAYGILYa5Iw5deuW78Sq8YNG8FgE4i9efEW/E5CBlu3gcF2MGfHzl3E60QG6bv3kKeRYe8+MjUOaoCzhYHWEsEEuFoY6C0RDICjhYHREsEAOFoYGC0RTIC1hYGlJYIBsLYwsLREMAG2Fga2lggGwNLCwNoSwQBYWhhYWyKYALOFgb0lggEwWhg4WiIYANLCQCpEcLREMAG4hYFUiOBqiWAHKIUICgAApHqH0Xe0XG8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.192,3.383;4.blob,1.1,1684.iVBORw0KGgoAAAANSUhEUgAAALoAAAAzCAMAAAAXb+LTAAACRlBMVEUAAAAdRx00fzQMBQX1Y2NKHh6kQkKoREQMHgw+mD4HEAdGHBz2Y2MOBgYjViMucS4DAQHmXV1jKCgBAgE5jDkXOBeLODjBTk4SLRI7kjsDBwMtEhL+Z2cfDQ0pZSkoYijQVFR8MjIECQQ8lDwRKRFyLi7ZWFgYPBg3iTcAAQAYCgr8ZmY3FhYvdC8iUyK3SkqVPDwIFAgLGgtZJCTsX18GAgICBQIeSx4yfDIJBATyYmJQICA+mT4XOhc0gDQbQxucPz+qRUUNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWZJtRPHAAACYklEQVRoge2YZ1MTURSGAyqKCqjYkCLYe0FUOoIgIiI2UDQowUJiAemxQFBaxAIKCCgg9gr2ivWfwWw+hJ3Ze8m551wyzOzzZe/Mufucd/Jp3xgMKjw8DWPNhImTSDyeHiQaEF6TKSxTvKdSaGBMm+5DYPH1I5BAmTFzFl7iP3sOXgJn7jy8Y37AArwETmBQMNoRspAgiAChYVjDosVLKILAWboMa1i+YiVFEDirVq9BGtauIwkiwPoNuPc3eofTBIGzKWKzwFtbFPyHT1sjqRO5TFR0jMBbsQpxw6f4BOpErrMtUeClJIXt5GF0dHR0HCSnuDuBgkjVS0mWEEQAeNXbkbpTRhA48KqXtktKEDjgqpe+O0NOEjjQqhe4J1NOEDjQqrd3n6QgAsCqXtT+A7KCwIFVvYNZ2bKCwIFVvUOHpQXRIieHd3JWPc2pmiOpR4nDcTHmHjvOPjmrntY0z5Svcp1A/wcC4uSp00b2yVn1tKYFZovKdeas3KxQOFXv3PkxzEFKYdEFd0cQxVJc4u4IOjrjjtKy8tGuVFQqD6vpIuFe46XLaMeVqtFuVFYoD6upGr1sBLYatOLqtVr+hTqz49euNzWgl42g0c76rHGZ6003+BcKbjqet+zYVSost5vRjpY7/BV3W9ErNGlrRyvudXTyxl1FRt5YnPtmK9rxoJs3rbGhFzDo6UUrHvZxhoX2R+gFDB7jPyKfPH3GHj5/Ie176eWr12jHm7fsWXsbWs+kfwCtePf+A2tUb/6I1jP5lPsZq/jy9Rtr9P0HVs4h/+cg2vHrN2vy5y9azuHf/yGz7W9Px99b6wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.421;4.blob,1.1,388.iVBORw0KGgoAAAANSUhEUgAAABMAAAANCAMAAAB8UqUVAAAAgVBMVEUMDAX19WNKSh4AAAAZGRk+Pj4CAgKkpEKoqEQGBgYPDw85OTknJydGRhz29mMODgY3NzcgICADAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUIgNJnAAAAXUlEQVQYlWXIRxKCUBRE0QdN/ARFAZEgkhTc/wKJVlHVd3AHR0TTsWWYR5bAdnZzlVKevwyCILzg3zVaL7jdYzIkKdsje5IhL9jKiu1Vv8nQtGxdP5B9viMZph9OzUrtBxBa7bLeAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.252,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.478;4.blob,1.1,2500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAW0lEQVQYlcXPSRaCQBAD0CIgU2M3M6IyI97/hqQuAZu/S/Ii4gEQP3hQhJEaJymFydSnFepsTlGUalWrjVHbjr76N/3YLx3Gic4Ls+vmIPv4Y+fx1xXgHi/8eALt0Ag5Zzf4EQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492318160;4.copy,1.1,3.110,3.190,3.850,2.19,2.14,1.1,2.90,3.190;4.copy,1.1,3.130,3.209,3.830,2.19,2.14,1.1,3.110,3.209;4.copy,1.1,3.140,3.228,3.820,2.19,2.14,1.1,3.120,3.228;4.copy,1.1,3.230,3.342,3.730,2.19,2.14,1.1,3.220,3.342;4.copy,1.1,3.240,3.361,3.720,2.19,2.14,1.1,3.230,3.361;4.copy,1.1,3.360,3.380,3.600,2.19,2.14,1.1,3.350,3.380;4.copy,1.1,3.400,3.399,3.560,2.19,2.14,1.1,3.390,3.399;4.rect,1.1,2.44,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.94,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.144,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.3;4.blob,1.1,2056.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.174;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAAHUAAABZCAMAAAA3tJvDAAACl1BMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUIAwgHAweOOY6POo8KBAoEAgSBNIGDNYNUIlSZPpkFAgVWI1aYPpgCAQJnKmeCNYIJBAmSO5JCG0IyFDIBAAEMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyg3NzfBwcH39/fp6emTk5MMDAyLizjBwU4nJyf29va4uLhISEhiYmLu7u61tbUtLRL+/mcfHw2qqqra2toEBARHR0f///9BQUHQ0FR8fDL09PSEhITr6+uMjIxyci7Z2VgJCQlsbGzR0dGgoKAYGAr8/GY3Nxb19fWNjY23t0qVlTytra1ERERZWSTs7F8GBgIpKSm3t7dfX1/t7e0JCQTy8mJQUCA6OjrExMSXl5cODg6cnD+qqkV3dzDU1FYyMhT9/WYbGwuQkDq8vEwSLCwsbW0EBALp6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMLCwQCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwsPDwb392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0sLBILGxt9fTLOzlPW1lZwcC0sEiyVPZVHRx1/fzQvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS6MjDk4OBeSkjsHBwNlZSliYiiUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGguAgDRDQxskYOxpAAACwklEQVRoge2W9XMTQRiGFw/Q4u5Oi1ux4k7wIi3SQqG4uxWnxa2U4u5a3LVFirvzx5Dc9m7vki83+eDbu5nOPT9kn+zs3juXzDfzMmZKrtx5zA/IIW8+O1LzF3Bp7nKZHCSlYKHCqoaEFilqVWyx4qqVKFkqxKrU0mXKWhWlp1x5O1IrVLQjtVLlKnbEVq2WLWJyLJih6qE1lFVMjhUzVLNWbWUVk2PJDNWpKz3CwSGnIroMZNIQXQYyasLC+Cq6DGTEhNer30AR0WUgI6Zho8bh3ESXgUwWostAJg3RZSCThegykMlCdBnIpKF1GdD+nyZNmwGqdhnIxDHdBSTNW0QAqnYZyMQx3QUkLVtBqusyfiaO6S+gaN2mLaDB3QjyAkBEZDtAg7sR5AWHnEj7Dh3tiO3U2Y7ULl27aa62FXrzpXuPnqpqbYXaevV29+nbzxDbf4Bqoq3Q2sBBUYOHDB1mSI2OGR7odyBixMhRjMXGjTZsjomXnDp2nPczYbxhc8JEuaGT4iZ7lylTDbvTps+QGzuTv+ss4+7sOSZXCCZnLv9f5xkfPH/BQi5ADaGYnEXuxbFLlkb5vE7isuVcgBpCMkMrVroTVq32SWVr1vKVoIbgoagheJwa4kBAUrIdqclJNoSuW7+Bi7wGA3SZjZv4Kq3B6MzD5i3ez63btvOvshqM3nak7Ezd5ZW03Xv8Xl8Se/ftP3DwkKKHj1gVyo4eO36C28lTpy1LPXP23PkLil28lG5ZKrt85WrqtRSPXL9heo58cm7eus3YnZi72oakBuMzOeweY/cfiK+yGozOsnn4SLjTYBwc/oHHTyL9zENGJsoCPCUwT5899zPGMjNwBj8FyYusl0ij4NVrrBGQ/uYt0iiIfvceaRR8+Ig1AhI/fUYaBV++fkMaBd9/YI2An1m/kEZBWjzWKPj9B2vB8Bchvy+B8+SoVQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.326;4.blob,1.1,1724.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACqVBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgsECwth7+8GEBAeSx4yfDIDBwdX19dY29s0gDQbQxsWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgQBBAECBQJMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR48kzwSLBIRKhEDCAM4ijgYOxgLGwsIEwgzfTMeSh4cRBw1gjUGDgY9lz0NIQ0sbiwkWSQWNRY5jjk7kTsTMBMmXiYpZinDt43uAAACH0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpEy2VmUlcnWqqKqRq1Vdg1ydmlra5GrV0dUjV6u+Abk6DY2MydVqYmpGrlZzCyyCHMRUBJaqVpiC1tI2toS12tljEXRwdLImrNXZhbCaUYAGXMnW6eZOrk4PTy8Iw9vHlzSdfv4BDDCtgaRpDQoOgbJCfcJQpcIjIvFqjYqGsWJiIXRcfAKEkZiUnJIKZqWlg0EGqtbMLHTDsnNy8/LBrILCouKSUiCjrBwMKlDUVVYFYTikuqa2rr4Bwm5sKm9mYGhpBYM2FGXtVR3YvNHZ1d0DpHr7+idMnITDwZOrpmBqnDpt+oyZsxhmz5k7b/4CBlwOXli1CF3j4iVLly1fAWSsXLV6DUQIq4PXrluPrnXDxk2bwYwtW7H5BQG2bUcX2bETj/Jdu8FAE8Te44/faDSwdx8Y7AexD6w7SIrWQ4fB4AiYc/TYcZLsRQIhJ06Sq5Xh1GmytQ4BoHfmLHYJIlo1BvrYxYlo1ZwzOo9NmJhWjeaFi9iEiWrVWJhjM5CoVs0l1cuYgkS2aq5cxRQjslVz7TqGELGtmhs3b6ELEd2quX0HXQRrqwYbuHtvF6oA1lYNVrD7/gMGlKIGa6sGO3j4iAGlqCG1VYNS1KABABiHoPUImFOEAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.202,3.383;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAAMQAAAAzCAMAAAD/71f4AAACRlBMVEUAAAAdRx00fzQMBQX1Y2NKHh6kQkKoREQMHgw+mD4HEAdGHBz2Y2MOBgYjViMucS4DAQHmXV1jKCgBAgE5jDkXOBeLODjBTk4SLRI7kjsDBwMtEhL+Z2cfDQ0pZSkoYijQVFR8MjIECQQ8lDwRKRFyLi7ZWFgYPBg3iTcAAQAYCgr8ZmY3FhYvdC8iUyK3SkqVPDwIFAgLGgtZJCTsX18GAgICBQIeSx4yfDIJBATyYmJQICA+mT4XOhc0gDQbQxucPz+qRUUNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWZJtRPHAAACZklEQVRogWNgQAGMTAwDB5hZWKliDhMjVYwhE7CxU8MUDk4uahhDLuDm4aWCKXz8VDCEfCAgKES5IcIiopQbQgkQE6fcDAlJKcoNoQRIy8hSbIacPBUcQhFQUKTUBCVlFWo4hBKgqkapCeoamtRwCCVAS1uHQhN09ajiEIqAvgFl+g05jajjEEqAsYkpGbrMwEAYyDK3oLaLyACWVtZk6LIBA1sgy86e2i4iBzg4kqHJCQycqe6YUTAKRsEooBy4uA60C9AAOR1VVxcaOIQiQHpH1c3dgxYOoQSQ3lH19KKJQygBJHdUvX18aeMSSgCpHVVpP3/aOIQSQGpHNSCQRg6hCJDWUbUMCqaVQygBpHVUQ0LDaOUQSgBpHdXwCJo5BD+IjMTHQnRUscqigij3aCo7jkgQExsXj5uF6Khik01ITEIxK5nikR4yQUpqWgxuFqKjik02PSMTxaysbNq6lXyAp6Oak0tHd9AI5OUXDLQTKAeZhUUD7YRRMApGACguKSWkpKwcTFUkVlLR3piqaiqaVlNLSEV5GZiqSKyjorUM9Q1UNKyxqRm/gpYMSAy0JrZR0VqG9g5czSkyQGdXN34F6T0QureDepYCQWZfPxVNmzARv2WTJlPRMiQwZSoVDZs2fQY+6Zn5MfikyQezMiqoaNrsOfhkG+qpaBUKmDuPiobNX4BHMq9jIRWtQgGLqNmgXbxkKW7JZctp1mJbsXIVFU1bvQa33NQpVLQIDaxdR0XD1m/YiEuqNWMTFS1CA5tjt1DPsK3btuOS2rGTetZggKRdu6lo2p69uGT27aeiNRjgwEEApXJvT/SkVkgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.771,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.478;4.blob,1.1,1736.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACoFBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwmXl4pZmY0gIAbQ0MPDyQvL3VQUMUbG0RgYO4BAQNYWNotLXAhIVJjY/UFBQwfTU0dSUkECwtFRatHR7A3NzfBwcH39/fp6emTk5MMDAxNH01JHUkLBAsJFhZfX+owMHYnJyf29va4uLhISEhiYmLu7u61tbVDG0OUPJSTPJNZJFkWCRYaPz8xenoPJSUUMjJnZ/+qqqra2toEBARHR0f///9BQUEJBAk/Gj96MXqYPphqK2olDyULHBwSKysECgoQECcbG0L09PSEhITr6+uMjIwcCxxuLG6ZPpkrEisxeHgTEy4ZGT4JCQlsbGzR0dGgoKAHAwc8GDx4MXiXPZdlKWUQBxAmXV0iVVUHEhILCxwdHUn19fWNjY0bCxtdJl2SO5KRO5FVIlUSBxI2hoYCAgZlZfqtra1EREReJl6GNoZEHEQIAwgJFxdQUMY8PJUpKSm3t7dfX1/t7e0XCRcCAQIzM35YWNs6OjrExMSXl5cODg4LCxoXFzo5OY1NTb8AAAEEBAtTU802NoUICBQxMXqaEN2cAAACMUlEQVRIiWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomTgVTJCSpYIiUtAzlhsjKyVNuCIOCIhUMGQV0BkrKKtglVNVI0KGugV2tmioue7Ho0NTSxqZSR1cPlyFYdOgbGGJTaWSMywysOkxMsSk0M8dpCDYdFrqWmOqsrJVAlI0tCNihsLDrsHfANERDHUw5OoGAMwoLuw4XVwwhNy13CO0BAp4oLOw6vLx90IV8/WwwXYdXB4N/ALqIqQk+M7DpYAgMCkYVCNENxW8Ihg4GBtuwcFSBiEj8ZmDqAIKoaFR+TCwBQzB0jAKKQBwVzIhPoNyMxCTKWwXJKamUOyQtPQOXVGZWNpGG5ORCGXn5BYVFxUBGSWkZRCRWSzmgHMyyA5ddtjjLgIpKCF1VXVNbV98AZDU2Nbe0gsXc2tp1nTuADHVw2eXUicMMga40CKO7p5eBoa9/ApA5cdLkKVOnQYSn+zvNAOZ/cNnlMROHIbO6ZkMYc+aCyHnzIbwFCxctBlJKvku8NfQIemdp1zIwvbx/BYhauQpErl6zdt36DQwWG63DNm1mIOydLV1bIYxtEJdsZ2DYsXPX7j17gZyofS7Q+oyAd/YfgHYzDkLC5BADw+EjR4+BhY7r49CEAU6chNCnCk73nTlbA2SdO0+sXji4cBHKuHS5YN6VqyTrB4NrB66TpxEF3Lh5i3JDbt+5S7khDPfuYxcHAMXDj4iNJnN6AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.822,3.516;4.blob,1.1,508.iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAMAAACXZR4WAAAAvVBMVEUAAABHHUd/NH8HBwOTkzwsLBJiYihlZSkeDB6YPpgQBxAqKhGUlDwICANWI1ZxLnECAgGKijg7OxgCAQKMOYw4FzhTUyJ0dC8tEi2SO5IHAwcbGwuYmD4TEwhlKWViKGJ9fTNKSh4JBAmUPJQpESlERByCgjU8GDyJN4kBAAEODgaXlz0hIQ10L3RTIlNubixZWSQUCBQaCxo1NRaOjjkEBAFLHkt8MnwFBQKRkTswMBOANIBDG0NeXiZmZimDFKB9AAAAe0lEQVQImWNgAAJGJiDBzMLKAANMjCCSjR3G5+DkAlHcPLxQAT5+MCUgKAThC4uIQhhi4hBaQlIKwpCWkQXTcvIwwxQUQaSSsgpMQFUNRKpraMIEtLR1gKSuHtw9DPoGDAyGnEYIAWMTUwYzcwSfwcLSisHaBkmAwdYOAD1FB65e/BV0AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.535;4.blob,1.1,3192.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.571;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAX0lEQVQoke3PSRKCUBAD0CYKyPQ/KCDzJML9b0j6DlSxYfN2SSoiDgB5PF0Kz1dfQUgRxWpihFqTUmRv9ZOrRaSWX1rVDW1NR/thpNPM7PKzkHX4s3PbdQW4xvvjqR8PUO0MufyFRLYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,2600.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.590;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.628;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAABCElEQVRYhd2V2VbCMBRFb6M4gWKhlkjFVgoF6oCMDoDj//8TN3lM7/PJWuy3nqe9V7JSokAdNEfOt+2l49qJDxkUp2fOYHtJnV940cFQb1y6k+klddW89uEDIWy1K5vpJaWiGw8+GOKm8GpxL1d3NOF9MNx2hZF7OTjRd3AdEL17YeRec8xphrYB8aBjaU4zU93PwTYoBnoozf3cVBcR2AbFSI+luYhM9aQE26B41OJPeVJydfj0jNYB8TJ9FVbu5eqZnsN9QCykF4t7ubq9XMF1QGQtYeRerl6/wW1QvE8/qiP3kvrcJHgdFNtd5R6bXvpa1n3ogAi+f5zF9tLw14sOir9/Z7C9e4AqMcljjXHLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492318271;4.copy,1.1,3.110,3.190,3.850,2.19,2.14,1.1,2.90,3.190;4.copy,1.1,3.130,3.209,3.830,2.19,2.14,1.1,3.110,3.209;4.copy,1.1,3.240,3.342,3.720,2.19,2.14,1.1,3.230,3.342;4.copy,1.1,3.250,3.361,3.710,2.19,2.14,1.1,3.240,3.361;4.copy,1.1,3.370,3.380,3.590,2.19,2.14,1.1,3.360,3.380;4.copy,1.1,3.410,3.399,3.550,2.19,2.14,1.1,3.400,3.399;4.rect,1.1,2.54,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.104,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.154,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.31,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.423,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.335;4.blob,1.1,1584.iVBORw0KGgoAAAANSUhEUgAAADoAAAA+CAMAAABN9PgMAAACTFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4VyGZQAAACE0lEQVRIiWNgIAQYGQkqwQGYmFlYydTKxs7BRK61o2AQAk4uFC43Dy/RWrk4Ufl8/MTqFBAUQhUQFhElUquYOJqAhKQUcTolpGXQhWTliNMqr8CNLqQoqESUVn4+TDFlFWJ0qoqoYQqqaxCjVVNLG1NQR1ePCK1ysthE9Q0I6zQUNMImbGxiSlCrmTlWYQtLK4JarW2wi9vaEdQ6coE92TodHMnV6eTsAmG4urmTptPD04sBptWbNK0+vn5Qlr9bAKpUYFAwXq0hoTBWWDiEjoiMgjCiY2Lj4sGshEQwSELVmpyCblhqWnpGJpiVlZ2Tm5cPZBQUgkERirriEh8Mh5SWlVdUVkHY1TWFtQwMdfVg0ICirLGkCZs3mlta24BUe0dnV3cPDgf3lvRhauyfMHHS5CkMU6dNnzFzFgMuB88umYOuce68+QsWLgIyFi9ZugwihNXBy1esRNe6avWatWDGuvXY/IIAGzaii2zajEe5qQUYSIDYWzzxG40Gtm4Dg+0g9o4VO0nRums3GOwBc/bu20+SvUjA78BBcrUyHDpMttYhAHC2VtBaNdgArtYKeqsGC8DRWsFo1WABOForGK0abABrawVLqwYLwNpawdKqwQawtVawtWqwACytFaytGiwAS2sFa6sGG8BsrWBv1WABGK0VHK0aLADSWkEqanC0arABcGsFqajB1arBBVCKGjQAAEZefuwNXYgKAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.383;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAAMQAAAAzCAMAAAD/71f4AAACRlBMVEUAAAAdRx00fzQMBQX1Y2NKHh6kQkKoREQMHgw+mD4HEAdGHBz2Y2MOBgYjViMucS4DAQHmXV1jKCgBAgE5jDkXOBeLODjBTk4SLRI7kjsDBwMtEhL+Z2cfDQ0pZSkoYijQVFR8MjIECQQ8lDwRKRFyLi7ZWFgYPBg3iTcAAQAYCgr8ZmY3FhYvdC8iUyK3SkqVPDwIFAgLGgtZJCTsX18GAgICBQIeSx4yfDIJBATyYmJQICA+mT4XOhc0gDQbQxucPz+qRUUNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWZJtRPHAAACZklEQVRogWNgQAGMTAwDB5hZWKliDhMjVYwhE7CxU8MUDk4uahhDLuDm4aWCKXz8VDCEfCAgKES5IcIiopQbQgkQE6fcDAlJKcoNoQRIy8hSbIacPBUcQhFQUKTUBCVlFWo4hBKgqkapCeoamtRwCCVAS1uHQhN09ajiEIqAvgFl+g05jajjEEqAsYkpGbrMwEAYyDK3oLaLyACWVtZk6LIBA1sgy86e2i4iBzg4kqHJCQycqe6YUTAKRsEooBy4uA60C9AAOR1VVxcaOIQiQHpH1c3dgxYOoQSQ3lH19KKJQygBJHdUvX18aeMSSgCpHVVpP3/aOIQSQGpHNSCQRg6hCJDWUbUMCqaVQygBpHVUQ0LDaOUQSgBpHdXwCJo5BD+IjMTHQnRUscqigij3aCo7jkgQExsXj5uF6Khik01ITEIxK5nikR4yQUpqWgxuFqKjik02PSMTxaysbNq6lXyAp6Oak0tHd9AI5OUXDLQTKAeZhUUD7YRRMApGACguKSWkpKwcTFUkVlLR3piqaiqaVlNLSEV5GZiqSKyjorUM9Q1UNKyxqRm/gpYMSAy0JrZR0VqG9g5czSkyQGdXN34F6T0QureDepYCQWZfPxVNmzARv2WTJlPRMiQwZSoVDZs2fQY+6Zn5MfikyQezMiqoaNrsOfhkG+qpaBUKmDuPiobNX4BHMq9jIRWtQgGLqNmgXbxkKW7JZctp1mJbsXIVFU1bvQa33NQpVLQIDaxdR0XD1m/YiEuqNWMTFS1CA5tjt1DPsK3btuOS2rGTetZggKRdu6lo2p69uGT27aeiNRjgwEEApXJvT/SkVkgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.478;4.blob,1.1,1936.iVBORw0KGgoAAAANSUhEUgAAAEQAAABHCAMAAACJWREuAAACqVBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwmXl4pZmY0gIAbQ0MPDyQvL3VQUMUbG0RgYO4BAQNYWNotLXAhIVJjY/UFBQwfTU0dSUkECwtFRatHR7A3NzfBwcH39/fp6emTk5MMDAxNH01JHUkLBAsJFhZfX+owMHYnJyf29va4uLhISEhiYmLu7u61tbVDG0OUPJSTPJNZJFkWCRYaPz8xenoPJSUUMjJnZ/+qqqra2toEBARHR0f///9BQUEJBAk/Gj96MXqYPphqK2olDyULHBwSKysECgoQECcbG0L09PSEhITr6+uMjIwcCxxuLG6ZPpkrEisxeHgTEy4ZGT4JCQlsbGzR0dGgoKAHAwc8GDx4MXiXPZdlKWUQBxAmXV0iVVUHEhILCxwdHUn19fWNjY0bCxtdJl2SO5KRO5FVIlUSBxI2hoYCAgZlZfqtra1EREReJl6GNoZEHEQIAwgJFxdQUMY8PJUpKSm3t7dfX1/t7e0XCRcCAQIzM35YWNs6OjrExMSXl5cODg4LCxoXFzo5OY1NTb8AAAEEBAtTU802NoUICBQxMXoXOjoKGBgFCwtKZ7dOAAACvElEQVRYhWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomTgVTJCSpYIiUtAzlhsjKyVNuCIOCIhUMGQV0BkrKKtglVNVI0KGugV2tmioue7Ho0NTSxqZSR1cPlyFYdOgbGGJTaWSMywysOkxMsSk0M8dpCDYdFrqWmOqsrJVAlI0tCNihsLDrsHfANERDHUw5OoGAMwoLuw4XVwwhNy13CO0BAp4oLOw6vLx90IV8/WwwXYdXB4N/ALqIqQk+M7DpYAgMCkYVCNENxW8Ihg4GBtuwcFSBiEj8ZmDqAIKoaFR+TCwBQzB0jAKKQBwVzIhPoNyMxCTKWwXJKamUOyQtPQOXVGZWNpGG5ORCGXn5BYVFxUBGSWkZRCRWSzmgHMyyA5ddtjjLgIpKCF1VXVNbV98AZDU2Nbe0gsXc2tp1nTuADHVw2eXUicMMga40CKO7p5eBoa9/ApA5cdLkKVOnQYSn+zvNAOZ/cNnlMROHIbO6ZkMYc+aCyHnzIbwFCxctBlJKvku8NfQIemdp1zIwvbx/BYhauQpErl6zdt36DQwWG63DNm1mIOydLV1bIYxtEJdsZ2DYsXPX7j17gZyofS7Q+oyAd/YfgHYzDkLC5BADw+EjR4+BhY7r49CEAU6chNCnCk73nTlbA2SdO0+sXji4cBHKuHS5YN6VqyTrB4NrB66TpxEF3Lh5i3JDbt+5S7khDPfuU8GQoQLQWoo4W5Q4dYAAeksRV4sStw4sLUUcLUo8OrC0FHG0KPHowNZSxNqixKsD2lJEBlhblHh1QFuKKABbixKfDlhLEQVgaR/i1YG1pYitfYhPB/aWIpb2IR4dOFqKWNqHeHTgaClC2ofBkGpEH5mFTQeuliK4fbgEUo08QGYR0bZEBQ8h1cgjZBYmAACRhbbORGif9AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,1056.iVBORw0KGgoAAAANSUhEUgAAAMQAAABxCAMAAAC9f/yfAAABEVBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgwdzBW1FYBAgE1gzUbQxsUMRQ8kzwDBwMUMhRm/WYLGwsqZyorais6kDpMvEw5jDkdRx0CBAJe6V4mXiYFCwU+mT4eSx5j9GMECwQJFwkQKBBEqURCo0ILHAsPJQ8GDwZk92QcRRwHEQcSLBIoZChc5FwBBAE9lj0ZPRlOwk44ijgkWSQNIQ1n/mcfTB8yfTJTzlMGEAYOIw5W1lYtcC0iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYyfDIECQQnYScraSsFDQUucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQwyejITMBM4iTgKGQoSLRJ80XW5AAABwElEQVR4nO3Zx1LDQBCE4QUMDhhMDkbknAwGTM4ZTM7w/g+CLNlUcZ6leobq77DSsQ86rOp3LlTn7KtvQC+QSzQ2oSeIJFPOpTPN6BkyqaRz2ZZW9AyRXFu7cx2d6BkyXd3h0dOLniHS1593biDIoneIDA4NOzcSjKJ3iIyNh8dEMIneITE1PROes8EceojE/EI6PBcLS+ghEsvF6JFcAe+QWF2Lv6NSBjxEYn0jfm4WtrBDJLZ3qi+7e/vQIV60HhyiJ3hwdIxeQL+c2L6Sx3KnZ+gJHpxfoBd4cNli+hpVlb9CL/DgOjhBT5ArBzfoCR7cltALPLizfC2vuc+jF3jw8IheIJd+ekZPkHsJXtET5JqL/+D36G0QvUDu/aOMniD2WUygJ8iNfqEXEOupDtbraYX5elphvZ5GrNfTiPF6GrFeTyPW62nEeD2NGa+nMeP1tMp0Pa0xXU9rTNfTH6ynarCeKsN6qgbrqRqsp1qwnqrBeqoF66kSrKdasJ7qwHpKXrCe6sB6qgTrqRasp0qwnmrBeqoG66kWrKdqsJ7SH2A9VYP1VA3WUy1YT9VgPdWC9VQJ1lMtWE91YD2F+gbjmTMM0T508gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492318368;4.copy,1.1,3.120,3.190,3.840,2.19,2.14,1.1,3.100,3.190;4.copy,1.1,3.140,3.209,3.820,2.19,2.14,1.1,3.120,3.209;4.copy,1.1,3.150,3.228,3.810,2.19,2.14,1.1,3.130,3.228;4.copy,1.1,1.0,3.285,3.960,2.57,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.200,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,1.0,3.361,3.180,2.38,2.14,1.1,1.0,3.342;4.copy,1.1,3.240,3.361,3.510,2.19,2.14,1.1,3.240,3.342;4.copy,1.1,3.180,3.380,2.10,2.19,2.14,1.1,3.180,3.361;4.copy,1.1,3.250,3.380,3.100,2.19,2.14,1.1,3.250,3.361;4.copy,1.1,3.360,3.380,3.380,2.19,2.14,1.1,3.360,3.361;4.copy,1.1,3.430,3.399,3.530,2.19,2.14,1.1,3.420,3.399;4.rect,1.1,2.64,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.114,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.164,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.10,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.174;4.blob,1.1,1984.iVBORw0KGgoAAAANSUhEUgAAAH0AAABZCAMAAAAkY9s3AAACo1BMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUIAwgHAweOOY6POo8KBAoEAgSBNIGDNYNUIlSZPpkFAgVWI1aYPpgCAQJnKmeCNYIJBAmSO5JCG0IyFDIBAAFKSh4MDAX19WOoqESkpEL29mMODgZGRhzm5l1jYygDAwE3NzfBwcH39/fp6emTk5MMDAyLizjBwU4nJyf29va4uLhISEhiYmLu7u61tbUtLRL+/mcfHw2qqqra2toEBARHR0f///9BQUHQ0FR8fDL09PSEhITr6+uMjIxyci7Z2VgJCQlsbGzR0dGgoKAYGAr8/GY3Nxb19fWNjY23t0qVlTytra1ERERZWSTs7F8GBgIpKSm3t7dfX1/t7e0JCQTy8mJQUCA6OjrExMSXl5cODg6cnD+qqkV3dzDU1FYyMhT9/WYbGwuQkDq8vEwSLCwsbW0EBALp6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMLCwQCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwsPDwb392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIsLBIhIQ0LGxvOzlN9fTJwcC3W1lb5+WVUVCIsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS6MjDk4OBeSkjsHBwNlZSliYiiUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGguAgDRDQxsLIRM/AAAC6ElEQVRoge2WZXMUQRCGBz8gwd2dBLdg4SA4HB4kQRIIBHe34CS4hRDc3RJcQ7AEDe7OT+Fkd3tuZ3K1czW994F9Ptw82zW9XVtXXfUSYog8efMZu4hD/gKBnF6wkE1zm83HRRQKFymqalBwseJmjy9RUrVSpcsEmT29bLnyZo+kqVAxkNMrVQ7k9CpVqwVyfPUaisDGmbh7NYNruU/YODN3r3aduu4TNs7U3atX37RRFhYWHiBj8QwdyFg8wyIkxHNCxuIZEqENGjZyC2QsniHRuEnTUI9BxuIZNpCxeIYOZCyeYQMZi2fYQMbiGTpaxuKaPJo1b8FRNWPxDK5RDX7SslUYR9WMxTO4RjX4Ses2PKUyFmNwjW7wi7bt2nPUWIfBBh+EhXfgqLEOgw0W/yN25ezYye7zHg4RqnSOyP0SGl26KtJNM0hR8k1H9x6K9NQMUpRs69Xb0advP2p6/wGsQYqSawMHRQ4eMnQYNT0qejhjWIwYOYqQmNjRVGlMHGtIjB3n+o0fT5UmTGQNh0mxk13HlKlUbdr0GYwhMdPz7bPo2uw5rHGQsHFzPf/7PPq18xcs1BsnHsnYuEWOxTFLlkZ6fVTCsuV648QjKbu3YqUjftVqr+lkzVq9SYxH4siMR+JY8cgCncQk1swjKZE101i3foPe8JIVk7E2btIbWrKizMnmLYRs3bZdedIMK1nRtiN5Z8ouQlJ371Gmg6Gzd9/+AwcPOeXwEbUEhs7RY8dPuM6Tp04rFTB8zpw9d/6C87yYlq5UwEzg0uUrKVeTybXragGMi/SNu3HzFom+rTzc0QwtWek2jtwlGarey4AyVrKizEOmKvczoWglK2IlKwsc7A8eMrVHj8MZc5KVLWS5vMWbJ2lPmdqz5y8YIyQ7S8z4b/GTlzmvBE0mr9+ImkTS374TNJlEvf8gaDL5+EnUJJLw+YugyeTrt++CJpMfP0VNIr9yfguaTFLjRE0mf/6KmhH+ARQfUdx7NMBqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.326;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAAB1UlEQVRIiWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy372AXBwB0G4WK6AFv1wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.731,3.345;4.blob,1.1,2728.iVBORw0KGgoAAAANSUhEUgAAAEQAAABZCAIAAAAIORWgAAAABmJLR0QA/wD/AP+gvaeTAAAHs0lEQVR4nO2aX0xaZx/HHw5wBEGkFhX5478q/glkrY5CW9rVRkcnjbNL7OYikMVt3qx5e9erN7vobpY0S1O36JZdLNR5YdbZbYm1aS2tNutcakc3t67YQtMAFQV1VDiiCO8FfRmCg/PnoZr35RMuPM85z+/5/TzPOc/z+30PAPDYvfv0iRPTEA0SBYFoSybTW60XIBokCrRgBIIGPr9uZmYAlkESQAtGJjO4XGa/3wnLIAngBIMgjKqqTqvVBMUaeTegWJFItEwmx2a7CMUaaeAEI5MZ7PbhUMgPxRppIASDovnl5W1bPscAlGAqKztWVrxO5xh1UxSBEIxMZnj4cDASCVM3RRGqweTlVZSUaLbDHAPUg6mu7vJ4LAsLW7mLiUE1mO2wvGTJkiXL/zWnT++enj4BxRSXy/T7u1tbS6mb0mqlH374MiC6zuj1sgsXrNSHBwAsL68ND9sNBhl1U2p18U8/uYn1aWgQrK+/LxZzqA8f5dVXJYFAN4+HUjFSWsrt7z/E5+cAQnfGYJCZzS6nE1rSMjbmXFpa7eiopGJErS5+8GBpaSkI8AfDYCCdnVUmE5w5FmV9PfL11zNUZhqC0PbuLbp9m+Ac0+lKl5e7ORxGgi0Wix7/YzIRnGejKBQF4XBPWVkeuWAUioLz5w/k5NCjh4zUV8cwGGTDw3a/PxTf2Npa+sMPR+NbvvvucXv7FTxno/z228Kvv3r1+uqPPrpLKIwoanWxxeINBtejh7iCyc9H29rK29pGE9onJp4qld/GtywuBnGejWEyWXt66kkEw2YzXnpp52ef/U6s27vv1jocXQhCIzoeHoTC3FDofZWqiGhHjUb48ccqWpxTuF4ABoNscPBhOBwhOh4eZmcDV686SLwG1Orin3+ejxByqqIiLxzukcsLiA6Gn87OKo/HiKIE1gmBgNXff0gk2rDope/f1VVtsXimpxcI+4ibS5ceoyid0NZGpSpyOJZdrg2LXvpgoC8vyWBYaGjo0dtvV+PvolQSX16yZMmSAJ1i/1xhbiQSCa9tfW0WUC8CCjXC9lvtaD6lnGQb0WRq0g5rt9oLSLAKWd3+bulr0q12hPIzAwAIBUK8Sl6prtSa4bU1LYnPTIG8QH5SHt+iUqlu3ryJYZjb7e7t7eVyuclWbN/YxEfE7GJ2Bj39Z+TygpMn5SCWz9AQWqGyUKqVcsScZ/ZnsetqamrMZvP4+Pjx48dFItHZs2crKyt1Ol2COfePbgCA6BXRo6FHUPyj02nJGUcoFI7fIyMITaks1GqlYjHHbn8GAGAgTESoEUpaJGg+6pnyzAzM+Gy+WIczZ844HI5jx46FQiEAgNPpHB0dbWpqMpvN8cOs+lYxN8av40OJBABgNNYkZziff/7H3bseAACTiWg0wpYWSX4+OjXlGRiYsdl8AABGjbFG0Ch4MvLEdd215l9L6N/a2nru3LloJACAK1eueDwenU6XEAwAILgYZBdBm2bff/94bCzx+4j5eSz6h9FY09goGBl5cv26yx/nM2Puzhy3jCtpljC5zKcTT/2OvzfVbDabw+HMzs7GW3S5XAKBIHn4cChMZ0F4nURZXAz+9ddqQmMo9HxpvnNnrqyM29ws4XKZExNPHf/1meG1eL33vII9AulRqeiwyGfzuW645ibnAAAYhgUCAaFQGG9RJBJdu3YteXgmh7kyvwIrmNTTzGLx3rvn3bNHcPSo9PBhkc3mu3HDNTk5t+Fqfi1fcUpx4PyBWMvFixetViuD8fw9odVqI5FIc3NzwjA0Ou294HvyD+QAEgIBq6wsL+GXm7tJ+aW2ln/qlOJ8nM8b4MQVYOvq6jAMu3z5slarNRqNXq93dDSxRgMAKJAX9ER6BHs2mX4vBrxF4/3799+6dQvDsPn5+b6+Ph6Pl3yN4l8KvUtPy0z55kXzxp03Gv7dsNVewKC8vbzL2YVSK+ZvC3bU7dC79JIWyVY7AgPxEXGpDoL6lSXL/wgQNeHUENKxc3Lovb2a5PJ3moIGRE04NYR07GBw/ZdfPPv2FRMeBoomnBoSOnZ9/Y5PP9WwNu7T05eaoGjCqSGhY//551IgEGpsLIxvTB8MdU04NeR07HA4Mjk5R2amUdSEU7Opjo0HsZjT339o505WrAVXRTOmCRMdDw+b6th4cDr9Tqc/PofDW541max6PfyZFtWxSYtZt2+71WriM420Jpwaijo2j4f29R2sqHg+//HeGdKacGoo6tg+3+r9+4tkbg4JTTg1UHRspbLok0/2MRg0QEjSSNaEURRJ+DqGxaLT6TQ8ZwEkHdti8dDpSPQ/QuCFGNOEL116HG0ZH389+Sl6550bX331IO1ZAEBnZ9UXX9wnFcLfrK2Fp6bm9+4tsli8lEoQtbV8LpeZ0Gi3P/N6V9KezZIlSxaoUHqbcblMt9vQ0XF1ZOQJLIfSUlJSUl29+ZaXanV4YOAIg4G89dYmIkeGQFGUzX6uatXX1y8sLCQoSOR5AUl1ClQqVXl5eeyQ6kbrBSTV+KEaTKaTakJA2AKbTNaDB0sylFQTAkIwGU2qCQEnOclQUk0UOMEMDj7ctYsHPakmCpxgMpRUEwVaDmwyWd98cxfEpJoE0MYm8aH1tubLL18ZGmrZQgf+AzRwBaiWu1o2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.383;4.blob,1.1,1984.iVBORw0KGgoAAAANSUhEUgAAANkAAAAzCAMAAAAtv12gAAAClFBMVEUDBwM8kzwSLBIAAAAdRx00fzQMBQX1Y2NKHh4oYigpZSmkQkKoREQRKhE8lDwDCAMMHgw+mD4HEAdGHBz2Y2MOBgYBAgE4ijgYOxgjViMucS4DAQHmXV1jKCgiUyIvdC85jDkXOBeLODjBTk4LGwsIEwgSLRI7kjstEhL+Z2cfDQ0zfTMeSh7QVFR8MjIcRBw1gjUECQQRKRFyLi7ZWFgGDgY9lz0NIQ0YPBg3iTcAAQAYCgr8ZmY3FhYsbiwkWSS3SkqVPDwWNRY5jjkBBAEIFAgLGgtZJCTsX18GAgICBQI7kTsTMBMeSx4yfDIJBATyYmJQICAmXiYpZikxeDE+mT4XOhc0gDQbQxucPz+qRUUKGAoNHw0FCwVHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxeSOzsHAwNlKSliKCiUPDwpERE8GBiJNzcBAAB0Ly9TIiIDAwgUCAgaCwsDAwc5OY46Oo8EBAoiIlQ+PpkCAgVLHh4CAgQ0NIE1NYMjI1Y+PpgBAQKANDRDGxsqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWaD5DvUAAAC9UlEQVRogWNgYGRixgpYWLGL0xmwsXOQp5GBmZMLuwwrC/nOoSbg5iFPHwMzLx8/NgkBQSFK3EM9ICwiSpY+BmYxcQlsEpJSFLmHekBaRpYsfQzMzHLyWMTFFBQpcxD1gJIyWdqAPlMRVMUUV1NnoMg5VAQamlrkaAO5X1sHU5yLk0L3UBHo6pGjC+QzfQMMYUM+I0rdQz1gbEKOLpDPTM3M0YUtLK0odhDVgLWNLRm6wLnJzh5dWF6OYvdQETg4kqEJ7DMnZxdUUVdBNyo4iGrA3cOTdE1gn3l5+wBJFy8wEAMyff2o6zQKgX9AIOmaIGV7UDCQCAkFgzAgMzyCqi6jGERGka4HqdaKjgGDWOo5aEDBoKmPqQ5GfTb0wKjPhh5A91lc/IA4gxhA4rgBus/i46joFioD0sYN0HyWkJhETbdQF5A2boDms+QUqrqFuoC0cQNUn6WmpVPXMdQFSsokKEb1mUZGJjVdQm1A0rgBqs+ysqnsFioDUsYNUHzmn5NLbbdQF5AyboDis7z8Amq7hbqAlHEDFJ8VFlHdLaSC4mJ8LMS4AVZZFIDss5LEUiq5j2xQVl5RiZuFGDfAJltVXYNsFLLPaska16MqqKtvKMPNQowbYJNtbGpGNgrZZy2tNHEtVQGecYO2dhTu8Gnrd3R2ofCHj8+au3tQ+MPHZ+hg1GdDD4z6jAzQ29dPSMmEiWBqUvVkKtpbNmUqiKJlnE2bTkjFxAlgalL1DGraO3MWiKSlz2bPmYtfwbwmSFzNr15ATXsXLgI1JWnps8VLluJX0LgMQi9fRFV7m1esZKZxCbJqNX4XrFlLG3vXrWemsc82bNyET3pzZxk+afLBlqZJtC71t27DJztrJq3s3b6D1j7buQuPZMei3bSyd087rX22d99+3JIHDvbglqQMHDp8hNZtkKPHcMutX0c7e4+foLXPTp46jUtqftMZ2tl7tvwcjX12/sJFXFKXLtPQ3porV2ndIr52HZfMjZu0tPfWbQCFXw4C9pgeVAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.478;4.blob,1.1,1936.iVBORw0KGgoAAAANSUhEUgAAAEQAAABHCAMAAACJWREuAAACqVBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwmXl4pZmY0gIAbQ0MPDyQvL3VQUMUbG0RgYO4BAQNYWNotLXAhIVJjY/UFBQwfTU0dSUkECwtFRatHR7A3NzfBwcH39/fp6emTk5MMDAxNH01JHUkLBAsJFhZfX+owMHYnJyf29va4uLhISEhiYmLu7u61tbVDG0OUPJSTPJNZJFkWCRYaPz8xenoPJSUUMjJnZ/+qqqra2toEBARHR0f///9BQUEJBAk/Gj96MXqYPphqK2olDyULHBwSKysECgoQECcbG0L09PSEhITr6+uMjIwcCxxuLG6ZPpkrEisxeHgTEy4ZGT4JCQlsbGzR0dGgoKAHAwc8GDx4MXiXPZdlKWUQBxAmXV0iVVUHEhILCxwdHUn19fWNjY0bCxtdJl2SO5KRO5FVIlUSBxI2hoYCAgZlZfqtra1EREReJl6GNoZEHEQIAwgJFxdQUMY8PJUpKSm3t7dfX1/t7e0XCRcCAQIzM35YWNs6OjrExMSXl5cODg4LCxoXFzo5OY1NTb8AAAEEBAtTU802NoUICBQxMXoXOjoKGBgFCwtKZ7dOAAACvElEQVRYhWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomTgVTJCSpYIiUtAzlhsjKyVNuCIOCIhUMGQV0BkrKKtglVNVI0KGugV2tmioue7Ho0NTSxqZSR1cPlyFYdOgbGGJTaWSMywysOkxMsSk0M8dpCDYdFrqWmOqsrJVAlI0tCNihsLDrsHfANERDHUw5OoGAMwoLuw4XVwwhNy13CO0BAp4oLOw6vLx90IV8/WwwXYdXB4N/ALqIqQk+M7DpYAgMCkYVCNENxW8Ihg4GBtuwcFSBiEj8ZmDqAIKoaFR+TCwBQzB0jAKKQBwVzIhPoNyMxCTKWwXJKamUOyQtPQOXVGZWNpGG5ORCGXn5BYVFxUBGSWkZRCRWSzmgHMyyA5ddtjjLgIpKCF1VXVNbV98AZDU2Nbe0gsXc2tp1nTuADHVw2eXUicMMga40CKO7p5eBoa9/ApA5cdLkKVOnQYSn+zvNAOZ/cNnlMROHIbO6ZkMYc+aCyHnzIbwFCxctBlJKvku8NfQIemdp1zIwvbx/BYhauQpErl6zdt36DQwWG63DNm1mIOydLV1bIYxtEJdsZ2DYsXPX7j17gZyofS7Q+oyAd/YfgHYzDkLC5BADw+EjR4+BhY7r49CEAU6chNCnCk73nTlbA2SdO0+sXji4cBHKuHS5YN6VqyTrB4NrB66TpxEF3Lh5i3JDbt+5S7khDPfuU8GQoQLQWoo4W5Q4dYAAeksRV4sStw4sLUUcLUo8OrC0FHG0KPHowNZSxNqixKsD2lJEBlhblHh1QFuKKABbixKfDlhLEQVgaR/i1YG1pYitfYhPB/aWIpb2IR4dOFqKWNqHeHTgaClC2ofBkGpEH5mFTQeuliK4fbgEUo08QGYR0bZEBQ8h1cgjZBYmAACRhbbORGif9AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.802,3.516;4.blob,1.1,1200.iVBORw0KGgoAAAANSUhEUgAAAEMAAAAiCAMAAAAzvJS+AAABv1BMVEUAAABHHUd/NH8HBwOTkzwsLBIqKiosLCwGBgY+Pj4RERFiYihlZSkeDB6YPpgQBxAqKhGUlDwICANWI1ZxLnECAgGKijg7OxgCAQKMOYw4FzhTUyJ0dC8tEi2SO5IHAwcbGwuYmD4TEwhlKWViKGJ9fTNKSh4JBAmUPJQpESlERByCgjU8GDyJN4kBAAEODgaXlz0hIQ10L3RTIlNubixZWSQUCBQaCxo1NRaOjjkEBAFLHkt8MnwFBQKRkTswMBOANIBDG0NeXiZmZikCAgIBAQEICAgaGho0NDQNDQ0FBQUKCgoDAwMwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0oKCgUFBREqURCo0IfTB9n/2dHsEdU0FQyfDIEBAQGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUxOjYqAAABf0lEQVRIieWTVVPDQBSFb5FCkOLu7u5ubSFAi7trgeJW3N3tB5Nk0nZW0nafeOC85OzZe76Zm0kAEKnckKO7h6fNq72AlDfnQ2RuKvTs68fM8NcEoEFgUDArIyQUC8LCIxgZkVHR+FBMLCMjLj4BH0pMSmZjpKSSU2npTIyMzCxyKjuHiZGbl09OFRQWsTCKSyhTUFrGwCjXVNAYlVXVrjNqamkIqKtvcJ3R2ERlQHOLzNDq8CudnvK/OJCa41rxrI1jY+h5vh3POni+k4Xxj2QwKlx0dfe42jAalOi9ffScaPQPDCoxhoZHaDHZGB1TQsD4xCQtJhpT0zOKDJido4RyQ6eVJNr5hUXxYVoStYw4gBXzKsmQG2ucpHXBbmxKF1vbonYQJ2h3j2TIDeHrF7UPYDk4lBLLkahjxAk6OSUQ1oZ9l7Nzk/LrALi4vMIja8O+y/WNIwTA7R2eWBu2Xe7ND44Zj0/PaEA2Xl4dI+Dt/cNZ4/PLCQO+f1gbf6RfbARWJK1DRe8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.562,3.552;4.blob,1.1,1560.iVBORw0KGgoAAAANSUhEUgAAATMAAAASCAMAAAAAAclLAAACMVBMVEUAAAAGBg4DAwcUFDIyMnwEBAkwdzBW1FYxMTEYGBgnJ2ErK2kFBQ08PJMSEiwUMhRm/WYLGwsmJl4uLnE6kDpMvExKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PpkeSh5KtkoCBAJe6V4mXiYBAQECAgIEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQCBQIDCAMBAgElWyVV0lVn/2dRyFEeSx5j9GMECwQoKCg+Pj4UFBQJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0xCpEIiVCIECQQsbCxa31pk+GRCo0IXORdEqUQSEhIrKysICAgNDQ2nQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkNIQ0VNBUHEQdDp0Nl+2U0gTQIEwgGDwZk92QcRRwJCQlQICDaWFjxYWGVPDwuExNsbGzR0dGgoKAzM38gUCBY2lhh8WE8lTwTLhMoZChc5FwCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVOwk44ijhDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82Jn/mcSLBItEhIpKSm3t7dfX1/t7e0LCxoMDB0SLRIyfTJTzlM6OjrExMSXl5cODg4bG0M4OIoAAAFW1lYtcC0XFxcyMnoeHksKCgoFBQUTEzA4OIkKChkRESkQECgSEi0UWvMmAAACG0lEQVRYhWNgGLGAkWmgXTD0ADMLKwW62dip5hAUwME5qM3j4qZAMzsb1dyBAgZ5mPHw8pGtl19AkIouQQKDPMwYhITJ1ioiSkV3IIPBFWZi4iBSQlJKWkYWIiInz0ikXgVFVL6SsgolTsEDSPSjqhoYkGAefh3IsuoamlraQFpHV0/fwNAIosBY3gSXVaZmYGAOYitZWFpZo5pnY2tHlJdIB/jCDGy9KoqQvQMYOBJvHn4dCFknZxdXN3eQmIenFwODt48vRIWfPy6rAqzAIJCBISg4JDQsHM22iDDcPqMM4AmzSLD1UShi0TFg4EW8efh1IGRj4+ITIGKJSSAyOQXCS03DZVV6BhhkMjBkZefkopuXl1+A05EUAjxh5gW2vhBFjHZ5s6i4pLQMJFToUw6iKiohKqqEcFmFyJvVNbV19WjmNTSa43YlZYDE8ox2eZOhqblFq7UNyGiHpLMOiIrOLlxWIfImg3lgt1VPL4p5ff3E+4pEQGKY0S5vgsCEiZOA5GRIeTYFLDR12nRcViHyJgjMmDkL2bz02XOI9BLpYHC1NRjmAvE8qfneCxbqQQQWyS8mVu8SZM7SZRS5Ay/AVf6oYlVNhnlkmLx8hVTyylUQ9uo1a8lyx7r1ZGkjCmD4kQNSImyglnkUmrxxE5kOoSHA8ONmSImwhVrmUWby1m3GZDqEhmCQlWdoYPuaHdQ0bkSAnbvI1AgAaVSVMZl0qg0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,2516.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;3.end,1.1;4.sync,10.6492318477;4.copy,1.1,3.130,3.190,3.830,2.19,2.14,1.1,3.100,3.190;4.copy,1.1,3.150,3.209,3.810,2.19,2.14,1.1,3.120,3.209;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.210,2.19,2.14,1.1,1.0,3.323;4.rect,1.1,2.74,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.124,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.174,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.373,3.231;4.blob,1.1,388.iVBORw0KGgoAAAANSUhEUgAAABkAAAClCAMAAACeP6ZfAAAAeFBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwkMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUW7ApmPAAAAZklEQVRYhe3Q1w2DUABD0UdeCBB6DyVAqPtvyAK5G9i/R5YsG+M87N8Y+3RfIBSJRCKRSCQSiUQikUgkIJ4fUOcdkkRxApJmOS0oSpKqbmh1+yHpepJh/NIH00yy/FaQbT/o0fO6AVjTMuz9aJg7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.232,3.402;4.blob,1.1,3240.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.478;4.blob,1.1,1736.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACoFBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwmXl4pZmY0gIAbQ0MPDyQvL3VQUMUbG0RgYO4BAQNYWNotLXAhIVJjY/UFBQwfTU0dSUkECwtFRatHR7A3NzfBwcH39/fp6emTk5MMDAxNH01JHUkLBAsJFhZfX+owMHYnJyf29va4uLhISEhiYmLu7u61tbVDG0OUPJSTPJNZJFkWCRYaPz8xenoPJSUUMjJnZ/+qqqra2toEBARHR0f///9BQUEJBAk/Gj96MXqYPphqK2olDyULHBwSKysECgoQECcbG0L09PSEhITr6+uMjIwcCxxuLG6ZPpkrEisxeHgTEy4ZGT4JCQlsbGzR0dGgoKAHAwc8GDx4MXiXPZdlKWUQBxAmXV0iVVUHEhILCxwdHUn19fWNjY0bCxtdJl2SO5KRO5FVIlUSBxI2hoYCAgZlZfqtra1EREReJl6GNoZEHEQIAwgJFxdQUMY8PJUpKSm3t7dfX1/t7e0XCRcCAQIzM35YWNs6OjrExMSXl5cODg4LCxoXFzo5OY1NTb8AAAEEBAtTU802NoUICBQxMXqaEN2cAAACMUlEQVRIiWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomTgVTJCSpYIiUtAzlhsjKyVNuCIOCIhUMGQV0BkrKKtglVNVI0KGugV2tmioue7Ho0NTSxqZSR1cPlyFYdOgbGGJTaWSMywysOkxMsSk0M8dpCDYdFrqWmOqsrJVAlI0tCNihsLDrsHfANERDHUw5OoGAMwoLuw4XVwwhNy13CO0BAp4oLOw6vLx90IV8/WwwXYdXB4N/ALqIqQk+M7DpYAgMCkYVCNENxW8Ihg4GBtuwcFSBiEj8ZmDqAIKoaFR+TCwBQzB0jAKKQBwVzIhPoNyMxCTKWwXJKamUOyQtPQOXVGZWNpGG5ORCGXn5BYVFxUBGSWkZRCRWSzmgHMyyA5ddtjjLgIpKCF1VXVNbV98AZDU2Nbe0gsXc2tp1nTuADHVw2eXUicMMga40CKO7p5eBoa9/ApA5cdLkKVOnQYSn+zvNAOZ/cNnlMROHIbO6ZkMYc+aCyHnzIbwFCxctBlJKvku8NfQIemdp1zIwvbx/BYhauQpErl6zdt36DQwWG63DNm1mIOydLV1bIYxtEJdsZ2DYsXPX7j17gZyofS7Q+oyAd/YfgHYzDkLC5BADw+EjR4+BhY7r49CEAU6chNCnCk73nTlbA2SdO0+sXji4cBHKuHS5YN6VqyTrB4NrB66TpxEF3Lh5i3JDbt+5S7khDPfuYxcHAMXDj4iNJnN6AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.516;4.blob,1.1,2832.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.535;4.blob,1.1,3124.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAxElEQVQ4je2SRw7CQAxFQw8Q2tBD76H33uH+dwLFNvCR2LDOX70347HkkTXtGZcGcXtAvT7/pwb0IFyHwgZ4JIrdYnHQhAqBJ1UKPK0y4FmVA8+bBexfLKGXdfSKWcWDWr0BbjRbWNDuaL9jGUjdXp+daTCUAqJRWAZgGk+kgGiqLHaimZqzMy3K8oBo+ZqYaDUWJ1pvxG0KbHesRHt1YCcKHuU/iE5neW7T5Tpjtel29LISpe5S/abvOPsFcfaL88d+PQDRiiUhm16atwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492318578;4.copy,1.1,3.120,3.190,3.840,2.19,2.14,1.1,3.100,3.190;4.copy,1.1,3.140,3.209,3.820,2.19,2.14,1.1,3.120,3.209;4.copy,1.1,3.270,3.361,3.690,2.19,2.14,1.1,3.260,3.361;4.copy,1.1,3.430,3.380,3.530,2.19,2.14,1.1,3.420,3.380;4.copy,1.1,3.470,3.399,3.490,2.19,2.14,1.1,3.460,3.399;4.rect,1.1,2.84,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.134,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.184,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.61,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.353,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.213,3.278;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.383;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.478;4.blob,1.1,2500.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAAGkAAABxCAMAAADh2X3+AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAABsklEQVRoge2Xx1JCURBEHxgQ0UsQFQOoJCNgVkwY/v+fLHZW38Wb8k5PWdbMB5yz7DlZZnCFooVlfguLS1aq5ZKVaaW8aqWqrFmZ1kPByFQNNSNTVm9YmTaaVqbNipVpa9tI1NrZNTLthX0jU7tzYGQ6PDISdXtVG1G/M7ARZcNjI9GPO7Ein56xREAenF+QREBujdokEZLHZdaPhOTJJUkUka+uWSYg34QxSYTk2zAkmZB8F+5JJiQ/BNZ7ieTH6RPJFJGfaf8RkhsjlgnJL9NXkikiv81Y3wSSi+8fJFNE/vwimYhk4fEKG8m8wo7IvMJGMq+wIzKvsJHMK2wk8wo7IvMKG8m8wkYyr7CRzCtsIPMKG8m8wkYyr7CRzCtsIPMKG8i8wkYyr7D/Qrvr7Xxeu6vtfH67K+28oN11dl7U7io7L2p3lZ0XtbvKzsvaXWHnhe2usPPCdlfYeWG7K+y8rN01dl7W7io7L2p3lZ0XtbvKzkvaXWnn89tda+fz211tjb3dFc7bPe283ZPO2z3lvN0Tztv99+ftrkL2dpeft3vKebsnnLd70nm7J92/b/dvvRtEtNo/Vd4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.345;4.blob,1.1,3020.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;3.end,1.1;4.sync,10.6492318680;4.copy,1.1,3.130,3.190,3.830,2.19,2.14,1.1,3.110,3.190;4.copy,1.1,3.150,3.209,3.810,2.19,2.14,1.1,3.130,3.209;4.copy,1.1,3.160,3.228,3.800,2.19,2.14,1.1,3.140,3.228;4.copy,1.1,3.270,3.342,3.690,2.19,2.14,1.1,3.260,3.342;4.copy,1.1,3.280,3.361,3.680,2.19,2.14,1.1,3.270,3.361;4.copy,1.1,3.440,3.380,3.520,2.19,2.14,1.1,3.430,3.380;4.copy,1.1,3.480,3.399,3.480,2.19,2.14,1.1,3.470,3.399;4.rect,1.1,2.94,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.144,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.194,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.497,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.557,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.71,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.40,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.174;4.blob,1.1,2120.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.259;4.blob,1.1,1832.iVBORw0KGgoAAAANSUhEUgAAADoAAACKCAMAAADMr6lvAAACqVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sFDAxj9fUeSkpCpKREqKgcRkZj9vYBAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVkCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4zhv5JAAACb0lEQVRYhWNgYGBgZGQgEzAxs7CSqZWNnYOJXGtHwSgYBaNgFIyCUTAKRsEoGAWjYBSMgiEOOLm4ydbLw0u2Vj5+sscABASFyLZWWIRsraJi4mTrlZAkW6uUNNlaZWTlyNYrr0C2VkVmJXK1Kquokm2tmjrZWkcBbYCGJgpXS1uHaK2aGqh8XT1ideobGKIKGBmbEKnV1AxNwNzCkjid5lbW6EI2tsRptbPXQhdyMHAkSqueLqaYkzMxOl2MXTEF3dyJ0erh6YUp6O3jS4RWWxtson7+hHUGGARiEw4KDiGoNTQMq3B4RCRBrVHR2MVjYglqHbkgjmyd8Qnk6kxMSoYwUlLTSNOZnpHJANOaRZrW7JxcKCsvNR9VqqCwCK/W4hIYq7QMQpdXVEIYVdU1tXVgVn0DGDSiam1qRjespbWtvQPM6uzq7untAzL6J4DBRBR1kyZnYzhkytRp02fMhLBnzZ4wh4Fh7jwwmI+ibMHkhdi8sWjxkqVAatnyFStXrcbh4DWT12JqXLd+w8ZNmxm2bN22fcdOBlwO3jV5N7rGPXv37T9wEMg4dPjIUYgQVgcfO34CXevJU6fPgBlnz2HzCwKcv4AucvESHuUh4WBgDmJfzsBvNBq4chUMroHY14/fIEXrzVtgcBvMuXP3Hkn2IoHc+w/I1crw8BHZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClq0AAAbNKs1QwaWUkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.242,3.402;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAAOwAAAAgCAMAAAAmJ2TpAAAB4FBMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWYLi895AAABw0lEQVRYhe2X5VNCQRTFHzZ2i43dGGCCCdgtYIKBYid2d3e3/6qMfuLDrqzuXcYZfl92Z86955yZN/PmPY4zwbPj/if2Do7EO3Y8gCJMcHIm3XDhu0IUYYGbuwfhhqcXSBEWePv4ki34+QfANGFBYBDZvCA4BKYICwShYUTz4RFARZgQKSSZjoqOAerBhNg4kun4hESoIixISk4hmE5NAytCB5EId+PSM3CqOZn8LMrlKCOWZOegbxyXm5ePVAukMjOvQiFo1b9TVFwiRt9M75zSMqQqVyjNvMorYLvCU1mFlKprGPawMrV19dauwA5lQ6O1K9iwYePf0NTc8tOISv11aKStFHPFbe0U3Sylo/OnCbXq69BIu2jmanU03Syku6cXP9Cn+H6iemk/zdwBA+pzGZDBoWH8gHzk+xw1UM1Vjo1T9bOMiUmsrJyahsmdMcL4Ypmdm8fJC3VinPx7FhUaGGMsS8s4VaeFyl1ZhXLGsLaOEWsNG1C5m9b4Adra3kGLu3tgX+77B4dQ1hiOjtGacQYu9+QUzhvJ2fkFStIrLuFyryTXcOYobm7vUNL9A2Cu7PEJ0B3F8wtKeX2DzH3/+AQgBkQxEUQ0UgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.731,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.478;4.blob,1.1,7504.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;3.end,1.1;4.sync,10.6492318786;4.copy,1.1,3.130,3.190,3.830,2.19,2.14,1.1,3.110,3.190;4.copy,1.1,3.150,3.209,3.810,2.19,2.14,1.1,3.130,3.209;4.copy,1.1,3.240,3.228,3.720,2.19,2.14,1.1,3.220,3.228;4.copy,1.1,3.280,3.342,3.680,2.19,2.14,1.1,3.270,3.342;4.copy,1.1,3.290,3.361,3.670,2.19,2.14,1.1,3.280,3.361;4.copy,1.1,3.460,3.380,3.500,2.19,2.14,1.1,3.450,3.380;4.copy,1.1,3.500,3.399,3.460,2.19,2.14,1.1,3.490,3.399;4.rect,1.1,3.104,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.154,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.204,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.50,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.213,3.240;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.252,3.402;4.blob,1.1,1332.iVBORw0KGgoAAAANSUhEUgAAAPYAAAAgCAMAAAAWq3XIAAAB4FBMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWYLi895AAABwklEQVRYhe2XVU8DQRSFl+LubsVdt2iLb3GX4g7F3d3d3eGv0rRPfZjpDpk7BdLvZSY5955zkk02uxynwUzC/XXMLSyJdyRmAEUYY2VNumFjawdRhC32Do6EG07OIEXY4uLqRrbg7uEJ04QtXt5k8z6+fjBF2OLjH0A0HxgEVIQxwVKS6ZDQMKAejAmPIJmOjIqGKsKWmNg4gun4BLAitElMxN24pGScqk+KbSrlcmDwsrR09I3jMjKzkGq2XKHnlSMFrUqT3Lx8Hn3TvKUKCpFqkaDU8youge3KktIypFRewbDHr6GyqtrYFYyBsqbW2BVMmDDxj6mrbzA00tikPVTyZoq5fEsrRTdy2toNTTQ1ag+VvINmbmcXTTdiunt68QN9gu4p98sHaOYOqlGf6UwYGh7BDxSN6s4xNdVc5fgEVT9SJqewsnJ6BiZ3dg7GVyTzC4s4eamKx8k/Z1lQwRiLZGUVp3Z1QuWurUM5i2JjEyNWqregcreN+zO2s7uHFvcPwP4dDo+OoaxFcXKK1uZm4XLPzuG8RXBxeYWS+oVruNwb2S2cuWHu7h9Q0uMTYK7i+QXQ3TCvbyjl/QMy9/PrGwOhRDEEZN9AAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.421;4.blob,1.1,960.iVBORw0KGgoAAAANSUhEUgAAABAAAAD0CAMAAACl+FbHAAABU1BMVEUAAAAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUBAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUsLCwXFxcICAgoKCgGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR527oHlAAABNklEQVRYhe3S10/CUBQG8OsW996ztVoVwYnoRXHhACcIKLgH7vH/PxnbmPp9xsSEl5rc7+38enqbc3uE+EpBYZHAFJcQlJaVI3gqKqmlqpqgpraOpL6BoLGJoLmllaStnaCjswuhu6eXWvr6hYqKiopKvtF0XQMYMIxBhCFzGGGEznA56FY0BwwrozZ8PjCtWFP+GN9r0vjuiGZP5cCYPZUDXnuqvF5R+bfx+QnGJyZJpqYJZgKzJME5gnnpQwjJBWpZDBMsLROsBAlW17COrG8gbMothGhsG2FnF+u9/RDUB7E4NiQOxa9JUp1KYx0/OoY6koliQzZA139ySkeenWN9IbMIlzKBcCWvEW4k/a7b3B195Z6vPpwheMg9kjw909X6X16p5e1d/C1qC9UWqi38Fjdv4QeaT1O6Jj6LsgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.372,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.478;4.blob,1.1,2572.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;3.end,1.1;4.sync,10.6492318884;4.copy,1.1,3.140,3.190,3.820,2.19,2.14,1.1,3.120,3.190;4.copy,1.1,3.240,3.209,3.720,2.38,2.14,1.1,3.220,3.209;4.copy,1.1,3.220,3.228,2.20,2.19,2.14,1.1,3.200,3.228;4.rect,1.1,3.114,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.164,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.214,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.497,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.557,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.91,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.60,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.174;4.blob,1.1,2184.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.213,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.402;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAAQAAAAAgCAMAAADKd1bWAAAB4FBMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWYLi895AAABxElEQVRoge2XVU8DQRSFF6e4U9zdWbzFd9EWbYtrobgVd3d3h78KgRf6MNMM3dshZL+XmeTce85JNtlkGOYTC0vm/2BlbUO8Y2kBUIQatnakG/YSB4gitHB0cibccHEFKUILN3cPsgVPL2+YJrTw8SWbl/r5wxShhTQgkGg+KBioCDVCQkmmw8IjgHpQIzKKZDo6JhaqCC3i4hMIphOTwIrAkZyMuzEpqTjVkDRJusDlzACbkZmFvjFMdk4uUs2TyQ288kNBq8JQUFjEom+f/7XiEqRayvEGXmXlsF3pUFGJlKqqzdjjD6JQ1tCuQBe+to52BREREZEf1Dc0GhtRqb8OjaxJwFy2uUVAN1NobTM2oVZ9HRpZu5C5HZ1CuplAV3cPfqCX+/7yWlmfkLn9OtTzwMwMDA7hB0qHv88RnaC5/OiYoH6/Z3wCK/OTUzC5+mkYX2JmZudw8rySxcm/Z4HTwBgTs7iEUzs7oHKXV6CcCVldw4gK3TpU7sZfeRhubm2jxZ1dsNfL3v4BlDUhh0dobVoPl3t8AudNxOnZOUrSchdwuZcZV3DmJFzf3KKku3vAXPnDI6A7CU/PKOXlFTL37f0D5y1EMc7LozYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.392,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.478;4.blob,1.1,1796.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACuFBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwBAQECAgImXl4pZmY0gIAbQ0MxMTE+Pj4XFxcKCgoNDQ0FBQUPDyQvL3VQUMUbG0RgYO4BAQNYWNotLXAhIVJjY/UFBQwfTU0dSUkECwtFRatHR7A3NzfBwcH39/fp6emTk5MMDAxNH01JHUkLBAsJFhZfX+owMHYnJyf29va4uLhISEhiYmLu7u61tbVDG0OUPJSTPJNZJFkWCRYaPz8xenoPJSUUMjJnZ/+qqqra2toEBARHR0f///9BQUEJBAk/Gj96MXqYPphqK2olDyULHBwSKysECgoQECcbG0L09PSEhITr6+uMjIwcCxxuLG6ZPpkrEisxeHgTEy4ZGT4JCQlsbGzR0dGgoKAHAwc8GDx4MXiXPZdlKWUQBxAmXV0iVVUHEhILCxwdHUn19fWNjY0bCxtdJl2SO5KRO5FVIlUSBxI2hoYCAgZlZfqtra1EREReJl6GNoZEHEQIAwgJFxdQUMY8PJUpKSm3t7dfX1/t7e0XCRcCAQIzM35YWNs6OjrExMSXl5cODg4LCxoXFzo5OY1NTb8AAAEEBAtTU802NoUICBQxMXrT3RSAAAACRUlEQVRIiWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomTgVTJCSpYIiUtAzlhsjKyVNuCIOCIhUMGQV0BkrKKtglVNVI0KGugV2tmioue7Ho0NTSxqZSR1cPlyFYdOgbGGJTaWSMywysOkxMsSk0M8dpCDYdFrqWmOqsrJVAlI0tCNihsLDrsHfANERDHUw5OoGAMwoLuw4XVwwhNy13CO0BAp4oLOw6vLx90IV8/WwwXYdXB4N/ALqIqQk+M7DpYAgMCkYVCNENxW8Ihg4GBtuwcFSBiEj8ZkB1REWDQRRELCYWVU1cPAFDIDoSEsEgiZBivCA5BQxSKTJkqIM0KpiRnkG5GZlZlLcKsnNyKXdIXn4BLqnComIiDSkphTLKyisqq6qBjJraOohIvJZyQD2YZQcuu2xxlgENjRC6qbmlta29A8jq7Oru6QWLufX16zpPADLUwWWX00QcZghMyoMwJk+ZysAwbfoMIHPmrNlz5s6DCM/3d1oAzP/gsstjIQ5DFk1aDGEsWQoily2H8FasXLUaSCn5rvHW0CPonbWT1oHp9dM3gKiNm0Dk5i1bt23fwWCx0zps124Gwt7ZM2kvhLEP4pL9DAwHDh46fOQokBNzzAVanxHwzvET0G7GSUiYnGJgOH3m7Dmw0Hl9HJowwIWLEPpSxeVpV662AFnXrhOrFw5u3IQybt2uWHbnLsn6weDeifvkaUQBDx4+otyQx0+eUm4Iw7Pn2MUBR62dPjJu8i0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.516;4.blob,1.1,6132.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,668.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR5IT15yAAAA40lEQVQ4je3S2VLCQBCF4c6AsgQHs7CIJKhIVBBQcAPB9f3fyZ6pbstz7W1ykfq/ykxXTWqIAiOPL6pUD8S+yBzWdIErMvVGU+yKjAlbuoCLfWRJzMXZtsdiLvcpinVDFDsnqTpJnTuhuhM6d3vqbo/dPxkIudindijmYmf5SMzFPjvX7VxkLsZtoSu6zCdCX1Rc6WpfepTfn+Re1+ibKXgyu/3r/jyD/YtGAF7e4fz7FXhtF+AHW4Af7RP42TbBL5stzn9N0fEcvdvswebtfQQOPj7B5usbDfPK+1XeL/D/7tcP8PsjI9TaZkgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492318993;4.copy,1.1,3.240,3.190,3.720,2.38,2.14,1.1,3.220,3.190;4.copy,1.1,3.220,3.209,2.20,2.19,2.14,1.1,3.200,3.209;4.copy,1.1,3.300,3.342,3.660,2.19,2.14,1.1,3.290,3.342;4.copy,1.1,3.310,3.361,3.650,2.19,2.14,1.1,3.300,3.361;4.copy,1.1,3.490,3.380,3.470,2.19,2.14,1.1,3.480,3.380;4.copy,1.1,3.530,3.399,3.430,2.19,2.14,1.1,3.520,3.399;4.rect,1.1,3.124,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.174,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.224,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.519,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.101,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.70,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.213,3.202;4.blob,1.1,504.iVBORw0KGgoAAAANSUhEUgAAAEAAAAAfCAMAAABgbzvOAAAArlBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGBgIICAPIyFH//2coKBA0NBUgICD///8bGxsTExMiIiIFBQVKSh62tkojIyP39/cEBAJbWyXS0lUJCQRsbCzf31r4+GSjo0I5ORenp0P7+2WBgTQTEwhQUCDa2ljx8WGVlTwuLhMCAgFUVCLLy1LGxlBcXCVDQxu7u0zz82ItLRIeSh5l+WUiVCIgTyBc5FwJFwkLtSaIAAAAh0lEQVQ4je3NtwKCQBCE4QFREE49MSdQMecc3v/F9Gzsdyjva7aafwHHAcUteEUqUPIDV7YshwbxOlIGEahUDSJg5aKm62wg5gIN3RQuW+3f6XRF615/oCLh56/hKEnHE/ke02w2J+bAYrlab6jCdrdXhyOVwOl84QLAlQ1Y1t/t/iALz9f7A3EJB1tE0MgSAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.402;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAAQAAAAAgCAMAAADKd1bWAAAB4FBMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAEHAweTPJMsEiwdHUc0NH8ICBMHBxA8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4ICBQBAQMRESo8PJQCAQKKOIo7GDsuLnEJCRU4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi0LCxt9M31KHkozM30eHkpEHESCNYIRESkcHEQOBg6XPZchDSEYGDw3N4kGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjUBAQQFAgWRO5EwEzAeHksyMnw7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWYLi895AAABxElEQVRoge2XVU8DQRSFF6e4U9zdWbzFd9EWbYtrobgVd3d3h78KgRf6MNMM3dshZL+XmeTce85JNtlkGOYTC0vm/2BlbUO8Y2kBUIQatnakG/YSB4gitHB0cibccHEFKUILN3cPsgVPL2+YJrTw8SWbl/r5wxShhTQgkGg+KBioCDVCQkmmw8IjgHpQIzKKZDo6JhaqCC3i4hMIphOTwIrAkZyMuzEpqTjVkDRJusDlzACbkZmFvjFMdk4uUs2TyQ288kNBq8JQUFjEom+f/7XiEqRayvEGXmXlsF3pUFGJlKqqzdjjD6JQ1tCuQBe+to52BREREZEf1Dc0GhtRqb8OjaxJwFy2uUVAN1NobTM2oVZ9HRpZu5C5HZ1CuplAV3cPfqCX+/7yWlmfkLn9OtTzwMwMDA7hB0qHv88RnaC5/OiYoH6/Z3wCK/OTUzC5+mkYX2JmZudw8rySxcm/Z4HTwBgTs7iEUzs7oHKXV6CcCVldw4gK3TpU7sZfeRhubm2jxZ1dsNfL3v4BlDUhh0dobVoPl3t8AudNxOnZOUrSchdwuZcZV3DmJFzf3KKku3vAXPnDI6A7CU/PKOXlFTL37f0D5y1EMc7LozYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.402,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.641,3.421;4.blob,1.1,4888.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAAGkAAABxCAMAAADh2X3+AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAABm0lEQVRoge2Xx04DQAwFFwik0pbQAiR0Qg2EXkL9/39C4oL07JUgLie/D5i52ZqUTDdhi//d5JSTqDI94yOq1uo+otRotpxMs3NOojS/4CRazA0n01JuO5mW84qTaTWvOZnWOxtOprS55WXq1rxMvc62l2pnd8/J1No/cDKlwyMvU2F9sxuP5OOTUyMTIZ+dG5kI+aJpdagIeXBpZCLkq9w3MiF5mK+NTIR80zUyEfKt2Z1H8t3AyoTk+wcrE5Crj09GIiQ/5xcjE5LrI6vPheTXNyMRkt8/hkYiIH+OKkYiJLe/jESG5PKwsPX+PJBJYav9eSAzha3054HMFbbOn0cyW9gqfx7JbGGr/Hkks4Wt8ueBXChshT+P5EJhK/x5JBcKW+HPI7lQ2Ap/Hsl8YWv8eUJmC1vlzyOZLWyVP49ktrBV/jwhM4Wt9OeRTAtb688TMilstW8c7a6waHfZot1Fi3aXLNpdsGj38RftrkKOdv/7ot0li3YXLNpdtGh30aLdLRbt/q9Fu4sW7S5atLtg0e6SRbuPvx/yNzXqTbufeuNqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492319094;4.copy,1.1,3.220,3.190,3.740,2.57,2.14,1.1,3.200,3.190;4.copy,1.1,3.170,3.209,2.50,2.19,2.14,1.1,3.150,3.209;4.copy,1.1,3.180,3.228,2.40,2.19,2.14,1.1,3.160,3.228;4.copy,1.1,3.310,3.342,3.650,2.19,2.14,1.1,3.300,3.342;4.copy,1.1,3.320,3.361,3.640,2.19,2.14,1.1,3.310,3.361;4.copy,1.1,3.510,3.380,3.450,2.19,2.14,1.1,3.500,3.380;4.copy,1.1,3.550,3.399,3.410,2.19,2.14,1.1,3.540,3.399;4.rect,1.1,3.134,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.184,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.234,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.519,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.557,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.111,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.80,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.174;4.blob,1.1,496.iVBORw0KGgoAAAANSUhEUgAAAJIAAAANCAMAAAB1lccqAAAAkFBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDwGDg5ZJCQGAgIECwtf7Oxh7+8GEBAJBATyYmJQICADBwdX19dY29ucPz+qRUVa+JJ6AAAAnUlEQVQ4jc3U2RLBQBSE4UMjg4TY9yXEvr3/28nMiDGquNT+u5OaqnxXLVIo4r8SlMpsw1uCSqCel1Jfnv4qQbVWz48wajSZGJsAcSs/2p1uyMTYMlKvP2ArvDIShiO2wkuTxhO2wkuTprM5m/GaJmGxfFxuBFhzkCSWtIrW5nYjwJqDdLPdGdL+cDQf3Aiw5uB0vqSGhOuN8f8P3QELURtN4tOXogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.193;4.blob,1.1,2224.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.402;4.blob,1.1,688.iVBORw0KGgoAAAANSUhEUgAAAP4AAAAPCAMAAADzhoLfAAAA81BMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAFGti2RAAAAyklEQVRIid2URRLDQAwEFYeZmRxmdJiZ6f+viT+wXl+0SqVPqpo+9EkAKgYJ/hGjyazLkwzIIURYrHosm92BHUKD0+XWYXm86CE0+PwBvhQMhfFLaIhE+U4snsAPoSGWTHGddEZACBFZmWfk8gUBHUQUSzyjXKmKCKGhVm9wjGZLSAgW7bbWBZ2u1grQs/cR49BRBsMR+wIYT6bMdTZfwFIWVYrCar1R2Jf62bY75ro/HOF0FpZKwuXKnG53gR0/x+P5ok6g5Pj+wBf2ZhYs9HDdGgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.421;4.blob,1.1,1008.iVBORw0KGgoAAAANSUhEUgAAAR8AAAANCAMAAACn4JpbAAABd1BMVEUHAweTPJMsEiwAAAAdHUc0NH8ICBM+PpkHBxADAwc8PJMSEiwMDAX19WNKSh5iKGJlKWUFBQsoKGIpKWWkpEKoqEQqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwhGRhz29mMODgYCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDsDAwHm5l1jYyhTIlN0L3Q5OYwXFzgiIlMvL3SLizjBwU4bCxuYPpgTCBMSEi07O5ILCxstLRL+/mcfHw19M31KHkozM30eHkrQ0FR8fDJEHESCNYIEBAkRESkcHEQ1NYJyci7Z2VgOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSEYGAr8/GY3NxZuLG5ZJFksLG4kJFm3t0qVlTw1FjWOOY4EAQQLCxoWFjU5OY4BAQRZWSTs7F8GBgIFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzAJCQTy8mJQUCBeJl5mKWY0NIAbG0MmJl4pKWacnD+qqkW/XoFjAAABOElEQVRIibWSVVPDQBSFA7dNKE6LphBcikOLu7u7u7vrj2ey+7ybYXru95B9+eacO2diGAmJ5IHPLx7TSvIy/0EgOQWYhic1Ld19DMrI9FL9PvGYVhbygGAImYYnO8f9GpSbl68XC2z534StQmR/kVOMjINTUlpG7j7lFZV6sapavjUOtD9SWwfNQ1Pf0EjuPtTUrPUiLa08B0RjPLko2tpJ7NPR2aXTunsCPP29tskTDKKvf0DsQ4NDOi0U5DpgeIQrGcPomNxnfEIjTTpTXP3TM1zJGGbn5D7zC4tqaWl5hat/dW2dKxrCxuaW2Ie2d9RSLMp3wO4eXzaC/QO5z+HRsUoJ2yd8/adn53zhAC4ur8Q+1ze3KuXunrH/4fGJMT1+nl9exT709q5SPj45D/j65kyPn5/fP1wpScevdYIOAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.422,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.478;4.blob,1.1,6788.iVBORw0KGgoAAAANSUhEUgAAALEAAACACAIAAADLbR+aAAAABmJLR0QA/wD/AP+gvaeTAAATmElEQVR4nO2deXATV57HW63Dsmz5kHX4wo6NfGEc2RhZgggz4GQ8sQkJw0AKMoEsbIqqmarUTJEUla2dIkXYVEKxu6lxAYGamlm8k1TBJBMv2QJTjosBXL6CscfG+Db2jGWjC5+6r/1Du8JutVqtfn3IWn3Kf8D79fGT/HO/7ve+79sQFHWw2XEaTYNItJnpRLCord1w+vRWGk4UF8duaNBs3izCvwtMXTZM4XbbjcZemWwb04lgoVbLOjt1NJzIbnf39hq3bZPh3yUKawKCIJ2uMy1NwWbzmU4EnZycxIwMQVeXnp7TdXbqFIo0Pp+Nc/vorImFhWGXyyKRVDKdCDpqtWxkZGFhwU7P6YaHFywWV2WlBOf20VkTXq9Hr++KzO4DhllVVdKODjo6Dh8ej7erS4+/+4jOmoAgSKfrTE6W8/lpTCeCpLQ0lceDe3uNdJ60s1MnlyenpeHqTKO2JsxmrdmslUpVTCeCRK2W9fWZ7HY3nSfVas1arVmlkuLZOGprAoIgna5DJlMzncUa4uM5CkUanR2Hn44OnVqNq/uI5prQ67v5fIlQmMd0Is+prBSbzc7h4Xn6T93drZdI+Hl5wpBbRnNNOBxL8/NDEXWpUKtl3d0Gr5eBUy8tOYaG5vFcKqK5JiAI0us7JBIli8VhOhEIgiCxmC+XJzPScfjo6NArlRIOh4W9WZTXhNHYB8PsCBnnVqmkMzMrs7NmphLo6zOy2XDIce4orwmPx2kw9EilVUwnAkEQpFTSOiwRiNPp6ekxVFXhevqIESNGjBgxYsSIESNGjHUJOy5O09Ag2kzC2MCG2tqtp0+DHwciNStsaFPXgYCqzKNwfMJttxt7e2XbSBAxyNRqXWcn+HEgUrPChjZ1HQioyjxqx6x0nZ1pCgWbD6SBS8zJEWRk6Lu6IiorbGhW14EQqMyjtiYWhoddFoukEkgDJ1OrF0ZG7AsLEZUVNjSr60AIVOZRWxNej0ff1QVyoWbBsLSqStfREVFZYUO/ug6EQGUe5fMdus7OZLmcn0ZQA5daWgrzeMbe3jWtLBbM5a7+YbHZeKNkZIUNI+o6EBDKPMonkc1arVmrlapUf7t5k8DuMrXa1Nfntq+5CIvKyjb/8perW0x//evgxYt4oqRkhQ0j6joQ/Mq8mzf/BtFQExAE6To6MqqrCXz7nPj4NIVi8MIFRPvS2FjvJ5+sbnFZLDij4Flh41PXXbgwSO5hqaajQ1ddneGrCTrgJSXtuHRJmBe2Bi5do1F99hnECqEBoTkrbDSa9M8+U1GTMoUkJfEuXdrhU+bRoZ9wLC3NDw3J1GFr4GRqtaG7G6JGqkY4K2wYVNeBsFqZR5OmRt/RIVEqWZwwuiq+WJwsl5P7xAGeFTaMq+tA8CvzYBaLBQfAIvvaZ+zrg9nssEaUpSrVysyMeXaW3EwAs8KGcXUdCH5lHqe8vFwoROq7R0ZGdDoyi93jdBp6eqRVVaa+Ppy7SJXKufv3ScyBlKywUSql9+/PkXIo+vEr81gCgYAd8Phus9mcTicjmcWIESNGjIgH170ki8Xy3XV6PB6K84nBPLgewyorKwUCAQRBAwMD8/MMrHUEITlZvrg4znQW6wlc4xOPHz8eGBigOhUqUCg+2LXrKtNZrDNw1YTFYjGb198zd1bWyxUVH7a2/pyi44Oo62o31J7eSo6akHSidm0gi8XeseNiT8+Z5eUnFJ0CRF2nlqk7deSoCUknamvihRdeT0jIGh7+HUXHB1HX5STmZAgyuvSkqQnJhcKayH3ttQ2vvspJSKDuFBjI5YdmZlqczpXAkEqlunv3rtVq1el0DQ0NiYmJ/tBrua+9uuHVBE7onEHUdWqZemRhZMFOmpqQXCisCZfFkltfr/70U/mhQ/FS5FpmFpuNUEPBXC6J0+KZmTt1uvbA9qKiojt37lit1n379n344YdvvfXWtWvX/FGLy1KfW/+p+tND8kPS+KDrr0HUdTALrpJWdegonNsDhEJNjba1VdfeLq2qkr30kvLMGVN//0xLy+LYmC9adPSoVIU0IHt8+bLx4UPwU/P5aXy+BPUR9OOPP56ZmdmzZ4/L5YIgSKvVNjc379q1686dOxAEtWpb23XtVdKql2QvnVGe6Tf1t8y0jC2OIQ4Coq4rTS3lwbxeY2/oTSMcHo9XXV2dmppKbPeE7OzN771XffmyqLTU18IXi4W5uYgfjkBASrYpKUUnTnizsnYHhlZWVs6ePbu6xWAwnD9/PnDL7ITs9za/d7n6cqmoFBF6992SY8eKieX2bsm7x4qPEduXHijX3rHj4iRKZYZGk5iba3jwwKzV+trt8/OOxUXExh6Xi5yTsuMgCPJ4kEeLj49PSEh4+vTp6sbZ2VmxWLy6JY4dp5QoNRma3MTcB4YHWrN27UGIq+viOfGKNMWFQaSaMKKgsCYSsrKydu+WKJWQ1zvX1vb4yhX7s2f+KKV9h832DIIgTsCtotVqtVgs6enpqxszMzO///5737+zErJ2Z+1WSpReyNs213bl8ZVn9meIg4B411WKK81O8/D8MIF9aYPCmsiqqUkpLp6+cWOurc1tsyGiUzduaFtbEY1Wg4GUU1uteo/HmZiYHRhqbm4+ePDgRx995LufqK2tFYvFt27d8kVrsmqKU4pvTN9om2uzuZE5+wBR16ll6m5Dtxdab9I8VAjcT8TLZCyYsfGPN95o12hQLtElJSVWq/XWrVu1tbVHjx41mUzNzc3+qCxeBrOwchaL+V98UZ2ZSeQBW8wXf1H9RWZCJoF96QTod4at27PqdF7m5lH//vfm7OwfB7YPDQ3V1NQIhcKmpqbz589fv3794MGD/qjOqvN4sXIGUdeppKqZlZlZM4VqwkAIaCtx9R2+4wa206PbI8bw8O+2bPlnmWx74ChFe3u7RqMhdlgQdZ1Sqrw/R62aMBACvyNcY0Rbt25FnSuPcN3etm3/KhZv+e673VB09N+EoOp3JBAIhEKhUCgMPHokw+Ek7N/fU1X1L0wnEiOS4PPFFRX/xHQW64z1toYtBgUgtJURYU4eg1kQ2sqo1U/EwA9CW0lfTYTlXUebO12wrCoqKhBD4OFSfqr84KODobfDATeRe9x8PKcuB/xQqFkhtJX01URY3nW0udOR6KiHoPDtwtH/HCXlUM4V55NvnxQeKQQ/FJ6saKoJAt51NLjTke6o50e8RZxSkjL2R6TwgjCjjaO5e3N5STwasqKpJgh419HgTke6o56fwiOFs3dmzVrSxO7aVq1jwZF/IJ+GrELUBOpoebipEPOuo9qdjgpHPR8wB5Yfko82ktNx+PC6vWNfjoF0H/izCvEsWlRUJA2QUj5+/NhoDEN2hu5dhwNdZ2f2K6/w09JsJlO4+1KXVUiya7O5CdzJbyZXN7JgFsxb8+fkdXs9Tg+eqI/RxlHFSYUwV7g8vUxWVqiEqImpqSmtVototFqtYWWD6l2HB0rd6QhnFZLCI4VPvn3iMq9ReeXU5fzku5+sbpn6r6nbb9zGE/XxbOCZqd9U8HbBw7NEZEeoWaESoibsdrvD4UA0hrWSOJh3HU4ocqcDzAoDXjLvhb0vNO9tRrTP3Z/7s/LPq1vs83acUT+jjaObTmwiUBPBskKF8r5DXFnpNJvnhwmqzfTd3Xn79wvz8pafkLmcCzArDPIP5NtMNm0r8uLqWHQYHgRVkWFH/Yx/Na4+p5aqpPow1xoFywoVyvsOQO86vzsduTVBnaNe4ZHC8a/GvR5KZuctTy0zLTOFRwrDrYmwsgrxEGGz2ZYDcOFWV5PiXUe6Ox11jnrCPGGGJoPcJw4Eo42jG9/ciLghJTcrIN+7kPuS4l0X6E7H4nAC15D5tZ/YUZCsQn7egp8XGPuMzx4hpd4kMtU0xeaxwxrnDjcrIN+7kPuS4l0X6E5X/v77gf63I1ev6trbQ0ZBsgr5eeWH5ENXhggcGT8uq2vi+kTB4YKppimcu4TMCqGtBPK9Y0p7J0hPZ8fFIc9rNDrN5pBRnFRUVMzNzSFWB0W41pAwwbSVMdYAPi+6jlin2soYMWIwR+xaQR88XhIEQV5vpL/rJaa9o4+kJLlC8QGHE890IiF4XhPRelcVTANH/+c1Gh+azdqionfoPCkBov86QaIGDpzJya9TUzeJRJTrTEGI8pogXQMHiNO5rNf/kJ39CtOJYBHlNUG6Bm41dTk5N+vqVrdgOOr5MRp7UlKKffeb9JNTl1N3sw57mwhd8+NfmbSacB3gfWqzzg9IlmVzYPjNjRtPlZeXiURd+ufzkz5HvXv37u3bty8zM/P8+fP5+fn19fWI3RcXJyAISk4uNBgekJIPzIVZ7IDvyuFZPQsKc+CNb24sP1UuKhOFnFOltiYQ4k2v1+vFNz1NiuYPv9oMJ/EczvHi4pMvvpghEPxpcvLEvXsdq2aFsB31/LjdNodjSSAg7fb2R3/4UcFbBYjGlgMtk19PQhDEiecUHy9+8eSLggzB5J8m7524pwtl4UhhTYhEos1rF+2YTKbBQVzWYKRo/vCrzXDy+507f5af/0lv728fPTIFuDHV1dV9/vnnfiHB7du3jUZjfX09oiYgCHK5LFwuci6NMD/85oeBz5EO+UsTS75/7Pz9zvyf5fd+0vvot49sJnQ3JgQU1sTS0lLvWgUsfuEFuOYvLLUZTq5NTFRKJL8qKxPz+ZeHhvpXKYdxOur58Ho9MMwlKyvzjNkyh3yprsfxv9/VxLUJSaWk7FdlfDF/6PKQqT+02pnCmnC5XMvLRBTGEBl9R1hqM5w0TU3dmJ7+aV7eqfLyX5SWduh0FwcH/zg2BuFw1FsNm81DNX0mBnbfMdU0NX1jOu+neeWnykt/Uarr0A1eHMT7IBZRY1Z8Pl8YACccqdXee3vV57DeJwv4eWuyslr27Fk+9tz99JtvvhkdHfUnWVtb6/V6X375ZcSOLBa8Y8eFzMxdhE+NQJgnlGyVIH7iUpFqAQiCsmqy9rTsObaM27E1omoCEGGe8ITnhGizCGMbUj5vmej5KbAd9fwkJGRWV19OTNwAeGrCiMqwvpY1EPiO6HlfLQG2/GbL/of7sbeh4m9g+/btbW1tVqvVYDBcunQpKQllECIrq0atPhfJbjBA9xMR63tHgwYOFTyOejKZanb2biTbrgHVxMjICKoWDeSYpHB903WmU0AnLa2cx0vWapEGwhEFUE1YLMhHoBgYCAQZBQWHR0b+4A7i2hzj/x0pKcUiURnTWYSG4Tsd/7wG6rB37F23jMDwHFhJSYlvpG98fHw2YBEO4Xfd8pJ4brvbbUdXuWFHYzA/V764uNjb22tAe0sD4XfdJsmTFB8oOPHoFY8djcG89s7tdi8vL6MumyH8rlvjQ6NZay56p4hAlDAkutNhE5ajHoGsmL9OUMTk15Opm1KDDWViR4lBojsdNmGpCQlkFbU14Vx26n/QZ7+C8qqfkFHCkOJOhw0BNWG4WUVtTUAQZOwxphSnBPsusKPEIMWdDhsCasJws6LD944pFicWIQhKLkwmECUGuDsdNsQc9cLNilrvIsLaO1Jw29yOJYcgHf2dpcGigDkDutNhQ1hNGFZWFHoXgWjvyMJlcXGFQRVNgVHwnAHd6bAhrCYMKysKfe9AtHdk4fV4YW7Qzi4wSkrOhN3psAFUE+LPisK+A0R7RxZsHtu5EtQwJDBKSs6E3emwAVQT4s+KDs9UpmDBrLiUOFSjyZBREAi702ED6KiHPytqfe+YRZAuYHFYS+NLBKKAEHCnw4YURz2cWa2bB0sCpJSkOBYdKzPoCmnsKCCB7nQwD2bz2Ygf//ot7ChEkqMeTs+8iJgHgmE42Fw5yHCITCWbvTsbTOSGHQUk0J3u9XuvS1XIO7O//MNfRv5jJGQUIklNiNMzj/maEIlEGo0Ge66cAGnlabxkXrA7MuwoKdz9x7ur/3vnnTvcRORT8fKTZTxRiDw1ISKrEDAyL+pfx8HloowiEPZjE2QI1OfUqSWpBKIxopOU4hSMVQzY0RgxYkQj8VIs1zDsaIxA1v2zaPaPszEUU9jRGCFYj+tFU0tSt//7dr4Y/X2T2FGaP29iItdsPl5HvTIPnHV8nWDBLPlh+fR/T9uMKEtosKP0s7Li/PbbJ0eoV+aBs45rIk2RFpcS97TtKYEoIzQ2ju7dm5tEpTKPFNZxTUirpPND88GWaWBHGaG1Vbuw4DhApTKPFIBqglllXnJBst+1KdxoMCj9RG6398svxyK/+wAa2ybFnY4Y3AQuV8i16tFn7bGjGFCtNWxsHD15UpGbK5ymQJlHFkA1waC6gpPIgSDIZUWftceOYkC11nBg4Fl/v+nttwvOUqDMIwugmgB3pyOMTzPndaNPa2JHMaBBa9jYOHrixKaorQkG+w6fTpUdhz43hh3FgAat4VdfjZ87p1appF2kqrBIZL32HY5lh9ftRXV3CxnFgIZP9PSppaVl5siRwuisCZvNxpRTkdflXZ5eTshOIBDFgJ5P1Ng42tDw0q9/3e5wRKKvBoWPjlS74s0PzqduCqqBwI4yS1PTFI/HXj3OzeGwAl6TC8MwCzxKAAp1VlS74s21zeXU5SRtTEIdh8COMovV6rp+feLw4YKm/9PAvf9+eV4e8ru6enWkvV0HGCXA82pCfcsqCDS8oTX/QH5iTmL/v/Wjyiqxo6R/XhDS0wVxAXfERqPNbHYCRgnwPxCI+IXKmmaPAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492319199;4.copy,1.1,3.150,3.190,3.810,2.19,2.14,1.1,3.130,3.190;4.copy,1.1,3.170,3.209,3.790,2.19,2.14,1.1,3.150,3.209;4.copy,1.1,3.320,3.342,3.640,2.19,2.14,1.1,3.310,3.342;4.copy,1.1,3.330,3.361,3.630,2.19,2.14,1.1,3.320,3.361;4.copy,1.1,3.530,3.380,3.430,2.19,2.14,1.1,3.520,3.380;4.copy,1.1,3.570,3.399,3.390,2.19,2.14,1.1,3.560,3.399;4.rect,1.1,3.144,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.194,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.244,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.520,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.554,1.6,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.121,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.90,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.233,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.292,3.402;4.blob,1.1,692.iVBORw0KGgoAAAANSUhEUgAAAQgAAAAPCAMAAAAvWqHBAAAA81BMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAFGti2RAAAAzUlEQVRIid2URRaDQBAFG6LEPcSJO3F3IW73P024wGTYzDQvter3fi1q1QA6ggj/jcVqM+SJAuMQdOwOI5ZTcrEOwcbt8RqwfH7mIdgEgiG6FI5E2ZdgE4vTHTmRZB+CjZxKU51MlkMIOjmFZuQLRQ4d6JTKNKNSrfEIwabeaFKMVptLCHtU9dcFne6vFaAn9RnGcWQwHI3JF8BkOiOu88USVgqvUsasN9sB+dJ/4W5PXA9HDU5nbqnIXK7E6Xbn2GFiHs8XdoI50N4f+AKvNhYsTBBr+wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.421;4.blob,1.1,1016.iVBORw0KGgoAAAANSUhEUgAAAQEAAAANCAMAAACehysAAAABd1BMVEUHAweTPJMsEiwAAAAdHUc0NH8ICBM+PpkHBxADAwc8PJMSEiwMDAX19WNKSh5iKGJlKWUFBQsoKGIpKWWkpEKoqEQqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwhGRhz29mMODgYCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDsDAwHm5l1jYyhTIlN0L3Q5OYwXFzgiIlMvL3SLizjBwU4bCxuYPpgTCBMSEi07O5ILCxstLRL+/mcfHw19M31KHkozM30eHkrQ0FR8fDJEHESCNYIEBAkRESkcHEQ1NYJyci7Z2VgOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSEYGAr8/GY3NxZuLG5ZJFksLG4kJFm3t0qVlTw1FjWOOY4EAQQLCxoWFjU5OY4BAQRZWSTs7F8GBgIFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzAJCQTy8mJQUCBeJl5mKWY0NIAbG0MmJl4pKWacnD+qqkW/XoFjAAABPElEQVRIibWRVVfDQBCFA9MmFKdFUwjQYsWhxaVoKe7u7u7y4znZfd7NNGfne8i+fOfeOTealpYODni87NGNDCczBXyZWQrT3JCdk2s/GuTlO6leD3t0o0DlAf6AyjQ3FBbZXw2KS0rlYpnJ/33QKFfZX2FVqoxzQVV1COwFwjW1crGunr8NltL+SGOT0rzUaW5pBXsBaGuXepGOTpoDojGaXDxd3cAW6Ontk2n9Az6a/kFTpwlGMzQcZwvAyKhMC/ipDhgbp0rGMjHJF0hMSaSkNU3VPzNLlYxlbp4vsLC4JJaWV1ap+tfWN6iikWxubbMFYGdXLMWidAfs7dNl4zg45AscHZ+IlKB5Std/dn5BF47i8uqaLXBzeydS7h8I+x+fngnTMby8vrEF4P1DpHx+UR7w/UOZjuH37x9NiEU1o1x6PQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.442,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.478;4.blob,1.1,5340.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;3.end,1.1;4.sync,10.6492319298;4.copy,1.1,3.160,3.190,3.800,2.19,2.14,1.1,3.140,3.190;4.copy,1.1,3.180,3.209,3.780,2.19,2.14,1.1,3.160,3.209;4.rect,1.1,3.154,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.204,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.254,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.131,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.100,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.174;4.blob,1.1,3184.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.326;4.blob,1.1,1580.iVBORw0KGgoAAAANSUhEUgAAADgAAABHCAMAAABlLHQ4AAACPVBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/dDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0JBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBAHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8bCxtdJl2SO5KRO5FVIlUSBxIREQcsLBJeJl6GNoZEHEQIAwgEBAGWlj09PRkXCRcCAQJ3dzBZWSQECwth7+8GEBBMTB8DBwdX19dY29sxeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5efu6uAAACHklEQVRIiWNgwAsYmZjxK8AJWFjJ1MjGzkGeRk4ubjKt5OElUyMfvwCZOgWFyNQoLEKmRlExcTJ1SkiSqVFKWoY8jbJy8mRaqaBIpsZRQD2gpIzCVVFVI1KjshIqX12DOH2aWtqoAjq6ekRp1DdAEzA0MiZGn6GJKbqQmTkxGi0sVdCFrLSsidCooY4pZmNLWJ+drj2moIMjYY1Ozi6Ygq5u7gQ1mpthE/XwJKTPS8sbm7CPrx8Bjf4BWIUDg4IJaAwJxS4eFk5A48gDEWTqi4wiT190TCyEERefQIq+xKRkBpjGFFI0pqalQ1kZ8ZnIElnZOXg15ubBWPkFKBKFRcUlpWBWWTkYVKBqrKzCZWR1TW1dfQOQ0dgEBs0osi2tqXic09be1MHA0NkFBt0oUj2tvTi19fVPmDhpMg6nTmmdikPbtOkzZs6azYDLqXNa5+LQOG/+goUQFlanLlq8BIsmDmDLcOkynH4Ag+UrMMVWSq9ajVWxXyAYGILYa5Iw5deuW78Sq8YNG8FgE4i9efEW/E5CBlu3gcF2MGfHzl3E60QG6bv3kKeRYe8+MjUOaoCzhYHWEsEEuFoY6C0RDICjhYHREsEAOFoYGC0RTIC1hYGlJYIBsLYwsLREMAG2Fga2lggGwNLCwNoSwQBYWhhYWyKYALOFgb0lggEwWhg4WiIYANLCQCpEcLREMAG4hYFUiOBqiWAHKIUICgAApHqH0Xe0XG8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.402;4.blob,1.1,692.iVBORw0KGgoAAAANSUhEUgAAAQgAAAAPCAMAAAAvWqHBAAAA81BMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAFGti2RAAAAzUlEQVRIid2URRaDQBAFG6LEPcSJO3F3IW73P024wGTYzDQvter3fi1q1QA6ggj/jcVqM+SJAuMQdOwOI5ZTcrEOwcbt8RqwfH7mIdgEgiG6FI5E2ZdgE4vTHTmRZB+CjZxKU51MlkMIOjmFZuQLRQ4d6JTKNKNSrfEIwabeaFKMVptLCHtU9dcFne6vFaAn9RnGcWQwHI3JF8BkOiOu88USVgqvUsasN9sB+dJ/4W5PXA9HDU5nbqnIXK7E6Xbn2GFiHs8XdoI50N4f+AKvNhYsTBBr+wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.421;4.blob,1.1,2368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.478;4.blob,1.1,6260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.552;4.blob,1.1,996.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB2klEQVRoge2XWU/CQBRGC66IDoobLuAK4gLuC264/P//ZClI2pn21phzfTBznpgJ+ZpQkpMTBGoUinrbAyYmp3QfMD2juz9bmtN9QHled3/BFFT3K2ZRdT9YquruL6/o7q+WdffX1lXnaxubqvtbZlt1v97YUd3f3VOd3z+oaM4fNpqa80HrSHV+hIbF2rHPChY7PomfcIs1T8/iR9pitU49eQFbrFuy3ihssfML6wK22OWVfYNa7Np07SvUYjemZV+hFrs1d/YVarF7Y//dWYs99B6tG9hiT/bbhC1W7VgXsMWeey+JM26x13789+AtVnx7j50ULPbxiU/KtPO/8gvG5k36DOPbvJbPOIbmdXyGMTSv4zOOyLyOzzgi87o+wxiYN8VnHKF5U3zGEZo3xWccoXldn4GE5nV9xhGZ1/EZR2Rex2cckXltn4EMzZv0GcjIvEmfcYzNq+Szv+5HriTT+xEryax+hEoysx+ZkhT6ESlJoR+RkhT6ESlJqR+BkhT7EShJsR+BkhT7EShJqR+JkpT6ESlJoR+RkhT6ESnJ7H6ESjKrH6mSzOpHzGe+H3+E78c8fD/m4PtRxvejiO9HCd+PWfh+FPD9KOP7UcT3Yw6+H3P4V/34BYywQJPrwNCOAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492319407;4.copy,1.1,3.170,3.190,3.790,2.19,2.14,1.1,3.140,3.190;4.copy,1.1,3.190,3.209,3.770,2.19,2.14,1.1,3.160,3.209;4.copy,1.1,3.340,3.342,3.620,2.19,2.14,1.1,3.330,3.342;4.copy,1.1,3.350,3.361,3.610,2.19,2.14,1.1,3.340,3.361;4.copy,1.1,3.560,3.380,3.400,2.19,2.14,1.1,3.550,3.380;4.copy,1.1,3.600,3.399,3.360,2.19,2.14,1.1,3.590,3.399;4.rect,1.1,3.164,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.214,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.264,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.520,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.141,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.110,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.183,3.231;4.blob,1.1,140.iVBORw0KGgoAAAANSUhEUgAAAAQAAAACBAMAAACNhmBQAAAAFVBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwm0JQtRAAAADklEQVQImWNgVGYwCQMAAVUAr710M0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.326;4.blob,1.1,1724.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACqVBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgsECwth7+8GEBAeSx4yfDIDBwdX19dY29s0gDQbQxsWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgQBBAECBQJMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR48kzwSLBIRKhEDCAM4ijgYOxgLGwsIEwgzfTMeSh4cRBw1gjUGDgY9lz0NIQ0sbiwkWSQWNRY5jjk7kTsTMBMmXiYpZinDt43uAAACH0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpEy2VmUlcnWqqKqRq1Vdg1ydmlra5GrV0dUjV6u+Abk6DY2MydVqYmpGrlZzCyyCHMRUBJaqVpiC1tI2toS12tljEXRwdLImrNXZhbCaUYAGXMnW6eZOrk4PTy8Iw9vHlzSdfv4BDDCtgaRpDQoOgbJCfcJQpcIjIvFqjYqGsWJiIXRcfAKEkZiUnJIKZqWlg0EGqtbMLHTDsnNy8/LBrILCouKSUiCjrBwMKlDUVVYFYTikuqa2rr4Bwm5sKm9mYGhpBYM2FGXtVR3YvNHZ1d0DpHr7+idMnITDwZOrpmBqnDpt+oyZsxhmz5k7b/4CBlwOXli1CF3j4iVLly1fAWSsXLV6DUQIq4PXrluPrnXDxk2bwYwtW7H5BQG2bUcX2bETj/Jdu8FAE8Te44/faDSwdx8Y7AexD6w7SIrWQ4fB4AiYc/TYcZLsRQIhJ06Sq5Xh1GmytQ4BoHfmLHYJIlo1BvrYxYlo1ZwzOo9NmJhWjeaFi9iEiWrVWJhjM5CoVs0l1cuYgkS2aq5cxRQjslVz7TqGELGtmhs3b6ELEd2quX0HXQRrqwYbuHtvF6oA1lYNVrD7/gMGlKIGa6sGO3j4iAGlqCG1VYNS1KABABiHoPUImFOEAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.312,3.402;4.blob,1.1,688.iVBORw0KGgoAAAANSUhEUgAAARIAAAAPCAMAAAAf1rDgAAAA81BMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAFGti2RAAAAzElEQVRYheWUxRICQQwFw+LusLi7u7s7//817A8Ms5fJhqJPqXp96FMAFHQS/At6g1GVJ+kEhxDCZFZjWaw20SF0sDucKiyXW3gIHTxeH1/yB4LiS+gQCvMdORIVH0IHORbnOokkQgghUmmekcnmEDoIkS/wjGKpjBFCh0q1xjHqDZQQTJrNbxe02t9WgI61KzBOE3r9wZB9AYzGE+Y6nc1hkcYqRWO5WvfYl/I9N1vmutsf4HhCSyXD+cKcrjfEjp/g/nhqnUCNw+sNH2gGFixy8xYKAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.421;4.blob,1.1,2888.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.478;4.blob,1.1,5076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492319506;4.copy,1.1,3.350,3.342,3.610,2.19,2.14,1.1,3.340,3.342;4.copy,1.1,3.360,3.361,3.600,2.19,2.14,1.1,3.350,3.361;4.copy,1.1,3.580,3.380,3.380,2.19,2.14,1.1,3.570,3.380;4.copy,1.1,3.620,3.399,3.340,2.19,2.14,1.1,3.610,3.399;4.rect,1.1,3.174,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.224,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.274,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.204,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.215,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.151,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.120,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.174;4.blob,1.1,3300.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.335;4.blob,1.1,1376.iVBORw0KGgoAAAANSUhEUgAAADgAAAA+CAMAAABJASgxAAAB4FBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/dDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0JBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBAHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8bCxtdJl2SO5KRO5FVIlUSBxIREQcsLBJeJl6GNoZEHEQIAwgEBAGWlj09PRkXCRcCAQJ3dzBZWSRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5ENTjwAAAB40lEQVRIiWNgIAQYGQkqwQqYmFlYydLIxs7BRJ6Vo2BQAE4uFC43Dy+RGrk4Ufl8/MTpExAUQhUQFhElSqOYOJqAhKQUMfokpGXQhWTliNEor8CNLqQoqESERn4+TDFlFcL6VEXUMAXVNQhr1NTSxhTU0dUjqFFOFpuovgEhfYaCRtiEjU1MCWg0M8cqbGFpRUCjtQ12cVs7AhpHHrAnU5+DI3n6nJxdIAxXN3dS9Hl4ejHANHqTotHH1w/K8ncLQJYIDArGqzEkFMYKC0eRiIiMio4Bs2LjwCAeVWNCIi4jk5JTUtPSgYyMTDDIQpHNzvHB45zcvMx8BoaCQjAoQpEqzinBqa20rLyisgqHU6tzanBoq62rb2hsYsDl1OacFhwaW9vaOyAsrE7t7OrGognUEunpxekHMOjrxxTD2RIxtQADCRB7giemPM6WyMRJYDAZxJ7SNRW/k5DBtOlgMAPMmTlrNvE6kYHfnLnkaWSYN59MjYMa4GxhoLVEMAGuFgZ6SwQD4GhhYLREMACOFgZGSwQTYG1hYGmJYACsLQwsLRFMgK2Fga0lggGwtDCwtkQwAJYWBtaWCCbAbGFgb4lgAIwWBo6WCAaAtDCQChEcLRFMAG5hIBUiuFoi2AFKIYICAJE5YPIepdLqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.322,3.402;4.blob,1.1,692.iVBORw0KGgoAAAANSUhEUgAAARwAAAAPCAMAAAABH4BTAAAA81BMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAFGti2RAAAAzklEQVRYheWURRaDQBAFO0SJuwtxJ+4uxO3+pwkXGIbNDJ2XWvV7vxa1agAVkwD/h9li1eUJJsYhKLHZ9VgO0ck6BCMut0eH5fUxD8GIPxCkS6FwhH0JRqIxuhNPJNmHYCSeSlOdTJZDCEpyEs3IF4ocOlBSKtOMSrXGIwQj9UaTYrTaXEKMQZa1Luh0tVaAnthnGGcwg+FoTL4AJtMZcZ0vlrCSeJUawHqzHZAv9d/u9sT1cFTgdOaWipDLlTjd7hw7fozH82V0Al6U9we+INYWLFZUXHoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.421;4.blob,1.1,2856.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.478;4.blob,1.1,3872.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.590;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAzFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR5IT15yAAAAnElEQVQYlb3PVxKCYAwE4J9YAQ2KqFjAClawF+zl/ndyM6NX8OV7yCS7E6U0IlKpdAZSNifmdQOSWRCLrKDFJUhlW6w4YtUUa3XoNpqwxW3o+R3Y7eG2P7BIDf0AmeFIWoh+jsXJFAazuSI38jCPdQ0ulrKzWsMNx3DLIdzxHh7YgMfkJDtnR7Qj8ZJcJfl2l3bt8ZT81/vb+McfP3GxD10yUWpQAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492319611;4.copy,1.1,1.0,3.285,3.960,2.57,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.310,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,1.0,3.361,3.290,2.38,2.14,1.1,1.0,3.342;4.copy,1.1,3.340,3.361,3.320,2.19,2.14,1.1,3.340,3.342;4.copy,1.1,3.290,3.380,2.10,2.19,2.14,1.1,3.290,3.361;4.copy,1.1,3.360,3.380,3.200,2.19,2.14,1.1,3.360,3.361;4.copy,1.1,3.570,3.380,2.80,2.19,2.14,1.1,3.570,3.361;4.copy,1.1,3.630,3.399,3.330,2.19,2.14,1.1,3.620,3.399;4.rect,1.1,3.184,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.234,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.284,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.204,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.215,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.520,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.535,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.557,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.161,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.130,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.204;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABwAAAAWCAMAAADkSAzAAAABAlBMVEUGBgIICAMDAwEAAADIyFH//2dgYCcoKBA0NBUTEwgIAwgHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwsLBJtbSwEAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbUCAgE3NxZ+fjOZmT54eDGqqqra2toEBARHR0f///9BQUEFBQJBQRqGhjaVlTxiYigiIg709PSEhITr6+uMjIxkZCmXlz1NTR8LCwUJCQlsbGzR0dGgoKAwMBODgzWRkTtZWSQcHAv19fWNjY0BAQAyMhR6ejF3dzCtra1ERERwcC2SkjspKSm3t7dfX1/t7e0bGws6OjrExMSXl5cODg5i8+TVAAAAsklEQVQokWNgYAQDJmYsgIGFFQzYsEqyc4ABJ1ZJbIJDV5KLC7ckNw8vH5jNLyAoJCwCkxEVA0mKS0hyg3hS0jKycvIKYBlFJWUVVWQ71dQ1mJk1tbSZmXV09fQNDFEcZGQMIk1MmZnNzC0sUV1rpWUNomxsmZnt7B0cnVC94gzR6QIkXN3cVTyUkL3iCbHTC6KU3dsH2Su+gn6a/gEycJMCkb3CHBQsaBISihZCOAFeSQAT1hcPu4OCDwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.326;4.blob,1.1,1476.iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAACZFBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgsECwth7+8GEBAeSx4yfDIDBwdX19dY29s0gDQbQxsWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgQBBAECBQJMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4Ti6DEAAABqElEQVRIiWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpEy2VmUlcnWqqKqRq1Vdg1ydmlra5GrV0dUjV6u+Abk6DY2MydVqYmpGrlZzCyyCHMRUBJaqVpiC1tI2toS12tljEXRwdLImrNXZhbCaUYAGXMnW6eZOrk4PTy8Iw9vHlzSdfv4BDDCtgaRpDQoOgbJCfcJQpcIjIvFqjYqGsWJiIXRcfAKEkZiUnJIKZqWlg0EGqtbMLHTDsnNy8/LBrILCouKSUiCjrBwMKlDUVVYFYTikuqa2rr4Bwm5sKm9mYGhpBYM2FGXtVR3YvNHZ1d0DpHr7+idMnITDwZOrpmBqnDpt+oyZsxhmz5k7b/4CBlwOXli1CF3j4iVLly1fAWSsXLV6DUQIq4PXrluPrnXDxk2bwYwtW7H5BQG2bUcX2bETj/Jdu8FAE8Te44/faDSwdx8Y7AexD6w7SIrWQ4fB4AiYc/TYcZLsRQIhJ06Sq5Xh1Gns4gAcRHN6Co+UMAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.652,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.381;4.blob,1.1,3104.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.421;4.blob,1.1,2832.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.478;4.blob,1.1,7496.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;3.end,1.1;4.sync,10.6492319716;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.320,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,1.0,3.361,3.300,2.38,2.14,1.1,1.0,3.342;4.copy,1.1,3.360,3.361,3.290,2.19,2.14,1.1,3.360,3.342;4.copy,1.1,3.300,3.380,2.10,2.19,2.14,1.1,3.300,3.361;4.copy,1.1,3.370,3.380,3.200,2.19,2.14,1.1,3.370,3.361;4.copy,1.1,3.580,3.380,2.60,2.19,2.14,1.1,3.580,3.361;4.copy,1.1,3.650,3.399,3.310,2.19,2.14,1.1,3.640,3.399;4.rect,1.1,3.194,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.244,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.294,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.497,2.18,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.171,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.140,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.174;4.blob,1.1,2260.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABbCAMAAABeSXdNAAACwVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg53dzDU1FYyMhT9/WYbGwu8vEwSLCwsbW3p6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwv392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0sLBILGxt9fTLOzlPW1lZwcC35+WUsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS44OBeSkjtlZSliYiiUlDwpKRE8PBiJiTd0dC9TUyIUFAgaGguAgDRDQxt6bp5UAAADmElEQVRoge2aZVcVQRiA10YFu7sDA1RQ7ALFViwUFBMLULGwQcXuAlsRsbsV7G4wsbt+hcC6d5Z7353Z9+4uc89hnw/sc87OLO/hcOY8H0YQdCFHzlz6fMgYcufhPQGNvPmcLO7kRFnIhfwFCkrq7FKoMM9RIIoUlaxY8RLOPCeBKFmqNO8RaJQpy3sCGuXK856ARoWKlXiPQKNylf9CThQHOluqulTLeJITxZHOluo1amY8yYniUGdLrdq8JzAxMeFMnbquun6PNDxkaOrV1z6SHNLwkGFp0NDN4m5ulIUM3N3FJ2l4yLA0atxEUg/Pps3sHc6reYuWGUIaHjI0rVpL1qZtOw97v9K+Q0cv0UjDQ4bF26eTvVtBSMNDhqazr/aR5JCGhwxLl65a58kMaXjIsHTr3kPrQJkgDQ8Zmp69tI8kx9LwoGHp7dlHFL++/ayEQf8BAwGVGh4ysky2gYr/oMGiBPgEWgmDIUODAJUaHjKyTLaBzrDh4nPESMFKGIwaDams4W2MLJNvUEPwmLFWwmDc+AmAqtuhcgMhMCTUShgEhU0EVN0OlRtMTBwDUvOQcYfUPGS8ITUPGal0/U0NpOYhI5Wut02aHD5l6jTmeKTmISOVrq9NnxExc9bsOczpSM1DZhRz580XhMioBcyFpOYhM4iFi9J/Ri9mLiQ1D5kxLIlamv5Ytpy5ktQ8ZAaxQvzbrWSvJDUPGYAOJ8oq8f9uNXs6S81DBuS3HifKmvC1kevWR7CHIzUPGZDfupwtGzaGR2/arGI6S81DZn9+ZwEa8jsLMPPbJJsSE0sz3sTG0IwzW7ZuUzbjyl1lwwdsVzbDyl1maezYqTRc4K7dymZUucttT9ze+H1K0yXs96CY4Rw4eOjwkaOKr48dp5nhnDh56rTy2+AzZylmPOfOX7h4SfHt5cQkimUBV65ei78ep/Dyxk2ageh+oty6fQf+TXd97lHMsHK3OlGE+/B0Dx7SzLhylxmFR49pZpa7BsxyN8lW2LS565MQm0VPn4XZWBrJKShT+AoN2zZ/nvjCZtXLV69tTBBSknEGf4WCpc3tuDfzJvUt0rBIbW7PvZl377GGxNLmdtybSfL7gDQsWtrc+2MbpGHR0uafPmMNiZY29//yFWlYtLT5t++hSMPCaHMqP35iDYm8zdVel5H4lfobaVjkba72uoxEgi/WsMjbXO11GYk/f7GmAbXXZfig9rqMwfwD2g/LWc7+TUQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.335;4.blob,1.1,1436.iVBORw0KGgoAAAANSUhEUgAAADoAAAAtCAMAAADItog5AAACTFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4VyGZQAAABo0lEQVRIiWNgIAQYGQkqwQGYmFlYydTKxs7BRK61o2AQAk4uFC43Dy/RWrk4Ufl8/MTqFBAUQhUQFhElUquYOJqAhKQUcTolpGXQhWTliNMqr8CNLqQoqESUVn4+TDFlFWJ0qoqoYQqqaxCjVVNLG1NQR1ePCK1ysthE9Q0I6zQUNMImbGxiSlCrmTlWYQtLK4JarW2wi9vaEdQ6coE92TodHMnV6eTsAmG4urmTptPD04sBptWbNK0+vn5Qlr9bAKpUYFAwXq0hoTBWWDiEjoiMgjCiY2Lj4sGshEQwSELVmpyCblhqWnpGJpiVlZ2Tm5cPZBQUgkERirriEh8Mh5SWlVdUVkHY1TWFtQwMdfVg0ICirLGkCZs3mlta24BUe0dnV3cPDgf3lvRhauyfMHHS5CkMU6dNnzFzFgMuB88umYOuce68+QsWLgIyFi9ZugwihNXBy1esRNe6avWatWDGuvXY/IIAGzaii2zajEe5qQUYSIDYWzzxG40Gtm4Dg+0g9o4VO0nRums3GOwBc/bu20+SvUjA78BBcrUyHDqMXRwAPr9phsH3W8wAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.642,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.381;4.blob,1.1,3076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.421;4.blob,1.1,2744.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.478;4.blob,1.1,3020.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.552;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAABnklEQVRoge2Y2TpDQRAGByErYsQWJMQWa4h9ifX938kxh7hgelx05cLX/QA1d1Nf/c4BN0ZAv298AsUXJqdIfLFUJvGuUq2h/OkZFO9m6yh+zldQ/rxvoPwFv4jyl/wyyl9prqJ8t7bO8lsllt9ubrAPbHa2UH5tewflu909lj+i67L/tNs/OGQfODpm+SdV9ityvVOWf+a7KL/vz1G+u2ix/Ev4r77qsfzrGxRfvL1D+ff+AeWXB6xpHp9Q/PNLn8S/Dgok3jXeUPyP0/PZ7/2o5rNYPyr5LNqPOj4T+lHFZ0I/qvhM6EcVn0n9qOAzsR8VfCb2o4LPxH5U8JnUjxo+k/pRxWdCP6r4TOhHFZ/F+1HJZ7F+1PJZrB/VfDbyfmT20KFvoT30y7fYHpr7lttDc9+Ce2jwLbiHBt+Ce+iHb9E9NPMtuodmvkX30My36B6a+ZbcQ4NvwT00+BbcQ4NvwT009y22h376ltpDh76FfGb9GDnrR+msH8WzfpTP+jFx1o+Js37821k/Js76MXHWj4mzfhTP+lG8/9CP7x1sNxohW/BrAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.590;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAAy0lEQVQ4je3Sxw7CMAyA4bBpoWWFXaBsKHtvynz/VwLVNmAkLpzrQ/V/UlIpUYR4jkew8foY/YEgVij8/ChqRHw6qunMsbhgTiSZUzLKnJYZ5qzMMedlgblolPj/yxVuU+WuGjVmUW80mfVWm1l0uuL3WDqvXn+AxhqOaAHUWKMDYE2mtABqJi001Fwu0FhLkzZArV4nhlpPyFCbLdkpZbdHQh3kEQ0Vsek+oE5n2u7U5TpHOnWz/UiozJ1Wv+t73Pf1afd90fY/3tcDF74o4+DQlAIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492319820;4.copy,1.1,1.0,3.285,3.960,2.57,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.330,2.19,2.14,1.1,1.0,3.323;4.rect,1.1,3.204,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.254,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.304,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.421,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.520,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.535,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.181,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.150,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.402;4.blob,1.1,696.iVBORw0KGgoAAAANSUhEUgAAATMAAAAPCAMAAAC/SdgOAAAA81BMVEUAAABHHR1/NDQMBQX1Y2NKHh6kQkKoREQeDAyYPj4QBwdGHBz2Y2MOBgZWIyNxLi4DAQHmXV1jKCgCAQGMOTk4FxeLODjBTk4tEhKSOzsHAwP+Z2cfDQ1lKSliKCjQVFR8MjIJBASUPDwpERFyLi7ZWFg8GBiJNzcBAAAYCgr8ZmY3FhZ0Ly9TIiIDAwi3SkqVPDwUCAgaCwsDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4CAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucPz+qRUUqKmc1NYIEBAk7O5IbG0IUFDIAAAFGti2RAAAA0klEQVRYhe2UxRLCUAwAX/HiTnF3p7i72/9/DS33V94lpWHYSzKTPewphEhwOvJHRm8wsqo6DjIEEyYzo2jhraAhiLDZHWyi0wUbggi3x8vk+fwB4BJEBENMmhCOAIcgQojGWLR4AjoEE8kUg5TOZKE7MJHLM0iFYgk8BBHlSvWzVKvDh2iKRkNpI82W0vVNm+9AxWkTsdvr0zdCBsMR9TqeTOUxS6mTqhnmi6VI36T/vlpTr5vtTh77g0qtaDieqKfzRcWO3+B6u387AR27x1MeL+gfFixYhKvoAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.421;4.blob,1.1,2368.iVBORw0KGgoAAAANSUhEUgAAAIoAAABGCAMAAAAkc/yZAAAC8VBMVEUHAweTPJMsEiwAAAAdHUc0NH8ICBM+PpkHBxADAwc8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwgCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi07O5ILCxt9M31KHkozM30eHkpEHESCNYIEBAkRESkcHEQ1NYIOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjU5OY4BAQQFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWYWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0MWCRYDAQMBAAGMjDlHRx0tLW9jY/ZjY/UPDyQJBAk/Gj96MXpqK2olDyWZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxwrEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUg8GDx4MXgQBxAcHAslJQ8FBQwoKGRRUchlZftERKhdJl2SO5JVIlUSBxIREQcsLBI/P5tiYvNhYfE5OY2GNoYEBAGWlj09PRk/P5xaWuAuLnIXCRd3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8dR0c0f38eDB4MHh4+mJgHEBBWI1ZxLnEjVlYucXGMOYw4FzgBAgI5jIwXODgtEi0SLS07kpIDBwcpZWUoYmIpESkECQk8lJQRKSmJN4kYPDw3iYkAAQEvdHQiU1MaCxoIFBQLGhpLHkt8MnweS0syfHyANIA0gIAbQ0M9PZUUFDIODiIaGkETEy8sLGsODiM2NoUbG0IlJVzatnVeAAADuklEQVRoge2ZZVRUQRiGF4cQAUEEdMUWFFgBAxMDBVtBUVFsQVHETmzFQNcWW0TFwEaxuwnF7u5uxfzlFhtTe+6ww9nD4f1z57x3vm+fs3dhv31HJDIpAPTI1ExxMbcoqG+nAFkWsoIcEbC20VdlZqpCKWxAFGBrh6AUsS9Kr3FwVL4bThbFDIlSXFwCRnEuWYpeU7qM8lpWbEgSUK58BRgFuLjSSypWMiiCWm7uCIqHpDKtwtPLkg+Kt6M5jAKqVKVV2NnyIQGgWnUExacGZX9NcS1eKLXrICh1feuR99dv0JAXil+jxjAK8A8g73d340UCQJOmCEqz5i1Iu50cW/JDadW6DYwSGNSWtLtdMD8S0L5DRxgFhHQi7e4cyhEFdOmKoBiF8lFwyvMo3ViKuKB078FSxQOlZ6/e5Jth4X1yD6VvRD/K3bDw/rmHEjkginJ3YPgg/SiDhww1CMqw4bS7I0bCzqjRY2CUaHuTgLGK1bhAhcazoUyYKGz/pMlTxFN1UUDMtOmSGTNlC+tYhWYxkcyWRgqsmDN33vwFC+HPyiL/2MUAxC1RaCkTyjLpcuFFK1auWq2DIopf42uTkMMHtFa6TmjJ+sQNGzd5a6F4bE4K2rJVvsrRA9om3S6swHPHzl3JDjqflZDdPqrfiTl6QHtS9gor2Lf/gJ/8qoVy0JnppREdOixs/5GjyiuHf3HHItjqOKAcTznBVMfj6/DkqdMsZTxQos6cZSnjMq+cO89SlecHSiYZHUpqGuE2miMyKz0D9VTZpzZKWiqpAZIjMisjHfVU2acWygVJAqkBkiOy6mLmJcTLzj61UC5fIXZAckRWXb2GetnZpwbF+foNcgs4R2TUzVu3EQ/KPuUod5Iof0dwjsiou/fuIx6UfcohbKxpTaAckVEPHqIelH3KUGLsH9GaQDkimx4/eYp4cPYpQ4l/Rh1ioRyRTc9fvEQ8OPuUobi60Nvo5ohsevUa9eDsUwTiJG/obXRzRCa9zXyHeEj2KQLvP+jpo5sjMunjJ9RDsk8R+Bytr5FOjsikL19RD8k+je6b2SiUj4JTPgpOAlCsvn1XLn54gSzVpKE+Bsd5cqnGSI1HPjgX8q78bOCnfNlkkPUru7HqGBznyaUaIzUe+eCc5QH9/gP+JiqX6mNwnAc0Y6TGIx+cM6EEg9B/yqX6GBznAc0YqfHIB+d8P7a4MZIovii4MZIovii4MZIorii4MZIsrii4MZIsrii4MZIsnii4MZIinii4MZIinii4MZKi/wHqRL8TXnEXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.478;4.blob,1.1,1012.iVBORw0KGgoAAAANSUhEUgAAAEMAAAAgCAMAAAB+dDW1AAABfVBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYHBwOTkzwsLBIDBwc8k5MSLCwdR0c0f39iYihlZSkoYmIpZWUqKhGUlDwICAMRKio8lJQDCAgMHh4+mJgHEBACAgGKijg7OxgBAgI4iooYOzsjVlYucXFTUyJ0dC8iU1MvdHQ5jIwXODgbGwuYmD4TEwgLGxsIExMSLS07kpIAAQECBQUBAwN9fTNKSh4zfX0eSkoSLi4+mZkrampERByCgjUcREQ1goIECQkRKSkNHx8JFRUODgaXlz0hIQ0GDg49l5cNISEYPDw3iYlubixZWSQsbm4kWVk1NRaOjjkEBAEWNTU5jo4BBAQIFBQLGhoFBQKRkTswMBM7kZETMDAeS0syfHxeXiZmZikmXl4pZmY0gIAbQ0NlCmKFAAABM0lEQVRIiWNgIBkwMjGTrgkdsLBSbgYbOwfFZnBycVPuEB5eys3g4xeg3BBBIcrNEBah3AxRMXHKDZGQpNwMKWkZis2QlZOn3CEKipSbMQpoDJSUVaAsVTV17Eo0NHHohevQ0oYJ6ehiV6qpgcsBMB16+gZQEUMjY2wKTUzNcJkB02FuYQkVsbK2wabQ1g6XEQgd9g4wIUcnbOqcXXCaAdfh6uYOFfEw9cRU5uWtCqJ8fEHAD4WFpMM/AKY+MAjTDF0dMBUcAgKhKCwkHWHhMPURkRhGRBlFQ+gYEIhFYSHpiItPgGpITEpGNyMl1QfTbQgA15GWDhPKyERX5OSIzwiEjqzsHKhIbl4+qpIC00L8ZsB0FBWXQEV8S8tQlZRX4DcCoaOyCiZUXYOqpLaOgBlAHQC0jDdazm7qkAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.513;4.blob,1.1,5668.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAq0lEQVQ4je3RVw6CQBSF4QErooNiL2AFK9gL9rL/Pflm/E1IXADn7bt3MpmcEeITRRVILJ7gIJmi01qGAz1L56QCGzLPAwWTLpbosk5XqmCt3oCbsgVbdhvudMFe3/jmwHawdociJCNyPAGd6QyP9CysfY09zxe8bbkC19KHN9KFt3IH7yU/5RAcef/pp2PTo8/BhYPrjS2q9wcPPF/i30TNISHNRS0h3y29AXKIGegUBPVDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492319919;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.340,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,1.0,3.361,3.320,2.38,2.14,1.1,1.0,3.342;4.copy,1.1,3.380,3.361,3.260,2.19,2.14,1.1,3.380,3.342;4.copy,1.1,3.320,3.380,2.10,2.19,2.14,1.1,3.320,3.361;4.copy,1.1,3.390,3.380,3.220,2.19,2.14,1.1,3.390,3.361;4.rect,1.1,3.214,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.264,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.314,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.519,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.546,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.191,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.160,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.323,3.259;4.blob,1.1,1704.iVBORw0KGgoAAAANSUhEUgAAAEIAAAB5CAMAAAC6Nwe0AAACqVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sFDAxj9fUeSkpCpKREqKgcRkZj9vYBAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVkCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4zhv5JAAACEElEQVRYhWNgYGRkoBAwMbOwUmgEGzsHE6XOGAWjYBSMglEwCkbBKBgFJIDRVuAoGAWjYBSMglEweAEnFzfFZvDwUmwEHz/F7QUBQSGKnSEsQrERomLiFJshIUmxEVLSFBshIytHsRnyChQbocisRKkRyiqqFDtDTZ1iI0bB4AAamihcLW0dko3Q1EDl6+qRaoK+gSGqgJGxCYlGmJqhCZhbWJJmgrmVNbqQjS1pRtjZa6ELORg4kmSEni6mmJMzKSa4GLtiCrq5k2KEh6cXpqC3jy8JRtjaYBP18yfehACDQGzCQcEhRBsRGoZVODwikmgjoqKxi8fEEm3EKMAF4ig2IT6BUhMSk5IhjJTUNPJMSM/IZIAZkUWeEdk5uVBWXmo+diUFhUV4jSgugbFKyyB0eUUlqpKq6praOjCrvgEMGlHlm5rRDW1pbWvvQBHp7Oru6e0DMvongMFEFNlJk7MxHDZl6rTpM2aiis2aPWEOA8PceWAwH0VqweSFmJ5jYFi0eMlSJO6y5StWrlqNwyNrJq/FNGDd+g0bN22Gc7ds3bZ9x04GXB7ZNXk3ugF79u7bf+AgksChw0eOQlhYPXLs+Al0I06eOn0GReDsOUyHIoPzF9BFLl7CrwMMQsLBwBzEvpxBhAZMcOUqGFwDsa8fv0GOETdvgcFtMOfO3XtkuQMJ5N5/QKkRDA8fYRcHAEczjM/mx2NTAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.632,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.381;4.blob,1.1,2456.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.421;4.blob,1.1,2368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.478;4.blob,1.1,3104.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,824.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAABDlBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgFDAVj9WMeSh4BAgE1gzUbQxtCpEJEqEQUMRQ8kzwDBwNj9mMGDgYqZyoraisBAwFd5l0oYyg5jDkdRx04izhOwU4FCwU+mT4SLRJn/mcNHw0JFwkQKBBU0FQyfDILHAsPJQ8uci5Y2VgHEQcSLBIKGApm/GYWNxYBBAE9lj0ZPRlKt0o8lTwwdzAkWSRf7F8fTB8ECQRi8mIGEAYOIw4/nD8iVSIucy4AAQAyezIgUCAeSR4UMhQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQouldOoAAABFklEQVQ4je2SazcCQQCGX0RU1Fr3mJCEXEKrXEMRKUJu//+P2FmzM/M6xzl986XnnN05z+x15jyAzwCIwSHSyPCIHKKjY4HG4omf+fGJYEimHPXYpCuHqWn13MzsnBzmF8IXpRf905JIhp5ZXgFWRVZ/aS0HrIu89o1NYEsUtG/v7GKvuG9+7eAQKHnGvSOgHDdeOQZOiqdm4sw/zi+qtD7n8orXH71GL7gOey1X4Yn6DfttqsATjTv2e+GSN8UD35Aus7c89naD/fGJNNZ5Jn8Rr+SJLu/M2zvpx2fT1q9uhC5nM/iDnvrSPxn2pdB9KXRfCtNXgNVXgN2XxO5LYvclob4kpV97bPclob4k/b5C+n39e1/f0NEpf8uKyEUAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492320024;4.copy,1.1,3.400,3.361,3.560,2.19,2.14,1.1,3.390,3.361;4.rect,1.1,3.224,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.274,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.324,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.386,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.201,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.170,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.174;4.blob,1.1,2408.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABbCAMAAABeSXdNAAAC+lBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAG2tko3NzfBwcH39/fp6emTk5MMDAxbWyXS0lXIyFEnJyf29va4uLhISEhiYmLu7u61tbVsbCzf31r4+GSjo0I5OReqqqra2toEBARHR0f///9BQUGnp0P7+2WBgTQTEwj09PSEhITr6+uMjIza2ljx8WEuLhMJCQlsbGzR0dGgoKACAgHLy1LGxlBcXCX19fWNjY1DQxu7u0ytra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg53dzDU1FYyMhT9/WYbGwu8vEwSLCwsbW3p6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMCBQUaQUE2hoY8lZUoYmIOIiKpqUQpZGQ9l5cfTU0FCwv392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0sLBILGxt9fTLOzlPW1lZwcC35+WUsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS44OBeSkjtlZSliYiiUlDwpKRE8PBiJiTd0dC9TUyIUFAgaGguAgDQNv1zsAAADz0lEQVRoge2aZVAVURhAn40KdncHBqig2AW2omAgoJhggIUtNgbYHVjYBbYiYneL3S0mdseMwLJ7l/e+vW+/t7ssM+z58fa8uXv3fcMwd86P1elkIUXKVPI8SBlSp1F7Ahpp05lxbmZGuVEV0mfIyKq5RabMao4CkSUra9my5zBXcxKInLlyqz0CjTx51Z6ARr78ak9Ao0DBQmqPQKNwkXghJ0oSOluKWhSLu5ITJSmdLcVLlIy7khMlSZ0tpUqrPYGGhobKlClrKevzSMNDhqZceekj8SENDxmWChWtOLeyotxoBGtr5koaHjIslSpXYdXGtmo1U4ezq16jZpyQhocMTa3arNWpW8/G1KfUb9DQjjHS8JBhsXdoZOpWENLwkKFp3ET6SHxIw0OGpWkzqfMkhDQ8ZFiat2gpdaAEkIaHDE0rR+kj8eEaHjQsrW3bMOLk3FZPjNCufQdA2YaHjNzG20DFpaMrI24O7npihE6dPQBlGx4ychtvA50uXZlrt+46PTFCj56Q8hrewMht/A1i8PTqpSdG6N2nL6DidojcQHD39tETI3j06w+ouB0iN2hoJA1IzUOmOqTmIVMbUvOQkUqX3+hYDoj9JDUPGal0uW3gIN/BQ4YKjOY+bLjziDgjNQ8ZqXR5beQov9Fjxo4DZ3MZP2Gi/yTGSc1DphSTp0zV6QICp0Fr02fMnMV9ITUPmULMnhP7OXcetOY6f4HjQvYLqXnIlGFR4OLYy5Kl4GqQ9zLn5SsYJzUPmUKsZP52q4TWg1d7xRupecgAZDhR1jD/d2uFf8Q+/srVPGRAfstxoqzzXR+wYaOf8HAcXM1DBuS3LGfLps2+c7dsFTEdV/OQmZ7fiYCE/E4EtPzWSKaEhNJMbUJDaKYy27bvEDblyl1kw7vtFDbFyp1nMezaLTSc+569wqZUufNtX9j+8ANC00UctKGY4hw6fOToseOCyyf8aaY4J0+dPiO86nn2HMWU5/yFi5cuC65eiQyiWCJw9dr18BthAos3b9EMRPYT5fadu/Av3XO4TzHFyl3vRNE9gKd7+IhmypU7zyg8fkIzrdwloJW7RrLCoM0tn3ob3PTseT8Di+FFFMoEnkLDsM1fRr4yuOv1m7cGptNFvcAZ/BQKXJub8N7Mu+j3SMPCtrkp7818+Ig1JFybm/DeTJDTJ6RhkdLm9p/rIA2LlDb/8hVrSKS0ucu370jDIqXNf/z0QRoWI21O5ddvrCHht7nY12VY/kT/RRoWfpuLfV2GJaIJ1rDw21zs6zIs/4KxJgGxr8uog9jXZRTmP2WV79BRaCiVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.323,3.240;4.blob,1.1,164.iVBORw0KGgoAAAANSUhEUgAAABgAAAApBAMAAADdf/TDAAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAG0lEQVQokWNgFGBAAGVXJE56E8MoGLYAX7wDAM0BAsUzV0M4AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.345;4.blob,1.1,2576.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.421;4.blob,1.1,2368.iVBORw0KGgoAAAANSUhEUgAAAIoAAABGCAMAAAAkc/yZAAAC8VBMVEUHAweTPJMsEiwAAAAdHUc0NH8ICBM+PpkHBxADAwc8PJMSEixiKGJlKWUFBQsoKGIpKWUqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwgCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDtTIlN0L3Q5OYwXFzgiIlMvL3QbCxuYPpgTCBMSEi07O5ILCxt9M31KHkozM30eHkpEHESCNYIEBAkRESkcHEQ1NYIOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSFuLG5ZJFksLG4kJFk1FjWOOY4EAQQLCxoWFjU5OY4BAQQFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzBeJl5mKWY0NIAbG0MmJl4pKWYWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0MWCRYDAQMBAAGMjDlHRx0tLW9jY/ZjY/UPDyQJBAk/Gj96MXpqK2olDyWZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxwrEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUg8GDx4MXgQBxAcHAslJQ8FBQwoKGRRUchlZftERKhdJl2SO5JVIlUSBxIREQcsLBI/P5tiYvNhYfE5OY2GNoYEBAGWlj09PRk/P5xaWuAuLnIXCRd3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8dR0c0f38eDB4MHh4+mJgHEBBWI1ZxLnEjVlYucXGMOYw4FzgBAgI5jIwXODgtEi0SLS07kpIDBwcpZWUoYmIpESkECQk8lJQRKSmJN4kYPDw3iYkAAQEvdHQiU1MaCxoIFBQLGhpLHkt8MnweS0syfHyANIA0gIAbQ0M9PZUUFDIODiIaGkETEy8sLGsODiM2NoUbG0IlJVzatnVeAAADuklEQVRoge2ZZVRUQRiGF4cQAUEEdMUWFFgBAxMDBVtBUVFsQVHETmzFQNcWW0TFwEaxuwnF7u5uxfzlFhtTe+6ww9nD4f1z57x3vm+fs3dhv31HJDIpAPTI1ExxMbcoqG+nAFkWsoIcEbC20VdlZqpCKWxAFGBrh6AUsS9Kr3FwVL4bThbFDIlSXFwCRnEuWYpeU7qM8lpWbEgSUK58BRgFuLjSSypWMiiCWm7uCIqHpDKtwtPLkg+Kt6M5jAKqVKVV2NnyIQGgWnUExacGZX9NcS1eKLXrICh1feuR99dv0JAXil+jxjAK8A8g73d340UCQJOmCEqz5i1Iu50cW/JDadW6DYwSGNSWtLtdMD8S0L5DRxgFhHQi7e4cyhEFdOmKoBiF8lFwyvMo3ViKuKB078FSxQOlZ6/e5Jth4X1yD6VvRD/K3bDw/rmHEjkginJ3YPgg/SiDhww1CMqw4bS7I0bCzqjRY2CUaHuTgLGK1bhAhcazoUyYKGz/pMlTxFN1UUDMtOmSGTNlC+tYhWYxkcyWRgqsmDN33vwFC+HPyiL/2MUAxC1RaCkTyjLpcuFFK1auWq2DIopf42uTkMMHtFa6TmjJ+sQNGzd5a6F4bE4K2rJVvsrRA9om3S6swHPHzl3JDjqflZDdPqrfiTl6QHtS9gor2Lf/gJ/8qoVy0JnppREdOixs/5GjyiuHf3HHItjqOKAcTznBVMfj6/DkqdMsZTxQos6cZSnjMq+cO89SlecHSiYZHUpqGuE2miMyKz0D9VTZpzZKWiqpAZIjMisjHfVU2acWygVJAqkBkiOy6mLmJcTLzj61UC5fIXZAckRWXb2GetnZpwbF+foNcgs4R2TUzVu3EQ/KPuUod5Iof0dwjsiou/fuIx6UfcohbKxpTaAckVEPHqIelH3KUGLsH9GaQDkimx4/eYp4cPYpQ4l/Rh1ioRyRTc9fvEQ8OPuUobi60Nvo5ohsevUa9eDsUwTiJG/obXRzRCa9zXyHeEj2KQLvP+jpo5sjMunjJ9RDsk8R+Bytr5FOjsikL19RD8k+je6b2SiUj4JTPgpOAlCsvn1XLn54gSzVpKE+Bsd5cqnGSI1HPjgX8q78bOCnfNlkkPUru7HqGBznyaUaIzUe+eCc5QH9/gP+JiqX6mNwnAc0Y6TGIx+cM6EEg9B/yqX6GBznAc0YqfHIB+d8P7a4MZIovii4MZIovii4MZIorii4MZIsrii4MZIsrii4MZIsnii4MZIinii4MZIinii4MZKi/wHqRL8TXnEXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.478;4.blob,1.1,796.iVBORw0KGgoAAAANSUhEUgAAADoAAAAhCAMAAAC/dEhCAAABGlBMVEUAAAADAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYDBwc8k5MSLCwdR0c0f38oYmIpZWURKio8lJQDCAgMHh4+mJgHEBABAgI4iooYOzsjVlYucXEiU1MvdHQ5jIwXODgLGxsIExMSLS07kpIAAQECBQUBAwMzfX0eSkoSLi4+mZkramocREQ1goIECQkRKSkNHx8JFRUGDg49l5cNISEYPDw3iYksbm4kWVkWNTU5jo4BBAQIFBQLGho7kZETMDAeS0syfHwmXl4pZmY0gIAbQ0PhWAy/AAAA9UlEQVQ4jWNgIBIwMjETqxQDsLCSrZWNnYNcrZxc3GRby8NLtlY+fgGy9QoKka1VWIRsraJi4mTrlZAkW6uUtAy5WmXl5Mm2VkGRbK2jgAygpKyCXUJVjaAOdQ3sKtRUcdkG16GppY1NXkdXD5dWuA59A0Ns8kbGuHQi6TAxxSZtZo5TK0KHha4lpqyVtRKIsrEFATsUFrIOewdMrRrqYMrRCQScUVjIOlxcMXS6ablDaA8Q8ERhIevw8vZB1+rrZ4PTpyg6/APQ5UxN8OlE0hEYFIwqE6Ibil8rXIdtWDiqTEQkfp1IOqKiUWViYgloxdBBGgAAfSckIeEDJY4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.513;4.blob,1.1,6016.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492320130;4.copy,1.1,3.400,3.342,3.560,2.19,2.14,1.1,3.390,3.342;4.copy,1.1,3.410,3.361,3.550,2.19,2.14,1.1,3.400,3.361;4.rect,1.1,3.234,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.284,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.334,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.381,2.16,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.386,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.520,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.211,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.180,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.212;4.blob,1.1,1192.iVBORw0KGgoAAAANSUhEUgAAASgAAAAVCAMAAADCSoPsAAABtlBMVEUAAAAgICD///8bGxsMDAX19WNKSh4TExOkpEKoqEQiIiIFBQVGRhz29mMODgYIAwi2tkojIyP39/cDAwHm5l1jYygHAweOOY6POo8KBAo3NzfBwcHp6emTk5MMDAwEBAJbWyXS0lX//2fIyFGLizjBwU4EAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbUJCQRsbCzf31r4+GSjo0I5ORctLRL+/mcfHw2qqqra2toEBARHR0dBQUGnp0P7+2WBgTQTEwjQ0FR8fDL09PSEhITr6+uMjIxQUCDa2ljx8WGVlTwuLhNyci7Z2VgJCQlsbGzR0dGgoKACAgFUVCLLy1LGxlBcXCUYGAr8/GY3Nxb19fWNjY1DQxu7u0zz82K3t0qtra1EREQGDg5ZWSTs7F8GBgJUIlSZPpkFAgUpKSm3t7dfX1/t7e0ECwtf7Oxh7+8GEBAICAPy8mJWI1aYPpgCAQI6OjrExMSXl5cODg4DBwdX19dY29tgYCecnD+qqkVnKmeCNYIoKBA0NBUJBAmSO5JCG0IyFDIBAAEeSh5l+WUiVCJ3dzDU1FYgTyBc5FwJFwnOTJZ8AAABgklEQVRYhWNgQAKMTMwMqICFlQ0Pa8QCRiZ2dCEOTnyskQq4mLjRhXh4+fCwGBj4+WnFGpSATQBMCQphyAiLiOJhMYiJS0jShCUlLSQjK0eRp6gO5BUUlZRxyqqo4mOpqWuI0YKlqaWto6unT6aPaAIMDI2MTUxxy5uZW+Bh0QpYWlkzMNgw2dLYGlKAnb2DI14FTs74WDQCLq4g0s2dxtaQAjw8vbx98Cnw9cPHog3wZwoAUYFBtLWGNBAcEqoUFo5bPiIyCg+LRiAakqJiaGsLySA2Lh6PbII3PhYWQIXmQSKkjErC62z6geRkGMsMj6qU1DTcrPSMTAY0FjWaB1lC2TY5udqke4kmIC+/oBCrRFoRGAhDeAbFHgw4WSWlZQxoLKo0FMorhNwqq8j2GnVBdU1tHlYJZSUwqINy6xsYcLIam2AiCNbIAc0tYIC/2QAGrW3tGKxRgAWUdXRisEbBKBgFo2AUDCjo6u7BJtzbh481IkH/hIlYRPt68bFGCAAApvZe6+pb8N8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.259;4.blob,1.1,1832.iVBORw0KGgoAAAANSUhEUgAAADoAAACKCAMAAADMr6lvAAACqVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sFDAxj9fUeSkpCpKREqKgcRkZj9vYBAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVkCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4zhv5JAAACb0lEQVRYhWNgYGBgZGQgEzAxs7CSqZWNnYOJXGtHwSgYBaNgFIyCUTAKRsEoGAWjYBSMgiEOOLm4ydbLw0u2Vj5+sscABASFyLZWWIRsraJi4mTrlZAkW6uUNNlaZWTlyNYrr0C2VkVmJXK1Kquokm2tmjrZWkcBbYCGJgpXS1uHaK2aGqh8XT1ideobGKIKGBmbEKnV1AxNwNzCkjid5lbW6EI2tsRptbPXQhdyMHAkSqueLqaYkzMxOl2MXTEF3dyJ0erh6YUp6O3jS4RWWxtson7+hHUGGARiEw4KDiGoNTQMq3B4RCRBrVHR2MVjYglqHbkgjmyd8Qnk6kxMSoYwUlLTSNOZnpHJANOaRZrW7JxcKCsvNR9VqqCwCK/W4hIYq7QMQpdXVEIYVdU1tXVgVn0DGDSiam1qRjespbWtvQPM6uzq7untAzL6J4DBRBR1kyZnYzhkytRp02fMhLBnzZ4wh4Fh7jwwmI+ibMHkhdi8sWjxkqVAatnyFStXrcbh4DWT12JqXLd+w8ZNmxm2bN22fcdOBlwO3jV5N7rGPXv37T9wEMg4dPjIUYgQVgcfO34CXevJU6fPgBlnz2HzCwKcv4AucvESHuUh4WBgDmJfzsBvNBq4chUMroHY14/fIEXrzVtgcBvMuXP3Hkn2IoHc+w/I1crw8BHZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClq0AAAbNKs1QwaWUkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.381;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAAEQAAAASCAMAAADVGohqAAABZVBMVEUAAAAKGAoECwQiVCJUz1QGDwZBokFHr0cMBQX1Y2NKHh4IFQhj9WMdSR2kQkKoREQ/nD9MvUxGHBz2Y2MOBgYSLBIsbSwdSB1n/2cJFwkDAQHmXV1jKCgBAgEWNxYzfjM+mT4xeDEGDgYjViMDAwEFBQIBAQCLODjBTk4CBQIaQRo2hjY8lTwoYigOIg5e6F4zfzNiYiiZmT4yMhQtEhL+Z2cfDQ0pZCk9lz0fTR8FCwVX11cUFAgfHw0KCgTQVFR8MjITMBM1gzU7kTskWSQLHAtV01U/nT9yLi7ZWFgAAQAUMhQxejEwdzBa3lo3iDcYCgr8ZmY3FhYQKBAtcC07kjsGDg4BAwFl+WUsbCy3SkqVPDwLGwsECwtf7Oxh7+8GEBAUMRRZJCTsX18GAgIDBwdX19dY29stby1d5l0JBATyYmJQICBSzFIyfTKcPz+qRUUgUCBc5VwRKREcRRwbQhseSx7MUPmCAAABAElEQVQ4jWNgwAYYmbAKkwaYWVipYAobOzGqODi58Elz8/ASYwofP15pAUFiDBESFkFwRMXQpcUlJIkwREpaBsqSlZNXUESXVpJQxqVTRRUM1EBsdQ2wkKaWto6uHqZSfQNchhgagYExiG1iagaizC0srbAptdbBZYiNLRjYgTn2DiDS0cnZxRWLUjd3XIYge4fBwxNMeXn7KPjKYSj188dlCLJ3GAICg6DCwSGhEEZYGExleEQkUd5hiIqGS8SAydi4+ASogKhEIi5DUEFScgqqQGpaeiyUmZEpS5whWdk5OOVy84gzg4EhvwCXTGGRErGG4ATFmSUUm8FQWkaScgAvoCT8JS9yrQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.372,3.402;4.blob,1.1,984.iVBORw0KGgoAAAANSUhEUgAAAU4AAAAPCAMAAAC8/tYmAAABa1BMVEUAAABHHR1/NDQMDAX19WNKSh4MBQX1Y2NKHh6kpEKoqESkQkKoREQeDAyYPj4QBwdGRhz29mMODgZGHBz2Y2MOBgZWIyNxLi4DAwHm5l1jYygDAQHmXV1jKCgCAQGMOTk4FxeLizjBwU6LODjBTk4tEhKSOzsHAwMtLRL+/mcfHw3+Z2cfDQ1lKSliKCjQ0FR8fDLQVFR8MjIJBASUPDwpERFyci7Z2VhyLi7ZWFg8GBiJNzcBAAAYGAr8/GY3NxYYCgr8ZmY3FhZ0Ly9TIiK3t0qVlTwDAwi3SkqVPDwUCAgaCwtZWSTs7F8GBgIDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4JCQTy8mJQUCAICAMCAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucnD+qqkXIyFH//2dgYCecPz+qRUUqKmc1NYIoKBA0NBUTEwgEBAk7O5IbG0IUFDIAAAEPeoeiAAABMUlEQVRYhWNgAAJGJoaRAphZWMnWy8bOQZQ6JkayrRhygJOLfL3cPMSo4uXjJ9+KoQYEBIXI1issIkqEKjFxsi0YekBCUopsvdIysoQVyckrkG3BEASKSuTrVVYhrEZVTZ18C4Ye0NDUIluvqrYOQTW6emQbPySBvgH5eg2NCKkwNjEl3/ihCMzMyddrYUlIhZW1DfnGD0Vga2dPtl4HRycCKpxdyDZ8iAJXNzyS7u74WAwenvhkGRi8+Lwpd+DQAj6+fjjl/AMCg3CzGBiCQ0JxyoaFRzBEEixchx2Iio4Bkn6xYCCBzGJgiItP8IeowsYC1jSJSThlk1NSGdLS6eOHwQQyMoFEVjYY5CCziAC5eTil8guo5L6hCAqLwKAYmUURKCkto4rDRgEYpJZXMAAA0XM65/EoVdYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.421;4.blob,1.1,2368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.478;4.blob,1.1,2164.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.590;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAABMlBMVEUAAAAGDgYDBwMUMhQyfDIECQT19WNKSh4nYScraSukpEKoqEQFDQU8kzwSLBJGRhz29mMODgYmXiYucS4DAwHm5l1jYygSKxI+mT6LizjBwU4DCAMVNBUtLRL+/mcfHw04izgfTB/Q0FR8fDI0gTQkWSRyci7Z2VgzfzMYGAr8/GY3NxY2hTYhUiG3t0qVlTwBAgE9lT0aQRpZWSTs7F8GBgILGgsMHQwJCQTy8mJQUCAbQxs4ijgAAQCcnD+qqkUyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7lzIDsAAABLUlEQVQ4je2SR1MCQRBGP9YcQMU0igkFc84KmMEsmAPm8P//gjM9uz3bBy6e7UPPe7NVW7tVD+CJeBBTVV2jd20dX9Q36NXYxN4cjQEtrW18EW8HOjq72LtVBOjpZU+oPqB/YJAvhpJ6DY+wp9J6jY6xj8f1mpicCnx6xuzZOV/nFxbNsbS8Yn1VrZljfWPTeiabo3Nr2/rOrvjBvf1EWA+yefG4cIgKcyT1+ERo/vTMp/ML85HFDMJeinrCL68g/PpG+K0qCb9TBeH36kH4o4oJfyo/y/e/pKUni9Jfy2/C8f6RE+59fgnH9w8qj6vKkq0qRFQVHFFVCJGpyo4lqgqOqCoan6gqOErxH1uiquDIVsXkV8XkV8UUVBWQq4rIVUXkqrLkqvrv6w99/QJONUJDKqlbuQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492320230;4.rect,1.1,3.244,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.294,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.344,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.478,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.502,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.514,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.546,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.554,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.221,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.190,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.174;4.blob,1.1,3656.iVBORw0KGgoAAAANSUhEUgAAAMUAAABbCAIAAABMNtaUAAAABmJLR0QA/wD/AP+gvaeTAAAKaUlEQVR4nO3dfUwTdwMH8Ov1elBbWl76iLOlQEHeLE5QLCjTIWh52OYeFsAgbxPQZslYyJKFuBcXnWFZgpvTkU3nHwtGF4jG/jMwcYr6x2Z0cWwjOqu86IQpFB/20HqFvtzzRxlh9O7Xl2t7V/h9wl/93vV+bX7ctXdfDgSB/EQsEJgbGkqUSrYHwiY+2wNYPGYcjoyoqCyZ7OzgINtjYQ3K9gAWlQ6DYUd8vATHActIcBy8QEiD88mfLo2MTM7MlKtUdAuIMGywsvJBVVXkIp1ScD75k50kT9+7V5uSQreAjSTHLRYjQVgdjmAODApVmdHRDp0uPiKC7YGwA34e97MxgihNTBSg6LU//2R7LCyAxzv/6zAYaugPeYsbnE/+d+b+/SSJRLN8OdsDYQE83vmfyWrNi41VisXdDx+6phIcD+Pzp+12ynXBKffB/VNAdBgMO5OScHTh2ws+X7AIzibA+RQQ+uFhnM93vfYCPl8AzyZAtE5u2dK1bRvbo4AgCIIgCIIgCIKgkCIWC8zmhpKSpdKOBbeBmaScwtr1lpkZR0ZGVFaW7OzZJdGOBbeBmaTQrO3bFc+eNUgkwHasBAcvwEHh/PBwfrjr49sVimcNDXRlXyYpd7B5veXSpZHJyZnycvp2rAgbHKx88KAqMpLr7+OcMH5Y64bWjzUfL8OWLYjAbWAmKXewOZ/sdvL06Xu1tfTtWBs5Pm4xGgmrNWSuZ9lJ+5R1ymQ12cmFHQFwG5hJCs3KzIx2OHTx8UulHQtuAzNJOYLl/tPYGFFamigQoNeuLYl2LLgNzCTlCPb7Kh0dhpqaJbQbB7eBmaQQgiDIihXLbLa9Gs1SaceuWLbMtncvXRuYScoF7Pd9TSZrXl6sUinu7qZoxy4+4DYwk5QL2D/eIQjS0WHYuTMJxykG09aWR5K68HCKeQ+IAqpMVXZ883EBKvB5Abo2MJMUvFG3Q/IXN/MJx9Fw5+m5eT98Ps+T1HN6/TCO8ymvvWAYjyQRm430KgoolIeSCOl6OsDzBejawExS8EbdDslf3Myna9deJYjGBT9zH5/BqecIwtbVNbBr1yrXSKEQGQyTNhvF+SdAFFBRYVFjxJiDpN2u2wUIm61rYGDXKorX63MK3qjbIfkLBo5ff71XLF64kxwamvIk9Upj41XXB6VSXKuNe++9G15FASXEhKujVuuH9T4v4NR4leL1+pyCN+rhkBY/DEPLylQ8quMnIAoolIdmy7J5CO2G3S4Q/FGxMiQIgiAIgiDIfxISEkiSlMvlbA9kFrgrzCSFGPLi/LjFYgncOLxiMlnPnx+iK04xSaFgUKlUJEkKBAE/W+85cFeYSepE19ldmqnvSkqU3d0lCx5MSkoiCMLbpzpwYP2+fVnR0WGeLKxWRzc1qT1/cj6fNzpa09CQ5vcUQZAwftineZ9+tvEz187uUks1Gs3Vq1cJgnjy5MmxY8fEYrHr6vPNHu8wDK2qWvXrr+Xfffdv1xkwMDAgFArBT+Tq6dPpDz7I/uOP6i++yE9OllJvHuVpNMv371/X1KQWibzY/4G7wkxSBNjZXVJpampqb28vQRClpaX79u2rqqrq7Ox0Xf0fhELszTfVQ0O7LJbGU6e25uXFulnBG1Ip/sYbGTdvvma379XrtZs3PzcXCQRoQcHK1tYN7e359fVpKpXE2ycHd4WZpJBTV1eXwWDAsNmLclqtliTJgoIC0Drffltote45cGB9TEwADp9/W7MmpqenhCR1xcVxzkcaG9O//PKFV16J92q3tEBfX9n772cHIoUQBDGZTIcOHZr/yPj4eFtbG2AVtLNzYGhoqrk58+DB9WvWxPh9TGKxoLEx7cSJzUVF8s7Ogd9+e+p8/KefxoxGS1GRYseOeIVC5NuTg7vCTFJIKBSKRKLHjx/Pf3B0dFQmk7lZE0V5ZWWqmzdfI0ndDz/8p7qauinhrczM6K+/3jI1Vf/XX7sPH85TKhd+lOPxkOxs2bvvZh0/vrmlZa0PlV9wV5hJCiEIYjabXfdPhw8f9nT9wkL5xYsvT03V+2U0J09uGR7e9fbba9z+gW9aWmRzc+bRo5t82EpPT0l7e34gUp9x8zu/D+m5c+dcPz8VFRXRPQm1zMxo71agkZoaiWFenC+Vy3056lVWJhuNdZRdYSapz/VZDn7n9zlNT08nCKKnp0er1dbV1U1MTFy4cMF19fko3sq5jzhugfu+d+96V54cGTF7vvAcQFeYSepzfZZr3/mZpHfu3CksLIyIiNDr9W1tbV1dXRUVFa6rz8eoY3X9eqnr54/du698881dJk/rrZMnt0gkeEXFRT+mugydXCTff3M/5VrgdCljNJ/S0iIp+74TE1y50ucbISb8RPOJflh/eeSytykELQTrsxAEQRAEQRCXKEuUe6b3qMo4erO9lpa1/f2050WYpFCgJLyaUP2oWhjrdQsqCPr7K1pa1gYihZac7GyZ3b6X7lqNzymnrqNxPF1UjhzZ+P33L/s35dp1NC6nc6LVanVTk5v7YXAchqGVlcnvvHPdv6nzehbKQwFXu2DqxEPRf+XkxGm1Irl8amjIdYFQ8tJLSpOpQSSi/q1gkkJuoQLByoKCDa2t+e3tafX1EpUKcXu/Ho6rrU05f37IbLb5PYXcSq2rk61b97C7e/TyZavZl24It0ilOEE0btum8HsKeSJm7dqcjz7a9PnnyZWVIsXsOxnC+6fyctXEhOXSpRG/p5AnJvr6Jn75RZaVFVdcvPLFF/83ODh65UoIz6fa2pQzZ+47HNT3z2SSMuT8am2xU5d2FlVKksZbt4y3bkWmpcUVF6+qqqJcPQQkJkY4HDq1mrqazCR1gn1fD9P5RHJ5qO6fqqtX9fUZ+/upq8lMUieGfV+ufasPXDqfeSRkPz/cvl3R3JwZiNRJl6E7mHPQtxSC/kGICY9uOrpVvtWHFIIWgn1fCIIgCIIgCJrHh1ZuSYlyenpPmU8dZXW0uv2F9mwZ9d2hwOkcrTbuww/XcyT1yyvyBCf+/51bNTUpp04ZvFqlu/thRcXFI0c2xnrfUe5/2n/i9omdSTslOMVd88DpnNzc2OvXn3Ak9csrWiQArVyJBHd7MyBWKJXir77aHBlJfS9attIgCIH9U21tSm/vqOvdV0QibHCw8sGDqshIzk2p3NzYu3cnJyenOZUGAdfnk7OV29FBcbCz2cjxcYvRSFitwf6XimAoytuwYfmPP1IfkthKg4Pr14O1WoVIJDh3btA1mp62p6e7u30xG1avjsJx9OefjZxKg4Pr+6dQbOXm5sb29U1MT1NfjWcrDQ5OzyepFN+xI4HyYMdZQiH2/PMxdAcdttKg4fR8CsVW7rp1MrPZ+vvv/+VUGjScnk8BbeUGSG5u7I0b4yTNkNlKg4a78ykxMSI//znwwa6tLY8kdeHh/KCNCkwmC09OltIddNhKg4m788mTVi6G8UgSsdnY/q38m0az/NEj0+go9R+jsZUGE3fnE91pp/kUCpHB4N1dqQMqJwd0+oetFPKIVIpPTdW/9ZYX/zUPgmhhGFpWpuLB2i2X/B+LkdQd7kuECwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.323,3.202;4.blob,1.1,164.iVBORw0KGgoAAAANSUhEUgAAABgAAAApBAMAAADdf/TDAAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAG0lEQVQokWNgFGBAAGVXJE56E8MoGLYAX7wDAM0BAsUzV0M4AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.326;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAAB1UlEQVRIiWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy372AXBwB0G4WK6AFv1wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.612,3.364;4.blob,1.1,160.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANBAMAAAB4JQK4AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAF0lEQVQImWNgIAYIMjAwmQQwsFUogHgACaoBNkBBnPoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.383;4.blob,1.1,2896.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.421;4.blob,1.1,2368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.497;4.blob,1.1,3320.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.552;4.blob,1.1,2604.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492320338;4.rect,1.1,3.254,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.304,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.354,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.204,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.215,2.27,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.231,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.383,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.402,1.6,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.520,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.573,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.231,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.200,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.323,3.183;4.blob,1.1,164.iVBORw0KGgoAAAANSUhEUgAAABgAAAApBAMAAADdf/TDAAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAG0lEQVQokWNgFGBAAGVXJE56E8MoGLYAX7wDAM0BAsUzV0M4AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.204;4.blob,1.1,564.iVBORw0KGgoAAAANSUhEUgAAABsAAAAWCAMAAAAGlBe5AAAA2FBMVEUGBgIICAMDAwEAAADIyFH//2dgYCcoKBA0NBUTEwiBgTR5eTESEgcsLBJtbSxvby329mP19WOUlDwkJA8CAgE3NxZ+fjOZmT54eDEPDwZpaSrLy1L9/WawsEc+PhkFBQJBQRqGhjaVlTxiYigiIg4uLhO3t0pISB1kZCmXlz1NTR8LCwUMDAVkZCj7+2WoqEQbGwswMBODgzWRkTtZWSQcHAstLRKbmz/z82Lx8WGNjTkeHgwBAQAyMhR6ejF3dzCcnD/g4Fpyci4ODgZwcC2SkjsnJxAEBAL4B+LYAAAAiUlEQVQokWNgYAQDJmZMwMDCCgZs2OTYOcCAE5scFrFhKsfFzYMsw8uHJMcvICgkDGWLiIqJSyCbKSklLSMrB2TIKygqKaug26eqxqrOzKyhqaWN7hYdXRY9fQNmZkMjYxNTFDkzcwtLK2sw08bWTtxeFEnOwdHJGcFjd3FFknNzR7XbgIEGaQIAITMQtihZM3YAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.382,3.326;4.blob,1.1,696.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAABCFBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZimZhjWSAAAAu0lEQVQokc3O1RLCQAwF0ODu7tAWWopbcXd3+P8/wQozlbyTh+zdOZvJAnxLoVQBVmoNSlqdHiOD0YSOmS0oWW121BxOlFxulDxeH2r+AErBUBijSDSGjsUTKP1rEaTgSiVTv0wSwqc0801pNiOkbC7Pp0JRtKBUrvChWhMv5+qfs9GkxNRi2++ToaV/7nRfvZfrS2kwfPXReCKl6Wz+7HVOKgCLJcCKXcvRZruD/UFO4Hg6w+UqS3C7PwAWuxDMLQRidAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.354;4.blob,1.1,4904.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.421;4.blob,1.1,2784.iVBORw0KGgoAAAANSUhEUgAAAJQAAABGCAIAAAClqCqnAAAABmJLR0QA/wD/AP+gvaeTAAAH3UlEQVR4nO2dW2wTVxrHz4zjW2LixB7PKJgkUJsSCMErEtvDEpC2rZoF1D5UailRaRHtY7WrfeJphZanrlSBBLtSQX2K1Erbl1Zs1ZeIF2TJTgRNGkriwFotbUwY30kziS9z2YegJNhjxzNzBo/T81OkOHNun75P53hmzpf/ATabkWU/PHmyB0hhNpivDV876DgoWQqR7u6RoaGLZRctFufx49fN5g6tR284BoN5ePiaQ6af8eXl0tdf//T++y9LFhf4wlRq6gh1BIaFtaAommEikkWCUNJ69IbD84VUaoqS6WccADA29uDNN3vb202SNSJMxOf0WQwWCDZWwWbraW3tSiQmKkowAADH5bUbWj8wTMTp9Bnk+BkHANy6Fc/lim+//ZJkjWguusKtDLoG4dgoBUXRudx8oZAru45hmCCURJHXbmj9kMtFOW7FJcfPOACA58UvvnhYbeUURGEiMaHdyolhOEkGGCZcWbS6mgyFPtZoXL0hikIiMSFr5cTXfo2NPTh2rKu3d4dkpQgT8dq9TosTgo0VdHb247gplZrSovPmgmEidrvXUrefnwXv3r3MzEz67Nm9kpXibDzOxoNkEI6Nz0NRdDo9zfMFLTpvLlg2zrJxsm4/4+ufxsYenD0rvXICAMJMmKZotdZV0NJidTp9kmvm7xOGCVN1+3kjeF9++T+Ppz0YJCXrTSYmXRbXnh17IBi4CYIYLJXYbDYKt9vmJZGYtFhcO+rz80bwnjxZGR9fqHbbslRcmsvOQZ98FEUnk5MAiHC7bV6KxaVsdq7OyYdv/mNs7MHp0x6TCZesGk6E/S5/C9YCwUYAAAAWC2G3e9GaWUYiEXa5/Fgdfn4uTt9887PJZKj2qmw6NW3ADRBflZFkcHl5gWUfw+pwe5BKTeO4oZ5XZc8Fb3WV++qr2Oio9D1nSSjdTd4NkAE4NgJAkn407SoRhFIyeZeE52cEAoFAIBDbGpK0NtqEWkg/0iEAAK+/vuvcuX2NtgIhn/37O69c+SNBQN6C3r17tyiKbrcbSm9o5kmA49joqPfbbx+lUpps4ufzcLpFwZPA53N2dJhDoSfQe8ZxHACwtLQEpTdVLyrf6H2DE7jbi7dZjoVijU4IBMi5uWyhAD/9AsOwfD5fKslLqRoa+gfP52dnrxcKmc3XVc28FW7lVO+pT+hPznjPkNbyvSQDZjDixrIfDGBqRnwx7N1rj8XgTI4yYrGY1Sr7DrZQyBw+/Pf33vt1ePhfdrt3/bpaV1pbrAEycJQ62rOjZyY9M74w/vDpw7Wi833nKzffr89e/z71vcpBNaWtzXj58pHPPpudmko12pYNTCa71zva13eeIA4/evTfmZnLi4u3oc2DXW273trzVr+j/+qPV+9n7gMACAvRZmwrq5ZcTa5wK7AG1QKKsl665L9yZSYaLc9m0wNO56Fg8J/d3X/+7rsTEDbnzAaz3+Uf7hrutfXeSd6Js/G169lC9mnxaVllTuDUj6gpRuOzjLpGG1KO0WjzeN7dv/8jghiMxf6TydxTFTx3m/sV9yt+l18EYmgxdGP2RmbTN+oH+z5oxmWTZTkAgNlsaLQhGzgcAwMDf/F43hVFIRr9fHz8neXlX4DKu81X3a/2dfTdfHQztBjK8+XPLjd/vnkrfqvsYnI1qWbEF8BvvxV5XuzsNDfakA0GBv7qdr92587FaPTzYhHSnRRlpXBsGz4pXrjwhzNnvFvXe1F0dOzDcYlppsr1zCojiIKaHvTJ/fvZAwc6G23FBrncvCB1r7AN5416QqFFp9Pi8bQ32pAt0NHXsn7I5/nW1pZgkIxEmEbbUgsUPGlisaXjx3c6HGZ9Pu0htsBmM544IZ0FiUAgEIjtz0j3yMUKzQZlKNM/aCK6R0aGLir0laQ2RiXynvNoio5U0WyQizL9gyaComkmotBXNbQxNiMjeD22nq7WrgkJzQaFKNA/aBZsPT2tXV2JCSW+qq6NUY6M4NEUPZ+bz1VoNihGgf5Bs0DRdG5+vpBT4qtq2hiV1Bs8HMMDZCAM9Z96FOgfNAUYjpOBABNW4qsa2hiV1Bu8/s5+E26agq3ZIFf/oCno7O/HTabUlBJfydLGqDd4NEVPp6cLsDUb5OofNAUUTaenp/mCEl/J0saoK3jWFqvP6YO7Zq4jS/9A/7RYrU6fT9maKVcbo67gDRKDbImNaqPZIEv/QP8Qg4Mlls1GlfhKrjZGXcGjKXoyOSlqo9kgS/9A/1A0nZycBKISX8nVxtg6eISF8Nq9Gq2Za9Svf6BzLARh93qVrZkKtDG2Dl6QDC4sLzzWUrOhfv0DnUMGg8sLC+xjJb5SoI2xdfD8pF/TaQe2kf4B6fcrm3YAaWMgEAgEAoFAIBD143AcPHbs3wRxuLKovf2lo0evAgB27vzToUN/q6xQ40ANNW03I5noULst3GM+dJ3unsn8ODt7w+M5bTJJZJ6vH5YhCMVqPVQ7UENN23VqJDrUbgvrmA+9v5FKp39Ip3+QKsF4Pg8AwDCM4yQ3UGocqKGm7TOqJzrUbgvzmA9dz7zacNwqAGA9EmXUPlBDTds1qiU61G77uzrmQ6dgOH7k008pusE7IU088xqImkQHiKDgKUFNogNEUPBkoybRAS4oeLJRk+gAFxQ82ahJdIALCp481CQ6QAcFTx5qEh2gg4InDzWJDtD5Px6DTVdwBShIAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.497;4.blob,1.1,2532.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.552;4.blob,1.1,3564.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;3.end,1.1;4.sync,10.6492320439;4.copy,1.1,3.440,3.361,3.520,2.19,2.14,1.1,3.430,3.361;4.rect,1.1,3.264,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.314,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.364,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.193,2.57,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.212,2.67,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.383,2.47,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.402,1.8,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.402,2.36,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.421,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.444,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.497,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.241,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.210,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.174;4.blob,1.1,2468.iVBORw0KGgoAAAANSUhEUgAAANkAAABbCAMAAADJGNCXAAAC91BMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAEsLBJtbSw3NzfBwcH39/fp6emTk5MMDAwCAgF+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUFBQJBQRqGhjZiYigiIg6qqqra2toEBARHR0f///9BQUFkZCmXlz1NTR8LCwX09PSEhITr6+uMjIwwMBODgzWRkTscHAsJCQlsbGzR0dGgoKAyMhR6ejF3dzD19fWNjY0oKBBwcC2Skjutra1EREQbGwspKSm3t7dfX1/t7e06OjrExMSXl5cODg7U1Fb9/Wa8vEwSLCwsbW3p6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwv392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0LGxt9fTLOzlPW1lb5+WUsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS44OBdlZSmUlDwpKRE8PBiJiTd0dC9TUyIUFAgaGguAgDRDQxuwQhiaAAAD/UlEQVR4nO2bZVBVQRiGr40KdncHBqigWFigGAhioaCYWICoqIiKjQE2tiIqKLbYiNjdit0FJnbrD4HLuXu49+PEZXfPXGafH/c8c2b3O98Ow87sO7MqleJkypxF6RZIkTWb0h2QInsOI40bGQkMNDhy5srNqbFJnrxKtoKbfPk5K1CwkLGSneCmcJGiSrdAimLFle6AFCVKKt0BKUqVLqN0C6QoWy5F0K6fQfb/8iYVkp9o188o+3/FSpWTn2jXzzD7f5WqSnfAYDAYDBGqVTfFWg/lBpBRpUZNvPVQbgAZTWrVNtO4mZnAQBHMzdVPlBtARpM6detxamFZv4G+ZawaNmqcLCg3gIwqTZpyZt2suYW+VVq0bGWlNpQbQEYTG9vWWOuh3AAyqrSxw1sP5QaQ0aRtO7z1UG4AGU3ad7DHWg/lBpBRpaMD3nqa3AA0mjhadlKLU+cuWiJC127dAeVyA8jQMN4EYjj36KkWF1tXLRGhV283QLncADI0jDeBHH36qp/9+qu0RIQBAyHl5QY6hobxJ5DGfdBgLRFhyNBhgEqbIXECHlw9PLVEBDev4YBKmyFxAoPBMDRQggCZQYMSBMgMGZQgQIaSAfwG4T1CYtsSQAkCZCgZwG0jR/mMHjM2VSu+9uP8xuNYUwooQYAMJQN4bcJE/0mTp0zl9TFt+gyHgJlYlpQCShAgI8Ws2XNUqsCguejNvPkLFmL+CEoQICPEosVJv8FL0July5Y7rsD7EZQgQEaGlUGrkh6r1/DeeYas9QvFeuRHCQJkhFin/putT/12Q1g41q+gBAEyAAy7/kb1/9km7dIRUpuWhCZBgAw48uPY9Tf7bAncus0f6zp00SQIkAFHfiz7//YdPsE7d+FeijZcggCZMkd+Cih05KcAO/IzGAwRQiOFzJCJDBUyAyZkd0TaRi4tEM4NsOCyJ20jlhbwLJG9+zCtJRWu+w+kbaTSAr4djDoUfRjnijhijlgIGHGOHjt+4uQpIqVPnxEy4pw9d/4CmcruFy8JGHkuX7l67TqRyjdifQWMAjdv3Y6+E0Wg8N17QgaCfde//+Ch9Ial8sjWW8CIpQVau77qMY61pObJUyEjlxbwjBDPwoSMpQUGCEsLGAwGiE4eYPrcQ2fQi5deOpZIXLwsS6MKKXTzgFexr3VGvXn7TsdUqvg4eQZXIYQmD9DjTsL7hA8yjSZcHqDPnYSPn+QaRTR5gB53EnydPss0mqQnD7AJt5ZpNElPHvAlQK5RJD15gPPXbzKNJunJA77/8JRpNBHJAwT5+UuuUYSfB0i9isDxO+GPTKMJPw+QehWBI8ZOrtGEnwdIvYrA8fefXFMIqVcRDA+pVxEI8x9ByuxJsinNkQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.343,3.202;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.392,3.326;4.blob,1.1,1012.iVBORw0KGgoAAAANSUhEUgAAAOEAAAAgCAMAAADT2e9ZAAABdFBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECwth7+8GEBAECQli8vIgUFADBwdX19dY29s/nJxFqqodRx00fzQDBwM8kzwSLBIwMHdWVtQoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMUFDJmZv0LCxsjViMucS4BAgE4ijgYOxg6OpBMTLw5jDkXOBciUyIvdC8CAgReXukmJl4SLRI7kjsLGwsIEwgeHktjY/QEBAszfTMeSh5ERKlCQqMECQQRKREcRBw1gjUGBg9kZPccHEUYPBg3iTcAAQAGDgY9lz0NIQ0oKGRcXOQBAQIsbiwkWSROTsI4OIoIFAgLGgsWNRY5jjkBBAENDSFnZ/4SEiweSx4yfDICBQI7kTsTMBMyMn1TU840gDQbQxsmXiYpZilWVtYtLXB+tgysAAABPUlEQVRYhe3VRVcDQRCF0cET3C0ElyQQYSBo0AR3De7urn+eFYvqmWVe1YHTd/d6avHtxjB+JSWnGP9capp0AVp6hkM6AcyZmSWdgJadI12AlpuXL52AVlAoXYBWVCxdgFZSWiadgFZeIV2QYA71B1jpqhIJQXG7qmvoS21dvUwKSENjk1t5am4RKdE0TdP+AI+XTF9rm1BIwvgDdHs9dAdDfC0YAT+Z7WYH/d4Z7mKsAeju6SW7r185iAwM8tUgDA2TGRkZVS+iMa4WiLHxCbInp3zqybQ5w5YDMDs3T3YoaL1ZWGSKgVhaJnMlvGq9WVtnikGIb2ySvbW9Yz3a3dtnygE4ODwiOxa1uzo+YYmBOD0j89y8sLu6vLpmqQG4ub0j+/7B9uzx6ZmjBuHlle63d/u7j098C8bXN5k/XUMgpA3Y/0QAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.362;4.blob,1.1,1400.iVBORw0KGgoAAAANSUhEUgAAADoAAAAjCAMAAADyvOlJAAACNFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgQBBAECBQIBAgFMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4DBwM8kzwSLBIdRx00fzQoYigpZSkRKhE8lDwDCAMMHgw+mD4HEAc4ijgYOxgjViMucS4iUyIvdC85jDkXOBcLGwsIEwgSLRI7kjszfTMeSh4cRBw1gjUECQQRKREGDgY9lz0NIQ0YPBg3iTcAAQAsbiwkWSQWNRY5jjkIFAgLGgs7kTsTMBMeSx4yfDImXiYpZik0gDQbQxuWHSw9AAABn0lEQVRIiWNgIAwYiVCDHTAxk6uThZUNwmDn4CRNJxc3DwNMKy9pWvn4BaAsQQ4hVClhEVG8WsXEYSwJSQgtJS0DYcjKySsogllKymCggqpVVQ3dMHUNTS1tMEtHV0/fwBDIMDIGAxMUdaZmfBgOMbewtLK2gbBt7YztGRgcHMHACUWZs5kLNm+4url7AClPL28fXz8cDvY3C8DUGBgUHBIaxhAeERkVHcOAy8GxZnHoGuMTEpOSU4CM1LT0DIgQVgdnZmWja83JzcsHMwoKsfkFAYqK0UVKSvEoLysHgwoQu5Ibv9FooKoaDGpA7NqsOlK01jeAQSOY09TcQpK9SECgtY1crQztHWRrHQKgs6sbu0RPL0G9ff3YxXt7CGqdMHESNuHJU6YS1FoxbTo24RkzCepkYJg1G5uBc+YSoXXelPmYggsWdhKhlWHRYkyx/j5idDIsWYohtGzicqK0rli5Cl1o9Zq1RGllWLceXWT2LOJ0MmzYWIYqsGnKZiK1lm/ZyoBS1GzbTqROBoYdOxlQippdu4nWCgYoRQ0aAACkFmgpu4DN9wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.381;4.blob,1.1,1300.iVBORw0KGgoAAAANSUhEUgAAAIkAAAASCAMAAABYWw17AAACDVBMVEUAAAAKGAoECwQiVCJUz1QGDwZBokFHr0cMBQX1Y2NKHh4IFQhj9WMdSR2kQkKoREQ/nD9MvUxGHBz2Y2MOBgYSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwksLBJtbSwDAQHmXV1jKCgBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViMDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDGLODjBTk4CBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNiYigyMhRBQRqGhjaVlTwiIg4tEhL+Z2cfDQ0pZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cUFAgfHw0KCgRkZCmXlz1NTR8LCwXQVFR8MjITMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8wMBODgzWRkTtZWSQcHAtyLi7ZWFgAAQAUMhQxejEwdzD19fWNjY1a3lo3iDd6ejF3dzAYCgr8ZmY3FhYQKBAtcC07kjutra1EREQBAwFl+WUsbCwoKBBwcC2Skju3SkqVPDwLGwspKSm3t7dfX1/t7e0UMRQbGwtZJCTsX18GAgI6OjrExMSXl5cODg4tby1d5l0JBATyYmJQICBSzFIyfTKcPz+qRUUgUCBc5VwRKREcRRwbQhseSx4RzxQfAAABfElEQVRIiWNgwAYYmbAKDwBgZmEdaCfAABs7/ezi4OTCI8vNw0s3lzDw8eOTFRCklzsYGISEReBsUTEQKS4hKSUtAxGRlZMn0hwFRUpdoqSsAmGoqqlraAJpLW0dXT19A4igoZwRLo3GJmBgCmKbmVtYWlHqEgZrGxBpa2fv4OgEYjm7uDIwuLl7QGQ9vXDp87YEAx8GBhNfP3/vAIodwhAYFAwkQ0LDwiH8iEgQGRUN4cU44NIXGwcG8QwMCYlJyZS7AwhSUoFEWnpGZhaIl+2eA6Jy8yCS+QW4tCFip7CouKSUGi4pKweRFZVVGtVqQEYNJExqIZJ19bi0IWKHwdSnwbLRnHKXNDW3QBitbe1AsgOSTjrBQl3dPbi0IWIHBHr7+il3CcOEiTDWJCCeLDnFbeo0HYiAqNx0Yk2ZQQWXzJw1G5k7Z65k1Lz5EPaChapUsIBosGjxElxSS5fR0yEMDMtX4JBYucqQrg7BCVYvXDPQToCCtevobycAcBVMe2bYCzcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.402,3.402;4.blob,1.1,1352.iVBORw0KGgoAAAANSUhEUgAAAWIAAAAPCAMAAADpnzV4AAACBFBMVEUAAABHHR1/NDQMDAX19WNKSh53dzDU1FYHBwOTkzwsLBIMBQX1Y2NKHh6kpEKoqERiYihlZSmkQkKoREQeDAyYPj4QBwdGRhz29mMODgYyMhT9/WYbGwsqKhGUlDwICANGHBz2Y2MOBgZWIyNxLi4DAwHm5l1jYyiQkDq8vEwCAgGKijg7OxgDAQHmXV1jKCgCAQGMOTk4FxeLizjBwU4EBALp6V5eXiZTUyJ0dC+LODjBTk4tEhKSOzsHAwMtLRL+/mcfHw1LSx709GMLCwSYmD4TEwj+Z2cfDQ1lKSliKCjQ0FR8fDKpqUSjo0J9fTPQVFR8MjIJBASUPDwpERFyci7Z2VgPDwb392RFRRxERByCgjVyLi7ZWFg8GBiJNzcBAAAYGAr8/GY3NxZkZCjk5FyXlz0hIQ0YCgr8ZmY3FhZ0Ly9TIiK3t0qVlTzCwk5ubixZWSQDAwi3SkqVPDwUCAgaCwvs7F8GBgI1NRaOjjkEBAEDAwc5OY46Oo8EBApZJCTsX18GAgIiIlQ+PpkCAgVLHh4JCQTy8mJQUCB9fTLOzlMFBQKRkTswMBMCAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucnD+qqkXIyFH//2dgYCfW1lZwcC1mZimcPz+qRUUqKmc1NYIoKBA0NBUEBAk7O5IbG0IUFDIAAAFHHhywAAABrElEQVRYhWNgAAJGJoahCZhZWAkpYWNH4XJwclHVBdw8vESpY2KkqrV0BHz8hFSws6HyBQSp6wIhYWJUiYiKUdda+gFxCUn8CqSkZVAFZOXkqeoCBUUlIlQpq1DVUnoCVTV1/Ao0NNEEtLR1qOoCXT19wooMDI2oaildgbEJXmlTM3N0IQtL6rrAypqwGhtbO+paSk9g7+CIT9rJ2QVdSMbVjaousHH3IKjG04uqVtIZePvgk/X1wxTzJ9gKIQ0EBBJSERQcQl0r6QtCw/BIhkdEYgpGRVPXBTGxhFTExSdQ10r6gsSkZNySKalamIKSaelUdUFGZhYBFdk5VLWQ7iA3D7dcvjY20YJCEq0oKsLHYiguwSfLwFAqWkaihYMMFJZX4JJKd8DalausqibJhpraunrcLAaGhsYmnLLNLa0MbQQL60EO2js6gWSFPBioIrMYurqx6ujp7SPJhv4JE2tws4C12aTJOGWnTJ3GMH0GSdYNQjBzFpCYPQcM5iKzGObNx67DfAF1XbBwEU6pxUuoa9UAgqXLwMANmTUIwPIVKwfaCcMdTFu1mgEAGQtk6DsulfIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.421;4.blob,1.1,2968.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492320541;4.copy,1.1,3.440,3.342,3.520,2.19,2.14,1.1,3.430,3.342;4.copy,1.1,3.450,3.361,3.510,2.19,2.14,1.1,3.440,3.361;4.rect,1.1,3.274,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.324,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.374,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.215,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.386,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.251,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.220,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.343,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.613,3.316;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.381;4.blob,1.1,1536.iVBORw0KGgoAAAANSUhEUgAAAYMAAAASCAMAAACO90JyAAACVVBMVEUAAAAKGAoECwQiVCJUz1QGDwZBokFHr0cMBQX1Y2NKHh5HRx1/fzQIFQhj9WMdSR2kQkKoREQ/nD9MvUxGHBz2Y2MOBgYeHgyYmD4QEAcSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwksLBJtbSwDAQHmXV1jKChWViNxcS4BAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViMDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDGLODjBTk6MjDk4OBcCBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNiYigyMhRBQRqGhjaVlTwiIg4tEhL+Z2cfDQ0tLRKSkjsHBwMpZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cUFAgfHw0KCgRkZCmXlz1NTR8LCwXQVFR8MjJlZSkTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8wMBODgzWRkTtZWSQcHAtyLi7ZWFgJCQSUlDwpKREAAQAUMhQxejEwdzD19fWNjY1a3lo3iDd6ejF3dzAYCgr8ZmY3FhY8PBiJiTcQKBAtcC07kjutra1EREQBAwFl+WUsbCwoKBBwcC23SkqVPDx0dC9TUyILGwspKSm3t7dfX1/t7e0UMRQbGwtZJCTsX18GAgIaGgs6OjrExMSXl5cODg4tby1d5l0JBATyYmJQICBLSx58fDJSzFIyfTKcPz+qRUWAgDRDQxsgUCBc5VwRKREcRRwbQhseSx4BpE73AAAB5UlEQVRYhWNgwAYYmbAKjwI6AmYW1oF2wihgYx9Y+zk4uQbWAfQD3Dw4JHj5+OnqEAwgIDiw9tMP8HDjkhESpqc7MIGIqNjAOoBeQFxCEsKQkgaRMrJy8gqKEBElZRUiDVFVo4HLGNQ1NGlh7OADWtogUkdXT98ASBsaGZuYmplDpCyULXHpsrIGAxsQ29bO3sGRJm5zcqaJsYMN2Lq4MjC4uXt4enmDuD6+fgwM/gGBEMmgYFzaQhzAIJSBwTosPCIkkjaOi4qOoY3BgwvExsUzMCQkJiVDuCmpIDItHcLL8MSlLTMLDLIZGHJy8/Jp5rqCQpoZPYhAUQiQKC4pLSsH8SoCKkFUVTVEsqYWlzZEWVRX39DYRCvXNbfQyuRBBFrb2kFUR2eXfrcukNEDyQe9ENm+flz6EGURg03oBIeJdrRx3qTJU2hj8GACU6fZQFnTZ8wEkrMg9cFssNCcufNw6UOURSAwf0Ecjdy3cBGNDB5EYPESBHspEC+TW+6/YqUxREBKeRWx5qymsrtgYM3adTQyedCATIn1aCIbNsqlbdoMYW/ZqkN3F6GBbdt3DLQTaA127sInu3sPvdyBG+zdN9AuoDXYfwCP5MFDFvRyxyjADg5vPTLQThjx4OixgXbBSAIADcVh+HX4X0cAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.412,3.402;4.blob,1.1,1628.iVBORw0KGgoAAAANSUhEUgAAAiAAAAAPCAMAAADqMoTkAAACYVBMVEUAAABHHR1/NDQMDAX19WNKSh53dzDU1FYHBwOTkzwsLBIMBQX1Y2NKHh4gICD///8bGxukpEKoqERiYihlZSmkQkKoREQTExMeDAyYPj4QBwdGRhz29mMODgYyMhT9/WYbGwsqKhGUlDwICANGHBz2Y2MOBgYiIiIFBQVWIyNxLi4DAwHm5l1jYyiQkDq8vEwCAgGKijg7OxgDAQHmXV1jKCgsEhJtLCwjIyP39/cCAQGMOTk4FxeLizjBwU4EBALp6V5eXiZTUyJ0dC+LODjBTk43FhZ+MzOZPj54MTEtEhKSOzsHAwMtLRL+/mcfHw1LSx709GMLCwSYmD4TEwj+Z2cfDQ0FAgJBGhqGNjaVPDxiKCgiDg5lKSnQ0FR8fDKpqUSjo0J9fTPQVFR8MjJkKSmXPT1NHx8LBQUJBASUPDwpERFyci7Z2VgPDwb392RFRRxERByCgjVyLi7ZWFgwExODNTWROztZJCQcCws8GBiJNzcBAAAYGAr8/GY3NxZkZCjk5FyXlz0hIQ0YCgr8ZmYyFBR6MTF3MDB0Ly9TIiK3t0qVlTzCwk5ubixZWSQDAwi3SkooEBBwLS0UCAgaCwvs7F8GBgI1NRaOjjkEBAEDAwc5OY46Oo8EBArsX18GAgIiIlQ+PpkCAgUbCwtLHh4JCQTy8mJQUCB9fTLOzlMFBQKRkTswMBMCAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQKANDRDGxucnD+qqkXIyFH//2dgYCfW1lZwcC1mZimcPz+qRUUqKmc1NYIoKBA0NBUEBAk7O5IbG0IUFDIAAAHSzZxVAAACH0lEQVRYhWNgAAJGJobBD5hZWAkpYWNH4XJwctHMNTDAzcNLczsGDvDxC4BpJsYBdghRQFCIkAp2NlS+sAit3IIAomK0t2PAAB+/OIiSkJQaaJcQA6RlZPErkJNXQBVQVFKmmWtgQEVVjeZ2DBhQ59cAUZpaA+0QooC2ji5+BXr6aAIGhkY0cw0MGJuY0twO+gMzczBlYQkiraxtBtQxRANbO7zS9g6O6EJOzjRzDBy4uNLeDvoCKzd3D08kvpe3z4C5hSTg6+ePTzogMAhdSCE4hHbOgQKv0DCa20FPEB4RGRUdgywSGz1QbiEVxMXjk01IxBRLItjzoRwkp9DeDjqC1LT0DBSBzKzsAXIKySAnF49kXn4BpmBhEc0cAwfFJbS3g46gtKy8ohJZoKq6ZqDcQiqoravHLdnQaIApKNvUTDvnQEFLqxvN7aAnqGlr9+hA8lJn18C5hVTQ3YNbrtcQm2hfPxWsnTABH4thYhQ+2aEIJk32hrOnSE4dQJeQCPqnTccl1eyHddh0xsxZFNs6e87cebhZDAwV8xfglF24aDHF9g8EWAJnLR1KTaxly1cAyenKYKCNzGJYuQqrjtVr1lJs67r1G2bjZgFbcRs34ZTdvGUrxfYPLNi2faBdQArYsRNI7NoNBnuQWQx792HX4bif9q46cBCn1KHDtLd+FKCBI0fBIASZNUjBseMnBtoJo2Awg60nTw20EygEAEAkiCaIKBcTAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.421;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAAW8AAAANCAMAAABRqR/DAAACQ1BMVEUMDAX19WNKSh4AAAAHAweTPJMsEiwdHUc0NH8ICBM+PpkHBxADAwc8PJMSEiwZGRk+Pj4CAgIFDAVj9WMeSh6kpEKoqERiKGJlKWUFBQsoKGIpKWUGBgYPDw85OTknJydCpEJEqERGRhz29mMODgYqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwg3NzcgICAcRhxj9mMGDgYDAwHm5l1jYygCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDsBAwFd5l0oYyiLizjBwU5TIlN0L3Q5OYwXFzgiIlMvL3QBAAA4izhOwU4tLRL+/mcfHw0bCxuYPpgTCBMSEi07O5ILCxsCAQGUPDz1Y2PlXFxpKiqQOjoYCgoSLRJn/mcNHw3Q0FR8fDJ9M31KHkozM30eHkpaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARU0FQyfDJyci7Z2VhEHESCNYIEBAkRESkcHEQ1NYJmKSlgJycvExPWVlb/Z2f7ZWUuci5Y2VgYGAr8/GY3NxYOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSEnEBAQBgYKGApm/GYWNxa3t0qVlTxuLG5ZJFksLG4kJFlKt0o8lTxZWSTs7F8GBgI1FjWOOY4EAQQLCxoWFjU5OY4BAQQkWSRf7F8CBgIJCQTy8mJQUCAFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzAECQRi8mIgUCCcnD+qqkVeJl5mKWY0NIAbG0MmJl4pKWY/nD9FqkVIPlmuAAAB7klEQVRYhWNgYGRiJhewsLIRUsLOAaY4ubjJtgUT8PDyoQvxC0CBIBXtoSYQEhYBUQzMomLkGyIuQUgFBzuY4uSSJN8WTCAljS4iIysrKycPJKhpDVWBgiKIZGBWUlYh2wxVNXX8CjQ0Ielai0ubbEuwAB1dPSyi+gbUtIPawNDImBkU3iamZmSbYW5hiV+BlTWEttEl2w5swNbOHovo4A5vB0cnZlB4Mzu7kG+IqxteaVt3D/LNxgc8vbAIwsLbGy7ijUXVgAEfX2ZwePv5B5BtRmBQMD7pkFAeso3GC8I0OTEFIeEdHhEZFQ2kY2IRLNo4gkQQF58ADm/mxCTyDUlOwScrLUW+yfhBahqmGCS80zMys7JzcvPyCxAsWrmCNFBYBAnv4hLyzSgtwyNZrltBvsn4QWUVphgkvKtrmJlr6+obapBYgwM0NkHCu7mllWwz2to7cEt2dnWTbTAB0NPbhyGGVF9690/AYA04mDhpMji8madMJd+QadNxy3l5km8uITBjJobQ4G6fAMGs2ZDwnjN3HtlmzF+wEJeUluYiso0lCBYvWYouNOjDe9nyFeDwXrlqNdlmrFm7DpfU+g1km0oYbNy0GV1o0If3lq3bwOHNvH0H+Ybs3IVLZvce8k0lDPbuo6XptAH7DwAAkXSQLgvnTT0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.652,3.438;4.blob,1.1,2364.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.513;4.blob,1.1,4316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.590;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAxElEQVRYheWQNwLCQBADlyNjsHEm2mT+/0P2rtEPpIKpVM7IbBL+AFSmZdPZXGjDApVpWVgspT4kUBmXhdV6o9Qhgcq4LIRsK/UhgUpfXr3LTalDApW+fBb5XurDAZW+4gFlpdRhgcqyitV1I5Shgcq6idVtJpShgco2i9VdL5Shgcqu9+rD8aS0IYFKX159zi9SHw6o9OXV12GU+nBApS+vvt2lOiRQ6cvC41kobUigMi57DW+pDgdUpmWfr1SHBCrT+gGiMCuBXXDK/QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.609;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAmklEQVQYlb3PVxLCMAwEUAGBVJoJLfQeaiD0Eur978QufHEB9PEkjT3rsQgqRuIJoCVTIrphYrRsB6YzPMvmQF5ZsKBcWFQlWFYVWPVqvFNv0KZBW16brdPtQac/4DIcybd85sp4MmWbzenCZpAES7pSPgzVmsumSbef7F1A9wegH0/wrC7QjPjK9Qbuj1DkGWkY3Zf81J/++AbvxA6ACPH2PgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.628;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAxElEQVRYheWQNwLCQBADlyNjsHEm2mT+/0P2rtEPpIKpVM7IbBL+AFSmZdPZXGjDApVpWVgspT4kUBmXhdV6o9Qhgcq4LIRsK/UhgUpfXr3LTalDApW+fBb5XurDAZW+4gFlpdRhgcqyitV1I5Shgcq6idVtJpShgco2i9VdL5Shgcqu9+rD8aS0IYFKX159zi9SHw6o9OXV12GU+nBApS+vvt2lOiRQ6cvC41kobUigMi57DW+pDgdUpmWfr1SHBCrT+gGiMCuBXXDK/QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492320646;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.400,2.19,2.14,1.1,1.0,3.323;4.rect,1.1,3.284,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.334,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.384,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.261,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.230,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.174;4.blob,1.1,2260.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABbCAMAAABeSXdNAAACwVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg53dzDU1FYyMhT9/WYbGwu8vEwSLCwsbW3p6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwv392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0sLBILGxt9fTLOzlPW1lZwcC35+WUsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS44OBeSkjtlZSliYiiUlDwpKRE8PBiJiTd0dC9TUyIUFAgaGguAgDRDQxt6bp5UAAADmElEQVRoge2aZVcVQRiA10YFu7sDA1RQ7ALFViwUFBMLULGwQcXuAlsRsbsV7G4wsbt+hcC6d5Z7353Z9+4uc89hnw/sc87OLO/hcOY8H0YQdCFHzlz6fMgYcufhPQGNvPmcLO7kRFnIhfwFCkrq7FKoMM9RIIoUlaxY8RLOPCeBKFmqNO8RaJQpy3sCGuXK856ARoWKlXiPQKNylf9CThQHOluqulTLeJITxZHOluo1amY8yYniUGdLrdq8JzAxMeFMnbquun6PNDxkaOrV1z6SHNLwkGFp0NDN4m5ulIUM3N3FJ2l4yLA0atxEUg/Pps3sHc6reYuWGUIaHjI0rVpL1qZtOw97v9K+Q0cv0UjDQ4bF26eTvVtBSMNDhqazr/aR5JCGhwxLl65a58kMaXjIsHTr3kPrQJkgDQ8Zmp69tI8kx9LwoGHp7dlHFL++/ayEQf8BAwGVGh4ysky2gYr/oMGiBPgEWgmDIUODAJUaHjKyTLaBzrDh4nPESMFKGIwaDams4W2MLJNvUEPwmLFWwmDc+AmAqtuhcgMhMCTUShgEhU0EVN0OlRtMTBwDUvOQcYfUPGS8ITUPGal0/U0NpOYhI5Wut02aHD5l6jTmeKTmISOVrq9NnxExc9bsOczpSM1DZhRz580XhMioBcyFpOYhM4iFi9J/Ri9mLiQ1D5kxLIlamv5Ytpy5ktQ8ZAaxQvzbrWSvJDUPGYAOJ8oq8f9uNXs6S81DBuS3HifKmvC1kevWR7CHIzUPGZDfupwtGzaGR2/arGI6S81DZn9+ZwEa8jsLMPPbJJsSE0sz3sTG0IwzW7ZuUzbjyl1lwwdsVzbDyl1maezYqTRc4K7dymZUucttT9ze+H1K0yXs96CY4Rw4eOjwkaOKr48dp5nhnDh56rTy2+AzZylmPOfOX7h4SfHt5cQkimUBV65ei78ep/Dyxk2ageh+oty6fQf+TXd97lHMsHK3OlGE+/B0Dx7SzLhylxmFR49pZpa7BsxyN8lW2LS565MQm0VPn4XZWBrJKShT+AoN2zZ/nvjCZtXLV69tTBBSknEGf4WCpc3tuDfzJvUt0rBIbW7PvZl377GGxNLmdtybSfL7gDQsWtrc+2MbpGHR0uafPmMNiZY29//yFWlYtLT5t++hSMPCaHMqP35iDYm8zdVel5H4lfobaVjkba72uoxEgi/WsMjbXO11GYk/f7GmAbXXZfig9rqMwfwD2g/LWc7+TUQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.383;4.blob,1.1,656.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAPCAMAAABwQrvkAAAA4VBMVEUMBQX1Y2NKHh4AAABHRx1/fzSkQkKoRERGHBz2Y2MOBgYeHgyYmD4QEAcDAQHmXV1jKChWViNxcS6LODjBTk4CAgGMjDk4OBctEhL+Z2cfDQ0tLRKSkjsHBwPQVFR8MjJlZSliYihyLi7ZWFgJCQSUlDwpKREYCgr8ZmY3FhY8PBiJiTcBAQC3SkqVPDx0dC9TUyJZJCTsX18GAgIUFAgaGgtUIiKZPj4FAgIJBATyYmJQICBLSx58fDJWIyOYPj4CAQGcPz+qRUWAgDRDQxtnKiqCNTWSOztCGxsyFBQBAABVZ0sJAAAAxElEQVRIid2SxQ6DUBBFXztQpe7u7l6q1OX/P6hAw6P7IZmUszqzOzcZxhxO+HME0TAGLjdliRWIgmEMPF4fZQoevxQwlEEwFKZswROJcmUAsThhCp5EMsVdXZPOZAlj0OTyBe7qGiiW6FrwlCuma2uqNaIQK6g3muahrWm1O2QxaLq9vnloa2AwpGrBMxr/HPqayXRG1IJmLi0MXa7W+hp5s6XrwbHbcz0cFX0NnM5UNVguV663+/fTbIH8eNpojfJ6wwehzy5/kZYgAgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.422,3.400;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAAhkAAAASCAMAAADBnDxTAAACu1BMVEUAAAAODgYHBwMyMhR8fDIJCQRHHR1/NDQMDAX19WNKSh53dzDU1FaTkzwsLBIMBQX1Y2NKHh4gICD///8bGxthYSdpaSukpEKoqERiYihlZSmkQkKoREQTExMNDQUeDAyYPj4QBwdGRhz29mP9/WYbGwsqKhGUlDwICANGHBz2Y2MOBgYiIiIFBQVeXiZxcS5WIyNxLi4DAwHm5l1jYyiQkDq8vEwCAgGKijg7OxgDAQHmXV1jKCgsEhJtLCwjIyP39/crKxKZmT4CAQGMOTk4FxeLizjBwU4EBALp6V5TUyJ0dC+LODjBTk43FhZ+MzOZPj54MTE0NBUDAQMFAgUBAAEtEhKSOzsHAwMtLRL+/mcfHw1LSx709GMLCwSYmD4TEwj+Z2cfDQ0FAgJBGhqGNjaVPDxiKCgiDg5MTB9iKGKZPpkyFDJlKSnQ0FSpqUSjo0J9fTPQVFR8MjJkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBAoJBASUPDwpERFyci7Z2VgPDwb392RFRRxERByCgjVyLi7ZWFgwExODNTWROztZJCQcCwt/fzM8GBiJNzcBAAAYGAr8/GY3NxZkZCjk5FyXlz0hIQ0YCgr8ZmYyFBR6MTF3MDCFhTZSUiF0Ly9TIiK3t0qVlTzCwk5ubiwDAwi3SkooEBBwLS2VlT1BQRoUCAgaCwvs7F8GBgI1NRaOjjkEBAEDAwc5OY46Oo8EBArsX18GAgIiIlQ+PpkCAgUbCwsaGgsdHQxLHh7y8mJQUCB9fTLOzlMFBQKRkTswMBMCAgQ0NIE1NYPyYmJQICAjI1Y+PpgBAQJDQxsBAQCANDRDGxucnD+qqkXIyFH//2dgYCfW1lZwcC1mZimcPz+qRUUqKmc1NYJ6ejIoKBAEBAk7O5IbG0KJiTgUFDIAAAEZGQopKRHBubDgAAACoElEQVRogWNgGAWjAAgYmQbaBaNgcAJmFlYsomzsdHcIsYCDk4uQEm4eFC4TLx/NXIMP8AsIDoi9lAEhYREoS1QMizQ7Gz0dQxoQlyCkgocblS8pRSu34AfSMgNjL0VASFgWypLDkqPkFRTp6xxSgJIyI34FzCqqqAJq6hq0cw4eoKmlPSD2UgR0hHVhTD19DFkDQ7o6hjRgZGyCX4GpGZqAuYUlzVyDD1hZ2wyIveQBWzswZe8AF3F0Qs+Dzi6u9HMQ6cDNHa+0h6ceupCXN80cgxf4+A6MvaQDZz//gEB0QQ2nIBAVHAIGoUBmWHgE3Z1GAoiMisYnHRMbhy6kGp9AM9fgA2GJSQNiL6kgOSU1LT0DU9wtE0RmZYNBDpCZm05nl5EI8ljwyeYXYIoVEuzP0AYUFQ+MvSSCktKycmziFZUgsqoaDGoYGGrr6unrMFJBQyMeyabmFkzB1jaaOQYvaO8YGHtJBJ1d3T29WMT7wPUyojbpnzCRzi4jEUyaPAW35NRp5piCjNNn0M45eMDMWX4DYi+pYOLsOQFzMZ06bz6IRNQmCxbS3WUkgkWLccstscAmurSSRk5Ztgwfi2F5Gj7ZwQRWrAxHFzJftRpEwWuTNQpr6e8u0kDluvW4pGZEYR3w3LBxE01csnnL1m24WQwMPdt34JTduWs3TdxELtiDLrDXaR8Kf//gbzWxHjgIJNdrgIERMovh0GGsOo4cPUYTlxw/cXIzbhawzXbqNE7ZM2fP0cRNVAPnLS6g8C9eGiCHkAAuXwESV6+BwXVkFsONm9h16N2ip/sQ4PYdnFJ379HRHeSA+zED7QIywYMgMEhAZg0h8PDR44F2An5w7MnATCqMeHDu6bOBdgJe8NzixUA7YRQMSvAgEk0AAHACuN6nMzG+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.421;4.blob,1.1,1236.iVBORw0KGgoAAAANSUhEUgAAARQAAAANCAMAAABfAGGsAAAB1FBMVEUHAweTPJMsEiwAAAAdHUc0NH8ICBM+PpkHBxADAwc8PJMSEiwFDAVj9WMeSh4sEhKVPT0yFBRiKGJlKWUFBQsoKGIpKWVCpEJEqEQvExOJNzcOBgYqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwgcRhxj9mMGDgYCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDsBAwFd5l0oYyhTIlN0L3Q5OYwXFzgiIlMvL3QBAAA4izhOwU4bCxuYPpgTCBMSEi07O5ILCxsCAQGUPDz1Y2PlXFxpKiqQOjoYCgoSLRJn/mcNHw19M31KHkozM30eHkpaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARU0FQyfDJEHESCNYIEBAkRESkcHEQ1NYJmKSlgJyfWVlb/Z2f7ZWUuci5Y2VgOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSEnEBAQBgYKGApm/GYWNxZuLG5ZJFksLG4kJFlKt0o8lTw1FjWOOY4EAQQLCxoWFjU5OY4BAQQkWSRf7F8CBgIFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzAECQRi8mIgUCBeJl5mKWY0NIAbG0MmJl4pKWY/nD9FqkUIo5BCAAABhklEQVRIiWNgYGRiJgBYWMEUGzsHIZUkAE4ubiqaRhng4eWDs/kFBJkZmIWECelhZQFTbOwi1HSJqBg1TaMMiEsg2JJS0gzMMrJy+HXIK0BSiCK7EjUdoqyiSk3jKAJq6hrIXAZmTS1t/Dp0dCG0ngpVHaJvYEhV8ygBRsYmyFwGZmZTM7wa9M0taOMSSysowxouZI1dJe2BjS0yDxgodvYO+NQ7OnHSxiHOCmwgysXVzd0DSHt6IVi0sRAP8PbxReIBA4XZzx+fejFRWrkkIBBEBgWHhIaFR0RGRSNYtLIRN4iJReKAAiUuHo/qBJVEWjkkKRlEpqQCS/y09IxUJBb9QWYWEgcUKNk5ubhV5+UX0MohhUXFMKZ1SSkGi66grLwCwQEFCnNlFW7VVpa0c0l1De3MJhXU1iHY4ECpb2jEpVZRoYl2DmluaaWd4SSCtvYOOBscKJ1d3bjU9vTS0CF9/RNoaDppYOKkyXA2OFCYp0zFpXbadFq6ZMZMWppOGpg1G84EAOAHYnD01MjfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.672,3.438;4.blob,1.1,2328.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.481;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAABIAAAAcCAMAAABbGh8VAAAA/FBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4OBgY0NIExMXkHBxILBATsX1/vYWEQBgYtLW9jY/ZjY/U8PJQPDyQHAwPXV1fbWFgGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgQxL+18AAAAoElEQVQokWNgQABGJmYWVjYkAQZ2Dk4ubh5eZCE+fgEGBkEhYSQhEVEQKSaOEJEQkgRRUtJIqmQgqmSRhOQgZskjCSkwKwoqKXMi28igosospqbOMGSBhgaI1NTShovo6OrpAykDQyNjE6iQqZm5Doi2sLSytrFFN8LO3sERRcDJ2cXVzR1JwMPTy9vHF0WNn39AIJojgoIR0lBHIAOIIwDT2BB81b1Z7QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAq0lEQVQ4je3RVw6CQBSF4QErooNiL2AFK9gL9rL/Pflm/E1IXADn7bt3MpmcEeITRRVILJ7gIJmi01qGAz1L56QCGzLPAwWTLpbosk5XqmCt3oCbsgVbdhvudMFe3/jmwHawdociJCNyPAGd6QyP9CysfY09zxe8bbkC19KHN9KFt3IH7yU/5RAcef/pp2PTo8/BhYPrjS2q9wcPPF/i30TNISHNRS0h3y29AXKIGegUBPVDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492320748;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,1.0,3.342,3.410,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,1.0,3.361,3.390,2.38,2.14,1.1,1.0,3.342;4.copy,1.1,3.450,3.361,3.130,2.19,2.14,1.1,3.450,3.342;4.copy,1.1,3.390,3.380,2.10,2.19,2.14,1.1,3.390,3.361;4.copy,1.1,3.460,3.380,3.110,2.19,2.14,1.1,3.460,3.361;4.copy,1.1,3.840,3.418,3.120,2.19,2.14,1.1,3.820,3.418;4.rect,1.1,3.294,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.344,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.394,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.383,3.117,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.421,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.421,2.19,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.444,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.573,1.6,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.271,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.240,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.326;4.blob,1.1,4044.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.383;4.blob,1.1,648.iVBORw0KGgoAAAANSUhEUgAAAKUAAAAPCAMAAACycv9gAAAA4VBMVEUMBQX1Y2NKHh4AAABHRx1/fzSkQkKoRERGHBz2Y2MOBgYeHgyYmD4QEAcDAQHmXV1jKChWViNxcS6LODjBTk4CAgGMjDk4OBctEhL+Z2cfDQ0tLRKSkjsHBwPQVFR8MjJlZSliYihyLi7ZWFgJCQSUlDwpKREYCgr8ZmY3FhY8PBiJiTcBAQC3SkqVPDx0dC9TUyJZJCTsX18GAgIUFAgaGgtUIiKZPj4FAgIJBATyYmJQICBLSx58fDJWIyOYPj4CAQGcPz+qRUWAgDRDQxtnKiqCNTWSOztCGxsyFBQBAABVZ0sJAAAAwElEQVRIidXRxRLCUAyF4Qtp0eLu7u4ULS7v/0C0ZXrLgrBN+Vcnu28mjNnsYNEE0VgMHE5Kya9EwVgMXG4PJQXPK/mMycAfCFJa8EJhPhlAJEpIwYvFE3yrymQqTYhBy2RzfKtKyBfoLHjFkrk1ZblCBPlVtVY3D03ZaLbIMGjtTtc8NCX0+lQWvMHw49CVo/GEyII2lWbGnC+WulJerek839ts+dztFV0JhyOVBut05vNyfX/c0sm3+x8olccTXm3fJ3c4yGmXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.400;4.blob,1.1,2212.iVBORw0KGgoAAAANSUhEUgAAAgQAAAASCAIAAACrcFFuAAAABmJLR0QA/wD/AP+gvaeTAAAGMElEQVR4nO3cT0wTWRgA8Dcz7VBokQLdFqG1QGgpbA1KYVsMQZO1kWjSZONiQrTFxERPJCbGmHjQzcbLcnAPXpbEU0UORgPxwMWA3gRdalWiboEWCdMIzACWFgulnT2ArNRSWmaGP5vvlznAvHnfe00nfX3fvD4CAQAA2IP27SMRQtEoy0s0nJcoAAAAtllZ2b6rV6syM0W8RFs3GJzQaG7W1PASF/BFJhOHQhdOnjwgdEPXrh0aGjqT4sUZGcSdO/VGY56gXQLCkYnFoQsXTh4Q/L4CHBUXF7MsW1RU9H2Ry0VTVOj8+XJeGlo3GFhUqv7JSV7iAr4Eg5GuLp/DoRe6Ibtdf++eJ8WLFxejr17RdXUqQbsEhBOMRLp8Pode8PsK8CIcDic8//Cht7Iyl5evZf8NBgdksv1ZWQNTU9yDAn45nR6bTbuSHxRIdbWiokLe0TGcepX+/smqqnyJhBCuV0BQTo/HptXuIwW8rwB3OI4jhAKBQMLS+fnIy5dTVquah4bW/rKoVP/Mzc0tLnIPCvjV20vNzS01NZUK14TDoX/61E9RodSrfPgwt7CwbDL9IFyvgKB6KWpuaampVMD7CqTFmJfXajTGncQwLBwORyKRjWoNDtIGg5zLl0VjnrHV2Lo6GOAY9pNS+RxyRLtSNMrevz8sXKZIJMKbm8uczlRzRCtiMXZgYAoyRXtXlGXvDw9DpmjH4RhmVipvmEytRqNULI4rHR0dzczMTFJ9dPQzQkivz/n2JIERYlwcd2AIW98ublaab5hutBpbpWLp6mPoH3NzSRx/RdM8vDIgAKfTc+VKlVab/fHjPO/BT5xQS6XiR4+86Vbs75+0WtX5+RKGSZzQBLuc0+O5UlWlzc7+OM//fQU2Jcbx+oICq1qdQ5KDNN0xPOzdIB2URDgcDQSWCgqyvj3ZUt5iVprjrmx/1+6iXQghMS6uL6i3qq05ZM4gPdgx3OENeFcHA4tK5WaYxWh0qy8KCOvt25k3bxi7XXfrlov34A6HvqvLFwotp1uRokIUFTKblT0947z3CmyDtzMzbxjGrtPdcvF/X4FNtZSXmxSKnvHxPr8/tHEiaFMLC8vZ2eumFI/HHvdSvXGXTX+Z/tpui0lh6hnv6fP3hSKryWEcIZQpElXl50OOaJdzOj12O/8z+pwc0mYrTjdHtOb580mLBTJFe5jT47FDpmiH/D01RYfDx9Vqm1arlkq3HCcWY8XidUtDZxdn/SF/3PFl+cvXdv+mw/Rx9XGb1qaWrj58FiGETApFKBL5MDu75a6AbdDZOdLWZjGblQMDfK74amoqZZhwby+1teovXkydPl1SUpLt80GeYU/qHBlps1jMSiWsJNx+boZ5zTCHFYpGjeZYYaE3EHjm92/hjSBJIhhcN7FIniZyM+7XzOvDisONmsZjhce8Ae8z/zMRQsiiUr2YnubnF81AMJ8+LTx5MuFw6PkdDBwOfWfnSCy2xfc/EFh6/37WYlHBYCAogpAghKLRxM9muJR+Wlh4MjHh0OsTfgZxiQxSwSLkomkXTRvk8kaN5qxOl+5ggOOYXJ4xO7tuIWjyNBFCiEWsi3a5aJdBbmjUNJ7VnUUKieSvhoZCDjMUsG2am8touoUkedtEpKQkOxa7xPEXK7W1ytu360QibPNLwZYQREZd3e0jR/4UibL4LV3RXFZGt7SQePx9xSVyaemvDQ3tOB6/NgYkV5T+R3FhobS9vUGjkXFrtwg3K5UTwaA/lMYCc7BTurvHSJL4dmsKksQlEiLuIAgslVKE0LlzOrebHhqa4dIrt5smCBy2phAOy0YjkflIJMiyCZZ4cCld0T02RhLE91tTcImMYThCbJJGQUJU+h/FFRXyz5+XJiaC3Nql0G81NT8n2vUC7E537x598MC69m9//y8seynuWNurJHkpQujduzOXLx/k3iuHQ3/xYgX3OGCn3D169IHVuvl1KausvFRb+zuPAcFGrl+vPnWKhz2mYGq/txkMcpksfibu882vLPxPXgqAQESiTLP5j7Gxborq2+m+/M8dOpTf3Ky7efNlOAyTMADALoNhuEJRDd81hbZ/f1Zbm6WiInenOwIAAGDnGAzygwd5e1b3L27MpCYwilP1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.421;4.blob,1.1,3060.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.480;4.blob,1.1,776.iVBORw0KGgoAAAANSUhEUgAAABwAAAAoCAMAAADaOGodAAABKVBMVEUAAAAOBgY3NzfBwcH39/fp6emTk5MMDAwLBATsX1/vYWEQBgYnJyf29va4uLhISEhiYmLu7u61tbUHAwPXV1fbWFiqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg40NIExMXkHBxItLW9jY/ZjY/U8PJQPDyQGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgQBAQECAgI0NDQ+Pj4REREKCgoGBgYgDQ3/Z2cbCwsTCAgiDg4FAgIjDg73ZGQYoWuoAAAA2ElEQVQ4jWNgwA4YGdEEmJhZWNnYwUwOTi5uFDkeXj5+AUEhMFtYRJQDRVJMXIKBQVJKGqs1MrIgUk4em5yClCKIUlLGqlMFolMVq6QaxE51rF7RYNGU1NLmw+4VBh1dFjk9fexeGQUQgAhRCMvA0AguhwhRKMvYxNTMHCqJCFEYy8LSytrGFrdVdvYOjjiknJxdXN3csUp5eHp5+/ji0OfnHxCI0ytBwQiFGF5BBpheGWAQEhqKWzIsPDwCp2RkBB5JhiiYZHRMLD7JONyS8TEJuCUTk0AkAEldHK0Nc66JAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.661,3.513;4.blob,1.1,4392.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492320854;4.copy,1.1,3.470,3.342,3.490,2.19,2.14,1.1,3.460,3.342;4.copy,1.1,3.480,3.361,3.480,2.19,2.14,1.1,3.470,3.361;4.copy,1.1,3.800,3.380,3.160,2.19,2.14,1.1,3.780,3.380;4.copy,1.1,3.840,3.399,3.120,2.19,2.14,1.1,3.820,3.399;4.copy,1.1,3.850,3.418,3.110,2.19,2.14,1.1,3.830,3.418;4.rect,1.1,3.304,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.354,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.404,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.281,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.250,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.613,3.259;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.442,3.381;4.blob,1.1,3664.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.702,3.438;4.blob,1.1,1684.iVBORw0KGgoAAAANSUhEUgAAAIkAAAAiCAMAAABcIQrWAAACmlBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0MnHDarAAACEElEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7d9EEANUYdmC/QMIbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.742,3.469;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAANYAAAAoCAMAAAC1pfR1AAACZ1BMVEUAAAAIFBQ+mJgLGhoICBQ+PpgLCxqMOTn/Z2cIAwMeS0syfHweHksyMnyQOjr+Z2cEAgI0gIAbQ0M0NIAbG0OsRUXYV1cPBgbzYmJuLCxUIiIBAAASEiw9PZUUFDIODiI7O5IaGkEuLnEICBM+PpkHBxAdR0c0f38TEy83N4kGBg45OY0sLGsFBQsODiM2NoUbG0IoKGQBAQMMHh4HEBAOBgYlJVwJCRU8PJQjVlYucXE3NzfBwcH39/fp6emTk5MMDAwLBATsX1/vYWEQBgYBAgI5jIwXODgnJyf29va4uLhISEhiYmLu7u61tbUHAwPXV1fbWFgSLS07kpIDBweqqqra2toEBARHR0f///9BQUEpZWUoYmL09PSEhITr6+uMjIwECQk8lJQRKSkJCQlsbGzR0dGgoKAYPDw3iYkAAQH19fWNjY0vdHQiU1Otra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5HRx1/fzQHBwOTkzwsLBJiYihlZSkeHgyYmD4QEAcqKhGUlDwICANWViNxcS4CAgGKijg7Oxg0NIExMXkHBxKMjDk4OBdTUyJ0dC8tLW9jY/ZjY/UPDyQtLRKSkjsbGwsTEwgGBg8qKmlSUstmZv1HR7AZGT59fTNKSh4TEy5KSrdnZ/8dHUgJCQQpKRFERByCgjUFBQxRUchlZftERKgLCxs8PBiJiTcBAQAODgaXlz0hIQ0SEi0/P5tiYvNhYfEMDB5ubixZWSQ/P5xaWuAuLnIUFAgaGgs1NRaOjjkEBAEQECcCAgRLSx58fDIFBQKRkTswMBMBAQECAgKO2gkYAAACT0lEQVRogWNgoAAwMjFjiLGwslFiJDUAOwcnRfq5uDHFeHgpMpIagI9fgCL9gkKYYsIiFBlJDSAqNtAuoAUQl5AcaCfQAghISQ+0E0bBKBjGQEZWDsKQV2BQVIIwlVVUcYuBgJo6mhiK7KAAGppaYFpem0FRByKkrKLLgFMMBNTV0MRQZAcV0NNnMDCEMFlUjHCLAYExkwmaGLLsAAFTU0wWEOjxMoiYQZjmFnjEgMDSCl0MWZaOwNrG1s7eAcx0dHJ2YYCxyDLM1c2dSs6iEHh4enn7+PqB2f4BgY4MMBZZpgUFh1DLYZSB0LBwBoaIyCjqmBYdQx1zKAaxcSAyPoEqhiUmJVPFHIpBSmQqiEpLp4ppGZlZVDGHcpANia0cqhiWm0cVY6gA8iF5qwDMwVHAEwuwdfUHCBTaFkUUl3iB2ZQW8Ni6+gMFSsts48srwExKC3hsXf1RMApGwSgYBUMGVFaRpa26ppbKDqEuqKokT19dPXXdQV3Q0NhEnsbmllbquoQAwNYSxN0mbGsn05qOzi4ydRINunt64WyUliDBNmFHXz+5lk6YSK5OYsGkyVMspkLZKC1Bgm3CadOrybV0RuNMcrUSC2bNnjN33nwyNNbXkW/pgoXk6yUaLFq8ZCnJmpa1LCffxhUryddLJFhluHrN2nUka1u/YSP5dm7avIV8zcSArdu279DeSYbGiRMosXbXbkp0EwZ79u7TgnNIKOD3Nx6gxNqDhw5Top0gOHIUwSalgD92nCJrT5w8hUPm9BkwOE3IBGLV4SzgAaPqhjwwxH9MAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.943,3.513;4.blob,1.1,160.iVBORw0KGgoAAAANSUhEUgAAAAQAAAASBAMAAACOUGLLAAAAG1BMVEUAAAAgDQ3/Z2cbCwsTCAgiDg4FAgIjDg73ZGS4qB9CAAAAGElEQVQImWNggAEhAwYhB4agBIYKBoIAAEK0Ab/GFVFYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492320955;4.copy,1.1,3.480,3.342,3.480,2.19,2.14,1.1,3.470,3.342;4.copy,1.1,3.490,3.361,3.470,2.19,2.14,1.1,3.480,3.361;4.copy,1.1,3.810,3.380,3.150,2.19,2.14,1.1,3.800,3.380;4.copy,1.1,3.850,3.399,3.110,2.19,2.14,1.1,3.840,3.399;4.rect,1.1,3.314,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.364,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.414,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.291,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.260,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.613,3.240;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.326;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAACRUlEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKIGDQAA9kmjoeeTPAAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.452,3.381;4.blob,1.1,2880.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.421;4.blob,1.1,1288.iVBORw0KGgoAAAANSUhEUgAAAVEAAAANCAMAAAAnk61IAAAB7FBMVEUMDAX19WNKSh4AAAAHAweTPJMsEiwdHUc0NH8ICBM+PpkHBxADAwc8PJMSEiwFDAVj9WMeSh4sEhKVPT0yFBSkpEKoqERiKGJlKWUFBQsoKGIpKWVCpEJEqEQvExOJNzcOBgZGRhz29mMODgYqESqUPJQIAwgMDB4+PpgICBQBAQMRESo8PJQDAwgcRhxj9mMGDgYDAwHm5l1jYygCAQKKOIo7GDsjI1YuLnEJCRUBAQI4OIoYGDsBAwFd5l0oYyiLizjBwU5TIlN0L3Q5OYwXFzgiIlMvL3Q4izhOwU4tLRL+/mcfHw0bCxuYPpgTCBMSEi07O5ILCxsSLRJn/mcNHw3Q0FR8fDJ9M31KHkozM30eHkpU0FQyfDJyci7Z2VhEHESCNYIEBAkRESkcHEQ1NYIuci5Y2VgYGAr8/GY3NxYOBg6XPZchDSEYGDw3N4kAAAEGBg49PZcNDSEKGApm/GYWNxa3t0qVlTxuLG5ZJFksLG4kJFlKt0o8lTxZWSTs7F8GBgI1FjWOOY4EAQQLCxoWFjU5OY4BAQQkWSRf7F8CBgIJCQTy8mJQUCAFAgWRO5EwEzAeHksyMnwCAgU7O5ETEzAECQRi8mIgUCCcnD+qqkVeJl5mKWY0NIAbG0MmJl4pKWY/nD9FqkWjadTrAAABlUlEQVRYhc2SRW/DUBCE3b5CkjIzU9KmzClTUmZmZmZmZmbuH23iSLVzsPMOu1Ln8jzaT5rRyAxjYkr+s8zMLYwhlhL2kcqsAHOtbWypODt7h79vRydnQhji4grYA0Fu7sYIiSX7SGUekLmeXnSctw/37evnr100IDAIsgi4gkNCxYEwuf7fVMjCIXMjlJFUXFR0jIFnSGxcPGQRcCUkJokDySn6N1UJmqtKS6fiMjKzDDxDSHYOaBNw5eaJnlX5BTi5ag0dV1hkYLWLFpeUIvSBU1l5hdi5ssoaJ7daLqXiamrr+Fa7KKlvwCgEp8YmsauXJ1Zucwsd19rGd7pF2zsQ6gCqs0vk2K3swcrt7aPj+gf4Trfo4NAwQh84jYyOCR/HJyaxcqemZ6i42bl5ntMtShYWMQrBaWlZ+KZR4+WurNJxa+s8wy66sbmF0AdO2zu7QieFfA8vd//gkIo7Oj7hDLvo6dk5SiMoXVxeCZ2ubxBzb+/uqbiHxyfOsIuS5xeMQnB6fRO6vH9g5n5+0XHfP9z3L4FZZ4U0aLbPAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.438;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAIkAAAA1CAMAAABC8jj1AAACxFBMVEUAAAAWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8QEAYjIw5VVSJzcy4BAQB7ezJQUCAMDAVJSR5HHUd/NH8DAwc8PJMSEiwdR0c0f38dHUc0NH8oKGIpKWUeDB4RESoDAwgMHh4+mJgHEBA+PpgHBxBWI1ZxLnEBAQI4OIoYGDsjVlYucXEjI1YuLnGMOYw4FzgiIlMvL3QBAgI5jIwXODg5OYwXFzgtEi0ICBMSLS07kpIDBwc7O5IzM30eHkopZWUoYmIpESkcHEQ1NYIECQk8lJQRKSkEBAkRESmJN4k9PZcNDSEYPDw3iYkAAQEYGDw3N4kAAAF0L3RTIlMsLG4kJFkvdHQiU1MaCxoWFjU5OY4BAQQIFBQLGhoICBQLCxpLHkt8MnwCAgU7O5ETEzAeS0syfHweHksyMnyANIAmJl4pKWY0gIAbQ0M0NIAbG0M9PZUUFDIODiIaGkE+PpkTEy8sLGsFBQsODiM2NoUbG0IBAQMlJVwJCRUejVUDAAACp0lEQVRYhWNgoAFgpIWh5AAm5oF2ARSwsLLhlmTn4KSbQ7i4efDIsnPw0s0lfPwCeGQFOYQImiAsIkoVl4iJ45OVkEQXkZKWQRORlZNXUASzlJTBQIU8l6iqkaZeXUNTSxtVSEdXT9/AEMgwMgYDE7IcYmrGR6IOcwtLK2sbNEFbO2N7BgYHRzBwIsslzmYupGtydXP3QOZ7enn7+PpRGDv+ZgGkagkMCg4JDUPwwyMio6JjQCyKYifWLI40DfEJiUnJKcgiqWnpGRAWRbGTmZVNmoac3Lx8VJGCQrJsxgBFxaSpLymljr2YoIybViaTCsqzKgbaCTBQWVU90E6AAoGa2oF2AgzU1Q+0C0YBTUBDIw6JpuYWatnR2oYp1t6BLtLYgEt/Zxe1XNLWiinW0Y4m0K3vh0t/j1YvdRzS1z8BQyxl4iQ0kclTcBowddp06rhkxkxMsVmz0QQK58zFbcK8+VRxyIKFizDEpi5egiayNNITtxFhE5dRwyXLV6zEEItf1YQm4muEz4zVa6jhkrXrMMW6OtEEdOTW4zNjw0YqOGTT5i0YYlu1tqGJeG3H22DN37GTcpfs2r0HQ2zvvv1oIgcO4jfl0GHKXXLkKKbY/HloAg76x/CbcvzESUodcqr/NIbYmYln0UTOnSdgzIWLlyh1yeUrmGJXr6GLXJclZM6Nm5S65NZtTLE7dyk1dRSMglFAImi5dx/CeLCK4SG0ZbHs0STcYiAAbTMixFBkyQWP90H69A+SGR4+gZn7lAGnGAhA24wIMRRZSsGz5wwvgiDMM49e4hZjQLQZEWLIspS75BrD3VcQ5mstPGIMiDYjQgxZlo4AW5txYAC2NuPAAGxtxgEB2NqMAwOwtRkHBmBrMw4IwNZmHBiArc04MABbmxEPAACNtMoqA0nAewAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.513;4.blob,1.1,4572.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;3.end,1.1;4.sync,10.6492321057;4.copy,1.1,3.490,3.342,3.470,2.19,2.14,1.1,3.480,3.342;4.copy,1.1,3.500,3.361,3.460,2.19,2.14,1.1,3.490,3.361;4.copy,1.1,3.840,3.380,3.120,2.19,2.14,1.1,3.820,3.380;4.rect,1.1,3.324,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.374,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.424,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.301,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.270,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.613,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.326;4.blob,1.1,3972.iVBORw0KGgoAAAANSUhEUgAAAKgAAABJCAIAAAAmMfrEAAAABmJLR0QA/wD/AP+gvaeTAAALWElEQVR4nO2ce1BTVx7HT24eJCSQAJcE8uQRAtFQniGoGbdaNAqWweliG0dCR9fln63ttJ1xdtodZ9v+0el07MN1LE7/6OJjp1ZXx+2oHUtphRV10FKrlYfEx0IwLx6RkHfu/hEbQkDM4yY30fuZO8Nw7j2/8x1+3HPP43d+AMQMMoOxw2oV1tfHrgmciCHGzrTX6cxYtgyuqNAePx67VnASEf769TtmZynp6VgLwYkvBCKxRacr2bEDayE4wUAxtY54PMNHjkg0mpi2gpOIZJaWtnm9aSIR1kJw5hHDwZ0Pm8GQv3kzRCaPX7gQ67ZwEovn3nzzlcFBrFXgxJ3UnJw/u91shQJrIThzxLyrBwC4ZmY4K1YwhML7Z87EoTmcBEKsVreaTBCFgrUQnPhCotG2Wyx5TU1YC8F5RDy6egCA1+1OLyxkV1drv/kmPi3i4ODg4ODg4ODg4ODghIpAJajeUx3iw8QUonKfMlOWGVNJCUt5+e4tW25gKADN/XhOLUd/SR/iwx6Hx/SzibOCg6KAJEIiaRkaOoShANQczxAyUnNTDZcNoVfRX9JnlWURqXFaREocYLiSxZIODx/GUANqjufUcqYGpxxTjtCrTA1MuWfd2VXZaGlIFiQSjU7XZbWOYagBHccTIAK7hq3vDbWf94F4EcNlw7PW20MQSSxWDw11YCwDFSsZyzMgCmT62RRuRf0lPVPMpGZRUZGRFPD5KjKZrtWewFYGOo7n1HLM/WaPwxNuReuY1TpmZSvYqMhICiQSzZ07J91uK7YyUHA8iUbKKssKt5/3o+/Vc2qfld6eQmHm5TVi3s8DVBwPV8Euq2tyYDKy6oYrBmo2NS0/LXoliU9BQbPdbh4b68RaCBqO59RyjFeMAImwutPinLw1+Yy89BKJ5vbtowjixVpI1I6nwlSmmBlxP+/D0GvIlmcTSIQoxSQ4aWn5ubnKROjnQfSOZyvYM6MzVl1UQxVTvwkiQk/98m1R0TaTqX9iAsuVWj9RO14e9vR9IV6X13jVyK55ysf2iTB9x8HBwcHBwcFBCTabhrUEnDlimxjBz/r1/FdfLY5PWziJglSa8cknK2F4kS24vLw8BEF4PF78VcWa3bvLb9zYgoopBoNste6orxdGb0qlEuzZUw3i8MZDEGHrVvG3394zmeyPe8Zuf+yt5KWlRXLo0BAqpmZmXCdP3tFoJNGbqq3lXLqkB3FwfFlZFouV0tPzYNG7EAQBACwWS6xlxJnKSlgqZR0+PIyWwY6OocZGUXp6VMeNhUJGbm7q5csGAAD0oujFjYKNdBIdJYXB1NSwb92adDxmq55AINjtdpfLFVReXf33ioq/pqQk6yKuRiPp6tKNjaG26d7ZOTY15WxuLojGSG0tZ3BwamrKAQCAZt2zDaKGD2s/VIvVbFrwoimRQCRD5KCLAMLYTSkqYo6MPPaFHhkZodEWGe07HBOVlX/btu1/SuU/mExx6M0lAiQSpFaLOzrQ6ed9eDzIkSPD0fT2EESoqWH3/r6+Tuoc67yov1jDrlnFWfWe/L3r5uvnR88PTz/qo1qLWxXs4BQm7b+1XzNdC6UxOp2clkY2GGzhqvz1188GB78Si7eWlGx/+eXBe/f+c/363vHx5EifpFLx6XTyiRPawEIIIlAo8z6sHg/icnlDueujo2PorbfKRKK0e/ceRqBq+fIMCgX6edHwOD6dv0u2q311+/LM5b4SmAqL0kRBVyopNcTGOBxae/vqkhJWBEL9ZGU9V19/tq0NEQg2RGMnbnz9dd2hQ2uDCjdtEiFIW+B16pQqxLt++vv/+O67lZGp2rlTun17if9Xku9HCjFFni1X5ipFDFGfsW/s98jfScfktHM6yITb6w6xMTIZAgB4PBEGaZDJjMLCV6TSP8Fw1cjI1xMTv0ZmJ54wmZTGxrzGxnNB5d3d43L5vwNLJicdId7109Ex1Na27IMPQupuA6HRSGVlWfv33/SXkHh03lreWnm2HAFIz3jPwd8OTjgm/Lej7OqtVjcAICUl7CMTmZmlpaW7CgtfQRDvwMCX589vmZm5H64RTGhuLjCb7Z2dwTHz09POvj7j42otfdfP0aO3P/qoVqFgXw7n4AoAoKoKtlpdAwHhcaQXeC+UsEpO3zvdM95j9wTPp0/fPd25IEDMaHuyRB8PHzo9HiQjIyUslQCA0tLXeby6vr49AwNfOp3JNNnTaCRHj972eiONRFuSBw9mz58f1Wgk4Tq+tpZz5YoRCRTFoXEgQgxn87t3l6vVYQ/LWaxiCCLFQk9Myc9P83rbZLEMJVKrxSZTa9BIcGlgmPrFF6u53Hkzdkhv03sjjf0jkAgQGQq6CNC8yd7Nm5PLlmWEa3lqatAb8kgicdi2rai/33TjxsSTH42UU6fuUijEsJZvFQr26OiMbn54XFRvVfnb5QvDogf/Oai/OBeM1dMzXl8vLCxMX2I2/9SgVosPHrwV0yZsNvexYyNbtxadOnU3xCpyObu7ezyoMKrA1tScVOKCgZvdZHdZ563ENTcXCIWMvXuvIzH58OEkKikpxHfeqWxqysNaCE7cYTDIGzeisKuIg4MTFc9cNgoMSc1JRRDE68L+/BSIW+gVDgAgR5nT1NNEYSZ/Cm8UM1eFlTEreVnTsUZ1cpHdl/gT1RuPYuaqsDJmJS+9b/Xy1/MFGwVYC4m6q0clc1UEGbOSFLvRfvtft8veLsNaSNSORyVzVQQZsxKBTFmm7DVZYIlCofjpp59sNpter9+3bx+DwVhYS3tcy1vLo3GwOWUgk2W+9poMRLlkCwIyVz347+LhlE/ElzFLe1z75EcTAwJEyJZnC1QCOo/+8M5cMExxcXFXV9eFCxc2b97M5XI//vjjgoKChoaGoOq+9WzuH7gjx0ZQ0UMkEiAoeAXW7fYGrpNCEEEuz1apBDwe/c6dhyB6xwMA9Jf0/HV8ahbVbo4kSjrijFnxByJDOcoc/jo+hUkxXTUNHx62aOc2IN5///3R0dFNmza53W4AwNjY2Llz59asWdPV1RVoxGlx2vQ2ljSqqKRAWluLFQuyR7W3/3btmgkAQCZDSmXOunV8JpNy9arp8OFhrdYCUHG8P3PV/TORxEpEnDEr/hS3FsNV8P0z93U/6IL2IwAA9fX1n376qc/rAIDvvvvOZDI1NDQEOR4A4Jh00NA7UHb69N2FcR9G46M4x9bW4qoq+MyZ+z/8oLMGaEZnz1vfq89dnRuB430Zs24GhAQlMoY+A0PE4NfxyQzyePe4dXRuo5NGo9Hp9AcP5n3vdDodDMML7XjdXhQTuU5OOqannUGFbvejZaK+PoNIxKir4zMY5O7u8dHfNaPjeMMVQ/5L+Wn5aYHfvFCIMmNWnDH3m82/mOEKWLBBwH2ea9FadD/qfJMRm802Ozubk5MT+DyXy/3+++8X2iHTyXYjaoeHlu7q+/vNv/xirqiAN2wQPP88V6u1/PijLtwAnqWQ7ZKJw4+0KXu7rOClqA4JYAWrhFX6Rumqz1f5S06cODE0NEQiPXqXVCoVgiB1dXVBFQlEwk7HTtlfZAAlYJgaHActSktNXeSVLilhvfFG6ecBmlGALWev2LsirMxVVJi6+ovVdG6sDvHEATpvTrxUKrXZbGfPnlWpVK2trWaz+dy54FhbAECmLLMNaYMrFvkExAceD9U/OESGVn22Kqs8y1/yxMAsYYOwMtIo8cRk5cqVPT09NpvNaDQeOHAgPT194TOlr5e26FoICyZgcQa1gEZ/5ipzv9lX8sTALLacPb4gJCipuXjxolKpXPqZopaimwduIrEJww2dGP7fhRiY9UyR15Sn3K88Jj3mtASPw3GeWjKkGS26Fv46PtZCcOILby1P2JAo8Wf/B5nwRPEutw9bAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.383;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUVBT9Z7AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.462,3.400;4.blob,1.1,3000.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.742,3.438;4.blob,1.1,4304.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAABFFBMVEUAAAAGDgYDBwMUMhQyfDIECQRj9WMeSh4nYScraStCpEJEqEQFDQU8kzwSLBIcRhxj9mMmXiYucS4BAwFd5l0oYygSKxI+mT44izhOwU4DCAMVNBUSLRJn/mcNHw0fTB9U0FQ0gTQkWSQuci5Y2VgzfzMKGApm/GYWNxY2hTYhUiFKt0o8lTwBAgE9lT0aQRpf7F8CBgILGgsMHQxi8mIgUCAbQxs4ijgAAQA/nD9FqkUyejIeSx4TMBM4iTgKGQoRKREQKBAJFgkwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIFDAUeSR6rfwazAAABGElEQVQ4je2SV08CQRRGLwg2BATLAKLAqlgQC9LsIAp2ECv6//+Hs7O7N/czmvjmC+fhTs7MZpLZHCLG5ydgJBDUc3SMN8Yn9JgMsU+FI0TRaR9vxOJEM7Nz7PNKnyWS7Cm1QJReXOKNREaPbIA9Z+mxvMK+GtMjv7bu+camPQtbrha3d+zF2t1zvKT27SVYrjherdXNenDo+NExPPDkNCX1rNaA42aafuEcNdoCbVxcSi22q3DcCeN/vrrG225uQe9UB/xeNcEfVBe8pyLgj/0nvP/ZQs+00V/6r7jx9l4H9w8q+MHHJ/2Fn/sSmL4Epi+J3ZfE9CUwfUlMX4Lct7ebvgROX4zbF+P2xXh9eQz7omFfkv/v6wtdZyqd0KeRFQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492321162;4.copy,1.1,3.830,3.399,3.130,2.19,2.14,1.1,3.810,3.399;4.rect,1.1,3.334,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.384,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.434,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.311,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.280,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.613,3.202;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.383;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAABkAAAAPCAMAAAAmuJTXAAAA4VBMVEUMBQX1Y2NKHh4AAABHRx1/fzSkQkKoRERGHBz2Y2MOBgYeHgyYmD4QEAcDAQHmXV1jKChWViNxcS6LODjBTk4CAgGMjDk4OBctEhL+Z2cfDQ0tLRKSkjsHBwPQVFR8MjJlZSliYihyLi7ZWFgJCQSUlDwpKREYCgr8ZmY3FhY8PBiJiTcBAQC3SkqVPDx0dC9TUyJZJCTsX18GAgIUFAgaGgtUIiKZPj4FAgIJBATyYmJQICBLSx58fDJWIyOYPj4CAQGcPz+qRUWAgDRDQxtnKiqCNTWSOztCGxsyFBQBAABVZ0sJAAAAm0lEQVQYlXXM1RLCMBBA0cC2FClQ3Cnu7kWLy/9/EJOGGAx5yObmTIKQyw3CUlR6QuDRRFEVLl6fn0NAD3IJhQ0ukShwgVicVSKZEiWdydLK5QuiQNGkVSqDJJXqJ2r1hizNVptEp9uTBfoDEsMRfMl4MsVjps/p9WK5csRab/DY7tiD/cF2BI4nvJ8vTK438tvPsu6PP2I/X/AGhk4O2wQcJRkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.421;4.blob,1.1,4992.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.641,3.513;4.blob,1.1,2916.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492321263;4.copy,1.1,3.520,3.361,3.440,2.19,2.14,1.1,3.510,3.361;4.rect,1.1,3.344,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.394,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.444,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.421,2.35,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.321,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.290,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.610,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.326;4.blob,1.1,3932.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.383;4.blob,1.1,388.iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAMAAAA1b9QjAAAAgVBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtUIiKZPj4FAgJLSx58fDJWIyOYPj4CAQGAgDRDQxtnKiqCNTUJBASSOztCGxsyFBQBAACokoKKAAAAW0lEQVQYlV3LRxaAIAwEUEDsBXtv2PX+B1QWsphZZPJ+XghRoYxAGAUwuAli2QCO64H4QQgSCYA4SUGyvAApK4CaN//adr2qYdTHaZaqllXLtsP/cV4g8n6++QIcCQOwykDjvAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.482,3.400;4.blob,1.1,3124.iVBORw0KGgoAAAANSUhEUgAAAaAAAAAiCAIAAACWW5ppAAAABmJLR0QA/wD/AP+gvaeTAAAI2klEQVR4nO3dTUwbVx4A8Dcz/gSMDTbjQOwYx0CgdUWIITYVQTkUBfVAFXWzEU0hrXLYy3KqqtySSy+bQ/YQrbTkVLkJh34oqIdcItI02xU2CcZpo0BM+GiEnXgYx8b4e+yZPZBQMI7x4Bnj6b6fOM2bee/vkd5j/jNv3mAAgiCIpepqCQAgk2H2O5BdoPsdAARBwtPUVP3ll+1yuWi/A9nFtgHulF5/ubNzv0LZVFUljkYvfPjhIb4bunjx6OPHfy1wZ6kUu3atx2yu5TUkCCofjY2NDMMcPHhwZ5HLRXq90c8+O1L6qFjZNsDZtFqH379foWyKRKhbt5aGh1v4bmhoqOWbbzwF7pxMZmZmyO5uLa8hQVC5SSQSObd///3iO+/UlPm//D8GuENVVfUVFU6C2MdoNtntnoEBw0aez5NjxzRtbaobN+YLP8Th8Le3q2UyjL+oIKh8oCgKAAiHwzlL19epBw+Ivj5daYNi548BzqbVPg2FQsnkPkazaWLCGwqlzpw5zF8Tw8MtP/3k83qjhR8yNxeKxdIWSx1/UUHQvjDX1o6YzVkbEQRJJBIURb3tqOlpsrVVVcyFiLnWPGIe2fPhu3o9wKEIchzHJ8sgP92QyTA3b87zl6WKROjgYJPdXmh+uoGmGaeTgFkq9KeBIogVxy9ZLCNmc6VYnFW6sLAgl8vzHL6wsAYAaGlRbt2IIZgYFWf9IQDZ3i5qxa2XLJdGzCOV4kqOfk0Orx+CvFtTI0HRGZLkryW27HbPF1+0GwyK339f57zyU6d0lZXiH35YZHugw+Hv69Op1bJAIPeNCQgSBDGK9hw40KfTKSWSaZK8MT+/+JZUNI9EIhMOpw4cqNi68fyR81bcmrXn6JNRF+kCAIhRcc+Bnj5dn1KinCanb8zfWAyz7oaFez3A2bRadyCQzGT4a4mt33579euvgaGh5q++cnFe+fBwy61bS9Fomu2BXm/U641arfjt2885jwqCSub8kSMWjeb28+d3fb7o25PQXcViaYVi26Xfj8s/TngnsnZbja++afe8RWO5/fz2Xd/dKMXiBtHeoAAAuUjUrlaXT366yW73DA1xn6UqlZKBgUa2+emmyUm/zQazVEjYHhIEmUh8oNMNGAy6yr0niTTNiMXbJmMEk0Ff1Jf1F0/H37T7kEyQH+g+GDAM6Cp5f0AhAgBYNJooRc0Fg3w3xtbY2LMrV2xWK+50cvls98yZw4FAYmLCu7fDp6aIjz82Go2KpSXuc2cIKg13IPAoEOjQaPr1+pMNDYvh8D2fbw+TKCQSLBLZdgGYP0V1B9yPAo86NB39+v6TDScXw4v3fPechLOY35KHCABg02qnVlfL8J2Lly9jd+6sDA+3cDvADQ+3jI09o+k9/uJwODU7G7TZtHCAgwSNAcBFki6SbFWp+vX6c83NbAc4FEVUKmkwuG3qRf4UFQDAAMZFulykq1XV2q/vP9d8bucAh2EyAEAmU/Sdbo1M9u/e3oYirlF5NTjYRJLnJRLOXikzGhU0/bciZyd2deFXr3aLRMjuu0KQQBxkPwg0NFSOjvbq9VXFtZv9pgSGSbu7r77//j9Fooqd+x8+/Jfe3lEUzX7mmxNqxfGVSMQX5f1u396Mjy9LJNjW17YkElQmw7L+MAwppBQA8OmnzW43+fjxq2KicrtJDEPLfA43BLHiZT8ItLWp1tZSKyuR4trNvlnEMBmKWqeoCMPkeOyJICgATM6inURdOP6fFy+KiY9X8Xj6228XPvmkeXx8eWPL/fsfWa141m6ff37v66+f7loKABgcbLp+fbbIqCiKnp5ePX4cd7sDRVYFQcJltWp//tnHcH17i6bTDx9eflupVFoTjxMMQxdSlfCSrNZWVVVV9tXp0tL6xsS0/KUQBHHl6FH14GDz5csPEonSTS8TieRW6z+Wl8e93rslaxSCoP8v9fUVV67Y2tpqStwugqAazTEhXplBECQYra2q996D96AhCIIgCIIgCIIg6M+rZAuaQxAnpJj0Ws81c232amuc0+tPdXZmz66QydS9vaNSqYpVVeIq8YXohUN5e5m5tvZfJ04c02hYB8oPDJP29Fyr3X6ehffRmZItaA5BnEhmkjPkTLe2m++GtFqb3+/IWUTT7NYLoSLU0q2llry97PGrV9efPDlrMlVLeFx5u3CZTJIkZ7Tbz7PwBjhQkgXNIYhDDr+jXd0uw2T8NVFVdaiiop7I8dY6AgBIp1nPA/XYPYYBgyRvL3sUCFx0OsOpFNvKeeL3O9TqdmzLeRbkAFeCBc0hiENzoblYOmaps/DXhFZrC4WeJpOhrO0IgtA0VeCLTVt5J7ypUOqwoHpZKDSXTsfqtpxnQQ5wfC9oDkHcohnaSTj5y1IRBMXx437/5M6ieHz1l1/+voc6mQwzf3M+f5ZabhiGJgjn1ixVkAMcAMBu95w4UW8wKPY7EAgqiMPvaFI2qWVqPiqvqXkXRSUkOcNttR67p/5EvUJQvczvdyiVTbI351moX8AjiPjp00axGL1/v3xXCoCgTevUeoemA0XQ+TUWX6osUGPjR7HYi9XVh9xWGyfixtNGVIy+EE4vo6h1jaYDQdC1tXkg3Cs4wNuC5hDEk0n/pE1r47xakUiuVrfnzE+L57F7WoTWy/z+Se2b8yzgAW5s7JnJVL1zcSQIKk9TxFSdrM6oMHJbrUZjoahoMDjHbbUbno09qzZV44LqZQQxJZPVKRRGIOgBbnNB8/0OBIIKEk6FZ4OznF/EabW21dUpAHj56EDsZWzlzoqwHjWkUuFgcHbjIk7AAxwAwG73nD1r4nBBcwji1SQx2VXXJUJEXFUok2mUyiae8tMNHrvHdNaECqqXEcRkXV0XgoiEFPROOxc0h6By5ibdGIpx+NoWjlsjkZVo1MdVhTstjy9jEiz/a1vlhiTdKIrV1pqF+hR1QzpNm0zVnZ34d9/x+HFsCOIKzdC4HDcoDNPkNCcVNjefe/nyv+vrS5zUlhOdpqtN1XgnviicXsYwtFyOKxSG/wHpw14asRFIUwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.772,3.438;4.blob,1.1,2312.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.513;4.blob,1.1,3036.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAqUlEQVQ4je3Sxw6CQBCA4QUrootiL2AFK9gL9vL+7+TN+JuYmHhlbt/MZLKZHSFeoagCEYnGmIgn6KSWYkJP0xmpwIbMsiFn0vkCXdTpUhmsVGtwXTZgy27CrTbY6Rrv7NkOym5ffIkBORyBzniCR3oWyr7GPU9nnDZfgEvpwyvpwmu5gbeSn7IL9px/+Nix6dHH4MTE+cItqtcbG+4P8UuE9xXel/j3vp4mDhXHgBNYGQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492321370;4.copy,1.1,3.520,3.361,3.440,2.19,2.14,1.1,3.510,3.361;4.rect,1.1,3.354,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.404,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.454,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.421,2.55,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.478,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.331,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.300,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.345;4.blob,1.1,1872.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAAC61BMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxsKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwltbSwBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViN+fjOZmT54eDECBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNBQRqGhjYiIg4pZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cKCgRkZCmXlz1NTR8LCwUTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8wMBODgzWRkTscHAsAAQAUMhQxejEwdzD19fWNjY1a3lo3iDd6ejEQKBAtcC07kjutra1EREQBAwFl+WUsbCwoKBALGwspKSm3t7dfX1/t7e0UMRQ6OjrExMSXl5cODg4tby1d5l1SzFIyfTIgUCBc5VwRKREcRRwbQhseSx6Y4HkFAAACS0lEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDQlKKckOkZSg3g0FWjgqGjILBCeQVcEgoKiljl1BRxRBSkMdlvJo6dnFVFXQRDU0tXIZo6+hiE9bTN0AXMjTCZQaDsYkpNmEzc3QRC0srnIYwWNtgEbS1s0cXcnB0Ass4g4ALCouBwdXNHdMQVw9PdCEvbzDl4wsCfigsIPAPwDQkMAhdJDgkFEKHgUA4CgsIIiIxzIiKjkEXio2zxbQLAeITEtGFkpJT0IVS0/CZwcCQnoEukpmFLpLtloPfkNy8fFSBAv1CdDVFxfjNYIgqKUUVcMAM6rJyAoYwVFSi8quqCekYBSigppYKhtTVN1DBlMYmKhjS3NJKBVPa2knW0tEJIru6e3r7+iEiEyZOIlJvzmQQOWXqtOkzgPTMWbPnzJ03HyK1YOJCXLqMXcAAXAbYJi5avISBYemy5StWrgIJrF6zloFh3foNEKUbN+EyJGgxGGgwMLhs3pIRtBUotG37jp0QyV27QeSevRDevhW4DClwB4P9DAwHDh46DBY6cvTY8RMgxsn1p0DU6TMQpWfPEfbO+QsXcy+BxS5fuTr92lQg4zrEJTcgSm/eIuwdhhSN24vloWXmnbv3gOR9SJg8AAs9fPSYsHdA4Em5B0ziKRA/63m+7sXL2RCBjomvcBmCDlAr3tdveva8fQdhv/8whVhDcIOPnyg34/OXBRSb8fXDN8od8v0HScoBp8CqBRExuPEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.812,3.383;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAADgAAAAPCAMAAACGJ/w5AAAA4VBMVEUAAABHRx1/fzQMBQX1Y2NKHh6kQkKoREQeHgyYmD4QEAdGHBz2Y2MOBgZWViNxcS4DAQHmXV1jKCgCAgGMjDk4OBeLODjBTk4tLRKSkjsHBwMtEhL+Z2cfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtUIiKZPj4FAgJZJCTsX18GAgJLSx58fDJWIyOYPj4CAQEJBATyYmJQICCAgDRDQxtnKiqCNTWcPz+qRUWSOztCGxsyFBQBAAC1mtqCAAAAnklEQVQokZXMxRLCQBAE0E7Q4O4Q3N0tuP//B5EQsgW3mTn09FTtW0AfSQZ9bHaH6LLEgHC6rOZWPBzo9fm/LRDkOITCEbNEY3EWRCJp7lQ6w4PZXP6zCyrPAcWSkeVKlQtrdSMbzRYXtjtdPXt9rgMGQ2CkjK1zMp0R4XyxxGotzs1WI8Ld/oDjSZznC9EB19vvN/cHGf6N9nwxXr8BGIMLX9JD2+MAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.400;4.blob,1.1,3032.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.782,3.438;4.blob,1.1,4268.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,684.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4ZKGodAAAA6klEQVQ4je3SWVLCQBCA4U6LYghMzMK+qZi4sygqGnGF+1+JnlS3lfYAPGUeUv9XmUlVphrAQV55wUHlkJ0X4FFVNtgCPHZrbFuA6NVlAxW5YYBNRembEzaVfRWEciAIraNYHMXWTU/c9KxbbXGrTe50e0wqct8M2FTk4WjMpiKfnslxKsDzic+0BRejhJkXpJeyOy/5lb9Lso8r7esb5eT2jnE/JXdmQyx67jrKiwdUflwqP5m58rNJlV/MSvnV1JTfsnf9/XWsHc60P7JPZfz6His7P7/KuNn+u5/CgnK+yvlSLudrn/O1A7etNf8lb4LQAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492321468;4.rect,1.1,3.364,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.414,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.464,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.383,2.56,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.405,2.26,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.421,2.13,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.341,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.310,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.263,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.326;4.blob,1.1,3556.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.792,3.383;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAGAAAAAPCAMAAAAs5DqFAAAA4VBMVEUAAABHRx1/fzQMBQX1Y2NKHh6kQkKoREQeHgyYmD4QEAdGHBz2Y2MOBgZWViNxcS4DAQHmXV1jKCgCAgGMjDk4OBeLODjBTk4tLRKSkjsHBwMtEhL+Z2cfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtUIiKZPj4FAgJZJCTsX18GAgJLSx58fDJWIyOYPj4CAQEJBATyYmJQICCAgDRDQxtnKiqCNTWcPz+qRUWSOztCGxsyFBQBAAC1mtqCAAAAn0lEQVQ4jbWNxRqCUBSEB0zsbsXu7sLu938gQeR+uj9nFhOb+QFdkgx62ewO0WWJAQCny2puxcMB8Pr83xYIcvwjFI6YJRqLswCQSJqZSmd4ANlc/pMFlecfKJYML1eqXIBa3fBGs8UFaHe6uvf6XP/AYAiMlLE1J9MZMWC+WGK1FnOz1YgBu/0Bx5OY5wvxP3C9/eLuD3LAn7Tni+H1DWXSC18IH1MGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.492,3.400;4.blob,1.1,3328.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.438;4.blob,1.1,3900.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.513;4.blob,1.1,3988.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,1036.iVBORw0KGgoAAAANSUhEUgAAAGkAAABxCAMAAADh2X3+AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB+ElEQVRoge2X104CURRFB6yIDooNC1jBCvaCvfz/PzkzKA/O2Vdz7p5jYu5+nJusk0jMyooig5XKFlfSjYyOWZ0an7C6NFmZsjpVnba6NBOXjC7V4lmjS9Fc3erS/ILVpcWq1aWlZaNDjZVVo0tr8brRpWZrw+jS5pbRoe2dms2h3Vbb5lDU2TM6lFsRDt4Xvxbg4IND+Tvdwe2jY/mB7eBGt4meyA7uVeAvT3bwySl8Ijv47By/UR18EffwI9XBl3EHP1IdfBVf40eqg29i/E/DdfBt/w6+kR18j391soPrXfhEdvBD/xG80B389Cz/jfgOLr+8it8LcPDbOx352313MNvzQ17OwWzPf/EEB7M9P+BJDmZ7fsATHcxu7YwnOpjd2hlPdDC7tVMecDC7tRMecDC7tRMecDC7tRMecDC7tROe7GB2a2c80cHs1s54ooPZrZ3xRAezW3vAExzM9vwnL+9gtueHvJyD2Z7/u3ZPJ7d2ATzU2tpBHmxt5SDP0dqqYZ6jtVXDPEdrq4Z5rtbWDPKcra0Y5jlbWzHMc7a2Ypjnam3NMM/V2po5eI7WVg3zHK2tGubh1tbNwUOtrR3modbWzsFjt3Zod8JCu/sttLvXQrv7LLS7x0K76xfancwL7f7TQrv7LLS7x0K7ey20u9f+fbt/AKOgSNUpy0BzAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492321577;4.rect,1.1,3.374,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.424,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.474,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.405,2.46,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.440,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.478,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.351,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.320,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.174;4.blob,1.1,2316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.326;4.blob,1.1,2328.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.782,3.383;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAHQAAAAPCAMAAAACoRsXAAAA4VBMVEUAAABHRx1/fzQMBQX1Y2NKHh6kQkKoREQeHgyYmD4QEAdGHBz2Y2MOBgZWViNxcS4DAQHmXV1jKCgCAgGMjDk4OBeLODjBTk4tLRKSkjsHBwMtEhL+Z2cfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtUIiKZPj4FAgJZJCTsX18GAgJLSx58fDJWIyOYPj4CAQEJBATyYmJQICCAgDRDQxtnKiqCNTWcPz+qRUWSOztCGxsyFBQBAAC1mtqCAAAAnklEQVQ4jb3OVRbCUAwE0GnR4u5Q3N2tuO9/QbSUvgMbmHwkM183gD6SDM7Y7A6RZYmEwumyklvxsFCvz/9NgSDLRCgcMUM0FqehSCTNm0pneGg2l//cgsozgWLJ2OVKlYnW6sZuNFtMtN3p6rvXZ5rAYAiMlLFVJ9MZAZ0vllitRd1sNQK62x9wPIl6vhBM4Hr7feH+oKB/oz1fJOkNDIELX7qFH18AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.502,3.400;4.blob,1.1,2224.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.421;4.blob,1.1,3284.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;3.end,1.1;4.sync,10.6492321675;4.rect,1.1,3.384,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.434,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.484,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.405,2.86,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.478,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.361,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.330,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.263,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.326;4.blob,1.1,2708.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.762,3.383;4.blob,1.1,624.iVBORw0KGgoAAAANSUhEUgAAAJwAAAAPCAMAAAAmlFaSAAAA4VBMVEUAAABHRx1/fzQMBQX1Y2NKHh6kQkKoREQeHgyYmD4QEAdGHBz2Y2MOBgZWViNxcS4DAQHmXV1jKCgCAgGMjDk4OBeLODjBTk4tLRKSkjsHBwMtEhL+Z2cfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtUIiKZPj4FAgJZJCTsX18GAgJLSx58fDJWIyOYPj4CAQEJBATyYmJQICCAgDRDQxtnKiqCNTWcPz+qRUWSOztCGxsyFBQBAAC1mtqCAAAArklEQVRIic3O1RKCUBSF4QMmdnd3dyvY+f4PJIiccXDPeLn8Lnbc/YypBJH9F4vVxm9RAIaQ7A7jckouZAjF7fG+L58fGkIJBEP6EY5EsSWUWFzfiWQKG0JJZ7KvncuDQ0iFojZL5Qo6hFKtabPeaKJDKK12R53dHrqD1h8wNpRGxjueTJE1JrP5gi1X/F1vZGCMmbLdsf2Bv8cTsOXb+fLxKNcbLOQn+f5AJ5g8AVnQC19PaEngAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.400;4.blob,1.1,3488.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.438;4.blob,1.1,2944.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.513;4.blob,1.1,3928.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAmklEQVQYlb3PVxLCMAwEUAGBVJoJLfQeaiD0Eur978QufHEB9PEkjT3rsQgqRuIJoCVTIrphYrRsB6YzPMvmQF5ZsKBcWFQlWFYVWPVqvFNv0KZBW16brdPtQac/4DIcybd85sp4MmWbzenCZpAES7pSPgzVmsumSbef7F1A9wegH0/wrC7QjPjK9Qbuj1DkGWkY3Zf81J/++AbvxA6ACPH2PgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAxElEQVRYheWQNwLCQBADlyNjsHEm2mT+/0P2rtEPpIKpVM7IbBL+AFSmZdPZXGjDApVpWVgspT4kUBmXhdV6o9Qhgcq4LIRsK/UhgUpfXr3LTalDApW+fBb5XurDAZW+4gFlpdRhgcqyitV1I5Shgcq6idVtJpShgco2i9VdL5Shgcqu9+rD8aS0IYFKX159zi9SHw6o9OXV12GU+nBApS+vvt2lOiRQ6cvC41kobUigMi57DW+pDgdUpmWfr1SHBCrT+gGiMCuBXXDK/QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAUElEQVQImRXMRwKAMAwDQWM6gYTeCaH//4fIlzmtROQxM/lBCDmKxSTNIKtcLDRBo0vIVS02rdgpsR/gOM1w0Svc7A7dge15GabbPvh8P7Q/jP4DuQRHJToAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.647;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAxElEQVRYheWQNwLCQBADlyNjsHEm2mT+/0P2rtEPpIKpVM7IbBL+AFSmZdPZXGjDApVpWVgspT4kUBmXhdV6o9Qhgcq4LIRsK/UhgUpfXr3LTalDApW+fBb5XurDAZW+4gFlpdRhgcqyitV1I5Shgcq6idVtJpShgco2i9VdL5Shgcqu9+rD8aS0IYFKX159zi9SHw6o9OXV12GU+nBApS+vvt2lOiRQ6cvC41kobUigMi57DW+pDgdUpmWfr1SHBCrT+gGiMCuBXXDK/QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492321783;4.rect,1.1,3.394,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.444,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.494,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.438,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.371,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.340,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.326;4.blob,1.1,3088.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.742,3.383;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAMQAAAAPCAMAAACMV5AuAAAA4VBMVEUAAABHRx1/fzQMBQX1Y2NKHh6kQkKoREQeHgyYmD4QEAdGHBz2Y2MOBgZWViNxcS4DAQHmXV1jKCgCAgGMjDk4OBeLODjBTk4tLRKSkjsHBwMtEhL+Z2cfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtUIiKZPj4FAgJZJCTsX18GAgJLSx58fDJWIyOYPj4CAQEJBATyYmJQICCAgDRDQxtnKiqCNTWcPz+qRUWSOztCGxsyFBQBAAC1mtqCAAAAsElEQVRIidXO1RKCUBSF4QMmdrdid3eBne//QIII4/XZzqzxu9hx9zOmEUT2n2x2h3WLAjCExOkyL7fkQYZQeH3+zxUIQkMoQuGIcURjcWwJRSJp7FQ6gw2hyOby712QwSEkxZI+y5UqOoSiVtdno9lCh1C0O11t9vroDprBkLGRNDbfyXSGrOE0XyzZam29m60CjOGl7vbscLTe0xnYwu9y/XrU2x0W8jPK44lO4PQCpx8LXzSjhuAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.400;4.blob,1.1,3304.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.862,3.443;4.blob,1.1,752.iVBORw0KGgoAAAANSUhEUgAAACQAAAAdCAMAAAD1qz7PAAABGlBMVEUAAABNH01JHUkLBAtDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAEJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDIcCxxuLG4rEisUCBQfDR8KBAoHAwc8GDx4MXiXPZdlKWUQBxAbCxtdJl2SO5KRO5FVIlUSBxJeJl6GNoZEHEQIAwgXCRcCAQJHHUd/NH8DAwc8PJMSEiwoKGIpKWUeDB4RESo8PJQDAwhWI1ZxLnEBAQI4OIoYGDuMOYw4FzgiIlMvL3QtEi0LCxs+PpgICBMzM30eHkopESkcHEQ1NYKJN4kGBg49PZcNDSF0L3RTIlMsLG4kJFkaCxoWFjU5OY4BAQRLHkt8MnwCAgU7O5ETEzCANIAmJl4pKWbQozh7AAAA1UlEQVQ4jWNggAFGJmYGgoCFlY2dA8zi5AIDbmyqeHj5+AUEgQwhYTAQwWGaqJiwOAODhCQYSGFVIi0jKyevgNc6RSVlFVU1BvzWqWtoakFYeKzT1sHh0FFAEtDVwyGhb2AIZ+vp4tJuZAxjmfAr4FJkamYOZVlY4nSIlbUNhKFja4dTEYO9A4R2VJbGrcjJ2QVMywvhVsPA4OoGInlY3fEp8vAEkTJeWPMODHj7+AJJP398ahgYAgKBCZo/CL+i4JBQhrBw/GoYIiKjGKJZCChiiIkFABMdFW32TFh6AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAAzElEQVQ4je3SRw7CQAxAUdMhQGhDb6H33muo978SKLYBI7FkFy+i/6SZSIkM8BwHiHG6BN0eL5XP/3wEtCB8OhTWhSNREI7FhRMqJJxUKeG0yghnVU44XyjK95fK0oYmXSlUhaFWbwjrzZYwtDvwe7q6rF5/QKYajvgA1jjMH0A1mfIBrJnqkrHmakGmWhp8AWv1+mKs9YSNtdmyrQrs9kSsgzqSsYIm/w+s05mvW3W5zolW3Uw3ESt159Pv+h57vz5t7xdft/cL/r1fD6+tLY7ZGU2RAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492321883;4.rect,1.1,3.404,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.454,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.504,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.381,2.16,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.573,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.381,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.350,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.326;4.blob,1.1,3264.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.383;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAANgAAAAPCAMAAACxxfFIAAAA4VBMVEUAAABHRx1/fzQMBQX1Y2NKHh6kQkKoREQeHgyYmD4QEAdGHBz2Y2MOBgZWViNxcS4DAQHmXV1jKCgCAgGMjDk4OBeLODjBTk4tLRKSkjsHBwMtEhL+Z2cfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtUIiKZPj4FAgJZJCTsX18GAgJLSx58fDJWIyOYPj4CAQEJBATyYmJQICCAgDRDQxtnKiqCNTWcPz+qRUWSOztCGxsyFBQBAAC1mtqCAAAAsElEQVRIid3OVRKCABSF4Qsmdrdid3eBnftfkCDCuIDrnBm/hxtvP5FGEOl/2OwO6xYFYAg7p8u83JIHGcLN6/N/rkAQGsItFI4YRzQWx5ZwSySNnUpnsCHcsrn8exdkcAi7Ykmf5UoVHcKtVtdno9lCh3Brd7ra7PXRHfwGQ6KRNDbfyXSGrGE0XyxptbbezVYBxnBSd3s6HK33dAa28Lpcvx71doeF/JTyeKITGL0ATc4LX+3Tsu8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.400;4.blob,1.1,3240.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.438;4.blob,1.1,2244.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.516;4.blob,1.1,4616.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,984.iVBORw0KGgoAAAANSUhEUgAAAGkAAABxCAMAAADh2X3+AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAB0ElEQVRoge2XyVbCQBBFW0UZVWxxQgEVhziiKM6Iw///k0lHdKFdC/r1Ox5P3UWSFW/HrWtMVKbi/vw30zOkocLsHGeoWCpzhkylWiMtzS+QhsxinTS0ZCukpWXbIC2t2FXS0ppdJy1tNDdJS2arxVpql1hLneY2a2pnt0taqu3tk5bMwSFr6QexHZyM7RHdwUfHJ+5NcPDpWfZkOPi8mv0FUhzcuzAkB1/ahOTgvr1iOfi6zXLwoMVy8E2P5eDbO5KDi/cPJAc/2ieSg8vDLsnBz6PsSXDwy2s/e8V38NuwkH9Ed3DjPfKAlySCPX6/G8YOBuK7G3IHA/HeDbmDcQh3g3MwDuFucA7GIdwNmYOBSHdD6mAc4t0wQBpEvBtSB+MQ74bUwTiku8E5GIZ0NzgH4xDuBudgHMLdkDsYhv9u+HQwDt/d8OVgGL67IYKD/1C7oz3vb3e054V2R3ve3+5ozwvtDva80O5gzwvtDva81O5Qzxup3aGeN1K7Qz1vpHaHet4I7Y71vNTuYM8L7Q72vNDuYM/72x3teW+7oz3vb3e057XdJ0LbfXK03QPQdg9B2z0IbfcgtN0RaLsHoe0ehLZ7ENruAWi7B/Bf2/0DHs5Jqsdfg88AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492321990;4.copy,1.1,3.880,3.456,2.80,2.19,2.14,1.1,3.870,3.456;4.rect,1.1,3.414,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.464,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.514,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.345,2.25,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.383,3.216,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.443,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.438,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.391,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.360,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.326;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAAEQAAABHCAMAAACJWREuAAACylBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUECwtf7Oxh7+8GEBAkWVkCBgYDBwdX19dY29sECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQICAMFBQIJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT5MTB///2ewsEccCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgPDwY0NBUjIw4HAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgQxeDE+mT4XOhcQEAYKGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4DAwFiYigyMhQfHw0KCgRm0sJHAAACkElEQVRYhWNgIBIwMjETqxQPYGGlgiFs7ByUG8LJxU25IQw8vFQwhI9fgAqmCApRwRBhESoYIiomjluSg9i4k5DEKSUlLSNLnCFy0vK4pBQUlaSIM0RZRZU4hXiBmjoVDBkFgw9oaKJwtbR1yDBEUwOVr6tHuhn6BoaoAkbGJiQbYmqGJmBuYUmqGeZW1uhCNrakGmJnr4Uu5GDgSKIherqYYk7OpJnhYuyKKejmTpohHp5emILePr4kGWJrg03Uz58UMwIMArEJBwWHkGBIaBhW4fCISBIMiYrGLh4TS4Iho4AQiKOCGfEJlJuRmJQMYaSkppFrRnpGJgPMkCxyDcnOyYWy8lLzcSkqKCzCa0hxCYxVWgahyysq0RVVVdfU1oFZ9Q1g0Igq39SMrqOlta29A8RI7wSBLhCzu6e3r38CkDFxEhhMRtExZWo2huOmTZ8xc9ZsBoY5c0FgHlR0/oJJCxkYFi0GgyUoGpZOXYbNk8tXrFzFsHoNCKwFC6xbv2Hjps04vLNl6lZMI7Zt37Fz124kgT179+0/cJABl3cOTT2MbsSRo8eOnziJInTq9JmzEBZW75w7fwHdkIuXLl9BE7p6DdO5yOD6DXSRm7fw64CCkHAwMAex52QQpQUT3L4DBndB7Hvn15JnyP0HYPAQzHn0+AmZbkECuU+fUW4Iw/MXVDBkyAOcLUW0FiV+gKuliN6ixAtwtBQxWpR4AY6WIkaLEhO87AIDcPrE2lLE0qLEAK+mgsFrEBtrSxFLixIDJL8Bg7dgDraWIrYWJTpA9g62liLWFiU6QPYOtpYi1hYlOkDxDpaWIvYWJV6A0VLE0aLECyAtRaSCEkeLEj8AtxSRCkpcLUrCAKWgRAMA4nHe6PkwBPgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.383;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAAA4AAAAPCAMAAADjyg5GAAAAgVBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtUIiKZPj4FAgJLSx58fDJWIyOYPj4CAQGAgDRDQxtnKiqCNTUJBASSOztCGxsyFBQBAACokoKKAAAAVUlEQVQImU3LRRKAMBQD0N9SXIq7FYf7HxA2dJJV3mRC9IVxwnCGMoSJtGyU43pIPwiRkUTFSYrM8gJZVqhaNH9tu56GUS/TrGhZNbcdb8d5IdX90Avq+QOwzeNdwQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.400;4.blob,1.1,1376.iVBORw0KGgoAAAANSUhEUgAAAasAAAASCAMAAADSfQFWAAAB+FBMVEUAAAAODgYHBwMyMhR8fDIJCQSTkzwsLBJHHR1/NDQgICD///8bGxthYSdpaStiYihlZSkTExMNDQUqKhGUlDwICAMeDAyYPj4QBwciIiIFBQVeXiZxcS4CAgGKijg7OxhWIyNxLi4sEhJtLCwjIyP39/crKxKZmT4sEixtLG1TUyJ0dC8CAQGMOTk4Fxc3FhZ+MzOZPj54MTE0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXgbGwuYmD4TEwgtEhKSOzsHAwMFAgJBGhqGNjaVPDxiKCgiDg6LizhMTB9iKGIyFDJBGkGGNoaVPJUiDiJ9fTNKSh5lKSlkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBApkKWSXPZdNH00LBQtERByCgjUJBASUPDwpEREwExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxyXlz0hIQ08GBiJNzcBAAAyFBR6MTF3MDCFhTZSUiF6MXp3MHdubix0Ly9TIiIoEBBwLS2VlT1BQRooEChwLXCSO5IDAwg1NRaOjjkEBAEUCAgaCwsbCwsaGgsdHQwbCxsDAwc5OY46Oo8EBAoFBQKRkTswMBNLHh58MjJDQxsBAQACAgQ0NIE1NYNmZimANDRDGxt6ejJLSx6JiTgZGQopKREoKBAtLRLhKgB7AAAByklEQVRYhWNgGNqAkWmgXTAKiAXMLKwD7QT6ASY2dmQuB+dAOYQkwMXNA2Xx8g2oQ+gL+AWQeZwcA+UOkgAXtyCUJYSa1oY3EBYRRXDExCUGziUkAEluKRhTWmYgHUJfICsnj+AoKA6cQ4gCSspgSkUVLqKmzohFnYYmnRxEX6ClDWfq6OoNoEMIAh19A0MjdEFRdWMQZWIKBmYgtrmFpZU1vR1HF2Bjawdj2js4DqRL8AMnZxdXN3dMcQ9PEOllBQbeDAymPr5+Xv70dh2dQEAgjBXkNpDuIACCQ0LDsImHR4DIyCgwiGZgiImNi6evy+gIEhKhjKTklAF1CH6QmpaekYlFPEsaRCLKwOyc3Lx8OruNboCxoBDCKCouGViX4AclpWWG5foYwhWVIBJRBjKYeVdZVVvQ23V0AjURELq2bmDdQRjUNzigC8k2NoEoRBkIAs0trXR1F41AWxsGq72jE0R1iXcPiItIAj3oAr3qfdjU9dPeKTQHEyZOmozOmjJ1GoiaPmOgHEUJmCk3a6CdQCswe87cCegsBul5IHL+goFxEmVg4aKBdsEoIBJMWyxKWNEoGAxgidzSgXbCKCASLFs+0C6gHwAAK6ZNbyJKGRMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.421;4.blob,1.1,1572.iVBORw0KGgoAAAANSUhEUgAAAOMAAAAgCAMAAADXLD9kAAACLlBMVEUFDAVj9WMeSh4AAAAsEhKVPT0yFBQZGRk+Pj4CAgIHAweTPJMsEiwdHUc0NH8ICBM+PpkHBxBCpEJEqEQvExOJNzcOBgYGBgYPDw85OTknJydiKGJlKWUFBQscRhxj9mMGDgY3NzcgICAqESqUPJQIAwgMDB4+PpgICBQBAQMBAwFd5l0oYygCAQKKOIo7GDsjI1YuLnEJCRU8PJQ4izhOwU4BAABTIlN0L3QBAQI5OYwXFzgSLRJn/mcNHw0CAQGUPDz1Y2PlXFxpKiqQOjoYCgobCxuYPpgTCBMSEi07O5IDAwdU0FQyfDJaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBAR9M31KHkopKWUoKGIuci5Y2VhmKSlgJyfWVlb/Z2f7ZWVEHESCNYIEBAkRESkKGApm/GYWNxYnEBAQBgYOBg6XPZchDSEYGDw3N4kAAAFKt0o8lTxuLG5ZJFkvL3QiIlMkWSRf7F8CBgI1FjWOOY4EAQQLCxoECQRi8mIgUCAFAgWRO5EwEzAeHksyMnw/nD9FqkVeJl5mKWY0NIAbG0MxMTEYGBhHHUd/NH8eDB4QBxBNH01JHUkLBAuPOo8KBApWI1ZxLnFDG0MWCRYEAgSBNIGDNYOMOYw4FzgJBAk/Gj96MXpqK2olDyUtEi2SO5IcCxyZPpkrEis8GDx4MXgpESldJl1VIlUSBxKJN4kBAAGGNoYXCRcUCBQaCxpLHkt8MnyANIA/VdPqAAACKElEQVRYhWNgYGRihgEWVjZmCgE7BxRwUmoSHsDFzUNICS8fmOIXEGRmZmAWEkbIiIiKUWi9uISEhKQUkKDQHPxAWoaQCj5eMMUvIAvyo5y8ApVdoKhEZQMxgLKKKn4FauqCYFpDQBPkRy1tHSq7gPZ+1NXTx6/AwBBCGxkzg/zIbGJKZRfA/GgGFzHDoZJsYG6BV9rSyhqJB/Sjja0ddR0A8aO9g6OTM5B2cUWwqGaFm7sHPmlPL28kHtCPzD6+VLMbDCB+9PMPCAwKDgkNC0ewqGdHRCQ+2ahoZB7IjzGx1LMbBCB+jIsHltMJiUnxSCzqgeQUPJKpxmnIXJAf0zMyqWg7SpljlpWNwaIKyMnNwy2ZX1CIzAX5kbmomJrW06FcBYKSUtxyZeUoXLAfKyqrqGk9XfxYXVOLS0pDvQ6FD/ZjfUMjNa2nix+bmltwSbW2ofLBfmRu76Cpe2gCOrtwyXT3oPIZaO2UQQBG/Tg8wKgfhwcY9SN5oLePBoaSDfonDH8/Tugfnn5URQyFTHSfNMT9OHnKVCyiXDXTpsPYM2YO9fw4S4W7dDaG6Jy587igTN35C4a6H5kXLlrsvmQpbvlly7mGvB+BYEXJylU4JWWkh0HdwbV6Ta7MJFyyC1XWDnk/uq1b3rx+A2751Rs3DXk/dm5ORlQTiBoDzrIwZx7yftyii2Ajagw4a6v7NuYh70dkgKgx4KztO0DkMPIjFrBzFogEAJPKwTXQX8UvAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.480;4.blob,1.1,1196.iVBORw0KGgoAAAANSUhEUgAAAGEAAAAyCAMAAAB7wkXIAAABqlBMVEUAAAAOBgY3NzfBwcH39/fp6emTk5MMDAwLBATsX1/vYWEQBgYnJyf29va4uLhISEhiYmLu7u61tbUHAwPXV1fbWFiqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e2MOTn/Z2cIAwM6OjrExMSXl5cODg6QOjr+Z2cEAgKsRUXYV1cPBgbzYmJuLCxUIiIBAAA0NIExMXkHBxItLW9jY/ZjY/U8PJQPDyQGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgQBAQECAgI0NDQ+Pj4REREKCgoGBgYgDQ0bCwsMBQX1Y2NKHh4TCAikQkKoREQiDg4FAgJGHBz2Y2MjDg73ZGQDAQHmXV1jKCiLODjBTk4tEhIfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICAICAicPz+qRUWKq4WhAAABkklEQVRYhe2WZXPCQBCGl5a2UKEuUHelCnV3d3co1N3dXf5zhwRSCGmbnbmdfijvh+S5m8w+c5Ob2wOQjkLBlvh4eSt9fP04VKn9A4Ah8QkM0gSHhIZxHB4RqQKGxCcqOgZAq4sFssTF254JiWSCJF2y7ZWSSmaANH4N6XSGDP4/ZHIDlntUSJYyW5uTq+GY0R7N0+e7KAoKlQlFxRwy2qMlBuM3y2GV0jJiQXlFJbHBWFVNbPDkH4d17+SoprZOELDunTzVNzQ2NdsNrHunnVpa29o7OoE2Xd09vZT1+/oHBoeG6eqPjI6NT0zS1QeYmp6ZFQYkN725+S9mftMTd1H2Nz1PF5WRv+iiJrOZ2LBgsVhpDYtWagMsOQzL+hVwpdW1dfuMXHKuImXYABFtbjm+kktOVdwN2/odENHunuO4kUtOVdwN+weOKYEOj46R5FTF3SCVk1MsSeRHw5nhHElYA1xcYglruLrGEtZwc3uHJKwB7h+whDU8qp+QhDU8v7wiSRzT2y8n3/sHlkQhOb0/AXLpj2OIdm0vAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492322088;4.copy,1.1,3.590,3.380,3.370,2.19,2.14,1.1,3.570,3.380;4.rect,1.1,3.424,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.474,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.524,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.326,2.45,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.345,2.46,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.383,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.411,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.421,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.557,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.401,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.370,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.316;4.blob,1.1,4512.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.400;4.blob,1.1,852.iVBORw0KGgoAAAANSUhEUgAAAC8AAAASCAMAAAD8HXftAAABUFBMVEUAAAAODgYHBwMyMhR8fDIJCQQgICD///8bGxthYSdpaSsTExMNDQWTkzwsLBIiIiIFBQVeXiZxcS4sEhJtLCwjIyP39/crKxKZmT4sEixtLG0CAQE3FhZ+MzOZPj54MTEICAM0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXgFAgJBGhqGNjaVPDxiKCgiDg6LizhMTB9iKGIyFDJBGkGGNoaVPJUiDiJkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBApkKWSXPZdNH00LBQswExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxwBAAAyFBR6MTF3MDCFhTZSUiF6MXp3MHcoEBBwLS2SOzsCAgGVlT1BQRooEChwLXCSO5IbCwsaGgsdHQwbCxtDQxuKijgBAQB6ejJLSx4wMBOJiTgZGQopKREoKBAtLRK95HYxAAAA6klEQVQokWNgwAYYmbAK4wTMLKzEKGNj54CyOLmIU88NZfHw8hGhnp9dAMYUFMKnUFgETImKwUXEJRixqJOUAhLSMrJy8ugyChKKIEpJGQxUQGxVNXUNTQYtbR1dPX1MowwMQaSRBhgYMzAom5iaGZkzMFhYWlljc6KNLYi0swcDBwYGRydnF5CIq5u7hycW9V6CqO7x9vH18wcJBQQGyQXLYKgPCUV1D4OKcZhGuBpYLiIyCl15dEwsqntAIC4+ASqdiK4+SSIZm69SsAmCQGpaOi4prCAjkyTlWdkKpCjPScslyfi8fFwyAOzfIZhLm9fmAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.421;4.blob,1.1,1384.iVBORw0KGgoAAAANSUhEUgAAAdsAAAANCAMAAADWtDSAAAACClBMVEUMDAX19WNKSh4AAAAFDAVj9WMeSh4sEhKVPT0yFBQZGRk+Pj4CAgIHAweTPJMsEiwdHUc0NH8ICBM+PpkHBxCkpEKoqERCpEJEqEQvExOJNzcOBgYGBgYPDw85OTknJydiKGJlKWUFBQtGRhz29mMODgYcRhxj9mMGDgY3NzcgICAqESqUPJQIAwgMDB4+PpgICBQBAQMDAwHm5l1jYygBAwFd5l0oYygCAQKKOIo7GDsjI1YuLnEJCRU8PJSLizjBwU44izhOwU4BAABTIlN0L3QBAQI5OYwXFzgtLRL+/mcfHw0SLRJn/mcNHw0CAQGUPDz1Y2PlXFxpKiqQOjoYCgobCxuYPpgTCBMSEi07O5IDAwfQ0FR8fDJU0FQyfDJaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBAR9M31KHkopKWUoKGJyci7Z2Vguci5Y2VhmKSlgJyfWVlb/Z2f7ZWVEHESCNYIEBAkRESkYGAr8/GY3NxYKGApm/GYWNxYnEBAQBgYOBg6XPZchDSEYGDw3N4kAAAG3t0qVlTxKt0o8lTxuLG5ZJFkvL3QiIlNZWSTs7F8GBgIkWSRf7F8CBgI1FjWOOY4EAQQLCxoJCQTy8mJQUCAECQRi8mIgUCAFAgWRO5EwEzAeHksyMnycnD+qqkU/nD9FqkVeJl5mKWY0NIAbG0NFhOT9AAABv0lEQVRYhd2WVVPDUBCFAxfXCg7F3d29uLu7u7u7u7u7/EfSFJrMQMILezPD99Dd7e7knJnzcglCSRn9L1RU1RS9uoYmhISW9ic6EF/nQFdP/7cTgZAqIrEBgQyNwB1hxtiE7k3NzAEULCQSiaUV+QPwbW6sbX67EAqoIhLbEsjO3gHcEV4cnZwxqLi4YhD5hpu7B/eBp5cBVb3FPgTy9fPH4AknAYFBGFT4yTY4JJT7ICxcXiMiEYFQVDS8JbzExGIQ+cpWqvhH+uPdHxMXz7lOSExS9GS2ySmp0IYwk5aeAS8izzYzKzsnl6x5+XQHKltQWMS1Li4pVfRktqisHNQND1RUwmvIs62qrqmtq29obGqmO1jdllaubVs73cuy7eiEdYOfrm54DXm2Pb3kW7yvf6CX0cEyOMSxHI4coQdZtqNj48B+cDMxOQWuwXhLSadnvnVgzM7Nsy8XFpfoQZYtWl6BNoSb1TVwCX7eySTrG+y7zS3GQGW7vbML7Ac3e/sH0BK8ZXt4dMy28vY6YUxUtqdn5+CO8HJxeQUtwVu21ze3bKu7e+ZEZYseHmHt4OfpmW8HcLy8sm3e3pnTB38akHO3xVEtAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.516;4.blob,1.1,2796.iVBORw0KGgoAAAANSUhEUgAAAE4AAABZCAIAAAAfG4VpAAAABmJLR0QA/wD/AP+gvaeTAAAH5ElEQVR4nO2bb0xa5x7HHw5whogoiLRih1MRFUVpi5M0qVljFxZq3O2SruvuVbO6xmSvljWLyd4sTX3V+K65a7o3u+GuXdqtq9uS1cUaV9bEddndGp11oiAmgCKidgJHQWAvaBwc/px/z1GWyye88XnO8/P75TxyzvnxFQB4GJ83fqj/EGJBjUbT1NREezmKou3t7RKJJP4jAkkVAAAYDhh+9PwIsSBcoFlVipTlwvJHK49gFYQONKuGA4bZjdmN7Q1YBaEDxyrCQV6UvzjhmYBSjSXgWG2UNKII+uvqr1CqsQQcq4YDhse+x9uRbSjVWAKC1QJeQUtpS47vXgDF6lHZ0UA48Pv678xLsQoEq4YDhp+8P8VAjHkpVmFqVSaQqYpVub97AXOrbfI2p9/pDrihqGEVplZb5a1sn1IEQTgcDtVVHA4HQZLcUS6xl2g0GplMBgCYn593u6ltHL1eLxQKAQBTU1Pr6+sgx60KBAI+nw8A2NraCofDlNYKhUIulwsACAaDkUiEFX158uTZf3QDutd/ex1KKb6I3xfoU5qUzEuRVEXtuqruVlv/a6UrKYmwP7xwd0Hdo2ZeiqQqClZlR2QlDSVzn84xUJWE1Wyt7KpExSiTIuRVUbCq7lG7x90BV4CBsCRcY67QRqj6TDWTIuRVkbWK8BDVOZXVDGf3xolFYnM35pjs4bSq4reEOAAAPJJFDxkP8Qv59jv2pKIIB0GT3qxYJBYNR8nMxrGarS0XW4oqizYXN0kqIVRVV1cnl8txRz558oSsVXWPeuHuwk5gJ3FQaVK+8s0riSOOrxzf/eM7MrNx1qbWfJO+2u7aXwZ/IamEUJXD4XC5XLgjMQwjZRUtRl/oemGkawQ3vvTD0petXyaObK9vk5zdxWq2avo1NKxmUrW9vR0KhXCD0WiUlNXqM9Vbvi3XGP6tCj0NeX/2ZlqVfXaX+ZvzhisGeZt85dEKGTGEqhhtYHWPev7mfCzKSksluBx0jjrVPWqqVjOpyrSBiSsWVRX1R/ulTVJKOiihOqfqXe3FfYZBV0VcvfZftauPV9d+WyNflCqOYQcX5VK6SaShitgq9MtpKjvYju22rfbNWvJL9kBVnjx59gcuw/UoKgYAxGJ/g5Yc05a3WKxqaXmfxyuAooZVmJ7VYHBJLK6Ry/Ve789QBLEHhG/i7PYvJBKNVEo/dbM3MD2rAIBoNCQQlEmlTZ4cTvKA1LNqUiq/NZkSR9ra2h48eIBhmMfjuXr1qkgkSq2yuvq/kpL6+EfU3qM0KU3fmggPe/Zkw0OQszU1AzqdVip9tPLXE0ZdXd34+LjFYjl9+rRCoRgaGqqurj516hSuytOnNgBAcbEa1l8swkc4XPz3SdFQNPE5BuEhNWdrdAM6qVZK5qmIV8Dj9dXXX2xuLhcKP7fb+y2WCY9nd/ry5ctOp7Ozs3NnZwcA4HK5RkZGTpw4MT4+nlglEtkKhf4QCg8y8pfAS5+8VPtP/C3x6JlR+xf2uOj6vvrmi83CcqH9c7ul3+KZ8KQrk8xnHR3hCxcu6fWlAkHqrN/vHxwcTBzxer1DQ0OpR+r1l1Sqc+TNZKeoqqhMX4Z7PSd5Lj7b8VnHhfAF/SW9oDSN5kzwbtlsR8vK3tVqZQLB9ZmZSZ9vd66goKCwsHB5eTlxgdvtjn/niSMWiyIIn5avNAScgeBSEDcYDT1rwdlu2cqOlmnf1QpkgpnrM75JX0qBNPCGHY6vFxdfq6oa0OneaWyc8Hg+mp7+dG4OAIBhWDAYPHgwaVsqFIr79++nFuJy0XDYT8dWOrJvYMewY/HrxarXqnQDusZ3Gj0TnumPpqn14jsqKkY7OzfPn98duXPnjtVq5fGefXoZjcZYLHby5EncQg4HOX783wrFCRqu0pJ9AydS0VHROdp5fvN86hQxWulfXYyGhgYMw+7du2c0Gnt7e30+38gIvkMHACgsVLS3XxeJnqfz+2Ag1cLoBx07duzhw4cYhnm93mvXronFaS6eFRUdBsOVHI8bwOHIkQ+USvzFNteAcA9cWqpD0WKXa4x5qZxGKCw3GK5IJA37LYR9SkrqpVLtfqvIk+f/Hog5lOxQys7QU0VwsYGYQ8kOpewMPVXE11UoOZTs0MjO0FBFbBVKDiU7NLIzNFQRW2WeQyFQQCs7k0UVo4QLwxxKdtKmVJioyhQQINUcxVawqtNVCB9ZsixRFURI62Dr+vS67ZaN6sJMqvx+/8rKynIyfj/ptkHze81vzL5BVQ0haDH6Nvb2oZcP0VueVhXTiBbtHEp2MqVUmKhiGtGinUPJDsPsTFpV9BMuu9DIoWQHSnaGvCoKulNzKAiKcAVc3Gu3K599FkDKzpBPx5DdwCAhh+IYdsRHXrW8Km/D/1V8/9b3s/+ZJZwFAKjOqWY+niEvgKSqTDBqfJXUl/BF+Db35sLmlm+LcDZPnjx58jBBJOIHAn0m9tsxmTh8+DDui8IsMLr18fvDd+8u9LDfjoEC07s8s9na1VUpZrMdAwumVsfGXBsboTNstmNgwdRqJBK7cWPub7GHITymmM3W48fLKyuLmJdiFQhWp6bWJid93d0U4uj7ApyHT7PZ2t2d63sYjtWbN+drasRtKY9sOQUcq8vLwdFRZ45/OEHrnpjN1rNna1B47RjoQFM2POxAUe4+3iQSAs0qhu3cvm17k8q/Be0xfwLFNod9Ft3KOAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,668.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR5IT15yAAAA40lEQVQ4je3S2VLCQBCF4c6AsgQHs7CIJKhIVBBQcAPB9f3fyZ6pbstz7W1ykfq/ykxXTWqIAiOPL6pUD8S+yBzWdIErMvVGU+yKjAlbuoCLfWRJzMXZtsdiLvcpinVDFDsnqTpJnTuhuhM6d3vqbo/dPxkIudindijmYmf5SMzFPjvX7VxkLsZtoSu6zCdCX1Rc6WpfepTfn+Re1+ibKXgyu/3r/jyD/YtGAF7e4fz7FXhtF+AHW4Af7RP42TbBL5stzn9N0fEcvdvswebtfQQOPj7B5usbDfPK+1XeL/D/7tcP8PsjI9TaZkgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492322192;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.570,3.342,3.390,2.19,2.14,1.1,3.570,3.323;4.copy,1.1,1.0,3.361,3.470,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.580,3.361,3.380,2.19,2.14,1.1,3.580,3.342;4.copy,1.1,1.0,3.380,3.460,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.580,3.399,3.380,2.19,2.14,1.1,3.570,3.399;4.copy,1.1,3.820,3.456,3.140,2.19,2.14,1.1,3.810,3.456;4.copy,1.1,3.870,3.513,2.90,2.19,2.14,1.1,3.860,3.513;4.rect,1.1,3.434,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.484,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.534,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.345,2.66,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.367,1.8,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.411,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.380,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.326;4.blob,1.1,3964.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.682,3.383;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAMAAADarb8dAAAAgVBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtUIiKZPj4FAgJLSx58fDJWIyOYPj4CAQGAgDRDQxtnKiqCNTUJBASSOztCGxsyFBQBAACokoKKAAAAWklEQVQImVWLRw6AMBADkxB6772EDv9/IHshkn2wdsZaxihcMIzgyIY0UVg2suN6KPwgRBHFyEmaociLEkVVIzey/c+uH6jHSW/zoqjXTYv9wOfzulGo56X+AA4oA7CyJsQ1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.402;4.blob,1.1,1800.iVBORw0KGgoAAAANSUhEUgAAAO0AAAAgCAMAAADJ5Q/XAAACfFBMVEUMDAX19WNKSh4AAAB3dzDU1FYHBwOTkzwsLBJHHR1/NDQgICD///8bGxthYSdpaSukpEKoqERiYihlZSkTExMNDQVGRhz29mMODgYyMhT9/WYbGwsqKhGUlDwICAMeDAyYPj4QBwciIiIFBQVeXiZxcS4DAwHm5l1jYyiQkDq8vEwCAgGKijg7OxhWIyNxLi4sEhJtLCwjIyP39/crKxKZmT6LizjBwU4EBALp6V5TUyJ0dC8CAQGMOTk4Fxc3FhZ+MzOZPj54MTE0NBUtLRL+/mcfHw1LSx709GMLCwSYmD4TEwgtEhKSOzsHAwMFAgJBGhqGNjaVPDxiKCgiDg5MTB/Q0FR8fDKpqUSjo0J9fTNlKSlkKSmXPT1NHx8LBQWBgTRZWSRyci7Z2VgPDwb392RFRRxERByCgjUJBASUPDwpEREwExODNTWROztZJCQcCwt/fzMYGAr8/GY3NxZkZCjk5FyXlz0hIQ08GBiJNzcBAAAyFBR6MTF3MDCFhTZSUiG3t0qVlTzCwk5ubix0Ly9TIiIoEBBwLS2VlT1BQRrs7F8GBgI1NRaOjjkEBAEUCAgaCwsbCwsaGgsdHQwJCQTy8mJQUCB9fTLOzlMFBQKRkTswMBNLHh58MjJDQxsBAQCcnD+qqkXIyFH//2dgYCfW1lZwcC1mZimANDRDGxt6ejIoKBCJiTgZGQopKREFDAVj9WMeSh6VPT1CpEJEqEQvExMOBgYcRhxj9mMGDgYBAwFd5l0oYyg4izhOwU4SLRJn/mcNHw1U0FQyfDIuci5Y2VgKGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECQRi8mIgUCA/nD9FqkUjjEeNAAAChUlEQVRYhWNgYGRiJgBYWFG4bOwchHRgA5xc5OiiEHDz8EJZfPxAgoFZQJCQFlYWVL6QMDkWc3GSo4tCwM0jAmWJguKIgVlMXAK/DkkpaVQBGVk50u2VV1AkXRPFQIlHGcZUUQX5Vk1dA78OTS00AW0dXdLt1dMnXQ8FwMAQTBkZw0VMTCWAvmU2M8erz8JSBV3Iyppk221s7UjWQzawsXdwdEIXlDN1BvnWxdUNn1Z3D090IWkvb1Id4OPrR6oWcoF/QGBQcAimuFkoyLfMYeH4NEdEYopFESzH0UF0MKk6yAYxsXHx2MQTEsG+TUrGozclNQ1TMD2DRBdkZmWTqIN8kJObl1+ARbxQBezbouIS3HpLy7QxBSXKK0hzQWVVNWkaKAHVNbWOdfYYwvUNYN8yNzbh1tqsg020JZE0B7S2kaaeUtDe4YsupN3ZBfFtYncPLm0VrlgbTr19/aRYPkFhIinKqQEmoQtMNp0C8e3UadOBZI8cGKghs5hnzMRq1qzZc0ixeu48MtxLZTBfZwHEt8wLFwGJxUvAYCkyi3nZcux6VVaQYtPKVRQ6lQpgtTsz1LdgsMYZDLyRWcMHzFkrh+LbYQ3W6axnHjm+XeMCIkeKbyFg1LfDFyD5logxmyEGNmzcBGcbbK5BjVvCYzZDDWzZimBvq9qO4luCYzZDDuzYuQuFj+xbgmM2Qw7s3rMXhY9SShEYsxmCYN9+FC6KbwmM2QxBcODgIWQuag2Ef8xmKILDR5B5qL7FO2YzJMHRY8g8VN/iHbMZkuD4iZNIPLS2FL4xm6EJTp1G4qD5Fs+YzRAFZ86eQ3DQfAsZsxlO4PyFiwgOeq8APGYzrMClywg2AALdz3QwhGLoAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.903,3.421;4.blob,1.1,932.iVBORw0KGgoAAAANSUhEUgAAADcAAAAgCAMAAACB1hBXAAABR1BMVEUAAAAHAweTPJMsEiwdHUc0NH9iKGJlKWUqESqUPJQIAwgMDB4+PpgHBxACAQKKOIo7GDsjI1YuLnFTIlN0L3QBAQI5OYwXFzgbCxuYPpgTCBMSEi07O5IDAwd9M31KHkopKWUoKGJEHESCNYIEBAk8PJQRESkOBg6XPZchDSEYGDw3N4kAAAFuLG5ZJFkvL3QiIlM1FjWOOY4EAQQICBQLCxoFAgWRO5EwEzAeHksyMnxeJl5mKWY0NIAbG0NHHUd/NH8eDB4QBxCPOo8KBApWI1ZxLnFNH01JHUkLBAsEAgSBNIGDNYOMOYw4FzhDG0MWCRYDAQMBAAEtEi2SO5IJBAk/Gj96MXpqK2olDyWZPpkyFDIcCxwrEisUCBQfDR8pESk8GDx4MXiJN4ldJl1VIlUSBxKGNoYaCxoXCRdLHkt8MnyANIC37GO1AAABL0lEQVQ4jWNgwACMTMyYgqiAhRWbKBs7IX2sLNhEOTi58Gvj5uHFJszHL4Bfn6AQdnFhEbzaRMXEsUtISErh0yctI4tDRk4enz4FRVwySsp4tKmoquGSUtfQxK1PS1sHp5yuHm59+ga45QyNjHFJmfCY4tZnZm6BS8rSCrc2BgZrG1wytnb49I0C6gJ7B/L0OdgTr5YLUTw4SjoRrY3RyNkFxnZ1A5HuHp5E6PPy9mGEMvl8/UCUPyeTXgBYINAMDIIIGBEcAjEhNCxcMiISyGCLAoNoAvrY2eDMGN2oWAaGuHgwcMGjB2QNZwKUxZiYpMHuRKw7E5MhCiRSQsxT0xiwuxMR+nCWiDCEtk5XggphuhMR+nBWnGQGRCSTD7ebEKEPZ2Vl4/cGLpDjT1gNAN1oLDwJvsDUAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.478;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAAHUAAAAiCAMAAABWUWbBAAABs1BMVEUAAAAwMHdWVtQOBgYUFDJmZv0LCxs3NzfBwcH39/fp6emTk5MMDAwLBATsX1/vYWEQBgY6OpBMTLwnJyf29va4uLhISEhiYmLu7u61tbUHAwPXV1fbWFgCAgReXukmJl6qqqra2toEBARHR0f///9BQUEeHktjY/QEBAv09PSEhITr6+uMjIxERKlCQqMJCQlsbGzR0dGgoKAGBg9kZPccHEX19fWNjY0oKGRcXOQBAQKtra1EREROTsI4OIopKSm3t7dfX1/t7e2MOTn/Z2cIAwMNDSFnZ/4SEiw6OjrExMSXl5cODg6QOjr+Z2cEAgIyMn1TU86sRUXYV1dWVtYtLXAPBgbzYmJuLCxUIiIBAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg40NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrdnZ/8dHUhUVNAyMnxRUchlZfsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFlfX+wCAgYEBAliYvIgIFBFRar9TdwVAAABeUlEQVRIiWNgoD9gZBoASxmYGHHJMDPTisXAwsqGbBM7BycXNw+YycvHL8BAExYDg6AQsqXCIqJi4hKSYLaUtAwvA01YDLJy8si2KigqMTAoq6gy0BaoqWsgczW1QKS2Do1t1dVD5umrGIAoQyPaWmpsYorCN4P41Zy2tlpYWqHwrSHxagPmUCmXYAJbO1S+PaeDsqOTKJhNpVzi7OKKxnJz90BzhqcXp7a3D5hJpVzi6+ePxgoIxBkKVANBweiskFCaWxoWHoHBoj3wj4zCYI2CUUAtEB0TOxDWxsVjitGu3QJjJSQmgajklFS4pbRrt8BZaekZICozMSYrG2or7dotCFZOLpgyzstnLShkoBcoci+GskpKy8rpZm1FJZiKtqiqjmcjoJZ6oKYWSBTV1Tc0NtHNTgaG5pZWBoa29pokuAjV2/nYQGkHA0OnLIJP9XY+ZgsGCLq6e1BcQfV2PmYLBgh6+/pxhAKVAGYLBgTaJtDU0kHWggEAbcVQw3DUE70AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.592,3.516;4.blob,1.1,936.iVBORw0KGgoAAAANSUhEUgAAAEMAAAAhCAMAAAC1KOYQAAABTVBMVEUAAABHHUd/NH8qKiosLCweDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MCAgIBAQE+Pj4aGhoICAgNDQ0FBQUwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUxMTEXFxcKCgo5JLDfAAABLElEQVRIid3NV1fCQBAF4AEUsRfslURDsffeULErKNh77/7/R0lE4zLZyZ4zb96X2Z3N/QIgxOMF9/gKyGevh20U+ovYRqBYgaCNktIytlFeUck2qqpVCNKoCdayjbr6BrbR2KREUEazv4VttLapEZTR3qFshDTFT+WGrndyjS7DCHONf59IVPIQ6+5RbUQjMr23z3mPGv0DgzJjaHjEaY0bo2MyAsYnJp3WqDE1PSM1YHbOYYkb8wuL5ogvmVkWTgAriVVs5Bp/srZujY1NM1vCKZvtHWzkGnZ2k6nvuWdmXzhlk84g4qdh5+Awjv9k5+j4JH+FG6dnFAFwfpG/QY3LxBVtXN/cujXu7mkCHh6fJA0tZEWD5xcXA17fxPtv41238uEGUPk0rIS/ACUMLqkC2UdMAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.362,3.552;4.blob,1.1,1444.iVBORw0KGgoAAAANSUhEUgAAASgAAAASCAMAAADfT7NUAAACH1BMVEUGDgYDBwMAAAAGBg4DAwcUMhQyfDIECQQUFDIyMnwEBAknYScraSsnJ2ErK2kxMTEYGBgFDQU8kzwSLBIFBQ08PJMSEiwmXiYucS4mJl4uLnESKxI+mT5KHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PpkeSh5KtkoDCAMVNBUEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQCBQIBAgECBAIlWyVV0lVn/2dRyFE4izgfTB8JBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0xCpEIiVCIsbCxa31pk+GRCo0IXORc0gTQkWSSnQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkNIQ0HEQdDp0Nl+2UIEwgzfzNQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM38gUCBY2lhh8WE8lTwTLhM2hTYhUiECAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCU9lT0aQRpDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ILGgsMHQwtEhIpKSm3t7dfX1/t7e0LCxoMDB0SLRI4ijgAAQA6OjrExMSXl5cODg4bG0M4OIoAAAEyejIeSx4yMnoeHksTMBM4iTgTEzA4OIkKGQoRKREKChkRESkQKBAQECgSEi3QHjfSAAAB1UlEQVRYhWNgYGQaUYCZhTx9DKxs7NR1ySAHHJxcZOljYOLmobJTBjng5SNZC78AKKAEhYRp4JzBC0RExUjVAgkoJnEJWrhn8AJJKVJ1QANKWoaBFu4ZJEBWDkTKKygqKatARFTVmInUq64BoaEBpSmjRQMHDgqgraOrpw+kDQyNjE1MzSCC5moWuNRbaoKBFYhtbWNrZw8RhgYUk4MjrR08MMDJ2cXVzR3E8vD0YmLy9vGFiPv549IRYAcGgUxM7EHBIaFhUGFYQIVH0NrJAwMio6JjIKzYOBAZnwDhJSbh0pGsBQYpTEypaeHpcGFYQGWI08qpAwsys7JzckGMPJ98EFVQCBEvksSlA5H1iktKy8phwrCAqqikqXsHDlRV1+jV1gEZ9ZAU1QARbmzCpQGR9ZisApvtWlohwtCAsmprp7GDBxB0dHYByW5IGdUDFurt68elGpH1QGDCxEkQBjSgJstMobVzBxJMBeJpitO9Z8w0ggjMUptNrN45EAoaUBPmzqOB+wYXmL9AMX7hIgh78ZKlJOqGBtSy5dR21uAGK1aSqgMSUKtWa9LCOYMWrFlrTqoWcECtm7ueFs4ZtGDDko0k6wEH1KY5NHDNIAabt5CnDwDJq3nIR6wwDwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.571;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.571;4.blob,1.1,2140.iVBORw0KGgoAAAANSUhEUgAAAJIAAABeCAMAAAD/j71zAAACDVBMVEUAAAAqKio+Pj4aGho0NDQREREJFgkGDgYDBwMvLy8NDQ0FBQUKCgocRhwwdjAUMhQyfDIECQQFDAVj9WMeSh4wdzBW1FYxMTEYGBgsLCwGBgYRKRE6jzoIFAgnYScraStCpEJEqEQBAgE1gzUbQxsFDQU8kzwSLBJj9mNm/WYLGwsUMRQmXiYucS4BAwFd5l0oYyg6kDpMvEwqZyoraisSKxI+mT44izhOwU4CBAJe6V4BAQECAgI5jDkdRx0DCAMVNBUSLRJn/mcNHw0eSx5j9GMECwQoKCgUFBQFCwUfTB9U0FREqURCo0IICAgEBAQSEhIrKysJFwkQKBA0gTQkWSQuci5Y2VgGDwZk92QcRRwJCQkLHAsPJQ8zfzMKGApm/GYWNxYoZChc5FwHEQc2hTYhUiFKt0o8lTxOwk44ijgBBAE9lj0ZPRk9lT0aQRpf7F8CBgINIQ0LGgsMHQxi8mIgUCAyfTJTzlMAAQA/nD9FqkVRyFFn/2cnYCdW1lYtcC0GEAYOIw4yejIIEwgiVSIucy4TMBM4iTgDAwMyezIKGQoeSR4MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUXFxf7CwgKAAAD8klEQVRoge2a51MTQRjGYxTBAFIUULECggpiP9SoAcSGCipg713EggXF3nvvvff2N3rZa5u79/ZuW24yk+fDZrPz7nO/sEvmnWcSCiVFfcLhvtqsXzicYS73t5VlZiUHByENiGRrs5wMCyl3oK0sL79AHQsHDfbyKypOeJuwo2SIP6Sh5nSYiVQ6fIS9buSo+Dh6jJdfcVHie3wHB1JZeYWjbmxllTrmjssk2+WNn5C4gO/gQKquBG5OzUR1qJ00mWw3ZaptAd/BgTRtOlA4Q4l/3LqZRLdZs2vsS9gOHSk6B4kKae48oDCm1KtjQ+N8ElLTgoX2JWyHjrQojLQ4oQxRRt2QlijV0OPqmuPj0nwS0rLlzjVrh47UEkFqxYtWIMqVbkirlDboce0d8XH1GgLR2nXrnYvWDsLBtSLKDW5IG5VN0PM2o2uyZes2d6TtO8qci9YO0sFhApB2KlVQ5a7d6GXPXnekfZ3QqrmDcHAeSPu7DgCFZQcPodeOw91uXkcawc9i7uD4EijqAAqPKsfQa8HxHnXsjiHV4rPQiZPgI7QdfEjN5UBhRWevNjl1Wh3OnEU6h89C5y/Az0A7aJD0b4NQtMVAuth1yVl4uQl/11aPdAWfecovEtScXL3Wa6+7fiPmy08Aknr9jeYkErmpL2bd6rGV3e4s5SbiU+Ed20JbQyAcKaFktrc+pbW3kO7eu09v5/N6k6W1t5Dfg4f0bkKQtPYW8nv0+Am1mxAkrb2F/J4+e05tJgZJa28hvxcvqc0cSF4tLyitvYX8Xr1+w43k1TnB0tpbyO/tO24kr84JVrvRqDj83n/gRmI6OL29hfw+fvrMi8R2cHp7C/27fPnKi8R0cEZ7CyF9+/6DE4lJRnsL+f389ZvOjICk36qoDxezvYX8/vwVhlSi3ap/Plys9lbAX51gkaPdqmxvE6y9lYvkW3h7K+ZuciuY9jZqXvMo9deoJKV6osspKYluYEjuiW5gSO6JbmBIhERXBJLgRFcEEkMwSEx0BSAxBIPERFcAEsPBERNdAUjCE11+JOGJLj+Sl6gT3WCQyIluEpCYEl2pSOlEl1npRJdCKZXoMklyossiyYkuiyQnuiySnegyyDvM8ePinuhyIAFREk1E6J7oMiPhP1MwRBMRuie6zEj4zxQM0WS77okuMxIkmoMjJLoikSgOjpToikSiECnRpZYvC89sl5joSkHyzHaTleha8sp204muD6XbW7KCTHRhBZroggo20YUUcKILKeBEF5LkRJdFkhNdBslOdBkkO9FlkOxEl0GyE10GBZ3oQpKc6FqtrN+Z9ETXamX9zqQnulYr63cWCjrRBZU6ie5/dkHw/xItSu4AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492322300;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.580,3.342,3.380,2.19,2.14,1.1,3.580,3.323;4.copy,1.1,1.0,3.361,3.460,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.590,3.361,3.370,2.19,2.14,1.1,3.590,3.342;4.copy,1.1,1.0,3.380,3.450,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.600,3.399,3.360,2.19,2.14,1.1,3.580,3.399;4.copy,1.1,3.820,3.456,3.140,2.19,2.14,1.1,3.810,3.456;4.rect,1.1,3.444,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.494,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.544,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.345,2.86,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.364,2.28,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.421,2.18,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.444,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.421,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.390,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.326;4.blob,1.1,5748.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.893,3.421;4.blob,1.1,704.iVBORw0KGgoAAAANSUhEUgAAAEIAAAAgCAMAAACRtl6LAAAA51BMVEUAAAAHAweTPJMsEixiKGJlKWUqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWZHHUd/NH8eDB4QBxCPOo8KBApWI1ZxLnFNH01JHUkLBAsEAgSBNIGDNYOMOYw4FzhDG0MWCRYtEi2SO5IJBAk/Gj96MXpqK2olDyUcCxyZPpkrEispESk8GDx4MXiJN4kBAAFdJl1VIlUSBxKGNoYUCBQaCxoXCRdLHkt8MnyANIDJQjJhAAAA5ElEQVRIiWNgIBEwMjGTqgUDsLBSbAQbOwelRnBycVPsDB5eio3g4xeg2AxBIYqNEBah2AhRMXGKzZCQpNgIKWkZSo2QlZOn2BkKihQbMQroD5SUKTZCWYksbRyIEk2FX5UcExil1dRhbA1Nwuq1tHXQhXT19BmhTE4DQ8JGGLEzSRrjlDUxZcQphwBm5hb8llY4JFlZiDABBKwlbGyxG89uR5QBjPYOYqzYw93e0YkIA/icTeVcXEEsRFTCWbw8xLhBwU0YogERlXCWO78HMUZ4ckIZiKiEs7y8iTEBL/AxIkk5AHXWEBBhVqx2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.478;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAzCAMAAACNDPcLAAACr1BMVEUAAAAwMHdWVtQOBgYUFDJmZv0LCxs3NzfBwcH39/fp6emTk5MMDAwLBATsX1/vYWEQBgY6OpBMTLwnJyf29va4uLhISEhiYmLu7u61tbUHAwPXV1fbWFgCAgReXukmJl6qqqra2toEBARHR0f///9BQUEeHktjY/QEBAv09PSEhITr6+uMjIxERKlCQqMJCQlsbGzR0dGgoKAGBg9kZPccHEX19fWNjY0oKGRcXOQBAQKtra1EREROTsI4OIopKSm3t7dfX1/t7e2MOTn/Z2cIAwMNDSFnZ/4SEiw6OjrExMSXl5cODg6QOjr+Z2cEAgIyMn1TU86sRUXYV1dWVtYtLXAPBgbzYmJuLCxUIiIBAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg40NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrdnZ/8dHUhUVNAyMnxRUchlZfsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFlfX+wCAgYEBAliYvIgIFBFRaoBAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUHBwOTkzwsLBIsLCwgDQ0bCwsMBQX1Y2NKHh4NDSBiYihlZSkTCAikQkKoREQICBMqKhGUlDwICAMiDg4FAgJGHBz2Y2MODiICAgUCAgGKijg7OxgjDg73ZGQDAQHmXV1jKCgODiNTUyJ0dC+LODjBTk4bGwuYmD4TEwgtEhIfDQ19fTNKSh7QVFR8MjJERByCgjVyLi7ZWFgODgaXlz0hIQ0YCgr8ZmY3FhZubixZWSS3SkqVPDw1NRaOjjkEBAFZJCQGAgIFBQKRkTswMBMJBATyYmJQICBeXiZmZimcPz+qRUXGqZncAAAChUlEQVRYhe2XZ1PUQBiAX0CQU8GKHRtYsYOKvZ1iBXsDRbB3RTkbdsUCFhB7wd5777333rv+EC+5bLKXzcC7M9ncl3s+5J7bZPZJ5iaXDYD1+Ph6IKri65PfEX5+ogwK+AcQo4sFA22FCheRNSi4aDEQYgDFS6hGxUuWCildpmw52ctXqBgEQgxCK1VWjapXqVoNICy8OoilRs1aqlHDtetI24i6guv16rMG0CC8ofTRqLHYeGRUE8YkmrquvZnYenTzFoxJtHT97q3kLybdXSyt27Am0dbWLqx9hxDZTbq7Oto76axzTBdlRDMXXbvZIrr3kNWku6tnbJzOevUmNc1E0aev3vr1JyOaCWLAwEGMWUfc4CGMefFiNfEJQxmzkGGJrBHEraeIDU9KBspGjBylxsWtp1QbPWasEpNtXFLC+AnKgLj1lGYTJ5FrlS1y8hT/qdPAKlJiputsRqpjpmX5WbPdLD56ztzEgDyON5e0eZSlzF+wcNFiy9oAS5YuUw3Sl6clq3tMf28xInWFarAyVBs3/b2FXVk5WZWRScztrEx/b2FXVk5Wr1lLDITCrqwk0teJrSp4V1ZYsrKzszxXX5+Ts8GD9Y2bNltb3LJ1m1bfTmyHfafOcnftVkawZjQLzR6H8+Gyd59hfb/eDhwkO7FmNItb/RDA4SNH2fox+3G9nThJ/r6xZjQLxSnHaYAzZ8+x9fMXGLt46TKnGc1CcSVK2l69xtaNuH6D1zDcvHUbVb8Te5fTUNy7j6rDg4e8huHRY1z9yVNew/Ds+QtU/eWr15yG4s1bVB3evec1DB8+fkLVPwd/4TQMX799R9V//PzFaSh+/1Hq+Txh//7jtbz5D5EhI3WjhDlKAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492322398;4.copy,1.1,3.620,3.380,3.340,2.38,2.14,1.1,3.600,3.380;4.copy,1.1,3.610,3.399,2.10,2.19,2.14,1.1,3.590,3.399;4.rect,1.1,3.454,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.504,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.554,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.364,2.48,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.443,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.557,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.431,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.400,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.259;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.326;4.blob,1.1,5744.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.516;4.blob,1.1,2624.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;3.end,1.1;4.sync,10.6492322503;4.copy,1.1,3.610,3.399,3.350,2.19,2.14,1.1,3.600,3.399;4.copy,1.1,3.810,3.437,3.150,2.19,2.14,1.1,3.800,3.437;4.rect,1.1,3.464,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.514,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.564,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.441,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.410,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.240;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.326;4.blob,1.1,3196.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.459;4.blob,1.1,2496.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.552;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAAC4AAABxCAMAAACdv2EnAAABOFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIfTU0dSUkECwsbQ0M8lJQ8k5MkWVkJFhYECQkaPz8xeno+mJgramoPJSULHBwsbm4+mZkSKysDBwcYPDwxeHg9l5cpZWUHEBALGxsmXV07kpI7kZEiVVUHEhImXl42hoYcREQDCAgJFxcBAgLbL6bZAAABLklEQVRYhe3XxVIDQRRG4QYCUawJFiA4BA0El+Du7q7v/wYsqZrJnckJrFL3X3/VNYueOtXG+K8kD/O70jKiA+UVQAdDYXJ4JBojvLKKaFNdQ3StjRBeZ+OE19sGwhttE+HNiRbCTWsb4skQ4u2JDuQ7u7oJj/X0ouP7+hEvbCl0kc3A4BDywyOIj0bR9THpMcTHbYrwjJ1Ax08mEZ9il3k6jfjMLNHBuXnCF+wi4eEs+lGWloleWc0AvZYNkMPj60Tnv2Ip38bmlid3lG97Z3dv34M7y3dweHR8cirpXOU7O7+4FLi7fFfXN7d39wJ3lu/h8en55VX6Flf53t4/PkXsLt/Xtwc2Wr7/n5ZPnpZPmpbvjyuW8vlN33zC9M3nMS2f77R84rR8OVdI+X4AuM0tFiYIsnIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,616.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAAtUlEQVQ4je3SxxKCQBAE0FExEE0jKqJgwIARxRww/v8v6UGr6INVXrzRh619s1tzaqJXYgSJJ4BCMvW+pTOvQ5RkCltRNXA2R+B8AVxkBVxiHVzmCrjKBrhm1nF/w0LbErpptsDU7jhgrdsDU39Av8TV0MPRGAeTKXqmGjjw5ugFu2Cfl/hhZaPXFnrjobc7oLg/gI98AsuBAz5fgNebH+Y9EOBZf9CXRP0KO+rXJ1G/6N/9egK5Xx3IWoWwagAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492322605;4.rect,1.1,3.474,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.524,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.574,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.451,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.420,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.326;4.blob,1.1,5720.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.572,3.516;4.blob,1.1,828.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABKVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUb6Id3AAAA/klEQVQ4je3P2VLCMBQG4EMBlUVFRVYtAoILiuygIjsIKCC44obw/g8BbXKTtqkzZ7jkv8k5f+bLTACYGATARTDgnNFkxsG1dZzbsFhx0GbfxMGtbZxz7Ozi4J5zHwddbpzzmLw46PPjHBwcIuEqy40Y4FwcBUO6IiDyngwfa/dERKInPHh6dq5VUxG74Dm4jF9p1UQkkikuhHRGo6Qim8tLR+Fayg0zAdwW79SQilJZ3ipVKTVmWqTeUEMimq17eWu2pXSYaZHug8pR8dgr8L8I0B88KSsqhiM9B/D8omyIeC2+6cP3jzFbUPH5pe/g++eXLaiY/P0DYTpjdyLmj4Ej2/Bx1LYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,3712.iVBORw0KGgoAAAANSUhEUgAAAW0AAAA4CAIAAAC5Vz6FAAAABmJLR0QA/wD/AP+gvaeTAAAKk0lEQVR4nO3dXUxTaRoA4Len57RQ2tIWrIJs0ULLjyL1ZwZi/BmjM8RKnHEyjtFdcVYvTOZqEjPxYrPZCydzYcysGbMa98LddEeTcTSSyWTEoGEkRGPckQ2ISPkREgoUWhFKf+gP3YuSWk5Lewqn57TyPuECvu/0nDclvPQ733feDyBCtjobEEpvIpFcKBTzHQVagAh/V/RRUdkXZTyGghATcnlpdfXXJIn/89LIfB5RVig1+zUvr73kNxqEErLZnjmdlrKyL/gOhGWbN29es2YN31EsEQEAAkJQeqx06Jchj83DdzwIJTYwcEuprFSpNvIdCJpHAEBedZ5YIR5rG+M7GIQY8fkc4+NPi4o+5DsQNI8AAPX76snuycBsgO9g0Epk1Gh+NRojW2pqah4+fOh2u61W66VLl6RSafSrbLbfFYpykUjOVZgLaIwa46/GxMetGCQA5Opyh5uH+Y4ErSwkQRwpKTlrMFSpVE/Gx8PtZWVlLS0tra2thw4dKiwsvHDhglarPXDgAO3lU1P9AJCbq5+Y+C8r8RAUIRAKaI1z3rngXPDtMSRRcqTEcNagqlKNPxmHd5dAIBAIot6NubnFjiepHIqSUe5xd4oDQ2heNkmeKi8/s2lTgUTy08DA6dbWx1ZruPfcuXPDw8P19fV+vx8ALBZLU1PTnj17WlpaIk8SCHi83mmJhLUbkx/86wPdH3W0xubDzQO3BgCAzCbLT5VvOrNJUiAZ+Gmg9XSr9bE11mnSC0EQkT8Gg8FgMLjYwZHKysrUajWt8cWLFzabLebxJCklAcDv9i8pToSSdm337s+02m/b279//tzuod/aNxqNFy9eDCURALh3757NZjtw4AAtjwCA3++iKBlbUT3969POi520xun+6dA3u6/t1n6mbf+2/fn3zz32zJiOUKlUGzcuuBVtt9u7urqYvHZwcNBisdAa3e5FP22QBEUAQDDAKEshtHw/9vdvXbXqq6qq/Kysq93dHXZ7uCs7OzsnJ2dsbMEt/5GRkfz8/OjzBINzBEGxFZVz2OkaddEa57zzn+T7f+xftXVV1VdVWflZ3Ve77R32qBOknenp6fb29siWcHZOaHZ21uv10hrjjWv8Tj8ACMXCJINEaIkaBwd/Hhr6dP36swbDlxs2PLZaL3d1/dDbCwBut9vlctGWURQWFt6/fz/6PEKhyOebYSuq+OOawcbBoZ+H1n+63nDWsOHLDdbH1q7LXb0/9LJ19VTw+/0Oh2Npr012XAMCUrDz8s6CnQVLux5Cy7F37drm+nrHyZPhltu3b5vNZpIkQz/W1dUFg8F9+/bRXigQEDt3/qOwcA9bkcjWy1ZtW0X7EitjLMBfu3dtfXP9ScfJ6K7lSKt1aFlZWbIo4V9KbIazhtKjpVxFiBBdlUoV/r6iosLtdt+9e7euru7EiRN2u72pqSn6JTk5hbt2XZVK/8BhmAuoqlSJD0pGWuWRpSiuL37v3Ht8R4HQvO3bt7e1tbnd7omJiStXrsjlMRaJrF27t7b2PAB9bjJzLSGPCAQCIkr0fC0HSAAYbRvVGDXyEnn47jRCPHr06NGOHTviH7N6dc3IyEOAFT0/YDAYZDL6jFVPT4/VyvWcNAkA3jdeS4tl3SfrOr7rWNm/F5QZ8vIMIlGuxfKA70B41tPTIxTSZ0g8UVPp3BGKhVv+smXdJ+t4iwAhZiSSgtra80plBd+BsCzj74+EUFJKs1/DdxQIJaBQlKtUVXxHgRZ4d25TIYSSFX6OJuaS+XBvnBVoIXEnhAFEclFgNoCPAiP0TqqoqAitFe7r6xsZGaH1bt26VSKRAEBnZ+fk5GSc8xBx+gBAXiqv/rqazE6QbhBCGWpqaqq9vX1iYiK668WLF52d9GeOYkqQR2zPbE6LE+u2Is5QUuqU85TGmPJbdYazhs+ff87wYA6i4us+ayAQcDgcPp8vusvlcjmdTiYnSZBHAGDg1oCyUqnayPLqPYRi8s34Xt15pW/Qp/pC+uN683/MDA/mLKoMlTiP+By+8afjRR8WcRANQgBgNpmLDxaL5KLUXSJ/S76iQpHUg3YcRJW5EucRALD9blOUK/AdRNywPLB433i1h7Wpu4S+QT/SMuK0MPrQzllUmYtRHpnqnwKAXH1uioNBCAAgGAj2Xu9N3SCCIInSo6VmE9NBDTdRxRTzCRouA2CI0URMwBPwTnslaySpjgahELPJXH2mWlYscwwtsYJGHEV1RVQONXB7IK2iiinpOiALLbmuYrKYTuj6XX5KxlrtKYTie9352t5h1x3XPfvmGesn1zfoX915FarglT5RxZRsfcNIy6mrmCymeSQ4FwxVYESIG2aTufJ0Jet/saJc0bqD65oOxqhpwmNUi0m2vmGk5dRVTBbTPCIUCX0zMWaYEUqRvht9tedr1TVqdnd40B7WeuweywP6P3l+o1rMcsY1y6mrmCxGeURACMQK8ezkbKqjQSjMNeYabh7WN+jZ/YvVN+j7bvRF7kqTDlEtZjnjGi4xGqpI1kgEpGC6D6scIU6ZTeaSIyWEiLUBtWy9rGBHQbIzNamOKg6Px+OIkrrhyZIxei8UFQrvlHdmmLXa3AgxMdg4KBQJI1ejEyJCmCWkfYX3wYvfCwC6P+ls/7O9fv6a3agQo3HN6prVIw9HsFQa4pjf7e+/2a87phtsHAy1fNz6sbqGfr/gtz//1vPvnoS9AFB6tLT7n92sR5XpCIJYrG4Aw+UqieuP5BnydEd1T//2NODB6gGIZ4pyBSWlrz9wvHKE9riL35vmNm/ePDo6StsDLNUqKyvj1A3Ytm0bw7oBCUgKJLXna5UVymWEihBKjJfnfcP71FBUjNVhEokk1BtdBTY5inIF6/t0IIQQQggtLludzXcICKEMk63OfnsztuijIqx7hhBKyoK8oaxQbv/79qz8LF5DQigBqZRyOk8Z38W1G5m4f004bxAAICAEpcdKh34Z8tgyYHoMrWQzM747d141YH3DNBCZNwgAyKvOEyvEY22cTlwjtDQmk/ngwWI5VufjW2TeIABA/b56snsSN6lBGeHBA8ubN97DWN+Qb5F5gwCAXF3udD8+g4cyQyAQvH69F4c2wHfVxci8QVI5FCWj3ONp9yQyQosxmcxnzlQXF8uGuKpvmJ6WWXVxOWh5gySlJAD43Wn3JDJCi+nsfN3RYT9+XPcNV3XJ0hOP1UloeYMIVUsMBvBhXpRJTCbz8eMrfWgzOzvrjMJNdRJa3iBD1W6F4uU9h4MQt27c6Dt/vramRv2Ek7pk6YnHcQ0tb5BehzcYCIqV4lRfGCEWjY25mpuHGxr0KzmP8DiuoeUNIugPOoYcOUU5HFwbIRaZTOYjR0pEnNQ3TE88Vl2k5Q0CACa7JpWVWGEEZZjGxkGRSPhOrpFnRcxZYYEgcekyhiLzBgkAo22jGqNGXiLHVSQog7jd/ps3+48d0zW+K/UN2WUwGGQyGa2xp6fHarWycv7IvDGfnLSHtVKNtOO7DizCihAvWK+rKJFIouuYeTwen4+1jajCeWP+MtP904W7CsUq8ZuXb9i6BkKIuYKCgpmZmZkZ1nZl8Pl83igM9+JjKJw33jZRUkqzH4eaCKEkhPLG/wEVdqZq55FASQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.584;4.blob,1.1,544.iVBORw0KGgoAAAANSUhEUgAAABwAAAAfCAMAAADDR10IAAAAt1BMVEUBBAECBQIBAgEAAAAxeDE+mT4XOhcKGAoNHw0FCwUgICD///8bGxsTExMiIiIFBQUjIyP39/cfTU0dSUkECwsbQ0M8lJQ8k5MkWVkJFhYECQkaPz8xeno+mJgramoPJSULHBwsbm4+mZkSKysDBwcYPDwxeHg9l5cpZWUHEBALGxsmXV07kpI7kZEiVVUHEhImXl42hoYcREQDCAgJFxcBAgINIA1n/2cLGwsIEwgOIg4OIw5k92TTL89CAAAAmklEQVQokWNgYAQDJmZmBAsGGFhYwYCNmRnBgkuyc4ABJzMzggWXZMYDBlySi5sHnyQvbkk+bn7ckgKCEFpIWAS3g0TFxCUkcbpWSlpGVk4et1cUFJWUcUiqqKqpa2hildTS1tHV08dhp4GhkTFO15qYQmgGzMSBAAyYiQNJEjNxIEliExw0kmbmFvgkLXFLWpkz4pa0tkG1EwBpkRG1IBlcaQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.609;4.blob,1.1,588.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAApklEQVQoke3SVxKCQAyA4QUrootiL4ANrGAv2Mv97+Sb4+/ojAcwb1+SyexkI8QzFFUgItEYE/EEndRSTOhpOiMV2JBZNuRMOl+gizpdKoOVag2uywZs2Q7cbIHtjvHKru2i7PXEl+iTgyHojsZ4pG+hHGjc82TKabM5uJABvJQevJJreCP5Kdtwx/n7tx2bPn0Ij0ycztyiermy4XYXv8T/vj7c1wNLlg5Fy+iO5wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492322712;4.copy,1.1,3.810,3.437,3.150,2.19,2.14,1.1,3.800,3.437;4.copy,1.1,3.830,3.475,3.130,2.38,2.14,1.1,3.820,3.475;4.copy,1.1,3.780,3.494,2.50,2.19,2.14,1.1,3.770,3.494;4.rect,1.1,3.484,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.534,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.584,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.461,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.430,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.202;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.326;4.blob,1.1,5792.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.459;4.blob,1.1,640.iVBORw0KGgoAAAANSUhEUgAAAHMAAAAPCAMAAADgfQBuAAAA2FBMVEUAAABHHUd/NH8eDB6YPpgQBxAOBgYGBg5WI1ZxLnELBATsX1/vYWEQBgYEBAtfX+xhYe8GBhACAQKMOYw4FzgHAwPXV1fbWFgDAwdXV9dYWNstEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlOMOTn/Z2cIAwMUCBQaCxo5OYxnZ/8DAwiQOjr+Z2cEAgJLHkt8Mnw6OpBnZ/4CAgSsRUXYV1eANIBDG0NFRaxXV9gPBgbzYmJuLCwGBg9iYvMsLG5UIiIBAAAiIlQAAAFxFuIkAAAAw0lEQVQ4jbXN1xKCMBBA0YAIioq9994bFuy9/P8f+QIkcczC4OQ+nZ3sAkKMBBESn0QBEpd8kp8tWfb+YUVhPgWCbKmhcMTrL7VoLM54SiRTbKUzWdXrP3P5gsZ4KpbKgPhUqULiUq3eAMSnZqsNiE+dLqT/6/UH3xpKI8QWsYhv4caTKcXZXDdHW4ultfFLxCK+hVutDYqbrTXa2u0RIGIR38IdjhRP54s5YTlkL7q9uN7uFPXH0xyxHLIX3V4YrzfJD44bHSaUqS9AAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.516;4.blob,1.1,828.iVBORw0KGgoAAAANSUhEUgAAAH8AAAAPCAMAAAD6QeDgAAABLFBMVEUAAAAgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOLODjBTk4DAwdXV9dYWNs4OItOTsEtEhL+Z2cfDQ0SEi1nZ/4NDR/QVFR8MjJUVNAyMnxyLi7ZWFguLnJYWNkYCgr8ZmY3FhYKChhmZvwWFje3SkqVPDxKSrc8PJVZJCTsX18GAgI5OYwDAwgkJFkCAgYJBATyYmJQICA6OpACAgQEBAliYvIgIFCcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAEL1amBAAAA+klEQVQ4jWNgYGBkYmaAABiLhZUNKkIsC5spyICdgxNNhIubB66eF53Fxw9TRiwLmyko9gugCwkKQRnCTCLoLFExcQbSWNhMQQISHJIwppQUhJaWgTJk5WBScJa8giKJLGymIAElZRhLRVVNHczQ0NTCVAcD2jqksogFunr6KhCWgSFuVUbGJiSySAemZua4JS0sSWWRDqysccvZ2JLKIh3Y2eOWc3B0IpFFOnB2ccUt6eZOKot04OGJW87L24dEFpHAl8MPxvRXDcCpLDAomEQWkSDELBTGDAuPwK0uMopUFnEgOgbBjo0jTS8VQHxCIt3tRAahScnIXACyDi/5bV6F/AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAX0lEQVQoke3PSRKCUBAD0CYKyPQ/KCDzJML9b0j6DlSxYfN2SSoiDgB5PF0Kz1dfQUgRxWpihFqTUmRv9ZOrRaSWX1rVDW1NR/thpNPM7PKzkHX4s3PbdQW4xvvjqR8PUO0MufyFRLYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.584;4.blob,1.1,1048.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABpFBMVEUAAAABBAECBQIBAgEbQxs4ijgAAQAxeDE+mT4XOhcyejIeSx4KGAoNHw0FCwUTMBM4iTgDCAMKGQoRKREQKBASLRIgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxA1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIGDgYDBwMyfDIECQQNIA1n/2cnYScraSsIEwgFDQU8kzwmXiYucS4OIw5k92QSKxKB/XdHAAABJ0lEQVQ4jWNgwAIYmcCAGZkFBCysbNhUAwE7BxhwIrOAgIsbh3oGHl4w4ENmMTDwCwji0oAVCLEKk6SeQUSUNPWDCIiJS5CqQZI0DVLi0qgCMrJyyFx5BTQNikoQWllFFcJQU9fQ1IJKMmvrcLDjsElXT9/AEMwyMjYxNTMHMpgsLK2sbXC6zdbO3sHRCcJ2dnF1Y2Bw9/Dkw+sdBi9vH18g5ecfEBgUDExcIaFh4XiUR0RGRcfEMsTFJyQmJYNF2FJSOdK0cShPz8jMys4BMnLz8gsQwiKFRTg0FJeUloEZ5RWoEpU4NFRV43EtSsYkBqBkTGIAcsYcVqCmlkQNKXX1RKlraIRFZVMzkRpaoKzWNnliNNg0MsGY7R3EaOjsgjO7OWoYGAAorCvtfWDrzwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492322812;4.copy,1.1,3.810,3.437,3.150,2.19,2.14,1.1,3.800,3.437;4.copy,1.1,3.820,3.475,3.140,2.38,2.14,1.1,3.810,3.475;4.copy,1.1,3.780,3.494,2.40,2.19,2.14,1.1,3.770,3.494;4.copy,1.1,3.830,3.513,3.130,2.19,2.14,1.1,3.820,3.513;4.rect,1.1,3.494,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.544,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.471,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.440,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.500,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.345;4.blob,1.1,1872.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAAC61BMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxsKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwSLBIsbSw3NzfBwcH39/fp6emTk5MMDAwdSB1n/2cJFwltbSwBAgEWNxYzfjM+mT4xeDEnJyf29va4uLhISEhiYmLu7u61tbUGDgYjViN+fjOZmT54eDECBQIaQRo2hjY8lTwoYigOIg6qqqra2toEBARHR0f///9BQUFe6F4zfzNBQRqGhjYiIg4pZCk9lz0fTR8FCwX09PSEhITr6+uMjIxX11cKCgRkZCmXlz1NTR8LCwUTMBM1gzU7kTskWSQLHAsJCQlsbGzR0dGgoKBV01U/nT8wMBODgzWRkTscHAsAAQAUMhQxejEwdzD19fWNjY1a3lo3iDd6ejEQKBAtcC07kjutra1EREQBAwFl+WUsbCwoKBALGwspKSm3t7dfX1/t7e0UMRQ6OjrExMSXl5cODg4tby1d5l1SzFIyfTIgUCBc5VwRKREcRRwbQhseSx6Y4HkFAAACS0lEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDQlKKckOkZSg3g0FWjgqGjILBCeQVcEgoKiljl1BRxRBSkMdlvJo6dnFVFXQRDU0tXIZo6+hiE9bTN0AXMjTCZQaDsYkpNmEzc3QRC0srnIYwWNtgEbS1s0cXcnB0Ass4g4ALCouBwdXNHdMQVw9PdCEvbzDl4wsCfigsIPAPwDQkMAhdJDgkFEKHgUA4CgsIIiIxzIiKjkEXio2zxbQLAeITEtGFkpJT0IVS0/CZwcCQnoEukpmFLpLtloPfkNy8fFSBAv1CdDVFxfjNYIgqKUUVcMAM6rJyAoYwVFSi8quqCekYBSigppYKhtTVN1DBlMYmKhjS3NJKBVPa2knW0tEJIru6e3r7+iEiEyZOIlJvzmQQOWXqtOkzgPTMWbPnzJ03HyK1YOJCXLqMXcAAXAbYJi5avISBYemy5StWrgIJrF6zloFh3foNEKUbN+EyJGgxGGgwMLhs3pIRtBUotG37jp0QyV27QeSevRDevhW4DClwB4P9DAwHDh46DBY6cvTY8RMgxsn1p0DU6TMQpWfPEfbO+QsXcy+BxS5fuTr92lQg4zrEJTcgSm/eIuwdhhSN24vloWXmnbv3gOR9SJg8AAs9fPSYsHdA4Em5B0ziKRA/63m+7sXL2RCBjomvcBmCDlAr3tdveva8fQdhv/8whVhDcIOPnyg34/OXBRSb8fXDN8od8v0HScoBp8CqBRExuPEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.383;4.blob,1.1,3228.iVBORw0KGgoAAAANSUhEUgAAAMYAAAAzCAIAAABDpuCgAAAABmJLR0QA/wD/AP+gvaeTAAAJKUlEQVR4nO2cX0wT2R7Hz0z/8KctlNKdlrZQqvyrW4KI2hJZ76pgXTXeS7yadBW6G7LycrnZRDcbX/TBfTLGGIm5yz5tWPVGVyPxQTEr4p9EQAXrri4KUlhCq22nCwLt9O/0PtS7QkvLDB1A8HwyD+2Z32/OmZ7T+c38zvcMABTY1LxJf0VPxRKypNHrs48eXUvRmJXEqmisEGlEEeUoFeeOgx2KrYrsz7LpNRCy1NDpJJ2dNorGQW8Qf4xLyiUR5ZSGlMfhefnflyWHSug1ELKkyMnhZ2WldnXZqbvYOm2ZJZmsZNbUQhQAoNVq79y5QxCEzWZrbGzk8/nRzuZLZvlmeYokJcF2zw2NRtTQoFmUqj8cdDrJixdjY2Ne6i5jz8cC7sBHZR9NLUQLCwvb29sJgqiurj58+PC+ffsuXLgQ7Wy7bwMAyP4mS7Ddf8FiIRwOGrEhyDQbFEW0WuzIkbKGBg2Px2Gqakg0KIqsX491dFCNemFCZMjeZY+Ifexjx46NjIzs3LkzEAgAACwWS2tr66ZNm9rb26fa+cZ9hI0QqoWJtz6M0Vio1WIRhU1Nv/f04AAADgetqJBWVSnS07nd3fjZs/1m8zhTVUOi+fjjDC4XffwYp+to67QpqhTJmckepydcwt6+ffupU6fC4wkAcOPGDRzHd+zYETGkAADeUW8Kxljgu3p1qK3NElHocBDhD0ZjYVmZ+Nq14Vu3rC6Xn6lKIbHQ6SQmk9PrDdJ1dFlcLosL02LD14bDJWwej/f69eupRlarVSwWRzuTATLiRiwRRke9b974IgoDATL84dEju1LJr6xU8Pmce/dejYy4mKoXEk1KCrukJPPMmWdzc7d12LI2Zr0bUm63WyqVTrWQyWQ3b96M9uTwOB6HZ261RhM/8JlMzidPnKWl4m3bsj/9VGY2j9++baX1MAKhTlmZ2OXyP38+Ojd3+wO7ardKoBJMDE4AAMDly5f7+vrYbHZ4t16vD4VClZWVEW4IC/nK+5XmX4w9donFyUqlIGJLTWVHWxYVCb/+uvj06Q1MVQ2J4NChkt27VyRyBM2/NXmGvLdf1Go1QRDXr1/X6/VGo9HpdLa2tkb7iDSi+lC9uHSGgLgwyOW8xap6eSMWJ3///UaZLObP+88VK5o2buSg8VKY2Dqs/GQ5wkYAAGhvb++WLVsEAkFLS8uJEycuXry4d+/eaB/5Frn7ldv5xJn4OcwNiwXeTs0LWi02MjJptcb8eVEECQEQDIXiHAQ34SgLDU/OsAEA9+/fr6ioiF9xfk3+s/88C5HxjgtZiqxbh9279yqOQUZSkp0gyLhDivSTjm4Hth5zmqhddHL/kbvfsp+bxqXVVsgyIIXNPr1hw2a5nMmDZqgzaqw1iioFkweFLBFQBFkjFiOzG9JBvlmesyOH2WNCIBAIVRjLhkOWJWlpXABAMEjjsYySXgrywZKXl/bNNyUpKTOkoGOB8vkcl6tu+/Z5v1v69tvVT5/OkPGakaQkVmNjhSZKhAqZD3Jzc0OhkHymx7qeHtxicX3xRSH1o6GTk/4rVwZrawuYa+HM1NQU/PRTH0Vjrzf4+DFeHiVChcwfHs/ME7iXLplXrcqg/vdGAQDNzX27dinT5jPttGaNWK0Wnj3bT92ls9NWUpKZzJz2ARILFEUBAOPjMyvSJib8Dx/aqyhnkVAAQFubZWzMt2dPQhOH8amtLWhvt9KaVHn+fMztDpRNF6FCEkQjEjVoIuf+EQTxeDx+f0xdWnc3XlQkpHjRQQEAwWDo3Ln++Yt9bDZqMOQ1N1ONemFIMtTVZYexjxFQBNFi2JGysgaNhseJlFwPDAykpMQTVw4MvAEAFBSkTy1kIawopTcHAcjbO/nm5r6DB0uUSsEff0wwei4AAKDXK3g8zuXLZrqOnZ22qipFZmay08mYTutDg4OiFVJplUKRzuV24/jZ/n5zjAAXB48nOD7uk0pTpxYaC41aTBth2fR709sh9dtvf/76q7OmJv+773rm3PpY1NYWXLky6HIF6DpaLC6LxaXVYtf+rxiE0MVYWFgmFl8bHr5ltbpih7ZZcbsDAsG0y9vVoattlrYIMwfheJeXam7uq6lhPvalp3N37cqlG/X+oqPDptPB2Dd3HtntuMdTqVDsUioVvLlrzkgyxOFMy2KOeketLmvERgSIdyms8+dfHj+u02oxZvW4e/ascDo90SsXKPLggX33bpVKJRgcZD4ifwiYnM4nTmepWLwtO/tTmcw8Pn7bau2y0+5iLpc1OTntIjdL4AMAvH7t/uWXkdraAmaHVG1twfnzL8m5Cq3Gx329vaM6nQQOqTkTAqAHx3twvEgo3JadvS8/n+6QQlFEKEwaHZ22ajRW4Jv23WDIw3Ejl8vYLI1KJSDJ+gST4OvWYSdPlrPZDCssPljk9MOfTMZratqYnT3DMvRopo2elpYhLpc1dXKGy0WTk1kRG4uFUNkLANi/P99kwp8+/ZPuOUzFZMJZLBROzjCFxUVbcq1WC9+88Y2MTFIxnjYdSBCBixcHPv88v6VlKFxy9+7fo5dGffnl7R9/fDHrXgCAwZD3ww+9dE8gAr+f7O52rF+PmSiKUCFMo9VK7tyxxpUKv2OWaFJUJOTzIzNjg4MT4URR/L2Q5cHq1ZkGQ/7Row89HtprkSGQSLKyUo8f16nVGYvdEMhyoahIWFwM72IhEAgEApkrCyYjhiwKHD6nzlWXE7d/NSLRmU8+WTPT+6FmZBbNpM9HrlqVUVoqvnSJtjQF8v5D+siMVRniUrE5dv/aCcLichny8h44HN4gE3mErVsVbnfdvMqIIYuIYquizl3H4NsJZp/OWwAZMWQRsbRZfGO+Fcz17+xDar5lxJDFJRQM9Z/rL1jg/i0uFpFkvVIpWNBaIQuFqFhUT9YLGOpfSkua7HaiulrF4aB378Z7ERFkiULYCVW1CuWgr5joX6rSqHmSEUPeE/qa+woWuH+l0tRA4EC0lAWyPEiVph4IHMCY6F+qa3knJ/3l5ZKcHD5crLIs8U/6JeUSfg5/eCH7l3EZMeS9Is+QZ8SNaML9S8M/WkYMWU4MtQyxuKz4kzNUoPESi0CAXLkybe1a7Oef4eTMMoQMkGkr07C1mDmx/v0f3o90QP7t2ocAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.832,3.459;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAAH4AAAAPCAMAAAAVg4veAAABI1BMVEUAAABHHUd/NH8wMHdWVtQeDB6YPpgQBxAOBgYGBg4UFDJmZv0LCxtWI1ZxLnELBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwCAQKMOYw4FzgHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4tEi2SO5IHAwceHktjY/RlKWViKGJERKlCQqMJBAmUPJQpESkGBg9kZPccHEU8GDyJN4kBAAEoKGRcXOQBAQJ0L3RTIlNOTsI4OIqMOTn/Z2cIAwMUCBQaCxo5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgJLHkt8MnwyMn1TU86sRUXYV1eANIBDG0NFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAFQy1N3AAABCUlEQVQ4jWNgwAEYmfCxqAOYWXBKMTHiY1EHsDDjkmFlY8fN4uAg30pOTjiTi5sHlypePtwsfgFBIXJtFxYRFYOxxSVwqZKUksbNkpGV4yfXenkFRWEoU0lZBZcqVTV1PCzqAA1NYVxSWtr4WNQBOrq4ZPT0DfCwqAMMjYxxSZmYmuFhUQeYW1jikrKyxseiDrCxBVN29g5QATjLkc2JATcLSSFCL37g7OKKznRz9wDTnl7eUBk4y8cXphgbC0khQi9+IO6uhM7084fwAwJhMnBWUDADHhaSQoRe/CAkFIMZFg6mIiKjoBIIFgEAV0isDsPoGCxMMPCOjcNgEQBwhcTqUIpPwMIEAQAcmi2q1WONMAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.516;4.blob,1.1,2520.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.571;4.blob,1.1,976.iVBORw0KGgoAAAANSUhEUgAAADAAAAAsCAMAAAAUyMtVAAABiVBMVEUAAAABBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwUgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIGDgYDBwMyfDIECQQnYScraSsNIA1n/2cFDQU8kzwIEwgmXiYucS4SKxIOIw5k92QK73FmAAABDElEQVRIiWNgGAWjYDABRiYwYEZm4QUsrGDAhszCC9g5wIATmTUK8AEubh5SNfCSpoGPmx9VQEBQCJkrLIKmQVQMQotLSEIYUtIysnJQSWZ5BVYWHDYpKimrqIJZauoamlraQAaTjq6evgFOtxkaGZuYmkHY5haWVgwM1ja2BNKMnb2DI5BycnZxdXNnYPDw9PL2waPc188/IDCIITgkNCw8AiwSGRXNGiOPQ3lsXHxCYhKQkZySmoYQTs/IxKEhKzsnF8zIy0eVKMChobAIj2uJzJgIQGTGRIBhkTGLS0jUEFVaRqKO8goYq7IKV1SigOoaYbiGWqKsqKuHMgyqmIjS0MBaDGE0NqFKAAC42iXOMIem3QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492322914;4.rect,1.1,3.504,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.554,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.367,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.383,2.16,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.402,2.17,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.481,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.450,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.326;4.blob,1.1,3496.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,1204.iVBORw0KGgoAAAANSUhEUgAAAC8AAABxCAMAAAByfQoZAAABmFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzACBQIGEAYOIw4xeDEXOhciVSIucy4KGAoNHw0yezIgUCAFDAUeSR4gICD///8bGxsTExMiIiIFBQUfH00dHUkEBAssbSwjIyP39/cbG0M8PJQ8PJMkJFkJCRYWNxYzfjMEBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4LCxwsLG4+PpkSEispZCk9lz0fTR8DAwcYGDwxMXg9PZcpKWUHBxA7kTsLCxsmJl07O5I7O5EiIlUHBxIxejEmJl42NoYcHEQDAwgtcC07kjsJCRcBAQILGwsNIA1n/2cIEwhk92Tekbz3AAABqElEQVRYhe2X50/CQBiHD3ABeiiiIoo4cYIDUREU995b3AP33nuC/tuSolIU2v4SP9Skz5d73+Rp75rm7pcj5BuZnEAoYmKxB+LiMT9BqcIeUCdifhKVQb6GJmMTpGgxP1WH+WlqzE/PgHR9pgHys2g25BtzTJCfmwfp+QUaRC/MKYJeby6GdIASTC8tg/Si8gpE11uM0OutSuwcqayCdFJdA+k2aoX8WmqGfDutg/x6ih1qDY5GyCdO8AzRWjgmdzHo2VWTozmq76YMLeyKtLZF3eXtHQw2dkXknV3YF3T3YP7/pLevH/QHIH+wbyisHx4ZZbeqsR/++ER4Pzk1PTP7Wes9c9TNN+H8wuLS8kqgcBlW19a9Qta4sbm1TcjO7p5NiL1/cHh0fBLIAcupzs5rn51fXF5dM6VJcUOdHh7/9u7+IdSZH594/OeX8P6Vd0W/Ce1CYbB2oSBYu1DMiCIfff7gHxSajz7/GzMKzUev38WMQvOx+T04SvnIzV/mYyS48jEiHPkYEbHmo3R/5EO6P3Ij3R//BlHk4xfS/ZETKR/5EFU+fgDWy0tI4CvHUQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAnElEQVQokXXR1xKCQAxA0cWOaFDsBaxgBXvBXv7/n3xTrzPmaU+SyWSySr1DiyhENBZnIpGkU3qaCSNDZ0WDTcmxIW/RhSJdMuhyBazW6nBDmrDttOB2B+z2zG/2HRdlb6D+xJAcjUF3MsWSvo1yoPPOszmnLZbgSgJ4LR68kS28E37KPjxw/vHnxpZPn8IzE5crrxi53dnweH7eLySsCuR+omikAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,684.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4ZKGodAAAA6klEQVQ4je3SWVLCQBCA4U6LYghMzMK+qZi4sygqGnGF+1+JnlS3lfYAPGUeUv9XmUlVphrAQV55wUHlkJ0X4FFVNtgCPHZrbFuA6NVlAxW5YYBNRembEzaVfRWEciAIraNYHMXWTU/c9KxbbXGrTe50e0wqct8M2FTk4WjMpiKfnslxKsDzic+0BRejhJkXpJeyOy/5lb9Lso8r7esb5eT2jnE/JXdmQyx67jrKiwdUflwqP5m58rNJlV/MSvnV1JTfsnf9/XWsHc60P7JPZfz6His7P7/KuNn+u5/CgnK+yvlSLudrn/O1A7etNf8lb4LQAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.590;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAlCAMAAAD1C5tIAAACBFBMVEUAAAAGDgYDBwMUMhQyfDIECQQgICD///8bGxsnYScraSsTExMFDQU8kzwSLBIiIiIFBQUmXiYucS4fH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsSKxI+mT4bG0M8PJQ8PJMkJFkJCRYBAgEWNxYzfjMxeDEbQ0M8lJQ8k5MkWVkJFhYDCAMVNBUEBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU4izgfTB8LCxwsLG4+PpkSEispZCk9lz0fTR8FCwULHBwsbm4+mZkSKys0gTQkWSQDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBAzfzMLCxsmJl07O5I7O5EiIlUHBxIAAQAxejEwdzALGxsmXV07kpI7kZEiVVUHEhI2hTYhUiEmJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAg9lT0JCRcBAQILGwsJFxcBAgILGgsMHQwBBAEbQxs4ijgXOhcyejIeSx4KGAoNHw04iTgKGQoRKRESLRIJFgkcRhwwdjA6jzoIFAgNIA1n/2cIEwgUMRQqZyoraisOIw5k92Q5jDkdRx0JFwkPJQ8HEQc9lj0ZPRkGEAYiVSIucy4yezIgUCAFDAUeSR4D0xmcAAACaElEQVRoge2a+VdMYRjHb0UTKcqW5UWmsjS2TCUUIYQahabsawsVKWOLssxElgo1Imt2/yTnjs6Td9zccb73vs+cfH6Zd87M83mfz29zzh1NG7fExPL2RRtxEyaq9MU7EqDXq2fSZJW+eEci9nrlTElKVuib6pgGvZ0BKakW+qbPmDn6s+RZ0pdnp4Ve58ydh91CHfNFjHW+BQsXpS/+dXZmZIosg6ElS5ctz4auoQyXWGGhb+Wq1Wty1v48uHPz8tcVGE6t37CxsGgTdBFVbC621rdl67YSTdu+Y2fp2HO7du8pw26ihnKPlb69FZX79h/QtCpvtadmjKmDhw4fOXoMu4kajqdY5ztx8tTpM7X6sS6uXjRkGMycPdfY1Hweu4cqLrRY57vY2naJ3vkuXzGYuXrtejt2C2U4b+Ra57vZ8fuHnQZDt25Dd1DJHXHXXp/freOE3sqHQFedvb4soXMPeisf7nfb7HvwUOcvv56ilapHLta+KONxVw9rX7Th6+Xt+88IfaoXsIW+P5zQZp0nT8F+llAlulfy9TzrNzM1EOzErmEvVGmy9x/MOk5vwNTYQPA5dA17oUqzvZGbQwwmmXvOWRB0Q/ewF6o02xu5OcSLl+bmhl5B17AZqjTbG7k5xOs3WD9PqBLdK/lKxSDWzxKqRPfKvrfCB/XzhCrRvbKvRryD+nlClehe2fdeYP8kwROqRPfKPv/wB6ifJ1SJ7g3zNYCfmfKEKtG9sq/Yi/XzhCrRvbLv4/AQ9gKWUCW6N8z36TP2qRRPqBLdK/tiv3yF+nlClejeMN+371A/U6gS3Tva9wOLEJa1nOkBZAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.628;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAAF8AAAAlCAMAAAATK8VgAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAA50lEQVRIibXW11bCYBRE4QQsxOAfCcWAUiyJUlWaxEZ7/3fyzrWYs7zbzAN8t7M9729+wUOnXvHkFPWNd3aO+sYrBReob7ywjPrGu3Q+6qsXuSvUN14lRn3jVWusr149ZH31GtesL17SbKG8ejfuFvXVa3e6qK9e7w7l1bt/iFBevMdOivLqZU8oj3v/7/m4Xn/A8uKlwxHKi5eM2yiv3iRgu0S9l1eUN97blPXFm7kJyqs3dxnqq7dwS9RX792x0abeKv9AfeN9wk2iXjxmffW+8m/UN97Pmn119QqbLeobb7dH/QPvF+fuFcf2YcbpAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492323019;4.copy,1.1,3.810,3.437,3.150,2.19,2.14,1.1,3.800,3.437;4.copy,1.1,3.820,3.456,3.140,2.38,2.14,1.1,3.810,3.456;4.copy,1.1,3.790,3.475,2.30,2.19,2.14,1.1,3.780,3.475;4.rect,1.1,3.514,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.564,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.614,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.367,1.8,2.46;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.595,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.491,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.333,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.326;4.blob,1.1,6108.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.562,3.497;4.blob,1.1,2072.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.535;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAMAAAAaPFxiAAACXlBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1ezMsgAAAB4ElEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cJEk5ABUfaWdZyF4jAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.571;4.blob,1.1,1836.iVBORw0KGgoAAAANSUhEUgAAALAAAAA4CAMAAABqioLZAAACDVBMVEUAAAAqKio+Pj4aGho0NDQREREJFgkvLy8NDQ0FBQUKCgocRhwwdjAFDAVj9WMeSh4wdzBW1FYxMTEYGBgsLCwGBgYRKRE6jzoIFAhCpEJEqEQBAgE1gzUbQxtj9mMGDgYUMhRm/WYLGwsUMRQ8kzwDBwMBAwFd5l0oYyg6kDpMvEwqZyorais4izhOwU4CBAJe6V4mXiYBAQECAgI5jDkdRx0SLRJn/mcNHw0eSx5j9GMECwQoKCgUFBQFCwU+mT5U0FQyfDJEqURCo0IICAgEBAQSEhIrKysJFwkQKBAuci5Y2VgGDwZk92QcRRwJCQkLHAsPJQ8KGApm/GYWNxYoZChc5FwHEQcSLBJKt0o8lTxOwk44ijgBBAE9lj0ZPRkkWSRf7F8CBgINIQ0ECQRi8mIgUCADCAMyfTJTzlMfTB8/nD9FqkVRyFFn/2cnYCdW1lYtcC0GEAYOIw4VNBUIEwgiVSIucy4AAQADAwMyezIeSR4MDAX19WNKSh4nYScraSukpEKoqEQFDQVGRhz29mMODgYucS4DAwHm5l1jYygSKxKLizjBwU4tLRL+/mcfHw3Q0FR8fDI0gTRyci7Z2VgzfzMYGAr8/GY3NxY2hTYhUiG3t0qVlTw9lT0aQRpZWSTs7F8GBgILGgsMHQwJCQTy8mJQUCCcnD+qqkUXFxcyejITMBM4iTgKGQr64E36AAADD0lEQVRoge2Z91cTQRDHL1E0gGhAxRIQFIIVlVNBbCcKauy9RoyIRrEr9oK99957b3+jeZcj3u7O7R7ZuU2e+vkhb3cy893vvTeX3L3RtKzC5/d3S666+/05qXCPDNkR4+sZyE2u8nL+GM7vZUsp6N1HpBIsJLYuKliK+rpK8/VLLfunDBcPGGjPGTRYpFIYJPfiChYJw6GSUiInf0gZX6R86DAyIKwAkDBcURkmcqqGj+CLjBxFBYQVABKGR4+hkqrHcjXGja+hQ4IKCMuwPsHEMQ0yPHESlVRbN5l3VP2UqXRIUAFhGZ7mN5lOfGdeg+5keIZRQYvNbOAdNWs2G+NXQFiGGwMmTfav5pjXMNfJ8DwjQovNX8A5aeGixWyQW8EzDLVEk3kNS5wMLzWW0WLLV6x0PmnV6hAb5FbwDIMtYQMwvMZYy6StW+980oYoFOVVgHBawg5geGPzJiYttrnFSWFLHXt9/AoYiZ+1YIxJa926LfHZEjepsq+07TtA4WSFGsNtJWzezl2Jj917TPbaV9q+/bCyWeGFYev3TdMbOw0faD4IJ0faTQ7ZV2i4NQw9Xh4+chTRiUtcGk7clJ2Pl4HAMSsYPt7F/ss4BScy7eAfoSwszskqyhtaif3JU6e9O8zlTcen4wy5P3sOQdQBFMPnK8m/3QsXLyGowqAY1mouE9srV69hqILgGL5ukG+TN25iqIIwhkUvSyBxo53Y37p9R86WM4xh0ZMxTHUbub97T8oVB8aw6MkY5n6M3D94KGOKB05LaI+oN/jHT57KuOKA1BLPnlOBFy9lXHHAaYnQq9dU5M3bd1K+HMH5WXtvfKAiHz99xhBm4Ri2ull3oVIaZR7lv3yVseUMx3BRspu/uVD5Xo/nSADHcF6ym3PFIj9+xhEt8cHo4V/RYnkRlURqM+2ARU/dfHqX/1Qywt84RVIE4hRJDYhTJDUgTpHUgDlFUgLmFEkJ6Y8MgCmSCtIfGQBTJBWk3xLAFEkFuFMkBeBOkRSAO0VSAPIUyXu8mCJ5yv8pUlZjnyL9Bq6/jGtut0KdAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.584;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAAOwAAAAfCAMAAADTC9GRAAAB8lBMVEUAAAABBAECBQIBAgEfTB81gzUxeDE+mT4XOhcGEAY9lj0OIw4KGAoNHw0FCwUiVSIucy4AAQADBwMyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsgICD///8bGxsFDQU8kzwSLBITExMmXiYucS4iIiIFBQUSKxIfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsDCAMVNBUbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhY4izgEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU0gTQkWSQLCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKyszfzMDAwcYGDwxMXg9PZcpKWUHBxATMBM7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBA2hTYhUiELCxsmJl07O5I7O5EiIlUHBxIxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lT0mJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgLGgsMHQwJCRcBAQILGwsJFxcBAgIbQxs4ijgyejIeSx44iTgKGQoRKRESLRIJFgkcRhwwdjANIA1n/2c6jzoIFAgIEwgUMRRk92QqZyoraiuAAMnPAAAB5klEQVRYheWYVXPCQBhFUyhNXagbdXd3d3d3d3d3d6gL9f/ZDizThJCWdHYTaM8Ld3fzZc59C4thaqLDk8EnJs1HV/CrMT1chj4xaT4Ghka/GTM2kWFKTFqAmbkF1wrsIbS04lqBRaxtuDbgDFsh1wZsAFra2TtwLMIGipaOTkwnnUUu0G1QA1q6urkzHHQWecC3QYyipacXw0FvkQ98G9SAlr64LXnfzz+AuHQPVJoLCpb/hoSGoVKDD2gZjkeQ9yOjomNiQebHxeN6NPMJiUnJKej04KJomaqrdJCWnpGZlf0ZeDm5efkFtC8oLCouKS1DJwgV0LK8gnpUWVVdg2G1dfU/fAM3NDY1IzBDAGjZ4ql80NrW3tHZhWHdgp6K3m9e0Nc/MDg0jEoPLqDlyCh5e2x8YnJqWhYt7Gbw2Tia8bn5hcWlZYR+UJG35K/kkLdX19Y3vlabW9s04zu7e/uIzOADWh7gh+T9o2Py+oRm/vQMgRQqQEuxRI0/uNp0GaMS0PL8Qo1ntekyRiXylt2X4Wo8q1WXMSqQt7ySXHMtwgKg5eYN1yJs8D9a/i9uVaS/yt09NTHiQUr3maFxXD8+URIzHqTPsGQQwxeIKYkhBVIeNB20vLgJKYkhRq/QbBDz9k5MHx9IUkaWUOf7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAUElEQVQImRXMRwKAMAwDQWM6gYTeCaH//4fIlzmtROQxM/lBCDmKxSTNIKtcLDRBo0vIVS02rdgpsR/gOM1w0Svc7A7dge15GabbPvh8P7Q/jP4DuQRHJToAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.628;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAnElEQVQokXXR1xKCQAxA0cWOaFDsBaxgBXvBXv7/n3xTrzPmaU+SyWSySr1DiyhENBZnIpGkU3qaCSNDZ0WDTcmxIW/RhSJdMuhyBazW6nBDmrDttOB2B+z2zG/2HRdlb6D+xJAcjUF3MsWSvo1yoPPOszmnLZbgSgJ4LR68kS28E37KPjxw/vHnxpZPn8IzE5crrxi53dnweH7eLySsCuR+omikAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492323124;4.copy,1.1,3.810,3.437,3.150,2.19,2.14,1.1,3.800,3.437;4.copy,1.1,3.820,3.456,3.140,2.38,2.14,1.1,3.810,3.456;4.copy,1.1,3.790,3.475,2.30,2.19,2.14,1.1,3.780,3.475;4.rect,1.1,3.524,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.574,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.345,2.25,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.501,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.470,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.174;4.blob,1.1,2316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.326;4.blob,1.1,6508.iVBORw0KGgoAAAANSUhEUgAAASAAAABsCAIAAABFDPh0AAAABmJLR0QA/wD/AP+gvaeTAAASxUlEQVR4nO3dbVATaZ4A8E7nhZckEKDpIEkIYAigsIgICSfrOiMI6iynO4s7cQRmjpvxy7k3tTNb1tXWjXWz+2HPspzZ8aZutKa25hj0alw9WWeLccpBHMdTdACjoyMvgsqRYJIORCQk5PU+4CAESLrTHSDh/6t86nQ//dBdD/3k6ef/fxAEAIAgCIJwBYIGqzVt+3YGy2QzWBYAYc3jcCSsWYMVFg6cPr3UdQEgEkm3bm2YmODFxS11RQCIRCw2u1avz2loYKpAlKmCAIgAXre778QJZV3dUlcEgAiVmJ+/z+MRyuWMlAaDHADMYjMaM3btQrnc4cuXl7ouAESin/zmN6/09Cx1LQCIULEpKW+6XLhKRb8o6CKC5YsXF8eOinJPTi7yeZ3j4+LSUkFa2mBLyyKfGoBFwuHz6wni9dFRnki0+GdXaDT1BIHyeDTLgWF6sEx5XS67yWQjCI/Tufhnf9jczObxmJ02BQB47meffFJx6tRS1wIAAAAAAAAAAAAAAABIW7fuwO7dd5a6FgCQJauUbTi4geTO7Ch22dGyxLxESqdg8kWzUlnb2/sZgwUCEFJitdjQbiC5s3vSTdwkxKViSqdgrIFh2HqRKLevr4mpAgEIKUGaIHZVrPG6kfwhhnZDUkESO5rCDF7GGphSWafXt1mtOqYKBCCkxGqxpccyaaEwk9jSbXFNuJKLkskfwkwDQ1GOQqHp7W1kpDQAQo2FsvAS3HCNbP9witfjNV43UuolMtPApNJKLpc/MHCGkdIACLWEtQkoDyVuElQPNLQb4hXx0UnRJPdnpoEplXUPHpx1uayMlAZAqInVYrPW7J50Uz3QqrNadVZchZPcn4EGxuPFp6dXQ/8QhAtODCepIIlq/3Ca4ZpBrCbbS2SggWVm1tjtZp2ulX5RACwCrAhzWp2j3aPBHW68YYxOjhZmCMnszEADUyrr7t8/6fV66BcFwCIQq8WmGybEG+ThjjHH6L1Rkg8xug1MKMxYtaoM+ocgXERj0fGK+KD7h1OM14zJxcksDivgnnQbWFbWXoLQjozADCkQHnAVPj40btXTGpAjtATKRslMm6LbwOD1FwgveDHl119zeZweU6cJLyE7lggAAAAAAAAAAACwdHA8hn4hkNkXgHls3Sp97bXsxT7rgQPr7tzZzUhRAgHXam3Yvj2NflGVlbKDpAO/AQgoNzfh/ff/DsPmmTKfnp7u9XolEgnJoqg9wWprlZ991kvpkIWMjzvPnn1QV6ekX5RaLW4nHfgNgH8oytqzR/G3vz0iCPtC+9jtC37lWxr5E69fj+Xmipqa+sgf4l9jY291tTwujtYCFmlpglWrYq9TCfwGwI+CgiSRKOrKlcfzfouiKIIgY2NjJEuj0MDq6pRtbXqdjrGgr9ZWncXiqKnJpFOIWi3u6bFYqAR+g7D2c/nPt8m28Tn8EJVfUoLfuzc6uUCoGIvFstvtzjkLvmzY8G+Fhf8SFeU7eYpsA+NwUI1G0djITP9witvtPXGij04vEUVZJSX4NdozX0AYmXBN7JDv+KP6jxqFBo/xnazEZrG5KNfnw0ICz8qdlpUV39+/4AOqv78/Jmae0cXJyZH16/91797/Kyv7j/h4xfR2DsmzVlZK+XzumTMDMzeiKIvHm9VE3W6v0+kh8+2Uxsbet98ukMuFjx49JVmTmdauTeDx0JvUA79B+GrVtV41XC3BSzaKN75X/N5t8+0LQxf6njz75VKfXa/CfZd+PfbDsS6ii0zhfD5XKOQajTaqtfr++z/19HyqUOzJyfmHX/2q59GjL27fPjI8fJlsy/7883KHw1Nbe3Hmxpdekn/xRdXMLX/968OdO78i8+00rfaXp08P/OEPpP5+H2+8ket2e//85+4gjgURQMqX/iLjF2sT135458O7I3cRBMGiMT7Xt/dospkmXBNkChSLY957r/j99293d1uCrlVS0k9Uqn+XyapaWraReoLFx/Oqq9Orq8/7bP/22+Hi4v+ZuWV0dJLkt9MaG3v37VsTRAOLieEUFCR99NFdqgeCCBDFjipOLi5bVSYXyDtMHbof8wWOTo4+cTzx2dnlcZEslstFEQRxu4MMxuRyBatXv5Kb+48YVtTf//nIyPekGlhNTabZbG9t9c15+OSJo6PDtNBR/r+ddvLk/UOH1CoVTnUksKgIs1qd3cEGfoMwJeFLXpS8WJxc7EW8V4avHP/h+MjkyPS3NLuIVqsLQZCoKAqpRackJubn5/969epXvF5Pd/cnFy7sHh8fREj+BqurU548ed/jCTbG2q/HjycuXBiqq1NSbWBqtfjGDZM3JJUCy9cWyZYcUc65R+euDF+xu33fR517eK51TnoYky3wP/opT5863G5vQkIU1Vrl5/+zRFLe0XGwu/sTh4PsID6CIEhGhtDj2ZdHMec9JRqNgiDqfUZE/MOw6I8/3pSaGqqxWrBsiWPEKCuEU/wOHFin0SgC7zebSJSNovM8rgJXdO/eLK2WuHNnJOCeQWtufsjjsSlNm1Kp8KGhcT29wG8Qjgw2gyfYDEssDgvloj4fFjprqO/u3dE1axKolmyx9Hjm+6UXuIuo0SiOH79H9XyU2GyuU6f69+zJam5+SPKQ4mL822+HQ1kpEIHWvbNubrq1nv/qMVx9/ir1ypXh7dvTVq+O8/M2jDwKL+AACHexKbHsOQMYdsLutM6amVFTk5mWJjhy5Db8wgeAeVFR7N/9bv3OnelLXREAIpRAwN22jYFYKgBACFF+oeYjNiXW6/V6nJA3G4B50H2fkFKWsvPKTl48rZguAMCCXmh8ofJs5VLXAjwDCRT8YEexy46WkUl5HZCsUraBxHVm4I34tbevSbdKZdtk9IsC9EECBT/ck27iJkFpDdiFiNViA4nrzEADs5vs9//7fsE7BfSLAjRBAoWADO2GpIIkdjSt0QdBmiB2VayRxHX2bWCJeYl5+/NmblGpVN98843NZjMYDEePHhUIBHNLGTg9IHlREiNmII9cEPLyEvfPrvOKBQkUArJ0W1wTruSiZDqFiNViS49lksR1fjZVioWykouTZZUyvoT/9MHz4OLs7Oy2trbLly/v2rUrNTX18OHDmZmZO3bs8CllaqZJ6s9S+0/106n3NDabhaK+s0xcLs/MN+soyiouTq6slEkk/AcPggmIjjBTCRROnx4IvOsK5vV4jdeN4lLx4/+dP61NQCyUhZfgA+SuMwfloillKdIKKS+eR3QSfU19YwPPp2D9/ve/Hxoaeumll1wuF4IgOp3u/PnzL7zwQltb28xSHGMOm8EmyhUFV+O56uuzVXPWmT527IeuLgJBEC4XLStLqaiQxsfzOjuJpqa+gQEGpo2FO0igQJKh3SCtkEYnRdvNZLOvzZSwNgHloQS568zJrs/GirDBlkH9Rb3PjCwEQbZv3/7BBx9MtS4EQb766iuCIHbs2OHTwBAEmRydjGEi1fCUc+cezo3vNJmeZUqor88uKsJaWgYvXtRb59R5xVKrxVqteaF0SGCaVWe16qy4Ch9sGQzicLFabNaa3eSuM2rsMNoJu7RcKq+W86WzwqtiYmL4fP7jx7OepHq9HsOwuQV5XB6aPxxnGh2d1OutPh+b7Vk77+gwEoS9vFxaXS2XSiEkDEF+TKAACbZIMlwzkFxk2QcnhpNUkER+CT+OWWs23zJjhZisSpa6OXVsYEx/ST81PGKz2SYmJlJSUmYekJqa+vXXX88tiMvn2k3BPHDn5b+LqNWab90yFxZiVVWyzZtTBwbGLl3Sr/ChM0igQInxhjHj5QxhhvApxV/vWBHmtDpHg7vOohxR/lv5Gz/cOL3lzJkzvb29HM6zsZDKykqv11teXu5zIIvNemPyjbx/YmwoD8Oi5XKhzyc2dp7otZwc0Vtv5X84o84r0zvvFLz8Mq0UritN3q/zFNQjlwveKcikeZ35kuedrtzcXJvN9uWXX1ZWVtbX15vN5vPnfXNLIQiSmJe4z7sPK5yn67g4JJIV3VEMmEDhl5mZxzZt4qKwmM5zeDFeeqSUxaEQEhmNRW/6eBOfSqKKea64dUZy7Hv37m3ZskUoFDY3Nx8+fPjUqVO7d8+zuopki2RieMJ8y0z+xMxiMKF3OAqYQAFlsbwI4ob4wRkILYGy0ZnTpgImFMBV+PjQuJVKoorAKQOuXr1aVlbmf5+s2qy7/3nXG5q0UyCggAkUEqKijDabBxrYDB6nx9Rpwktws/bZgyFgQgG8GB9e/EQV6TvT9+r28ugtkgJCJ4bD+XDjxhdJL2m1YsWmxArlQp8Pl89dyjol5CbU6mulFdKlrATwC2Wx1mMYZF8JS5IXJWk7ILIaAADAomNs7gVYtqbWEA16QQNAB7wYiXwKRdxvf1sQE0N2LTjAoAANTCDgWq0NlJJaB+fAgXV37szzhm1eUVHso0fLQpouP+ykp6d7vV7JfEOFXV2ETmd97bXsxa9VWKuUyQ5uoJt8IUADGx93nj37gM4qryTV1io/+4zs+rSTk+6bN4lSJgK/I4zdPv900NOnB9asSYB/SZSoxeJ2A93J04G7iI2NvdXV8rhQvuZavx7LzRU1NfWRP6S93VBQkBTN3Pz9cIeiKIIgY2Pzx8U9fer87jtjBbxNIS1NIFgVG3vdSHcGeeAG1tqqs1gcNTUhnEhaV6dsa9NTmu7U3W2ZmHAV0Qv8DlN5iYn783znVbNYLLvd7nQuGB3X2Unk5Ijo/KPMS8zbn7c/6MPDi1os7rFYLJN0ky8EbmBut/fEib7Q9RI5HFSjUTQ2ku0fTvF4vNevG1dULxFlsVQ4/m5R0f68PD7Xd3pBf39/TIy/gNf+/icIgiiV8TM3sllsLsr1+bBmLwmCslAVrnq36N39efvnLn8ckVAWqwTHr9HuHyIkV7hsbOx9++0CuVz46BHzqS8qK6V8PvfMGcqZJNrbDRUV0qSkaHNQgd9hhIuiZSkpFVJpPI/XSRBNfX0DC3QF/bDb3WNjjpSU2Jkb/S+4ykW5ZSllFdKKeF58J9HZ1Nc0MLYiEn6sTUjgoehNgoHkC6Qa2Pffj9y+ba6tzQpiqfKA6uqUZ88+mFoblxKdzqrTWVUqvCWowO8wUp+dXYRhLYODF/V668KdwIAmJlxC4axHn/8FV+uz64uwopbBlov6i1bnCopXUIvFWrN50s1A8gWy78EaG3tra5nvJcbH86qr06n2D6ddu2ZQBxX4HV46jEbCbi+XSqvlcik/+E6ax+Plcmfd8dHJ0TmZGfQ2l+3H83YQdqJcWl4tr5byV8oASQyHU5CUxEj/ECH5BEMQ5OTJ+4cOqVUqnNnI/JqaTLPZPje/DUk3bhhffjkjI0MY2WnbtGbzLbO5EMOqZLLNqakDY2OX9PogBrh4PPb4+KwHoP8uotasvWW+VYgVVsmqNqduHhgbuKS/dN14nc7fsvwVYZjV6eweZSb5AtkG9vjxxIULQ3V1SmYbWF2d8uTJ+55gA8nGxhz37o2q1eLIbmAIgngRpIsguggiRySqkslezcqi2sBQlCUSRY2OzhoW899FRBDEi3i7iK4uoitHlFMlq3o169WIb2BqsfiGybQE88o0GgVB1PN4jM2uysgQejz7aL79LC7Gjxwp5VAJ/I4AEuodxdRU/rFjm2SyeRIzUzlvhAeVYdHRH2/alEqjH+6DQmtpbn7I47FnTpvi8dDoaLbPh81mkfkWQZC9e7O0WuLOnRE6f4BWS7DZ6Eqbo6CzUh5yyM0VPXniGBoap3feIDvz4UKF40Pj43rql3chFCaA2myuU6f69+zJam5+OLXl8uW/n5tc7fXXL336aU/AbxEE0WgUx4/fC67e05xOT2enqaQE12qXLCNIWFCpxN98o4ekAf4V4/i3w0wmBaDVs8rJEQkEvm88Hzx4OvViyv+3YDGtW5ek0WQdPPid3Q55fwFg1KpVsYcOqXNzE5a6IgBEopwcUX7+yvqNCgAAAAAAQGRatIQCwA+ugNtgbUjzexfyEhM/+ulP18+37hQIKVoRwQ6HZ82ahMJCDJYtXUIehydhTQJWiPlZ1NRos+msVo1CccNkYmSSOFgkW7dKJyYaQppQAAQk3SptmGiA7OXLEN2JhYuQUAAEpGvVOSyOTLgLyw/dBhbqhAKADK/b23eiTwl3ISLl5yd6PPvkct91X8BiSsxP3OfZJ4S7sMwwkPbMaLTt2pXB5aKXLy/60kngRzajLWNXBspFh+EuLCfMBHeFKKEAoKS3sVcJdyEipaTEulxvzg1OAYspNiX2TdebONyF5YSZzLjj487SUnFamiDiEzwtZ85xp7hULEgTDMJdiDyMJxQAQVBoFPVEPQp3Ydlg7E7MTSgAFt/D5odsHtv/tCmwmBhbPMHl8qxeHbdhA/6Xv8C0qSXjcXniVsfhG/ABuAvLw/8DvP0ikEkw43oAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.497;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAAHUAAAAPCAMAAADtY3ApAAAA9lBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1dFRaoPBgbzYmJuLCxUIiIBAABR8QRcAAAAv0lEQVQ4jWNgoCtgZGKmr4UQwMKKKcbGRmsWOwcniOLi5oFbysvHL0BjlqCQMIgS4WASFYPaKi4hyUtrlpQ0mJKRlZNXUGSgF1BSVoGyVNXUNehmraYWmGLU1tFl1aObrfoGQELJ0MjYxJRudjIwmJlbMDBYWulzwkWonV+wAjVrBgYbWwSf2vmFwc7eAYPF4OjkjOIKaucSBhdXNwwWg7uHJ9YwoBrw8sZkASPVh6aW+vr5Y7BoD9wCAjFYYAAAUiQcWW+mcgkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.552,3.516;4.blob,1.1,1484.iVBORw0KGgoAAAANSUhEUgAAAXgAAAAPCAMAAADZEyRZAAACClBMVEUAAABHHUd/NH8qKiosLCwGBgY+Pj4RERFHRx1/fzQgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAeHgyYmD4QEAciDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnFWViNxcS4jDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FzgCAgGMjDk4OBeLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctLRKSkjsHBwMtEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGJlZSliYijQVFR8MjJUVNAyMnwJBAmUPJQpESkJCQSUlDwpKRFyLi7ZWFguLnJYWNk8GDyJN4kBAAE8PBiJiTcBAQAYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlN0dC9TUyK3SkqVPDxKSrc8PJUUCBQaCxoUFAgaGgtZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwBAQECAgJLSx58fDIJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0MICAgxMTEXFxeAgDRDQxucPz+qRUVFRaxXV9g/P5xFRaoaGho0NDQKCgoNDQ0FBQUGBg9iYvMsLG4DAwMiIlQAAAFu+aA6AAACCklEQVRYhWNgAAJGJgZaAGYWLIKsbOw0U8fBSYrzGLi4edBYvHz8UBFiWdhMQQYCgkJoIsIionA2EyNJDiYW0D3gOTlIcR4woMTQWeISMEliWdhMQQICgpLoQlLSMJaMrBxJDiYW0Dvg5RUUSXKfErcyOktFVY2BNBY2U5CAuqAGjKmpCaG1tKEMBh1dktxLNKB3wOvpk+Q8BgNDDJaRsQmJLGymIAFTMxjL3MLSCsywtrGFiNjZO5DmYGIBnQPe0cmZNPdhAy6upLKIBW7uHuYQlqcXhPb28SXHiYQBnQPezz+ANPdhA4FBwSSySAchoWFgOjyCbCPwAzoHfGQUac7DDqJjSGWRDmLjQGR8QiL5RuAF9A34pOQUEt2HFaSmkcoiHaRngMjMrGzyjcAL6BvwObl5JLoPK8gvKCSRRTooKi4BkqVlZBtAANA34MsrSHQeDlBZRSqLdFBdw8BQK1tHvgH4AV0Dvl6hgUTn4QCNTc0ksogELYKtMGabRTtDRyclrsQL8AVUVzcYdFFLHUNPL4YUsl7iQV//BBJZRIKJoZNgzMlTpjJMm06adhIAMwump7tmQAJqJhsYzKKWOobZczDsR9ZLApg7j1QWcWD+AgR74SISHUUSYGZjW4wutoQNElBLl4HBcmqpwwaQ9Q48WLFyFb2smoHF08DAWE1rdYMTTFqzFpkLADdtpDrFhvAkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.535;4.blob,1.1,1980.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAACx1BMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkV7gB8/AAACwUlEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaNgsIAzZ89RwZTzF6hgyMVLlyk35MrVa5QbwnD9BhUMuXnrNhVMuXOXCobcu08FQx48fEQFUx4/oYIhT589p9yQFy9fUW4Iw+s3RCsFAGzqnbVs9zLwAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.571;4.blob,1.1,1664.iVBORw0KGgoAAAANSUhEUgAAAMQAAABeCAMAAABLhUt8AAACBFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwBBAECBQIbQxs4ijgAAQAxeDEXOhcyejIeSx4KGAoNHw0FCwUTMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjAgICD///8bGxs6jzoIFAgTExM1gzUiIiIFBQUUMRQfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsqZyoraisbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhY5jDkdRx0EBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysJFwkDAwcYGDwxMXg9PZcpKWUHBxA7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBAPJQ8LCxsmJl07O5I7O5EiIlUHBxIxejEwdzALGxsmXV07kpI7kZEiVVUHEhIHEQcmJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAg9lj0ZPRkJCRcBAQILGwsJFxcBAgIGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4NIA1n/2cIEwhk92RpKapaAAAClklEQVR4nO3b6VMTMRgG8AVUBCQgohaEAsUDlYpS1AriLYJWVBRv8Qa8b0Hl8OJQvMUDbzyQyj8JU52hu+zahCTzvqH5fWmSJjPPt+7mmRqG2mJioRMIEDdpMnQEAabEQycQYGpCInQEAZKmQScQIJnEQEfgl0JSoSMIMD0NOoEAM9KhEwgwMwk6gQCzZkMn4OfKyISOwG8OybJdz3aHuMJHaOXk5tmue0hIfvgIrbnz7NfnLwgpCB9htXBRCnQEbotzC6Ej8PMugU6gFUEHEGDpMobNxb4SaUE4FC5fwbC72LdSWpLxc/lzWLav8pXKSsKhLMF0VbO6fE34NHGtZfu69X8/N2zcJDUWm80VpumWyqqt2/6NXYHtxONwrHrHzl01UoOx2L3HPK/du2//gYMjA3fmocNH6hzPHT12/MTJU3Kz0SogZWPWTtc3NBrGmbPnIjwjnb9w8ZKkWGwuE69l5crVa9dv3Bx5lPI3pTf/5+St23daWttkZqPWTNpN87v37j942BEa5sV1kq6Aw7nuR497njyVHI7WM2K+9nv+4uWr0Zn3da/DuTdv372Xl4pRdt8H0/zjJ/P3nx3OffkqJ8/4dEW+psH/Uprmj7gF/0vpt77+SFvwv5Qa33/YXw8oJfbnL+gIAgz8hk6gmURRezoYdPr5w4GqPR0M/pEehAdVe1oXdMtPwoOmPe0fkp+Di25P0dDtKRa6PUViQrenSnFqT5Xi1J6qRLenSOj2FF7UtadIsbWnODG2pzhZ2lM1WdpTNVnbUxXZtafKGdueKsjanirJ2p4qydqeqomiPcWPoj3Fj6I9VYBuT9HQ7SkyUdSeYqf/e4qG/u8pFro9RUO3p1jo9hQJ3Z5iodtTHCZOezoML6lfryFtNuwAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492323230;4.rect,1.1,3.534,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.584,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.326,2.45,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,2.56,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.511,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.480,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.333,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.603,3.316;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAADcAAAAXCAMAAACYqSdCAAAAeFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sFDAxj9fUeSkpCpKREqKgcRkZj9vYBAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVkCBgYECQli8vIgUFA/nJxFqqoLgEMnAAAAV0lEQVQ4je3StQ3AQAAEwQczvZkZ++/QPWxmyZuPLjkhpBQkpS2bOMf1FBr8+2R+EDIYxcwlhh06zXI2WJTMVXXDYNsx1w/MjdPM4LIyt+kdueO82OD9vMWUAxTJoNO/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.345;4.blob,1.1,6196.iVBORw0KGgoAAAANSUhEUgAAATQAAABZCAIAAAA//k/4AAAABmJLR0QA/wD/AP+gvaeTAAAR3ElEQVR4nO3de1ATeYIH8O7Og4QkEqDpRpIQwBBA4RAREk/W9QEGH8vpurgbR2D2vBn/OfemSresq60b62bmjz3Lcub0pm60trbmEL0aV0/W2XKcchBfp+gAxtfIQ+LjSDBJByIS8k7uD1wGQiDd6Q5E8vtU/urHr5t0/ehfun+/7w+CmLN06f7t2x8yWCAAxCyZRrb8wHKSG7MSWBVHK1IKUygdAqF+VtNSKut6ek4wWCAAxCxcjZvaTCQ39rl8xF0CX4FTOgRjlRNFl4nFBb29TUwVCAAxS5gpTFyYaL5tJr+Lqc2UWpzK4rHI78JY5VQq643GVrvdwFSBABCzcDVu67a5bC7yu9i6bN5Rb1ppGvldmKmcCMJWKLQ9PY2MlAYAsQxGYKwcM90i26YdE/AHzLfNlFq2zFROqVTD4Qj0+rOMlAYAsSx5STLCRYi7BNUdTW2mJEUSL5VHcntmKqdSWf/06Tmv185IaQAQy3A1btVZfS4f1R3tBrvdYMdUGMntGaicXG5SVlYNaNMC8YDNZ6cWp1Jt044z3TLharItWwYqZ05OrdNpNRha6BcFADEOLUU9ds9Q11Bku5vvmHlpPFG2iMzGDFROpbL+yZNTgYCfflEAEONwNW65Y4ECEe7uHnYPPR4iefOkWzlFouyFCytAmxaIBzyUl6RIirhNO8Z8y5xWlgaz4bBb0q2cubk7CUI3OAh67QHzH6bCRvpH7EZaDz4JHYGwEDJd+ehWTvB6E4gfWBnl15tT+T1+S4cFKyf7zBYAAAAAAAAAAAAAAAB4G2AYn34hTA62BgAAgqD166Xvvps320fdv3/pw4fbGSlKKOTY7bs2bsykX5RGIztAOjACAKKqoCD500//FkVDDD3JysoKBAISiYRkUdTunHV1yhMneijtMp2REc+5c0/r65X0i1Kr8TbSgREAED0IAu/YofjLX54ThHO6bZzOaVcFl0b+wMuWoQUF4qamXvK7zKyxsaemRr5gAZdOIZmZwoULE29TCYwAgCgpLk4VixNu3HgZci2CIBAEDQ8PkyyNQuWsr1e2thoNBsYGbba0GGw2d21tDp1C1Gq8u9tmoxIYAcStn8l/tkG2QcAWRKn88nLs8eMh1zRDPWEYdjqdHo8naPny5f9aUvLPCQnBHfrIVk42G9FqFY2NzLRpx/h8gZMne+m0bBEELi/HbtHuUQXEiVHv6Cb5pt+rf69VaDF+cAc6FsziIJygDwyF76E+Ljc3qa9v2htjX18fnx/iKa7LNbhs2b/s3Pl/FRX/kZSkGF/OJnlUjUYqEHDOntVPXIggMJc7qXr7fAGPx09m7ZjGxp69e4vlctHz569JnslES5Ykc7nIXeqBEUB8ajG03DTdLMfKV+IrPyr76L71/qX+S72v3vxSa8hrUGGqoF2O/XCsk+gkU7hAwBGJOGazg+pZPXjw793dXyoUO/Lz//6Xv+x+/vzr+/cPDwxcI/tf4auvKt1uf13d5YkLN2+Wf/119cQlf/7zsy1bviWzdpxO94szZ/SffELq7w/y3nsFPl/gj3/simBfIM5JBdKfZ/98ScqSIw+PPBp8BEEQykMFnOAWr8VhGfWOkikQx/kffVT26af3u7psEZ9VaurfqFT/JpNVX7iwgdSdMymJW1OTVVNzMWj59esDZWX/M3HJ0JCL5NpxjY09u3cvjqBy8vns4uLUzz9/RHVHIM4lsBLK0soqFlbIhfJ2S7vhr3muQ66hV+5XQRt7/V6SxXI4CARBPl+EA7E5HOGiRb8qKPgHFC3t6/tqcPABqcpZW5tjtTpbWoIzaV+9cre3W6bba+a1406denLwoFqlwqg+cS0tRe12T1ekgRFAHJIIJGsla8vSygJQ4MbAjeM/HB90DY6vpdmstdu9EAQlJFCIjR6TklJUVPSbRYt+FQj4u7r+cOnS9pGRFxDJ35z19cpTp574/ZFmM8zo5cvRS5f66+uVVCunWo3fuWMJROWkgPlpnWRdvjj//PPzNwZuOH3B7xvPPzvfMiUKy+IIf4MZ8/q12+cLJCcnUD2roqJ/kkgq29sPdHX9we0m+6IFgiAoO1vk9+8upDgHCyVarYIgGoKeHs0MRXlffLEqIyNaz8SBeQnn4wgcxS6r+/cv1WoV4bebTCzOQ5AQt8nwJ7pzZ65ORzx8OBh2y4g1Nz/jclmUuvKpVFh//4iRXmAEEG9MDpM/0iQ6mA0jHCToAyOTHqk+ejS0eHEy1ZJttm5/qF+24Zu1Wq3i+PHHVI9HicPhPX26b8eO3ObmZyR3KSvDrl8fiOZJAcAkS/ctnRpp2f1f3aabP75mv3FjYOPGzEWLFszwtpM8Ci9YASCeJaYnsqY87HESTo99Uo+f2tqczEzh4cP3wdMQAIgtCQms3/1u2ZYtWXN9IgAATCEUcjZsYGAsJAAAMYryC9MgiemJgUDA7wFzMQAAw+i+80mvSN9yYws3idaYTAAAomJN4xrNOc1cn0UcAbEsc4KVwKo4WkFmGoWwZBrZchJXkIHeErf23pKul8o2yOgXBZABYlnmhM/lI+4SlOaNnw6uxk0kriADldNpcT757yfF+4rpFwWEBWJZ5pCpzZRanMri0XpSI8wUJi5MNJO4gsGVM6UwpXBP4cQlKpXq6tWrDofDZDIdPXpUKBROLUV/Ri9ZK+HjDGR1RqCwMGXP5HOex0Asyxyyddm8o9600jQ6heBq3NZtc5G4gm+678EInFaWJtPIBBLB66c/hhLk5eW1trZeu3Zt69atGRkZhw4dysnJ2bRpU1ApYz2YMn6a0Xe6j855j2OxYAQJ7r3k9fon9rpAELisLE2jkUkkgqdPIwlSeOuMxbKcOaMPvykQBQF/wHzbjK/AX/5v6AivsGAExsoxPbkryEY4SHpFurRKyk3iEh1Eb1PvsP7HboEff/xxf3//5s2bvV4vBEEGg+HixYtr1qxpbW2dWIp72O0wOcQF4sjOeKqGhjyVKjji5dixHzo7CQiCOBykoiK9qkqalMTt6CCamnr1ega6MsY+EMsy50xtJmmVlJfKc1rJJlxOlLwkGeEiBLkryM5ryENL0RcXXhgvG4N6CUIQtHHjxs8++2ysZkIQ9O233xIEsWnTpqDKCUGQa8jFZyKCfsz588+mju22WN6kszQ05JWWohcuvLh82Wifcs7zmFqN63TW6cLdgFlgN9jtBjumwl5ceBHB7rgat+qsPnJXEDG3m52EU1opldfIBdJJwyP5fL5AIHj5ctId3Gg0oig6tSC/10/zh/JEQ0Muo9Ee9HE43vyPaG83E4SzslJaUyOXSuNlSOdYLAuIGpxzplsmXB3JM1s2n51anEp++l22VWe13rOiJaisWpaxOmNYP2y8Yhx7lORwOEZHR9PT0yfukJGR8d13300tiCPgOC2R3OhDmrlZq9NZ792zlpSg1dWy1asz9PrhK1eM8/4BJohliRHmO+bsbdmibNFrik860FLUY/cMRXYFxfniog+KVh5ZOb7k7NmzPT09bPab50YajSYQCFRWVgbtCLPg91zvFf4jY49MUZQnl4uCPomJIUaf5ueLP/ig6MiEc56v9u0r3raNVgA3wJTC3xQqqCceFO8rzqF5BQWSHxuKBQUFDofjm2++0Wg0DQ0NVqv14sXgDD4IglIKU3YHdqMlIZq7s0MimeeN27CxLL/IyTm2ahUHAdPGzQasDFtxeAXMpjAcmofyVn2xSkAlWCfEtbRPmHDh8ePH69atE4lEzc3Nhw4dOn369PbtIWYZk6yTjA6MWu9ZyR+YWQxOEhGbwsayIDAcgCAfGOE7KwgdgbCQiV35woaYYCpspH/ETiVYJ3xMyc2bNysqKmbeJrcu99F/PgpEJ54PgEjEsiQnJJgdDj+onLPC7/FbOixYOWbVvbkhhQ0xwcqwgdkP1snakrXTsJNLb7IwgA4+m31k5cq1pCd+BBiXmJ4okouCPhwBZy7PKbkguc5YJ62SzuVJxD0EhpehKMiDAiaRrJVkbgKJDAAAAEDcYKxPDzCHxmYHj3gKHSA2gddi84FCseC3vy3m88nOtgq8FcJUTqGQY7fvojRRQmT271/68GGIN6ghJSSwjh6tiOr0LTEoKysrEAhIQj2S7ewkDAb7u+/mzf5ZASFpZLIDy+lGyYSpnCMjnnPnntKZGZ6kujrliRNk57R3uXx37xIrmAiMeOs4naE7MJ85o1+8ODne/mHFLDWOt5noDlEI36xtbOypqZEviOZrzGXL0IICcVNTL/ld2tpMxcWpPObGwcQ+BEEgCBoeDj1y9fVrz/ffm6vAO60YkCkULkxMvG2mOxIjfOVsaTHYbO7a2ih2ua6vV7a2Gil1wevqso2OekvpBUbErMKUlD2FwaMIYBh2Op0ez7TjVzs6iPx8MZ1/o4UphXsK90S8OzBGjePdNpvNRTdKJnzl9PkCJ0/2Rq9ly2YjWq2isZFsm3aM3x+4fds8z1q2CAyrMOzD0tI9hYUCTnDnkr6+Pj5/puHsfX2vIAhSKpMmLmTBLA7CCfrAkyewQmBEhak+LP1wT+EeAWeeDyGINgSGyzHsFu02LURyZuvGxp69e4vlctHz58xH9Wg0UoGAc/Ys5VyctjZTVZU0NZVnjSgwIqZwEKQiPb1KKk3icjsIoqm3Vz9N83UGTqdveNidnp44ceHMU6lzEE5FekWVtCqJm9RBdDT1NumHQUARLUuSk7kIcpdgIEqGVOV88GDw/n1rXV3uJ5900j9kkPp65blzT+32EJOHzsxgsBsMdpUKuxBRYERMacjLK0XRCy9eXDYa7dM3XMMaHfWKRJNuuTNPpd6Q11CKll54ceGy8bLdM89H9swONY7rrFaXj4EoGbLvORsbe+rqmG/ZJiVxa2qyqLZpx926ZVJHFBgRa9rNZsLprJRKa+RyqSDyhqXfH+BwJl3TIdfQlLwXo8Pr+Otx2wknUSmtrJHXSAXgYRJdfDa7ODWVkTYtRPLOCUHQqVNPDh5Uq1QYs2kgtbU5VqtzapYXSXfumLdty87OFr3t0Zg6q/We1VqCotUy2eqMDP3w8BWjMYLHfVwua2Rk0o135matzqq7Z71XgpZUy6pXZ6zWD+uvGK/cNt+m87fEs1IUtXs8XUPMRMmQrZwvX45eutRfX69ktnLW1ytPnXrij3Qg6PCw+/HjIbUaf9srJwRBAQjqJIhOgsgXi6tlsndyc6lWTgSBxeKEoaFJDwlnbtZCEBSAAp1EZyfRmS/Or5ZVv5P7DqicEVPj+B2LZQ56UWq1CoJo4HIZ6/GXnS3y+3fTfG9eVoYdPryCTSUw4q0god64zcgQHDu2SiYLEclP5bhgUGiEUB7vi1WrMmj8KglCoaY1Nz/jclkTu/JxuQiPxwr6sFgwmbUQBO3cmavTEQ8fDtL5A3Q6gsVC5l/PGIOd8uOZggLxq1fu/v4ReseN8CcGoMKw/pERI/ULNx0KXaUdDu/p0307duQ2Nz8bW3Lt2t9NDbD89a+vfPlld9i1EARptYrjxx9Hdt7jPB5/R4elvBzT6eYswShGqFT41atGEFQyV8ow7PoAk0EktFqD+flioTD4XfnTp6/HXjzOvBZg1tKlqVpt7oED3zudIA8eAGLGwoWJBw+qCwqS5/pEAACYLD9fXFQ03351AwAAAAAAAAAQ72YtxCTOcYScXfZdmTN+z4UpKZ//5CfLQs3OCLylaCUJuN3+xYuTS0pQMBF6VPnd/uTFyWgJOsN05WaHw2C3axWKOxYLI0MigLfe+vXS0dFdUQ0xASAIkq6X7hrdBea8iCt0O8rOQogJAEGQocXgtrlzwPccT+hWzmiHmABjAr5A78leJfieAUqKilL8/t1yefD8ZwCzUopSdvt3i8D3HDcYiJY0mx1bt2ZzOMi1a7M+/WA8cZgd2VuzEQ4yAL7n+MDM4MwohZgAQXoae5TgewYoSU9P9HrfnzpADGBWYnri+973MfA9xwdmEtNHRjwrVuCZmcJ5EIQXyzwjHnwFLswUvgDfM0Ae4yEmQEgKraKBaEDA9xwHGLvGU0NMgGh41vyMxWXN3JUPmB8YmwjI6/UvWrRg+XLsT38CXfmiyO/1L1i0AFuO6cH3PN/9Pyj/2znMIe14AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.783,3.487;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,1376.iVBORw0KGgoAAAANSUhEUgAAAHUAAAA4CAMAAAD0HEc8AAAB+FBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgCBQIyejIeSx4xeDEXOhcTMBM4iTgKGAoNHw0KGQoSLRIgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxA7kTsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIxejELGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgJKlSyNAAAByklEQVRYhe2YVVNCQRiG1wTBXEHBbsFCsQMVG+zu7u7u7u5u/ZsiGMhwGC+W813oe3Pe3fPNPHe7Ow9CihgggBgaAUCNTUzphzKYZvRDEYttDkC1sASAIitrAKgNZgFQbTEHgMrFdgBUe8wDoPIdHAGoyMkZgurChKC6OrhBYN09PAGo5l7eAFTk4wtBBY0A4sZDQj9/CGxAIAQ1iA1xJCNRMAQ1BAsAqGIcCkBFYS4Q1HCQWy9CBEGNjAKAMqJjAKixOA6AaiYheL/z45VhqDetSUgkB0VSrEySetOW5BQxQWpqmjI26k1L0iXGBKG/DScDAEp7/h0MwcjkmRo7dDgYmTxLY4cOB5Mtz9HYIeFgcvPy1Ze8Ao3/hUWqb3FJ6ccOCQdTVl5RWfXRGdU1WEoxV1tX39D4Xsg4mKbmlta2dkWJj+no7OqmnOvp7esfGCToYIaGR0YRGhuf0H7efmVyanqGlIOZnZtfWFxS3CDMZWeujrmV1bX1jU0yDmZre2d3b19ZPYUH2KmaYu7w6Pjk9AwRcjDnF5dX3yvO9Q3F3O3d/YOqkXAwj08/188Ucy+vn01fDkb3u0VfDkb3u0VfDkbnu+UPOZg30YBL0WNhMCUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,684.iVBORw0KGgoAAAANSUhEUgAAAOsAAAASCAMAAACNSdk2AAAA4VBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsNIA1n/2cLGwsRKRE6jzoIFAgFDQU8kzwSLBIIEwgBAgE1gzUbQxsmXiYucS4OIg4CBQIUMRQSKxI+mT4OIw5k92QqZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYTMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR58lEK2AAAA2klEQVRYheWPRRLCQBAAJ4tDsITgbHAP7u72/wcBmxeEqtk50A/o6gZQ2J/gArfHSx0hB58fWCCIZQ+pYSy1cyLRGLC4piPpQ2oCyewcI5liwFg6g+TPqjkks3PymvJ9LXDA8ZtFHO8vlMrs+1rhVeoSfGp18coaTeoSdFo8b7+2O9Qp6HS5Zb/20tQp6PT5wH4djqhT0BlzXbwakyl1Cjqz+UK8LvmKOgWfdUe8pjZb6hJ8mknxuttTh0jgMDc/r8dThTpEBufLFq6bCHWGFJTbHawHdYUknq834RsuClfG5DwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.647;4.blob,1.1,624.iVBORw0KGgoAAAANSUhEUgAAAOsAAAASCAMAAACNSdk2AAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAAAwklEQVRYheXPVQKCQBRG4cvYjYA4dndgYbf735MyrOHO/+C3gnOIDPEnIhSNxdEReiSSJFJpdIUWmWyORL5gojs0KFq2ICGcEjpEA7dgBK9lSegSfpWqCF5rso4u4ddoqlfRaqNL2HWkG752e+gUdn05CF+HDjqF3UiOw9fJFJ3CbiZN9VqcL9Ap7JbeSr2u5Qadwm/bU6/2zkeX8Gtb6nV/QIdocPROv9fzpYYO0eF68+m+y6AztDAeTxq80BWavD9fzrArcp4JVC4AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492323328;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.670,3.342,3.290,2.19,2.14,1.1,3.670,3.323;4.copy,1.1,3.810,3.437,3.150,2.57,2.14,1.1,3.800,3.437;4.copy,1.1,3.790,3.475,2.20,2.19,2.14,1.1,3.780,3.475;4.rect,1.1,3.544,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.521,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.490,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.326;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAACl1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR7mWLAEAAAB1UlEQVRIiWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy372AXBwB0G4WK6AFv1wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.383;4.blob,1.1,2040.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.771,3.459;4.blob,1.1,656.iVBORw0KGgoAAAANSUhEUgAAABIAAAAyCAMAAABmvHtTAAAA9lBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tHRx1/fzQeHgyYmD4QEAcOBgZWViNxcS4LBATsX1/vYWEQBgYCAgGMjDk4OBcHAwPXV1fbWFgtLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxs0NIExMXkHBxItLW9jY/ZjY/U8PJQPDyQGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgTd9vlDAAAAsUlEQVQokWNgGKKAkRFdhImZhRVNiI2dg4lO7iEOcHJhCHFxootw8/BCGHx8MCF+AQgtKCQsAmGJiolDGBKSUoIQlrSMLLpRcvLoIgqKSuhCyiqq6EJq6nAm1BEaPJowEZgjtLThimCO0NFFN2lIAIgf9fQN4CJQPxoaGZuYQoVgfjQzt7C0skY3wsbWzh5FwMHRydnFFUnAzd3D08sbRY2Pr58/miMCAhHSiNiGA4gjANiuD4GP81vkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.863,3.497;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAABkAAAAPCAMAAAAmuJTXAAAApVBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg4LBATsX1/vYWEQBgYBAQNdXeYoKGMHAwPXV1fbWFg4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJWMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1c/P5xFRaoPBgbzYmJuLCxUIiIBAABHHQIUAAAAgElEQVQYlWNgwACMTMyYghDAwgqh2dhgIjAWOwcniOLi5uGFCMBZfPwCIEpQSJgLIoNgiYjiskhMXAKXlKQULhlpGVwysnLyuKQUFIGEkrIKlItgMaiqqTMwaGhqQbkIFoO2ji4Dg54+jItgMTAYGDIYGZtAOQgWBGiZmmGwwAAAQRcI8VT/AtwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.542,3.513;4.blob,1.1,1588.iVBORw0KGgoAAAANSUhEUgAAAYIAAAASCAMAAABhNSlMAAACDVBMVEUAAAABAQECAgIqKio+Pj4aGho0NDQREREvLy8NDQ0FBQUKCgpHHUd/NH8sLCwGBgZHRx1/fzQgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAeHgyYmD4QEAciDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnFWViNxcS4jDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FzgCAgGMjDk4OBeLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctLRKSkjsHBwMtEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGJlZSliYijQVFR8MjJUVNAyMnwJBAmUPJQpESkJCQSUlDwpKRFyLi7ZWFguLnJYWNk8GDyJN4kBAAE8PBiJiTcBAQAYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlN0dC9TUyK3SkqVPDxKSrc8PJUUCBQaCxoUFAgaGgtZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnxLSx58fDIJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0MICAgxMTEXFxeAgDRDQxucPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4DAwMiIlQAAAF5IsXsAAACVUlEQVRYhWNgoAdgZGJixCJGc3WDHWDzB40AMwsLK7oYGwsLO63VDXaAzR+0soqDkwtdjJsdS9BSWd1gBwh/8PDS2io+LIL8WIKWWuoEBIlwlZCwCBpLVEwcKkIsC5spyEBCUgpNRFpGFs5G+IOXhwgHUwLoHgWCAkS4SkhYDp0lrwCTJJaFzRQkICGpiC6kpAxnwv2hoqpGhIMpAfSOAnUNTSJcpSWsjc7S0dVjII2FzRQkoC9pAGMaGkJoI2NDDH+YmBLhXooAvaPAzJwYV1lYYrCsrG1IZGEzBQnY2sFY9g6OTmCGs4srTAzmDzd3D2IcTAmgcxR4enmT5j4E8PEllUUs8PMPsIewAoNgYjB/BIeEkmocqYDOURAWHkGa+xAgMiqaRBbpICY2DsqC+SM+gWzDiAV0joLEJNKchwySU0hlkQ5S06AMqD/SMzLJN4xIQN8oyMrOIdF9SCA3j1QW6SC/AMqA+qOwqJh8w4gE9I2CktIyEt2HBMorKklkkQ6qqmsgDKg/auvINopoQN8oqG8gzXWooLGJVBbpoLkFQkP80araRr5RxAK6RkG7Rgep7kMGnV3dJLKIBD2SvTBmn0M/mIb4Y8JEMp1KCsAXZIxMYMBILXUMkyZjSCHrJQSmTJ1GIotIMD12Bow5c9ZsMA3xx5y5pBlEFmDmwzK4PA8SZPNZwGABtdQxLFyEYT+yXoJg8RJSWcSBpcsQ7OUrwBQ2f9AI4Btc5uYEAy5qqcMGkPUOFFi5ajWGGB0Hq+dh8T4wWNbQWt1gAjPWrsMQA/sDAOsPhToJTreaAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.535;4.blob,1.1,1832.iVBORw0KGgoAAAANSUhEUgAAAO0AAAAjCAMAAABPcX15AAACslBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUJFgkGBg4DAwcwdjAUFDIyMnwEBAkRKRE6jzoIFAgnJ2ErK2k1gzUbQxsFBQ08PJMSEiwUMRQ8kzwDBwMmJl4uLnEqZyoraitKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtko5jDkdRx0EAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEFCwU+mT4JBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORcJFwkQKBCnQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwgLHAsPJQ9QICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCUBBAE9lj0ZPRlDGxu7TEzzYmKtra1EREQBAQI9PZUaGkFMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEGEAYyMnoeHksiVSIucy4AAQATEzA4OIkyezIKChkRESkeSR4QECgSEi3sxEugAAACZ0lEQVRogWNgGKKAkQmHBDMLK4k6hgBgYsQlw8ZOqo5BDzg4uXBJcfPwkqhj0AM+fpxSAoJCJOoY7EBYRBS3pJg4qToGOZCQlAJR0jIgIIvCYmCQk1fAqWNIAkUlMKWsAgKqKCwgUFPHqWMoAg1NLQitDQI6KCwg0NXDqWMoAn0DaXzShkbGJOoY1MDEFL+8mTmpOgYxsJC3xK/AytqGRB2DGNjaEVBg7+BIoo5BDJycCalwcSVVxygYBaNgMAO3gXYA2cDdg2Qt3J40cAd9gJe3D4k6fP38aeISuoCAQNLUSwcF08YhdAEhoWEkqQ+PiKSRS+gCoqJJUh4TSyN30ALExYPIhMSk5JRUiEhaujuRelkzgERmFm0cRn2QnZOblw+kCwqLiktKyyCC5ekVuNTLgsczZMBdPeHKKpVqBoaa2nC6OJViUFff0NjUDGK1tLYxMLR3dELEu7px6WADj2eo9AB7Cb19/UoTgEITayfRxbEUg8lTpk6DsKbPAJEzZ0F4s+fg0mEBHs/QnsvAMG/+goVgoUW1i2nsTCqBJUuXLV8BYqzsWAWiVq+BiK+NwqUDkZId16033wASmls7VPq5GzdtztuyFcjYBonb7RDhHTtxaUCkZAbpnl0qu/cwMOzdt58eTqUOOHDwEJA8DMm3R8BCR48dx6UakZJBIPjESSDJaEUHZ1INnALi00ln2s+eK4IInE+/QKxeOSBWDqKNu2gILl5Kmnn5CoR99dp1UrTe2KdDCxfRC9y8RZr623fu0sYh9AD37peTpiHygSNhRYMUPLz2iFQtzI9p4RC6gCdPSVIOAAvqh5CeFHEtAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.571;4.blob,1.1,3716.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.153,3.609;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAANYAAAA4CAMAAAC2c/buAAAA4VBMVEUAAAAGDgYDBwMUMhQyfDIECQQNIA1n/2cLGwsnYScraSsIEwgFDQU8kzwSLBIOIg4CBQImXiYucS4OIw5k92QSKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYiVSIucy4yezIgUCAFDAUeSR7c23cPAAABTElEQVRoge3ZR1aCQRSEUUAFEyiijSIqBsAERjAHzLr/BbmA54Q61X+9c+w7qtG3gcrl1PIF3z3QxORUhF6xNE2tjm9mNkKvWJrjVsc2X67wewulRWoUUF3i92rL3CZgJeRd90D1sOq6h1pr+O6B1pu+e6CNqu8eaHPLdw/T2t5x3QPthj3XPVC703XdA+0f+O5hDo/qrnuY407PdQ/UP/Hd+99O/1jscvbOzu1il7PXu7g0i13OXmvQNotdFhiWC2axywJX13axywI3t3axy9m7C0Oz2GWB+9A3i10WeAiPZrHLAk+hYha7LPA8ejGLXVZ4bdrFLgs0BnaxywJvo5pZ7LLC+0fXLHZZoPD5ZRa7rPD9Yxe7nESTnn5JDxXl6deL8vQ7EOPpdyA9/ZIeKj39kh4oPf2SHiY9/ZIeKD39kh4mPf2KHijK0/8LelwsVZUGU9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.609;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAAqUlEQVQoke3SNxLCQAyFYQEm2yYtBkzOYHLOmHj/K0FB4b9ghgPwCs1+0o4qibzjE8QfALVg6PMKR94lGouL17phwomkwKk0nFE6nFUWnFN5uKBsuFgqc3+lStdidL3UgKXZasNmpwtLry+/xDHpwXDExnhCTw2bjdmcXigHXqoVP6xr9KZKb2f0bg9GD0f4pM5w3G3Dlyt4uy+9fLgaxtZTvuR/X17jvl53hhE6RXbxjQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492323437;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.680,3.342,3.280,2.19,2.14,1.1,3.680,3.323;4.copy,1.1,1.0,3.361,3.380,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.440,3.361,3.190,2.19,2.14,1.1,3.440,3.342;4.copy,1.1,3.690,3.361,3.270,2.19,2.14,1.1,3.690,3.342;4.copy,1.1,1.0,3.380,3.370,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.510,3.380,3.130,2.19,2.14,1.1,3.510,3.361;4.copy,1.1,3.700,3.380,3.260,2.19,2.14,1.1,3.700,3.361;4.copy,1.1,3.800,3.456,3.160,2.38,2.14,1.1,3.790,3.456;4.copy,1.1,3.780,3.475,2.20,2.19,2.14,1.1,3.770,3.475;4.rect,1.1,3.554,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.386,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.383,3.156,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.531,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.500,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.326;4.blob,1.1,6576.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.440;4.blob,1.1,2396.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.584;4.blob,1.1,892.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABaFBMVEUAAAABBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwUgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwgOIw5k92RWFMqLAAAA7klEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykElmeUVWFlw2KSopKyiCmapqWtoamkDGUw6unr6BjjdZmhkbGJqBmGbW1haMTBY29gSSDN29g6OQMrJ2cXVzZ2BwcPTy9sHj3JfP/+AwCCG4JDQsPAIsEhkVDRrjDwO5bFx8QmJSUBGckpqGkI4PSMTh4as7JxcMCMvH1WiAIeGwiI8riUyYyIAkRkTAUYzJqmguARXVOLUUEqaBoMSJtI0lJWj8gETBB94Vv9VfQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492323536;4.rect,1.1,3.564,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.614,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.664,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.541,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.510,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.603,3.259;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.326;4.blob,1.1,6144.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.421;4.blob,1.1,684.iVBORw0KGgoAAAANSUhEUgAAAaAAAAANCAMAAADYHUrvAAAA81BMVEUMDAX19WNKSh4AAAAFDAVj9WMeSh4sEhKVPT0yFBSkpEKoqERCpEJEqEQvExOJNzcOBgZGRhz29mMODgYcRhxj9mMGDgYDAwHm5l1jYygBAwFd5l0oYyiLizjBwU44izhOwU4tLRL+/mcfHw0SLRJn/mcNHw3Q0FR8fDJU0FQyfDJyci7Z2Vguci5Y2VgYGAr8/GY3NxYKGApm/GYWNxa3t0qVlTxKt0o8lTwGDg5ZWSTs7F8GBgIkWSRf7F8CBgIECwtf7Oxh7+8GEBAJCQTy8mJQUCAECQRi8mIgUCADBwdX19dY29ucnD+qqkU/nD9FqkUAjLAlAAAAyUlEQVRYheXRRRbCUBBE0Q+Nu7u7uwUN7rL/1ZCEc2AFNaHfqEe3ByWETk+YDEbT9zZbrKAv/54gmx1lO5y/2+X2oN78d4K8Pj/IDgRDIJlRgsKRKMiOxRMgmVGCKJlC4ekMSuaTMlA2lwfhhWIJJPNJGYjKFZReraFkNqkD1RsovdlCyWxSB2p3uiC91x+AZDapA9FwhOLHE5TMIkn6DDSdzUEfFssVSOaQvN5stYF2+wPoxfF0BskculxvsjYQ3R+oH88XSmbSG2yFS4lMG0COAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.516;4.blob,1.1,2520.iVBORw0KGgoAAAANSUhEUgAAAEQAAABZCAIAAAAIORWgAAAABmJLR0QA/wD/AP+gvaeTAAAHFUlEQVR4nO2aX0xTVxzHT2//2JZSoJRCi1ahpRawUKVKNdNIMNZUomKijk0wgyGJT0azkOzFGHkyvJlp3MsW5p84/84liEGDdiaI2dQ4CVKglKUtllL/0T/QlnYPNU29re299xwo2fpJH5pz7vmd7zf33Hv+/C4A6NCt0J3QnEAYkCwYwljafO1j+2OEAcmCzIyUJxVzxQNTA6gCUgCZGW2+dvjd8Lu5d6gCUgCNGYyGbRBt6Lf3I4lGXQaSKOU55SyM9Wz6GZJolEFjRpuvfe58Pjc/hyQaZRCY4TA4lbmVKR9jAImZKmGV2+9+9fYVfChIEJjR5mufOJ6EQAg+FCSwZoRsoTxLvhTGGIA3Uy2qtrgsNrcNiRpIYM2sF61fIrclTZo0af6nqNvV+1/uRxKKyWO2uFukeil8qIgqcvOMolFh/MUI3z0AwO/yj98cVzQp4ENFVJEwI1wnzC7NHrkwAt99GGOXceWulSw+CyZItCoSZhRNClufzW11w/QdjfW+1ffOV7yvGCZItCqiZjAGJm+QG7vQjLEwofnQyMURmJGGU0XUzHLdcmYG03TdFF1Iw2h0Nj36hzExgrVhjF1G8WZx5spMamZwqhgEmymaFOM3xwPuQHShVC/d8fuO6BLzb+a7e+4SqQ3z5u83zhfOksaSpx1PSdmIq4qQGVYWa9WuVT27enDlk39M3lh/I7pk7u0cwdoIxi5jWVsZBTOfU5UE5bfKg5aDNIxGtj8icAu4hwOHRdUisg1jVRF6ZhRNitFLo6HggmyMPa89ll4LhddArKrkZjKLMsVfiNG+x3AYu4yyAzKMRWKeiKsqefuSgyXTz6ffvHxDWiNhzLfMdBad1NImrqrkZpBPL7EEvIGxX8dKvioh3mQRVKVJ89+HDtmexeIDAEKheRRiYIE9BOTz5ZWV3zEYHCRqIIG9Mx7PJJ8vE4k0DsefSATBgCALYDJdy8kpEwjWwIeCBPbOAACCQR+bnScQrLGnNG8OYu+MXirt1uujS6qrqx8+fOj1eu12+5kzZ3g8XmyU6em/srOV4ZfB4iPVS/XdehDZzzAw7IBM1q5WqwSCgampyHWrV6/u6+szGAz19fUSiaSzs7O4uHjnzp24cO/fjwEAsrIUqJ4cjInR6PgdR9AX/GSNzMBkB2TqdrVAJZgamAIAMDgMRotSebyiQszlXjWZ2gyGfrs90uDUqVMWi6Wuri4QCAAArFZrT09PTU1NX19fdDfz87M+3wcutwCJEwDA1p+2lnyNX6r17us1XTOFRStblBXHK7hirumqydBmsPfbAQDgcm2tv7X1pEaTy2bHBnW5XB0dHdElDoejs7Mz9kqN5qRc3oDKTGZRZp4mD/dblrMsXFt7ubbV36o5qWHnfqKZcWVsrCov76hKJWSzzw8NvXA6I3UcDicjI+P169fRDWw2m1AojO0+FApiGBOVGbfF7Zn04AqDvmD4z9iVsbyqPNVRFVvIHjo/5HzxUTPjltl8e2Jib1FRu1p9pLy8324/Ozh4YWQEAOD1ej0eT0HBJ4NHIpHcu3cvtns6neX3u1CZSTzMzLfME7cnivYWqdvV5UfK7f32wbOD+NPJ2sLC3rq6mebmSMn169eNRiOD8fE9odPpQqHQtm3bcN3QaNjmzT9IJDWozCQeZtEU1hbW9dY1zzTHVgEAgEogiPwvLS31er137tzR6XSHDh1yOp09PXFOQzIyJFu2nOfxViDyQhqBSpD8IgDApk2bHj165PV6HQ7HuXPn+Pw4k0lhYa1WexqABTm+WWzWrfteKsVPPosPgrVZbq6axcqyWu/Dh0oxXK5Yqz2dk1OaaiEoyM5WCgSqVKtIk2bJgDAnnBhSeezPqUryakaYE04MqTz251Qln2eQ5IQTQyGPHVdVcjNIcsKJoZDHjqsquRn4nHBiqOWx46oitJyBzAknJm4em5oqQmYiOWGy/REhbh6bmiqiC01jl1HRiH6khTPGlNNGOFVEzYxeGuXL+BRywokp3lc865y13rdSa45TRdQM5ZxwYiDz2DhVJPYzFHLCiUGSx45WRUJZbE4YY2G4r2PobHrkJDJxLUCUx45WRfTbGRCVEzbfModLdht2xz5FD755MPzzcNJaAIC8QT704xAlC/FVQR1BZCuzmTz8wd/M+MysczZpbZo0adIsHXg8ptvdol/4TTVBoBK0Pl+wrCxn7VrhtWukF/BLke3bl3s8LfyF3FQvHnQ6zWZrbGlRploIAPAH5/PzoYsXR5oW/vhmkVCpBMFg28qF2VSTAsEXGlNT3vr6IiYTMxgm4aOlnmPHKoaHv0y1CkQUFHADgcPVqDfVZEEwzAAALpd/48Z8qZTX3f0PkoAppqFBPj19iIVuU51KOBzGhw/Ne/asSqEGNMMMABAIBGUyvkYjuno1ZUubfwEnU/GO9KpNKAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.571;4.blob,1.1,1252.iVBORw0KGgoAAAANSUhEUgAAAGoAAABeCAMAAAD8FHEeAAABuVBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQCBQIfTB8xeDEXOhcGEAYOIw4KGAoNHw0iVSIucy4AAQAyezIgUCAFDAUeSR4gICD///8bGxsTExMiIiIFBQUfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM7kTsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIUMhQxejELGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwhk92Ss7hLJAAABrUlEQVRoge2ZZU8DQRCGF21xOIqVUhwKxd3dneLu7u7uXvjFkEJCIV04MsukhHm+3Ex2ss9+udu8OcawsEEz2dphmewdHJFMCqUTkok5u7hiqdzcsUzMwxPL5CU5Y6m8JRWWykfyxVL5Sf5YqgB1IJaKaYJ4h9CaUJhXMIKVnIUQyUSoeQUjTB1ueSEi0oSXeQUkKloH3kMmrjGxWCqmj0NT/VviExLxVElYquSEFFFbpaalm7f+GZ/WM7Nen9k5uVBVXn5BYdFbrSgukUI4c6Vl5RWVQFdVdU1tXf1LoW1obGo2cOdaWtvaOzqBMtbV3dPLWF//wDffusGh4RGQaHRsfGJyirFp5UyQzxdzs3PzC4tLANHyyura+oap1G1uSZpiztz2zu7e/gFAxNjh0fHJe6c6PePMnV9cXoFEjF3ffOxvOXN390CRZURd8zIQdc3LQNg1T/xNrCrhPxh5L/WPkJPwH4yPAkyyEr7BqBWgkpXww58EmCjhA6GED8QqEr54uAlfPNyE/wtQwicIgiAIgrAqrCrhC4L+4cOghA+DEj4QSvhQKOGD0cc9A/bMPXJAylPQAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492323642;4.copy,1.1,3.790,3.456,3.170,2.38,2.14,1.1,3.780,3.456;4.copy,1.1,3.650,3.475,3.140,2.19,2.14,1.1,3.640,3.475;4.rect,1.1,3.574,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.430,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.551,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.520,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.603,3.240;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFDAxj9fUeSkoAAABCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqoV9wriAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.345;4.blob,1.1,4140.iVBORw0KGgoAAAANSUhEUgAAAXoAAAA2CAIAAABGL8VkAAAABmJLR0QA/wD/AP+gvaeTAAAL1ElEQVR4nO3daWwTVx4A8JnxETu2yTWZSWI7FzlLsoEEx2ax2AKhhoRG6ZG0QTmq3UV82XYrFQmtqlW1tB+6FYIubLUFVdVuSlkVwZLSioJoSAtZAiiAoaS5iDk2drA9jk2IYzu+9kPYkDiHZ+yJwdn/T/40895/nj/M07yZ9/4PQdizcuWuurpbLAYEAESMXCNf/d5qmoU5MRz1AXViUSKjS2DMWzWvvLzG/v4vWAwIAIgYUkUaLxlpFva6vNR1ilxDMroEa90NjpfGxxcODBxmKyAAIGLE6eLY1FjTZRP9KsZLxqSSJI6AQ78Ka91NXl6TwdBut+vZCggAiBhSRdr6bC6bi34VW6/NM+5JLkumX4Wd7gbDuDk59f39LaxEAwBEEoqhRDlh7KQ7kprk9/lNl02MxlPsdDcymYbHE+l0x1mJBgCIpIQVCRgfo65TTCsaLxnjcuIESQKa5dnpbvLymu7cOeHx2FmJBgCIJFJFWrQWr8vLtKJdb7fr7YSSoFmehe6Gz4/LzKyGkRQA0Ygr5CaVJDEdSU0xdhpJFd3xFAvdTXZ2rdNp0evbwg8FAIgwvAx3293WXmto1U1XTIJkgSRLQqcwC91NXl7T7dtH/H5f+KEAABFGqkjzFTPiD7H6xOiEtcdK8wEn3O5GIslKTVXDSAqAaCTABXE5cSGPpCaZOk3JimSUiwYtGW53k5vbQFHakRFYuwBA9CGUxNjQmN0Q1kceSkthHIzOgoZwuxuYbgNA9CIUjKfbzOZz+8xXzUQ53e9TAAAAAAAAAAAAAAAAAKITQQjDD8Jmei0AwJL0wguyN97Ij/RVd+1aeetWHSuhxGKe3f6bysr08ENpNPL3aCc9BAAwUliYsG/fL3F8jmXfmZmZfr9fKpXSDMXs6aaxMe+LL/oZVZnP2Jj7xIk7TU154YdSqchLtJMeAgDowzB027acb7+9R1HO+co4nfOeCoxG/8KlpXhhYfzhwwP0qyyspaW/ujpj2TJ+OEHS08WpqbGXmSQ9BADQVFKSFB8f09HxYM6zGIYhCDI6OkozGoPupqkpr73doNezltSmrU1vs03U1maHE0SlIvv6bDYmSQ8BWDJezHhxi3yLiCtapPjl5URPj9U1TyocFEWdTqfb7Q44vnr1n1at+kNMTOCyBrrdDZeL1dfntLSwM5Ka5PX6v/xyIJzxFIah5eVEZ9izsAGIUuOe8aqMqg9VH9bn1BPCwGUEHJTDw3gBPxQJvpZySm5u3ODgvA8vg4ODQuEcX6xcrpHS0j82NPxHrf5rXFzO1HEuzatqNDKRiHf8uG76QQxD+fwZHZbX63e7fXTOTmpp6X/nnZKMDMm9e49otmS6FSsS+HzsOvOkhwAsDW36tovGi+VE+Vpy7W7F7puWm2eHzg48fPzGozm/WUkoA6oc/PngNeoaneAiEU8i4ZlMDqat+umnv/T1/T0nZ1tBwa9fe63v3r1vbt7cOzx8nm4/99VXFRMTvsbGc9MPbt2a8c03m6cf+frruzU1Z+icnaLVvnrsmO6DD2j9/wDbtxd6vf7PP+8NoS4AS4xMJHs56+UViSv239rfPdKNIAguwEW8wHGW2WEe94zTCUiSwt27Ffv23ezttYXcqqSkXyiVf5bLN586tYXW001cHL+6OrO6+nTA8QsXhhWKf00/YrW6aJ6d0tLSv2PHcyF0N0Iht6Qk6ZNPuplWBGCJieHEKJIV6lR1hjijy9yl/9/+S1aX9eHEw4DCHp+HZlgeD0MQxOsNMfUWjydevvz1wsLf4njZ4OBXIyM/0epuamuzLRZnW1vgHlIPH050dZnnq7Xw2SlHjtz+6COVUkkw/bpUVobb7e7eUJMeArAESEXSDdINimSFH/F3DHcc+vnQiGtk6myYgym73YMgSEwMg43rJiUmFhcXv7V8+et+v6+397OzZ+vGxu4jNN/dNDXlHTly2+cLNb/ggh48GD97dqipKY9pd6NSkVeumP2L0igAosNG6caC+IKT9052DHc4vYHzX07ePdk2K4m42RH8IWDSo0cTXq8/ISGGaauKi38vlVZ0db3X2/vZxATdz+QIgiBZWRKfb0cRw73HGamvz6Go5oD3ygvDccGnn65LS1us738ARAVSSGLoIi5F2rVrZX19TvByM8XH52PYHI8ywRva0JCr1VK3bo0ELRmy1ta7fD6H0YIGpZIYGhozhJf0EIBoZ3QYfaHuSoByUYyHBfxQbMbno+5u63PPJTCNbLP1+eZ6QxR8MFVfn3PoUA/T6zHicHiOHh3cti23tfUuzSoKBXHhwvBiNgqAJW7lzpWzN2zp+0ef8eKTiWwdHcOVlenLly9bYPYNfQwm/AAAlpLYlFjOrNfATsrpts+YJVxbm52eLt679ya8JwUALK6YGM6775bW1GQ+7YYAAP4PiMW8LVtYyBUDAAARwngCT4DYlFi/3+9zw469AIAgwv1in6JOqemo4ceFlbMGAABoWd+yXnNC87Rb8RRA0lIQ1TgxHPUBNZ3NdoOSa+SradwLLMxH7HynU/aCTL5FHn6o6AJJS0FU87q81HWKXEOGH4pUkUYa9wIL3Y3T7Lz9z9slO0vCDxVFIGkpWAKMl4xJJUkcQVjvcMXp4tjUWBONeyGwu0ksSix6s2j6EaVS+eOPPzocDqPReODAAbFYPDuK7phOukEqJFnYiSYERUWJb85scwRA0lKwBNh6bZ5xT3JZcjhBSBVp67O5aNwLjxcxoBiarEiWa+QiqejRnSeJ9fLz89vb28+fP//SSy+lpaXt2bMnOzu7qqoqIMrkrOe0X6UNHh0Mp91TOBwUwwJnPHs8vunzGjEMVSiSNRq5VCq6cyeUZIAhm0xaeuyYLnhRAJ5hfp/fdNlEriEf/Hvu5OdBoRhKlBM6evcCF+NhKeoU2SYZP45PXaUGDg+M6p4sjnj//feHhoa2bt3q8XgQBNHr9adPn16/fn17e/v0KBOjEw6jI74wPrQWz9bcnK9UBiZePXjw52vXKARBeDxMrU7ZtEkWF8e/epU6fHhAp2NhQQd9kLQULBnGS0bZJpkgSeC00N2/ZbqEFQkYH6Po3Qvc/OZ8vAy/f+q+4ZwhYK0EgiCVlZUff/zxZF+DIMiZM2coiqqqqgrobhAEcVldQja29Zx08uTd2dm8zObHOVObm/PLyvBTp+6fO2ewz2pzBKhUpFZrmS89PQBRxK632/V2QkncP3U/hOqkirRoLV569wJm6jI5KaesQpZRnSGSzUgfIxQKRSLRgwcznrIMBgOO47MD+Ty+MF84TWe1ugwGe8DP4Xjc63V1mSjKWVEhq67OkMkinfJmMmkpbP8Algxjp5FUhfJ9iivkJpUkGWnfC1yL1mK5YcFX4fLN8rTn00Z1o4YfDJMvmR0Ox/j4eEpKyvQKaWlp33///exAPBHPaQ7lYWxOCw+mtFrLjRuWVavwzZvlzz+fptON/vCDIWIfiSBpKVhiTFdMWa9kSbIkjxi+A8XLcLfdbQ3tXogviC9+u3jt/rVTR44fP97f38/lPn6jrNFo/H5/RUVFQEWUg253bS/6HWufh3BckJEhCfjFxs6RnaegIP7tt4v3T2vzYtu5s+SVV8Laig+AZ03RW0U5zLP2lewsyQ7zXhBJnwxPCgsLHQ7Hd999p9FompubLRbL6dOB+zEgCJJYlLjDvwNfNccgKzKk0ggNqYImLX01O/vgunU8bBHzOQLAOkJBrNm7BuUySIAlwAXrPl0nYpLAd467wj5tW96enp6NGzdKJJLW1tY9e/YcPXq0rq5udhXpRun48LjlhoX+hdnF4lbCCwuatBRDUT+CeCETEYgqlJbCONj0BQ1BU4sSSmJsaMzOJIFv8OShFy9eVKvVC5fJbczt/lu3f3G2animBE1amhATY3I4fNDdgKjic/vMV81EOWHRPn5oCJpalFAQw5FP4JtZk9mgb+Avg0XhiJDL3b927Qap9Gk3BIBwxabESjIkAT+eiPc025RQmNBoaJRtkj3NRjwzMBQtxXHI/wzAopBukKZXQVZBAEBw/wW6YFzTfQ56kQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.400;4.blob,1.1,1744.iVBORw0KGgoAAAANSUhEUgAAAbQAAAASCAMAAAAE2NszAAACjlBMVEUAAAAODgYHBwMyMhR8fDIJCQQMDAX19WNKSh53dzDU1FaTkzwsLBIgICD///8bGxthYSdpaStHHR1/NDSkpEKoqERiYihlZSkTExMNDQVGRhz29mP9/WYbGwsqKhGUlDwICAMiIiIFBQVeXiZxcS4eDAyYPj4QBwcDAwHm5l1jYyiQkDq8vEwCAgGKijg7OxgsEhJtLCwjIyP39/crKxKZmT4sEixtLG1WIyNxLi6LizjBwU4EBALp6V5TUyJ0dC8CAQE3FhZ+MzOZPj54MTE0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXiMOTk4FxctLRL+/mcfHw1LSx709GMLCwSYmD4TEwgFAgJBGhqGNjaVPDxiKCgiDg5MTB9iKGIyFDJBGkGGNoaVPJUiDiItEhKSOzsHAwPQ0FSpqUSjo0J9fTNkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBApkKWSXPZdNH00LBQtlKSlyci7Z2VgPDwb392RFRRxERByCgjUwExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxwJBASUPDwpEREYGAr8/GY3NxZkZCjk5FyXlz0hIQ0BAAAyFBR6MTF3MDCFhTZSUiF6MXp3MHc8GBiJNze3t0qVlTzCwk5ubiwoEBBwLS2VlT1BQRooEChwLXCSO5J0Ly9TIiIGDg7s7F8GBgI1NRaOjjkEBAEbCwsaGgsdHQwbCxsUCAgaCwsECwtf7Oxh7+8GEBDy8mJQUCB9fTLOzlMFBQKRkTswMBNDQxsBAQBLHh58MjIDBwdX19dY29ucnD+qqkXIyFH//2dgYCfW1lZwcC1mZil6ejKANDRDGxsoKBCJiTgZGQopKRHHczr/AAACSUlEQVRYhWNgoAdgZKKLNaOAmoCZhXWgnTCsABs7ByElnFwoXCZuHiLN5uXjh7IEBEl01tAHQsI0NFxElJAKLk5Uvpg4kUbz8klAWZJER/SwAcJCNDRcSpoRvwJmGVlUATl5BeKMVuRTgjGVVUh01lAHqmrqNDRdQ1MLvwJtHTQBXT19AmYaGIIpI2O4iIkptqRhZk7QeUMVWFjS1Hgra7zSNrbK6EJ29vg0ODg6ObugCyqYuoIoN3cw8ACxPb28fXxJcukQAg5+/jQ1PyAwCJ90cEgoupBsWDhO5RGRUdExsZjiVnEgMt4HDBIYGNwTk5LjU0h165ABqWnptLUggwWfbGYWplg27hZnTm5ePjbxgkIQWVQMBiUMDKVl5RUkuXJogcoYGltQVY1Hsqa2DlOwvgGn+sam5pZWLOJt4EIWUTy2d3R2dZPmziEEenr7aGxD/4SJuCUnTdbFFGScMhWnhmnTZzjPdMQQnjUbRCKKRwaPhDk+c71IdesQAfPmT6O1FQsW4pZbpIdNdHEhPvOWLE1DF9JdthxEIYpHEFixchXxjhxSYPUamhm9di2ELly3HpeSqYFYe8UbNm7Ca/JmdIEtpluxqduG15QhC7ar7aCV0Tt37d4DZrDu3Qck1yuAgQYyi2H/AaxaDx46TJpdR/SOUuTWoQWOHaeZ0SdOntoJYZ0+AyTOngOD88gshgsXsetVvkSaXZeDKXHpUANXrtLLpmuuYBCOzKIWOHxdgXqGjQK6gBt6NwfaCaOAVHAtYKBdMKwAAAMriQY2Fu/3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.421;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAAGAAAAANCAMAAABhLJuOAAAA21BMVEUMDAX19WNKSh4AAAAFDAVj9WMeSh4sEhKVPT0yFBSkpEKoqERCpEJEqEQvExOJNzcOBgZGRhz29mMODgYcRhxj9mMGDgYDAwHm5l1jYygBAwFd5l0oYyiLizjBwU44izhOwU4tLRL+/mcfHw0SLRJn/mcNHw3Q0FR8fDJU0FQyfDJyci7Z2Vguci5Y2VgYGAr8/GY3NxYKGApm/GYWNxa3t0qVlTxKt0o8lTxZWSTs7F8GBgIkWSRf7F8CBgIJCQTy8mJQUCAECQRi8mIgUCCcnD+qqkU/nD9FqkVf04WqAAAAj0lEQVQ4ja3NNQJCURBD0YHg7u7u7u6w/xXRfZhXJ9VNdURsdjDncLqsdnu8EPj8VACB4K9D4YggGotTgUQy9X8F6UyWCuTyBQ2gWKICKFcMoFqrU4FGs6UBtDtUAN2eAfQHXGA4MoDxZEoFZvOFBrBcUQGsNwaw3e2pwOF40sD5cqUCt/tDA3i+qADeHyu/i0YYCifMCvcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.813,3.440;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAABkAAAANCAMAAABrcDXcAAAAb1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0PgS/BWAAAAXklEQVQYlWNgwA4YmXBIMDAxIvOYmeFMFlY2JAl2Dk4uGJubB1kLLx8/O5QpICiEwxZhEXYcMqJiOCTEJSRxyEhJy6C6Fc6SlUN1K5wlz6qA6lY4S1EJhy0MyiogEgCA4QNmDxmglAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.751,3.497;4.blob,1.1,1588.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAAiCAMAAAByZCtEAAACH1BMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFABAQECAgKsRUXYV1dFRaoxMTE+Pj4XFxcPBgbzYmJuLCwKCgoNDQ0FBQVUIiIBAAA0NDQRERFHRx1/fzQgDQ0bCwsMBQX1Y2NKHh4NDSAGBgYTCAikQkKoREQICBMeHgyYmD4QEAciDg4FAgJGHBz2Y2MODiICAgVWViNxcS4jDg73ZGQDAQHmXV1jKCgODiNkZPcEBAthYe8GBhACAgGMjDk4OBeLODjBTk4DAwdXV9dYWNstLRKSkjsHBwMtEhIfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtZJCQGAgI5OYwDAwhLSx58fDIJBATyYmJQICA6OpCAgDRDQxucPz+qRUVFRaxXV9gICAgsLG4iIlQAAAEDAwNvlt0vAAACQ0lEQVRYhWNgoCtgZGLGwxpwwMKKj4UfsLHRmsXOwcmAm4UBuLh54GxePn4BGrMEhYShlmFjYQARDiZRMShbXEKSl9YsKWmYzdhYGEBGVk5eQRGnNLWBkrIKHhY2oKqmrkFjRyGAphY+FgZg1NbRZdWjsZsQQN8AHwsNKBkaGZuY0txNCGBmboGHhQYsrfQR+Zna5QhWoGaNj4UKbGwRbGqXIwx29g4YLAZHJ2c8LNyA2qUHg4urGwaLwd3DEwfLyxsMvAg6lDrAxxeTBUxMfjhY/gFgEEgfxwUFh2Cw8IHQMDAIp6WbEMAtIhKDNQpoD4A5ZKCdgAdEBQRED7QbcIPQaLjrYmLR5OLs49FYCYlJUBFiWdhMQQbJ6uiVO0obPgXuutgYDNelorPS0mGSxLKwmYLiugx0IeQ2PNx1mVnZaMpy7HPRWXn5sOqTWBY2U5BAgXohjMkJreqR2/Bw1xUVo+ssKcVglZVXkMjCZgoSqKyCsaqdamrBDOQ2PMx1dfUNmHoxQWMTqSxiQXNLazWEhdSGh7murb2DGDM6XbtIZJEOkNrwMNd19xCntbePVBbpANGGh7quf8JE4nROmkwqi3SAaMNDXTdl6jTidE6fMZNEFukA0YaHum7WbGK1zplLKot0AG/DQ1w3L2s+sToX8C0kkUUkWKS+GMaEt+EhrluylGhDli1fQSKLSLBSGd67gbfmIa5btZp4U9asJZVFHFi3HsGGtua9NgyWNoqM0UYMscHTgrLdtBlDDNjH2MIAAHFiyGGoKDrsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.362,3.552;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAUElEQVQImRXMRwKAMAwDQWM6gYTeCaH//4fIlzmtROQxM/lBCDmKxSTNIKtcLDRBo0vIVS02rdgpsR/gOM1w0Svc7A7dge15GabbPvh8P7Q/jP4DuQRHJToAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.571;4.blob,1.1,1804.iVBORw0KGgoAAAANSUhEUgAAAU8AAAA4CAMAAABKQ4oNAAACBFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8CBQIGEAYOIw4xeDEXOhciVSIucy4AAQAKGAoNHw0yezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsgICD///8bGxsFDQUTExMmXiYucS4iIiIFBQUSKxIfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsDCAMVNBUbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhY4izgEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU0gTQLCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKyszfzMDAwcYGDwxMXg9PZcpKWUHBxATMBM7kTsDBwcYPDwxeHg9l5cpZWUHEBA2hTYhUiELCxsmJl07O5I7O5EiIlUHBxIxejELGxsmXV07kpI7kZEiVVUHEhI9lT0mJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgLGgsMHQwJCRcBAQILGwsJFxcBAgI4ijgyejIeSx44iTgKGQoSLRINIA1n/2cIEwhk92TX/sB/AAAC/klEQVR4nOWb51PUUBRHo6K7FBWeiwICK6hYwcKq2DvYsHdU7L13bNgFe+8VG6v/pMzqTOLNhGVffldv9p0vJLPJuXP2E5vMtawOulkmwFdJzN17sE0SBF8lMWf07MU1SRB8lcQcCmcyDZIEXyU1Z2XnME2SBF8lNffuwzRIFHyV1Nw3l2uSJPgqiTlPZXFNEgRfJTX3UxGmSZLgq6TmfNWfaZIk+CqpeYAqYJokCb5Kai4sGsg0SRJ8lS5zcQnTJFHwVVJzaZhrEpbCaIKQ86jr8FVS86CiMq5RUMpVgsHOo67DV+kyDxlawTQKyrDhCfKcRynAV0nNOSNGMk2SBF+lyzxqNNMkUfBVmvH9/XcqTXhu5wDdS31VY8ZiBwgH3evyjRsP9TNSHZsAsKB7qW9idlB+ylfHJgEs6F6Xr2Yy1M/HlNhUhAbdS33TVCV2gC7TZ8x0nhbMIp/PnvP779x58/2MQfdSX62qg/q1WbBw0eIlf45D9UtVucd1y5avWLlKfwy61+VbXQr167Nm7br1GzZ2HEQbNm3e0uh53dZt23fs3KU9Bt1LfbsFPbvbs3fffss6cPBQkt/ph48cPaY7A91LfcdrsH59Tpw8dfrMWctqCp8rye/kuvMXLl5qvqw7Bd1LfVeuYv26XLt+4+atlsRhRVWrKq73uO72nbv37j/Qn4PuJb7QwwasX5dHj588tc8iz557XPfi5avXPsage6nvjXoL9Wvz7v3f5x88rvv4ydcYdC/1ZbYJfrKs85YjCehe6vv8BarHovOWIwnoXuJr+lqL9UPResvRKehe4vvWlgHVSwfdS32R71C9eNC9pn1//w7T9jvQvYbvd6B7g7/f0R73+g/fE7sS3ZsG+x3t8R8p3mFXonvTYb+jMR5N8Q67Et2bDvsdZT9TvcOuRPeavt+B7jV8vwPda/p+B7rX9P0OdK/p+x3oXtP3O9C9xu93oHuDut/hD7sS3RvU/Q5/2JXo3qDud/jErkT3mr7fge41fr8D3ev0/QLOGXo5AJYpTgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.628;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAAF8AAAAlCAMAAAATK8VgAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAA50lEQVRIibXW11bCYBRE4QQsxOAfCcWAUiyJUlWaxEZ7/3fyzrWYs7zbzAN8t7M9729+wUOnXvHkFPWNd3aO+sYrBReob7ywjPrGu3Q+6qsXuSvUN14lRn3jVWusr149ZH31GtesL17SbKG8ejfuFvXVa3e6qK9e7w7l1bt/iFBevMdOivLqZU8oj3v/7/m4Xn/A8uKlwxHKi5eM2yiv3iRgu0S9l1eUN97blPXFm7kJyqs3dxnqq7dwS9RX792x0abeKv9AfeN9wk2iXjxmffW+8m/UN97Pmn119QqbLeobb7dH/QPvF+fuFcf2YcbpAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492323743;4.rect,1.1,3.584,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.561,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.530,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.603,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.692,3.326;4.blob,1.1,1408.iVBORw0KGgoAAAANSUhEUgAAABoAAABZCAMAAAAXWMQ+AAAB/lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVnZypqaisjIyP39/eMjDlHRx0LCwWZmT4XFwkoKBAcHAslJQ8REQcsLBIEBAGWlj09PRl3dzBZWSRMTB8+mT4XOhcQEAYjIw4NHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR4xeDEKGApHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxvqJ3JpAAAB3UlEQVRIiWNggAFGJmYGXICFFacUGzsHLilOLm6c2nh4cUrx8QvglBMUwiklLIJTSlRMHKechCROKSlpGVxSsnLyOLUpKOKUGqxASRmFq6KqBmcrK6EqVdeAsTS1tFGldHT1oCx9AzQLDI2MoQwTU3TLzcwhtIWlCrqUlZY1mNZQx3SzjS2ItNO1x5RycASRTs4umFKubu5A0twMU4aBwcOTgcFLyxublI+vH4N/ADYZhsCgYIaQUKxSDGHh2MXpAiJwykRG4ZKJjomFMOLiE1BlEpOSGWBSKahSqWnpUFZGfCaqVFY2jJWTi2ZVXj4uRxQUpuKSKiosxiVVUliKS6qssByXVEVlFS4phuoaVH4gGBiCmLVJqFJ1YFAPYjZUNqJINYFBM5jd0tqGy7L09g6cDunswilFDYCU21EAsFRA5HZUACwVELkdBYBKBXhuRwXgUgGW21EApFSA5XYUAC0VILkdFUBLBUhuRwGwUgGS21EAvFQA5XZUAC8VQLkdBSBKBVBuZ2DwQyQFpFIBnNu7EUkBvVToQU4Kgxf09uGU6uvFJdM/YSIuqUmTcclMmToNl9T0GTNxSc2ajUtmztx5uKTmL1iIS2rRYlwySyYsxSW1bDkuGYYVK1H5AHMAXqoQWvW7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.345;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB//FAzAAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.342,3.362;4.blob,1.1,1648.iVBORw0KGgoAAAANSUhEUgAAAYMAAAASCAMAAACO90JyAAACglBMVEUAAAAWFglGRhx2djB3dzDU1FYMDAX19WNKSh5HRx1/fzQpKRGPjzoUFAggICD///8bGxukpEKoqEQCAgGDgzVDQxsTExMyMhT9/WYbGwv29mMODgYeHgyYmD4QEAcxMRSTkzwHBwMiIiIFBQWQkDq8vEwDAwHm5l1jYyhWViNxcS5NH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxIEBALp6V5eXiaLizjBwU6MjDk4OBdDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAEtLW9jY/ZjY/U8PJQPDyRLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT6pqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigcCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxtkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQAbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB7Cwk6Kiji3t0qVlTx0dC9TUyJeJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4hIQ1ZWSTs7F8GBgIaGgsXCRcCAQIQECcCAgR9fTLOzlPy8mJQUCABBAECBQIBAgHW1lZwcC2cnD+qqkWAgDQxeDE+mT4XOhcQEAYKGAoNHw0FCwVVVSJzcy57ezJJSR5ZN6XKAAACC0lEQVRYhWNgGAV0A4wD7YBRwMSMR5KFFYcEGzsHdglOLkodNPIANw8vhMHHL4Apy8qCS5+gEHZxLk5quGpEAWERUSiLj18MQ1ZcQhKXRiYpaWzCMrJy1HHYCALyCopQlhK/MoasiipOjWrqGtiENbWo4qxhBbR1dPHK6+nDWAaGENrI2AQmZGpmjlunhSUWQWEra9LcNxKAja2dvQOY5egEBs6o8lYYxbeLq5u7B4Tp6eUNooR9QMAXhcXA4OcfgGmdX6AipuCIB0HBIaFh4UBGRCQYRKHIRsfIY+iIjYtPSEwCsZJTwAKpaSCQjsICgoxMTNuysqnq+OEDcnIj8xgY8gvAoBBFqiimGJuOktKycgaGisoqMK+iGgRqUFhAUFuHoa++gZu6Th8moLGpuaW1DUdZ1B7Tgamjs6u7p7ePgaF/gjA+gydOmowuNGXqNApdOxzB9BkzZ82eA2JhLYvmxsxD1zF/wcJFi5eAWEuX4Td7+Qp0kZWrKHDqsAWr16xdB2FhLYvWb9iIrmPT5i1bwYxt/hjxgwq279iJKsAru4t8lw5fsHsPfnmW7egie/dBGfsPEDC7/uAhVAFPLLX0KMAKDh8Bg6MgdqoITmXHjhMy6MRJVP4pUezqRgEGOH0GDM6C2Oc21Ay0c0YkOH8BDC6COZcujzZlBhooXjlEWNEooC1gu4pdHAD/B4isVeMURgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.381;4.blob,1.1,3392.iVBORw0KGgoAAAANSUhEUgAAAIoAAAA1CAIAAAAReeSTAAAABmJLR0QA/wD/AP+gvaeTAAAJpElEQVR4nO2bW1BTVxeAd05yjuQCJPEYYi7c5JLYMIgRA0IVHTD84vSX8bczVCFtmcrLz/zOaKd96OiDfXKcjqN1lPalQ9HOWB0dHxCnchEdCyoxtFoVJFCGRElOCgbCyY2c/wHFkEBIyDnhYr45M4S999lr7ayclb3XWqGD8GAJWQRBeFyeMOeJMitQmPcLC4V77u5B4hFStIlCPtvrt6uvqhdbi0VArZYeO7aJUhHhPj0AgN8P/y7ZKZH+Sxr+VMuLvLyEjo5hSkWQYB672f7ilxfZR7LDn2oZkZjIWbuW1dlpolSKr3n4Cr6iVuHdolKpbt++jeP48PDwmTNnOByO/yz6y3rxDjEzgUmhpnOjUPBrZ+ocAfLyEp4/Hx0ddVAqhTH1hwbR1uSukaqlbDF7rH9sujszM7O1tbW9vb28vFwkEp08eTI1NbWsrMxnluF7wwAA0TZR36U+UtSi02kQRPNpdLs9BPHuXwii5eauUaulYjG730vnCABBtM2bBZcv66kWxIBgSFgolJRIkHgE68J6G3qteut09/Hjx4eGhnbv3u12uwEABoOhqalp+/btra2t3rM4rU58GOfKuWSppdFkqlQCn8a6ur+0WgwAAMNQYaGwpEQSH490dWENDb16L50jwAcf8BAEevQIo1oQI1OTiSrRwcZBY4vRZXP5dO/atevUqVNTtgEA3Lx5E8OwsrIyH/MAABwjDqaANOd2/fpAc7PBp9FsxqdeaDSZSiXa2DjY0mK0+ekcAfLyEnQ6i8MxSbUghumhiZPEkRRLYA788s5L25Btuo/JZLLZ7FevXnnfYDQaURT1n8jj9tBj6GSpNTLieP3a6dPodr85/D58aEpK4hQXSzgc+M6dl0NeOkcAJpORnb367NknEZDFsOgslm4LmoNKS6WiIpFVbzW2GU2dJgAAjuMTExNCodD7BpFIdOvWLf+JYDZsN9vJUiuwc9PpLN3dlpwctLRUWlQk0uutbW1GqjdR0yiVqM3mevZsJDLi3sGVcbMOZRWcLphuuXLlSk9PD4PxZgehVqsJgiguLva5kUanfeH4QvFf0rZPKBqTlBTrc7FYDP+RMhn30KGs0146U82RI9l796ZGTJwvbDF7+rVcLsdx/MaNG2q1WqPRWCyWpqYm/1v4Cn4NUYPmzOL0IoPYS2dKQdGY8+e3ikRzivtPamrd1q0wRMKBMii2bNly9+5dHMfNZvO5c+fi4uL8x2T9L6vSWEnz2wqvPMrKEr/5ZmOAAR+vW3d+61aIRs5bMYu78OHevXuFhYWBx6RXpj8594TwEIGHrQBycwV37rwMMIC3apUJx2cc0BaX5D3JBwwHkLho0BowGYzTBQU7xOLFVuQtPDmv0lgpKZEstiJLAohG24iiS8jFi3eIE8sSF1uLKFEWA9LO+VEAAHFxCABgcpK0fUGktufvB2lpcV9+mc1kzr8fDpJ5zMPhwDZb9a5dlH+7fPXVhsePPw5y8KpV9DNnChUKPqUqzUVycjJBEOLZtmdaLWYw2D79NJMsWfOYZ3zcdfVqf1VVBlny5qKyMuPnn3uCHOxwTD56hOXnJ1CqUmDs9tkDjJcv69ev55H10ZnfudXX93z0UVIclceajRtRuZzb0NAb/C0dHcPZ2atjyIuRBw8EQQAAq3X2DNPYmOvBA1MJSSeN+c3T3GwYHXXu20dhELCqKqO11WgwhJAXePZsdGLCrVSuoU4rAICCz69V+MZ5aTSa3W53uebMM3V1YTIZN5wPtIKvqFXUgmDMMzlJXLjQS51/YzCgioq0+vpgPdsUHg/R2WmiyL9BNJpKIDiqVNYqFGwY9unt6+tjMgMlHvv6XgMAMjLivRvpNDoMwT4XDcw4wkI0SCVQHVUerVXUsmE2CCbmBgCor+85fDg7KSn277/JT+mr1RI2G75yJeS8fUfHcEmJZPXqGIuFtDwTDEGFQmGJRBKPIF0Y1tDbq5/DiQXAbp+0Wp1CIcu7UZOpUQlUPiPr/qrTYloAAAzBhcLCEklJPBLfhXU19DborXoQpHn+/POfP/6wVFamf/utNlRd56WqKuPq1X6bzR3qjQaDzWCwqVSCxsZBspTRZGYqUbRxcLDFaLTN7b7mZWLCHRs747G7PnC92dDsM8yMm9/K1ShRZeNgY4uxxeZ65+SD/WplsRiffy77/vvHC9Z4VuLjkR9/3Pb1150Lq+VAEHpBgbC11UiWPh6CSI6NlfN4bAZj1OGwLtRC27attVpd3d2W6RbHpGPcNT7mGvO+nJPOt3I9ybHJcp6czWCPOkatrjfvRrAHqIsXX5w4kadSCcjNGe/bl2qx2P2rPoLk/n3T3r0pKSmxZBVS6SyWboslB0VLpdIikUhvtbYZjZ2mkJeMIPTx8RmmDezcdBZdt6U7B80plZYWiYr0Vn2bsa3T1BmseV69mvjtt6GqqgxyzVNVlXHx4gvPQhNFVqvz6dORvLwEEuvcCAC0GKbFMBmXWyqV7k9PD9U8EETjcleNjMyoUAzs3AAABCC0mFaLaWVcWam0dH/6/k5TZwhSKyrSMEyDIKTFgVJSYj2emjBPcLm5gu++y2cwqIrii9khp8lFInZd3VapdJZy2lDkikFIMbdr1wYQhO4d4EEQKCaG7nPR6bRgegEABw6k63TY48f/hLMMnQ6j0yHqAjwGW8hVWnI59/Vr59DQeHhyDSD47x4AAI67L13q++ST9GvXBqZa2tv/7V/u9NlnbT/99HzeXgBARUXaDz88XZDy73C5PF1d5s2bBTqdZf7REUGlSrh920hKOjssnyCTcTkc31Nbf//Y1EEkcO9KZcOG1RUV6ceOPbDbKa8hjRIaa9eyTpzIk8t5i61IlNmQybhZWYuT5ogSJUqU94WIpbqXCDAHrrZVJwZcr4LPP/vhhxtn+43NAggr2+h0etav5+XkoBH4Gd9SwOP08Nbz0BxUP/d6TThusNkq0tLum82OycXeW+/cKZmYqKY01b2kkOyUVE9UR6xiOdwAWgRS3UsKQ7PBOepMjdR6wzUP1anupQYxSfRe6M1YRuvNyuJ7PDVJSbGLrUiE4Gfxazw1sRFZLwmFSCYTXl6eAsNQe3ugH76sGHATnlKeAsHQS+rXS07ypr6+p7Jy+TzvYdNT35OxjNYrFLLc7oP+6YOVCkvIOug+KKB+veRUWY6Pu/LzExITOSQWzSxlXOOuhPwETiJncLmsl/RU9xInrSJNg2kgitdL2uz+qe6VzcC1ATpCDxzgCR/SSsjdbs+6dXGbNgl+/fX9CPC4PXHr4gSbBHoq1/t/3ae1YHNwRwYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.383;4.blob,1.1,616.iVBORw0KGgoAAAANSUhEUgAAAGAAAAAOCAMAAADnuOkgAAAAz1BMVEUDBwM8kzwSLBIAAAAdRx00fzQoYigpZSkRKhE8lDwDCAMMHgw+mD4HEAcBAgE4ijgYOxgjViMucS4iUyIvdC85jDkXOBcLGwsIEwgSLRI7kjszfTMeSh4cRBw1gjUECQQRKREGDgY9lz0NIQ0YPBg3iTcAAQAsbiwkWSQGDg4WNRY5jjkBBAEIFAgLGgsECwtf7Oxh7+8GEBACBQI7kTsTMBMeSx4yfDIDBwdX19dY29smXiYpZikxeDE+mT4XOhc0gDQbQxsKGAoNHw0FCwXdUqpTAAAAuklEQVQ4ja2SxxKCQBBEV5cgihjAHDAriqJizun/v8l1uSjsxaruw9TUm6p+lyEkFqfCSLKY/xlCFVV8kSWQIKElRYeUngYJjExWdMjlIf1MQE1LwI1CESYo6eUor1QJTEBr9ShXFUw/FzSaEWxrLaCg3emGca8/AArocBTGlglpd5xAMJ64v4epPkP0e/PFkgv81ZpN1+cx2LrZIvrpbn/wgmc8ntg4X3iubL3dIYJPvr798eR5wbp53qDzHHTkYMHiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.516;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACtVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0B9ZW2AAACKElEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDgkWSckOkpCk3g0FGlgqGjILBCeTkcUgoKCoRrUNeDpfxyirYxTF1qKqp4zJEQ1MLmzAWHdo6uMxg0NXTxyaMqcPA0AinIQzGJlgEsegwNTMHURaWIGCFwmJgsLaxxTQEqgMZ2NmDKQdHEHBCYQGBswumIVAdSMDVzR1Ce4CAJwoLCLy8McyA6UACPr4WmHYhgJ9/ABE6AoPwmcHAEBxCWEeoTRh+Q8IjIgnqiIrGbwZDTGwcQR3xCQQMYUhMIlXHKEABySlUMCQ1LZ0KpmRkUsGQrOwcKpiSm0eylvwCEFlYVFxSWgYRKa9IJlKvUiWIrKquqa0D0vUNjU3NLa0QqbaKdly6rMClnSW4DDDo6HTsYmDo7unt658AEpg4aTIDw5Sp0yBKp8/AZYgyuLRznAnMkLNmz7GfCxSaN3/BQojkosUgcslSCG/ZclyGhIJLO48VDAwrV61eAxZau279ho0gxqapm0HUlq0QpdtyCXsnbvuOkJ1gsV2799Tu3Qdk7Ie45ABE6cFDhL3DYDHzsOORoxDhY8dPAMmTkDA5BRY6feYsYe+AwLnzF2ASF4H4UvHlKVeuNkIErlVcx2UIOrBG4d24Wbzk1m0I+87de8Qaghvcf0C5GQ8ftVFsxuO7Tyh3yNNnJCkHACrLknCJtVV2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.571;4.blob,1.1,1552.iVBORw0KGgoAAAANSUhEUgAAAgQAAAASCAMAAAATzDYLAAABsFBMVEUAAAAJFgkqKio+Pj4aGho0NDQREREGDgYDBwMcRhwwdjAvLy8NDQ0FBQUKCgoUMhQyfDIECQQRKRE6jzoIFAgFDAVj9WMeSh4wdzBW1FYxMTEYGBgsLCwGBgYnYScraSsBAgE1gzUbQxtCpEJEqEQFDQU8kzwSLBIUMRRj9mNm/WYLGwsmXiYucS4qZyoraisBAwFd5l0oYyg6kDpMvEwSKxI+mT45jDkdRx04izhOwU4CBAJe6V4BAQECAgIDCAMVNBUFCwUSLRJn/mcNHw0eSx5j9GMECwQoKCgUFBQfTB8JFwkQKBBU0FREqURCo0IICAgEBAQSEhIrKys0gTQkWSQLHAsPJQ8uci5Y2VgGDwZk92QcRRwJCQkzfzMHEQcKGApm/GYWNxYoZChc5Fw2hTYhUiEBBAE9lj0ZPRlKt0o8lTxOwk44ijg9lT0aQRpf7F8CBgINIQ0LGgsMHQwCBQJi8mIgUCAyfTJTzlMAAQAxeDEXOhcGEAYOIw4/nD9FqkVRyFFn/2cnYCdW1lYtcC0yejIiVSIucy4IEwgTMBM4iTgyezIDAwMKGQoeSR7lZUCCAAAClklEQVRoge2Z6VMTQRDFx6xyaJRD0OAZUBAVFa9V1BhOD4wCKuJ9K3hExVs8ERVv/2W3hiWOpmeYx8zAlvD7sNWV7n491fVgshXGEOZA1dFQnqHEPG/uWDTP8wpyH/+758IiVLh4vsmxpkd5phJbEF84Fi0q+GOCvD2XlJZhuuWLKwxPNvXKFqhcsnSikkQV2jF5li3XKoutyIUrcyYg9rxqNTQ9WV0D1UdB2Qpr1k5UUZVAOyaPgQmoPdfWrUOm19fB98e0K1uheH2huqBkw0awwwADE5B7btiETN+8BamOhrIVGrduUxds34F2GGBgAnLPO33EsLt2A8UQ7pTt0LRHmd67rwHsMCE0QWo/R1pGmYDcc9pv1h/e4tfrF0O4U7ZEa1u7Kt1x4CDYYUJogkMe5/BfOe6LFA8JE0j23NSpP/yIn4EOGwVlWxwtVWWPdaEdJoQm6I5zesTUce6LEzwmTCDZ88le/eGn/D7stBFQtsXpM4rk2XPnwQ4jFNdBD/fFBR4TJpDs+WLeZSbnkg+9SwC4U7bF5StX5clr15NghxGq60CAMIFkzzdu6g/vH7ilXwzhTtkat+/Ic3ezaIcRiutAhDABvefkvfvA9ARwd2C4U7ZF74NBWephG/n3pegww+AVkdzzI/8x63/CSTIhoumsBo4K4U7ZFmVPnwXPwTSnUYzY8xeKDgcYmIDcc012iL30Oa+YENG8HngDnVYfd8rWePsueAy/54yIEfvwUdHhAG0ThO+KLNU9bgJyz586gm8w7ZwWMZIw+nkIPbEm7pStkmnmfBGjKUfXBNRPycSev35LQ+OLvjv6D+dQ+f9D0wTBF8fxn5Lj8R/hh/l7/pktB+dX/gIbIqA8i0jenjOtweM3k2R7+0ICRRcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.590;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABkAAABLCAMAAACycdytAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAA4klEQVQ4je2TxQ4CMRBAB4fFobgt7u7u//9LpMhOB5iEI4d9h7bJO7TpywAQLMBgtTHC7nA+Ty43ER7NC9+Nzx9gTDAEjAlHGBMVPsbERJwxCZFkTEqkGZPJ5ri35Quc0TXOFLMlxkC5UmVMoFZnDDSa8CvvjVuvGh+N253ufcfGBr2+XJXGBgO//EKlMTIcAWmMjEWLNEYmYkoaK8x00lhhXiCNFRZD0lhhuSKNEc96QxojW7EjjRHvvkoaI4ejXLGxwek8kRs2fnHZ2x+Hj8bx65erWczZNmcbMWdb8uezfQNf6yCxFMmOEgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.592;4.blob,1.1,1532.iVBORw0KGgoAAAANSUhEUgAAAUcAAAAXCAMAAACvbn0aAAACN1BMVEUAAAAgICD///8bGxsnYScraSsMDAX19WNKSh4TExMFDQU8kzwSLBKkpEKoqEQiIiIFBQUmXiYucS5GRhz29mMODgYfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsSKxI+mT4GDgYDAwHm5l1jYygbG0M8PJQ8PJMkJFkJCRYBAgEWNxYzfjMxeDEbQ0M8lJQ8k5MkWVkJFhYDCAMVNBWLizjBwU4EBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU4izgfTB8tLRL+/mcfHw0LCxwsLG4+PpkSEispZCk9lz0fTR8FCwULHBwsbm4+mZkSKys0gTQkWSTQ0FR8fDIDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBAzfzNyci7Z2VgLCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhI2hTYhUiEYGAr8/GY3NxYmJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAg9lT23t0qVlTwJCRcBAQILGwsJFxcBAgILGgsMHQxZWSTs7F8GBgIBBAEbQxs4ijgJCQTy8mJQUCAXOhcyejIeSx6cnD+qqkUKGAoNHw04iTgKGQoRKRESLRIJFgkcRhwwdjANIA1n/2c6jzoIFAgIEwgUMRQDBwMOIw5k92QqZyoraivp/dVnAAACAUlEQVRYhWNgIAAYmZgJKUEDLKwkaqCzedQFbOwcRKljZOIk0WQubh7SnUNH86gMePmIUsbPJECqyYJCJDuGruZRFwiLiIIoMXEJZFEeSTRlUtIQWkZWjliT5RUUKXQbbc2jLlBSVgFRqmrqGppQIS1tHQVdHMr19A0MjYgz2VjBhHLn0dA8KgNTMzBlbmFpZW0DZNja2Ts4OuFU7uzi6ubuQZTJnl7UcB/tzKMu8PbxhbL8/AMCGRiCgkNC8esIC4+IJMbkqGgKnUZj86gMYmLBVFx8QmJSMgNDSmpadDoe5RmZWdk5ucQYnCdIDefRzjwqg/wCIFFYVFxSWgbml1dUKlRp41BcXVNbV99AnMGNTdRwHu3MozJobmllYGhr7+hECHV19+BQ3NvXP4FIc7Um2lHqNJqaR3UwaTIDw5SpqGLTcKidPoNoY2cqzCLfTXQwj+pg9py5WMXn2YKBFpnGzl9QTr6b6GAe1cHCRYuxiusqgMESMo1duox8J9HDPOqD5SuwCq9cBQYEWkG4QMpqYwqcRHvzhghYs2DtoDZvqICudYPbvFEwvMF6LCxqmzwCwIaNmCxqmzwcwKbNuFrmYLB2y1YMFnUAtc0bYLBp8zY8slqp8zFY1AHUNm+ggdNmWzyy27l3YLCoA6ht3kCDnbvwye7eg8miDqC2eTQGAOCPcrazd7vSAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492323847;4.copy,1.1,3.650,3.456,3.310,2.38,2.14,1.1,3.640,3.456;4.rect,1.1,3.594,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.694,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.392,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.571,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.540,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.600,3.196;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.326;4.blob,1.1,2048.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.383;4.blob,1.1,1324.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACClBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtUIiKZPj4FAgJLSx58fDJWIyOYPj4CAQGAgDRDQxtnKiqCNTUJBASSOztCGxsyFBQBAAAODgYyMhQgICD///8bGxthYSdpaSsTExMNDQWTkzwsLBIiIiIFBQVeXiYsEhJtLCwjIyP39/crKxKZmT4sEixtLG03FhZ+MzN4MTEICAM0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXhBGhqGNjaVPDxiKCgiDg6LizhMTB9iKGIyFDJBGkGGNoaVPJUiDiJkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBApkKWSXPZdNH00LBQswExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxx6MTF3MDCFhTZSUiF6MXp3MHcoEBBwLS2VlT1BQRooEChwLXCSO5IbCwsdHQwbCxuKijh6ejIwMBOJiTgZGQooKBAFDAVj9WMeSh6VPT1CpEJEqEQvExOJNzcOBgYcRhxj9mMGDgYBAwFd5l0oYyg4izhOwU4SLRJn/mcNHw1U0FQyfDIuci5Y2VgKGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECQRi8mIgUCA/nD9FqkVbcf47AAABkElEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS7BIwphS0jKE1cvKwZnyCoqE1Sspw5kqqiS5TE1dgyT1ippaJKmnNdAmLRkx6MgJEKNMV08fyjIwJE69EZRlbGJKhHozPXMY0wJvRrO0AlPWNnARWzttLOrsHYCEoqOTtDO6jIudK4hycwcDDxDb08vbx5dBxs8/IDAI06jgEBAZ6gMGYQwM7uERkaFRDAzRMbFx2JwYnwAiE5PAIJmBISU1LR0kkpGZlZ2DRX2uBap78vILCotAQlqaxdIljhjqS8tQ3cPgEVbuU+EFlqusUkdXzlFdg+oeEKitq4dKN6Crl7RrxOarJmyCIKDcTFpR0SJLkvLWNhdSlLc3k1bQdXCTpHxwgM6ubjjbskeTsIbePgS7f8JEguonTZ5CkoOmTptOknqGGTNJUz9r9hzSNMydR5r6+QtIU79w0WLSNCxZSpr6ZctXkKR+5arVpFmwZi1+eQAQ6U4oJ+35bgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.803,3.440;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAABkAAAANCAMAAABrcDXcAAAAb1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0PgS/BWAAAAXklEQVQYlWNgwA4YmXBIMDAxIvOYmeFMFlY2JAl2Dk4uGJubB1kLLx8/O5QpICiEwxZhEXYcMqJiOCTEJSRxyEhJy6C6Fc6SlUN1K5wlz6qA6lY4S1EJhy0MyiogEgCA4QNmDxmglAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.497;4.blob,1.1,1544.iVBORw0KGgoAAAANSUhEUgAAAJMAAAAiCAMAAABsrRv3AAACFlBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1dFRaoPBgbzYmJuLCxUIiIBAAABAQECAgI0NDQ+Pj4REREKCgoGBgZHRx1/fzQgDQ0bCwsMBQX1Y2NKHh4NDSATCAikQkKoREQICBMeHgyYmD4QEAciDg4FAgJGHBz2Y2MODiICAgVWViNxcS4jDg73ZGQDAQHmXV1jKCgODiNkZPcEBAthYe8GBhACAgGMjDk4OBeLODjBTk4DAwdXV9dYWNstLRKSkjsHBwMtEhIfDQ1lZSliYijQVFR8MjIJCQSUlDwpKRFyLi7ZWFg8PBiJiTcBAQAYCgr8ZmY3FhZ0dC9TUyK3SkqVPDwUFAgaGgtZJCQGAgI5OYwDAwhLSx58fDIJBATyYmJQICA6OpAICAiAgDRDQxucPz+qRUVFRaxXV9gsLG4NDQ0DAwMiIlQAAAE8cEf5AAACK0lEQVRYhdWXV1fUQABGB6RXUUG6NFmliPTuwtJUrCAgSFGk9967gGLD3hsKKqig/xDITiMJQ+acTSL3Ze7OmZl8D5vkCwCaYmV9gGE6YWPLMjns7NQ2ewdHsLtBnJxdsLu6uR9U2TwOHYYXkzPIEQdrTy/oR719XNU2Xz90ZTmD+AcEHgsKBloREhrGMMLxcMMJzUKdjGAZxCoyKtr2lGaZYk6zTCAkNi4+IVGzRAAkJacwTCA1LYbciZZ+AsgSns6ybTIyiVv6CQDOGLMkBrJNOQwTY+n7HuTm5UsMFJw9xzDVOV8ota2/ywWWqczFS5clpjf5V65KbP9SVFysdwQJ10pKSvXOIKas9P/LBK5TmcorhOGGsRJOIKuqroEzSk3uFJqbBvFLlmrBdKaKcnjGLXwatNrbaI1SkztlR6Y68RRpwVSm+oZGYWwyNsMZbC2t6DWm1OROoWgztCN1hK9c0oKpTB2d5rGrG81g6+nt4zS5Uyj6B5ANmoaGBSEtmGQaGR2T7kWMT/CaUianpgfNhlswyTRzZ3b3nXN585zGD27BJNPde6wNC/d5jR/UgnGmBw8fsdY/XuQ1flALxpmePH3GWv/8xUtO4we1YJzp1Wv2hjdveY0f2IJRpncN79nrP7h95DSFfDJ8RgpbMMr0ZWmPrV+/LXOaQlZC8VeBuQUXfYeZfvzca+/qGq8p49dv4kIL1r+r+Mf9Ec2Ura9v6BIFk/n3H/1zE0sOvT5icB/bAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.584;4.blob,1.1,1048.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABp1BMVEUAAAABBAECBQIBAgEfTB81gzUxeDE+mT4XOhcGEAY9lj0OIw4KGAoNHw0FCwUiVSIucy4AAQADBwMyezIgUCAFDAUeSR4gICD///8bGxsTExMiIiIFBQUfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIJFgkcRhwwdjANIA1n/2cRKRE6jzoIFAgIEwgbQxsUMRQ8kzxk92QqZyoraiuCbqlsAAABJUlEQVQ4jWNgwAIYmcCAGZnFwMDCik0tGLCxgwEHMouBgZOLG5cGHl4w4ENmAQG/gCBOO7ACIWER0jQwiIqRqGGQAHEJSVI1SJGmQVpCBlVAVk4emaugiKZBSRlCq6iqQRjqGppa2lBJZh1ddjYcNunpGxgagVnGJqZm5hZABpOllbWNLU632dk7ODo5Q9gurm7uDAwenl58+P3j7ePrB6T8AwKDgkMYGEJZw8Ij8CiPjIqOiY1jiE9ITEpOAYsIpqaxp+vgUJ6RmZWdkwtk5OUXFCKEi4pLcGgoLSuvADMqq1AlqnFoqKnF41rkjEkUQM6YRAGUjDncQB2J6usbiFDU2ASPyuaWVqI0tEFZzKztxDjDtokJyuroFCJGA3cXjNXdAyIByTgrcak5CJkAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492323945;4.copy,1.1,3.650,3.456,3.310,2.38,2.14,1.1,3.640,3.456;4.rect,1.1,3.604,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.704,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.609,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.581,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.550,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.174;4.blob,1.1,704.iVBORw0KGgoAAAANSUhEUgAAAT4AAAANCAMAAAAHf/K1AAAA7VBMVEUMBQX1Y2NKHh4AAACkQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgYWNzdOwcFk9/de6ek7k5MFDAyLODjBTk4HAwPXV1fbWFgQJydj9vZKuLgdSEgoYmJg7u5JtbUtEhL+Z2cfDQ1FqqpY2toCBAQdR0dn//8aQUHQVFR8MjJj9PQ1hIRf6+s5jIxyLi7ZWFgECQksbGxU0dFBoKAYCgr8ZmY3FhZj9fU5jY23SkqVPDxGra0bRERZJCQGAgIRKSlKt7cmX19g7e0JBATyYmJQICAXOjpPxMQ9l5cGDg6cPz+qRUXj6eJWAAAA3UlEQVRYhe2WxwoCMRRFo88y6tjG3rvO2Hvvvf//52gy6iyEEdyEQM4iIY8sLocQLkIGI3D+BYHJTDsDwyCwWIXPSRB0rnK+QWCzO94H0ely0wzDEB6v5PMHnvogGHrPwpGoSDMTO8TiiWQqncH6srk87TTMUSiWAGSl/NQHlSrtNMxRq+O10cT6Wm3KYZijo3Tx1utjfYPhiHIc5hirr2+C9cF09ppqxYVXGF3m6t+3IPqWzhUZasWFVxh91tJG3u4SQPTtD0cy1IoLrzA/OJ2lxuWq6oPbnXIaVnkA/sA+QpGq1jYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.193;4.blob,1.1,2224.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.326;4.blob,1.1,1532.iVBORw0KGgoAAAANSUhEUgAAAEwAAABZCAMAAACjUjIxAAACEFBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEECwth7+8GEBAeSx4yfDICBQI7kTsTMBMDBwdX19dY29s0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVnZypqaisjIyP39/eMjDlHRx0LCwWZmT4XFwkoKBAcHAslJQ8REQcsLBIEBAGWlj09PRl3dzBZWSRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxuYKDWqAAACKElEQVRYhe2XV1MUQRRGG0FZUcwERSQLrqCsAUygIIjkIChJUQmiiBkWJSkgUQkSFAmSRBDBv2jtrFC703eqenu+F6g9T923a87jrTOMbeCyzZXhcNsOlO1wN+BkOz124WRstydQtmfvPqBt/wGg7OAhoMzL2wdo8z0MlB3xO4qT+R8LwMlYYBBQ5mTzExxidw0NO65DFhJsfw+PkHedMJ60H0RGnZKWnY5WDUxnzsq6TOfOq0cxsbKyCxdD1aNLxsuSsohwfnYlTs4VH3WVH15LkJMlXk/ih8k3UqRksTHU9GaqgxqDJQfSjOnUW0ZmlkOubL+cXMbybpGP+QW3HZLdKSzKZqy4hH4tveuQzAmGe0BX2X2c68HDcuuhorJKr+tR9WO2LnuiV1bztPb/6Vnlc72yFy/XT69e63WxN3W6FRvUm2twsgbzW5zsnbkRJ2syN+NkLa3vialB8u/sQxs/s65jQbLyFUyWc3s1/25dx4J0fFTotJy7WruFvyPp6VXoUy6fPvfrs9lSOzCIk7GhL0DZlkWzrFUFLoZWWasLXAiNsuYKXAiNsuYKXAyyrIkCF4Isa6LAxaDKmipwIYiyJgtcCKKsyQIXgy9rusCF4Mpao8CFsJa1zQLXKHAxlLK2WeBaBS6O3QJ3shUYHgHKRoZxrtGxrzjZt3Gc6/vEJE42Nf0DJ5uZxbnm5hdwsp+Lv3CypWWc6/fYCk72ZxXnYmt/dQr+AXBnaG04Cz1XAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.345;4.blob,1.1,3860.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.332,3.362;4.blob,1.1,1492.iVBORw0KGgoAAAANSUhEUgAAAZ8AAAASCAMAAACzZSMUAAACLlBMVEUAAAAWFglGRhx2djB3dzDU1FYMDAX19WNKSh5HRx1/fzQpKRGPjzoUFAggICD///8bGxukpEKoqEQCAgGDgzVDQxsTExMyMhT9/WYbGwv29mMODgYeHgyYmD4QEAcxMRSTkzwHBwMiIiIFBQWQkDq8vEwDAwHm5l1jYyhWViNxcS5NH01JHUkLBAtnZypqaisjIyP39/cEBALp6V5eXiaLizjBwU6MjDk4OBdDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAFLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT6pqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigcCxxuLG4rEisUCBQfDR8KBAoXFwkoKBAPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ9kZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQAbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBLCwk6Kiji3t0qVlTx0dC9TUyJeJl6GNoZEHEQIAwgEBAGWlj09PRkGDg4hIQ1ZWSTs7F8GBgIaGgsXCRcCAQIECwtf7Oxh7+8GEBB9fTLOzlPy8mJQUCABBAECBQIBAgEDBwdX19dY29vW1lZwcC2cnD+qqkWAgDQxeDE+mT4XOhcQEAYKGAoNHw0FCwVVVSJzcy57ezJJSR4YrNzuAAAB60lEQVRYhWNgGAWDBDAOtANGAT7AxIxTioUVhwQbOwd2CU4uyh00CpABNw8vhMHHL4Aux8qCS5egEHZxLk7quGoUQIGwiCiUxccvhiYnLiGJSxuTlDQ2YRlZOWo5bBSAgbyCIpSlxK+MJqeiilObmroGNmFNLSo5a8QAbR1dvPJ6+jCWgSGalJGxCW59pmZYBIXNLUhw2igAAksraxtbMMvOHgwcUOXNcVcYjk7OIErYBQRcUVgMDG7uHpg63DwVMQVHAV7g5e3j6+cPZAQEgkEQimxwiDxOnaFhYCo8AgQiUVhAEBWNqSMmlkqOHlkgLj4wgYEhMQkMklGkUkJScelKS8+A0JkgkIXCAoLsHAwduXncVHPzyAH5BYVFxSU4yrfSkDJc+sorhPEZW1lVjS5UU1tHriNHLKhvaGxqbgGxsJZvrSFtuHS2d+A3ubMLXaS7hywnjmjQ29c/AcLCWr5NnDQZi6YpUxgYprrjjDkImDZ9BqoAr+xM8t05UsGs2fjlWaZhis2ZO28+w4KFBEzOXbQYVcARS4thFJABliwFg2UgdrgIpvzyFSvnMKxaTciYNWtR+etEsasbBSSC9RvAYCOIvWlS1kA7ZxSggc1bwGArmLNt+2ijazADxR2LCSsaBQMH2HZiEwUACgduR6n2lHIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.793,3.440;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAABkAAAAPCAMAAAAmuJTXAAAAb1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0PgS/BWAAAAYElEQVQYlWNgwA4YmXBIMDAxIvOYmeFMFlY2JAl2Dk4uGJubB1kLLx8/O5QpICiEwxZhEXYcMqJiOCTEJSRxyEhJy6C6Fc6SlUN1K5wlz6qA6lY4S1EJhy0Myiq4ZAgBADGoA2YkCPKaAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.731,3.497;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAAHUAAAAPCAMAAADtY3ApAAAA9lBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1dFRaoPBgbzYmJuLCxUIiIBAABR8QRcAAAAv0lEQVQ4jWNgoCtgZGKmr4UQwMKKKcbGRmsWOwcniOLi5oFbysvHL0BjlqCQMIgS4WASFYPaKi4hyUtrlpQ0mJKRlZNXUGSgF1BSVoGyVNXUNehmraYWmGLU1tFl1aObrfoGQELJ0MjYxJRudjIwmJlbMDBYWulzwkWonV+wAjVrBgYbWwSf2vmFwc7eAYPF4OjkjOIKaucSBhdXNwwWg7uHJ9YwoBrw8sZkASPVh6aW+vr5Y7BoD9wCAjFYYAAAUiQcWW+mcgkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.512,3.513;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAXgAAAASCAMAAABmWzUcAAABtlBMVEUAAAABAQECAgIqKio+Pj4aGho0NDQREREvLy8NDQ0FBQUKCgpHHUd/NH8sLCwGBgYgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0MICAgxMTEXFxecPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4DAwMiIlQAAAGo3BZZAAAB6UlEQVRYhc2YZ08bQRCG1/aBOTqhGAjdKRRTQ0IJvaZRQu8QSgqQAGkQem+h5R8jnXP4vB6jm9Pe7j1f9tFoNHr1flxCxGOz223AzPQ9UUD5hOCQpBB6FipJTrP3RAHlE4IjTA6nZxFOoFDGe6Lw5YuMEhskGhjGAIUy2YuNe0D8LT4h8f9Er0FXtCS5kqlJSupDIF9UJJCUH7yLTyOUpWeoW3oNuqIhyZVJj7KyA/PluB8BSfnBt/jHcU8IZU9z8wjOoCsa8l0Fqno83rewyBOQr7gECMoRvsWXlqmjO3tW/hxp0BUNLypUq6yqfqlITW0dna++oREIyhG+xUM0NWNNLy2tbZVea39F53v95i32HFvEF/+uoxNpeLq631P5enoNH2OD+OJJXz/W8AwM+ucbGh4xfowJFih+dAxreMYn/PNNTn0wfowJFih+emYWaXjmPn7yy/f5i+FTjLBA8WR+AWt4Fr9q831zLxk/xQYrFL+88h1pOvnh+qnqr6rfmnyra7hDJnBfUTa7go3VXjD+rG8gTSeb3Vuqbu/sEl++vX3cIRNwRAPfuAfeog4lhSNWe0E5PsGaPk7PfH7+lwTLJ4T7vnEjZIVwVnu8ubi8CphZ5lv4QAa+cWX52uw9Hmzd/AuYKfluATDMZ5UtPBziAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.535;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAMAAAAaPFxiAAACXlBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1ezMsgAAAB4ElEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cJEk5ABUfaWdZyF4jAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.571;4.blob,1.1,3032.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.609;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAAjVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYiVSIucy4AAQAyezIgUCAFDAUeSR7HTWtrAAAAb0lEQVQokdXMyRqCMAyF0VrUAg6UUhziCAoIDu//eCz1d6VL7ionyXeV+j0jHXx5DE/0FDbhH+VDSkTGM3C+WH4ysSnOLvNwvmLbegNuxcE72cMHOcInOcNFeWH/taJrSzel4eLWdrC/P/jwfL3nHokeBOysK/G+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAUElEQVQImRXMRwKAMAwDQWM6gYTeCaH//4fIlzmtROQxM/lBCDmKxSTNIKtcLDRBo0vIVS02rdgpsR/gOM1w0Svc7A7dge15GabbPvh8P7Q/jP4DuQRHJToAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492324056;4.rect,1.1,3.614,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.664,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.591,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.560,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.326;4.blob,1.1,1984.iVBORw0KGgoAAAANSUhEUgAAAFYAAABZCAMAAACT3iMQAAADAFBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECwth7+8GEBAECQli8vIgUFADBwdX19dY29s/nJxFqqodRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgseSx4yfDI0gDQbQxsWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgQBBAECBQJMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR48kzwSLBIRKhEDCAM4ijgYOxgLGwsIEwgzfTMeSh4cRBw1gjUGDgY9lz0NIQ0sbiwkWSQWNRY5jjk7kTsTMBMmXiYpZilHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxvIYelIAAACiUlEQVRYhWNgwAsYmZjxKyATsLDSxFg2dg5aGMvJxU0LYxl4eGliLB+/AE3MFRSiibHCIjQxVlRMnCbmSkiSqIGDqDQpJS1Dkqmy0nLyRChTUFQiyVhlFVVZYtSpqZNk7CgYBcQADU2aGKupQQtTtbR1aGGsrh4tTNU3MKSFsUbGJrQw1tSMFqaaW1jSwlgraxtaGGtrh0WQuMoED7DXdsAUJLIywQMcnbAIEluZ4AbOLpTpHwUDDFxpYqqbOy1M9fD0gjC8fXypZ6qffwADzNhA6hkbFBwCZYX6hBGvLTwiEq98VDSMFRMLoePiEwgbm5iUnJIKZqWlg0EGqnxmFrqO7JzcvHyC5hYUFhWXlAIZZeVgUIEiW1kVhKGjuqa2rr6BsIsbm8qbGRhaWsGgDUWqvaoDm47Oru4eAob29vVPmDgJRyBMrpqCqWPqtOkzZs7Ca+jsOXPnzV8AYmENhIVVi9B1LF6ydNnyFQTcunLV6jUQFtZAWLtuPbqODRs3bSZgKAPDlq345bdtRxfZsZOgodjBrt1goA9i7/En0xBMsHcfGOwHsQ+sO0gtYw8dBoMjYM7RY8epZS4yCDlxkhbGMpw6TRNjRygwOXMWuwSFvR8zU+ziFPZ+zlmcxyZMae9H/8JFbMIU937sbLFZRnHv55L2ZUxBKvR+rlzFFKNC7+fadQwhavR+bty8hS5Eld7P7TvoIlh7P6SCu/d2oQpg7f2QDHbff8CAUv1g7f2QDh4+YkCpfqjZ+0GpfkbBSAePn9DE2CePaWHq02fPaWHsi5e0MPXV6ze0MPbtu/e0MPbDR1qY+unzF1oY+/Xbd1oY++MnLUz99ew3LYz985cWpjL8+0+WNgAgosDbatfTcQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.345;4.blob,1.1,3848.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.492,3.516;4.blob,1.1,828.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABKVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUb6Id3AAAA/klEQVQ4je3P2VLCMBQG4EMBlUVFRVYtAoILiuygIjsIKCC44obw/g8BbXKTtqkzZ7jkv8k5f+bLTACYGATARTDgnNFkxsG1dZzbsFhx0GbfxMGtbZxz7Ozi4J5zHwddbpzzmLw46PPjHBwcIuEqy40Y4FwcBUO6IiDyngwfa/dERKInPHh6dq5VUxG74Dm4jF9p1UQkkikuhHRGo6Qim8tLR+Fayg0zAdwW79SQilJZ3ipVKTVmWqTeUEMimq17eWu2pXSYaZHug8pR8dgr8L8I0B88KSsqhiM9B/D8omyIeC2+6cP3jzFbUPH5pe/g++eXLaiY/P0DYTpjdyLmj4Ej2/Bx1LYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,1384.iVBORw0KGgoAAAANSUhEUgAAAMUAAAASCAMAAADc3epVAAACIlBMVEUAAAAJFgkGBg4DAwccRhwwdjAUFDIyMnwEBAkRKRE6jzoIFAgnJ2ErK2kBAgE1gzUbQxsFBQ08PJMSEiwUMRQ8kzwDBwMmJl4uLnEqZyoraitKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PpkeSh5Ktko5jDkdRx0EAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQCBQIDCAMCBAIlWyVV0lVn/2dRyFEFCwU+mT4JBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0xCpEIiVCIECQQsbCxa31pk+GRCo0IXORcJFwkQKBCnQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkNIQ0VNBUHEQdDp0Nl+2U0gTQIEwgLHAsPJQ9QICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM38gUCBY2lhh8WE8lTwTLhMSLBICAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCUBBAE9lj0ZPRlDGxu7TEzzYmKtra1EREQBAQI9PZUaGkFMu0xi82IwdzAkWSQtEhIpKSm3t7dfX1/t7e0LCxoMDB0SLRIfTB86OjrExMSXl5cODg4bG0M4OIoAAAEGEAYOIw4yMnoeHksiVSIucy4AAQATEzA4OIkyezIKChkRESkFDAUeSR4QECgSEi0Tsd5yAAABp0lEQVRIiWNgAAJGhsEGmJhJ1sLCSgN3UAbY2DlI1MHJxU0Tl1AEeHhJU8/HL0Abh1AEBIWESVIvIipGI5dQBMQlSFIuKUUjd5ACpGVApKycvIKiEkREWYWJSL2qakBCXYM2DiMeaGpp6+gCaT19A0MjYxOIoKmKGS715hZgwAdiW1pZ29gyMNjZi9DFqTiBg6OTs4sriOXm7sHA4OnlDRH38cWlw88GDPwZGAICg4JDQoFCYfbhdHEsThARGRUNYcXEgsi4eAgvIRGXjqRkMEhhYEhNS88AC2XaZ9HYmQRAdk5uXj6IUeBVCKKKiiHiJeK4dCBSVGlZeUUlSCjFvor2LsULqmtqderqgYwGSFw0QoSbmnFpQKQoBj7/FpvWNgaG9o5OejgVP+jq7gGSvZB80QcW6p8wEZdqRIoCAYFJk4HklKl0cCZBMA2Ip8vP8Jw5ywAiMFtlDrF65wLxPH7auIsMMH+BfNzCRRD24iVLSdG6rGM5LVxEKVixkjT1q1avoY1DKAFr15mSpkFsfSltXEIB2LBkI6laNm2mhUMoAlu2kqQcAO2/UykITYy8AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.571;4.blob,1.1,1056.iVBORw0KGgoAAAANSUhEUgAAAfoAAAASCAMAAACEq+wgAAABKVBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDAVj9WMeSh4wdzBW1FYFDQU8kzwSLBJCpEJEqEQmXiYucS4cRhxj9mNm/WYLGwsSKxI+mT4BAwFd5l0oYyg6kDpMvEwDCAMVNBU4izhOwU4CBAJe6V4fTB8SLRJn/mcNHw0eSx5j9GMECwQ0gTQkWSRU0FREqURCo0IzfzMuci5Y2VgGDwZk92QcRRw2hTYhUiEKGApm/GYWNxYoZChc5FwBAgE9lT0aQRpKt0o8lTxOwk44ijgLGgsMHQxf7F8CBgINIQ0bQxsAAQABBAECBQJi8mIgUCAyfTJTzlMyejIxeDEXOhc/nD9FqkVRyFFn/2cnYCdW1lYtcC0TMBM4iTgFCwUQKBAIEwgKGQoRKREY6NWGAAABqElEQVRogeWYV0/DMBSFjduyWlaZKSMtowMoe5VRVoCy9x4F/v+PwImKZAnbecn1dconNbJ0faJzzq36UEIa6D8ALmV4+yORaAzbgwbgUoa3P0Ibm7A96AAuJXZ/zS2tflfiCZGC0Lb2DiBTJgGXEr2/zi6/G4m4SEEoTXbDWDILuJTY/fX0EvWFSF+/SME+A5aPtC6AS4ndX2pwSH1heESoYK5tKw3lyiDgUqL3lxlVjsfGk0KF+4XNTIA4Mgy4lNj9ZXN51bgwOSVUuKufLoK5Mgi4lOj9zURV09k5scJd/fyfH4R6BC4len8Li4rh0vKKWOGufnUNypNJwKVE76+0viEfbm6VxQq2+vL2DpwrY4BLaUB/u3vy2b4jUbDVH1iHQI5MAi6lAf0Vjyqy0XFO+I8TU7DVnzincKaMoZby7NyjzJ+CeTMmsYtL9qzYHin+RK+uZQq2+puCVptI1FLeWh53/CmYN6Ny/8Aej08ez/yJvrzKFIS+vds6TSLxm7KU9/jgT8G8GZ9q2uOTPykgX863HmOowKUMb3+kmsW2oAO4lOHt7wcbR3+Yoj1jZgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.590;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAArcAAAASCAMAAAB2DQYxAAACNFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAggICD///8bGxsMDAX19WNKSh4xMTEYGBgBAgE1gzUbQxsTExOkpEKoqEQUMRQ8kzwDBwMiIiIFBQVGRhz29mMODgYqZyoraisfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsDAwHm5l1jYyg5jDkdRx0bG0M8PJQ8PJMkJFkJCRYWNxYzfjM+mT4xeDEbQ0M8lJQ8k5MkWVkJFhaLizjBwU4BAQECAgIFCwUEBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUtLRL+/mcfHw0oKCg+Pj4UFBQJFwkQKBALCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKyvQ0FR8fDIICAgNDQ0EBAQLHAsPJQ8DAwcYGDwxMXg9PZcpKWUHBxATMBM7kTskWSQDBwcYPDwxeHg9l5cpZWUHEBByci7Z2VgHEQcLCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhIYGAr8/GY3NxYBBAE9lj0ZPRkmJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAi3t0qVlTwJCRcBAQILGwsJFxcBAgJZWSTs7F8GBgIfTB8JCQTy8mJQUCAGEAYOIw4XOhecnD+qqkUXFxciVSIucy4KGAoNHw0KCgoyezIgUCAFDAUeSR6Map21AAACeUlEQVRoge2a+VcNYRjHx5JukXvRgiSiELJkUiI3SpZCUZI1hZKEdiFUJFlabGVpE9krifrndN53ziHzztR773Pu+8y58/nlzpx55nu+53OeH95z75WkMaZIJs5g+nM1xPjUaaJrGBvTn6shxqd7zBDdQzSeFi/HX0boz3vmLNEV2PjMhkghxq22ORBZhsbTMtfhd1H6m+crugEbkL2lxv38AwCyjM18ywKH30Xpb2HgItEVmIDsLTUetBggCjnBS5b+exuy7L/ny0PpZ9iKldzZKP2tCl8tugITkL2lxtesBYhCTsS69Rs2KtfWyE1ylMbc5uiYLbGc2Tj9bd0mugET1d7GbSdwhRDjdtkPrBVe4nfsTEjcNXaRtHvP3n3JmnMp+w8cTE3jSUbq79DhdNEVWKj2NuMIIZMjgxo/KmcB9kLMseMnTkrSqdPZdv25Mzm5Zzlisfo7d150Axaqvc3LJ1zgyKDGC+SLgL3QUnip6PKVq5JUbCspLdCZKyuvqLxWxRGM1d/1G6IbsIA4J1DjN+UQuFpYqb51+05NLbmsu3tPro/UmLvf8KDx4SOuaKz+Hj9pEl2BAcQ5gRpvbmkF7IWUp8+ev/h7l/WyTWOu/dXrN5zRaP297RDdgAHEOUExXl8KVwsrnV3j77s15nre8Wdj9df7/oPoCmpAvgejxvtsAFEGpDmJYHU2B6u/j58+i66gRmdvlZNu3MQh1PiXlq9gtYxElEz45mwOWn/f+0U3UKOztz70pDswcYhifPBHHVgvAzH0k2B3OshN/TmEzt4O05PuZH5wp8YDfv0G6+WOmP4mD8z/wRTjI6MQYe6L6c/VjIz+AYDkg1OcY/BHAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.609;4.blob,1.1,792.iVBORw0KGgoAAAANSUhEUgAAAF8AAAA4CAMAAACsY9QlAAAA4VBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsNIA1n/2cLGwsFDQU8kzwSLBIIEwgmXiYucS4OIg4CBQISKxI+mT4OIw5k92QDCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYiVSIucy4yezIgUCAFDAUeSR4N+4BaAAABK0lEQVRYhe3XyU4CQQBF0QZUBkEEClCccABHcARnBQFF//+DTKClk1ep1pjrxvRd1aJzatn1PG9WLO6hqZeYm0d9y1tIfp1S6QxwQeBNW8zmZv4S4AeeX37ZPxTSRcAPPL+SiU0P5QrBB55f1awgrtNbraG+5a2ts756G3nWV29zi/XFq2/voLx6u2YP9dVrNPdRX72DQ5RX7+i4ivLinTRbKK9e+xTlcc/d2d965xcsL17r8grlxat3GiivXjfLvkvUu75Becu7vWN98e5NF+XVezBt1Ffv0TyhvnrPJuf48nep1+u/oL7lDeA3iXq1DuurN+yXUd/yRq/sX129+NsY9S3v/QP1ce+H/aP9yOTej0zu/Qjl3I9Q0X78pmg/hhbtx/Ci/RjWxPsEMlAjXnnboAoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492324156;4.copy,1.1,3.650,3.437,3.310,2.57,2.14,1.1,3.640,3.437;4.rect,1.1,3.624,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.601,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.570,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.316;4.blob,1.1,1836.iVBORw0KGgoAAAANSUhEUgAAAEwAAABjCAMAAAAGsxb6AAACo1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxu1VuU3AAACd0lEQVRYhWNgoBZgZKSaUQxMzCysVDOMjZ2DiWqGjYJRMApGwaAHo8XxKBiZgJMLhcvNw0uBYVycqHw+fvLNEhAUQhUQFhEl2zAxcTQBCUkpcs2SkJZBF5KVI9cweQVudCFFQSUyDePnwxRTViHPLFURNUxBdQ3yDNPU0sYU1NHVI8swOVlsovoG5JhlKGiETdjYxJQMw8zMsQpbWFqRYZi1DXZxWzsyDBsFlAJ7Kprl4Eg9s5ycXSAMVzd3Ss3y8PRigBnmTalhPr5+UJa/WwAhxYFBwXjlQ0JhrLBwCB0RGYVLcXRMbFw8mJWQCAZJqPLJKeg6UtPSMzJxmJaVnZOblw9kFBSCQRGKbHGJD4aO0rLyisoqXK6rrimsZWCoqweDBhSpxpImbDqaW1rbsBrV3tHZ1d2Dw5u9JX2YOvonTJw0eQoWo6ZOmz5j5iwQC6s3Z5fMQdcxd978BQsXYXXX4iVLl0FYWL25fMVKdB2rVq9Zi9UoBoZ163FIQMGGjegimzbj14EGTC3AQALE3uJJklZMsHUbGGwHsXes2EmZYbt2g8EeMGfvvv0Uug0J+B04SD3DGA4dpqJhwxbgbFmjtcCJA7ha1ugtcKIAjpY1RgucKICjZY3RAicOYG1ZY2mBEwWwtqyxtMCJA9ha1tha4EQBLC1rrC1wogCWljXWFjhxALNljb0FThTAaFnjaIETBSAta6QCHEcLnDgAblkjFeC4WuDEA5QCfBQMB3DkKBUNO3qEemYdO36CeoadPEU9s06fOUs9w86dv0A9wy5eop5Zl69cpZ5h167foJ5hN29Rz6zbx+9Qz7C796hnFsP9ByQoBgACcJktRakleAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.345;4.blob,1.1,3728.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.497;4.blob,1.1,1388.iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAiCAMAAACZU5BHAAAByFBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1dFRaoPBgbzYmJuLCxUIiIBAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUsLCwgDQ0bCwsMBQX1Y2NKHh4NDSATCAikQkKoREQICBMiDg4FAgJGHBz2Y2MODiICAgUjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAthYe8GBhCLODjBTk4DAwdXV9dYWNstEhIfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgI5OYwDAwgJBATyYmJQICA6OpCcPz+qRUVFRaxXV9gxMTEXFxcsLG4KCgoICAgiIlQAAAGl5M1CAAACBElEQVRYhd2X51MTQRiHl2hCohJAiihVSiICAkEpQgiGotKEkEioKk2adKQjCEhTEQv8u8LlLjl23yy7M3c5hufTM7sz7/0+3O3+DqGQEqa7QTHtuamn2SUYDGpbuNGEghvJrdt3/B5hjoxS2aLvxogPg4wk1qiLixf9XsL9CLXtQaL0ZMhIkpJTUtMeBt9XmPSMTIqBZFmsj9QNJSP7Mc1IwnJy8/RP1M0kI7+AZjjphbaip8/UziSjuKSUYjhlz/MDn7XSxwmIpZxmGBX2gCt9nKBKRxVh6IWzmmIUlD5EUE1tHWHo5avXFAsl9Q2knb1PjTQLHU3Nbwi7QtS1tBJ23XC1tbm0zkDB7fG81ToDBXe7t0PrDBTcneRal6Mbs57ed+IKq0FT5Ly34hc9WOvheB9w6+uXNlkNmnIh3gC+BNV6KN6gYwi3j8PSVcpq0BQZI9ZRSU3itQ/Veije2DhhnyYmOQ2aImNqWrIZ5+ycIFCth+JBzH/mNVYWFpdmfAbUetZ4y7UrnMYPUOtZ46HVNV7jh6z1zPHWv/AaP2StZ463sfmV0/ghaz1zPLS1zWv8ELWePd6O+RunMbJr3ZOUqPXs8fYPDjmNke8Z/j8eX60/a1HnuIR4zIXqx09eY+PoV8CFWn/sEfiNrkKhSrL9wVb+egXOm9Q/r9aFyn5yGmTnP5aFqBWOgjI5AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,700.iVBORw0KGgoAAAANSUhEUgAAABkAAABeCAMAAADhak+FAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAA9ElEQVRIie2Ty1LCQBBFW0AeSXgIQ0QFE9AIRh6CAQXFAOL//xI1SNLTkq5ix2bOYjJVZ5FUTl0AwgUwpNKMyFxmD7dcnoiCYUKysYolxpQrwJirKmNqwmJMXdiMuRYNxtyIW8bcNVvct907nHENzrSbHcbAw6PHmNJTlzHQe4ZT+d/Yj2ocNX7pD/ZPbBwzHMlTaRzzWpS/UGmMjCdAGiNvwieNkUBMSWOFmUsaK7w7pLHCx5g0VpgvSGOk8PlFGiNL8U0aI2bokcbIai1PbByz+QnkAxtHbMPM3+Wosf2b8GoWvW29bURvW6K3rbedYM6z7R2lKiVcSUzeOAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.584;4.blob,1.1,1296.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAfCAMAAABphJu0AAAB6VBMVEUAAAAbQxs4ijgAAQABBAECBQIBAgEyejIeSx4xeDE+mT4XOhcTMBM4iTgDCAMKGAoNHw0FCwUKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAggICD///8bGxs1gzUTExMUMRQ8kzwDBwMiIiIFBQUqZyoraisfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECws5jDkdRx0bG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUJFwkLCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysLHAsPJQ8DAwcYGDwxMXg9PZcpKWUHBxA7kTskWSQDBwcYPDwxeHg9l5cpZWUHEBAHEQcLCxsmJl07O5I7O5EiIlUHBxIUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lj0ZPRkmJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIfTB8GEAYOIw4iVSIucy4yezIgUCAFDAUeSR4GDgYyfDIECQQnYScraSsNIA1n/2cFDQUIEwgmXiYucS4SKxJk92TXl/ZrAAABnElEQVRIic2UVVsCQRSGjyKoays2ImBjN3Z3d3d3ICZ2dzfmLxXXFZYdZoEHL3xv9p3vzH7PXOwOAB0LSw5gsOKS8OimH2sb3ARsCRI7uunF3sERW+LkTOJCN324WrphO4yG725+h7l46DFT8fRCzVTcvH0QY8VX4MeMeEILxAyV+DMjkViCGDsBgkBmFBTMtJDQMPoGaTjjjYjIn2dUdMxvFBvHtPiExKRkKuPJUghbzIlS09IzMklzIURUprWs7JzcvHy1cAsKi4pLMB0ApWXlFZVVaqkm+FSkNTU1tXX1AA2NTZh/5JfmltY2gHaig1prDTq7unt6+9S/pLB/oJ2lYnBoeGR0DGCckFKJxiYmp6ZnZknlyOcIhQxTMb+wuLS88m1WylUq09ja+samdit/axtTsrO7t0+pYgAYdnCou/kIU3J8otFTIWooBi7FM+U5YigGLkW4uOQghsB+KQJIrq4RM52bW9T+CXfGXQnsyO8f/qDl8Ylt+qzCfX46vIilLNNn1atRR3l7ZxmWqLhGlXwQd/jh+afu+guxBkoGVSMkTwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492324257;4.copy,1.1,1.0,3.285,3.960,2.57,2.14,1.1,1.0,3.266;4.copy,1.1,3.650,3.437,3.310,2.57,2.14,1.1,3.640,3.437;4.rect,1.1,3.634,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.392,2.15,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.611,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.580,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFDAxj9fUeSkoAAABCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqoV9wriAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.373;4.blob,1.1,1620.iVBORw0KGgoAAAANSUhEUgAAADgAAAA9CAMAAADPlVqfAAACcFBMVEUAAAC3t0qVlTx0dC9TUyIGDg5ZWSTs7F8GBgIUFAiYmD4aGgsECwtf7Oxh7+8GEBAJCQTy8mJQUCBLSx58fDIDBwdX19dY29ucnD+qqkWAgDRDQxtHRx1/fzQeHgwQEAdWViNxcS4sLBJtbSwCAgGMjDk4OBc3NxZ+fjOZmT54eDEtLRKSkjsHBwMFBQJBQRqGhjZiYigiIg5lZSlkZCmXlz1NTR8LCwWUlDwpKREwMBODgzWRkTscHAs8PBiJiTcBAQAyMhR6ejF3dzAoKBBwcC1UIiKZPj4FAgIbGwtWIyOYPj4CAQFnKiqCNTUJBASSOztCGxsyFBQBAAAODgYgICD///8bGxthYSdpaSsTExMNDQWTkzwiIiIFBQVeXiYsEhJtLCwjIyP39/crKxIsEixtLG03FhZ+MzN4MTEICAM0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXhBGhqGNjaVPDxiKCgiDg6LizhMTB9iKGIyFDJBGkGGNoaVPJUiDiJkKSmXPT1NHx8LBQWBgTQUCBQfDR8KBApkKWSXPZdNH00LBQswExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxx6MTF3MDCFhTZSUiF6MXp3MHcoEBBwLS2VlT0oEChwLXCSO5IbCwsdHQwbCxuKijh6ejKJiTgZGQoFDAVj9WMeSh6VPT1CpEJEqEQvExOJNzcOBgYcRhxj9mMGDgYBAwFd5l0oYyg4izhOwU4SLRJn/mcNHw1U0FQyfDIuci5Y2VgKGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECQRi8mIgUCA/nD9FqkV91/OWAAACCUlEQVRIiWNgQAGMTAxogJkFXQQIWFnRRdjYOVAFOLm4MfXx8PLxowkJCAqhCgiLYLFQVEycB11MQhKVLyWNReMooBeQkSVTo6wMefrkuOTJ06igiEVQSZmgPhVVNQwhdQ1NLYIatXV0UQX09A2YDI0I6mMwNkQTMDE1MyesjUHAwhJNxMrahs2WsEY7ewd0IQdHJ01ndUIasRYTDC6uOgT0IRUTbu4eSBKeBDQiFRNe3j6EnIcEkIoJXz8S9CEB/4BA8jT6BAWTp5H+IESXsBqswFFEgCT1oWHhUFZEJIkao6Cs6BglUjTGhsXBmPHYigJMkJAIppKS4SIpmiFY1KWmIfN80jPcM9GVZGlmg6icXDDIA7HzCwqLihEqPEpKy8orMA2vrAKR1UVgUMPAkFtbV1/dgKSgsam5BZvrW9lAZFs7GHQwMHR2dfegKOjt658wEYvGSfGoTp08Zeq06SgqgoNmuM9Mx9A4azaqUxnyauYUzS1AVTRvfgC6PpUF+qhOBYGFixajq1uCLsCtuRSL+xmWYRNEAdLLHQiqwQpWCJOnz2plFln6Vi1HL9KJBC7a5Okb9GD1mrVwdsK6IBJ0rt+AYG/ctJl4jVu2biPBGiSwfcdO8jQy7NpNpsY9e/eRqXP/ATI1HjxEpsbDR46SqfPYcTI1njh5ijyNp8+cJdPKc+eJVAgACl10w8/hEEgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.492,3.497;4.blob,1.1,1796.iVBORw0KGgoAAAANSUhEUgAAAXgAAAAiCAMAAABiITKxAAACK1BMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgYBAQECAgKQOjr+Z2cEAgIEBAliYvIgIFAxMTE+Pj4XFxesRUXYV1dFRaoKCgoNDQ0FBQUPBgbzYmJuLCxUIiIBAAAqKioaGho0NDQREREvLy9HHUd/NH8sLCwGBgYgDQ0bCwsMBQX1Y2NKHh4NDSATCAikQkKoREQICBMeDB6YPpgQBxAiDg4FAgJGHBz2Y2MODiICAgVWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAthYe8GBhACAQKMOYw4FziLODjBTk4DAwdXV9dYWNstEi2SO5IHAwctEhIfDQ1lKWViKGLQVFR8MjIJBAmUPJQpESlyLi7ZWFg8GDyJN4kBAAEYCgr8ZmY3FhZ0L3RTIlO3SkqVPDwUCBQaCxpZJCQGAgI5OYwDAwhLHkt8MnwJBATyYmJQICA6OpCANIBDG0MICAicPz+qRUVFRaxXV9gsLG4DAwMiIlQAAAHW807qAAAC0UlEQVRoge2ZZ1fUQBSGAwqCCvaODZTYUewFV3EVLLFgX0XAig17L2DvvffeG3Z/nntSh+TunNxkZrKafT49Z7jnzsv9ADlzJSkFG9LSm1EsBT+aZ9AstGRm8rYWWdlSYgsTLVu1Nj0nt01bztaufQf9MsjCRMes9E6dde/StVsOb+vew7gZsjCR17NX7z59hV2XX9CPYiGjf6E8QNhlAwfRLEykDR4yNGOYsOuKhtMsPOSPKB45arTAC8eMHUex8DB+QpH1Mcf6IxKkcCLNQsOkEstZf0RKkyNTHCZNLZ1GsX+K6HSVqN861p+O0oyycodJM2fNTmBuf4+kYY6iMpdVHTPmzXda/K/bggQmPJ9fKhaqLGJVx4rFS5Y6jIbofP8t5cuWOyxFCu9EgX9E8TOmdUEB5UsaYoqywn62UlEqWdYFBZQvaYitcv4jqqgEBuqjLiisfFXVgQaBiNUAh6uBgaLr1kTW2mzd+g36iVuDupDUyvYHoiZLQDNfdRWQPlh4Dn6j3TZtNn7o1qAuBLXyFvsRuQQ08m2t2wakDxZ+g98e2WG3nbuMJxi3BnUh2C3vMTRbfy4il4BGvr37gPABw2/w+w847OChw0iDuhAcOWpYfWnDMVXIJaCe7/iJk0D4gOE3eIhTp7HmljNnz9VrRiwB9XznL1zEtuOP2MFfKruMNDzEElDPd+Wq52b8EDt46dp1rOGxloBavhs3b3lvxg3Bg799B2t4rCWglu/uvfvem3FD8OAfPHyENDzWElDL9/iJ51YcETx46ekzrOExl4Bqvud1L7y34ofowb/MfYU0l7yW3xhqLgHVfG/f4RoJgjZQco3mq47g/YePSHPJpwJz82uuA9V8n7/gGgkiVgM89zZqAyXXaH7qmvD1G9bc8f2H5fo60MiXlNCee8k1mp86EeQV/3ScJfWzcCOwn4wP8hfLOhGU/P7jOFPz/QUqzUQmYo3NDgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.535;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAMAAAAaPFxiAAACXlBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1ezMsgAAAB4ElEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cJEk5ABUfaWdZyF4jAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.573;4.blob,1.1,2096.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;3.end,1.1;4.sync,10.6492324361;4.copy,1.1,1.0,3.266,3.960,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,1.0,3.285,3.750,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,1.0,3.304,3.310,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.320,3.304,2.60,2.19,2.14,1.1,3.320,3.342;4.copy,1.1,3.390,3.304,3.350,2.19,2.14,1.1,3.390,3.342;4.copy,1.1,3.770,3.304,3.190,2.19,2.14,1.1,3.770,3.342;4.copy,1.1,1.0,3.323,3.300,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.360,3.323,3.360,2.38,2.14,1.1,3.360,3.361;4.copy,1.1,3.780,3.323,3.180,2.38,2.14,1.1,3.780,3.361;4.copy,1.1,1.0,3.342,3.290,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,3.720,3.342,2.10,2.19,2.14,1.1,3.720,3.380;4.copy,1.1,3.770,3.342,2.10,2.19,2.14,1.1,3.770,3.380;4.rect,1.1,3.644,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.694,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,2.67,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.621,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.590,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.272;4.blob,1.1,2536.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.345;4.blob,1.1,3688.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,1828.iVBORw0KGgoAAAANSUhEUgAAAGsAAABxCAMAAADlLK3DAAACBFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzACBQIGEAYOIw4xeDEXOhciVSIucy4KGAoNHw0yezIgUCAFDAUeSR4gICD///8bGxsTExMiIiIFBQUfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxA7kTsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIxejELGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwhk92QnJsqNAAADEklEQVRoge2a51dTQRDFH6AioAsiakQBG7EGS0RBIqjYiL1X7F2x9wYK9t57b0T/STnBc9i3M4u+nL2DH5gv2TdvmfuJc29+E88TqLR0CZX2yujRU06sV6acVu+sbDmxnD5yWn1VmphWrsoT0/L65ctp9S+Q0xqQI6c1cJCYVGhwoZjWEDVUTKuouERMa9hwMakRI3OlpEYVl0pJeeHRYlK+GiMnNXacmFTp+AlSUqFIkZSUV5Yll6gmThKT8iZPEZOKqjIxrakqLKZVrqaJaU1XcpG0onKGmJZXJZim8iMup1XEkhXSTx01s7LaoVaNStYs/aTV7DkOc0ft3GRF9ZNW6fPmu9P6Wy1YKKfVRdWdBv6h6uKLrO9cp4G6+GLrO9dpYEl8qfVd0DSwbPkK/TF7pfF+1er2zzVr15G/DZoG1m/YuGnzn3Oofouqsdzbum37jp3+VvA0sGv3nr379rcdYoUHDh5qsN47fOToseMn9E5KaeDkqdNnPO/sufPRzu9duHjpsvaYQhpobLpytbml7ftV5FpBeSf3rt+4eev2Ha0ROA3cvXf/wcNHyWNJxmNVVW+59+Tps+cvXvpagdPAq9dv3nY8hd+9t9z78PHTZ7MXNA18+ep//ma59/0H7blIA5zzc+UiDbDOz5WDNMA6P1fdaSD1Mp0fyO6J8+PYPeP8bth9a8L87+ac3w27b038NDqs8zth9w2JmNFhnd8Ju6/+ZXZY58ewe4vzQ9i9xfkh7N7i/BB2b3F+CLvnnR/E7lnnB7F71vlB7J51fhS7Z5wfxu6p8wPZPXH+rmL3uMJwADZTgDgAlylgWwGaKXBbAZopgFsBkimAWwGSKYBbATNTQLcCRqaAbgWMTAHdChiZAroVMDIFcitAMgVwK0AyhdutgK9IpnC7FfAVzRROtwJ6MZkCxQHYTAHiAP/L7wHccQCSKXAcgEyGcQA6GccB6GQcB6CTcRyATsZxADIZxwHoZBwHoJNxHIBOxnEAOhnHAZjJOA5AJ+M4AJ2M4wDMZBwHoJNxHIDJFDgO4J/8G51dfxPJixCgAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492324463;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.380,3.342,3.360,2.19,2.14,1.1,3.380,3.323;4.copy,1.1,3.770,3.342,3.190,2.19,2.14,1.1,3.770,3.323;4.copy,1.1,1.0,3.361,3.300,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.360,3.361,3.360,2.38,2.14,1.1,3.360,3.342;4.copy,1.1,3.780,3.361,3.180,2.19,2.14,1.1,3.780,3.342;4.copy,1.1,1.0,3.380,3.290,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.720,3.380,2.10,2.19,2.14,1.1,3.720,3.361;4.copy,1.1,3.790,3.380,3.170,2.19,2.14,1.1,3.790,3.361;4.copy,1.1,3.650,3.456,3.310,2.38,2.14,1.1,3.640,3.456;4.rect,1.1,3.654,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.704,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.364,1.8,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.631,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.600,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.731,3.253;4.blob,1.1,3012.iVBORw0KGgoAAAANSUhEUgAAAEMAAADKCAIAAABxF2o0AAAABmJLR0QA/wD/AP+gvaeTAAAIhklEQVR4nO2dT0wbVx7HZ8bjvxiM8TADcWzoYsq/UkIA20nYSm26IXHU3fTQKETdkIVoc8tK1Uo9VCu6l7YneshKLVUve+hh056ybaGKemjWWv6ILYhVCTSi2iT8839DPPjfjGcProjXhsl45s3YZN9HPtgz773f74vfvPd+7zceEKRcIV2uX3/33bV4/IrPd+rmTbXRWGqPRFHd0jKyu+uZnLSdPds6PHw1HD731VeldkoUv7p169KPP2I4nv1oGxi4znFHXn6ZpwqmiGNFY/d4Vm/dyjBM9uOjb75JBIMN58/zVClHJbhej1dUxLe2cg/SGxs6guCpVY5KmHic2d3V19XlHqw4ciQRCvHUKkclCII8mpxsungx9zrREcTDiYnSeiUGc1vbtXjcMzFhGxh4fmjoaijkmZwstVNioU6e/I3Xey0eHwoEfvnRR5qqqlJ7BIFAIBAIBAKBQCBg0VRVPQuxDl5RMRQM/i4S0VRXl9qXA8GFFOIYJhEIoDieSafldggCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoE8a6iNxhGatns8yphTydd0JpUyt7cT3d0/ffGFfFYU4uiZMyO7u8/CzXqoSvXbjY3WkREFbMn7K0COZe9/9tnzV67IakUhajo7r2cylQ0NchuS8YrPEvf7n3v9dUyt3rx7V25bsvPiW29dWlkptRcgMNTV/Z5hSJdLViuy9y4EQdKxGHXihNFuf/j11wqYkxfH4OBQMIhpNKV2RDK4Xj+8s9N44YJ8JpToXQiCZBimqqmJ7O396fPPlbEIgUAg/3fYBmy9o70CC6u0qv6b/TUv1ICyDjI+odyUb9onsDCbZIPzQeoEBco6MCVGu9FQb/DP+IVX8U37LF0WlQ7M7AxMCeWmoivRZDQpvEp0OcrsMrU9tUAcAKMExVDSSfqmhHatLFyG88/4QXUwMErMHWZMgwXng8VW9E37TA6TzqKT7gMYJZSbCi2E2CRbbEV6nabXadJFSvcBgBJcj1u6LMV2rT18Uz7KDaCDAVBC9BBpOh1Zjoir7p/162p1lc9VSnQDgBLKTQVmAwgnsnpqJxW5F5H+tUhVoiN0JodJdNfK4p/y1/bVojgqpRGpSkgXGVuL0Ru0lEaCC0FMhUlcuUhW0lf0NFJIJp0J/CtAOgGMYBAIpDwgSb2s7Sv0PMgzZ45evdqijC0ZaWszf/jhSYLYZ8Hb2NjIcZzVapVuRfbvBMPQy5cdX375IBhMHFQmkTjwVBGGpDfBT1eXpbpa6/Vu7XsWwzAEQXZ2dqQbwl9reI3JMHc379KMpBXHQTid5L17keQBoQuKoolEIl3w8JPe3j+zbGJpaTyZDAs0hO0yu+cbzn/g/mDQMUjq89cLKlSlxtR5LxQpYqnX3GxaXT3wT766uqrX7zOmJZPh48f/9Oabj/r7/2IyOYQYQhEE0eN6J+k8RZ2yV9oXQ4t31u7c376fPT3cOuwi87Nq40vj3we/F9J6RYV6bOzExx8vzRcfGGs0JofjcmvrMEEcf/Dg74uLY5ubgnOuRyuO3njhxvhL4x01HdkjhI5oqGzIexlwg8AGKUo/Pv5Sa6ukZwBZLC96PBPXr3M221meYj8/zUer0vbV9vXX9zcYG+YCc+v0evZ4JBnZTm3n1WEyjEAn1GoMQRCWFRmFqdXGpqZLbW3XCKJndfVv4fC/eQrj1grrK9ZX+mr7OITzbno/WfoknHORDbUMSeldNM0gCKLVFr03V1PT2dl5o6npEsdllpc/vXPnYiz2kL8Kftp6urW69faD295Nb4LNH9dv/+f2t+vf5h0MxAMCHXr8OMWynNmsFVh+j87OP1itr87NjS4vf5pKCRujKT2FoTLOKm+/fWxwUNDgk0t1dQuGCXqO1R64Ly4+4kNxFEXzR2SO5bjMkwvjhx8iruK3s6LRou+pKE53Hsf+eKxwd2flryu+fz7563i9mx6PvampimdWAYKk7QxDnUFVcDUngok0/T9z9htv/MJuN46NLXJid5LKBa1W9c47xy9caCy1IyAwGtXnztlL7QUEUgoA5m+Lyhvvi6TZHWD+tqi88b5IXacAyd+KyBsXIlUJkPytiLxxIVKVSM/fissbFwJgFSwxfys6b5wHACUS87ei88Z5gIlMROdvJeaNcwGjRHT+VmLeOBcwSkTnbyXmjXMBFveKyN8CyRvvAUxJYf4WxVFMjeW9UOyJVCB54z0kRb+57OVvQws///+up8bGZB+5+Y9NUA5Iin75ERgbQyAQSDkzYLON9kqKb/lR7v8zuilq2gdmOt8XhZTYjcZ6g2HGLym+5UchJW6KWolGo0lJ8S0/SijBUNRJklNydi1EGSUdZrMGw+aDUuNbfpRQ4qaohVAoyUqNb/mRXYkex7ssFrm7FqKAkh6CoNPp5QiA+JYf2ZW4KWo2EFAgmSWvEkKnc5hMCnQtRG4lLpJci8U2aFnuUspDXiV98k8jEAgEcqiRcedOJurr65ubmwuPHz4lGo1m73bW9vb2cDi8tbWFANwXVoxUKpVKpbLvM5lMMpnc3t5GlNyRkBuopPyASsoPqKT8gEogEAgEAjl8DNgGRntHC493d3fX1dVl3x+OmdFNuad90/xlSq9Ep9LpVHz3tdqN9npD/Yx/hr+dEivRqrTvOd973/U+z6893ZR7JboSTUb5myqxEpZjH6cfx9Ixlts/C4mhmJN0TvmmntpUifdWmAwzOrfPpbxHh7lDg2nmg/NPbar01wk/bsq9EFpIsk+/JaGslehxfZelS0jXQspcSQ/RQ6fp5ciykMJKKOEfZ3nOuin3bGCWE3ZjtOxK+MdZnrOEjnCYHAK7FqLA2JUdZzEU23ec5TnrIl1rsbUNekNuD2Xn3d53T1tP85fJXXcdbg7fClII/wVcgw6RY1658AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.345;4.blob,1.1,3544.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.497;4.blob,1.1,1356.iVBORw0KGgoAAAANSUhEUgAAAJMAAAAiCAMAAABsrRv3AAAByFBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1dFRaoPBgbzYmJuLCxUIiIBAAABAQECAgI0NDQ+Pj4REREKCgoGBgYgDQ0bCwsMBQX1Y2NKHh4NDSATCAikQkKoREQICBMiDg4FAgJGHBz2Y2MODiICAgUjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAthYe8GBhCLODjBTk4DAwdXV9dYWNstEhIfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgI5OYwDAwgJBATyYmJQICA6OpAICAgxMTEXFxecPz+qRUVFRaxXV9gNDQ0FBQUsLG4DAwMiIlQAAAGaCm3PAAAB6klEQVRYhdWXVXeDMBiGM+/c3bVzd+vctVvn7u7u7q5/dx1NCoMsJzmn0O25egiHj/cCyAsAimJhaUUwM2FtQzIctrZym53KHvxuEAdHJ6M7u7i6yWzuHp7wZjiDeKksvX2g+/r5O8ttAYHozjiDBAWHhIaFA6WIiIwiGE90jDpWsVBx8SSDWCQkJtkkK5YpJZVkHBFp6RmZWYolAiA7J5dgHHn5KfybaOovAJaYApJ9U1jEu6m/AKBYUyIxUFpWTjAxpn7vQUVllcRAdU0twWSnrl5q+selgWQy09jULDFzU9XSKrH/i7atzdwRJLTrdB3mziCms+PvZQJd0kzdmh6R9fb1wxVaw00RMqAWb7KCFozNNCi2oWF0ktZwU35kGhEv8S0Yk2lUMya28Qm0jdEaboqASfUUUnu45fItGJNpekZis3PzjIabImBhEdlS2fIKJ3wLxmTCsbrGarSsb2wuGczYgikzbVVuMxo7xhZMmQns7LIaO6gF02ba22c1dlALps10cHjEaOygFkybCRyfsBo7sAVTZzp1OWM0Ss7VF0hhC4aZ9P3gG+3vl15eXTMaJTeRxr8CQwvW3hoy3ek47gnXPjyyGh1Pz7xzLRh1lc4Xjle2caYgKP1NtKLP8q58DiFFH5/Cwy9bLaxE4MLz6gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.516;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACtVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0B9ZW2AAACKElEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDgkWSckOkpCk3g0FGlgqGjILBCeTkcUgoKCoRrUNeDpfxyirYxTF1qKqp4zJEQ1MLmzAWHdo6uMxg0NXTxyaMqcPA0AinIQzGJlgEsegwNTMHURaWIGCFwmJgsLaxxTQEqgMZ2NmDKQdHEHBCYQGBswumIVAdSMDVzR1Ce4CAJwoLCLy8McyA6UACPr4WmHYhgJ9/ABE6AoPwmcHAEBxCWEeoTRh+Q8IjIgnqiIrGbwZDTGwcQR3xCQQMYUhMIlXHKEABySlUMCQ1LZ0KpmRkUsGQrOwcKpiSm0eylvwCEFlYVFxSWgYRKa9IJlKvUiWIrKquqa0D0vUNjU3NLa0QqbaKdly6rMClnSW4DDDo6HTsYmDo7unt658AEpg4aTIDw5Sp0yBKp8/AZYgyuLRznAnMkLNmz7GfCxSaN3/BQojkosUgcslSCG/ZclyGhIJLO48VDAwrV61eAxZau279ho0gxqapm0HUlq0QpdtyCXsnbvuOkJ1gsV2799Tu3Qdk7Ie45ABE6cFDhL3DYDHzsOORoxDhY8dPAMmTkDA5BRY6feYsYe+AwLnzF2ASF4H4UvHlKVeuNkIErlVcx2UIOrBG4d24Wbzk1m0I+87de8Qaghvcf0C5GQ8ftVFsxuO7Tyh3yNNnJCkHACrLknCJtVV2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.571;4.blob,1.1,2240.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.628;4.blob,1.1,572.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAnElEQVQokXXR1xKCQAxA0cWOaFDsBaxgBXvBXv7/n3xTrzPmaU+SyWSySr1DiyhENBZnIpGkU3qaCSNDZ0WDTcmxIW/RhSJdMuhyBazW6nBDmrDttOB2B+z2zG/2HRdlb6D+xJAcjUF3MsWSvo1yoPPOszmnLZbgSgJ4LR68kS28E37KPjxw/vHnxpZPn8IzE5crrxi53dnweH7eLySsCuR+omikAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492324571;4.rect,1.1,3.664,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.326,3.385,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.364,1.7,2.49;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.641,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.610,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.234;4.blob,1.1,2572.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.316;4.blob,1.1,3276.iVBORw0KGgoAAAANSUhEUgAAAHQAAAB2CAIAAACWMCB7AAAABmJLR0QA/wD/AP+gvaeTAAAJTUlEQVR4nO2dX1AT1x7HdzfJAi4JSVwgkAQCQkxsGEQaE8ZonTuDZOzU6Z1W71Al9BZbn+xTO/atL32xD32w44y89AHRmdvrv7YzTO90RHodp2BLhJa2NpHEYUhUstG4JJC/u/eB1huSCNnsCQnxfIbh4eye3/nlSzh/fr+zZxEEAhpcIsElkkJ7UYoICaKfov755AkulQoL7UypwcbjYZ8PFQqZWKzQvkAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIC8uO3eeOnJkptBeFBEYQFtabZ/DcR6gwc0OMHFJcpdUqnc6h0EZLAGAiavV2rzeG6GQB5TBEgCMuBgmbGnpdTiGgFgrGcCIq1L1iESEy3UZiLWSAYy4Wq3N7b4aj4eAWCsZAIiL41UazSHYJ6QDQNzm5sPhsN/juc7fVIkBQFyt1nbv3kWWZfibKjH4iisWN9XVWWCfkBG+4ra2HqOoqceP4ao3A3zFhdNbCAQCgUAgkA3i1KmdMzNHgJiqrBSFQgMHDzbwN9XTo/7445f52wEOt3luX5/2/HkHkIaDwdjVq26bTcvflNlcOz7+iL+dQrJrF5lIvKdUEqAMHjigWloakEhwPkYaGirPndsnlZaB8gogHL65Npv2xg2vxwMsaHv9uicQiB4+3MzHiNlc+8cfgUAgAsorgGQrrlCI9fa2DA2B6RNWSCTYCxecfHoGDEN376754YdN3ie8+mpDMDhAEKuObcEwtLxckPwjEmFZXl2hrU3OMCcaG8W5edXWJj9zZk9ZmSC36vkm2zNubDbt1avuUCieXHjwYMM331iTS7766v7rr/8nm6sr/PLL459/9vf1tX7yiZ2z7whiNtdOTfkjkUQOdTeArMStqsIPHdIcOvRtSvnNmw+MxivJJU+eRLK8+oyhIceJEztyELeiQtjevvXs2V+5Viwujh/Xzc8fwzA0H8YVii3x+HsmUw3XihaL4vRpE5oXp8CQ1YBms2kvXrzHMGw+PHj4cOm77+ZzGNbM5trbt31sXpzaKJqaxAxzwmCQ56+J3t4WiurHcQ7zQpIsP3duX309sEl3Plj/8xw71jo1Rc3MPM6fE9eu3cdxAaelsMlUMz8f9HqLeqfE+uICn96ms7wc//LL2bfeas2+itG4+ae3EAgEAoFAIAAp2nRLoQD5NE8ppFuAAkzchobKurotExMLoAyWAKniyg1yw0lDDoYKmG4xGOQnc/I53/wZz0UxtNpYre5RE0pi0b3I1cpKuuXSJRcotwQCND3CGY8zyTEwDEONxuqeHrVSSbi5+7wBCDERprAoVN0qvAqnJinnsJN20VytvPSSDMexO3coUG71929Pj/AODv5mt1MIgohEmMWi6O5WVVXhk5PU8LDTxd3nDQDVH9eTneTcyJx31BsL5Xj6/rvv6hMJ9osv7oJyiyTLCUKUUujzLS8txREEOX5c39lJjozMjY56Q7n6vAEIWIYVa8QyvUxICCOBSIzm7GtFhbCvT3vlipuiwqDcikQSwWBscXHVTzT6Z66MYViNRqzXywhCGAhEaO4+bwzoyi+yg1Rb1eJGMe2ivWPeBS6DvsWieO21xo8+mgCYFHjnHd0a3QKCICiKdHSQVqu6sVHsctFjY94inKisGjSkOqnaqpY0S269fyvlvpWXzUTpDF3bBx+0u92Lly8DG82Q9bqFZHQ6qdWqbm6WvJ/mczFCpG1YSn7fTMqlddMtbzY3D+7bJ8JArlbSAbjJCiAZUuuhtA1La7xvZt10C4aiLIIk8pxHBLjJCiBZ7VtIRCL/0uszXjIaa27efLBGXVlZ2cLyMrO5k7RFSYVQeGbPnr8plYV2pBTBUHQXSRbxtg0IBJJOfjdfruwaTyRe0NEsv9PPlhbJhx+2V1S8oC9jBCCuRqNhWVaZaUpgt1MeT+jtt7fzbyWZsjLB559b8rp9DQjAvrnhcOaozaVLrh07ZGCFiEQSd+5QXV21AG3mAwDiYhiGIAidKeyAIMjiYuzHHxe6u1X8G0pmfPxRe/vW8vIi3bC/AjdxDXL5SUNqQgVF0XA4HHv+m1gnJymdTsrnkSiD3HDScDK55O7dwNJSvLOzOmebG0BWQw2Gosbq6h61WkkQ7sXUhMrs7GxFRcUa1WdnnyIIotVW/fST71mhABVgaOqfNs7EWeT/UwsMxYzVxh51j5JQuhfdyXcyDDsxsdDVVXvr1sNsPkJBWEdcEYZZFIpulaoKxycpatjpdD3n338NwuEETUcVii3Jhf3b+001ppQ7B38btFN2BEFEmMiisHSruqvwqklqctg57KJTQ5rj44+6u1Vbt5b7/cCC9GBZR9z+7ds7SXJkbm7U6w3xeAXz0lJcLF4Vn/36/tfX007L8i37/mq3v5PsHJkbGfWOhmKZI14eT8jjCZlMNSMjczk7llfWGRAYltWIxXqZjBAKA5EInau+r7xSR9Ox6Wn/s5JIIhKMBVfncRajiehf7TIasUYv0xNCIhAJ0LHM/y44LtizR3Hjhjc3r/LNOt/cKb9/2u/vIEmrWr2/vt5F02Ne78QC54QKjguCwVV/mLW7hSn/1LR/uoPssKqt++v3u2jXmHdsYmEi5f7btxfeeKOpqUlcpKn1de9gEcROUXaK0kmlVrX6aGsrV3ExDJVKy1IeQlu7W0AQhEVYO2W3U3adVGdVW4+2Hk0Xl6ajv//+xGyuLU5xOaMkOCdU6uuJwcF9anUlv3YzB4WNxprPPusSCosxrsl5EeEJcU6o6PXSp0+j8/NBrhVXt5v52OOpKUogwIpzKZzfwM0KJlPt999785ToicWYyUnf7t2cH8AsBXbu3Hr6tLnI16mbkrq6LZ9+atbrZYV2pBTR6aRtbcXYG0IgEMjmQ1QpGggNNKz5tLlBLj+7d+8uktwwr4oHXjMkJsrIdsjIDtL1/A37C8vLnlCot6Xlts8XSRTpYTRFiuqAamBpAOd38FqpwneF5rnuiQaizfwOXitV+IrLJljnBacWxJGMpQeA2IJjyFG3t06c68FrJQyAJf/ywnLT35swEfbgv2tt1H0BARMVcww5tH2wZ0gFjLj3Lt6TbJPUcD94rbQBEwmMBWO1XbWVDZVzxZqILQjAguWOIce2f2zDuBy8VvIA0+L+tfsCXLD2UvhFA1iCgIkzkm2SmpdrXP8G+bTfpuZ/lgFywN1AH1sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,712.iVBORw0KGgoAAAANSUhEUgAAABkAAABeCAMAAADhak+FAAAA0lBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUFCwU4izgfTB8JFwkQKBA0gTQkWSQLHAsPJQ8zfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQw4ijgAAQAGEAYOIw4yejIeSx4iVSIucy4TMBM4iTgyezIgUCAKGQoFDAUeSR4SLRIxMTEYGBgfVi9SAAAA/UlEQVRIie3TSVPCQBCG4U+iYFBZAkEdBdn3gCC4gyjw//8SCYr09DR3DtOHmal6DknVWw2EcwJ9Ys7f4/SMSTxxvr3d5AUTXF5FZyqd4YCslwvPvOcYAr8QHtc3JuBWxYC7e0GKqoQHlRcE5QqqqiZJvYGmaknS9tFROUm6PfSDgQCp4SMwaggyVk9AJS1IZjIFnoMXU17fovP9Y8rhc1aMLmf+xWAxcX8f3z9Makvh0weHd/8fo/tu9t1Xaw1IdyakOxPSnQnprgvtrgvtrgvtrgvtrgvtzv6NdGdCujMh3ZmQ7lz23bmY3Q+P3W2729rY3ba7TcfuNo5ktzcM4DzPPwWmsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.584;4.blob,1.1,892.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABaFBMVEUAAAABBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwUgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwgOIw5k92RWFMqLAAAA7klEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykElmeUVWFlw2KSopKyiCmapqWtoamkDGUw6unr6BjjdZmhkbGJqBmGbW1haMTBY29gSSDN29g6OQMrJ2cXVzZ2BwcPTy9sHj3JfP/+AwCCG4JDQsPAIsEhkVDRrjDwO5bFx8QmJSUBGckpqGkI4PSMTh4as7JxcMCMvH1WiAIeGwiI8riUyYyIAkRkTAUYzJqmguARXVOLUUEqaBoMSJtI0lJWj8gETBB94Vv9VfQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492324669;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.790,3.342,3.170,2.19,2.14,1.1,3.790,3.323;4.copy,1.1,1.0,3.361,3.280,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.340,3.361,3.400,2.38,2.14,1.1,3.340,3.342;4.copy,1.1,3.800,3.361,3.160,2.19,2.14,1.1,3.800,3.342;4.copy,1.1,1.0,3.380,3.270,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.740,3.380,2.10,2.19,2.14,1.1,3.740,3.361;4.copy,1.1,3.810,3.380,3.150,2.19,2.14,1.1,3.810,3.361;4.copy,1.1,3.650,3.456,3.310,2.38,2.14,1.1,3.640,3.456;4.rect,1.1,3.674,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.234,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.595,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.651,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.620,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.743,3.215;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAC4AAAAcCAMAAAAp1X2jAAAAjVBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4ECwtf7Oxh7+8GEBADBwdX19dY29vzb9btAAAAcUlEQVQ4jWNgIA4wMjGzsLIRqZiBnYOTi5uHl1jlfPwCDAyCQsJEKhcRBZFi4sSplhCSBFFS0kSaLgMxXZZI5XIQt8sTqVyBWVFQSZmTSNUMDCqqzGJq6kQrHwWjYHgAdZISvYamljYJynV09TSIVw0Aw/QFZfpW6ucAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.751,3.326;4.blob,1.1,2800.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.345;4.blob,1.1,3320.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.497;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAAHUAAAAPCAMAAADtY3ApAAAA9lBMVEUAAAAFBQxjY/UeHkpCQqRERKgOBgYcHEZjY/YGBg40NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMtLW88PJQPDyQHAwPXV1fbWFg4OItOTsEGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8TEy5KSrdnZ/8dHUhUVNAyMnwoKGRRUchlZfsLCxsuLnJYWNk/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgaQOjr+Z2cEAgIEBAliYvIgIFCsRUXYV1dFRaoPBgbzYmJuLCxUIiIBAABR8QRcAAAAv0lEQVQ4jWNgoCtgZGKmr4UQwMKKKcbGRmsWOwcniOLi5oFbysvHL0BjlqCQMIgS4WASFYPaKi4hyUtrlpQ0mJKRlZNXUGSgF1BSVoGyVNXUNehmraYWmGLU1tFl1aObrfoGQELJ0MjYxJRudjIwmJlbMDBYWulzwkWonV+wAjVrBgYbWwSf2vmFwc7eAYPF4OjkjOIKaucSBhdXNwwWg7uHJ9YwoBrw8sZkASPVh6aW+vr5Y7BoD9wCAjFYYAAAUiQcWW+mcgkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.472,3.513;4.blob,1.1,1340.iVBORw0KGgoAAAANSUhEUgAAAXgAAAASCAMAAABmWzUcAAABtlBMVEUAAAABAQECAgIqKio+Pj4aGho0NDQREREvLy8NDQ0FBQUKCgpHHUd/NH8sLCwGBgYgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0MICAgxMTEXFxecPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4DAwMiIlQAAAGo3BZZAAAB8klEQVRYhdWYZ1MTURSG72YX4iYBDGgWEClGQSSCImDAQm/WIChNpFhAuhUsUSGIIk3/MTMbl2xuTpI9d7bl+XKfOXPmzDvvx0tI5sA5HBwwY96zCiifreEFIYueZQuCk3XPKqB8toY/IbromdsJFK9xzypi+Tw51ibRCJ8LDPOA4lPunfTmk3grOHX6/0SrQVfU+KRCalJUfAbIl+MBktoPvYovIZSdLVW2tBp0RYVPKqNH5RWJ+c75zwNJ7Yc+xV/wVhLKqi5WE5xBV1RckmoUDQSi7+XaQEK+uitAUBuiT/FX65XRsV1raEQadEVF03XFgs0tN2S5ees2na+1rR0IakP0KR6ioxNrWunq7glGrbePztd/5y72nDUYV/y9+w+QhudhaIDK92iQ+Zi5GFc8GXqMNTxPhuPzjYyOsR8zFQOLH3+KNTwTz+LzTU5Nsx8zFQOLn3n+Aml4Xr6ajcs395r5lMkYWDyZX8AansUldb5l/wr7KXMxsvjVN2+RppF30ntFPzR/VOVbW8cdspBUhXIOGS7dXjI+ff6CNI18DYUV/fb9B4nl29jEHbIQPhf47o1EC90SZH6m20vK9i+saeP3Tsz/7JJk+WxNqu9etyjjSrdnNnv7BwmzjPsWjojAd68oHrLumUH477+EmZzvCPv7YZkaeXVFAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.535;4.blob,1.1,3584.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;3.end,1.1;4.sync,10.6492324778;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.800,3.342,3.160,2.19,2.14,1.1,3.800,3.323;4.copy,1.1,3.650,3.456,3.310,2.38,2.14,1.1,3.640,3.456;4.rect,1.1,3.684,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.215,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,2.36,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.661,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.630,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.743,3.196;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAC4AAAAcCAMAAAAp1X2jAAAAjVBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4ECwtf7Oxh7+8GEBADBwdX19dY29vzb9btAAAAcUlEQVQ4jWNgIA4wMjGzsLIRqZiBnYOTi5uHl1jlfPwCDAyCQsJEKhcRBZFi4sSplhCSBFFS0kSaLgMxXZZI5XIQt8sTqVyBWVFQSZmTSNUMDCqqzGJq6kQrHwWjYHgAdZISvYamljYJynV09TSIVw0Aw/QFZfpW6ucAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.345;4.blob,1.1,2608.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.743,3.440;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAABkAAAANCAMAAABrcDXcAAAAb1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0PgS/BWAAAAXklEQVQYlWNgwA4YmXBIMDAxIvOYmeFMFlY2JAl2Dk4uGJubB1kLLx8/O5QpICiEwxZhEXYcMqJiOCTEJSRxyEhJy6C6Fc6SlUN1K5wlz6qA6lY4S1EJhy0MyiogEgCA4QNmDxmglAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.497;4.blob,1.1,1560.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAAiCAMAAAByZCtEAAACIlBMVEUAAAAFBQxjY/UeHkoHBwOTkzwsLBJCQqRERKhiYihlZSkOBgYcHEZjY/YGBg4qKhGUlDwICAM0NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGMCAgGKijg7OxgtLW88PJQPDyQHAwPXV1fbWFg4OItOTsFTUyJ0dC8GBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8bGwuYmD4TEwgTEy5KSrdnZ/8dHUhUVNAyMnx9fTNKSh4oKGRRUchlZfsLCxsuLnJYWNlERByCgjU/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjcODgaXlz0hIQ0/P5xaWuA8PJVubixZWSQQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgY1NRaOjjkEBAGQOjr+Z2cEAgIEBAliYvIgIFAFBQKRkTswMBOsRUXYV1dFRapeXiZmZikPBgbzYmJuLCxUIiIBAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUsLCwgDQ0bCwsMBQX1Y2NKHh4NDSATCAikQkKoREQICBMiDg4FAgJGHBz2Y2MODiICAgUjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAthYe8GBhCLODjBTk4DAwdXV9dYWNstEhIfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgI5OYwDAwgJBATyYmJQICA6OpCcPz+qRUVFRaxXV9gsLG4ICAgiIlQAAAGFAvEYAAACK0lEQVRYhWNgoCtgZGLGw2JhZaOvc9ABOwc+FicXPr3c3LRm8fDyMeBm8QsIojpISFgEzhYVE5egMUtSShpqGTaWjKwcquvkeZkUFKFsJWUVUVqzVNVgNmNjqWuguo5BU0tbR1ePgV5A38AQD8vI2ARDh6mZuQU9XAYGllb4WNY2aMoZbe3sORxo7ywocHTCx3J2QVGs7+rm7uFJF3dBgJe3Dx6Wr58/suKAQEc+OIfa5QhWYBaEjxUcgqw2NAzBpnY5whAeEYnBYoiKjsHDio2Lx+ErapceDAmJSRgshuSUVDystPQMHK6jOsjMwmQBE1M2PlZOLu3dBQZ5+QUYrMEDkgqLMFjDCxSXlBQPtBtwg9KysvKBdgNuUFpRWTXQbsANSqsxxWoiatFYdfUNUBFiWdhMQQaN5g5oItja8Nhd14TOam6BSRLLwmYKiuta0YWwtOGxua4toh2d1dEJqz6JZWEzBQl0mXfDmHzQqh5LGx6b63p6MVh9/RNIZGEzBQlMnARjTY6eMhXMwNKGx+Y6bGDadFJZxIIZM2dNhrAw2/DEum524hwSWaQDzDY8sa5jmDuPVBbpAKMNT7Tr5i8glUU6wGjDE+26hYsWk8giHWC04Yl2HcOSpaSySAfobXjiXbdMbDmJLCLBCvOVMCZ6G554161avYZEFpFgrQG8d4Pehi+tJroFtW49qSziwIaNCDZaG37gW1Cabptwym2uHOgWVNiWrdglAP9e49k6+1sGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,1964.iVBORw0KGgoAAAANSUhEUgAAALsAAABxCAMAAAC6PSKKAAACBFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgCBQIyejIeSx4xeDEXOhcTMBM4iTgKGAoNHw0KGQoSLRIgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxA7kTsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIxejELGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwhk92SIyxQ7AAADd0lEQVR4nO2aZ1cTQRSGV0UTioU1KCAgigVsKHaUKHZi7xV7V+y9995774XonxRDJsbdmU3mnnuZmXPm+cJkd8577jf2Pc91HFI60cZT0rmL6gnA5HTtpnoEKKFwruoRwOTlF6geAUz3HqongNOzl+oJwBS6eapHANPbjageAUyR20f1CGD6usWqRwBTUtpP9QhwyspVTwCnIqx6Ajj9SytVjwBnwMAq1SOAKRg0WPUIcIYMVT2BAVSTfbHSJTNqhg03LjnFiJHmJTNG5VN9gNAlp6gdbV4yY4xbbVwyo84da1xyinEV5iUzxpN9tdIlMybUmpfMmDjJvOQkocn1xiUzprhTjUtm5DZQdQVwckk0QSj9xGXadOhsmQAnN7oJZqSfeMycVQedLQPw5NlzEhSmnzjMbciBTxcIXTIjMs+8ZLPx2ji8jkbu+Xw2Dq2jkXs+jo1D6mjInq8pNt/zhGfjcDoatudrii3wPOHaOJSOhu35FsYWeZ5wbRxKR5P1fIuXLE3/WbzM8375iva/K1etTj7h2jiUjibr+dasXbd+Q/Icat7oNgrubdq8Zeu2vweBjUPoaPKeb/uOnbt272k7ROv37tvfIrx34OChw0eOCm0cQkcDeb5jx0+cdJxTp8/wv1tSnD13/oLIxiF0NIDnu3jp8pWr19q+3cLXy4sC7t24eev2nbsiG4fQ0aQ93737Dx4+epw4VtU8ccuaBfeePnv+4uUrR2TjMDqatOd7/ebtu3+/Iu8/CO59/PT5S/uJa+NQOpqs5/v67f/f3wX3fvxkJ66NQ2l/GJ4vuOlxbRxK+8PwfMFNj2fjkNofgucLbHo8G4fV0TrA8/lsHFpHs54vS2g6Gr3nc8g6Wgd4PrpdTJwO2RoX/bei3MXE6ZCt8V/Cd4S7mCgdsiUeFb4j3MVE6ZCVv8XvCHcxqT0f6S4msecj3cUk9nyku5jEno90F5PY81HuYpJ7PsJdTHLPR7iLSWcQkxDuYtIZRAbZLiadQUxB1dHoPZ9D1tGs5+NjPV82ydgY4/n8mOP5/Jjj+fzo4/nk0cfzSaOT55NFM88nhVaeTxKNPJ80Gnk+efTxfPLo7fmC0dvzZUBrz5cB6/myS7bwsZ7Pi/V8geju+YLQ3fMFobvnC8J6Pj7W8wmxnk+A9XxirOfjYj1fENbz+bGez8cfVl6JVLeum9UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492324876;4.rect,1.1,3.694,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.671,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.640,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.743,3.177;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAC4AAAAcCAMAAAAp1X2jAAAAjVBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4ECwtf7Oxh7+8GEBADBwdX19dY29vzb9btAAAAcUlEQVQ4jWNgIA4wMjGzsLIRqZiBnYOTi5uHl1jlfPwCDAyCQsJEKhcRBZFi4sSplhCSBFFS0kSaLgMxXZZI5XIQt8sTqVyBWVFQSZmTSNUMDCqqzGJq6kQrHwWjYHgAdZISvYamljYJynV09TSIVw0Aw/QFZfpW6ucAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.771,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.335;4.blob,1.1,3788.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.516;4.blob,1.1,2000.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAAMQAAABLCAMAAAAYnthUAAAB+1BMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAggICD///8bGxsMDAX19WNKSh4BAgE1gzUbQxsTExOkpEKoqEQUMRQ8kzwDBwMiIiIFBQVGRhz29mMODgYqZyoraisfH00dHUkEBAsSLBIsbSwjIyP39/cDAwHm5l1jYyg5jDkdRx0bG0M8PJQ8PJMkJFkJCRYWNxYzfjM+mT4xeDGLizjBwU4FCwUEBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4tLRL+/mcfHw0JFwkQKBALCxwsLG4+PpkSEispZCk9lz0fTR/Q0FR8fDILHAsPJQ8DAwcYGDwxMXg9PZcpKWUHBxATMBM7kTskWSRyci7Z2VgHEQcLCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzAYGAr8/GY3NxYBBAE9lj0ZPRkmJl42NoYcHEQDAwgtcC07kju3t0qVlTwJCRcBAQILGwtZWSTs7F8GBgIfTB8JCQTy8mJQUCAGEAYOIw4XOhecnD+qqkUiVSIucy4KGAoNHw0yezIgUCAFDAUeSR4GDgYyfDIECQQnYScraSsNIA1n/2cFDQUIEwgmXiYucS4SKxJk92QDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0LGgsMHQw4ijgyejIeSx44iTgKGQoSLRKQe9KYAAACmElEQVRoge2ZZ1cTQRSGR0WJJUEF7ErsHQfFGlQssSt2xK4gKti7ooLYFQtRVOyK7We6bkKykuycu2ff7Llzss+Hmdmde573W8p5hTDoJbCgfRR69+Hto5DXtx9rXwbyA/3NfcDAQfEXwVABNADty0R+YHD8MGRofC8sKoYGoH2ZGBYYHj+MGDnK3EePwQYgfGPHlVgfw+N73E+YmDhMmjzF3KdOcx9qBeGbPmPmrNmJc7B0jiyznZw7799aLgvdh1rA+OYvWLho8RLjEKlYumx5pf3gipWrjHW1jAJCU8B8a9auWy/Eho2bypVjm7cYS5XciglNAPJt275j567dQlSH9tRUqQb37jOW/TKMCE0C8R04eOjwkaPmsbbumKwvtR89fuKkEA2Np9yHWoD4Tp85ey71FD1/QTF78ZKx1Ne4D7WC8F2+8v/zVcXstes3hGgKuQ+1gvZ10xAxCfZ8f/PWbSGaG1ugYWhfN2XS5E7aRetdY7l3vxaahvYlePDQxOYDt/jRY2ga2kfjyVPevpyjDfwTGu0jUffsOWsfjRcveftStMdsv/5eFYWhUWhfivbYa9u7jjfYLLQvSWUsYnv3VrZBs9C+JC3v7O865XtoFtpH40MTbx+Jj+Cf5WgfiU8dvH0kPn/h7aMQ/FrB2kfim/zO2keioAv7dwbtI/HjJ28fhepfnax9FH535bH2kYj+4e3LBfz2NPs+Chq2p2no2J6moWN7mgbH9tQxHNtTp/BsTx3Ctj11AtP21Bks21OnsGxPHcOxPXWMLu2pEl3aUzWatKdq/PbUC1/O4benHvho6NOeKtCnPVWhTXuqQpv2VIXfnnrhI+G3px74SPjtafZ9JPz21AMfCb89zb6Pgt+eeuCz5y9r4ar31QstlwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492324983;4.copy,1.1,3.650,3.456,3.310,2.19,2.14,1.1,3.640,3.456;4.rect,1.1,3.704,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.326,3.525,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.681,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.650,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.743,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.316;4.blob,1.1,3816.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.440;4.blob,1.1,2056.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.452,3.516;4.blob,1.1,1236.iVBORw0KGgoAAAANSUhEUgAAAW4AAAAPCAMAAADzo9X2AAABs1BMVEUAAABHHUd/NH8qKiosLCwGBgY+Pj4REREgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwBAQECAgIJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0MICAgxMTEXFxecPz+qRUVFRaxXV9g/P5xFRaoaGho0NDQKCgoNDQ0FBQUGBg9iYvMsLG4DAwMiIlQAAAEZE71aAAABp0lEQVRYhdWQZVvCUBiGD+EUC7uwxS6wuwO7u7sDCwu7+ycLG9M5z7z27ppsuz+cc/NyzrPtQciBSo2UikaLGXoQntznvHTeLPPx9XNN+BouhYm/PoA1CQwK/nK1CvPOykBI3SFsCw2j/+RruBQG/vpw9igikrYoQzTmnZUBvO4YXSzb4uITEMxwKQwS9Um0Go3UnpziEpSaxvEtCgBed3rGL8vMygYaLoVBTi5tJnNePikFhUXUpLikFPsligBeN46ycqjxpaKyykRZdQ2119bVQ0Pkgzh1NzQ2AQ1Os6WF3FvbBEdIjzh1o/YOqMHp7HKu3T29wiMkR6S6+/qhBmdg0LkODY8Ij5AckeoeHRsHGpyJySnHOj0jOEAGiFQ3mp2DGpz5BYQWDUvCA6RHrLqXV1aBxpM1/TqtG+ZNtLUNuy4z/qrbukNi5TzHYHdvH2g8ObDYaD08OkYnp7DrMkOjpepkYrVTdZ8RJOdc535wcQk1flxdf/vNLeyu/NAQxB17dk9QdT88kjxxnXMHzy+vUjz2v7C76mTiqPmNzzl3YHv/YP78BOmMYXUILU1/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.535;4.blob,1.1,2832.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,616.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAAtUlEQVQ4je3SxxKCQBAE0FExEE0jKqJgwIARxRww/v8v6UGr6INVXrzRh619s1tzaqJXYgSJJ4BCMvW+pTOvQ5RkCltRNXA2R+B8AVxkBVxiHVzmCrjKBrhm1nF/w0LbErpptsDU7jhgrdsDU39Av8TV0MPRGAeTKXqmGjjw5ugFu2Cfl/hhZaPXFnrjobc7oLg/gI98AsuBAz5fgNebH+Y9EOBZf9CXRP0KO+rXJ1G/6N/9egK5Xx3IWoWwagAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492325085;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.830,3.342,3.130,2.19,2.14,1.1,3.830,3.323;4.copy,1.1,1.0,3.361,3.250,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,3.310,3.361,3.470,2.57,2.14,1.1,3.310,3.342;4.copy,1.1,3.840,3.361,3.120,2.19,2.14,1.1,3.840,3.342;4.copy,1.1,1.0,3.380,3.230,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.780,3.380,2.10,2.38,2.14,1.1,3.780,3.361;4.copy,1.1,3.850,3.380,3.110,2.38,2.14,1.1,3.850,3.361;4.copy,1.1,1.0,3.399,3.210,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,3.790,3.399,2.20,2.19,2.14,1.1,3.790,3.380;4.copy,1.1,3.840,3.399,2.10,2.19,2.14,1.1,3.840,3.380;4.copy,1.1,3.650,3.456,3.310,2.19,2.14,1.1,3.640,3.456;4.rect,1.1,3.714,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.595,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.691,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.660,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.345;4.blob,1.1,3916.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.661,3.440;4.blob,1.1,3256.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,588.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAApklEQVQoke3SVxKCQAyA4QUrootiL4ANrGAv2Mv97+Sb4+/ojAcwb1+SyexkI8QzFFUgItEYE/EEndRSTOhpOiMV2JBZNuRMOl+gizpdKoOVag2uywZs2Q7cbIHtjvHKru2i7PXEl+iTgyHojsZ4pG+hHGjc82TKabM5uJABvJQevJJreCP5Kdtwx/n7tx2bPn0Ij0ycztyiermy4XYXv8T/vj7c1wNLlg5Fy+iO5wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.592;4.blob,1.1,1800.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABJCAMAAAAQV9TdAAACZ1BMVEUAAAAnYScraSsMDAX19WNKSh4gICD///8bGxsFDQU8kzwSLBKkpEKoqEQTExMmXiYucS5GRhz29mMODgYiIiIFBQUSKxI+mT4GDgYDAwHm5l1jYygfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsDCAMVNBWLizjBwU4bG0M8PJQ8PJMkJFkJCRYBAgEWNxYzfjMxeDEbQ0M8lJQ8k5MkWVkJFhY4izgfTB8tLRL+/mcfHw0EBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU0gTQkWSTQ0FR8fDILCxwsLG4+PpkSEispZCk9lz0fTR8FCwULHBwsbm4+mZkSKyszfzNyci7Z2VgDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBA2hTYhUiEYGAr8/GY3NxYLCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lT23t0qVlTwmJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgLGgsMHQxZWSTs7F8GBgIJCRcBAQILGwsJFxcBAgIbQxs4ijgJCQTy8mJQUCABBAEyejIeSx6cnD+qqkUXOhc4iTgKGAoNHw0KGQoRKRESLRIJFgkcRhwwdjA6jzoIFAgNIA1n/2cIEwgUMRQDBwMqZyoraisOIw5k92Q5jDkdRx0JFwkPJQ8HEQc9lj0ZPRkGEAYiVSIucy4yezIgUCAFDAUeSR4yfDIECQQSY9aUAAACmElEQVRoge3YZ1fUQBQG4LGxCir2wYoNu4tYseOiYgUVG/bOir03EHtfe1dAxYaKlRUUK/byo9yCwCaZ2Zzsvd7gyfMhmXNnkvN+ytl9GatUoyZDUat2HZ0nw2x1hXv1wiNg4ijVb6DzYJitoXgzshFIGJXGTZrqO9jM1ly82YJHwcRRaNmqtX/Rpm27qvOIaMXB9h38946dOqvfEsO7IGTz6NrNf+/eo2ev3uUze2wfHic437df/wEDVdNB8Sjh2OAhQ/2LYcNHjEwY5Vk4EkePGZskfGDc+AkTJ01WDJNTcNKxKVMrltNSp89gbOas2WnyR+bMnTc/cLIgEiGZ18JF5YvFS5YuW76CsXTnypQMyQOrVq9Zu2594GzDRqR0mzZv8d62btu+Y+cu3yQzazfPjhUc37N33/4DBxVD+6FEpHTs8BHv9eix4ycqZ66TpwSnT585e041PM8vYCTzunjpsud65Wrg9Jrg9PUcjWFuXiZwqAo3bt4S7OQ7fOxBX3H7Dmykqu7eE2zEcZ/7wV6QXhADHEmPBw99gnxf2KO8wn8SxxjXY+oE1dET6gAyT59RJ5AofP6COsJfRW7l99nuzCVJoqXI/VIxKQ4vIUmiJcntUExevSYJoqn0jXLy9h1FDp3SeDF1BIn33EUdQSKDf6COIPGRIxUAIPLLPlFHkMnG+pcIIt5JnUDmc1kpdQSZL1/R/usAKPn2nTqCzI+f1AmqvSjz/JLSkPXrN3UEGazOHQZa5w4Dq3OHgdW5w0Dr3GFgde4w0Dp3EGidOwi0zh0CYucOALFzB4DYuQPA7NxDRtO562R17v8fq3M3ykSdu5qZOnc1M3Xuambq3NWszt0wq3M3zurcQ2B17sZZnXsIrM7doD8XZJAypj+yOAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492325191;4.copy,1.1,1.0,3.285,3.960,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.840,3.342,3.120,2.19,2.14,1.1,3.840,3.323;4.rect,1.1,3.724,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.573,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.592,2.18,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.603,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.701,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.670,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.383;4.blob,1.1,2212.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.516;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACtVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0B9ZW2AAACKElEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDgkWSckOkpCk3g0FGlgqGjILBCeTkcUgoKCoRrUNeDpfxyirYxTF1qKqp4zJEQ1MLmzAWHdo6uMxg0NXTxyaMqcPA0AinIQzGJlgEsegwNTMHURaWIGCFwmJgsLaxxTQEqgMZ2NmDKQdHEHBCYQGBswumIVAdSMDVzR1Ce4CAJwoLCLy8McyA6UACPr4WmHYhgJ9/ABE6AoPwmcHAEBxCWEeoTRh+Q8IjIgnqiIrGbwZDTGwcQR3xCQQMYUhMIlXHKEABySlUMCQ1LZ0KpmRkUsGQrOwcKpiSm0eylvwCEFlYVFxSWgYRKa9IJlKvUiWIrKquqa0D0vUNjU3NLa0QqbaKdly6rMClnSW4DDDo6HTsYmDo7unt658AEpg4aTIDw5Sp0yBKp8/AZYgyuLRznAnMkLNmz7GfCxSaN3/BQojkosUgcslSCG/ZclyGhIJLO48VDAwrV61eAxZau279ho0gxqapm0HUlq0QpdtyCXsnbvuOkJ1gsV2799Tu3Qdk7Ie45ABE6cFDhL3DYDHzsOORoxDhY8dPAMmTkDA5BRY6feYsYe+AwLnzF2ASF4H4UvHlKVeuNkIErlVcx2UIOrBG4d24Wbzk1m0I+87de8Qaghvcf0C5GQ8ftVFsxuO7Tyh3yNNnJCkHACrLknCJtVV2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,2232.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.609;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492325289;4.copy,1.1,3.650,3.456,3.310,2.19,2.14,1.1,3.640,3.456;4.rect,1.1,3.734,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.711,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.680,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.174;4.blob,1.1,3108.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.345;4.blob,1.1,4040.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.440;4.blob,1.1,2404.iVBORw0KGgoAAAANSUhEUgAAAJMAAABbCAMAAABAgEf+AAAC5VBMVEUAAABHHUd/NH8xMTEYGBgIAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MOBgYGBg4LBATsX1/vYWEQBgYEBAtfX+xhYe8GBhAHAwPXV1fbWFgDAwdXV9dYWNuMOTn/Z2cIAwM5OYxnZ/8DAwiQOjr+Z2cEAgI6OpBnZ/4CAgSsRUXYV1dFRaxXV9gPBgbzYmJuLCwGBg9iYvMsLG5UIiIBAAAiIlQAAAEwMHdWVtQUFDJmZv0LCxs3NzfBwcH39/fp6emTk5MMDAxMTLwnJyf29va4uLhISEhiYmLu7u61tbVeXukmJl6qqqra2toEBARHR0f///9BQUEeHktjY/T09PSEhITr6+uMjIxERKlCQqMJCQlsbGzR0dGgoKBkZPccHEX19fWNjY0oKGRcXOQBAQKtra1EREROTsI4OIopKSm3t7dfX1/t7e0NDSESEiw6OjrExMSXl5cODg4yMn1TU85WVtYtLXAFBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRaoBAQECAgI0NDQ+Pj4REREKCgoGBgYgDQ0bCwsMBQX1Y2NKHh4NDSATCAikQkKoREQICBMiDg4FAgJGHBz2Y2MODiICAgUjDg73ZGQDAQHmXV1jKCgODiOLODjBTk4tEhIfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICAICAicPz+qRUUNDQ0DAwMcxKEiAAAD30lEQVRoge2aZVQUURiGLxiI3d0Nih0oKoINdmJ3YGKjYncLitidWNhiK6jY3d3d4m9hmZk7e+fbuzOXuTtyzj4/8GGc7+57OLs778y5CPHAwZF1MllyPXPIcXRgndQ3U4oUkqZ0SsW6iq6ZnFOnSSt6uvTMy+iaKUPGTM6CZs6SlXkZXu+nbNmdrZ9kAV6ZcuRkn+WUKVfuPOzDnDLlzZeffViPTPgbQLICBROxng6Z8DeAZIWcChubCX8DSFakaGIW5PN+KlY8MdP8rnfs2DPZsWMZ3G4hMwbcbiEzBNxuAStRgn3hkiWZR3G7VZqLa6nSrOu6lSlbjnEUt1vAyleo6MKaqVLlKm6Mo7jdQmYMuN1CZgi43UJmDLjdQmYMuN1Cxp+q7tVIw+0WMtmJeJZOdY8agFqmZi1P0nC7hUx2Ip6lU9vLG1DL1KmrMNxuIZOdiGfp1KsPqUUaNGykMLUjaid8fBsDahnPJk0VpnZE7YR3s+aA2rGTdGnRkmbG0LIFzSyD+6vehlq1bkMxgrbt/Np36GhS3F/1trjLRyeamdO5S9du3Xv0NDnur3ob8u7Vm2IEffr2Q8i//wD4f3Vj4CA3ihEMHhL/M2Ao50zDhtPMnBH9R8b/M2o030g+gWMoRjI24e80jm+moPETKEYyMeH9NMn0i06feyWTp9CMZKrfNP/pM7qaXKfPvbI4z/SaJRyBTMnsOX4Bc+eZVKfPvbI4z18gvhpktkBZnBcuEo9AZgMYijN3GIqzHTtJnOCQxRQziCWhNIPg13hFWxomPtiFTGDZ8hWS82u8kq1ctVp4McgE1oSFrF0nOL/Gi239BvGVIRPw2bip9eYtyFZs9dpGMcz2cI8dNgu1cxfNBIKDdu8JtXB7xYGIvTQzsXWf7/4DB22WCKFDh49QzETk0Qj8SdT9nhci/BjN4jkue6ap+z0v8NAYoRNlTlKMRPd7XuChMUKnTp+hGHeAh8ZxRJ6lGWfs3dd2REVHGx1Bwbnz5y8YnYEk5sL/lwldFDNdcr+MzO3K1WvCEbUGrSLnugd5kQVbsCzTDUTYzVviWWoNWsUs023yENSCpUx33O8iwu7dFy9jag1aRcYDj4eiijsdFC1YnunRY/GQZE+ePtNo0CoyngeKJu10ULRgeSaIFy+1mlrwTgdFC7aS6VWt1xpNO0ALpmZCb95qNe0oWrCVTO/eazXtEC3YaqYPHz9pNO0QLdhqJvT5i1bTjnkLtp7pq+s3jaYS2U4HRQu2kun7j58aTSWynQ5kC476ZeUa/PuPVlOHfKcD0YKN6iq0nQ4xsbF/bRhFgtjp8A8OlPDa4cG++AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.571;4.blob,1.1,1304.iVBORw0KGgoAAAANSUhEUgAAALoAAAA4CAMAAAB9qBIQAAABYlBMVEUAAAAqKio+Pj4aGho0NDQREREJFgkvLy8NDQ0FBQUKCgocRhwwdjAxMTEYGBgsLCwGBgYRKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyoraisBAQECAgI5jDkdRx0oKCgUFBQFCwU+mT4ICAgEBAQSEhIrKysJFwkQKBAJCQkLHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQCBQIfTB8xeDEXOhcGEAYOIw4KGAoNHw0iVSIucy4AAQADAwMyezIgUCAFDAUeSR4gICD///8bGxsTExMiIiIjIyP39/cfTU0dSUkECwsbQ0M8lJQ8k5MkWVkJFhYECQkaPz8xeno+mJgramoPJSULHBwsbm4+mZkSKysDBwcYPDwxeHg9l5cpZWUHEBALGxsmXV07kpI7kZEiVVUHEhImXl42hoYcREQDCAgJFxcBAgIXFxcNIA1n/2cLGwsIEwgOIg5k92Q9zdh6AAACKklEQVRoge2ZZXPCQBBAQ2qUulBNjUDd3QVK3d3dncr/L70ESEvIbXuS0uZ9CDuR5d3MJrM3Kwi/HpsoJihRoigmhU8nm6TzHWwp9lQlciRF1NPSzfL5ICMTdJstKxxmh9VzcvMYGIEhUM93FrAwAkOgXlhUzMIIDIF6SSkLITiqulSGiHmbnnp5BVMzLKp6pYio+nQNrUZCoY66Sy7k5BgDVd1tR3i0l6rRampQrKNeK9fxktTHoGA8aDX1KNZRb5AbOTnGwKhgNOioN8nNjN0wGBSMFh31ltY2xm4YCD6O7R3BQ0snIl8bcYJAvcsZPHTLiB5txAmwuvqVFCR3SL23tU8Q+gcQLm3ECai6XtM7ODTMRgoGUD34GoeaXrt9RD1ZPDrGRooDXp/ZBhbxzLh/guffAV9TEOP+SXrJ8NBUn/Kn0kuGh6b69IzyOzs3Ty9pbGiqh1hYXFpeoZ/2K1HquK0ehNW19Y3NLaIUAKLUcZ07kO2d3T3CFDii1HGdO4j9g8Oj4xOiFHhYFMzp2fnF5RVJBhAsCub65vaOxAkIi4K5fyAxAkP6ceS+rYtgoK5WvWT4PPdtXQQD9Qyl6h8Nn+e+rYtgoO5Qqp5rX/IdWDQCFpSQwq+rRNjfcOevT/CeAs88nWhO8J4CL7S0INCc4L0GOmlpQaA5wet7o2UFwprgmcHPBzK/eYKnJc4meFqsCR5V/vEEz0RIJ3gmQjrBMxFrghd3eH3vslBH7nXE0mkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.590;4.blob,1.1,1436.iVBORw0KGgoAAAANSUhEUgAAARUAAAASCAMAAABCQrrcAAACFlBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsMDAX19WNKSh4gICD///8bGxsFDQU8kzwSLBKkpEKoqEQTExMmXiYucS5GRhz29mMODgYiIiIFBQUSKxI+mT4DAwHm5l1jYygfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsDCAMVNBWLizjBwU4bG0M8PJQ8PJMkJFkJCRYBAgEWNxYzfjMxeDEbQ0M8lJQ8k5MkWVkJFhY4izgfTB8tLRL+/mcfHw0EBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU0gTQkWSTQ0FR8fDILCxwsLG4+PpkSEispZCk9lz0fTR8FCwULHBwsbm4+mZkSKyszfzNyci7Z2VgDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBA2hTYhUiEYGAr8/GY3NxYLCxsmJl07O5I7O5EiIlUHBxIAAQAxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lT23t0qVlTwmJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgLGgsMHQxZWSTs7F8GBgIJCRcBAQILGwsJFxcBAgIbQxs4ijgJCQTy8mJQUCABBAEyejIeSx6cnD+qqkUXOhc4iTgKGAoNHw0KGQoRKRESLRIADXafAAAB2ElEQVRYhWNgYGSiKqC2eQMCGJhZWKlqILXNGxDAwMTGTl0TqWseBycXNY3DAbh5eFH4DEx8/AJUtYHK5gkKUdM0HICbRxiFz8DEJCJKXSuoa56YuAQ1jcMOJHmkUPjAUJGWYaCqFdQ1T1ZOnnJDFBSVkLkCymjyKqoQWk1dA0wDPaApo0W5vUiAyuZp61Buhq6evoEhlG1kbCJjikOdmbmFpRUTOFSYrG0otxcZUNc8Wzt7yg1xcHRydnEFMtzcPTy9vHGq8/H18w8IBIdKUDDl1iIDKpsXEkoVY8LCIyKZmKKiY2Lxq4uLT0gEhUqSCFWshQMqm5ecQgVDUtPSMzKzmJiyc3KD8/Coyy8oLCouAYVKaRkVrEUCVDavvKKSUiOqqmtq6+rBzAbmRpkmYxzqmlta29o7wOWKUac7pbaiAGqbx9TVTakJPb19/QjehImTcKibPGXqNBANDJXpMjMotRUFUNs8ppmzZlNowpy5qPx5ONTNXwChgaGycFEDhZaiAmqbx7R4yVLqGggGy9zAwAibHDBUlq+grnXUNo+JaeUqapsIBKYyYLAamxwDU/YaTaraRm3zaAXWrgMDrPU0w/pFG6hqGbXNGxDAMGEjdQ2ktnkDAgD5jHpZkK7GqAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.609;4.blob,1.1,588.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAp0lEQVQoke3SVw7CQAxF0QECqbQhtAChQ6iB0Euo+98TfOYiIbEA3t8ZW5Y8shDvxAQST4BKMhWlqukoG6YFpzOcls2BeWnABWnDRVmCy7ICV50a59cbtKvRTafFh3anC1u9PhsGQ/FLPO4tRuMJH6Yzem5yFeEv6KX04ECu2LB26c3H7luf3u1B9XCET/IM6yF/5nIFb/cgykeooGw/xZf87wuJ3tcL1hUOgIwXKWsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.647;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492325399;4.rect,1.1,3.744,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.721,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.690,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.283,3.240;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.345;4.blob,1.1,4060.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.641,3.440;4.blob,1.1,2140.iVBORw0KGgoAAAANSUhEUgAAAKcAAABICAMAAACk2hWJAAACrFBMVEUAAABHHUd/NH8xMTEYGBgIAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQHBwOTkzwsLBJiYihlZSkOBgYGBg4UFDJmZv0LCxsqKhGUlDwICAMLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwCAgGKijg7OxgHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl5TUyJ0dC8eHktjY/QbGwuYmD4TEwhERKlCQqN9fTNKSh4GBg9kZPccHEVERByCgjUoKGRcXOQBAQIODgaXlz0hIQ1OTsI4OIpubixZWSSMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiw1NRaOjjkEBAGQOjr+Z2cEAgIyMn1TU84FBQKRkTswMBOsRUXYV1dFRaxXV9hWVtYtLXBeXiZmZikPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRarVDkl3AAADU0lEQVRoge2Z9VcUURiGBxQRu7sLLBADFRQ71m4M7EYxsTuwsbBBxe4CRexWFAtbbP1HZGd35tuz882dy8w3Luc4zw87z569993vcOZczrsjCGbg5W08I09e4xlaeHsZzzBrTh8fWfP55jeeZ9KcfgUKFpK8cBGCQJPmLFqsuJ9TS5QsRRBo/v1Zuoyf9iJNzJ+zbDmKFNPnLF+hIkWM6XNWqlyFIoZ2TjiNZKtajSSZdE44jWSr7luDJJp0TjiNZKtZiyba7Puzdh2anH/x/50Ca04Li9wCNAvMaPAPyH6pW6++kQxoFpjREOBvf23Q0EAENAvEAgP1BwcFydoouLH90qRpM/1x0CyUFtK8RUu9uaFhrVpLHt5GvLRt115vmkuzQKxDx04heoM7d+ka6lRbt+4O6dFTb5pLs8CMhl69nRP36dtPbwY0C8xo6D9AsoGDdEZAs8CMhojBQyQdOkxnBjQLzGiIHD5C0pGjRuvLgGaBGQ1jxoKPG6+9fsLESe4GzQIzl4Wwl83kqCnuOjV6Gnw+fcZMzYxZs2PcDZoFZi4LYS+b8Gibu86Z6/L5vPkLNDMWLlIYNAvMXBbCXjaLlyh06TLXBctXaEWsXLVaYbxbeHdExK5BNGfErF2nMN4tvDts6zcgamFhwULsE6qWe3D0CTXLGdAdqE3qEyrGwcZNcZu3bBUVugO1yX1CxbTZtj1+x85du0WH7kBt0CdQ42DP3n2CkJC4n3+HLuQ+gRoHBw7aX5MO0Y6lAPoEZtocTjxivxw9RjmUEugTmPFw3PH3PEE6lgLoE5jxcNJxf54S3xCdQUqgT2DGw+m4Mwlnz8WLTnQGKUsL9AnM+Dh/IS7p4iVRic4gZWmBPoGZp1CWFugTmHkIHaXFI+goLRYWFpokp1xmWC7iSirLeDGvbUh2NU16oIEZg2vXb8huXtuQ7eat284vw4zBnbSUu/ecbl7bALv/QPpmzBhEPHwU/PgJx0Ia0qOfMozNs4yo56YMhfHiJcsYJEe+ep2ag/pskMw3LFMl/W3su/cfTJoJ4+OnzwxTJetLJpwK5L99YGR8ZZka32zg5L99IA9LBOF72A+G8UD+2wfysEQQfv76zTCPgDwsySbrD8s8wH/YO/4CeCdRjCPkfVoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.513;4.blob,1.1,1188.iVBORw0KGgoAAAANSUhEUgAAAWQAAAASCAMAAABbyVR6AAABoVBMVEUAAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQVHHUd/NH8sLCwgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4ICAgiIlQAAAGcROgpAAABlUlEQVRYhd2YV1PCQBRGF4IiIBZib9jF3sDee8Hee++9i723X60QopmwM96b0UnCedg9LLPf3HyPS4j/odFqNXLP4PcwOl2A3DP4PUygPkjuGXwxGOWe4E9hTL5nweYQkYWGhXtPoEZLEWJhI0QnkVHR3240AMdXB/SSY8QWG8f/CTVaigALGy8+SkjkLcma/OvgaoJWcoo5VWxp6RkEZ7QUAZlsFq82G7dn53iF5OZhPkH50ErOL/CxwqJipNFSBJSU8mZ3lJV7pKKyijuprqmFf4AaoJVMo64ea1AaGpvsnDW3cHtrWzs2RNlAS+7o7EIanm5nj2fv7ZMcoUygJZP+AazhGRxyr8Mjo9IjFAm45LFxrOGZmHSvU9Mz0iMUCbjk2bl5pOFZWFz6WpdXJAcoFHDJZHUNa3jWNwjZtG5JD1Am8JK3d3aRBmSP3ef1wHFIjo5x11UAvOST0zOkATl3uni9uLwi1ze46yqAMYGfOm/vsAbj/uHHH59wd9WB/E+dzy+v8g7w/7zp5X7qdL1/CH9+AprMUeR5aNNkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.535;4.blob,1.1,1748.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA0CAMAAAAE725BAAACZFBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBCQoOehAAACdklEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWfgAAHjtgVmNmcnjAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.571;4.blob,1.1,3560.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.628;4.blob,1.1,588.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAAoElEQVQokY3MxxaCUAxF0ahYUMH2bIhdLNgVe8H6/78kAweemXeQlZ1kRSRISJBwBNSisW8XTwRFT6bk12nDhDNZgXN5uKDScFGV4LKqwFVlwTW7zv+NJt1K0m27A0u358BmfwDLcCT/xDXp8WTKwWxOLwyLg+WKXisX9tSGB9sWvWvS+yV9OIL66Qxf1BVO+Q58u4OPp/fLl69hXXoH5QOFRgyPzB9uYwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492325501;4.rect,1.1,3.754,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.731,1.3;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAOQAAABbCAMAAABUFdkfAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAADBElEQVR4nO2b124UQRBF22QT12syBoMDxgSTc4422cbm/38FuZG2Rppi99Z0ze0W6vOyo1YdyfXAy1ERwiSm9kwcyWA4U5fMZjhTl8xmOFOXzGY4U5fMZjhTl8xmOFOXzGY4U5fMZlQqI/buw964hjP7DxyE3riGN4emsTeu4czhI0ehN67hzbHj2BvXcObEYAZ64xrODAez0BvX8ObkKeyNazhz+gz2xjWcOXsOe+Mazpy/gL1xDV/mLl6C3riGM/ODy9Ab13DmysLi7s/ScmSu+ZbRcObqSvy5NoisNt8yGr5cvzGMvzdvRdaab/kMX24v3IHeuIYzd+9hb1yjgoLGB5ljGM6g8UHmGIY3aHyQuf6N+w/mMQEFjQ8yRzAePoLmcdD4IHP9G4+fLGMCChofZK5/Y/HpM2geBo0PMkcwnr+A5nHQ+CBz/RsvX61hAgoaH2SOYKy8xgQUND7IHMF48xYTUND4IHMEY/juPWZgoPFB5hhG+PARMkDQ+CBzDCN8Wt+AFIxWkNC+QjNSMIzw+ctXxyVbQUL7Cs1IwTBC+Pbdb8d2kNC+mpGCYfiCxgeZYxjOoPFB5hhGBcUeGhiGjzvCHhoYho8r2C8uGEbblRDSIYnYLy4YhuJKCOmQROwXFwyj7UoI6ZBE7BcXDKPtSgjpkETsFxcMQ3ElhHRIIvaLC4bRdiWEdEgi9osLhqG4EkLsScR+ccEwFFdCiD2J2C8uGIbiSggxJxH7xQXDUF0JIdYkYr+4YBiqKyHEmkSgIKGlif6MySHEmkSgIKGlif4MIITYkggWJLQ00Z/hHULsoYFh+Lgj7KGBYfi4lcr/SIH/604LIWlXIgUuqYaQpCuREpfUQkjSlUiJS2ohJOlKpMQl1RCSciVS5JJaCEm5EilySTWEJFyJlLmkFkISrkTKXFILIQlXImUuqYaQ7lcihS6phZB/JpEfPyOb+pf8AePn6IYaQv5+KcbUVuRXUL/kDxg/Rzf0EBK/FGN7J/I7qF/yB4yfoxtjsBvF/pu08AcmnD3i9gcTsQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.700,2.98;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAANwAAAANCAMAAAD15vA5AAAA8FBMVEUAAAAHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAcCAgGKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ08PBiJiTcBAQBubixZWSQ1NRaOjjkEBAEUFAgaGgsFBQKRkTswMBNLSx58fDJeXiZmZimAgDRDQxu/LpNhAAAAxUlEQVRIid2OxRKCUBhGL0qIIgZgdzd2d7fv/zYSC2YY3N2Y8Sz47n/YHAAsKJcb/A00YxMsR6QDCQxtEx7eSyQEAT7BbzNiIEikBAGhsLmSpWSFTAp0xEhUHykWTyS1TaW1T0bIko2CRS5P6VMolsqVaq3eaOpXq002ChYca0xHBaDb6w9U4xqOSCZBY8xPrEOazszHfLEkkwOX1XrjpLc73CEoUGRHvT8cMYcg4CScHf3lesNcgoD748eP5wtrBxLeH3O/lBsNHcRKAGkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.283,3.174;4.blob,1.1,2328.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.345;4.blob,1.1,4076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.584;4.blob,1.1,1808.iVBORw0KGgoAAAANSUhEUgAAAPcAAAArCAMAAACTru41AAAChVBMVEUAAAAbQxs4ijgAAQAECQRi8mIgUCACBgIDCAMBAwEyfTJTzlMBBAECBQIBAgEyejIeSx4/nD9FqkVRyFFn/2cnYCdW1lYtcC0xeDE+mT4XOhcTMBM4iTgQKBAVNBUIEwgKGAoNHw0FCwUKGQoRKRESLRIJFgkcRhwwdjA6jzoIFAgMDAX19WNKSh4gICD///8bGxs1gzWkpEKoqEQTExMUMRQ8kzwDBwNGRhz29mMODgYiIiIFBQUqZyoraisDAwHm5l1jYygfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECws5jDkdRx2LizjBwU4bG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYtLRL+/mcfHw0EBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUJFwnQ0FR8fDILCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysLHAsPJQ9yci7Z2VgDAwcYGDwxMXg9PZcpKWUHBxA7kTskWSQDBwcYPDwxeHg9l5cpZWUHEBAHEQcYGAr8/GY3NxYLCxsmJl07O5I7O5EiIlUHBxIUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lj0ZPRm3t0qVlTwmJl42NoYcHEQDAwg7kjsmXl42hoYcREQDCAhZWSTs7F8GBgIJCRcBAQILGwsJFxcBAgIfTB8JCQTy8mJQUCAGEAYOIw6cnD+qqkUiVSIucy4yezIFDAUeSR4GDgYyfDInYScraSsNIA0FDQUmXiYucS4SKxJk92Q4izg0gTQzfzM2hTYhUiE9lT0LGgsMHQwimdnLAAACgElEQVRogWNgQAKMTMwMZAMWVjYgyc4BBpzILAYubjw6aAd4eMGAD5mFFfALUGKNoBCQEBYBA1FkFoOYOB4dtAMSkmAghczCBqRlOCi2S1YODOSRWQMFFBTBQAmZhQUoM6nQ2WGDA8iqDrQLRgF9gNpAO2BggLrGQLtgQICKphb1DNPW0aWeYVQEevoGaCJ8hozUtMDImJqmUQ3o6ZugiZiamVPTAgtLK2oaRy1grW+DJmJrR1UL7B0cqWoekcDJ2QWZ6+qGJu/uAaE9vbyhIj6+1HWBnz91zSMOBAQGBYdA2XyhYZISONSFR0RGRYMYSpKm1HVBTGwcdQ0kDsQnJCYlpwAZvKlp6RmZONVlZefk5uUzMBRIylLZBYVFVDaQWFBcUlrGwFBeUYm9HQ4HVdU1tQx1kvVUtr6hkcoGEgeamlta29qBvSvDjs46POq6unt6+/oZJki6UtkBEydNprKJRIApU6dNnzETzGSeNVtyTigOdXPnzV+wcBGQwbN4CbXdsHQZtU0kDJavWLkKwZMVX41D3Zq169ZDWHM6qe2GDRs3UdtIgmDzFlT+Vhzqtm2HsXYYUtsNO3ftpraRZAH8o0t7Fu+ltoX79lPbRLIA/tElhgMHKRhNHMwA7+gSA4P5IdoOaw5acPjIQLtgFAwAOErV/ujQAbOOsQy0EwYGHD8x0C6gHTgpgqslw8BwyozaTfXBA06K4Jm4OX2Gfg6hM8gU4cUteVbyKP1cQl+w9xweSQ5JObo5ZFCB8zsG2gUDAy5QvU86NMDF0wPtgoEBly4PtAsGBPBdSR1oJwwIuCp5baCdMCCAovVMQxhQtp5pyAJqrGcagmB0PdMIAABICXH65PxyJwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492325601;4.rect,1.1,3.764,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.710,1.3;4.blob,1.1,2076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.283,3.202;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.383;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAADAAAAAzCAMAAADmSHsbAAACClBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtUIiKZPj4FAgJLSx58fDJWIyOYPj4CAQGAgDRDQxtnKiqCNTUJBASSOztCGxsyFBQBAAAODgYyMhQgICD///8bGxthYSdpaSsTExMNDQWTkzwsLBIiIiIFBQVeXiYsEhJtLCwjIyP39/crKxKZmT4sEixtLG03FhZ+MzN4MTEICAM0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXhBGhqGNjaVPDxiKCgiDg6LizhMTB9iKGIyFDJBGkGGNoaVPJUiDiJkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBApkKWSXPZdNH00LBQswExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxx6MTF3MDCFhTZSUiF6MXp3MHcoEBBwLS2VlT1BQRooEChwLXCSO5IbCwsdHQwbCxuKijh6ejIwMBOJiTgZGQooKBAFDAVj9WMeSh6VPT1CpEJEqEQvExOJNzcOBgYcRhxj9mMGDgYBAwFd5l0oYyg4izhOwU4SLRJn/mcNHw1U0FQyfDIuci5Y2VgKGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECQRi8mIgUCA/nD9FqkVbcf47AAABlElEQVRIiWNgQAWMTAykASZG0tQzs7CSpoGNnTT1HJxcpGng5uElTQMfP2nqBQSFSNMgLCJKmgYxcdLUS7BIwphS0jJEaJCVgzPlFRSJ0KCkDGeqqJLiNAYGNXUN0jQoamqRpoH2QJvEJMWgIydAlDpdPX0oy8CQSA1GUJaxiSkxGsz0zGFMC/xZz9IKTFnbwEVs7bSxqLN3AJGKjk7SzuhSLnauIMrNHQw8QGxPL28fXwYGGT//gMAgTMOCQ0BkqA8YhDEwuIdHRIZGAYWiY2LjsLkyPgFEJiaBQTIDQ0pqWjpYIiMzKzsHi4ZcC1Qn5eUXFBaBZbQ0i6VLHDE0lJahOonBI6zcp8ILIllZpY6unqO6BtVJIFBbVw+Tb0DXIGnXiM1nTdgEwUC5mcQCpEWWNPWtbS4kqW9vJrEI7OAmTf2gAZ1d3XC2ZY8mETp6+xDs/gkTCWuYNHkKaW6aOm06aRoYZswkUcOs2XNI1DF3Hoka5i8gUcPCRYtJ1LFkKYkali1fQZqGlatWk2jFmrUEFAAAbT1OKJdAcnsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.440;4.blob,1.1,2284.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.422,3.516;4.blob,1.1,1152.iVBORw0KGgoAAAANSUhEUgAAAWQAAAAPCAMAAADkgUU/AAABnlBMVEUAAABHHUd/NH8qKiosLCwgDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0MCAgIBAQGcPz+qRUVFRaxXV9g/P5xFRao+Pj4aGhoGBg9iYvMsLG4ICAgNDQ0FBQUiIlQAAAEZH748AAABfElEQVRYhd2QZVvDMBhFs3UMWXEbznDbcHcZ7u7uznAfNuBfs60L7VP6tH3zpQ3nQ3KaNjfpRciLwYj+J4wJW5A5WGQhoWGBFbUmlSLEwoaLViIio37daABfnw6EJUeLLSYWv1RrUikCLGyceCk+AVuiNQlyc4rgS042p4gtNS0dwUwqRUAGm4nVZuPmrOyAoJxcoj+gAL7kvPw/VlBYBDSpFAHFJdjsjtIyv5RXVHIrVdU1JD9AA3zJUtTWQU0t9Q2Nds6amrm5pbUNGkIL8iW3d3QCDU6Xs9s/9/QSR+gd+ZJRXz/U4AwM+sah4RHyCJ2jUPLoGNTgjE/4xsmpafIInaNQ8szsHNDgzC8seselZeIA3aNQMlpZhRqctXWENqyb5AF6R6nkre0doKlkl93Duu84QIdHsO1UoVTy8ckp0FRy5nRhPb+4RFfXsO1UwZhubmU/uLuHmjoeHnl/eobtpQ3G7X7R4tzXt3ctjtWGD4/nU4tzXV/fwscfXMZM9GH5En4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.535;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAMAAAAaPFxiAAACXlBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1ezMsgAAAB4ElEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cJEk5ABUfaWdZyF4jAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,2276.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492325705;4.rect,1.1,3.774,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.720,1.3;4.blob,1.1,2076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.345;4.blob,1.1,4116.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.571;4.blob,1.1,2160.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.177;4.blob,1.1,908.iVBORw0KGgoAAAANSUhEUgAAABEAAAHoCAMAAACYWfStAAABQVBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4GDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4H64UcAAABIklEQVRoge3SWzNCURjG8cVGRXQU5RRCISWtSMihHFJCJacoZ77/BzBpptV+cNWFGfP8Lvae/vPO3ntarxBNHZ1aV3eP+i0MRlNvn7m/pQxYrELY7A5VnIP1q2uoGYbt7vrNM6JmRhszY6qMN54zoYpXm7RNTZta3iV8M5prdk4QERERERERERERERER/XP+AJb5hUVMwSUsofAypsgKlqj0Q4nJVRxai2NZT2DZiGDZ3IKQ3N6Bsiv3oKTS+1AODiEcZWL6cJzOwkjuBD/mZ3kMp2cQsucFfUgWUzBSCuP5XJTxuZdXEK5lCcqNzEG5lRUodxKP9L5aw3c9fDubeBHLY/UJ0/ML/vOB1zccev/A8iturU7bW8tdVbirX/5+Vz8B3Lk/fj3YfqAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492325806;4.rect,1.1,3.784,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.174,2.88,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.730,1.3;4.blob,1.1,1992.iVBORw0KGgoAAAANSUhEUgAAANwAAABsCAMAAAA2TizGAAAB41BMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAeKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ2JiTcBAQBubixZWSQ1NRaOjjkUFAgaGguRkTswMBNLSx58fDJeXiZmZimAgDRDQxssVRp4AAADrUlEQVR4nO2bR1cVQRCFB8wZMSuKgogRc845AyaUIIoJMOecMeec008VhkW9wzTMbai50x77WzDziv7O61qwqHuKIOgiWdkuGkr45uiGEr45uqGEb45uKOGboxtK+ObohhK+ObqhhG+Obnj+Q7p1x2pcQ4kePXtBNa6hRe8+WI1rKNG3X3+oxjW0GDAQq3ENJQblDIZqXEOJ3JwhUI1raDF0GFbjGkoMH4HVuIYSI0dhNa6hxOgxWI1r6JA3dhxU4xpK5OeMh2pcQ4kJBYUtj4lFIXmZtRQNJSYVh4/JOSFTMmspGjpMnZYbPqfPCCnJrKVn6DCzYBZU4xpKzJ6D1biGpz3QIV/OMQwl0CFfzjEMLdAhX84lb8ydl48JcaBDvpwjGPMXQOfjQYd8OZe8sXBRESbEgQ75ci55o3DxEuh8LOiQL+cIxtJl0Pl40CFfziVvLF9RgglxoEO+nCMYxSsxIQ50yJdzBGPVakyIAx3y5RzByF2zFjM6Bh3y5RzDCNath4wY0CFfzjGMYMPGTZDSMZHB3/QWZIYBDCPYvGWrQnORwd/0FmSGAQwjCLZt73pv0cHf9JYZBjAMHdAhX84xDCXQIV/OMQxPe9gP9AxDx+3EQM8wdNzObBAwjKgrgYNF9GC/QcAwDK4EDhbRg/0GAcOIuhI4WEQP9hsEDCPqSuBgET3YbxAwDIMrgYNF9GC/QcAwoq4EDhbRg/0GAcMwuBI44NGD/QYBwzC4Ejjg0YP9BgHDMLgSOMDRg/0GAcMwuhI4oNGD/QYBwzC6Ejig0QM0+JsigOSM+MABjR6gwd8UASRnAIEDFj1gg78pAkjO0Aoc7Ad6hqHjdmKgZxg6rsfzL+Lgf2GpbTi42JzehoOLzaltOLjYnNqGg4vNqW04ONmc1oaDk81pbTi42ZzShoObzSltOLjZnNKGg6PNRWKG0rKQcvxNvtgxIxozZO0I2Ym/yRc7ZkRjhl27Q/bgb/LFjhlKOPo35/F4UqZi7760r6BHZVWbQnVNKvdIhKrKNoX9tQdSuUgCHKw71KZSfvhIKjdJgKPHWp/1UmpoTOcq6pQfP9HyqD956vSZ5ufZc80/ztddSPdSWly8VNHyuHzl6rXrN27eun2n5dPde+leSoua6vBxvykIHjx89Lgp/PTkaZpXUuNZ7XP5UP/iZevLq9dv0rmOLtlv35nK7z+wL5IEjQ3G8sdPpeSLJMDnui/GetnXb+SbJMD3H+384ucv6j0S4fef1udfRvdZEJkdASkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.345;4.blob,1.1,4124.iVBORw0KGgoAAAANSUhEUgAAAKgAAABZCAIAAAAl5/hfAAAABmJLR0QA/wD/AP+gvaeTAAALyUlEQVR4nO2dbUxT5x7An572lJcWKPVYSl94E0rrShAqFkeHuojlguFqvJqwCd3GJl8uuUu2ZfuwzA/bl5llWXSLsn1ZkHmTTa/OJUwzEQSj4gaWzW2uSGGEVimngqWlLS3t/VDHSsFy2p72UHh+6Yf2eTv/nn/Pv8/L//k/AECoYMuWtw8dukuhAAiF117PSCQNOt1pCgWAiqcADCvlcGRDQ+0UygAVTwESSaPR2GWzGSiUASo+1iAIIz+/Xqdro1gMai+/DhGJ1CjK0uvPUSsGVHyskUgaR0bOu902asWAio8pTGZaTk4d5XYeQMXHmLy8gw6H2WDopFoQqPjYIpE03r9/xuv1UC0IVHwMSUnJzcxUrQY7D6DiY0lBwWEc1z56ROVM7QJQ8bFjNQzfIRAIBAKBQCAQCASyAm+/veXu3UOkNMVmozZbU01NVuRNqdXio0e3AjiOjx4NDZLTp3WkNGW1us6fH2lslETeVHl5xq1bE5G3A1me0lJsfv6IUMgiq8E9e0Szs02pqcxIGsnKYp86VcnhJAD4xEeJxkZJV5fRYCBt0b2z0zA9PXfwYF4kjZSXZ/zxx/T0tBNAxUcDBgOpr89vayPHzvuYn/d+9dVQJNYeQWjbtvFu3oR2PmrU1mZZrU0sFsM/EUFoiYl0/xeKIgRzfRQVcT2e5uzslPCkKiriHj9ekZBA931kBC8NCYPGRsn58yM2m9s/saYm67vvqv1Tvv12dN++y0Ryffzyy6OffzY3NBR88MFAGFKVl2dotWanc973ESqeZNLSmHV1OXV1lwLSe3sflJX9zz9laspJMHeBtjZdc/PmMBSflMQoLt7w2We/hloRQpRXX5WOjx9GEFo0Gufzk93uI0olL9SKKhX/ww+VND+hYOeOZBobJWfO3Pd4vNFo/OHD2R9+GA+ji1dennH79qQ3KkJBAMjNTfF4muVybvQuUV+fj+MaJjOEJxbDEk+dqhQIFk0qwCeeTA4fLtBq8bt3H0XvEhcujDKZ9JCmb5VK3vi41WhcNKkAFU8mpA/fl2K3u7/+eviFFwqIVykrg8N3CAQCgUDWDXSqBVhHJPOTvV6vx0X9/ikAe/WxhK/i77u+j5kW0Zo6NSw47kDCY1fbLvV5NdVSABDqEw8ddyLk5hs3RXtE4n+IqRYkFMVnZbEzM5P7+kzRk2bN45h03P/v/eI3i6kWJBTF+zvuQAAAXDlX3iL3T1EqldeuXbPb7RMTEydOnGCz2Utr6c/qhc8LkzKSYiXmIuRybkuLHBBfj/c57pw9q4+mVPEBDaFtLNsoVotZQtbMyMxCemFhYVdXV09Pz/79+wUCwUcffZSXl1dbWxtQfeLGBABAsEMw/PUwKfLQ6bSlq8But8d/LQ5BaGVlG9VqsVDIGhmZAcQV/8wz6UwmcucOToqscQqCInwVX1QlYqYx8X58qH3Iorcs5L7//vvj4+N79+51u90AAIPBcOnSpV27dnV1dfk3MmeZs0/YOTIOWVJpNIVLV+hbW38bGMABACiKqFT8qipRWhqzvx9vbx/S6y2AuOIDHHfWJ4WaQkyBjXWMGa8aXTZXQG5NTc0nn3zi0zoA4PLlyziO19bWBigeAOCccibxSDP1Fy+OdnYGxkqcnLT73mg0hQoF1tExdvWq0eYnMyHFQ8cdH6afTOxstmi3CGWjD3of2Mb/XuhMSkpisVgPHz70L280GjEMW9qOx+2hJ5I2dTY15Xz8eC4g0e1+Mk3000+m7Gz27t0iNhvt7X0w/pfMhBSvUGA2m+vevSmyZI1TzFqzedCMlWDiarFgp8Citxi7jaY+EwDAbrfPzs7y+Xz/8gKB4MqVK0vbQVmoY9JBllTBTb1Wax4cNJeUYNXV4p07BXq9pbvbSHRo9uabxQcOROTKv/bgSDlFrxdVHK9YSDl37pxOp2MwnjxLarXa6/Xu3r07oCKNTnvN+Zr833JAEhiWmJ2dEvBKTl7mkZZKOa+/XnTcT+YV2l3quOPPv/LyWisrUWQ9zv6y/DZJyWQyu93+/fffq9VqjUZjNpsvXQr0tQUAcOXcZm8zVrLMX0BsILqxq7Y26913S4MUOLRp06nKSoQWFb/S+OLZZ5+9fv263W6fnJw8efJkamrq0jJF/ylqMDbQouOGS5yV/+PLyni9vQ+CFEhPSDDZ7R7owgnAjRs3VCpV8DIFDQW/nvzVGx033NiRxGAcr6h4XiikWpD4IGdfzmHDYWZkm15XBQiNVoph0MoTIV2W3mBsEFWJqBYEEluEzwuzakmIagGBhE+k80e+GA3z83HeVVl/RDr4zs9Pfeut4qQkuOs2ziCk+JycHK/XK1yu6z4wgBsMtpdeKiRbsPiDxNhUwQkpnlZCAv3ECdXS7XwhPPEOx/LTy2fP6jdvTo/qTsG4gMTYVMEJKZ6W0zl/5w6+fXtGQDohxSMIAgCwWCzL5s7MuH780VQFRykAtLXp6uqyI4xNFZzSUkwm47S3DxGvcuvWRHHxhsTF64GBipdzuS3ywPUDGo3mcDhcrsAV6AX6+3GplBPJF5Zz5S3ylrCrrxJIiU0VnDDiad27Nz0761YoNvonPlE8QqMpebz3FIoWuZyFogE1h4eHk5KCOQ4MDz8GAEgkaf6JdBodRdCAFw0smuxBaIiSp3xP8V6LvIWFkhYVjioij00VnPDiaXk83r4+U4C1Z6AIouLzq0SiNCazH8fbh4b0TzHpQXA45i2WOT4/2T9RU6hR8pQBJVt/ax3ABwAAKIKq+KoqUVUaM60f728fatdb1oJDX1ub7o03irOzU/78c2bl0iGiVotYLPTcuZBv1K1bE1VVog0bEs3mJx01hqawUIFhHWNjV41G29ON+YrMzrpTUhaZioujFzuXnLM1aZ/0vdEUahSYomOs46rxqs1F8el7JBJhbKrgLBtPiwgGg81gsCmVvI6OMV8K3eP15qSkyNLTWQzGtNNpCVf3O3ZkWiyuwUHzQopz3ml1WWdcM/6vufknTkIerycnJUeWLmMxWNPOaYsrZDOzaklOZrzyivTTT0k+dCgtjfnFFzveeadPrw/nXjGZ9IoKfleX0feRoTWbB83mEgyrFot3CgR6i6XbaOwzhbxrgsmkW62LfjTBTb3WrB00D5ZgJdXi6p2CnXqLvtvY3WfqC+MrrTbOnLl/7Fi5Uskjd/PJwYN5ZrNjqV8lQW7fNh04kJubm/K3e7UXgAEcH8BxKYdTLRa/WFAQquIRhMbhJASEZgtu6gEAXuAdwAcG8AEpR1otrn6x4MW1ofiF2FTkKj7CeFoWy9zvv0+Vl2eMjDyl8yFkhdy7FghYra2VYvEyG0eII2StnUX9MGJTBYeUeFplZbyPP97OYNDAshM4BlvIXS2ZjPP48dz4uDUSsQy2MI3YKmRpbComEwmIVpuYSKfTaURyAUnxtLRanE5HfL8echZXlMqMa9eM0PlqgYXYVBcujPpSenr+udQJ+uWXu7/88o8VcwEA9fX5n3/+e4RSuVye/v7Jbdt4Wq2ZBN+ZLVs21NcXHD36o8OxrvfZBEcq5bDZgTNjIyMzvoF18NzVSGZm8rFj5TJZOtWCQGKLVMopKlrv63IQCAQCgcQfKBttsjVlBXUnknO5nz33XOly+4EhC8TMMYsgK3jZeuY86ZvTsRJM//QgKCa73WCz1efn356cdM7DEd3yzM15Nm9OLynB4iacjGiPqGm2aS3s+qEaUg4NJIuVJ5MNnYa56bm8aLoTrRNi4JhFnJUV7533Dn01JIm+8+iaJ9qOWeTDLeI2e5pTwj3qDrJAhIcGkgihLVR2kz13fy6CIg96gm2Uh6yIyWTfvz8XRZEequ8k0QVjXZtO0hA/NmoV09ama4ijO5nMTz7iPsIL/ag7SABhHxpILkR3y7qsroztGews9thfbpqQ8LBaXdu3Z2RlsTvi5U7m1+drcA1CnjvRuoV0x6wwCOHaoxdG6Ux68OlbCBHCODSQdEIIjOBxe1I3pfK28vTfxMmk42rF7fZs2pS6dSvvG+ru5P8B86GgSVqFjtoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.440;4.blob,1.1,2144.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.412,3.513;4.blob,1.1,1124.iVBORw0KGgoAAAANSUhEUgAAAW8AAAASCAMAAACjKa+NAAABm1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFABAQECAgKANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoxMTE+Pj4XFxcGBg9iYvMsLG4KCgoNDQ0FBQUiIlQAAAGJQfSPAAABaUlEQVRYhe2OZVPDQBRF0zZIg1txgluLuxYo7u7uToHi7vxsOikZ0s0y7FtgOpvJ+ZCc3Je5czlOR0dH5w8xGH294N8x8X6I+QcEfiakhmtRYhaCkCQ4JBQ3xmiATGcSEx+GWniEfCQ1XIsCsxCJRlHRmC0xlljC1ewSx8ejlpCYxMEM16IgWUiRVRQ979Q0Ub0lPQM8nzkys1SWnZMLNFyLgrx82ay2gkJJiopLVL+VlpUDx2uEikqokVJVXWP1WG2d6ljf0Ajt0wb2pmagwWlxtKJRWzt1G+N0dEINTlc3EvT09tG3sU3/ANTgDA4hwfDIKH0b24yNTwANzuTUtHcwM0vdxTxz81CDs7Do9blkWabvYp2V1TWgEbIubMi6adtSXrZ34DM1w+7ePtAIOXA4ZT08OnY/XScSLu707Bd7mef8AmpkXF59+fWN+3F7J3FPM1LnJx4en5Dk+UXi1SdzNI/z7f2bywdZ7VF56ltUggAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.535;4.blob,1.1,3376.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.362,3.584;4.blob,1.1,1584.iVBORw0KGgoAAAANSUhEUgAAASkAAAAfCAMAAACME8u0AAACTFBMVEUAAAAECQRi8mIgUCACBgIDCAMBAwEyfTJTzlMBBAECBQIBAgExMTEYGBg/nD9FqkVRyFFn/2cnYCdW1lYtcC0xeDE+mT4XOhcQKBAVNBUIEwgKGAoNHw0FCwUGDgYDBwMUMhQyfDInYScraSsMDAX19WNKSh4gICD///8bGxsFDQU8kzwSLBKkpEKoqEQTExMmXiYucS5GRhz29mMODgYiIiIFBQUSKxIDAwHm5l1jYygfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwuLizjBwU4bG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhY4izgfTB8tLRL+/mcfHw0EBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSU0gTQkWSTQ0FR8fDILCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKyszfzNyci7Z2VgDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBA2hTYhUiEYGAr8/GY3NxYLCxsmJl07O5I7O5EiIlUHBxIAAQAxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lT23t0qVlTwmJl42NoYcHEQDAwg7kjsmXl42hoYcREQDCAgLGgsMHQxZWSTs7F8GBgIJCRcBAQILGwsJFxcBAgIbQxs4ijgJCQTy8mJQUCAyejIeSx6cnD+qqkU4iTgKGQoRKRESLRINIA0OIw5k92R/Bf8cAAACEUlEQVRogWNgIB4wMjEDSRZWMGBDZjGwc+DRMXQAJxcYcCOzgICHl1SD+PiBhIAgGAghsxiERfDoGDpAVAwMxJFZDOSEFBhISIKBFDJruABpGTCQRWYxkB1SIxCMhtQooA2Qkx9oFwwVoKDIONBOGCpASZk09SqqarRxyCAD6hqaaCJa2jqkGaGrRzXXDGagrqGPLmRgSJoRRsYm1HLNYAamGmboQuZiciQZYWFpRTXnDCCwtrFF5urYocnbO0BoRydnmBCrmCRpdri4kuOywQbc3D08vaBsbm8fMVEc6nz9/AMCoeygYNLsCAkNI9N1gwqER0RGRccAGVyxcfEJiTjVJSWnpKalg5kZmSTakZVNvvsGFcjJzctnYCgoLJLFr664pLQMRJcbkGhBRSWZLhtcoKq6praunoGhobEpsxmPupbWtvaOThCrq5tEK3p6+8h332AB/RMmTpo8BcycqjBNbLo3DnUzZs6aPWcumMk9L5ZUW+YvINd9gwcsXLR4CYInIbIUh7ply1eshDJXia0m1ZY1a9eR7rRBBtZvQOVvxKFu02Y4c8vWqaTasm37DlK1DAmAMiaMCXbuIt3I3XsoctFgBShjwhigYS8rfZ0ziAHKmDA62Ld1P52dM1SBxIGBdsEoGAWjYBSMArLAQUF4W3R0vg8vOCgInxwfDSm8IFGQC8YcDSm84NBhOBMcUgB2b1oGFlK7hAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492325916;4.rect,1.1,3.794,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.740,1.3;4.blob,1.1,1992.iVBORw0KGgoAAAANSUhEUgAAANwAAABsCAMAAAA2TizGAAAB41BMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUHBwOTkzwsLBJHRx1/fzRiYihlZSkqKhGUlDwICAMeHgyYmD4QEAeKijg7OxhWViNxcS4AAQFTUyJ0dC+MjDk4OBckWVk8k5M4iYkaPz8jVlYGDg4bGwsTEwgtLRKSkjsWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJCQQpKREJFxcECgoODgaXlz0hIQ2JiTcBAQBubixZWSQ1NRaOjjkUFAgaGguRkTswMBNLSx58fDJeXiZmZimAgDRDQxssVRp4AAADrUlEQVR4nO2bR1cVQRCFB8wZMSuKgogRc845AyaUIIoJMOecMeec008VhkW9wzTMbai50x77WzDziv7O61qwqHuKIOgiWdkuGkr45uiGEr45uqGEb45uKOGboxtK+ObohhK+ObqhhG+Obnj+Q7p1x2pcQ4kePXtBNa6hRe8+WI1rKNG3X3+oxjW0GDAQq3ENJQblDIZqXEOJ3JwhUI1raDF0GFbjGkoMH4HVuIYSI0dhNa6hxOgxWI1r6JA3dhxU4xpK5OeMh2pcQ4kJBYUtj4lFIXmZtRQNJSYVh4/JOSFTMmspGjpMnZYbPqfPCCnJrKVn6DCzYBZU4xpKzJ6D1biGpz3QIV/OMQwl0CFfzjEMLdAhX84lb8ydl48JcaBDvpwjGPMXQOfjQYd8OZe8sXBRESbEgQ75ci55o3DxEuh8LOiQL+cIxtJl0Pl40CFfziVvLF9RgglxoEO+nCMYxSsxIQ50yJdzBGPVakyIAx3y5RzByF2zFjM6Bh3y5RzDCNath4wY0CFfzjGMYMPGTZDSMZHB3/QWZIYBDCPYvGWrQnORwd/0FmSGAQwjCLZt73pv0cHf9JYZBjAMHdAhX84xDCXQIV/OMQxPe9gP9AxDx+3EQM8wdNzObBAwjKgrgYNF9GC/QcAwDK4EDhbRg/0GAcOIuhI4WEQP9hsEDCPqSuBgET3YbxAwDIMrgYNF9GC/QcAwoq4EDhbRg/0GAcMwuBI44NGD/QYBwzC4Ejjg0YP9BgHDMLgSOMDRg/0GAcMwuhI4oNGD/QYBwzC6Ejig0QM0+JsigOSM+MABjR6gwd8UASRnAIEDFj1gg78pAkjO0Aoc7Ad6hqHjdmKgZxg6rsfzL+Lgf2GpbTi42JzehoOLzaltOLjYnNqGg4vNqW04ONmc1oaDk81pbTi42ZzShoObzSltOLjZnNKGg6PNRWKG0rKQcvxNvtgxIxozZO0I2Ym/yRc7ZkRjhl27Q/bgb/LFjhlKOPo35/F4UqZi7760r6BHZVWbQnVNKvdIhKrKNoX9tQdSuUgCHKw71KZSfvhIKjdJgKPHWp/1UmpoTOcq6pQfP9HyqD956vSZ5ufZc80/ztddSPdSWly8VNHyuHzl6rXrN27eun2n5dPde+leSoua6vBxvykIHjx89Lgp/PTkaZpXUuNZ7XP5UP/iZevLq9dv0rmOLtlv35nK7z+wL5IEjQ3G8sdPpeSLJMDnui/GetnXb+SbJMD3H+384ucv6j0S4fef1udfRvdZEJkdASkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.345;4.blob,1.1,4124.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.440;4.blob,1.1,2084.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.402,3.516;4.blob,1.1,1052.iVBORw0KGgoAAAANSUhEUgAAAWQAAAAPCAMAAADkgUU/AAABg1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAGdLRzRAAABS0lEQVRYhe2OZU8DQRCGt+0hPaRocVpcWty1QHF3d3eKu/x02l4XNsuF7Ox9INPwfJh5djZ58xLix2Qm4Y5FieAsMio6dBE1vRQWqxrDXWLj4r/cbJKsjgeLYuMtIZF+ippeCoNVTeJPySnUUu1p8NbISFcyeMvMyiYw00thyFFzqToc2nbmhYTkFxipj4PCoh9WXFIKNL0UhrJyai53RWVQqqprtEttXb18ecw0NEJNlKbmFpdmrW3abu/olKmIH09XN9Dg9Hh7g7uvXzoCOQODUIMzNByYI6Nj8hG4GZ+AGpzJqcCcnpmVj8DN3PwC0OAsLi3758qqdAB61tahBmdjk5At+7Z8AHZ2dveAJsi+ekD10H1Ejk+MtETO6dk50AS58PqoXl5dk5tbIy2xc3cPNTEeHr/96Vmu2z+/8/L69tcVwh/f+wf7/AQgf0V0ZCbWBAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.535;4.blob,1.1,1748.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA0CAMAAAAE725BAAACZFBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBCQoOehAAACdklEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWfgAAHjtgVmNmcnjAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.573;4.blob,1.1,172.iVBORw0KGgoAAAANSUhEUgAAABIAAAAPBAMAAAAbqIIhAAAAHlBMVEUAAAABBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwW+kGwRAAAAHklEQVQImWNgoCsQUlJShhCuoaFhEKKio6MTQsABAJ6LB5+j5yPVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.592;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAARYAAAAdCAMAAABYI7MKAAAB0VBMVEUMDAX19WNKSh4AAAAgICD///8bGxukpEKoqEQTExNGRhz29mMODgYiIiIFBQUDAwHm5l1jYygfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwuLizjBwU4bG0M8PJQ8PJMkJFkJCRYBAgEWNxYzfjM+mT4xeDEbQ0M8lJQ8k5MkWVkJFhYtLRL+/mcfHw0EBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSXQ0FR8fDILCxwsLG4+PpkSEispZCk9lz0fTR8FCwULHBwsbm4+mZkSKytyci7Z2VgDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBAYGAr8/GY3NxYLCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhK3t0qVlTwmJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAhZWSTs7F8GBgIJCRcBAQILGwsJFxcBAgIJCQTy8mJQUCABBAGcnD+qqkUXOhcKGAoNHw0xMTEYGBgNIA1n/2cIEwgOIw5k92RIQoU2AAABjElEQVRYhe2WRVMDQRBGFzrB3d0SEtwJEtzd3d3d3d01AX4tZJIqGGo2t8xsVeZduru6D1+9w+wKgo0tcGRyO2wWwN6BURQpIZM7YrMATs4ujLJICFe5GzYL4O7hySgLRby8ff6Ovn7/9v4BxhoYFIyqABASSiMYW8LCIyKjTL1CGa1Si9zFxMbFJwDSkpiUTCkcQ1JS09IzMn8aTVZ2Tq5W9C4vv6CwqNigBUpKaYVjSll5RSVAVXVNrfm7uvqGRoOWpmYqsdjS0trW3tEJ0NXd09tn5q5/YHBoeMSgZXRsnFY4VkxMTk3PzKJ2bn5BtagUuVtaXlldW0dvC8DGJq14rNja3tn9nfb2D0TuDo+OTwwVaTk9O7d4MLZcXOLzlcjd9Y2xIi23d/cWjCRVHjQIBWmHtMDjE808EkGtQjyTdgLtMNLh5RVB/FxbsRZzcC1EuBYiXAsRroWIdWt5ezc1Oj3+g8e1IHT6D2zBtSC0eg224FoQn1/4gmshwrUQ4VqIcC1EuBYiXAuRb2DKndh6jhuwAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492326015;4.rect,1.1,3.804,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.781,1.3;4.blob,1.1,1276.iVBORw0KGgoAAAANSUhEUgAAALIAAABbCAMAAADgHy8QAAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAACdUlEQVRoge2aWU8UQRSFa0QFxKUZUEBBFBwHN0QBd8QNUFHB7f//FWMn462kq0+fSrpPRVLnpSs355vcB16+XJxrSu9UYyUBkXyBvHJeuSUi+QJ55bxyS0TyBfLKeeWWiOQL5JVzusrYaW6mJWDOnB2nZloCZ2KSm2kJmHNT56mZlsC5cJGbaQmYS8U0NdMSMP1ihpppCZzZy9xMS8BcmeNmWgJmfoGbaQmYq9e4mZZAWVy6Ts20BMxycYOaaQmYmyurfz+3BmUW/VlCAub2sPysFWXu+LOEBMrde/3ye/9BmXV/lo5AebiyQc20BMyjx9xMS5yMsBpjPQUBw2qM9RQEDqsx1uue2NxaRjVWY6wnILafwB6rMdbrnnj6bIBqrMZYr3ti9fkLVGM1xnoC4uUr2GM1xnrdEzuv11GN1RjrCYjhLqqxGmM9AfHmLaqxGmM9AdF/976+xWqM9RSE+7BXX2M1xnoKwu0ffKytVdQm9HK+7igI9+nzYe3KFbUJvZyvOwrCuS9f6zauqk3o5euOgkBhNcZ6CgKG1RjrKYiTkfgrkIKAbPwVSEFgNv4KpCCqrKdU8VcgBRFgPaWKvwIpiCrrKVX8FUhBVFlPqeKvQAoiwHpKFX8FUhBV1lOq+CuQggiwplTxVyAFEWBNqeKvQAoiwP5TqvgrkIIIsiOlir8CKYggO1IqSm1CktMd0aRUlNqEJKc7okGpOLUJSU53BFaq+CuQgoBsvLIoiHbYnBw//+F/1uaVWyKSL5BXziu3RCRfIK+cV26B+HZU5jj8sp/DPSnR+17mhwu+7OdwT0r8/FXmtwu+7OdwT060+HcmIP4AeYERCHtzQbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.750,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.172,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.381;4.blob,1.1,3448.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,700.iVBORw0KGgoAAAANSUhEUgAAABkAAABLCAMAAACycdytAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAA/ElEQVQ4je3TyU4CURBG4cugjDJcUBFknkFFwQkFnN7/nSRsflPdZ0FYmVCrTk4q3enK59x2Ig4mGoMQPzkND4lkClbSmSyUsxy9P1+AUPRpKCVfhnLuL6Bc+gqUq2qNvu26TqWRpNKstii1O10o2V6flgZDKnvMiO7ixpMppZtbKncZ+pludk/lwY+gzP2Clh4bVJ7wNs8zKi+vEBLLNyjvfgUltaZrbj4gfH7Nw8P3Og4r5R8IfyYS8rQb2TbKZdsol22rXLatctm2ymXbKJdtq1y2rXLZtspl2yqX7YBy2bbKZdsql+2Actm2ymU7oFy2D1B+tL2b/2r7F7ABGYXMynj3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.573;4.blob,1.1,1056.iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABklBMVEUAAAAxMTEYGBgqKiosLCwBAQECAgIoKCg+Pj4UFBQICAgNDQ0EBAQBBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwUaGhoFBQUgICD///8bGxsTExMiIiIfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIvLy8NIA1n/2cIEwgOIw5k92QDaUJdAAABP0lEQVRIiWNgYGBgZGIgBjCzwFiDVwMrGxgQr4GdAww4idbAxQ0GPEPZSYQAHg28fGDAj8zCq0FAEAyEkFkgDWysODQIi4CBKDILqIGDQ4wkPwADRZwohUMfSEhKkapBmjQNMpJoYSkrJ4/MVVBE06CkDKFVVNUgDHUNTS1tqCS/jq6gAA6b9PQNDI3ALGMTUzNzCyCDz9LK2sYWp9vs7B0cnZwhbBdXN3cGBg9PL1H8/vH28fUDUv4BgUHBIQwMoWHhEZF4lEdFx8TGxTMkJCYlp6SCRdLSMwQzdXAoz8rOyc3LBzIKCouKEcIlpWU4NJRXVFaBGdU1qBK1ODTU1eNxLXLGJAogZ0yiAHLGHNQAWPaykqQBUcwQq6EBVszgLZcam2BRSWRh3NjUTJoG2yY+0jS0tMJYQ6HKGixOAgDz5y6B+533lQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.609;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.647;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492326118;4.rect,1.1,3.814,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.595,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,1.3;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAAKcAAABbCAMAAAAhmGW8AAABAlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sHBweTk5NiYmJlZWUqKiqUlJSKioo7OztTU1N0dHQbGxuYmJhKSkpERESCgoKXl5chISFubm5ZWVk1NTWOjo4EBAQFBQWRkZEwMDBeXl5mZmYEBAEFBQICAgGZmT46OhcYGAofHw0LCwUPPEAcAAACW0lEQVRoge2aSVNUQRCEG0FxdxzcRUdBRFzAfVdwQ1kUFfj/f4XwXeoNWTFkB3RWDHZeXkdVft11mENV1KS0l0aO7GkJIGJerXVGEzGv1jqjiZhXa53RRMyrtc5oIubV/6nOqv1rdIyLaQnU0WPjVExLODp+gotpCdTJU6epmJZwdOYsF9MSqHOd81RMS6C6nQkqpiUcXbjIxbQE6tJlLqYlUFeucjEtgbp2nYtpCdDkjZtUTEugep1bVExLoG5PTf/73JlpNNmOBRKou7PN516n0Vw7FkiA7j/oNt+HjxrNt2NxBGhh6jEV0xKoJ0+5mJYYNrFdv/kUBIrt+s2nIByxXb/5yhPPnvcgx3b95hMQL15iku36zVeeePV6BnJs12++8sT0m7eQY7t+8wmId+8xyXb95itPfPg4Dzm26zefgJhdhBzb9ZtPQCx9ghzb9ZtPQHQ/f9mVYrt+8ymI9PXbrhzb9ZtPQaTl7z/6czAJeKfUng4URFpZXeuvEyYB75Ta04GCSGn9Z1+ZOAl4p/Z0oCBAbNdvPgWBYrt+8ymIYVPujkFDIJu9Y5AQDpu7Y9AQyGbvGCSEw+buGDQEsrk7Bg2BbPaOQUI4bO6OQUMgm7tj0BDI5u4YNASymTsGEQFs7o5BQyCbu2PQEMhSk4A3E5Qj3AmEmgS8maAc4bHcJODNBOUIh83dMWgIZPM7fAVxMGzV4dew/F+x1rkfIubVWmc0EfNqrTOaiHn1ENX5a6PRb/9kdwz2FSfSyJ9Gf5N7sjsG+4oTaXOr0XZyT3bHYF9x4kB+OwJiBz4dATKcF9M+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.760,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.383;4.blob,1.1,1324.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACClBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtUIiKZPj4FAgJLSx58fDJWIyOYPj4CAQGAgDRDQxtnKiqCNTUJBASSOztCGxsyFBQBAAAODgYyMhQgICD///8bGxthYSdpaSsTExMNDQWTkzwsLBIiIiIFBQVeXiYsEhJtLCwjIyP39/crKxKZmT4sEixtLG03FhZ+MzN4MTEICAM0NBUDAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXhBGhqGNjaVPDxiKCgiDg6LizhMTB9iKGIyFDJBGkGGNoaVPJUiDiJkKSmXPT1NHx8LBQWBgTRZWSQUCBQfDR8KBApkKWSXPZdNH00LBQswExODNTWROztZJCQcCwt/fzMwEzCDNYORO5FZJFkcCxx6MTF3MDCFhTZSUiF6MXp3MHcoEBBwLS2VlT1BQRooEChwLXCSO5IbCwsdHQwbCxuKijh6ejIwMBOJiTgZGQooKBAFDAVj9WMeSh6VPT1CpEJEqEQvExOJNzcOBgYcRhxj9mMGDgYBAwFd5l0oYyg4izhOwU4SLRJn/mcNHw1U0FQyfDIuci5Y2VgKGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECQRi8mIgUCA/nD9FqkVbcf47AAABkElEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS7BIwphS0jKE1cvKwZnyCoqE1Sspw5kqqiS5TE1dgyT1ippaJKmnNdAmLRkx6MgJEKNMV08fyjIwJE69EZRlbGJKhHozPXMY0wJvRrO0AlPWNnARWzttLOrsHYCEoqOTtDO6jIudK4hycwcDDxDb08vbx5dBxs8/IDAI06jgEBAZ6gMGYQwM7uERkaFRDAzRMbFx2JwYnwAiE5PAIJmBISU1LR0kkpGZlZ2DRX2uBap78vILCotAQlqaxdIljhjqS8tQ3cPgEVbuU+EFlqusUkdXzlFdg+oeEKitq4dKN6Crl7RrxOarJmyCIKDcTFpR0SJLkvLWNhdSlLc3k1bQdXCTpHxwgM6ubjjbskeTsIbePgS7f8JEguonTZ5CkoOmTptOknqGGTNJUz9r9hzSNMydR5r6+QtIU79w0WLSNCxZSpr6ZctXkKR+5arVpFmwZi1+eQAQ6U4oJ+35bgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.440;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABICAMAAADbCwd4AAACQ1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRarok1fXAAAC9UlEQVRoge2ZZ1cTQRSGFxBj7703iogaFHusUeyiUbE37LFhBxV7b6CIvSuKDbvY9acpy+7eZefOZBxnd46yz4fkyWHu5D05ZM67G01zg7h4V7aVRHyc6gROEhIsrZNYV2EQjEC9+g1Mb9hIZRKMxk2aBgxt1ryF0ihsWrYKxF6kjNZtVCdg0LZde9URGHTo2El1BBM4Ryzr3EVRFgI4RyzrmthNXZ6awDliWfceCvPEpGcv1Ql8fHz+NaCbYyaHpGTRSejmmMkhOUlwELo5Yikp4olSUy3tndZHcBPo5qSl9+3XX3BbLZgxYKDpmYMEN4FujtjgIUPTRdMNGz4iaGho5CjBTaCbYyaH0WOCsRehQDfHTA5jxwkOQjfHTA7h8RMEJ6GbYyaHrImTBCehm2Mmh8lTeFZNnTbdadDNMbMthFk2M7JnOnVWZDbP5Jy5OU6Dbo6ZbSHMssmMhJw6bz7X5IKFhEE3x8y2EGbZLFpM6JKlPIPLlq8gjHeEdyKcuxJRHnJWrSaMd4R3IrRmLaI+PrUJaOSYqQYaOWY8QPuWbbZGjhmVdeujGzZu0hXat2yzN3LMaGzekrd12/YdukP7lm22Ro4ZlZ27dmtafsGeWOv+EmjkmFHZu6/qsXC/W7EMoJFjRuNAwcGqp0OHXclkAY0cMzpHqj+7oy7FMoBGjhmdY9X/d8f1F5JODxJo5JjRORE9mX/qdJ7ukk4PsvZDI8eMxZmz0cJz53WVdHqQtR8aOWbeQtZ+aOSYeYpA7fcQgdrv41PrKCq+wDDlXCxhGRv3+rppl0rNm+qYEVy+ctVy9/q6Zdeu3zDeDDOCm6XFt24b7l5fB7tz13xnzAjC9+6nPXhI/bNsyiKPGIbxuDz7icuhgKfPWEZQlPX8RYnojz5/TsVLljkoe5X7+s1b1zMB795/YJiDyo8V8H2Wft2PUf6JZTX5HAKXft2P3LDXtC8ZXxlGR/p1P3LDXtO+ff/BMA9Bbtj/pvInyzzjP2/uvwDhAQVelY+RJAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.392,3.516;4.blob,1.1,1244.iVBORw0KGgoAAAANSUhEUgAAAW4AAAAPCAMAAADzo9X2AAAB2lBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkpHRx1/fzQTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YeHgyYmD4QEAdWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGNWViNxcS4CAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsECAgGMjDk4OBctEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR8tLRKSkjsHBwNlKWViKGLQVFR8MjJUVNAyMnxlZSliYigJBAmUPJQpESlyLi7ZWFguLnJYWNkJCQSUlDwpKRE8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjc8PBiJiTcBAQB0L3RTIlO3SkqVPDxKSrc8PJV0dC9TUyIUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYUFAgaGgtLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFBLSx58fDKANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaqAgDRDQxsGBg9iYvMsLG4iIlQAAAGwDl9bAAABhklEQVRYhe2PVVPDQBRGW1qkQVq8OAWKS4u7OxR3d3d3t+Lu/FfYpqGZkIfcfWE2cB7ud3Z35pu7EskXUiuJ2JHJrTlmY2tnvhFqfC1sFJQ958bB0Yl9VKpMYSUFr08aMrkz11xcmUehxtfCQkG5ca/cPdgnlRJNT7UXZHMi8Zb7cM3Xz18CM74WFgFUIKMaDZ1BwRrLe4g2FEVYON4XSCIi8odFRccAja+FRWwcYzp9fIJJEpOSLe8pqWimpWfgfIB8MrOgJpTsnFwdbXn535cFhUUoiktKoXXioKy8AmhwKg1VjFbX1KKoq8cuI5yGRqjBaWpmrKUVzbb2Dvwysunsghqc7h6z9Pb1oxgYHMIvI5vhkVGgwRkbn6BlcmoaxcwsdhXxzM1DDc7CIp1Ly2iuqFfxq0hnbX0DaALZpLYY3dbvoNjV7qHYP8BcVQwcHh0DTSAnBiOjp2fnKC4uTaera8xVRcHNLdSEcXdv8YdHNJ+ecfb7Rwgvr2+/vcJfwvj+wf/wCZCJXNqy75mxAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.535;4.blob,1.1,1748.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA0CAMAAAAE725BAAACZFBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBCQoOehAAACdklEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWfgAAHjtgVmNmcnjAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.570;4.blob,1.1,1648.iVBORw0KGgoAAAANSUhEUgAAADgAAABfCAMAAACKqfTOAAAB0VBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUCAgIBAQEFCwU4izgfTB8SEhI+Pj4rKysJFwkQKBA0gTQkWSQEBAQNDQ0JCQkLHAsPJQ8zfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQwCBQI4ijgAAQAxeDEXOhcGEAYOIw4yejIeSx4KGAoNHw0iVSIucy4TMBM4iTgyezIgUCAKGQoFDAUeSR4SLRIgICD///8bGxsxMTEYGBgTExMiIiIFBQUsbSwjIyP39/cfTU0dSUkECwsWNxYzfjMbQ0M8lJQ8k5MkWVkJFhY2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUpZCk9lz0fTR8LHBwsbm4+mZkSKys7kTsDBwcYPDwxeHg9l5cpZWUHEBAxejELGxsmXV07kpI7kZEiVVUHEhItcC07kjsmXl42hoYcREQDCAgLGwsJFxcBAgIqKioaGhovLy8sLCwNIA1n/2cIEwhk92QICAgoKCgUFBQXFxcKCgoimNc0AAACvElEQVRYhe2Y51cTQRTFR1AUS4IUyyiSiNEYIlYUNARFLNhF7AW7Yu+9YFfUWFAsf61uy7ydeW/neQ6cw/Fwv+TtPfklO5vdm7srxDBqjLZdUsrjxo7TjLLxEzhc+cRJujV5CoOLxSsMb2pllR2srkRWVDPNDk6fgZgzZYkVnDUbMWvlHCHqHCUoLimrMXtuvZiXcjSfAhfINGYvzIiGrKNFFNgoF2P2khoKCLRUokd+2XIbuKJpJeLGVjXbQNGSQczVcg388JyrGJyEqI8jYEVrHmy1SVdr4STEuqZ2E1zfAbc2bHSVhNNfbdqc17nOLbWRy/NUunWb5mxvLWdwQuzYqRnpXSxuSKSHCFdGiJja3bXHNFWIdO+lwX2GB0KEBvd3HTA8ECJFsOqg9qZDh73XI0ePFT0QIh4Y6zku24hvPnHy1Okz/gxCxAFzzWfPne+ldllcuHjp8pWrzgRDxAGvXb+RJDFXN2/dviPCIeKAnfG7mcYI7N79Bw8fPRbhEHHXmC97Ilt6COxp37PnL166IwyR4KimX70mwDdv3/X7IwwR9Tu+J8APH9UMQiR8AsDAwARCJAzCwMAEQiQMhgIDkwoR+lxFpULkH0EzRAIlIv62IlVIpT4htr11FD5nzcuQ0zoKX4Lp60DxlOC0Dgh+8ydW61Bg70DOn1itQ4Ht34OJ1ToUqES3jmiQbh0WkG4dFpDXOhCQ1zoQkNc6sKPKaB04yGgdDmheVozWQVxWnNYxmEUuq9HWwRKndWBitQ5MWOtgSWsdCfe+o44Baq3jh3vfkfpp5fTWMejed2QbrKDeOti7qrcO9q7qrYO9q3jr4IhsHf5qExRIto5ub7W/KJBsHb+91SJ/rb5GUusYao0+66A0DM86osVrHYh4rQPRf/GsQwUGNkW0DhUY2BTROlRgYJMYQc86/gA9ZKw0p6cryAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.590;4.blob,1.1,1392.iVBORw0KGgoAAAANSUhEUgAAAVoAAAASCAMAAAAt8+bxAAACFlBMVEUAAAAJFgkcRhwwdjAMDAX19WNKSh4xMTEYGBggICD///8bGxsRKRE6jzoIFAikpEKoqEQTExMBAgE1gzUbQxtGRhz29mMODgYiIiIFBQUUMRQ8kzwDBwMDAwHm5l1jYygfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsqZyoraiuLizjBwU4bG0M8PJQ8PJMkJFkJCRYWNxYzfjM+mT4xeDEbQ0M8lJQ8k5MkWVkJFhY5jDkdRx0tLRL+/mcfHw0EBAkaGj8xMXo+PpgrK2oPDyUCBQIaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUFCwXQ0FR8fDILCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysJFwkQKBByci7Z2VgDAwcYGDwxMXg9PZcpKWUHBxATMBM7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBAPJQ8YGAr8/GY3NxYLCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhIHEQe3t0qVlTwmJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgBBAE9lj0ZPRlZWSTs7F8GBgIJCRcBAQILGwsJFxcBAgIJCQTy8mJQUCAfTB+cnD+qqkUXOhcGEAYOIw4KGAoNHw0iVSIucy4yezIgUCAFDAUeSR76Kq8ZAAABuUlEQVRYhWNgGAXUBIwD7YBhC5iYkTgsrGwD5pBBBNg5SNTAycWNKcjDy4dsHr8Aha4aFoCMoBXEEBMSFkExT1RMnEJnDQdActBKcEliiElJy6CYJysnT6GzhgPACFoFRSVkrrIKmryqGoRW19CEi2lpo5mno0s9Fw5ZgBG0evoGhkZQtpCxiakZDo3mFpZW1lC2jS2aeXb2DtR05NAEmAWCo5Ozi6sbkOHu4enl7YNTp6+ff0BgEIgVbCqFbl5IKLUdOvQA1rI2LDwikoEhKjomGL/m2Lj4BCCVaJqEbl5yCtVcOGQBlqBNTUvPyMxiYMgWzsnNw6M1v6CwqLgEyMgzLUU3r6y8gsoOHXoAI2grq6prauvAzPqGRtMmYxwam1ta29o7wMxOU2UM87q6qezQoQcwgrant68fwUuaMBGHxkmTp0yFMqdNn4Fh3sxZs6nlxKEKMIJ2zlxU/jwcGucvQLCbcjHMW7hoMaVOG+qAqC7DNHcwEMIlv0QY07ylyyh02ZAHRAWtmSkYLMclv2L6SpLMGxmAqKBYtRoMcDfF1qytJ8W8kQGoExQy69ZT1bxRgAAbNiLYAAvgS7/udkEGAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492326220;4.rect,1.1,3.824,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,1.3;4.blob,1.1,992.iVBORw0KGgoAAAANSUhEUgAAAJ4AAABbCAMAAAC1fsxOAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAAB8ElEQVRoge2ax2oDQRAFV87Zck5yknPO8f8/zHhhuxs0SE+GrRVm6rJD08XMQYc6qCgG0RobuNKAgV6Wn8ca6GX5eayBXpafxxroZfl5rIFe9n+flxmW8QltxhrG5NS0NGMNZ2ZWm7GGMTe/IM1Yw1lc0masYSy3V6QZaxir7TVpxhrO+oY2Yw1jc0ubsYaxvaPNWMPY3dNmrFHR2T+QZqxhHLaPpBlrGMfdk9/P6VlJJ84aNIzzi/Jz2S65irMGjYrrm9Xye3tXch9nzRkVD91HacYaxtOzNmON0UZM6bBHGIaa0r5HGI6Y0mGPMAw1pX2PMBwxpcMeYRhiSoc9wjDUlPY9wnDElA57hGGIKR32CMMQUzrsEYahpXTcI4wKMaXDHmEYYkqHPcIwevI6dSpichOG0ZPXqVMRk5swKnrzOnWKyU0YFWJKhz3CMNSU9j3CGG3UvGYNQ81r1nDUvGYNQ81r1nDUvGYNQ81r1jDUvGYNR81r1jDUvGYNQ81r1jDUvGaNCjWvWcNQ85o1DCmvU6FdnxFdKa9ToV2fEVwtr1OhXZ/hJzWvHcIwhs9mwshkRv4faPl5+XmwgV6Wn8ca6GX5efUYL68lb+mTq/33ajNa7yUfRfLkav+92ozPr5LvInlytf9efcbffxeA8QO8Sc+HSZdFAAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.770,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.162,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.381;4.blob,1.1,3468.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.440;4.blob,1.1,2452.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.570;4.blob,1.1,1668.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA4CAMAAABzLa46AAACQFBMVEUAAAABAQECAgIqKio+Pj4aGho0NDQREREGDgYDBwMvLy8NDQ0FBQUKCgoUMhQyfDIECQQsLCwGBgYnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB8SEhIrKys0gTQkWSQEBAQJCQkzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwBBAECBQIbQxs4ijgAAQAICAgxeDEXOhcyejIeSx4KGAoNHw0FCwUTMBM4iTgDAwMKGQoRKREQKBASLRIgICD///8bGxsTExMiIiIfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYoKCgUFBQEBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxA1gzU7kTsLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIxMTEXFxcJFgkcRhwwdjA6jzoIFAgNIA1n/2cIEwgUMRQqZyoraisOIw5k92Q5jDkdRx0JFwkPJQ8HEQc9lj0ZPRkGEAYiVSIucy4yezIgUCCTRIXOAAACXUlEQVRIiWNgwAoYmZgY4SzsSggDZhYWVgiLjYWFHacyDk68hnBx80BYvOx4DOHjF8BniCCcKYTHEAZhESoYIiomTrkhDBKSVDBESpqDckNkpGVRBZhAgJE0Qxjk5FG4CiwgoEiiIUrKKFwVbhBQJdEQNQmcUsQboq5BuSGaWtqUG6IjrUuCIXr6YKCJzAICA0MjPIbAiwJjiCEm0mBgiswCAjNz3K7ELAosLMHACpnFwGBtI4PbEGNueFHAzW2LU5mdoT1uM4gFDo6UmzFMgJOzCzUMcaXcEDdnHsKK3D08kbniXmjy3j4Q2tfPH8JgBJdnqLVcQGBQcAiUrRkaJm2Cw7LwiMioaBAjBlyescSiyMbFJyQmJQMZ+topqWnpOJ2ckZmVnZMLTuAgoIIun5dfUMjAUFRcYoXTCDAoLSuvwOodBobKquqa2jpgBqtvUG7EY0RTc0trWztW73R0dnX39IKZRnx90v2hOIyYMHHS5ClTGbB7Z9r0GTMRPIdZs3EYMmfuvPk4HblgISp/EQ51i5dgCEFDhxG7BpRCETdYCgmdZdhlUQpF3IAXEjo4UjRyoTjkAC1bj8vRlJHTelyxEk0ZGa1H+1WrIYw1a2HJj+TWo2a9AQPMkHVQFsmtx/VisBBIX6sPkyW19bhhI0xo02a4LKmtxy1bsSjEaD3iN8RKej02lWitRwKGbJN2wKYSrfVIwJBG6e3YVJLWetwhjTU2SWs96u3chUUhqa3Hfmy+J631yMAgX49FIWmtRwaG3Ts3YSokrfUIBHv2YthKeuuRc99+NGXQ1iMAsalwYUvSlJkAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492326325;4.rect,1.1,3.834,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.811,1.3;4.blob,1.1,960.iVBORw0KGgoAAAANSUhEUgAAAJQAAABbCAMAAACiXFyHAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAAB2klEQVRoge2a12oDMRBF5fSejdMTpzm99/r/HxYiWEmww3gm7NwVRvdlxeUeJPDLebBzo9KbGDnBE+VRGV1RHmVHlEdldEV5lB1RHpXRFWPyqBIuk1OyDkpMz8yKOiwxNy/roMTC4pKowxLLK7IOSqxWa6IOSvSrdVGHJTY2ZR2U2NqWdVBiZ1fWQYm9fVmHJAYHh6IOShxVx6IOSpwMT/8+Z+c+g7Trjri49J+ryuc67Tojbm77/nt37/OQdl0Rj8MnUQclnl9kHZbIJ7y+Ujs7IoSXUWpnR8Tw+krt7IgQXkapnR0Rw+srtbMjQnh9pXZ2RAgvo9TOjojh9ZXa2REhvL5SOzsihNdXamdHhPD6Su3siDq8vlI7OyKE11dqZ0eENASVOrlUWu2IkIagUieXSqsdUacpqNQplVY7og6vr9TOjgiRymjc2RE5Ri2oCEIvqAhCLagIQi+oCEItqAhCLagIQi+oCEItqAhCLagIQi2oCEIrqAhCLagIQi2oCEIkqJTcWhIiQaXk1pCQCSolt3aEWlARhF5QEUTJOCfLfwWVR2V0RXmUHVEeldEV5VH/Jl7ffN7pUwT4XctE78Pn05GnCPC7lomvb58fR54iwO/aJrS/N4D4BaTDw0En2/KKAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.483,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.326;4.blob,1.1,1960.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAAC7lBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/c0NIExMXkHBxJDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0tLW9jY/ZjY/U8PJQPDyQJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4GBg8qKmlSUstmZv1HR7AZGT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBATEy5KSrdnZ/8dHUgHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8FBQwoKGRRUchlZftERKgLCxsbCxtdJl2SO5KRO5FVIlUSBxIREQcsLBISEi0/P5tiYvNhYfE5OY0MDB5eJl6GNoZEHEQIAwgEBAGWlj09PRk/P5xaWuAuLnIGBg4XCRcCAQJ3dzBZWSQQECcCAgRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtRNkesAAACiklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWi0sVdCFrLSsidKqoY4pZmNLjE47XXtMQQdHYrQ6ObtgCrq6uROh1dwMm6iHJ2GdXlre2IR9fP0IavUPwCocGBRMUGtIKHbxsHCCWkcuiCBbZ2QUuTqjY2IhjLj4BNJ0JiYlM8C0ppCmNTUtHcrKiM9ElcrKzsGrNTcPxsovgNCFRcUQRklpWXkFmFVZBQbVqFpratENq6tvaGwCs5pbWtvaO4CMzi4w6EZR19ObiuGQvv4JEydNhrCnTO2axsAwfQYYzERRNqt3NjZvzJk7bz6QWrBw0eIlS3E4eFnvckyNK1auWr1mLcO69Rs2btrMgMvBW3q3omvctn3Hzl27gYw9e/fthwhhdfCBg4fQtR4+cvQYmHH8BDa/IMDJU+gip8/gUe4XCAaGIPbZJPxGo4Fz58HgAoh98eAlUrRevgIGV8Gca9dvkGQvEki/eYtcrQy375CtdQgAnK0VtFYNNoCrtYLeqsECcLRWMFo1WACO1gpGqwYbwNpawdKqwQKwtlawtGqwAWytFWytGiwAS2sFa6sGC8DSWsHaqsEGMFsr2Fs1WABGawVHqwYLgLRWkIoaHK0abADcWkEqanC1anABlKJmFNAK3L1HttZ7d8nVef/BQ3K1PnpMrs4nT5+Rq/X5i5fkan31mlydb96+I1fr+w8fydX66TO5Or88+Equ1m/fydXJ8OMnTikAUxXA2weunqkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.152,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.381;4.blob,1.1,3480.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.516;4.blob,1.1,2772.iVBORw0KGgoAAAANSUhEUgAAAEQAAABZCAIAAAAIORWgAAAABmJLR0QA/wD/AP+gvaeTAAAH0klEQVR4nO2aW0wbVx7G/x5fYhtjbGMuNtQJ+IKBGNzEKW60qRqRrSsHpaFSmmU3IbuwSaQ+Va0qpH2JouQp4i3aRtmXXbFNq25Im3alhIpENN5INM02jbKNKAaMs7JNfEsD+AK+7oORMTPGeHwOOOr6Jz+gc3z+5/uY45k58w0APkwvmc4YzmAsSBcCYy1jjfFb97cYC9IFmxmFQCHjy+557uEqWADYzBhrjJPPJ58vP8dVsADwmCEYxCvVr4y7x7FUK1wGliqt4lYOwfnB9wOWagWDx4yxxvjQ/3A5voylWsFgMMNj8dor24u+xgCLmd3S3cFo8Keff0IvhQgGM8Ya43fe75KQRC+FCKoZKVeqqlC9CGsM0M10VHc4Ag5X0IVFDSKoZvZU73lBDkuJEiVK/J+iH9C/8+M7WEqxBez+YL/CrEAvlVZF7zqjOa6x/t2KPj0ARAPR2S9mNb0a9FJpVTTMSHdJRc2iqY+n0KdPYR2ybj+0nSPkoBTJVEXDjKZX4xpzBZ1BlLkzcd52Rp5HGo80ohTJVJWvGYJFqHpU1iE8ayxFMp6cujKFstJIqvI1U2+qZ5exbddsmY0MgsHkMjM/BJvIszeFdcgq2ycr315emBmSKlaewzS9mtkvZmPBWGajwqx4859vZrbYv7R/ffjrfHpTPPvPM/8jv/q4+sH5B7RsZFWVlxlOBWfHoR0jh0ZI7XP/mvt8z+eZLcs/L+fZm8Y6ZG053VKAmfVUbYD2j9pjjmMMgkF3vnzg1/JPxU5Vd1TTHUhVlddvRtOrmf5kOpnYlI1x6GnIMeoo4DRAVbWxmfKGctmvZHjPYySsQ1blUSXBoXGdyKpq4/HqY2rfQ9+zH5/R1pg39ut2JodJ69Ymq6qNzWC/vFCJhWMz/5hR/1ad/5AtUFWixC8fJuJ4DkcIAMlkHIcYVFAfAgqFqvb2D1ksHhY1iKAemVBoTihUVlcbvN5/YxGEAoYUwGYbFotbJJKd6KUQQT0yAJBIRLjcKolkp7uouTlQj4xZobhhNme2dHR03LlzJxwOu93uixcvCgQCahWf73uRSJs6GWw9CrPCfMMM6f0MiyCOKpUDer1OIrnn8aS/19TUNDY2ZrFYuru75XL54OBgY2PjwYMHSeXm52cAoKJCg+uXQ7AJBpO840hEEmvukVmE8qhSP6CX6CSeex4AYPFYrH6t9oO2Nhmff9VmO22xjLvd6QHnzp1zOBxdXV2xWAwAnE7nyMjI/v37x8bGMqeJx5cikQU+vxaLEwB4/a+vq39HvlUbPTJqG7alRGv7tW0ftPFlfNtVm+W0xT3uBgD4tLMzevLkWYOhksulFg0EAufPn89s8Xq9g4OD1G8aDGdVqh5cZsobyqsMVaTPNvG2VG/np50noycNZw3cyjWaWZ/NzOyuqnpPp5NyuZcnJh75/ek+Ho9XVlb29OnTzAEul0sqlVKnTyYTBMHGZSboCIbmQqTGRCSR+mPms5mq3VW693RcKXfi8oT/0Ypm1nW7/asnT95uaBjQ699tbR13uz96/PjjqSkACIfDoVCotnbN4pHL5bdu3aJOz2RyotEALjO5l5n9uv3JV08a3m7QD+hb3211j7sff/SY/HSys65utKtrsa8v3XLt2jWr1cpirZwnTCZTMpk8cOAAaRoGg9i3789y+X5cZnIvs0zqOuu6Rrv6FvuoXQAAOokk/Xdzc3M4HL5586bJZDpx4oTf7x8ZyfI0pKxM/tprlwWClzB5oY1EJ9n4SwCwd+/eu3fvhsNhr9d76dIloTDLxaSurtNovACwKY9vtppdu/6kUJAvPlsPhnuzyko9h1PhdN5GL1Vk+HyZ0XhBLG4uthAciERaiURXbBW/RJgAkMqukvHiv5aECAEAQpWw/cN2Fi/feOOFhQAA3wNf0Bls+n0TtRtjJpwbWjn2eqpWTs22YZu4RSzZSb6OYsyEc0Mrx15P1YqZ6GLUc99T/+t66kgsmXBuCsixs6pavWj6vveJtCKqaCyZcG4KyLGzqlo1Mz8zDwAVmgrSMPRMODeF5dhZVa2aiS/FIwsRfi2fOhIxE85N1hw7H6iq1tybxUIxdnmW3WI6Ey5A64ZkzbHzgapqjZlkIkmN6lNYh6ya4/hXWioxLjg2IqlaI53JYUYD0azDpj+ZFiqFBWTCuWk80rjkX3LedhY2nKRqzQsV20Tbskb1gJAJ5wYxxyapWjXDr+UzWIyF6YX1RhaQCecGS46dqWpVmahZFJmPBBzrPmGhZsIEhyC9HcPkMtNPInP3AqYcO1PV6s1lTUeN644rxxv96UzYft2eannL8hb1V/TNH76Z/Nvkhr0AoOpRTfxlAsUJSdXK/6lSX6nuUd8/cz++RCMDE2lFbAH5VL44u7jkX9qwd7Pgy/jGC0Zxs3gT59gyRFpRvs+dSpQogYJAwA4G+82bv6nOE6SANhJJtLSIX35ZOjxM+wb+ReSNN+pDoX7hZm6qtw4mk+FyHe/v1xZbCAD6g/N4PHnlylTv5j++2SJ0OkkicXr75myqaYHhDQ2PJ9zd3cBmExbLHHq14vP++22Tk78ptgpM1NbyY7FTHbg31XTBsMwAIBCIvvpqjUIhuHHjv1gKFpmeHpXPd4KDb1NdTHg81sJC3+HDO4qoAc8yA4BYLKFUCg2G6qtXi3Zr8z8vETIC2/JoIAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.571;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAADAAAABLCAMAAAABOfS3AAACIlBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8CBQIGEAYOIw4xeDEXOhciVSIucy4AAQAKGAoNHw0yezIgUCAFDAUeSR4gICD///8bGxsTExMiIiIFBQUfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM7kTsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIUMhQxejELGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIGDgYyfDIECQQnYScraSsNIA1n/2cFDQUIEwgmXiYucS4SKxJk92QDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0LGgsMHQw4ijgyejIeSx44iTgKGQoSLRIxMTEYGBgBAQECAgIoKCg+Pj4UFBQICAgNDQ0EBAQ00VswAAACSklEQVRIiWNgAAFGBtIAEzNp6llY2UhSz87BSZoFXNw8pGng5SNNPQO/AGnqBYW4SNMgLCRCmgZRITHSNIgLSZCmQVJKmjQNDDKyJGqQ48CwVB4M2JFZSEBBShFNg5IQGCgjs5CBiqoaqoC6BhgIIrOQAY+mFom+0NYhUcMQA7p6+qRqMCBNg6GeEaqAsYkpMlfCDE2DuQWEtrSyhjBsbO3sHaCS7I5OQko4bHJ2cXVzB7M8PL28fXyBDHk//4DAIJxuCw4JDQuPgLAjo6JjGBhi4+IFcSoHg4TEpGQglZKalp6RycCQxZEtK4pHeU5uXn5BIUNRcUlpWTlYRK2iUkjGEYfyquqa2rp6IKOhsakZISzS0opDQ1t7RyeY0dWNKtGDQ0NvHx7XYs2Y+AD2jIkHYM+Ygxyg16L9BOokjFq0YsJEfOqx1KKTJsNYU6ZiRCW2WnQaN6wOmDJ1Orok1lp0xkwoI2iqPLoc1lp0llA/hKE4G0MOay06R2guFlEwwFGLzpPDpQFHLTofZ72EoxZdMAOXBhy16MJFuDRgr0XZF/vh0oC9Fl0itBSnBsxaFAg4l6lhEYUAzFoUCJavwKkeSy0KLNRWzsGjAbMWXbWMBY96LLWoyGq86skGhDImBiCQMbEARMZkWLOWGA2IjEmkBkTGJFYDPGMSqwGRMTE0rFsPBug64BkTQ8OGjWCwCU0YnjExNGzeAgZb0YThGZNYJ8EzJpFOQmRMIp2EyJhEBisiYxKpAZExidOAlDGJ0oCcMYnSQFTGBADR2JY+IjI5UQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492326424;4.rect,1.1,3.844,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.383,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.421,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.821,1.3;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAAIoAAABbCAMAAACbO+3cAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABzklEQVRoge2a2UoDURBEJ+67Y9w1Go37vq///2HiBbkNt5lUpLodoetlLkWd0ODLebCqhqUzNnTiRcQpcUqcEqfEKXFKnNKmUyI/GZ/AOjahZHJqGurYhJaZWaxjE0rm5hegjk1oWVzCOjahZLlegTo2oaRbr0Idm9Cyto51bELJxibWsQklW9tYxyaU7OxiHZso09vbhzo2oaRfH0Adm1ByODj6/hyfpPRkZ0ooOT1Ln/M65UJ2pkSZy6tu+l7fpNzKzpIocze4hzo2oeThEevYRBsDKp7YmRGo4uWdHQEqntiZEaji5Z0dASqe2JkRoOKJnRmBKl7e2RGg4omdGQEqntiZEaDiiZ0ZgSme3FkRoOKJnRkBKp7YmRGF4mmvSooilZApFE97VVIUqYRIqXjaS4oil8gBFU/szAhU8fLOjvjroFLoQKCK50GgUuhAoIrnQaBS6ECgUuhAoIrnQaBS6ECgUuhAoFLoQKBSaE+gUuhAoFLoQEBSqOkhmwClUNNDNgFKoaaHbAKVwhwzYnTF8yAi/zEt+k+NOCVOiVPilDiFQDw9p7zor/zDzTsK0XlNedNf+YebdxTi/SPlU3/lH27ecQjs7zhKfkl8AVRJs8TUWF+xAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.790,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.174;4.blob,1.1,2316.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.326;4.blob,1.1,1732.iVBORw0KGgoAAAANSUhEUgAAADAAAABZCAMAAABPJ1cnAAACglBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZikWFglGRhx2djApKRGPjzoUFAggICD///8bGxsCAgGDgzVDQxsTExMxMRSTkzwHBwMiIiIFBQVNH01JHUkLBAtnZypqaisjIyP39/dDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0JBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBAHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8bCxtdJl2SO5KRO5FVIlUSBxIREQcsLBJeJl6GNoZEHEQIAwgEBAGWlj09PRkXCRcCAQJ3dzBZWSRMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR5HHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsHq8gaAAACS0lEQVRYhWNgwAsYmZjxK8AALKwkamBj5yBNAycXN4lW8PCSqIGPX4BEHYJCJGoQFiFRg6iYOIk6JCRJ1CAlLUOaBlk5eRKtUFAkUcMowA2UlFG4KqpqBDQoK6Hy1TXwq9fU0kYV0NHVw6tB3wBNwNDIGJ96QxNTdCEzc3waLCxV0IWstKzxaNBQxxSzscWt3k7XHlPQwRG3BidnF0xBVzd3nBrMzbCJenjiUu+l5Y1N2MfXD4cG/wCswoFBwTg0hIRiFw8Lx+WmYQciSFQfGUWa+uiYWAgjLj6BGPWJSckMMA0pxGhITUuHsjLiM0FUVnYOXg25eTBWfgGYKiwqLikFs8rKwaACVUNlFboR1TW1dfUNQEZjExg0o8i2tKZisbatvamDgaGzCwy6UaR6WnsxlPf1T5g4aTIOJ01pnYqmfNr0GTNnzWbA5aQ5rXPRNMybv2AhhIXVSYsWL0HTsHQZFk8hgeUr8MuDgV8gGBiC2CuTiNCwajUYrAGx1y5eR1jD+g1gsBHM2bR5CxF2IIH0rdtI08CwfQeJGgYFwFljotWsCICrxkSvWeEAR42JUbPCAY4aE6NmRQCsNSaWmhUOsNaYWGpWBMBWY2KrWeEAS42JtWaFAyw1JtaaFQEwa0zsNSscYNSYOGpWOIDUmEiZFUfNigDgGhMps+KqWVEBSmYdBfjAzl0kati1kzT1u/fsJU3Dvv2kqT9w8BBpGg4fOUqahmPHSVN/4uQp0jScPnOWNA3nzpOm/sKei6RpuHSZNPUMV66iCQAA9R+atraZZ9MAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.142,3.345;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABdFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXB3dzDU1FYMDAX19WNKSh5HRx1/fzSkpEKoqEQyMhT9/WYbGwtGRhz29mMODgYeHgyYmD4QEAeQkDq8vEwDAwHm5l1jYyhWViNxcS4EBALp6V5eXiaLizjBwU4CAgGMjDk4OBdLSx709GMLCwQICAMFBQItLRL+/mcfHw2SkjsHBwOpqUSjo0JMTB///2ewsEfQ0FR8fDJlZSliYigPDwb392RFRRw0NBUjIw5yci7Z2VgJCQSUlDwpKRFkZCjk5FwYGAr8/GY3NxY8PBiJiTcBAQDCwk6Kiji3t0qVlTx0dC9TUyIhIQ0sLBJZWSTs7F8GBgIUFAgaGgt9fTLOzlPy8mJQUCDW1lZwcC2cnD+qqkWAgDRDQxu4m4IGAAABG0lEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SUhKkadRWoY8fQyycmRqHAXUBfIKOCQUlZSxS6iogikFeVxGqqljF1dVAZEamlq4NGrr6GIT1tM3AFGGRrj0MRibmGITNjMHkRaWVjg1MljbYBG0tbMHUQ6OTmCeMwi4oLAYGFzd3DE1unp4gigvbzDPxxcE/FBYQOAfgKkxMAhEBoeEgnnBYSAQjsICgohIDH1R0TEgKjbOFrcXGRjiExLRhZKSU0BUaho+fQwM6RnoIplZIDLbLQe/xty8fFSBAv1CEFVUjF8fQ1RJKaqAAyS4ysoJaGSoqETlV1WDSAAO1yqijMqlWAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.381;4.blob,1.1,2860.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.440;4.blob,1.1,2372.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.571;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR5IT15yAAAA50lEQVQ4je3SyVbCMBSA4fSiQCkEOgBVKSpDwYFBwYHR6f3fybQLyH9cuyOrfuc0t2nOr5Qj9lKFs3NYiiW67FZg8ap0TSu4rhuw+AEdRnTTo1ttOL64hK90B0661/DNLc7X69dtD7pD/F86Eljkr8f03T08fHi0HU8S7J+6Djybc/7TM7zQU3ipU/hFv8JvugK/r9acv4noYEJvVztY9h+8T+fzC5bvH5rzjo8OnZdmv5+VZjsrDfNMabApDTal8ft+QIcR3fToVhs2pcGmNNiUBpvSbGelWc5Ls5yXdurr1Ndh/UNfv18uIlmbRmGJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.571;4.blob,1.1,2072.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.590;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.628;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492326533;4.copy,1.1,3.900,1.0,2.60,2.19,2.14,1.1,3.860,1.0;4.rect,1.1,3.854,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.393,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.421,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.831,2.20;4.blob,1.1,908.iVBORw0KGgoAAAANSUhEUgAAAIAAAABKCAMAAABEk6wrAAAAsVBMVEUAAAAYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0t4eDE8PBgEBAEFBQICAgGZmT46OhcYGAofHw0LCwXRd0jwAAABsklEQVRoge2W104DMRRETe9L6BBKQu8ldPj/D0NYwra0o6uJdm5AYufF1mjOytK+nBBQxsa5Tk2kTExOUZ2ayJme4To1kTI7N091aiJnYZHr1ETKUrVMdWoipVOtUJ2ayFld4zo1kbK+wXVqImVzi+vURMr2DtepiZ90d/eoTk2k7FcHVKcmUnr9w+/j6DimW3ZqAufkNB5nVcx52akJmIvLTjyvrmNuyk5NoNz276hOTaTcP3Cdmvjt2AqFdmLCliS0UxO2QqGdmLAlCe3UhK1QaCcmbIVCOzFhSxLaqQlbodBOTNgKhXZiwlYotBMTtkKhnZawFQrtxIStUGgnJmpahW6hlCkBUaamVegWSpkSEEXqWoVupUwpiBxbodBOTLCSlHd+xCjDapUbwWqVH8FqlRvBapUfwWqVG8FqlRvBapUfwWqVG8FqlRvBapUbwWqVF8FqlRvBapUbQWkVEiwNQWoVEiwNQWoVEiwNwWpVjpgYXpJGQbT5Sxk8+hPtA9oHtA9oH/C/H/D0HPOCb/lz9q4BMXiNeQvwlj9n7xoQ7x8xnwHe8ufsXUNC+EeHJr4AkBiumaaAk6UAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.800,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.483,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.326;4.blob,1.1,1544.iVBORw0KGgoAAAANSUhEUgAAACYAAABZCAMAAABll6aIAAACalBMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqodRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgseSx4yfDI0gDQbQxsWFglGRhx2djApKRGPjzoUFAgCAgGDgzVDQxsxMRSTkzwHBwNNH01JHUkLBAtnZypqaitDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAGMjDlHRx0JBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDILCwWZmT4cCxxuLG4rEisUCBQfDR8KBAoXFwkoKBAHAwc8GDx4MXiXPZdlKWUQBxAcHAslJQ8bCxtdJl2SO5KRO5FVIlUSBxIREQcsLBJeJl6GNoZEHEQIAwgEBAGWlj09PRkXCRcCAQJ3dzBZWSQBBAECBQJMTB8xeDE+mT4XOhcQEAYjIw4KGAoNHw0FCwVVVSJzcy4BAQB7ezJQUCAMDAVJSR48kzwSLBIRKhEDCAM4ijgYOxgLGwsIEwgzfTMeSh4cRBw1gjUGDgY9lz0NIQ0sbiwkWSQWNRY5jjk7kTsTMBMmXiYpZilHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxu+2V+lAAAB1klEQVRIid3S+TNVYRwG8Nda9kQIIVxce3Yt9pCtsu9LrmRXyFLZy1qiJNl32bcQEUq2+p+47zXNnBnnzPOTGZ5fnu855zPf986dlxDOiIlLcIPjSEpBTPrCRYTJyMpB6+QVIKaodAlyypchpqIKsStq6pDTuAoxTS1thF3T0YXW6V2H2HmPvgHEDPQRZcgzQpixCaL4pmYIM7ewRJiVNaJu2NgizM7eAWGOTohy5t1E2K3biCJ3XCB2duIKKTd3RHl4egHqrrcPssz3np+w/AMCOVnQfVoPHgaHhNIpLJwmgskio0QdHRMbF59wNCQm0TxiqGSB7/855XFSKiFP0mjSGSxDkHk8ZWXn5D59xnJoniCfdsHzwqLiEsJ26AvBS9qvSsvKRW9OPLSisop29Wu2v0KUNzWsn2rraPjCud6blTU00rwVzu8qm9jY+2aaFvrw4WMr988Sxe9TG8LI53aInVIsv3RAztoKYp02XQjjd/dA65wcIdbL64Nc/wDEBocgNjwyCrmvYxAbn6hFWN3kFGFe95MzPUOY150jjOt+/jM7B7G5WUTNL3xD2OISopa/ryBs9ccawtZ/Impjcwthv35vI+zPDqJ2F/YQtn+AKPL3H61DE9F+R1Og6SYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.400;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAaVBMVEUAAAAsEixtLG0DAQMFAgUBAAECAQI3Fjd+M36ZPpl4MXhiKGIyFDJBGkGGNoaVPJUiDiIUCBQfDR8KBApkKWSXPZdNH00LBQswEzCDNYORO5FZJFkcCxx6MXp3MHcoEChwLXCSO5IbCxsFd2akAAAAVklEQVQYlWNgoCtgZGJgYGYBA1YQn42dg5OLgYGbEwx4GBhYePn4uQWAMoJCYCDMwCAiKiYO1ozQKCEpJS0DEkJoZGDlkeWUY0fWCALyCoqYrlCitTcBnggEJVVpbxUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.516;4.blob,1.1,3376.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,2108.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;3.end,1.1;4.sync,10.6492326630;4.rect,1.1,3.864,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.405,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.595,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.841,1.3;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAAHYAAABbCAMAAACRS4HLAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABzElEQVRoge2Zx04DQRBEx+TM2mQwyZicc/j/D0MMhx5pWuvq7bJBMO+yo1Y994FLqQlhEK2xgRG3UdaWtWVtWVvWlrW/Zu3fZ3wCm3kMhcmpaWjmMTRmZrGZx1CYm1+AZh5DY3EJm3kMheWqDc08hkKnWoFmHkNjdQ2beQyF9Q1s5jEUNrewmcdQ2N7BZh4jp7u7B808hsJ+dQDNPIbCYe/o69M/jnTTGc1QODmNn7Mqcp7OaEbOxWUnfq+uIzfpjGXk3PbuoJnHULh/wGYe46dBS4jkKAZaQiTHMdASIjmKgZYQyXEMtIRIjmKgJURyFAMtIZLjGGgJkRzFQEuI5CgGWkIkRzHQEiI5hoGWEMlRDLSESI5iZMVEe4W0rDQ2UrJior1CWlYaGwl5MdFeaVlpbghoCZEcxUBLiOSGZwwL8z2FY9jvKRzDfE/hGPZ7Cscw31M4hvmewjHs9xSOYb6ncAzzPYVjmO8pHMN6T+EY5nsKxzDfUzgGVEy0iuIxwGKiVRSPARYTraJ4DPM9hWPYa8YojMIo+F//SC1ry9qytqz95vEp8qy/5Efqc2aj9RJ5DepLfqQ+Zzbe3iMfQX3Jj9Tn7AbjL2U2PgFAqJpIfSPG8AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.345;4.blob,1.1,2700.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.345;4.blob,1.1,832.iVBORw0KGgoAAAANSUhEUgAAABwAAAA0CAMAAACuLKj9AAABO1BMVEUAAAAdRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgseSx4yfDI0gDQbQxtNH01JHUkLBAtDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAEJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDIcCxxuLG4rEisUCBQfDR8KBAoHAwc8GDx4MXiXPZdlKWUQBxAbCxtdJl2SO5KRO5FVIlUSBxJeJl6GNoZEHEQIAwgXCRcCAQIBBAECBQIxeDE+mT4XOhcKGAoNHw0FCwU8kzwSLBIRKhEDCAM4ijgYOxgLGwsIEwgzfTMeSh4cRBw1gjUGDgY9lz0NIQ0sbiwkWSQWNRY5jjk7kTsTMBMmXiYpZimp1DP2AAAA7klEQVQ4jWNgwAUYmXBKMTAwMeKWY2ZhxS3Jxo5bjoOTC7ckNw8vbkk+ftxyAoJCuCWFRURxS4qJ45aTYJHELSkljVuOQUYWj+RIA3LyCrglFZWUVVTBLDV1MNBAltXU0tbR1QMy9A3AwBBNt5GxgQkDg6kZGJijSFlYWlnb2GI11s7ewdHJmQG7sS6ubu4QFhZjPTwJexcFeHmDAQdWSR9fMPDDKukfAAaBJFo4QIA3KBiPLD8fHskQwVDckhxh4Xi0iovhkYxgicQjGxWNRzImFo9kXHwCHtnEJDySySleuCW9U9PwaE3PwCMJBACPviJOBkifyAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.440;4.blob,1.1,2424.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.577;4.blob,1.1,1484.iVBORw0KGgoAAAANSUhEUgAAADoAAAAxCAMAAAC8okrZAAACQFBMVEUBAQECAgIAAAAoKCg+Pj4UFBQICAgNDQ0EBAQGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sBBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwUgICD///8bGxsTExMiIiIFBQUfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUSEhIrKysLCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysJCQkDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgJHRx1/fzR4eDE8PBgNIA1n/2cHBwOTkzwsLBIIEwhiYihlZSkeHgyYmD4QEAcqKhGUlDwICANWViNxcS4OIw5k92QCAgGKijg7OxiMjDk4OBdTUyJ0dC8tLRKSkjsbGwsTEwh9fTNKSh4JCQQpKRFERByCgjWJiTcBAQAODgaXlz0hIQ1ubixZWSQUFAgaGgs1NRaOjjkEBAFLSx58fDIFBQKRkTswMBOAgDRDQxteXiZmZil81rZhAAAB0klEQVRIiWNgYAQDJtIBAzMLGLCSoZWNHQw4yNA6qBzMyUlYK3ZhLm4eXjK18vELcIFoQSEwEEZmEdAKAyKiYCCGzCJSq7gEGEgis4jUig+MasUKpKRlyNcqS65WOWl5XFoVFJWQZZRV0LSqqkFodQ0udK2aWto6ulC2sJ6+qAgO2w0MjYxNwFrBOR1sgqmZuYWlFZAhZG1ja2eP0+UOjk7OLq5MDG7gnO4OFfXw9PJmYvLx9ZPEqREM/AMCgxg4wDk9GCwQEhoWHhHJxBQVHRMbh0cjX3xCYlIykl9TUtPSMzLBzKzsHNFcPRwa8/ILCouKUYKppLSsHMGrqKzCobW6prYORCNprW9AVdKIQ2tTM4QmkCQwixUEILqAIVkrZrFCtFZ8YCRrbWmF0G3tGEo7OiGJpKu7B6vW1hY8WnshjL5+bFonTJyEU6t9pxCEMXnKVCxap01nwql1xkwoY9bsOZhaZ82dh1srAsxfgKl14aIuYrQunrgEQ2t/H4yFVyvT0mXoWpdPWUGc1pWr0LW2r15DnNa169ajaV0wH87Er5Vpw0ZUrZsmbiZW65at21C0bt+BYBPQunPXbhSte/YSrZVp336cOYeQVibcmY4IrQC/rHoHfEP1jQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492326736;4.copy,1.1,2.10,3.399,3.950,2.19,2.14,1.1,1.0,3.399;4.rect,1.1,3.874,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.345,3.816,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.595,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.851,1.3;4.blob,1.1,940.iVBORw0KGgoAAAANSUhEUgAAAGwAAABbCAMAAAChx5DqAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAAByklEQVRoge2ZyU4DQQwFJ+w7Q9ghEAj7vq///2GIltq2NK3Jc95oJELXZVqWSz7kUIcUxTA6E0NXaCMfy8fysXwsH/uXx8aLySlsxhjC9MwsNGMMZW4emzGGsLC4BM0YQ1lewWaMIayWa9CMMYRuuQ7NGEPZ2MRmjCFsbWMzxhB2drEZYwh7+9iMMSK9g0NoxhhCvzyCZowhHA9Ofj+nZ4GenTVmCOcX4XNZBq7srDEjcn3TDd/bu8C9nTVlRB4Gj9CMMYSnZ2zGGG0CZtzs+Q0Bzbju+Q0FzLjZ8xsCmnHd8xsKmHGz5zcEMONmz28IaMZ1z28oYMbNnt8QwIybPb8hgBk3e35DwDJu9/xGBMy42fMbAphxs+c3hEraU6/C5t5vCJW0p16Fzb3fiFTTnnrZ3PuNCJhxs+c3BDTjuuc32gRNeyMGmnaFMdC0K4SBpl1hDDTtCmGgaVcIA027whho2hXCQNOuEAaadoUw0LQroxto2hXCQNOuEAaU9lTk/QaY9lTk/QaY9lTk/QaadoUw/Mluw8gwjO9fWvlYPpaP/a1jL6+Bt/RL1fo90Oi8Bz6K5EvV+j3Q+PwKfBfJl6r1e6gx+i/gNn4A1A+OAqhTkmcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.820,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.345;4.blob,1.1,2700.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.367;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAABIAAAALCAMAAABFyS02AAAAh1BMVEVNH01JHUkLBAsAAABDG0OUPJSTPJNZJFkWCRYDAQMFAgUBAAEJBAk/Gj96MXqYPphqK2olDyViKGKZPpkyFDIcCxxuLG4rEisUCBQfDR8KBAoHAwc8GDx4MXiXPZdlKWUQBxAbCxtdJl2SO5KRO5FVIlUSBxJeJl6GNoZEHEQIAwgXCRcCAQJbhRnPAAAAW0lEQVQImWNgYGRiRgUMLKxs7BxgJicXGHAzMPPw8vELCAKFhITBQIQBJC8qJizOzCwhCQZSQCFpGVk5eQUkjYpKyiqqaszIGtU1NLUgNsE1auswozsCXYBYIQCW0AgDVbgBzQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.440;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABICAMAAADbCwd4AAACQ1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRarok1fXAAAC9UlEQVRoge2ZZ1cTQRSGFxBj7703iogaFHusUeyiUbE37LFhBxV7b6CIvSuKDbvY9acpy+7eZefOZBxnd46yz4fkyWHu5D05ZM67G01zg7h4V7aVRHyc6gROEhIsrZNYV2EQjEC9+g1Mb9hIZRKMxk2aBgxt1ryF0ihsWrYKxF6kjNZtVCdg0LZde9URGHTo2El1BBM4Ryzr3EVRFgI4RyzrmthNXZ6awDliWfceCvPEpGcv1Ql8fHz+NaCbYyaHpGTRSejmmMkhOUlwELo5Yikp4olSUy3tndZHcBPo5qSl9+3XX3BbLZgxYKDpmYMEN4FujtjgIUPTRdMNGz4iaGho5CjBTaCbYyaH0WOCsRehQDfHTA5jxwkOQjfHTA7h8RMEJ6GbYyaHrImTBCehm2Mmh8lTeFZNnTbdadDNMbMthFk2M7JnOnVWZDbP5Jy5OU6Dbo6ZbSHMssmMhJw6bz7X5IKFhEE3x8y2EGbZLFpM6JKlPIPLlq8gjHeEdyKcuxJRHnJWrSaMd4R3IrRmLaI+PrUJaOSYqQYaOWY8QPuWbbZGjhmVdeujGzZu0hXat2yzN3LMaGzekrd12/YdukP7lm22Ro4ZlZ27dmtafsGeWOv+EmjkmFHZu6/qsXC/W7EMoJFjRuNAwcGqp0OHXclkAY0cMzpHqj+7oy7FMoBGjhmdY9X/d8f1F5JODxJo5JjRORE9mX/qdJ7ukk4PsvZDI8eMxZmz0cJz53WVdHqQtR8aOWbeQtZ+aOSYeYpA7fcQgdrv41PrKCq+wDDlXCxhGRv3+rppl0rNm+qYEVy+ctVy9/q6Zdeu3zDeDDOCm6XFt24b7l5fB7tz13xnzAjC9+6nPXhI/bNsyiKPGIbxuDz7icuhgKfPWEZQlPX8RYnojz5/TsVLljkoe5X7+s1b1zMB795/YJiDyo8V8H2Wft2PUf6JZTX5HAKXft2P3LDXtC8ZXxlGR/p1P3LDXtO+ff/BMA9Bbtj/pvInyzzjP2/uvwDhAQVelY+RJAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.362,3.516;4.blob,1.1,1112.iVBORw0KGgoAAAANSUhEUgAAAWUAAAAPCAMAAAALQy4BAAABm1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFABAQECAgKANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoxMTE+Pj4XFxcGBg9iYvMsLG4KCgoNDQ0FBQUiIlQAAAGJQfSPAAABYElEQVRYhe2OVVPDQBSF0zZIg1txgluLu0txd3d3ChR352eTScmQbpaZvcsDczt8D8mXczNnjiAomMyCb2IR/QjzDwj8SliN1qLHKgURSXBIKG2M2QSZjgiLGEZaeIR2ZDVaiw6rFElGUdGULTG2WMbV2IgT40lLSEwSYEZr0ZEspWgqy553apps3JKeAZ6PhMwsg2Xn5AKN1qIjL18zu6OgUJWi4hLDb6Vl5cDxqKmohBorVdU1do/V1hmO9Q2N0D7MNDW3AA1Oq7ONjNo7uNtQ0tkFNTjdPUTQ29fP34aRgUGowRkaJoKR0TH+NoyMT0wCDc7U9Ix3MDvH3YWU+QWowVlc8vpctq3wd+FkdW0daIxsSJuabjm29ZedXfhM5OztHwCNkUOnS9Oj4xPl6T5VcQtn57/Yi5SLS6ixcXX97Te3yuPuXuWBZ+Q/dB6fnonk5VXl7U/m+Ciu948fLp9qT1F5DdO/OwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.535;4.blob,1.1,1984.iVBORw0KGgoAAAANSUhEUgAAAEQAAABJCAMAAACzU3BeAAACx1BMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkV7gB8/AAACw0lEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaNgsIAzZ89RwZTzF6hgyMVLlyk35MrVa5QbwnD9BhUMuXnrNhVMuXOXCobcu08FQx48fEQFUx4/oYIhT589p9yQFy9fUW4Iw+s3VDBkSAIA+badtWZQ1EcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.558;4.blob,1.1,1364.iVBORw0KGgoAAAANSUhEUgAAADoAAABECAMAAADnTdarAAACE1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sBAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQUoKCgUFBQICAgEBAQBBAECBQIBAgExeDE+mT4XOhcKGAoNHw0FCwUgICD///8bGxsTExMiIiIfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwU8PBgHBwOTkzwsLBINIA1n/2diYihlZSkIEwgqKhGUlDwICAOKijg7OxgOIw5k92RTUyJ0dC8bGwuYmD4TEwh9fTNKSh5ERByCgjUODgaXlz0hIQ1ubixZWSQ1NRaOjjmRkTswMBNeXiZmZimcywSyAAABpUlEQVRIiWNgGAVEAkZGcnUyMbOwkqmVjZ2DCVWEkwsMOMkwjJsHDHjJ0MrHDwYCZGgdBaMADUDTMDlaBSFpWIgMrcKQNCxChtYh52AiAf7CRFQMDMSRWXCAvzCRkAQDKWQWHOAvTKRlwEAWmTUKaAXk5BXI16pIrlYleZw1ibKKKjJXTR1NXkMTQmtpo1WMDAw6unr6BlC2uKGRpAQOK4xNTM3M0cQsLK2sbWyBDDE7ewdHJ5wud3ZxdXP3QBf19PL2YWDw9fMnkFYDAoOCUQRCQsPCIyIZGKKiY2Lj8Ghki09ITEpGEkhJTUvPyAQzs7JzJHMNcWjMyy8oLCpGESopLStH8Coqq3Bora6prUMTqm9A5Tfi0NrUDGW0tIJBG3ZlWIoVBGjvAINO7FqxFCsI0NUNBj3YtY4WK1QB7b04xfr6J8CFJk7CTCR4tDJMnoKkdSpJWqdNnwETcpokRpLWtpmzYEKz5+BWhlVs7jxMSSK1zl+wkFytDIsWk611yVKytS5bvoJcrQwrV5GtdfWaFnK1tq5dR65WhvUbyNaKB5CpFQBM13Qcoh/msAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492326837;4.copy,1.1,2.10,3.380,3.950,2.38,2.14,1.1,1.0,3.380;4.rect,1.1,3.884,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.861,1.3;4.blob,1.1,892.iVBORw0KGgoAAAANSUhEUgAAAGIAAABbCAMAAAC/DqBZAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABp0lEQVRoge2ZyU4DMRBEHfadIewQCCRh3/fl/z8MYWlsS1PqlOlpIZDrMlapnvqQwzvEuXHpTIydaIlyopwoJ8qJcsKc+LOZnOI6BTE9M0t1GmJunusUxMLiEtVpiOUVrlMQq9Ua1SmIbrVOdRpiY5PrFMTWNtcpiJ1drlMQe/tc93Oid3BIdQqiXx1RnYI4Hgy/P6MTn17atUWcnvnPeeVzkXYtEZdXXf+9vvG5Tbt2iLvBPdUpiIdHrtMQVpHViXYsESKLEO1YIkZWJ9qxRIgsQrRjiRhZnWjHEiGyOtGOJUJkEaIdS8TI6kQ7lgiR1Yl2LBEiqxPtWCJEVifasUQdWZ1oxxIhsjrRjiVCGnJEL5cKkyVCGnJEL5cKkyXqNOWIXqkwWaKOrE60Y4kQVoRx9zvqRMmWo51ONUS2HO10qiGy5WinUwWRL0c7nSqIbDna6VRB5MrRTqcKIluORjpFYuUJSo5IrDTByRGJlSWy5WinUw1R0k7+x58L5UQ5UU5YnHh69nnBrwjIO5HovPq8OfiKgLwTifcPn08HXxGQdzJh/lt8AZURgMijkoiCAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.830,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.291;4.blob,1.1,328.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAb1BMVEWBgTR5eTESEgcAAABvby329mP19WOUlDwkJA8PDwZpaSrLy1L9/WawsEc+PhkuLhO3t0r//2dISB0MDAVkZCjIyFH7+2WoqEQbGwstLRKbmz/z82Lx8WGNjTkeHgycnD/g4Fpyci4ODgYnJxAEBALKBJZnAAAAQElEQVQImWNgYGRiBgEGFlY2dg4Qg5mTi5uHlw/IAAJ+AUEhIENYRFRMXIJBUkpaRlYOqEZeQVEJrEtZBaybGQBSnQLs5Twb0QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.112,3.345;4.blob,1.1,2012.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.367;4.blob,1.1,328.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAb1BMVEVNH01JHUkLBAsAAABDG0OUPJSTPJNZJFkWCRYJBAk/Gj96MXqYPphqK2olDyUcCxxuLG6ZPpkrEisHAwc8GDx4MXiXPZdlKWUQBxAbCxtdJl2SO5KRO5FVIlUSBxJeJl6GNoZEHEQIAwgXCRcCAQIJ07bYAAAAQElEQVQImWNgYGRiBgEGFlY2dg4Qg5mTi5uHlw/IAAJ+AUEhIENYRFRMXIJBUkpaRlYOqEZeQVEJrEtZBaybGQBSnQLs5Twb0QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.516;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA2CAMAAABJJ89KAAACtVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0B9ZW2AAACKElEQVRIiWNgwAUYmXBKEQ+YGCk3g5mFlXJD2NgpN4ODk4tyQ7h5eCk3hI+fcjMEBIUoN0RYRJRyQ8TEKTdDgkWSckOkpCk3g0FGlgqGjILBCeTkcUgoKCoRrUNeDpfxyirYxTF1qKqp4zJEQ1MLmzAWHdo6uMxg0NXTxyaMqcPA0AinIQzGJlgEsegwNTMHURaWIGCFwmJgsLaxxTQEqgMZ2NmDKQdHEHBCYQGBswumIVAdSMDVzR1Ce4CAJwoLCLy8McyA6UACPr4WmHYhgJ9/ABE6AoPwmcHAEBxCWEeoTRh+Q8IjIgnqiIrGbwZDTGwcQR3xCQQMYUhMIlXHKEABySlUMCQ1LZ0KpmRkUsGQrOwcKpiSm0eylvwCEFlYVFxSWgYRKa9IJlKvUiWIrKquqa0D0vUNjU3NLa0QqbaKdly6rMClnSW4DDDo6HTsYmDo7unt658AEpg4aTIDw5Sp0yBKp8/AZYgyuLRznAnMkLNmz7GfCxSaN3/BQojkosUgcslSCG/ZclyGhIJLO48VDAwrV61eAxZau279ho0gxqapm0HUlq0QpdtyCXsnbvuOkJ1gsV2799Tu3Qdk7Ie45ABE6cFDhL3DYDHzsOORoxDhY8dPAMmTkDA5BRY6feYsYe+AwLnzF2ASF4H4UvHlKVeuNkIErlVcx2UIOrBG4d24Wbzk1m0I+87de8Qaghvcf0C5GQ8ftVFsxuO7Tyh3yNNnJCkHACrLknCJtVV2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.532;4.blob,1.1,224.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAiCAMAAABV5mjpAAAAM1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sBAQECAgIoKCg+Pj4UFBQICAgNDQ0EBATQrhEiAAAAL0lEQVQYlWNgoC9gZITQTMwsrGAGGzsHE32s5uQCAwYGbh4w4GXg4wcDAXxSGAAAfVACYpqh5HsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.552;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAX0lEQVQoke3PSRKCUBAD0CYKyPQ/KCDzJML9b0j6DlSxYfN2SSoiDgB5PF0Kz1dfQUgRxWpihFqTUmRv9ZOrRaSWX1rVDW1NR/thpNPM7PKzkHX4s3PbdQW4xvvjqR8PUO0MufyFRLYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.571;4.blob,1.1,932.iVBORw0KGgoAAAANSUhEUgAAAW4AAAASCAMAAABM68SzAAABL1BMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgFDAVj9WMeSh4wdzBW1FYBAgE1gzUbQxtCpEJEqEQUMRQ8kzwDBwNj9mMGDgYUMhRm/WYLGwsqZyoraisBAwFd5l0oYyg6kDpMvEw5jDkdRx04izhOwU4CBAJe6V4mXiYFCwU+mT4SLRJn/mcNHw0eSx5j9GMECwQJFwkQKBBU0FQyfDJEqURCo0ILHAsPJQ8uci5Y2VgGDwZk92QcRRwHEQcSLBIKGApm/GYWNxYoZChc5FwBBAE9lj0ZPRlKt0o8lTxOwk44ijgkWSRf7F8CBgINIQ0fTB8ECQRi8mIgUCADCAMyfTJTzlMGEAYOIw4/nD9FqkVRyFFn/2cnYCdW1lYtcC0iVSIucy4AAQAVNBUIEwgyezIeSR7S0MQyAAABRUlEQVRYheWTR1PCUBSFn1jQACpix4otYsPeO6IiCth7//+/wUxWWbz72JwkZ8ZvkXkz556Z8y2ilEOd+g+wWEbqw14QBCyWDY1NYU8IAKhltLml1okV0zfiiVbcDlrAlm3ttS5ilr6R7Eghh5ACtox0dpkPunt69Y2+fuQOVsCW6YFB88HQsNAYGYUOIQVtmRkzxuMTk/rGlJ3EDqEEbjmdnTHFs3Pz+saCncMOoQRvubhkSpdXhMaqvQYewgjecn3DEG5ubQuNHXsXPIQRvOXe/oEcHh7FhcZx/gQ8hBEfLAuncnZ2LjasInoII3jL4kVJii6z2n/JbVwl0EMYwVuWK1XnW7p2SXtf6uZWbtzl79FLCPHB8uHR+Tw9u7x4X+r1zdB4//hELyHEJ8vcl8u392Um9VP1YwgZPJbR37AXBAGF5R8vijGAm0mr2AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,2556.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.590;4.blob,1.1,996.iVBORw0KGgoAAAANSUhEUgAAAFYAAAA4CAMAAABQdv/vAAABL1BMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsMDAX19WNKSh4FDQU8kzwSLBKkpEKoqEQmXiYucS5GRhz29mMODgYSKxI+mT4DAwHm5l1jYygDCAMVNBWLizjBwU44izgfTB8tLRL+/mcfHw00gTQkWSTQ0FR8fDIzfzNyci7Z2Vg2hTYhUiEYGAr8/GY3NxYBAgE9lT0aQRq3t0qVlTwLGgsMHQxZWSTs7F8GBgIbQxs4ijgAAQAJCQTy8mJQUCAyejIeSx6cnD+qqkUTMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7E8hSTAAABd0lEQVRYhe3XR1cCMRQF4PDsiootKhbsXbErWLCCFewFe/n/v8GEDDmZc9zlvpXezdxsvjOrmVwhIgSN8URFZRWUNZ6g6hp/q7au3vaSJ6gh2ujvNjXbWvIEUazFn21ta7dde4rtkMKb7ezqtl17SozLHm+Wevts1Z5+0f6EPzswOGS78jQ7POLP0uiYrcrT7HgMwE5M2qo8zU5NA9iZ2blyVZ5ik/MLAJYWl4KiPcUuyxUEu7q2bor2FJtKbyDYza1tU7Sn2MwOQiXa3TNP7QnaP4hj2CAlTxyms1DVeCJ3BFXJeP5fmV8DZI9Z2JNTDjZ7ds7AJvMp94hiC9HQxQDFXlyGjij26pqDvZEFDvZW5jjYO3nPwT7I8NUIxD4WnzhYeg5fClBsIs/CvhRfOVh6e3d/tDA28vHJwdLXNwsbiviDS8cNcuk4QS4dN8Cl4wa5dJwgl44b5NJxglw6TpBLxwl06dhgl44NdunYgJdOOf9LJ1g6P5LOTQK/0YxLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.609;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.647;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492326942;4.rect,1.1,3.894,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.367,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.584,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.871,1.3;4.blob,1.1,872.iVBORw0KGgoAAAANSUhEUgAAAFgAAABbCAMAAADA37KoAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABmElEQVRYhe2Y107DQBBFHXrHhA6hhd57/f8PQ6zE7koejc94iETA98WrW+YhL0dKUdSpM1JbabZoD7eH28Pt4b95eDg0OsY8mkaNT0wij6ZJU9PMo2nUzOwc8miaNL/APJpGLZZLyKNpVLdcRh5Nk1ZWmUfTqLV15tE0amOTeTSN2tpmHk2/1dvZRR5No/bKfeTRNOqgf/j1OToO6uWeYSHo5DR8zsqg89wzLKq6uOyG79V10E3u8UVVt/075NE06v6BeTQdlCBesp4DSHrPAyS95wCS3vMASe85gKT3HEDSex4g6T0HkPSeA0h6zwEkvdccSHrPASS91xRI0qvIIaUsclXwIr2KHFLKIlMVL9Irh5S2SIJ4yXoOIOm93w0k84Lixb6gQDIvKF7sCwok84ICybygeLEvKJDMCwok84ICybygQLIuKJDMCwok8wIBSUJTXQ8BSUJTTY8BSUKT3qNASvphIHkWrXQN39+87eH28H8+/PgU9Cy/0mG9Jyw6L0Gv8isd1nvC4u096EN+pcN6T1oM6Df+BCS7cUtWWhD4AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.840,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.280;4.blob,1.1,508.iVBORw0KGgoAAAANSUhEUgAAABIAAAAfCAMAAADdjm27AAAAulBMVEUGAgIIAwMDAQEAAADIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUjIyP39/eBgTR5eTESEgdvby329mP19WOUlDwkJA8PDwZpaSrLy1L9/WawsEc+PhkuLhO3t0r//2dISB0MDAVkZCjIyFH7+2WoqEQbGwstLRKbmz/z82Lx8WGNjTkeHgycnD/g4Fpyci4ODgYnJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QOafb9AAAAfUlEQVQokWNgYAQDJmY4YGBhBQM2JCF2DjDgRBJixgBUFuLi5sEU4kUX4uPmRxcSEIQwhYRF0I0XFROXkESzUUpaRlZOHt0RCopKyihCKqpq6hqaSEJa2jq6evooZhkYGhmj2Whiis+Pg0LIzNwCU8gSXcjK3BpdyMYW1SwAHFEN/xx9t0QAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.440;4.blob,1.1,2236.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.525;4.blob,1.1,1764.iVBORw0KGgoAAAANSUhEUgAAAEEAAACMCAMAAAAUXzQdAAABm1BMVEUAAAAqKiosLCwGBgY+Pj4RERF0dC9TUyIGDg4UFAiYmD4aGgsECwtf7Oxh7+8GEBBLSx58fDIBAQECAgIDBwdX19dY29sICAiAgDRDQxsxMTEXFxcaGho0NDQKCgoNDQ0FBQUDAwMvLy8YGBgUFBQEBAQoKCgGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQSEhIrKyszfzMJCQk2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAEBAEFBQIGEAYOIw54eDGZmT4iVSIucy4YGAofHw0yezIgUCAFDAUeSR5HRx1/fzQ8PBgeHgwQEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRGJiTcBAQA6OhcLCwV+vXP4AAADSUlEQVRoge2Z+VMTMRTHFy2KiKKtWq2KeCB4Iroo1APxAE/wBO8DFQUVD8AD79s/2+5uttkk72VfEmeYMv3+sE2T8GGS2X397MTzauZ5auZnaqPGgoXAKE9dXemiJSyqX6wDNCxZ2phCWLZcGcrmwmSD9oqVqxoCQvRNmJVnhNVrFEIhE2Yt76nJZNbJs9Zn4n1Q07QhTDPvyQvfyrM2YoTZTDYH7FcuZ0Aw3S+AsAnYr1qUUNisErT3bsUTorvchRDd5VscCNFd3uJAmBurgGNFSFavmJDsSycI1YsRkn3aahhGqF6MkOwzfLqBfaikajjrAfavSgiShauHMKonbIWrhzCqJ+Th6iGM6glzYxXG0RCEGmhFUA3OlKAanCmhYtLa5krYtn2HK2LnLlfC7vY9roiOva6EfX6rI6HT348N6SsFz4Gu8AN4iPSVgqe7GFwPhpMPCSP6SsFzuCO4toSTjwgj1FX0HMVGiKvoPXYcGyKu4oR/MmVGWvr6T5lMB6r96TNG/7CgVPuz5zqNCE1ytT/fP2AEUDN4wRHglIuugEuXHQEDV66yluXvRe9QX9y0JAy3l6u8JeHa9XLTknDjpkyg1gKWW/6wTABrAa4Pt/1BmQDVAqjysdzx71JWAVU+lns+/6HSrQLP/ZEHlFXo8rAoE0zTNWRLeDQaxPMejzyxJIyNByk1nj6L66sh4flEkFKj7cVLOwLPq9eWf/j/U2kuNzkVfY5NC90GLjc1CRLoLvem/i1MILvcu/ceTNC4nJCZDx8RgsblhHz6/AUj4C4n5Ou3uKUQcJdL5vuPnygBd7lkpn/9xggal0smcSIhE2gulzyRkAk0l0ueSMgEmsslTyQkgqnLKQQblxMJVZejuZzyDMR9ZJdDCWSXQwlkl0MJqsvxCD6EEQCX4xF8CCMALscj+BBGAFzOcBWAyxmuAnA5w1XQXQ4lkF0OJZBdDiWQXQ4nUF0OJ1RdTkqKy2l2Mk6KyxEIKS5HIehdjkLQuxyFELucA6G7qE4yI0Qu50LQuhyFoHc5CkHvchQCczl+0iCcObDZ0Xvq6AxIYC7HTxqEMwc2O3pPHf8DEWKX4ycNwpkDmx29p078BQhpLpe+D5Yu9w+txtZy+som5wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.573;4.blob,1.1,2240.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAA2CAMAAADqI2vJAAAC5VBMVEUAAAAnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4GDgYDCAMVNBUBAQECAgI4izgfTB8oKCg+Pj4UFBQ0gTQkWSQSEhIrKysICAgNDQ0EBAQzfzMJCQk2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQABBAECBQIyejIeSx4xMTEXFxcxeDEXOhcTMBM4iTgKCgoFBQUKGAoNHw0FCwUKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgYGBggICD///8bGxs1gzUTExMUMRQDBwMiIiIqZyoraisfH00dHUkEBAssbSwjIyP39/cfTU0dSUkECws5jDkdRx0bG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyU2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSUJFwkLCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysLHAsPJQ8DAwcYGDwxMXg9PZcpKWUHBxA7kTsDBwcYPDwxeHg9l5cpZWUHEBAHEQcLCxsmJl07O5I7O5EiIlUHBxIUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhI9lj0ZPRkmJl42NoYcHEQDAwgtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgIEBAEFBQICAgEGEAYOIw54eDGZmT46OhciVSIucy4YGAofHw0LCwUyezIgUCAFDAUeSR4yfDIECQRHRx1/fzQ8PBgHBwOTkzwsLBINIA1n/2diYihlZSkIEwgeHgyYmD4QEAcqKhGUlDwICANWViNxcS6Kijg7Oxhk92SMjDk4OBdTUyJ0dC8tLRKSkjsbGwsTEwh9fTNKSh4JCQQpKRFERByCgjWJiTcBAQAODgaXlz0hIQ1ubixZWSQUFAgaGgs1NRaOjjlLSx58fDKRkTswMBOAgDRDQxteXiZmZinyoAhoAAADZUlEQVRogdWYdVgUQRTARwV1QRQDA+NEKUVsBFtEsLuxW7E7sbsVMbE7AMFuQgUUxRbs7q6/hbna3XszO3vc3cLvj9u3M++b+X3f7N2+ewjpyZETZWFyWVkrrUAjdx6lDWjk5WyUVqBgy+UjTdnlx0guwZpnDAXs8QVvYCeYKVgIU1hqBdY8CQADhIo4ZHwWxRsUE8wUL4FxlFqWNY8OZIBQydwZn454g1KCGcueLGSAUOkypHwLnyyEqqwTacqyJwtSjitvhlVNhbOLq5x0zTMm/mrJxM0do+JHIBUqylrXQ/2MVcqcnSeHqcyPIKpUtZW1bjX1M1Y9c3Y1amK8+BFALRfvzO1jVnxqK22QHamjtACNuvWUNqDgXb+BJvJoqKgIQo18G4tGVH7O2jAL2DURjfhbBWhDxe2a+op/PJs114Vmt2vRshX/1rq1aL5NW/W1XfsOmpGOnXSTGjvzVd+du3Tt1l0TqwJ7cJ6EvJ69evfpmxF4cf5iO7BGM8ULH6F+/QcMHDQ4PXB3GjJ0WBAxb/iIkaNGj0FoLOcjtoNqNLiWNoZx4ydMRGjS5Cnw+1TH1GnTZ6BgbqbYDjpZuJaWz6zZc+bOm59ecfgtcAim5C1ctHjJ0mVoOadvANBO1iSsWLlq9Zq1OHQNWceFBhLy1m/YuGnzlvTALWyr2M581fe27Tt26u98du0m5O3Zu2+/Ogp1ENuZjwMHhfeHCHmHj2gjez/doEy78AhMJByxQq/Xj4ZFGWkXfQxzHI5Yodfr6MRJ7X8dmXanTmPOwBEr1HodoYCz54yzswznLyhtkO2xCZDOUY6Qi5eUVqAho+ceE6u+RscZzmnG4i9fYV1N9228mkD6fZbVc4+NkbRDiUmsq/HsrpGzmHvu15NvSNvdTLkl1y4owZ2cxdxzv31HZALZRd69J9cu6j4li9JzFxD54CGDHUpNk2tHh9xzF/DocTyL3ZPkpya1I/fcBSQlGphAdujZc5PakXvufF6kvGSze/XapHbknjufuDdvDU306Mfevf/AtC2bHaXnzictFTBB0NjHTyzrMdqx9dw/J3+BTKCxr9/CWfZls2PruX//AZpAYxE/f7Hsa2AHdvPZeu6//zDbob//jLKDuvlye+4MdmwY2AHdfGN67mayA8iCPff/fJ0RvQzriyoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,1144.iVBORw0KGgoAAAANSUhEUgAAAF8AAABLCAMAAAAh1atKAAABL1BMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsMDAX19WNKSh4FDQU8kzwSLBKkpEKoqEQmXiYucS5GRhz29mMODgYSKxI+mT4DAwHm5l1jYygDCAMVNBWLizjBwU44izgfTB8tLRL+/mcfHw00gTQkWSTQ0FR8fDIzfzNyci7Z2Vg2hTYhUiEYGAr8/GY3NxYBAgE9lT0aQRq3t0qVlTwLGgsMHQxZWSTs7F8GBgIbQxs4ijgAAQAJCQTy8mJQUCAyejIeSx6cnD+qqkUTMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7E8hSTAAAB5klEQVRYhe2Xx1IDQQxE5SGDAZMWMMEEk3POGUw2OUcb/v8bGG/NlnYFmCqPxGn71Lq847xpgIgywcYYKCouMRUbJ1+VlnkdW+Epr6gk/KpotenYLFJTS/gqVucd2ApPfUMj4Tc5YA5shae5pZXw406bObBZpL2D8FVnwruwFZ6u7h7C7016FzaL9PUT/kDMu7BZZHCI8IdHvAubRUbHxgP8ickpc2CzyvRMgD/rzJkDm1XmFxb9/KXlFXNgs8rq2rqfv7HpHdjssrXt4+/sxk3HxhfYW06Zio2Tv3/gVWycfAHmN/6hDDpi+EfHInzXt5qfOjkV4bu+BTWRXpLBu74FdRaV+Je40b4FdX4hhc/5FtTllRhf+xaunTMxvvYt3Dj7cvzeJNw6d3L8gRjcOwyftt8yPAIPj09ieO1bUM8cf5Kfo30LKpEW42vfgnp5fJXia9/q9+3tncXq35PzreZHMlkRvOvb3Pv/8SnCd30r7keJ/ejzrcR+9PuWez8q4lv2/Uh8y74fiW/Z9yPxLf9+DPqWfT8S37LvR+Jb9v1IfMu+H4lv2fcj8S3/fgz6ln8/Bn3Lvx+DvhXYjwHfCuzHSCbr4wvsR79vw/34a8L9+FfC/fhHwv2YP+F+zJtwP+bLv+zHL6i8gnIZxu5sAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492327042;4.copy,1.1,2.10,3.361,3.950,2.57,2.14,1.1,1.0,3.361;4.rect,1.1,3.904,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.525,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.881,1.3;4.blob,1.1,848.iVBORw0KGgoAAAANSUhEUgAAAE4AAABbCAMAAADqb0MHAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABhElEQVRYhe2Yx04DQRBEx+TMYjIYDLbJOYf//zDESN4d5Fb5tdjDCqYuO6rQBw7PEiGMU2tibMWjfC6fy+fyub+sySnmwXR6ZhZ5NJ2bZx5MFxaXkEfT5RXmwXS1WEMeTNvFOvJourHJPJhubTMPpju7zIPp3j7zWNo5OEQeTLvFEfJgetzrf38GJ1Gd1NMLW6dn8XNeRF2knl6Yurxqx+/1TdRt6umFpbvePfJg+vDIPJrWIY1vq+dGuu75ka57bqTrnh/puudGuu65ka57fqTrnhvpuudGuu65ka57XqTrnhvpuudDuvUKKcitH4FSI0i3XiEFufUjMNQo0q1XCnLrR2AojW+r50a67jUH6XBBkU4XFOlwQZFOFxTpcEGRDhcU6XRBkQ4XFOlwQZEOFxTpbEGRDhcU6XCBkG7B3U4R0i24mylDugV3K6VIr1QL0n+z+K9q9j/c8rl8rvnnnp6jXuxXdU73ylfrNeotmK/qnO6Vr/ePqM9gvqpzuvdjUd/f7gtbg2dMrzfEBgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.850,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.280;4.blob,1.1,700.iVBORw0KGgoAAAANSUhEUgAAACYAAAAfCAMAAAC8lk/5AAABDlBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/eBgTR5eTESEgcEAgJbJSXSVVVvby329mP19WOUlDwkJA8JBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhmnQ0P7ZWWBNDQuLhO3t0r//2dISB1QICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsCAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgxDGxu7TEzzYmKcnD/g4Fpyci4ODgYtEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92SydoseAAAAuElEQVQ4jWNggANGJjBgRmZhASysYMCGzMIC2DnAgBOZNfwBFzcPccp4iVHGx82PRVRAEE1ASBhCi4iKwYTEJSRZWXCYKiUtIysHYsgrKCopq+C0XVVNXUNTi4FBW0eXQNzp6RsYMhgZm5ia4VFkbmFpZW3DwGBrZ8/q4IhDkZOzi6ubO5Tj4emFQ5m3j68fEtcfh7KAQAwhvEkbAfAmbQQYSUkbAYKCQ4hTFkqMsrDgcGKURUSi8gH1SRIQkK2ntwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.345;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAAcAAABZCAMAAADFCM5mAAABXFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXACAgEICAMFBQJMTB///2ewsEcPDwY0NBUjIw4KGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwdSB1n/2cJFwkGDgYjViNe6F4zfzNX11c8lTxV01U/nT9a3lo3iDcBAwFl+WUsbCwSLBIUMRQtby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx4GBgLIyFEoKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8JCQTy8mJQUCCcnD+qqkVBRvLYAAAA5klEQVQokbXQeVOBURgF8Espoo0WIVnKklZ5E0WrrdVWtO9IpPL9Z8w95wvUDOef33mfmXvvvI8QMio1EGoV6OvXwIFBoNUNQb1hGI6MgrFxIzRNTMKpaWCesUCrjXfO2kUvM+eQcQqXW2ZeLHhkvN17wOeni4ElluUVurq2zhLcoCFlE4aVLQ4iUbq9Q2NxursH9g8O4ZGSgMlUGmaOwclpWHKWOsfnRbY7//PP5LBfh8hjv25RwH49fz5fvLxiKZXp9c0tvLt/4ODxiT6/vLK8vdNKldY+6iyfDdr8ysHW9w8Hv+0O9e0fZeuFcHcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.550,3.440;4.blob,1.1,1476.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABxVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQIGDg5OTsI4OIoECwtf7Oxh7+8GEBCMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiwDBwdX19dY29uQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg74kJkdAAACR0lEQVRYhe2W91MTURCAj0SIoIIFsXdTVMSo2CMWRI3GAhZQFFFRsGtssWGioKCCYuHvdbhLbp9vl5fczebeOHPfD/ARdjM7DJf5DIORigDnuzERqNB9QZ5g0NYZlVUaDxEIzayuKfis2TovEZhTWxfK69x587WeQrKgPlR8yGsWNui+ALNo8RLdJ2CWLluu+QL4ILBtxUpNtxSADwLbVlWu1nePCXwQ2LZmrcZ7pmPdet0X+Pj4eA4EL2U8hCMOFyB4KeMhEnY2D8FLWDTq/pBYzNYNGzc524Xgxda4uWmL25viW7dtL3jzDme7ELyE7dy1u9HtUXv27ovnNbG/xdkuBC9lPBw4GC8+JALBSxkPhw47m4fgpYyH1iNtzhYgeCnj4eix4+i1ZFKxAMFLGQ8nTqKXUqdOn7HsbHuHIRkEL2XCIOyqOXf+gqwXO7vQ2KXL3SnLrlztMSSD4KVMGIRdNc2dCVmv9aoWrt9ABsFLmTAIu2pu9iG9dVsx3z9wB1kR7MFSN1rv3iNUQc/9B8hKXSl1I/HwEaE+Pv85kLmUaQIylzIFkLTcJmQuZTKPn6SfPntuKiQtt4mZS5nEi5eZV6/fvDUdkpbbhMylTObd4HvDyOY+TPNrLiBzKZP5ODT1dfhTmY+CzKVM4nNuZOrb6Jfy3gSZSxniq/WX+lbeoyBzKUOMWf9T4+YPTI8/BjKXMsT39I/sxM+M6UyPP25pyFzKCH79Tg//mTSV6fHHLQ2ZS5kn4JaGzKXMC1y0dPlx0dL/8hcwkJIXBJ1TDQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.489;4.blob,1.1,1888.iVBORw0KGgoAAAANSUhEUgAAAaIAAAAXCAMAAAB+pbsvAAACqVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU85LSx58fDIFBQKRkTswMBMGAgIIAwMDAQGsRUXYV1dWVtYtLXCAgDRDQxteXiZmZinIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkpHRx1/fzQHBwOTkzwsLBJ3MDDUVlZCQqRERKhiYihlZSkOBgYcHEZjY/YGBg4eHgyYmD4QEAcqKhGUlDwICAMyFBT9ZmYbCws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGNWViNxcS4CAgGKijg7Oxi8TEw3NzfBwcHp6emTk5MMDAwtLW88PJQPDyQ4OItOTsGMjDk4OBdTUyJ0dC/pXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbUGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8tLRKSkjsbGwsTEwhLHh70Y2Oqqqra2toEBARHR0f///9BQUETEy5KSrdnZ/8dHUhUVNAyMnx9fTNKSh6pRESjQkL09PSEhISMjIwoKGRRUchlZfsLCxsuLnJYWNkJCQQpKRFERByCgjX3ZGRFHBwJCQlsbGzR0dGgoKA/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc8PBiJiTcBAQAODgaXlz0hIQ1kKCjkXFwCAQH19fWNjY0/P5xaWuA8PJUGDg5ubixZWSTCTk6KODitra1EREQQECcCAgSMOTkkJFlfX+wCAgYUFAgaGgsECwtf7Oxh7+8GEBA1NRaOjjkEBAEhDQ0sEhIpKSm3t7dfX1/t7e0EBAliYvIgIFABAQECAgIDBwdX19dY29t9MjLOU1NFRaoxMTE+Pj4XFxfWVlZwLS0KCgoNDQ0FBQVBeLkRAAACmUlEQVRogWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNhbtgIAg0UqFhEVo6BDigagYGIjT1hYJSXSWlDRMBBuLdkBGlni1cvK0cwcJQEERDJRoaomyiioGaxQQC9TUwUCDppbwamphsEbBKBgFo2AUjIJRMArwAm0dXTwsmgA9fbK0GRgaUdkhJABjk4Gzm8HUDB+LFkBfjzx95hbUdQcpwMQYp5SlJa1ZVtY2DLhZNAC2dvbkaXRwdKKuS4gHzi6uyFw3dw84m8vTy5vGLB9fP6hl2Fg0AP4BZGoMDAqmqkNIANwhYCo0jDk8IpKBIcpaJzoGKkWdkTn8rNg4mEOwsagOAuMTyNWamERFd5ACeJNTQFRqWnpGZlY2kJWTm5dfUEg3+4uKS/CwqA5KywzI1VpuV0FNlxAPKqvAybm6ppaBoa6+ASzW2NTcQjcHtLbhY1EbWJiTr7e9g3ruIAV0doGp7h4QydILJLT7+ieYTaSbAyZNxseiMpjiOJV8zdOmU88hJADlGTNB1Kz62SBqzlyGonnzFyxcREcXLF6yFA+LymDZ8hXka165ajX1XEI8WLN2HZheD8lFGxg2bpqEaPJSu6mNFTRtxseiLkhKxCK4ZQuRurduo6ZbiAXbd0DonZC6aBfD7j0ISWo3tRn2KophsBj27T+Ah0VVcNDuEKbg4SNHjxGn/fiJk9R1DzHgFM9pCOMM89m6c+fTUWWp3cDGMjEOBBcuXsLDgoDLV8DgMiH/EFCHdTr86rXrhwmZCwG4p8ip5D5s6m7chAkiLVSgHcCcGAeBjbfwscDg9h0wuEvIAgLqSJkOxwZwTpFTyX3Y1N27T6orKQHkT4w/eAgGj6iljtqA2u4bKH+MToxTBQAAmvoS446+O3oAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.513;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAe1BMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICAIAwOcPz+qRUXIUVH/Z2dgJycoEBA0FRUTCAj8LUdnAAAAW0lEQVQYlZ3MNw6AMBBE0SVjco4mx/ufEMs0yNPxiy2eRkv0N003wEwLyHZclZjnwywIgaI4AUszoLwAKqsarGmBup6rNIyTuHyWsdeWVZxtlx2f7XnJbvhL9ACdCAVxek0O8AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.342,3.516;4.blob,1.1,1048.iVBORw0KGgoAAAANSUhEUgAAAVoAAAAPCAMAAACSu/e0AAABg1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAGdLRzRAAABSklEQVRYhe2O1XICQRBFB9gIGyFKPMQN4u5C3N3dPcRdPj3AMmRrMg/Tsw+hqZyH7jM9VbcuIV5MZhKeWJQIxiKjogMXUeOl6LGqMcwlNi4+6GaTZPVQx6LYWEtIpJ+ixkvRYVWT2FNyCrVUexq8NQrSlQzWMrOyCcx4KTpy1FyqDoe28/IDQgoKjdQPZYqKf1lJaRnQeCk6yiuoOV2VVX6prqnVLnX1DfLl8dHYBDVRmltanZq1tWu7o7NLpiJWunt6gQanz93v3wOD0hEoGRqGGpyRUd8cG5+Qj8DI5BTU4EzP+Obs3Lx8BEYWFpeABmd5ZdU719alA5CysQk1OFvbhOzYd+UDcLK3fwA0QQ7VI6rHrhNyemakJUrOLy6BJsiV20P1+uaW3N0baYmTh0eoifH0/OMvr3Ld/uHx9v7x1xXCFc/nl/75DR7iRXRJu7yMAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.535;4.blob,1.1,2508.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.573;4.blob,1.1,1036.iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABjFBMVEUAAAAxMTEYGBgBAQECAgIBBAECBQIBAgE+Pj4XFxcxeDE+mT4XOhcKCgoNDQ0FBQUKGAoNHw0FCwUgICD///8bGxsTExMiIiIfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwgOIw5k92QoKCgUFBQICAgEBARszExxAAABOElEQVRIiWNgYGBgZGIgDYxqGGEamFnAgJmBgZUNDNiRWQhZuAZGDjDgZGDg4gYDHmQWQhaugZcPDPgZGAQEwUAImYWQJcMPwx4Ii4iSqkGMNA3iIvyoAhKSUshcaRk0DbJyEFpeQRHCUFJWUVWDSrKra3Bz4bBJU0tbRxfM0tM3MDQyBjLYTEzNzC1wus3SytrG1g7CtndwdGJgcHZxFcLvHzd3D08g5eXt4+vnz8AQEBgUHIJHeWhYeERkFEN0TGxcfAJYJDEpmTtFHYfy1LT0jMwsICM7JzcPIZxfUIhDQ1FxSSmYUVaOKlGBQ0NlFR7XIjImkQCRMYkEiIw5CuAAb7lUXYMZlQQ01JKmwaKGjTQNdfWYYqjFPQ6NyLJQDQ2QAr0RuwZkWaiGJkiB3oxdA7LsIHMSANWyMY5KpmJ8AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492327147;4.copy,1.1,2.10,3.361,3.950,2.57,2.14,1.1,1.0,3.361;4.rect,1.1,3.914,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.291,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.595,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.891,1.3;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAAEQAAABbCAMAAAD9TdPOAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABfElEQVRYhe2Yx04EMRBEveTMsGRYWFhyzvH/PwzhS1tyqaZMLyLIdXGrVNWHOTy1JoQ2dUZaI+2qS+qSuuSvL/lZjY5pHtX4xKTkcU1Nax7VzOyc5HHNL2ge1WKzJHlU3WZZ8rhWVjWPam1d86g2NjWPamtb85h6O7uSR9Vv9iSPan9w8PkcHkX1Uk/X8Ul8Tpuos9STdX7Rje/lVdR16qm6GdxKHtXdveZ9l1QAWg40VABaDjVUAFoONFQAWg41VABaDjRUAFoONFQAWg41VABaDjRUAFoONFQAWg40VABaLm+oALQcaKgAtBxoZFBEU0hBCZCZQRFNIQVljswcimhKQZkjUwWg5UBDBaDlhovM4qvQA0XeKL4KPVDkjeKr0ANF2ii/Cj1QpI3iq9ADRdoovQo9UKSN4qvwy1BEeEw9CYoIj4mnQRHh0bziq9ADRU/jv+n3/PqoS+qSYS15eIx6wpMtobnOc9RLgJMtobnXt6j3ACdb0przfpMPxWtXz9DgRIIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.860,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.345;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAAcAAABZCAMAAADFCM5mAAABXFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXACAgEICAMFBQJMTB///2ewsEcPDwY0NBUjIw4KGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwdSB1n/2cJFwkGDgYjViNe6F4zfzNX11c8lTxV01U/nT9a3lo3iDcBAwFl+WUsbCwSLBIUMRQtby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx4GBgLIyFEoKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8JCQTy8mJQUCCcnD+qqkVBRvLYAAAA5klEQVQokbXQeVOBURgF8Espoo0WIVnKklZ5E0WrrdVWtO9IpPL9Z8w95wvUDOef33mfmXvvvI8QMio1EGoV6OvXwIFBoNUNQb1hGI6MgrFxIzRNTMKpaWCesUCrjXfO2kUvM+eQcQqXW2ZeLHhkvN17wOeni4ElluUVurq2zhLcoCFlE4aVLQ4iUbq9Q2NxursH9g8O4ZGSgMlUGmaOwclpWHKWOsfnRbY7//PP5LBfh8hjv25RwH49fz5fvLxiKZXp9c0tvLt/4ODxiT6/vLK8vdNKldY+6iyfDdr8ysHW9w8Hv+0O9e0fZeuFcHcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.449;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.783,3.487;4.blob,1.1,1516.iVBORw0KGgoAAAANSUhEUgAAAKYAAAArCAMAAADFeANDAAAB8lBMVEUAAAAGDg5ubixZWSQECwtf7Oxh7+8GEBA1NRaOjjkEBAEDBwdX19dY29sFBQKRkTswMBMGAgIIAwMDAQFeXiZmZinIUVH/Z2dgJycoEBA0FRUTCAgHBwOTkzwsLBJ3MDDUVlZiYihlZSkqKhGUlDwICAMyFBT9ZmYbCwsCAgGKijg7OxiQOjq8TEw3NzfBwcH39/fp6emTk5MMDAxTUyJ0dC8EAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbUbGwuYmD4TEwhLHh70Y2MLBASqqqra2toEBARHR0f///9BQUF9fTNKSh6pRESjQkL09PSEhITr6+uMjIxERByCgjUPBgb3ZGRFHBwJCQlsbGzR0dGgoKAODgaXlz0hIQ1kKCjkXFwCAQH19fWNjY3CTk6KODitra1EREQhDQ3+Z2csEhIpKSm3t7dfX1/t7e0BAQECAgJ9MjLOU1M6OjrExMSXl5cODg4xMTE+Pj4XFxfWVlZwLS0KCgoNDQ0FBQUqKioaGho0NDQREREvLy8sLCwGBgYMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgbmXV1jKCiLODjBTk4tEhIfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18JBATyYmJQICAICAicPz+qRUWsMaSbAAACOElEQVRYhWNgYGRkwAeYmPFK0wuwsLKx45Pn4OSil1PwAW4eXhZ88nz8AvRyChYgKAQGwoRViojS3jU4gZg4GEgMoBOIAZJSYCA90O4YBaNgZAAZWTl6WymvQIYmRSVqO4MQUJAnQ5OyiirVHYIXqKlrkKFLU0ub6i7BC3R0wZSevoGhkTHx2kxMaeQe7MDM3AJEWVpZ29ja2ROvz8HRiVZOwgacXVxBlJu7BwODp5c38Rp9fGnlJGzAzx9MBQSCyKBg4jWGhNLEPdhBWHgEiIr0igJR0THE64yNi6eNk7CBhMQkMJ0MCc0UErTSs7uRmgah0yFpM4MErXTsbmRmZUMYOQa5nnn51qToxd3dKCgEgwJCJhCrjqGoGMYqKTUIKisn3pEMeLobFZVgUEXIAGLVMVTXkOQwIkFtHRjUU0vdKBjEoABLdgCKUVUdFUBDZWUjulhTZWUzNdVRATS0YGaH2mYs1lOgjkyA3N1oaMWioA2L9SSqa+/oJNt9MIDU3aCVMxm6usl1HRwgdTdo5sye3j6y3QcFSN0NmjlTuH8C2e6DAUR3g2bOZJg4iVzXwQGiu0E7Z07OmkK2+2AA3t2gnTMZpk4j13VwAO9u0NCZ02eQ6zo4gHc3aOjMmbNmk+0+GIB1N2joTIY5c8l1HRzAuhu0dOa8+YLEOgdXpwDW3cBnPbJectQtWLiIgciZDJydAmh3o6EVSwNtMcR6ZL1kqVuylIHImQxCnQJ8DTRkveSrg81kAABU9etVxs64pAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.570;4.blob,1.1,1224.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA4CAMAAABzLa46AAABoVBMVEUAAAABAQECAgI0NDQ+Pj4REREKCgoxMTEYGBgGBgYoKCgUFBQSEhIrKysICAgNDQ0EBAQJCQkBBAECBQIBAgEXFxcxeDE+mT4XOhcFBQUKGAoNHw0FCwUDAwMgICD///8bGxsTExMiIiIfH00dHUkEBAsSLBIsbSwjIyP39/cfTU0dSUkECwsbG0M8PJQ8PJMkJFkJCRYWNxYzfjMbQ0M8lJQ8k5MkWVkJFhYEBAkaGj8xMXo+PpgrK2oPDyUaQRo2hjY8lTwoYigOIg4ECQkaPz8xeno+mJgramoPJSULCxwsLG4+PpkSEispZCk9lz0fTR8LHBwsbm4+mZkSKysDAwcYGDwxMXg9PZcpKWUHBxATMBM1gzU7kTskWSQLHAsDBwcYPDwxeHg9l5cpZWUHEBALCxsmJl07O5I7O5EiIlUHBxIAAQAUMhQxejEwdzALGxsmXV07kpI7kZEiVVUHEhImJl42NoYcHEQDAwgQKBAtcC07kjsmXl42hoYcREQDCAgJCRcBAQILGwsJFxcBAgINIA1n/2cIEwgOIw5k92TFjjbVAAABsElEQVRIieWWZXfCMBSGA0OmjA0GEzbmrsxdmLu7u7u7wrZfvZICLW1vD0v4sMOeL7w5IU+4JSe9CFGhUCrpBC5CVCo1tUSj9ki0oeSWsP8nYf5CF0QSvFLBhHAVJoJAEolXRjFJF43RE0j0eGUMZTleKMrhoCjnFwgl7voV0t+ONWCM/CQh0bL1x0lLTGZMPD8xG+sEEg1bf4K0JDEJY+En/lVA8UyYjZOJFwc9v36wKdbUQEjS6CXpVvFhEkkyMrP4w+wcwXxuHvuZX1AIS4qKS0rL3NloKzebgF9UUVlVXQNJUG1dfUNjExMMzS2tbXbAgVB7R2dXdw8gYejt6x9AaHBo2AIqMCOjY+OAZGJyanpmFqG5+YXFJRnF8srq2vqGpGRza3tndw/H/YND85ENUByfnJ6dX7BZJLm8ur7hRrd394Dk4fHp2ZNFkpdX3/EbIHn/4LJfh83nUpTALwn/UiSW8C9FYslfJyi6R4fTe/zIX+gO5ye9xO400Eu+vr0RaC2AhcCsUCLfWgGzQol8awXMBnk5RMAS+T7ST4l8H+mznbB75JDvI/kEsHv8AartOZVwtx/mAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492327249;4.copy,1.1,2.10,3.361,3.950,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.924,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.590,2.16,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.901,1.3;4.blob,1.1,796.iVBORw0KGgoAAAANSUhEUgAAADoAAABbCAMAAAAVzWblAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAABXklEQVRYhe2Xx04DQRQE1+TMkpNJJucc///DECMxz9IWbIEMyNLWZUY93Ye9lOyiqKM1UFtpps20mfZy+ncMDrkMGB4ZVRkxNu4yYGJySmXE9IzLgNlyTmXAfLmgMmJxyWXA8orLgNU1lwHrGy6r0t7cUhmwXe6oDNjt7L0f+weJdndWx+FROo7LxEl3VsPp2Xw6zy8Sl93Z11x1rlUG3Ny6rBdIhVDPKoR6UiHUswqhnlQI9aRCqGcVQj2pEOpJhVBPKoR6TiHUkwqhnlQI9SpaoVuBqqlohW4FqaaqFbqRaqRCqGcV0gvVWK3AwmoliIXVSpAXVitBLKxWgrywWgnywmoliIXVSpAXVitBXlitBHlhtRJ8LKxWgrywWgnyQmmFBaO0goJxWiHBWK0EefF9XfzWb5n/p+/+vzbTvpze3Sce+BZTeG09Jp4KvMUUXp9fEq8F3mL6yevPvvUNr9BLiabX4CQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.870,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.280;4.blob,1.1,1156.iVBORw0KGgoAAAANSUhEUgAAAEMAAABOCAMAAABMilufAAAB1FBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXDXnORMAAABSElEQVRYhWNgwAIYmcCAGZlFKmBhBQM2ZBapgJ0DDDiRWaNgcAEubh4qmMFLsRl83PwE1QgICiFzhUXQ5EXFILS4hCROM6SkZWTloGx5BUVWFhzqlJRVVNVwGaKuoamlrQNk6OrpGxga4bTM2MTUzNwCp7SllbUNA4OtnT2BfOHg6OSMXcbF1c3dw5OBwcvbx9cPjwn+AYFBwSHYZELDwiMio8DM6JhY1rh4HCYkJCYlp6Ril0tLz8hE8LKyc3CYkZuXX4DLhYVFqPxiHOpKSnGZgB2QXwIiAPklIAKMloCDH5SVV1DBjEqKzagqr6bYjJpaio0YBaNgFIyCUTAKRsEoGAW4QF095WbU11FsRENjE8VmNLdQbERrWzvFZnR0dlFsRncPxUb09vVTbMaEiZMoNmPyFIqNmDptOsVmzJhJsREMs2aDSAD2wDMOcThk6QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.421;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUMDAX19WNKSh4AAACkpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkWKI6i3AAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.430;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABSCAMAAAB5RiaFAAACW1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRarxde+lAAADEUlEQVRoge2Z91fTUBiGA05ArHvvvRgialHcdVZxi1bFvXDXhRNQce8Firi3orhwi1v/LKUk+ULud2/i9aZXJc8P7dPT+yXv6WnveZMqihUREZZL5BFZrXoN2Rno1KxVO1J2BhcXF5e/lqho2QlYREfJTmAmJkbXOrF1JQbB8NSr30Dzho1kJsFo3KSpR9VmzVtIjcKmZSuP9SJptG4jOwGDtu3ay47AoEPHTrIjaMA+olvnLpKyEMA+olvX2G4SA1UC9hHduveQmMeSnr1kJ3BxcfnXgG6OmRji4nknoZtjJob4OM5B6OaIJSTwJ0pM1LV3Uh/Og0A3Jy25b7/+nIdVvCkDBmqeOojzINDNERs8ZGgyb7phw0d4VfWNHMV5EOjmmIlh9Biv9SIU6OaYiWHsOM5B6OaYicE/fgLnJHRzzMSQNnES5yR0c8zEMHmKnVVTp003G3RzzAwLYZbNjPSZZp0VmG1ncs7cDLNBN8fMsBBm2aQGfGadN9/W5IKFhEE3x8ywEGbZLFpM6JKldgaXLV9BmN0RuxP+zJWI2iFj1WrC7I7YnfCtWYuoi0tVAho5ZrKBRo6ZHaB9izZDI8eMyrr1wQ0bN4UU2rdoMzZyzGhs3pK1ddv2HSGH9i3aDI0cMyo7d2UrSk7ubqt1fwg0csyo7Nlb/pi3z6lYKtDIMaOxP/dA+dPBQ86E0oBGjhmdwxWf3RGHYqlAI8eMztGK792x0AtBuwcJNHLM6BwPnsg5eSor5IJ2D7L2QyPHjMXpM8G8s+dCKmj3IGs/NHLMwgtZ+6GRYxZWOGp/GOGo/S4uVY78gvMMk86FQpaxca6va3axSLupjhnBpctXdHeur+t29dp19WSYEdwoKrh5S3Xn+jrY7TvamTEj8N+9l3T/AfVt0RQHHjIM41FJ+mOHQwFPnrKMID/t2fNC3j99fp/SFywzUfwy89XrN45nAt6+e88wE2UfSuH3LPy6H6PkI8sq88kHLvy6H7lhryifU74wjI7w637khr2ifP32nWFhBLlh/4uyHywLG/95c/8J0pMj5X6Cy0QAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.782,3.459;4.blob,1.1,160.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANBAMAAAB4JQK4AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAF0lEQVQImWNgIAYIMjAwmQQwsFUogHgACaoBNkBBnPoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.497;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAACYAAAAiCAMAAAAEcluKAAABR1BMVEUAAAB3MDDUVlYMBQX1Y2NKHh6kQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgaQOjq8TEw3NzfBwcH39/fp6emTk5MMDAwDAQHmXV1jKCgEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk5LHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ2pRESjQkL09PSEhITr6+uMjIzQVFR8MjIPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFhkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhbCTk6KODitra1ERES3SkqVPDwhDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18GAgJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICDWVlZwLS2cPz+qRUUIAwPIUVH/Z2dgJycoEBA0FRUTCAjvsKvFAAABNklEQVQ4jd2TR1MCQRCFG8xZV8WMOSAoJsw5Z1BRMYA5wv8/y/TMML1DU5ZXv0O/7tpXU3t4D0Dg8QJPUXEJubyeAjYoLTN7eUVlIVtVdU1ur61DqW9wGpua3TZfS6te29o7hHR2+bt7evus5/oH9DY4NCxkJDAKEAyNuW3j4Qm1TU6hTM+IGZm1npubl7qwuCRkObQiZHXNsq1vSN3c2kbdka/tWra9/QPUwyN5H8t/O7FscBoVMxY+k+e5cxGMX/ptF1xdJ7Lz5lbfd/dOJJnKsz08PmXn80veB4vXt98c/wl3jFmwAjTGPFgBGmMWWQESYx5VARNjFlUBEmMWVQETYx5VARNjFlUBMDFm0RUAHWMeXQHQMWbJVQB0jBPviI9upAKgYvzxiXzRjanAdxrJ0O2P/AC3zzVlGV1YegAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.332,3.513;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAAWQAAAASCAMAAABbyVR6AAABoVBMVEUAAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQVHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkosLCwTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAEICAgjC79qAAABjElEQVRYhe2YVXPCQBRGA6FFK6RCnXqpG9Tdhbq7u3upu/3qzmSzaSbkIXcHhi7Deblnbma+ufs9hmFC+BONVqsJ9A1BD6vThQX6hqCHDdcbkBlNgb3Eb5gtETKLjIoWNmpNKUWKlYuRbWLj4kVnbdhMRvD5dGC2JMgtMQl/VGtKKRKsXLJ8lZIqqlhymj0dcDhNZFgy5ZaVncPATClFQi6Xh9XhQDO/wIFXYsmFRWRP+P8Ul3hZaVk50JRSJFRUYnO6qqp5qamtwztccn1DI8kDaKWpGWpqaWltcyJr78A7XHJnVzc0jmZ6evuABqffPSAYLnlwiDiMSoZHoAZndEwQoeTxiUnyMBqZmoYanJlZQYSS5+YXyMNoZHFpGWhwVlbXkAglr28QR1HK5hbU4GzvoIlK3rXvkUfRyf7BIdBUcsQdYz1xnfITlXx2TngqvVxcXgFNJdduD9ab2zt+opLvHwhPpZjHJ6ip4/nlz1/f+MHaQr86fcr7x6fXLvSr08d4vr69dj96vYH5BbYkUk+KgcUlAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.535;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAMAAAAaPFxiAAACXlBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1ezMsgAAAB4ElEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cJEk5ABUfaWdZyF4jAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.570;4.blob,1.1,2668.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.571;4.blob,1.1,1552.iVBORw0KGgoAAAANSUhEUgAAAVoAAAAlCAMAAAA0jNHkAAABxVBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDAVj9WMeSh4wdzBW1FYFDQU8kzwSLBJCpEJEqEQmXiYucS4cRhxj9mNm/WYLGwsSKxI+mT4BAwFd5l0oYyg6kDpMvEwDCAMVNBU4izhOwU4CBAJe6V4fTB8SLRJn/mcNHw0eSx5j9GMECwQ0gTQkWSRU0FREqURCo0IzfzMuci5Y2VgGDwZk92QcRRw2hTYhUiEKGApm/GYWNxYoZChc5FwBAgE9lT0aQRpKt0o8lTxOwk44ijgLGgsMHQxf7F8CBgINIQ0bQxsAAQBi8mIgUCAyfTJTzlMyejI/nD9FqkVRyFFn/2cnYCdW1lYtcC0TMBM4iTgQKBAIEwgKGQoRKREJFgkwdjA6jzoIFAgMDAX19WNKSh41gzWkpEKoqEQUMRRGRhz29mMODgYqZyoraisDAwHm5l1jYyg5jDkdRx2LizjBwU4FCwUtLRL+/mcfHw0JFwnQ0FR8fDILHAsPJQ9yci7Z2VgHEQcYGAr8/GY3NxYBBAE9lj0ZPRm3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCAGEAYOIw6cnD+qqkUiVSIucy4yezIeSR4BaI+UAAACgElEQVRogeWaV1MTYRSGlyoSREAUF5TQERUVUQFLsERFpNiVIEUBBTvFXhAUO4oUfy9MLjjJlrN7vs/dzck+F5mdeffw5pnhhnlRlHVSUhUf4IllWnqGB61u441l5gYPSl2Hapm1MdvqlUCO1cWm3M20VpaQLfPyrd7ICVheFGyhlfKEalm4NQV/IW1bkeXFdtXihyQFVMvikh34CztLrS+CahmplCdky/IKNK6sKrBxUV5NK+UJ1bKmdhcW1+3eY+Nibz2tlCdky33pWLr/gJ2LBt2vdjJCtjzYiISHDh+xc9HUTCxlCdmy5egx8/D4iZCNi1DrSWIpRwQsT502z86E7VycVc9RSxkiYFl/vs0sulBr+BeI9qI9fJFayhABy4yOzrXPtmCU4tgnpasbuQAu1Yl8VW6IWF6+svZx9VqU67FPyo2byMU6t3qC9FJ2iFtGyqL0xj7Z43a4T7CTE55YRmrc73Qff1j6gX6vv4Ar9Bs8/U+MpqHCAUeqEgywdMjXYBrqG7zjSFViAZbCvneHhtFcNw2FRtrFmlgBlhK+9+6jsW4aGs31w0gOlhK+Yw8eorl2Gnr0WLSJE2Ap4fvk6TM0105D4xPCVYwASxnfySk01kxDz9VR8So2gKWU74uXr9A8fhp6rUbEq9gAlnK+b96icfw09E59L1HFBbCU8/0wjcbx09BH1Q//MgOWcr4zs5+wOH4a+jz3RaKKC2Ap6fv1GxJqp6GALwZysJTz/f7jp3monYaqR2SquACWcr6/5n+bh9pp6M/cgkwXE8BS0vfvonmmm4aWlv0wNoKlY776aSh1pdPwzeQCLJ3yNZqGsv45UpVggKVDvtppaBWmNm6NFEmGyAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.609;4.blob,1.1,640.iVBORw0KGgoAAAANSUhEUgAAAEsAAAA4CAMAAACCJvW3AAAAzFBMVEUGDgYDBwMAAAAJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4+j0DAAAAAzUlEQVRYhe3WRw7CUAxFUcf0TqgfQu+9JvTO/vcE/EiMiewBA98FnNmTHoCBTPnAHwjyUKEwYCTKQsXiCcBkKs1AmZksAmIuz2AVUsbHKiqgW6UyfixLVehWtaYtrDfIVFMVXKvVJlsd1XWtXo5s9dXAtYYjsjVWaW2ZkynZms0X2lqqFdnCdVtbWduhW42MtjZbOoW7+f5tHY4Wg4WnswMXO8ZBoXG9QffOQiE+ngyz/iaWWGKJJdYfW/Kjf05+tKfkR3tLfrTX/vhHvwB8pjWbLPfl/gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.628;4.blob,1.1,724.iVBORw0KGgoAAAANSUhEUgAAAU8AAAASCAMAAADsdKxdAAAAzFBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUFCwU4izgfTB8JFwkQKBA0gTQkWSQLHAsPJQ8zfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQw4ijgAAQAGEAYOIw4yejIeSx4iVSIucy4TMBM4iTgyezIgUCAKGQoFDAUeSR4SLRKZlla/AAABDUlEQVRYheXP2U7CUBSF4Q1VFAdACqJHAStWnFBU6jz7/u9kqybrxoQb/mQb/ovTc9Gsk88sr2TzUOmP2ywrR7+XhUVk31lSQt7K0vL3t7qyiuz7SkrMu7ZenLV6g5l3lZScd6MZ52erGU398/8nJehtb+ZHZ4ua95SUoHc7lM12drF9R0kJeruhZ/3Qwvb9JCXq3UtsPwy4fTdJiXoPUjsMQ27fTVKi3qO2HYeY23eTlKj35NTORufcvpukJL21i7HZZYrtO0pK0HsVrs2SOrbvKClBb2OSmd2MbrEH/CQl6L27L86Hx4x6wFFSYt6n527xiV5emX1XSUl53ybVn8v7B7LvLCkh7+AzP74AfA0WbX9GS5cAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.628;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492327356;4.copy,1.1,2.10,3.361,3.950,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.934,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.20,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,2.39,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.430,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.930,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.595,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.880,1.3;4.blob,1.1,1100.iVBORw0KGgoAAAANSUhEUgAAAE8AAABsCAMAAAAc0h8sAAABVlBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwUHBwOTkzwsLBJiYihlZSkqKhGUlDwICAOKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjmRkTswMBNeXiZmZilPQPwaAAABnUlEQVRoge3YR1PCUBQF4Ni7RuyKDXsvgL0r9t4r9t7//0Z4liSTuzhwn5DR9y3I5cxwmGFxFmgaU0Iit0H1qT7Vp/pi0+dESclYhkpJTYMyWHoGlqEys7KhDJaTi2WoPD0fylAuvQDKYIVFWIYqLsEyVGkZlqHKK7AM5K6sgjJUtV4DZahaT134Ud8guM1ZVBqbxKNZF1rMWTRa21zi2d4hdJqzKHR5uqEM1dOLZbHFWXQKa9EpnEWnsBadwll0CmfRKaxFp3AWncJZdApn0SmMRadwFp3CWXSKbeWpKwK2lacunH3lqQvGWXRK/BedolaeS608k1p5lrisfAR7D608vvfYysN7/z9W/u9w+v91qk/1ObTP6xP8+GX0WbLvr+oT+vHL6LNkXwYGhSH8Mvos2S/9fgrP8Mio3MKxcbl9E5NTUvv80zMSWgLGOTvHb5tfWFwKPZdXQi+ra+vcvo3Nre2d3b39g8Pwu6Njbt9JUNNOz84vguLd5RW3Twhc33wet3f3Ugp/PDzK7Xt69krt8728Su3T3t5ZH/8AFEtcFc2Dp1sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.280;4.blob,1.1,3536.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.411;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.782,3.449;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAAAYAAAAXCAMAAAAfmM5EAAAAclBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxuScNaxAAAATElEQVQImZ3MxwGAIABD0YAVxN57339FCSOYw3+3ABACdtLzA0sYxRL/prRDKzYxKclytigrUjct6Xp2GCcyLyvZdvYwJ7lud/S87Ad7PgLihBbicwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.497;4.blob,1.1,1356.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAhCAMAAAB+8wLuAAACAVBMVEUAAAB3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAwDAQHmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18GAgIhIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIIAwMJCQTy8mJQUCDIUVH/Z2dgJyecnD+qqkUoEBA0FRUTCAjHgmXBAAABsklEQVQ4je2TZ1cTURBAXyImCAJSJECkg/QqLdJDEQUUEJEuSpEiJfQuSAfpCEpHpPkryZvZTd5uXg5/gPth78zJnN18uYRQFErC54HNQ3ZVqdFKhZV7YvuI3dQqkJ39Y2v3Do5O5uWJswvY1Q301F3j4eklvdc+8zYvPr4gP/8AqsCg4OchoWGyD4RHmMbIqGhwTGwcVfyLBEISk5Kl9ym6l+KYmpYOzsgEZWXTpz5H9oHcPHHKfwUqeP2GqjCpiKr4rez+XYkwlJa9B5d/qAB/xPdXyu6rqmtwqK2rB39qwP0z/v8vsnvS2IRubgF91bXi3qZpT+z4Fiw/J51d3VQ9hl5Y+/rFHwYGNfqhYYv7kdExqvEJXCe/W1zImJqmzx8zd93dQyyK4wG1zs7N4yYtjgfWurCIm6Q4HkKtS8srsEqK4yHU+nN1DXemOB5CrYSsb6CZ4ngItRKyadjCwVwcD6FWI9s7aFNxPIRaKb920abieIi1Gtn7/QcHsTgeYq2U/QO0UBwPU62Uw6NjMBbXfQJo2Ymp1cjp2V8coLjzf8AFO8lqvbxilusb4D87WXALhRNkPYQFVIsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.570;4.blob,1.1,2636.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.628;4.blob,1.1,588.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4rKYypAAAAoklEQVQokXXP1xKCMBRF0YAdNCj2gtiwK9gL9vL/v+Q44yj7wfOUdW4mkyvEN4oqkFA4wiIao+MJjYWepFNSgQ2Z5oWMSWdzdF6nC0WwVK7AVVmDrboNN5pgq20E2ak7GHd74k/65GAIOqPx5zSZvj/pWiJoL6HCs7mAF0t4JT14LbvwRm7hndTgvX/g+8ccbbr0yT/D4nK1YfV2h8Xj+Vv+BfQrEG0udQxuAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492327457;4.copy,1.1,1.0,1.0,3.940,2.57,2.14,1.1,1.0,2.19;4.copy,1.1,3.940,2.19,2.10,2.38,2.14,1.1,3.940,2.38;4.copy,1.1,3.950,2.38,2.10,2.19,2.14,1.1,3.950,2.57;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.944,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.291,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.595,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.941,1.3;4.blob,1.1,552.iVBORw0KGgoAAAANSUhEUgAAABIAAABbCAMAAABJRyXBAAAAsVBMVEUAAAB4eDE8PBgYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgIGBgYICAjMzMx9fX3IyMhgYGBQUFDl5eUoKCg0NDQTExMpKSlFRUVCQkJLS0sEBAEFBQICAgGZmT46OhcYGAofHw0LCwWqkv1LAAAApklEQVQ4je3U1wrCQBCF4Y29u8auscXee33/B9MMkl3mQIJ4o7D/TYYvYVnmIkLoWRHBMxReNAYUTyTBUmmgTDYHli8AFWWJky3L8FmlClSrAzWaQK02F6fT5dSTfU4Dd+g9RmPK8ebJlN7MJDV/jYulTbRaUxshtu6On7Q/wKVM79R6/Umt15/UetVk+qi/WPRP/Au/pOOJOmtkXairRrc79Qg86wknuxl98DU2/wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.890,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.61,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.392;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.783,3.430;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.440;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABICAMAAADbCwd4AAACQ1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRarok1fXAAAC9UlEQVRoge2ZZ1cTQRSGFxBj7703iogaFHusUeyiUbE37LFhBxV7b6CIvSuKDbvY9acpy+7eZefOZBxnd46yz4fkyWHu5D05ZM67G01zg7h4V7aVRHyc6gROEhIsrZNYV2EQjEC9+g1Mb9hIZRKMxk2aBgxt1ryF0ihsWrYKxF6kjNZtVCdg0LZde9URGHTo2El1BBM4Ryzr3EVRFgI4RyzrmthNXZ6awDliWfceCvPEpGcv1Ql8fHz+NaCbYyaHpGTRSejmmMkhOUlwELo5Yikp4olSUy3tndZHcBPo5qSl9+3XX3BbLZgxYKDpmYMEN4FujtjgIUPTRdMNGz4iaGho5CjBTaCbYyaH0WOCsRehQDfHTA5jxwkOQjfHTA7h8RMEJ6GbYyaHrImTBCehm2Mmh8lTeFZNnTbdadDNMbMthFk2M7JnOnVWZDbP5Jy5OU6Dbo6ZbSHMssmMhJw6bz7X5IKFhEE3x8y2EGbZLFpM6JKlPIPLlq8gjHeEdyKcuxJRHnJWrSaMd4R3IrRmLaI+PrUJaOSYqQYaOWY8QPuWbbZGjhmVdeujGzZu0hXat2yzN3LMaGzekrd12/YdukP7lm22Ro4ZlZ27dmtafsGeWOv+EmjkmFHZu6/qsXC/W7EMoJFjRuNAwcGqp0OHXclkAY0cMzpHqj+7oy7FMoBGjhmdY9X/d8f1F5JODxJo5JjRORE9mX/qdJ7ukk4PsvZDI8eMxZmz0cJz53WVdHqQtR8aOWbeQtZ+aOSYeYpA7fcQgdrv41PrKCq+wDDlXCxhGRv3+rppl0rNm+qYEVy+ctVy9/q6Zdeu3zDeDDOCm6XFt24b7l5fB7tz13xnzAjC9+6nPXhI/bNsyiKPGIbxuDz7icuhgKfPWEZQlPX8RYnojz5/TsVLljkoe5X7+s1b1zMB795/YJiDyo8V8H2Wft2PUf6JZTX5HAKXft2P3LDXtC8ZXxlGR/p1P3LDXtO+ff/BMA9Bbtj/pvInyzzjP2/uvwDhAQVelY+RJAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.497;4.blob,1.1,2464.iVBORw0KGgoAAAANSUhEUgAAADoAAABtCAIAAAB/UuUwAAAABmJLR0QA/wD/AP+gvaeTAAAG60lEQVR4nO2cy08bRxzHx+vFPIwNsQxY4WGbGgerRuKhlDRFilIpgUJL2kZYIoqNiiM4tcqhUk75C3prDpGqHlKicPAFLimOkBNSkao9JKl4OLIhBiV4sYnXAT92IfbaPUCCH/u0WSeO9iMuzPxmf1/Zs7PznZk1AOlca29fMpnAUVBZUhK1WvubmtgEX7vWvrTEnBfK+N+s1992u3NRl0UkFptaW7Po9WyCzWb97dsc83YqlcTYWL1Umos6Ms43NGBWq1wiYcjbqSSIsfp65rxpn65Fr3+AIN5oNLWwu7v74cOHOI77/f4bN25UVlayl+vwerffvBlqbqYPs1j0Dx4gXm+UPiwNGIL8FkvGd3fixAkMw+x2e19f3+joaDAYvHv3LoeLAvDLqVMPBwfp8sKQ32+xWFj1mUMGmpoiVqsUhlMLbTab2+2G3xb29vYmk8mzZ8+yv2ybQpEYH1fLZJR5B5oiEatUClMFpHLYGSx6/dTaWjQeT63u7++32Wzxt4X37t0LBAIDAwPs5S4Ggwsoam5poQqwWPRTU2vRaJwqgERulUQyqNFMpI8J5eXlUqnU5/OlFiIIolQq2csFAEy43WaK8aGqSjI4qJmYYDsmHMgdam5Gd3cdXm9qHY7jGIapVKrUwuPHj6Moyknu5OrqJ3J5d21tdtXQUDOK7joc3uwqOrkWvX5ydTWRTGZU2+12k8mU2neVSuXMzAwnuT4Mm93YIB2ALRb95ORqIpGZlw6tTJYYHzcqFNlVBoMBx/GZmZne3t6RkREURe12Oyet+wzrdIGREQmUNm5qtbJEYtxoJMlLx/XOzicXL1LVnj59en5+HsfxV69e3bx5Uy6X5yC3HIZDo6PfajRpea93PnlCmZcSp8l0ta0tBxGc+P3MGdu5c2l5naarV3nPKyAg8PHDyaLkQ4atqqwsiUat/f3c8kKcLEo+ZNiqSCQ2NbXGeZoLWFuUfCC1VefPN2CYVS7nkBcCrC1KPpDaKofDu739ZmiIQ14IAEAkk3dWVvjrDzAEDet0E1kGmyCSd+6s5NIfGC1KPpDaqoO8bYpEYlytZpv3YEbHaFHygdRWHeRdDC4soGYz27yHE1Aai5IPpLYqlYkJt9nMPa+qoiI+NkZqUfLhSmvrxuXLkEhEmVdVEY+PdXezynv46dJYlHygslWHeX3Y7OxGLjccqUXJBxpblZZ3WBcIjEgkzHnTIqbX1yViceoDWQJBZWJxxp/47TdLXwsAuNzS8l8gsBQM0ouYnl6XSMRsHshpgwsej9ueP7/U0jK9vr5f8teFC9m9+Ye5uVsuF2MtAGBYp/vt2TNGETget9meX7rUMj29Th9JeQfs01pdXVlSklG4Fg6ju7uMtQICAkWL+H0LAB0dHQCASCTCJvjIHmCFQZDLJ0Uml3m/BUqfoCWTyST1bJBvGOQqFAqj0ZhagqLo8vIyn5LoYJAbCoWePn2aWhIns1wFg0FuPB4Ph8OFkcKGIrvVikwuLBKJRFk2leXtT982nytTym1vb5dlLd64XC6/38/YmL5tPlemlOtyucTizInOLjv3Qt82nytTAWMYlnNj+rb5XFlA4GOjEOaHk72hp8ieaoJcPhHk8okgl08EuXwiyOUTQS6fFJncIuNgHeDdmgDpOsC72kQiUWB9GRyskRkMhv0j2qurqwiCZAR1dXVVVFQAABYXF1+/fl1giakcLunt7Ox4PB7SdQCn01laWtrG/6FZRg5vNYIgwuFwLBbLDsIwLBrl8g5GOh0dHRkH2HOmyEYGQS6fCHL5RJDLJ4JcPikyuazewSs8Iphs14hIpsmFIIhqAgkd3UlDNrT/3C7TZu0a/eE6lKtQKHp6eugnkAXDdcslLs3aNQrsHsj1eDwvX74EFBtJTqdzf8upYJs5mE/YNRIQEBDgilr9TWPjVzDM6tceFEaF8UcjYxj5aZEjWa2JxzGt9ju1ut/n+9vrdeD4VnaMCBLVnKxp7G2U1kvDa8xnlEStra21WcfdnU5nIBDIXzEMl9fWflZX94VM1oSiCxsbszs7K/tVUAmk6lE1nGuQVEkCjwPIHBLyhJjllpWVlWQdd8dx/GjPi0mlDVrt9wrFp0tLvwaDywAAwxWDskv54s8XyH0kFiVZiyFFTBBELAuCII5KqFhcWlf3uUbzdVWVLhB4vLX1D0HsAgCSiaRMIztmOAZL4b3tvViIlWIeO4NUWl9f/2VNzUkAkpub816vY28v/X0PEVB2KBv7GmVqWcgTQuaQrX9J+ndaC/46g15vqa5uRZD7m5vz+58oFdWt1Y19jfJm+aOfHuWZNHfKy+tEIg6TeimLH5pheCvlfcHK/Hw4UJmfD/TTrVBVkJqf/wFWVf1t8qwqiQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.322,3.516;4.blob,1.1,1112.iVBORw0KGgoAAAANSUhEUgAAAWUAAAAPCAMAAAALQy4BAAABm1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFABAQECAgKANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoxMTE+Pj4XFxcGBg9iYvMsLG4KCgoNDQ0FBQUiIlQAAAGJQfSPAAABYElEQVRYhe2OVVPDQBSF0zZIg1txgluLu0txd3d3ChR352eTScmQbpaZvcsDczt8D8mXczNnjiAomMyCb2IR/QjzDwj8SliN1qLHKgURSXBIKG2M2QSZjgiLGEZaeIR2ZDVaiw6rFElGUdGULTG2WMbV2IgT40lLSEwSYEZr0ZEspWgqy553apps3JKeAZ6PhMwsg2Xn5AKN1qIjL18zu6OgUJWi4hLDb6Vl5cDxqKmohBorVdU1do/V1hmO9Q2N0D7MNDW3AA1Oq7ONjNo7uNtQ0tkFNTjdPUTQ29fP34aRgUGowRkaJoKR0TH+NoyMT0wCDc7U9Ix3MDvH3YWU+QWowVlc8vpctq3wd+FkdW0daIxsSJuabjm29ZedXfhM5OztHwCNkUOnS9Oj4xPl6T5VcQtn57/Yi5SLS6ixcXX97Te3yuPuXuWBZ+Q/dB6fnonk5VXl7U/m+Ciu948fLp9qT1F5DdO/OwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.535;4.blob,1.1,2140.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;3.end,1.1;4.sync,10.6492327558;4.copy,1.1,1.0,1.0,3.950,2.57,2.14,1.1,1.0,2.19;4.copy,1.1,3.950,2.19,2.10,2.38,2.14,1.1,3.950,2.38;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.954,1.3,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.392,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.430,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.584,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.595,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.951,2.20;4.blob,1.1,496.iVBORw0KGgoAAAANSUhEUgAAAAgAAABKCAMAAACxQeXeAAAArlBMVEUAAAAYGBgLCwtUVFTPz88PDw+ioqKvr68VFRX19fVJSUmcnJy9vb1ISEj///8XFxcODg5WVlbo6Oh/f3/X19eVlZXT09OdnZ3e3t6IiIgDAwP5+flsbGwsLCwxMTFvb2/m5uYCAgLMzMx9fX1QUFDl5eUpKSlFRUVCQkJLS0sGBgYICAjIyMhgYGAoKCg0NDQTExMEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwV/hdTEAAAAgUlEQVQokWNgYGRigABmFlYoi40dyuDg5IKyuHmgDF4+fghDgE8QKiQkDGWIiEIZYuJQhoQkhJaSloEwZPnkIAx5BUUIQ0kZQquoCoBpNQV1iICGJsMgAFraYCDFoMMHBroMevpgYDDQLsMAQ8iphkZgYMxgYgoGZgzmFmBgCVcCAOGoD3hj4m/LAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.900,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.280;4.blob,1.1,3584.iVBORw0KGgoAAAANSUhEUgAAAE4AAACaCAIAAACIZ+lzAAAABmJLR0QA/wD/AP+gvaeTAAAKNElEQVR4nO2dbVBTVxrHT25eSEiAGALEJIQXIYAlVJBXZa0v2CChLjijIy4Jo9TyZes67genHxzHsdNpZxynVVux4wcHrZ3xZbF1FnEUQWQW7YhF1FVAAkuTYCABDIQEyMt+wKVpAslN7gkJs+c3+XTOuc95nuTk3nue+88TEghKaBiGkUhOjbM2m9Vu99i7GM4HBAkPy8vzoqOdGve2tFzo7vbYuxhBGmoqm82iUp0a+ycm9Gazx14EAoFA+Jv4+Hi73S4QCHCOx/zqzRJgxn2BWcahYhgGADAYDHjH+8+VuI8+it22jcJk4hlcIhI1lJR4ZZ9EIpnN5tnZWaf2Y8eyP/ssk8MJcWr3Y6iWqak4mSz/yy+TKioYLvdxc1Aw7C/JyV07d/5z2zZOiLNz7unr62MwGK7to6PTR45k/fZb5ZkzhUlJEfPt/r0xpDAY0bm5MevXh4lE+q4u1Z07b3t757oYFEp1aurfMzJWhoZeVSq/e/GiXauFNW9EBG3PnqR9+1Kzsrg3b/7n5Mmu1tYhWMY9wBQK0w8c2HDuHOe99+ZaftyyZXb//mPZ2ZF0uv/mzciIvHWrxG6vKS6OJftvmjnIISExBQXxpaURSUm6jo7hhw+tZjMAwGq350RHFwkEkXS6ymjUmkxw52WxqAqF+OjR7MJC3tWryosXe/24gJkCgWDz5qicHGC3D7W1qZuapkdHHQdgJNKOhITDa9ZkR0W1a7XfvXhx6X/LmwgSCefAAcnu3atsNvv586+++ebZ4OAkcbPuECsUuV98ISwqIntaolsEgjulpRP79kGZ9/z5DwYG9hw6lBEeToNi0DOMmBgS5sUZXsLhQJk3JYVNoSwwb5BuzX1LqbgnSEP1LaXiniANFaVUEAgEIpgJiw+rsdcwBbj2w2BZZyHmsJqtOEcu41BJGAkAMGOYwTl+GYcKSMBqttpmbYH2A4FAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBCI/yvWrDm8a9fzQHuxKDC1EGKxvKfnIkSDcIEWKpebxWan9fZegmUQOtBCFYsVGk2z0aiGZRA6cELFMEpSUkVPTx0Ua34CTqhCoZRKZSqV16FY8xNwQhWLFf399RaLEYo1PwEhVBotIj5+e5CvXgAl1MTEnWazXq1uIm7Kr0AIVSxWvH592W4Pdq0f0VDDwhJWriwM/tULiIeanFyp03WOjgbv/eA8REMN/sspAoFAIJYZhw+vef58FxRTLBbVaKwuKRERNyWVxh49mu1xmHfXVblcfPFij68u/YHJydn6+n6FQkzcVH5+zMOH0GpKAABAVhbXav1EgPuHWR758EPh1FQ1wR+/i0Ss2toNbLbnSiFefKoKhbi5WaNWQ9uUNjWpx8dndu5MJGIkPz+mu3t8fHza40i8oVIoWEVFUl0dnNU7h9Vq/+GHXiJrGMNIubnR7e1QV69MJpqcrGYyKU4z0elkxxeViuHsnUMi4dhsNXFxYb55JZFwTp1aHxKCq2YJxfMQAAAACoW4vr7faLQ4NpaUiG7eLHZs+emngbKy23h653j2bLSrSy+XJ3/++ROcnjiSnx/T2amfnsb1Y0dcoUZE0LZvj9++vdGp/cGDoZycfzi2jI1N4+ydp66up6ZmtQ+hMhiU99+P/PbbF94e6I6PP05VqSoxzC+VFXi8UIvlk7y8hQsyuaGwkPfVV3kuhTIWBddpSaEQX7782mbzvdKGG968mbpzR+XDySk/P+aXX0YIlP9wISEhzGarSU+HU2BlQSoqknS6KhrNiysfl0uvrd3A53txkfdsvbIyubNT9/z5qMeRPnPjxgCNRvbqJjEvL1qlmtRovLjIew4V+uXUFZPJcuVK3549yfgPycmBfTlFIBBBAtGKd6G8ULvdviwqFhBNefMKeWVtZbSIpSq4Flg21W2S1ksD7cWSQI+iVxurY7fFBtoRD0CoTmmZsoQnhotkoh4/32kQxPm7yknnpH+a7tiSl5d3//59k8mk1WpPnz7NYrFcrSivKQWbBYyYBeq6LgHp6ZxP/+jzgrzbr5IwUlROVKw0lilgTvRPzHenpKQ0Nze3traWl5fz+fwTJ04kJibKZDInK9p/aQEA/A/4fVf6oHhPJpNc94wWi81xH4NhpJycKKk0ViBg9jv4vBgUjIrxCnnCrUJaBE3Xoeu91GtQ/l5H+fjx4yqVqrS01GKxAADUanVjY+OmTZuam5sdrcwYZkxaEzuNTSQ8R6qqUlx3sOfO/fvJEx0AgErFCgt5W7cKIyJoHR26S5d6lUrPtZ8pKVUp3LXcwYZBzT3NrNG5gnJJScnXX389FycA4Pbt2zqdTiaTOYUKAJgem2ZEQ1vAP/880NTkrPYaGXlXbbaqKmXtWm5Dw+C9exqji8+LQRl+PMyKYwmLhFQWdejBkFH1+7aIwWAwmcw3b944HqDRaLhcrqshm8VGpkMrwTs2Nv32rXPNKIvl3Y3K48fDcXGsoiIhi0V98GBIpcK1laPoO/X6p3puJje2OJa/kW9QGjQtmuFHwwAAk8k0NTXF4/EcD+Dz+Xfv3nU1RGVSzSPQSke6X8CdnfqnT/WZmdzi4tiNG/lKpaGlRfPo0bAXE7BT2ZKDkvWn1s+3XL9+vaenh0J5d/aSSqV2u72oqMjpQBKZtH96f/pfPZ8GccLl0uPiwpxeoaELJP1SU9kHD0pOOfjsBY415NLS0kwm061bt6RSaVVVlV6vb2x0zhsCADjpnBp7DTdzgYW9NMB5vLJu3bq2tjaTyTQyMnL27Nnw8HDXMZK/SeQaOck/KcXgYsfjHVlHsgLthf+JL4uvVFfSlqyadKBYkbZCrpELtwoD7Yj/EWwWiGQQnnwjEAhCQNShuMcr7UxICPn06UJvHyN5SKNB1KG4xyvtzPS09ddfdQUFMZCdgKJDcY8P2pnVq1ecOVNI92Yv5Tk5CkWH4h4ftDOvXo1PTVnWro3Cf4jnUInrUNzjm3bGZrM/ejQMfw0T1KG4Z0HtDB4EAmZt7YbISLz//IMruz+vQ/HWGzwsqJ3Bg1ptVKuN+EUUeB9k1NX1yOXw1/CcdsbnR9Xt7dr8fNhr2GcdinsIamfCw2lnz/4pIQHXNwvvp+qzDsU9BLUzBsPMy5dj8D9YH3Qo7oGincnJiT55soBC8bwuvPDbVYdCo2FOKkI6nUwmk/D0Akjamc5OHZmM4Xm/vDjFz+tQbtwYmGtpbf2z67d3796WCxe6PfYCACoqkr7//iV+BxZkdtbW0TGSmxvd2al3P5JQ4is1lc1iufyXUP+EXm/22ItAIBAIIixZOgYKhJ6IzszYVq9ekZnJvXZNCcuh4GUJ0jHBAplM0mjk1dWpgXbEM0Tv3f2djgku/JqOgQgEocbwsKm8PIFKxZbuX6YDyKFDGd3duwPtxZLgp3QMXOAojSYnZwsKYkQiVkPDIBSDQQ30dEzwwmBQDIZ9ZWXxgXZkUaBJ5SwW26pV4dnZ0VevBulN4n8B5h/Zc2TKeW4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.373;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.783,3.411;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.440;4.blob,1.1,1940.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABICAMAAADbCwd4AAACW1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFABAQECAgJFRaoxMTE+Pj4XFxcKCgoNDQ0FBQUs2YapAAADDklEQVRoge2Z91MTQRiGDxBj771ho4ioQbHHGsUuGhV7wx4bdlCxYW+giL0rig272MXun6Ucd/cdt99ujmUvOw73/JA8GfbbvJMhO+9dFMUJIiId2VYQkRGyE1iJijK0VnRtiUEwPHXq1tO9fgOZSTAaNmrs0bRJ02ZSo7Bp3sITepE0WraSnYBB6zZtZUdg0K59B9kRdOAcMaxjJ0lZCOAcMSwmurO8PJWBc8SwLl0l5glJt+6yE7i4uPxvQDfHTAyxcbyT0M0xE0NcLOcgdHPE4uP5EyUkGNojsSfnJtDNSUvq1bsP57aKN7lvP91T+nNuAt0csQEDByXxphs8ZKhXU9+w4ZybQDfHTAwjRnpDL0KBbo6ZGEaN5hyEbo6ZGPxjxnJOQjfHTAyp48ZzTkI3x0wMEybaWTVp8hSrQTfHzLQQZtlMTZtm1emBGXYmZ85Ktxp0c8xMC2GWTUrAZ9XZc2xNzp1HGHRzzEwLYZbN/AWELlxkZ3DxkqWE2R2xO+HPWIaoHdKXryDM7ojdCd/KVYi6uNQkoJFjJhto5JjZAdq3aDM1csyorF4TXLtuvarQvkWbuZFjRmPDxsxNm7dsVR3at2gzNXLMqGzbvkNRsrJ3hlpXTaCRY0Zl1+7yx5w9TsXSgEaOGY292fvKn/YfcCSTATRyzOjkVnx2Bx2KpQGNHDM6hyr+7w6rLwSdHiTQyDGjcyR4NOvY8UzVBZ0eZO2HRo4ZixMngzmnTqsq6PQgaz80cszCC1n7oZFjFlY4an8Y4aj9Li41jrz8MwyTztkClrFxrq/rdq5Qv6mOGcH5CxcNd66vG3bp8hXtzTAjuFqYf+265s71dbAbN/V3xozAf+t24p271D+Lpihwj2EY94vTHjgcCnj4iGUEeamPnxTw/uhTdUqessxC0bOM5y9eOp4JePX6DcMslL4tge+z8Ot+jOJ3LKvMex+48Ot+5Ia9onxI/sgwOsKv+5Eb9ory6fMXipV9VSkLGVQMyA37f5R+o9j3Hyo/wxOuqs3912+VP05mAqrd3P8Cb54XwnjHpJIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.497;4.blob,1.1,964.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAOCAMAAACICbUNAAABjFBMVEUAAAB3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAwDAQHmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18GAgIhIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC1oZabqAAABAklEQVQokWNgAAFGJgbsgJmFFZnLxg6hmRhxqGfg4ETmsbOBKS5uHlzqefn4ERwBQSEwLSwCpkTFxCUkpVDVS8vIIjhy8mBKQVEJRCmrqKqpa2iiWaClDWfq6OqBaX0DQxBlZGzCwGBqZo6q3sLSCsa0trEF03b2YMrBEUQ6OaNZ4OIKY7m5gykPTy8Q5W3mA6J8/dDU+wdAGYFBwWA6JDQMTIdDzI9AUx8ZFQ1hxMTGgen4BAg/EeL+JDT1DMkpEDo1DUylW2ZA+JniWabZOaroyhly8/JBVEFhEZhbXAKTKC0TdyqvwFBfWVUNompqIdy6egwVaKChEUQ2NRNShw0AAJhSJGWtg6UaAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.533,3.513;4.blob,1.1,2116.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.592;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAMAAADAkV+TAAAAdVBMVEUAAAAxMTEYGBgfH00dHUkEBAsbG0M8PJQ8PJMkJFkJCRYEBAkaGj8xMXo+PpgrK2oPDyULCxwsLG4+PpkSEisDAwcYGDwxMXg9PZcpKWUHBxALCxsmJl07O5I7O5EiIlUHBxImJl42NoYcHEQDAwgJCRcBAQJc3pYzAAAATUlEQVQYlWNgYGBgZGLADagoyczCiluSjZ2Dkwunsdw8vHz8ArjtFBQSFsEhKSomLiEphVVSWkZWTl4Bh52KSsoqOF2rqoZg0yv4YAAAYoADEOfaOHIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492327664;4.copy,1.1,1.0,1.0,3.960,2.57,2.14,1.1,1.0,2.19;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.911,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.364,3.455,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.535,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.595,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.910,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.345;4.blob,1.1,2700.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.354;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.386;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.497;4.blob,1.1,1436.iVBORw0KGgoAAAANSUhEUgAAADoAAAAiCAMAAAA54DrsAAACGVBMVEUAAAB3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAwDAQHmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18GAgIhIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlMBAQECAgLWVlZwLS2cPz+qRUXW1lZwcC0xMTE+Pj4XFxcKCgoNDQ0FBQUMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIIAwMJCQTy8mJQUCDIUVH/Z2dgJyecnD+qqkUoEBA0FRUTCAhrrpSDAAAB1UlEQVQ4jWNgAAFGJgbsgJmFFZnLxo6hgokRh1YGDk5kHjsbujwXNw8urbx8/AiOgKAQurywCJgSFROXkJRClZKWkUVw5OTRdSooKoEoZRVVNXUNTTRJLW04U0dXD12rvoEhiDIyNmFgMDUzR5W0sLSCMa1tbNG12tmDKQdHEOnkjCbr4gpjubmj6/Tw9AJR3mY+IMrXD03aPwDKCAwKRtcaEhoGpsMhtkagSUdGRUMYMbFx6FrjEyB0IsSvSejyySkQOjUNXSbdMgPCyBTPMs3OUUWXZ8jNywdRBYVF6DLFJTBWaZm4U3kFhtbKqmoQVVML5dfVg0EdA0NDI4ZiNNDUDCJbWqHctnYw6CCkDQvo7AKDbjK0jkiAVoRgA+Dip6e3D0MCtQjBBiDFT/8EDAmUIgQbgBY/EydNRpdBKUKwAWjxM2XqNAwppCIEG4AWPwwM02dgyCEVIdgAtPhhYJhZOAtDElGEYAPQ4gcIZs/BkIQXIdgAtPgBgbnzMGThRQg2ACt+gGD+goUY0rAiBBuAFT8gsGgxhjS0CMEG4MUPCCxZugxdHlKE5C8HA2lkFlLxAwQrVq7CMBtchKxeAwZrkVloxc+69djdtmEjGGxCZtEIAACud3MvPd3R0wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.516;4.blob,1.1,3584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492327765;4.copy,1.1,1.0,1.0,3.960,2.57,2.14,1.1,1.0,2.19;4.copy,1.1,2.10,3.399,3.950,2.19,2.14,1.1,1.0,3.399;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.921,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.345,3.505,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.535,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.573,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.920,2.98;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAsVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwgWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwd9fTNKSh4ZPT0XOjoLHBw0gIA+mZk9l5dERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZilzN75qAAAAbElEQVQImWNgQABGJmYGdMDCiiHExs6BLsTJxQ1h8CDEePnAAvwCgkJAWlgESIiKiQNJCUkpaRlZOXkFRZACJWUgoaLKwKCmrqGpCtappQ0zg0dHF8LQ0zfAcIehEYaQsYkpupCZuQWGMksrAHywBu3sUjMYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.231;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAABAAAAAVCAMAAAB44J7gAAAAgVBMVEUAAAAgICD///8bGxsTExMiIiIFBQUsLBJtbSwjIyP39/cCAgE3NxZ+fjOZmT54eDEFBQJBQRqGhjaVlTxiYigiIg5kZCmXlz1NTR8LCwUwMBODgzWRkTtZWSQcHAsBAQAyMhR6ejF3dzAoKBBwcC2SkjsbGwuVlT0vLxOJiTcODgb/RiijAAAAWUlEQVQYlWNgQAKMTMwMDKgCLKgCrExsUBY7B5ji5AJT3Dy8fPwIZQKCQsIiokj6xMQlJFEMkpKWkZVDEZFXUORT4kG1TllFlQENqKELDC7Arq6AJqKhqQUA3FADzuiQjEgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.335;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.345;4.blob,1.1,2700.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.367;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.440;4.blob,1.1,1928.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABICAMAAADbCwd4AAACVVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFABAQECAgJFRaoxMTE+Pj4KCgoNDQ1mPeUAAAADDElEQVRoge2Z91MTQRiGDxBj771ho4ioQbHHGsUuGhV7wx4bdlCxYW+giL0rig272Lv+Xcrl7r7j9rvNudnNjsM9PyRPhv0272TIznsXRRFBTKyQbTkRGyM7gZW4OENrxdeWGATDU6duPd3rN5CZBKNho8YeTZs0bSY1Cp3mLTzhF0mjZSvZCSi0btNWdgQK7dp3kB1BB84Rwzp2kpSFAM4RwxLiO8vLUx04Rwzr0lVinrB06y47gYuLy/8GdHPM+JCYxDoJ3RwzPiQlMg5CN0csOZk9UUqKoT1SezJuAt2ctLRevfswbqt40/v20z2jP+Mm0M0RGzBwUBprusFDhno19Q0bzrgJdHPM+DBipDf8IhTo5pjxYdRoxkHo5pjxwT9mLOMkdHPM+JA5bjzjJHRzzPgwYaKTVZMmT7EadHPMTAthls7UrGlWnR6Y4WRy5qxsq0E3x8y0EGbpZAR8Vp09x9Hk3HmEQTfHzLQQZunMX0DowkVOBhcvWUqY0xGnE/6cZYg6IXv5CsKcjjid8K1chaiLS00CGjlmsoFGjpkToH3zNlMjx8yW1WuCa9etVxXaN28zN3LM7NiwMXfT5i1bVYf2zdtMjRwzW7Zt36Eoefk7w62LEGjkmNmya3fVY8EeUbE0oJFjZsfe/H1VT/sPCMlkAI0cM3sKQ5/dQUGxNKCRY2bPodD/3WH1BafTgwQaOWb2HAkezTt2PFd1TqcHWfuhkWNG48TJYMGp06pyOj3I2g+NHLPoQtZ+aOSYRRWG2h9FGGq/i0uNo6j4DMWkc7aEZnTE9XXdzpXqN9UxIzh/4aLh4vq6YZcuX9HeDDOCq6XF165rLq6vg924qb8zZgT+W7dT79y1/TNvygL3KIZxvzzrgeBQwMNHNCMoynz8pIT1R59/p+IpzSyUPct5/uKl8EzAq9dvKGah8m0FfJ+5X/djlL+jWXXe+8C5X/cjN+wV5UP6R4rZw/26H7lhryifPn+hWIiv31TCJo4I5Ib9Xyq/00zlx08VoeHYm/uv3yr8I5mIuLn/AeEsFW7QD1cVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.872,3.497;4.blob,1.1,768.iVBORw0KGgoAAAANSUhEUgAAAC4AAAANCAMAAADhX6ydAAABL1BMVEUAAAB3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEwDAQHmXV1jKCiQkDq8vEwEAgLpXl5eJiaLODjBTk4EBALp6V5eXiZLHh70Y2MLBAQtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkLQVFR8MjKpqUSjo0IPBgb3ZGRFHBxyLi7ZWFgPDwb392RFRRxkKCjkXFwCAQEYCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODgGDg63SkqVPDzCwk6KijghDQ0sEhIECwtf7Oxh7+8GEBBZJCTsX18GAgIhIQ3+/mcsLBJ9MjLOU1MDBwdX19dY29sJBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC3t/FiRAAAAzElEQVQokWNgAAJGJgbsgJmFFZnLxg6mmBhxKGfg4ETmsbOBSC5uHlzKefn4ERwBQSEQJSyCSzWDqJg4giMhCSKlpGVwKmeQlYMz5RUUQZSSsgpu5apq6jCmhqYWiNLWwa2agUFXD8bSNwCRhkbG+JSbmEIZZuYWIMrSyhqfchtbOwjD3sERRDk5w6VcXLCod3WD0O4eINJTzQsm4e3j64ep3D8gEEQFBYeAqNAwuER4RKQ3pvKo6BgQFRsH5sUn4HM5CCQmgcjkFBAJAL4CFIB+7QR3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.513;4.blob,1.1,2388.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.535;4.blob,1.1,2816.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,608.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAgxMTEYGBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR4rKYypAAAAr0lEQVQ4je3Stw7CQBBF0cFkDGtyzmCTc875/38JISHkWyBRUflVe2ZXqymeyCcuTRC3x8uBz08HgiEO9DAdUS7YUFE+iMXpRJJO6XQ6A2ZzebiginCpXIGrNbDeMOxslk1cWy35kjbZ6YJmr/8+DYavJUclsXsc1ODJVODZHF6oMbxUFrxSa3ijQvB2t+f/hyQdH9HH3QmW86UCa9cbLPeH/BKnX06/xOmXLX/o1xMmrSQ6C0QMtwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492327873;4.rect,1.1,3.952,2.58,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.231,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.367,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.921,2.98;4.blob,1.1,1528.iVBORw0KGgoAAAANSUhEUgAAACUAAAClCAMAAADs8MTpAAACDVBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC8kWVk8k5M4iYkaPz8jVlYGDg4bGwuYmD4TEwg3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcWNjZ9fTNKSh4XOjoLHBw0gIA+mZk9l5cZPT1ERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZik2hoYeS0sRKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhJ3dzDU1FYyMhT9/WaQkDq8vEwEBALp6V5LSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk5UVCKZmT7+/mdWViN9fTLOzlNnZyrW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2kTExMNBQ2TPJMsEiwiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpk3NxZ+fjN4eDEIAwg0FTRBQRqGhjaVlTwiIg6LOItMH0xkZClNTR8LCwWBNIFZJFmDgzUcHAt/M396ejGFNoVSIVIoKBACAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2VlT0vLxOJiTf2kmbQAAACKElEQVRYhWNgwAIYmZixCaMDFlZiVLGxcxChipOLG02EBwuLgZcPVRG/gKAQkBIW4YGzgISomDiKKglJKWkZWTl5BUU4CySspIyiSoWBQVVNXUOFQRPOAgEtbQzH8ujoorP09A2I8CWDoRExqoxNTIlQZWZuQYxhllbEqBpWgMfahghVtup2PIRVydhrOBBUpOvo5OxCUJWrBI+btC4hVe4eDJ5e3gQUKfj4MjC4yRG0chQMD4BI0fjSNiJF40vbiBSNJ20jUjS+tI1I0fjSNiJF40nbiBQ9mrZHAsCWojFZ2FI0JgtbisZgYUvRmCxsKRqThS1FY7CwpejRVD4KRsEoGAWjYBQMQuDnT4wqfz8iFAUEihKhKiiYCEUhoZZEqAoLjyBCVWQUEYqiY2KJUBUXz0mEqgQu3HKJSWYQhkEyniGnFDGoPalpeOxJhw3UZGTiVpSVnYPHCBjgDMglQhU1QV4+MaoKCotwSxaXlEJZZeX4VFVAWZVV1ThV1ZTUwph19ZjSzA1gqrEJLtLckoeqhLO1LakdXV9HSycy16yru4elF9P4vn5k3gT9iZOwuXHyFGSexVRzo2lYVE2vQ+HmBsxI8mvFUDVzFrrI7MxsdKE5c+dhmo+Rx+e3LMDiDHSwcNFiIlQtWUqEomXLOwgrWrFoJRFGrVpNhCL6AeY1AWgsrCPTa9fpobFoOzKNFaCPTGMH6CPTOADayDQOgGVkGgsYzCPTADlfedJGJRq9AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.316;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.348;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.440;4.blob,1.1,2424.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.880,3.487;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAWCAMAAAAlz0ZsAAAAkFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29s3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5HZ5vuAAAAWklEQVQImb2KxRHAMADDXIaUmZlx/+2aXHaoXjpbAEUQwBElWeGmarqIvzBMYtkOFdfzgzCKqSVpBuRFCVQ1S5oWXdEzG0Zg4tsMLLxbgY3s+XH67Lhu0jwvPugdBYFX7rK+AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492327968;4.copy,1.1,3.580,3.228,3.380,2.19,2.14,1.1,3.560,3.228;4.copy,1.1,2.10,3.361,3.950,2.57,2.14,1.1,1.0,3.361;4.rect,1.1,3.941,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.345,3.737,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.913,2.98;4.blob,1.1,1464.iVBORw0KGgoAAAANSUhEUgAAAC0AAAClCAMAAAD/J4QdAAAB7FBMVEUAAAAHBwOTkzwsLBJiYihlZSkqKhGUlDwICAMCAgGKijg7OxgAAQFTUyJ0dC84iYkaPz8jVlYGDg4kWVk8k5MbGwuYmD4TEwgdSEg8lJQpZGQIExMVNDQ7kZEDBwcWNjY3iIgSLCx9fTNKSh4LHBw0gIA+mZk9l5cXOjoZPT1ERByCgjUJFxcECgoODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZik2hoYeS0sRKSk2hYUsbW0QKCg8lZURKysra2soY2MTLy8aQUEhUFABAgI4i4saQEAyfHwHEhIeSkp3dzDU1FYyMhT9/WaQkDq8vEwEBALp6V5LSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk5UVCKZmT7+/mePjzoKCgRWViN9fTLOzlOBgTSDgzVnZyrW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2kTExMNBQ2TPJMsEiwiIiIFBQVeJl5xLnEjIyP39/crEiuZPpkIAwg0FTSLOItMH0yBNIFZJFl/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2VlT0vLxOJiTe5bl/KAAACGUlEQVRYhe2ZZ1MTQRiANyKSwCHN0JuAtBB6ERQBMQEEkyhgQ5RelCYoIL2aCAgCKlgQ0D9KLndZ8MrevQMODuzzYfPk7pnLTibvlyxCqtBc8FAXclz0hNSXvLSAWuft89d7hmjI9zK7+vk7l4BAJugKwZyLPjjEuYaGhUdERkXHxF4lGPvYuHh2TbiWmJSMUpJJxpJq4DaXZnRvk2TpGZmAbwVlZUPqnNw8QJ1fcB3y8MIiSH1uYG7cFJk8xYm3GKHJE16SVCo0ecpul99xiREbgVjGFOb6TZqxEahAlVV3WanGRqAGIVOk8zX6ntsolJPjv5k5I2jmzKCZq4bM3OGk0ZmjHBep+ZI3qfmSN6n5kjeJ+SKYxHwRTGK+CCaeL7JRKBQKhUKhnHssVkhttQBi2309oH5QC4jr6gsB9cNHjwH1k6eAuOFZI6B+/kIHqJu8sWq1YnPR3JLPSWYr/tNYk9vWLjSOjmD+8zu78LW67pcaoXG8MvDS06u82b7+AeUIo7O9BtT/ksEhSP3m7bByNDL6jrexcTX1BG+TU9OK9czorFvn5hXrhUWs7+2DynvBOOwfADVaWobUKx8h9eocpF77BIjXNzYB9Wf7F0D9dWsbUH/7Doh//HSoj3e2fgEevbsHiE8fj32bwI6enYnu/v6Tzl9w29GzM/FdIcc7O1OAOztTC3d2phru7EwtqQbl5pCzdnZ2AMkkhkX+2az7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.297;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.329;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.345;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAAcAAABZCAMAAADFCM5mAAABXFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXACAgEICAMFBQJMTB///2ewsEcPDwY0NBUjIw4KGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwdSB1n/2cJFwkGDgYjViNe6F4zfzNX11c8lTxV01U/nT9a3lo3iDcBAwFl+WUsbCwSLBIUMRQtby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx4GBgLIyFEoKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8JCQTy8mJQUCCcnD+qqkVBRvLYAAAA5klEQVQokbXQeVOBURgF8Espoo0WIVnKklZ5E0WrrdVWtO9IpPL9Z8w95wvUDOef33mfmXvvvI8QMio1EGoV6OvXwIFBoNUNQb1hGI6MgrFxIzRNTMKpaWCesUCrjXfO2kUvM+eQcQqXW2ZeLHhkvN17wOeni4ElluUVurq2zhLcoCFlE4aVLQ4iUbq9Q2NxursH9g8O4ZGSgMlUGmaOwclpWHKWOsfnRbY7//PP5LBfh8hjv25RwH49fz5fvLxiKZXp9c0tvLt/4ODxiT6/vLK8vdNKldY+6iyfDdr8ysHW9w8Hv+0O9e0fZeuFcHcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.468;4.blob,1.1,1520.iVBORw0KGgoAAAANSUhEUgAAADoAAAA/CAMAAACGqCupAAACMVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCABAQECAgKcnD+qqkUxMTE+Pj4XFxcKCgoNDQ0FBQVFX1DfAAAB/klEQVRIiWNgwA4YGXFIEARMzCysZGplY+dgItfaUTAKRsEowACcXGDAjcwiEvDwggEfMotIwC8ABoLIrFFAJSAkjENCRFQMmSsugaFCWAiXoZJSyDwJcXR5aRlZXFrl5BUQHEUlZXR5FVUwpaauoamljSrFraOL4Ojpo+s0MDQCUcYmpmbmFpZoklbWcKaNrR26VnsHRxDl5OzCwODq5o4q6eHpBWN6+/iia/XzB1MBgSAyKBhNNiQUxgoLR9cZERkFoqLdYkBUbByadHwClJGYlIyuNSU1DUynQ2zNQJPOzMqGMHJy89C15hdA6EKIX4vQ5YtLIHRpGbpMuWcFhFGpUeVaXWOKLs9QW8cJouobGtFlmpphrJZWjaC2dgytHZ1dIKq7B0Omtw9DCA30TwCREycRUjcKqA3QihBsAFz8TJ4yFUMCtQjBBiDFz7TpGBIoRQg2AC1+ZsychS6DUoRgA9DiZ/acuRhSSEUINgAtfhgY5s3HkEMqQrABaPHDwLCgYSGGJKIIwQagxQ8QLFqMIQkvQrABaPEDAkuWYsjCixBsAFb8AMGy5SswpGFFCDYAK35AYOUqDGloEYINwIsfEFi9Zi26PKQIwdqCQRQ/QLBu/QYguXETGGyEiIGLEKwtGNTiZ/MWILF1GxhsRxIntgWzYycY7MLlRyIAAG5WaxIXQWoSAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.516;4.blob,1.1,3960.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.590;4.blob,1.1,368.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAV0lEQVQYlcXPxxWAQAgEUMy6rgnzmnP/HTo0oXP4wIMLRIgl2A5wPZ8oCCO0KtYwSWWX5aBgBUuuYM0NbLmDvRnkZpzEORQXs0rZ9gPq85LhfujPfPTjCx9EBvWXETNbAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492328076;4.copy,1.1,3.570,3.209,3.390,2.19,2.14,1.1,3.550,3.209;4.copy,1.1,2.10,3.361,3.950,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,3.830,3.475,3.130,2.19,2.14,1.1,3.820,3.475;4.rect,1.1,3.951,2.90,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.291,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.329,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.950,2.98;4.blob,1.1,264.iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAMAAACn6Q83AAAATlBMVEUAAAAAAQEkWVk8k5M4iYkaPz8jVlYGDg4WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcZPT0XOjoLHBw0gIA+mZk9l5cJFxcECgoQ6nHZAAAAMUlEQVQImWNgIAkwwhlMzCysQJqNnYGDk4ubh5ePX0CQQUiYgUFEVExcGKZKQpI08wFXQAFbm3o24AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.229;4.blob,1.1,948.iVBORw0KGgoAAAANSUhEUgAAAE4AAAAiCAMAAADGQh8OAAABVlBMVEUAAAAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2ksLBKVlT0yMhQTExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkCAgE3NxZ+fjOZmT54eDEIAwg0FTQBAQMCAgUAAAEFBQJBQRqGhjaVlTxiYigiIg6LOItMH0woKGI+PpkUFDJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAowMBODgzWRkTtZWSQcHAt/M38BAQB6ejF3dzCFNoVSIVIoKBBwcC2SkjsCAQKVPZVBGkEbGwsaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0HBwOTkzxlZSkqKhGUlDwICAOKijg7OxhTUyJ0dC+YmD4TEwh9fTNKSh5ERByCgjUhIQ1ubiw1NRaOjjkEBAFeXiZmZikOImMJAAABKklEQVRIiWNgwAYYmbAKkwuYWVipYAobOweUxclFnA5uHl58xvFBWfwCgsSZJyQsglNOlF0MxhSXIM44rIBbEkxJScNFZGQZyTRLTl5BUQldUFlWhRQzVNXAQJ1BQ1NLW0cXU4GePinGGRiCgRGDsYmpGTYF5hakGGdpBQbWDDa2dvYOWBQ4ipNiHNyzDE68zoou8hgKXN1IMQ7uWRBw9/BEl/fy9iHFOLhnIcAXXd5P1p8U4wiBgMAgahoXHEJN00LDlKloWnhgBBVNY4iMoqZpIwIgimoYKzqGG48sgcIdqaiGsXRi8cniL9yxgLj4BFKUEwJyiUnUNI4hOYWqxvmmplHVvPQMqhqXmUVV40RMsqlqXo49VY3LzcunpnEadjbUNI6hoJBopQCVHyVVSh7pdgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.272;4.blob,1.1,464.iVBORw0KGgoAAAANSUhEUgAAAXAAAAALCAMAAABRVSa7AAAAk1BMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0GAgIIAwMDAQEXOjpPxMQ9l5cGDg7IUVH/Z2dgJycoEBA0FRUTCAiB06rnAAAAhElEQVRIie3USRKCUAxF0eAHFWzpVVAEBVFQ2P/qLD574FX5PINkegepiPxNw5gp05qjK3gslrazWm/QGTy2u72I6/noDhpBOMwoRnewOHjHYZ0SdAiNdLzwM7qDxmX84Rm6g8ZV5W5xs0XupVahg37eo1bR8yXStNob3UPj02k9uoPFF1DcB87IiRJ7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.288;4.blob,1.1,896.iVBORw0KGgoAAAANSUhEUgAAADAAAAAXCAMAAAB6dTw7AAABelBMVEUAAAAgICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVX/Z2fIUVFvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQTCAguLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAIGAgIIAwMDAQFgJycoEBA0FRUNIA1n/2cLGwsIEwgOIg4CBQIOIw5k92RHKU/QAAAA4UlEQVQ4jWNgIAAYmZgJKUHXwEKaBlYmNlQBdg5OZC4XN5oGHl4IzccvAGEICgmLiEIlxcQlJKVw2CQtIysnD2YpKCopq6gCGWrqGppa2jjdpqOrp29gCGEbGZuYMjCYmVtY4vePlbWNLZCys3dwdHJmYHBxdXP3wKPc08vbx9ePwT8gMCg4BCwSGhYuGRGJQ3lUdExsXDyQkZCYlIwQTklNw6EhPSMzC8zIzkGVyMWhIS8fj2sLCsGgCI8SVCAlCQbFRGsoKQUDAoE8ChCgrLyCVA2VpGmoKq8mTUNNLSofAKnIJa14MS9sAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.310;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.345;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAABAAAAFACAMAAACC1AwQAAACEFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXACAgEICAMFBQJMTB///2ewsEcPDwY0NBUjIw4KGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwdSB1n/2cJFwkGDgYjViNe6F4zfzNX11c8lTxV01U/nT9a3lo3iDcBAwFl+WUsbCwSLBIUMRQtby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx4GBgIDAwHIyFFgYCcoKBATEwgMDAX19WNKSh6kpEKoqERGRhz29mMODgbm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8JCQTy8mJQUCCcnD+qqkUJFgkcRhwwdjA6jzoIFAg1gzUbQxs8kzwDBwMqZyorais5jDkdRx0FCwU+mT4QKBALHAsPJQ8HEQcBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIFDAUeSR4UMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQ2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejITMBM4iTgKGQoSLRI2PQcRAAAB0ElEQVRYhe3X6VeMYRgG8LtJVLK0KKFMUsmSpaZRlkLLtEy0ooiIZC+iNDNS76CVitCeQkbxL5qZhtN1nZPTF6dzpuf69Fy/c5+Zd55zf3hHxBUfnWB0Pth91/ghrF2H3T8gEGF90AaEjZuwbw4OQQgN24IQHoF9a+Q2hO07sEtUtHhLdupdifl7kl2xrux2wsJJ4uJdSXDCwmmFH/hf2ZNIsHfffpIDSQQHDx0mOZJMkGJIRTAajtJIWjrBseMEJ04SZGRiP3X6DEKWIRshJ9eEkJePvaDQCN2cW4QDZ8/JKk6xe8P1JX9OUure8Ngy8Zyk3L3h8RXiOf2f5zh/4SJJZRXBpcvVCCVXrtJIzTWC67U3SG7WEdyqJ7h95y7JvfsEDx4WIzQ0PqKRx02ioqKioqKi4p15Qv1pM3ZzyzPoplYLDmRbbQjP2+gjX7Rj79DoHThVsyO81F4hvNayEDq7uulbenoJ+loJ3nS9JekfGESwvSugkfdDsrwY6Rrkw8dPJMMjBKNW+lkyNk4woeHrv0xqUzTyuY9gmq8ifYxg5gt209dvCLPadwSLg67qB/3tmJufhP7TYcYB+y9ZMmoLF0dtoSdqC9UWLoqXbeFvpb+zT6NmQkUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.440;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABICAMAAADbCwd4AAACQ1BMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4FBQxjY/UeHkpCQqRERKgcHEZjY/Y0NIExMXkHBxIBAQNdXeYoKGMtLW88PJQPDyQ4OItOTsEqKmlSUstHR7AZGT4SEi0NDR8TEy5KSrcdHUhUVNAyMnxRUchlZfsuLnJYWNk/P5thYfE5OY0MDB4KChhmZvwWFjc/P5xaWuA8PJUQECckJFkCAgYEBAliYvIgIFBFRarok1fXAAAC9UlEQVRoge2ZZ1cTQRSGFxBj7703iogaFHusUeyiUbE37LFhBxV7b6CIvSuKDbvY9acpy+7eZefOZBxnd46yz4fkyWHu5D05ZM67G01zg7h4V7aVRHyc6gROEhIsrZNYV2EQjEC9+g1Mb9hIZRKMxk2aBgxt1ryF0ihsWrYKxF6kjNZtVCdg0LZde9URGHTo2El1BBM4Ryzr3EVRFgI4RyzrmthNXZ6awDliWfceCvPEpGcv1Ql8fHz+NaCbYyaHpGTRSejmmMkhOUlwELo5Yikp4olSUy3tndZHcBPo5qSl9+3XX3BbLZgxYKDpmYMEN4FujtjgIUPTRdMNGz4iaGho5CjBTaCbYyaH0WOCsRehQDfHTA5jxwkOQjfHTA7h8RMEJ6GbYyaHrImTBCehm2Mmh8lTeFZNnTbdadDNMbMthFk2M7JnOnVWZDbP5Jy5OU6Dbo6ZbSHMssmMhJw6bz7X5IKFhEE3x8y2EGbZLFpM6JKlPIPLlq8gjHeEdyKcuxJRHnJWrSaMd4R3IrRmLaI+PrUJaOSYqQYaOWY8QPuWbbZGjhmVdeujGzZu0hXat2yzN3LMaGzekrd12/YdukP7lm22Ro4ZlZ27dmtafsGeWOv+EmjkmFHZu6/qsXC/W7EMoJFjRuNAwcGqp0OHXclkAY0cMzpHqj+7oy7FMoBGjhmdY9X/d8f1F5JODxJo5JjRORE9mX/qdJ7ukk4PsvZDI8eMxZmz0cJz53WVdHqQtR8aOWbeQtZ+aOSYeYpA7fcQgdrv41PrKCq+wDDlXCxhGRv3+rppl0rNm+qYEVy+ctVy9/q6Zdeu3zDeDDOCm6XFt24b7l5fB7tz13xnzAjC9+6nPXhI/bNsyiKPGIbxuDz7icuhgKfPWEZQlPX8RYnojz5/TsVLljkoe5X7+s1b1zMB795/YJiDyo8V8H2Wft2PUf6JZTX5HAKXft2P3LDXtC8ZXxlGR/p1P3LDXtO+ff/BMA9Bbtj/pvInyzzjP2/uvwDhAQVelY+RJAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.449;4.blob,1.1,1100.iVBORw0KGgoAAAANSUhEUgAAAC8AAAA+CAMAAACMc7KgAAABuVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC2yaEegAAABOUlEQVRIiWNgIAQYGQkqQQZMzCyspKhnY+dgIsmCUTAKRsEoGAWjYFgBTi4w4EZm4QM8vGDAh8zCB/gFwEAQmTUKwEBIGIeEiKgYMldcAkILC+EySVIKmSchDqakZWRxqZeTV0BwFJWUwbSKKphSU9fQ1NJGVc+to4vg6OmDKQNDIxBlbGJqZm5hiWaBlTWcaWNrB6btHRxBlJOzCwODq5s7qnoPTy8Y09vHF0z7+YOpgEAQGRSMZkFIKIwVFg6mIiKjQFS0WwyIio1DUx+fAGUkJiWD6ZTUNDCdDjE/A019ZlY2hJGTmwem8wsg/EKI+4vQ1DMUl0Do0jIwVe5ZAeFXalS5VteYoitnqK3jBFH1DY1gblMzTKKlVSOorR1DfUdnF4jq7oFwe/swVKCB/gkgcuIkQuqwAQDeyi+yae54EQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.513;4.blob,1.1,2068.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492328178;4.copy,1.1,3.580,3.209,3.380,2.19,2.14,1.1,3.560,3.209;4.copy,1.1,3.590,3.247,3.370,2.19,2.14,1.1,3.570,3.247;4.copy,1.1,2.10,3.361,3.950,2.57,2.14,1.1,1.0,3.361;4.rect,1.1,3.471,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.235,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.310,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.941,2.33;4.blob,1.1,1052.iVBORw0KGgoAAAANSUhEUgAAABMAAAB0CAMAAABQf/kcAAABmFBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCwiVCI+mT4CBQJ9fX3Ozs4jViM+mD4BAgHW1tZwcHAqZyo1gjUECQQ7kjsbQhsUMhQAAQB4eDE8PBhHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRGJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsAAQEkWVk8k5M4iYkaPz8jVlYGDg43iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcXOjoLHBw0gIA+mZk9l5cJFxcECgoMDAz19fVKSkqkpKSoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3Nze3t7eVlZVZWVns7OwJCQny8vJQUFCcnJyqqqrQ2I7nAAABOElEQVRIie3UVU8DQRiF4SlFW9xdilNc2lKkuHtxh+Lu7vq3oduyTPJyQyBAGs7NfPPsZLK7F0cINRovJVohxdtHia9sfv5KAsTPRaen6XWgwKBgWEgoKCw8AhYZFQ2LiQXFxSfAEpOSYSmpoDRD+tuYkZnlGrJz1Me5eUbXkF+gWmERbikuKYUZy8ph35UK0/tsttAsZliltQpWXYP7am11sPqGRlhTM96lpbUNZmrvgHV24Tu6rT2w3j4B6x+gyfnI/uOZ+Xr72CVyt8/g0PDI6zI65ty422d8YnJqemZ2bt65cbePQ4iFxaVlh3OW28e+sqqsn28fNVL7qJHa5xfjYX2v5u/+cSVr6xvEzS3a9s4uTLu3z4MHh7QjwzHx5JR2dk67uLwiXt/Qbu80sPuHRx58epZ3L7akMgmpzFUFAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.174;4.blob,1.1,3024.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.229;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAAFcAAAASCAMAAAAZg7KBAAABXFBMVEUAAAAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2ksLBKVlT0yMhQTExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG0CAgE3NxZ+fjOZmT54eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXgFBQJBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBODgzWRkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxwBAQB6ejF3dzCFNoVSIVIxMXowMHcoKBBwcC2SkjsCAQKVPZVBGkEQECgtLXA7O5IbGwsaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0oXst5AAABBElEQVQ4jWNgwAYYmbAKUwyYWVipaRwbOweUxclFnA5uHl6izOWDsvgFBIkzWEhYhLAiUXYxGFNcgjhz8QNuSTAlJQ0XkZFlpMA8OXkgoaCopKyCLqMqq0aKQeoaYKAJYmtp6+jqMegbGBoZm2CqNDUjxVxzXTCwYGDQsLSyNrdhYLC1s3fAptLRiRRznV3AwJWBwc3dwxMk4uXt4+uHRaW/OCnmIsIhIDAoOAQkFMobphyuiKEyIpIUcxHhwKBpEaUbrQ0WjYmNQ1cYn5BIirmIcACBpOQUqHgqusI02XRSzEUHGbgkMrOyKTEXJ8jJpYmxefmqtDC2IKuQFsYyFBVTagIAwOskf6qFHMoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.291;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.345;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAAcAAABZCAMAAADFCM5mAAABXFBMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXACAgEICAMFBQJMTB///2ewsEcPDwY0NBUjIw4KGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwdSB1n/2cJFwkGDgYjViNe6F4zfzNX11c8lTxV01U/nT9a3lo3iDcBAwFl+WUsbCwSLBIUMRQtby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx4GBgLIyFEoKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8JCQTy8mJQUCCcnD+qqkVBRvLYAAAA5klEQVQokbXQeVOBURgF8Espoo0WIVnKklZ5E0WrrdVWtO9IpPL9Z8w95wvUDOef33mfmXvvvI8QMio1EGoV6OvXwIFBoNUNQb1hGI6MgrFxIzRNTMKpaWCesUCrjXfO2kUvM+eQcQqXW2ZeLHhkvN17wOeni4ElluUVurq2zhLcoCFlE4aVLQ4iUbq9Q2NxursH9g8O4ZGSgMlUGmaOwclpWHKWOsfnRbY7//PP5LBfh8hjv25RwH49fz5fvLxiKZXp9c0tvLt/4ODxiT6/vLK8vdNKldY+6iyfDdr8ysHW9w8Hv+0O9e0fZeuFcHcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.430;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAC8AAABlCAMAAADqOkqUAAACGVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkXRXSyRAAAB50lEQVRYhWNgIB4wMpKgmIGBiZmFlRT1bOwcTCRZMApGwSgYBaNgFIyCUTAKRgEVAScXGHAjs/ABHl4w4ENm4QP8AmAgiMwaBWAgJIxDQkRUDJkrLgGhhYVwmSQphcyTEAdT0jKyuNTLySsgOIpKymBaRRVMqalraGppo6rn1tFFcPT0wZSBoRGIMjYxNTO3sESzwMoazrSxtQPT9g6OIMrJ2YWBwdXNHVW9h6cXjOnt4wum/fzBVEAgiAwKRrMgJBTGCgsHUxGRUSAq2i0GRMXGoamPT4AyEpOSwXRKahqYToeYn4GmPjMrG8LIyc0D0/kFEH4hxP1FaOoZiksgdGkZmCr3rIDwKzWqXKtrTNGVM9TWcYKo+oZGMLepGSbR0qoR1NaOob6jswtEdfdAuL19GCrQQP8EEDlxEiF1o4ABI8dhA+DcOnnKVAgPNcdhA5DcOm06hIeS47ABaG6dMXMWmIuS47ABaG6dPWcuhI+U47ABaG5lYJg3H0Ij5ThsAJpbGRgWNCyEMBA5DhuA5lYgWLQYQsNzHDYAza0gsGQphIbnOGwAlluBYNnyFRAGLMdhA7DcCgIrV0FoaI7DBuC5FQRWr1kLpiE5Dmv9iMitQLBu/QYIA5zjsNaPqLl14yYkDk3qRwC40loIHfmujgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.480,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.497;4.blob,1.1,2136.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.516;4.blob,1.1,1052.iVBORw0KGgoAAAANSUhEUgAAAVAAAAAPCAMAAACFmWd9AAABg1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAGdLRzRAAABTElEQVRYhe2OV1MCMRRGA6yFtWDFLohdsPeKgGLvvffesPfy0wWWSCbuQ272wQ3jebj35Gbmmw+hIAYjiiVMUhxl8QmJkQurqaWQmOUk6pKckvrjRgNndX1ikiy0paXjT1ZTSyEwyxn0KTMLW7Y1B95ax+RKebTlFxQimKmlEBTJxVhtNmXbSyKCHKVa6uuPsvJfVlFZBTS1FILqGmxOV21dWOobGpVLU3MLf3lRaG2DGivtHZ1Oxbq6ld3T28dTUSzc/R6gwfH6BsJ70M8dIRBDw1CDMzIammPjE/wR4jA5BTU40zOhOTs3zx8hDguLS0CDs7yyGpxr69wBQrGxCTU4W9sI7Vh3+QNEYm//AGiMHMpHWI9dJ+j0TEtLgTi/uAQaI1e+ANbrm1t0d6+lpUg8PEKNjafnqL+88nX7J8rb+8dfV4gtAp9f5PMbHUVFdJHeavUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.535;4.blob,1.1,3124.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.571;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAflBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsxMTEYGBgFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRK9h4MPAAAAo0lEQVQ4je3SRw7CMBBAUWN6MTik0xI63P+CjC2B5guxZRXvnmS5fI0xPauX6Q+GsB2NP5hMxbP5ArZuSa+8gRO/hm2a0XlBl46uaniz3cF7f4Cb9gifznjf5Zpo39o7/vd4soe1vxzLKcdyen8opx3K4TwpB0s5WMrx/jSj84IuHV3VsJSDpRws5WAppx3KKcdyyrHcV69uvrr5eq9uvv4+Xy9W9B3UjLETAQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492328287;4.copy,1.1,2.10,2.57,3.950,2.19,2.14,1.1,1.0,2.57;4.copy,1.1,3.570,3.209,3.390,2.19,2.14,1.1,3.560,3.209;4.copy,1.1,3.580,3.228,3.380,2.38,2.14,1.1,3.570,3.228;4.copy,1.1,3.570,3.247,2.10,2.19,2.14,1.1,3.560,3.247;4.rect,1.1,3.952,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.430,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.850,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.931,2.33;4.blob,1.1,1092.iVBORw0KGgoAAAANSUhEUgAAABwAAAB0CAMAAAChdKKRAAABmFBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCwiVCI+mT4CBQJ9fX3Ozs4jViM+mD4BAgHW1tZwcHAqZyo1gjUECQQ7kjsbQhsUMhQAAQB4eDE8PBhHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRGJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxsAAQEkWVk8k5M4iYkaPz8jVlYGDg43iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcXOjoLHBw0gIA+mZk9l5cJFxcECgoMDAz19fVKSkqkpKSoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3Nze3t7eVlZVZWVns7OwJCQny8vJQUFCcnJyqqqrQ2I7nAAABVUlEQVRIie3UVU8DQRQF4ClFW9xdilNc2lKkuHtxh+Lu7vq3YadhdjI794bw0JRkz8vc2S+b3YeTSwiLIYDGyE8sgUE0wfzEEhJKE8ZPfhmTGUGzCbbwiEgYo6Jhi4mNgzE+IRHGpGTYUlLTYEzPyIQxKxu2HEvuz5iXXyBgYREbi0us9FRrUlrGsLzCe0pqQiqrqr2DrCbWmlr413yZOps62x0IOuww1jsbYGxsgr/Z7GqBsbWtHcaOTtFU7OrugdHW2wdj/4DGGA46h2AcHtEaw9ExBKVB0X+ib5hfbhhtuA2jDbdh/m98Uw43N4vlGJ+YnPo+pmeUi1iO2bn5hcWl5ZVV5SKWw0PI2vrGpkeZpeVwb23TUy/H36JvDr0ceHZ29xDdP0Dw8OgYRuPJKfLq2TmCF5ZLRK+uEby5RfDu/gHRxycEn18MML6+vSOvfnxKH38BMF01/8F8+2IAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.560,3.234;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.272;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.411;4.blob,1.1,1568.iVBORw0KGgoAAAANSUhEUgAAADkAAAB4CAMAAAB/wqp+AAACN1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0BAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUMDAX19WNKSh4sLCykpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUICAjKgbstAAACHElEQVRYhWNgIAcwMpKljYGBiZmFlTydbOwcTGRaOgpGwSgYBaNgFIyCUTAKRsEoGAWjYBSMglEwBAEnFxhwI7OIAzy8YMCHzCIO8AuAgSAyaxRQDISEcUiIiIohc8Ul0BUIC+EyU1IKmSchjiYtLSOLS6ecvAKCo6ikjCatogqm1NQ1NLW0UaW4dXQRHD19NI0GhkYgytjE1MzcwhJN0soazrSxtUOTtHdwBFFOzi4MDK5u7qiSHp5eMKa3jy+aTj9/MBUQCCKDgtFkQ0JhrLBwNKmIyCgQFe0WA6Ji49Ck4xOgjMSkZDSplNQ0MJ0OsTMDTTozKxvCyMnNQ5PKL4DQhRB/FqFJMxSXQOjSMjSJcs8KCKNSo8q1usYUXSNDbR0niKpvaESTaGqGsVpaNYLa2jF0dnR2gajuHnSJ3j4MtWigfwKInDiJkLphByZPmTKZPJ1Tp02bTqbOGTNnYZQX2AC4rJk9Zy5C5zwwhVpeYAOQsmb+AnSdKOUFNgAtaxYuWoymE6W8wAagZc2SpcvQdCKXF9gAtKxhYFi+Al0nUnmBDUDLGgaGlQ2r0HQilRfYALSsAYLVa9B1wssLbABa1oDA2nXoOuHlBTYAK2uAYP2GjWg64eUFNgAra0Bg02Z0ndDyAhuAlzUgsGXrNjSdkPICa9sEUdYAwfYdO9F0QsoLrG0T1LJm126oTtRcRnzbhPxctmcmMJcBAEhyd8lfjfq6AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492328380;4.copy,1.1,2.10,2.38,3.950,2.19,2.14,1.1,1.0,2.38;4.copy,1.1,3.590,3.209,3.370,2.38,2.14,1.1,3.570,3.209;4.copy,1.1,3.810,3.247,3.150,2.19,2.14,1.1,3.790,3.247;4.copy,1.1,2.10,3.361,3.950,2.19,2.14,1.1,1.0,3.361;4.rect,1.1,3.951,2.52,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.921,2.33;4.blob,1.1,1780.iVBORw0KGgoAAAANSUhEUgAAACcAAAB0CAMAAAAxZ9teAAACXlBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCwiVCI+mT4CBQJ9fX3Ozs4jViM+mD4BAgHW1tZwcHAqZyo1gjUECQQ7kjsbQhsUMhQAAQAYGBhUVFTPz894eDE8PBhHRx1/fzSioqKvr68VFRX19fVJSUkeHgyYmD4QEAecnJy9vb1WViNxcS5ISEgXFxcCAgGMjDk4OBcODg5WVlYtLRKSkjsHBwPo6Oh/f39lZSliYijX19eVlZUJCQSUlDwpKRHT09OdnZ2JiTcBAQDe3t6IiIh0dC9TUyL5+flsbGwUFAgaGgsxMTFLSx58fDJvb2/m5uaAgDRDQxvMzMxQUFDl5eUpKSlCQkIkJCR1dXXFxcVERETu7u7a2tpSUlIMDAyrq6uwsLAAAQHq6up2dnYkWVk8k5M4iYkaPz8jVlYGDg43iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcnJycXOjoLHBw0gIA+mZk9l5cuLi4+Pj4JFxcECgocHBz6+vplZWXGxsZ+fn7b29saGho6OjqNjY2/v78BAQHNzc2FhYUUFBR6enpKSkqkpKSoqKhGRkb29vZjY2OLi4vBwcEtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vJycnLZ2dlmZmYvLy/7+/v8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqq4kRdqAAACkklEQVRYhe2X+VtMURjHzxgHFbJUZBkqhLIbVJgku7ET2fdlULIWyb5TdrLLErIvhez7f2Xm3sx7n/O+98z7A3r0+P5yvuedz3PnPjPfOd87QgTlqGfISTtQfWmoAe1ADRsZCqNdnVJ4BI+LCGdhjZs0ZXGRzVhY8xYtWVxUdAyLa9WahcW2acvi2rV3sbgOHVlYXHzCL9upcxd7LrFr0HbrnmSsVNpFco+g7dnLXKm0W9S7T1/ThEh7Ur/+9rf3l+XmffViwMDYoB+UAvPUNAUcPITk0lIVbqgnneCGZQxX3zlzBMGNHIXucLQcg7ix48YjzisnIG7ipMmIE1OmIm7adIyJGVkqN3NWNsHNnqNyKXPnEdz8BSq3cBGBORcvUbilGcsILkEuV7gVKwlMrPK5FG71GopbmygUjlROrpfDrfPxDou8KBZWC4IO0LcBdIC2DaAD9G0AHaBtA+gAfRtAB+jbADpA2wbQAfo2gA7QtwF0gLYNoAMsbUAIOsDSBoSgAyxt8M9rPQ/bsJEY4oxv2hxHcCjjzi3UJ4gznu8pIDic8a3bakyhZUhkfHuRue7YuWu3f9mzN7DBGQ+T+abZt//AwUOHjxw9FtjgjBfLPNOUCHH8xMlTJQFPZPy0PAObwrPnjJXI+HmZro7IjDtKL6AZmfGLWWhEZvzSZTQiM36l9CoxJXTtehmLi7lxk3fBW7d53B/U/+d7QrX/fK+V/kQH1aUT/TeqwFPOA+/c5XH3KryhIb+cvvu8Cz54qHnRcgY9in9sR7meeHKf+tdId2D37Lkd96KyvKri5avX1cYP6M1bO+6d/y/h+2T5wfxn6P74SXOHoqz4c437gs9qUl+/OVjc9+oc3gUzf4QifgJS/3ITZvm6ggAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.560,3.215;4.blob,1.1,532.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAcCAMAAACEVGUKAAAAxlBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4SLCwsbW0BAgIzfn4+mZkxeHgCBQU2hoY8lZUOIiIpZGQfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpILGxumUL6lAAAAhElEQVQYlWNgYGBkYmZhZWNgYGDn4OTi5uEFsvj4BRgYBIWEGRhERIFcBjFxBgkhSRBLSpqBQQYiJsvAIAdRJ8/AoMCsKKikzAmSUFFlFlNTZ6Aj0NAEU1qM2jq6QFpPWN+A2xAkYqRmbAJRYmpmbmEJYVpZ2+jYMkK12tk7wI1xRDISAGc8CYn59xhOAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.253;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.345;4.blob,1.1,2068.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.883,3.392;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.470,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.489;4.blob,1.1,2000.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.516;4.blob,1.1,2020.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.535;4.blob,1.1,5128.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAxklEQVQ4je3SxxKCQAyAYVSUaltREQULFqwo9oL1/d9Jh2RHM6NXT+T0f7uwpwjCaxICn6iSKc6oxHQGGZUkK0goVdPRUNkc/xsqX+COqshUJFSJGWioMqugoarMREPVrDoaq2Hz96EcmRuqabXQWO2OiwdQereHxuoP+Avv+jKeTj0cjenBZEo900x64M+pF8wjDtiSfrByqNc29can3u4Ipf2B+MhOxEroEp8vhNdb8Ml7KJJr4yH8mHi/YOL9ivfrz/v1BBGbI/NE4T5MAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492328494;4.copy,1.1,2.10,2.19,3.950,2.19,2.14,1.1,1.0,2.19;4.copy,1.1,2.10,2.76,3.950,2.38,2.14,1.1,1.0,2.76;4.copy,1.1,3.590,3.209,3.370,2.19,2.14,1.1,3.570,3.209;4.copy,1.1,3.810,3.228,3.150,2.38,2.14,1.1,3.790,3.228;4.copy,1.1,3.790,3.247,2.20,2.19,2.14,1.1,3.770,3.247;4.rect,1.1,3.951,2.33,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,2.52,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.79,1.6,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.117,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.136,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.392,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.911,2.41;4.blob,1.1,2000.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.174;4.blob,1.1,3024.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.234;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.345;4.blob,1.1,1692.iVBORw0KGgoAAAANSUhEUgAAADEAAABZCAMAAACg5TwZAAACT1BMVEUAAAAwMHdWVtQUFDJmZv0LCxs6OpBMTLwCAgReXukmJl4eHktjY/QEBAtERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIoNDSFnZ/4SEiwyMn1TU85WVtYtLXAMDAX19WNKSh5HRx1/fzSkpEKoqERGRhz29mMODgYeHgyYmD4QEAcDAwHm5l1jYyhWViNxcS6LizjBwU4CAgGMjDk4OBcICAMFBQItLRL+/mcfHw2SkjsHBwNMTB///2ewsEfQ0FR8fDJlZSliYigPDwY0NBUjIw5yci7Z2VgJCQSUlDwpKREYGAr8/GY3NxY8PBiJiTcBAQC3t0qVlTx0dC9TUyJZWSTs7F8GBgIUFAgaGgvy8mJQUCBLSx6cnD+qqkWAgDRDQxsKGAoECwQiVCJUz1QGDwZBokFHr0cIFQhj9WMdSR0/nD9MvUwdSB1n/2cJFwksLBJtbSwGDgYjViN+fjOZmT54eDFe6F4zfzMyMhRBQRqGhjYiIg5X11c8lTwKCgRkZCmXlz1NTR8LCwVV01U/nT8wMBODgzWRkTscHAta3lo3iDd6ejF3dzABAwFl+WUsbCwoKBBwcC0SLBIUMRQbGwstby1d5l0BAgFSzFIyfTIgUCBc5VwRKREcRRwbQhseSx7U1FaTkzz9/WYqKhGQkDq8vEyKijg7OxgEBALp6V5eXib09GMLCwQTEwipqUSjo0J9fTP392RFRRxERByCgjVkZCjk5FwhIQ3Cwk5ubiw1NRaOjjkEBAF9fTLOzlPIyFFgYCfW1lZmZimv6V4xAAACX0lEQVRYhe2WZ1cTQRSGL9h77x0sGGONJjRRCaigoAhEULH3FhGNGjsWxBIVNKICKjZUFLtibz/M3UnUzM7cGe7xE+fwfNi582af7CbZnPMCMKKigUh0FFFo07Yd0WjfgSh07NSZaHTp2o1odO9BFHr26k00+vTtRzT6DyAKAwcNJhpDhhIFGDacarTyX4wYOUr+QkwspoweI89jYzBj7Lg4WTzeNgEz7BMnyeLJUzABYOo0SeiYPoMtThMXNwHEJySKRnxSsrnMTDGZxU0Gs+eIRqqbLWnpJnO5yWDefEHIyFyAfwyAhVnZ1mjR4hyVAUtyrUlevlIAz9ICPii0LVMbGctX8EGR5LvgWbmK369eozNaGmvXUY31GzZSlU2bqcaWrduoyvYdVGOnd1czzyzeHVpLvHuwU+wuBnvMHdl7ffvC+f4DmOH2MfwAroOHct2H/+RHjmJGYSLjGMDx0hMn/+WnTuvvquxMuefs3/zcef1dQY7/gi8Q/itfvHRZf1cmFZVJoeGK9ypmWAmGlmtV15trhLlxkyhU15TQhNqqW8RL3L5DFFoYgTpum3y3WGfUBfi9O1Uj+O8F+eB+plNtPHhoCRz1j5TC4ycN1ig/T2kUPX1mjYK2RpXx/IWYvUTaCiPt1WsxfPNWYbx77xDDuNIm3PhQL0s/elChKUH6A3/6/MU4FrA24rRHTvD1m/SNXOVlxvE7ayMpPyIn+Fkpv3bDL+NQwdpIemPk1IoctA3jYG0YB2nDCpA2rELahpVI27AaWRtWI2nDGiRtWIfYhnUIbViL0Ib1WNuwgt8WmIqGFFISHwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.883,3.373;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.489;4.blob,1.1,1500.iVBORw0KGgoAAAANSUhEUgAAADkAAAAqCAMAAAA+hAOCAAACK1BMVEUAAAAFBQKRkTswMBMGAgIIAwMDAQFeXiZmZinIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5LHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0BAQECAgI0NDQ+Pj4REREKCgoMDAX19WNKSh4GBgakpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUICAgNDQ0DAwMRss81AAAB9UlEQVRIiWNgAAJGJmYgycIKBmzILIKAnQNIcHKBATcyizjAwwsGfMisUUAx4BfAISEoJIzMFRFFVyDAj8tMMXFknqgImrSEpBQundIysgiOnLwCmrSiEphSVlFVU9dAlWLT1EJwtHXQNOrq6YMoA0MjYxNTMzRJcws409KKHU3S2sYWRNnZOzAwODo5o0q6uLrBmO4enmg6vbzBlI8viPTzR5MNCISxgoLRpEJCw0BUuFMEiIqMQpOOjoEyYuPi0aQSEpPAdDLEzhQ06dS0dAgjIzMLTSo7B0LnQvyZhybNkF8AoQuL0CSKXUsgjFLVMsfyCiN0jQyVVSwgqrqmFk2irh7GamhU9WtqxtDZ0toGoto70CU6uzDUooHuHhDZ20dI3bAD/RMmkKlz4qRJk8nTOWUySCdaeYENgMuaqdOmI0RmgO1ELS+wAUhZM3MWuk6U8gIbgJY1s+fMRdOJUl5gA9CyZt78BWg6kcsLbABa1jAwLFyErhOpvMAGoGUNA8PimiVoOpHKC2wAWtYAwdJl6Drh5QU2AC1rQGD5CnSd8PICG4CVNUCwctVqNJ3w8gIbgJU1ILBmLbpOaHmBDcDLGhBYt34Dmk5IeYG1bYIoa4Bg46bNaDoh5QXWtglqWbNlK5jq34aaV4hvm1CQy7Zv38EAADkleDqGfAJOAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492328591;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.900,3.114,2.60,2.19,2.14,1.1,3.890,3.114;4.copy,1.1,3.810,3.209,3.150,2.57,2.14,1.1,3.790,3.209;4.copy,1.1,3.790,3.228,2.20,2.38,2.14,1.1,3.770,3.228;4.copy,1.1,3.580,3.247,3.210,2.19,2.14,1.1,3.560,3.247;4.rect,1.1,3.951,2.41,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.136,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.364,3.846,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.901,2.96;4.blob,1.1,1252.iVBORw0KGgoAAAANSUhEUgAAADoAAAA1CAMAAAAnMwjPAAABrVBMVEUAAAAkJCR1dXXFxcV3d3fU1NRERETu7u4hISEDAwPa2tpwcHAyMjL9/f0bGxtSUlL19fUMDAyQkJC8vLyrq6uwsLAAAQEEBATp6eleXl7q6up2dnYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQLCwsTExP///83iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkIXOjoLHBw0gIA+mZk9l5cPDw/39/dFRUUuLi4+Pj4JFxcECgpkZGTk5OQCAgIcHBxJSUnCwsKKiooGBgb6+vplZWX+/v4sLCzGxsaVlZV9fX3Ozs5+fn7b29vW1tYaGho6OjqNjY2/v78BAQHNzc2FhYUUFBR6enpKSkr5+flUVFRPT08XFxekpKSoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEFBQUICAgtLS0fHx+UlJTl5eVpaWkYGBjQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vI0NDQRERFMTExycnLZ2dlmZmZgYGAvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQlQUFCcnJyqqqp9Jr1mAAABuUlEQVRIie2WZVMCURSGj4FiY3fj2o3dGNjdYqBYmNjdXb9ZuDsjcM9B7+wHxw8+H1jm8Lz3Xmbg3QX4GQ8Bh8bTS8zzVvETH1+1kAcqb27g5x9AbYE8CAwK5iYhmlAiiT0IC+cnEZHUprIX5TSJjonlpbh4Iil7CYlJybZLSqp9lJau5aQMKYSIyl5mVnZObl5+QaF9VFTMSyVSKRGVPR1AWXlFpc7+vqq6hpdqpTqcdPKi6hvYtbFJz1vNUguOEl5rG7IM7R04ij11ZxfWunvQiPB6+3AS+gfQiPAGqZ/cUPuwkEcxMjomaCK04xNKozA5pTj6FyHqAmOcniGmuC4oZpvm0IyoC1FwrYhC1IoouFaEwbUiClErohB1IQpRK4KQtSIGWStiCNfFP79OqMaoOGuaVxxdMC8qjfotLSvedmX1mw+/blWWNYbr/3O9c8NdUL+p2dq2XcOsYJIYtirWszUsTNjZdRfd2zcemA+Pjk+0oD5lnAGcszXkJ7GLS3fRq2uAm0Hp9tr5wFVsjTsmWO8fvvm2MFbyaHt1HNiFJ/yogXAc2IXnF8PPWZrXkzelUXj/UBD6BKiWTYyHN5u1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.560,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.212;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAh1BMVEUAAAARKipKuLhh8fFa4OA1hIQDBwcLHBxf6upLurogTk4rampg7e1Anp4+mZlZ3d0DCAgfTExn//8TLi4AAQFf6+szf39d5+c1goIKGRkgUFBHsLAaQEBFrKxOwsJLublHsbFc5eU2hYU9lpYdSEgVMzNe6ekqZ2dBoaERKSlKt7db4uI2hoYiXDzbAAAAYklEQVQImU2MSRKCQBTFgoyNItg0oDIpqAxy//Pxu8qFu7xKvQDOwfX8AAgjFR9PidA5zeCic0xRyjTVlZu+C6FqHN1Yars/+tn+gYnsg+cAYyrVl35L+aPiqZitWFb3uwXsB0MFYdnVL+sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.883,3.354;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.364;4.blob,1.1,1008.iVBORw0KGgoAAAANSUhEUgAAABwAAAA0CAMAAACuLKj9AAABZVBMVEUMDAX19WNKSh4AAABHRx1/fzSkpEKoqERGRhz29mMODgYeHgyYmD4QEAcDAwHm5l1jYyhWViNxcS6LizjBwU4CAgGMjDk4OBctLRL+/mcfHw2SkjsHBwPQ0FR8fDJlZSliYihyci7Z2VgJCQSUlDwpKREYGAr8/GY3NxY8PBiJiTcBAQC3t0qVlTx0dC9TUyJZWSTs7F8GBgIUFAgaGgvy8mJQUCBLSx6cnD+qqkWAgDRDQxssLBJtbSwFBQJ+fjOZmT54eDEyMhRBQRqGhjYiIg4KCgRkZCmXlz1NTR8LCwUwMBODgzWRkTscHAt6ejF3dzAoKBBwcC0bGwvU1FaTkzz9/WYqKhEICAOQkDq8vEyKijg7OxgEBALp6V5eXib09GMLCwQTEwipqUSjo0J9fTMPDwb392RFRRxERByCgjVkZCjk5FwhIQ3Cwk5ubiw1NRaOjjkEBAF9fTLOzlPW1lZmZimHdObGAAABSklEQVQ4je3RWTfDQBQH8OptLRW1hm40tAjVhaKWqIitVIm21qL2vXY+v2TSJZMZfXOOB//H+Z25d+5ck6nGDNRYrGCC2jo6Wi0K1jfYaNbINClob26hYWsbKAjtHRRjO7sQOpwuEh1uD0Lo7iHRy4GGvX2E+fz9RRwY5I04NBwoIowEjRgKQwkjo2O4RZnxMvomJnGMaU9ECFPTOM7M6vCH/KMwp0d7HEXdFbD8vLigR05EkQDii0tBbhkrG3WhrACsJtbWDT0rZZMbqcgmjpWyEJC2RJmnl1WznXZXmzPzx/72t1HOYoeeHUGHWRm/wnkrKO1mcNzz75fx4NDQjM0dlfD4JG98SjhUwtjpmREzzHkRLy7JKa7MGl7f3JJ4d6/hwyNLoi1RQPiUIw3gOaJiwSnQ8OX1TcH3D5pBPJVU8DNNRch/Vd/KN+tWO2YCZOA1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.463,3.440;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAAJEAAAA1CAMAAAB2i/npAAABUFBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAEGDg4ECwtf7Oxh7+8GEBADBwdX19dY29trNe0YAAAB3UlEQVRYhe2W104CURBAQUTsvfdGUVFRsWPF3kXF3htY///NKOzOuncWuJvBicmep5Mws8zLTY7NRoU9h+xTROTYuS/4xuFQNdeZx3iIgiu/oFDxomLOSxRKSstcSS2vqGQ9RaSq2pV+6E+pqeW+QEddfQP3CToam5o5/x7evGotrUy3/ABvXrU2ZzvfPdo3r1pHJ+M9KF3d3BdYWFhkE+hWzGhwe2SmoVsxo8HjlhiGbkXM6zV/hc+nak9vn8QidKto/v6BQbMHBYaGRxQPjkosQrciNjY+4Td70eTUdCCpoZlZiUXoVsxomJsPpB9SgW7FjIaFRYlh6FbMaAgvLUtMQ7diRsPK6prENHQrZjSsbxj9srm1rTfoVsw0g7Cbmp3dPb3uRw6Mpg+PonqDbsVMMwi7qQlGQno9PjGcPj0TDLoVM80g7Kbm/ELQyyuj4eubW8HSoA5muhG+u0fUiOjDo2CZrmS6EXp6RtTC4r8BtYoZB1CrmBkBZUptmlrFzAgoU2rT1ipmRkCZUpumVjHjAGoVMw6gVjFjAGoVMw6gVjETiMUUI3rpIlCrmOmJv7y+JYzopYtJDLWKmcD7x2c8YUQvXUxiqFXMso+YxFCrmGUdE0mcZUwk8W++ACoPdY5GQB/LAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.478;4.blob,1.1,168.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOBAMAAADgeEClAAAAHlBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh01A5KAAAAGklEQVQImWNgIA8IKSkpM7iGhoYxVHR0dAIAFJID0E03MR0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.497;4.blob,1.1,1632.iVBORw0KGgoAAAANSUhEUgAAAZgAAAAPCAMAAADu8SkoAAACdlBMVEUAAAAFBQxjY/UeHkpHRx1/fzR3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4eHgyYmD4QEAcyFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGNWViNxcS6QOjq8TEwDAQHmXV1jKCiQkDq8vEwtLW88PJQPDyQHAwPXV1fbWFg4OItOTsECAgGMjDk4OBcEAgLpXl5eJiaLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8tLRKSkjsHBwNLHh70Y2MtEhL+Z2cfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnxlZSliYiipRESjQkLQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNkJCQSUlDwpKREPBgb3ZGRFHBxyLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc8PBiJiTcBAQBkKCjkXFwCAQEYCgr8ZmY3FhZkZCjk5Fw/P5xaWuA8PJV0dC9TUyLCTk6KODgGDg63SkqVPDzCwk6KijgQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgYUFAgaGgshDQ0sEhIECwtf7Oxh7+8GEBBZJCQGAgIhIQ3+/mcsLBIEBAliYvIgIFABAQECAgJ8fDJ9MjLOU1MDBwdX19dY29sJBATyYmJQICB9fTLOzlOsRUXYV1dFRaoxMTE+Pj4XFxeAgDRDQxvWVlZwLS2cPz+qRUXW1lZwcC3zYmJuLCwKCgoNDQ0FBQVUIiIBAADt/kH3AAACC0lEQVRYhWNgoCtgZGLGwxpigIWVOHVs7DgkODi5kLncPBQ6iBLAy4ePNbQAKwtx6tjZcMnwCyDzeLhxGiEoSGuWkLAIA27WkAKiYuJEqZOQlMIlJS0jiODIyskjyykoKsHZyiqqajRmqWtoQi3DxhpSQEubOHU6ujil9PQNEBxDIxQ5Y2EmE1Mo28zcQpnWLEsrmM3YWEMIWNvYEqXOzt4Bt6SjE5zp7OKKKufm7uHp5U2Gy8gDPr5+eFhDCPgHBBKlLihYGbdkSGgYjBkeEYkhHRUdE0u6y8gEcfH4WEMHJCQSpy4pGZ9sSiqMlZaOLseYkZnFl02qu8gGObn4WEMG5OUXEKWusKgYn3RJKZRRVl6BKuNTWVVdU0uO08gEdfUNeFhDBjQ2NROlrqW1DZ90e0cnhNHVbY0q09Obg2isUruRjBVE9+FjDRXQP4E4dRMnwZmTJ2ORnzIVQk+bjiYxYyaCTe1GMsOs2XMwWAxz583HwxoiYIHYQqLULQpdDGMuWbpsOaaCFSorQdSq1WvwmELtpjGDTqgdBoth7br1eFjkgg0bwWADndSFbyLOWZu3wJlbt21fgqlgx85dIGr3HhLdRxnYuw+TBSw99+NjkQkOHASDQ3RSd/gIcc46eoyQiuMnQOTJUyS6jyJQePoMBotW4Ow5MDhPb3XUBnSx1+7CRQzWKCAOAABiT9WyuZgniAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.516;4.blob,1.1,1976.iVBORw0KGgoAAAANSUhEUgAAAkoAAAAPCAMAAAAs9xBdAAACxFBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoqKiosLCwGBgY+Pj4RERFHRx1/fzR3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YeHgyYmD4QEAcyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGNWViNxcS6QOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsECAgGMjDk4OBcEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR8tLRKSkjsHBwNLHh70Y2MLBAT+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnxlZSliYiipRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkJCQSUlDwpKREPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjc8PBiJiTcBAQBkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJV0dC9TUyLCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYUFAgaGgshDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFABAQECAgJLSx4IAwN9MjLOU1Py8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoICAgxMTEXFxeAgDRDQxvIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4aGho0NDQKCgoNDQ0FBQUoEBA0FRUiIlQAAAEDAwPtPYB4AAACwUlEQVRoge2U9XMTQRTHt22QBkk5KkBxihOgOLRIi7u7S6G4O8WLu7u7FHcrENyhuLv9EyR7ObJz2Vzu20lucp1+ftj93suzefsmhFjx8ydpiQBDBpnKmCmz3aJW8bKwBBqzyCxZs2WHOzUFcYw5hJxe8wsOAbpjp+GC0DDrkSt3nv8Gfz+ggO8TYAiXq7z5pB/VKl4WhkBjfrmpQEG4U81XKSQYaY+ZhgvCQm1nocLSd5GIokgBn6eYobhclShZimCKl4WhtLGMJM1m8S5bzox2qvUqlY+sgLTHTINPxUr0/7pylap2Q7XqSH7fp0aUk4quWQtUvCwMtetIKia2bj0q6jdoiHaq9So1agy1x0yDT5Om9GrWvIX43bJVa6iALmnTFlVqade+Q4yoOnZCYzVepc5dumL9uZlGt+49RNGzl3j37tMXK6BH+sX1BxXOgPiBYITGqzRo8BCsPzfTGDpsuD3xiJH0HjUay69PxoxFFc648WCAxqs0YSLWnrtpTJosqSkJtnPqtOloAT0yYyaqcGbNBgO0XaXEOXPB/pSnMS9qviQXLLSdixYvQQvokaXLloMKZ8XKVViAtqu0es1arD0301i3foMkN27abD23bEXz65Nt21GFs2Mn5q/tKu3ajXVnQ2kae/Y69L79hByIOIgX0COHDieBSiVHjEcleSz2OBSq6SqdiDwJNUdRmMapuNOOjzNnz5HzF/D8uuTipcugUsmV+GRJXr12HQpVenrLDYrFU37kZoLTT2wsH3EaSbco0awit+8wfol375H7D1znSVs8fIQqdTx+4tBPn0GhpiDnZ7SkiE//XKC88JQfefnKqT4b6wI6jdcGyhtWkbfvWL/3HxSSpKOKj58+pzrWJAhf5Lavgvj0375TfnjKjwcbq8TPX5RwVqXjcZJ//0l1bArnGa3P+9fbfl7hHwCjKEPTVt6WAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.535;4.blob,1.1,2148.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAAC+lBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBADBwMMDAX19WNKSh4nYScraSukpEKoqEQFDQU8kzxGRhz29mMODgYucS4DAwHm5l1jYygSKxI+mT6LizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgzfzMYGAr8/GY3NxY2hTYhUiG3t0qVlTw9lT0aQRpZWSTs7F8GBgILGgsMHQwJCQTy8mJQUCAAAQCcnD+qqkUyejIiZ46LAAADC0lEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaMAC+A9QwVDONTtSVJ/9tx5LKIXLpJm66XLWASvXCXQHUID167fwCIqepMkQ27dvoNF9O49AmUwGrj/AIugzD1tkgx5+OgxFlExZZIMYXjyFItgnxVphjx7jkXwBZ6RBGzg5avXmIJv3pJmCMO79xhC0h8+kmjIp89f0IW+3vtGoiHff/xEF9po+otEQxh+/0EX+SuBQykAQYGzAmK021kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.571;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAflBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIxMTEYGBj851AeAAAAZ0lEQVQoke3PuRaCUBAD0CGyiOB74MImIIoI/P8PkqkobLGjuV2SExEHgBxcj8IP1GN4oohi9WyEWpNQpBf1elPvkZrltCgr+jA1bdon7V7MvnsL+bQDO7+jrgC/TvO/XFf2j5t+XAAiexW/VhevlAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492328695;4.copy,1.1,2.10,2.19,3.950,2.57,2.14,1.1,1.0,2.19;4.copy,1.1,2.10,2.95,3.950,2.19,2.14,1.1,1.0,2.95;4.copy,1.1,3.890,3.133,2.70,2.19,2.14,1.1,3.880,3.133;4.copy,1.1,3.790,3.209,3.170,2.57,2.14,1.1,3.780,3.209;4.copy,1.1,3.600,3.228,3.190,2.38,2.14,1.1,3.590,3.228;4.copy,1.1,3.580,3.247,2.20,2.19,2.14,1.1,3.570,3.247;4.copy,1.1,1.0,3.304,3.280,2.57,2.14,1.1,1.0,3.285;4.copy,1.1,3.330,3.304,3.630,2.57,2.14,1.1,3.330,3.285;4.copy,1.1,3.280,3.323,2.30,2.38,2.14,1.1,3.280,3.304;4.copy,1.1,3.320,3.323,2.10,2.38,2.14,1.1,3.320,3.304;4.copy,1.1,3.310,3.342,2.10,2.19,2.14,1.1,3.310,3.323;4.rect,1.1,3.932,2.79,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,2.98,1.7,2.46;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.117,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.891,2.79;4.blob,1.1,976.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAzCAMAAAAZ6l75AAABMlBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs4GBgYICAgDAwPW1tZwcHDIyMj///9gYGAoKCg0NDQTExMkJCR1dXXFxcVERETu7u7a2tpSUlL19fUMDAyrq6uwsLAAAQHq6up2dnYkWVk8k5M4iYkaPz8jVlYGDg43iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcnJydCQkIXOjoLHBw0gIA+mZk9l5cuLi4+Pj4JFxcECgocHBxJSUn6+vplZWXGxsaVlZV+fn7b29saGho6OjqNjY2/v78BAQHNzc2FhYUUFBR6enpKSkr5+flUVFRPT08XFxdYabavAAABZUlEQVRIidWW11LDMBREldBLqAFCCQEEhBpK6C300Evovf//L4A9E2S8F42ulZecF69G6x0/eHZWiP8IhVGxCYdQcSkpLQPFprwCFZfKqmpQbGpqI6DY1NWj4tLQ2ASKTXO0BRSb1jZUXGLtHaDYdHahIoh3uyTo255eVAR90qWf+41/GBh0SVqFFCdDBcgYHuG+gVU4OhYz8nmAKkyMk3+KrjKxClMTk0Y+D1iFU9MmvrRHE1U4M0tk+H1z8wuLP4+lZeeAVZiUKSLE71tZXcusb2xubTsHrMIduUuE+H1ZIfb2Dw6zjiaq8EgeYwZZmemTU/dJVOGZPEe/tjKJKoznLox8v5BVeHll5stDVuH1jZkvD1mFt7k7I5+e+4dH9jtA5OnZPkS8vBYgpPgw2odv7x/ae7N9+Bn90txa7ENF8H2osNiHCot9qAi+DxUW+1BhsQ8VwfehwmIfKrRlZ0qAsvPzDT2ZH9GA3HmyAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.174;4.blob,1.1,2260.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABbCAMAAABeSXdNAAACwVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg53dzDU1FYyMhT9/WYbGwu8vEwSLCwsbW3p6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwv392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0sLBILGxt9fTLOzlPW1lZwcC35+WUsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS44OBeSkjtlZSliYiiUlDwpKRE8PBiJiTd0dC9TUyIUFAgaGguAgDRDQxt6bp5UAAADmElEQVRoge2aZVcVQRiA10YFu7sDA1RQ7ALFViwUFBMLULGwQcXuAlsRsbsV7G4wsbt+hcC6d5Z7353Z9+4uc89hnw/sc87OLO/hcOY8H0YQdCFHzlz6fMgYcufhPQGNvPmcLO7kRFnIhfwFCkrq7FKoMM9RIIoUlaxY8RLOPCeBKFmqNO8RaJQpy3sCGuXK856ARoWKlXiPQKNylf9CThQHOluqulTLeJITxZHOluo1amY8yYniUGdLrdq8JzAxMeFMnbquun6PNDxkaOrV1z6SHNLwkGFp0NDN4m5ulIUM3N3FJ2l4yLA0atxEUg/Pps3sHc6reYuWGUIaHjI0rVpL1qZtOw97v9K+Q0cv0UjDQ4bF26eTvVtBSMNDhqazr/aR5JCGhwxLl65a58kMaXjIsHTr3kPrQJkgDQ8Zmp69tI8kx9LwoGHp7dlHFL++/ayEQf8BAwGVGh4ysky2gYr/oMGiBPgEWgmDIUODAJUaHjKyTLaBzrDh4nPESMFKGIwaDams4W2MLJNvUEPwmLFWwmDc+AmAqtuhcgMhMCTUShgEhU0EVN0OlRtMTBwDUvOQcYfUPGS8ITUPGal0/U0NpOYhI5Wut02aHD5l6jTmeKTmISOVrq9NnxExc9bsOczpSM1DZhRz580XhMioBcyFpOYhM4iFi9J/Ri9mLiQ1D5kxLIlamv5Ytpy5ktQ8ZAaxQvzbrWSvJDUPGYAOJ8oq8f9uNXs6S81DBuS3HifKmvC1kevWR7CHIzUPGZDfupwtGzaGR2/arGI6S81DZn9+ZwEa8jsLMPPbJJsSE0sz3sTG0IwzW7ZuUzbjyl1lwwdsVzbDyl1maezYqTRc4K7dymZUucttT9ze+H1K0yXs96CY4Rw4eOjwkaOKr48dp5nhnDh56rTy2+AzZylmPOfOX7h4SfHt5cQkimUBV65ei78ep/Dyxk2ageh+oty6fQf+TXd97lHMsHK3OlGE+/B0Dx7SzLhylxmFR49pZpa7BsxyN8lW2LS565MQm0VPn4XZWBrJKShT+AoN2zZ/nvjCZtXLV69tTBBSknEGf4WCpc3tuDfzJvUt0rBIbW7PvZl377GGxNLmdtybSfL7gDQsWtrc+2MbpGHR0uafPmMNiZY29//yFWlYtLT5t++hSMPCaHMqP35iDYm8zdVel5H4lfobaVjkba72uoxEgi/WsMjbXO11GYk/f7GmAbXXZfig9rqMwfwD2g/LWc7+TUQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.193;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAh1BMVEUAAAARKipKuLhh8fFa4OA1hIQDBwcLHBxf6upLurogTk4rampg7e1Anp4+mZlZ3d0DCAgfTExn//8TLi4AAQFf6+szf39d5+c1goIKGRkgUFBHsLAaQEBFrKxOwsJLublHsbFc5eU2hYU9lpYdSEgVMzNe6ekqZ2dBoaERKSlKt7db4uI2hoYiXDzbAAAAYklEQVQImU2MSRKCQBTFgoyNItg0oDIpqAxy//Pxu8qFu7xKvQDOwfX8AAgjFR9PidA5zeCic0xRyjTVlZu+C6FqHN1Yars/+tn+gYnsg+cAYyrVl35L+aPiqZitWFb3uwXsB0MFYdnVL+sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,1008.iVBORw0KGgoAAAANSUhEUgAAABwAAAA0CAMAAACuLKj9AAABZVBMVEUMDAX19WNKSh4AAABHRx1/fzSkpEKoqERGRhz29mMODgYeHgyYmD4QEAcDAwHm5l1jYyhWViNxcS6LizjBwU4CAgGMjDk4OBctLRL+/mcfHw2SkjsHBwPQ0FR8fDJlZSliYihyci7Z2VgJCQSUlDwpKREYGAr8/GY3NxY8PBiJiTcBAQC3t0qVlTx0dC9TUyJZWSTs7F8GBgIUFAgaGgvy8mJQUCBLSx6cnD+qqkWAgDRDQxssLBJtbSwFBQJ+fjOZmT54eDEyMhRBQRqGhjYiIg4KCgRkZCmXlz1NTR8LCwUwMBODgzWRkTscHAt6ejF3dzAoKBBwcC0bGwvU1FaTkzz9/WYqKhEICAOQkDq8vEyKijg7OxgEBALp6V5eXib09GMLCwQTEwipqUSjo0J9fTMPDwb392RFRRxERByCgjVkZCjk5FwhIQ3Cwk5ubiw1NRaOjjkEBAF9fTLOzlPW1lZmZimHdObGAAABSklEQVQ4je3RWTfDQBQH8OptLRW1hm40tAjVhaKWqIitVIm21qL2vXY+v2TSJZMZfXOOB//H+Z25d+5ck6nGDNRYrGCC2jo6Wi0K1jfYaNbINClob26hYWsbKAjtHRRjO7sQOpwuEh1uD0Lo7iHRy4GGvX2E+fz9RRwY5I04NBwoIowEjRgKQwkjo2O4RZnxMvomJnGMaU9ECFPTOM7M6vCH/KMwp0d7HEXdFbD8vLigR05EkQDii0tBbhkrG3WhrACsJtbWDT0rZZMbqcgmjpWyEJC2RJmnl1WznXZXmzPzx/72t1HOYoeeHUGHWRm/wnkrKO1mcNzz75fx4NDQjM0dlfD4JG98SjhUwtjpmREzzHkRLy7JKa7MGl7f3JJ4d6/hwyNLoi1RQPiUIw3gOaJiwSnQ8OX1TcH3D5pBPJVU8DNNRch/Vd/KN+tWO2YCZOA1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.450,3.440;4.blob,1.1,1476.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABxVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQIGDg5OTsI4OIoECwtf7Oxh7+8GEBCMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiwDBwdX19dY29uQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg74kJkdAAACR0lEQVRYhe2W91MTURCAj0SIoIIFsXdTVMSo2CMWRI3GAhZQFFFRsGtssWGioKCCYuHvdbhLbp9vl5fczebeOHPfD/ARdjM7DJf5DIORigDnuzERqNB9QZ5g0NYZlVUaDxEIzayuKfis2TovEZhTWxfK69x587WeQrKgPlR8yGsWNui+ALNo8RLdJ2CWLluu+QL4ILBtxUpNtxSADwLbVlWu1nePCXwQ2LZmrcZ7pmPdet0X+Pj4eA4EL2U8hCMOFyB4KeMhEnY2D8FLWDTq/pBYzNYNGzc524Xgxda4uWmL25viW7dtL3jzDme7ELyE7dy1u9HtUXv27ovnNbG/xdkuBC9lPBw4GC8+JALBSxkPhw47m4fgpYyH1iNtzhYgeCnj4eix4+i1ZFKxAMFLGQ8nTqKXUqdOn7HsbHuHIRkEL2XCIOyqOXf+gqwXO7vQ2KXL3SnLrlztMSSD4KVMGIRdNc2dCVmv9aoWrt9ABsFLmTAIu2pu9iG9dVsx3z9wB1kR7MFSN1rv3iNUQc/9B8hKXSl1I/HwEaE+Pv85kLmUaQIylzIFkLTcJmQuZTKPn6SfPntuKiQtt4mZS5nEi5eZV6/fvDUdkpbbhMylTObd4HvDyOY+TPNrLiBzKZP5ODT1dfhTmY+CzKVM4nNuZOrb6Jfy3gSZSxniq/WX+lbeoyBzKUOMWf9T4+YPTI8/BjKXMsT39I/sxM+M6UyPP25pyFzKCH79Tg//mTSV6fHHLQ2ZS5kn4JaGzKXMC1y0dPlx0dL/8hcwkJIXBJ1TDQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.487;4.blob,1.1,1660.iVBORw0KGgoAAAANSUhEUgAAAXoAAAAZCAMAAAAIaRXiAAACVVBMVEUAAACtra3a2toEBARHR0f///9EREQOBgZOTsI4OIp0dC9TUyIGDg4pKSn39/e3t7dfX1/t7e24uLgLBATsX1/vYWEQBgaMOTn/Z2cIAwMNDSFnZ/4SEiwUFAiYmD4aGgsECwtf7Oxh7+8GEBA6OjrExMTr6+uXl5cODg4HAwPXV1fbWFiQOjr+Z2cEAgIyMn1TU85LSx58fDIDBwdX19dY29usRUXYV1dWVtYtLXCAgDRDQxsPBgbzYmJuLCxUIiIBAAAFBQxjY/UeHkpHRx1/fzR3MDDUVlZCQqRERKgcHEZjY/YGBg4eHgwQEAcyFBT9ZmYbCws0NIExMXkHBxIBAQNdXeYoKGNWViNxcS68TEw3NzfBwcHp6emTk5MMDAwtLW88PJQPDyQ4OItOTsECAgGMjDk4OBfpXl5eJiYnJyf29vZISEhiYmLu7u61tbUGBg8qKmlSUstmZv1HR7AZGT4SEi0NDR8tLRKSkjsHBwNLHh70Y2OqqqpBQUETEy5KSrdnZ/8dHUhUVNAyMnxlZSliYiipRESjQkL09PSEhISMjIwoKGRRUchlZfsLCxsuLnJYWNkJCQSUlDwpKRH3ZGRFHBwJCQlsbGzR0dGgoKA/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc8PBiJiTcBAQBkKCjkXFwCAQH19fWNjY0/P5xaWuA8PJXCTk6KODgQECcCAgQkJFlfX+wCAgYhDQ0sEhIEBAliYvIgIFABAQECAgJ9MjLOU1NFRaoxMTE+Pj4XFxfWVlZwLS0KCgoNDQ0FBQWS1R6LAAACQ0lEQVRogWNggANGJmYGBhZWNjCHnR0mTAkLC+DgxMca2oCLm0iFPDyofF4+fhYBQSEwW1hEVIyBYhaDuIQkGktKWgYqgo01tIGsnDxxChUUlZRRRVRU+dTUNcBMTS1tYQaKWQw6unpoLH0DmG3YWEMbGBoRqdDYxFSBlg4BATNzdJaFJUwEG2toAyvrgXYBAtjY2mGwRgFdgJ69AwZrFIyCUTAKRsEoGAU0Ao5OznhYQxa4uBKnzs2dtu7ACzw88bGGKnB1IU6duxtOKeqM3OBjeXn7MOBmDVHgK+dHlDr/gEBkblBwCJxNnZEbvKzQsHCoZdhYQxRERBKnTicKTEXH8MXGxTMwJHg7JSZBpagzcoOflZwCcwg21pAEqWnpRKnTy8gEUVnZQjm5eflAVkFhUXFJKS2dhgLKpMvxsIYkqKisIkpddQ04+dVCBufrwGL1DY1NtHMZGmhuwccaiqC1jTh17R1gqrMLRKp1AwnHnt4+z35auQsDTJiIjzUEwaTJU4hSZzN1GoiazjoDRM2cxVA2e87cefNp6DJ0sGDhIjysIQgWL1lKlLply1eA6ZWQVL+KYfWaCYimHbWblFhBw1p8rKEHiJ0WXLceQsMnYjdsREhSu0mJZYIQCDZt3oKHNeQAsdOCW3W3QRjIE7FwQO2GJJYJQiDYvmMnHhblYNduMNhFJ3XETgvu2QtjIU3E0g5gThCCwOp9+FgUg/0HwOAgndQROy146DBx6qgDBmaC8MhRMDhGb3WDCoxOEOIDALt8x2+8c7nMAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.252,3.516;4.blob,1.1,1052.iVBORw0KGgoAAAANSUhEUgAAAVAAAAAPCAMAAACFmWd9AAABg1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAGdLRzRAAABTElEQVRYhe2OV1MCMRRGA6yFtWDFLohdsPeKgGLvvffesPfy0wWWSCbuQ272wQ3jebj35Gbmmw+hIAYjiiVMUhxl8QmJkQurqaWQmOUk6pKckvrjRgNndX1ikiy0paXjT1ZTSyEwyxn0KTMLW7Y1B95ax+RKebTlFxQimKmlEBTJxVhtNmXbSyKCHKVa6uuPsvJfVlFZBTS1FILqGmxOV21dWOobGpVLU3MLf3lRaG2DGivtHZ1Oxbq6ld3T28dTUSzc/R6gwfH6BsJ70M8dIRBDw1CDMzIammPjE/wR4jA5BTU40zOhOTs3zx8hDguLS0CDs7yyGpxr69wBQrGxCTU4W9sI7Vh3+QNEYm//AGiMHMpHWI9dJ+j0TEtLgTi/uAQaI1e+ANbrm1t0d6+lpUg8PEKNjafnqL+88nX7J8rb+8dfV4gtAp9f5PMbHUVFdJHeavUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.535;4.blob,1.1,3700.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAxElEQVQ4je3S1Q7CQBCF4cV9cXcp3uLu8P7vRNKZAU4Ct1x1rv5vK2m2q9RrXG4F4/H6cMEfQAdDYVyIRNEx7QLHdQJvSKbQ6Qw6G0Hn8sBCsQQu6wq4WquDG01gqx3/ZKdmwOVuT/2YPtZgKLTLGI2ZdhXMqnyuXVZI9plqMpWnqWZzsV0LbTGplrrLplrpNZtqo+WnUG13ezbX4bXHVClTTHXcndhc54vsIpX7emNz3R/yhnd9Ged8OedLOefrY/5wvp4fwigsudBbUgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492328801;4.copy,1.1,2.10,2.19,3.950,2.57,2.14,1.1,1.0,2.19;4.copy,1.1,2.10,2.95,3.950,2.19,2.14,1.1,1.0,2.95;4.copy,1.1,3.860,3.114,3.100,2.19,2.14,1.1,3.850,3.114;4.copy,1.1,3.890,3.133,2.70,2.19,2.14,1.1,3.880,3.133;4.copy,1.1,3.600,3.209,3.360,2.19,2.14,1.1,3.580,3.209;4.copy,1.1,3.610,3.228,3.350,2.38,2.14,1.1,3.590,3.228;4.copy,1.1,3.590,3.247,2.20,2.19,2.14,1.1,3.570,3.247;4.rect,1.1,3.922,2.79,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.193,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.902,2.79;4.blob,1.1,428.iVBORw0KGgoAAAANSUhEUgAAADkAAAAOCAMAAACiuUSiAAAAeFBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs4GBgYICAgDAwPW1tZwcHDIyMj///9gYGAoKCg0NDQTExOyKlaXAAAAhElEQVQokYWK2Q6CQAADFxQVxVtQwfv8/z+UbNrURFLnadJOCC1JGoDMwy5NuMg86Hr9DIPMw24w5CLzoBvlYwwyD7tJMcUi87CbzbnIPOgWyxUGmYfdelNikXnYVVsuMg+63b7GIPOwaw5cZB0cT5HzV3e58pR1cLtHHv+6X56vyFvLB6BRCMee/yAWAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.780,3.174;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAh1BMVEUAAAARKipKuLhh8fFa4OA1hIQDBwcLHBxf6upLurogTk4rampg7e1Anp4+mZlZ3d0DCAgfTExn//8TLi4AAQFf6+szf39d5+c1goIKGRkgUFBHsLAaQEBFrKxOwsJLublHsbFc5eU2hYU9lpYdSEgVMzNe6ekqZ2dBoaERKSlKt7db4uI2hoYiXDzbAAAAYklEQVQImU2MSRKCQBTFgoyNItg0oDIpqAxy//Pxu8qFu7xKvQDOwfX8AAgjFR9PidA5zeCic0xRyjTVlZu+C6FqHN1Yars/+tn+gYnsg+cAYyrVl35L+aPiqZitWFb3uwXsB0MFYdnVL+sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.883,3.316;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.463,3.449;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.468;4.blob,1.1,1596.iVBORw0KGgoAAAANSUhEUgAAADkAAAA/CAMAAABtn5CqAAACT1BMVEUAAABubixZWSQGDg41NRaOjjkEBAEECwtf7Oxh7+8GEBAFBQKRkTswMBMDBwdX19dY29teXiZmZikGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5LHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0BAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUMDAX19WNKSh4sLCykpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTzs7F8GBgIJCQTy8mJQUCCcnD+qqkUICAh5NhVUAAACF0lEQVRIiWNgQAGMTFAGMzMDaYCFlQ1Ms3NwcpGmk5uHF0zz8Quwk2ipoBCJGkbBKBgFwxUIi4CBKDKLOCAmDgYSyCzigKQUGEgjs0YBxUBGFoeEnLwCMldRCV2BrAwuM5VVkHlKimjSqmrquHRqaGohONo6umjSevpgysDQyNjEFFVK1MwcwbGwRNNoZW0Domzt7B0cnZzRJF1c4Uw3d0E0SQ9PLxDl7ePLwODnH4AqGRgUDGOGhIah6QyPAFORUSAyOgZNNjYOxopPQJNKTEoGUSn+qSAqLR1NOiMTysjKzkGTys3LB9MFEDsL0aSLiksgjNKycjSpikoIXQXxZzWaNENNLYSuq0eTaAhqhDCajJr9Wlrt0TUytLULg6iOzi40ie4eGKu3zyi6fwKGzomTJoOoKVPRJaZNx1CLBmbMBJGzZhNSN+zAnLlz55Cnc978+QvI1Llw0WKM8gIbAJc1S5YuQ+hcDqZQywtsAFLWrFiJrhOlvMAGoGXNqtVr0HSilBfYALSsWbtuPZpO5PICG4CWNQwMGzai60QqL7ABaFnDwLCpczOaTqTyAhuAljVAsGUruk54eYENQMsaENi2HV0nvLzABmBlDRDs2LkLTSe8vMAGYGUNCOzeg64TWl5gA/CyBgSY9u5D0wkpL7C2TRBlDRDsP3AQTSekvMDaNkEtaw4dhupEzWXEt03Iz2VHFgFzGQATSoXD7wVqJQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.590;4.blob,1.1,624.iVBORw0KGgoAAAANSUhEUgAAABkAAABLCAMAAACycdytAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAwklEQVQ4je3TxQ4CURBE0cFtsIe7u7v7//8TMD0EkqIW7FjMWd2k0svWtAeb9vIug92BZXC63FAGj9cHJfwBHUoEQ1giHMEyRJUfSsRUHEokVBJKpFQaSmSyOShTvoAlil4sUcqWoUyVag1K6PUGlKnZwvpZW2dLp9tjU3/AlmEgzabRmC0T1SbLVM3Y0bzIlkWBLcsRW1ZrMng2W7Ls1J4svkONLMcTGc6X6ffhenCSk/iNDB+s37Z++xvrt5/+/LfvBtYc/55IpM8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.628;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492328897;4.copy,1.1,2.10,2.19,3.950,2.38,2.14,1.1,1.0,2.19;4.copy,1.1,2.10,2.76,3.950,2.38,2.14,1.1,1.0,2.76;4.copy,1.1,3.860,3.133,3.100,2.19,2.14,1.1,3.850,3.133;4.copy,1.1,3.610,3.209,3.350,2.19,2.14,1.1,3.590,3.209;4.copy,1.1,3.620,3.228,3.340,2.38,2.14,1.1,3.600,3.228;4.copy,1.1,3.600,3.247,2.20,2.19,2.14,1.1,3.580,3.247;4.rect,1.1,3.892,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.79,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.117,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.174,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.364,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.872,2.58;4.blob,1.1,1560.iVBORw0KGgoAAAANSUhEUgAAAFcAAABJCAMAAAB/ykq1AAAB0VBMVEUAAAAYGBgLCwtUVFTPz88PDw94eDE8PBhHRx1/fzSioqKvr693d3fU1NQVFRX19fVJSUkeHgyYmD4QEAecnJy9vb0yMjL9/f0bGxtWViNxcS5ISEj///8XFxeQkJC8vLwCAgGMjDk4OBcODg5WVlYEBATp6eleXl4tLRKSkjsHBwPo6Oh/f39LS0v09PRlZSliYijX19eVlZWpqamjo6MJCQSUlDwpKRHT09OdnZ339/dFRUWJiTcBAQDe3t6IiIhkZGTk5OQCAgJ0dC9TUyIDAwP5+flsbGzCwsKKiooUFAgaGgssLCwxMTEhISH+/v5LSx58fDJvb2/m5uZ9fX3Ozs6AgDRDQxvMzMzW1tZwcHBQUFDl5eUpKSlCQkIGBgYICAjIyMhgYGAoKCg0NDQTExMkJCR1dXXFxcVERETu7u7a2tpSUlIMDAyrq6uwsLAAAQHq6up2dnY8k5M4iYkaPz8jVlYGDg4SLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcnJycLHBw0gIA+mZk9l5cXOjouLi4+Pj4JFxcECgocHBz6+vplZWXGxsZ+fn7b29saGho6OjqNjY2/v78BAQHNzc2FhYUUFBR6enpKSkpPT0+vIv3gAAACfElEQVRYhe2XZ1MUQRCGTxABBUHMupgwKwbMEVEPE2IAs4IJIyrmnLOYs/5avd2d6fGmq/dtau8TPh9ueuveeauuauue6kxGZECR/H1fKR5Y0ue7g0ppLivP+3LwEOehohJrjHJub3lZXmRoVTU9VFZgvVHO6R1WMzw/M2KkHUeNHgPVxjmnd+w4LzQ+qDXjhIlQrclR76TJU7xQXTA1nqZNnwHVmhz1zpw124/NmRsP9fOwl87kqHf+Aia2sCEeFi2Gam3O9i5ZuoyJLV8RnSUrV0G1Nmd7S1evYXJrG6NzXdN6qNfmbO+GjUws27wpGjZvgWopZ3q31mxjYi3B9vBs3dEC1VLO9O7cxeV2t0U/q30PVOvkTO/efVxuf3t0HjiI9VLO/X/wOHS4DuvzkXqPtGEvl5aO+oLU/sdxjs4+SZBzdPZJgJyjtE8C5BylfWTIOVr7yJBztPaRIedo7SNCzlHbR4Sco7aPCDlHbR8JconePhLkEtE+nUdDskk5C7lEtM+xIOR4Uk7LiZMhXSlW9kdOFab29JkUSnyXnD3XCuVkPJdkz7NvJuqmGN8l3VUXoJyM75KLl7CcR48zMy65fIW5gzjn6rXrfz9v3MzNvku6gm7mDuKcW7fv3L13/8HD3Oy75FHQwdzB3PT4ydNnz3MD45IXwUv/Auqmnlevw5NxyZug2ovDbjIwLunsfQvlJFiXvGvAcgKsS95/wHICrEs+9n6Ccmo+f/maRo1H0bfvBenN/PhZmN5+BGSVX83F2l7MKr+bapNDLlqroKAbjxJ049GCbjxa0I1HCWoVLVqroCitgqK1CorWKgnYHSnVTeafHSlVzI70By0XbJN7AtB3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.174;4.blob,1.1,2260.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.880,3.291;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,660.iVBORw0KGgoAAAANSUhEUgAAABIAAAAzCAMAAACt4Kj2AAAA51BMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxssLBJtbSwDAwEFBQI3NxZ+fjOZmT54eDEyMhRBQRqGhjaVlTwiIg4fHw0KCgRkZCmXlz1NTR8LCwUwMBODgzWRkTtZWSQcHAt6ejF3dzAoKBBwcC0bGwuTkzwqKhEICAOKijg7OxgTEwh9fTNKSh5ERByCgjUODgYhIQ1ubiw1NRaOjjkEBAFeXiZmZinRQKuYAAAAw0lEQVQokdXQVxPBQBDA8RVBEE5L9BCiE733Xr//5yH3EnYfzZjxf/zd7szdAXzmEAAnOLA4RRcmtweL5PVh8ssBTEGGJRSOYIrGFExqHEtCTGJKpbFAJkvoz9JyAHmdx39FKhSNEgAzeGUAvVKtsfrrJNHgNQFaZrvDl+3Fbq8/GFpkL4JSHhnjwvui1WQq01vMfvLWLwvMNWIsSGgRXmKSVmsyFlcJzcQNse2O0P5A6GieiJ0HhC7XGya93yVj9wc8AY4IE8yqVSdjAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.440,3.430;4.blob,1.1,1484.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA/CAMAAAAxORHLAAABxVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4L3IHkAAACT0lEQVRoge2WZ1NTQRSGA4JKAsYuVbGCIiRUA6KgxBobiAIBadK7oUixBAUVUVDa73Vyk9yz7J5scu9ssuPMPh+SJ3PPmXnnTnbntVgikJQU6Yk8kg+kpMrOwHDw0OFk2RkUCoVCOGlW2QkQrGmyE4Sw2XRNzzgiMQiB/eix42E/cVJmEoJTp8/YQ5qZlS01CkpOrj36UKLJOys7Acu5/POyI7BcuHhJcgK4CHS7fEVSljBwEehWkFEoMVAAuAh0u3pNYp5IFF2XnUChUCQcKLyYiaG4xOACFF7MxFBSbGweCi9iDof5IE6nrqVl5cZ2ofCyVlFZdcNsJld1zc2w194ytguFF7HbdfUVZkPdudvgCqn73n1ju1B4MRPDg4eu6EMkUHgxE8Ojx8bmofBiJgbPk6fGFqDwYiaGZ89fGFuAwouZGBqbOA9fNr+iDQovZsQg7PJ53dJKa5u3nbPQ8aaTNii8mBGDsMun1uumtaubt9DTyxgUXsyIQdjl87aP0f4Bzvzg0DBjUdAHY93wjIwiyqFzbJyxWFdi3XBPTCKqUPznQM3FTBJQczHjAJVWtBE1FzOaqXe+6ZlZTaHSijay5mJGMfd+fmFx6YPmUGlFG1FzMaP5+OmzxeJf/hLhsSig5mJG83Ul8Ln6Lc6hoOZiRvF9+Ufga+1nfDNBzcWMYT34pn7FNxTUXMwYfgf/UxvaD0HHnwVqLmYMm74//r9b85oLOv5sl4aaixnC9o5vdXdPU0HHn+3SUHMxSwhsl4aai1kiMNGl44+JLr2ff4+snXb3bcx5AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.449;4.blob,1.1,668.iVBORw0KGgoAAAANSUhEUgAAABwAAAArCAMAAABcrBizAAAA5FBMVEUAAAAxMTEYGBgGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sBAQCGhjZLSx4HBwOTkzwsLBIpKRGZmT6FhTZiYihlZSlkZCltbSyXlz0oKBAqKhGUlDwICAMKCgSVlTwrKxFraytjYygCAgGKijg7OxhBQRqIiDcvLxNTUyJ0dC98fDJQUCGLizhAQBobGwuYmD4TEwhKSh4SEgc0NBV9fTNERByCgjUODgYhIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZikGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAhszZZIAAAAyklEQVQ4jdWSxxKCMBgGo9hR7Ioi9t6x9959//dx/FUMJOTghXEv2cxODpn5EELIYkUEHPcWSrTZHU7D6HJ7bIbxy+/RBHivD07BHyBjMBTmQSJRMsbiYgIkKaX0TU5nsjmwfKGoj6UyX5Fk0GpNH+sNlG+2QNudrrYJSg+hSv91GSj0DwHDESOOxQmjTmeMOF8sjeNqvWE83e4Y8Q+hDkaFNhgVymC+UAaDQQ4GgxiMBvMGsz8AR9yewGBOZ+CCG/AczPUG3HH78AABSxykt+45IQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.497;4.blob,1.1,1816.iVBORw0KGgoAAAANSUhEUgAAAY0AAAAPCAMAAAAvdmOEAAAC01BMVEUAAAAFBQxjY/UeHkpHRx1/fzR3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4eHgyYmD4QEAcyFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxILBATsX1/vYWEQBgYBAQNdXeYoKGNWViNxcS6QOjq8TEw3NzfBwcH39/fp6emTk5MMDAwDAQHmXV1jKCiQkDq8vEwtLW88PJQPDyQHAwPXV1fbWFg4OItOTsECAgGMjDk4OBcEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR8tLRKSkjsHBwNLHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnxlZSliYiipRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNkJCQSUlDwpKREPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjc8PBiJiTcBAQBkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5Fw/P5xaWuA8PJV0dC9TUyLCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTn/Z2cIAwMkJFlfX+wCAgYUFAgaGgshDQ0sEhIpKSm3t7dfX1/t7e1ZJCQGAgIhIQ3+/mcsLBIEBAliYvIgIFABAQECAgJ8fDJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlOsRUXYV1dFRaoxMTE+Pj4XFxeAgDRDQxvWVlZwLS2cPz+qRUXW1lZwcC3zYmJuLCwKCgoNDQ0FBQVUIiIBAAB3ZHGWAAACOElEQVRYhWNgoCtgZGLGwxoGgIUVU4yNHYdiDk4uZC43Dw0chBfw8uFjDX3AyoIpxs6GSzW/ADKPhxtVVlCQ1iwhYREG3KwhD0TFxDHEJCSlcCmXlhFEcGTl5BkUFJXgfGUVVTUas9Q1NKGWYWMNeaCljSmmowum9PQNDI2MUaVMTM0QHHMLBgZLYSYrayjfxtZOmdYseweY7dhYQxw4OjljiLm4uoEodw9PL28fXzRJP384MyAwCEgGh4SGhUfQ0o0oIDIqGg9riIOY2DgMsfgEcDpMTEpmYEhJTUOVTM/IhDGzsnMgjNy8/AIauhEVFBbhYw1tUFyCKVZaBqbKK0BkZRWabHUNjFVbB6YY6xsa+Zpo5D5M0NyCjzWkQWtbO4ZYR2cXiOpO7QFRvX1o0v0ToIyJkyYDycgpU6dNn0FLN6KBmbNm42ENaTBn7jwMsfkLFoLpRZC8sRhNesnSZRDG8hWOQHLlqmZE+5La7VqsIG81PtZQBmvWYoqtWw+hN0DqjY3o8ps2Q+gtW0Hktu0IGWq3axl27NyFwWLYvWcvHtYQBvvE9mOIHcg4CGEcMjiccuSoJ4aCYyrHQdSJk6fQZajdmmXQyXDBYDGcPnMWD4ua4Nx5MDhHJ3VZFzDFLl6CsS5fMai8eg1DwfUbN0HUrduELKcc3LmLyQIWjvfwsagI7j8Ag4d0UvfoMabYk6eEDH32HES+eElIHcWg49VrDBY9wZu3YPCO3uoGJ3B5/wGDNQrwAACclPDyRQrhZAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.242,3.516;4.blob,1.1,2196.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.535;4.blob,1.1,2484.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAIAAAD6uaXuAAAABmJLR0QA/wD/AP+gvaeTAAAG+0lEQVRoge2aX0xTVxzHT2//UNpS2lIILawI/UMBi412g5BhJJhhKsFpgkQnuMHQxCcTs5DszciTIdmDmca9bOkU4x+EuUUxSFBGwkw2s6CEeKGlJC20lIIK7cXS9u6hpqn3Xm7vv+Gy8EkfmvPrOef7zT09/34XADpYu6xHXxylVWUzhDJhR6hDZ9exbyqpCqJVzdRqgn+G2XcPANhY25jtnzW1mdg3lVRFw4x6t1pRppi+Ns2++wSwAy5qKhLJRWwaSVVFw4ypzTQ/Mh/yhtj0nYp32Bt5FSlpLmHTSKoqqmYgAWQ4ZoAd3IyxBGgMnb4+zWakYVRRNVPYUCiUCl19rtRCHsTji/mpH0gIUYwmgB2wplaTVZTFzAxGlYBiNVObabZ/NhqKphbq7LoDvx5ILXH/4n74+UMq0QTLz5eDE0Fjq/FZ9zNaNghVUTIjyhbtaNox2DSIKV/4feHux3dTS96uvKUYTQI74PLT5QzMbKYqDeavzSc8J3gQj25/VJDkS05FT+VV5dGtiFdF6T9jajPN9M6gcZRuf1QI+8KeIQ+DaQCvKr2ZrOIszacabucxDLAD1rfoIRGNdYJQVfr6xhPGpb+Xll8s09ZIGfeAmy/i09raEKpKb4bz5QVPFIk6bzmNx43Uq2yBqm22+f/DZ1lfJJIDAFA0xoUYttA7nOGRyw27dn0jEGRyooYlbJ9MOLwgl+vz8myBwJ+cCGID2ycDAHC57iiV5SrVTvZNsYTtkwEAxOMRsThXpdrp9//BvjU2YJ+MXae7b7enllRVVT158gRBEL/ff+nSJZlMhm9laekvhcKcmAy2Hp1dZ79vB8nzjACCWvT6LqvVolI9XVxM/q60tHRkZGR0dPTw4cNarbanp6ekpOTgwYOY5l6/dgIAsrNNXP1zICHE42NPHPFI/L09sgDSt+itXVaVRbX4dBEAIMgUCDrM5nOVlRqJ5LbLdXp0dNzvT1a4cOGCx+NpbGyMRqMAAK/XOzg4WFdXNzIyktpNLLYeibyRSPI5cQIA2PfjPuMX2K3aUPOQ644rIdrcYa48VynRSFy3XaOnR/3jfgAAuFFfv9HZed5myxGL8Y2ura11d3enlgQCgZ6eHvwvbbbzBsMxrsxkFWfl2nIxnwxlRiJaf6O+c6PTdt4mznlPs+Cm07knN/esxaIWi69OTU0Eg8lYZmamVCr1+XypFebn59VqNb57FI1DkJArMyFPKLwQxhTGI/HEF+dNZ+6eXMtZi1gtnro6FZx4p1kw4Hbfm5s7UlzcZbWeqagY9/svT05em54GACAIEg6H8/PfGzxarfbRo0f47vl80cbGGldmyIeZe8A9d2+u+EixtctacabCP+6fvDyJvZ2sLygYamxcbW9PlvT19cEwLBC8mycaGhpQFN2/fz+mGx4Pqq39Xqut48oM+TBLpaC+oHGosX21HR8CAACLSpX8XlZWhiDIgwcPGhoaTp48GQwGBwcJbkOkUu3evVdlso848kIblUWV/kcAgJqamrGxMQRBAoHAlStX5HKCxaSgoL66+iIA/8r1zVaze/e3Oh128dl6ONib5eRYRaJsr3eYfVMfGIlEU119Uaks+9BCuEChMKtUlg+tYptt/jNwmBMmh1YeezNVaaZmDnPC5NDKY2+mKv06w0lOmBwGeWxCVenNcJITJodBHptQVXoz7HPC5DDLYxOqorSdYZkTJocwj81MFSUzyZww3f6oQJjHZqaK6kYTdsCmVu5HWiJjzDhthFFF1cxM74xcL2eQEyanpLlkPbjuHfYyq45RRdUM45wwOSzz2BhVNM4zDHLC5HCSx05VRUMZPicMiSDM2zF8MT95E0keBRzlsVNVUX13BqTkhN0D7kTJodFD+H/R468ev/zpZdooAMBwzDD1wxQjC8SqWF1BKMwKoQx78bc6u7oeXE8b3WabbViRmUeW4iWPJuFs0WBD4WeFpV+WMotyhkwmDIU67OwO1coyZc13NWI1QXYobRQDqyeztrbR3z/bxmKPw4N4huOGud/m1pcI5mvyKB62w8zhgJuaiuRMD9U5u3IyFBm+MR+DKB62ZoaHva9eRZqZHqrzPslbmVqJvSV+W4U8ioetmVgMvX59mvFIyzZmv3G+YRbFw8Fs5nDAtbWaIvqHaqFUKMwSIosIgyghHJh5/nx5YiLYSv9QLZAJAABRhPjATB4lhJt1xuGAW+kfqhNv06Mx4pMZeZS4Cl0FhPT2zuj18iqah+rEJQY/g/j9HfIoIdyY8fnCQ0MeutNAZDWCxlDCHHLaKCGcbWccDrilRS+ic6hGo+jq3Kq0UMogSghnZgYG3CIRn+7WZmVyRVmuZBbFw5kZBIneuuU8TudFawDAwtiCOEcs1xO/20UexfMPQeMlaCXogtgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492329008;4.copy,1.1,2.10,2.19,3.950,2.19,2.14,1.1,1.0,2.19;4.copy,1.1,2.10,2.57,3.950,2.38,2.14,1.1,1.0,2.57;4.copy,1.1,3.610,3.209,3.350,2.19,2.14,1.1,3.590,3.209;4.copy,1.1,3.620,3.228,3.340,2.38,2.14,1.1,3.600,3.228;4.copy,1.1,3.600,3.247,2.20,2.19,2.14,1.1,3.580,3.247;4.rect,1.1,3.891,2.52,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,2.41,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.364,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.430,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.861,2.41;4.blob,1.1,2264.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.880,3.272;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,608.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAzCAMAAACdbLnXAAAA3lBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxssLBJtbSw3NxZ+fjOZmT54eDEFBQJBQRqGhjaVlTwiIg5kZCmXlz1NTR8LCwUwMBODgzWRkTtZWSQcHAsyMhR6ejF3dzAoKBBwcC0bGwuTkzwqKhEICAOKijg7OxgTEwh9fTNKSh5ERByCgjUODgYhIQ1ubiw1NRaOjjkEBAFeXiZmZilqmU+zAAAApUlEQVQYlbXOZxqCMAwG4ICoqAxRASci4kIR3Hvv+19IbcINNH++t+mTNgDf4njA4jnMmBBHJJKYYiqNyEgyQlExs1oOkS/oCMPELAolRLlCz1dr8Mey6mxTu+E0AdxWu6N2P+ee1x+wa38YhCMmfTxxpjYOzeZSNL/43Sry0iKpCmGlrRHiZkst04h+Fnak/YFwPBHO3oV0DQm3+wPhBj61ni94Awf7DLKMNFS/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.463,3.411;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.425;4.blob,1.1,1008.iVBORw0KGgoAAAANSUhEUgAAACcAAABDCAMAAAAoGOxLAAABZVBMVEUAAAA3NzcgICABAAACAQGUPDz1Y2PlXFxpKiqQOjoYCgpaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARmKSlgJycvExPWVlb/Z2f7ZWUnEBAQBgYGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sxMTEYGBhHRx1/fzQBAQCGhjZLSx4HBwOTkzwsLBIpKRGZmT6FhTZiYihlZSkeHgyYmD4QEAdkZCltbSyXlz0oKBAqKhGUlDwICANWViNxcS4KCgSVlTwrKxFraytjYygCAgGKijg7OxiMjDk4OBdBQRqIiDcvLxNTUyJ0dC8tLRKSkjt8fDJQUCGLizhAQBobGwsTEwhKSh4SEgc0NBV9fTMJCQRERByCgjU8PBiJiTcODgYhIQ1ubixZWSQUFAgaGgs1NRaOjjkEBAEFBQKRkTswMBOAgDRDQxteXiZmZikGAgIIAwMDAQHIUVEoEBA0FRUTCAg64a+uAAABSklEQVRIie2TR1fCQBSFx967RlHBLkSiKBgVjYolVkCxYe+999+v580mydwEFi5c5Nvce975cjKby5iRnFyeecwZ7uUXFBYV/2ZJqbNXVl5RWVVdU1tX7+w1SIw1NnmapQz/5U9sac30PjNeb1aer629Ixuvs6vbZ/8AFxM9va7nen/v/Vf8AQq5L0ip9A9gL+CnCA0OyVTCEagNqyOUo2PRcSoT2iTypqYpYjOzc/PU9IVFoOlLy5Qrq3Jci1FNJIG3tq5QpjaYvrlFdVvdEb1ImEJJ7zIW3+O3/bSgHWgh8dvDI+F0fCKL3mn0zHpKJsCb2fmF5XCpXiHv+ubWfAimkMbu7h/Mh8cn6LHnF3x3YQ4LsGKzAAGbBQjgBQDgAgBwAQiwAAhYAAQsACMswAa+gNc34t3YzPAFfHgIydgs0AI+v4hvYwP8AIKmPSXAssatAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.430,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.497;4.blob,1.1,3428.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.571;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAflBMVEUAAAAxMTEYGBgGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRLXGisiAAAAYklEQVQokWNgQAGMTLQiEYCZBUSysrGDKA5OEMnFzQOiePlAJL8AM5AUFBACcYRFQKSoGIgU5wWREpJAQkpaBkjKCsgBSXkFRSCppAwkVFQFGRjUFNSBTA1NBhxg1I8U+hEAVGMH/mCncOMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492329107;4.copy,1.1,2.10,2.19,3.950,2.19,2.14,1.1,1.0,2.19;4.copy,1.1,3.860,3.133,3.100,2.19,2.14,1.1,3.850,3.133;4.copy,1.1,3.620,3.209,3.340,2.19,2.14,1.1,3.600,3.209;4.copy,1.1,3.630,3.228,3.330,2.19,2.14,1.1,3.610,3.228;4.rect,1.1,3.881,2.52,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,2.41,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,2.60,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.79,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,2.79,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.117,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.386,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.852,2.41;4.blob,1.1,2216.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.174;4.blob,1.1,2260.iVBORw0KGgoAAAANSUhEUgAAAJ0AAABbCAMAAABeSXdNAAACwVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg53dzDU1FYyMhT9/WYbGwu8vEwSLCwsbW3p6V5eXiYBAgIWNzczfn4+mZkxeHhLSx709GMCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwv392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ0sLBILGxt9fTLOzlPW1lZwcC35+WUsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAdWViNxcS44OBeSkjtlZSliYiiUlDwpKRE8PBiJiTd0dC9TUyIUFAgaGguAgDRDQxt6bp5UAAADmElEQVRoge2aZVcVQRiA10YFu7sDA1RQ7ALFViwUFBMLULGwQcXuAlsRsbsV7G4wsbt+hcC6d5Z7353Z9+4uc89hnw/sc87OLO/hcOY8H0YQdCFHzlz6fMgYcufhPQGNvPmcLO7kRFnIhfwFCkrq7FKoMM9RIIoUlaxY8RLOPCeBKFmqNO8RaJQpy3sCGuXK856ARoWKlXiPQKNylf9CThQHOluqulTLeJITxZHOluo1amY8yYniUGdLrdq8JzAxMeFMnbquun6PNDxkaOrV1z6SHNLwkGFp0NDN4m5ulIUM3N3FJ2l4yLA0atxEUg/Pps3sHc6reYuWGUIaHjI0rVpL1qZtOw97v9K+Q0cv0UjDQ4bF26eTvVtBSMNDhqazr/aR5JCGhwxLl65a58kMaXjIsHTr3kPrQJkgDQ8Zmp69tI8kx9LwoGHp7dlHFL++/ayEQf8BAwGVGh4ysky2gYr/oMGiBPgEWgmDIUODAJUaHjKyTLaBzrDh4nPESMFKGIwaDams4W2MLJNvUEPwmLFWwmDc+AmAqtuhcgMhMCTUShgEhU0EVN0OlRtMTBwDUvOQcYfUPGS8ITUPGal0/U0NpOYhI5Wut02aHD5l6jTmeKTmISOVrq9NnxExc9bsOczpSM1DZhRz580XhMioBcyFpOYhM4iFi9J/Ri9mLiQ1D5kxLIlamv5Ytpy5ktQ8ZAaxQvzbrWSvJDUPGYAOJ8oq8f9uNXs6S81DBuS3HifKmvC1kevWR7CHIzUPGZDfupwtGzaGR2/arGI6S81DZn9+ZwEa8jsLMPPbJJsSE0sz3sTG0IwzW7ZuUzbjyl1lwwdsVzbDyl1maezYqTRc4K7dymZUucttT9ze+H1K0yXs96CY4Rw4eOjwkaOKr48dp5nhnDh56rTy2+AzZylmPOfOX7h4SfHt5cQkimUBV65ei78ep/Dyxk2ageh+oty6fQf+TXd97lHMsHK3OlGE+/B0Dx7SzLhylxmFR49pZpa7BsxyN8lW2LS565MQm0VPn4XZWBrJKShT+AoN2zZ/nvjCZtXLV69tTBBSknEGf4WCpc3tuDfzJvUt0rBIbW7PvZl377GGxNLmdtybSfL7gDQsWtrc+2MbpGHR0uafPmMNiZY29//yFWlYtLT5t++hSMPCaHMqP35iDYm8zdVel5H4lfobaVjkba72uoxEgi/WsMjbXO11GYk/f7GmAbXXZfig9rqMwfwD2g/LWc7+TUQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.713,3.250;4.blob,1.1,672.iVBORw0KGgoAAAANSUhEUgAAALAAAAANCAMAAAA+PRTHAAAA51BMVEUsLBKVlT0yMhQAAAAHBwOTkzwvLxOJiTcODgZiYihlZSkqKhGUlDwICAMCAgGKijg7OxgWNzdOwcFk9/de6ek7k5MFDAxTUyJ0dC8QJydj9vZKuLgdSEgoYmJg7u5JtbUbGwuYmD4TEwhFqqpY2toCBAQdR0dn//8aQUF9fTNKSh5j9PQ1hIRf6+s5jIxERByCgjUECQksbGxU0dFBoKCXlz0hIQ1j9fU5jY1ubixZWSRGra0bREQ1NRaOjjkEBAERKSlKt7cmX19g7e0FBQKRkTswMBMXOjpPxMQ9l5cGDg5eXiZmZilid4mGAAAAzElEQVRIicXURw7CMBBAUcPQO4Tea0Lvvfd+//OgKEQgGGSvhr+wR/bmyYrCmMEIWvpkMjOAjzN8+kcMLFbbc9Ynu+N1/337Pv0hhpw5XW5yh3AY2OP1kTv4+QNSMBRGwRCJUmv4xeKJZCqdwcHZXJ7aw61QLAHIShkFQ6VKzOFXq6tro4mDW21SjEAdpatuvT4Otg2GpByBRtoLj3EwTKaUGJFm2jc8/wFeLFe0Hm5raSNvdwn8LwGwPxxpPfxOZ6lxuf4Cw+1OqhHvAU27JviIE2LYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.463,3.392;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.411;4.blob,1.1,2656.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.516;4.blob,1.1,4052.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAxklEQVQ4je3SxxKCQAyAYVSUaltREQULFqwo9oL1/d9Jh2RHM6NXT+T0f7uwpwjCaxICn6iSKc6oxHQGGZUkK0goVdPRUNkc/xsqX+COqshUJFSJGWioMqugoarMREPVrDoaq2Hz96EcmRuqabXQWO2OiwdQereHxuoP+Avv+jKeTj0cjenBZEo900x64M+pF8wjDtiSfrByqNc29can3u4Ipf2B+MhOxEroEp8vhNdb8Ml7KJJr4yH8mHi/YOL9ivfrz/v1BBGbI/NE4T5MAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492329215;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.830,3.114,3.130,2.38,2.14,1.1,3.820,3.114;4.copy,1.1,3.810,3.133,2.20,2.19,2.14,1.1,3.800,3.133;4.copy,1.1,3.610,3.209,3.350,2.19,2.14,1.1,3.600,3.209;4.copy,1.1,1.0,3.304,3.380,3.114,2.14,1.1,1.0,3.285;4.copy,1.1,3.430,3.304,3.530,3.114,2.14,1.1,3.430,3.285;4.copy,1.1,3.380,3.323,2.30,2.95,2.14,1.1,3.380,3.304;4.copy,1.1,3.420,3.323,2.10,2.95,2.14,1.1,3.420,3.304;4.copy,1.1,3.410,3.342,2.10,2.76,2.14,1.1,3.410,3.323;4.rect,1.1,3.952,2.51,1.4,2.43;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.850,2.96;4.blob,1.1,1052.iVBORw0KGgoAAAANSUhEUgAAAG4AAAASCAMAAACNZRtzAAABfVBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcEBATp6eleXl7q6up2dnYODg5WVlYAAQFLS0v09PQTExPo6Oh/f38kWVk8k5M4iYkaPz8jVlYGDg6pqamjo6MnJydCQkLX19eVlZUWNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwf39/dFRUUuLi4+Pj7T09OdnZ0ZPT0XOjoLHBw0gIA+mZk9l5dkZGTk5OQCAgIcHBze3t6IiIgJFxcECgrCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpHGqsVAAABU0lEQVQ4jaWUZ1PCQBBAT7EAikbFgt2zIoi9IYq9i70LFhQb9l5/u8k5zjC7C3cj70NyeXk7N5NJwlhcUuLfUiTVpN6mpSe9XUammb5hsUKTlW1T6hKSk0t7qwUILS9fqUtMgb2Q0kXFJcA47KVKnYSycspWVEJTVa3WSajhtVjW1TdA1dhEDBOdBCdvFmdXrHS3wDfWwx3EMO6ktLYZm7V3dHbp5+4e4Xr7YNXPvcQs7qQM+PTD4JB/eGR0bHxi0lDmqWlYzfBZPEp0Uubm9cNCgLHFpeWVgFCra+uw2uDEG0x0Uja3/lau7Z3fxe4eqoKhfTxKdDK0g0OobEdh3B37kCI7CWF+AlXklOjOzpEiO0zwQqCJi8soev5X1O/qOnSj1GFuueBOXNxHlGYYe3h8UiwBzy8Cj7F+fXMqTpneP/63XQyfUfUv5+s76e28bmh+ACfcMFMj377NAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.229;4.blob,1.1,1296.iVBORw0KGgoAAAANSUhEUgAAALwAAAAiCAMAAADS+0OqAAAB2lBMVEUAAAAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2ksLBKVlT0yMhQTExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnEjIyP39/crEiuZPpkSEiwsLG0WNzdOwcFk9/de6ek7k5MFDAwIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXgQJydj9vZKuLgdSEgoYmJg7u5JtbWLOItMH0woKGIUFDIaGkE2NoY8PJUODiJFqqpY2toCBAQdR0dn//8aQUGBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQtj9PQ1hIRf6+s5jIx/M38TEzA1NYM7O5EkJFkLCxwECQksbGxU0dFBoKCFNoVSIVIxMXowMHdj9fU5jY0CAQKVPZVBGkEQECgtLXA7O5JGra0bREQaCxodDB0LCxsRKSlKt7cmX19g7e1DG0OKOIoBAAEXOjpPxMQ9l5cGDg56MnpLHkswEzCJOIkZChkpESkoECgtEi0HBwOTkzxiYihlZSkqKhGUlDwICAMCAgGKijg7OxhTUyJ0dC8bGwuYmD4TEwh9fTNKSh5ERByCgjWXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZinTF66BAAABrUlEQVRYhe2XZXPCQBCGrwZtqbtQoW7UjTrUlbq7u7u7u+t/7WBNyXQIlwssneH5kOy8N7d5JrNfFiEKC0v0f7GytoFWwIbHt1VXdvb63RA4OBrMBhMe30ldObu46nfFzd3DYDp4ePK9NKW3D6QIG3z9fkp/oQVBo4BAchn9CAoWhYSG0cJwYQROj8goJdGKOiY2ThzPmZ1uEhKTklNS0+hxegZOk0yxEglCUVnZOZm53OnpJi+/ACGprJAWFxXjNCkpVVKGUHlFZRV3ckxU1yie8lpaXOeN04Qam/qGxqZmzuQYaJG1Kl5t7bS8oxOnCzU2KFrSJe6O5UqPgR7Vn+/VTvv6B3CaUGOjYHBomBM1ZkZUMz+qnY4Jx0maTpBcxmBSNCWdnkmipbNz80b6PhkLiyL50jItXFkFceGEtfVwaAXWbMxtQiuwZ2sb2sCMGaNALXWaamdXoOPUpNbAX0udptrb13VqSmvgHxwcHkErsOf45BRagYCzc2gDAi4ur6AVCLi+gTYg4PYO2oAAj/sHaAUCHp+gDQh4fnmFVmDP2/sHtAIBn1/QBox8AyOMP4zJysfzAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.420,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.489;4.blob,1.1,3168.iVBORw0KGgoAAAANSUhEUgAAAYMAAAAqCAIAAADeYqDXAAAABmJLR0QA/wD/AP+gvaeTAAAI/UlEQVR4nO2dX0wbyR3Hx2t7+eM/IMtCIRAgGDuAggSECoGSoCjNUYHElbvDxAEbRa6w+tSHPpyi06nqO5XQpVIkysPJKdxhNQdvEHGI5JTqqvR0igLCYjF/rgUKwiYEsNcBr7cPQMD27vrfLmvI7yM/zXdnvmOhmWV2dr5GKBr19fUvXrwgSXJjY+PRo0dqtTrsgjSp1NnePnf3rkImi6x+FlWEUG99fdBmk2FYXGp19ZeffvozY5UkVQA4ZXAMS5dKwz5SiSQWNQESr3m++cedO1c1mtKhobhUo3HG6eybmuplrJWMCgCnzL9aW2tzcsIK7z979vXsbFQ1AWAmYiALx5c7O794+fKr6el4VQA4H5RmZyvl8rDCxZ0dj98fVQX4QYZhnxUXs03S3CoAAAAAAAAAAAAAAAAAAAAAiI1crrRavQUFTbyrAHAKfF5ZOW008tKUUi73Wq1NBQUx+X5eOT1tZH5zD0iA/f3dxcVhg8HCuwoAp4DZYHhMELw0tbu/P7y4aDEYYvI1Gx4/jtlXjeNqHAeVW83P/8hq9eF4+GvoyasAICjVWi3V3Z2nUPDV4Ef5+T6rlWMQHfpWaymqOy9PgdXU/Lmq6kFamobjaoVMtmAy/dLRkc3ULqjvWVmZ2NvbKi5ui6yVpAoAgmIxGCZXV1e83pOFtbW1z58/J0lyfX394cOHSqUy9gYnVla29vbaiouj+FoMk5OrKyte7N27zerqLzs7/3v9+l+zskoYrw7Q9Ibf7ybJ/WAQVA6Vpqm5uQG2RVYyKgAIhwzDTCUl9tCl2ZUrVyYnJ0mSbG1tffDgQUdHxxDL4SdGKJoemJvjXqDJZJjJVGK3H/nieFZ5+e8/+eTf3d1UY+NIbu7N+L8LcIhGU2GzBVWqQt5VABCI5oKCXas17DS4w+EgCEJ2VNjY2EjT9K1bt2JvtkKjCdpshSoVq29zwe6uVaGQIYQwhNDe3tuZmUfffferJ0+qpNK0lpbnly79JpEvBCC0uTnl8bzW6828qwAgEBaDYXhx0RsInCxsampyOByBo8KnT5+63e7m5ubYm53a3Hzt8Zj1elZfi2F4eNHrDaCDmQghJJcrS0t/d/NmX17er+fnhzY3p+L+NsARBGE3GFhnk2RUAOCdLBxvKSoKW5plZGQoFIq1tbWThaurq1qtNq7G7QRhZlmgZWXhLS1F75dmmEZT0dDwN7P5f3V1f1lb++c33+i+//6u17sSlx9wEpdrUK3W5eTU8q4CAO+0FRd7/P6JlZAhT5Kkz+e7cOHCycKLFy96PJ64Gh90uXRqdWR+CEKora3Y4/FPTBz6YhUVf8jLu/PTT38aGLj0449/3N39D2OLqbZfLrSaDD7f2vLyONuz52RUAOAdi8Ew6HIFaTqsfGxszGg0nnxOpNVqR0dH42p8zecbX15mfG5tsRgGB13B4JFvdvYVDGPOLXyPQiZzd3W9uX+fbVf7nKkIoZ66OtpmS5dKE1ARQiUlpq4uN4YxN56MCgA8clmlCtpsVzUML/GUlZWRJDk6OtrY2NjV1eXxeMbGxhKwMJWUuLu68NCA08uXVcGg7erVY19sa2s2GAxEVA8hBffLBVURQjKJhEYoEHGjiEVFCC0tjUilONvpjWRUgBuJRIJFIEki1fR8+3bq9a/c7unNzUjJ6XTevn1bpVKNjIz09PQ4HA5jQmdBRpaWcKk07ORHZ6f+1Sv39PSxLwR+MZNYeuxJGhr6cVw9Ps78x0tGBTioqqpSRWwbz87Orq+vg28kM0Zjn9PZOyXsDlV/Q4Max43j48e+M8a+Pmdv77EvzEQMQHrs2SUzM1MasWr2+/37+/vgC5wxID0WAAAAAD444NYOnEkkEsnBc1mapmn2rQPuukGW/QrwPX2i7N8DQGpSVlZ28L6vy+VaXV2Nq+61a9cyMzMRQlNTU2/evAHfVABmIuCs8vbt24WFBX/8P7A1MzOTlpZWUVEBvqkDD5mNRSoVbbOxZSyxqdz5kmKp3H2OReVGpSqy2WiFIi+uWpAtywhFUTs7OwlsEvl8Pm9oEM+H6RtXxmsyhOXSKpVyr9fa1BTiy1t6rJ+i4lK58yXFUrn7HLvKDUXFd1uDbFlACOLKeE2GsFza3d394eFFiyXEl4eZCJNIEELbe3vxqnaCaCksZDv8JZbK3eeoKjcSyUEMyzbbBTiuZgyQJQh7YWELZMsC/BJ1LCRPtVZblp3997m5EF870dJSqFYf+/IwE0kQ8lMU27EJDpU7X1IslbvPUdVoSCjKHwwy/4MtkylMpoWOjl9wPDtMgmxZQAhizHhNBsZc2omJla2tvba2Y18eZqL57e2M/v4EVO58SbFU7j5HVbnZ3p7v789gU2k64PdvkKQ7cqqCbFlACGLJeE0GxlxahBBF0QMDcycXaCL/ypCdIG7k5rLlS4qligVFvRsaKvv2W30gwPB8kSDsubk3IFsW4BdBx0Jjfr5CLn+ysMDgaydu3MgtLDz0FXkm4s6XFEtNTSBbFhACQccCYy7toe/U5uvXHrP50Ff8X17kyJcUUU1NIFsWEAKBxgJjLm2Ir50wmw99xZ+JOPIlRVRTE8iWBYRAoLHAmEsb4jvo0unUtbU5KBVmIo58SRHV1ASyZQEhEGgssOXSHvuu+cbHlw+eW4s/EyGE7ATRrtOF5UuKropCXV2PzUZLpelsFxCEXadrh2xZgF94HwuXVarrubkcS7NDXzvR3q7DU2QQMuZLiq6KgkQiQ4imadY8X8iWFY4zmgDLC5FjAcewdKk07CM96hW3ijhzaUN8R5ZwXNrUVJASJ2DJQMAxP39Prx9ZWkodVRQUivytLYIjWTwQIOfnHXr9vaWlkdPsWGqCYVhiKRkY0z24srIyxiTW8+F7ksix8MPHH0c+Obr/7NnXs7NRVYSQqaSkz+mM2jeSDDgc8/fu6SGfKIXA8azOzuWXL7+Ynv5K7L6kOuXl5QmnZNTU1DCmZMSSxHqefLkpzc5WyuVhhYs7Ox6/P6qaADATpRAYJisq+u3CwhOE4rvpfYCkp6fL5XKUUGbz+5Hv8/moOE8yf2i+p8b/AfiyPm908GHtAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.590;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAW0lEQVQYlcXPSRaCQBAD0CIgU2M3M6IyI97/hqQuAZu/S/Ii4gEQP3hQhJEaJymFydSnFepsTlGUalWrjVHbjr76N/3YLx3Gic4Ls+vmIPv4Y+fx1xXgHi/8eALt0Ag5Zzf4EQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.609;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.647;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492329315;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.830,3.114,3.130,2.19,2.14,1.1,3.820,3.114;4.copy,1.1,3.620,3.247,3.340,2.19,2.14,1.1,3.600,3.247;4.copy,1.1,1.0,3.304,3.390,3.114,2.14,1.1,1.0,3.285;4.copy,1.1,3.440,3.304,3.520,3.114,2.14,1.1,3.440,3.285;4.copy,1.1,3.390,3.323,2.30,2.95,2.14,1.1,3.390,3.304;4.copy,1.1,3.430,3.323,2.10,2.95,2.14,1.1,3.430,3.304;4.copy,1.1,3.420,3.342,2.10,2.76,2.14,1.1,3.420,3.323;4.rect,1.1,3.852,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.136,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.234,3.128,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.831,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADBklEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIsoQBbdIXUUExVVUVBRcVXHgVsS9F+49/zyTNGmud5fcy7X5fPTj94eMe+/eS9Mm+aYI8ekByLHG5RaY1LNXwn1Tens4Galp5Eifvl5QniX9+nMS0lKJAd+AgaA8awb5B1vGhwwdRoyk+zNAeRwyh1uGs0aQIyOzYXkcRkmjiZEAtj1m7DhywvgJjCqMPA450sT4bpMmT5kqr6ZNV3ZyZ5A/+DwpnVGFzuMyc5bS1eiWP3tOQeHconnFSnD+AjK9RCplFKHzuJSVy4uFRrcKhBYtrqyqUGKeJUvJ9GXScroGI4/LipXyYhXeTf74q6vV9ZqaIJm+VmJcAIw8LuvW61t6N4MNG6n0UO0mugYjj4evbrNpzFvfQA9uKYflcWiQtprGGrcxBrfvgOXRhHaq+NSdXWHzr6aJdUfcXbsHlEezV1JpVnf2NYLmYOw/0GJ3SpSDh1TylO3Wthy7092Hj4j1xTgatn/hoWPHE+5bmptwiX8KIc9JAmaeA7KWSF2K/Y5aZRPPgVnLiRry2c1Hq8z2HNvWAiZWmek5tq0FTKwy7Tki1gLFqKx7Do6AtQDBKqueE4+AtQDBKpdRz1MRa4GBV1Y9Jw4Ra4GBVzY8R0fAWoBglWnPEbEWGHhl2nOA1gIFsxu8Mu05QGuBgtkNXtm+59gEtxsDAc9JBkKekwT+N8/5i8jwR5wsr3lO4OQpMtJ+2sm+muecqTwbICLnOhy8tHTPKTxfdYEI+cIXneureU71pctXrpKxa9ctJsbeyTqj9117j0zdc27kB7oKyLf8m/W3zOYFb/vb7sjrLBdqj953ZYUOqgfQCemre87de+j+g4dk9NFjs3lPnkaedTx/8bLbjbzR++4rhF6rB5AN6at5TvGbtwh1FZHRd+/N5n2QHysfm6RPzfh59qgH8BnQlmNQri9frcItJd/kpXGe4fAM6jv93wmFcZ7h8Azqx8+QnXJQuAb1q7vVib58g8r87URfK4P6A20uoT7vOit/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.174;4.blob,1.1,1464.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABxVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5tIt4oAAACQElEQVRYhe2W51MTQRjGV7EEpAkoNkBAqWpAQVC6FAGVLqCiqIBdwdhAilQr2Ch/L5Ocl3fneDa3xL0sH+73IfubuXcvz2Qy7zyMKWHX7ig1L1LKnr26EwD27fcE3eMJMRhJomMOmBobF5+gMwpH4kHTkpJTYnUm4Th0OFV3BMCRo7oTAI4d150AcCItXXcEQMbJf0IrQf9yyIzLCpy0EnbAcsg+dTpw0krYCcshJ1d3AhcXl/8lL79A6fuoGCOTpfCMwkiML8bIJDl7zht0rzfEoA1FRcZJxRiZJMXnL5haUnqxLNxM5ZcuVwSEijEyWSqrTKuuqS0JN1Tdlfpyw6gYI5OkobEp3CQQKsbIZLnarDAS44sxMklaWpXlCUDFGJkk167fUBbIDxVjZLK0tSuMxLhiDE2SjtJOQ7q6eyxiw83ePqBmMUZGY9wFRP+t24bcaRywiA137w0CNYsxMhrjLkDuPzDOh0PMIjYMjyDlivEWozH+QggePX5iERuePnsOVO6G5AU28OKlRWwYfDUKVO6G5AUXF8egioxMF1SRkWmCKjIyqr7qLQRUkZFR9VVtY699b96+E6WiioyMqq9ae/9hfOLj5JQoFFVkZE4xPfOJsdm5edFzqsjIHGJh0f+59Fn0nCoyMmf4MvfVf3z7LhqgiozMIX4Yv9SycIAqMjKAgpWwYvynfgq/I1iRkYFOq2Il/PL9nv3zd1yYiSoyMtBplSyH1TXf0vqGOFSwIiPbdqeNANvvtBHA6U67CalPm08ka+7ZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.692,3.212;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAMUAAAAPCAMAAABjlfsQAAABCFBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwWNzdOwcFk9/de6ek7k5MFDAwEBALp6V5eXiYQJydj9vZKuLgdSEgoYmJg7u5JtbVLSx709GMLCwRFqqpY2toCBAQdR0dn//8aQUGpqUSjo0Jj9PQ1hIRf6+s5jIwPDwb392RFRRwECQksbGxU0dFBoKBkZCjk5FwCAgFj9fU5jY3Cwk6KijgICANGra0bRERUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgQRKSlKt7cmX19g7e1WViOYmD59fTLOzlOBgTSDgzUXOjpPxMQ9l5cGDg5nZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQDaHXXfAAAA2UlEQVRIid2TxQ7CQBgGF4fiFLfi7u7u7rz/m1BSIC2cWJr8DXNov8xeJtkWIQ4iMfoDxCLoAh6QSGXQCTwgV0AXfIlSRag1Wq7T6Q0wMbgYTaTZYrVxpd3hhKnBxeX2IOSlfBzpD8DEYBMM3Z/hCNtFY3GYGFwSVPL+SqXZMpPNwdRgk2fuosB2xdJrlsufS4BUmP+iilCt3mBUs9V+nna6vf77EiIDYugdjUl6TaaP72g2f53qFsvO+xIkqzUR3mzpsds/zOEI2fMbp/MFOoEHcpIrdMLv3ADxrRNtt8qT8gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.502,3.229;4.blob,1.1,1432.iVBORw0KGgoAAAANSUhEUgAAAQAAAAASCAMAAACDxfBwAAACJVBMVEUAAAAOBg4HAwcyFDJ8MnwJBAl3dzDU1FYgICD///8bGxthJ2FpK2ksLBKVlT0yMhQTExMNBQ2TPJMsEiwvLxOJiTcODgb9/WYbGwsIAwgiIiIFBQVeJl5xLnGQkDq8vEyOOY6POo8KBAoSLCwsbW1tbSwjIyP39/crEiuZPpkSEiwsLG0EBALp6V5eXiYEAgSBNIGDNYMBAgIWNzczfn4+mZkxeHgCAgE3NxZ+fjOZmT54eDE0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhLSx709GMLCwQCBQUaQUE2hoY8lZUoYmIOIiIFBQJBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiKpqUSjo0IpZGQ9l5cfTU0FCwtkZCmXlz1NTR8LCwVZJFkICBQNDR8EBAopKWQ9PZcfH00FBQsPDwb392RFRRwTMDA1g4M7kZEkWVkLHBwwMBODgzWRkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxxkZCjk5FwAAQEUMjIxenowd3cBAQB6ejGFNoVSIVIxMXowMHfCwk6KijgQKCgtcHA7kpIoKBBwcC2SkjsCAQKVPZVBGkEQECgtLXA7O5IhIQ3+/mdUIlQFAgULGxsaCxodDB0LCxt9fTLOzlNWI1aYPphDG0OKOIoBAAHW1lZnKmeCNYJ6MnpLHkuSO5JCG0IwEzCJOIkZChkpESkoECgtEi2VsyBtAAAByElEQVRYhWNgGNKAkWmgXTDAgJmFlRrGsLFTwxQ6Ag5OLiiLm4c4Hbx8/Hhk2dkodRGdAQenAJQlKCRMnBYRUTGccvziEhCGpCRMiHYsqgApTmkYU0aWcuPk5CE0k4KiEq1ZQKCsQr5TeVXBlJo6XERDk5F84xi0tIGEjq4ehKdvYMhEa5aRsYmpGZmuNbewtLJGF5TUtCHFDFs7MLAHsR0cnZxdgLSrmzuZLiIZeHh6efv4kqfXzz8gMCgYUzwklBRTwpzBIJyBwS4iMiosGiQWE0uei8gAcfEJieTqTUpOScUmbpBGiinpGWCQycCQlZ2TCxbKyy8g100kg8Ki4pJSMvWWlVdUVmERr5YhxRREFqipratvAAk1NpmT6SQyQHNLq2mbMXl62/k7rNgsMIQ7u0gxBJEFGOzDu517HBkYevvw6qB6Ndg/YSIpLkYBkyZPQReaOm06KSYgsgAIzJg5i2H2HF647FzNeegsGlSDDPNJcTEakEAXWKC5kALjGBYxLF6C4C1dNhWdRe1qkOpg+YqVlBmwajKCvXoNJmuwg7XrqGcW6/oNGKzBDjZuomIjeyrzSgzWIAebV2wZaCcMLNi6jVITAF08b6+W0dAtAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.250;4.blob,1.1,808.iVBORw0KGgoAAAANSUhEUgAAALAAAAAhCAMAAABOU9GKAAABDlBMVEUAAAB3dzDU1FZKSh75+WVUVCIsEiyVPZUyFDJHRx1/fzRPTyDk5FwXFwkvEy+JN4kOBg4yMhT9/WYbGwsODgYeHgyYmD4QEAeQkDq8vEwLCwTs7F/v72EQEAZWViNxcS4EBALp6V5eXiYHBwPX11fb21gCAgGMjDk4OBdLSx709GMtLRKSkjupqUSjo0JlZSliYigPDwb392RFRRwJCQSUlDwpKRFkZCg8PBiJiTcBAQDCwk6Kijh0dC9TUyIhIQ3+/mcsLBL//2cICAMUFAgaGgt9fTLOzlN8fDLW1lZwcC2srEXY2FeAgDRDQxvz82JubiwGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAjhEJR+AAABCklEQVRYhe3T2U7CUBSF4YKAgAiKgAwCVRREZBIcUCZFcFZw5v1fRNImNKGYdJ1u6M3+bvqn6To5N5UkMTb7zIsVh1P3kWvVrasJjxeqf04B2W2zb9Z867qv/IENXUmS14PV/FMwm8EtNUIheBuObINFIBpTn/HEThLdptJomSfv7qmR2T+Ig9ts7hAsAvkj9JqawnEGLALFkvi2XEHLvOpJTXhbPz0Di8C5Lyu8vWhcgkXgqim+bbXRMq/TvZ527qYHbW8jfbAIDO60jnZlaJu/R4vAw6PWT8/Y9uUVLVrVt+FiDl4U2Un4LzPGGGOMMbZ0o3fFh9X3MOzzS/Ft9T0M+/lVjK2+h1F/RngtFEBYQ0kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.288;4.blob,1.1,896.iVBORw0KGgoAAAANSUhEUgAAADAAAAAXCAMAAAB6dTw7AAABelBMVEUAAAAgICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVX/Z2fIUVFvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQTCAguLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAIGAgIIAwMDAQFgJycoEBA0FRUNIA1n/2cLGwsIEwgOIg4CBQIOIw5k92RHKU/QAAAA4UlEQVQ4jWNgIAAYmZgJKUHXwEKaBlYmNlQBdg5OZC4XN5oGHl4IzccvAGEICgmLiEIlxcQlJKVw2CQtIysnD2YpKCopq6gCGWrqGppa2jjdpqOrp29gCGEbGZuYMjCYmVtY4vePlbWNLZCys3dwdHJmYHBxdXP3wKPc08vbx9ePwT8gMCg4BCwSGhYuGRGJQ3lUdExsXDyQkZCYlIwQTklNw6EhPSMzC8zIzkGVyMWhIS8fj2sLCsGgCI8SVCAlCQbFRGsoKQUDAoE8ChCgrLyCVA2VpGmoKq8mTUNNLSofAKnIJa14MS9sAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.478;4.blob,1.1,3212.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.516;4.blob,1.1,2520.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;3.end,1.1;4.sync,10.6492329420;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.830,3.114,3.130,2.19,2.14,1.1,3.820,3.114;4.copy,1.1,3.640,3.228,3.320,2.38,2.14,1.1,3.620,3.228;4.copy,1.1,3.620,3.247,2.20,2.19,2.14,1.1,3.600,3.247;4.copy,1.1,1.0,3.304,3.410,2.95,2.14,1.1,1.0,3.285;4.copy,1.1,3.460,3.304,3.500,2.95,2.14,1.1,3.460,3.285;4.copy,1.1,3.410,3.323,2.30,2.76,2.14,1.1,3.410,3.304;4.copy,1.1,3.450,3.323,2.10,2.76,2.14,1.1,3.450,3.304;4.copy,1.1,3.440,3.342,2.10,2.57,2.14,1.1,3.440,3.323;4.rect,1.1,3.842,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.136,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.215,3.176,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.821,2.96;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADDklEQVRYheWY91vTQBjHT6pY0GrVOgAHxrpwI4qCiDJEwW2lriKC4ioqKgquojhwK+LeC/eef55JmjSXu0vuzbV9Hn38/JBe7977viHQ5EMR4tMDUGNPiktgU89ecfdN7e3mVKSlkzN9+npAdbb0688pSE8jJrwDBoLq7BnkG2y7PmToMGImw5cJquOQNdx2ecRIcmZUNqyOw2hpDDHjx8Zjx40nN0yYyEhh1HHIkSaZu02eMnWa/DJ9hvImdyb5B58nZTBS6Dous2YrXY1u+XPmFhTOK5pfrCwuWEiWl0iljBC6jktZuXxYZHSrQGjxksqqCmXNvXQZWb5cWkFnMOq4rFwlH1bj3eQff01AfV1bHSTL10mMDwCjjsv6DfpI72awcRNVHqrZTGcw6nh4a7dYrnnq6unJreWwOg710jbLtYbtjMkdO2F1NKFdKl71ze6w9a+mkXVH3FOzF1RHs09SaVLf7G8A7cE4cLDZ6ZYohw6r5CnjltYcp9tdR46K9cU4Fnb+wUPHT8TdtzQ37oh/CiHPSQBWngOylkhtqvOOWrKF58Cspa2afHbz0ZLZnuPYWsDEkpme49hawMSSac8RsRYoRrLuOTgC1gIES1Y9x4yAtQDBksuo56mItcDAk1XPMSFiLTDwZMNzdASsBQiWTHuOiLXAwJNpzwFaCxTMbvBk2nOA1gIFsxs82bnnOAS3GwMBz0kEQp6TAP43z/mLyPRFkhmveY7/5CltIjZqP53MvprnnKk8q33DEBud60jiR0v3nMLzVReQeeQNX0xeX81zApcuX7lKjNC16zYbY/+TdUbvu84embrn3Mj3dxUEzCN0s+6W1b7gbV/rHeW0U1B79L4rK3RQPYFOSF/dc+7eQ/cfPDSPEHr02Grfk6eRZx3PX7zsdiFP9L77CqHX6glkQ/pqnlP85i1CXUWmkcy791b7PsiPlY+N0qcm/Dq71RP4DGjLMaiUL1/tlptLvslH4zrD4RnUd/q7EwrjOsPhGdSPnyEncVC4BvWruyUZffkGlfU7GX3tDOoPahWve1TzKNEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.880,3.196;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.672,3.212;4.blob,1.1,436.iVBORw0KGgoAAAANSUhEUgAAACQAAAAPCAMAAAC7tZ1fAAAAk1BMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQB+pDXjAAAAb0lEQVQokWNgQAGMTAyEARMjYTXMLKyEFbGxE1bDwclFWBE3Dy9hRXz8hNUICAoRViQsIkpYkZg4nCkhgcqSlJKGcGVk5WAy8gqKSigsZRWoJapqcIM41DXkUViaWlAZbR2cDtHV0yfsWlFmA4JqAOoBBjDVLBNsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.386;4.blob,1.1,328.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAb1BMVEU0NIExMXkHBxIAAAAtLW9jY/ZjY/U8PJQPDyQGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgT7PaiKAAAAQElEQVQImWNgYGRiBgEGFlY2dg4Qg5mTi5uHlw/IAAJ+AUEhIENYRFRMXIJBUkpaRlYOqEZeQVEJrEtZBaybGQBSnQLs5Twb0QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.440;4.blob,1.1,2320.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492329520;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.640,3.209,3.320,2.19,2.14,1.1,3.620,3.209;4.copy,1.1,3.650,3.228,3.310,2.38,2.14,1.1,3.630,3.228;4.copy,1.1,3.630,3.247,2.20,2.19,2.14,1.1,3.610,3.247;4.copy,1.1,1.0,3.304,3.430,2.76,2.14,1.1,1.0,3.285;4.copy,1.1,3.480,3.304,3.480,2.76,2.14,1.1,3.480,3.285;4.copy,1.1,3.430,3.323,2.50,2.57,2.14,1.1,3.430,3.304;4.rect,1.1,3.832,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.535,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.811,2.96;4.blob,1.1,1884.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADFElEQVRYheWY91vTQBjHT6pY0GrVOgBRjHXhRhQFEQURBbdIXUUExVVUVBRcxb1wo6i4J+49/jzTa5M7cknuvWvzPPr4+SFN7t77viE0yQcQ4tMDUGNPkktiUc9ecfdN7u3mVKSkGkf69PWA6mzp159TkJpiGPAOGAiqs2eQb7Dt/JChwwwjab50UB2HjOG205kjjCMjs2B1HEYpow0jfmp/zNhxxgXjJ5ikmNRxyFYmdu82afKUqerHtOmRg5wZxi98rpJmksLWcZk5K9KVdMubPSe/YG7hvKLI5PwFxvJipcQkhK3jsrBU3Swi3coQWrykvKIsMudeusxYvlxZwWaY1HFZuUrdrKa7qT/+mkr8ubYqYCxfp5jcACZ1XNZv0Pa0boSNm5jyYPVmNsOkjoe3ZovlnKe2jh3cWgqr41CnbLOcq99uMrhjJ6yOJbgL48UHu0PWv5oGsyfinuq9oDqWfQqmER/srwetoThwsEl0SZRDhzG5kf3mlmzR5a4jR+X6UhwLid946PiJuPuW5MQd8U8h5TkJwMpzQNYSrkkW7xhLJp7jbz1JZmHWcqrK+O7mE0smnnO6/Iz+Dha2FjB6su45BWcrzmmzwtYCRk/WPKfy/IWLl2Jj4tYChSRrnnM5z9+WH3sPSlgLECoZew5CV66ia9dvRIckrAUIlYw9BxXdvIVQWyEekbEWGHQy9pxuyFgLDDqZeI6GhLUAoZJZz5GxFhh0Mus5QGuBQtkNncx6DtBaoFB2QyeLe44gtN0QJDwnEUh5TgL43zznLyLdF3YynjEo3XPabzvZlzEo3XPudDh4a7EGpXuON3TXub6MQVGec+++zUL9b7LO6HNX7JXJGhTlOQ9qH1qtCzzytTxWPzOTUHv0uasqdACfQCekL2tQtOc8eWq17tnz8IuOl69ed7mQJ/rcfYPQW3wCWZC+jEHRnoPevbda90F9rXxsUD410tfZjU/gM6Atx6CSvny1m24q/qZuyXWGwzOo7+z/ThjIdYbDM6gfP4MicVC4BvWrq9mJvnyDyvjtRF87g/oDLk6vFhy60iwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.174;4.blob,1.1,2284.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.880,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.280;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAADAAAAAWCAMAAACxKe+eAAABYlBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAKI2oDAAAAA2UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAfBlTAAhmxxqzYXHgwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.400,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.489;4.blob,1.1,1788.iVBORw0KGgoAAAANSUhEUgAAAYMAAAAXCAMAAADeOtPBAAACplBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQFLSx58fDKsRUXYV1dWVtYtLXDIUVH/Z2dgJyeAgDRDQxsPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ309GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFABAQECAgJ9MjLOU1MJBATyYmJQICB9fTLOzlNFRaoxMTE+Pj4XFxfWVlZwLS2cPz+qRUXW1lZwcC0KCgoNDQ0FBQX0PJnAAAACUElEQVRogWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtawAwKCYCCEzEICwiK0d4KoGDpLXAImgo017ICkFBhII7OQgIwszV0gJ6+AwRpZQFEJDJSRWfQFvCqqGKxRMApGwSgYBaNgFAwGoKaugYc1rICmFg4JbR1dZK6ePh0cgwIMDPGxhhPQ0sQlY2SMzNPXQ5U1MaE1y9TMnAE3axgBC0srXFLWNiYIjq2dPYODoxOcz+Xs4kpjlpu7B9QybKxhBLg9wZSXN7OPrx+qlJB/AIITGMTAEGymHhIK5VNnlAg/KywcZjs21rABvBGRICoqOiY2Lj4BTTIxCc5MTkkFkmnpGZlZ2XRzXE5uHh7WsAH5BeA0V1hUzMBQUlqGKlnOUwFjCldWQRjVNbV1dHNdfQM+1nABjU1gqrkFRLK0osm2tcNYHZ1gSq2ru8ewl05uY2Do68fHGiZAbsJEEDWpdDKImjIVTXradChjxsxZQDJn9py58+bT0XkLFi7CwxomYPGSpWB6GSQfLEeTXrFyFYSxes1aILlufR+iZUjtFilWULMBH2t4gI2bIPRmSH2wBV1+6zYIvX0HiNy5CyFD7RYpw24pQQwWw569+/CwhgXYz3MAwjjIfKjk8JEYDAVHnQVA1LHjJ9BlqN0OxTKXCQQnT53GwxoIcOYsGJyhljqGc+dhLKT5YWRw4eIlEHX5CmkOJQdgzmWCwLqr+FgDAK5dB4Mb1FLHcPMWIRW374DIu/eIch8lYKjMZd5/AAYPqaVuMIHRuUyiAAA/k82GltF4lwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.516;4.blob,1.1,1800.iVBORw0KGgoAAAANSUhEUgAAAjYAAAAPCAMAAADAgnVLAAACdlBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoqKiosLCwGBgY+Pj4RERF3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFABAQECAgIIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoICAgxMTEXFxfIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4aGho0NDQKCgoNDQ0FBQUoEBA0FRUiIlQAAAEDAwNCgTrXAAACiUlEQVRoge2U91cUMRCAA5yFsxyuoCIgiN2zF0CKYu+9i2LvHSwoIHbsvWDvinr2rth71//Iu+Ti5a1Ldid7eZin3w/Jl1wmOzs77xDyEhKK1CfMUUlnlatU9e9YNaNbWMKd1XQ71WvUtJc2EFeEwWYtrbbdc2wNyiEyyjvUqVvv90ZoiFmIAoQ5ovVWP4b+aNWMbmEId8bqt+IaiCYshKy2YWtQDlGRvjE+ga4bJjYyC1GAxo4memvarDmCmdEtDC2cLam63WRu1dptO3UA0tqGqYExbdrif9927Tv4Nzp24geoQeekPyw5pQvQjG5hSE2jlp7RtRuWzO497OUNQ1rbMDUwpmcvPPXu05es+/UfwA9Ql4GDoGaVwUOGphMbNlw0OxGktY1ZDUaMHEVk9Bgyjx03nhugMBOyJgINzqTsycKxcOS1jUkNpkydRmT6jJl4njWbm6jSzJkLNTjz5ovHgpHXNiY1WLCQ2qLFvnHJ0hzecbXJXQY1OMtXiMeCkdg23BqsTMqjumq1b8wvKOTlqTZritYCDc669RuEY8FIbBtuDTZu2ky1eMtW77htOzdPxdmxE2pwdu0Wj4UisW24NdizN+D79iN0IPEgL03VOXS4BGgWOeI8SvVYxnE7KYKQ2TacGpzIOhlYnDp9Bp09x89Tcc5fuAg0i1zKLqV6+cpVOymC4LWD5xrGI3qO1KDkOiaZNXTjJnPNrdt30N17QXmdv5b7D6BmjYePAv74iVhuArgiyOdm8ZSRdniqYZ4Jn8M1eO7AvGANvXzFXvT6TdDe5x/j7bv3FfJcl6Z90O991Eg7fPqM+WLv3NdvmGjW/hMkSr//qJDnlvk/N4u3DX4G85wFfgGe9+ak2u7BIgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.535;4.blob,1.1,2544.iVBORw0KGgoAAAANSUhEUgAAAE0AAABGCAIAAAAGrI4kAAAABmJLR0QA/wD/AP+gvaeTAAAHJ0lEQVRoge2aX0xTVxzHT297S/9R2lIYFFah/yhosWI3kEyjwYirRMUEHU5wg6GJT0azkGxPRp4M2R7MNO5lC/NPnH/nFsSgQTsSZ7KZhUkIhZayUKCUwgTai6Xt3UNZuWuhPbf3FrqMT/pQzrnn1+8v99x7zvnxBYAM+mb94VeHSQ1ZCVSANrob5UY59VAwqhBSETV1GvN3ZgqSlliYWxi6N6Sp11APBaOKRJ7SEqmoUDRwdYCaqiXMbeYN+zewhWwqQSBVkchTU68Z7Rp1291UZBGxP7F7//IqahRUgkCqgs0TYSGqWpW5jZ5JGwT34wPXBqhMXXhVsHnmVuaifNR6x0psZCAMJodJ/CAoAtkbxNxmzt6enbohFVIGjKplYUFG1NRrhu4N+dw+YqPcKN/7415ii+0H26ODj2B6g0z9MeXqcanr1C9bXkIqialqWaDyZKex8/bndezvCGsf+3ns7jt3iS1vpt9A9oYwt5mLThbFkedKquJH+4n22MgxBsKgLSIBXhbvhO9EZmlmQlVBPZ+aes3g9UE8gJOVAoNn3DPSORLH24iUqth5puanZr+XTe+bNgxzm1l5RImwSSxyZFXFDq0+pp78fXLq1RS8CLLY7tuYbCapPSBZVbHzpH3ZjMSH+SzfW9RH1fBDVkHVOuuss0owKY5ns4UAABz30yEmgZA7Z0ciFKo2b/6UxeLSoiZxUL2fHs+YUKjMzDQ4nb/SIihBUL2fAACr9bZYXCSRbKIeKnFQvZ8AgEDAy+FkSCSbHI5fqEdLEOH30yiXtxuNxJbS0tJnz55hGOZwOC5evCgQCCKjTE7+JhJpg++k1UdulBvbjdGvWTx/shDkiFLZrNfrJJIXExOh7oKCgq6uLpPJVF1dLZPJWltbFQrFvn37wqK8fm0BAKSlaeh6ShEUYTDDD1wBb4B4OkFYiPKIUt+sl+gkEy8mQFRYXBarUas9W1yczePdslpPmkzPHY5Q9/nz50dGRqqqqnw+HwDAbrd3dHTs2rWrq6uLGMXvn/d6Z3i8LKr5/cPOb3aqPwzf7nbWdFpvW4OitY3a4rPFvGye9ZbVdNLkeO5YLgyBGxUVC01N5wyGdA4nsndubq6lpYXY4nQ6W1tbI680GM6pVLWkkolCan5qhiEj7JMiTgn2VtyoaFpoMpwzcNKX0bwsrJsWy9aMjNM6nZTDudLX1+Nyhfq4XC6fzx8fHycOGB0dlUqlkYFwPIAgaLx5heMecXvGPGGNAW8g+MVy05KxNUN3WseRcvqu9Ll6XBEBwmHdt9keDA8fys9v1utPbdz43OG41Nt7dWAAAIBhmMfjycr612yUyWSPHz+ODMRkshcW5uJMK4Lo89Z23zb8YDj/UL6+Wb/x1EbHc0fvpV4SBfSKnJzOqqrZhoZQy507d8xmM4u1+LqqrKzEcXz37t1hAxkMZPv2r2SyXfFlFUn0eUskpyKnqrOqYbYhsisGOokk9L2wsBDDsIcPH1ZWVh4/ftzlcnV0LFNf4/NlO3ZcEQjeJv1jNCHRSWJfFJ3y8vLu7m4Mw5xO5+XLl4XCZRbJnJyKsrILACSkIJhElJR8JpeHL6pJBQ372/R0PZudZrc/oR4qeeHxssvKLojFhWstJMGIRFqJRLfWKtb5/8DN5AJa3kPJTO6e3IKPCmJfR6MrJDqknCyQqsSF4vIvyzlSDoh5P2l0hUSHlJMFRhUDYaiOqoZ/Gp6fnAcw85YWV0h04nCyxFSVvjk9RZQy3r142IqdJy2ukOjE4WSJqSrz3czpvmn/m8XCcuw8qbtCohOfkyWmqjR12oxlZulXYIJSdIVEB94zAq8K5aNoKopNYKEWqDxDrhCyUmCA94zAq2IJWAAAH7YUE3b9NLeZNXX0T92gZyTu/9iupCpoVML9hOIgZMTB64NCpTAOV0h0FDWKede8/Yk9vuErqQrODmbKUhUeNs+4XSHRoehkWUmVd9aL+3FinYXEvi8OV0h0aHGyLKsK9+Gzw7P8XH6ohYToSFcIwkbCHHxMDjNUR4/eC2hysqzkVZnunRYXiUN/wvr7AMEVYrtvC7YcMB2IfDaefvy0/9v+mL0AAFWtqu/rPngBkKqCjHWPyY1yoVIYXEUpVa5EWhEqCK9Nzw7NzrvmY/auAooahUAu6PmiByTEyJY0MFOYJZ+X5B3MW2shiQcVoPL3E36oXGedZEQgQN3uRmPiqyrUoeTD8HoDRUXiLVukt2+TPlX9x9izJ9fjaRQmsqqSFDCZjNHRusZG7VoLiQHVTbnfj1+7NlCf+ILg2qPTSQKBkxsSU1WhCxr8YBMTWHV1PooiJtMY9WhJzZkzxf39H6y1isSTlcXz+U6U0l1VoREa5i0AYG5uYdu2t+RyQXv7n7QETF5qa1WTk8fZ9FVVkhQulzUz03AwWQ979MxbAIDPF1AqhQZD5q1bybgH/BvNjfmdcxThhgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAxElEQVQ4je3S1Q7CQBCF4cV9cXcp3uLu8P7vRNKZAU4Ct1x1rv5vK2m2q9RrXG4F4/H6cMEfQAdDYVyIRNEx7QLHdQJvSKbQ6Qw6G0Hn8sBCsQQu6wq4WquDG01gqx3/ZKdmwOVuT/2YPtZgKLTLGI2ZdhXMqnyuXVZI9plqMpWnqWZzsV0LbTGplrrLplrpNZtqo+WnUG13ezbX4bXHVClTTHXcndhc54vsIpX7emNz3R/yhnd9Ged8OedLOefrY/5wvp4fwigsudBbUgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492329628;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.630,3.209,3.330,2.57,2.14,1.1,3.620,3.209;4.copy,1.1,3.620,3.247,2.10,2.19,2.14,1.1,3.610,3.247;4.rect,1.1,3.822,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.280;4.blob,1.1,784.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABOFBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwsjIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhZvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKysuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBAMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhItLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAgGDg6cnD/g4Fpyci4ODgYJFxcBAgJf7Oxh7+8GEBAnJxAEBAJX19dY29sNIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QqwQg7AAAAzklEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhvBqERSC0qJg4hCEhKSUtQ4RNsnLyCopglpKyiqqaOmEdGppa2jq6ELaevoEhEZYwGBmbmAIpM3MLSytrwsptbO3sHRwZnJxdXN3cCSv38PTy9vEFMvz8AwLhokFBODUEh4SGgRnhEQhBocioaFwaYmKxCJrFxYMjhciMiQBEZkwEGM2YpIKExCRSNSSTpiElMZU0DWnpqHwA8X8YFnQr7kwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.813,3.316;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAABIAAAAXCAMAAAAx3e/WAAAAmVBMVEUAAAAgICD///8bGxsTExMiIiIFBQUjIyP39/c0NIExMXkHBxItLW9jY/ZjY/U8PJQPDyQGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgQNDSAICBMODiICAgUODiNkZPc//oDcAAAAZklEQVQYlWNgYGBkYmZAA4xMLOhCrExs6ELsHBCak4sbXYqHl49fAE1MUEhYRFQMXaW4hKQUioC0jKycvAKSgKKSsoqqGooadQ1NLTRztHXQTR50QFdSAVNID11IX9IAXcjQCJUPALr/BZl2G2DbAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.489;4.blob,1.1,1472.iVBORw0KGgoAAAANSUhEUgAAADoAAAAqCAMAAADVs7iBAAACH1BMVEUAAAAGAgIIAwMDAQFLSx58fDLIUVH/Z2dgJyeAgDRDQxsoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ309GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FRyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCABAQECAgKcnD+qqkUxMTE+Pj4XFxcKCgoNDQ0FBQWobFlkAAAB6klEQVRIiWNggANGJjBgRmZhBSys6CJs7GDAgczCCji50EW4ecCAF5k1CqgE+PhxSAgICiFzhUUwVPDz4TJUVAyZJyKMLi8uIYlLq5S0DIIjKyePLq+gCKaUlFVU1dRRpZg1NBEcLW10nTq6eiBK38DQyNjEFE3SzBzOtLC0QtdqbWMLouzsHRgYHJ2cUSVdXN1gTBZ3D3Stnl5gytsHRPr6ocn6B8BYgUHoOoNDQkFUmFM4iIqIRJOOioYyYmLj0LXGJySC6SSIrclo0impaRBGekYmutasbAidA/FrLrp8Xj6ELihElylyLYYwSlRKHcvKDdHlGSoqGUFUVXUNukxtHYxV36Di29iEobW5pRVEtbVjyHR0Ygihga5uENnTS0jdKKA2QCtCsAFw8dPXPwFDArUIwQYgxc/ESRgSKEUINgAtfiZPmYoug1KEYAPQ4mfa9BkYUkhFCDYALX4YGGbOwpBDKkKwAWjxw8Awu3oOhiSiCMEGoMUPEMzFqJIRRQg2AC1+QGDefAxZeBGCDcCKHyBYsHARhjSsCMEGYMUPCCxegiENLUKwAXjxAwJLly1Hl4cUIVhbMIjiBwhWrFwFJFevAYPVEDFwEYK1BYNa/KxdByTWbwCDjUjixLZgNm0Ggy24/EgEAADbcWLZ25O5zAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.192,3.516;4.blob,1.1,828.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABKVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUb6Id3AAAA/klEQVQ4je3P2VLCMBQG4EMBlUVFRVYtAoILiuygIjsIKCC44obw/g8BbXKTtqkzZ7jkv8k5f+bLTACYGATARTDgnNFkxsG1dZzbsFhx0GbfxMGtbZxz7Ozi4J5zHwddbpzzmLw46PPjHBwcIuEqy40Y4FwcBUO6IiDyngwfa/dERKInPHh6dq5VUxG74Dm4jF9p1UQkkikuhHRGo6Qim8tLR+Fayg0zAdwW79SQilJZ3ipVKTVmWqTeUEMimq17eWu2pXSYaZHug8pR8dgr8L8I0B88KSsqhiM9B/D8omyIeC2+6cP3jzFbUPH5pe/g++eXLaiY/P0DYTpjdyLmj4Ej2/Bx1LYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,2936.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAW0lEQVQYlcXPSRaCQBAD0CIgU2M3M6IyI97/hqQuAZu/S/Ii4gEQP3hQhJEaJymFydSnFepsTlGUalWrjVHbjr76N/3YLx3Gic4Ls+vmIPv4Y+fx1xXgHi/8eALt0Ag5Zzf4EQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.609;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAW0lEQVQYlcXPSRaCQBAD0CIgU2M3M6IyI97/hqQuAZu/S/Ii4gEQP3hQhJEaJymFydSnFepsTlGUalWrjVHbjr76N/3YLx3Gic4Ls+vmIPv4Y+fx1xXgHi/8eALt0Ag5Zzf4EQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.628;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492329727;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.570,3.228,3.390,2.19,2.14,1.1,3.550,3.228;4.copy,1.1,3.630,3.247,3.330,2.19,2.14,1.1,3.610,3.247;4.rect,1.1,3.812,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.250,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.291,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.791,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.174;4.blob,1.1,2560.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,3.272;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAADsAAAAnCAMAAACG78BhAAAB6VBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4GAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8aPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHgpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92TLzB9jAAABQklEQVRIiWNgYGBkYmZhZWMgB7BzcHJx8/CSpZePX4CBQVBImBy9IqIgUkycDK0SQpIgSkqaHHtlIPbKkqNXDuJfeXL0KjArCiopc5KjlYFBRZVZTE0dh6SGJhhoIbOIBdo6YKCLzCIW6OmDgQEyaxTQFhgaGVOg14RsvaZGZjjlzC0skblW1mjyNrYQ2s7eAUOvo5OziyuU7ebuoaONww5PL28fX3RBCT//gMAgICM4JDQsPAKnAyOjomNi4zCE4xMSkxgYklNSCaTbtPSMTFSRrOwctdw8Bob8gsKiYjw6S0rLyisqkUWqqmtq6+rBzIbGJp3mFhw6W9vaOzq7UMW6e3r7ELz+CRNx6J00ecpUdLFp01H5M3DonTkLhwQaIL2kQQDSSxoEGC1p6A9mz5lLgd55ZOudP2cB2XoXLkLlAwBVlEJ2fcOxNAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.291;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.374;4.blob,1.1,772.iVBORw0KGgoAAAANSUhEUgAAABsAAAAgCAMAAADUt/MJAAABKVBMVEUAAAA5OYxnZ/8DAwg6OpBnZ/4CAgRFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYpESmPOo8UCBQgICD///8bGxsCAQKDNYNDG0MTExMxFDGTPJMHAwciIiIFBQVnKmdqK2ojIyP39/c0NIExMXkHBxKMOYxHHUctLW9jY/ZjY/U8PJQPDyQLBQuZPpkqKmlSUstmZv1HR7AZGT4XCRcoECgTEy5KSrcdHUgcCxwlDyUFBQwoKGRRUchlZftERKgLCxsRBxEsEiwSEi0/P5thYfE5OY0MDB4EAQSWPZY9GT0/P5xaWuAuLnIGBg53MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkkNDSAICBMODiICAgUODiNkZPfqNBJaAAAA1UlEQVQokWNgYGRiZsAFWFjZcMqxc+CU4uTixinHxsOLU44SwIdbil8Ap5SgkDCEISIqhiYlLiHJAJOTQpOTlpGFsuRE5dHkFBRhLCVlCK2iqgYVUddAd4CmlraOLoihpy+N4TpOA0MjYxMGBlN9M2yON7dgsmSw0rfGlLGxtbN3cGRw0ndGl3Fx5XJz9wAyPL280eV8fP38IayAQHS5IHhCCJbA5hYICPEKxS0ZFh6BU042Mgq3xugY3HLUB7FMjhgshFwcBgsG4pkSMFgwkJiEyYIAANyrF//+GnVCAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.390,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.489;4.blob,1.1,3388.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.571;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAflBMVEUAAAAxMTEYGBgGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRLXGisiAAAAYklEQVQokWNgQAGMTLQiEYCZBUSysrGDKA5OEMnFzQOiePlAJL8AM5AUFBACcYRFQKSoGIgU5wWREpJAQkpaBkjKCsgBSXkFRSCppAwkVFQFGRjUFNSBTA1NBhxg1I8U+hEAVGMH/mCncOMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492329834;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.570,3.209,3.390,2.38,2.14,1.1,3.550,3.209;4.copy,1.1,3.610,3.247,3.350,2.19,2.14,1.1,3.590,3.247;4.rect,1.1,3.802,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.272,2.49,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.291,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.781,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,3.253;4.blob,1.1,1444.iVBORw0KGgoAAAANSUhEUgAAAE8AAAA6CAMAAADGBfTGAAACSVBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAyQkDq8vEwLCwTs7F/v72EQEAYQJydj9vZKuLgdSEgoYmJg7u5JtbUEBALp6V5eXiYHBwPX11fb21hFqqpY2toCBAQdR0dn//8aQUFLSx709GNj9PQ1hIRf6+s5jIypqUSjo0IECQksbGxU0dFBoKAPDwb392RFRRxj9fU5jY1kZCjk5FwCAgFGra0bRETCwk6KijgRKSlKt7cmX19g7e0hIQ3+/mcsLBKMjDn//2cICAMXOjpPxMQ9l5cGDg59fTLOzlPW1lZwcC2srEXY2Ffz82JubixUVCIBAQAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAgfTU0dSUkECwtKHh62SkqBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8aPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxdpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0pISB0DBwcYPDwxeHgpZWUHEBBQICDaWFjxYWGVPDwuExMMDAXIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/x8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhJf7Oxh7+8GEBAnJxBX19dY29sNIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QfzYVPAAABrElEQVRYhWNgYGBkYmZhZWPADdg5IDQnFzcPHmVQwMvHLyAoJIxbgYioGIQhLiHJSdg8KWkZBgZZOXmcChQUiTAFAZSUQaSKKk4FauqkGKchpwmitLRxKdDR1SPFPAZ9iPsMcMkbGhmTZJ4JJPxMccmbmZNkHIMFs6WslTU/LmkbWzs4297BkQgDnZyZVVxcccm6uSPY7LYixLkRD/DwRLC9vCk2Dhno+PhS1TwRP3+qmjcKRsEoGAVDDQQEgkEQMosSEBwCBqHILEpAWDgYRCCzRsEoGAogMioamRsTi0NdXHwCUeYlJiWnpELZaekZIcE41GVmZefkEmOgRl5+QWERkFFcUlpWXoFTnU5lVXVNLVFurKtvaGRgaGpuIZBPW9sc2gmb1tHZ5dLdw8DQ29c/YSIedZMMJ0+ZOo2QadNnzJw1ew6YOXfe/JAFC3GoW7TYZ8nSZYRdt3zFylUI3uo1a9EVuEJa3uvWb9hI2DQGhk2bUflb0OSjt27bDqJ3UNBSRy7lO3buiiaknhCgTimPAKOl/MgBu/fspbJ5+6hq3v49B6hq3sFDqHwAlldnHhC+dFoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.272;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,1200.iVBORw0KGgoAAAANSUhEUgAAACYAAAAzCAMAAADM+Iq0AAAByFBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgY5OYxnZ/8DAwgEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYpESmPOo8UCBQgICD///8bGxsCAQKDNYNDG0MTExMxFDGTPJMHAwciIiIFBQVnKmdqK2ojIyP39/c0NIExMXkHBxKMOYxHHUctLW88PJQPDyQLBQuZPpkqKmlSUstmZv1HR7AZGT4XCRcoECgTEy4dHUgcCxwlDyUoKGRRUchlZfsLCxsRBxEsEiw/P5thYfE5OY0MDB4EAQSWPZY9GT1aWuB3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYNDSAICBMyMhT9/WYbGwsODiICAgWQkDq8vEwODiNkZPcEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2larVWAAABdklEQVQ4jbXU90/CUBAH8OITcYKKA1ddoIJ7oCji3lr3FjfurSDuvff23xVLscu2FxPvl/ve6yfpu6Qphsm8kHRhyFsOYj4KXwjz8w+AMBQYBGJKVTCEoZBQEFOHgVh4RCSEIU0UiEXHxJJDHB4vxhISk8ghWaUVY0iXQrbUNNGXUqU3pEOYNiMTwkTqjywLxLJzICw3L98dCoyFwqzIVIw8rESYmUstVCozlguzikpPqqp295raOj6rb+BevVEha2rmsBbCzGVI39rW3tHJYl1EN4+5qkeD9zJZH9HPR9jA4JDcymTDxAgXKUcNY+MT7LtN2qa4TDetJv8JrE1nZrlsjvqcWWze9MsGfLZgW4QwtLS8AmGW1TUIQ+sbICZU/8HsDrJt4lbqmE5M5rBTD50/zMlnW9s75LCL71HHdGKw/QP3cHjkOaYTzY5PTiErnJ1fQNjllZT6Ztc3txB2d/8AYY9PksrFnl9eIeztXVq52McngH0BiUJLOun3shAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.380,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.489;4.blob,1.1,1760.iVBORw0KGgoAAAANSUhEUgAAAXkAAAAXCAMAAADZVM+RAAACnVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFABAQECAgJ9MjLOU1MJBATyYmJQICB9fTLOzlNFRaoxMTE+Pj4XFxfWVlZwLS2cPz+qRUXW1lZwcC0KCgoNDQ0FBQUjwlgHAAACRElEQVRogWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtYwAQKCYCCEzKIzEBZBZ4mKwUSwsYYJEJcAA0lkFn2BlLQMBmskAFk5MJBHZtEX8CooYrBGwSgYBaNgFIyCUUB9oKSsgoc1DICqGg4JdQ1NZK6WNh0cgwJ0dPGxhj5QU8Ulo6ePzNPWQpU1MKA1y9DImAE3a8gDE1MzXFLmFgYIjqWVNYONrR2cz2Xv4EhjlpOzC9QybKwhD7hdwZSbO7OHpxeqlJC3D4Lj68fA4G+kHBAI5VNntAY/KygYZjs21hAHvCGhICosPCIyKjoGTTI2Ds6MT0gEkknJKalp6XRzXEZmFh7WEAfZOeD0lZuXz8BQUFiEKlnMUwJjlpaVQxgVlVXVdHNdTS0+1tAGdfVgqqERRLI0ock2t8BYrW1gSqm9o1O3i05uY2Do7sHHGtJAqrcPRPUXTgBREyehSU+eAmVMnTYdSGbMmDlr9hw6Om/uvPl4WEMaLFi4CEwvhqT5JWjSS5cthzBWrFwFJFev6Ua06ajdlsQKKtfiYw1lsG49hN4AKec3ostv2gyht2wFkdu2I2So3ZZk2CEhiMFi2LlrNx7WEAZ7ePZCGPuY9xccOBiBoeCQvQCIOnzkKLoMtVuQWGYDgeDY8RN4WIMFnDwFBidJUHf6DEwQaV4VGZw9dx5EXbhITYdiB5izgSCw+hI+1iABl6+AwVUS1F27TkjxjZsg8tZtKrgPPxjKs4F37oLBPWqpoy8YnQ3EAwAoDMcc/tcs0gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.513;4.blob,1.1,960.iVBORw0KGgoAAAANSUhEUgAAADkAAAASCAMAAADWrYZCAAABg1BMVEUAAAAMBQX1Y2NKHh53MDDUVlYMDAX19WNKSh5HRx1/fzSkQkKoRESkpEKoqERGHBz2Y2MOBgYyFBT9ZmYbCwtGRhz29mMODgYeHgyYmD4QEAcDAQHmXV1jKCiQOjq8TEwDAwHm5l1jYyhWViNxcS6LODjBTk4EAgLpXl5eJiaLizjBwU4CAgGMjDk4OBctEhL+Z2cfDQ1LHh70Y2MLBAQtLRL+/mcfHw2SkjsHBwPQVFR8MjKpRESjQkLQ0FR8fDJlZSliYihyLi7ZWFgPBgb3ZGRFHBxyci7Z2VgJCQSUlDwpKREYCgr8ZmY3FhZkKCjkXFwCAQEYGAr8/GY3NxY8PBiJiTcBAQC3SkqVPDzCTk6KODi3t0qVlTx0dC9TUyJZJCTsX18GAgIhDQ0sEhJZWSTs7F8GBgIUFAgaGgsJBATyYmJQICAIAwN9MjLOU1Py8mJQUCBLSx6cPz+qRUXIUVH/Z2dgJyfWVlZwLS2cnD+qqkWAgDRDQxsoEBA0FRUTCAghfynjAAABCElEQVQ4jWNgGFKAkYmZkBIWViDBxs6BLMbJxcDAzUNIJysLiOTlQxbj4mRg4BcQxK9RSFgERImKiSPEJCSlGBikZWTx65STB1MKikoIMWUVEKmqhlejuoYmhKGlDRfT0dUDUfoGhvh0GhmbQBimZuYwMVMLSzBtZY1Pp40tjGVnD2M5OEJoJ2c8Gl1c3WBMdw8ow9PLG8Lw8fXDrdM/IBDGDAoOgTBCw8KhQhGRuHVGRSPYMbEQOi4eJpKQmIRLY7JBCoKTmpYOojIkM2EiWdk5QDIpFwykkVkMeflIxngWFIKoInuEUHEJkCgtA4NyZBZDRSWyC6qqQWRNLZrD6urBoAGZRRMAAKxNM31Bc1bkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.192,3.516;4.blob,1.1,1048.iVBORw0KGgoAAAANSUhEUgAAAUYAAAAPCAMAAACvKZbSAAABg1BMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkoTCAikQkKoREQICBNCQqRERKgeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/ZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGMCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEtEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9lKWViKGLQVFR8MjJUVNAyMnwJBAmUPJQpESlyLi7ZWFguLnJYWNk8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjd0L3RTIlO3SkqVPDxKSrc8PJUUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgZLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoGBg9iYvMsLG4iIlQAAAGdLRzRAAABSUlEQVRYhe2O1VIDQRBFJ8kiWdyCE9wS3DVAcHd3d4K7fDpJNgNTwz5Mzz7QS3Eeus/0VN26hPixWIn5sSlhnIVHRIYuoqaXwmJXo7hLdEzsl1stktUxYVPieItPoJ+ippfCYFcT+VNSMrUURyq8NTrSlHTeMjKzCMz0Uhiy1RyqTqe2c/NCQvILjNTHQmHRDysuKQWaXgpDWTk1l7uiMihV1TXapbauXr48bhoaoSZKU3OLS7PWNm23d3TKVDQDnq5uoMHp8fYGd1+/dAR6BgahBmdoODBHRsfkI7AzPgE1OJNTgTk9MysfgZ25+QWgwVlcWvbPlVXpABOwtg41OBubhGw5tuUD8LOzuwc0QfbVA6qH7iNyfGKkJXpOz86BJsiF10f18uqa3NwaaYmfu3uoifHw+O1Pz3Ld/nl5ffvtCn8B3/sH+/wEG6hFdFl5bqwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.535;4.blob,1.1,3948.iVBORw0KGgoAAAANSUhEUgAAAMQAAACCCAIAAACWxfBNAAAABmJLR0QA/wD/AP+gvaeTAAALRElEQVR4nO3db0wTaR4H8Gk7LaVAacufpcAVaGkBFWzc9TDm0DW6x24hum7WNXr+2dPLmuyrTcyG5JLLvfCyLzYmZ9acxnvhbXqrybq6ct5lxaBh5Uy8Dbt6UQxaoEBCgUKLCLTF0tJ70U1vLDB/n5kpM79PeEHmmc78nuFJZzp95guGMeFsc37Q+wGjl6xGnas+HjpucVm4bwphVYALJaO1HYcdnr97kOx4cX5x6PqQ44iD+6YQVgW4YDCYCjcVGuoM/V/1o9q3x+2p2F2h0Wu4bAR5VYA1BoPJccQx1jUW8oVQ7dt3xxediVr3WblsBHlVgDW6g0mJK6sPVHvcKM8miXii/1I/lzMdH1UB1ugOpvLmcnWO2nvNS1yoUCpUWhXxR6lW0mxN8rg95iZzXkUeu+pXrAqIBae5nuOIY+j6UCwUIy60uCxv//Nt4pLhfwzfevcWndak6cfTwUdB+2H7gz89YFz7KlUBsdAaTJp8TeXuyo7dHWnLx/89/u3mb4lLXj5/SbM1xeP2rDuxjsVgWq0qkNFqf1d7aPSQQqngY+O6Et1HsY+KG4szqirAAq1rJscRx8DlgcRSgo8KwhPh0c5RFpfhvFYFWKAeTHlVeeZfmXn9xORxe2z7bUoNg/sUAlQFmKL++9kP2QP/DUz3TvNXxHD7sEqjYvTVigBVAaaoB5MAN3JikdjglUH7QTv9l8DtJQAAAAAAIEsajV6lyhK7CiCE7OJs8hWYTY5bTq+v3rjxUxyn2A1Y68p/XV7zYQ35OlwHUyDwIBTy1dR8yHE7IJMZ64yWdyxPLz4lX43rYMIwzOu9ajSuM5k2cN8UyEAKpaL6YPXIv0YWAgvkayIYTIuLc5OTPeXlb3HfFMhABRsLsgxZE/cmKNdMH0wui+U7l4u4pLGx8e7du5FIxO/3nz17Njc3d/lWAoGfDIZajUbPpWjWLC6L6zsX9XqAleJfFj/vex5/Gadc8+f5TLhSud9ma3M6602mHyYnU801NTVdXV3d3d179+4tLS09ffq01WptaWlJ28qLF4MYhuXnO6amfkTSAaVaqVClzy1Zii4R5wgocaVtv83Z5jTVmyZ/mMQAP/Lt+aOdo3TWxLNx/Hht7cmGBrNO943Xe6K7+77fn2o+derU6Ohoa2trLBbDMMzn83V0dOzYsaOrq4u4lXh8IRqd1elKUHXgzb+9af9N+ld1nfs6vVe9yaJrj9c2nGzQmXXeb7zdJ7r99/0rbQZwpc5Rq/PUkckInZXxi9u3v2+1fvbw4Re9vcGF9Cssl8t15syZ5EjCMOzWrVuBQKClpSVtMGEYFouF1WqWU7mX6/lDz+Mzj9MWzg7OJn/ZfnG79X3rw88e9n7RuxCkuCoEXOC5OIZhsQitidH414ODrxcVfVJfX6jVXujrexQMptqys7NzcnImJl658hobGyssLFy+oURiSalUc6v8/0KjofB4OG3hUnQp+cvg14NFrxfVf1KvLdT2XegLPgou2wBAI/kMSCJOawYi3j48fGNk5L2qqjan8+P16+/7/eeePPmqvx/DsEgkEg6HS0peOXmVlpbevn17+YZUKs3i4jyK+jGM6jQ33D48cmOk6r0qZ5tz/cfr/ff9T849gecw+ZB8WEOVpWL8yp1lZZ2trXPHjqWWXLt2zePx4PjP1+nNzc2JRGLXrl1pL1QolE1Nfykt3cG+6lflVeUVvVGU9pNlXOF7m7KdZa2drcfmji1vAtwpcEXTuSZzk5nl6+tNptTvdXV1kUjk5s2bzc3NR48eDQaDHR0rPA2Sk1O6bduF3NxfsNwlZ6Z6E/VKgBVnm7P6QDWabW3duvXevXuRSGRqaur8+fN6/Qo3k8rKdm7Z8jmGwYMiElTRWrH51Gbh9rdp0+8tlvSbT0AaNAZN07kmvY36jjSCr1MKCpwaTb7Pd4f7pkAGis5EfV2+yncrKU88XAeTTme22w8+e/ZlPA73eyRr5MYIrsUr91TyuxuDodZkqud3HyADqHPVlncQxPwBQAvzm1Hylsy5o3lHWPLSjgaCC3BZ0VfrN366Ec+mG0UkbWlHg2IwIczEJccoMVewqpYLPAiEfCHK2dAykXY0KAYTwkxccowScwWrakXeq17jOqNpA9xzx7BXjwb1aQ5JJi45Fom5AlS1msW5xcmeyfK3yoXfdQYiHg3qwYQkE5cci8RcAaoiEfgpYKg1iDKUM1DqaFAPJu6ZuOTYJebyXRW5F4MvMAzLd+SLsvdMkzoatD7NcczEJcc6MZfXqsjFF+LR2aiuRCf8rjNQ6mjQGkypTFw+SmGdmMtrVZRi4Zg6D9nM0rUueTTo3mfyuD2Ow+jPKcnEXNaxXTxVRUdiKbE81ly2kkeD7uEYuDygt+lZZOKSs+6zLgQXfHd87F7OU1V0qDSqxflF4febmZJHg+5gYp2JS45jYi5PVVFSKBVZhqwVY81lKHU0GLxRs8jEJYckMRd5VXToSnQKXDE7MCvkTjNW6mgw+Bssz8RVapRp/x1FpVWlnsQlb8UQJeaySOrlzlBniL6Izo8iexpnTUsdDQZfWKYycYfbh5NL9nTvWX698v1vv3/25TPKVgzDqg9U9/21j10HSKoSwGuNr43dHcNg6gCGYYSjwekRAEOtQZ2b/vF4bmgu+ZQteevaVeAssB+w9/yxJ75AneUgeXA02NOZdVs+32KsM4pdSEaAo8GJodYAz+ilwNEAQAzk+bKU6bMSw3varoSR58vSSZ+VEt77m5urDoWOu8SYPss3Y51x65+3agu1LFqlh2Z/Ob0zzc8vXr8+dESkSUX8Ic+XpZ8+Kw3Cpe263Z7duyv00ppzSJ4vSz99VhrYp+0ydeeOb2Ymuk+k6bM8Ic+XpZ8+Kw30+8t1MMXjiUuX+iV2psu356fyM5m2Sg/9/iL4NOd2e5qazBViTJ/lA3m+LKP0WQlg1F8Eg+nx4+lHj4KHRZo+ixx5viyj9FkJYNRfNPeZ3G7PYZGmzyJHni/LKH1WAhj1F81gunx5wGbTN4oxfRY58nxZ9umzaxOj/qIZTBMT4c7OUWlchkfnool4YsVkX8pW6WHUX2Rfp7jdnv37bRphp8/yIRFLzI3M5ZTnsGiVHkb9Rfa3b28f1mhU0vhq5fmT58Z1q87RIW+VHvr9RTaYIpHYlSuDBw9K4TPd+L1xbYF2tXxZ8lbpkVt/0bPuszacbFhtVjN5q/TQ7K9cPpUwNTs4W7qtNMuUNfN0hmmr9Mitv+iR58vKLX1Wbv0FIoPTHEpyy+KFtF0eyS2LN62/8M6EUng8rLfpi98onvpxSuxahJDWX3hnQkxuWbzE/sI7E2JL0SVtkda0weT/jyz+oTmxv/DOhJ7csngZpO0CpuSWxcssbRcwIrcsXmZpu4ApuWXxMkvbBYzILYuXWdouYERuWbzM0nYBfXLL4mWTtgtoklsWL5u0XUCT3LJ4U/2FwYSe3LJ4U/2FwYRYgbNAk69h/Q881hy59Vc4ckuflVt/BSW39Fm59ReAzABpu0SQtssepO0Sya2/KEHaLpEQabtSBWm7RMKl7UoSpO0SCZe2K0mQtkskXNquJEHaLpGgabsSA2m7REKn7UoMpO0SiZC2KyWQtkskQtqulEDaLpEIabtSAmm7ROKk7UoGpO0SiZO2KyWQtkskQtqulEDaLhH9/srlQpKR+EIc1+HFjcUrJpmQt0oP/f7CYFoZpO0Sya2/6EHaLpHc+gtEBqc5lCBtFyADabsAGUjbBShB2i5ABtJ2AUqQtguQgbRdgAyk7QKUIG0XIANpuwAZSNsFaEDaLkAG0nYBMpC2C5CBtF2AhtzSZ+XWX+HILX1Wbv0VlNzSZ9P6+z96Ce0dZ0TrcQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492329937;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.copy,1.1,3.570,3.228,3.390,2.19,2.14,1.1,3.550,3.228;4.rect,1.1,3.792,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.291,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.771,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADBklEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIsoQBbdIXUUExVVUVBRcVXHgVsS9F+49/zyTNGmud5fcy7X5fPTj94eMe+/eS9Mm+aYI8ekByLHG5RaY1LNXwn1Tens4Galp5Eifvl5QniX9+nMS0lKJAd+AgaA8awb5B1vGhwwdRoyk+zNAeRwyh1uGs0aQIyOzYXkcRkmjiZEAtj1m7DhywvgJjCqMPA450sT4bpMmT5kqr6ZNV3ZyZ5A/+DwpnVGFzuMyc5bS1eiWP3tOQeHconnFSnD+AjK9RCplFKHzuJSVy4uFRrcKhBYtrqyqUGKeJUvJ9GXScroGI4/LipXyYhXeTf74q6vV9ZqaIJm+VmJcAIw8LuvW61t6N4MNG6n0UO0mugYjj4evbrNpzFvfQA9uKYflcWiQtprGGrcxBrfvgOXRhHaq+NSdXWHzr6aJdUfcXbsHlEezV1JpVnf2NYLmYOw/0GJ3SpSDh1TylO3Wthy7092Hj4j1xTgatn/hoWPHE+5bmptwiX8KIc9JAmaeA7KWSF2K/Y5aZRPPgVnLiRry2c1Hq8z2HNvWAiZWmek5tq0FTKwy7Tki1gLFqKx7Do6AtQDBKqueE4+AtQDBKpdRz1MRa4GBV1Y9Jw4Ra4GBVzY8R0fAWoBglWnPEbEWGHhl2nOA1gIFsxu8Mu05QGuBgtkNXtm+59gEtxsDAc9JBkKekwT+N8/5i8jwR5wsr3lO4OQpMtJ+2sm+muecqTwbICLnOhy8tHTPKTxfdYEI+cIXneureU71pctXrpKxa9ctJsbeyTqj9117j0zdc27kB7oKyLf8m/W3zOYFb/vb7sjrLBdqj953ZYUOqgfQCemre87de+j+g4dk9NFjs3lPnkaedTx/8bLbjbzR++4rhF6rB5AN6at5TvGbtwh1FZHRd+/N5n2QHysfm6RPzfh59qgH8BnQlmNQri9frcItJd/kpXGe4fAM6jv93wmFcZ7h8Azqx8+QnXJQuAb1q7vVib58g8r87URfK4P6A20uoT7vOit/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,3.212;4.blob,1.1,2964.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.253;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.278;4.blob,1.1,948.iVBORw0KGgoAAAANSUhEUgAAADAAAAAhCAMAAACoVtiLAAABjFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUlKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0YPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92TOFrnWAAAA9ElEQVQ4jWNgwA4YGXFI4ABMzCysJGlgY+dgAtGcXGDATbRGHl4w4CNaA78AGAiS5LwRCISERUjVIEqaBjFhcVQBCUkmZK6UNJoGGVkILSevAGEoKimrqEIl1dQ1eHlw2KSppa2jC2bp6RsYGhkDGSamZuYWljjdZmVtY2tnD2E7ODo5MzC4uLoRSDPuHp5eQIrN28fXz5+BISAwKDgEj/LQsPCIyCiG6JjYuPgEsEhiUjJvSioO5WnpGZlZ2UBGTm5ePkK4oLAIh4biktIyMKO8AlWiEoeGqmo8rh3NmIMP1NTWkaqhnjQNDbWNpGloakblAwCwLSWyOUkPUwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,1228.iVBORw0KGgoAAAANSUhEUgAAADAAAAAzCAMAAADmSHsbAAAB2lBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYpESmPOo8UCBQgICD///8bGxsCAQKDNYNDG0MTExMxFDGTPJMHAwciIiIFBQVnKmdqK2ojIyP39/c0NIExMXkHBxKMOYxHHUctLW88PJQPDyQLBQuZPpkqKmlSUstmZv1HR7AZGT4XCRcoECgTEy4dHUgcCxwlDyUoKGRRUchlZfsLCxsRBxEsEiw/P5thYfE5OY0MDB4EAQSWPZY9GT1aWuB3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkkNDSB3dzDU1FYICBMODiICAgUyMhT9/WYbGwsODiNkZPeQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0zNWVfAAABeElEQVRIiWNggANGJmYG0gALK4ka2Ng5SNPAycVNohU8vCRq4OMXIFGHoBCJGoRFSNQgKiZOjDIORGhKSBKhXkpaRhbGlpOWB9MKikq4NSirqErB2GrqGmBak1+LGLcBgbYOmNLVI1I9FOgbGJKmQcvImDQN9AEmJKo3NSNNvbmFJYRhZW1DjHpbO3sGmAYHYjQ4OjlDWS7WrsRocHOHsTw8IbSXtw8+Db5+6CL+7EwBgTjVBwU7Yojph4SGhUfg0BAZHIVNOFpCMQa7htjgOExBxviERNYk7BqSg1PQhfhSDdLSM3C4iCEzKxtdSDtHGF+5mJuHLpKPPwsW2OGVxgSFWUUk6iguKSVNg3NZOYlWVFSSqGFAQZUiUgKprkETQ5GFCdUiODXVaGIoshBQp1gPZzc0NqGJIctCQXMLgt3ahi6GLIsJ2js68Uljgq7uHtI09PaRpr5/wkTSNEyaPIU0DVOnkaZ++oyZpGmYNZs09Qxz5hKhCACcFD+WRfp1OAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.489;4.blob,1.1,3364.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;3.end,1.1;4.sync,10.6492330037;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.782,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.234,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.250,1.8,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.761,2.96;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADDklEQVRYheWY91vTQBjHT6pY0GrVOgAHxrpwI4qCiDJEwW2lriKC4ioqKgquojhwK+LeC/eef55JmjSXu0vuzbV9Hn38/JBe7977viHQ5EMR4tMDUGNPiktgU89ecfdN7e3mVKSlkzN9+npAdbb0688pSE8jJrwDBoLq7BnkG2y7PmToMGImw5cJquOQNdx2ecRIcmZUNqyOw2hpDDHjx8Zjx40nN0yYyEhh1HHIkSaZu02eMnWa/DJ9hvImdyb5B58nZTBS6Dous2YrXY1u+XPmFhTOK5pfrCwuWEiWl0iljBC6jktZuXxYZHSrQGjxksqqCmXNvXQZWb5cWkFnMOq4rFwlH1bj3eQff01AfV1bHSTL10mMDwCjjsv6DfpI72awcRNVHqrZTGcw6nh4a7dYrnnq6unJreWwOg710jbLtYbtjMkdO2F1NKFdKl71ze6w9a+mkXVH3FOzF1RHs09SaVLf7G8A7cE4cLDZ6ZYohw6r5CnjltYcp9tdR46K9cU4Fnb+wUPHT8TdtzQ37oh/CiHPSQBWngOylkhtqvOOWrKF58Cspa2afHbz0ZLZnuPYWsDEkpme49hawMSSac8RsRYoRrLuOTgC1gIES1Y9x4yAtQDBksuo56mItcDAk1XPMSFiLTDwZMNzdASsBQiWTHuOiLXAwJNpzwFaCxTMbvBk2nOA1gIFsxs82bnnOAS3GwMBz0kEQp6TAP43z/mLyPRFkhmveY7/5CltIjZqP53MvprnnKk8q33DEBud60jiR0v3nMLzVReQeeQNX0xeX81zApcuX7lKjNC16zYbY/+TdUbvu84embrn3Mj3dxUEzCN0s+6W1b7gbV/rHeW0U1B79L4rK3RQPYFOSF/dc+7eQ/cfPDSPEHr02Grfk6eRZx3PX7zsdiFP9L77CqHX6glkQ/pqnlP85i1CXUWmkcy791b7PsiPlY+N0qcm/Dq71RP4DGjLMaiUL1/tlptLvslH4zrD4RnUd/q7EwrjOsPhGdSPnyEncVC4BvWruyUZffkGlfU7GX3tDOoPahWve1TzKNEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,3.174;4.blob,1.1,3588.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.234;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.502,3.250;4.blob,1.1,1556.iVBORw0KGgoAAAANSUhEUgAAAH0AAAA9CAMAAAC3BpZ7AAACUlBMVEUAAAB3dzDU1FZKSh75+WVUVCIsEiyVPZUyFDIsLBKVlT0yMhQHBwOTkzxPTyDk5FwXFwkvEy+JN4kOBg4vLxOJiTcODgZiYihlZSn9/WYbGwsqKhGUlDwICAOQkDq8vEwLCwTs7F/v72EQEAYCAgGKijg7OxgEBALp6V5eXibX11fb21hTUyJ0dC9LSx709GOYmD4TEwipqUSjo0J9fTMPDwb392RFRRxERByCgjVkZCiXlz0hIQ3Cwk5ubixZWST+/meMjDn//2c1NRaOjjkEBAF9fTLOzlMFBQKRkTswMBPW1lZwcC2srEXY2FdmZinz82IBAQAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WMkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxdpaSrLy1KwsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0pISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAXIyFH7+2WoqEQLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/x8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4JFxcBAgItEhInJxANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92TOylpzAAAB90lEQVRYhWNgAAJGJgZUwMzCyoAO2Ng5oCxOLm40Fg8vJ1wdpiwyC2EKnMXEiG4VH78AhvWCQsJQloioGBpLXAKhDlMWmYUwBcrilpSC8MVgSkgG0jKy5GqVk4fQCopKymQaoaKqRqZOdQ1NCINHS1uBTDMYdHTJ1KinT7adCCBlYEieRiNjyi1nYDBhJkubqZk5NWy3sCRLmxW/CjVsF7O2IUebrSo1LGdgsLMnQ5ONA6KYcnQiO9cyMDi7uJKuyc0dwZZzUCffdg9PL9I1efsg2L5+5FvOwKDpT4luBtMAO4r0UwbUWQMH0PZRMApGwSgYBaNgFNAbBAWDQQgyi34gNAwMwpFZ9AMRkWAQhcwaBaNgpIDomNgBtT1uAG2Pj0mgoemJScnI3JRUNPm0dAidkZlFA9uzc3Lz8qHsgsKisFAc6opLSmXKqG99eUVlVXUNkFFbV9/Q2IRTnWlzi2RrG/XtZ2jv6OxiYOju6SVQnvf1O02gtt0TJ02eMnUaA8P0GTNnzcajbo7V3Hnzpahr94KFixYvWQpmLlu+ImzlKhzqVq8JWLtuPXXtZmDYsHHTZgRvy9ZtONRt37GT7GFl3GDXblT+Hhzq9lIwxkQaGIj2FAIMRHsKAUbbU6NgJIN9+w8MqO0HB9D2Q/sPD6DtR45SyyQAJP9sZPMVe6MAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.370,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.489;4.blob,1.1,1772.iVBORw0KGgoAAAANSUhEUgAAAXoAAAAXCAMAAAAyY3SSAAACnVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFABAQECAgJ9MjLOU1MJBATyYmJQICB9fTLOzlNFRaoxMTE+Pj4XFxfWVlZwLS2cPz+qRUXW1lZwcC0KCgoNDQ0FBQUjwlgHAAACTUlEQVRogWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtaQBgKCYCCEzBo4ICyCzhIVg4lgYw1pIC4BBpLIrAEDUtIyGKzhC2TlwEAemTVggFdBEYM1CkbBKBgFo2AUjAIaASVlFTysIQtU1XBIqGtoInO1tOngGFxARxcfa6gCNVVcMnr6yDxtLZxGGBjQmmVoZMyAmzVEgYmpGS4pcwsDBMfSyhpZzsbWDs7msndwpDHLydkFahk21hAF3K5gys2d2cPTC1VKyNsHwfH1Q5HzN1IOCISyqTNyg58VFAyzGRtrSALekFAQFRYeERkVHYMmGRsHZ8YnJKLKJSWnpKal09p5cJCRmYWHNSRBdg44WeXm5TMwFBQWoUoW85TAmKVl5Rh6KyqrqmnsPASoqcXHGoqgrh5MNTSCSJYmNNnmFhirtQ1dp1J7R6duFy3dhgK6e/CxhiCQ6u0DUf2FE0DUxElo0pOnQBlTp01HlcmYMXPW7Dm0dh4SmDtvPh7WEAQLFi4C04shqX4JmvTSZcshjBUrV6HKrF7TjWjaUbtJiRVUrsXHGnpg3XoIvQFS1m9El9+0GUJv2YomsW07gk3tJiXDDglBDBbDzl278bCGHNjDsxfC2Me8v+DAwQgMBYfsBUDU4SNH8ZhC7YYklglCIDh2/AQe1uADJ0+BwUkc0qfPwFhIE6zI4Oy58yDqwkXizKMSwJwgBIHVl/CxBh24fAUMruKQvnadkAE3boLIW7eJM486YHhMEN65Cwb3Bqt5WMHoBCE+AADXpsccvRo2gAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.182,3.513;4.blob,1.1,1844.iVBORw0KGgoAAAANSUhEUgAAAiIAAAASCAMAAABRj0WcAAACeVBMVEUAAAABAQECAgIqKio+Pj4aGho0NDQREREvLy8NDQ0FBQUKCgpHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkosLCwGBgZ3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRaoICAgxMTEXFxfIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEDAwMrARXRAAACp0lEQVRoge2a5XMTQRiHN8lBOSpBGqS0QHGKE6xAW6TF3d0Kxb140RZ3WtyKOxR3K+7yF9HsZclybC9rmdvp5Pmw+9yb2Z3fO/NOvtwBEKbs4HA6HYSaHVHCqIlL08qZa+U1LcKOLGGUxFVBr2iuRUbIGJGoaPE7bCfGXclklatU9VdojXQLTqynmqlSvUZNsdhSccURirXMI4L3WwrxCSVL7Tp1/xaio8SSKUGMO9Fs9eqjH2mNdAtGrKeBudSwEW/gEEA3Ini/pZAQ71sbN0HPTZOaiSVTgubuFmZr2ao1YDPSLRhtPG2Rer3G3q69Vzi6NChHBOuXTIeO8B+0U3Jnf6FLV+FsCpCS+p+ldevOaKRbMHr0RJae0as3lD59+4nllgnliGD9kuk/AG4DBw02nocMHSacTVGGj2A1WkaOGp1u2JixvOnkQzkiwfodN36CIRMnGfvkKVNFo6nKtMzpjMbOjKyZ3GdlQzsiQfqdNXuOIXPnzYf7goXi2VRl0WJWY2fJUv6zkqEdkSD9Zi9DtnyFb125arVoMnVZk8Nq7Kxdx39WMtQjYtnv+tQNSDdu8q25eZtFk6nLlq3bGI2d7Tt2cp+VDPWIWPa7a/cepHv37S9ZD+RLyKYsBQdZjZ1Dh/nPyoV6RCz7PXI04MeOA3Ai6aRwMoU5dbqQ0Sg54zmL9FzGec50sqEfEYt+L2ReDDxcunwFXL0mnkxhrt+4yWiU3MoqQnr7zl2RiBKxGhGHE+J/E2z0W3gPkoYbuP8AO/zw0WPw5Gmoc9vLs+esRseLlwF/9Zovm3RccYSPAYqNEXmjQd76y7Dfd27Ie9zAh4/48U+fQ566jPLl6ze7IxCw+hggUof88yb4+w9IIm5hJFH085fdEQgU64SPAXT9t9ClfwDesbxhwwLjjwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.535;4.blob,1.1,3876.iVBORw0KGgoAAAANSUhEUgAAAP8AAACCCAIAAAAG1omCAAAABmJLR0QA/wD/AP+gvaeTAAALEElEQVR4nO3db0wb5x0H8MfnPxhjjDHgBkOdxAYHkpBYNBsoGkmjtKMzKG2qplGzJt2SqZX6qlJVReq0V50qLaq2qFVbZS+6yWsjNW2arJtaIhrRsEhJ1T+ZSCJWEwhIGDDg/IFgE+M/e+HKdQ2cz/ZzZz++70e8QHdw+Sn5xjqf77kvIcAU51Hn09eepnIotV59ZOGI1WXN/VAUp5ISl+8BIDOOgw7PPzxUDrV0b+nmmZuOQ47cD0VxKikh/Sypbq02NhuH3h+idUCP27N2z1qNQVNQU0kG6WeJ45Bjom9iwbtA64De897QnZBtn62gppIM0s8MTsU1PNPgcdM8wYhFYkMfDOVy8iPGVJJB+plR31mvLlOPnB5J3qjgFEqtMvmLU3MC98Z53J7ajtryteUUp2KFKt8DgFCOQ46bZ26GF8LJG60u62P/eix5y+g/R889cU7I3rhbV2/5B/yNBxu/++N3tKZiBdLPBk2FZt2edT17elK2T/5n8pOffZK85f7t+wL3Jnjcno0vbMwi/atNBUBT0++anh1/VsEpxDi4bo3u+fDz5jZzQU0lAZz3s8FxyHHj5I1YNCbGwQNTgfHe8Sze+4o6lQSQfgaUry+v/UWtqNdVPG6Pfb+d02SQBwmmEhvSz4DGZxtn/zt769ot8f6I0bOjSo0yo7seJJhKbEg/AyS4oB4OhodPDTceaBT+K+xe5gcAAAAAABlR8u+O3/sai7B6QVcONBoDISQWi+R7EPakueZjaDBsfWWrqhQ3RBQug6Fh69ZXVKrSfA/CnjSv/YHJgMFuMG8zz3wzI81AkKlAYNJgsJvN22Zmvsn3LIxJf71/5OORyo2Vps0mCaaB7IyMfFxZudFk2pzvQRiT5rWfEBINRbU1WtNmk++yT4KBIAvRaEirrTGZNvt8l/M9C0sEfdY7++2sscmY4+pPEMhltX7mciVvaWtru3DhQjAY9Pl8b731ll6vX/5bs7PfGo1N8XfA0rO6rK7PXOl/rsAIejt7d/guIaTCUYGzf/GoOG6/3X7U6Wwxmb6ank5s37BhQ19fX39//969ey0WyxtvvGGz2bq6ulJ+/e7dYUJIRYWD1tk/p+YUytRbl6OhaPIdnZyKs++3O486TS2m6a+mCWsEpT+yGAnNhXRrdGJPI0+lKtWRpqaXt2yp1ek+Ghl5ob//ku/Hk8zXXnttfHy8u7s7HA4TQrxeb09Pz65du/r6+pIPEokshkJzOt0aWlM9/LeHG3+dettP777ekY9HCCGqUlXTkaYtL2/R1epGPhrpf6Hfd4m9E2OhlzLDgbC6XC3qKLL13s6dT9lsr1+58ua1a/7FxZS9Lpfr+PHj8egTQs6dOzc7O9vV1ZWSfkJIOBxQq7Ncnrvc13/4+urxqykb54bn4t/sfG+n7SnbldevXHvz2qI/dWZWCE1/LBpbviAaqPhwePihmpqXWlqqtdoTg4MDfn9iV2lpaVlZ2dTUVPLPT0xMVFdXLz9OLBblOGqvUAvjC4HJQMrGaCga/2b4w+Gah2paXmrRVmsHTwz6B/zLDsAAoelXapRL95ZEHUW2zo6Ofjo29uT69Uedzhc3bbrk871z/fr7Q0OEkGAwGAgE1qz5yfmMxWL54osvlh9HqdQsLd2jNRX/mc/o2dGxT8fWP7needS56cVNvku+6+9cZ/GBVukpOEXH2x2WXZZ8D1L8dtfV9XZ3zx8+nNhy+vRpj8ejUv3wOtXZ2RmLxR555JGUX1QouI6Oty2WXbQmKV9fXrOtJuWrpLJk+U/W7a7r7u0+PH94+a5iUGYp23Fih/7BFS60gRhaTD9+ttjc3BwMBj///PPOzs7nnnvO7/f39KzwDIWyMsuOHSf0+gclHPMnTC1F+nlo3e669mPthNWV+8zbvn37xYsXg8HgzMzMu+++azCscFG/rm53e/sxgn8k6lpfbbV2UXjONYintfVVqzX1QwDgl/4yTpWzSlOh8Z73SjANZKeqyqnRVHi95/M9SHHR1eraj7VXNlfmexBYlU5X295+rLKyOd+DFB1jk7Fo380UC6OxyWRqyfcUAMCuUjPWBwFLckzsj+96639Zv+E3G3KeB0Ai1BJb2Vy5/S/btdVaCscCqig2K/LLqHdRsqlWQyWxHCFEwSkaDjSM/XtscZbVm/WKGMVmRX4Z9S5KNtWKaCWWI4RUba0qMZZMXZxK+9OQF1SaFfll0bsowVSroZVYjhBi/rn59uDtyH08EKZAUWlW5JdF76IEU62GVmI5QkhFY0Vi1QIUoNybFfll17so9lQ8aCWWU5ep1eXq4HQw92OBeHJsVuSXde+iqFOthmJiOZVeRQgJB5ns3JOPRLOiGAfPundR1KlWQzGxXHy9Ip7UWfg8bo/jIP3TjHjvYtY9FCJNxYNiYrn4/3hlSfrHWkF+3Th5w2A3ZNGsyM+2z7boX8z6Hl6RpuJBMbFcaD4Ui8RWXLEGBSXrZkV+OfYuijQVD4qJ5WLh2PzYfFl9We7HArFl0azIj0rvIvWp+FFMLEcIuX39duVG3MHPgOXNipyGU2qVKV+JZ7Dx7yWUehez6HvMEa3EqgghkxcnrS6rwW7AVf8Cl2hWHD07Gt/yeP/jy8+5v/ztl9///fu0ewkhDc80DP51kPpUYqOV2B9eBmz7bHqrfuDPAwTXfphibDKq9alPsJq/OR9/vhr/XqbRTKyyRNn6+9Z1T6zLfSwACVBOrFqvtv4KD24AZiCxANlDZyPISEqe0dkIMpKS5zTpn/1udsG7gPW+BUuvVy8sHHHlb4UhW1LyjM5Gtt27t3TmzM1DeVphyKLkPKdP/9L80vTX0/WP1os/GGTD7fbs2bPWgE5BYZLzjM5G5p0/771zJ7QvHysMGZXIs6D0JzobRZ4KshGJxD74YAgnP8Il8iwo/ehsLHBut6ejo3attCsM2ZXIs9C7UtHZWMiuXr01MOA/KO0KQ6bF8yw0/ehsLHBut+egtCsMmRbPs9BAo7OxwJ08ecNuN7RJuMKQafE8C0q/glOUGEvu374v9kyQtampQG/vON77CpHIs6D069boFCrF3A2sfSlobrdn/367RqoVhuxK5FnQ35Sx2Ri6G7o3Tq0JGcRw9uyoRqPEXQ9pJfIsKP0PtD0wcWECy74KXDAYPnVq+MABXPlJI4M8Vzmr2v/UrtTigT9QDDLIMzoboZhklmd0NkIxQZ4BVoLORmALf2LT5hmdjcAq/sRmkGd0NgJb+BMrMM/obAT28CdWeJ7R2Qjs4U+s8DyjsxHYw59Y4XlGZyOwhz+xwvOMzkZgDH9iM8ozOhuBMfyJzSjP6GwExvAnNqM8o7MRGMOf2IzyjM5GYAx/YjPKMzobgTH8ic0oz+hsBPbwJ1Z4njlCyOTFSW2V1mA3UJsOQEz8iRWeZyUhJLIYUelU5jaz77KP8pgAIuBPrPA8//DWeG54zrLDUmIqufO/O/SHBaCNP7EZ5xkNeMAW/sQizwB80NkIMoLORpCvlDynee0PTAYMdoN5m3nmmxnxZwMQV0qe0dkI8pKc5/Q3A0VDUW2N1rTZhE8DoAgk5xmdjSA76GwE+UJnI8gXOhtB1tDZCPKFzkaQL3Q2gkyhsxHkC52NIF/obAT5SuQ5ffqrnFWaCo33vFeCsQDElkGe0dkIxQSdjSBfyDPAStDZCGxBZyPIFDobQabQ2Qgyhc5GkC90NoJ8obMR5AudjSBT6GwE+UJnI8gXOhtBvtDZCPKFzkaQL3Q2gqyhsxHkC52NIF/obARZQ2cjyFrunY3/B6z48VF3WPejAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492330147;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.772,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.215,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.234,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.751,2.96;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADDklEQVRYheWY91vTQBjHT6pY0GrVOgAHxrpwI4qCiDJEwW2lriKC4ioqKgquojhwK+LeC/eef55JmjSXu0vuzbV9Hn38/JBe7977viHQ5EMR4tMDUGNPiktgU89ecfdN7e3mVKSlkzN9+npAdbb0688pSE8jJrwDBoLq7BnkG2y7PmToMGImw5cJquOQNdx2ecRIcmZUNqyOw2hpDDHjx8Zjx40nN0yYyEhh1HHIkSaZu02eMnWa/DJ9hvImdyb5B58nZTBS6Dous2YrXY1u+XPmFhTOK5pfrCwuWEiWl0iljBC6jktZuXxYZHSrQGjxksqqCmXNvXQZWb5cWkFnMOq4rFwlH1bj3eQff01AfV1bHSTL10mMDwCjjsv6DfpI72awcRNVHqrZTGcw6nh4a7dYrnnq6unJreWwOg710jbLtYbtjMkdO2F1NKFdKl71ze6w9a+mkXVH3FOzF1RHs09SaVLf7G8A7cE4cLDZ6ZYohw6r5CnjltYcp9tdR46K9cU4Fnb+wUPHT8TdtzQ37oh/CiHPSQBWngOylkhtqvOOWrKF58Cspa2afHbz0ZLZnuPYWsDEkpme49hawMSSac8RsRYoRrLuOTgC1gIES1Y9x4yAtQDBksuo56mItcDAk1XPMSFiLTDwZMNzdASsBQiWTHuOiLXAwJNpzwFaCxTMbvBk2nOA1gIFsxs82bnnOAS3GwMBz0kEQp6TAP43z/mLyPRFkhmveY7/5CltIjZqP53MvprnnKk8q33DEBud60jiR0v3nMLzVReQeeQNX0xeX81zApcuX7lKjNC16zYbY/+TdUbvu84embrn3Mj3dxUEzCN0s+6W1b7gbV/rHeW0U1B79L4rK3RQPYFOSF/dc+7eQ/cfPDSPEHr02Grfk6eRZx3PX7zsdiFP9L77CqHX6glkQ/pqnlP85i1CXUWmkcy791b7PsiPlY+N0qcm/Dq71RP4DGjLMaiUL1/tlptLvslH4zrD4RnUd/q7EwrjOsPhGdSPnyEncVC4BvWruyUZffkGlfU7GX3tDOoPahWve1TzKNEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,3.196;4.blob,1.1,1492.iVBORw0KGgoAAAANSUhEUgAAAIkAAAAfCAMAAADkxR6lAAACDVBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAoDAQHmXV1jKCgQJydj9vZKuLgdSEgoYmJg7u5JtbWLizjBwU4HBwPX11fb21gEAgSBNIGDNYOLODjBTk5FqqpY2toCBAQdR0dn//8aQUEtLRL+/mcfHw0tEhL+Z2cfDQ1j9PQ1hIRf6+s5jIzQ0FR8fDLQVFR8MjIECQksbGxU0dFBoKByci7Z2VhyLi7ZWFhj9fU5jY0YGAr8/GY3NxYYCgr8ZmY3FhZGra0bRES3t0qVlTy3SkqVPDwRKSlKt7cmX19g7e1ZWSQGBgKMjDn//2cICANUIlSZPpkFAgVZJCTsX18GAgIXOjpPxMQ9l5cGDg4JCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQIJBATyYmJQICCcnD+qqkWsrEXY2FdnKmeCNYKcPz+qRUUPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAEMDAX19WNKSh53dzDU1FakpEKoqERGRhz29mMODgYIAwgyMhT9/WYbGwu8vEzp6V5eXiZLSx709GOpqUSjo0L392RFRRxkZCjk5FwCAgHCwk6KijiZmT4FBQIhIQ0sLBKOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC2SkjtCQhvH5M5BAAACDElEQVRYhe2WZ1fTYBiGX6yIFGQjAlI2QqEiUJC995RdlqAIlTJlKUP2BlH23jgA4TcKpE1C+rxJTkjlC9eH9Do5fZ7cJ+17zo0QMnogeWj8CGEweWyqU6mZ+RPc17iwsLSyvhYbWzvtLT2zf+rwzNHJGbvjuYvOZK5uUqFJ3D08LQjz8tbdY5rPC1+E/OT+uB0BipdCHw8S+CoIY8EhV64MxY6GvRY1CQqPgC1SHnWl0THYydg4cZPEJ2AskXgnSdjJ5JRUUZOkpWfAlkn8T7Lwo9k5oiZBuXmwvZHk+xUUOrBMFpkVE1JSqmIIB2XlFYBWVr0F7PJSXSNRvnvPsq/2Qx0h9Qo1Qzj42KABtLGpGTBeC1taic+2T4ghHLR3QIo6uwDjt5Gg+/MXhnDQ09sHqAio+78yhAPNwCCg99zznxkaHmExLKNj4kcZn2AzHGOj4ieZnJpmMYRmZoCh2blv+I3gBA+oRgkZ1RRvUD+PXwhP8IFqlJBRTZGG+vsP/D5wghdUo4QMZGFRcAdmhWqUkEEsLRskCK1RQgbQvbJqmCRUo4QMYG19wzBJaI0SMn02t0hVqfRN6ClGtEYJGdkU+7d3CNlV7OkmZfsHh0wTfoppjRIysikeHWt/k5+/yEn17z8ypgk/xYhqlJCRTfHkVCtnfwU/6DaQTbH2/OJOApCQTXFjll/LvOYfo7CGaOH6uEsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.215;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.229;4.blob,1.1,2456.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.364;4.blob,1.1,1228.iVBORw0KGgoAAAANSUhEUgAAADAAAAAzCAMAAADmSHsbAAAB2lBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYpESmPOo8UCBQgICD///8bGxsCAQKDNYNDG0MTExMxFDGTPJMHAwciIiIFBQVnKmdqK2ojIyP39/c0NIExMXkHBxKMOYxHHUctLW88PJQPDyQLBQuZPpkqKmlSUstmZv1HR7AZGT4XCRcoECgTEy4dHUgcCxwlDyUoKGRRUchlZfsLCxsRBxEsEiw/P5thYfE5OY0MDB4EAQSWPZY9GT1aWuB3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkkNDSB3dzDU1FYICBMODiICAgUyMhT9/WYbGwsODiNkZPeQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0zNWVfAAABeElEQVRIiWNggANGJmYG0gALK4ka2Ng5SNPAycVNohU8vCRq4OMXIFGHoBCJGoRFSNQgKiZOjDIORGhKSBKhXkpaRhbGlpOWB9MKikq4NSirqErB2GrqGmBak1+LGLcBgbYOmNLVI1I9FOgbGJKmQcvImDQN9AEmJKo3NSNNvbmFJYRhZW1DjHpbO3sGmAYHYjQ4OjlDWS7WrsRocHOHsTw8IbSXtw8+Db5+6CL+7EwBgTjVBwU7Yojph4SGhUfg0BAZHIVNOFpCMQa7htjgOExBxviERNYk7BqSg1PQhfhSDdLSM3C4iCEzKxtdSDtHGF+5mJuHLpKPPwsW2OGVxgSFWUUk6iguKSVNg3NZOYlWVFSSqGFAQZUiUgKprkETQ5GFCdUiODXVaGIoshBQp1gPZzc0NqGJIctCQXMLgt3ahi6GLIsJ2js68Uljgq7uHtI09PaRpr5/wkTSNEyaPIU0DVOnkaZ++oyZpGmYNZs09Qxz5hKhCACcFD+WRfp1OAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.360,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.489;4.blob,1.1,3172.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.571;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAflBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIxMTEYGBj851AeAAAAZ0lEQVQoke3PuRaCUBAD0CGyiOB74MImIIoI/P8PkqkobLGjuV2SExEHgBxcj8IP1GN4oohi9WyEWpNQpBf1elPvkZrltCgr+jA1bdon7V7MvnsL+bQDO7+jrgC/TvO/XFf2j5t+XAAiexW/VhevlAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492330246;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.762,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.193,2.38,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.215,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.741,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADBElEQVRYheWY91vTQBiAz1axoNWqdQCiGOvCjSgKIrJEwS1SVxFBcRUVFQVXVURxK+LeC/eef57phTbXu0vuy7V5Hn18f0gud98IoUneFiExvQAx5jicEkm9+8TdN6mvSxCRnELP9OvvBsWZMmCgICAlmZrwDBoMijNniHeo6fqw4SOomVRvGihOQPpI0+WMUfTM6ExYnIAxylhqxkeMx42fQCdMnMSpwokTkKVMju02Zeq06epuxszwQfYs+gOfo6RyqrBxQmbPCXfVu+XOnZeXP79gQWF4cWERHV6slHCKsHFCSsvUzSK9WzlCi5dUVJaH11xLl9Hhy5UVbA1OnJCVq9TNarKb+uevqcL7tdV+OnydwrkBOHFC1m+IjCLddDZuYsIDNZvZGpw4EZ7aLYZr7rp6dnJrGSxOQL2yzXCtYTtncsdOWBxLYBfGgw92B43/NY28J+Kemr2gOJZ9CqYJH+xvAOUQHDjYbDVF49BhTE543NKaZTXdeeSoXF+CY0HrNx46fiLuviXZcZf4p5DynARg5DkgawnVJlnv2FPZwHNg1nKymn53i+mpzPccy9YCJlqZ6zmWrQVMtDLrOTLWAkWvHPEcEglrAUJUxp4Ti4S1ACEqlzLvUxlrgUFWxp4Tg4y1wCAr654TQcJagBCVWc+RsRYYZGXWc4DWAoWwG7Iy6zlAa4FC2A1Z2brnWIS0Gx0Jz0kEUp6TAP43z/mLSPOG7CzPGJTv1Glt0HbGzr6MQbVXnNV+azjXYeOtxRpU/vnKC3jgCV60ry9jUFWXLl+5qg2vXTdJjH4n69Seu9ZemaxB3cj1deVp3/dv1t0yyvPf9rbeUfcZDtSmPXdVhfbjE+iE9GUN6u49dP/BQ2386LFR3pOnoWcdz1+87HYit/bcfYXQa3wCmZC+jEEVvnmLUFeBdvDuvVHeB/W18rFR+dREXmcXPoHPgLYCg3J8+Wq23Fz8Td3q1xmOyKC+s7+dMOjXGY7IoH78DFgpB0VoUL+6W+zoKzao9N929DUzqD/evaE+puwWfAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.460,3.174;4.blob,1.1,1348.iVBORw0KGgoAAAANSUhEUgAAAKYAAAAiCAMAAADid1KLAAABxVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYWNzdOwcFk9/de6ek7k5MFDAwDAQHmXV1jKCgLBATsX1/vYWEQBgYQJydj9vZKuLgdSEgoYmJg7u5JtbWLODjBTk4HAwPXV1fbWFhFqqpY2toCBAQdR0dn//8aQUEtEhL+Z2cfDQ1j9PQ1hIRf6+s5jIzQVFR8MjIECQksbGxU0dFBoKByLi7ZWFhj9fU5jY0YCgr8ZmY3FhZGra0bRES3SkqVPDwRKSlKt7cmX19g7e1ZJCQGAgIXOjpPxMQ9l5cGDg4JBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHwXMvvAAAB6ElEQVRYhWNgoC9gZGKms43kARbWgXYBUYCNnQPO5uDAoxAdcHJx8/DyUd9B2AG/gCCMKSQsIkq0PjFxCUkpaRmauAkbkJWDseQVFIWI1qakrMLAoKqmThM3YQEamlrkaNPWAZG6etR1DB6gb0CGJkM1IxBlbEJlx+AGpmbk6DKHhKYFdd2CB1haWZOhywaSNm2p7hycwM4eykAUSISLJgduR1UnZwmaOQoTuAi7gmlEgURM0eTmzq3r4UlTh6ECL28fMI0okEgqmugGfP0G2gWjYBSMgqEN/AMCqWoeoruBjUU+CAqm2AgUgOhuYGORDUJCw+DssDA8CgmA8HAIjehuYGORDSIio2DM6JjYOHKNiU9ITAIzEN0NbCzyQXIKjJWalh5NrikZmVnxEBaiu4GNRTbIzsml2AxkgOhuYGORD/LyKTYCBSC6G9hYZIOCQoqNQAGI7gY2FtmgqLiEYjOQAaK7gY1FPigto9gIFADvbmBlkQ3KYyogjMqqajQGAVBTW4eFCetuYGMhlCFpIA7UNzRCGE05zWgMAqCltQ0LE9bdwMZCKEPSQCRo74DQnV0MaAwCoLsHGxOpu4HBQihD1kAS6O3rR2MQABMmTsLCJE4HkRqwgObJU9AYBEDb1GlYmMTpALEA39FgQDuMVd0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.196;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.212;4.blob,1.1,3660.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.364;4.blob,1.1,1272.iVBORw0KGgoAAAANSUhEUgAAAEIAAAAzCAMAAAAU9C6+AAAB2lBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxKMOYxHHUctLW88PJQPDyQLBQuZPpkqKmlSUstmZv1HR7AZGT4XCRcoECgTEy4dHUgcCxwlDyUoKGRRUchlZfsRBxEsEiw/P5thYfE5OY0MDB4EAQSWPZY9GT1aWuB3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1Fe8lYAAABmklEQVRIic2VVVcCURSFDyiCHRgI1tiC3YWKgd09dnd3i93d8V9FkMViBsc7nhf2y9lr73u/dR9mnQHgkEBox1UTyV6ERjiIJViEo5Mz+hkurmiEm7sHmuHphUZIvdEIH18/PsclErYDmT8PglwREMh0AEGKYMMMoUL/RoSFR8iZDiAyKtowY9yVPJ5jKVWsYcTF/5vwo4TEJCxCmZyCRdiOUtGEtPRfigwqk4yQlZ1jNLnqPCYin4hQoCkEE6LIsiqmSogQ2tKyH1eurrCsKquICFBdY3K1dcZZ39BIdtWkpmZm0iIWtrbxILTTWlaW0NHZ1d1DjOil+6zF/TJqgBQxSA+xQ8HwyKiI8JsAGKPHmZHbROLk1DQpAGBmdo4Zqeal/P51C4vMZInvGlvW8LzA1srsKpqxtr6BRZRtbqGfsb2DRti4zIvPmtNrV8fVGoN8DqeXbper/ZZ58VlzAHv7BxytQebFZ80BHB5xtSQ6Pjnld4Gts/MLLOLyCku4vrnFIu7uH7CIxycs4fnlFYt4e8cS4OOT4NAXup1D+QglcSEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.516;4.blob,1.1,2520.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAxElEQVQ4je3S1Q7CQBCF4cV9cXcp3uLu8P7vRNKZAU4Ct1x1rv5vK2m2q9RrXG4F4/H6cMEfQAdDYVyIRNEx7QLHdQJvSKbQ6Qw6G0Hn8sBCsQQu6wq4WquDG01gqx3/ZKdmwOVuT/2YPtZgKLTLGI2ZdhXMqnyuXVZI9plqMpWnqWZzsV0LbTGplrrLplrpNZtqo+WnUG13ezbX4bXHVClTTHXcndhc54vsIpX7emNz3R/yhnd9Ged8OedLOefrY/5wvp4fwigsudBbUgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492330350;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.752,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.731,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.810,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.212;4.blob,1.1,3040.iVBORw0KGgoAAAANSUhEUgAAAIoAAABjCAIAAADLrg95AAAABmJLR0QA/wD/AP+gvaeTAAAInUlEQVR4nO3dXUwbRx4A8Nnx+gtjbGwDCcYUiAMGzEcMBpO6JGqCIIE+9JQ2TS51ejQ9noLanqKolaooeUi/JNKKpCpRHirl1JMulRpde+lDmpRWjYCoJJAjlFyOj1LsCLApsTHYLOu9B+4qsNeLbdbrDcxPeYj2vzsz6I+H8czuLABcOXmyfGDgRc6q2xggZzW9/HL+5cv/5qw6JAomk4Yk/6zVytgtViKQSASSzRONl48+2vntt03slikWiNtq2s7tPJeEJ23UKB56EutwHB46pD9xopvdYkmK9BAeiEGSIjdDNF4aG7Pn5l6Vybj4VdhguBga2Gz5X3456vUucVAXEh2FQrSwcKyuLivRDUHoHDtmmJg4AiGW6IY8keLeudls+Z9//p9AgAp3gkQikEgEsUXXg59DZ/YH1gcO5HV01AqFNJnOzZUHAi1GoyrctWKxoK2t5ty5nUlJNAMH5igA4EDegY7aDiEURhvlz9CZOcrCaApCjKIASdJ8Po4c2d7X5xwYmAl3LUlSHg8BIUZ7OXMUAAAxSAEq3DCUIcrPoXNcBtYtLUVnzphpQ4ODL77+eglrNYVWXdRyxnwmtugTYb2fHqkULy5OvXp1jDZaVPT3dZbPVDUuLU4tvjp2NYboZgEhZjJpsESMyyAGTRoTBujrZo4iCLLRrfcrRYooBQDA6RTeZrLer6X6FP2JshNSXMpKa5AgEaUnJyeHoiitVhsauuO8Y/faXyl4heV2RcBoVF248IzJpOG+an5ZTo9araaNyoXydmu7UWXkuFUAgLIy9fvvV6ekiLivmkfy8vIoihIK6edOAAC2fNsbpW9w2aR448mcW3DnZjSqjh8P/hxgGObz+QiCCFdor7PXoDQsDxOeLCqV0Wg8HnRQLBCfrTr7bvW74WbGOIv+b9YAQsxsTquv12m1stFRT9Blw8PDUinTH//hx8MAgHxF/k/TPzGcxg0ME2BY8K9dILAEALXiHJiWZtbp6mUyrcczGnQyf+bcMKEQWq1b6uqyFApRb6+zs9MxMuJm/PHpfWj58PtH33/9y9cxXMsug6E5Pb066ODgYIfTeQcAAKFwyxZrVladSKRwOnsdjk63eyQRzYwIfvRoQUWF5tq18Zs3HV5v2O5rTfNL83KhnMWWxWxs7B92+42ggwsL08v/KSg4qtFUjI9fczhuEoSX89ZFRxAIUDk58sLCVJkMn531u90xZmjX1l1uwt3v6me3fTEgST9BzBGEZ+U/klxcjlJUQC7PSU0txHGZ3z9LELF0FZzB+/pc/f2uHTs0DQ263bszR0bcnZ2Onp6paAsSCURzxFw8mhitgoKjDJ2by9XncvVrNDt0uobMzN1u94jD0Tk11ZOIlq5t1YSuwaBsaNDl5aW0tt6KqhSIwXZr+xfDX3zn+I7V5sVCItEIhcG3oy4sTC8tzQcdVCoNOl1DSkrerVutwYUIJAAAH+mjryJBUQAAiOFW20xZZkdthy5ZF+2FfCCTBc+G8Hox226P+g9mobLw8eLjibmJaC/kA6/XHnSEPwNrdrxtersxu5HNEhEAACs3UpWryxUixY2QsSySeFuTtn5g+aAwtTDRDUHoGJSGElUc78VBEARBNinmZeNwUbFY0N5uZbjBOuaSI4qqjBeeuWDSmBhqBwDU1+tOnarkSTS0zRENrAcGZi5eHDx4cBvtsnG4qN9P3r3rrKnJYL3kiKIzAxcHLx7cdpB5kdBiyejunuRJNMI2s6aoKPX8eWucngBZv+zs5E8/rVUqxbyKrhTf53uGhmbn55cqKtLiWkvMLJaMBw9mZ2f9vIquFN/0BAJUT88Uc/+WKBBiVVXpXV30/U+iosEnR3LSenR3T+r1CrWa860U1lJcnCoSwbt3nbyKBol7eux2r93ura5Oj3dF0bJYMvr6XH4//dxwoqJBuHhwvqtr0mLhV/8mleJlZepwPUyioqG4SM/t21NpaZLcXF7cKLKsokLj9RJDQ7/xKhqKi/S43Ys///wbrz5AFkvG7dvTVJjHxRMVDcXRhmFdXVNmcxqO8+JZNY1GotcrwvUwiYrS4ig9fX1OgQAyT/Bwpro6fWJizuGgX7NPVJQWR+khiEBv73RVFS/Gb2Yz09eOREURBEEQBEEQBEEQBEEQBEEQBEEQBOEWLxb/NwYRhDBkS2IiECApas1oOCg9rOl+/vnq9ODV+j91dn724MGa0XBQelhjUCqTQ3YkHPV4XD7fmlEEQRAEQRCEbxg2bKfF3Tuzkd/5Ih5Mo/RwCkIIAHC7I93AFKVnlaeee063bx8ui2g/yP3Z2df274+q/HAbtp8+XfnWWztUquBH6VF6Vlman3+qsdHy3nv6Q4ekIXMwy3AI/7h9+70XXvjnvn0q8dp7E6wUbsP2mRn/O++Yfv31yPnzVr1e8ftxNKkTDJdK06uqMp5+Wp6d7bp3b+L69ccPHy6HpDj+qsHwl9LSrUlJV0ZGPrl/v2uStQdCFArR4cP65maDyaT56qtf2tru/fDDI7YK34BkWVnG1tbajg5VcfHykb/t2UO89trpykq1JI77AJSWqr/5Zj9FtTQ06Hi6nUpiCcTijJqanKYmhV7v7O2d6u4mfT4AAElR5vT0vVqtWiKZ8HonFxbYrTc5WWiz5Z86VWm1brlyZeTy5Yeoc1tFptVqn302zWwGFPXoxx/tN274Z1a9Exdi2B9yc0+Wl1empXVNTn5y//5f/9/1rUdJiaq1teSll7YFAtSlS0Mff/yv8XFe7NnOL/k2W9XZs1l79wrW6r72aLXXm5o8zc2s1Hvp0q6xscNvvlm62V8VxUyakYHBKEazJSp2HmYuKFDiOE29qHNjTWzL1cxQelgT23I1M5Qe1qDlagRBEARBkI1EniNvoVpkEb9fDK33JADpi/TlVig9nMIgBgBYdC9GeD5KD7cwQPrIABGI8PT/At3f1MB+PC2UAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,1320.iVBORw0KGgoAAAANSUhEUgAAAE4AAAAzCAMAAAAOyM4wAAAB6VBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxKMOYxHHUctLW88PJQPDyQoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4ICBQEBAoXCRcoECgTEy4dHUgcCxwlDyUoKGRRUchlZfsRBxEsEiw/P5thYfE5OY0MDB4EAQSWPZY9GT1aWuB3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC3DSN/3AAABr0lEQVRIid2WVU8DURBGh2LFWtxtcXeH4u7uxd3dHVrc3eWXAltIw+6yubudB8J5mS8zc0/2Js1NAQjRk+iTrhJhYIiqMzKWYupMTM0wdWBugaqTyS1RfVbWqDobW1Sdnb2D2KNSKTuBo5NIm7OLqxszAbi7eNDVk/ISpvP28XVmJgA//wC6BsqDRH7mT4JD6BIahmL7IjwiElMXFBWNqfv7xKDaYuMIluKpBDJbYlKyJqQoUvl0aUS29IxM+NZl/b6WTeUQ6XLz8r9SgaLw97WiYiIblJR+p7JyTa2orNIEkxwaQT/M6hpmp9ZYUlf/GRoaaZoE2JqVuaxeeEtrW3sHQKclTZcAXbeyh6vd60j1iblsv3KA3dQbHBo2TBBz2RHlKLMlG4sYn5gEUZedmp5htoJnbcT/R5ibZ3YWdHmeFzN0OMxmaXoZ1beyuoapy1/fwNTB5haq7h+gfdy50gcqNd+UrUvjSR+oVXxTJtrHnSsBbO/s8kxZaB93rgSwt883FcrB4ZH4w2yOT04xdWfnmLaLyytM3fXNLabu7h7T9vD4hKl7fsG0wesbwdI7mjpQ/ob6Q6sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.350,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.489;4.blob,1.1,3060.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;3.end,1.1;4.sync,10.6492330452;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.742,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.721,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.174;4.blob,1.1,4760.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.489;4.blob,1.1,1472.iVBORw0KGgoAAAANSUhEUgAAADkAAAAqCAMAAAA+hAOCAAACH1BMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0BAQECAgI0NDQ+Pj4REREKCgoMDAX19WNKSh4GBgakpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUICAgNDQ0DAwNieUD+AAAB7ElEQVRIiWNggANGJjBgRmYRB1hYwYANmUUcYOcAA05k1iigGHBx45Dg4eVD5vILoCvg5sJlpqAQMk+AH01aWEQUl04xcQkER1JKGk1aRhZMyckrKCopo0oxq6giOGrqaBo1NLVAlLaOrp6+gSGapJExnGliaoYmaW5hCaKsrG0YGGzt7FElHRydYExnF1c0nW7uYMrDE0R6eaPJ+vjCWH7+aFIBgUEgKtguBESFhqFJh0dAGZFR0WhSMbFxYDoeYmcCmnRiUjKEkZKahiaVngGhMyH+zEKTZsjOgdC5eWgS+Y4FEEahQpFtcYkuukaG0jJGEFVeUYkmUVUNY9XUKnjV1WPobGhsAlHNLegSrW0YatFAeweI7OwipG7Yge6eHjJ19vb19ZOnc0I/SCdaeYENgMuaiZMmI0SmgO1ELS+wAUhZM3Uauk6U8gIbgJY102fMRNOJUl5gA9CyZtbsOWg6kcsLbABa1jAwzJ2HrhOpvMAGoGUNA8P8igVoOpHKC2wAWtYAwcJF6Drh5QU2AC1rQGDxEnSd8PICG4CVNUCwdNlyNJ3w8gIbgJU1ILBiJbpOaHmBDcDLGhBYtXoNmk5IeYG1bYIoa4Bg7br1aDoh5QXWtglqWbNhI5jq3oSaV4hvm1CQyzZv3sIAADtZca3djhVqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.152,3.516;4.blob,1.1,828.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABKVBMVEUAAABHHUd/NH8eDB6YPpgQBxBWI1ZxLnECAQKMOYw4FzgtEi2SO5IHAwdlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUb6Id3AAAA/klEQVQ4je3P2VLCMBQG4EMBlUVFRVYtAoILiuygIjsIKCC44obw/g8BbXKTtqkzZ7jkv8k5f+bLTACYGATARTDgnNFkxsG1dZzbsFhx0GbfxMGtbZxz7Ozi4J5zHwddbpzzmLw46PPjHBwcIuEqy40Y4FwcBUO6IiDyngwfa/dERKInPHh6dq5VUxG74Dm4jF9p1UQkkikuhHRGo6Qim8tLR+Fayg0zAdwW79SQilJZ3ipVKTVmWqTeUEMimq17eWu2pXSYaZHug8pR8dgr8L8I0B88KSsqhiM9B/D8omyIeC2+6cP3jzFbUPH5pe/g++eXLaiY/P0DYTpjdyLmj4Ej2/Bx1LYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,2940.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.609;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAW0lEQVQYlcXPSRaCQBAD0CIgU2M3M6IyI97/hqQuAZu/S/Ii4gEQP3hQhJEaJymFydSnFepsTlGUalWrjVHbjr76N/3YLx3Gic4Ls+vmIPv4Y+fx1xXgHi/8eALt0Ag5Zzf4EQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.609;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAAA4CAMAAAACVcKkAAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAW0lEQVQYlcXPSRaCQBAD0CIgU2M3M6IyI97/hqQuAZu/S/Ii4gEQP3hQhJEaJymFydSnFepsTlGUalWrjVHbjr76N/3YLx3Gic4Ls+vmIPv4Y+fx1xXgHi/8eALt0Ag5Zzf4EQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.628;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAPUAAAASCAMAAAC0LmhtAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAArklEQVRYheWPRxKCQAAEwYiIac0YMML/f6i1s1VTfmDmYJ/62J1lX/LsH8h/rde3lQjhZbTBcGSMUcHLaONiYs3RwEtYOa2cOSJ4CZvNnTUqeAlbLH0tOngZbRVKY4wKXsLWYePMEcFL2DbsnDkieAnbh4MzRwQvYcf65MwRwctk54uxRgYvYdfC16KDl7CmvtladPAy2f3xtMXo4CWser2dOSJ4maztjDUyeNl2Hz7LCm88efVLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492330558;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.732,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.291,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.711,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.212;4.blob,1.1,1788.iVBORw0KGgoAAAANSUhEUgAAAGEAAAA1CAMAAABmx3VwAAACalBMVEUAAAB3dzDU1FYMDAX19WNKSh6kpEKoqEQyMhT9/WYbGwtGRhz29mMODgaQkDq8vEwDAwHm5l1jYygEBALp6V5eXiaLizjBwU5LSx709GMLCwQtLRL+/mcfHw2pqUSjo0LQ0FR8fDIPDwb392RFRRxyci7Z2VhkZCjk5FwCAgEYGAr8/GY3NxbCwk6KijgICAO3t0qVlTxUVCKZmT4FBQIhIQ0sLBIHBwOOjjmPjzoKCgRZWSTs7F8GBgJWViOYmD59fTLOzlOBgTSDgzUJCQTy8mJQUCBnZyqCgjXW1lZwcC2cnD+qqkWSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2mVlT0TExMNBQ2TPJMsEiwvLxOJiTciIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG1+fjN4eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjZiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTscHAt/M38TEzA1NYM7O5EkJFkLCxx6ejGFNoVSIVIxMXowMHcoKBACAQKVPZVBGkEQECgtLXA7O5IaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2Tkzz5+WVlZSlPTyAXFwkqKhGUlDw7Oxjv72EQEAZTUyJ0dC/X11fb21gTEwh9fTNERBxubiw1NRYEBAGMjDn//2dmZimsrEXY2Ffz82KBVjSwAAACjUlEQVRYhWNgIAwYmQgqYWZhxcMiCJgYCathY8fHIgA4OLkIK+Lm4cXDIgD4+IlQJCAohIeFHwiLiBKjTEwcHwsvkJCUIkaZtIwsHhZeICdPlEMYFBTxsfAAJWUV4mxQVcPHwgPUNTSJs0FLWwcPCw/Q1YMz9fUxWUjAwBAfCx0YGZtAGKYyZjAxcwtLK3QWMrC2scXDQgd29tCwcXCEiwk7OZujs5CBi6sbHhY6cPeAMjy9cKjAArx98LHQnOPrR7zBZAFNDn8a2zAcQEAgrW0ICg6hjcGhYeFQVkQkcTrMojjwK0CrgUPDoqGsmNg44qyIT8Bfj6HVwIlhSTBmcgpxNhAA8BrYLBVMpaXDpTIyAygwOCsbyoDUwJo6Oca56GryMvNJMbKgEAyKQOziktKycogwuAY2qag0rKrG1FNTS4oNdWVgUM/AUNjQ2FTXDBUG18AtrW3t2PR0dJJiQ1c3GPQwMPT29U+AC4Nr4InOk6wnY9EzJZkUGxChNHXa9BkzoaLQGtifY5YxI2ZlN3sOKTYgQomhqH5u2bwSsCiiBp7v5YuuZcHCRaTYgAglEFi8ZCmYRqqBGTDajcsyl5NiAzpYASKQamAsYOWq1ZTYAAZINTAWsGYtxRbgr4HXrc+j3AZ8YMOqjbS1gGHTZhpbMArwAUSdCGOZbzHDI4u9FmXdaoTbCkSdCGNVbcMni70W3a6xA7cVGGDnLmwNeWyAl8iOJzrQ1NtNnEIpmz17ybNi337i1JkfOEhUjxITcNkfIk8j8eAw0aMT5IIjHoTVUAZ4W01pbcVRa1rbcMziODHKTpwkNudgAJNJE4lRxicjTK4NDKKniFF1+gzZFhAHlM4epbENwkY4uq8AMl+OLTscwesAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.340,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.489;4.blob,1.1,1764.iVBORw0KGgoAAAANSUhEUgAAAXAAAAAXCAMAAAAlQeRbAAACnVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFB9MjLOU1MJBATyYmJQICB9fTLOzlMBAQECAgJFRarWVlZwLS2cPz+qRUXW1lZwcC0xMTE+Pj4XFxcKCgoNDQ0FBQVJnfzmAAACSElEQVRogWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtYQBAKCYCCEzBo4ICyCzhIVg4lgYw1BIC4BBpLIrAEDUtIyGKzhBmTlwEAemTVggFdBEYM1CkbBKBgFo2AUjAKigJKyCh7WEAOqajgk1DU0kbla2nRwDC6go4uPNbSAmiouGT19ZJ62Fk4jDAxozTI0MmbAzRpSwMTUDJeUuYUBgmNpZY0sZ2NrB2dz2Ts40pjl5OwCtQwba0gBblcw5ebO7OHphSol5O2D4Pj6ocj5GykHBELZ1BlBwc8KCobZjI01hABvSCiICguPiIyKjkGTjI2DM+MTElHlkpJTUtPSae08OMjIzMLDGkIgOwechHLz8hkYCgqLUCWLeUpgzNKycgy9FZVV1TR2HgLU1OJjDR1QVw+mGhpBJEsTmmxzC4zV2oauU6m9o1O3i5ZuQwHdPfhYQwZI9faBqP7CCSBq4iQ06clToIyp06ajymTMmDlr9hxaOw8JzJ03Hw9ryIAFCxeB6cWQFL4ETXrpsuUQxoqVq1BlVq/pRjTKqN0YxAoq1+JjDRWwbj2E3gApwzeiy2/aDKG3bEWT2LYdwaZ2Y5Bhh4QgBoth567deFhDBOzh2Qth7GPeX3DgYASGgkP2AiDq8JGjeEyhdhMQyxQbEBw7fgIPa4iAk6dgLKSJSWRw+sxZEHXuPJR/4SIYXKCtszCn2EBg9SV8rKEBLl8hpOLqNRB5/QaUe/MWGNymqatGwhQbseDOXTC4R1NLRqfYMAEAbQCzjuKk2hgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.152,3.513;4.blob,1.1,1628.iVBORw0KGgoAAAANSUhEUgAAAhgAAAASCAMAAAAuXldtAAACRlBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkp3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRarIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEeB03iAAACOklEQVRogWNgGAWjYBSMglEwCigHjEwD7QIqAGYWVjQWGzsHVIRYFjZTkAEnFzeaCA8vH2XOphtA9iUOwC8AJASFhOECTIy0dBGdADOLCDpLVAwmSSwLmylIgJNLHF1IQpJcB9MbIPkSBxDgB5FS0jC+jKwcLR1EJyDPooDOUlRSZiCNhc0UJKDCpQpjqqlBaHUNNYqcTT+A5EvsQFMLXEZq6+hCBfT0aewkugADQwyWkbEJiSxspiABUzMYy9zC0grMsLaxpczddANIvsQO7OzBlIOjE4Tv7OJKYycNGHBzJ5VFLPDw9DKHsLx9yHUdvQEBX/r6+UMYAYEQOig4hMYuGjAQGhZOIot0EBEZRbZe+gICvoyOiYUw4uITwHRiEq1dNHAgOYVUFukgNY18vfQF+H2ZngFjZWaByOycXFo7aOBAXj6pLNJBQSH5eukL8PqyyLAYxiwpBZFl5RU0d9GAgcqqahJZpIOa2jqy9dIX4PVlfUMjjNnU3AIkW9vo4KQBA+0dpLJIB51d5OulL8Dny+4eBLu3j4GhX3YC7R00cGDipMkksogEU7imwpjTLKZT4kQ6Ajy+nBE2E8GZNXsOw9x59HDRgIH5CxaSyCISLIpcDGMuWbqMEifSEUB8OXk5GBghsxhWrERSt2r1Goa16wbIkXQC6zeQyiIObNyEYG/eQp7b6A/AvtzKAgbbkFkM23cgq9u5a2DcN/TB7j17B9oJZIN9+8FABJk1CqgEFh84ONBOoC0AAH1inRhce/3EAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.535;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAMAAAAaPFxiAAACXlBMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi1ezMsgAAAB4ElEQVRIiWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cJEk5ABUfaWdZyF4jAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.552;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.571;4.blob,1.1,1440.iVBORw0KGgoAAAANSUhEUgAAAOIAAAAlCAMAAABoI8XpAAABxVBMVEUAAAAGDgYDBwMUMhQyfDIECQQFDAVj9WMeSh4wdzBW1FYnYScraStCpEJEqEQFDQU8kzwSLBIcRhxj9mNm/WYLGwsmXiYucS4BAwFd5l0oYyg6kDpMvEwSKxI+mT44izhOwU4CBAJe6V4DCAMVNBUSLRJn/mcNHw0eSx5j9GMECwQfTB9U0FREqURCo0I0gTQkWSQuci5Y2VgGDwZk92QcRRwzfzMKGApm/GYWNxYoZChc5FwBAgE2hTYhUiFKt0o8lTxOwk44ijg9lT0aQRpf7F8CBgINIQ0LGgsMHQxi8mIgUCAyfTJTzlMbQxsAAQA/nD9FqkVRyFFn/2cnYCdW1lYtcC0yejIQKBAIEwgTMBM4iTgKGQoRKREJFgkwdjAMDAX19WNKSh46jzoIFAikpEKoqEQ1gzVGRhz29mMODgYUMRQDAwHm5l1jYygqZyoraiuLizjBwU45jDkdRx0tLRL+/mcfHw0FCwXQ0FR8fDIJFwlyci7Z2VgLHAsPJQ8YGAr8/GY3NxYHEQe3t0qVlTwBBAE9lj0ZPRlZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUGEAYOIw4iVSIucy4yezIeSR6LFpOrAAACLElEQVRoge2VaU8TURSGh7KWRQEVAXFYyo5oRVSWKlDZdxekiKCiAgJuiAKCGyKILCIKvxdSPtC55/ZcZvLCpInPh8k7J+d9TjJJU02znzBH6JlNEh4ReaTmqOgY1aIz1vB6iIZJ4uLBQsGccEK1F+s0vqsbJjmZmAQ2Gs3Jp8L4tfDTZ4wDZcM0KWfBQqM5NS2d3zqXIQyUDdOc19EfzWjOzGKXsnNSxJGiYR6Xngs2Gs15+QXcUmFRsThSNCyQWQIWCuYLEdxO6UU64xsWuOQGCwXz5TJm5Ur5VTpkG1a4Rn4MWPP1isrgK1XVHjpkG1a4cRPrI+aa2uArdV7ZlGtYwHOrHuqjZndDY7CVpnzpvzLTsEKz3oLUScyRrW17z0aXn9TApLV3SJv7DRid3i6kTmbuvr33uHPXz73ApPXcl1f9DRi9hUhbcLMv109fYDoeHvS7Qs5sjofegZAzm8SXF3rm/xwwKElos70kP6IJbTbw+MkQ9o6KgafPSEKbBZ4PQ++o8Ix0koQ2i4y+GINeUjCe6CAJbRaZePkKeknB6zc0oc2Et5PYUzzvpmhCmwnvP0xjb3HM6OMkoc0SZj9Cb7HM6T6S0GYJ85+gt1g+619IQpslfP22AD3G8V1PIgltlrH4A3qMY2n5J0los4yVX6vQaxxON01os4S19Q3sNYaSEZrQZhm/N7HXGP4sb5GENtvN339dJKHNNuPYbiMJbbabqB2a0GZN2wXiFmiWeWNgOgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.571;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAflBMVEUAAAAxMTEYGBgGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRLXGisiAAAAYklEQVQokWNgQAGMTLQiEYCZBUSysrGDKA5OEMnFzQOiePlAJL8AM5AUFBACcYRFQKSoGIgU5wWREpJAQkpaBkjKCsgBSXkFRSCppAwkVFQFGRjUFNSBTA1NBhxg1I8U+hEAVGMH/mCncOMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492330659;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.722,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.193,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.235,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.701,2.96;4.blob,1.1,1712.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAAB8lBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT0+kpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqpP2GaiAAACzElEQVRYheWY91vTQBjHz1axoNWqdQCieG7ciHszxL2lriKC4ioqKgqugqLinrj3+D9NrrS53nzv2jyPPn5+SJO7975vCE3yAYT0DALUqAkELRYNHpJz34KhIU1FYRE7Mmx4GFSnZMRITUFRITMQGTUaVKdmTHSscn7c+AnMSHG0BFSnoXSicrpsEjsyuRxWp2EKnsqMTKP2p8+YyS6YNVuQIqjTUIHnZHebO2/+Audj4SL3oHIx+4WvwsWCFL5Oy5Klblev27LlK1auWr1m7Tp3cv0Gtrwa1whC+DottXXOZqPXrR6hTZu3bK1350LbtrPlO/BOPkNQp2XXbmezh+7m/Ph795HP/Q0xtvwAFtwAgjotBw+l99LdPA4f4crjjUf5DEGdjkjTMelcuLmFHzxeB6vT0IJPSOdaTwoGT52G1fHEzxAi5OBsQv6raRM9Ec81ngfV8VzAhHZycLEVtIbi0uUO0yUprlwlVLn7nV0VpsuD167b9aW4kTC/8dDNWzn3ranMOeKfwspz8oDMc0DWkmwqMO84kCzxHJi1dDew7249A8lizzG2FjCZZKHnGFsLmEwy7zk21gLFS057Do2FtQChkonnZGNhLUCo5FrufWpjLTDoZOI5WdhYCww62fOcNBbWAoRK5j3Hxlpg0Mm85wCtBQplN3Qy7zlAa4FC2Q2dbO45htB242HhOfnAynPywP/mOX8RJdGkn/Fyg+q57WdfuUHd6fXx1lIYVCRx17++KoO6d1+xMPM3WV/quWv2ylQa1IPmh7Kp2KNo12PnsyyAelLPXUehY+QE+iB91Qb15Kls5tnz5Ivel69e9wdROPXcfYPQW3IC5ZC+aoN6914288F5rXxsw5/a6escIifwGdBWY1CBL19V0x3V35ytd53h6AzqO/+/Ew7vOsPRGdSPn3GTOChag/rV3+lHX71Blf72o6/KoP4AX/GQnpWjFhgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.174;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAiCAMAAABFhiY1AAABUFBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHaGkzMAAABZ0lEQVRYhe2W107DQBBFTTeQEHrvvTtAAqGXEHrvJRB6L///hmKzHmt2YCNrWQsp52WOrFnfp5GupkkhIzNLzo/ckZ3jZXpunm67rv+y+CfkFxQy9fmLAqrji0uYlZaV+1SnV1RWqY50Ul3jZXptnZfp9Q2NXsY3NX8LXJzC22vxt5oTLk7l7bW1d5gTLk7p7XV2KYtKk+a/0t3TK/V/0LEo4+jrl5ru6FiUYQYGDdsN46ctMcGgNaFjUYYZGh5hGgqPjrkNj4xPTJoCHYsyjqlpZjOzcyG36fML0Yhl0LEowyzGltxGkkDHooxjeUVquqNjUYZZXZObDh2LMsz6xqbUdOhYlHFsbUtNh45FGmYnvGvJ3v4BEgGHR8eEso5FGawxOzk9sz6cx+JIBFxcJghlHYsyWLPt6tqaN7caEgF395Q6OhZnsOZ8kOTh8QmJgOeXV0JTe8E9iL+9IxGQ+PgkNLUXSfsCdfE49khXJRgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.212;4.blob,1.1,3280.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.330,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.489;4.blob,1.1,2960.iVBORw0KGgoAAAANSUhEUgAAAW8AAAAqCAIAAADzvE0oAAAABmJLR0QA/wD/AP+gvaeTAAAIYElEQVR4nO3db0gbeRoH8N9MkqmSTAwhlLZatflXFYVW9hClVErP9VBw6e4am2oi3RyGe3NXuBdLWZbj3nuwbA8KPV8s6enSsLvmnZau2C499ugtR6lBzzGa7J3xLCY5qyaTNX/mXtTtxmQyMzFJJ915PvhqvpN55sU4MpOZrwjx6erqevz4MU3TW1tbt2/fVqvVWSsck8mWhoZWrl5VyuW5H38TU4TQJ11daadTjuMFpe3tH7/33j9ZP1JkCgArAserZLKsHxmGCUlLrlzbfdN90dPTqtU23btXUGqxLC4t3VlY+IT1U8WkALD6+5UrHcePZy28/vDhZ8vLvGnJwdmERQ1BrI+MfPTkyadeb6EpAK9Tk0ajUiiyFvp3d8PxOG8KXgc5jr+v1+c70XKnAAAAAAAAAAAAAAAAAMpDoVA5HNH6+r6SpwC88uG5c16LpSSbUikUUYejr75e0NwPz3m9PHPZn84CR5BI7Pn902azveQpAK/YzOa7FFWSTe0lEtN+v91sFjTXZr57tzRzkZog1AQBKXdaV/e2wxEjiOzHhYtPAUAItet0qbGxWqWyVBt8u64u5nBwHOoHc9t1qdRYbS3PXPytt/54/vzNY8e0HCsp5fI1q/X74WEN21RIXwkG5/b3t/X6wdxPFZkCgBCym83zGxvBaDRzYUdHx6NHj2iafv78+a1bt1QqlfANzgWD2/v7g3o9z1y7eX5+IxiMcq+G//BDpL3945GR/1y48OeaGiPrSkmG2YrHQzSdSKch5UgZJrWyMpnvgqWYFAA5jluNRtfhy5yzZ8/Oz8/TNH3lypWbN28ODw/fy/M6CKsUw0yurHBf7MjluNVqdLmEXeYQRE1Ly2/effcfY2Op3l7PyZMXhe8NyKLVtjmdaZJsKHkKJK6/vn7P4ch6T9XtdlMUJf9xYW9vL8Mwly5dEr7ZNq027XQ2kGTeuf31e3sOpZL9/dhMOEJof//F4uLtr776xZdfnpfJjg0MPDp9+lfC9wZkikQWwuFnJpOt5CmQOLvZPO33R5PJzIV9fX1utzv548L79++HQqH+/n7hm12IRJ6FwzaTKe9cu3l62h+NJvOt8MrBdzoKhaqp6dcXL96prf3l6uq9SGRB+N6ALBTlMpvznhGKSYFk1RDEQGNj1mVOdXW1Uqnc3NzMXLixsaHT6QrauIuibHkudmpqiIGBRoGXObhW29bd/Reb7b+dnX/a3Pzb558bvv76ajQaLGhvQCafb0qtNhw/3lHyFEjWoF4fjsfngod+MWmajsViJ06cyFx46tSpcDhc0ManfD6DWp3bXYAQGhzUh8PxuTlBJwS8re13tbU93333h8nJ099++/u9vX+zrldp38WWOy1GLLa5vv4g3/3UYlIgWXazecrnSzNM1vLZ2VmLxZJ530Sn083MzBS08c1Y7MH6Ouu9WLvdPDXlS6ez57LTaM7iOM/9FaVcHhod/d/16/m+Mf2ZpQih8c5OxumsksmOkCKEjEbr6GgIx9k3XkwKJOgMSaadzlYty2Mczc3NNE3PzMz09vaOjo6Gw+HZ2dkjjLAajaHRUeJwneCZM2Q67Wxt5Xp8JBO+vb2cTvPcX6nA72LLmiKE5BjGIJTM+VMgJEUIBQIemYzI96R8MSmQoBGT6Wko5I1EcqOlpaXLly+TJOnxeMbHx91ut+VIz917AgFCJst6yn5kxPT0acjrZZkLCvBFT8+/hoaOlr7U3T3R0+MuRwqkZtFiudHWVu4pE93d7p6eQ3MXLTdulH3uz1wNQex+8MFvW1uPkAIAwE+gyREAAAAQDfyJBQAcEYZhGIYhhBiGYRiG/9l7AABg1dzc/PK5W5/Pt7GxAWcTAMDRvXjxYm1tLR6Po5J0rzWSJON05mtwyZdyt8iJlXLvs5CUG0k2Op2MUllb0Keg51HKCupbLEZWR6RKpYhGHX19PHNTqdTu7m4ikUAlbHKMp1IFpdwtcmKl3PssPOWWShX2n9ag51HKCupbLEZWR+TeXmJ62m+3FzC3BGcTHMMQQjv7+4WmLooaaGjI97KMWCn3PvOm3DDsZQXETr4VCELNWuZIUa6GhgHoeZQm3iO2eO06XbNG89eVlUNzXdTAQINaLXRuCc4mGELxVCrfI+ocKXeLnFgp9z7zpnywVCqeTidYM7lcabWuDQ9/TxCarAh6HqVMYN9iMVg7Iufmgtvb+4ODQueW4GyyurNTPTFxhJS7RU6slHufeVNuOzurExPV+VKGScbjWzQdyj3dQM+jlAnpWywGa0ckQiiVYiYnVwq62BETd4ucWGllgp5HKSvrEcvaEXkwt02bTjsbGtjntrS0tGa8YiLy/9PhbpETK61M0PMoZWU9Ylk7Ig/mLkSePQvbbILmiv/fuTha5ERMKxP0PEpZmY5Y1o7IQ3NdlM0maK74ZxOOFjkR08oEPY9SVqYjlrUj8tDcKZ/BoO7o4J8r/tmEo0VOxLQyQc+jlJXpiM3XEfnT3M3YgwfrQu7Fin82QQi5KGrIYMhqkRM9FUVn57jTychkVflWoCiXwTAEPY/SVPIj9gxJXjh5kuMy52CuixoaMhAEz9yK+EVibZETPRUFhskRYhgmb7cm9DxKWe4RS+B4lUyW9SPDMCEp4uyIPDTXEyAIGe9T9hXx1h+dTLpXV6+ZTJ5AoHJSUSiVddvbFEdTbzJJr666TaZrgYDnde4YqAS5R+w377yTeyfl+sOHny0v86YIIavReGdpiX8unXS7V69dM3k8gdwUx/GXjQTQb1JBCKJmZGT9yZOPvN5Pxd4X8GZo0mhUCkXWQv/ubjge502L19LSktlIUJJtgtLAcble/z5UWIE3RVVVFUmSJEkqFAqE0P8BtLslWi3SfK4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAxklEQVQ4je3SxxKCQAyAYVSUaltREQULFqwo9oL1/d9Jh2RHM6NXT+T0f7uwpwjCaxICn6iSKc6oxHQGGZUkK0goVdPRUNkc/xsqX+COqshUJFSJGWioMqugoarMREPVrDoaq2Hz96EcmRuqabXQWO2OiwdQereHxuoP+Avv+jKeTj0cjenBZEo900x64M+pF8wjDtiSfrByqNc29can3u4Ipf2B+MhOxEroEp8vhNdb8Ml7KJJr4yH8mHi/YOL9ivfrz/v1BBGbI/NE4T5MAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492330764;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.712,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.691,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADBklEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIsoQBbdIXUUExVVUVBRcVXHgVsS9F+49/zyTNGmud5fcy7X5fPTj94eMe+/eS9Mm+aYI8ekByLHG5RaY1LNXwn1Tens4Galp5Eifvl5QniX9+nMS0lKJAd+AgaA8awb5B1vGhwwdRoyk+zNAeRwyh1uGs0aQIyOzYXkcRkmjiZEAtj1m7DhywvgJjCqMPA450sT4bpMmT5kqr6ZNV3ZyZ5A/+DwpnVGFzuMyc5bS1eiWP3tOQeHconnFSnD+AjK9RCplFKHzuJSVy4uFRrcKhBYtrqyqUGKeJUvJ9GXScroGI4/LipXyYhXeTf74q6vV9ZqaIJm+VmJcAIw8LuvW61t6N4MNG6n0UO0mugYjj4evbrNpzFvfQA9uKYflcWiQtprGGrcxBrfvgOXRhHaq+NSdXWHzr6aJdUfcXbsHlEezV1JpVnf2NYLmYOw/0GJ3SpSDh1TylO3Wthy7092Hj4j1xTgatn/hoWPHE+5bmptwiX8KIc9JAmaeA7KWSF2K/Y5aZRPPgVnLiRry2c1Hq8z2HNvWAiZWmek5tq0FTKwy7Tki1gLFqKx7Do6AtQDBKqueE4+AtQDBKpdRz1MRa4GBV1Y9Jw4Ra4GBVzY8R0fAWoBglWnPEbEWGHhl2nOA1gIFsxu8Mu05QGuBgtkNXtm+59gEtxsDAc9JBkKekwT+N8/5i8jwR5wsr3lO4OQpMtJ+2sm+muecqTwbICLnOhy8tHTPKTxfdYEI+cIXneureU71pctXrpKxa9ctJsbeyTqj9117j0zdc27kB7oKyLf8m/W3zOYFb/vb7sjrLBdqj953ZYUOqgfQCemre87de+j+g4dk9NFjs3lPnkaedTx/8bLbjbzR++4rhF6rB5AN6at5TvGbtwh1FZHRd+/N5n2QHysfm6RPzfh59qgH8BnQlmNQri9frcItJd/kpXGe4fAM6jv93wmFcZ7h8Azqx8+QnXJQuAb1q7vVib58g8r87URfK4P6A20uoT7vOit/AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.212;4.blob,1.1,1388.iVBORw0KGgoAAAANSUhEUgAAAFcAAAAzCAMAAADVc2QSAAAB+FBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2mVlT0TExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG03NxZ+fjN4eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxx6ejGFNoVSIVIxMXowMHcoKBACAQKVPZVBGkEQECgtLXA7O5IaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2TkzxlZSkqKhGUlDw7OxhTUyJ0dC8TEwh9fTNKSh5ERBxubiw1NRYEBAFmZilRNrViAAAB00lEQVRYhWNgIAwYmYhQRAZgYqSJscwsrDQxl42dJsZycHLRxFxuHl6amMvHTxNjBQSFaGKusIgoTcwVE4czJSQwWSQCSSlpCENGVg4mJq+gqITOIhUoq0B9r6oGF+NQ15BHZ5EKNLWgDG0d8gzADnT19KlpHByIMhvQxNyhBgyNaGOusYkpNY0zM7eAsiytiNMhZ81MlLk2UJatnT1xBjs4OhFW5GzuAmO6uhFnLn4g5w6mPDzhIl7ehhSY5+MLJET9/KUC0GUCvYNIMSg4BAxCQeyw8IjIKAbp6JjYuHhMlQmJpJibFAkGyQwMISmpaUnpDAwZmVnZ2FTm5JJibl4+GBQwMBQWFZeAREo1ysorsKisdCXFXEQ4VFXX1NaBhAyY66UY/TBUNjSSYi4iHBhCk5sim8PBoi06eugKW9vaSTEXEQ4g0NHZBRXHaCl1e/eQYi466MUl0dc/gRJzcYKJk2hi7OQpgbQwdmr/NFoYyzB9Bk2MHekAUavAWPIz5fDIElsPIdUqMFbcLHyyRNZDWMDsOeQ2SfEDUfG5NDGXYd582pjLqrKANgYvXEQbcxdrEVZDDnDKlKGNwUvKaWPuUoVlNDFXuqyUJuYycC0nXQ8AA2NW0ZJCPJAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.489;4.blob,1.1,1448.iVBORw0KGgoAAAANSUhEUgAAADoAAAApCAMAAABTJ8ovAAACGVBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCABAQECAgKcnD+qqkUxMTE+Pj4XFxcKCgoNDQ0FBQWIFRAQAAAB3klEQVRIiWNggANGJjBgRmYRCVhYwYANmUUkYOcAA05k1iigEuDixiHBw8uHzOUXwFDBzYXLUEEhZJ4AP7q8sIgoLq1i4hIIjqSUNLq8jCyYkpNXUFRSRpViVlFFcNTU0XVqaGqBKG0dXT19A0M0SSNjONPE1Axdq7mFJYiysrZhYLC1s0eVdHB0gjGdXVzRtbq5gykPTxDp5Y0m6+MLY/n5o+sMCAwCUcF2ISAqNAxNOjwCyoiMikbXGhMbB6bjIbYmoEknJiVDGCmpaeha0zMgdCbEr1no8tk5EDo3D10m37EAwihUKLItLtFFl2coLWMEUeUVlegyVdUwVk2tglddPYbWhsYmENXcgiHT2oYhhAbaO0BkZxchdaOA2gCtCMEGwMVPd08vhgRqEYINQIqfvn4MCZQiBBuAFj8TJk5Cl0EpQrABaPEzecpUDCmkIgQbgBY/DAzTpmPIIRUh2AC0+GFgmFExE0MSUYRgA9DiBwhmzcaQhBch2AC0+AGBOXMxZOFFCDYAK36AYN78BRjSsCIEG4AVPyCwcBGGNLQIwQbgxQ8ILF6yFF0eUoRgbcEgih8gWLZ8BZBcuQoMVkLEwEUI1hYMavGzeg2QWLsODNYjiRPbgtmwEQw2AQDCFV97YSQX8AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.516;4.blob,1.1,3732.iVBORw0KGgoAAAANSUhEUgAAAJ0AAACVCAIAAADNF2/sAAAABmJLR0QA/wD/AP+gvaeTAAAKoklEQVR4nO3dfUzTdx4H8G9/faCUUvoABQpWaUvlUTp8oDGHzugdu0LcXOa8eT7c6WUm+2vJspjsctkfXpacMXdmZjPeH7tLN03mcON2l4lBw+RI0OnEIAYttEKOp0IrCLSF0of7o6Zgqe2v7bf82i+fV/jD/H7213f82Kff78u7CIEkaFjX8PGWjxkMQDF43wTT5+tvWW8xGADmip9SqCwUFN6euM1gBpgrfvp8/ePpx9ML0wxmgLliRrGobfJtXdYuhmMwe/fkqZRU8ihet62b2RgwV8z0+fr79vsL3gVmY8BcccrkZNbIahh/EkYwV7w25252LDoeTT1iOgjMFSt9vv6nyZ/8yM90EJgrPrn8XE2OJhWehBHMFaM6ed3w3PCoY5TpIAjBXDHaKt+aIg9WAAAAAAAAAIiH7qTu7d63sRyKK+QedxxXGpSJHyqYCj6/xkl7WGv60oTlUItzi0++e6I9ok38UMFUMNd45NbmisvF/V/14zqgyWhav3c9T8TDlQrmGg/tEe1o+6hjxIHrgCM3RtzTbtV+Fa5UMNeYURxK847GZMTzJBzg9/r7L/Yn8lQckgrmGrPihmJuFtdyxbJ8I4tisfns5T8Ul6K5N8BkNBXWF2avz8aSihPfUdYy7RHtk++eeBye5RuVBuVr/35t+ZbBfw1ee+Manb0BTx88tffYSw+X3vvzvcRTwVxjw8vhbdi7oXVva8j2sf+Ofbv12+VbFqYWaO4NMhlNFScq4pjry1IBusr+UHZo+BCLYiXj4IICwbued+V18sRTwetrbLRHtAOXBvy+pKx0cY47h9uG43j3tDIVzDUG2SXZhb8oxPtOOITJaFIfUFO8GOYSNhXMNQalh0pt921Pe58m7y4GWwbZPHZM5xTDpoK5xgD7x9aVPC6P+bK59GAp/ZusQioAAAAAIIQQO/LuwJUjv5f5X0xIfTyeCCHk93uZDoJQ1PfDIo2o5sMaTiacboxOJNLU1HzI4WQyHQShqI9X55hTpBbJt8gn706uTqD05XSOiURquXzL5ORdprPQ+PxqabZIKiTSKukqpEl3FkuzRFIhlVYxHSTa4xUh5HP7+Hl8aZXUesu6CoHSms/n5vPzpNIqK6MlP4jm+SbbzzZxmTjB1Tdpx6BU/mAwLN9SV1d38+ZNl8tltVrPnTsnFApX3spm+1ksLgu8h1p9SoPS8IMB0bz++sz8DCGUo81ZC6+yHIo6oFaf1OmqpdLbExPB7Rs3bmxvb+/o6Ni3b59CoThz5oxKpWpsbAy5+bNnZoRQTo4W16ssxaVY7NDLgj6374WrNxxKfUCtO6mTVksnbk8gmnP1znvdM25BgQBL0JSVyeEcLyv7YNOmQoHgG4vlREdHl3XppefUqVPDw8NNTU0ejwchNDIy0traumvXrvb29uUH8Xrn3e4ZgaAAV6pX//Fq6W9DTxe37W+zNFsQQpxMTtnxsk0fbBIUCizfWDpOdFi7rIj+egmP08PN5uLKmpq+2LnzLZXqk+7uT3t77fPzIXsNBsPZs2cDQ0UIXbt2zWazNTY2hswVIeTxOLncOJcprXTnT3cenH0QsnHGPBP4w84vdqreUnV/0t37ae+8fSkz3bn6ff6VS60I87XZvDkv7/3q6lw+/0JfX4/dHtyVmZmZlZU1Pj6+/O+Pjo7m5uauPI7f76MobI8Bx7DDOeYM2ehz+wJ/MH9tztucV/1+NT+X33ehz97zPDPdubJ57MW5RVxZU1PL4OD3Q0NvlpSc1Oneq6zsslo/f/jwq/5+hJDL5XI6nQUFLzy7KhSK69evrzwOm81bXJzDlSry8/Bgy+DQ90Mlb5boTuoq36u0dlkffv6Q7oJ1FsWq/6xesUuBK2vq211U1NbUNHvsWHDLlStXTCYTh/P8kdDQ0OD3+/fs2RNyQxaLqq//TKHYhStJdkl23pa8kJ8MScbKv1m0u6iprenY7LGVu8LLUmTtuLBDuC7M23qyVUuXzsaUl5e7XK6rV682NDQcPXrUbre3toZZ/5eVpdix44JQuG4VY75AWk37DFLR7iL9aT1Kyhq8dLJ9+/bOzk6XyzU5OXn+/HmRKMyH1KKi3Xr9aZQW/1i1H9UqGzH8Ft9aUFv7kVIZ+qF29UV/iyvTyXg5vJEbI6uQJt3JZDoeL2dk5AbTQaIRFAr0p/WScgnTQdKAQFCo15+WSMqZDkKDuEwcw+vw2iYWl0ml1UynAGtHpjwlrvWDxC29byr+VfHG321kMArAT1Iu2f637fxcPtNBUhfG1pbIYmqaeVkqCiHEoliag5qh/wzN20IvYoAgjK0tkcXUNPOyVBRCSFYjyxBnjHeOh7shWIKltSWyOJpmwqaiEELybfKpvinvQkosfE1lWFpbIoujaSZsKgohlFOaE7xOCyJIvLUlsviaZsKmorhZXG421zXhwpqQWAm2tkQWtmkmvlQUR8hBCHlcnpffCiwJtrYk4+Bhm2biS0UFVrfAb+DQZzKatIfxPxUHOl3i/g3lkFRU4H8HOyP6AnEQMHBpQKQWxdHaEplqv2rePh/3dbOQVJR71u33+sOuqwBhxd3aElmCTTMhqSi/xz87NJtVnIUvIfniaG2JDEvTzPJUFEJo6uGUpAKusMZgZWsLxaNCGhDZfHZwnX7kvQhT08zyVByE0FjnmNKgFKlF8CmWpmBry2DLYGDL6x2vr3zF/fH3Pz7+5+OoexFCmnc0fX/vw5jq+X8Z1X6VUCns+WtPCnxlXloSl4m5wtC14LNPZgNr8CPvTSJ2Brv2j7Ub3tiQ3LsBq48r5Cp/DYsOAUhh0AdDJuiDIVOUudru2RwjDlj3FJVQyHU4jhuSv0qGpuinhWfMM5rfaOb+NwfX8iJwu30VFZJXXsltbo75KlsyRD8Ttji7OHFnoviXxauQJq0Zjaa9e9eLUqNdBfpgsLlxY2R62r0/matk6KM112AfTJLDpDev13/xYv+R5C9YpIPWXNdIH0zijEZTfX3h+uSskokJ3StNa6EPJnEPHjzt6bEfTs4qmZjQneta6IPBwmg0HU7CKplY0R3VWuiDweLSpQG1WlSHe5VMrGjNlUWxMsQZYb96C4QYH3e2tQ0z/u6J1lwFBQIWhzUzAFfdaTEaTQcOqHn4VsnEgdZ9i8vF7mfuuWFsXVNka2kZ5PHYzJ5TpDXX/Lr80ZujsJSCJpfLc/my+WAs323EAJlOpv+Lns2HBcYEgT4YMkEfDACpCvpgiAF9MESDPhjCQB8MmaAPhkzQB0Mm6IMhE/TBkAn6YMgEfTBkgj4YMkEfDJmgD4ZM0AdDJgohNNY5xpfxRWpmvmIYJAMbIeSd93IEHHmdHL5BnRjP3wbPmGcUOxQZ0ozpR9PMBgKYQR8MAKkO+mDIBH0wZIryeHWOOUVqkXyLfPLu5OoEAlhE/z0OS7NFUiGRVsEq4nQS/XS/z+3j5/GlVVL4dJtGoA+GTNAHQybogyET9MGQCfpgyAR9MGSCPhgyQR8MmaAPhkzQB0Om6HOV6WS8HF7c33MIUhH0wZAJ+mAASFXQB0MM6IMhGvTBEAb6YMgEfTBkgj4YMkEfDJmgD4ZM0AdDJuiDIRP0wZAJ+mDIBH0wZII+GDJBHwyZoA+GTNAHQzrogyHJ/wHITnidLg+iwAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492330865;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.702,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.234,2.47,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.681,2.96;4.blob,1.1,1876.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT082hoYeS0ukpKSoqKgRKSk2hYVGRkb29vYsbW0QKChjY2M8lZURKysra2soY2OLi4vBwcEFBQUaQUETLy8tLS0fHx+UlJRpaWkyfHwhUFABAgI4i4saQEDQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTEweSkoHEhJycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqoGf7y5AAADDklEQVRYheWY91vTQBjHT6pY0GrVOgAHxrpwI4qCiDJEwW2lriKC4ioqKgquojhwK+LeC/eef55JmjSXu0vuzbV9Hn38/JBe7977viHQ5EMR4tMDUGNPiktgU89ecfdN7e3mVKSlkzN9+npAdbb0688pSE8jJrwDBoLq7BnkG2y7PmToMGImw5cJquOQNdx2ecRIcmZUNqyOw2hpDDHjx8Zjx40nN0yYyEhh1HHIkSaZu02eMnWa/DJ9hvImdyb5B58nZTBS6Dous2YrXY1u+XPmFhTOK5pfrCwuWEiWl0iljBC6jktZuXxYZHSrQGjxksqqCmXNvXQZWb5cWkFnMOq4rFwlH1bj3eQff01AfV1bHSTL10mMDwCjjsv6DfpI72awcRNVHqrZTGcw6nh4a7dYrnnq6unJreWwOg710jbLtYbtjMkdO2F1NKFdKl71ze6w9a+mkXVH3FOzF1RHs09SaVLf7G8A7cE4cLDZ6ZYohw6r5CnjltYcp9tdR46K9cU4Fnb+wUPHT8TdtzQ37oh/CiHPSQBWngOylkhtqvOOWrKF58Cspa2afHbz0ZLZnuPYWsDEkpme49hawMSSac8RsRYoRrLuOTgC1gIES1Y9x4yAtQDBksuo56mItcDAk1XPMSFiLTDwZMNzdASsBQiWTHuOiLXAwJNpzwFaCxTMbvBk2nOA1gIFsxs82bnnOAS3GwMBz0kEQp6TAP43z/mLyPRFkhmveY7/5CltIjZqP53MvprnnKk8q33DEBud60jiR0v3nMLzVReQeeQNX0xeX81zApcuX7lKjNC16zYbY/+TdUbvu84embrn3Mj3dxUEzCN0s+6W1b7gbV/rHeW0U1B79L4rK3RQPYFOSF/dc+7eQ/cfPDSPEHr02Grfk6eRZx3PX7zsdiFP9L77CqHX6glkQ/pqnlP85i1CXUWmkcy791b7PsiPlY+N0qcm/Dq71RP4DGjLMaiUL1/tlptLvslH4zrD4RnUd/q7EwrjOsPhGdSPnyEncVC4BvWruyUZffkGlfU7GX3tDOoPahWve1TzKNEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.174;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAiCAMAAABFhiY1AAABUFBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHaGkzMAAABZ0lEQVRYhe2W107DQBBFTTeQEHrvvTtAAqGXEHrvJRB6L///hmKzHmt2YCNrWQsp52WOrFnfp5GupkkhIzNLzo/ckZ3jZXpunm67rv+y+CfkFxQy9fmLAqrji0uYlZaV+1SnV1RWqY50Ul3jZXptnZfp9Q2NXsY3NX8LXJzC22vxt5oTLk7l7bW1d5gTLk7p7XV2KYtKk+a/0t3TK/V/0LEo4+jrl5ru6FiUYQYGDdsN46ctMcGgNaFjUYYZGh5hGgqPjrkNj4xPTJoCHYsyjqlpZjOzcyG36fML0Yhl0LEowyzGltxGkkDHooxjeUVquqNjUYZZXZObDh2LMsz6xqbUdOhYlHFsbUtNh45FGmYnvGvJ3v4BEgGHR8eEso5FGawxOzk9sz6cx+JIBFxcJghlHYsyWLPt6tqaN7caEgF395Q6OhZnsOZ8kOTh8QmJgOeXV0JTe8E9iL+9IxGQ+PgkNLUXSfsCdfE49khXJRgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.212;4.blob,1.1,3328.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.320,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.489;4.blob,1.1,2964.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAAGkAAABxCAMAAADh2X3+AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAABsUlEQVRoge3X105CURCF4QOogOgGsWEBBAUr2Av28v7vZPTKzMnaUfeaMTEzD/Cv2/myzOAKRYuVjytNTVtNzZStlirVWaup2pzV0nwoGC3VQ8NoKVtoWi0tLlktLdesllZWjYZaa+tGSxth02ip3ekaLW31jIb623WboZ3OwGYoG+4aDX25Pavy/oHWkCgPDo+UhkS5NWorDcnyuKr1I8ny8YnSUK58eqa1JMrnYaw0JMsXYai0JMuX4UppSZavg9Z7Kcs3k1ulpVz5Tu0/kuXmSGtJlu8nD0pLufLjk9Y3IcvF5xelpVz59U1pSbH842NbG/fY1o702NbGPba1Iz22tXGPbW3cY1s70mNbG/fY1sY9trVxj21t2GNbG/fY1sY9trVxj21t2GNbG/bY1sY9trX/1u5sxUO7sxUP7c5WPLQ7W/HY7mzFY7uzFY/tzlY8tDtb8djubMVju7MVj+3OVjy2O1vxEbuzFY/tzlY8tjtb8RG7sxWP7c5WfMTubGu73Qnndk87t3vSud1Tzu2ecG7335/bPbX8eW7375/bPeXc7gnndk86t3vS/Xu7vwPAqkz2BGm3eAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492330972;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.692,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.671,2.96;4.blob,1.1,1900.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADIUlEQVRYheWY91/TQBTAz1axoNWqdQAOjHXhRhQFEQURBbdIXUUExVVUVBRcdU/cKCruiXuPP8/kmuSOuyT3kjafj378/pBe3r17L4Qm9wWExHQD5Fjj8TpY1L1Hwn1TevoEGalpbKRXbz8oz5I+fQUJaalMINCvPyjPmgHBgZbzgwYPYSLpwQxQnoDMoZbTw4azkRFZsDwBI6VRTCREjUePGcsuGDfeoIpBnoBsaULXbhMnTZ4if0ydppzkTGe/8LlSukEVPk/IjJlKV9Itb9bs/II5hXOLlMl589n0YqnEoAifJ2RBqXxYSLqVIbRocXlFmTLnW7KUTV8mLedrGOQJWbFSPqyiu8k//upK/LmmKsymr5UMHgCDPCHr1msjrRthw0YuPVK9ia9hkCciULPZdM5fW8cHt5TC8gTUSVtN5+q3GQS374Dl8UR2YgL4ZFfU/FfTYPRG3F29B5THs1fCNOKTffWgNRT7DzTZXRLn4CFMrjJubsm2u9x7+IizvhRHo/YfPHTseMJ9S3ISLvFP4chzkoCZ54CsJVaTYr+jWpl4TujESTILs5ZTVezeLUatTDzndPkZfQ+2bS1g9Mq65xScrTinzdq2FjB6Zc1zKs9fuHhJjdm3FiiksuY5l/NCrfnqPujAWoBQlbHnIHTlKrp2/UY85MBagFCVseegopu3EGotxBEn1gKDrow9pwtOrAUGXZl4joYDawFCVeY9x4m1wKAr854DtBYolN3QlXnPAVoLFMpu6Mr2PccmtN0QHHhOMnDkOUngf/Ocv4iMYMzN8qrnELvRR2233eyreg6xG310p93FR0vzHGI3+igQveteX9VziN1QnnPvvsVC/W+yjvh7196WqXkOsRvKcx7UPjRbF34UbHmsXLYHtcXfu7JCh/EFdED6ap5D7Ib2nCdPzdY9ex570f7y1etOL/LH37tvEHqLLyAL0lf1HGI3tOegd+/N1n2Qt5WPDdKnRvo++/AFfAa0FRiU58tXq+mm4m/ykdxnOCKD+s7/74SD3Gc4IoP68TNipxwUoUH96mx2o6/YoDJ/u9HXyqD+AHyzvK8OwX3rAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.212;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAAFcAAAAzCAMAAADVc2QSAAABm1BMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQAgICD///8bGxuVlT0TExMvLxOJiTcODgYiIiIFBQVtbSwjIyP39/cSEiwsLG03NxZ+fjN4eDEBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjaVlTxiYigiIg4oKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwUICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTtZWSQcHAsTEzA1NYM7O5EkJFkLCxx6ejExMXowMHcoKBAGDg4QECgtLXA7O5IECwtf7Oxh7+8GEBALCxsDBwdX19dY29uTkzxlZSkqKhGUlDw7OxhTUyJ0dC8TEwh9fTNKSh5ERBxubiw1NRYEBAFmZil9mvPzAAABkElEQVRYhWNgIAwYmYhQRAZgYqSJscwsrDQxl42dJsZycHLRxFxuHl6amMvHTxNjBQSFaGKusIgoTcwVE4czJSQwWSQCSSlpCENGVg4mJq+gqITOIhUoq0B9r6oGF+NQ15BHZ5EKNLWgDG0d8gzADnT19KlpHByIMhvQxNxRQBNgaGRMog45E2aizDUl1Slm5haEFVkaWZFqLn4gZw2mbGypZJ6dPZAQdXCUcqLQIGcXMHAFsd3cPTy9GKS9fXz9/Cl1YIAnGAQyMLgEBYcEhDIwhIVHRFJqKgNDVDQYxDAwxMbFJ4BEEjWSklMoNhcRDqlp6RmZICED5iwpRgcKzUWEA4NrYLZnjjtYNFdHD11hXh5J5iLCAQTyCwqh4ugtpaLiklISnYwCynCIl1dUFlFi7igYBfQHiFoFxpKvksMjS2w9hFSrwFh+1fhkiayHsICaWnKbpPiBqHgdTcxlqG+gjbmsKo20MbipmTbmtmgRVkMOsAiXoY3Brcm0MbdNoZ0m5konJdLEXAauDtL1AADkij8DClUKpgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.310,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.489;4.blob,1.1,1764.iVBORw0KGgoAAAANSUhEUgAAAWYAAAAXCAMAAAAP8RX0AAACnVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFB9MjLOU1MJBATyYmJQICB9fTLOzlMBAQECAgJFRarWVlZwLS2cPz+qRUXW1lZwcC0xMTE+Pj4XFxcKCgoNDQ0FBQVJnfzmAAACR0lEQVRogWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtaQAQKCYCCEzBo4ICyCzhIVg4lgYw0ZIC4BBpLIrAEDUtIyGKzhAWTlwEAemTVggFdBEYM1CkbBKBgFo2AUjEigpKyChzUkgKoaDgl1DU1krpY2HRyDC+jo4mMNBaCmiktGTx+Zp62F0wgDA1qzDI2MGXCzhgAwMTXDJWVuYYDgWFpZI8vZ2NrB2Vz2Do40Zjk5u0Atw8YaAoDbFUy5uTN7eHqhSgl5+yA4vn4ocv5GygGBUDZ1RjLws4KCYTZjYw16wBsSCqLCwiMio6Jj0CRj4+DM+IREVLmk5JTUtHRaOw8OMjKz8LAGPcjOASeX3Lx8BoaCwiJUyWKeEhiztKwcQ29FZVU1jZ2HADW1+FiDHdTVg6mGRhDJ0oQm29wCY7W2oetUau/o1O2ipdtQQHcPPtYgB1K9fSCqv3ACiJo4CU168hQoY+q06agyGTNmzpo9h9bOQwJz583HwxrkYMHCRWB6MSQ1L0GTXrpsOYSxYuUqVJnVa7oRzSlqN+Owgsq1+FiDG6xbD6E3QMrmjejymzZD6C1b0SS2bUewqd2MY9ghIYjBYti5azce1qAGe3j2Qhj7mPcXHDgYgaHgkL0AiDp85CgeU6jdeMMySQUEx46fwMMa1ODkKRgLaUIPGZw+cxZEnTsP5V+4CAYXaOsszEkqEFh9CR9rMIPLVwipuHoNRF6/AeXevAUGt2nqquE7SUUsuHMXDO7R1JLRSSoYAABYf7OOPP0SigAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.132,3.516;4.blob,1.1,1612.iVBORw0KGgoAAAANSUhEUgAAAgQAAAAPCAMAAACshCdOAAACRlBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkp3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRarIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEeB03iAAACLUlEQVRYhWNgAAJGJoahCphZWNFYbOwcUBFiWdhMQQacXNxoIjy8fJQ5m8YA2W84AL8AkBAUEoYLMDHS0kU0BcwsIugsUTGYJLEsbKYgAU4ucXQhCUlyHUwfgOQ3HECAH0RKScP4MrJytHQQTYE8iwI6S1FJmYE0FjZTkIAKlyqMqaYGodU11ChyNq0Bkt+wA00tcImnraMLFdDTp7GTaAgMDDFYRsYmJLKwmYIETM1gLHMLSysww9rGljJ30xgg+Q07sLMHUw6OThC+s4srjZ1EZ+DmTiqLWODh6WUOYXn7kOs6+gACfvP184cwAgIhdFBwCI1dRGcQGhZOIot0EBEZRbZeegACfouOiYUw4uITwHRiEq1dRG+QnEIqi3SQmka+XnoA/H5Lz4CxMrNAZHZOLq0dRG+Ql08qi3RQUEi+XnoAvH4rMiyGMUtKQWRZeQXNXURnUFlVTSKLdFBTW0e2XnoAvH6rb2iEMZuaW4BkaxsdnERn0N5BKot00NlFvl56AHx+6+5BsHv7GBj6ZSfQ3kH0BhMnTSaRRSSYwjUVxpxmMZ0SJ9Ic4PHbjLCZCM6s2XMY5s6jh4voDOYvWEgii0iwKHIxjLlk6TJKnEhzAPHb5OVgYITMYlixEkndqtVrGNauGyBH0hSs30AqiziwcROCvXkLeW6jFwD7bSsLGGxDZjFs34GsbueugXHfUAW79+wdaCeQCPbtBwMRZNYooAgsPnBwoJ1ACwAA5KqdGPfU5ikAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.535;4.blob,1.1,1980.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAACx1BMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkV7gB8/AAACwUlEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaNgsIAzZ89RwZTzF6hgyMVLlyk35MrVa5QbwnD9BhUMuXnrNhVMuXOXCobcu08FQx48fEQFUx4/oYIhT589p9yQFy9fUW4Iw+s3RCsFAGzqnbVs9zLwAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.732,3.571;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAflBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIxMTEYGBj851AeAAAAZ0lEQVQoke3PuRaCUBAD0CGyiOB74MImIIoI/P8PkqkobLGjuV2SExEHgBxcj8IP1GN4oohi9WyEWpNQpBf1elPvkZrltCgr+jA1bdon7V7MvnsL+bQDO7+jrgC/TvO/XFf2j5t+XAAiexW/VhevlAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492331072;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.682,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.661,2.96;4.blob,1.1,1900.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADIUlEQVRYheWY91/TQBTAz1axoNWqdQAOjHXhRhQFEQURBbdIXUUExVVUVBRcdU/cKCruiXuPP8/kmuSOuyT3kjafj378/pBe3r17L4Qm9wWExHQD5Fjj8TpY1L1Hwn1TevoEGalpbKRXbz8oz5I+fQUJaalMINCvPyjPmgHBgZbzgwYPYSLpwQxQnoDMoZbTw4azkRFZsDwBI6VRTCREjUePGcsuGDfeoIpBnoBsaULXbhMnTZ4if0ydppzkTGe/8LlSukEVPk/IjJlKV9Itb9bs/II5hXOLlMl589n0YqnEoAifJ2RBqXxYSLqVIbRocXlFmTLnW7KUTV8mLedrGOQJWbFSPqyiu8k//upK/LmmKsymr5UMHgCDPCHr1msjrRthw0YuPVK9ia9hkCciULPZdM5fW8cHt5TC8gTUSVtN5+q3GQS374Dl8UR2YgL4ZFfU/FfTYPRG3F29B5THs1fCNOKTffWgNRT7DzTZXRLn4CFMrjJubsm2u9x7+IizvhRHo/YfPHTseMJ9S3ISLvFP4chzkoCZ54CsJVaTYr+jWpl4TujESTILs5ZTVezeLUatTDzndPkZfQ+2bS1g9Mq65xScrTinzdq2FjB6Zc1zKs9fuHhJjdm3FiiksuY5l/NCrfnqPujAWoBQlbHnIHTlKrp2/UY85MBagFCVseegopu3EGotxBEn1gKDrow9pwtOrAUGXZl4joYDawFCVeY9x4m1wKAr854DtBYolN3QlXnPAVoLFMpu6Mr2PccmtN0QHHhOMnDkOUngf/Ocv4iMYMzN8qrnELvRR2233eyreg6xG310p93FR0vzHGI3+igQveteX9VziN1QnnPvvsVC/W+yjvh7196WqXkOsRvKcx7UPjRbF34UbHmsXLYHtcXfu7JCh/EFdED6ap5D7Ib2nCdPzdY9ex570f7y1etOL/LH37tvEHqLLyAL0lf1HGI3tOegd+/N1n2Qt5WPDdKnRvo++/AFfAa0FRiU58tXq+mm4m/ykdxnOCKD+s7/74SD3Gc4IoP68TNipxwUoUH96mx2o6/YoDJ/u9HXyqD+AHyzvK8OwX3rAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.174;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAiCAMAAABFhiY1AAABUFBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHaGkzMAAABZ0lEQVRYhe2W107DQBBFTTeQEHrvvTtAAqGXEHrvJRB6L///hmKzHmt2YCNrWQsp52WOrFnfp5GupkkhIzNLzo/ckZ3jZXpunm67rv+y+CfkFxQy9fmLAqrji0uYlZaV+1SnV1RWqY50Ul3jZXptnZfp9Q2NXsY3NX8LXJzC22vxt5oTLk7l7bW1d5gTLk7p7XV2KYtKk+a/0t3TK/V/0LEo4+jrl5ru6FiUYQYGDdsN46ctMcGgNaFjUYYZGh5hGgqPjrkNj4xPTJoCHYsyjqlpZjOzcyG36fML0Yhl0LEowyzGltxGkkDHooxjeUVquqNjUYZZXZObDh2LMsz6xqbUdOhYlHFsbUtNh45FGmYnvGvJ3v4BEgGHR8eEso5FGawxOzk9sz6cx+JIBFxcJghlHYsyWLPt6tqaN7caEgF395Q6OhZnsOZ8kOTh8QmJgOeXV0JTe8E9iL+9IxGQ+PgkNLUXSfsCdfE49khXJRgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.212;4.blob,1.1,3280.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,628.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAxElEQVQ4je3S1Q7CQBCF4cV9cXcp3uLu8P7vRNKZAU4Ct1x1rv5vK2m2q9RrXG4F4/H6cMEfQAdDYVyIRNEx7QLHdQJvSKbQ6Qw6G0Hn8sBCsQQu6wq4WquDG01gqx3/ZKdmwOVuT/2YPtZgKLTLGI2ZdhXMqnyuXVZI9plqMpWnqWZzsV0LbTGplrrLplrpNZtqo+WnUG13ezbX4bXHVClTTHXcndhc54vsIpX7emNz3R/yhnd9Ged8OedLOefrY/5wvp4fwigsudBbUgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492331172;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.672,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.291,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.651,2.96;4.blob,1.1,1884.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADFElEQVRYheWY91vTQBjHT6pY0GrVOgBRjHXhRhQFEQURBbdIXUUExVVUVBRcxb1wo6i4J+49/jzTa5M7cknuvWvzPPr4+SFN7t77viE0yQcQ4tMDUGNPkktiUc9ecfdN7u3mVKSkGkf69PWA6mzp159TkJpiGPAOGAiqs2eQb7Dt/JChwwwjab50UB2HjOG205kjjCMjs2B1HEYpow0jfmp/zNhxxgXjJ5ikmNRxyFYmdu82afKUqerHtOmRg5wZxi98rpJmksLWcZk5K9KVdMubPSe/YG7hvKLI5PwFxvJipcQkhK3jsrBU3Swi3coQWrykvKIsMudeusxYvlxZwWaY1HFZuUrdrKa7qT/+mkr8ubYqYCxfp5jcACZ1XNZv0Pa0boSNm5jyYPVmNsOkjoe3ZovlnKe2jh3cWgqr41CnbLOcq99uMrhjJ6yOJbgL48UHu0PWv5oGsyfinuq9oDqWfQqmER/srwetoThwsEl0SZRDhzG5kf3mlmzR5a4jR+X6UhwLid946PiJuPuW5MQd8U8h5TkJwMpzQNYSrkkW7xhLJp7jbz1JZmHWcqrK+O7mE0smnnO6/Iz+Dha2FjB6su45BWcrzmmzwtYCRk/WPKfy/IWLl2Jj4tYChSRrnnM5z9+WH3sPSlgLECoZew5CV66ia9dvRIckrAUIlYw9BxXdvIVQWyEekbEWGHQy9pxuyFgLDDqZeI6GhLUAoZJZz5GxFhh0Mus5QGuBQtkNncx6DtBaoFB2QyeLe44gtN0QJDwnEUh5TgL43zznLyLdF3YynjEo3XPabzvZlzEo3XPudDh4a7EGpXuON3TXub6MQVGec+++zUL9b7LO6HNX7JXJGhTlOQ9qH1qtCzzytTxWPzOTUHv0uasqdACfQCekL2tQtOc8eWq17tnz8IuOl69ed7mQJ/rcfYPQW3wCWZC+jEHRnoPevbda90F9rXxsUD410tfZjU/gM6Atx6CSvny1m24q/qZuyXWGwzOo7+z/ThjIdYbDM6gfP4MicVC4BvWrq9mJvnyDyvjtRF87g/oDLk6vFhy60iwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.202;4.blob,1.1,1452.iVBORw0KGgoAAAANSUhEUgAAAFcAAAA9CAMAAADveQViAAACEFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29t3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2mVlT0TExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG03NxZ+fjN4eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxx6ejGFNoVSIVIxMXowMHcoKBACAQKVPZVBGkEQECgtLXA7O5IaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2TkzxlZSkqKhGUlDw7OxhTUyJ0dC8TEwh9fTNKSh5ERBxubiw1NRYEBAFmZimXNoKhAAAB7ElEQVRYhWNgIAcwMpKljRBgYmZhpYW5bOwcTLQwdxSMAhoATi7amMvFSRNjuXl4aWIuHz9NjBUQFKKJucIiojQxV0ycJsZKSErRxFxpGVmamCsnD2cqKGCySASKSsoQhoqqGkxMXUNTC51FKtDWgfpeVw8uJqBvoI7OIhUYGkEZxibkGYAdmJqZU9M4OJDltqCJuUMNWFrRxlxrG1tqGmdn7wBlOToRp0PNmZsoc12gLFc3d+IM9vD0IqzI294HxvT1I85c/EDNH0wFBMJFgoItKTAvJBRIyIaFK0Wgy0QGR5FiUHQMGMSC2HHxCYlJDMrJKalp6ZgqMzJJMTcrEQyyGRhicnLzsvIZGAoKi4qxqSwpJcXcsnIwqGBgqKyqrgGJ1BrU1TdgUdnoS4q5iHBoam5pbQMJWXC3K3GGYajs6CTFXEQ4MMRmdyV2x4NFe0zM0BX29vWTYi4iHEBgwsRJUHGMltLk4CmkmIsOpuKSmDZ9BiXm4gQzZ9HE2NlzImlh7Nzp82hhLMP8BTQxdqQDRK0CY6kvVMMjS2w9hFSrwFhpi/DJElkPYQGLlyiQpY8QkJVfShNzGZYtp425vDoraGPwylW0MXe1EWE15ACvQhXaGLymnjbmrtVYRxNzletqaWIug9B60vUAAPmQYHDPP8K3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.300,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.489;4.blob,1.1,1692.iVBORw0KGgoAAAANSUhEUgAAAVsAAAAXCAMAAACS/Bx8AAAChVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFB9MjLOU1MJBATyYmJQICB9fTLOzlNFRarWVlZwLS2cPz+qRUXW1lZwcC1ifbdvAAACKUlEQVRYhWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtaQAQKCYCCEzKIzEBZBZ4mKwUSwsYYMEJcAA0lkFn2BlLQMBmt4AFk5MJBHZtEX8CooYrBGwSgYBaNgFIyCoQ2UlFXwsIYEUFXDIaGuoYnM1dKmg2NQgI4uPtZQAGqquGT09JF52lqosgYGtGYZGhkz4GYNAWBiaoZLytzCAMGxtLJmsLG1g/O57B0cacxycnaBWoaNNQQAtyuYcnNn9vD0QpUS8vZBcHz9GBj8jZQDAqF86owi4GcFBcNsx8Ya9IA3JBREhYVHREZFx6BJxsbBmfEJiUAyKTklNS2dbo7LyMzCwxr0IDsHnEZy8/IZGAoKi1Ali3lKYMzSsnIIo6Kyqppurqupxcca7KCuHkw1NIJIliY02eYWGKu1DUwptXd06nbRyW0MDN09+FiDHEj19oGo/sIJIGriJDTpyVOgjKnTpgPJjBkzZ82eQ0fnzZ03Hw9rkIMFCxeB6cWQdLsETXrpsuUQxoqVq4Dk6jXdiBYQtVteWEHlWnyswQ3WrYfQGyDl7UZ0+U2bIfSWrSBy23aEDLVbXgw7JAQxWAw7d+3GwxrUYA/PXghjH/P+ggMHIzAUHLIXAFGHjxxFl6F2ewvLnA4QHDt+Ag9rUIOTp2AspPkvZHD6zFkQde487d2COacDAqsv4GMNZnDxEiEVl6+AyKvXaO6U4TunM/BghM/pAAAko58+s/2phgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.513;4.blob,1.1,1752.iVBORw0KGgoAAAANSUhEUgAAAg4AAAASCAMAAAAE7qbCAAACZFBMVEUAAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQVHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkp3MDDUVlYMDAX19WNKSh4sLCwTCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRarIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEICAiXQ/Q8AAACd0lEQVRoge2Z11MUQRCHFw49whk4VFBBjJg9cwADiIqYc1YQwZxzDiQxi2LGHDBgzlkxgPhPITM7d1PrsmzvVs/wsN/D9nd9O1O/ruq6l1MUB4dagoKDg2RncGgwuEJCGsnO4NBgcDV2h1ILC5ebxAYRniYaa9qsudoxa3q38ER6ozSdFi1b2YuNDD9bHUTH/Hu0btPW33DFMgsPw0klgAhPnNbaxbMvzZreLRyR3vbaVoeOFvMKgputDmKia5+dOvsb/nXoktAVJ5QAunm6a61Hz14KzPRu4ejt7cPU56O1bz+f7eiYcLPp038A+RUcOGgw6/jXYchQtFjoDEv8z5KGjwCa3i0cI0cxS04ZnUpkzNhx9nIjw82mT9p4UtInTGQdtg6TJk9BiyWFqdOgZpbpM2YmU5s122I4QdQz25y586jMX8BabB0WLlqMlkoKSzIygQZnadYyy2dFUM9s2TnLqaxYuUptsXVYvQYvlRzWroManPUbrJ8VgfFsGzcx27xFFXUdtm7bjhdKDjt2Qg3Ort3Wz4rAcLY9iXuZ7tuviroOBw4eQkwlhdy8fKDBKSg8bPmsCAxnKzpylOmx4yeoqOtw8hRqLCmcLoYanDNnrZ8VgdFsJecCfv4CrXQdLiZcwgwlh8tXSoFmkqvea0yvp9ywkRAfg9luZtwKfLh95y6pdB3ulSHHksH9Bw+BZpJHWeVMHz95aiciOnS20meEJN6U5y+4916+ek0qXYc3b8Unxefde6iZ48PHgH/6bC2bKMhsXzyEr7wp377z71X8IMUV6/zBDeTnr9+yIwCprCLE8aaP8wc3mPI/1bIjoPHX7Q5VagAKz6+AhROlfwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.535;4.blob,1.1,3392.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.590;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492331280;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.662,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.641,2.96;4.blob,1.1,1712.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAAB8lBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT0+kpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqpP2GaiAAACzElEQVRYheWY91vTQBjHz1axoNWqdQCieG7ciHszxL2lriKC4ioqKgqugqLinrj3+D9NrrS53nzv2jyPPn5+SJO7975vCE3yAYT0DALUqAkELRYNHpJz34KhIU1FYRE7Mmx4GFSnZMRITUFRITMQGTUaVKdmTHSscn7c+AnMSHG0BFSnoXSicrpsEjsyuRxWp2EKnsqMTKP2p8+YyS6YNVuQIqjTUIHnZHebO2/+Audj4SL3oHIx+4WvwsWCFL5Oy5Klblev27LlK1auWr1m7Tp3cv0Gtrwa1whC+DottXXOZqPXrR6hTZu3bK1350LbtrPlO/BOPkNQp2XXbmezh+7m/Ph795HP/Q0xtvwAFtwAgjotBw+l99LdPA4f4crjjUf5DEGdjkjTMelcuLmFHzxeB6vT0IJPSOdaTwoGT52G1fHEzxAi5OBsQv6raRM9Ec81ngfV8VzAhHZycLEVtIbi0uUO0yUprlwlVLn7nV0VpsuD167b9aW4kTC/8dDNWzn3ranMOeKfwspz8oDMc0DWkmwqMO84kCzxHJi1dDew7249A8lizzG2FjCZZKHnGFsLmEwy7zk21gLFS057Do2FtQChkonnZGNhLUCo5FrufWpjLTDoZOI5WdhYCww62fOcNBbWAoRK5j3Hxlpg0Mm85wCtBQplN3Qy7zlAa4FC2Q2dbO45htB242HhOfnAynPywP/mOX8RJdGkn/Fyg+q57WdfuUHd6fXx1lIYVCRx17++KoO6d1+xMPM3WV/quWv2ylQa1IPmh7Kp2KNo12PnsyyAelLPXUehY+QE+iB91Qb15Kls5tnz5Ivel69e9wdROPXcfYPQW3IC5ZC+aoN6914288F5rXxsw5/a6escIifwGdBWY1CBL19V0x3V35ytd53h6AzqO/+/Ew7vOsPRGdSPn3GTOChag/rV3+lHX71Blf72o6/KoP4AX/GQnpWjFhgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.183;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAFcAAABQCAMAAABbExnmAAACEFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29t3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2mVlT0TExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG03NxZ+fjN4eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxx6ejGFNoVSIVIxMXowMHcoKBACAQKVPZVBGkEQECgtLXA7O5IaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2TkzxlZSkqKhGUlDw7OxhTUyJ0dC8TEwh9fTNKSh5ERBxubiw1NRYEBAFmZimXNoKhAAAB9klEQVRYhWNgoBZgZKSaUciAiZmFlRbmsrFzMNHC3FEwCkbBKBgFo2AUjIIhDDi5aGMuFydNjOXm4aWJuXz8NDFWQFCIJuYKi4jSxFwxcZoYKyEpRRNzpWVkaWKunDycqaCAySIRKCopQxgqqmowMXUNTS10FqlAWwfqe109uJiAvoE6OotUYGgEZRibkGcAdmBqZk5N4+BAltuCJuYONWBpRRtzrW1sqWmcnb0DlOXoRJwONWduosx1gbJc3dyJM9jD04uwIm97HxjT1484c/EDNX8wFRAIFwkKtqTAvJBQICEbFq4UgS4TGRxFikHRMWAQC2LHxSckJjEoJ6ekpqVjqszIJMXcrEQwyGZgiMnJzcvKZ2AoKCwqxqaypJQUc8vKwaCCgaGyqroGJFJrUFffgEVloy8p5iLCoam5pbUNJGTB3a7EGYahsqOTFHMR4cAQm92V2B0PFu0xMUNX2NvXT4q5iHAAgQkTJ0HFMVpKk4OnkGIuOpiKS2La9BmUmIsTzJxFE2Nnz4mkhbFzp8+jhbEM8xfQxNiRDhC1CoylvlANjyyx9RBSrQJjpS3CJ0tkPYQFLF6iQJY+QkBWfilNzGVYtpw25vLqrKCNwStX0cbc1UaE1ZADvApVaGPwmnramLtWYx1NzFWuq6WJuQxC60nXAwD702BwQvO9OQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.61,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.489;4.blob,1.1,1376.iVBORw0KGgoAAAANSUhEUgAAAC8AAAApCAMAAACSoICDAAACAVBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUYrrTRAAABwElEQVQ4jWNggANGJjBgRmbhAyysYMCGzMIH2DnAgBOZNQrAgIsbhwQPLx8yl18AQnNz4TJJUAiZJ8APpoRFRHGpFxOXQHAkpaTBtIwsmJKTV1BUUkZVz6yiiuCoqYMpDU0tEKWto6unb2CIZoGRMZxpYmoGps0tLEGUlbUNA4OtnT2qegdHJxjT2cUVTLu5gykPTxDp5Y1mgY8vjOXnD6YCAoNAVLBdCIgKDUNTHx4BZURGRYPpmNg4MB0PMT8BTX1iUjKEkZKaBqbTMyD8TIj7s9DUM2TnQOjcPDCV71gA4RcqFNkWl+iiK2coLWMEUeUVlWBuVTVMoqZWwauuHkN9Q2MTiGpugXBb2zBUoIH2DhDZ2UVI3ShgwMhx2AA4t3b39EJ4qDkOG4Dk1r5+CA8lx2ED0Nw6YeIkMBclx2ED0Nw6ecpUCB8px2ED0NzKwDBtOoRGynHYADS3MjDMqJgJYSByHDYAza1AMGs2hIbnOGwAmltBYM5cCA3PcdgALLcCwbz5CyAMWI7DBmC5FQQWLoLQ0ByHDcBzKwgsXrIUTENyHNb6EZFbgWDZ8hUQBjjHYa0fUXPrylVIHKLqRwBmy08xcnLTowAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.552;4.blob,1.1,980.iVBORw0KGgoAAAANSUhEUgAAAGkAAABxCAMAAADh2X3+AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAABzklEQVRoge3Xx04DQRCE4TUYHEmDSQZsMiYaTA4mvv87IXFpqYa2kKe6kdD0aU9/3Wb1FYXplWzzchOTTkPlqWmfoUq15jNU1BtNp6WZWaehYm7eaWgh1J2WFkPLaWkpLDstrYRVp6W19rrTUrGx6bXUqXotddtbXlPbO7tOS829fael4uDQa0m5ntkbj+Wj4xOjpah8ema0FJXPG1YPVVTuXxgtReXL0DNawvIgXBktReXrjtFSVL4xe+exfNu3WsLy3b3VEpQrD49GQ1h+Cs9GS1iuDa3+XFh+eTUawvLb+8BoCMofw7LREJZbn0ZDhmX9Sj98scvfJ8JmWxt6Imy2taEnwmZbG3sibLa1sSfCZlsbeyJstrWhJ8JmWxt7Imy2tbEnwmZbG3sibLa1sSfCZls76omw2dbGngibbW3sibDZ1o56Imy2tbEnwmZbO+qJsNnW/nO7y7EVr/fYih/RYyte77EVP6LHVrzeYyte77EVP6LHVrzeYyte77EVr/fYild7bMXrPbbi9R5b8XqPrXi1x1a82mMrXu+xrZ3tPtZlu49/2e4Jl+2ectnuSZftnnTZ7ra9bPdfXLZ70mW7J122e8Jluyfcf7X7Fy41RZkegX/oAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492331378;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.652,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.115,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.174,3.215,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.631,2.96;4.blob,1.1,1712.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAAB8lBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSkpPT0+kpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqpP2GaiAAACzElEQVRYheWY91vTQBjHz1axoNWqdQCieG7ciHszxL2lriKC4ioqKgqugqLinrj3+D9NrrS53nzv2jyPPn5+SJO7975vCE3yAYT0DALUqAkELRYNHpJz34KhIU1FYRE7Mmx4GFSnZMRITUFRITMQGTUaVKdmTHSscn7c+AnMSHG0BFSnoXSicrpsEjsyuRxWp2EKnsqMTKP2p8+YyS6YNVuQIqjTUIHnZHebO2/+Audj4SL3oHIx+4WvwsWCFL5Oy5Klblev27LlK1auWr1m7Tp3cv0Gtrwa1whC+DottXXOZqPXrR6hTZu3bK1350LbtrPlO/BOPkNQp2XXbmezh+7m/Ph795HP/Q0xtvwAFtwAgjotBw+l99LdPA4f4crjjUf5DEGdjkjTMelcuLmFHzxeB6vT0IJPSOdaTwoGT52G1fHEzxAi5OBsQv6raRM9Ec81ngfV8VzAhHZycLEVtIbi0uUO0yUprlwlVLn7nV0VpsuD167b9aW4kTC/8dDNWzn3ranMOeKfwspz8oDMc0DWkmwqMO84kCzxHJi1dDew7249A8lizzG2FjCZZKHnGFsLmEwy7zk21gLFS057Do2FtQChkonnZGNhLUCo5FrufWpjLTDoZOI5WdhYCww62fOcNBbWAoRK5j3Hxlpg0Mm85wCtBQplN3Qy7zlAa4FC2Q2dbO45htB242HhOfnAynPywP/mOX8RJdGkn/Fyg+q57WdfuUHd6fXx1lIYVCRx17++KoO6d1+xMPM3WV/quWv2ylQa1IPmh7Kp2KNo12PnsyyAelLPXUehY+QE+iB91Qb15Kls5tnz5Ivel69e9wdROPXcfYPQW3IC5ZC+aoN6914288F5rXxsw5/a6escIifwGdBWY1CBL19V0x3V35ytd53h6AzqO/+/Ew7vOsPRGdSPn3GTOChag/rV3+lHX71Blf72o6/KoP4AX/GQnpWjFhgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.174;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAiCAMAAABFhiY1AAABUFBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHaGkzMAAABZ0lEQVRYhe2W107DQBBFTTeQEHrvvTtAAqGXEHrvJRB6L///hmKzHmt2YCNrWQsp52WOrFnfp5GupkkhIzNLzo/ckZ3jZXpunm67rv+y+CfkFxQy9fmLAqrji0uYlZaV+1SnV1RWqY50Ul3jZXptnZfp9Q2NXsY3NX8LXJzC22vxt5oTLk7l7bW1d5gTLk7p7XV2KYtKk+a/0t3TK/V/0LEo4+jrl5ru6FiUYQYGDdsN46ctMcGgNaFjUYYZGh5hGgqPjrkNj4xPTJoCHYsyjqlpZjOzcyG36fML0Yhl0LEowyzGltxGkkDHooxjeUVquqNjUYZZXZObDh2LMsz6xqbUdOhYlHFsbUtNh45FGmYnvGvJ3v4BEgGHR8eEso5FGawxOzk9sz6cx+JIBFxcJghlHYsyWLPt6tqaN7caEgF395Q6OhZnsOZ8kOTh8QmJgOeXV0JTe8E9iL+9IxGQ+PgkNLUXSfsCdfE49khXJRgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.212;4.blob,1.1,3396.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.280;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABdFBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAgfTU0dSUkECwtKHh62SkqBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmIGDg6cnD/g4Fpyci4ODgYJFxcBAgItEhJf7Oxh7+8GEBAnJxAEBAJX19dY29sNIA1n/2cLGwsIEwgOIg4CBQIOIw5k92SmYcEaAAAA60lEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1igYZICLmweZy8uHQx2/gCCEISQsIioGFRSXkGRlwaFBSlpGVg7MkldQVFJWATJU1dQ1NLVwOkVbR1dP3wDCNjQyNmFgMDUzJ5BmLCytrIGUja2dvYMjA4OTs4urGx7l7h6eXt4+DL5+/gGBQWCR4JBQ1rBwHMojIqOiY2KBjLj4hESEcFJyCrrK1FQwlZaekQlmZGWjyuegqefJzcsH0QWFeFyLnDFtiop58CiFACIzJgKMZkxSQUlpGakayknTUFFaSZqGqmpUPgDwWSE0bq9O5QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.290,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.489;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAAVEAAAAXCAMAAACF3oy1AAAChVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFB9MjLOU1MJBATyYmJQICB9fTLOzlNFRarWVlZwLS2cPz+qRUXW1lZwcC1ifbdvAAACKElEQVRYhWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtYgBwKCYCCEzKIzEBZBZ4mKwUSwsQY5EJcAA0lkFn2BlLQMBmsoA1k5MJBHZtEX8CooYrBGwSgYBaNgFIyCwQSUlFXwsAYxUFXDIaGuoYnM1dKmg2NQgI4uPtbgBWqquGT09JF52lqosgYGtGYZGhkz4GYNWmBiaoZLytzCAMGxtLJmsLG1g/O57B0cacxycnaBWoaNNWgBtyuYcnNn9vD0QpUS8vZBcHz9GBj8jZQDAqF86vTm8bOCgmG2Y2MNUsAbEgqiwsIjIqOiY9AkY+PgzPiERCCZlJySmpZON8dlZGbhYQ1SkJ0DTg+5efkMDAWFRaiSxTwlMGZpWTmEUVFZVU0319XU4mMNTlBXD6YaGkEkSxOabHMLjNXaBqaU2js6dbvo5DYGhu4efKxBCaR6+0BUf+EEEDVxEpr05ClQxtRp04FkxoyZs2bPoaPz5s6bj4c1KMGChYvA9GJIGl2CJr102XIIY8XKVUBy9ZpuRNuF2m0mrKByLT7WYATr1kPoDZBydCO6/KbNEHrLVhC5bTtChtptJoYdEoIYLIadu3bjYQ1CsIdnL4Sxj3l/wYGDERgKDtkLgKjDR46iy1C7pYRlVgQIjh0/gYc1CMHJUzAW0rwRMjh95iyIOnee9m7BnBUBgdUX8LEGH7h4iZCKy1dA5NVrNHfKcJsVGXgwImdFAKLZnz70EZ72AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.112,3.516;4.blob,1.1,1612.iVBORw0KGgoAAAANSUhEUgAAAfoAAAAPCAMAAAA74/1lAAACRlBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkp3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRarIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEeB03iAAACLUlEQVRYhWNgAAJGJoahCphZWNFYbOwcUBFiWdhMQQacXNxoIjy8fJQ5myYA2Uc4AL8AkBAUEoYLMDHS0kU0BcwsIugsUTGYJLEsbKYgAU4ucXQhCUlyHUxLgOQjHECAH0RKScP4MrJytHQQTYE8iwI6S1FJmYE0FjZTkIAKlyqMqaYGodU11ChyNm0Ako+wA00tcJmmraMLFdDTp7GTaAgMDDFYRsYmJLKwmYIETM1gLHMLSysww9rGljJ30wQg+Qg7sLMHUw6OThC+s4srjZ1EZ+DmTiqLWODh6WUOYXn7kOs6WgICPvL184cwAgIhdFBwCI1dRGcQGhZOIot0EBEZRbZe2gECPoqOiYUw4uITwHRiEq1dRG+QnEIqi3SQmka+XtoB/D5Kz4CxMrNAZHZOLq0dRG+Ql08qi3RQUEi+XtoBvD4qMiyGMUtKQWRZeQXNXURnUFlVTSKLdFBTW0e2XtoBvD6qb2iEMZuaW4BkaxsdnERn0N5BKot00NlFvl7aAXw+6u5BsHv7GBj6ZSfQ3kH0BhMnTSaRRSSYwjUVxpxmMZ0SJ9II4PHRjLCZCM6s2XMY5s6jh4voDOYvWEgii0iwKHIxjLlk6TJKnEgjAPHR5OVgYITMYlixEkndqtVrGNauGyBH0hSs30AqiziwcROCvXkLeW6jLQD7aCsLGGxDZjFs34GsbueugXHfUAW79+wdaCcQBfbtBwMRZNYooAgsPnBwoJ1APQAA6r+dGFmyzPIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.535;4.blob,1.1,1980.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAACx1BMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkV7gB8/AAACwUlEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaNgsIAzZ89RwZTzF6hgyMVLlyk35MrVa5QbwnD9BhUMuXnrNhVMuXOXCobcu08FQx48fEQFUx4/oYIhT589p9yQFy9fUW4Iw+s3RCsFAGzqnbVs9zLwAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.712,3.571;4.blob,1.1,700.iVBORw0KGgoAAAANSUhEUgAAABkAAABeCAMAAADhak+FAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIiLXrgAAAA9UlEQVRIie2TyU4CQRRFS0WRqZ1KVERBsR1wRHGWQdT//yWx7qvcxQ0JSxd1FpVzcpNOb55zUxZchBZYXFILFJZXxIqr06dUrljSsFRrmSUNy9p6TBqWjc2YtLBs+aoVDcu2r1vRsOz4XSsalj3fsKJh2W8eWNHs3w5bMWlY2uWYNCxHzWNLGhbXOcmtaViy0zNrGhZ3fhE/QpuTbqYGLq+uxYybWzVwV2uIGb17NfDgu2Kg7x/FjKe2GnhuqYGXnhp4fVMLlN4/xMDAD8VAZZSLgfGnWmDy1RcLfI8KYqD+ozabdNvptkm67T/Sbafbdv/vtn8BEjo47OVAAs8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492331488;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.642,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.280,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.621,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.212;4.blob,1.1,1388.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAAB+FBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2mVlT0TExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG03NxZ+fjN4eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxx6ejGFNoVSIVIxMXowMHcoKBACAQKVPZVBGkEQECgtLXA7O5IaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2TkzxlZSkqKhGUlDw7OxhTUyJ0dC8TEwh9fTNKSh5ERBxubiw1NRYEBAFmZilRNrViAAAB00lEQVRYhe2W1VcCURCHL2J3YYACdndgd2OLgd3d3d3d3flvKisLngVh7+o8eI7fw+7vzMz9HublXoS0w9KhMcQEHRaMl62rByPWN4DxGhoZw4hNTM1gxOYWMF5LK2sYsY0tB0ZsZ6+IDg6qCRdHLu8zODnzyZpA6OJKTdi4ucsX4OGpqBl6eQuoCRsfX3nw82doUE9AYNCv+hRw2MEw4r9HSCiQOCw84ld9kaIoeYqOoXeCH8umJ46Tp/iERHrmpOQUGlOpojQypmfQE2uBn0n8srIVlRxxyA98uXmyLye/gFtIbRWJi3FMJRKCUlkuK6+QViLEq6quqa1THa1vwBE3SgmaEJI0t7Q2tn2U2js6u9SNdvfgiHv7CPoRGhgcGiZKI96jY+NqRifSccTKVUxOTc/MErVg9hyXla8yOr+AI1auApU2LUqXyj/Ly/6B1MmV1TUcsXIVMtY3NsmGyiNqS7yNI6ay821nd2//J+LvOTiE8R4dF4F4T/ZOQbzo7BzG+8+Xi4ZMggu+hi7tq+nLRUOm2ktNXbpXkxqurhm/WDXDsb+BEaPbOyCxnvs9kPnhEUj85Kt9hhEpHU5A5ucxIPGL8BVGzBsdgREj4zcGh94BwbFW0Y12qKsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.278;4.blob,1.1,960.iVBORw0KGgoAAAANSUhEUgAAADAAAAAhCAMAAACoVtiLAAABjFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUlKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0YPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92TOFrnWAAAA/klEQVQ4jWNgQAaMjAwkASZmFlaSNLCxczCBaE4uMOBGZuEFPLxgwIfMwgv4BcBAEJk1CvABIWERUjWIkqZBTFgcVUBCkgmZKyWNpkFGFkLLyStAGIpKyiqqUEk1dQ1eHhw2aWpp6+iCWXr6BoZGxkCGiamZuYUlTrdZWdvY2tlD2A6OTs4MDC6ubgTSjLuHpxeQYvP28fXzZ2AICAwKDsGjPDQsPCIyiiE6JjYuPgEskpiUzJuSikN5WnpGZlY2kJGTm5ePEC4oLMKhobiktAzMKK9AlajEoaGqGo9ricyYCEBkxkSA0YxJKqiprSNVQz1pGhpqG0nT0NSMygcAiosm6spfh4IAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.280,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.489;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAAVEAAAAXCAMAAACF3oy1AAAChVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFB9MjLOU1MJBATyYmJQICB9fTLOzlNFRarWVlZwLS2cPz+qRUXW1lZwcC1ifbdvAAACKElEQVRYhWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtYgBwKCYCCEzKIzEBZBZ4mKwUSwsQY5EJcAA0lkFn2BlLQMBmsoA1k5MJBHZtEX8CooYrBGwSgYBaNgFIyCwQSUlFXwsAYxUFXDIaGuoYnM1dKmg2NQgI4uPtbgBWqquGT09JF52lqosgYGtGYZGhkz4GYNWmBiaoZLytzCAMGxtLJmsLG1g/O57B0cacxycnaBWoaNNWgBtyuYcnNn9vD0QpUS8vZBcHz9GBj8jZQDAqF86vTm8bOCgmG2Y2MNUsAbEgqiwsIjIqOiY9AkY+PgzPiERCCZlJySmpZON8dlZGbhYQ1SkJ0DTg+5efkMDAWFRaiSxTwlMGZpWTmEUVFZVU0319XU4mMNTlBXD6YaGkEkSxOabHMLjNXaBqaU2js6dbvo5DYGhu4efKxBCaR6+0BUf+EEEDVxEpr05ClQxtRp04FkxoyZs2bPoaPz5s6bj4c1KMGChYvA9GJIGl2CJr102XIIY8XKVUBy9ZpuRNuF2m0mrKByLT7WYATr1kPoDZBydCO6/KbNEHrLVhC5bTtChtptJoYdEoIYLIadu3bjYQ1CsIdnL4Sxj3l/wYGDERgKDtkLgKjDR46iy1C7pYRlVgQIjh0/gYc1CMHJUzAW0rwRMjh95iyIOnee9m7BnBUBgdUX8LEGH7h4iZCKy1dA5NVrNHfKcJsVGXgwImdFAKLZnz70EZ72AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.102,3.516;4.blob,1.1,1612.iVBORw0KGgoAAAANSUhEUgAAAfoAAAAPCAMAAAA74/1lAAACRlBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkp3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRarIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEeB03iAAACLUlEQVRYhWNgAAJGJoahCphZWNFYbOwcUBFiWdhMQQacXNxoIjy8fJQ5myYA2Uc4AL8AkBAUEoYLMDHS0kU0BcwsIugsUTGYJLEsbKYgAU4ucXQhCUlyHUxLgOQjHECAH0RKScP4MrJytHQQTYE8iwI6S1FJmYE0FjZTkIAKlyqMqaYGodU11ChyNm0Ako+wA00tcJmmraMLFdDTp7GTaAgMDDFYRsYmJLKwmYIETM1gLHMLSysww9rGljJ30wQg+Qg7sLMHUw6OThC+s4srjZ1EZ+DmTiqLWODh6WUOYXn7kOs6WgICPvL184cwAgIhdFBwCI1dRGcQGhZOIot0EBEZRbZe2gECPoqOiYUw4uITwHRiEq1dRG+QnEIqi3SQmka+XtoB/D5Kz4CxMrNAZHZOLq0dRG+Ql08qi3RQUEi+XtoBvD4qMiyGMUtKQWRZeQXNXURnUFlVTSKLdFBTW0e2XtoBvD6qb2iEMZuaW4BkaxsdnERn0N5BKot00NlFvl7aAXw+6u5BsHv7GBj6ZSfQ3kH0BhMnTSaRRSSYwjUVxpxmMZ0SJ9II4PHRjLCZCM6s2XMY5s6jh4voDOYvWEgii0iwKHIxjLlk6TJKnEgjAPHR5OVgYITMYlixEkndqtVrGNauGyBH0hSs30AqiziwcROCvXkLeW6jLQD7aCsLGGxDZjFs34GsbueugXHfUAW79+wdaCcQBfbtBwMRZNYooAgsPnBwoJ1APQAA6r+dGFmyzPIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.535;4.blob,1.1,1980.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAACx1BMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkV7gB8/AAACwUlEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaNgsIAzZ89RwZTzF6hgyMVLlyk35MrVa5QbwnD9BhUMuXnrNhVMuXOXCobcu08FQx48fEQFUx4/oYIhT589p9yQFy9fUW4Iw+s3RCsFAGzqnbVs9zLwAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492331588;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.632,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.174,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.193,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.203,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.278,2.26,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.609,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.647,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.611,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.174;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAiCAMAAABFhiY1AAABUFBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHaGkzMAAABZ0lEQVRYhe2W107DQBBFTTeQEHrvvTtAAqGXEHrvJRB6L///hmKzHmt2YCNrWQsp52WOrFnfp5GupkkhIzNLzo/ckZ3jZXpunm67rv+y+CfkFxQy9fmLAqrji0uYlZaV+1SnV1RWqY50Ul3jZXptnZfp9Q2NXsY3NX8LXJzC22vxt5oTLk7l7bW1d5gTLk7p7XV2KYtKk+a/0t3TK/V/0LEo4+jrl5ru6FiUYQYGDdsN46ctMcGgNaFjUYYZGh5hGgqPjrkNj4xPTJoCHYsyjqlpZjOzcyG36fML0Yhl0LEowyzGltxGkkDHooxjeUVquqNjUYZZXZObDh2LMsz6xqbUdOhYlHFsbUtNh45FGmYnvGvJ3v4BEgGHR8eEso5FGawxOzk9sz6cx+JIBFxcJghlHYsyWLPt6tqaN7caEgF395Q6OhZnsOZ8kOTh8QmJgOeXV0JTe8E9iL+9IxGQ+PgkNLUXSfsCdfE49khXJRgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.212;4.blob,1.1,1132.iVBORw0KGgoAAAANSUhEUgAAAZcAAAAPCAMAAAAf+nKlAAABpFBMVEUAAAB3dzDU1FYMDAX19WNKSh6kpEKoqEQyMhT9/WYbGwtGRhz29mMODgYIAwiQkDq8vEwDAwHm5l1jYygHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwEBALp6V5eXiaLizjBwU4EAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbVLSx709GMLCwQtLRL+/mcfHw2qqqra2toEBARHR0f///9BQUGpqUSjo0LQ0FR8fDL09PSEhITr6+uMjIwPDwb392RFRRxyci7Z2VgJCQlsbGzR0dGgoKBkZCjk5FwCAgEYGAr8/GY3Nxb19fWNjY3Cwk6KijgICAO3t0qVlTytra1ERERUVCKZmT4FBQIhIQ0sLBIHBwOOjjmPjzoKCgRZWSTs7F8GBgJUIlSZPpkFAgUpKSm3t7dfX1/t7e1WViOYmD59fTLOzlOBgTSDgzUJCQTy8mJQUCBWI1aYPpgCAQI6OjrExMSXl5cODg5nZyqCgjXW1lZwcC2cnD+qqkVnKmeCNYKSkjtCQhsJBAmSO5JCG0IBAQAyFDIBAAGz+aDQAAABaElEQVRYhWNgQAGMTAyjAASYWVjxsOgOmBgHyubBBtjY8bHoDDg4uQbI5kEHuHl48bAYGPj4aMXCAvgFiHX2sAeCQsJ4WAwiomLiNGFJSEpJy8iiukVOXoFyDw0XoKiEj6WsoipCC5aauoamlrYOqlN09fQp989wAQaGRnhYtALGJqYMDGbmFiiCllY0tnVIAWsbfCwaAVs7EGnvgCzm6ORMY1uHFHBxxceiDXAzdwdRHp7Igl7ePrS1dWgBXz9/PCwagQBIfglEFgsKhjNDQjBZIw6EhuFjYQFUaCeHQ+qXCAaGyKhoiEyMYSxMUVx8QiI6a+SBpOQU3KzUtHQGNBY12skZUplmWdkaQFZOLrT0ysuHu0iuoDAOnTXyQFFxCW5WaVk5AxqLKi3mikop+6pqIKOmFmp+XT31vDQ8QEMjblZTM0wEwaImKGpppYWxwx20tXdgsKgKfDg6aWHscAflXd0YLGoCAOg/Ujpi0eUYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.229;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAAFcAAAASCAMAAAAZg7KBAAABXFBMVEUAAAAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2ksLBKVlT0yMhQTExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG0CAgE3NxZ+fjOZmT54eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXgFBQJBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBODgzWRkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxwBAQB6ejF3dzCFNoVSIVIxMXowMHcoKBBwcC2SkjsCAQKVPZVBGkEQECgtLXA7O5IbGwsaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0oXst5AAABBElEQVQ4jWNgwAYYmbAKUwyYWVipaRwbOweUxclFnA5uHl6izOWDsvgFBIkzWEhYhLAiUXYxGFNcgjhz8QNuSTAlJQ0XkZFlpMA8OXkgoaCopKyCLqMqq0aKQeoaYKAJYmtp6+jqMegbGBoZm2CqNDUjxVxzXTCwYGDQsLSyNrdhYLC1s3fAptLRiRRznV3AwJWBwc3dwxMk4uXt4+uHRaW/OCnmIsIhIDAoOAQkFMobphyuiKEyIpIUcxHhwKBpEaUbrQ0WjYmNQ1cYn5BIirmIcACBpOQUqHgqusI02XRSzEUHGbgkMrOyKTEXJ8jJpYmxefmqtDC2IKuQFsYyFBVTagIAwOskf6qFHMoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.602,3.231;4.blob,1.1,664.iVBORw0KGgoAAAANSUhEUgAAAHQAAAAPCAMAAAACoRsXAAAA9lBMVEUAAAB3dzDU1FYyMhT9/WYbGwsIAwiQkDq8vEwHAweOOY6POo8KBAoSLCwsbW0EBALp6V5eXiYEAgSBNIGDNYMBAgIWNzczfn4+mZkxeHhLSx709GMLCwQCBQUaQUE2hoY8lZUoYmIOIiKpqUSjo0IpZGQ9l5cfTU0FCwsPDwb392RFRRwTMDA1g4M7kZEkWVkLHBxkZCjk5FwCAgEAAQEUMjIxenowd3fCwk6KijgQKCgtcHA7kpIhIQ3+/mcsLBJUIlSZPpkFAgULGxt9fTLOzlNWI1aYPpgCAQLW1lZwcC1nKmeCNYIJBAmSO5JCG0IyFDIBAAFo+UclAAAAt0lEQVQ4jWNgAAJGJgb6AyZG+tvJzMIKYbCxwYRox4IBdg4IzcnFzUNrFhDw8gEJfgFBCE9IWIST1ixRMXEJSSAtJS2D7ndaAVk5eQVFJRBLWYVedjKoqqlrgBmaWtp0s1RHV0/fAMQwNDKmm6UMJqZmEuZiDAwWlniVUT3LWFnbMNja2cP5Do5O6CwaZBkGZwYXVwTPzd0DnUXtLAMBnl4ItrcPJovWwNfPH4NFc+AREIjBogkAALx7GXx3ilXVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.293,3.250;4.blob,1.1,1040.iVBORw0KGgoAAAANSUhEUgAAAfgAAAAPCAMAAAA/Fi1YAAABQVBMVEUsLBKVlT0yMhQAAAAHBwOTkzx3dzDU1FZKSh75+WVUVCIsEiyVPZUyFDJHRx1/fzQvLxOJiTcODgZiYihlZSlPTyDk5FwXFwkvEy+JN4kOBg4qKhGUlDwICAP9/WYbGwseHgyYmD4QEAcCAgGKijg7OxiQkDq8vEwLCwTs7F/v72EQEAZWViNxcS5TUyJ0dC8EBALp6V5eXibX11fb21iMjDk4OBcTEwhLSx709GMtLRKSkjt9fTOpqUSjo0JERByCgjUPDwb392RFRRwJCQQpKRGXlz0hIQ1kZCg8PBgBAQBubixZWSTCwk4GDg41NRaOjjkEBAH+/mf//2cUFAgaGgsECwtf7Oxh7+8GEBAFBQKRkTswMBN9fTLOzlN8fDIDBwdX19dY29tmZinW1lZwcC2srEXY2FeAgDRDQxvz82KoeY0+AAABhElEQVRYhe2YaU/CQBRFK1MBUUEK4oZiLSJuUFEUV8QNFUVFxX3f/f8/QJOKNZ1pzGvS1wnhfOnJtG9609sPTQWhyUU0aiY2C4QY1thW57g9hgVvi4+6qLWtnbJv/AGQmexiIwLpCEo/XrNQWD9Pn/1r9Y3HbVzpjHRRV3X39FJGSMAPM/YuNiIw1vqi/Ri35h3XQEwTCf6eD8pDQMOGVbwSH0bPwSGJEe2YHB0bh85OTEING1bxJJXGjsEh6lRGE3F6JgmcVbKzQEOHWXxMnsPOwR+5eWjdOguLItDQYRZPlrzIMThkecX6bDgENXTYxedXkWPwR2Ft3fLsRnQTaPiwi5e2isg5uGM7olie3QnuAg0fdvGktIcbgz/249Zn0ymoIVMumxV/cHiEG4U3ihX9yWSPYf81TuRToCFTPTu/MCn+8uoaNwtv3NzqnqiooNncHdSQuX94rJoUTzJPmEn44/lF99c32Oz7B9QcwKz4Br8UPktOR7CBRvH/ovqc+/a2jy8Le4rI2D19iAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.280;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABelBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUkECwtKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0DBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QGoOnnAAAA7UlEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTEILS4hCWFIScvIykEl5RUUWVlw2KSkrKKqBmapa2hqaesAGbp6+gaGRjjdZmxiamZuAWFbWlnbMDDY2tkTSDMOjk7OQMrF1c3dw5OBwcvbx9cPj3L/gMCg4BCG0LDwiMgosEh0TCxrXDwO5QmJSckpqUBGWnpGJkI4KzsHh4bcvPwCMKOwCFWiGIeGklI8riUyYyIAkRkTAUYzJqmgrLyCVA2VpGmoKq8mTUNNLSofAAEvIZp7XlvZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.489;4.blob,1.1,1376.iVBORw0KGgoAAAANSUhEUgAAAC8AAAApCAMAAACSoICDAAACAVBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAh3MDDUVlYMBQX1Y2NKHh53dzDU1FakQkKoREQyFBT9ZmYbCwtGHBz2Y2MOBgYyMhT9/WYbGwuQOjq8TEw3NzfBwcH39/fp6emTk5MMDAzmXV1jKCiQkDq8vEwEAgLpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiZLHh70Y2MLBASqqqra2toEBARHR0f///9BQUEtEhL+Z2cfDQ1LSx709GMLCwSpRESjQkL09PSEhITr6+uMjIzQVFR8MjKpqUSjo0IPBgb3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRxkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgHCTk6KODitra1ERES3SkqVPDzCwk6KijghDQ0sEhIpKSm3t7dfX1/t7e1ZJCTsX18hIQ3+/mcsLBJ9MjLOU1M6OjrExMSXl5cODg4JBATyYmJQICB9fTLOzlPWVlZwLS2cPz+qRUXW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUYrrTRAAABwElEQVQ4jWNggANGJjBgRmbhAyysYMCGzMIH2DnAgBOZNQrAgIsbhwQPLx8yl18AQnNz4TJJUAiZJ8APpoRFRHGpFxOXQHAkpaTBtIwsmJKTV1BUUkZVz6yiiuCoqYMpDU0tEKWto6unb2CIZoGRMZxpYmoGps0tLEGUlbUNA4OtnT2qegdHJxjT2cUVTLu5gykPTxDp5Y1mgY8vjOXnD6YCAoNAVLBdCIgKDUNTHx4BZURGRYPpmNg4MB0PMT8BTX1iUjKEkZKaBqbTMyD8TIj7s9DUM2TnQOjcPDCV71gA4RcqFNkWl+iiK2coLWMEUeUVlWBuVTVMoqZWwauuHkN9Q2MTiGpugXBb2zBUoIH2DhDZ2UVI3ShgwMhx2AA4t3b39EJ4qDkOG4Dk1r5+CA8lx2ED0Nw6YeIkMBclx2ED0Nw6ecpUCB8px2ED0NzKwDBtOoRGynHYADS3MjDMqJgJYSByHDYAza1AMGs2hIbnOGwAmltBYM5cCA3PcdgALLcCwbz5CyAMWI7DBmC5FQQWLoLQ0ByHDcBzKwgsXrIUTENyHNb6EZFbgWDZ8hUQBjjHYa0fUXPrylVIHKLqRwBmy08xcnLTowAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.32,3.552;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.552;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAABw0lEQVRoge2X104CURRFB6yIXhQbFsAGYgF7wV7+/58MiQ9z95nMTHL28cGc9cS9IWsShmRnJYkZlaqde8LU9IztA2bnbP3ztQXbB9QXbf1LoWLqb4RlU3+y0rT1r67Z+tfrtv6NTVN9a2vb1L8Tdk397U7X1L+3b6o/OGxY6o86PUt90j821f9isWKD1GeDFTs5TZ/oK9Y7O08f2SvWGrbjC/KKjWrwRskrdnEJF+QVu7rGG+qK3YQRXlFX7Db08Yq6YnfhHq+oK/YQ8O/OXbHH8RPckFfsGd8mecWaQ7ggr9jL+DU601fs7T39e/BXrPrxmToZrNjXN11ZBvZSoo+9lMLHXkr0sZdS+Ni9hz5276GP3XvCx+499LF7D33s3kMfu/fAx+499LF7D33s3kMfu/fAx15K8LGXEn3spfybfpwwKP6Kxhf3nh7wQe+pAZ/oPSXoE72nBH2i95SgT/aeDvBl9J4K9GX0ngr0ZfSeCvTJ3tOBPtl7OoRP9J4S9IneU4I+7D0twhf3nh70xb2nR/jYvef9WArvxyK8HwvwfszH+zEX78c8vB9L+rwf83zej7k+78cY78cCvB8L+Ff9+APpqDnRApnbgQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492331690;4.copy,1.1,2.10,2.19,3.950,2.76,2.14,1.1,1.0,2.19;4.rect,1.1,3.622,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.98,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.117,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.117,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.141,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.136,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.221,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.229,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.250,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.280,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.291,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.307,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.402,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.478,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.500,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.497,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.516,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.516,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.516,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.535,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.535,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.552,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.573,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.571,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.592,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.590,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.628,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.601,2.96;4.blob,1.1,1864.iVBORw0KGgoAAAANSUhEUgAAAHcAAAA1CAMAAABMd4TfAAACK1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f383iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUWNjYXOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0ZPT0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6enpKSko2hoYeS0tPT08RKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKkpKSoqKhGRkb29vZjY2OLi4vBwcEFBQUtLS0fHx+UlJRpaWnQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIRERFMTExycnLZ2dlmZmYvLy/7+/sjIyP8/Pw3NzcQEBC3t7dZWVns7OwJCQmqqqo3SAbRAAADBUlEQVRYheWY91/TQBTAz1axoNWqdQCiGOvCjSgKIgoiCm6RuooIiquoqCi4ioIbN4qKe+Le488zvTbNcZfcvUubz0c/fn/IuPfuvTRtcl9ASEwvQA4fh9PCpN594u6b1NclyEhOoUf69XeD8rgMGChISEmmBjyDBoPy+AzxDuXGhw0fQY2ketNAeQLSR3LDGaPokdGZsDwBY5Sx1IiPOB43fgI9YeIkgyoGeQKylMk9u02ZOm26upsxM3ySPYv+wecoqQZV2Dwhs+eEu+rdcufOy8ufX7CgMBxcuIhOL1KKDYqweUIWl6ibJXq3UoSWLisrLw3HXMtX0OkrlVVsDYM8IavXqJu1ZDf146+rwPv1lX46fYNi8AAY5AnZuEk70rrpbN7CpAeqtrI1DPJEeKq3mcbcNbXs4PYSWJ6AWmWHaaxup8Hgrt2wPJbAHowHn+wNmn819UZvxH1V+0F5LAcUTAM+OVgHmkNw6HCj7JQIR45icsLHTc1ZstOdx45b60twIij/4KGTp+LuW5wdd4l/CkuekwDMPAdkLaHqJPmO0cq65/haTutRmLWcqaTXbjHRyrrntJa1xdZgaWsBE6sc85z8s+XntKi0tYCJVdY8p+L8hYuXomPy1gJFr6x5zuVcX3tedB20YC1AiMrYcxC6chVdu34jMmTBWoAQlbHnoMKbtxBqL8AjVqwFBlkZe04PrFgLDLKy7jkaFqwFCFGZ9Rwr1gKDrMx6DtBaoBB2Q1ZmPQdoLVAIuyEry3uOJKTd6FjwnERgyXMSwP/mOX8Rad6QneXNDarjtp19zQ3qTqeNjxbHoDzBu/b15RnUvfucibG/yboi7125JZNrUA9qHpqF/I+8zY/VfYYDdUTeu6pC+/EFdEH68g3qyVOzyLPnoRedL1+97nYid+S9+waht/gCMiF9+Qb17r1Z5IO6rHysVz41kPfZhS/gM6CtwKAcX77ywo1F39Stfp/hiAzqO/u/Ewb9PsMRGdSPnwGZclCEBvWru8mOvmKDSv9tR1+eQf0BZ+Ohfd8ZpI0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.212;4.blob,1.1,1388.iVBORw0KGgoAAAANSUhEUgAAAFcAAAAzCAMAAADVc2QSAAAB+FBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2mVlT0TExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG03NxZ+fjN4eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXhBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBORkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxx6ejGFNoVSIVIxMXowMHcoKBACAQKVPZVBGkEQECgtLXA7O5IaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi2TkzxlZSkqKhGUlDw7OxhTUyJ0dC8TEwh9fTNKSh5ERBxubiw1NRYEBAFmZilRNrViAAAB00lEQVRYhWNgIAwYmYhQRAZgYqSJscwsrDQxl42dJsZycHLRxFxuHl6amMvHTxNjBQSFaGKusIgoTcwVE4czJSQwWSQCSSlpCENGVg4mJq+gqITOIhUoq0B9r6oGF+NQ15BHZ5EKNLWgDG0d8gzADnT19KlpHByIMhvQxNyhBgyNaGOusYkpNY0zM7eAsiytiNMhZ81MlLk2UJatnT1xBjs4OhFW5GzuAmO6uhFnLn4g5w6mPDzhIl7ehhSY5+MLJET9/KUC0GUCvYNIMSg4BAxCQeyw8IjIKAbp6JjYuHhMlQmJpJibFAkGyQwMISmpaUnpDAwZmVnZ2FTm5JJibl4+GBQwMBQWFZeAREo1ysorsKisdCXFXEQ4VFXX1NaBhAyY66UY/TBUNjSSYi4iHBhCk5sim8PBoi06eugKW9vaSTEXEQ4g0NHZBRXHaCl1e/eQYi466MUl0dc/gRJzcYKJk2hi7OQpgbQwdmr/NFoYyzB9Bk2MHekAUavAWPIz5fDIElsPIdUqMFbcLHyyRNZDWMDsOeQ2SfEDUfG5NDGXYd582pjLqrKANgYvXEQbcxdrEVZDDnDKlKGNwUvKaWPuUoVlNDFXuqyUJuYycC0nXQ8AA2NW0ZJCPJAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.793,3.240;4.blob,1.1,1000.iVBORw0KGgoAAAANSUhEUgAAAEwAAABHCAMAAACajlHaAAABjFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQUfTU0dSUlKHh62SkojIyP39/eBgTR5eTESEgcbQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVVvby329mP19WOUlDwkJA8ECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhkLHBwsbm4+mZkSKyunQ0P7ZWWBNDQuLhO3t0r//2dISB0YPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgwmXl42hoYcREQDCAhDGxu7TEzzYmKcnD/g4Fpyci4ODgYJFxcBAgItEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92TOFrnWAAABHUlEQVRYhWNgYGRkoBpgYmZhpZphbOwcTFQzbBSMglEwCkbBKBgFo2AUjIJRQAHg5AIDbmQW2YCHFwz4kFlkA34BMBBEZo2C4QCEhEWoaZgo9QwTExYnXrGEJEq/VkoaTV5GFkLLySsQNkxRSVlFFcpWU9fg5cGhTlNLW0eXoGl6+gaGRsZAhompmbmFJU51VtY2tnb2hF3n4OjkzMDg4upGIA+6e3h6ETCKzdvH18+fgSEgMCg4BI+60LDwiMgovEZFx8TGxSeAmYlJybwpqTjUpaVnZGZlE3BXTm5ePoJXUFiEQ11xSWkZAaMYGMorUPmVONRVVRM0CjugQmGNAFQorBFgtLAerqCmto6ahtVTz7CG2kbqGdbUjMoHALBWJuoE+X0WAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.364;4.blob,1.1,1508.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAzCAMAAAAkeD+fAAACN1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUEBAtfX+xhYe8GBhAkJFkCAgY5OYxnZ/8DAwgDAwdXV9dYWNsEBAliYvIgIFA6OpACAgQ/P5xFRapFRaxXV9gGBg9iYvMsLG4iIlQAAAEWCRZGHEZ2MHYNDSALCxspESmPOo8UCBQgICD///8bGxsICBMCAQKDNYNDG0MTExMODiICAgUxFDGTPJMHAwciIiIFBQUfH00dHUkODiNkZPdnKmdqK2ojIyP39/c0NIExMXkHBxIbG0M8PJQ8PJMJCRaMOYxHHUctLW8PDyQaGj8xMXo+PpgrK2oPDyUoKGI+PpkUFDILBQuZPpkqKmlSUstmZv1HR7AZGT4LCxwSEisICBQEBAoXCRcoECgTEy4dHUgYGDwxMXg9PZcpKWUHBxAcCxwlDyUoKGRRUchlZfsmJl07O5I7O5EiIlURBxEsEiw/P5thYfE5OY0MDB4mJl42NoYcHEQEAQSWPZY9GT1aWuAJCRcBAQJ3MHdZJFkQECdMH0wQBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkl3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1plCjvAAAB70lEQVRYhWNgIBkwMjGTrokowMJKI4PZ2DloYzAnFzdtDGbg4aWRwXz8AjQyWVCIRgYLi9DIYFExccoN4eDAZDFISFJsrpS0jCw6i4FBTloeTCsoKpFrsLKKqhQ6i4FBTV0DTGvya5FrMA6grQOmdPWobC4U6BsY0sZgLSNj2hg8NIEJjcw1NSNJubmiBXEKLa2sIQwbWzviDLYnylwHRycGmMHOxGhwUXQlymA3dw8oy9PWC1XK20cKQzkDg68fUeYy+AfAWIFBEDo4JBTCCAuPkIsEszhdwYCkJB8VjS4Sw84UHgtmqcXFJyQmARnJKWCQSoK5aeluGGL6GZlZ2TkQdq5hSh4DQ74AGBSQYHBhehE24WIJxRIgpVxaVl5RSVZQVKVXYwoy1tTWsVowWNQ3NDaBw5uMoGhOb0EX4ms1aGvvADI6u7qhlQAZQdHT24cupN0vDKnBJkwkwSAMMGkyusgU6lQpUx2pYgwmmNY7nUYmz5g5izYGe8yeQxuDGebOo5HBwx4gqiZsLCCYvwCfLD6D7fGwgGDBfHyyuAGiasLGYmBYuGgxHlk8AFE1YWMxMCxZik+WfLBs+QpqGIMJVq5aTRuD16yljbnr1m+gjcEbN22mjcFbttLG3G3bd9DG4J27aGMuw+49RCgCAP9dZgVBQyRiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.270,3.440;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAAJQAAAA1CAMAAACQojKtAAABrVBMVEUAAABHHUd/NH8IAwgeDB6YPpgQBxAHAweOOY6POo8KBApWI1ZxLnEEAgSBNIGDNYMCAQKMOYw4FzgtEi2SO5JlKWViKGIJBAmUPJQpESk8GDyJN4kBAAF0L3RTIlMUCBQaCxpLHkt8MnyANIBDG0MwMHdWVtQOBgYGBg4UFDJmZv0LCxsLBATsX1/vYWEQBgYEBAtfX+xhYe8GBhA6OpBMTLwHAwPXV1fbWFgDAwdXV9dYWNsCAgReXukmJl4eHktjY/RERKlCQqMGBg9kZPccHEUoKGRcXOQBAQJOTsI4OIqMOTn/Z2cIAwM5OYxnZ/8DAwgNDSFnZ/4SEiyQOjr+Z2cEAgIyMn1TU86sRUXYV1dFRaxXV9hWVtYtLXAPBgbzYmJuLCxiYvMsLG5UIiIBAAAiIlQAAAE3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5FwMKUAAACNElEQVRYhe2WaVMTQRBAE66IAqKCyiFyCEQBidxKRAXkVjBqVEAUVI5wH0oiIHKJovibrSzJ9jDTmWS3Opmyat8HeFS6qS6K3Xo2GyH2JMrfRkSSXfUFIZKTdU1JTVN4CIPjTPrZsJ/LUHkJQ2bWeUdIsy9cVHoKyqUcR/ShRJN7WfUFIleu5qk+QSS/oFDxBfAi0O1akaJbwsCLQLfrqcXq7tGAF4FuJaUK74lE2Q3VF1hYWCQcCF7MaCivMLgAwYsZDRXlxuYheBGrrDR/iNOp681bVcZ2IXhFq665XWv2JteduvqwNzQa24XgRaypuaXa7FF377W6Quq+32ZsF4IXMxoePHRFH2KB4MWMhkftxuYheDGjoaPzsbEFCF7MaOjq7jG2AMGLGQ29fZIP+wee8AbBixkzCLtyng4O8frM81yy8OKllzcIXsyYQdiV0+Bx8/rqtWzhzbBgELyYMYOwK2dkVNC3Y5L5d+/HBYuCPhjrRsfEB0QleD9+EizWlVg33JNTiFpY/OdA5mKmCMhczCRA0lIbk7mY8UzP+Gbn5jWFpKU2NnMx41hYXFpeWV3THJKW2pjMxYzn85d1m80f+BrhYyogczHj2dgMft36FuejIHMx49gOfA9+29mN702QuZgJ7J38pfbjexRkLmYCByf/Uz+0H4gefxHIXMwEDn0//b+OljQnevzFlobMxQzh9x/f1vFfTYkef7GlIXMxSwhiS0PmYpYITLR0/DHR0qf5B31Piadmb7UhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.489;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAAUcAAAAXCAMAAACvbn0aAAAChVBMVEUAAAA6OjrExMT39/fr6+uXl5cODg4HAwPXV1fbWFgLBASQOjr+Z2cEAgIyMn1TU84GAgIIAwMDAQGsRUXYV1dWVtYtLXDIUVH/Z2dgJycPBgbzYmJuLCwoEBA0FRUTCAhUIiIBAAAFBQxjY/UeHkp3MDDUVlYMBQX1Y2NKHh53dzDU1FZCQqRERKikQkKoREQOBgYcHEZjY/YGBg4yFBT9ZmYbCwtGHBz2Y2MyMhT9/WYbGws0NIExMXkHBxLsX1/vYWEQBgYBAQNdXeYoKGO8TEw3NzfBwcHp6emTk5MMDAzmXV1jKCiQkDq8vEwtLW88PJQPDyQ4OItOTsHpXl5eJiYnJyf29va4uLhISEhiYmLu7u61tbWLODjBTk4EBALp6V5eXiYGBg8qKmlSUstmZv1HR7AZGT4SEi1nZ/4NDR9LHh70Y2Oqqqra2toEBARHR0f///9BQUEtEhIfDQ1LSx709GMLCwQTEy5KSrdnZ/8dHUhUVNAyMnypRESjQkL09PSEhISMjIzQVFR8MjKpqUSjo0IoKGRRUchlZfsLCxsuLnJYWNn3ZGRFHBwJCQlsbGzR0dGgoKByLi7ZWFgPDwb392RFRRw/P5tiYvNhYfE5OY0MDB4KChhmZvwWFjdkKCjkXFwCAQH19fWNjY0YCgr8ZmY3FhZkZCjk5FwCAgE/P5xaWuA8PJXCTk6KODitra1ERES3SkqVPDzCwk6KijgQECcCAgSMOTkkJFlfX+wCAgYhDQ0sEhIpKSm3t7dfX1/t7e1ZJCQhIQ3+/mcsLBIEBAliYvIgIFB9MjLOU1MJBATyYmJQICB9fTLOzlNFRarWVlZwLS2cPz+qRUXW1lZwcC1ifbdvAAACKElEQVRYhWNgQABGJmYWVjYwk52Dk4uBYhYDNw8vGouPH2YbNtagBAKCYCCEzKIzEBZBZ4mKwUSwsQYlEJcAA0lkFn2BlLQMBmvoAVk5MJBHZtEX8CooYrBGwSgYBaNgFIwC2gElZRU8rEEHVNVwSKhraCJztbTp4BgUoKOLjzXYgJoqLhk9fWSethaqrIEBrVmGRsYMuFmDDJiYmuGSMrcwQHAsrawZbGzt4HwuewdHGrOcnF2glmFjDTLA7Qqm3NyZPTy9UKWEvH0QHF8/BgZ/I+WAQCifOr1q/KygYJjt2FiDCvCGhIKosPCIyKjoGDTJ2Dg4Mz4hEUgmJaekpqXTzXEZmVl4WIMKZOeA4z43L5+BoaCwCFWymKcExiwtK4cwKiqrqunmuppafKzBBOrqwVRDI4hkaUKTbW6BsVrbwJRSe0enbhed3MbA0N2DjzWIgFRvH4jqL5wAoiZOQpOePAXKmDptOpDMmDFz1uw5dHTe3Hnz8bAGEViwcBGYXgxJj0vQpJcuWw5hrFi5CkiuXtONaHVQu7WDFVSuxccaPGDdegi9AVI+bkSX37QZQm/ZCiK3bUfIULu1w7BDQhCDxbBz1248rEED9vDshTD2Me8vOHAwAkPBIXsBEHX4yFF0GWq3cbDMKwDBseMn8LAGDTh5CsZCmm9BBqfPnAVR587T3i2Y8wogsPoCPtZgARcvEVJx+QqIvHqN5k4ZHvMKAw9G0LwCACEenz4ZWEkpAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.92,3.516;4.blob,1.1,1612.iVBORw0KGgoAAAANSUhEUgAAAfAAAAAPCAMAAAAswW2sAAACRlBMVEUAAABHHUd/NH8gDQ3/Z2cbCwsMBQX1Y2NKHh4NDSBnZ/8LCxsFBQxjY/UeHkp3MDDUVlYMDAX19WNKSh4TCAikQkKoREQICBNCQqRERKikpEKoqEQeDB6YPpgQBxAiDg4FAgJGHBz2Y2MOBgYODiICAgUGBg4cHEZjY/YyFBT9ZmZGRhz29mMODgZWI1ZxLnEjDg73ZGQDAQHmXV1jKCgODiNkZPcEBAtfX+xhYe8GBhABAQNdXeYoKGOQOjq8TEwDAwHm5l1jYygCAQKMOYw4FziLODjBTk4DAwdXV9dYWNs4OItOTsEEAgLpXl5eJiaLizjBwU4tEi2SO5IHAwctEhL+Z2cfDQ0SEi1nZ/4NDR9LHh70Y2MLBAQtLRL+/mcfHw1lKWViKGLQVFR8MjJUVNAyMnypRESjQkLQ0FR8fDIJBAmUPJQpESlyLi7ZWFguLnJYWNkPBgZFHBxyci7Z2Vg8GDyJN4kBAAEYCgr8ZmY3FhYKChhmZvwWFjdkKCjkXFwCAQEYGAr8/GY3NxZ0L3RTIlO3SkqVPDxKSrc8PJXCTk6KODi3t0qVlTwUCBQaCxpZJCTsX18GAgI5OYwDAwgkJFkCAgYhDQ0sEhJZWSTs7F8GBgJLHkt8MnwJBATyYmJQICA6OpACAgQEBAliYvIgIFAIAwN9MjLOU1MJCQTy8mJQUCCANIBDG0OcPz+qRUVFRaxXV9g/P5xFRarIUVFgJyfWVlZwLS2cnD+qqkUGBg9iYvMsLG4oEBA0FRUiIlQAAAEeB03iAAACLUlEQVRYhWNgAAJGJoahCphZWNFYbOwcUBFiWdhMQQacXNxoIjy8fJQ5m4oA2R84AL8AkBAUEoYLMDHS0kU0BcwsIugsUTGYJLEsbKYgAU4ucXQhCUlyHUx9gOQPHECAH0RKScP4MrJytHQQTYE8iwI6S1FJmYE0FjZTkIAKlyqMqaYGodU11ChyNjUBkj+wA00tcKmlraMLFdDTp7GTaAgMDDFYRsYmJLKwmYIETM1gLHMLSysww9rGljJ3UxEg+QM7sLMHUw6OThC+s4srjZ1EZ+DmTiqLWODh6WUOYXn7kOs66gMC/vD184cwAgIhdFBwCI1dRGcQGhZOIot0EBEZRbZeagMC/oiOiYUw4uITwHRiEq1dRG+QnEIqi3SQmka+XmoD/P5Iz4CxMrNAZHZOLq0dRG+Ql08qi3RQUEi+XmoDvP4oMiyGMUtKQWRZeQXNXURnUFlVTSKLdFBTW0e2XmoDvP6ob2iEMZuaW4BkaxsdnERn0N5BKot00NlFvl5qA3z+6O5BsHv7GBj6ZSfQ3kH0BhMnTSaRRSSYwjUVxpxmMZ0SJ1IV4PHHjLCZCM6s2XMY5s6jh4voDOYvWEgii0iwKHIxjLlk6TJKnEhVAPHH5OVgYITMYlixEkndqtVrGNauGyBH0hSs30AqiziwcROCvXkLeW6jBQD7YysLGGxDZjFs34GsbueugXHfUAW79+wdaCfgAfv2g4EIMmsUUAQWHzg40E6gFAAA8NSdGOYF2XoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.535;4.blob,1.1,1980.iVBORw0KGgoAAAANSUhEUgAAAEQAAABGCAMAAABCBcKLAAACx1BMVEUAAAAwdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUGBg4DAwcUFDIyMnwEBAknJ2ErK2kFBQ08PJMSEiwmJl4uLnFKHh62Sko3NzfBwcH39/fp6emTk5MMDAwSEis+PplKtkoEAgJbJSXSVVX/Z2fIUVEnJyf29va4uLhISEhiYmLu7u61tbUDAwgVFTQlWyVV0lVRyFEJBARsLCzfWlr4ZGSjQkI5Fxeqqqra2toEBARHR0f///9BQUE4OIsfH0wiVCIsbCxa31pk+GQXORenQ0P7ZWWBNDQTCAj09PSEhITr6+uMjIw0NIEkJFkHEQdDp0Nl+2U0gTQIEwhQICDaWFjxYWGVPDwuExMJCQlsbGzR0dGgoKAzM39Y2lhh8WETLhMCAQFUIiLLUlLGUFBcJSX19fWNjY02NoUhIVJSy1JQxlAlXCVDGxu7TEzzYmKtra1EREQBAQI9PZUaGkEbQxtMu0xi82ItEhIpKSm3t7dfX1/t7e0LCxoMDB06OjrExMSXl5cODg4bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi0nYCcQKBAMDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkV7gB8/AAACwUlEQVRYhWNgQAWMTAzYATMLK3YJLDqYGHEYwsDGjl0cUwcHJxcuQ7h5eLEJY9HBx4/LDAYBQSFswpg6hEVEcRrCICaORRCLDglJKRAlLQMCsigsBgY5eQVMQ6A6kIGiEphSVgEBVRQWEKipYxoC1YEENDS1ILQ2COigsIBAVw/DDJgOJKBvII1pFwIYGhkTocPEFJ8ZDAxm5oR1WMhb4jfEytqGoA5bO/xmMNg7OBLU4eRMwBAGF1dSdYwCFODmTgVDPDy9qGCKtw8VDPH186eCKQGBJGsJCgaRIaFh4RGREJGoaDci9bLGgMjYuPiERCCdlJySmpaeAZHKjM7CpUsWXNrJgMsA4ewclVwGhrz8gsKiYpBASWkZA0N5RSVEaVU1LkPYwKWdSg0wQ9bW1Ss1AIUam5pbIJKtbSCyvQPC6+zCZYgFuLTT7mZg6Ont6wcLTZg4afIUEGNqxTQQNX0GROnMAMLecZw123wOWGzuvPkJCxYCGYsgLlkMUbpkKWHvMEjXLFNZvgIivHLVaiC5BhIma8FC69ZvIOwdENi4aTNMYgsQbw3bVr59RwpEYGf0LlyGoAM5FN7uPWHte/dB2PsPHCTWENzg0GHKzThyNJNiM44dOE65Q06cpNyMYQFwtg8RAK2liE0HrvYhAqC3FLHowNE+RACMliIWHTjahwiA0VLEpgNr+xABsLQUsejA2j5EACwtRWw6sLUPEQCzpYhVB5b2IQJgaSli1YGlfYgAWNuW2HRgtg8RAHvbEosOjPYhAuBoW2LRAWkf2kAqBQFkFq62JUaLkgHaPsyFVAqnkFk4W4roLUoYOA2pFPqRWaNgsIAzZ89RwZTzF6hgyMVLlyk35MrVa5QbwnD9BhUMuXnrNhVMuXOXCobcu08FQx48fEQFUx4/oYIhT589p9yQFy9fUW4Iw+s3RCsFAGzqnbVs9zLwAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.571;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAAUAAABeCAMAAADc+C7jAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAXElEQVQoke3PRxKAMAgFUOwxxhZ77P3+N/RzB2fc+BcPGNhAhFiM7QDX84kCEaKVkYJxwrs0A7mWsNAlrHQNG93CzvR8M4zsJNjZLFzWbYfqOHm4bvoy/4/01o8P1FoKb4Y1yMQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492331795;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.646,3.306,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.646;4.blob,1.1,3348.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;3.end,1.1;4.sync,10.6492331835;4.sync,10.6492332835;4.sync,10.6492333835;4.rect,1.1,3.510,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.646;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492334328;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.646;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492334401;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492334528;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.530,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492334657;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.646;4.blob,1.1,300.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAV1BMVEUAAACsrKz///80NDQoKCg8PDxJSUnx8fHU1NQKCgqpqanz8/NsbGxXV1f5+fmUlJQRERHf39/KysoGBgYBAQGxsbHu7u4gICBzc3OHh4cdHR3AwMB8fHzmIQsbAAAARUlEQVQImWNgoBwwMoEBM5DJwsrKysbOwQmV4eJmgbJ4mHihLGY+fihLQFBIGMISERUThwpKMEkCzWCVAjKlIebKkOQYAJa4AdZkfyvpAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492334726;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.646;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492334849;4.rect,1.1,3.570,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.560,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAARVBMVEUAAACkpKSxsbFPT0/W1tb19fXFxcUxMTHp6enGxsZRUVFUVFTU1NTf398HBwcNDQ1FRUX///89PT3Q0NAiIiJSUlIgICAsta3pAAAAM0lEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLx8YCY/A4OAoBCIKQwkRARFYUwxQW4SmcQDANeaAmKUdPEqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492334922;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.570,3.646;4.blob,1.1,432.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAmVBMVEUAAABERETS0tL5+flgYGD///88PDwiIiL4+PjAwMBJSUnm5uaVlZXs7OwKCgpNTU3JycmlpaU4ODji4uKQkJCkpKSTk5Pr6+sJCQlMTEwhISH39/e9vb1ISEhfX1/k5ORDQ0PT09N2dnYODg5oaGj+/v4XFxc9PT3o6Ohubm5CQkJvb2/u7u6ZmZliYmLPz8/d3d2FhYUICAhJ8YFkAAAAZElEQVQImWNgoAJgZGJmYmFlA7LYOTi5WLjBTB5ePgYGfjBTQBBICIGZwiJwpoAonCkmLsHAIAlmSknLyMrJg5kMCorMTEqsQiCmMhCrqKoBSXUNTS1tHV2wxXr6HAaGRihuAQA3HQWn8U4CFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492335071;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492335140;4.rect,1.1,3.600,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.590,3.646;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492335215;4.rect,1.1,3.610,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.600,3.646;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492335313;4.rect,1.1,3.620,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.610,3.646;4.blob,1.1,216.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAM1BMVEUAAABsbGz5+fkrKyu3t7f19fX7+/tLS0v////l5eV6enpERERUVFQYGBheXl4JCQkICAheETMdAAAAKElEQVQImWNgoAJgZGJmYWVjBzM5OLm4eXghTD64Ag5+BFOAHCbRAABmtQEJRzcelAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492335476;4.rect,1.1,3.630,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.620,3.646;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492335544;4.rect,1.1,3.640,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.630,3.646;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492335669;4.rect,1.1,3.650,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.640,3.646;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAARVBMVEUAAACkpKSxsbFPT0/W1tb19fXFxcUxMTHp6enGxsZRUVFUVFTU1NTf398HBwcNDQ1FRUX///89PT3Q0NAiIiJSUlIgICAsta3pAAAAM0lEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLx8YCY/A4OAoBCIKQwkRARFYUwxQW4SmcQDANeaAmKUdPEqAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492335806;4.sync,10.6492336806;4.rect,1.1,3.640,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.650,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337061;4.rect,1.1,3.630,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.640,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337614;4.rect,1.1,3.620,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.630,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337682;4.rect,1.1,3.610,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.620,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337753;4.rect,1.1,3.590,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.601,3.646,2.19,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337815;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.590,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337882;4.rect,1.1,3.570,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.580,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492337949;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.570,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492338001;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.560,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492338052;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.550,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492338067;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.540,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492338119;4.rect,1.1,3.520,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.530,3.646,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492338194;4.rect,1.1,3.500,3.646,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.646,2.19,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492338262;4.sync,10.6492338329;4.sync,10.6492338396;4.sync,10.6492338451;4.sync,10.6492338503;4.size,2.-1,2.11,2.16;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,232.iVBORw0KGgoAAAANSUhEUgAAAAsAAAAQCAYAAADAvYV+AAAABmJLR0QA/wD/AP+gvaeTAAAAYklEQVQokY2RQQ4AIQgDW+L/v9y9qCEsIJ4QZggoJAnDYwAwFQwASI4EO8FEMH95CRYTnfCDOyGFK6GEM6GFo7AqKI4sSSsCJH1X+roFkKdjueABX/On77lz2uGtr6pj9okfTeJQAYVaxnMAAAAASUVORK5CYII=;3.end,1.1;6.cursor,1.0,1.0,2.-1,1.0,1.0,2.11,2.16;4.sync,10.6492339462;4.sync,10.6492339473;4.sync,10.6492339483;4.sync,10.6492339493;4.sync,10.6492339504;4.sync,10.6492339557;4.sync,10.6492339728;4.sync,10.6492339739;4.sync,10.6492339749;4.sync,10.6492339759;4.sync,10.6492339809;4.sync,10.6492339839;4.sync,10.6492339849;4.sync,10.6492339874;4.sync,10.6492339884;4.sync,10.6492339895;4.sync,10.6492339905;4.sync,10.6492339915;4.sync,10.6492339926;4.sync,10.6492339936;4.sync,10.6492339946;4.sync,10.6492339957;4.sync,10.6492339967;4.sync,10.6492339977;4.sync,10.6492339988;4.sync,10.6492339998;4.sync,10.6492340008;4.sync,10.6492340019;4.sync,10.6492340029;4.sync,10.6492340039;4.sync,10.6492340106;4.sync,10.6492340125;4.sync,10.6492340193;4.sync,10.6492340205;4.sync,10.6492340224;4.sync,10.6492340235;4.sync,10.6492340245;4.sync,10.6492340255;4.sync,10.6492340377;4.sync,10.6492340387;4.sync,10.6492340398;4.sync,10.6492340408;4.sync,10.6492340466;4.sync,10.6492340483;4.sync,10.6492340581;4.sync,10.6492340591;4.sync,10.6492340623;4.sync,10.6492340633;4.sync,10.6492340643;4.sync,10.6492340654;4.sync,10.6492340664;4.size,1.0,3.978,3.681;4.rect,1.0,1.0,1.0,3.978,3.681;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.681;4.rect,1.3,1.0,1.0,2.16,3.681;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.615,1.0;4.sync,10.6492341531;4.size,1.0,3.976,3.680;4.rect,1.0,1.0,1.0,3.976,3.680;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.960,1.0,1.0;4.size,1.3,2.16,3.680;4.rect,1.3,1.0,1.0,2.16,3.680;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.614,1.0;4.sync,10.6492341547;4.size,1.0,3.972,3.675;4.rect,1.0,1.0,1.0,3.972,3.675;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.950,3.665;4.size,1.2,3.950,3.665;4.size,1.0,3.972,3.675;4.rect,1.0,1.0,1.0,3.972,3.675;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.966,3.675;4.rect,1.0,1.0,1.0,3.966,3.675;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.950,1.0,1.0;4.size,1.3,2.16,3.675;4.rect,1.3,1.0,1.0,2.16,3.675;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.609,1.0;4.sync,10.6492341608;4.size,1.0,3.949,3.663;4.rect,1.0,1.0,1.0,3.949,3.663;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.950,3.627,2.14,1.1,1.0,1.0;4.copy,1.1,3.930,3.646,2.20,2.19,2.14,1.1,3.930,3.627;4.rect,1.1,3.500,3.627,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.628,3.254,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.627;4.blob,1.1,3348.iVBORw0KGgoAAAANSUhEUgAAAeYAAAATCAMAAAByZV7jAAACzVBMVEUFBQUICAgDAwMAAAAGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0eAgIC0tLQBAQHc3NyBgYEMDAyKiorh4eH19fW5ubksLCw4ODiLi4vT09OgoKDQ0NBoaGjo6OgYGBiUlJS7u7sjIyMPDw8HBwfAwMC/v79UVFRISEiSkpLr6+seHh4REREgICDIyMg8PDykpKRGRkbw8PBNTU12dnaxsbEXFxf8/Px3d3eZmZmIiIgNDQ3t7e2zs7MZGRkaGhq2trby8vISEhKDg4Pz8/PJyclgYGDj4+NBQUGoqKicnJyYmJhAQEC4uLjq6uqtra2qqqru7u6enp4QEBD5+fm3t7f7+/tLS0vk5OQcHBxcXFzBwcELCwvf399CQkLR0dF1dXX4+PhtbW2amppPT0/W1tbFxcUxMTEoKCjx8fGioqL29vZbW1vMzMz09PTl5eUTExM3Nzf39/fp6emTk5PS0tImJiZSUlKNjY1aWlrCwsInJydqamq9vb1jY2N6eno1NTXExMTg4OAiIiJJSUns7Oynp6c2NjbGxsZRUVHKyspOTk5ZWVnX19e6urpfX19VVVX9/f1DQ0PY2NjV1dViYmK1tbXm5uYuLi5kZGQpKSl+fn7e3t5lZWUyMjJeXl5dXV2WlpYJCQmVlZUKCgokJCSPj49FRUU9PT2GhoY5OTna2toEBARmZmZ8fHyurq5xcXGCgoKvr6+hoaF/f390dHRMTEywsLAfHx/+/v5QUFCEhISMjIylpaWfn5/6+vqOjo6Hh4dpaWmrq6vi4uIWFhZKSkqmpqZzc3OQkJB4eHhra2vNzc0UFBQwMDCXl5cbGxs7Ozvv7+8ODg4dHR3b29sqKiotLS1nZ2d7e3vn5+fHx8dWVlZ5eXkhISFubm7Ozs5XV1fPz8+JiYmbm5u8vLx9fX06OjqysrJvb2/d3d2FhYUgW911AAAGvElEQVRoge1Z+V9UVRQHD3B12EGEkkVwQcBBmRFERCZEBcMFgYRExGVydxIVJNEUFCWzMldyTRE1NVxyycAsStEWM0uzhTTN9vobuvcNc899wxsaaHD69OH7w+O++879fs8533n3vWEcHBwdu0An/mdwcnR0Fs8dXAjpaq9kOtFR6EaISjx3cHF1c7dXMp3oKHh4cpu9XIDZ7K0Q5ePbvZ38fj38Ax573HTWk/Rs0+r264oIDLIiKDjEBkr/Cr0IIaFtjbOqNoowk81devdxsmQz9O1nHZs5wvtHREYNUEc3n7bV5nbryjBwkBVByja7xNhA30qEaTRaa2yWxbVam5C9yebBoYTExlmyub0YEj/UNWHYsMTm0zbb/Ohgf5sphltjs/VxLW1O0j2RPCJl5CiTzSoyOjVtjPrJdDoeS3eJcWxyvC89uJEJ4lVtRo+JAZlD2eXorNTspyaxUdccj9yApyeDc94UbVb+1IJpdG76jJygmZLNprhR+mdYsO8sITPb6ArALU4bP3tOwNx5bDjfO3XBwjCRmdo8M9QQP4JdfXZR4eLEJXSQRySwuaVTi4qX+VnQAFVJTskYohH5kAXV+JxYJTKjfVgRAll4nLB98xVYpZA9t1lDlgI8R5ajzaUrEkI8Y1bS8fMajb95u/lVLYkfvMqwml5wzyuJLAvNlVpBFperIsNgzdpwnd88F6gIh3X6/uvHVDKbMe4F9mnbILvDbaMrALc4bfGLGyO7TQsHWKJ+6eVXNs0Il9lMXp28WTeXnm7Z6rUtf3sGHa3RROzQaDQsFUNGVFX2axY0pNp2ym1GFlTjc0IdAjO3T6iIA1kwDmvDFVglZo827yKRAM6796DNU8C/O+z1N0ZtN283v6rdR5/orxP68QkcSWufTvZLrTggLaset8sVPA9CSQ0cUh8G2MgsxTgVOQLwxg4a6OzI4GArXTmGm2xOAjhKjgEcj6WP/OfJbJnNO8NZfm9S09zoO0U1kW5E07aXVXsCwJOkixo8ZzhUSWuLk9uMLKjG54Q6BGaeKVaEGsgC4qbdYgVWqbRpO7vqThYAvoKxRCq84FSexXY3X9UuonMDSRXAnNM0oxrDKqkVNdKyt84MPgvVXj61AGnnoPnZjHE+086D8+K36YUL0v7yjq10lW1mT991ZDnAyix2Xucn37TpKLyesVyMSaXJDBIbVfguO6oviRo8Z0h7T6pNvmlzFlTjc0IdAjPPFCtCDYFFwWZcgVUqvoJNer8h9oOkdtoMOeUAOuOz4EOpFY7SssuXevrWZZQeuALQeMlksxC3txbSG67SQT83hr620rVs8yC2a/keNF0ysxlizwBcq/9o8pqPZTbXGP9lNCNY1OA5Q+MnLW1GFlTjc1iHyMwzxYpQA1mUbMYVWKWizQBXP43dcbhVm3v7W2j3QFIGsO+KlNMUoRWqCCffht2GQg/6iQ822SzERW/dMOuszBLb6MrRwmbjnSFjNtrsVH8dwPszOroov5sDjPdcqbJGmhaabUY+ZEE1PifUITDzTIWKOJAFFGzGFa3bfOMGPcwjZa3aXK4/zNKUt7vWGaCMfA5ws4LtKF+A0ArHyi8LkiGZcQ8opnvdNWazEAcZB3Vxso7ZRleOFjYfv3Ub4KtbcQIzBOfRZ/0Wll9uBI07ZbQ58Y6RItP4BFUpayxT17D9VSPyIQuq8TmhDoGZZyp2yARkUbIZV4g2m7IHbvPpEnrwCTjfqs1fJ5xTXQ41azcZe/RkYR961X1iSPXRwIZvxFZ8u+A71cXrbFRnWB2V3yi9aWMcbNE3nZBVYyNdBHsb1Wk088UG3Jj4/YW7JSGOAjME12esP5DtSkMu19/zDNxKPNjqanI+PZ9+SvcU5Xpu1rH3ZiWNH4pWR23OYzYjH7KgGp8T6kBmzFTskAnIgnFKK0SbTdmjzavq74LPfRJnweY746U/y7frH/xo1u6HoysNmdK/wY9kxqb23yZvxYoHRU33pFF6UEO3KunLE8aBk/onecdspcvRy/jUcpE1IDqlsOlnd5EZgn8pLzbEJ9Mpn18bDSkrKqRvxj6lupxNrN2/rS1S37xtQQO2BeWUDJFq43wCC1fjc2KVnBkzFTvEwVkwTmmFaDPPntvcxZs06chC+gqWovBDZIF+SIu5ZhhfhToI9tJtKySX6ofaOw3LcKozvYJNiMndr/hD5Khjnr/r+1oi6Lh220u37TgWen/6H9mJ/xxoNwg/RAYPpweHdW7mP0SuTzCkqczXcXRcu+2l2w5UPdT/+ZfS299/BR5ubkniuYO9EunEo8TfH3gZOaJNgZcAAAAASUVORK5CYII=;3.end,1.1;4.size,1.1,3.930,3.646;4.size,1.2,3.930,3.646;4.move,1.3,1.0,3.933,1.0,1.0;4.size,1.3,2.16,3.663;4.rect,1.3,1.0,1.0,2.16,3.663;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.597,1.0;4.sync,10.6492341627;4.size,1.0,3.949,3.663;4.rect,1.0,1.0,1.0,3.949,3.663;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492341638;4.size,1.0,3.922,3.651;4.rect,1.0,1.0,1.0,3.922,3.651;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.900,3.646;4.size,1.2,3.900,3.646;4.size,1.0,3.903,3.641;4.rect,1.0,1.0,1.0,3.903,3.641;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.900,3.608,2.14,1.1,1.0,1.0;4.copy,1.1,3.880,3.627,2.20,2.19,2.14,1.1,3.880,3.608;4.rect,1.1,3.500,3.608,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.609,3.214,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.608;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.880,3.627;4.size,1.2,3.880,3.627;4.move,1.3,1.0,3.887,1.0,1.0;4.size,1.3,2.16,3.641;4.rect,1.3,1.0,1.0,2.16,3.641;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.575,1.0;4.sync,10.6492341700;4.size,1.0,3.884,3.632;4.rect,1.0,1.0,1.0,3.884,3.632;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.860,3.627;4.size,1.2,3.860,3.627;4.move,1.3,1.0,3.868,1.0,1.0;4.size,1.3,2.16,3.632;4.rect,1.3,1.0,1.0,2.16,3.632;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.566,1.0;4.sync,10.6492341736;4.size,1.0,3.874,3.627;4.rect,1.0,1.0,1.0,3.874,3.627;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.850,3.627;4.size,1.2,3.850,3.627;4.move,1.3,1.0,3.858,1.0,1.0;4.size,1.3,2.16,3.627;4.rect,1.3,1.0,1.0,2.16,3.627;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.561,1.0;4.sync,10.6492341807;4.size,1.0,3.856,3.627;4.rect,1.0,1.0,1.0,3.856,3.627;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.840,3.627;4.size,1.2,3.840,3.627;4.move,1.3,1.0,3.840,1.0,1.0;4.sync,10.6492341820;4.size,1.0,3.851,3.609;4.rect,1.0,1.0,1.0,3.851,3.609;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.840,3.589,2.14,1.1,1.0,1.0;4.copy,1.1,3.830,3.608,2.10,2.19,2.14,1.1,3.830,3.589;4.rect,1.1,3.500,3.589,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.590,3.172,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.589;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.830,3.608;4.size,1.2,3.830,3.608;4.move,1.3,1.0,3.835,1.0,1.0;4.size,1.3,2.16,3.609;4.rect,1.3,1.0,1.0,2.16,3.609;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.543,1.0;4.sync,10.6492341837;4.size,1.0,3.851,3.607;4.rect,1.0,1.0,1.0,3.851,3.607;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.830,3.570,2.14,1.1,1.0,1.0;4.rect,1.1,3.500,3.570,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.571,3.172,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.570;4.blob,1.1,3348.iVBORw0KGgoAAAANSUhEUgAAAeYAAAATCAMAAAByZV7jAAACzVBMVEUFBQUICAgDAwMAAAAGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0eAgIC0tLQBAQHc3NyBgYEMDAyKiorh4eH19fW5ubksLCw4ODiLi4vT09OgoKDQ0NBoaGjo6OgYGBiUlJS7u7sjIyMPDw8HBwfAwMC/v79UVFRISEiSkpLr6+seHh4REREgICDIyMg8PDykpKRGRkbw8PBNTU12dnaxsbEXFxf8/Px3d3eZmZmIiIgNDQ3t7e2zs7MZGRkaGhq2trby8vISEhKDg4Pz8/PJyclgYGDj4+NBQUGoqKicnJyYmJhAQEC4uLjq6uqtra2qqqru7u6enp4QEBD5+fm3t7f7+/tLS0vk5OQcHBxcXFzBwcELCwvf399CQkLR0dF1dXX4+PhtbW2amppPT0/W1tbFxcUxMTEoKCjx8fGioqL29vZbW1vMzMz09PTl5eUTExM3Nzf39/fp6emTk5PS0tImJiZSUlKNjY1aWlrCwsInJydqamq9vb1jY2N6eno1NTXExMTg4OAiIiJJSUns7Oynp6c2NjbGxsZRUVHKyspOTk5ZWVnX19e6urpfX19VVVX9/f1DQ0PY2NjV1dViYmK1tbXm5uYuLi5kZGQpKSl+fn7e3t5lZWUyMjJeXl5dXV2WlpYJCQmVlZUKCgokJCSPj49FRUU9PT2GhoY5OTna2toEBARmZmZ8fHyurq5xcXGCgoKvr6+hoaF/f390dHRMTEywsLAfHx/+/v5QUFCEhISMjIylpaWfn5/6+vqOjo6Hh4dpaWmrq6vi4uIWFhZKSkqmpqZzc3OQkJB4eHhra2vNzc0UFBQwMDCXl5cbGxs7Ozvv7+8ODg4dHR3b29sqKiotLS1nZ2d7e3vn5+fHx8dWVlZ5eXkhISFubm7Ozs5XV1fPz8+JiYmbm5u8vLx9fX06OjqysrJvb2/d3d2FhYUgW911AAAGvElEQVRoge1Z+V9UVRQHD3B12EGEkkVwQcBBmRFERCZEBcMFgYRExGVydxIVJNEUFCWzMldyTRE1NVxyycAsStEWM0uzhTTN9vobuvcNc899wxsaaHD69OH7w+O++879fs8533n3vWEcHBwdu0An/mdwcnR0Fs8dXAjpaq9kOtFR6EaISjx3cHF1c7dXMp3oKHh4cpu9XIDZ7K0Q5ePbvZ38fj38Ax573HTWk/Rs0+r264oIDLIiKDjEBkr/Cr0IIaFtjbOqNoowk81devdxsmQz9O1nHZs5wvtHREYNUEc3n7bV5nbryjBwkBVByja7xNhA30qEaTRaa2yWxbVam5C9yebBoYTExlmyub0YEj/UNWHYsMTm0zbb/Ohgf5sphltjs/VxLW1O0j2RPCJl5CiTzSoyOjVtjPrJdDoeS3eJcWxyvC89uJEJ4lVtRo+JAZlD2eXorNTspyaxUdccj9yApyeDc94UbVb+1IJpdG76jJygmZLNprhR+mdYsO8sITPb6ArALU4bP3tOwNx5bDjfO3XBwjCRmdo8M9QQP4JdfXZR4eLEJXSQRySwuaVTi4qX+VnQAFVJTskYohH5kAXV+JxYJTKjfVgRAll4nLB98xVYpZA9t1lDlgI8R5ajzaUrEkI8Y1bS8fMajb95u/lVLYkfvMqwml5wzyuJLAvNlVpBFperIsNgzdpwnd88F6gIh3X6/uvHVDKbMe4F9mnbILvDbaMrALc4bfGLGyO7TQsHWKJ+6eVXNs0Il9lMXp28WTeXnm7Z6rUtf3sGHa3RROzQaDQsFUNGVFX2axY0pNp2ym1GFlTjc0IdAjO3T6iIA1kwDmvDFVglZo827yKRAM6796DNU8C/O+z1N0ZtN283v6rdR5/orxP68QkcSWufTvZLrTggLaset8sVPA9CSQ0cUh8G2MgsxTgVOQLwxg4a6OzI4GArXTmGm2xOAjhKjgEcj6WP/OfJbJnNO8NZfm9S09zoO0U1kW5E07aXVXsCwJOkixo8ZzhUSWuLk9uMLKjG54Q6BGaeKVaEGsgC4qbdYgVWqbRpO7vqThYAvoKxRCq84FSexXY3X9UuonMDSRXAnNM0oxrDKqkVNdKyt84MPgvVXj61AGnnoPnZjHE+086D8+K36YUL0v7yjq10lW1mT991ZDnAyix2Xucn37TpKLyesVyMSaXJDBIbVfguO6oviRo8Z0h7T6pNvmlzFlTjc0IdAjPPFCtCDYFFwWZcgVUqvoJNer8h9oOkdtoMOeUAOuOz4EOpFY7SssuXevrWZZQeuALQeMlksxC3txbSG67SQT83hr620rVs8yC2a/keNF0ysxlizwBcq/9o8pqPZTbXGP9lNCNY1OA5Q+MnLW1GFlTjc1iHyMwzxYpQA1mUbMYVWKWizQBXP43dcbhVm3v7W2j3QFIGsO+KlNMUoRWqCCffht2GQg/6iQ822SzERW/dMOuszBLb6MrRwmbjnSFjNtrsVH8dwPszOroov5sDjPdcqbJGmhaabUY+ZEE1PifUITDzTIWKOJAFFGzGFa3bfOMGPcwjZa3aXK4/zNKUt7vWGaCMfA5ws4LtKF+A0ArHyi8LkiGZcQ8opnvdNWazEAcZB3Vxso7ZRleOFjYfv3Ub4KtbcQIzBOfRZ/0Wll9uBI07ZbQ58Y6RItP4BFUpayxT17D9VSPyIQuq8TmhDoGZZyp2yARkUbIZV4g2m7IHbvPpEnrwCTjfqs1fJ5xTXQ41azcZe/RkYR961X1iSPXRwIZvxFZ8u+A71cXrbFRnWB2V3yi9aWMcbNE3nZBVYyNdBHsb1Wk088UG3Jj4/YW7JSGOAjME12esP5DtSkMu19/zDNxKPNjqanI+PZ9+SvcU5Xpu1rH3ZiWNH4pWR23OYzYjH7KgGp8T6kBmzFTskAnIgnFKK0SbTdmjzavq74LPfRJnweY746U/y7frH/xo1u6HoysNmdK/wY9kxqb23yZvxYoHRU33pFF6UEO3KunLE8aBk/onecdspcvRy/jUcpE1IDqlsOlnd5EZgn8pLzbEJ9Mpn18bDSkrKqRvxj6lupxNrN2/rS1S37xtQQO2BeWUDJFq43wCC1fjc2KVnBkzFTvEwVkwTmmFaDPPntvcxZs06chC+gqWovBDZIF+SIu5ZhhfhToI9tJtKySX6ofaOw3LcKozvYJNiMndr/hD5Khjnr/r+1oi6Lh220u37TgWen/6H9mJ/xxoNwg/RAYPpweHdW7mP0SuTzCkqczXcXRcu+2l2w5UPdT/+ZfS299/BR5ubkniuYO9EunEo8TfH3gZOaJNgZcAAAAASUVORK5CYII=;3.end,1.1;4.size,1.1,3.830,3.589;4.size,1.2,3.830,3.589;4.size,1.3,2.16,3.607;4.rect,1.3,1.0,1.0,2.16,3.607;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.541,1.0;4.sync,10.6492341892;4.size,1.0,3.818,3.592;4.rect,1.0,1.0,1.0,3.818,3.592;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.800,3.589;4.size,1.2,3.800,3.589;4.move,1.3,1.0,3.802,1.0,1.0;4.size,1.3,2.16,3.592;4.rect,1.3,1.0,1.0,2.16,3.592;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.526,1.0;4.sync,10.6492341911;4.size,1.0,3.804,3.592;4.rect,1.0,1.0,1.0,3.804,3.592;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.780,3.589;4.size,1.2,3.780,3.589;4.move,1.3,1.0,3.788,1.0,1.0;4.sync,10.6492341922;4.size,1.0,3.804,3.585;4.rect,1.0,1.0,1.0,3.804,3.585;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.780,3.551,2.14,1.1,1.0,1.0;4.rect,1.1,3.500,3.551,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.552,3.112,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.551;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.780,3.570;4.size,1.2,3.780,3.570;4.size,1.3,2.16,3.585;4.rect,1.3,1.0,1.0,2.16,3.585;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.519,1.0;4.sync,10.6492341938;4.size,1.0,3.790,3.581;4.rect,1.0,1.0,1.0,3.790,3.581;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.770,3.570;4.size,1.2,3.770,3.570;4.size,1.0,3.776,3.576;4.rect,1.0,1.0,1.0,3.776,3.576;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.760,3.570;4.size,1.2,3.760,3.570;4.size,1.0,3.776,3.576;4.rect,1.0,1.0,1.0,3.776,3.576;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.760,1.0,1.0;4.size,1.3,2.16,3.576;4.rect,1.3,1.0,1.0,2.16,3.576;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.510,1.0;4.sync,10.6492341998;4.size,1.0,3.767,3.576;4.rect,1.0,1.0,1.0,3.767,3.576;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.750,3.570;4.size,1.2,3.750,3.570;4.move,1.3,1.0,3.751,1.0,1.0;4.sync,10.6492342020;4.size,1.0,3.767,3.565;4.rect,1.0,1.0,1.0,3.767,3.565;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.750,3.532,2.14,1.1,1.0,1.0;4.rect,1.1,3.500,3.532,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.533,2.83,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.532;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.750,3.551;4.size,1.2,3.750,3.551;4.size,1.3,2.16,3.565;4.rect,1.3,1.0,1.0,2.16,3.565;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.499,1.0;4.sync,10.6492342037;4.size,1.0,3.762,3.561;4.rect,1.0,1.0,1.0,3.762,3.561;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.740,3.551;4.size,1.2,3.740,3.551;4.size,1.0,3.757,3.558;4.rect,1.0,1.0,1.0,3.757,3.558;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.741,1.0,1.0;4.size,1.3,2.16,3.558;4.rect,1.3,1.0,1.0,2.16,3.558;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.492,1.0;4.sync,10.6492342088;4.size,1.0,3.751,3.558;4.rect,1.0,1.0,1.0,3.751,3.558;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.730,3.551;4.size,1.2,3.730,3.551;4.move,1.3,1.0,3.735,1.0,1.0;4.sync,10.6492342104;4.size,1.0,3.747,3.553;4.rect,1.0,1.0,1.0,3.747,3.553;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.731,1.0,1.0;4.size,1.3,2.16,3.553;4.rect,1.3,1.0,1.0,2.16,3.553;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.487,1.0;4.sync,10.6492342121;4.size,1.0,3.747,3.553;4.rect,1.0,1.0,1.0,3.747,3.553;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492342132;4.size,1.0,3.744,3.552;4.rect,1.0,1.0,1.0,3.744,3.552;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.720,3.551;4.size,1.2,3.720,3.551;4.size,1.0,3.743,3.551;4.rect,1.0,1.0,1.0,3.743,3.551;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.727,1.0,1.0;4.size,1.3,2.16,3.551;4.rect,1.3,1.0,1.0,2.16,3.551;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.485,1.0;4.sync,10.6492342183;4.size,1.0,3.742,3.551;4.rect,1.0,1.0,1.0,3.742,3.551;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.726,1.0,1.0;4.sync,10.6492342198;4.size,1.0,3.742,3.551;4.rect,1.0,1.0,1.0,3.742,3.551;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492342214;4.size,1.0,3.741,3.550;4.rect,1.0,1.0,1.0,3.741,3.550;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.720,3.513,2.14,1.1,1.0,1.0;4.rect,1.1,3.500,3.513,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.516,2.45,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.513;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.720,3.532;4.size,1.2,3.720,3.532;4.size,1.0,3.740,3.550;4.rect,1.0,1.0,1.0,3.740,3.550;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.739,3.548;4.rect,1.0,1.0,1.0,3.739,3.548;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.723,1.0,1.0;4.size,1.3,2.16,3.548;4.rect,1.3,1.0,1.0,2.16,3.548;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.482,1.0;4.sync,10.6492342269;4.sync,10.6492342279;4.size,1.0,3.739,3.548;4.rect,1.0,1.0,1.0,3.739,3.548;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492342304;4.size,1.0,3.737,3.546;4.rect,1.0,1.0,1.0,3.737,3.546;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.736,3.544;4.rect,1.0,1.0,1.0,3.736,3.544;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.720,1.0,1.0;4.size,1.3,2.16,3.544;4.rect,1.3,1.0,1.0,2.16,3.544;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.478,1.0;4.sync,10.6492342360;4.size,1.0,3.735,3.542;4.rect,1.0,1.0,1.0,3.735,3.542;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.710,3.532;4.size,1.2,3.710,3.532;4.size,1.0,3.732,3.542;4.rect,1.0,1.0,1.0,3.732,3.542;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.726,3.539;4.rect,1.0,1.0,1.0,3.726,3.539;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.710,1.0,1.0;4.size,1.3,2.16,3.539;4.rect,1.3,1.0,1.0,2.16,3.539;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.473,1.0;4.sync,10.6492342431;4.size,1.0,3.726,3.535;4.rect,1.0,1.0,1.0,3.726,3.535;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.535;4.rect,1.3,1.0,1.0,2.16,3.535;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.469,1.0;4.sync,10.6492342443;4.size,1.0,3.717,3.528;4.rect,1.0,1.0,1.0,3.717,3.528;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.710,3.494,2.14,1.1,1.0,1.0;4.copy,1.1,3.700,3.513,2.10,2.19,2.14,1.1,3.700,3.494;4.rect,1.1,3.500,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.497,2.45,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.494;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.700,3.513;4.size,1.2,3.700,3.513;4.size,1.0,3.708,3.522;4.rect,1.0,1.0,1.0,3.708,3.522;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.690,3.513;4.size,1.2,3.690,3.513;4.move,1.3,1.0,3.692,1.0,1.0;4.size,1.3,2.16,3.522;4.rect,1.3,1.0,1.0,2.16,3.522;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.456,1.0;4.sync,10.6492342512;4.size,1.0,3.703,3.522;4.rect,1.0,1.0,1.0,3.703,3.522;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.680,3.513;4.size,1.2,3.680,3.513;4.move,1.3,1.0,3.687,1.0,1.0;4.sync,10.6492342536;4.size,1.0,3.703,3.519;4.rect,1.0,1.0,1.0,3.703,3.519;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.519;4.rect,1.3,1.0,1.0,2.16,3.519;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.453,1.0;4.sync,10.6492342555;4.size,1.0,3.692,3.514;4.rect,1.0,1.0,1.0,3.692,3.514;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.670,3.513;4.size,1.2,3.670,3.513;4.move,1.3,1.0,3.676,1.0,1.0;4.size,1.3,2.16,3.514;4.rect,1.3,1.0,1.0,2.16,3.514;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.448,1.0;4.sync,10.6492342617;4.size,1.0,3.682,3.514;4.rect,1.0,1.0,1.0,3.682,3.514;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.660,3.513;4.size,1.2,3.660,3.513;4.move,1.3,1.0,3.666,1.0,1.0;4.sync,10.6492342629;4.size,1.0,3.678,3.505;4.rect,1.0,1.0,1.0,3.678,3.505;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.660,3.475,2.14,1.1,1.0,1.0;4.rect,1.1,3.500,3.475,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.654,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.475;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.660,3.494;4.size,1.2,3.660,3.494;4.move,1.3,1.0,3.662,1.0,1.0;4.size,1.3,2.16,3.505;4.rect,1.3,1.0,1.0,2.16,3.505;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.439,1.0;4.sync,10.6492342662;4.size,1.0,3.678,3.499;4.rect,1.0,1.0,1.0,3.678,3.499;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.499;4.rect,1.3,1.0,1.0,2.16,3.499;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.433,1.0;4.sync,10.6492342672;4.size,1.0,3.675,3.495;4.rect,1.0,1.0,1.0,3.675,3.495;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.650,3.494;4.size,1.2,3.650,3.494;4.move,1.3,1.0,3.659,1.0,1.0;4.size,1.3,2.16,3.495;4.rect,1.3,1.0,1.0,2.16,3.495;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.429,1.0;4.sync,10.6492342685;4.size,1.0,3.675,3.495;4.rect,1.0,1.0,1.0,3.675,3.495;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492342702;4.size,1.0,3.674,3.495;4.rect,1.0,1.0,1.0,3.674,3.495;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.670,3.491;4.rect,1.0,1.0,1.0,3.670,3.491;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.650,3.456,2.14,1.1,1.0,1.0;4.rect,1.1,3.500,3.456,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.456;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.650,3.475;4.size,1.2,3.650,3.475;4.move,1.3,1.0,3.654,1.0,1.0;4.size,1.3,2.16,3.491;4.rect,1.3,1.0,1.0,2.16,3.491;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.425,1.0;4.sync,10.6492342756;4.size,1.0,3.660,3.478;4.rect,1.0,1.0,1.0,3.660,3.478;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.640,3.475;4.size,1.2,3.640,3.475;4.move,1.3,1.0,3.644,1.0,1.0;4.size,1.3,2.16,3.478;4.rect,1.3,1.0,1.0,2.16,3.478;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.412,1.0;4.sync,10.6492343178;4.size,1.0,3.660,3.478;4.rect,1.0,1.0,1.0,3.660,3.478;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492343195;4.size,1.0,3.611,3.419;4.rect,1.0,1.0,1.0,3.611,3.419;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.57,3.640,3.361,2.14,1.1,1.0,1.0;4.copy,1.1,3.590,3.418,2.50,2.57,2.14,1.1,3.590,3.361;4.rect,1.1,2.42,3.362,2.96,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.381,3.186,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.399,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.32,3.362;4.blob,1.1,536.iVBORw0KGgoAAAANSUhEUgAAAUUAAAASCAMAAAD7VjyUAAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAA1ElEQVRYheXPuQ6CABREUXBFxQ133Df4/z/U8EimsbzFJE411U1OknyXJv+w9McDy50uXLWclLS36fX6A7ZqOSlpb9MbZiM06jkpaW/0xpMcrXpOStobvekMjZpOStobvfmCrXpOStrb9JbFmK1aTkraG71VsUarnpOS9kZvU2zRquekpL3R2xV7tOo5KWlv9A7lEa16Tkra2/ZOZ7RqOilpb/QuGVv1nJS0N3rX8sZmLScl7W1798cTzXpOStobvfz1Rquek5L2tr2qRqumk5L2VvUHyeQN6cNbWeEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.381;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAUElEQVQImRXMRwKAMAwDQWM6gYTeCaH//4fIlzmtROQxM/lBCDmKxSTNIKtcLDRBo0vIVS02rdgpsR/gOM1w0Svc7A7dge15GabbPvh8P7Q/jP4DuQRHJToAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.381;4.blob,1.1,440.iVBORw0KGgoAAAANSUhEUgAAAFUAAAASCAMAAAAddmK8AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAjElEQVQ4ja3OhxXCQBADUbFkH5wBZ4KJhv47RLs1aAr4b4CZSQsP88VSqoYHW62laniwzbaQqu7BLO2kqntU9xlSlR7BMh+kKj3fPJ6kKj1Xq1qrVrWrTdKqTXK17bRq21Hth7MUpUf1kq9SlR7V23iXqvSoPp5S1D3Y611KUffwGScpGh6+Pylq4f0Bx1kR/SzZ4bsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.399;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.590,3.418;4.size,1.2,3.590,3.418;4.size,1.0,3.603,3.410;4.rect,1.0,1.0,1.0,3.603,3.410;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,2.19,3.590,3.380,2.14,1.1,1.0,1.0;4.copy,1.1,3.580,3.399,2.10,2.19,2.14,1.1,3.580,3.380;4.rect,1.1,3.500,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.380;4.blob,1.1,3348.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;3.end,1.1;4.size,1.1,3.580,3.399;4.size,1.2,3.580,3.399;4.move,1.3,1.0,3.587,1.0,1.0;4.size,1.3,2.16,3.410;4.rect,1.3,1.0,1.0,2.16,3.410;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.344,1.0;4.sync,10.6492343257;4.size,1.0,3.601,3.407;4.rect,1.0,1.0,1.0,3.601,3.407;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.585,1.0,1.0;4.size,1.3,2.16,3.407;4.rect,1.3,1.0,1.0,2.16,3.407;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.341,1.0;4.sync,10.6492343279;4.size,1.0,3.599,3.405;4.rect,1.0,1.0,1.0,3.599,3.405;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.596,3.403;4.rect,1.0,1.0,1.0,3.596,3.403;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.580,1.0,1.0;4.size,1.3,2.16,3.403;4.rect,1.3,1.0,1.0,2.16,3.403;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.337,1.0;4.sync,10.6492343370;4.size,1.0,3.595,3.403;4.rect,1.0,1.0,1.0,3.595,3.403;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.570,3.399;4.size,1.2,3.570,3.399;4.move,1.3,1.0,3.579,1.0,1.0;4.sync,10.6492343395;4.size,1.0,3.594,3.403;4.rect,1.0,1.0,1.0,3.594,3.403;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.578,1.0,1.0;4.sync,10.6492343458;4.size,1.0,3.593,3.403;4.rect,1.0,1.0,1.0,3.593,3.403;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.577,1.0,1.0;4.sync,10.6492343531;4.size,1.0,3.594,3.404;4.rect,1.0,1.0,1.0,3.594,3.404;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,3.578,1.0,1.0;4.size,1.3,2.16,3.404;4.rect,1.3,1.0,1.0,2.16,3.404;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.338,1.0;4.sync,10.6492343565;4.size,1.0,3.595,3.404;4.rect,1.0,1.0,1.0,3.595,3.404;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.595,3.405;4.rect,1.0,1.0,1.0,3.595,3.405;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.597,3.406;4.rect,1.0,1.0,1.0,3.597,3.406;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.580,3.399;4.size,1.2,3.580,3.399;4.rect,1.1,3.570,1.0,2.10,3.209;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.209,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.266,2.10,3.133;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.570,3.228;4.blob,1.1,504.iVBORw0KGgoAAAANSUhEUgAAAAoAAAAmCAMAAADKgvrCAAAAvVBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCiLODjBTk4tEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCTsX18GAgIJBATyYmJQICCcPz+qRUV3MDDUVlYyFBT9ZmYbCwuQOjq8TEwEAgLpXl5eJiZLHh70Y2MLBASpRESjQkIPBgb3ZGRFHBxkKCjkXFwCAQHCTk6KODghDQ0sEhJ9MjLOU1PWVlZwLS2qYcjVAAAAeElEQVQYlY3OyRpCAAAEYC2SKBUtaEUL2u1U7/9YTjNX5vR/c5kRhMZ0uj26L5IDaQjKI4W1OiYn2pSezUndIBfLFb02ScvegNvdnvXh2Hy2dRyXdB3IO53ByxXygxC83R/g8wW9PxEYJymY5VChlWD15ejv3/JoDbcDB/YqjFchAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.3,1.0,3.581,1.0,1.0;4.size,1.3,2.16,3.406;4.rect,1.3,1.0,1.0,2.16,3.406;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.340,1.0;4.sync,10.6492343623;4.size,1.0,3.597,3.407;4.rect,1.0,1.0,1.0,3.597,3.407;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.407;4.rect,1.3,1.0,1.0,2.16,3.407;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.341,1.0;4.sync,10.6492343714;4.size,1.0,3.597,3.408;4.rect,1.0,1.0,1.0,3.597,3.408;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.408;4.rect,1.3,1.0,1.0,2.16,3.408;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.342,1.0;4.sync,10.6492343740;4.size,2.-1,1.1,1.1;3.img,1.1,2.12,2.-1,9.image/png,1.0,1.0;4.blob,1.1,120.iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA/wD/AP+gvaeTAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==;3.end,1.1;6.cursor,1.0,1.0,2.-1,1.0,1.0,1.1,1.1;4.rect,1.1,3.510,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.380;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492344335;4.rect,1.1,3.520,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.380;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492344434;4.rect,1.1,3.530,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.380;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAACkpKS4uLiKiorq6ur19fWtra0XFxf///+xsbFGRkZqamr29va9vb3e3t4GBgZlZWUxMTHMzMwRERFiYmL5+fl6enpjY2Pa2toCAgIwMDCoqKhFRUVmZmb09PS7u7vPz8+Dg4Ps7OwVFRVBALzTAAAAUklEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGUTGEqDiIKSHJwCDOIQU2QVpGVk4ebIKCohIPmzIDXBsDbiYcAAD8fgNA4rJSBwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492344507;4.copy,1.1,1.0,2.19,3.580,3.361,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.380,3.530,2.19,2.14,1.1,1.0,3.361;4.copy,1.1,3.540,3.380,2.40,2.19,2.14,1.1,3.540,3.361;4.rect,1.1,3.530,3.380,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.380,3.519,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492344795;4.rect,1.1,3.571,3.212,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.101,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,2.96,2.66,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.51,3.367,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.250,2.58,3.129;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.367,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.164,2.28,3.215;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.184,2.29,3.192;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.361,2.28,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.367,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.195,2.48,3.181;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.155,2.28,3.221;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.174,2.28,3.202;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.367,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.361,2.27,2.38;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.367,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,10.image/webp,1.0,1.1;4.blob,1.1,8064.UklGRhRFAABXRUJQVlA4IAhFAAAwwwCdASo4AmAAPjEWiEMioYo9I0AUAYJaQzAD+U/4YYoJ8A8RrWR8zn/Jy4B//y+i2nwt/GPxN8y353/Nf7J+rP9h/5v+G/9fxv+LfHv0D+pfrj/VP/X/qP//8wX6J+Tnr68s/c/6R+Q384/+fyH/Dfpl8v/sf65f2X/5f5P/7/mb9Z/rv8z/Wb8qvZn4h/ov5E/yz9jPsF/Ef4l/Ov6d/eP7j/Xf/p/mP//73P7D/Xv3G/lfji6L/cv7H+WfwBemXxr+vf1//Bf4j+5fs965f6R+O/71/Ln5n/Uv7j/S/1s/rv/3/AD+Jfxn+mf0/+9/4n+5f/n54/qH94/qHlo/Vf6N/n/6/+wn0Afxb+T/3D+zf6P/T/27//f778Qv1z+8/3H/H/7X+8//v3lfkP9R/xf94/0X+w/xP///6X6BfxX+Q/2X+uf4j/Vf3L//f8X7Tvv/+bH7Effr9GP6lf6/8+P9f7y5oUx790RlcfTfCLLVOKlvJL0NLCFvgN2CjsiG5UqHPZG8+Y1r9f40xYITNGv0MBRyl1fEU+4VMEfsaj2Vfj/4olPGhlH1rRb1iAi+snVJtIkcr5WqPVAhsrcaLm1tPV44QXeQvvNAEFCzVhdoovS9kEokwc1hGDEj0N6gFKnKink6QyN/hyvEQJ8IjF9MS2Or+9EZRR+2A613XNjw1KG1aD+4gusKQ2V8JrfCHAEtYKZ+GiQmV/Ryfyg7BOlTt/3pXrsUyYYJzBRmL7ihkFb8/fUfe7ezowWY5ck6A9pNuUI1f2J0eZ6EW8TkmZlqv2pzfs5mGyIkIhDVq4e2zWPd5VsUrzndOQ+4ag06323wSNEmbhEQ5vO49EzXEZbp1DK67nalgZdMkdxRppqeF+4PrsWcy/nxNvnXySDO6pBu8GJvRiB9iofdjEM/E+SZC8+dp+HcsQLDztAyD0V4nXZjcXx60lGDlyo/u/csoi3g+GQ/mBs6gBYCianJ+PhBD3UpEu+S/vEnPlAT/Cd7vcDzOtarPreoBxhAo37areeBR/lvifi/kaS8FSgWglK9XjPvflkY9YVv2aszflzig/b0x+1bfrb84zbCTlykABoMQDPHsK6pQkqZm1+m+cBauRQjmNaTP2drqpSqyG0dcYbmkPUztKB/WKjPD1mdmjvjfM7mEC6plCn67gVe5x8ltVyzrbs2HQofHcGZk8M8I1xNIwekwtfpVMAwxr5H8dj+j7WWzd778Ct523yX0v7siOzHpd8zQtbq1GqA+PFbIgV5pfQjKeKKnbwPU5W52HCa0ZfKHZpxDaa9kG4AYW69i1Hmbv6W0vXr3Zsl4HGO5f2iikiuCP4i+P70/AXgDZ8gPnCXCY3/ZcbJR4sb+XCpzRZpe1MnHYVDC1Ja/thGgdS9ismoRH4xBrS/ptaxvBF2Lyf7M56arc6uWPXFr9SeCMS1KFkCS3+yrKVjGW9P8RZBL97/p+jl8lDAfmsDekUKyiCA51dx1B4xa1on2X7Ebx/Et5+7tqjAFCaOzDmxCu6F/w90pB6jPYVvjLb9Q9F1aTAFTG1WBWo+S621Gv7cwXt6xnl16Hl08zOeKu6jAOvhAiiOItEQuFcvlJ/CMaYrY4V7ayUQjXgz0PAhIdQOoCSYIrjWRmFWZVKVc5zOxJOL+TKIepxistaSPL9SviL0+OkeGLAedyMYCGQKxcmpxy+Dk3gy85i0+IzqVJorPqrUGvE6bKbFq5tuaWhH5UP5K81Uteqoe8rj8scaRVv6O07rqlm+g91Kw8P1+7ae7nahyA4qawsZb648SWUWJxYbFTCHveTDlyHHS/QH8baJbM89B0aaS87/KXyHwkjZWxuEmWg0ZkSRfyCPti8jNI2bpQWwTHPQwbvz56CckNQ5GXvNzsIgqSWBg3LEp/5tAK08dLyDp0U4rNlwyHwDIR2hGGWf1drNFUE2femckQt8N1KWocAgKW0L17BhFAlSl7zFAh1yiwKpZstZLpQka78/q9HJIuLYmt7iLVvrwmYawLypgR5m6MXTRgJwOWMVykiqcRu2cnQ2Bx/L2Ewf+oJ35WLzgPaCzgzG5cSQRc+tbYUtTErJOuSx15IgoZWgAP7JvNmmtVieGqUnlPTlTHIEGTccXOhRVUFsVguIRSGNBRPHtYuKFaKXdEHKk6nmQ5NS2rZTFC7bfWjvt0eaT0IkfdXlmB0tzOEo+q73BKYYk7XH+tJi+XnHg4F1AyN1hzLG8sk5paOgJTps7KhzQigtyM1U5FZNyAmyrAomwrkr195rU8v7Y/wEepj4scEZ/bOBUwEWL8THxLp/P7qHFjGHwWzMcJZHXwKd/gztVajx2qnUbo/3J+QoQ4Epqfjl4Qs1iBHVz059JCnysrSG7RxNKKMFaEjbqZO239i+CfAq0gpNgBZKx46idEmVJFbkmQMY9SnBskOs57O335+FseWG0OLCj3GzXPpK/ktzEhaDu+aiozLlyp/uDjdTuEYEbkQdWCBtrl+C60yJeiZaN0ijUVQ4pYsX7gTlhc3WZrxmwbxggfno+aL+l5yK8ra3EJQA8R9d6hVKXQoc8BOb9IgYjceFmTEJBP3dJpu+ZlEvz2p59Tqjdl0tTOmr/XM8T14o29OAYXwHM04KU/SbWl0C5pjaO/T2kkj3S349/Nac3/GAn4Y5D+RHrBtqB8C8aBA0WvEHWEwb/HcKiXoOWpk6M/6KiPvnMlMjke0trObln4Lf4ZUtL6hd+/f2bSvitcsRrPexpFDZ4G9M0y+trTk89CS+w/BHOMM9/wIWae9BAwT4SgFEUaxDO2Gf8OSr5bOT18jqeXZ/dIuaNyh6letEhBvQp8qSETV8uxD5TlQOXV/j2ZH1DfjdfRLVBH6ImYE9IFCAz8oi4YCN2fdFJbylWk8n6iGuOjIgMxYfmXrbv55yuYAwqTVfUXHo0IIJ5s0s4Y6YWgyQwsLqd4AIClna33cmzWVLXpc4EVOMD6IfD4B5kdRwOa8ncjd8pcNWGwEqIZkR3YLPiut7+Z2TlUakwudITSbXCxKoIwsPlh17AGJzi5qUeeLy4oPeuhEA1kvt3/BtgQVcj8ioDuhOSHJ4PgRBZnMvq7V9vNvMCXVoP0ErFzFafm+0PLD7N5kFp/goYlrkJthXE0MW6pAXUs+KBV3zEgApjvymOx7RSZ/hR1E5DMy5k2JpeuLVsS2mRUQI5c0LANrAxQFp3iYblTydKLe5XKjTJ9v8//jhBlDk6hhq5V4L7BAXu+p3HMn2o+CsasEIqGg0S5hTYzZHDYCp63CWqiyJvoy+vrFhdSY5X1mk2amUatuekiJMn1T+jiCtvMpRS9c2UJDDhaEyzGtQOF97KSjcj3exelQtCWJer2tRCRYP16cZwe3yvOErWPUrthxVNL8lQp5NGALfdpQ+XgN0DnbncBdKP8DNcWW1Qn52M5It+xWyWhi9FEsAtwPSKm7iNo/kR8Plxxc0CnxlXWRW9OxY6Qbvhq+aMtW+XSSOcnrhaWZaONWDq7Q/ooAFKm5JZ2GWdPlK70xz8MKQUZmGfJzcEQjzqzM2PcexPjv7GCmV0x7rB8n071LKOMm1hO8i4LKDY4bDHp+Ca0eMPQr4Wa6StrmjIfZbb56DzrJ6qiMaTuduKoZ7eaZ2cZcgjcQsqniJBViTqDiQcuXNIFSJCqcK/lohOWmM+Ax3GFmuwLLS9GyeuBn7lJm6HypD/gMPhXA2u8oodP3BGvf+40iwOYxuuT30S7VgibIeWcap54UiVkTNNImtRyaWhf+5GPJxyycAxwW63GoZ8KzY94GM+yDj2QIhOa2JELqeGNqgsYwHeQDfYxl/v2lKOVwp1CDdl3O7BdkY9IldOPW25xQtFSc6JAIan3XtnzxM2Ybc+tcjztvIWcSorzhFZQidGunii5W6fwpvMdNzdrVjtZDMfbkoq/H0yy5cT7rRFVMUeacGnYt7QMmRzVdUtYBQ5heOWBMkZYHMVVlITT9BthLdHl4KvadeaXp5dx6qPPWxba5q0vTYtNsv05AKlifw77RDpqtUToSUhZZknf91QUVtWUOofcxsE9i7IJrW65hPop/yV65xigHDVPzuTMqhBthUjFy13ZoeV4L30kUuQFm9+Yi1S3SyYGvBVmqEPX5vwdy043WFUekzqSwjIf8qxGt4D+chRMY9aBYwaV3bH2rD6KuhCs8klv4zveMOudUFB63KgpcigVrgUSbkPo7uHqSfwsbesG36WEVnxFMC7bO8k0LyN9Rykiv0tCAdOZKrxibI7dnwtlAjWmFG5iq/DBqsi2ekqLFeB8Mh99X/gbYn/PudF8IOq6fPWKfVRIaxcPUS7Xcg7T7I2So+r2FZgVEJpI6jdAoiQiH/KwnxB921nsCylK9cMp1hktzqYhAwNW+UWyku3q6kO32RX0uqLkvSVoIBmFa7T83DbV5BCKLP4vVk6Hfvbs6K07hHZcFql9qML1Z36MoEbiYo/T2G9pTtUeZpaF/h262hs8knc/MUgGkYJqVJ1CipUpJtAeabNd5olLMiGfdwZKQp9KCCdCBx+m2zZvXtSKPJHcB6U1HeTHUBl81U2vn8/AJ8IwIdL8ERj3krj3DfIPGkyiqy1j0sgSx9nzl08g60jzyVCq5N41vjS2MECUKzf5w6ry0oVioAXvADCB9vuMHfCRUl4VVpgr9gXjdHP6aZGCuhDDhSju+ZSVVXtPimwJzsAQzhHW7YuvVFothI2E+edzGaDCpIVu1WoRqEy5AtN8QV9PsLveptYDe0OtKGTQpA79kvQQkPKXIYgvPfoWEYBJDFBfWpEwpAs+8tzO2H4vFMxi5hu04hYd3o8T+I7O03Aif9j3O7QW9kF7vnXmZAcmB86/15vg+LB1KYZ10sMElBTJ9otLnEW4WiR5396bToq/RUlAEAy2Ea0RzeZ7lrYUtOY97A/yIUblo2Vu1kj/NwVSjGtil43RqXWwIjt8ug7Ebz3hhaTs9Q8tb3bRSsGrR4znTqxY1Gwz3tYRGFmRFzzdF3UTuU5mRpXithf+/B5e5I9di2Z9cHk6x9MWo8yOrCqIwSDc//8u7Sbh+Q/wQNsWM3TspgzmBtZIppkrJtJ3wGaabi1Ki6zoggXGJQ9BDUmpeqd0JF4xfsn4Egwxv3+8cYlajEH4Vi2cbfJzNRqRxC96ipHcryEVonGHQWG1JE4/cZsjY4y94izjvtPYQSeWsYBEGUXH0EDC61QcRvlfIIZ4/TNmFvMmnkQ2YvL4DvTW/iQtC266mvke57YuUjMbY9FhJc8fuM8QdCS1dWUVTDbbc1IOuJ9LI6HtdelVi5Xl8jHUnNDACgwvHwZzVya3hkIMPYD4wwya8I+c9R9Zf8XCX6Rxiug/9IT2Uei0quAaRi6VKDzyK8NBCPDhaPr8hGY3tPYAxXebLBENLe9G5DAMjdg/jUKFBvPrmKwhiOiF8p52mzSa2navhTGjXE0+c1yyS3jFbvihn9LymD5UyntiyOvgiIHldP/YTe+DZ2d4Gbfwfc31mDRRvyvMYf9aEGt2sJIK41NFCYepMwUo+GpnQwX2SZkTgZ/Y1AiavmrVCM8p3XJg3CPplly4n3Vbiv/yPLaQcALTFQDN7WPOdDAp/Al3H2qRrVO6ZeYXN0e452uduX0EcOa1BcE10DU+ySELjGrxU9/Z4Txf9R+kQaqx7JHtLyruzEbboFjs4Y2YbnWcH8h7ovFNHTtcCE6NdV7a8utTFHR3QjgBtyOh5VmajLBM7HrNGBvKlAumkNdP3QGlbdnYoH/XLrvX2vOMqA8CRo65twIpjqFysXeV12eAvSUmEioFWCltGJIMO7Pxcsc3LYHVmjDxHmN23j2xaVDHvhZIqMvoRXe4gvwddya99+tW1M6iVJN/85vPAknyvYXRBr8z6OTVvTvreUr0iIAPUWPlfesoCwKWN2JSDKSPdrZoXAjZzDgn6R32aKH5BElkyQsa5lt9ZEGAMsCPJuL/RjbqFA+Io8ydftHZh5cB41Xo61zlAmqMH9Hx+HehXXETSbUq23t1f6pEHhjExVLfXGullYg9ZnUIophszvT/HO8Dvb/zs3HPudbaQkxJMhXY8YfLWNHEyeO8sfB2jvZ86uMJM5sQRqD5/0usQmrerrNFwVyS70xzFx8HY3SFnYDlkKQnKKzoTK8vJpJsPQXlSSzbepQnVPHezecVLnfsFu0LxuH+piv3SNb4xQXoS1WL0Bz9K+kCIGNxSeOpxQnNVtNyRo7xz+i970nsF5oBocG/4lqijkIUARBM1XXVsLAB6cSJ0y+CuAi5LPDjAukrou2eqGa7hLv4I8Cj40WZemjvhTrdrFQtOMKXBcyKiiXIPPAj8160WYkDU3YLRI7Pl1RH6EZiitSNE4w7tHiDw8UiO1c0ksxLnokMXpYLU5iyXT68EVbMzKeFv4RHDB3fm8DwC9Nj7Zbo96ryQwPDNVStfZzjF8S/fFasmSi26FS1VP6By4TSMapLV9XjNwWBD37Z44UcT+DNacKQLO6fOx1+XkzSlXCaSm4LhxNBXpP4BadOn5vUYULlP4A08zXVYIhtS3+LpoJjpL2R+5u7dxQID4L+GI5dlzWDNZRXt9qBDilu3QSuxjYhXjFhHJUKG6vaPhrut+WOQOcyOa8P7QcflJwW6iR9VUyiDTKtg/uvuFyIX2eALpu0yJL6WDpoh8i/HgJffP+5ZHsrEd6cbK+FTsyZouTjwuV1O19+EtUaL2ARzWf1i7umCjOlespHCDySdQqD9t9GrcWqgzeDl8fUn8EVi1GWQBTFCOL84kXHsyyDTLp7Hrr7SgVktYA0g8Pw7BkSlG3foTKmXsSbnzexQjqOpKJdIbDbxDGDzs02F0hmuykbPADeWLxANzFUckJao0XsAjms9eCMdoUd6vdib7CSNS32pVU3L42ZmqdrTvcNcYUS0g5hnfxXAJiQDt/xE9hukpsTUlFHc9DgasCQEe8+5ceLDGtyFWBbXvYel2RSp518dqgeSWHf33pczX3GqNLdlpxyvL8oE7ZFLZYbx/EfPIt6vrJP4w6zQWwyOS3n00vIH9LC8V5h9UbKQwLUXg/uzVGv0nTOYqk+EpCM4Y4vLcm0RC+7KynEhQ+XNl9RMja18A7E6wvcx2LPgWyI6TgA1gnUi8QtR13jr8a8n1emzE/NIRG5L2QKUqyHBKxwIo4c6JmhsoZodg/KZLR/f/AXF3Uo1XYJA0S3Sv1L1OrvC6dGgmfXNrW/AoDwZ85wWkpZgbojShWk9rVGjvAxBbfa6QMELFCFmxydWMGevK8WtLxtvw+2xVBL8kqdmphM8hOSw250I4+zRi2ACk5oa2gCKLJCt4R9er6X1T+whjjllCPoCefJpP/lbFkQSz/EHyB5bQ9M6D54L7XQnMMCLX272k6tQWcT4r9mh6K51VQ6lXT6twEtT1TfF/MyBwUrm+ZNlK1IlDagPx/pO9ot62sWeEC2xb84nsD6hRjWGM8HOZhpvS1g0TdLvcvFJ/FZmqxhfdhrKZMwXxH3LlmBEDJDhJasiYcU2/cBzzXKeFnKiunKzjyccVRmlKA0FjKjABmF1JOkq7mWEAO0jJLVUyfzcNJJ9+MYLAbFWejX+Zf3L4Pq7jGlX71tWRRgOEW4kZqxVmZut/HWWdVu3JkimepsPE/vzluP/F/GvcxF3D5DJqnoAV3nZ2GOfTEd7zY7/u22KKYGH3MaQt7fAMv0NTkCiQBgogDaej2pdbm+qCoRyhNbEV9Ab6FxT0WP2wIV7dr6qodPmhNjaSaVV6viEJc0ciHlXqFkSOrJlh/gJqu4+weEEx85OEU5woZBB8vfsUoK3Cp1QlwrSbrIj7zAnJalZw848g0shly9BNN3d15lNebPNbyJ+qYzhJPUpBSzTBrV5Mqc4EwAI3jbz1CTxluB3YkfZ9wVzG7x10K16RIURJdcGr79iV8N4zRF25K9jeQKGBW1JZYaI2Fv0k9B7Si3ca32dkEpL/2DP3n4Wig8QwCDqwHooL/tcDj8hxl6Oder9/R8CY2R8+MYDYQ8gHE+CIgN91M1U66oiy2UXT;4.blob,1.1,8064.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;4.blob,1.1,7464.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,8064.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;4.blob,1.1,988.gRayCQGAbEIAIJsQAMgmBACyCQGAbEIASHS7as7fZ4A/RAZMEis0UsgRXht0yFGQmefTJkH8Tcf/Co0UcoTXBn67as7Le7wbvk2SWKGRQo7w2sBvV835m+tr4m2S+pBjEis0UsgRXht8yLF9Xf/djWwSzkqO/lZopJAjvDb4kOOXzbnBJqGs5OhvhUYKOcJrAw85Tjq11WSTMFZy9LlCI4Uc4bVBhxwvlTxVX/8N+2aQdiyUlRz9rtBIIUd4bdAhxzP2olU7tGNhhBx9r9BIIUf4CIIOOU7fLZjJZuqhoBBCjv5XaKSQI6A2hberNl2bpDrkmMQKjRRy9K5N5e2qXWySspBjMis0UsjRs5ZCjkQ4kE0IAGQTAgDZhABANiEAkE0IAGQTAkCCkOMHke8v5oY9Ggo5eqqgCjkuOW99G9rTezQSCjmGoYIr5PjJRe+ziINCjmGo4Ao5Fq/iA+J1KOSIQAVVyHFq1YE9VUdn6cco5IhABVXI8cmGr0581Hb9WO0YhRwxqGAKOUY4zmZqxyjkiEIFT8jRpmGndoxCjkhUsIQc+Yf9rW3DvdoxCjmmXwVVyFG88q8W16d512rHKOSIQAVVyPFSj+H927z953rtGIUcEajgCjnu/aqwMr+9foxCjhhUKORIoIVsQgAgmxAAyCYEALIJAYBsQgAgmxAAEq3kWHS6+L00DMc/FHKE1wYecixdc+6Mz6+a6XbVYaigCjl22/M7wGno0O2qw1BBFXJsNyOD58Tr0O2qEaigCjl+nn/n8js26X/5o9tVY1BBFXL8oupI6cHKPvoxul01BhVMIceSbQM4H3fbCO0Y3a4ahQqikOPhr8VmFtP/Xk23q0aigibkeHKC2Cxkd2nH6HbV6VfBFXJsWddavOkU6AkWul01AhVUIceK4jdqX688pB+j21UjUMEVcpzdfPnG8XH/PZRuV41BJT0hx/8Hp6XgbgIkwdkAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492344988;4.sync,10.6492345988;4.rect,1.1,3.570,3.380,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.191,3.193,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.269,1.6,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.250,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.307,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.364,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,10.image/webp,1.0,1.1;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,848.lSAXLvvkzTdVGt75YDLSMJgX4m+FVZaXPltkk5vNgfm3PMhBhQhXKBTbXi0T3o/a6utZ3S/D7J8vt/qYBAXXVB9lPStIZGntig7iWBEVGMn39tzT7svg4u6IvC4Q1GId8jynvpdzFqS3FwzULfLaAZZWYhpncEYAtHwCiujl33yZpuqjWKHSwdA5w7Lka0Ubx6X+E8QLkhpC0ft3W/JXbE7KxkosqF2/Y6Bp8oD8NrQ4I/t/Vo0GYn1nKSZxwhQU7iFt2YW0UytP6/wiE9nscnNG5ZSe16keS4W3iP60oJqMQk3Njk0aX+pXHA1CjbzC1ojtYBK+Z/ne4qat6dqKt1oNl2mYv2ls3kmu92w8MzblQaplD9lk3flT06Fsc6TIRW3lMyVyOjoqe18XYSjXO6u2EB2RrBRV70vGRZDFlZA4G0Nnr7LOFZHauqKhAuxDOQ5mI2fL15PbP5mtikBEU9HBJEbNHMdLCH7qHg98Fmwmpb0f7zB4e/ZhBuWMxQTQHVmWAKTJO/+DHxdjtaqp4ps1NJMjSQbjrkwc/4K0iEKBDCW1SDwKC3hU/AfLghzYrJu4uN7AOni3fsxEr8ykZRvcP5HHjG8tYLfU3lgPIRw84VZdwkyUYCJSsZS1EJRMuwOpgPUMoA3JR63/CZrc8cZCEB5JOvXgWw3oC8zCNZ8OYz+x0F8TtS8CTRpd76O+G35ESSJXgKuFV8itxXuZH4DFN5JwTKuu4CSiJFRVAhqK2qmlnV8O9x3NBpysn/ElW85DsJ++VuJolreCfGgAplJ7tHskLG3UC4vPeBTu5p0HxyX8P6oNCo+AKJFq2Mdy3ZQete1uYAAAAA==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,8064.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;4.blob,1.1,2028.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.174;4.blob,1.1,8064.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;4.blob,1.1,3640.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.231;4.blob,1.1,4212.iVBORw0KGgoAAAANSUhEUgAAAhoAAACkCAMAAADmOHc4AAAB71BMVEUAAAAFAgJNHx+JODiUPDx9MzM3FhYDAQFMHx+JNzeVPT1+MzMvExMfDQ1zLy+NOTlbJSUIAwMdDAxqKyuOOTmROztlKSkUCAhiKCiPOjpBGxsqERFWIyOZPj5nKip4MTFfJiZAGhosEhJjKCgoEBASBwdtLCwuExM6FxdsLCwbCwuSOztwLS00FRV6MjKMOTkRBwcOBgZ6MTEWCQkBAACANDRSISGLODgEAQEaCwthJycLBQVeJiYCAQEMBQV0Ly9BGhoaCgpuLCyTPDyXPT0tEhIhDQ1YJCQHAwMQBgZoKip2MDA+GRmGNjY4FxcEAgJDGxuYPj4uEhJJHh4pEREyFBQXCQluLS0rEhI7GBggDQ0kDw9zLi6KODhTIiKCNTVcJSWHNzdKHh5HHR1mKSmDNTUrEREnEBBQISEQBweENTU9GRlIHR2WPT0iDg4wExNPICBUIiJgJyddJiZ8MjJRISFFHByOOjpVIiITCAh3MDAmDw91Ly86GBgJBAR/NDQcCwuFNjYZCgo5FxdxLi5rKytpKysKBAQxFBQjDg6BNDQ1FRUlDw9rLCx7MjJkKCgGAgIVCQkzFRVVIyN/MzOINzdQICA8GBhaJCRYIyMYCgqQOjo/GhoPBgZZJCQNBQVvLS1fJycLBAREHBxJHR0WsTqTAAAKIklEQVR4nO2d/VsU1xXH77prUMTyIhgQrxZLQF0FkVVMDS+CJjRUZYmpSUjwrUhja0gTLJAaK02shrwZmzSttbVN+4d2Zl/nruPcM+OdOfd5+v38MFx45nzv9clxd9n9eCJEhdSGdGbjcyJx6jZtrt/SUFhu/VGmsalZX0K9j4qZvPhSWra1tm1/Plpt8KloFe0dOzp3ygb9ATzs2h3qdl9+3Nq15yey21m90NbTuze9T1tBvY+Kmbz4UvZnDzQc7Os/FKU2+FS0igHZ5VwPh/ujGWiNQek8UuWO7HKWR4eOCdErX9SVUO+jYiYvvpSf9js/O972UpTa4FPRKoZH6pzraI9aO1Z/Ynzi5Cln9fJopv+VSeFdbZYFdCcOpqX9Z8711VHnMuX2xyH5c10J9T4qZvLiS9l22r2eOROlNvhU5IqzA9P5GbV2TKZfO/f6gBC/yJx/480Ot3Gqq7dm3z4yOzurOzGBY+/MOdcLF50nukvysu5u6n1UzOTFl3JG7iS9hPGrDT4VuSIr5ZWa2jFZ6tVfzg8LcVUueFdmXmu4/KrtXed6rUn8euI32Q26u6n3UTGTF2PK5evZ9vei1QafilzR0t2UX1Rrx2SquMi+714bf+tdGWuNxXzhN6NrH7zUvyAIrUG8j4qZvDhTBufS8sPhKLXBpwpTcX5J/b7cGik55n7Z+IFnJUy1xtaJG4WvF/JTzoPHhP4JhXgfFTN58aYMX5G/i1IbfCpaxcDeEec6t6zWVh41JoqPFSvelaHWWB1qzxUWUx/VuU2ofxlKvI+KmbzYUure/7375fDNKCcIPhWtYlB+7FzH+9TaSmu8WnyFcc67EuLivO64em794UBdcTWXdjbbI2/rKqj3UTGTF1/K2k3nr07uwoFQtc3NhFMRK7Yvd3WuyF61ttIaf8yMX/1k+byycl87b1p4bkR35ECGP23c4/yaM+ukrGb3nfpk87i2hHofFTN58aWcO3mnYeZP17vD1E62dtzVn4pYMXnjdLbvXk1tpTXEZ1Plt0+rK5FbWa5f3687ciCHim+OyM+d9VujmeUPCb+nUe+jYiYvvpSXexo7DnwRqvbs+vwk4VThKwAAAAAAAAAAADu5WHh/4Q3GEwTKahFEQSP7WpDCLQCKL8fddyXv6k9QxdSH8kWCZbXwoqCZfflTuAVAIb6aIxxdxWxrBMpqEURBI/takMItAAoxNC1ytbXxC4AeAmW1CKKgkX0tSGEXAIfzSx35qdtqbUICYBG9QhdOFDS3L28KuwB4N/31wsG1d+4rtQkJgEX81LNcyqX0qX1IUfBZ9rUqhV8AdNgv31S+T0YALB/KRz2bKTxnbSt+E1IUfJZ97UqxQQAU6RXl20QEwDJ+OtqtrS7fFNZhRcFn2de2FE4BUNx+4F7Tf1ZqkxAAK2gUutCioKF9uVPYBUDn0foF5zVm/ilPKPEJgFWCZbXwoqCZfflT2AXA1LdbHhw88l1KqY1fAPQQKKtFEAWN7GtBCrsAKA593TjRU/OWW/wCoJcg9SyKKGhiXxtSIAACAAAAAAAAAADBrJbeN1jR32oWTADUpjALgGfdtxpnDxbfAKeCCYBJpPALgC5/Wdftr4AJgEmk8AuADqnGHeoPMAHQghR2AdDl+2zN8w4mAFqQwi4Aunz715ofYAKgDSkWCIDd8kRNLSYAWpHCLwB++XZtLSYAWpLCKgA6vZl/vbYWEwD5U/gFQCH+9t0Tj1mYAGhBCrsAKJrbnnzYwQRAC1L4BcDp+oEnajEB0IYUCIAAAAAAAAAAAICO53c19m9fTXxbCIDaFO4JgKn59Qefz6+r/xxaAwTAJFLYBcBOOSvEF3IP5Q9QBgJgEinsAuBVuV+IE/KUUgsB0IIUdgEwtbZvdbXnWu18DQiA7Cn8AuDDNin/PqjWQgC0IYVbALy/dHim4aul2uGQEAAtSGEWAB+ddJ43/nH9kVILAdCSFFYB8J+X3Otak1ILAZA/hV8AfK3+uBAj9Wp/QQC0IIVdAHw8NLV4b/fQY6UWAqAFKfwC4MM7ra13Hqq1EABtSIEACAAAAAAAAAAA6Hjvo8zadPLbQgDUpnALgO9m/9VwVNbM8tIAATCJFHYBcK4/JcS/G7Uf/XqBAJhECrsA+Kn7X+ecbFFqIQBakMIuAO5uF+7f4V6lFgKgBSnsAmD7fM7VyheVWgiANqRwC4AL8ugP3emaQdQQAK1I4Z4A+J+TMvuKVH9HggBoSQrzBMAfXrz/aCin/AgCIH8KvwDocvx0zSMPBEALUtgFQNF86r+Xbh5TayEAWpDCLwB+ltlyufYfQ0MAtCEFAiAAAAAAAAAAAPAUhht6ijM1TGt1RCAAalN4BMDHGzZLWXirI4rABgEwiRQmAXDv2uVNxdaIIrBBAEwihUkAbM6J74ut4auKQQC0IIVPACy1hq8qBgHQghQ+AbDUGr6qGARAG1LYBMBya/ipYhAArUjhEgDLTyh+4hcEQEtSeATA8stQP/ELAiB/CqMAWGoNX1UMAqAFKXwCYKk1fFUxCIAWpPAJgKXW8BW/IADakAIBEAAAAAAAAAAAeAoVAdCzshwIgPRaEwJgdUXH1Ify4fIgANJrjQiA1RUdntaAAEivNSIAVlce4hcAPXtQ8yAA0muNCIDKqkwSAmBlD2oeBEB6rREBUPi3RvwCYGUPah4EQHqtEQFQ+LdG/AJg9dNdamtAACTXGhEARVBrxCkAhm4NCID0WiMCoAh81IhRAAzdGhAA6ScwIgCKwNaITwD0tgYtDwIgodakACgCWyM2AVBpDVoeBEB9rVkBMLA1YhMAldYg5kEA1NZCAAQAAAAAAAAA8P9BWfvzTOLjIlBWizAp0Mi+FqRwC4DVSXx0zFpewbJa+EmBZvblT+EWAD2T+OiYbY1AWS3CpEAj+1qQwi0AeibxeUhCAKwQKKtFmBRoZF8LUmwQAEuT+DwkNAGwiF6hCzcp0Ny+vCk2CIClSXweEpoAWMRPR8ulXOqU80EApNeaEgBLk/g8JDMBsHwoHx1tpvCctU05HwRAeq0hAbA8ic9DIhMAy/jpaLe2unyjnA8CIL3WjABYmcTnIQkBsIJGoQs9KdDQvtwp/AJgdRKfhyQEwArBslr4SYFm9uVP4RYAPZP4PCQhAFYIlNUiTAo0sq8FKdwCoHcSX5UkBMAqQepZlEmBJva1IQUCIAAAAAAAAAAA8BTKAmBqQzqzsfbjNTuBAEivNSEAtnfs6Nwpw8mhmACYRAq3ADggu5zr4eT/79Dh8yAA0mtNCIDDI+6HV6M9ai0mAFqQYoEAeHZgOj+j1mICoAUpFgiAWSmv1NRiAqANKfwCYEt3U35RrcUEQCtS2AVAh/NLai0mAFqSwikADux1lZy5ZbUWEwD5U9gFwEH5sXMd71NrMQHQghRuAVBsX+7qXJG9ai0mAFqQwi0Aiskbp7N992pqMQHQhhQWAfB/BGB8ARi2D8gAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492346712;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.101,3.177,2.28,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.136,2.49,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.136,2.29,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.136,2.29,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.155,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.174,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.174,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.174,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.193,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.348,1.7,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.364,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,10.image/webp,1.0,1.1;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,7432.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,8064.iVBORw0KGgoAAAANSUhEUgAAAiYAAAEZCAMAAACU1B6RAAAC9FBMVEX///9/f38AAAAHBwc8PDzAwMBbW1vDw8M3NzcPDw9DQ0O2trYbGxuDg4PPz89OTk4TExMODg5WVlbd3d1ra2unp6cBAQEdHR1iYmLj4+MfHx8rKyv+/v61tbW+vr5NTU0mJiaXl5f39/eHh4ft7e1FRUUNDQ35+fnT09NJSUkQEBBfX1/r6+snJyfk5OShoaFnZ2cMDAy0tLRVVVUCAgLBwcHZ2dkGBgZeXl7x8fE9PT2xsbGLi4saGhrS0tKoqKgzMzMVFRUYGBjCwsKgoKAlJSUjIyPy8vKrq6sKCgpzc3Pn5+eBgYH8/Pzf399ERESwsLCioqIkJCQqKir4+PiWlpZMTEw2NjY5OTl7e3tPT0+CgoIDAwMZGRkWFhbs7OxjY2Pc3NyOjo4vLy8FBQUoKCi/v79ZWVmSkpJxcXF6enpAQECsrKxhYWEEBASYmJhISEjw8PAUFBR0dHQSEhL19fVtbW1+fn4gICAwMDCbm5toaGj7+/taWlrq6uqRkZGzs7MxMTH9/f0RERGAgIBkZGSFhYXz8/MsLCxLS0sXFxdwcHAeHh76+vplZWVKSko0NDTm5ubb29vp6em7u7upqamMjIyfn59qamp9fX0LCwtcXFzHx8ciIiLU1NRmZmbJyck1NTVHR0fQ0NClpaXY2NhGRkZQUFA6OjqNjY3Ly8s4ODj09PSEhITu7u5sbGwcHBx8fHyIiIg/Pz+6urrOzs5dXV1paWmJiYnh4eEICAjl5eWPj49vb2/KysohISGysrLFxcV1dXXe3t7g4OC9vb0tLS13d3fW1tZBQUHIyMhYWFjGxsa5ubmenp5gYGBXV1fMzMza2trX19eKioro6OicnJy8vLy3t7eTk5OkpKSurq7ExMRUVFT29va4uLjV1dWZmZmjo6OqqqqGhoZ4eHgJCQmdnZ3Nzc1ycnLR0dGUlJStra0uLi55eXkpKSmvr69CQkLv7+9RUVE7OzuQkJDi4uKVlZWmpqY+Pj5TU1NSUlIM4GAjAAAaTElEQVR4nO2da3gUVZrHDyfRyE0IMkFDGIYIhEsCCCgIKgsKDIKAqFERCIzgKGLEKILKuhBFJJjh5oVBcVBGIhC5jDBI4sxyWVHQERVZGXcWV2eXddXZdXTXHWe/bFV11bl0Tp96q1NVfZLn/X+oPn3S73su9U93dfXvOYcQFAqFQqFiUwtKaVb2WVbpbOooh5BzKG3ZqrX8ujZtnWML63Buu/a5Hc6zCh0TET9wSnmdzr8gtL7o8+V3LrCOWW3FPgPVhf7Qfuj6IzGWtdaNuioEJ+Q95bPBZwgsFtHmQvtpfosUc6DL3L1Hzw5FbrlX7z59+hYTcU6FM6iIKKH9COlPB4jj4HWkxUU5OQMHDb6YkEtycoYMzcm51LLJsJzhQ/Muk/pwudPI5VYjV1zUY/iIvxlp9b/jqBxbVm86tsm58qrRY8YGmZmG4n3R58unP7aOQ9qKfQaqcNzV3pHHstbGW6MZadXlFIAT8p7y2eAzBBWPEGyimANt5gnZrUv6k+JrrOLE9pMmXzvluuvFOeVnUBVRQm8gpNSxCRsHryMtWlqHghtvcsKybnYezplqHW6Z1kvsw+W32MfpViNDZ1gGLOs500qYzyZrjHWYlfcT+MSoxPuiz5dPb7XO4+y2Yp+hmjrHOgykt4mxUmttguXjsXw2+AxBxSMEmyjmQJv5p7eTO+aSO+dZxbumWA6ZVX63OKf8DKoiSsbNJ/cMqRggjoPXJdKQe+9z6kWbLKi4X+zD9An2cdRCQtotskvX9m9gE9KmI3xiVOJ90efLf4BOJqQ8LZs8SK237If6LBZjpdbSsYkTy2eDzxBUPCLJJklzoM18x98+POzvliy1/oMqH3nUrlj2mDin/AwqIkhJadbya6f3kG3C6tw0Ux936kWbkBU3in2Y7jRctdD+sFrpvhF2fKLQUjVxh3TP7MfgE6MS74s+X/7PVq0mZFpaNlmTdzshnX5KxFiptXRs4sTy2eAzBBWPaNPWzvJEC/UcaDOvHUVHr+v8pFVaQ5/yKvmc8jOoiCAlC6vmtet45wBxHLzOSlNYuO5p+owTJtlk/RixD6OcN6sZP7cObWdvePY5+1niYqevXdpYWPh8j9xGXsPyvujz5f9iE+1CBqdlE/LCi2Qz/SURY6XWgtqExfLZ4DMEFotok7iAbJFiDrSZC1+qfnCLXXiJLvHq+JwKZ7BhBCmZu6wm66yXB4jj4HXOlTDN3ZqI0tnEceFIp5G1915Ol1nXPR2nb7M0kbipp2wKMjEK8b7o8+UPIPO3k7z0bDIhq/aV8h1EjJVaC2oTFstng88QXF5Em512luktUs2BPvOCXZtJgWwTNqfiGWwQQUruXUKrKlcPEMfB66wr4W3bLvGalWyySvrQqXLSV+xOPFv8K/q0dG2ya9u2V28CzYdGvC/6fPkPkefoHpqeTfbSydtfdcueTcTWgtqExfLZsJWYoSBKRAjXJinmQJe57a9/2KnnhdKHDptT+QwmRZCSlYUb9pEH5GsTVud+drkSbbK4SrqE3bjeOlTPfo1U32x/CSers5MvYffQs7TT4C/eF32+/H2EbBmWpk3IrprB3nd94dqEtZbGtUkils2GMENACRHyJWzSHPhlXjdy/+M/n1dXX9nHuQ65+nVxTtkZVEWQkt+QW35LbpVtwupS22S3/IV46N9bFzUH6CaruexK6ytWyaQG33SWzgfMiE6yTVLny7cGfJCma5MBlL7kFsVLWK+1dC5hnVg+G3yGoOIRSd90kubAJ/OhQ6TnYTL6IOk72vpCvH/Ig+Kc8jOoirAsYamBTdw6IY18e60DlW+v/cNFL06++z77G8KT5V0nL6mZ/Qa7ETPeHdIIuhk+MSol2SRlvnz7S+Ikms7tNWLfNBntPAq318TW0rGJE8tng88QVDwiySZJc+CTeflYcuTNH1jvDYfv6zF8ROcjReKc8jOoihBswsahtIl0sz63VZekLrx1tK5qt/01iRxbVdGnx5WE3dbt5g7pmjFvwydGpSSbpMzn2CSHpnOznti3YO9wHoWb9WJr6djEieWzwWcILBaRZJPkOfDNfPHGR+z/716r+rTsW0akTwt+BhURgk3YOASboFAoFAqFQhkkikL5Cm2CAghtggIohU22v1N4eGW8PbE1e2G/oivaOcXVZxUW393TPwT6OqjCyRddlgeGl1361EZA8LSprcclVW2cV/zwiEVBWvPq1DZpU/u7dq+R+wGd4Zp3LNDLlXq3bP2qX5JWVumJsV26Hq8f6BsBfR1U4eSLLsuR5Xvavff+w7v8YmdM6EfIRXJd3QcnBr299kQdvDVWp7bJh+usXM8UT/PrjKgQbDKaPEtp3ls/toqvnRxCaVfyuF8I9HVQhZMvuiz911l17cf+o1/s8cO7FybbZAvJpnQY6Q1vjdWpbfKRfaZ6kKVS5c6izqcWLF5hlc65uHDd750+sFK/ML43Lf34cuv4T1dahz/Msw6dyEN+IdDXQRVOvuiyDJ9oH3891C82N48uS7bJi+QIpZ3JCnhrrE59Yo99bB2mkK5S5U5SP3fSP4+itOT0J/PP39GFiqUXsm/7l+zsbL/eAzRkzWXW8ZJPrQ/G/WS336uhr4MqnHzRZRlKXode8jSwSd15A/Pzu8xK8aGjao3VqW3y2do8+z2qRqrcSVwP//GDctuaR8VSONcmtv51rI35zbqb/mzBv9U+6vdq6OugCidfhFl2V9d+th0U3sAmdM6lhNwzOkBrrE5tk6Pktfta1ZNJUuVOciZRqH3FPhY/LZZCs0lNwbNOB6/693VHKcAmwNdBFU6+KLNMuayePAi5amxgk3Hnbitt9/ne5O8/mtZYXYqrif9YTGp/T+TvXTtJ4u3qDNlpP3xxlVCiYdlk9YILncdLCg5abyoL/D90gK+DKpx80WYpf5NcDQhvYJN9i0dROr16H7w1VpfqovO+x8ftG58nVXk2oQsS7yFbxVJINskf/1mi0YPPzbYN6XsRCH0dVOHkiyzL7FdetR+25QDCG9jky/328XA31YvVfWZ1qb+btJ+Y9G7HbPJV4opkklii9NO1gK77qOXze2YnSpfVW431Jn/yi4C+Dqpw8kWX5bycwZTmvfQkIJzbJDfXeZhb1J7SiqKbAa25EawuhU1yV/zn/pwhch2zyX8Vnnqxb/dPpJL1JY20OPpsBaD7qVX+UXFv6+tStpVl0fKBK/r2O+UbAn0dVOHkiy7LpMUHppZ+Xf1nQDizyYayb/rYjzNOHqz59tjJkf6teRGsLoVN/rvwipvPJNUxm9CX/1BY3C1XLtG8rd2LThwBdD+1drm/Wr9tlV+4srD7g7n+MdDXQRVOvuiynNOl+Js9wyDRzCZZJ9ZucApzDpSVHZgDaI1FeHX40x8KILQJCiC0CQogtAkKILQJCiC0CQogtAkKINEmAmKoQuRiEEKOvlkyDzlyxFCFyPkJIcc4smQechQQQxUi5yeEHOPIknnIUUAMVYgcQo4mZDEEckwghlTFPiHkaEAWQyDHBGKoagQhRyOyGAE5uoihshGEHI3IYgDk6CGGqkYQcjQlS6YhR4YYqhpByNGALCZAjhwxVDWCkKMJWTIPOQqIIdXaBCHHzGXJPOQoIoZamyDkmMEsCDmijBXaBAUQ2gQFENoEBRDaBAUQ2gQFENoEBZBtk5LPxn/lPGEQXN2E+tObz1a8fDvZTulVm6PqTYSQ46fOHZn5dJF7b8b5gcEbuTheNhs+YhChl1nsix4nTKF37cn1m4OMQY6Tqj867tyi5RDcxzvu3/I6mdowVcQ2iRByXHLKvr/bh2bZD9kdnB8Y2MiF8bI6vQSI0Mss9EWPE6ZQdoFjE/0cZAxy7Lnjf9xKBsFVkfXW022KyY/WJlFCjp9/KD577IR1YCMXxstnQy8BImSZeV/0OKFa5b3esSfXZw4yBjl2LMuiiV9lGQQ3rcL+Ae7i1nKeP39R1OtQwiaHTp4ebvOId8+yDqvJndbxyMDuD3/1I7/e6xUl5Dh+JR3MntQV22vespEL4+WzoZcAEbLMvC96nFCtQ2u22JPrMwcZgxz/2OWG5dc/Y78TiRBcVtXKylIpzcbrz+p9vMyxCdmzom/3g1S0SUXZntJBm79r6dd9f0UDOU6r3Luj8uCt7rNly+3fLvjI+XjFOh+5p4Fn5n3R44RKdaod5LxVO0o9BxmDHL+oPDBp34L+dq0AwdUS8qac5n+LrSuibx2brMmySzeJNplPrrPeMAe+AByCRtFAjo/U/+Xoe+etcS/qet1gH4WRs/GKdT5yTwPPLPRFixMq9XVrym2imYNMQY4TN1lvmVdfM1KG4Ja26lYpr/e5yZ47fm2SVbBetMnI4je6hvI7bZSQ4xEy03lsRTrbD3zkfLxinY/E0+Bk5n3R44QqlZ7eyG2inYMMQY77v7Se30qGNYDgPtkrpfnOJl6FS9h7bpGuTab0/6Z6z02A3usVLeRY73wNpktucx74yB05402q00k6DXZm3hc9TqjQmYmP1tV9T7531jHzm4OMQI7HJlvPHyA3ChDcqOM2XvRhdynNJpt45TYZUtDRjUjYxPqQvml4YQmg+zpFBjn+aZB9rP+JfZxS+Venjo1cGC+fDV+5p4Fn5n3R44QKHXfv5tgzq5uDzEGObWvbW2+zhbkCBDeF3GW95tT7Uprb152hdJVjk36W6QfZpbnXW+9gNbZN3vzCeh+scOIaoeggx5qCJygtKTjfGckF5U4dG7kwXj4bvnJPA8/M+6LHCRWasd3STDLziN8cZAxyrBj/25rfLHiNihDcU93Xb9matGR9/uk35j/7nWOTgk96D91hG/q6a/pP2nfStsmthZNXrPq6dgpkTlIqQsjxTK8rBnV46zv7Kj93rPvGykfOx8vrfOWeBp6Z90WPE6aS81btMweZgxzntF6+boLzzZ9BcBsunFj7/rdJeY72qn7+fMcmH81dd3r4dLvu/166fu97zofOOb8r++bJlyGzkVpRQo67/lK8oEsnu7SyqMqtYyMXxstnw0/eaeCZeV/0OGEKOTbxmwOEHFHGCm2CAghtggIIbYICCG2CAghtggIIbYICKJVNmstKjt44BIyRRwibcoto47sE8BMsQxt5n4OjkjJMytt1S42BHHXIIjzCmz+1TZrLSo58HBxj5BHCptwi2ujChj5iaCPvc3BUUoJJebtuqTGQoxZZBEew+VPbpLms5MjGIWCMPIJvyi2ijS5s6CcPbeR9Do5KSjApb9crNQZy1CKL4Ag2f2qbNJeVHNk4BIyRR/BNuUW00YUN/eShjbzPwVFJCSbl7XqlxkCOWmQRHMHmL+WJbS4rOfJfNlyMkUfwTbkFtFGCDVNLhia99S+Do5IMJuXtslJjIEctsgiOoDQdmzTFlRzZODyMkUfwTbkFtFGCDVNLhia99S+Do5IMJuXtslJjIEctsgiOoGnZpCmu5MjG4WGMPIJvys3RRgk29JMHTbL1L4Ojkl4Eb5eXGgM5apFFcARNyyZNcSVHcRwOxihEsE25GdoowYb+SkCTwvqXwVHJRARvV+hBYyBHLbIIjqCNsEnTWskxMQ4BYxQjvE25GdoowoZaCdCk1+fgqCSP4O0KPWgM5KhFFsERtDE2aVIrOSbGIWCMckRiU26GNgqwoV4cbWR9Do5K8gjertCDxkCOWmQRHEEbY5MmtZKjOw6OMQoRbFNuGW2EXJswtFHoc3BUUoZJebuJUmMgRy2yCI6gjbFJk1rJ0R2HgDHyCL4pt4Q2gi5hPbRR6HNwVFKGSZNt0ijIUYcswiN8bYJCcaFNUAChTVAAoU1QAKFNUAChTVAAoU1QAKltIm5cHadwu2rfLPFCjqrtqrk4uAeXiZBjcDWX7arDgRxV21VzCbAhXCZCjsHVXLarDgdyVG1XzSXAhoKaIOQYXM1lu+pwIMeU21VzsY2rPTVNyDGgmst21eFAjim3q+ZiG1d7apqQY0A1l+2qw4EcU21XzcU3rvbUNCHHgGou21WHAzmm2K6aSwL3EmqakGNANZftqsOBHNXbVXOJG1d7apqQY0A1l+2qw4EcldtVc0kbV3tqmpBjQDWX7arDgRxV21VzyRtXe2qakGNANZftqsOBHFXbVXPJG1d7apqQY1A1l+2qw4EccSVHVAChTVAAoU1QAKFNUAChTVAAoU1QAKFNUACpbZJyu+qIhZCjbxaTIMeU21VrhJBjHFlMghxTb1etEUKOcWQxCXJUb1eNkKMBWQyDHBtuV42QowlZDIMcG25XjZCjEVnMghwbbleNkKMZWYyCHGmD7aoRcjQliymQo3K7aoQcDchiFOSo3K4aIUcTspgEOSq3q0bI0YQsJkGO6u2qEXI0IQtCjihjhTZBAYQ2QQGENkEBhDZBAYQ2QQGENkEBlMImbDPmjEkL5KUBQ4bSrgFZTIIc+WbMcIUFEiSkB/KCw5DhtJv5LCZBjnwz5gAK1yZaIC8NGDKUdg3IYhLkyDdjFhU95ChIC+SlAUOG0q4BWYyCHOXNmF3FBDkm5I8JBoMhw2s3s1mMghzlzZhdxQQ5JqRC7gbX2fKWcQoGQzamXaOymAU5Ur4Zs6d4IEevgwrkrtT5XJuceBIQhmxMu2ZlMQ1ydDdjZooFcvSkQu5arrY1xikHhSEb065pWUyBHMXNmLnigByZfDDBwDBkSO1mOotRkKOwGbOgGCBHLj2QFxyGDKfdzGcxCnJkmzGLih5yFKQF8tKAIUNp14AsRkGObDNmUdFDjqJ0QF46MGQY7ZqQBSFHlLFCm6AAQpugAEKboABCm6AAQpugAEKboABS2mSRe19iq+qPUQpXcvTNYhDkmGXf4szukLgJDxWu5BhHFrMgR1uPnfDriyRcyTGOLGZBjpbqiu+XK3AlRwOyGAU52lq2POnuP67kaEAWoyBHW71uSKrAlRxNyGIY5NiKdE6qwZUcjchiFuS45LbkGlzJ0ZAsxkCOlmcr/5pchSs5Zj6LWZAjpbdfUJ5chSs5;4.blob,1.1,2012.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;3.end,1.1;4.sync,10.6492347272;4.copy,1.1,1.0,2.19,3.580,3.361,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.380,3.570,2.19,2.14,1.1,1.0,3.361;4.rect,1.1,3.491,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.380,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.383,2.58,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.380;4.blob,1.1,3340.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;3.end,1.1;4.sync,10.6492347733;4.sync,10.6492348733;4.size,1.0,3.606,3.414;4.rect,1.0,1.0,1.0,3.606,3.414;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.590,3.399;4.size,1.2,3.590,3.399;4.rect,1.1,3.580,1.0,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,2.19,2.10,3.171;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,2.95,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.580,3.228,2.10,3.171;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.571,2.22;4.blob,1.1,996.iVBORw0KGgoAAAANSUhEUgAAABMAAADOCAMAAADrLskPAAABiVBMVEUAAAA0NDTAwMD39/fr6+uYmJgNDQ0eHh7y8vK1tbVNTU1gYGDl5eW0tLSJiYno6OgGBgb///8sLCzExMSsrKwdHR1oaGjZ2dmZmZnh4eF8fHzc3NxlZWX19fV4eHj09PSAgICgoKCdnZ3p6elBQUH+/v7FxcUbGxvHx8cFBQUJCQmLi4sICAhJSUkuLi4gICDz8/NLS0tfX1/k5OS3t7c1NTXCwsLt7e2bm5sODg4DAwNPT0+2trYKCgoWFhaBgYEMDAze3t5+fn4BAQFkZGR3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkU+bVmyAAABG0lEQVRYhe3QRVODMRSF4VNKkQoQrFAoTnEtVtxa3F2Ku7v7L6cbZpKeVTfwMZN3kcUzN5PMBUxR5mhLDORi4+KtNrtDsYTEJMAqkmVLSQ0daSJdNmcGYMoULtmyLMh25+TmKZZfUFgE1ZzFnhLArdz1lJYB5eobFfZKoEpUy1ZT66ir9zYof0Zjk7m5xQfj1trW3qFKZ5dXiG7VbD2u3nDz9aE/3EIZ3QyU3r3ufyZ+0vbrptPpdDpdhPkDbAE/0cDgENnwCNHo2DjZxOQU2fQM0ezcPNnC4hLZ8grRanCNbH2DCJtbbH/U9s4u494+28HhEdnxySkPnp2zXQQvGa+u2W5u2e7uHxgfn9ieX17J3t4/ePDziy2SvgEaTT2KYJvk/gAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.3,1.0,3.590,1.0,1.0;4.size,1.3,2.16,3.414;4.rect,1.3,1.0,1.0,2.16,3.414;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.348,1.0;4.sync,10.6492349607;4.size,1.0,3.634,3.434;4.rect,1.0,1.0,1.0,3.634,3.434;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.610,3.418;4.size,1.2,3.610,3.418;4.copy,1.1,1.0,1.0,3.580,3.399,2.14,1.1,1.0,2.19;4.rect,1.1,2.31,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,1.5,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,1.3,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,1.3,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,1.6,2.15,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,1.0,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,2.19,2.28,3.190;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.209,2.20,3.209;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.399,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.3;4.blob,1.1,3620.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.212;4.blob,1.1,500.iVBORw0KGgoAAAANSUhEUgAAAAcAAAAgCAMAAADpJZJvAAAAvVBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRIfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUG3WEJAAAAdUlEQVQImZ3MRxaCQAAD0BkUQUFEEBQLKljoFuzt/sfymdzAbH5eFhHiF6kAoUjQaKqwpQG93YGG2YVWD9h9B7oDD/pDMArGcDLl5ywU/2S+WLJEMV2tN3CbpByynBZByVLt6P5Aj/WJ5Xyh19sdPp4vDu/PF2brB76CxRJcAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.3,1.0,3.618,1.0,1.0;4.size,1.3,2.16,3.434;4.rect,1.3,1.0,1.0,2.16,3.434;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.368,1.0;4.sync,10.6492349632;4.size,1.0,3.672,3.463;4.rect,1.0,1.0,1.0,3.672,3.463;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.650,3.456;4.size,1.2,3.650,3.456;4.size,1.0,3.672,3.463;4.rect,1.0,1.0,1.0,3.672,3.463;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,3.700,3.482;4.rect,1.0,1.0,1.0,3.700,3.482;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,1.0,3.600,3.418,2.14,1.1,1.0,2.38;4.rect,1.1,1.0,1.3,3.269,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,1.3,3.236,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.418,2.10,2.38;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.22,2.58,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,2.19,2.40,3.247;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.266,2.30,3.190;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.304,2.10,3.152;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.270,1.0;4.blob,1.1,928.iVBORw0KGgoAAAANSUhEUgAAAXwAAAATCAMAAACk7EbDAAABKVBMVEUAAAAsLBKVlT0yMhQHBwOTkzx3dzDU1FZKSh75+WVUVCIsEiyVPZUyFDJHRx1/fzQvLxOJiTcODgZiYihlZSlPTyDk5FwXFwkvEy+JN4kOBg4qKhGUlDwICAP9/WYbGwseHgyYmD4QEAcCAgGKijg7OxiQkDq8vEwLCwTs7F/v72EQEAZWViNxcS5TUyJ0dC8EBALp6V5eXibX11fb21iMjDk4OBcTEwhLSx709GMtLRKSkjt9fTOpqUSjo0JERByCgjUPDwb392RFRRwJCQQpKRGXlz0hIQ1kZCg8PBgBAQBubixZWSTCwk41NRaOjjkEBAH+/mf//2cUFAgaGgsFBQKRkTswMBN9fTLOzlN8fDJmZinW1lZwcC2srEXY2FeAgDRDQxvz82IXAbkvAAABSElEQVRYhe3XWU/CQBDA8SIVEBWkIF4o1iLiBRVF8UQURMUL7/v6/h9Ckz4s6Ww1MyZqdvf3wj9th50QHkDTFEVRfp2vw+8qvdP3xd32klAg6LoQ6gqDh7p7ekF9ikRB9cUMV8UTbADebS/5BAPuK/3JAfDU4NAwKE2LRmABI6nRn+wnMv9Y2gkD//0bNydAQVZmkrCXFLJTzmtuemYWOzs3D4sjX0BvJQd7oeiEvriUQ85apWVQPGlzhbCZBMqr2I+cWVvXQXFthMhnCG1ziz6biMPiqmzTDxFYdWeXPFtL1UHxGXsN8ikC209a5NmD2CEoD80j8ikCO87QZwt5WB5OTs/o54iq0WJ//UvnuP9CF+YlKC9X1ze4xWRwe8c627JRs+V7WJ6KD6j3lsLjE+vnF9zs6xsshab63vzrFeRlh7/5xaL8ax9Otx89S3SBfAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.640,3.266;4.blob,1.1,200.iVBORw0KGgoAAAANSUhEUgAAAAoAAAAmBAMAAAAPchfDAAAAJ1BMVEUAAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUsLCwICAgxMTEYGBiLwLvBAAAAKklEQVQImWNgYFQSYGBgYHYJAJHpDSByAgN1yEkIk7nKQSbjBHtoRgIBAG/xFdpFjGiuAAAAAElFTkSuQmCC;3.end,1.1;4.size,1.1,3.680,3.475;4.size,1.2,3.680,3.475;4.copy,1.1,1.0,1.0,3.640,3.456,2.14,1.1,1.0,2.19;4.rect,1.1,3.291,1.3,2.26,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,1.3,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,2.38,2.30,3.228;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.266,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.266,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.323,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.342,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.361,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.380,2.10,2.95;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.418,2.20,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.582,1.0;4.blob,1.1,884.iVBORw0KGgoAAAANSUhEUgAAAGIAAAAmCAMAAAAIsr5GAAABL1BMVEUAAAB3dzDU1FYyMhT9/WYbGwsIAwiQkDq8vEwHAweOOY6POo8KBAoEBALp6V5eXiYEAgSBNIGDNYNLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJUIlSZPpkFAgV9fTLOzlNWI1aYPpgCAQLW1lZwcC1nKmeCNYIJBAmSO5JCG0IyFDIBAAFKSh75+WVUVCIsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4ODgYeHgyYmD4QEAfs7F/v72EQEAZWViNxcS4HBwPX11fb21iMjDk4OBctLRKSkjtlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyL//2cICAMUFAgaGgt8fDKsrEXY2FeAgDRDQxvz82JubiwOfAXAAAABIklEQVRIie3Vx1ICQRSF4QsiScZAUKKCmAARRSSrAyZQzCQVA+r7P4MumA0903qYXlgW/+qrrqm+i7lVTTTu9xmMPAnJaOBJRBOmSW2ZzcpnemSxastmn3LolzQ9Q5qanXPa9Mvl9pC2hDS/wJOIvD4/R0IKBEMcCWlxiSfVwKUNR5YHB2oiiq6sDgtd2rV15TI1EW3E4sNClzaxqVymJqLkFiuxpbZ3GAkunt5lNO5flNnLMme5fJrRd4UiqkGlYJmZsX9wyIioWIAky8y9P1WpHiHyHJ+coiPOapDq5xfoCxdqXIKCu7qug4K7uUWFdnffBAXXandAwXUfUDUen6AJveozKLJEJGiE6wUVvb5BE6j/jsr78YmNwJOyI//3P9MX7BdKLCmtRQEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,1.1;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAAFcAAAASCAMAAAAZg7KBAAABXFBMVEUAAAAOBg4HAwcyFDJ8MnwJBAkgICD///8bGxthJ2FpK2ksLBKVlT0yMhQTExMNBQ2TPJMsEiwvLxOJiTcODgYiIiIFBQVeJl5xLnFtbSwjIyP39/crEiuZPpkSEiwsLG0CAgE3NxZ+fjOZmT54eDEIAwg0FTQBAQMCAgUAAAEBAQIWFjczM34+PpkxMXgFBQJBQRqGhjaVlTxiYigiIg6LOItMH0woKGIUFDIaGkE2NoY8PJUODiJkZCmXlz1NTR8LCwWBNIFZJFkICBQNDR8EBAopKWQ9PZcfH00FBQswMBODgzWRkTtZWSQcHAt/M38TEzA1NYM7O5EkJFkLCxwBAQB6ejF3dzCFNoVSIVIxMXowMHcoKBBwcC2SkjsCAQKVPZVBGkEQECgtLXA7O5IbGwsaCxodDB0LCxtDG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0oXst5AAABBElEQVQ4jWNgwAYYmbAKUwyYWVipaRwbOweUxclFnA5uHl6izOWDsvgFBIkzWEhYhLAiUXYxGFNcgjhz8QNuSTAlJQ0XkZFlpMA8OXkgoaCopKyCLqMqq0aKQeoaYKAJYmtp6+jqMegbGBoZm2CqNDUjxVxzXTCwYGDQsLSyNrdhYLC1s3fAptLRiRRznV3AwJWBwc3dwxMk4uXt4+uHRaW/OCnmIsIhIDAoOAQkFMobphyuiKEyIpIUcxHhwKBpEaUbrQ0WjYmNQ1cYn5BIirmIcACBpOQUqHgqusI02XRSzEUHGbgkMrOyKTEXJ8jJpYmxefmqtDC2IKuQFsYyFBVTagIAwOskf6qFHMoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.643,3.266;4.blob,1.1,504.iVBORw0KGgoAAAANSUhEUgAAACUAAACYCAMAAABUFNCaAAAAS1BMVEUAAAABAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQUqKioaGho0NDQREREvLy8sLCwGBgYICAgDAwMYGBgoKCgUFBQEBAQSEhIrKysJCQkZ9PbcAAAA6klEQVRYhe2Y2w7CIBBEi8VqtVa8VP3/L7UBEghMwSZ9GAzncXsSNjDZbNo0lcoCYqcRaauVmn3a6g6a43bdLSFAx3MtqPRSnkLrLOUQWJe4426IrBG0ca1WGZZLeT+C5ChjuZSnkuNSrkDW56830Acj7b0Qy75exnqY13umLWVeb2I7EWItNKO9mrXQjPZq1kIz2qv91hc/BKmt1joLbiKRBTeRyIKbSNnZJnihlAUnZmTBiRlZcGISnJiB1WKF9b4ItgGu/YPOYoX1vuqMZrdYYb2vdVb6F5e1XjqE74w16RB+tunrn61lvqRvEqkHgNmKAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.3,1.0,3.684,1.0,1.0;4.size,1.3,2.16,3.482;4.rect,1.3,1.0,1.0,2.16,3.482;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.416,1.0;4.sync,10.6492349696;4.size,1.0,3.712,3.499;4.rect,1.0,1.0,1.0,3.712,3.499;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.690,3.494;4.size,1.2,3.690,3.494;4.copy,1.1,1.0,1.0,3.670,3.475,2.14,1.1,1.0,2.19;4.rect,1.1,3.261,1.3,2.15,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,1.3,2.25,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,2.57,2.19,3.247;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.368,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.399,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.475,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.437,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.581,1.0;4.blob,1.1,1128.iVBORw0KGgoAAAANSUhEUgAAAG0AAAA5CAMAAAALOVWFAAABfVBMVEUAAAAMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygHAweOOY6POo8KBAqLizjBwU4EAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgJUIlSZPpkFAgUJCQTy8mJQUCBWI1aYPpgCAQKcnD+qqkVnKmeCNYIJBAmSO5JCG0IyFDIBAAF3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ0sLBJ9fTLOzlPW1lZwcC35+WVUVCIsEiyVPZVHRx1/fzRPTyAXFwkvEy+JN4kOBg4eHgyYmD4QEAfv72EQEAZWViNxcS4HBwPX11fb21iMjDk4OBeSkjtlZSliYiiUlDwpKRE8PBiJiTcBAQB0dC9TUyL//2cICAMUFAgaGgusrEXY2FeAgDRDQxvz82Jubiw/Sh02AAABi0lEQVRYhe3YV08CQRDA8VEsoGIXFLtYsGBHUBFFFBXsioIVG4q9d/3s8nIBuduN4w6Jifd/+mWT2325zU0OQI2otHQNR+RlZPJEXVa2liMAnY5SObl5wBbo8wsKKVVULO2spJLSMj2lDMZyYIu8ChNP1FVW8URddU0tR+TV1fOkkMhdgAZzI1tNzS2QJJEbAGBpbWOrvcMKSRK5AbE6u9jq7pFW4kpZvX39MqUuq21AJrV/md3BE3UOO0/EDQ4Ns0U7KcRyjrBFPSmAa3SMLepJAdzjHo6om5jkiTjv1DRH1M34/BxRNzvHk2K/vwHzxgVgi3pSWFyS9lUS9aSwvCLtqyR1UlD7R2lWA7K1tXWbTLGCIZS+PSu14duUrW1t78gEEAriFH9WG/+B8NN2w3tISXnM+wfY0w6PsJKKHJ9gv9P+6ClSIhnOIkiJdH6BlUCWyyukRLq+uUVKpLt7rBKKPjyiDnsKPyOVmNPoQp3mNmGV2Msr6jB4e8cqIe/HJ+40oVwBijfnD/YFsz+H3yTE2wgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,1.1;4.blob,1.1,440.iVBORw0KGgoAAAANSUhEUgAAACMAAAASCAMAAADmIZdjAAAAk1BMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgICANUVCKZmT4FBQIhIQ3+/mcsLBIHBwOOjjmPjzoKCgRWViOYmD59fTLOzlOBgTSDgzVnZyqCgjXW1lZwcC0JCQSSkjtCQhsBAQB+pDXjAAAAcUlEQVQokWNgoAlgZCKshomRoBJmFlaCatjYCSrh4OQiqIabh5egGj5+gkoEBIUIqhEWESWoRkwczpSQQGFJSklDeDKycjAJeQVFJWSWsgrUBlU1uDEc6hryyCxNLaiEtg4uR+jq6RN0qCizAUE1RAAAq2cGMHJt9TQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.304;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAABMAAACFCAMAAACOsTOgAAAAPFBMVEUAAAABAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUsLCwxMTEXFxcKCgoICAgSEhIrKysEBAQJCQkoKCgUFBTE+sHYAAAAjUlEQVRIie2T2QqAIBBFtSzb1///12rMZtKIoIUyz9NwRZTjlTECDwLODEIhIiuLZWJlqZl8OxtdTHCaZQLIVabWCgmAjy1XpbRdefZB9zihe5zQPX0F58AiLlSgoF5lDShoTx5Ge6+hvdc4bRx51P3fmLu2yjrVtZ5mpepac9XeQ7fyP8BzO+/8ARczAHYwBqImp6IrAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.3,1.0,3.696,1.0,1.0;4.size,1.3,2.16,3.499;4.rect,1.3,1.0,1.0,2.16,3.499;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.433,1.0;4.sync,10.6492349734;4.size,1.0,3.726,3.511;4.rect,1.0,1.0,1.0,3.726,3.511;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.710,3.494;4.size,1.2,3.710,3.494;4.size,1.0,3.862,3.511;4.rect,1.0,1.0,1.0,3.862,3.511;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,2.38,2.10,3.266;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,2.57,2.10,3.228;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.304,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.342,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.380,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.418,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.437,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.690,1.0;4.blob,1.1,488.iVBORw0KGgoAAAANSUhEUgAAABQAAAA5CAMAAAABZfvXAAAAolBMVEUAAAAIAwgHAweOOY6POo8KBAo3NzfBwcH39/fp6emTk5MMDAwEAgSBNIGDNYMnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4sEiyVPZUyFDIvEy+JN4kOBg6zHd5SAAAAh0lEQVQ4jWNgoCdgZMQUY2JmYQUz2Ng5OLm4IYI8vHxMIJpfQFBIWEQUVYeYuAQDg6SUNIqgjCyIlJNHFlOQUgRRSsooKlUgKlVRnKQGMVMdxUkaHJqSWtqCqE5i0NHlkNPTJ8a7gx0gogPBgkcHEgvhdyTWiHESZcDA0AiLqLGJKd1dMvQBANBUB8fYwVkqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.690,3.285;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAABQAAACYCAMAAADTJTmcAAAASFBMVEUAAAABAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQU0NDQREREGBgYICAgDAwMSEhIrKysEBAQJCQkoKCgUFBQqKioaGhovLy8sLCzJY9GfAAAAoklEQVRIie2V2w6DIAxAYVZxivMytv3/n5qUDWnog4k65uA8kZMAtrRViMwa5AWRRBaAlERWCqn3uTSUV4AmkFXDSNGmK6VmJJ86pbrwzNPBlKe4YXn2VA5YnuNBnxGlT36Ed+xUTjb2O5Haxj7suT0O0r21N6wMwMOuvI4zz89be8PKvNxJbXrSpW4ZVmzqtGuTPxlWqZC7Y4PM3RGDL/3AZ4lPDgCPYzd5AAAAAElFTkSuQmCC;3.end,1.1;4.size,1.1,3.840,3.494;4.size,1.2,3.840,3.494;4.rect,1.1,3.710,1.0,3.130,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,2.19,2.70,3.228;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,2.19,2.40,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,2.38,2.10,3.266;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,2.38,2.10,3.171;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,2.76,2.20,3.133;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,2.95,2.20,3.190;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.228,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.247,2.60,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.247,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.266,2.50,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.266,2.30,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.285,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.285,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.304,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.304,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.304,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.323,2.10,2.38;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.323,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.323,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.342,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.342,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.342,2.10,2.38;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.342,2.20,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.361,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.380,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.399,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.399,2.10,2.95;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.418,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.418,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.418,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.418,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.418,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.437,2.20,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.437,2.20,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.437,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.437,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.437,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.710,2.19;4.blob,1.1,372.iVBORw0KGgoAAAANSUhEUgAAAFoAAAATCAMAAAAnIeqUAAAAdVBMVEUAAAASLCwsbW0BAgIWNzczfn4+mZkxeHgCBQUaQUE2hoY8lZUoYmIOIiIpZGQ9l5cfTU0FCwsTMDA1g4M7kZEkWVkLHBwAAQEUMjIxenowd3cQKCgtcHA7kpIGDg4LGxsECwtf7Oxh7+8GEBADBwdX19dY29tgbvyhAAAAXElEQVQ4je3MNwKAIBAF0VURs5iziPH+R7SlsLDgd0w3zSOy2X7kuBjXYz4PEHAYxUmaIWTKRVFCYKKqbtoOZPfDyCcGwmleVpOclPptBmW1H6dBTu+6HwWibd+9D5kDLhSWe08AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.820,2.76;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAMAAACnUt2HAAAAzFBMVEUAAAAfTU0dSUkECwtKHh62SkobQ0M8lJQ8k5MkWVkJFhYEAgJbJSXSVVX/Z2fIUVEECQkaPz8xeno+mJgramoPJSUJBARsLCzfWlr4ZGSjQkI5FxcLHBwsbm4+mZkSKyunQ0P7ZWWBNDQTCAgDBwcYPDwxeHg9l5cpZWUHEBBQICDaWFjxYWGVPDwuExMLGxsmXV07kpI7kZEiVVUHEhICAQFUIiLLUlLGUFBcJSUmXl42hoYcREQDCAhDGxu7TEzzYmIJFxcBAgItEhI/Hhd7AAAAcUlEQVQYlWNgGFjAyMSMzGVhBZFs7BycXFARbh5ePn4wS0BQSFhEFMgQE5eQlJKG65GRlZNnYFBQVFKGC6moqqlraDIwaGnr6OpBhPQNDI2MTcBMUzNzPgtLEMvK2sYWYbmdvQOIcnRCdaIzhV4kBQAA+3II9TgncLYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.770,3.209;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAADIAAABMCAMAAAAYyRQyAAABTVBMVEUAAAAZGRk+Pj4CAgIGBgYPDw85OTknJyc3NzcgICABAAACAQGUPDz1Y2PlXFxpKiqQOjoYCgpaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARmKSlgJycvExPWVlb/Z2f7ZWUnEBAQBgYxMTEYGBhHRx1/fzQBAQCGhjZLSx4HBwOTkzwsLBIpKRGZmT6FhTZiYihlZSkeHgyYmD4QEAdkZCltbSyXlz0oKBAqKhGUlDwICANWViNxcS4KCgSVlTwrKxFraytjYygCAgGKijg7OxiMjDk4OBdBQRqIiDcvLxNTUyJ0dC8tLRKSkjt8fDJQUCGLizhAQBobGwsTEwhKSh4SEgc0NBV9fTMJCQRERByCgjU8PBiJiTcODgYhIQ1ubixZWSQUFAgaGgs1NRaOjjkEBAEFBQKRkTswMBOAgDRDQxteXiZmZimGR0KjAAABa0lEQVRIie2T11LCUBBAryUW7L1iFyJRFIyKRsUSK6DYsPde//9RXBOTkL33hnGGseQ8sDs7nEnycAj5TeTlaxQ4VgoFQSgqTv9k96SS0ixf7VuK5+viofwzQykrr6isSs/qGmPjKLV19Q2NTc0trW3GxlHavYR0dHZ1e00b91s+PqKn17ZxFKfkRnHJAX39ruIq/1T5C/j8MMSBAExpcIir+H0wgsMjIiyhMM8Ylcdgjk9EJmGZUqY5yswsjOjc/MIibOrSMttQV1Zhrq2LMSUKazzBVjY2JZjJLaJu78C6K+8xlXAIhpTaJyR28Hk7TLGMIyVoPx6fsJTTM9F+PI9cMJREHLteXtGNa/kGO9/e3VOVQBI9Pzw+UZXnF/z++kZ/MxfHaPmyyExay5eJNWk9XybWpLV82ViS1vPlYE5az5eDOWktXy5G0mi+GEbSaL4YRtJ4vhh60pR8MfSkKfli6EnT8sX40Um/AzR1NusngxJsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.710,3.285;4.blob,1.1,2184.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;3.end,1.1;4.move,1.3,1.0,3.846,1.0,1.0;4.size,1.3,2.16,3.511;4.rect,1.3,1.0,1.0,2.16,3.511;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.445,1.0;4.sync,10.6492349819;4.size,1.0,3.903,3.582;4.rect,1.0,1.0,1.0,3.903,3.582;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.880,3.570;4.size,1.2,3.880,3.570;4.copy,1.1,1.0,1.0,3.830,3.494,2.14,1.1,1.0,2.76;4.rect,1.1,3.282,1.3,2.35,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,1.3,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,1.5,2.14,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,1.5,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,1.6,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,1.0,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,2.22,2.14,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,2.41,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,2.24,2.14,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,2.24,2.35,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,2.31,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,2.19,2.10,3.361;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,2.41,2.34,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,2.41,2.44,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,2.41,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,2.38,2.30,2.95;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,2.82,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.133,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.171,2.19,3.209;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.171,2.10,3.209;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.850,3.190,2.10,3.171;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.850,3.380,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.418,2.20,3.152;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.418,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.494,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.850,3.513,2.20,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,1.0;4.blob,1.1,1332.iVBORw0KGgoAAAANSUhEUgAAA28AAAAmCAMAAABkrlP3AAABXFBMVEUAAAAAAQE2hoYeS0sMDAz19fVKSkp3d3fU1NQRKSk+mZk2hYWkpKSoqKgpZGQsbW09l5cQKChGRkb29vYODg4yMjL9/f0bGxsECgo8lZURKysra2soY2MDAwPm5uZjY2OQkJC8vLwaQUE3iIgTLy88lJSLi4vBwcEBAQEFBQUICAgCAgIEBATp6eleXl4yfHwhUFABAgI4i4saQEAtLS3+/v4fHx+UlJTl5eVpaWkYGBj///9UVFRLS0v09PQLCwsDBwceSkoHEhIVNDTQ0NB8fHxaWlri4uJ4eHinp6cgICBXV1fy8vIhISE0NDQRERFMTEywsLCpqamjo6NycnLZ2dlmZmZgYGAvLy/W1tb7+/sPDw8jIyP39/dFRUX8/Pw3NzcnJycQEBBkZGTk5OS3t7eVlZXCwsKKiopZWVns7OwGBgYsLCwJCQlQUFB9fX3Ozs6cnJyqqqpwcHAHNVPgAAACRElEQVR4nO3c6U8TQRjH8anKpSBCPSqiIiC0Il4IIqhFQORUwKNgxQtUvBX//8RmE4MvLPPszswu0/1+XsCEbn7Pk1/SpLyYKgUAAAAYyRw4KDrtzxl28uLYJV1NHqqrj7yJQEOjcURSTTYdPpKRnEy4m2EnL45dUtZkc0vURSQaG4wjkmryaOuxNsnJhLsZdvLi2CVlTbZnj0fdRO/EyVPGGQk1mTvdcaZTcDLhboadvDh2SVuTZ8+dj7iJQNcF44ikmuzuyfRezOlPJtzNsJMXxy5pa1L19e/xXP7voXApMBBq18uDV0I9/z9JNXn1mrp+Y0h/MuFuhp28OHZJW5Pq5vBItacGbtWN3q787hpTzeOBO5U/Bm+8gmTK3XvFMEtpNo21yYn7k0r1TmlPJtzNsJMXxy5pa7Ji+kG1x2Ye1s9m5+YXFotq6VHgsVLLwRtvRTJm9UmInXSb7s8mgZCePqv2yvOSUmvr4y9K/36eLAdvvJeC4PLGK4trAjVh7PWbvV7Ov31X+bn7eVJucyvcv3tAGrz/oH9m9/Ok3MftqBsBtevT5y8uYpeGv7qIBfz2bfG7i9gfP12kAr77teMidf23i1QAAAAAAAAAqHn+3PiXzrCTEn4GTdKkPtmfG//SGbY3lc6gSZrUJ/tz4186w/am0hk0SZPaZH9u/Etn2N5UOoMmaVKf7M+Nf+kM25tKZ9AkTeqT/bnxL51he1PpDJqkSW2yPzf+pTNsbyqdQZM0ybcoAAAAAAAAAAAAAABq0h8X2Cs+yAwemgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,2.41;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAiCAMAAABFhiY1AAABUFBMVEUAAAAMBQX1Y2NKHh6kQkKoRERGHBz2Y2MOBgYDAQHmXV1jKCgLBATsX1/vYWEQBgaLODjBTk4HAwPXV1fbWFgtEhL+Z2cfDQ3QVFR8MjJyLi7ZWFgYCgr8ZmY3Fha3SkqVPDxZJCQGAgIJBATyYmJQICCcPz+qRUUMDAX19WNKSh6kpEKoqERGRhz29mMODgYIAwgDAwHm5l1jYygLCwTs7F/v72EQEAYHAweOOY6POo8KBAqLizjBwU4HBwPX11fb21gEAgSBNIGDNYMtLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSQGBgKMjDn//2cICANUIlSZPpkFAgUJCQTy8mJQUCCQkDoEBAJWI1aYPpgCAQKcnD+qqkWsrEXY2FdnKmeCNYIPDwbz82JubiwJBAmSO5JCG0JUVCIBAQAyFDIBAAHaGkzMAAABZ0lEQVRYhe2W107DQBBFTTeQEHrvvTtAAqGXEHrvJRB6L///hmKzHmt2YCNrWQsp52WOrFnfp5GupkkhIzNLzo/ckZ3jZXpunm67rv+y+CfkFxQy9fmLAqrji0uYlZaV+1SnV1RWqY50Ul3jZXptnZfp9Q2NXsY3NX8LXJzC22vxt5oTLk7l7bW1d5gTLk7p7XV2KYtKk+a/0t3TK/V/0LEo4+jrl5ru6FiUYQYGDdsN46ctMcGgNaFjUYYZGh5hGgqPjrkNj4xPTJoCHYsyjqlpZjOzcyG36fML0Yhl0LEowyzGltxGkkDHooxjeUVquqNjUYZZXZObDh2LMsz6xqbUdOhYlHFsbUtNh45FGmYnvGvJ3v4BEgGHR8eEso5FGawxOzk9sz6cx+JIBFxcJghlHYsyWLPt6tqaN7caEgF395Q6OhZnsOZ8kOTh8QmJgOeXV0JTe8E9iL+9IxGQ+PgkNLUXSfsCdfE49khXJRgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.133;4.blob,1.1,712.iVBORw0KGgoAAAANSUhEUgAAACcAAAA5CAMAAACCocLsAAABDlBMVEUAAAAGAgIIAwMDAQHIUVH/Z2dgJycoEBA0FRUTCAggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/eBgTR5eTESEgcEAgJbJSXSVVVvby329mP19WOUlDwkJA8JBARsLCzfWlr4ZGSjQkI5FxcPDwZpaSrLy1L9/WawsEc+PhmnQ0P7ZWWBNDQuLhO3t0r//2dISB1QICDaWFjxYWGVPDwuExMMDAVkZCjIyFH7+2WoqEQbGwsCAQFUIiLLUlLGUFBcJSUtLRKbmz/z82Lx8WGNjTkeHgxDGxu7TEzzYmKcnD/g4Fpyci4ODgYtEhInJxAEBAINIA1n/2cLGwsIEwgOIg4CBQIOIw5k92SydoseAAAAwUlEQVRIiWNgGAWjgCzAyAQGzMgsbICFFQzYkFnYADsHGHAis0YK4OLmIVIdL1Hq+Lj5sQkLCKIJCAlDaBFRMbiYuIQkKwsOc6WkZWTlwCx5BUUlZRWcDlBVU9fQ1AIytHV0CcSjnr6BIQODkbGJqRkeVeYWllbWNkCGrZ09q4MjDlVOzi6ubu4wnoenFw513j6+fsh8fxzqAgIxxfCndgTAn9oRYOSldgQICg4hUl0oUerCgsOJUhcRSZSyUTBcAADUKBIQsBVBOwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.361;4.blob,1.1,796.iVBORw0KGgoAAAANSUhEUgAAADEAAACYCAMAAAB6UfEIAAAArlBMVEUAAAABAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQUqKioaGho0NDQREREvLy8HBwOTkzwsLBIsLCwGBgZiYihlZSkqKhGUlDwICAMCAgGKijg7OxhTUyJ0dC8bGwuYmD4TEwh9fTNKSh5ERByCgjUODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZikICAgDAwMYGBgoKCgUFBQEBAQSEhIrKysJCQltBINDAAABYUlEQVRYhe2Z527DMAyE5UZNV7r33nu6I23f/8VqyAICm4zIQzoUVfcrMPIlJ4OXoxFjsrISUjHhVOiJjnWa1BPdKadp3N1PqGBOW10LEDPWzravzVnbCxDz9LTdXptYWFwaEMvMx6yQ71hdQ4n1jU2Q2NreAQmzu4cS+weHIGGOjlHi5BQlzs4vQMJcXqHE9c0tSNzdP4hEK8mPT55gpr2sCT7JoWnnk1wy2a7e+cx4TU2dl0QJP00A8VpP01v1kq8UQpT1NPWNeXfoB+Cq79BPxJXyHANXWoJTI42eCHdtI42eCHdtI42eALoWn5L0NCZp1BJiagkh5oMQYj7GxBWgVIhUFOfd/RtCenwjxJCuDRBDujbkStLv/yZqnnBVrcsRuXUVinpKRiFG2pWVBL6VxulKVCpEKorz7uYNOfINWWxdQoitSwixdXNq/y+h/1vDE+JeTAhxL6au9MrEd+gLemEqVWS0IK0AAAAASUVORK5CYII=;3.end,1.1;4.move,1.3,1.0,3.887,1.0,1.0;4.size,1.3,2.16,3.582;4.rect,1.3,1.0,1.0,2.16,3.582;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.516,1.0;4.sync,10.6492349845;4.size,1.0,3.903,3.613;4.rect,1.0,1.0,1.0,3.903,3.613;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.880,3.608;4.size,1.2,3.880,3.608;4.copy,1.1,1.0,1.0,3.880,3.570,2.14,1.1,1.0,2.38;4.rect,1.1,3.621,2.22,1.7,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,1.7,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,2.22,2.37,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,2.22,1.7,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,2.22,1.7,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,2.22,2.17,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.1;4.blob,1.1,1756.iVBORw0KGgoAAAANSUhEUgAAA3AAAAAlCAMAAAA0n/s8AAABvFBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw93d3fU1NRERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUkyMjL9/f0bGxtSUlIMDAycnJy9vb2QkJC8vLyrq6uwsLBISEj///8XFxcAAQEEBATp6eleXl7q6up2dnYODg5WVlYkWVk8k5M4iYkaPz8jVlYGDg5LS0v09PQTExPo6Oh/f38WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwepqamjo6MnJydCQkLX19eVlZUZPT0XOjoLHBw0gIA+mZk9l5f39/dFRUUuLi4+Pj7T09OdnZ0JFxcECgpkZGTk5OQCAgIcHBze3t6IiIjCwsKKiooGBgb6+vplZWX5+flsbGz+/v4sLCzGxsYxMTF9fX3Ozs5+fn7b29sICAhvb2/m5ubW1tYaGho6OjrIyMhgYGDMzMyNjY2/v78BAQEoKCg0NDRQUFDl5eXNzc2FhYUpKSkUFBR6eno2hoYeS0tKSkoRKSk2hYVPT08sbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhKaQkpuAAADJElEQVR4nO3c91PUQBQH8FUUAUVPxYLdGBt2REVBQEVEwX5iBVEUG/Yu2Lti/4e9y3iX3CbDvrd7uTO57+cHeGQ2L293yAyD8hUCoEjGGXcYX5aHMQBKwoSJxi3KJ1XkYRCA2Kmskq9MnlJNWjemqdN0BwKIs6pK6UJi+gzSurHNrJmlOxFAfM2eM1e6Ulszj7ROYf4C3ZEA4mvhIvnK4iW0dQpLrWU68xSTjQpVqJUQy1esFJJVq+UrwesU6qw1xvMVtLLXrlu/IfV54yZUqMKo0t9l9Zvl3983WLXCz79OactWEaXvYrGtcfuOpuadLa1tqFCFUaXfil275fdkj9Ue8Pb41ynt7Uh9KP4uyaexr1OI/Qe6ujtRoQqlSqk4eEh+Tw5bR/wvT8A6paPHUh+Kv0vGaaTYx5OoUIVWneg5KSSnrIDf5wesUzp9JlMVe5f0CiBUZ8/5LvX2nSetU0n0X9CZCCC+qi8O+C9e6qCtUxiwLuuMBBBfg1cCLl69Rlvn13vdkXC+uDHE/ykUINZuBv0nrlt9t0nr/O5YjrvOF/cGjUYDKBX3HzzUu/HRY0dDun7ytC6fMwHEVtmzYeMeI0P8f0cAKE3PXxi3aK/PwxwAAAD/HUQsABRQNCMW7JevSBX1Dv4zTOaj4u+SDycp9SMFJrzuL2dO4HZ2IxYidJJvut7alIp6B/8ZJvNR8XfJh5OU+tECE9718P+I9F9nN2IhQifZ/L77A6Wi3sF/hsl8VPxd8uEkc/uxAxPIsp2zEQvROcnkx0+fvxAq6h38Z5jMR8XfJR9OUurHDkwgy3bORCxE6CS/NtqjTUl1Rb2D/wyT+aj4u+TDSeb24wcmULmdMxELETrJb9/Fj5+/1BX1Dv4zTOaj4u+SDyeZ208jMIHI09mJWIjSSbb9/iPEaIuyot7Bf4bJfFT8XfLhJKV+GoEJRJ7OTsRCJE8SIK90AhP4nZ2IBQDQCUzgd3YjFgBKmkZgAr8zIhYAHDqBCfzOiFgAcBADE6g8wQrezohYAHAQAxOoPMEK3s6IWAAIgzdYwYWIBYDCQcQCQAFFL2LhL3tmjzaPUbXtAAAAAElFTkSuQmCC;3.end,1.1;4.size,1.3,2.16,3.613;4.rect,1.3,1.0,1.0,2.16,3.613;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.547,1.0;4.sync,10.6492349863;4.size,1.0,3.914,3.626;4.rect,1.0,1.0,1.0,3.914,3.626;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,3.890,3.608;4.size,1.2,3.890,3.608;4.size,1.0,3.984,3.666;4.rect,1.0,1.0,1.0,3.984,3.666;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,2.19,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,2.38,2.10,3.380;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.513,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.551,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.880,1.0;4.blob,1.1,456.iVBORw0KGgoAAAANSUhEUgAAAAoAAAInCAMAAACWQThOAAAAflBMVEUAAAAAAQEkWVk8k5M4iYkaPz8jVlYGDg4WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcZPT0XOjoLHBw0gIA+mZk9l5cJFxcECgoBAQECAgIqKio+Pj4aGhovLy8NDQ0FBQUsLCwICAgxMTEXFxcKCgooKCgUFBQEBAQxh/orAAAAkklEQVRYhe3StxYCIRCF4THnuMZdUcz6/i8oIFBZWOw5G87/NdxiijuASL4aMTRb7Y45uz3pD4aj8WQ6my9kmYis1pttEqZ2+5wLAAAAAAAAwEuzLPXxoNQxxJM+h3iJswXGXyWvOpasAHPRlt3jppy7iQ/tVGiPqAwL+Q42Pr8dXuI+hvX+Z6DOyvBCtVP8l/sAM20amLMXQdoAAAAASUVORK5CYII=;3.end,1.1;4.size,1.1,3.960,3.665;4.size,1.2,3.960,3.665;4.copy,1.1,1.0,1.0,3.880,3.608,2.14,1.1,1.0,2.57;4.rect,1.1,1.0,1.7,3.600,2.41;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,1.1,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,1.3,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,1.0,3.250,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,2.22,1.6,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,2.41,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,2.45,2.17,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.418,1.8,2.55;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.930,2.76,2.30,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,2.95,2.30,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,2.95,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.114,2.20,3.342;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.133,2.50,3.323;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.456,2.30,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.456,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.475,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.930,3.475,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.475,2.10,3.190;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.513,2.30,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.513,2.10,3.152;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.532,2.10,3.133;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.551,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.551,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.589,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.589,2.10,2.76;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.608,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.608,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.930,3.608,2.10,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.600,1.1;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAGsAAAA3CAMAAAA8LUSyAAABsFBMVEUAAAB3d3fU1NQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl6Li4vBwcFLS0v09PQLCwstLS3+/v4fHx+pqamjo6PQ0NB8fHwPDw/39/dFRUVycnLZ2dlkZGTk5OQCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCwiVCI+mT4CBQJZWVns7OwGBgaMjIz///8ICAh9fX3Ozs4jViM+mD4BAgEJCQny8vJQUFDW1tZwcHAqZyo1gjXIyMhgYGCcnJyqqqqsrKzY2NgECQQ7kjsbQhsoKCg0NDQTExPz8/Nubm4UMhQAAQBUVFQBAQHPz894eDE8PBhHRx1/fzSioqKvr68VFRVJSUkeHgyYmD4QEAe9vb1WViNxcS5ISEgXFxcCAgGMjDk4OBdWVlYtLRKSkjsHBwPo6Oh/f39lZSliYijX19cJCQSUlDwpKRHT09OdnZ2JiTcBAQDe3t6IiIh0dC9TUyL5+flsbGwUFAgaGgsxMTFLSx58fDJvb2+AgDRDQxvMzMzl5eUpKSlCQkI7O9iGAAACVklEQVRYhe2Y51cTQRTFqYIImBCRYkQJvShKZwFp0jtK70XpKNIFBKRZKP+ysEsyc2ZeZt9mhg9wvF/ebPa+9zsnJ2fv2/j53Wv5B5haAoOC1bAC/M09D0KUoEIfhpmbHoVHqGBFPkaYbPYoBSjHk2iM7WmMAlZsXDzG9sz5XJ6V8ALne5kojXIlJeOMKanSrLT0DJwxMytblvXqNdaZ80YS9daZ6z7m5RcIrYVFxT5CSrTS61JW7vnkXUWlXotLddnYjqrqGgvz6SmRTsd1eV/ruVtXb9QGTVcj197UbIFFT2lpZW62tXcYh84uXR8sDAZETXF97GZuVvb0yk33Kkdf/y1NvgvKRD0q1ahvwKV03uAQOQ+PMDdHx6gLxK7gxdeQxrNGhhnTeNAEucDsCrAPYE1OfWJdTZ89R9SuAPsA1vQM1zirzbmPqF0B9vGs+YVFzhWhLd2ckLsC6ONZX74u863fVm4OyF0B9PGs1TWgdd2dWthdAfJxrI3NLaD1+7ZRsbsC6ONYQzu7QO+PPaNidwXQx7H2D4BW289D44DdFUAfyzqaOgZcudqJXqldQSjYx7JOf0G9v+3GV0LtCkLBPpb15y/kOiszKrUrCAX7oOchp5pzJa8nGNaFHbkUI1kiXcYqQf3XrYvkuO/JTyT+bZAc9z35kSyS4xLJj2SRHJdIfhyL5LhM8uNYJMdlkh/HIjkuk/woFslxqeRHsUiOSyU/ikVyXCr5MSyS43LJj2GRHBcmP/Wmb7YheGeRHBcmP/Wmb7YhYLJSKAv/F0izLOiK9Q/dI2h+Lxpt9QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.880,2.57;4.blob,1.1,528.iVBORw0KGgoAAAANSUhEUgAAAFAAAABMCAMAAADN28B/AAAAh1BMVEUAAAAAAQEkWVk8k5M4iYkaPz8jVlYGDg4WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcZPT0XOjoLHBw0gIA+mZk9l5cJFxcECgo2hoYeS0sRKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhIYDe4fAAAAvklEQVRYhe3XuQ7CMBCE4TV3ICGEQIK5whXu938+KGgiWfLAukLzNZ7W1a8VIfqFCbtMq93pvt9eP8ySQTQcxck4nWRhlkxzkdm8KPNA6/PvhQ26iOgrZrmCFmxdbAyyYMm2rJCFsrv94Qgs2CkydWz9C3a+yPV29y9U9niK1Kl3ERE1qGLgooqBiyYGLqoYuKhi4KKJgQtjQEQN6GUAZwG9DOAsoJcBmgX0MoCzgF4GcBbQywDNAnoZMAv03162gzAH6Y/iWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.456;4.blob,1.1,732.iVBORw0KGgoAAAANSUhEUgAAAEUAAACYCAMAAACF89TqAAAAS1BMVEUAAAABAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQUqKioaGho0NDQREREvLy8sLCwGBgYICAgDAwMYGBgSEhIrKysEBAQJCQkoKCgUFBQCDVjtAAABlUlEQVRoge2Z4VLCMBCEW4loFaUqoO//pDJpx4vt9nKXEAz19lenOT5ImFtuadOYTKaVqr3zavPqNs7rPkbh67YPXo8xirTu79SCkzrfU9Z1zj1NV5+d203v8XXdy/yktjtAYeu619mHb5o9oLB1RjHKGimhO8YooOP7YTV0R66O7/jQHXln6IGHnl/9Nr0nrTNdTJt3o6RTYiONiPLhm/GQSTn6ZjxlUqKqkEKeiK5IC6sjhTwRXQVvildHCnkiuiItrNZ0uqZQNX0zxSljf2RSPof++Mqj9EN/HPMo69uRQjOKNIvzFGkW5ylJGbumPhKKEjjK51LRnI3yuZjyk8BRPhdTKH+AjCM93VumYFfRUrCraCnYVWxHWOmUhQSupOAETrlbRsEJHDqD8FwogcPcbZNlSdX0q3ZFSnQ2E1Gis5mIEp3N/umOorIZsyRFKJsx10wJXSWdErpKOiV0FdsRVl2U1BnzF8VmzFtXTb9qZSePTAqcvtTPe9D0pX/eg3akf96j+PeSoSj+vWQoSTJKScpU3ziBIpsfe+SAAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.3,1.0,3.968,1.0,1.0;4.size,1.3,2.16,3.666;4.rect,1.3,1.0,1.0,2.16,3.666;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.600,1.0;4.sync,10.6492349960;4.size,1.0,4.1075,3.721;4.rect,1.0,1.0,1.0,4.1075,3.721;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1050,3.703;4.size,1.2,4.1050,3.703;4.copy,1.1,1.0,1.0,3.950,3.665,2.14,1.1,1.0,2.38;4.rect,1.1,3.602,1.0,3.448,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,2.22,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,2.19,3.408,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,2.38,3.100,2.57;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.960,2.95,2.90,3.608;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.117,1.7,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.665,2.10,2.38;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.611,2.20;4.blob,1.1,176.iVBORw0KGgoAAAANSUhEUgAAABwAAAASBAMAAAC6KaPXAAAAHlBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExNXEbp8AAAAH0lEQVQYlWNgGPpASElJGYlwDQ0NQyIqOjo6kQi8AAAQaQtu8+g8pwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.950,3.102;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAMAAABoz9s/AAAAh1BMVEUAAAAAAQEkWVk8k5M4iYkaPz8jVlYGDg4WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcZPT0XOjoLHBw0gIA+mZk9l5cJFxcECgo2hoYeS0sRKSk2hYUsbW0QKCg8lZURKysra2soY2MaQUETLy8yfHwhUFABAgI4i4saQEAeSkoHEhIYDe4fAAAAX0lEQVQoke2SNRKAMAAEL7gHd3f7//uACan4AtvcFlcuAIIXIoiSfK+iQtMN07Id6nrwAyCM4iTgrzTDz88Hkhdcy7jiVdl10jDL2q4fmI46mSyW0bxg3fbHvOMEJgpcui4EvWHlXSQAAAAASUVORK5CYII=;3.end,1.1;4.move,1.3,1.0,4.1059,1.0,1.0;4.size,1.3,2.16,3.721;4.rect,1.3,1.0,1.0,2.16,3.721;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.655,1.0;4.sync,10.6492349980;4.size,1.0,4.1088,3.731;4.rect,1.0,1.0,1.0,4.1088,3.731;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1070,3.722;4.size,1.2,4.1070,3.722;4.size,1.0,4.1097,3.739;4.rect,1.0,1.0,1.0,4.1097,3.739;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,1.0,4.1040,3.703,2.14,1.1,1.0,2.19;4.rect,1.1,4.1050,1.0,2.20,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1040,2.19,2.30,3.703;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,1.1;4.blob,1.1,2656.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;3.end,1.1;4.size,1.1,4.1080,3.722;4.size,1.2,4.1080,3.722;4.rect,1.1,4.1070,1.0,2.10,3.722;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1081,1.0,1.0;4.size,1.3,2.16,3.739;4.rect,1.3,1.0,1.0,2.16,3.739;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.673,1.0;4.sync,10.6492350057;4.size,1.0,4.1111,3.746;4.rect,1.0,1.0,1.0,4.1111,3.746;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1090,3.741;4.size,1.2,4.1090,3.741;4.copy,1.1,1.0,1.0,4.1070,3.722,2.14,1.1,1.0,2.19;4.rect,1.1,2.41,1.0,4.1049,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1070,2.19,2.20,3.722;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1095,1.0,1.0;4.size,1.3,2.16,3.746;4.rect,1.3,1.0,1.0,2.16,3.746;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.680,1.0;4.sync,10.6492350081;4.size,1.0,4.1113,3.748;4.rect,1.0,1.0,1.0,4.1113,3.748;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1097,1.0,1.0;4.size,1.3,2.16,3.748;4.rect,1.3,1.0,1.0,2.16,3.748;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.682,1.0;4.sync,10.6492350131;4.size,1.0,4.1114,3.750;4.rect,1.0,1.0,1.0,4.1114,3.750;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1098,1.0,1.0;4.size,1.3,2.16,3.750;4.rect,1.3,1.0,1.0,2.16,3.750;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.684,1.0;4.sync,10.6492350141;4.size,1.0,4.1119,3.750;4.rect,1.0,1.0,1.0,4.1119,3.750;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1100,3.741;4.size,1.2,4.1100,3.741;4.rect,1.1,4.1090,1.0,2.10,3.741;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1103,1.0,1.0;4.sync,10.6492350565;4.size,1.0,4.1130,3.761;4.rect,1.0,1.0,1.0,4.1130,3.761;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1110,3.760;4.size,1.2,4.1110,3.760;4.copy,1.1,1.0,1.0,4.1090,3.741,2.14,1.1,1.0,2.19;4.rect,1.1,4.1100,1.0,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1090,2.19,2.20,3.741;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,1.3;4.blob,1.1,1708.iVBORw0KGgoAAAANSUhEUgAAALEAAAAPCAMAAACcN97yAAACIlBMVEUAAABoaGj////o6OikpKTQ0NCLi4vT09OsrKzIyMgYGBg8PDwREREgICCIiIgODg4SEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eWZmZkTExNsbGz5+fkrKyu3t7f19fX7+/tLS0vk5OSYmJg0NDRAQECxsbFPT0/W1tbFxcUxMTEeHh6qqqrz8/Pu7u6enp4QEBBISEgzMzMtLS20tLTt7e3q6uqtra0mJiYLCwvs7Ozv7++np6c2NjY4ODhVVVX9/f2AgIBDQ0NcXFzY2Ni4uLh6enpERERUVFQ1NTW/v7/V1dXp6enGxsZRUVHU1NTf398HBwcVFRXS0tJjY2MFBQUICAgCAgJSUlLh4eEUFBS6urpMTEzi4uIPDw/X19fb29skJCSPj48iIiJdXV1eXl4NDQ1FRUU9PT3y8vJCQkIyMjLn5+dBQUEqKiolJSUBAQF/f390dHRQUFAJCQmurq729vZqamohISEaGhpWVlbr6+u9vb1NTU1+fn7a2tr6+voWFhZKSkr+/v6mpqZzc3OHh4dYWFihoaE5OTmvr6/Nzc2UlJTe3t6rq6scHBwDAwP39/cnJyeWlpZ8fHwKCgqXl5fg4OAMDAwbGxt3d3fR0dFhYWEEBARpaWl5eXlHR0f8/PwoKCgvLy+wsLCMjIwGBgaJiYl9fX22trZaWlqNjY3Ozs5XV1fw8PDAwMA3Nze5ubm7u7s6OjqQkJBubm65ZyAHAAACmElEQVRIiWNgoB1gZGJiYiZJBwsrEoeNnWIXcHCSpp6Lm5uFOBfDTEZxMQ8vadbhMZcEwEeBi7EBfn4GBgFBIRBTWARIiIqJS0hKgbjSMrJy8gqKyIqVmMAAyFIWBhIqTKpAG9TUNeQ1tRiQWQzaOrp6+gYkuBhhMgurIbs8pxEDSooyNjE1M7cAMy2trIEG24D8Z8tkx8Bg7+Do5OziCnYxk4SbuwcXsrme3F7e3NzcqC728fXz8A8IRGYFKQV7hDDL4XBxaBgYhGM3mUXPN8LDOzIMOUVFWUXH2LPGxoHYgfEJlgwM7kyJDAxJ3kB+sgpQLIVJCuziVMywgMUdsovTGBjSmTKQWWyZQI9mMWVjdzELJDw9sJvMksPDwKDKlIus15Apj4Eh38QTobogoJAhXKIIxCzm1AWaxgt2cQlRLgalu2SmCGSWRikwDEvKyrG7uEIFDHhwuBhkSiVTFbLeoOqaWn5U5XX1DLkNjUBGU3OLomcr1MVhRLuYFxRiCJYpJBTbsLsYW6pAczEXUzuK3sQO64boTmTl2g62Il0ghkk3kCgm7OKeSHwu7u0Dh2I/dhcTSBXYXMzAMKFTbeIkZPWuk01rQbScF5CYgtvFkgkQ2k1wKshnOFw8bfoMIHMmA3YXY08VMJOxuXjW7AnA7Mc0B1m9vWDOXBA9r3n+AjYHJllcLk5hKsx1jmJgyFvY4T6PGZeLg8xYU9LZGowh+d2Um3sRpkm4TEa4GKF38cQlik1d4olghUsh7lpWvRzMLVgRW7Zy1XRFXC4uWG0qEw90CUOEi+CatbhczJBovk53vRMDpEwFAg7CLoaZjHAxkt4NG62sN22GKNzSPJewaYMKcLgMtAtIBHG6WwfaCSSCuR4FDABL0IkJE39o2gAAAABJRU5ErkJggg==;3.end,1.1;4.move,1.3,1.0,4.1114,1.0,1.0;4.size,1.3,2.16,3.761;4.rect,1.3,1.0,1.0,2.16,3.761;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.695,1.0;4.sync,10.6492350592;4.size,1.0,4.1130,3.761;4.rect,1.0,1.0,1.0,4.1130,3.761;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.sync,10.6492350610;4.size,1.0,4.1139,3.771;4.rect,1.0,1.0,1.0,4.1139,3.771;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1120,3.760;4.size,1.2,4.1120,3.760;4.rect,1.1,4.1110,1.0,2.10,3.760;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1123,1.0,1.0;4.size,1.3,2.16,3.771;4.rect,1.3,1.0,1.0,2.16,3.771;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.705,1.0;4.sync,10.6492350665;4.size,1.0,4.1144,3.777;4.rect,1.0,1.0,1.0,4.1144,3.777;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1128,1.0,1.0;4.size,1.3,2.16,3.777;4.rect,1.3,1.0,1.0,2.16,3.777;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.711,1.0;4.sync,10.6492350694;4.size,1.0,4.1145,3.780;4.rect,1.0,1.0,1.0,4.1145,3.780;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1120,3.779;4.size,1.2,4.1120,3.779;4.size,1.0,4.1146,3.781;4.rect,1.0,1.0,1.0,4.1146,3.781;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,1.0,4.1120,3.760,2.14,1.1,1.0,2.19;4.rect,1.1,2.40,1.6,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,1.3,3.136,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,1.3;4.blob,1.1,504.iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAt1BMVEUAAAB3d3fU1NSkpKSvr68yMjL9/f0bGxuVlZWfn5+QkJC8vLxVVVVxcXEPDw+GhoaPj48JCQlkZGRNTU0EBATp6eleXl58fHzx8fH09PTX19fT09Ps7Oz6+vqHh4dLS0sLCwsDAwNDQ0P39/dMTEypqamjo6OioqK0tLTLy8uKiopFRUVnZ2cmJiY9PT3+/v7k5OQCAgJWVlaCgoKenp5RUVHCwsIhISEsLCx9fX3Ozs7W1tZwcHDQ4TovAAAAfElEQVQImWNgQAWMTAzogIkRTDGzwEVY2djBNAcnXIiLG0jw8PLxCwgKCYNFRETFgKS4hKSUtIysHFhIXlIBRCkqKUuqKED0qapBaHUNTS0Ii09ZG0zryOrq6auAmUIGhmDayJiBwcQUzDTTQnemub4FupClFYZnrG3AFAA35QhZnmKVJAAAAABJRU5ErkJggg==;3.end,1.1;4.size,1.1,4.1130,3.779;4.size,1.2,4.1130,3.779;4.size,1.0,4.1148,3.781;4.rect,1.0,1.0,1.0,4.1148,3.781;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,1.0,2.10,3.779;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1132,1.0,1.0;4.size,1.3,2.16,3.781;4.rect,1.3,1.0,1.0,2.16,3.781;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.715,1.0;4.sync,10.6492350763;4.size,1.0,4.1148,3.782;4.rect,1.0,1.0,1.0,4.1148,3.782;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.782;4.rect,1.3,1.0,1.0,2.16,3.782;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.716,1.0;4.sync,10.6492350776;4.size,1.0,4.1151,3.784;4.rect,1.0,1.0,1.0,4.1151,3.784;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,4.1158,3.784;4.rect,1.0,1.0,1.0,4.1158,3.784;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1140,3.779;4.size,1.2,4.1140,3.779;4.size,1.0,4.1158,3.789;4.rect,1.0,1.0,1.0,4.1158,3.789;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.rect,1.1,4.1130,1.0,2.10,3.779;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1142,1.0,1.0;4.size,1.3,2.16,3.789;4.rect,1.3,1.0,1.0,2.16,3.789;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.723,1.0;4.sync,10.6492350841;4.size,1.0,4.1159,3.790;4.rect,1.0,1.0,1.0,4.1159,3.790;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1143,1.0,1.0;4.size,1.3,2.16,3.790;4.rect,1.3,1.0,1.0,2.16,3.790;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.724,1.0;4.sync,10.6492350856;4.size,1.0,4.1170,3.800;4.rect,1.0,1.0,1.0,4.1170,3.800;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1150,3.798;4.size,1.2,4.1150,3.798;4.copy,1.1,1.0,1.0,4.1130,3.779,2.14,1.1,1.0,2.19;4.rect,1.1,2.62,1.3,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1140,1.0,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1130,2.19,2.20,3.779;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.70,1.2;4.blob,1.1,4008.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;3.end,1.1;4.move,1.3,1.0,4.1154,1.0,1.0;4.size,1.3,2.16,3.800;4.rect,1.3,1.0,1.0,2.16,3.800;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.734,1.0;4.sync,10.6492350945;4.size,1.0,4.1189,3.813;4.rect,1.0,1.0,1.0,4.1189,3.813;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1170,3.798;4.size,1.2,4.1170,3.798;4.rect,1.1,4.1150,1.0,2.20,3.798;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1173,1.0,1.0;4.size,1.3,2.16,3.813;4.rect,1.3,1.0,1.0,2.16,3.813;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.747,1.0;4.sync,10.6492350970;4.size,1.0,4.1195,3.816;4.rect,1.0,1.0,1.0,4.1195,3.816;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,4.1199,3.820;4.rect,1.0,1.0,1.0,4.1199,3.820;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1180,3.817;4.size,1.2,4.1180,3.817;4.copy,1.1,1.0,1.0,4.1160,3.798,2.14,1.1,1.0,2.19;4.rect,1.1,3.151,1.0,4.1029,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,2.19,2.20,3.798;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,1.2;4.blob,1.1,1208.iVBORw0KGgoAAAANSUhEUgAAAEQAAAARCAMAAABTjvrEAAABrVBMVEUAAACLi4vT09MREREgICCsrKzIyMikpKS4uLiKiorq6ur19fWtra0XFxdsbGz5+fkrKyu3t7f7+/tLS0toaGj////o6OgSEhL4+PhtbW3c3NyamppbW1vMzMz09PTl5eWZmZkTExPk5OQeHh6qqqrz8/Pu7u6enp4QEBCxsbFGRkZqamr29va9vb16enpERERUVFQYGBg8PDynp6c2NjY4ODhVVVX9/f2AgIBDQ0NcXFzY2Ng1NTW/v7/V1dUVFRXS0tJjY2Pe3t4GBgZlZWUxMTFeXl6IiIgkJCSPj48iIiI0NDQHBwddXV3y8vJCQkIyMjJiYmIJCQkBAQHf399/f38CAgJ0dHRQUFDW1taurq4ICAh+fn7a2tpBQUH6+voWFhZKSkr+/v6mpqZzc3Pt7e2Hh4evr6+0tLTNzc2rq6scHBwwMDCWlpZNTU18fHzb29uXl5fg4OAMDAwbGxuoqKhFRUVmZma7u7soKCjn5+cEBARpaWl5eXlHR0cUFBTQ0NAtLS3Pz8+Dg4Ps7Ozr6+uJiYl9fX3i4uK2trZaWlqNjY3X19fw8PDAwMCJwP5DAAABmElEQVQ4jc2R+TdCURDHJ5WXiiQ3WdJC1kRPiiyp7GSJsqQisq8h+5J9/5vd+x5OcfKLnGN+mPneO+d8ZgP4Q+OkpQDC5f2Q5KenoMI3CCXIEIrEmURmSbKlohwZQC5CSE5+8hT5JBQUYlekLFapNVhoEWMkUVKqKyuvwBBUWVWtr2EgSGWorTMCGGmaYiBQT2qaUAOA2dLYZG0W4GcL3dpG0zRWNm17nV0uxRCHE6ADdTKQrs8Gu1lILeoB6G3Dqq8fYMCFNPHjcAZxxSE0DJQSv7hohIG4v0JGxzzgVY0TOZGuw0Pw4iGTUz6fz62vZiEgMTAQ31cITPshEJzBYjY0J2uZT4SE2e0sfHRiTwIpsZgKF4lYWibdJEIcK/3EVoHyewHsaC0JBATr4Q0Spa3YbbIQ9Rab247sYL9LrrMX3S8+gHgIuU6Ypg+JNiuOjkk8CZ2ecSwom2gX8gSs5/g6wgtXlBOMAXV5da0X2xIgueysfKKdN7fsiu/u9Q+PERmjn8KS5xgWPeIX3WsTvC/2l/Z/IKmwN0wiQyMnmwqoAAAAAElFTkSuQmCC;3.end,1.1;4.move,1.3,1.0,4.1183,1.0,1.0;4.size,1.3,2.16,3.820;4.rect,1.3,1.0,1.0,2.16,3.820;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.754,1.0;4.sync,10.6492351047;4.size,1.0,4.1202,3.823;4.rect,1.0,1.0,1.0,4.1202,3.823;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1186,1.0,1.0;4.size,1.3,2.16,3.823;4.rect,1.3,1.0,1.0,2.16,3.823;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.757,1.0;4.sync,10.6492351058;4.size,1.0,4.1204,3.826;4.rect,1.0,1.0,1.0,4.1204,3.826;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1188,1.0,1.0;4.size,1.3,2.16,3.826;4.rect,1.3,1.0,1.0,2.16,3.826;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.760,1.0;4.sync,10.6492351109;4.size,1.0,4.1205,3.828;4.rect,1.0,1.0,1.0,4.1205,3.828;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1189,1.0,1.0;4.size,1.3,2.16,3.828;4.rect,1.3,1.0,1.0,2.16,3.828;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.762,1.0;4.sync,10.6492351160;4.size,1.0,4.1207,3.831;4.rect,1.0,1.0,1.0,4.1207,3.831;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1190,3.817;4.size,1.2,4.1190,3.817;4.rect,1.1,4.1180,1.0,2.10,3.817;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1191,1.0,1.0;4.size,1.3,2.16,3.831;4.rect,1.3,1.0,1.0,2.16,3.831;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.765,1.0;4.sync,10.6492351182;4.size,1.0,4.1209,3.834;4.rect,1.0,1.0,1.0,4.1209,3.834;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,4.1209,3.834;4.rect,1.0,1.0,1.0,4.1209,3.834;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1193,1.0,1.0;4.size,1.3,2.16,3.834;4.rect,1.3,1.0,1.0,2.16,3.834;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.768,1.0;4.sync,10.6492351251;4.size,1.0,4.1210,3.834;4.rect,1.0,1.0,1.0,4.1210,3.834;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1194,1.0,1.0;4.sync,10.6492351262;4.size,1.0,4.1210,3.835;4.rect,1.0,1.0,1.0,4.1210,3.835;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.835;4.rect,1.3,1.0,1.0,2.16,3.835;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.769,1.0;4.sync,10.6492351291;4.size,1.0,4.1211,3.836;4.rect,1.0,1.0,1.0,4.1211,3.836;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1190,3.836;4.size,1.2,4.1190,3.836;4.size,1.0,4.1211,3.837;4.rect,1.0,1.0,1.0,4.1211,3.837;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.copy,1.1,1.0,1.0,4.1190,3.817,2.14,1.1,1.0,2.19;4.rect,1.1,2.70,1.3,2.79,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1195,1.0,1.0;4.size,1.3,2.16,3.837;4.rect,1.3,1.0,1.0,2.16,3.837;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.771,1.0;4.sync,10.6492351348;4.size,1.0,4.1212,3.837;4.rect,1.0,1.0,1.0,4.1212,3.837;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1196,1.0,1.0;4.sync,10.6492351359;4.size,1.0,4.1212,3.838;4.rect,1.0,1.0,1.0,4.1212,3.838;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.0,4.1213,3.838;4.rect,1.0,1.0,1.0,4.1213,3.838;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1197,1.0,1.0;4.size,1.3,2.16,3.838;4.rect,1.3,1.0,1.0,2.16,3.838;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.772,1.0;4.sync,10.6492351441;4.size,1.0,4.1213,3.839;4.rect,1.0,1.0,1.0,4.1213,3.839;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.839;4.rect,1.3,1.0,1.0,2.16,3.839;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.773,1.0;4.sync,10.6492351474;4.size,1.0,4.1214,3.839;4.rect,1.0,1.0,1.0,4.1214,3.839;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1198,1.0,1.0;4.sync,10.6492351524;4.size,1.0,4.1214,3.840;4.rect,1.0,1.0,1.0,4.1214,3.840;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.840;4.rect,1.3,1.0,1.0,2.16,3.840;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.774,1.0;4.sync,10.6492351538;4.size,1.0,4.1215,3.840;4.rect,1.0,1.0,1.0,4.1215,3.840;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1199,1.0,1.0;4.sync,10.6492351592;4.size,1.0,4.1216,3.840;4.rect,1.0,1.0,1.0,4.1216,3.840;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.1,4.1200,3.836;4.size,1.2,4.1200,3.836;4.rect,1.1,4.1190,1.0,2.10,3.836;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.move,1.3,1.0,4.1200,1.0,1.0;4.sync,10.6492351636;4.size,1.0,4.1216,3.841;4.rect,1.0,1.0,1.0,4.1216,3.841;5.cfill,2.14,1.0,1.0,1.0,1.0,3.255;4.size,1.3,2.16,3.841;4.rect,1.3,1.0,1.0,2.16,3.841;5.cfill,2.12,1.3,3.128,3.128,3.128,2.64;4.move,1.4,1.3,1.2,3.775,1.0;4.sync,10.6492351760;4.sync,10.6492352760;4.rect,1.1,3.510,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.817;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492353272;4.rect,1.1,3.520,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.817;4.blob,1.1,364.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAeFBMVEUAAAA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg6Amy6GAAAAU0lEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEFCQgJs7AICEkCWJKSQMJGYioLJCQg6iVBzIVmBUFlZQ5weaqqDKLqamT5hYANq8DwnD854UAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492353363;4.rect,1.1,3.530,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.817;4.blob,1.1,348.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAbFBMVEUAAACkpKS4uLiKiorq6ur19fWtra0XFxf///+xsbFGRkZqamr29va9vb3e3t4GBgZlZWUxMTHMzMwRERFiYmL5+fl6enpjY2Pa2toCAgIwMDCoqKhFRUVmZmb09PS7u7vPz8+Dg4Ps7OwVFRVBALzTAAAAUklEQVQImWNgoBwwMjGzsLKxg5kcnFzcPLxgJh8/A4MAhyCIKQQkhDlEYEwGUTGEqDiIKSHJwCDOIQU2QVpGVk4ebIKCohIPmzIDXBsDbiYcAAD8fgNA4rJSBwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492353435;4.copy,1.1,1.0,2.19,4.1200,3.798,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.817,3.530,2.19,2.14,1.1,1.0,3.798;4.copy,1.1,3.540,3.817,3.660,2.19,2.14,1.1,3.540,3.798;4.rect,1.1,3.530,3.817,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.817,3.519,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492353706;4.rect,1.1,2.51,1.5,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,1.6,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,2.25,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.25,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,2.22,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,2.25,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,2.25,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,2.22,2.28,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,2.60,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,2.96,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,2.63,2.18,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.101,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,2.99,1.8,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.101,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,2.97,1.6,2.17;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,2.98,2.46,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,2.99,2.68,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,2.96,2.58,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.101,2.58,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,2.96,2.47,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.570,3.114,2.50,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.670,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.750,3.114,3.440,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,1.0,3.216,2.40,2.41;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.50,3.216,2.10,3.600;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.216,2.60,3.600;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.216,2.20,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.216,2.30,3.600;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.370,3.216,2.30,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.216,2.10,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.216,2.30,3.600;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.216,2.20,3.600;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.216,2.30,3.427;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.193,1.8,3.523;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.216,2.50,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.216,2.30,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.216,2.30,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.216,2.10,3.597;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.216,3.160,2.60;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.216,2.20,2.60;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.216,2.30,2.60;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.231,1.7,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.250,2.17,2.26;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.269,2.30,3.567;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.394,3.137,3.365;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.402,2.18,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.450,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.539,2.10,3.220;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.460,2.18,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.535,2.10,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.513,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.573,2.18,3.105;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.592,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.592,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.627,2.56,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.654,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.668,1.9,3.145;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.672,2.18,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.717,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.710,2.48,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.725,2.35,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.3;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6428.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;3.end,1.1;4.sync,10.6492353937;4.sync,10.6492354937;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.570,3.114,2.50,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.670,3.114,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,3.750,3.114,3.440,2.19;5.cfill,2.14,1.1,3.153,3.153,2.62,3.255;4.rect,1.1,4.1190,3.817,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.3;4.blob,1.1,8064.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;4.blob,1.1,3168.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,2.39;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,4292.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.3yVSKe76JMNsakXVLUZjt8PxZG9vt92+TaUSIcjzg4MDfj9baiPJe+x2K0mupNM9S0vHPR7+Ru85Sp/ZuVMlFrM//2TPHvaHh0+e3Iy0MiJ3FAAATqVyLBxOZU8Rmo5GAQBOihL6blUqu6Wi8vyFHvGRikTJdJqrG6PpN8bGhJPKUYxm4SJYnqqKtyvGsKe6uhAE+c6pU3He4JW7rkC9kffeXjgKHP9mRwfNMM+eOcOlho0q1RcdDoNMthiP/25hYU0VjVjcbbe3ajTpTKbf5/vZxATbIXKR6O937fpfHs+vecfw/fC664aDwVdHR0HOEbZJrf56W9s7U1P7amvn4vEPZ2fvsdtphnlxZIR188HGRgWOz8Ri1+v1Ygwb9PtfHxsLZ89++ZsdO0xy+ZqW/+HMmbHsMUq1cvldNpudophMZiwUOu7xlPB5V578aToa5a/bEiGInaK4FU5MJhOlaQCACEVlItF11dVOpfJ5l2tzChDka+3tH8zOvjczI8Uwb/YMZ71U+nhHhzsUOjo0pCKIbru9WiL5cbbx3KVHh4ZEKHrIYiEJgo33FU3uKAAAFDjOfYwtJPlIczP7ptDCSmW3VFSev9AjPqd9vg6t9l6H4+3JSXYE+mTdkCMExWgWLoLlqap4u+lMJkLTKIKsObY2d12BeiPvvb1AJBj2WFsbhiDPDgxwyVOVRPJfW1snIpGjg4MUjnfb7fwqJI4/0dkZS6VeGhmRikR3Wq1KgnjO5QIAxFKpvuXlnTodlz9ZSbJaKn1hZIT9b94RlkDRV0dHH2ho2GcyvTA8fNBqPWixcGlii1qdYpgXhod1Umm33f5QY+OPzp5li14aGRFj2C6d7nqDgXvzfDYrUOD44+3tU9HoS8PDOIbdUVf3jfb27/X28idxtpL868f5HLBaxRj2/rqjof/79deLMQwAcMzjOZudPSqc4x7P+vvUIas1sLp6xOViD4sOrq4+1tbWoFKxMchdOhmJAACiqRSOYWNbcvznVrI+CigA7J3gppqaex2OE17vHXV1GCL4lytLZbdUVJ6/0CM+nywsaMTiAxbLboOhf3n5g9nZrVlpW4xm4SJYnqqKt5timO9ebMF17rpb0xsbjbC5wVH00ZYWNUE809/PPx54v8m0kk7/eGAgyTAAgEQ6zaZuLLeZzRKR6Mm+PnbuZ3ll5Rvt7XUKxVQ0CgD4eH7+621tOqmUXXvUpdPNxePcxyHvCPurmZnA6updNlu/zzcYCNgo6kaDgSv1raz889BQKpMZCgTSmcx927aZFQp2Wo79t16pBJnM+pYtJCnH8X8bH5+Lx9mL73U49FIpq2fr2cSy9k6t9naz+fXR0eC61Wf/cObMj86ePTk3d5fN1qnVblZE79LS+jdbNZqepSUm+yfCYCAQpek2jaaQ0gpmoyjgKHp/ff0hq/WIy/XL6ekt01Mqu6Wi8vyFHvF5Z2rq73p6Ppyba1Cpnujs/JP6enRLssliNAsXwfJUJZzd3HWF7o0cI2wOEAAebGx0KpXPuVxrVp1bSdLl97PJEwAglH1GxtKm0ZwLBBKpFI6iOIqOh8M0w9gpii0dDgSWV1a6dDrWxI7q6t9ufp14JjtAM5kMP9WIpVLc00x29K9TKAppcCoSidL0l53Odq1WgmGLicQRl6tUyRMofP7JQpIPNTW9u8H2BGzOOBwMaiWSAxZLf9Hrx3EUFWNY+MJ4B5NJds4zd2kFs1EUGAB26fUT4fAPT59mP3vIutlpISiV3VJRef5Cj9azmEi8OTFx3OPZbzLdbbPNx+PvnT8vmF4AitMsXATLU5VwdnPXFbo3co+wOaiRyfRSKYogDUrldPY5F4uSIEY3fvxCEUSNTHZk927+m+rsqqYMAL9dWNip0/3C661XqUgcX7986rIQT6VSmQxFEIVcHKHpZ/r7v1BX90BDgxjD3MHg215vCbdjKCh/0kokh1ta+ny+tzwe/vsUQbSq1Wf9/mh2znAmFrPypukuGZphkgyzpk9VBDFM03lLK5WNogAAiNJ0jKafPXOG/UziKEqgaFT43iiV3VJRef5CjzgwBDlgsZwLBNyhEACAyWTenZ7eUVXVqdUKnT8VEwXhIlieqoSzm7uuoL2R496elxTDPD80tFOnu9tuHw+HPbzJmFDOOYVEKjUSDK6ZDOPPSvx2fv6AxWIlyeuqqwf8/ogw4ZOJRCIEWTMbkoPFROLFkREUQawkebvZ/Bft7T/o7S3VEvL8z++kItHh1taZWOzlkZE1ybYEw/60oaGd98CuVia7XNvNDfr911ZXc5PnLWq1AsddgUAhpSwxmpaLNrfAq2zJEQUAwHg4rJFIuN5oUKkAAFuQlZfKbqmoPH+hRxzpTKZLpztktXKP6xAAJCIRnX38IRwFapZgGPvF+0uoWzGqciOcZuFazn1vz8viysqg3//a6OhiIvHVpiYZb8jzhMOtGg2e3XxSduFoOBQIWBSK+XjcG4mwr1Ayyd8ayr+6OhQI3KDXX1Nd/fHFHt5d8ggrxTDuU7a9qgoAMHXhzNlGfM5s/psdO1AEYTKZiXD4FbcbR1GHUnkJGi4LefbPRBHkcGtrtURyzOMhCUIjkbCvJMMkGSaWStXIZHuNxtV0WiYS3Ww07tLrXxsdLTwZtJFkq0bzztQUs24idCYWu81sdlBUlKadSuV99fWjodAJr7eQUhYZju82GAAACII4KSqUTCaFvxUKQe4oAAAWE4lba2ttFJVIpRwU9SWHYzwcfm+TixAvgVLZLRWV5y/0iM9cPH672WwhySTD6KXSu+12G0m+Njoq9BbkhWgWY9jTXV23mky/mZvjp3TCRbA8VZVKs0At572354bbPzOdybiDwX0mk0ku/yy7nngukdhvMm1TKiM0bSfJLzkcUpGI2z9zMhLZZzJdW12dZBiSIPYajV9taupfXubPM6UymUNWazKdfn1sbH1ud9ERtloq3aXX/2pmZiWd3ldbez4Wc4dC25RKK0n+amYGALC9qqpBpTLIZIl0ukmtvtfhGA2F/uPCKd5tSmW9UvnO1NQai6vpNPsJXUmndVLpQatVLRa/NTkZK9H37/LkTyqx+MtOJ4FhO3W6Gw0G7jUdjc7G4wCAwUBAjGF7ampuMBjEItH/Mza2qc0zc+RPUZoeCQbbtdpbTaYGleq0z/eq280tOstdyjITi0kwbI/ReKPBUCuXDwYCAs1ACk3eKCRSqXPZ3mhUq8/6/T9d1xtCUCq7paLy/IUe8fGtrAwFAg0q1V6j8Zrq6ihNv+J2u4X/Am8hmhEE2aXX0wzz4dwcf+mMcBEsT1Wl0ixQy3nv7bnh7z8eoenQ6urnzObVdJqd3EqkUuPh8I6qqltqa2vk8l9OT3dotVz+lGSY/uVli0Jxs9HYpdMhCPKq2+25cC32UiJxS23tbxcWhi58tsNy0RG2kPwpk8l4IpG7bbYOrXYwEHjZ7V6TLG6UP4Vp+lwg0KxW38z7hJ6/Yjerg0AgEAgEAimIBxsb/+qaa0qt4vJQpsfyQSAQCAQCgZQtMH+CQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIJCrg/xHY2II8vm6upsMBgVBLMTjP5+c3GiHpz+tr7/BYHimv/+K3r/4CsVCkt12u40kV9Pp0z7fmxMTK+l08c3mjb5AdsuWyvMXesTHrFActFicFIWhqMvvP+7xCL15JksxmoWLYHmqEs5u7rrl2TKkhOTZPxMAcH99/fV6/YmpqZNzcxRB3GmzjYVC6+8pTqXyS04nAgC3PVfJebi5eb/J9NHmT42+4tCIxd/evn0pkTjm8YyHQnuNRqdSeWqT51BelNzRF85ueVJ5/kKP+NTK5d/q7Awnk29NTrr8/natdr/J9NnSktCDWTGahYtgeaoqlebybLl4rp5RUgjyHF6jk0pvMBheGB5mD4Ue9PvNCsVeo3E4GORfhiLIHzudnnDYTlECioVswM1GYzKdPjo4yO5pG02lHm1pMcrls8VtzJo3+gLZLVsqz1/oEZ/bTKYkwxxxudi654LBp7q6Dlosr7jdZatZuAiWp6rLYpc9om5NWpy7rnC9UXmfwauHPPmTGMM+XVwcyY6XGQDm43Fy3ZHOt9bWynH8ZxMTX2tr25T5W4zGbofjyd7ebrt9m0olQpDnBwcH/H621EaS99jtVpJcSad7lpaOezyrvN/4HKXP7NypEovZn3+yZw/7w8MnT25K2xWEU6kcC4e5wwSmo1EAgJOiivwE5o2+QHbLlsrzF3rERyoSJdNprm6Mpt8YGxNOKkcxmoWLYHmqKt6uGMOe6upCEOQ7p07Feeem5a4rXG8U0/KDjY0SDPt4fv4um00rkUxHo2+MjU3zzuLViMXddnurRpPOZPp9vp9NTHAu5x4l87ZcK5ffZbPZKYrJZMZCoeMeT+Hn3lYMefKn6Wj0heHh31+NIHaK+vTCqUW1WHzAYnnZ7b60WW4Rgnytvf2D2dn3ZmakGObNRkgvlT7e0eEOhY4ODakIottur5ZIfuxyFVJ6dGhIhKKHLBaSIF4dHb0EVVcWChznPmwWknykuZl9s8hm80ZfILtlS+X5Cz3ic9rn69Bq73U43p6cZO9mnywsCCeVoxjNwkWwPFUVbzedyURoGkUQ/hF1eesK1xtF9pWdokgc//nkJALAQav1z5ub/7anJ8UwAAASx5/o7IylUi+NjEhFojutViVBPFfwKJmjZQWOP97ePhWNvjQ8jGPYHXV132hv/15vb6JE5/iWijz50xoOWK1iDHv/wkOnv+x0joZCvUtLl/zw7rjHs/4+dchqDayuHnG52KOFg6urj7W1NahU7HRI7tLJSAQAEE2lcAwbE/74z5KDAsDeCW6qqbnX4Tjh9d5RV4ch+b8cAABAABChF2xDz2Qya+4sLOujX4zdK5HK8xd6xOeThQWNWHzAYtltMPQvL38wO7s1X4UpRrNwESxPVcXbTTHMd3t6NltXuN4ovq/+aWCATfcT6fTX29psJDkaCgEAbjObJSLRk3194WQSALC8svKN9vY6hWIqGgWFjZIbtWwhSTmO/9v4+Fw8DgCYjkbvdTj0UunkhccPVzybyJ86tdrbzeYXh4eDvOXh7RpNi1r9dxf7dSyc3qWl9W+2ajTvz8ww2YF8MBCI0nSbRsNmSLlLr0JwFL2/vr5dqz3ico0Eg3fU1RVYsU2jebS1lf/OmeXl5wcH11x20egXY/cKpfL8hR7xeWdqqmdp6aaami6dbqdO99H8/Gujo8zF/py4vBSjWbgIlqcq4ezmrlueLYeSSe7Jz1IiAXhzV20azblAIJFK4SgKABgPh2mGsVPUFO8x3KW1PBWJRGn6y07n+zMz7mBwMZE4kp3WuqooNH+ykORDTU3vTk/zH9/gKPplp/Pd6elQMomjKJsyYwgiQpBUcXccHEXFGMZmzRzBZJKNX+7SqxAGgF16/UQ4/MPTp9n8Blk3O70Ro+HwU319/Hfi6+ZgLxr9Iu1eiVSev9Cj9SwmEm9OTBz3ePabTHfbbPPx+HvnzwumF4DiNAsXwfJUJZzd3HXLs+U1sHW4mSuKIGpksiO7d/OvUWfXPBXTcoSmn+nv/0Jd3QMNDWIMcweDb3u9V+G+RQXlT1qJ5HBLS5/P95bHw3//uupqrURywGI5YLFwb36zo+N8LPaD3t5iZNEMk2QYiiD4b6oIYpim85ZehURpOkbTz545w37qcBQlUDRaWG8kUilvzknXjaJfpN0rkcrzF3rEgSHIAYvlXCDgDoUAAEwm8+709I6qqk6tVuj8qZgoCBfB8lQlnN3cdcuz5dwkUqmRYPCX09P8N9fMO1wyi4nEiyMjKIJYSfJ2s/kv2tt/0Nt7tS0hR/NeIRWJDre2zsRiL4+MrEmJB/z+Z/r7uRf7Ld9X3G7+ouNLZtDvv7a6Gs0+Bm5RqxU47goECillidG0XLS5BV5XKOPhsEYi4XqjQaUCAFyWvwZyRF9Qu+VJ5fkLPeJIZzJdOt0hq5X7IxsBQCIS0QwjlNYsBWqWYBj7xftLqFsxqnIjnOaSt3wJDAUCFoViPh73RiLsK5RMrtmd8dJGyc+ZzX+zYweKIEwmMxEOv+J24yjqUCqL13xlkWf/TBRBDre2VkskxzwekiA0Egn7SjIM+wqsrnIvHEV3Gwy/nJ4u8PEqAMBGkq0azTtTU+tXGMzEYreZzQ6KitK0U6m8r75+NBQ64fUWUsoiw/HdBgMAAEEQJ0WFksmk8LfCkrCYSNxaW2ujqEQq5aCoLzkc4+Hwexcu878EckdfOLtlS+X5Cz3iMxeP3242W0gyyTB6qfRuu91Gkq+Njgq9BXkhmsUY9nRX160m02/m5vgpnXARLE9VpdJc2pY3YntVFUUQJ+fm2P/KRKJ9tbW9S0vssu7JSGSfyXRtdXWSYUiC2Gs0frWpqX95OcKb3NpolMzd8mo6zX5SVtJpnVR60GpVi8VvTU7GrrLv3+XJn1Ri8ZedTgLDdup0NxoM3Gs6Gp2Nx9dcrBaLdxsMm9p/PEf+FKXpkWCwXau91WRqUKlO+3yvut3csqrcpSwzsZgEw/YYjTcaDLVy+WAgELmSH0zkIJFKncv2RqNafdbv/+m63rgE8kZfILtlS+X5Cz3i41tZGQoEGlSqvUbjNdXVUZp+xe12C/8F3kI0IwiyS6+nGebDuTn+4hjhIlieqkqlubQtb0TuLCfJMP3LyxaF4majsUunQxDkVbfbc+FqjY1Gydwth2n6XCDQrFbfzPuknL9iN42DQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAikZ+Q95xhDk83V1NxkMCoJYiMd/Pjl5ZnmZf8F927bdVFPDf+c5l2vQ77/MSq9u8kbBQpLddruNJFfT6dM+35sTE9zR6GJ+kgAAIABJREFUj4JSKrulovL8hR7xMSsUBy0WJ0VhKOry+497PEJvnslSjGbhIlieqoSzm7uuoL2BIkibRrOnpuYnQ0OVus9zITzY2Fgrlxd5/tuWkWf/TADA/fX11+v1J6amTs7NUQRxp802Fgrx7yk3GY2+ROJlt/u3Cwvsazoa3YJDD/LycHPzfpPpo/n5Ugu5DOSOgkYs/vb27UuJxDGPZzwU2ms0OpXKUxee9SsEpbJbKirPX+gRn1q5/FudneFk8q3JSZff367V7jeZPltaEnrgL0azcBEsT1Wl0ixcyySOf85sfrCh4aaaGp1U+svp6Sv6AG+OSxt/1+zbWebkOfhGJ5XeYDC8MDz86eIiAGDQ7zcrFHuNxuFgkLtGRRDDweCY8Lv0XrXkjcLNRmMynT46OMjuWhtNpR5taTHK5bMCbwhbKrulovL8hR7xuc1kSjLMEZeLrXsuGHyqq+ugxcKe7FmemoWLYHmquix22SPq1qTFuesK1xttGs0uvf7DuTkUQQ5aLJerKyBbQJ78SYxhny4ujmTH6QwA8/E4ieP8a1QEEVxdBQAgAGw2bb7FaOx2OJ7s7e2227epVCIEeX5wcCD77M9GkvfY7VaSXEmne5aWjns8q7zf+Bylz+zcqRKL2Z9/smcP+8PDJ09uUl25kDcKTqVyLBzmtvyfjkYBAE6KEvpuVSq7paLy/IUe8ZGKRMl0mqsbo+k3xsaEk8pRjGbhIlieqoq3K8awp7q6EAT5zqlTcd55bbnrCtcbp32+3y0sZABgz6HbFI+2tFhI8vu9vVGaBgA0qlRfb28/NjHxH+fPsxdoxOJuu71Vo0lnMv0+388mJjiXH2xslGDYx/Pzd9lsWolkOhp9Y2yM1XanzWYjyR+dPQsA+Iv29r7l5V/PzEgw7J9uvPHpvr7JSAQAsFOn22cyGaTSRDo9sLx8fHIylj0eLe/4a5DJuu32eqUyA0C/z/emxxNOJvl+tWg03TZblVQ6E4u9MTrqLfhE3S0mT/40HY2+MDz8+6sRxE5Rn/ImLVEEIQnier3+gMUiFYkmwuHXR0c3dQ6OCEG+1t7+wezsezMzUgzjekovlT7e0eEOhY4ODakIottur5ZIfuxyFVJ6;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,6384.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;3.end,1.1;4.sync,10.6492355193;4.rect,1.1,1.0,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.50,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.100,3.114,2.60,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.180,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.220,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.300,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.370,3.114,2.40,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.440,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.460,3.114,2.20,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.520,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.570,3.114,2.50,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.670,3.114,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.750,3.114,3.440,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,1.3;4.blob,1.1,5908.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,2.39;4.blob,1.1,7968.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.114;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,8064.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;4.blob,1.1,4728.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;3.end,1.1;4.sync,10.6492355765;4.copy,1.1,1.0,2.19,4.1200,3.798,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.817,4.1190,2.19,2.14,1.1,1.0,3.798;4.rect,1.1,3.491,3.820,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.511,3.820,3.238,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.817;4.blob,1.1,3340.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;3.end,1.1;4.sync,10.6492356415;4.rect,1.1,3.510,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.817;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAilBMVEUAAABbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///9QUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc23t7e/v798fHxpaWl5eXlHR0eLi4srKysBAQF9fX3i4uL29va2trZaWlrg4OCpNyr0AAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+BgYBQSGwsLCIqJCQkBiQJS4hKSUtA2bKyoFkwEx5BSChCGYqSSirqHIIqQGZ6hqaWto6ulIkuQUAk+sFH571tOQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492357139;4.rect,1.1,3.520,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.817;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492357243;4.rect,1.1,3.530,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.817;4.blob,1.1,384.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAh1BMVEUAAAAoKCi0tLTz8/Px8fGioqIYGBgTExPr6+vKyspOTk5ZWVnX19fR0dEHBweGhobw8PAPDw8nJyf///9PT0/CwsKqqqofHx8MDAzc3NyWlpbv7+8ODg4dHR1NTU0UFBTq6urHx8dMTExWVlbS0tLQ0NAICAgeHh62trb09PTn5+ebm5sVFRW5fAOMAAAAUklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiFhESBTVAwkJy4BJCSl4LogomDALy3DwCArLQdkyisoKimrqKqBhNU1NLW0dUhzCwBHeAQ0bFu2UwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492357549;4.rect,1.1,3.540,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.530,3.817;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492357659;4.rect,1.1,3.550,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.540,3.817;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492357791;4.rect,1.1,3.630,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.550,3.817;4.blob,1.1,980.iVBORw0KGgoAAAANSUhEUgAAAEUAAAATCAMAAADxhDDxAAABWVBMVEUAAACLi4vT09MREREgICBGRkbR0dH5+fnV1dVtbW3///84ODiYmJjc3Nw0NDRAQEBbW1vMzMz09PTl5eWZmZkTExNsbGwrKyu3t7f19fX7+/tLS0toaGjo6OhERESDg4Pz8/PJyclgYGDr6+vj4+NBQUElJSXGxsZfX19VVVX9/f2AgIBDQ0NcXFzY2Ni4uLh6enpUVFQYGBg8PDykpKSNjY1aWlr8/PzQ0NBHR0fIyMjCwsLu7u4NDQ0iIiIHBwddXV1eXl6IiIgcHBzh4eGBgYF+fn7Ly8umpqZQUFAJCQng4OB8fHzk5OTi4uKQkJBKSkr+/v41NTVzc3MICAilpaWUlJS0tLTNzc2Tk5Pt7e0LCwtJSUn4+PgKCgq/v78hISH39/fm5uYqKiqhoaFpaWl5eXkoKCjS0tL6+vrU1NRSUlLOzs5XV1cBAQF9fX329va2trasrKwBEZ9gAAABQUlEQVQ4jWNgGNGAkYkapjCzUMMUfICVjZ2Dk4ubgYGHF8jj4+IHkgKCQsIioiBZMXZxCUkpaQYGGS4uLlmwBrg6OS55BUUlZRVVBgY1dnVpDRVUUzS1tHV09fTBpnAJG8gZGjEwGBkbm2CYYmpmbmFpZQ0Us7EFugfVFDs+BgZ7By5RsCmOcFc7YZjizODiyuDmwsDg7gEU40bzkaeVAtADLGBTvPCa4q3N4OPLwODnj2lKQKCHdFAw1JQQYkxRDIWZEuYCMyU8AuQeXKbA1SGZEhkVzcAQAzLFIDYOpBdoikQ8UJ0PLlPg6pBMSUi0jjFLApmSbJ4ilyoLMiU1MM2SUYtLHNkUUBxFGRunI6lDMoVBJyMzKw1kCkO2XmxOLsiUvHy/gkIzb2lkU0DpBQiKkNQhm8IACxeKwWAyhUIAAHD7OgJm51JBAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492357921;4.copy,1.1,1.0,2.19,4.1200,3.798,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.817,3.630,2.19,2.14,1.1,1.0,3.798;4.copy,1.1,3.640,3.817,3.560,2.19,2.14,1.1,3.640,3.798;4.rect,1.1,3.630,3.801,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.817,3.609,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492358234;4.rect,1.1,1.0,1.0,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,3.153,3.255;4.rect,1.1,2.10,1.1,4.1180,3.815;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,2.22,2.10,3.814;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492358275;4.rect,1.1,1.0,1.0,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.817,2.10,2.19;5.cfill,2.14,1.1,3.153,3.153,3.153,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.102;4.blob,1.1,300.iVBORw0KGgoAAAANSUhEUgAABLAAAAAFCAMAAABit+UoAAAATlBMVEUAAAAAAQEkWVk8k5M4iYkaPz8jVlYGDg4WNjY3iIgSLCwdSEg8lJQpZGQIExMVNDQ7kZEDBwcZPT0XOjoLHBw0gIA+mZk9l5cJFxcECgoQ6nHZAAAATklEQVRYhe3XtwGAMAADQZmcDZi4/6JQwA4qXs3fCpIU9A8hhKwVsrwo31Y1Qgh5S03b9cM4xXlBCCFvaU3Sth9nQgghc32/8LoRQshdDwnhojGP8TfhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.117;4.blob,1.1,520.iVBORw0KGgoAAAANSUhEUgAABJkAAAAHCAMAAACcN2w5AAAAV1BMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDR765d9AAAA6UlEQVRoge2QNw4DQQwDtc72OZ5z+P87Ha5Qt6awLFRQlSCIHGDMrIzGNkx980H/WhKcLNoS7+MwZJLFkEkWI4/JyXRWDNh80L+WBCeLtsT7OAyZZDFkksXIY3K+WK6GS33zQf9aEpws2hLv4zBkksWQSRYjjcluvdnufof65oP+tSQ4WbQl3sdhyCSLIZMsRh6T+0Ppj5393XzQv5YEJ4u2xPs4DJlkMWSSxchj8nS2y/X2vdQ3H/SvJcHJoi3xPg5DJlkMmWQx0pi8P55m/etzqG8+6F9LgpNFW+J9HIZMshgyyWKkMfkGPxptQeU7ZHoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.136;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAABK0AAAAHCAMAAAD9L057AAAAV1BMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDR765d9AAAAyklEQVRoge2QSQ7CUAxD82mZWqDQ0jLe/5wM3QekOJEi2asoC/vpiUhZVDJHvyzx28D0RbDQJIqFJlEs+UzWy1WRPy5L/DYwfREsNIlioUkUSz6T6822mT/6ZYnfBqYvgoUmUSw0iWJJZ7Ld7Q/d96FflvhtYPoiWGgSxUKTKJZ8Jo+n0g+t/Lws8dvA9EWw0CSKhSZRLPlMnkeZLtfPR78s8dvA9EWw0CSKhSZRLOlM3u4Pkf75fuiXJX4bmL4IFppEsdAkiiWdyRdCrFOmYqjlNAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.155;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAABK0AAAAHCAMAAAD9L057AAAAV1BMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDR765d9AAAAy0lEQVRoge2QSQ4CQQwD0+wwrMO+/P+dMMyhBYqiIIec7JOVQzkqESmDofSpDYnGy92Iofy+QZM0iZJp0iaPxpMiXw2JxsvdiP7Uu0GTNImSadImT2fzRX+pDYnGy92I/tS7QZM0iZJp0iQ3y9V68z7UhkTj5W5Ef+rdoEmaRMk0aZO3u9LuG/loSDRe7kb0p94NmqRJlEyTNvlwlNP50l1qQ6LxcjeiP/Vu0CRNomSaNMnX212kfbwOtSHReLkb0Z96N2iSJmnyrxtP1pZcL/KKog0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1151,3.223;4.blob,1.1,6768.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.253;4.blob,1.1,2736.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.592;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAADAAAABGCAMAAAC9p+dpAAABTVBMVEUAAAAZGRk+Pj4CAgIGBgYPDw85OTknJyc3NzcgICABAAACAQGUPDz1Y2PlXFxpKiqQOjoYCgpaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARmKSlgJycvExPWVlb/Z2f7ZWUnEBAQBgYxMTEYGBhHRx1/fzQBAQCGhjZLSx4HBwOTkzwsLBIpKRGZmT6FhTZiYihlZSkeHgyYmD4QEAdkZCltbSyXlz0oKBAqKhGUlDwICANWViNxcS4KCgSVlTwrKxFraytjYygCAgGKijg7OxiMjDk4OBdBQRqIiDcvLxNTUyJ0dC8tLRKSkjt8fDJQUCGLizhAQBobGwsTEwhKSh4SEgc0NBV9fTMJCQRERByCgjU8PBiJiTcODgYhIQ1ubixZWSQUFAgaGgs1NRaOjjkEBAEFBQKRkTswMBOAgDRDQxteXiZmZimGR0KjAAABa0lEQVRIie2TV1PCUBBGryUW7L1iFyJRFIyKRsUSK6DYsPde//+jsElMmOzdwDg86OQ8ZL/Z7DeTPBzGbBQV65TY36GUCoJQVp5+5HgPVFTmc/2bgudn4+FcZhWqqmtq69KzvsFMZKGxqbmlta29o7PLTGSh28tYT29fv9eSHP4h8/EDg7ZEFnKj8AWXgjA07Bbcwr8t/GV8fhjiSACmNDrmUPD7YATHJ0QIoTB9PylPwZyeicxCmFPmycLCIozo0vLKKiR1bZ26Vzc2YW5tizElCjGeoAo7uxLM5B5T9w8gHspHRCEcgiGljhmLnWi70xT//kwJ2pfnF/zC5ZVoX15HbriFRBzb3t7x7u/lB2z9+PTMKQSS6Prl9Y1TeP/A959fvG9yIdHFpMiWVReTxCqrISaJVVZdTBqLrIaYDpiyGmI6YMqqi+mIISsqJoYhKyomhiErLiaGJitHTAxNVo6YGJqsPDExMrJ+AykaNuvGq6zGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.883,3.668;4.blob,1.1,2896.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,5444.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;3.end,1.1;4.sync,10.6492358403;4.copy,1.1,2.10,3.209,4.1190,2.19,2.14,1.1,1.0,3.209;4.rect,1.1,4.1173,3.250,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1170,3.286,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.405,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.546,1.8,2.16;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1131,3.231;4.blob,1.1,8064.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;4.blob,1.1,556.UyiwVsiT89qRdsFCbEraIcH80tRF/D42fucO1gol9ZKZRzPmW7E/P3w8z4Gml6LWor7DfSRthBZXctfktuha6NHW3n0DSCtNax1rzVrxrVDSliyXSJsTStoJ/pVAE/ksbWra7nDkr1uHKZdGS25rs0qlTSGPQlNzLGwt2bq9dHvkMrnf+17L6CgzTNxYuNzly482NERxZkSuGTPz0ub9oe4PZEQ+Z2W92NY2Q6eHEFMJB94RAHmRzzrdxdlZS37+evSH4DWGvMhnBHEPDn4ok2HYXIqAsRl5kc8aTYdYvJjDyUFZnoDPs1POqYWChTAEDz4hbCtzLzabIS9vLQzTHj26gqY8MaNmkiKfAQAaTYdM1oqyMDHGkBT5DAAYGjqWklIgRBfwTowXwOF2FKQU8Bi8u+N3CanQh9M5LRItSk6WPgyj6O4PYZMzwiOffWg0HQUFG2E4+pyHMGNCqmETwoMHZygUeuShjRfCnE0exCNkCnM4OT2mHqLqfFqzx5WSUiAUVmm1JyOX/H+JSB3i1V5r7wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.345;4.blob,1.1,3636.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;3.end,1.1;4.sync,10.6492358489;4.copy,1.1,2.20,3.209,4.1180,2.19,2.14,1.1,1.0,3.209;4.copy,1.1,2.30,3.228,4.1170,2.19,2.14,1.1,2.10,3.228;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.60,3.342,4.1140,2.19,2.14,1.1,2.50,3.342;4.rect,1.1,4.1181,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.307,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1140,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.514,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.592,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.231;4.blob,1.1,1384.iVBORw0KGgoAAAANSUhEUgAAABIAAADwCAMAAAA6nMTsAAACE1BMVEUDAwc8PJMSEiwAAAAoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30eHkocHEQ1NYIGBg49PZcNDSEsLG4kJFkWFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYgICD///8bGxsTExMiIiIFBQUjIyP39/eBNDR5MTESBwdvLS32Y2P1Y2OUPDwkDw8PBgZpKirLUlL9ZmawR0c+GRkuExO3Skr/Z2dIHR0MBQVkKCjIUVH7ZWWoREQbCwstEhKbPz/zYmLxYWGNOTkeDAycPz/gWlpyLi4OBgYnEBAEAgIdHUc0NH8MDB4HBxAjI1YuLnE5OYwXFzgSEi07O5IEBAkRESkYGDw3N4kAAAEICBQLCxoeHksyMnw0NIAbG0MwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwQBAgEDCAMCBQJEqURCo0IfTB9n/2dHsEcGDwZk92QcRRwVNBUOIw4oZChc5FxOwk44ijgNIQ1n/mcSLBIyfTJTzlNW1lYtcC0FDAVj9WMeSh5CpEJEqEQcRhxj9mMGDgYBAwFd5l0oYyg4izhOwU4SLRINHw1U0FQyfDIuci5Y2VgKGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECQRi8mIgUCA/nD9FqkVRyFEnYCcQKBAIEwhh72EGEAYDBwNX11dY21hgplwFAAABtElEQVRYhe3V9zNcURQH8OVZG7Ks6D1C9BIlWpBCghS9d7GLBMEiumBFJ7t67yUigj8x+97Ozux+z4wZP5gx3PPDnTuf9+acc9+bO0ckMjHljEPEmYkJmUseIFlYPkTipFaErGU2SNwjW0J29oQcHJ2QOGcXQq5u7kgeno+ROK8nhEjFmyVvn6eUfJH8fPyRAgJ126DgEEwfGvYsPAIqRkY9j46JxSbi4l8kGFFi0stXr98YUHLK23epaUa50t9/+AgVP2VcdcbbQplZhLIykbJlOUi5eZjLIr8AqbBIhCQ2wyaKJSVIpWXlSFZS7L5CVolUVc0hfa4hRIIRI0aMGN1zkisIKeRItXX1SF++Yq6Gxiakb80t/LZVyUebQO0dwtPvnXx08dTd0ytQdx8f/TwN/GjFVgeHsPth1QjSz1FyxrFxQiQY3RGamJwib03PEJr9pUbSzM2T9AuLhJZUy6SJlVVCa+uENja3SPfbO4R29/aRDg6PtOu+cIeUGt2xj39rlxPhDnX+MfgSp8Id6vt7O34HI0aMBNKPQAPSj0AD0o/Aa6RXq5Fa9s7+AZ1fXGoH8X/U5ItUiaCLzgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1111,3.250;4.blob,1.1,8064.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;4.blob,1.1,1112.WwE2ArQrIlEwjsq5fc/3qR5RFT9KYwXYCBAcQRyMo3LunHNu9K+j9S/QVQF2niUpHa3Ny9sTU/ktaTAujLqjo+MEPkF+0nPNR8zKtUqBnPaQPylHICxWq0z2h6amPVqtiIsPHBAH4xAOp2rHjm1Xrjz6978vidm4njSQZz9vBwAUPQy/AiyOJO8aXARpKyxcr1KJebxBFD00MmImfQtwBIKaXbseeP55oUJh/vjjL7u70wii+KZ8HrtHUgu/AiyOJI7YWV3dJJWeuHnzjM3mTnbx43j43XfLt24d2rdveP/+OZcr+QkJ8E54BTLab40kE6oQhpVmZ9fm5oo4nEmvdyoVX2DBoKy5Wdnezs/Pd1ssnnRTly/916Ueu+f7T5IXZqAXFgCNUulLy5cfXLWqp6GB/CZjAAALQcq3bn3i66+7MWzz+fNVnZ1pGPCM+ZnW/6RlN3aa1Egke+vq9j/0UBrnKtete+zUqWenp1M9kcVm7fbu1v6a9pQmKaMUkSr2Gpe8upTfNfO0ed1Yt3Q5zAqwcUl5QmWlsH5x5xt8rs6kKNcpZ2/Nui6n/6wlyeJ96QpT1VV19e2rWIKyKj8VSjeXdlo7ecl2xfyTk1ub22XrUiUouvQTQrlWqd6YqQCbIcOPGTKZ7NTqjt27veXlW+P3dnTs9nrLt6bWy+Vm7drlVqs74p5FZeT0ebbm2d21u4mPKS19vLPTkqjEQOnjj3daLIIEmWAS9a5de6i9/W9JvjetkdNkae7SN9reoDWTXVxUqkd27ZpNW4IWC9WZ5QJksouL1Xra55ssL98Ga0CqjqA7k10iMCw4MvKBRmOANSCEdw1aM9kRYDL1KhQrs7NLoIwGYclv2j+9XLocYSEjd+OXaqYJj8dRVrYFQbi3bn1JfTQ4b580ZbJLisnUq9F0QRkKjiNoymSXlNHRwzk5FTIYaRXhrIZ7g96KnIo8ft7wnWEoA5LE75+Ryx/MylLfTKu2cjTQAjPQM9mRxGTqrah4CkGoxiygOSKNKq5QuHHjOJvNI55ukwGaUCSEhWQCWUl2ySA6CGtMUt8bCuTkVMhkK8zmj6mM8//Xu4Zfg16RYgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.345;4.blob,1.1,5032.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1161,3.678;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAACMAAAAzCAMAAAAq0UHwAAABYlBMVEUAAAA5jDln/2cDCAMBAQECAgI6kDpn/mcCBAIxMTE+Pj4XFxdFrEVX2FcKCgoNDQ0FBQUGDwZi82IsbiwiVCIAAQAqKioaGhovLy8sLCwGDgY3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAYnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21iqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4ICAhNTR9JSR0LCwRDQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxIHBwM8PBh4eDGXlz1lZSkQEAcbGwtdXSaSkjuRkTtVVSISEgdeXiaGhjZERBwICAMXFwkCAgEYGBgNIA0LGwsIEwgOIg4CBQIOIw5k92Tb3IsuAAABL0lEQVQ4jWNgIAAYmZiReCysYMCCqoaNnQOJx8kFBtyoanh4kXl8/GAggKJEUEiYkGsYOERECapBuJWFkBoxLi5xgmok0NyJTY0kYfeQrUZKCoUFVyMtIysnrwBmKiopqzDAWEhqVNXUNTS1tMFsHV09RQYYC0mNvoEhA4ORsQk+95iagUhzCzxqLI2tQJS1DT5zbCHm2OFTYw9xjwPCxwgWTI2jrJORs4s6zMdY/c7g6iZr7u4BZmL6nTppwxM9DY9MgBZLMJaXtw9cCUosIcWXr59/QCBUDUosIcdXUHBIaFg4QWdEREZF41cRExsXn5CIT0VSckpqWjp+UzIys7LhHBx+z8lFqMfld2SA0++jAAI486CMfKYCDBammkIMFrqaIqZiDBa6mpJSBgQLALakMhotAZRTAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492358596;4.copy,1.1,2.10,3.209,4.1190,2.19,2.14,1.1,1.0,3.209;4.copy,1.1,2.20,3.228,4.1180,2.19,2.14,1.1,2.10,3.228;4.copy,1.1,2.30,3.266,4.1170,2.57,2.14,1.1,2.10,3.266;4.copy,1.1,2.20,3.285,2.10,2.38,2.14,1.1,1.0,3.285;4.copy,1.1,4.1140,3.437,2.60,2.38,2.14,1.1,4.1130,3.437;4.copy,1.1,2.60,3.456,4.1080,2.19,2.14,1.1,2.50,3.456;4.rect,1.1,4.1191,3.269,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.250,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.292,1.8,2.66;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.440,1.7,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.464,2.16,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.478,2.26,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.544,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.559,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.611,2.15,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,2.65,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1131,3.250;4.blob,1.1,1476.iVBORw0KGgoAAAANSUhEUgAAABsAAABZCAMAAAD4mq8AAAACT1BMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0DBwc8k5MSLCwoYmIpZWURKio8lJQDCAgBAgI4iooYOzsiU1MvdHQAAQECBQUBAwMLGxs+mJgIExMSLi4+mZkramozfX0eSkoECQkNHx8JFRUcREQ1goIGDg49l5cNISEsbm4kWVkWNTU5jo4BBAQ7kZETMDAmXl4pZmYOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnErEiuZPpkIAwg0FTSLOItMH0yBNIFZJFl/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0dR0c0f38MHh4HEBAjVlYucXE5jIwXODgSLS07kpIRKSkYPDw3iYkIFBQLGhoeS0syfHwxeHgXOjo0gIAbQ0MKGBgFCwsFBQxjY/UeHkp3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl5eJiYSEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgkJFlfX+wCAgYhDQ3+Z2csEhIEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZwLS32z3XVAAABv0lEQVRIidXUV1NTURQF4EMRAaU3kSY1lASDoASlCiJdWkIvUiwgUhUElN5BUFB6k96RpqICij/MnBsZc8ldjzCwHvZeM9/dc98OITRKygRGWQmSiuoFaGoXIalraEK7dFkLmrYOJF09fWgGhkbQjE0gXTG9Cs3MHBKxsMR2jmN1zRqjjS02O3sHaDxHJ3zo7EInX0DjymqEXBe6SecNdxoPVpPm5i3p8BTReLGaNLfv4B96+/hi9PPHFnA3EJog6B4+DL6P7aQSEootLDwCY2QUtgfRMRhj47DFi0OgScQJ+DAxCVtyCrbUWGxp6ZAyMh9CyxJnQ8vJfQTt8RNIT/MkiPJzn8GzgueQTjWFRdiKCiEVC0uglZZB4r14Ca28wgqarQ0kT/tX0Cqr+NBcnCFVC1/TFci8YgKefCNvaphPaplXzL1OvpH6BsYamVdM1CTfzmKaW1q5oa2dkI5ObmtvI6TrbTcX9bx7T0hv3wcu+9hP58AgBw0Nj9A1OjauaBOTn5g9Na1oM7OyPTevQAuLS7KyvLJ63NbWP/9rG5vHbWv7qO18+cqmb7vfj+qPn3ts2z/433/9ZtvhHzr/AttJYdqj7ChpAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.345;4.blob,1.1,3572.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1091,3.345;4.blob,1.1,7292.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.514;4.blob,1.1,1848.iVBORw0KGgoAAAANSUhEUgAAAHIAAACACAMAAADgWc1dAAACQ1BMVEUAAAAPJA8KGAoECwQvdS9QxVAiVCJUz1QGDwYbRBtg7mANIQ0MDAyKiorh4eH19fW5ubksLCxBokFHr0ceSh5l+WUBAwFY2lgtcC0HBwfAwMC/v79UVFRISEiSkpLr6+seHh4IFQhj9WMdSR0gTyBc5FwJFwkhUiEFDAV2dnaxsbEXFxfDw8P8/Px3d3eZmZk/nD9MvUxFq0VHsEcCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf398dSB1n/2df6l8wdjA1NTXExMTt7e0xMTGsrKzg4OAGDgYjViMIEwhdXV2cnJwuLi5HR0eWlpbS0tIJCQle6F4zfzMQJxAbQhtxcXGCgoJGRkavr6+AgIABAQHa2tpX11c8lTwTLhMZPhlpaWmMjIw4ODjc3NwfHx+4uLiNjY1eXl6rq6tV01U/nT8LHAtEREQGBgb6+vpkZGT29vb09PQrKyta3lo3iDcCBgJl+mUpZSkICAjs7Ow7OzsZGRkUFBQsbCxQxlBnZ2fx8fF7e3tQUFBra2sSLBIUMRRf7F9h72EGEAYzfjNY21haWlrOzs739/fn5+d5eXktby1d5l0BAgEDBwMDCAMLGgsXOhdSzFIyfTJRyFEnYCc5jTlNv00AAQAgUCBc5VwQKBAVNBVTzVM2hTYRKREcRRwIFAgxejEeSx4XOBdi82Jf619Is0hZ3VksbixDpkMYOxg+mj4CBQIfTB8OIw4NIA0LGwsOIg5k92QICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzXr1/3BAAAC4ElEQVRoge2Z51MUMRiHo6eAil1OT6xYsCAW7GjsnmBX7Fixi12w4IkKNmyAir1X7AULWP80Z99dB9mSy+7mXe5u8nzJ7ntJfnNzk9wzCSH8NNG9N/XZGOyIZs11hbj4BNzEFi1bQZvYuk3bdu3hsUNHY7dOSXGiEv2du0Ab6JrcrXuPnr2U594pfYwd+/brLygyNWUAtAMHDU4bkp4+FF6GDRc0uykjMqAZOWr0mLHjxmdOgLeJVNQ3MmPSZGimTA1MS5w+g8wMKG9BOgsvMYumQps9e04amTuPzF8ArwsX4UUupjnQLlm6bDnJXrFylVrOXY0XuYauhXbd+g15Gzdt3rJVLW/bjhe5g6rrIT95Z96u3Xv27lPL+w/gRRYUHoT20OEjmUWk6Kha9SeFGGOCQXeZx7Rfrfj4ifyTJVqxlJ6yHuE7feasq8hzZdrD+QsXL13WnssrKq1HXMktg32/4Crgtx15rbDKWLx+g2PkTQrcsh1Jbt+5qy/du8/zaz14CGTZj/Q9eqyrPKl4an8aWzx7rivkvEBOjFLw1cUAurqYYKYuyJiqCzK46mIKrrqYgqouFmCqiwWY6mIBprpYoKiLW13Qw55PURfXuqAjzHyKuvzTBVEY9aOBiDDVxSX1+tFARLjUxSH1+vG/iPCpi0jw1cWAVJdop/olCXn8z1z9ioReh+skdt+tekPevgvTR/C++z6elH8I00f0vusRlbCXf/Qy8hPs5RleRibAXl7jZaRd3CwSZ2PdLBKHY90skihdYBJJRPGZfmF8av+ihT2f1oV5nmf7oiXMfApfqdj/NI75ar4JTRQ+n0TiELZgiD5XUWALhuhzFYB90YKqH84vWhzj/KJFImlsOKRDfKTna0W0xHAgpUPSqNTW8vUTJx1133/85OknUDp+/f5Tx9NPnnlIJJGClA4kYlc65PVKDIBxvsEG5XyDjVQNiSRSkKqBROyqhiSmkNKBwl/fGOA8Qe1SpAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,3604.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;3.end,1.1;4.sync,10.6492358704;4.copy,1.1,2.30,3.209,4.1170,2.19,2.14,1.1,2.10,3.209;4.copy,1.1,2.40,3.228,4.1160,2.19,2.14,1.1,2.20,3.228;4.copy,1.1,2.50,3.247,4.1150,2.76,2.14,1.1,2.30,3.247;4.copy,1.1,2.40,3.266,2.10,2.57,2.14,1.1,2.20,3.266;4.copy,1.1,2.30,3.285,2.10,2.38,2.14,1.1,2.10,3.285;4.copy,1.1,2.20,3.304,2.10,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.100,3.342,4.1100,2.19,2.14,1.1,2.90,3.342;4.copy,1.1,4.1140,3.494,2.60,2.19,2.14,1.1,4.1130,3.494;4.rect,1.1,1.1,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.345,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.405,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.478,2.26,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.544,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.559,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.212;4.blob,1.1,1440.iVBORw0KGgoAAAANSUhEUgAAABwAAABZCAMAAAAaRrR5AAACKFBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaoDAwc8PJMSEiwoKGIpKWURESo8PJQDAwgBAQI4OIoYGDsiIlMvL3QLCxs+PpgICBMzM30cHEQ1NYI9PZcNDSEsLG4WFjU5OY4BAQQCAgU7O5ETEzAmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQWrRUWwR0cjIyP39/eBNDR5MTESBwfqX192MDBvLS32Y2OUPDwTCAj/Z2cPBgZpKirLUlL9ZmY+GRknEBBCGxsuExO3SkpIHR1kKCjIUVH7ZWWoREQbCwscCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAwGAgL6ZWVlKSmcPz/gWlpyLi4OBgbGUFCVPDwEAgJ+MzPbWFgaCws6Fxe/TU0BAAALBATNU1OFNjYUCAh6MTEdHUc0NH8MDB4HBxAjI1YuLnE5OYwXFzg7O5IRESkYGDw3N4kAAAEICBQLCxoeHksxMXg+PpkXFzo0NIAbG0MFBQt3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlbuKt2UAAAByklEQVRIic3V6TdVYRQG8MM2J0OGRCizm+FmSJkrMs9DhRwZM6RUSuaSIZGhMldCSBGK/j3Hda+1et1nf6q1PF/Ou9dvnbWf99MrSQaGhCKRkTGDJqZmGM0tTmAky5MMWlnbYCTbUwza2TPo4HgaIzmdYdDZ5SxGVzd3jHTuPIMgxxk9PL2YP719GPT188eouhDAFAoMYjBYfREjhRgyGBrGoFn4JYwU4czg5SuRGKOiYzBSbByDf+W/YjyDV69hvJ6QeDDcSEoWMSU1jXSYLmJGZpZ2yE7KETE3TzfkFxx8C2/e0uHtIrFIcUnmnXgNlsoZR2qW3S2vyKtUsEqu1neNmntyrUQ1cuVRyqqrb7jfKNED+aFITY8eP2l+ur/zWctzEVvb2ju0bTu7RKzqPrzni5f6Cmmxp+UVRmru7cPYP/AaIw2+YZAp9I9waJjB4SGMb9UjGEfH8E7V+DuMVu89MPp4E0RXvw8YJyanMAYFEsRp9YyAkVGaqJTzrPgaSnMfNfmknD/Pi+hgo8kX0pNj+ugsLDK4uIBxqaIR49dlvLN7ZRXjt7V+jN9/6Ld9LFvfwFj3cxPj1jYwBRN//ca4s4tMwT9pEPcAkYJuslgm1boAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1061,3.326;4.blob,1.1,8064.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;4.blob,1.1,756.6AQmowOJDYer+XwcrRTViqX/uRRZXS0rxbx6LSuRtcFt8iVyHENKGAldc7Pj2s+GRl1952rk72pc1KvU47fGPV/jf7JIAPNgSZQidXVhc+E3B74J34BAkyrkrM9psjdhynxHkyCkxdJmR7NmNf6tqTQUol6p1q5NrZIYNDQ0NDSJAE01bq22YedOf15eZOgXTXpz5LDxXGdZLEFrq1erbSDdMpqzqcX2ou07i3ciX5OT81hTk43LjYz6tLev/OCDujhtEcPGc51dubK9ru4DKiyjOZtCLJIuesP4Br5q3I88ohkfb6UivblG80hr6zhFcmKsJHPVgEg1burSm9vtJycnR/LyNpFuGQfJdA+RatzUpTeH4am+vvd0uhbSLc8/1Hz128vfxleNu7RUFgq1UZHeXCYrbWsLCYXZpFvGSpI38d4N3F0iXwKBUN+3fVjbuly+DRtyWSzo9OnIgoUE8flcubkbIIh169Zpci1jJfkr1kSqcVNXM9tiMel0zVRYxkTy3UOkGjd1NbP7+w+JRPkKhZ50y5hIvkLBP+XPF+XLOLKeO5iDymNjgaVLlVqtoHP2Vh7iBAJjSuVSgUB782bkBsdEkvy7ByBWjZu6mtkWiyk//0kISmZMKCXcE12NGz3U1cy+ceMYg8FGXuChmuRPbgAAhOCQgqvIFmZfdF/E2jYYDOXni6qqFB99hDljUpxRhYIiUb5CUWW1fkSuZfT8PyUz0cVOsqweAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.345;4.blob,1.1,3980.iVBORw0KGgoAAAANSUhEUgAAAGwAAACmCAIAAACwd/1IAAAABmJLR0QA/wD/AP+gvaeTAAALXklEQVR4nO2dbUwTWxrHT6ftUGhLS+m2vFl5acuLgvKiKEFc71Xx4s1VjBBAKJoCXb+YDcnGsIm7MfrRXD/oajQk9y6+RFADNyaiQRYl7l13TVyjJiKINFoQhALRlgJ9mf2AcEtb2pnOGR2W80s/yHlm/pznsaedec7zDACwEr5IpLdaVUVF0JVFfL5Vry9SqSBqciFqQcQ1OxuRlibPzHxz4wZc5VmXKy0iIlMuv/HmDVxlNhK3c6d+agoPD4euvDMubkqvD8dxWIIYLCHoDHZ2zk5OJpaUQFfuHBycnJ0tSUyEJcjeIBJOZ9+VK1qdDrqykyCu9PXptFroymxElp5ucLnEq1dDV06XyVwGw2qxGIoaS79Y5rB9+JBQXIzx+e+7u+Eqf7DZihMS+BjW/f49fTX2Luc5epuatFVVTCg39fZWrZAVHRYVVedwKHJzoStHhYU56upyFQr6UqxezgAAu8Wi3LxZpFK9vX0brrLFbt+sVKpEottv38JVZiPq8vLqsTEM3mXdAuVq9Vh1NY7R/Uxj+2ciAMDY1sbFcSZuAduMRpzLpX8LyPblDABwORzhSUmKnJw316/DVXa4XEnh4TkKxfWVcAuIQCAQCARiAYhp+vVH15e+KKWvAwDgi/h6q15VBDPFP68cjL8BLrbtFstAayuUpJ62Stt7qZe+DgDAbrEPtA5odfDTBxD9XQSUNL08S17nrBPGCuHNKk4/pcfD4d8LBuFv4Ns+KGl6rU471DVkHbTSEVk8q8HZydnEEmgpfjdlyv4GDiL9ND3Gw9Tl6t4mOGt5flZE35U+JlY0U9sSNNP0qt0qvUXPE/LcBzkYhyvgur8wPkbSOj8rmcFlEK/2TPFzMIwrELi/MD6fpDU4f3mBDwFg/Plz87NnmqqqJydPktR1R6vTDrQOOKwO90FVkWrXrV3uI8ZfjHf33iVjnZ/VuPmZWVOleXLyyWLlol23bi0+95e7e/eSsc4rU/OXQ+YgAEBGfX2awXAtOZnk8QvgElw3rLvzwx1Th8ljXKKRuI/MTMx87P9Ixuo2q4w0Q9q15GuLlSUSjWbxuRMf+/vJWN2Ug/TXH0Gn6VNqUipNlRyM7P8WxVmF1TnqFLkQUvxeyhT8JZuUnRoeNnV0BPFxq9VpX199TbgIqieSm9WUqcPExNdL0P4GIIg0vThBbHAZZGtlkKeyaFbq6rFqDIefoifvL4XfHUSaXlOpGXs6Nv5inPwpVDG2Gbk4l4lbQPL+Ugiiw2brb2nRVFSQPwX65aE3Dpujv6VfU6EJfChlZcr+IhAIBGKZIFFLAh8UFIpQCBfqy6ACYt2f1m37+zYmlHfG7TyYfJAJZXYRuz324PhBcQKcakx3UiNST+edlgvk0JXZBYfLKestS/9jOnRljIOd2HDi29hv4ahBUWGI+D3xwlhhT2MPdOV1keukIdKHww+hqAUIYs7x45kNDSEyBm9+/aAuV5s6THaL3duUm5v74MEDm802MjJy5swZkUi0YDqek9OQmSkLCfGjvFGx8eXEyxnnDCXlpaIRIIgz4+NZx45VvnuXf/asRK32PJnP98gScwUCDu1yvwVitsaM/DriPZ6cnNzV1WWz2YqLixsaGg4cONDc3LxgHZ+ZOZaV9a6y8mx+vlri+2tdI9H0f/TMIQZU9h8Nf+ASSdrhw/seP65zOgvb2qILChZM31y+bCAIj1fi/v0U1JdGECkwEIaEfQneppaWlt7eXh7vc1q+sLCQIIht2377Bpfg+OG0tMf79jnr6toKCwuio91PF/KFFwouZMozg1D2Ew1SRGZkFLW3Gwhi1a7PiXtxQsLvcnI8XiEREdR0l0CaLDUQhthvYr1NFovl5OLE/ejo6KlTp7yPzIiMbC8qIgyGXatWLQwqQ5UXCi6kSFPoKLtHg9QeC18kSiorS62pkWdn9zc3jz9/PjduNZmmvFoYXLOzZDQDwg3hAgBcDpfHeGhoqFAoHB4edh8cGhqSyxddrIj4/LKkpJrU1Gy5vLm///n4b+k4PsYHADgJZ3DK3tEIEERZenr6kSNJZWWEy9XT2NhRWmpxKxP//U8/aQ4c8Dilo6QESlfj9Pg0AMBjjxAAYLPZpqamoqKi3AdjYmLu3bs39+90mexIenpZUpKLIBp7eko7Ot5aLO4HWx1WAEAI1/ObJ6Cy/2gsydbGxgqjMaO+3mdFAKPLGcOx2tna1NpUb9PNmze9P7m2b98+92Pj1q3Gior6jIylWiB5HN65Lee2RG+hquw/GksiTU7GeKSWPBPs/XVv/t/yvcdTU1NtNlt7e3thYWF1dbXZbL5z586CNVkq5QW6Qji6/mi5upyq8teNRpBk/yW7rK/MpykvL+/hw4c2m210dPT8+fPhFEuFvl/9/YkNJ5hQZh3CGGHtbK0yTwldWYpLz205lxSeBEWN1S0Y9k/2EGmIplIDfaNm2jkdxgvLVeQ+GnlEX43VQQQADP9zeM0f1ohV4sF/DMJV7v/YXxBTIAuR9UzCvzdnHQK5IPPPPu4u6CPii75TfceEMgKBWBGsP3q09MULkgczV+PvAcS+BC9lUv5Sy/1pq6p6L10ieTBzNf4eQOxL8FKm4C8p5FlZdU6nMNZHbmopmKvxd5sV5L4EN2Wy/lJ4J2p1uqGuLusghes15mr83WYFuS/BTZmsv2SDiPF46vLy3qYmSvNgrsZ/flbw+xLmlYPxNwCq3bv1FgtPSHnVLFXjD2lWPvoSIClT8JfsO1Gr0w20tjqslFfNQo0/1RPJzcpHXwIk5SD9XRJcIqmx2eJ27Aju9Iz6jLJXvjNadMAleI2tJm5HHAPK1Pwl9U5MLCmZNpsHOzuDm9Prq6/Dk8Kh1/gnliROm6cHOyEnJgB1f0kFUavTvb56lXB57hmRhKEaf+b6Emj66wNxQoLB5ZKtXUtHBHqNP3N9CUH4G9grTWXl2NOn46Tv9nziXeOP4ZhH9x5XwOVwOWSswG9fAobjPuoyuFwy1uD8DXxxoC4vf3nxInlFnyzU+BvbjHMje7r3eH9K3j90/9XPrwJaAQDqcvXLiy99/q493d3enVD3Dx169fPPAa0gKH8Z6RYjgzRFyhd5tnd+Gvg0bZ4OaA2knMJ3q0KaP3dg2mwOaEUgEAgEAkES5jYAVq0qzMn5K00RVhe+L8DcBoBSuWmEdhHEMgiiPEsuTZX2Xe6DriwSqcLCoj98+DdNnWUQROY2AJTKTZOTr2ZmJmnqsD2IzG0AcDiYQrFxZORf9KXYHsS4wji+kP/mJvwH50ZErMEwfGzsv/Sl2B5E5jYAlMpNZvNTp69+IKqwOoi4BI//IZ6JtczjhUZGroOylgHLg8jcBoBcnm23Wycm4FQmsjqIzG0AKJWbRkf/AwAcZfYGUZwgjs6PZmItCwRyiUQNay0DNgeRuQcTKRS5FovJah2CJcjeIDL3YCKFYgPEtyECgUAgEAgEAoFAIBAIBAKxEsHDcT+djHSsKwWekFc9Vn1o4hAu9RELOtaVwOfCd8JBTI9Oc3gcl91H80ZwVgzHvP+CiMvuIpxEQOvygsHC9+JHxX46APxblxcMBpG5/gAEAoFAIBBfC1WRqnamNnE/gw8zWRHE74mvNFWGKkO/9kQQCMSK4Ks1jdOBg3E8HidBOAmfyZEvw3J7ajQAgNwfLv6SLMt3Isk/XIxAsAO0aUGXL7lpsSy/WMjgf0sDgUAgEAgEAoHwBdp4gAPaeEAgEAgEAoEgx9zTz7/2LNhCMFsLISHcH3/cfPp0XljY/22umzxUtxY+h8zpJD59smMYx7kMi/ehg7YWEAgEAoFAIBAIxDIGFe3RxfvOGqUbKIPurBEIBAIBG3SJQxd0iQPhoUbelzjLsi2NDkw81GjFBZGJhxr9D4bSaB83NtjHAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.514;4.blob,1.1,2204.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1151,3.678;4.blob,1.1,1140.iVBORw0KGgoAAAANSUhEUgAAAC8AAAA+CAMAAACMc7KgAAABs1BMVEUAAAA5jDln/2cDCAMBAQECAgI6kDpn/mcCBAIxMTE+Pj4XFxdFrEVX2FcKCgoNDQ0FBQUGDwZi82IsbiwiVCIAAQAGDgY3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAYnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21iqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5NTR9JSR0LCwRDQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxIHBwM8PBh4eDGXlz1lZSkQEAcbGwtdXSaSkjuRkTtVVSISEgdeXiaGhjZERBwICAMXFwkCAgENIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbByYPsAAABX0lEQVRIiWNgIAAYmZgxWOiAhRUMWEBsNnYOqCiChQ44ucCAG8Tm4YWJIljogI8fDASATEEhYagggoUPcIiIYrBGAelATAwfCwLEJSSlpGXATFk5eQUGnCwIUFRSVlFVUwezNTS1ZBlwsiBAW0eXgUFP34BYJxsagUhjEyKVm+qbgShzC2LNt4SYb0WsemuI+23AHCLC01bSTs/eQRnMxh2eSHnP0UnS2NkFLIc7PJHzHjEAKe+NgoEG+FMNmOXq5g5Xjj8XQlgenl7ePlD1+HMhlOXr5x8QGESSs4NDQsOIVx0eERkVHUOs6ti4+ITEJOJNT05JTYNziAjP9AyEXmLCExkQFZ6jgA4gkykLjZWdk4tXfR46K78Aj/pCpiJ0VnFJKW71ZeUYrIrKKjwWYAHVNaSpr62rJ01DQyNp6puaSVPf0tpGmob2DtLUd3Z1k6S+p7ePNAv6J5CmnnQAAC6kQTy2xE8oAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492358806;4.copy,1.1,2.20,3.209,4.1180,2.19,2.14,1.1,2.10,3.209;4.copy,1.1,2.30,3.228,4.1170,2.19,2.14,1.1,2.20,3.228;4.copy,1.1,2.30,3.266,4.1170,2.76,2.14,1.1,2.20,3.266;4.copy,1.1,2.20,3.285,2.10,2.57,2.14,1.1,2.10,3.285;4.copy,1.1,2.10,3.304,2.10,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.120,3.342,4.1080,2.19,2.14,1.1,3.110,3.342;4.copy,1.1,4.1100,3.456,3.100,2.19,2.14,1.1,4.1090,3.456;4.copy,1.1,4.1120,3.494,2.80,2.19,2.14,1.1,4.1110,3.494;4.rect,1.1,4.1112,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1070,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.405,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.649,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1102,3.250;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0D1f7eAAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.345;4.blob,1.1,3496.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1041,3.362;4.blob,1.1,8064.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;4.blob,1.1,728.HQUH7MREzYEDcWEPEovLias11MrXEN+yECUIguxsArc/5JGtkinWRzhRRpQoUaJEiQKAGGrM4dLDqoAyIgpFxc6dzvR0fAElWBJLBQ5V8VdLp8fW19sUigrglrHUzie2Z2/fmbMz8DGpqS/V1AyyWPgCSpqaVv31r2VBLAcMVfFXu2pVU1nZX0NhGUvtvGFh3MIPSj9geu3dIM8LL8gnJupDkVhKLn+hvn4iRNInYInk26h71nsT7on8+HzglkOXWGpo6NzkpDU9vQq4ZeBEcmg9iKfD1FEiLQFuOXSJpRBkqqfnM6WyDrjlnxsyjuzDZR+KmL6DRsmgVgs9noZQJJYSCtUNDR4uNwW4ZbBEeGPImGtssXgxTIF7HgNeOjaZ7Js2pdHp8KVLD8BatttNaWmbYJj+4MElsJbBEvmVnzZjm0aqCYXl0CWW0ukalcraUFgGSOSH9orpSjwzPo2bBtxy6BJL9fae5PEyJJJi4JYBEvmdes4pZwYvQ8gUdj3qAmt5fNxVUiJVKGJbng15JI/LNS6VlsTGKu7fRwevzx0if9VCENRmaiuML6RRwMfghS6xlE7XmJGxBYbn7prunBharVlLhamBXzoSI3SJpQYGzlKpjMAvHSNL5CdkCII8iEfCkqRwU66br4O17HZ7MjJ4BQWSL77Ard4ZGI/HzeNlSCQFev0XYC2D4v8B8U2x/DImEL4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.445;4.blob,1.1,640.iVBORw0KGgoAAAANSUhEUgAAAIgAAABCCAMAAAC7F26yAAAAclBMVEUBAgEDCAMCBQIAAAAfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAIEwgeSh5l+WUiVCIgTyBc5FwJFwkICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzU141KcAAABKElEQVRoge2Z2Q6DIBBFsdbWavd91a7//4sVW1OZFAnGAWznPM0L4QSYcAOMeZyObxvWDTg92x4+64ecgW0Pn9kWKBBFoki3whGJh6OxXoUkMpnOYp1qnnectyhXjYjossw7LliVKysi67zjwk25siLSJCQCIREIgsh2t68xCmNFDseT/qBf3pp6/IOIXghFFNELoYgieiHUqTOSJPjzKMNlJpKeL1dsD3W4zERu90eKLfKJmRUibkAiEBKBkAjEuIgsSJpfEUmQ/N+tkUEiEBKBtEgEL0gK8VEpghckxfioFMELkmJ8bNEZMQSJQEgEQiIQEhHIbh0nRPit44QIv3WcEOGQCMQpEROvitW82tfEq2I17/Y18apY8P2j2kL7yj+qDYvIP6qf9D1zIskx41kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.20,3.514;4.blob,1.1,1812.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAA0CAMAAACn68rCAAACUlBMVEUAAAAPJA8KGAoECwQvdS9QxVAiVCJUz1QGDwYbRBtg7mANIQ0MDAyKiorh4eH19fW5ubksLCxBokFHr0ceSh5l+WUBAwFY2lgtcC0HBwfAwMC/v79UVFRISEiSkpLr6+seHh4IFQhj9WMdSR0gTyBc5FwJFwkhUiEFDAV2dnaxsbEXFxfDw8P8/Px3d3eZmZk/nD9MvUxFq0VHsEcCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf398dSB1n/2df6l8wdjA1NTXExMTt7e0xMTGsrKzg4OAGDgYjViMIEwhdXV2cnJwuLi5HR0eWlpbS0tIJCQle6F4zfzMQJxAbQhtxcXGCgoJGRkavr6+AgIABAQHa2tpX11c8lTwTLhMZPhlpaWmMjIw4ODjc3NwfHx+4uLiNjY1eXl6rq6tV01U/nT8LHAtEREQGBgb6+vpkZGT29vb09PQrKyta3lo3iDcCBgJl+mUpZSkICAjs7Ow7OzsZGRkUFBQsbCxQxlBnZ2fx8fF7e3tQUFBra2sSLBIUMRRf7F9h72EGEAYzfjNY21haWlrOzs739/fn5+d5eXktby1d5l0BAgEDBwMDCAMLGgsXOhdSzFIyfTJRyFEnYCc5jTlNv00AAQAgUCBc5VwQKBAVNBVTzVM2hTYRKREcRRwIFAgxejEeSx4CBQJCpEIHEQcfTB8OIw4XOBdi82Jf619Is0hZ3VksbixDpkMYOxg+mj48lDwqaSo6kDokWiRb4lsweDBj9mNDp0MNIA0jVyNi8mIpZikTLxNW1lZl+2U//6XaAAACuElEQVRogWNgoAlgROMzMdPGHrIACyuaABs7x4A4BBvg5OIG0zy8fPwCgmCmkDCmMhFRNnq6CgrExCXAtKSUtIysnLwCiK2opIypUEVVjZ7uggB1JQ0wramlraOrp6cP5hgY0t8hWIGRMZgyMTUzt7C0srYB82ztBiCcsAF7BzDl6CTpzOPiyuAmCeK523kMpJvgwNNOHUx7efvoMPj6MfgHgLmBQQPpKDgItgsB06Fh4REMXpFR0RDhmNgBdBMCxNnFg+mExKTklNS09AyIcGbWALoJAbLtIIVHjnRucl5+QWERRLi4ZADdhAClZeVguqKyyrqaoboGIiomWotHj7s77d0FBXXQFFbf0JjT1AwVbLFrxa2Dua29g+bOgoLOLiiju6e3rx/KnjBxEm4dk2O6wM2E0ilgIEZL100tm4YpOH0GETpn2oHBLKo7CRnMnjMXXWjefGJS1oKFYOBJAzchAPOixWgiSyYupamNJIFly9EEQlYMiDtGKBhUbX0MgLetPzCtamSAra0PBwPSqkYGWNv6gwcMmrY+VoDW1l8JqeXw1Id0BWht/VWQWg4lO0wCO3glfd0FBahtfW5ILbcaWWwN2MHG9HUWFKC29bHFLAfYwWvp6ywoQG3rY4vZgQSobX1sMYsCqN2+xm8e/rY+BqB2+5qAeXjb+pgA1r6mFsBsr6O03PG29ekHEO11lJY7UW192gNEex255U5cW3+AwKBq62OA0bb+KKAfWLeeoXbwNjrXbWCo3UhF86hb907bxLB5C/WMo3Ldu5WdYcI2ZAEC7XWM8RpUQO26Fx3gbdVN2q40fweQ3slEQxfg6x3gbdXt2i2yZ+++/QcO0jKA8PUO8MbsIWBz4fARu6M0He/D1zsg3F6fG0y3QV0MQLC9jh9QUqLQfKSdkhKF9iPtlJQohPUCAPe42u/7FwN3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.573;4.blob,1.1,892.iVBORw0KGgoAAAANSUhEUgAAAJEAAABjCAMAAACsXBIDAAAAsVBMVEUAAAANIA1n/2cLGwseSh5l+WUiVCIIEwggTyBc5FwJFwkOIg4CBQIOIw5k92QDCAMBAgFCpEINIQ0VNBUHEQcfTB9HsEcGDwYICAMGDgYHBwOOjjmPjzoKCgQECwRf7F9h72EGEAYEBAKBgTSDgzUDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj475HxGAAABp0lEQVRoge3b507DMBSGYRM2tFB2W6DsTSl73f+FITkQU/fg5tjHtiq+56etOJYSiVfBVSrIVDHtmJ2ZnRNdr94K867phcUl0fVqWC4agStIr9dcEdkIY73GqtaSvW+ItUIbekFbepOyT6u+9Q1t8/fYlt7kdqYdUU9tR2+ymWlH1FNLoN3+c2roqXU6/vdwX2vNdnf39uss2js4PPLdkPtae/b45LRbZ9Wz84ue745+rr0s38sruZVDXZfv5U2u+4+6Ld/L0D9eAMAQXrDSwgtWmnQRh5MuYoB/wtHGQ0LamCVFG/OkaGMAgHAo2PFQsJMi7zddSt5vupS833QzQbeOhW4FgHRMe1IV6i7TON1q2pOqUHeZxulW055UhbrLNE63mvakKtRdpjm7NfapBH57xv7/Nr89qVMJkvjtORlnSZIaaVSxUwmeeGcHUnA3KgoWANLh921s/L6Njd+3sfH7FgAYqFrNULAGVas5CtagahUFCwCxVY3av1ODe2vM4xdfEjv6btT+gxo8WmMev/gKVzXq07N6ebXGsqga9e1dfXxaY+l9ASWwHyf5FCtPAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492358908;4.copy,1.1,2.30,3.209,4.1170,2.19,2.14,1.1,2.10,3.209;4.copy,1.1,2.40,3.228,4.1160,2.19,2.14,1.1,2.20,3.228;4.copy,1.1,2.40,3.266,4.1160,2.76,2.14,1.1,2.20,3.266;4.copy,1.1,2.30,3.285,2.10,2.57,2.14,1.1,2.10,3.285;4.copy,1.1,2.20,3.304,2.10,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.150,3.342,4.1050,2.19,2.14,1.1,3.130,3.342;4.copy,1.1,4.1110,3.475,2.90,2.19,2.14,1.1,4.1100,3.475;4.copy,1.1,4.1120,3.494,2.80,2.19,2.14,1.1,4.1110,3.494;4.rect,1.1,4.1102,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.364,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.367,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1050,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.405,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.668,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1082,3.250;4.blob,1.1,304.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAXVBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0D1f7eAAAAQElEQVQImR3MRwKAIBAEwV0wIIoYMfv/Z2I7h+rbiHxTg2IUbVGSqkbXeNJ2gfQRh3Ei87KStOF+nOS6/6PnxQw44gHVdoM9CgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1021,3.362;4.blob,1.1,7912.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.345;4.blob,1.1,4040.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.478;4.blob,1.1,2524.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1141,3.668;4.blob,1.1,1364.iVBORw0KGgoAAAANSUhEUgAAADkAAABGCAMAAABBssyjAAACB1BMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6Kijg5jDln/2cDCAMhIQ3+/mcsLBI6kDpn/mcCBAJ9fTLOzlNFrEVX2FfW1lZwcC0GDwZi82IsbiwiVCIAAQABAQECAgI0NDQ+Pj4REREKCgoGBgYGDgY3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAYnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21iqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4ICAgNDQ0DAwNNTR9JSR1DQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxIHBwM8PBh4eDGXlz1lZSkQEAddXSaSkjuRkTtVVSISEgeGhjZERBwICAMXFwkNIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWYMI8wXAAABsUlEQVRIiWNgIA8wMpGpkYGJkUyNzCysZOpkYydTIwcnF5k6uXl4ydTJx0+mRgFBITJ1CouIkqlTTJwYVRKSUugsaRlZYnTKySugsxSViHKZsgoGS1WNGI3qGpoYLOKAgpY2BosKQEdXl0ydevr6BuTpNDQgVyeD0SDRaWxMDAum08TUzNzCEsy0sraxZSDMguq0s3dwdHJ2AQu5urlbMRBmQXV6eHoxMHj7+JLuTz9/EBkQSLLOIJ9gECcklHQ7wyB2hpOuMwLiz0iwGEmxEmUW7R0T6wAWIi1WGOLizQISEsFM4mJFJ4nc1EdBLktOTiFP5yigCyAutUJZqWmIKp/I1AplpWdkZmVDdRJZhsBYObl5+QWFZHqvqLiklBx9ZeUVlVXVpOtjramtq28gx0auxqZmOIekWGlBatqQFivIgMRYGQVDBrRKtqGx2js6oSIIFnadXeis7h6YJIKFBfRK9qGz+idMZEBnYQGTJmOwpkydhsEiEkyfgckiDsycNRuDRSSYMxeTRRyYNx+TRRxYsHARBotIsHgJJos4sHTZcgwWcWDFylUYLCLB6jUIFgCX04tMdlur+wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB7UlEQVR4nO2Zx1JCURBEASOiF8kYwAhGMAdMGP7/nywfSrl4c4vFUNNNzVne2fSCV9TpzmRmhGzOOoEmc/ML1hE0WVyyTqDJcn7FOoImhVXrBJqshax1BEWKYd06gialsnUCTSpV6wSa1ArWCTSpN6wTKNLc2LSOoMhW2LaOoEirvWMdQZHdPesEiuwfFK0j6HHY7lhHUKR7ZJ1gmrC66HHqK6mLnpymv1O6aOfsPP3A6KLNXks6EbpoPy9+7YQuenEpnghd9OpavtG56E3oy0c6F70NXflI56J34V4+0rnoQ5D/VPhc9HHwJN4IXfRZ/tIJXbTcE0+ELvoyeBUulC76Nkz/PXG6aO79I/Wd1EU/v6wTTJV0F+Vi3ANILkrFXw8guigXox4g4qJUjHqAiItykfQAERflIukBYi5KxU8PEHVRLkrluItyUanGXZSLWiHqomTUG1EX5SLpASIuykXSA0RclIukB5BdlIxRDyC5KBm/PYDkolyMe4CZcFHSHmBCfJMGwDdpVHyTxsU3aVh8k8bFN2lcfJMGxjdpYHyTBmYmegAZ36TR8E0aGN+kgfFNGhjfpHHxTRoW36Rx8U0aFt+kYSHtASbEN2kAfJNGxTdpXHyThsU3aVx8k8bFN2lgfJMGxjdpYP73AN9wtznR168+twAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492359016;4.copy,1.1,2.30,3.209,4.1170,2.19,2.14,1.1,2.20,3.209;4.copy,1.1,2.40,3.228,4.1160,2.19,2.14,1.1,2.30,3.228;4.copy,1.1,2.50,3.247,4.1150,2.95,2.14,1.1,2.40,3.247;4.copy,1.1,2.40,3.266,2.10,2.76,2.14,1.1,2.30,3.266;4.copy,1.1,2.30,3.285,2.10,2.57,2.14,1.1,2.20,3.285;4.copy,1.1,2.10,3.304,2.20,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.160,3.342,4.1040,2.19,2.14,1.1,3.150,3.342;4.copy,1.1,4.1090,3.418,3.110,2.95,2.14,1.1,4.1080,3.418;4.copy,1.1,4.1050,3.437,2.40,2.76,2.14,1.1,4.1040,3.437;4.copy,1.1,3.180,3.456,3.870,2.19,2.14,1.1,3.170,3.456;4.copy,1.1,3.200,3.475,3.850,2.19,2.14,1.1,3.190,3.475;4.copy,1.1,3.210,3.494,3.840,2.19,2.14,1.1,3.200,3.494;4.rect,1.1,1.1,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.130,3.386,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.383,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1030,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.212;4.blob,1.1,1444.iVBORw0KGgoAAAANSUhEUgAAACQAAABZCAMAAABhYna1AAAB/lBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQWrRUWwR0cjIyP39/fqX192MDATCAj/Z2cnEBBCGxsuExM+GRkcCwtJHR0GAgL6ZWVlKSkGDg7GUFCVPDwECwtf7Oxh7+8GEBB+MzPbWFgDBwdX19dY29sxMXg+PpkXFzoaCws6FxcFBQuNOTm/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBT9ZmYbCwuQOjq8TEwEAgLpXl5eJiZLHh70Y2OpRESjQkIPBgb3ZGRFHBxkKCjkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlZaD8PVAAAB90lEQVRIiWNggANGJmYGwoCFlQhFbOwchBVxcnETYRQPLxGK+PgFiFAlKESEImERIhSJiokToUpCkghFUtIyhBXJyskTYZSCIhGKhiNQUkbhqqiqYVGkrITKV9fAVKOppY0qoKOrh6FI3wBNwNDIGF2NoYkpupCZOboIn4UKupCllhWaiIY6pjOt0TKqrK4NpiJbO1S+vYMjpiIOJ2cUvrkZphoGBhcpZJ6rlhs2Re4enkg8L+x5zdvHF4nn549VEUNAIHbxQQqCiFATHEJYTWhYOIQRERmFS010TCwDTFEcLkXxCYlQVlJkMi5FKakwVlo6TidlZOKUgoOs7HjCinKycwkrysvOJ6yoILuQsKKi4hIsoqWlqPyyckw1FZVV1Qye3mBgCBKoqcVUVFffUMHQ2AQGzSCBluJW7A4RFQCDNjCnvaOTsNO7unsIK2Lo7SNCEc0B9pKWAa1ExlbSggBKiYytpGVAL5GxlLQggFYiY5a0DJglMmZJy4ClREYvaUEAo0RGL2kZsJXI6CUtA9YSGbWkBQEsJTJqScuAvUSGlLRICRlriQwuaZESMq4SGS0hD0/QP4EIRRP6CauZOGkyYUVTphJWM236DMKKZs7qIqxo9hzCaubOm09Y0YKFiwgrWryEsJrwpcsIK1q+grAahpWxOCQAOYZaQRXvrwgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.61,3.345;4.blob,1.1,3636.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1001,3.362;4.blob,1.1,6120.iVBORw0KGgoAAAANSUhEUgAAAMYAAABbCAIAAACnAW2XAAAABmJLR0QA/wD/AP+gvaeTAAARoUlEQVR4nO2da1BTZ/7Hk5MLSQgBQi5AIMgtgpICAia2wYri0oLLqpVS1OB/FctMt84y1Q7TmbpuL9OZOr5wtWrdF2sbLx2tDkxnFu1QF29jwPUSERcJ1zoJmpBICoSEJCT/F7RIk5icy5OEyPlMXrTnnOf3fH3Ow3nOOc/v+R4SAQcJ8QyGy+WyO52hFjJ/gUItIMyQxcffWL8+mkoNtZCFQVlZ8r59haFWEXAUJSVNZWWhVhEQ8hob3+7qwhgE5FVKKuW3t+sABpyf7FYq/5CU9GZycqiFgEckl6tPnsQYBFiXEgqZCQmMjg49qIDzlhGr9bu+vj25uaEWAhjOsmUx2dm9p05hjAOsS0ml/J4ek8k0BSpgcMjJYe/alTN3i0QiuXr1qsVi0el0hw8fZjKZnqXODwysFgj4dHqwZP4OYXl5eUsL8LCi2trhtjazVosxDhmIGggiLl/OO39+AEi0IABBxKIibllZskAQOTg4Prt98eLFbW1t165d27BhQ2Ji4oEDB9LS0ioqKtyK39TpCATC64mJ5/r7weihUIgkkttGp83mmvNoCZHJ6dXVeY2NbLFY39EBpN65wTNqato//BBsWPSIxexDh16LiHBvlHkIhQKVlCR+8cXyI0dk27dnpaWx5u49d+6cWq0mk3/9SysrK3O5XCUlJZ5xntbW7isoAKVq9alT9S6X2y9t06aZvWQ6Pef99zcPDtZZratPnuSvWAGq3lmEFRU7JibIkZHYQ4G5SkmlfJXKODU1DSRaQNm2bXFBAael5fF//jNsNtvd9paXlx88eNDhcMz8748//mgwGCoqKtra2tyOHJ2a4oEb+P67d++DgwfdNo79dgl8/V//Stu06d4XX3QdOmQ1GkFVOhdRbe1gU5PDbMYeCkCXotPJublxR448xB4qCNy+rU9JYZaWJjGZlOvXn2g0zxuRTqdHRkY+ffp07vHDw8McDsczjsPppHkMVagxazSTT564bXTabDP/0X/2LLegQNzQQONwuo8fN3Z2gqp3Bmp09KLKykuVlUCiAehSBQUcs9n+6NEo9lBBQKUy3r9vzM/nvPFG8qpViQMDY1euDM88qFoslsnJyfj4+LnHJyYm/vTTT55xIimUEasVlKpVJ05kbtnitrG1qmrg/HkCgTDU3PzzDz+kbtyY19i49L33dErlw6NHsT+azZJWVWU1GrWXL4MKiJU9e3Lfeist1CrQkJUV09AgPnTotdktFy5c8LyXKi0tdStIIhKndu58PyeHAIio1FRuYaHbLyI21vNIwZo161pbt4+Pe+7yDZXForJYXndVXrsm3b8fsegAweHQvv56ZWIigNu6UCEQPBefnZ1tsVguXrxYVla2bds2o9F46dIlzyI5bLarvj7f24AYHNhiMaLjyZGR2wyGP4+OUmNi3HZFpabWO51scH8eWKmoEH788bJQqwDJq6++euPGDYvFMjIycuzYMZa3v+y/isXDcjlEJAZfHjpIERHV3d3v9PZ6PtMt27v3rbt3Q6LKO3//e+GaNYJQqwg2tzdu3LvsJflDevt//xM3NIRaxcJm/aJF2q1bWXgyAg4QsmNjh+XytUlJoRaC87KwWiCoEApDrQIHBwcHBwcnPClLLttXuA9IqAhSxGHZ4Rw2gDdsjY15XV1vY49DIBAoTMoO8w5hecDvlvIa896GrZnCZO4wm4Xl5djrLUtO3lcIN5k7gkQ6LJPlsNmIqkCWgiflS9t17YiKvIip6al7hnsr+ADyNORy0cmTauxxCASCfcI+2DQoqhUBieYDkVykhq3ZPjEx2NQkqq3FXq+Uz2/XwU3mnpqevmcwrODzEVWBoEsJmcIERkKHHljyV7uuPTcul0aiYQmybBknOzvm1KleUKrUCnVKZQqVFcDXTpxlnJjsmF4kmtUKRUpl5Ysm6WAiZDITGIwOPYJk7nadLjcuDlHOBYIuJeVLe0w9pikT/CK+eWR6NOmYLOBiSmSrrRW1tQ1rtQASfWbQXtbaTLa0qgBOhItqRcNtw2YkmrWXL9tMprSqKiz1Svn8HpPJNIUgmfuRyTTpcBRwufCLwO1SEBFazluu1Cnhh/aL0+Xs0HdgGfvIZKimJkOhADPqzeCadvWe7g3c2AeRoYyaDDVCza7p6d7Tp7GMfRCRuJzHU8Ie9WZwulwdej2isQ9ul1oau5QKUe8Z7s3dSCQQKRBl7o9EJMHcO0O7rj0jOiOOFgdf8VzKypIiIykXLgDOeVcr1AnFCVEpUWDDzpBUlkSJpAwg16xWKBKKi6NSUtDVuzQ2lgpB9wwGpAXbdbqM6Og4Gtz7E7gpeFK+VGVUTU3/7popZov/kvOXuVvuG+8ffXgUzt4ZtGat1qyV8CQtj9Es+aitFTU1DZrNDhRlffDswTNjpzFTnnn3c/BT9KJa0WDToAO55mcPHhg7OzPl8ruff46iXimfrzIap6YRJ3NrzWat2Szh8VoeP0ZRr3foZPpXsq+yY7M9t6dEpcz9celcmHtnKU0q/bToUxSqoqOpFkvd2rUBmW575YNX3ul5B3hYajS1zlKXhFbzKx988E5PD4qCdDL5K5ks21tOHxxKk5I+LSpCV9Y7snjZl5IviYSApAexqKxjxcdSo1KRFqyry9JotkJQQFQx4hnvOt7lSXhgw2bVZW3VbCWi1cyIj3/X4eBJJEgLyuLjv5RIULcUi0o9VlycGgXrTgDWvZSUL701cstFcKGV5Isx21j3aLeUL0VasLZWdOZMn9MZEFWTTyc1rRrgN+miWlHfmT4XWs2TT59qWltR3KRL+fxbIyOoW2rMZuseHZXCu0n336U4NE5GdAbYZz03lHplEbeITESwtiI1NUomSwD7rOeGWqFOr06HqMAWZEelRiXIEpA+63moUqRXV0NIsrU4NFpGdDTSZz03lHp9EZdLhpHI6r+9JDyJZkIzbB7GIsg3KoOKBJEQTc5s3ZqpUhm6up4FTtVQ8xCJSpo7OQNRIRKN5PYjkohw9hIIhMytmQaV4Rk2zUPNzSQqFdHkjITH00xMDGNbo6cyGEgQBGdyxv+FoYhXdP3JdSxq/GJ32u+M3FnOW64yqmAWqanJ+Oc/uwOqymFx9J/rz9ycOdQ8NLPlT9f+5Hl3deXPV3q+6fG7l0AgZNRkdGPW7LBY+s+dy9y8eai5GWaRIh7vusciQaTYnc47IyPLeTyVv7WpYZOQPx+IyYqhMCluG8cHx61Gq9+9ODg4ODg4OC8lWI0iGIx4l8vldLpboOCECzOrx6ZdwF7vYX3pEh8vW7/+BpUaDUQNTvDJYLE+zM2lk8HYQhGwd6mBgfNG44OSkm9AiJnvAEzYDTKLFi1yuVwCgZd14XcNBq3Z/H+LF4OqC8CrYaVyd1LSH5KT38Qeap4DMGE3JFhf4F50fmBgSWws0hzzFwGgS1mtI3193+Xm7sEeav4DJGE3+EAQRCAQxsbGvO4dt9v/q9eDWkLt3qXKy4UtLb+7sMNx2B0YOC8QrKbTkeW9g8JTc+AAkrAbUNg5OTm7drltJBKJVqvVbn/hU9QdgyErJgaI0cOvXYpMhrZsyezsrPr3v99ksyNmd8847Foslg0bNnz00Udbtmw5e/asZxSd7iaBQEhMfB27oBkoFIhGI7n93PJYXqQ5oGBP2A0QRAjiSSQFf/tbzq5dFA/Hn/7+frpPZ9H+X34hEAiiaASPWRDF25wmRCTT6eQdO7J2734lIYHx/fcD9fXXlMrnU9afffaZRqNZt27djCOqVqu9dOlSSUmJmx2qzTZmsehiYtxz9FBz4sSqLVsy3TZWVbXO+GD71hxo1ApF7u7dUSkp4z//HLRKfQBRKPEyWdLatdToaMOdO72nTo0NIM5Ctk5Pj9ls8QwG/CKrTqzK9DhHrVWthO++W2O37/zkk8K4OC/JxRMTE5//Pi11ZGTkwIEDnkdWV3fLZEfgC/JNamqUh88gNzb210uRb81BYJNKtezjj0NStSfZdXXFx46l/PGPnhcnRHxSWFiTkQH/+KjUKG4h1+0XERtBPnu2v6CA29Ag5nBox493d3Y+n2dG5LDrdDpI2FbkzUWjMT95Mum20Wb71Vfeh+bgoFYoltTXo8sBB47+9m1mSkpSaSmFyXxy/bpZo0EXx+lyUSAEj2tmjXnS4xw5bU5yc/PQDz/8vHFjamNj3nvvLVUqdUePPpxZaYnIYZdCibRaR5D/Q7zje+DzoTk49J05I92/nyeRAP9KAgqMKpXx/n1Ofn7yG28krlo1NjAwfOUKCmFUEmnixffvnrxw4JvLmjWC1tZ14+PbZ7fAdNglEkk7d07l5LwPX5BvfA98vjUHh/KLF2VHgA30oIjJyhI3NLx26BDSghCReKS4uCQxEX6RFw18Xg4Vi5+/8oLpsMtm59TXuzicfKT/ElDM1RwcMmpqthkMiBJ2g0akt7fkvkmMjDy+cmWytzdE4IHjsCsW/1UuHyYSF9A3SMl0+vaxsUXr14daCBjWCAT7pVK3hEwykUiBILefXx9l/5OFN2/elMlkvo/JzJQ/fHjM5VpAX/xFkbA7n5Hw+VeHh92yEfbk5XkutPq2p+emz5URAOafFy1az2AkdHX9A3uo8OJqXV2oJYAhLy4umkq97PElvm96eiI8PFsM4D5z4p3Y2Gy5fDgpaW1gq8EJGAkMxn6pFPVCZPAIBKuFQvcvIOKEEVkxMWJAOQg4ODg4ODg47gD0/fUNIq9iJpNiNu8oB+H7i8hhNxxB5wrsFZht5eflJEDfX98g8iqemLA3NQ3WgrBVQeSwG46gcwX2Csy28v++G4jvr29QeBUrFOrKyhQWNt9fFA674QgKV2BP4LeV/y4FxPfXNyi8ii9f1ppMtipsvr8oHHbDERSuwJ7Abyv/XQq7768fBai8iqenXadP92IZ+9A57IYjKFyB3UDUVrAmejH6/vrGq1cxHBQKdXFxQgpa31/UDrvhCFJXYDcQtRWsLjXr+4tOkG+8ehXD4cGDZ52dRrncPQsMdr0oHXbDkVlXYHTFEbUV3HQUpU6Jwk7TL3QyPTcuF7Vro0KhlsvRjH10Mjk3Lm4hjHqzKHU6mGabbiBtK7hd6pb+FpfGReH765sCToHZbn40+ghd8TNn+tLTWRLkvr8FHI7Zbn80Ooqu3nDkll7PpdFgugLPBWlbwe1SqH1/fYPRq/jp08nWVg2Km3SMDrvhCCJX4LkgbSsEeZgofH99A8SrWKFQV1enU5H4/gJx2A1H4LsCz4KirRCcCU/fXzKR7PaVGApEgX5LF/a9lwDIq7i5eYhKJSGanAHisBuOeLoC+00FRtFWCC45nr6/e/L2eN5dfdvz7U3dTb97CYC8ii0Wx7lz/Zs3Zzb/5vvrFyAOu+GIpyuw31RgFG2FyVE4nhEfQXJfZGOwGsx2s9+9OPOBeAbDayqwGcmCPhwcHBwcHBwcHByclxKACbvzBFIESXZYxs5ZKIuQKEzKDvMOIdAziCnTz2ZzLlkSm5/PmfHoeQlwTbsYCQymkGm4uyCSXpw2Z+ySWE4+ZwDcGcRqjAEkYXdeoWvXxeXGkWhYv1sRLqgV6pTKFCq4M4i1SwFJ2J1XmB6ZHJMObgGmtNowQntZazPZ0sCdQaxdCnvC7nzD5XTpO/T8FaEx3A4+rmlX7+le4F9xxoRYzHY661En7M5DIgWRK79eSQuRt2zwYYvZ9c76KEBnEMAdg15v2bAhlUKBrl17SeZi7eN2Tj6HCBF/6f0l1FqCgUVvSd2QClGgJyDOIBjfOtQJu/MWnVLHly6UsY9AIKgVahGgMwimS6FO2J236G/paVxaVOrLM5r7pu9MHyud5fm5bxSAeVSemLCvWMEXCpktLY+BBAw501PTrHQWjU171vUs1FqCgX3Czl/BZwqZjzGfQWCGrSgSduc5eqWeW8QlkhfKR+rVCnV6dTqE+QwC6wEoEnbnOQaVASJBC2dyZqh5iEQlYZ+cAfaO2OFwpqezCgt533//skzOOF10Hj0qJcpwZ2FMzjicrHQWr5A3gO0M/j8HuFcCAe/3RAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.440;4.blob,1.1,2708.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1108.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACLElEQVRoge2Y124CMRBFgVRCsiSkkQKpkArphfTy//+UxQ4Irzxj3TXR5GHOo0dXukKLdHQLBXGKJekGlonJKekKlukZ6QaW2fKcdAVLZV66gWUhKUpXMFSTRekKlqWadAPL8op0A8tqRbqBZW1duoGhvrEpXcGwlWxLVzA0mjvSFQy7e9INDPsHVekKfQ6bLekKhvaRdAM/uJ/FGt2x9xX3s0ijOzn1v+N+FmV0rbNz/wH3sxijq3ca1An3swij65bJrwv3swiju7gkT7ifRRjd1TV9w/0st9HdJF36iPtZbqO7Tdr0Efez3EZ3l9zTR9zPchvdQ0L/5XE/y290j70n8ob7WYTRPdNfFu5nEUZX65An3M8ijO6l90pccD+LMrq3d/9viftZnNGVPj6977ifRRrd13dU/O/w+9l4EzRDu6T8jAZPMAzskvQzEjzBYu2S8TMCPMFj7ZLxMwI8EcDYJeNnBHgigLFLzs/84IkAfbtk/cwLngiS2iXrZ17wRJDULlk/84IngqR2yfmZHzwRJLVLzs/84IkQxi4ZPyPAEwGMXTJ+RoAnAhi7pP2MAk8EsHZJ+RkNnmD5tUvKz2jwBMfQLnE/G6vR6V44QPfCUXQvdNC90EX3QgfdC110L8yge6GL7oUZdC8MoXthH90LM+hemEH3wgy6F7roXuige6GL7oUOuhc66F44QPfCUXQvdNC90EX3QgfdC110L8yge6GL7oUZ/uVe+AN74lL4aCKPcQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.852,3.723;4.blob,1.1,1048.iVBORw0KGgoAAAANSUhEUgAAAGEAAAA4CAMAAADaWWauAAABCFBMVEUAAAAGDgYDBwMUMhQyfDIECQQxMTEYGBgnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBUCAgIBAQE4izgfTB8SEhI+Pj4rKys0gTQkWSQEBAQNDQ0JCQkzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAXFxcyejIeSx4KCgoFBQUTMBM4iTgKGQoRKREQKBASLRIJFgk0NDQREREcRhwwdjA6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0oKCgUFBQFCwUICAgJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCADAwMFDAUeSR5eLJNzAAABxUlEQVRYhbWXZ1fCMBSGCyoORINUrAoOHODAASoucOPCvf7/P9E2aRtPm/Ym6X2/NKcl73NO6En6GAZaUmm8bpq+/gHJGZlByQlDw9iEkewoMsHIjWETxkkKmZAnE4kRCnbMwO3JYlKEKcvOdOD+zGxShFLZzlzg/nwuKYIoC4vIhMrSMjJhhazqEcyC4BVyU62t6REyzhtkrQtnbGxKAYKEuvMGlbdEE7Z38pqEmOzWGnITpNPcQwY4bwJW9T69HFhWCwdweESv9ZYkAfpPN45P2OgUh1BpV90hEqGT9b5ikAhn595QkcB2I+HPLi51CVd0N7r+98zfAm9IR5fQpbtRiX/EnaK3pKlLCFsl7hS9I/e6hNBV8vNA/A+9BFeJy2PvSZcQl2f/CwaJUGxjE156r2xkdpF2vrd3dv5L795QQvrjkw7+zvEvKQI43z84vcLgGaPbLG+M0HjNYGNUdlGwMaq7KNQY1V0UaozqLgo1RtHXvXiG1ww0xgAh5qTgmoHGGCDEnBRcM9AY5VfJawYao8IqsWaoMcqvktsMNUZ1F4UaYwRBYKVuM9QYIwgCK2XNYGOMIIRbKWuGG6Oqi+IZI2v+BQg4NuQ+1u4BAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.779;4.blob,1.1,1536.iVBORw0KGgoAAAANSUhEUgAAALkAAAA5CAMAAABdw3q2AAABDlBMVEUAAAABAQECAgIJFgk0NDQ+Pj4REREGDgYDBwMcRhwwdjAKCgoUMhQyfDIECQQRKRE6jzoIFAgxMTEYGBgGBgYnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUFCwUoKCgUFBQ4izgfTB8JFwkQKBAICAgNDQ0EBAQSEhIrKys0gTQkWSQLHAsPJQ8JCQkzfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQw4ijgAAQAGEAYOIw4yejIeSx4iVSIucy4TMBM4iTgyezIgUCADAwMKGQoFDAUeSR4SLRJ4eDE8PBgXFxcFBQUNjjoEAAADLElEQVRogdWZaXPTMBCGlUKaQIBCOdrSg8NQjpY2hZabcrbc99n//0ew5Vha2zp2V7IY3g+Jp7EePZnRdPxmhUiR3tRUN+BD3WA1+XC/Px2ROhhOLo4cjUitpSKPpqOaHzt+Qr7PnDxFXDl7GnefJp9xmmN5KmfPFa9z8wvEddidADmy+fnFpfx1eXHovZO3EyBHNhcrF/KXi5eoy7A7AXJs88vZQIgrV6nLqp3y/3VFrLcBcmzz1eyauJ4tU5dVO93oy9y03AXJlbn8qj0Lz/KpMWvr4la2QXCu7bQ5ltmy3AXJE/Pb8qvesfAsnxqzvSPuZvdI1mAnz2mB5In5lvyq9y08y6fGPFgRD7MlijTcyXNaIDn2ORePHosnu0/Jy3CnBZJjm889ey7Eix3qMuxOgBzb/GX2Soj1eeoy7E6AHNt8YW9fiNe7b6jrkDtpcm8zsvnbd8Xr+w/7xHXYnRTZ85RLNv/4abV4G37+QlyI3UmRR+Px1wi8Kt/2ZsqL7z9oC/HpiLzxsxPsP8iA/LSbnmzunVVHip9oZFvvLDsSIsz2xeT9+l1d6Xao/yZTdiREmO2LyVOWoB02zMuOhAizfTF5yhK0w6a57EiIMNsXk6csQTtsmhcdCRPHTpZndje5xatRlCVoh03zoiNh4mhftmd2J7llXqNUlrAdtsy3cU+8jvZle2Z3klvmNUplCdthyzzvSARzU/uyNTwnGXdaYDtsmecdCRPHObedFicZd1pgO2yay46EiMPcclrcZNxpge2waS47EiLM9sXkKUvQDpvmsiMhwmxfTJ6yBO2waV52JH+47YvHU5agdzbMJx3JH2774vG0pe6ddXPVkbxhty8WT1vq3lk3764jRSN31zuTp/PZXOQknM1FTsrZXAiv9YySdDYXwjOYJ5zNhfAM5glncyE8k3ngbM4XNJluHjib8wRPppsHzuY8wZMZ5mGzOU/wZIZ52GzOEzyZYR42m/MET6abp5vNhfBM5oGzuclvCz3zlSb77nPxLOaBs7nZ8reFP+YrTfbd5+JZzANnc6Pyt4UD85Ume+9z8Mzm6WZzQby2+X8+m/sLR+CVfvLaKeMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492359122;4.copy,1.1,2.40,3.209,4.1160,2.19,2.14,1.1,2.20,3.209;4.copy,1.1,2.60,3.228,4.1140,2.95,2.14,1.1,2.40,3.228;4.copy,1.1,2.50,3.266,2.10,2.57,2.14,1.1,2.30,3.266;4.copy,1.1,2.40,3.285,2.10,2.38,2.14,1.1,2.20,3.285;4.copy,1.1,2.20,3.304,2.20,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,4.1090,3.475,3.110,2.38,2.14,1.1,4.1080,3.475;4.rect,1.1,4.1071,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.345,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.383,2.27,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.31,3.240;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAWCAMAAADKDS1SAAAAh1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29uBNDR5MTESBwdvLS32Y2P1Y2OUPDwkDw8PBgZpKirLUlL9ZmawR0c+GRkuExO3Skr/Z2dIHR0MBQVkKCjIUVH7ZWWoREQbCwstEhKbPz/zYmLxYWGNOTkeDAycPz/gWlpyLi4OBgYnEBAEAgIQtJ/aAAAAT0lEQVQImWNgYGBgZGQAAyZmFlYwg42dg4mBloCTixvC4OHl4xcAswSFhEVExSCi4hKSUkBKWkZWTl6BQVFJWUVVDchX19DUAstr66CZBwCwXAPiQxr6WAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.971,3.326;4.blob,1.1,8064.iVBORw0KGgoAAAANSUhEUgAAAMQAAAC4CAIAAAAzJNSGAAAABmJLR0QA/wD/AP+gvaeTAAAc2UlEQVR4nO2dfVBTV97Hb25ezCsJISSBhPAeQYOgiMQWxTfEomvViq5KYFdUnunWXafa4dmddrv7bKfzdMd9xtFa6z6d7m5EW99W1mdK7bBWq50CWjAqrRIkUCeJJiSSAiHvuc8ftBSSkOQm9+YF7mfuH8459/7OL/LLPSfn/M73AMAsg0ik19ebRaKq6LrRWFTUvW1bdH1AHDDaDkQah2O0v/+SWFwbXTdkYvEppTK6PiDOrAsmAACUSnl6+kYSKSFaDizicPJZrKbe3mg5gBKzMZg0mqt2uykrqzpaDtSKxde0Wo3ZHC0HUGI2BhMEuXp7T0erpyOA4I6cHPmM6+OA2RlMAAAolfKUlGUMRnrkm64UCmlE4kWVKvJNo80sDaZnz+4bjfdyc2WRb7pWLL7U3292OiPfNNrM0mACAECplIvFkQ4mJom0MSNjRvZxwGwOpkePziQkZHO5pZFstDory2i1XtVoItloxJi9wTQ29lStbo3wMLxWLD7z6JEbgiLZaMSYvcEEAIBSKc/O3g6CpMg0l8lglKWkzNQ+DpjlwTQw0IzHkyK2tFKTm6swGLqfPYtMc5FnVgeT02np6zuXm7szMs3N1OklDAwMDAwMDAwMDAwMDAwMHxQ1Fm3rRiYxl0gn1pvrRVWi8E0VNTZu6+4O345PZvU8E6qIZWLlKWRmlRyjjv5L/eJacfimxDKZ8tSp8O1gRA7OIs4+1z6agIaUQeFaYf1YPSkhrJUfzqJF+1wumkCAlFceYG8mVBDXirXXtGYNYom5mqsau8meVZ0Vnle12mvXzKjlLGDBhDwgAczZkaOUI7lyArmg3tO94fR0IIGQs2OHUi5H0CvPJtAzPWsRVgqJNKLq4pTEXByIw5Pxky+QCAZZO45SrkxZlsJIZ4TqVSWRRlNdvBja48FAQM/0rEVcK+6/1O80T0nMFVWJ1v3fusklA/8a+GzTZ8HUjvPs/jPjPWOuLLfrra6QvKrtv3TJieaWGBx6pmcnJCap9mntlY1X1K1qj3JmLnNyiW3INtw3HEztBAteXTCvYd7Hcz+G7xWz9unTKxs3qltb4T6LETXy9uTVqGtwICrfUiqfus+5j1vKhe/Vnhq1GgeiO6rBxkwII64VPzrzCHKjkpg79nRM3aoOYRgurq19dOYM5Haj4RUpIYGUELXt0TMWRiajwd3AlrDRayJnR06doQ4kwXgLMDIzG9xutkSChj8EGq3OYPjl0BCJxcLeTEiSW5NrUBiedaOYmDvQPIAn4WEtreTW1BgUimforKJATqd1cNBiMLgdDjTsz162fbut4EAB2q2Uf1Beca4i+Pu3ffttwYED6PmDgYGBgYGBgYEBA3y0HZhF8KlUCIIc6Ez2xALY1EDkKOPzv9y0iUmK0G70+KayMu3NNxdH24uYRr5y5aXKymh7gRZIvpmkUl57uw5BgzOPg21ta4XCF9LSou0IKiAWTCIRPSWF2tGhR8rgjGTQav3o0aNDhYXRdgQVEAsmqZTX02MymWxIGYx9JBL2/v1TFrxKS0u/+OILi8Wi0+mOHTtGp9O9n7qgUq0SCHgUSqTcnIKoqqqqpQUl48gkx4EgbskS7oULM1D00xsQxJWUJFdWpgkEtP7+kYnyuXPnXrt27caNG5s3b05NTT18+HBWVtb69es9Hv9KpwMAoDw19VxfHzL+EIk4vOevcrfdPjlHACQQsrdvL2psZBcU6Ds6EGnXG2SCaf78RBIJvHPHgIi1mIVIBMvK+BUVQiaT1NlpaGrqVal+yl/705/+pFarN2zY4HQ6AQDQaDRXrlxZuXLltWvXJhsZttt1Fks+i4WUVyv+9rfcXbs8Clurq1UXLgAAQKBQ8urrFxw8SE1JUZ0/f6OhQdfWhlTTHiATTFIpT6Ew2mwuRKzFLHV1c4uLOS0tjz//XGs2ey6SV1VVHTlyxPmjjO5nn31mMBjWr1/vEUwAAAzZbFzkurnbb7xx/8gRj8LhH1975R9+mLV165233+4+etRqNCLVqE8QCCYKhVBYmHT8+Dfhm4pxvv5an55OX7NGSKcTb958olb/lE9NoVBoNNrTp08n36/Vajkcjrcdp9tN9uqYQsasVo89eeJR6Lbbx//Rd/ZscnFxwYEDZA7nwcmTxnv3kGrXGwSCqbiYYzY7Hj4cCt9UjKNQGO/eNS5cyFm3Lm3FilSVavj6de34D1iLxTI2Nsbn8yffn5qa+u9//9vbDo1IHLRakfLKfzc30Nz83eXLmVu2FDU2zn/5ZV1b2zfvvdfb1IRU6whz6FDhSy+FtTkwHsnLYx04UHD06PMTJRcvXlQqlQTCD9/PyspKCILWrFnj8SAeh7Pt3fsKcnmPjMzM5MWLPa45iYnedwpWr97Q2rp7ZMS7KibgcMjvv788NRWxfdDxhWDSBvD8/HyLxfLpp59WVlbW1dUZjcYrV654PyJhs6GGhoW+ur/IwC5APX0vRNavF73++qJoexErPPfcc19++aXFYhkcHDxx4kSCrzT73xQUaGUyEIdtMvPiD39YvHo1WkIIM5Kvt2x5YxH29cMIm00ZGZqamgQscQAjTPITE7UyWYVQGG1HMOKfVQLBehEC6m8YGBgYGBgYsU5lWuWbi99ExNQc/JxjZcckbAQmghsbi7oR0rUNBwQ1cf0DS8eXSKfXm82iKtRPrqpMS4OXHCflSdt17Yi0bXPZ7hjuLOUtDd+UTCY+hZCubTggqInrH1g6vo7R0f5Ll8S1qJ/RKOXxYASTiC5KoaZ06BFLrWrXtRcmFZLx5HCMLFrEyc9nNTX1IuVVOCjlyvSN6WFq4vqHs4jDymf1wvm8Srk8feNGVFVvRHR6CpUKI5ikPGmPqcdkMyHlwUPTwzHnWHFycThGamvF165pNcjp2oYDIpq4/glBx1dz9ardZMqqrkbPKymP12MyBRtMIA5cwl3SpkMySc8NuTv0HeH0dAQCuGNHjhxRXdtwCF8T1z+h6fhCLlfv6dPo9XQgDreEy23T6YINpvmJ80kg6Y7hzuRCHIAjgsTJFx6HD7J2nHZdew4zJ4mcFNrHqKwU0mjEixdjKPc8TE1c//jU8Q3OK3nKsmWM9HQ0vJqfmEgCwTsGQ7DJcVKeVGFU2FxTNp8UsAt+JfnV5JK7xrvvffNeMLXjaMwajVlTyi1teRzKlonaWvGlS/3mqbq20SVMTVz/+NTxDc6r+8Z793Jlsq633kLcKymPpzAaba7gkrYpBMq7Ze/mJ+Z7l6cz0idfyZTkIGsnWCNc818l/xXCZ2AySRbLnoqKmFvqWvDqgp/3/BxxsyQmaY9ljzDUz7vg1Vd/3tODrEsAAFAIhHfLyvJ95eL5poxf9k7pOzh0dJ4TSAknlp3IZGTCfXDPnjy1ugZER9c2HELWxPVPmDq+VD5/n9PJLS1F1qsyPv+d0tJxn4IaM0l50luDtyAAFQXZYfvwg6EHUp4U7oO1teIzZx650dG1DYeQNXH9E6aO79jTp+rWVsSH4VIe79bg4LhPgYOJQ+bkMHOQ/R3nQZu+rSS5hICDsbshM5NRVpYSO7/jPFDKldnbs2Fp4vqHkclIKUsJ8zwWpVyevX07iFw2FYdMzmEy23Q/CEwE/rSl3FL1qFpr1iLlgTcKgwIP4mEtrdTU5CoUhm40dW3DwVsTFySBHqej4Ml4HB4XTC2AkI7vQHMznkRCcGmllMtVj45qfzxCI/DLoIRbcvPJTaSa94nD7egc7FzCXaIwKoJ8ZMeOnL/+9QGqXoWD0+LsO9eXuzN3oHlgvOTFGy96j6Ku//J6z997AtYCAJCzI+dB2J/XabH0nTuXu3PnQHNzmKbGKeFyb07ashdzo9eZCiuPRaQTPQpH+kesRmvAWgwMDAwMDIyoE658ApXKhyDI7cbOzcAIWzmOzy/btOlLEokZ+FYMjICsXCmvrLwUbS9inYilz0aYjIwMCIIEAgGAiKZlW9tBoXBtWtoL4ZuawUQsfTYqWJFTCALKyz/YsOEqYuZmKMK1a+vHxmbYoZFZWVkQBBGJRMD7zVRVJWppmfIqDkZBVqW6IBCsolB46DntB2+fY5MIpM+iClsikezf71GIw+GsVqvD4QAmgolAAHftyr13r/qTT15gs+dM3DquIGuxWDZv3vzb3/52165dZ8+e9W5Gp/sKAIDU1HKk/CYSQTIZ73F5ZJtM53PMgnb6LErgQJBbWlr8+99L9u8n0jyFuPr6+igT+pwUCuGVVyT9/Tut1j2nTq1aunTK2+XcuXPeamgrV670brK29mlxMTJb6gAAaGpaBUENHtfWrVnB+BzLsAsKGtxulNJnEQckElNXrlzy9ttlx4/n7d6dkBVoo8RHH612OPb+8Y+Lk5J8bDkaHR19a2qi5+Dg4OHDh73v3L79QVnZ8TA8n0JmJsNLWS85MXFOMD7HOFsVikWvvx5tL4Iif8+eZSdOpP/sZ94vJJ8Qzp7tKy5OPnCggMMhnzz54N69n9R9YSnIut1OfHg74CajVpufPBnzKLTbf1BJ9+Nz7KOUy+c1NKCRi404+q+/pqenC9esIdLpT27eNKvVgZ8BQdzWrVm3b2+BoIavvtpUU5M7UWU2m73fTH/5y1+8jezcqSot/e+w/f8B/92cf59jHJTSZ9ECh+MsWrTwd79bfvJkUWMjDLdXrxa0tm4YGdk9URKkgiwOh9+71yaRvIKE+wAQqJvz73PsU/Xpp2XHERsSRAZWXl7BgQPPHz0K77GCAvbEv4NUkGWzJQ0NEIezMEyPQ2ayz7FPzo4ddQYDgumzEYMmCE+/NBgF2YKC38hkWhwOO1czKAgUyu7h4YxNm6LtSEyyZcvXixa9EW0v4onyDz6oOHcu2l7EHhkZm2pqNCTSjFolwIgCiYn5MplWKKyItiMY8Y9AsEok8jyfDwMDAwMDAwNjdoGgJq5/YOn40ulEs7m+Cn1d28q0tDcXL0a7lThlDh5/rKxMwv5pujjANCOCmrj+gaXjOzrquHSpvxZ9XVspj9f+oyoDhgc2l+uOwbCU91P+T+A5a0Q0cf0Tgo6vXK7cuDE9AU1d23EF2Q69Hr0m4p12na4wKWnivOHAwYSIJq5/QtDxvXpVYzLZq9HUtR1XkDXZbIFvna08NJnGnM7i5B8EAQMHU/iauP4JTcfX5YJOn+5Fr6ebUJBFyf7MwA1BHXr9RE8X1NJsmJq4/vGp4xsMcrly2bKUdHR0bScUZNEwPpNo1+lymMwkMhkIMpgmNHHR8Manjm8w3L//7N49o0yGSlocPAXZWYzGbNaYzaVcLhD8Jsw2XVsIspMBoRAohUmFIWscyuVKmQz5no5CIBQmJWF9XJC06XRSHg8IPphu6W8lk5ND0MT1TzGn2OwwPxx6GNrjZ848ys5OKEVa17aYwzE7HA+HhpA1O1O5pdcnk8mZDEawwRSyJq5/wtTxffp0rLVVjfgwfLKCLEZAhu32B0ND8E51CkET1z+I6PjK5crt27NJyOnaeijIYgRDm15fkpwM42/grYlLwBE8TkchgkTwx+Rd/7UAQjq+zc0DJBIewaUVDwVZjGBQGAx4EITxmvHWxD1UdMh7FPWPnn98pfsqYC2AkI6vxeI8d65v587c5h91bcPEQ0EWIxgcbnfn4GBYart8Kn8O3nP7kcFqMDvMAWsxMDAwMDAwMDAwMDAwokXE0mfRI60ybfGbwSbm4ufgy46VsSXxpGsQScKaOI5Y+ix68KQ8XXuwk90um8twx8CLH6G6CBPuKkQE0mfRgy6iU1Oo+g4Yibm6dl1SYRKeHO7JDjOScIMpAumz6MGT8kw9JpsJRiqV6aHJOeZMLvZxcjVGuMGEdvoseuBAHHcJV9cGb0EXckP6Dj3W0/kEgcV2VNNn0SNxfiJIAg13YCfm6tp1zBwmOQ61WdEGgWBCNX0WPXhSnlFhdNlgJ+aaNWazxoz4SfMzAGTSgFBKn0UPAoWQVJgEt4+bQNem40mxns4TZIIJpfRZ9OAUcxxmx9DDEBNz9bf05GQyIzPOena0QSaYUEqfRQ+elDd4azDUbGHAPmwfejCEvZw8QCzbFfH0WfQgc8jMHGbIfdw4+jZ9ckkyjoAdv/4TiP3tEU+fRQ9uKXdUPWrWhpWjZ1AYQDyILa1MBrFgmkifRcogenBLYE8veeN2uAc7B7lL4maYiIGBgYGBgYGBERNgqRSejB+1AEGY/gls4mBaKMIkJOQUFr5GIFAC34oxlZkQTEWNRdu6t8F6JCMjA4Igga8DrwyGLrNZM3fuL5BxDgXSKisXv4nYccgIMhOCSSwTK08pQ3jQarX6LFepLiQmzmOjL1gdGjypVNcerDJxJIn7YOIs4rDyWb1NvbCeAkEQAIDh4WGftQ7HiF5/OzZPF6KLRNSUFH0HDGXiiBH3wSSuFWuvac2aaddG2BKJZP9+j0IcDme1Wh0Ox3RPGQydLFYeeueeSdiS/RJPr4KBJ5WaenpsJhjKxBEDMbGlqAASwJwdOe2v+Xjn40AwuaQkrbKSJhCM9Pd71Pb19VEo/obY33/fBwAAkykeHPw6SGfwODzodRao0+2cLGUG4sCS5JLKtEoBTdA/4ulVQHAgyF2yRHXhAtwHI0N8B5OwUkikEVUXVZMLQSKRX1YmrKggMZmGzs7epqZhlWo6C9Phclnt9mEqlR/8I3Vz67w1ZE9+e7LL0AUAABEklvHLKoQVTBKz09DZ1NukGobtVeL8+SCJZLgDW5k4MsR3MIlrxf2X+p1m5+TCuXV1nOLixy0t2s8/d4Sh2eV0jhGJMNLfLg9cvqq56lE4aBkc/0fd3LpiTnHL45bPtZ+HLCrEk0qNCoUrVnXu43jSksQklf9vecd/dgyrpoyjIbebkZGRmJ9PoNFsJpNjmlF2QFJSyh2OYaPxbpD321y2UcfoiGNk8mV32cdr3ZA7g5GRn5hPI9BMNtOwA7ZXBApFLJP1//Of1lhVJ4/jN1NWdZbVaNVc1XiUGxUK4927nIUL09atS12xYlil0l6/HsLPHzye5HCMBn+//25OYVTcNd5dyFm4Lm3ditQVqmHVde11WMfFcIqLHWbz0MMQlYkjQBwHk7hW/OjMI8jtK/cWggxdXYauLlZeXtq6dbm7dsENJhwOnDOHZbPBSBL3380BAAABUJehq8vQlcfKW5e2blfuLljBxJNKB2/dAqBpc41JCQkAANineRP7r53VMDIZDe6GIBMdab5mugM8QktdvvwknZ4G37VgEdA8vVp6+HADBOHJPnbkkTmc5e+/T0tNnc4agUarMxh+OTREYrHg1iJFvL6ZcmtyDQrDs+5nwdxs1nh2hQFhsfLt9u9HR9WTC3EEHA7nmfQNuSDfb8dAaMyeXuEIBACCIKfT+2ZuaemoWm3WTqtMDDmd1sFBHIHg9jV55r8WKeI1mHJ25Dz46wP07PN4pVrtF8DU/StFh4q8tzf1/KNH9xUyouE0odCkVLp9BlNJyZOb/pSJXTbb2fz80GoxUCQpqUgqfQfvdV4jlU9lpDM8LiKNiEijJCZz98iI5Ne/RsQaRkxApaZIpX9OTIz09xgkELK2bgW8ulGMOIbFymOzC6LtBQbG7CaOZ8D9MD6nAsXV0YNUPhWCILfDHW1HQifuU1B8kpCTU/jaawS/eQGxBr+Mv+nLTSRmXAo6jhPHweQv9bary6zRzP3FL7yrEFTMhaXUO44fn1UXVMb7xpV/Xxm+Y3ARVVXttdmytm4N004cB9M406beXriQOG8eW+KZeougYi4spd7JTOdz28E24Vph2gsoTrv75HFLS+u2bc8dOULhhfXfEsfBFCD1dmREf/u2sMJH6i0iirkhKPUCgXy2DlofffSo8FBhOI6FxsC//tUkFFrCO7IxPoJJwmbv93rHBE697exk5eWND8Yng4hibkClXlFVVVVLC1yfVRdUglUCCi+eRnvjiKpEMR1MIA5XyuX+vrh4v0RCI3pONAdOve3rAwCAKfaUIAtfMdePUi9IIOTu2lV9794Ln3wyh+05;4.blob,1.1,1884.Mgvo8/jKTGr5tAu6kQQkgngy3uPCgVOmVUECmLsrt/pe9QufvBCja3NEECzj8yuEQiaJ1GkwNPX2quDnTrisVvvwMJXvI/VW164TVgjJSWSr0ffwxT8+lXoJFEpeff2CgwepKSmq8+dvNDTo2mAfP2wftlt0FlY+imv7wbPibytyd3lqJLVWt6ouqAAAIFAIefV5Cw4uoKZQVedVNxpuxGgw1c2dW8zhtDx+/LlWaw5jods5NkZk+Ei9nVDMfdzyOASzPpV6yz/8MGvr1jtvv9199KjVaAzRYwCwDdko3Jjo5m6/cfv+kfsehcN9P3yryz8sz9qadeftO91Hu8e/kzE6aemGoAwGIz8xkUYgmGy24VDjKaW83DE8bLzrI/UWT8Lzn+drr8E+bppAIYhl4v5/9lsNU95qkMvFLSkRrFlDTkoyq9UhD2bn/cc8i87y3eXvQnscQZxmp9Vgtegtky/nmHM8lwJyQdwSrmCNgJxENqvNFp0lRt9MCqPxrtG4kMNZl5a2IjVVNTx8Xavt0MP76QQAAJ5Ecoz6Tr3V39JnvpTJyGSM9I/AsjmdUu9Ac/N3ly9nbtlS1Ng4/+WXdW1t37z3Xm9TE1yfiTSidTCUzhdx/HdzA80D313+LnNLZlFj0fyX54cvxhcJ8lisAwUFR59/Hu6DOBBcdvx46spppwElv5bk7MiBa7bwUGHWSwHOihGsXr2htXX3CLwwBQAAh8ftte2VvBITO9MZmYzkxcke15xEz0O8AQAQrBZsaN0QeQ9DRECjwX2Elpq6/ORJetq0c4DcEu7S/1kKSzGXzCEvf385LTUoZ9gFsLMP2BJ2A9TAWciB+2AsENNTA5PRwN8Bx8rPt3///ahaPd0N3oq5OAIOJIIe1+Qfw7CUep/d9xy9BkSwWjD2ZMx4N/TxexSJ0TETIvBKS7VffOFnO8eEYq5R8cMfL2BiLreE++TmE5QcBgAgV5b7zYlvQksqx0CLpKIi6Tvv+Nzp4QdUE3MDkrEpo0ZTQ4rPkyBnLNSUFOmf/5wYVyn0ifmJMq1MWCGMtiMYU2Hl5YUw+I0uglUC0fo4ON8BAwMDAwMDI26Yg59zrOyYxK+AqUhUtXevLSsLXioqnU40m+unO5vKf20w+E+Qna6WSKTX15tFoirELQdTO/PZnbd7b/5e//dkZLxYU6OmUODlLTU1rfr44zWh1QZDxosv1qjV0yXITle7alXTmjUfo2E5mNoZzrzEee+WvUv22sEdPmvXCsfG6hOmmezxX4seQuHa+vox9ARbESFullM8eGh6OOYcK04uRtzy1asak8leXe17Kdd/LXpoNFftdlNWVnWE24VFvAaTG3J36DuW8pYibtnlgk6f7p3uvGH/tegBQa7e3tNicW2E250tCGiC95e/n0ROQtxyQQHb7W5IT/etjuq/Fj3Y7IKGBjeDkR7hdoMnRjMtg2HEMbKQsxDEgb3fwzueICB6vWXz5kwiEbxxw8earv9a9LBY9JmZm0GQ+OTJjUi2Gzzx2s2N06Zrk/KkaFiWy5Uy2bR9mf9a9FAq5WKxLPLtzgoSSAknlp3IZGQibpnPpzqd+0pLfZ/n7L8WPahU/r59Tq6Xpm+MEMfdHAAANpctOyGbTWZ3P+tG1vLoqGPpUp5IRG/xtX3Ffy16OByjPN5SOl30+LHn9s5YIL67OQAA2vRtJcklBBzyWX5yuXL79mwSyfd/kf9a9FAq5dnZ20EwFnOe4j6YFAYFHsT7X1oJjebmARIJP93iif9a9BgYaMbjSf6XVqJFfHdzAAC4ITeXwk1npHcaOpG17HS6s7MTFi/mnj/v48Qc/7Xo4XY7ExKyudzFKtX5SLYbDP8PLmrv+pMn0SAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.345;4.blob,1.1,3696.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.440;4.blob,1.1,2944.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.630;4.blob,1.1,656.iVBORw0KGgoAAAANSUhEUgAAAKUAAAAqCAMAAADlE2vlAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYCBgIBAwEDBwNX11dY21hRyFEnYCcQKBAXOBdi82IsbCxMvUweSh5l+WVf619Is0ggTyBc5FwJFwkXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj6CaiZmAAABDklEQVRYhe3Zxw6DMAwGYJe20L33pHvP93+4SuECxAqJME0r+Tv9khUTKbmYAHxFzslLCauq12Yt5xSkhFXVa7NWdFwpYVX12qx5JTlhVfXa3+CWhQpt14po6iYmXVVHqNHusi6aNhKTrmZLaNPusiOaeolJVzYnTs34xLtdvZSG1CVy4hrf6PUHQ52UhrpLtDoK7sI4nAAm01kvqKtTGuou0eo8uAuLcPo9y+AuFMKJMcbSM58tbDCfLWwwny1sMJ8tGGN/AJsUaCYUQtgcQTOhUMLmCJoJhTHG/g3yHuGvYL2JV7c74t+pRpD3CH8P60O8CsfT+ctbC0HeIy5XuN3jVbuQ94jHE17veNXAB1dWEzM9dLbfAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492359225;4.copy,1.1,2.50,3.209,4.1150,2.38,2.14,1.1,2.40,3.209;4.copy,1.1,2.60,3.266,4.1140,2.57,2.14,1.1,2.40,3.266;4.copy,1.1,2.50,3.285,2.10,2.38,2.14,1.1,2.30,3.285;4.copy,1.1,2.20,3.304,2.30,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,4.1040,3.456,3.160,2.19,2.14,1.1,4.1030,3.456;4.copy,1.1,4.1050,3.475,3.150,2.38,2.14,1.1,4.1040,3.475;4.rect,1.1,2.11,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.345,2.35,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.980,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.212;4.blob,1.1,1696.iVBORw0KGgoAAAANSUhEUgAAADAAAABZCAMAAABPJ1cnAAACW1BMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUGDg4kJFlfX+wCAgYECwtf7Oxh7+8GEBAEBAliYvIgIFADBwdX19dY29s/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQWrRUWwR0cjIyP39/eBNDR5MTESBwcCBQUDCAgBAgLqX192MDBvLS32Y2OUPDxCpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkNISEVNDQHEREnEBBCGxsuExO3SkpIHR1kKCjIUVH7ZWWoREQbCwscCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAwGAgL6ZWVlKSmcPz/gWlpyLi4OBgbGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlY6882CAAACVklEQVRYhWNgwAIYmZixCeMBLKwkamBj5yBNAycXN4lW8PCSqIGPX4BEHYJCJGoQFiFRg6iYOIk6JCShDCkp4jRIy8iCaTl5BUWiNCgpq4BpVTV1OeKs0NAkTt0oIAJoaaNwdXT1CGjQ1kLl6xvgV29oZIwqYGJqhleDuQWagKWVNT71lja26EJ29vg08DnooAs5Gjnh0WCgjynmjKdQUzJ1wRR0dcOtwd3DE1OQw8sbpwZ7O2yiPtK41Psa+WET9g8IxKEhCHtZFBwSikNDWDh28YhIXG4adiCKRPXRMaSpj42LhzASEpOIUZ+cksoA05BGjIb0jEwoKysxmxgNObkwVl4+hC4oLIIwikvAoBRVQ1k5uhEVlRlV4ICrrgGDWhTZuvp0DEsbGpuac1sYGFrbwKAdRbKjvhObQ7u663uwO6mrvgVTeWZvX/+EididNKl+MrryKVOnTZ8xkwGHk2bNnoOuYe68+QuwORMKFi5CF+lYjKEoMBgMLEHsJUvxmAYDy5aDwQoQe+XsVYQ1iAqAwWowZ8aatUTYgQTWrd9AmgaGjZtI1DAoAM4aE61mRQBcNSZ6zQoHOGpMjJoVDnDUmBg1KwJgrTGx1KxwgLXGxFKzIgC2GhNbzQoHWGpMrDUrHGCpMbHWrAiAWWNir1nhAKPGxFGzwgGkxkTKrDhqVgQA15hImRVXzYoKUDLrKMAHNm8hUcOWzaSp39o8kTQN27aTpn7xjp2kadi1ex1pGvbsJU19w779pGnoPXCQNA2HDpOmPv7IUdI0HDtOmnqGE6k4pQB4lY+8zaDLigAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1032,3.250;4.blob,1.1,344.iVBORw0KGgoAAAANSUhEUgAAAA8AAAANCAMAAABBwMRzAAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAATElEQVQImVXHRxaAIABDwYC9Ith7vf8ZFd2YLPLfAM+EtA/H9d5Ciq9+ENpEcYL/0oyYq4KsTUmuamLTduR+GMnTTFzWjbwfRJwX8QbfWAKeXFlx+AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.326;4.blob,1.1,8064.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;4.blob,1.1,2224.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.345;4.blob,1.1,3336.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.421;4.blob,1.1,1108.iVBORw0KGgoAAAANSUhEUgAAAQAAAABaCAMAAABgznhxAAABF1BMVEUAAAAwdzBW1FYdHUc0NH8UMhRm/WYLGwsMDB4+PpgHBxA6kDpMvEwjI1YuLnECBAJe6V4mXiYBAQI5OYwXFzgeSx5j9GMECwQSEi07O5IDAwdEqURCo0IpKWUoKGIGDwZk92QcRRwEBAk8PJQRESkoZChc5FwBAgEYGDw3N4kAAAFOwk44ijgvL3QiIlMNIQ1n/mcSLBIICBQLCxoCBgIDCAMBAwEyfTJTzlMeHksyMnxRyFFn/2cnYCdW1lYtcC00NIAbG0MQKBAVNBUIEwgeSh5l+WUiVCIgTyAJFwkCBQIfTB9HsEcOIw4GDgZf7F9h72EGEAYDBwNX11dY21gICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzXSGvzsAAAB40lEQVR4nO3bxXLDQAwG4FAhZU45xaTMzMxNMSm+/3N0xjOdXlLPypYse/1/J1201p7W/m0nEuGQTFE70hmJOdSkktSOTFpiDi01tXXEjvpsg8gkShqbqB3NLRJzaGltayd2dHR2iUyipLsnR+zo7esXmUTJwCC1Y2hYYg4t+ZFRYsfY+ITIJEomC0Vix9T0jMgkSmbnqB3zCxJzaFlcWiZ2rGRX2a6+tu7YqF4FYnOL2rG9w3f13T3HfvUqEAeH1I6jY76rn5w6zqpXAAAQb+cXl8TKNleFa2IFADFWdJ6jbgiVZW6d56g7QmWZvPMcdU+oQF2pFJ4JTCtOuYfHJ4l1vUxgWrF6fnmlvpYQm8CsUgvvwkItvAsLhHcAABKiHWtxTB/tWCva0wMAE2vDNlPWhm2mELaxcA+fymWOa/Cs4s5riOYePlXe3j+8rcu/ijvPIZp7TPb59V3xOBH7Ku704z4AAADQF+24j4PnwEz/5bku/ZfnynA3DQDx5ucY9BN6yQVmtB35OQb9hF5ygRlxR36OQT+hl1xghoMdAAAAwJDNkZjJ3myOxIz2ZvOds817AwAupscgPcIK4isxd5zHID3CCuIrMXesxyA9wgriK7Ff1X+wjNExGNMfLP/8/4PlDwMakBEUBnkxAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.514;4.blob,1.1,2392.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.630;4.blob,1.1,720.iVBORw0KGgoAAAANSUhEUgAAAMMAAAAqCAMAAAA56h/SAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYCBgIBAwEDBwNX11dY21hRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwl+vY61AAABPklEQVRoge2Z204CMRCGhwUXAUURUFE5iCgHxdP7PxxJS9Iah7azdFou5rv6k2Z3vou5+TMAUCvqkBdjgLm4/fRrrWhwiBEwBpiL20+/nhUlhxgBY4C5uP30a/Ocw4uCMcBc3H757SmULUU75cy2Gll6UyidQnHBY4tzqUZ2vSmUq2tFj8cW50aNbHpTKDl2KTaRd6nfD0txZuz5s0tHzxgMb+9CUpwZlNd7vW8jXwJ4eHwa6G/c6Rjcfzn0Otb7NvGlU2aq963hS4IgCMzMnmH+klviP6RWOlvA/JVZqAKkVvq2hNWaWagCpFa6eYePLbNQBeitVBAEgQWsY8bptsnAOmacbpsOrGPG6baCIAjCaYPcQK02bF4/v5IeS0ggN1CrDVtt8/vnN7FaMMgN1GrD+W+0ISA3UKsNV2qbO6i0GBsGjvGyAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1131,3.658;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAEIAAABQCAMAAACalFNKAAACHFBMVEUAAAAODgYLCwTs7F/v72EQEAYHBwPX11fb21h3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6Kijg5jDln/2cDCAMhIQ3+/mcsLBIBAQECAgI6kDpn/mcCBAJ9fTLOzlMxMTE+Pj4XFxdFrEVX2FfW1lZwcC0KCgoNDQ0FBQUGDwZi82IsbiwiVCIAAQAGDgY3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAYnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21iqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5NTR9JSR1DQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxI8PBh4eDGXlz1lZSkQEAddXSaSkjuRkTtVVSISEgeGhjZERBwICAMXFwkNIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDtTIlN0L3QoKCgUFBQbCxuYPpgTCBMICAh9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbfeLVBAAAB7ElEQVRYhWNgoAwwMlJoAAMTMwsrhUawsXMwUeqMUTCMACcXnEWuEVxwnVz4lOEB3Dy8cBaZRvDxY7JIAwKCQhgsEoGwCBMGi0QgKobJIg2IS0hisEgEUtIyGCwSgawcJgsPkFdQRGcpKaswILNU1cBAFZcR6hqa6CwtbZgkhKWjCwZ6uIzQN8BgGRoxoLCMTcDAFIcJZuYWGCwSgaalFQZrFAxRYG1NKgsMbGzt7B0cwUwnZxdXBpJYYODm7uHp5e0DZvv6+TsxkMQCg4DAIAaG4JBQIr2KDYSFg8iISPJNiAqJBlExsRS4Ig7iingKjEiAhEUimENepCbZJQenpHqA2WRGKkNaul1ERiaYSWakjoJRQDtAes4AsbKyEY0l0nMGmJWTm5dfADWC9JwBYRUWFZeUlpHqZXRQXlFZRZEBbNU1tXX1FBjA29DY1NxCkRuEWtva4RzyIrUDqeFIZqQiA3IjdRSMFNCp0IXG6u7phYpgY2E1og+d1T8BJomNhQkmKkxCZ02eMpUBNwsTTJuOwZoxcxYOFrRXhNtBcDB7Dg7WXEivaB5hI+YvWIidtQjSKwoiwhmLl2BnEe8RhqXLsLOI9wjD8hUrsbJI8AjDqtX4WESBNWvXYWGRZMT6DRuxsEgygmHTZiwsAPX0umdKCog7AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492359332;4.copy,1.1,2.50,3.209,4.1150,2.19,2.14,1.1,2.30,3.209;4.copy,1.1,2.60,3.228,4.1140,2.19,2.14,1.1,2.40,3.228;4.copy,1.1,2.50,3.266,4.1150,2.38,2.14,1.1,2.40,3.266;4.copy,1.1,2.40,3.285,2.10,2.19,2.14,1.1,2.30,3.285;4.copy,1.1,3.220,3.342,3.980,2.19,2.14,1.1,3.210,3.342;4.copy,1.1,4.1070,3.475,3.130,2.38,2.14,1.1,4.1050,3.475;4.rect,1.1,4.1032,3.250,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.307,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.307,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.326,2.85,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.960,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.459,2.24,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.468,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.630,2.17,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.33,3.202;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1011,3.250;4.blob,1.1,2024.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1021,3.316;4.blob,1.1,824.iVBORw0KGgoAAAANSUhEUgAAAJIAAAAXCAMAAADX2ObXAAABKVBMVEUAAAAvdHQiU1NuLCxZJCQGDg4IFBQ+mJgLGho1FhaOOTkEAQEECwtf7Oxh7+8GEBABBAQCBQUBAgIeS0syfHwFAgKROzswExMDBwdX19dY29sxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkp3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl4SEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgkJFlfX+wCAgYhDQ3+Z2csEhIEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZwLS09mdzNAAAA+klEQVRIie3OR1MCQRCG4VFEUECSARAFkbALJjKCSlKRnFHM8P9/BMVSBX0YDk1N3/Y5Te32V/UyxrW1zfuq2eFfC6TVrvmxq9PzPu/tGwhr5oymAzOzWBU2Bl7MfsgdHB2fECc5nC4jO3Urzhh4sXMPf+G9IE5S+C4VfvhSqVRUAsHQJjNJFh0ChCObrGRJdAdwdX2DH93eRcWXLMXiCfwomRIfAqQz6Ml91iu+A8g9PGInT/kCQQhQLGEX5WeKDuDlFTmovFVJQlZq9QZu0Gy1aUpWOl3cfa9P0wEMhiPM+fvHmKpk6fPrG3P+80sVAvz9Y64nU6KMhRlPXBeG1z5zBAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.345;4.blob,1.1,3772.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.362;4.blob,1.1,8064.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;4.blob,1.1,152.EFZH26vV7Xl5uyAothNFCe80KrOKABFCLyksPlgdbT8y0kkgkEMvKURPYndPAAD4YB+fys9iZvWZ+7C25Xu8Xl9eXsqqVfyTJ1E77CMcfD5vSkoen79KozkZu1b+H0dknxFJXQS8AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.421;4.blob,1.1,1316.iVBORw0KGgoAAAANSUhEUgAAAR0AAABbCAMAAAB5wqGMAAABTVBMVEUAAAAwdzBW1FYdHUc0NH8UMhRm/WYLGwsMDB4+PpgHBxA6kDpMvEwjI1YuLnECBAJe6V4mXiYBAQI5OYwXFzgeSx5j9GMECwQSEi07O5IDAwdEqURCo0IpKWUoKGIGDwZk92QcRRwEBAk8PJQRESkoZChc5FwBAgEYGDw3N4kAAAFOwk44ijgvL3QiIlMNIQ1n/mcSLBIICBQLCxoDCAMBAwECBgIyfTJTzlMeHksyMnxn/2cnYCdRyFFW1lYtcC00NIAbG0MVNBUIEwgQKBAXOBdi82IsbCxMvUweSh5l+WUiVCJf619Is0ggTyAJFwkXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4CBQIfTB9HsEcOIw4GDgZf7F9h72EGEAYDBwNX11dY21gICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzU5jDlFrEVX2FcAAQBsSKYXAAACSUlEQVR4nO3b11MUQRAG8CGLCIcCghIOA1kliOSgRAkGoiIoUcHE//9I1V5dUXUFU7M9PbM9W9/vqV96tudpdr7bU0qYomJ6b0kp3xwyFRfRe0tL+OYQqay8gtx7p/Iu4yQSVd2j91bX8M0hUqb2Prn3QV094yQSNTxsJPc2PXrMOIlEzS303tY2vjlEyrY/Ifc+ffaccRKJOjq7yL3dPb2Mk0jU94Le+/IV3xwi9Q8MknuHKl8zTpI3HHmj1Ejsit3oGL13fIJvjmuTkSmlpmNX7GZm6b1v3/HNcW0uMq/UQuwKAADAq8Ultfy+oDK2sroWswrM4rpa/lBQmfvY+SlmFZbPG2pzq6CCvO0dtfuloAIg6oqumV+drmxaybMXXTO/OV3ZtJInG10z952ubFpBwA4O5ExgWnnT+P3HofeH3jKBaeXP0fEJ/fc35gnMKi8Zb7C8ZLzBQsYLAADBpp8R59OHmn7mhD09AARMciabPMmZbPKQySZMn1GennI8g2cVPSdZqz6jPPv569z+GTyr6LnJWvVp6sXvP2f2z+BZRS/5VBgAAADAl7BTYefc5KrJf78iWPLfr0iGmwoAgCg2J7pNNuouV2V8R7E50W2yUXe5Kuc7is2JbpONustV8Y4CAAAAAEzSnJxa7y3Nyan93tJ8K0nz3gAgtUxPvfhJp49vTvWivf2dHCYvYHrqxU86fXxzqpfbW9VAhryC6akXP+n08c1p3s3/6s/t7d9/X1NIpflXf3Zp0/s4wmj+1Z9Zu/Q+TjCuAOauvZTTUcTWAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.3,3.514;4.blob,1.1,2544.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAAakAAABxCAMAAABY6KyfAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAADyUlEQVR4nO2b11YVQRREUVGiacSEilkxopgDxv//J68X5eXOzGruqdNdBbU/oKdWPc4+tbDQkBMtPy4BSUMnT7VOwA5JQ4unz7SOQA5JQ0vLK60jkMPS0OraeusI5LA0dPZc6wTssDR0/kLrBOyQNHSxW20dgRyWhi51G60jkMPS0OXuSusI5LA0dLW71joCOSwNXd+80ToCOTQN3bzVOgE7LA1tLbdOwA5LQ7c377SOQA5NQ3fv3W8dgRyWhtYfPGwdgRyahh49bp2AHTcky7wOeBvyVx7zyhAkfjvEQUNzO+AnT58BcmBeGYDEb8f431DAAT9/gQiCeaUXEr8dZb+hiAN+uYb4NYV5pQ8Wvx1lv6GQA955hQiCeaUHFr8dZtpQyAG/7rYBOTCv9MDit8NMGwo54N3uDSAH5pUeSPx2nL8NBR3w2y1EEMwrM7D4bQCThoIO+B3kzzzmlRlY/DaASUNBB/x+B5ED88oMLH4bwKShoAP+8BGRA/PKDCx+G8CkoZgDXvr0GRAD88osNH47zLShkAP+0n0F5MC80gOL3w4zbSjkgFf2EK4L80oPLH47zLShkAP+9h2RA/NKDzR+O8p+QwEH/OPnLiAG5pVeWPx2kH8Nze+Af+0tAmJgXumHxm+HOGhobge88RuRA/PKAEfCb6c2ZBI5jCXHOO965jz3AiCP/oYOYckxzruiOU+9AMhjqKFiS45x3lXNeeIFQB6DDZVacozzrmvO8y4A8hhpqNCSY5x3ZXOedgGQx0hDhZYc47wrm/O0C4A8RhoqtOQY513ZnKddAOQx1lCRJcc47+rmPOkCII/RhoosOcZ5VzfnSRcAeYw2VGTJMc67ujlPugDIY7ShIkuOcd7VzXnSBUAeYw2VWXKM865tzrMuAPIYa6jQkmOcd2VznnYBkMdIQ4WWHOO8K5vztAuAPEYaKrTkGOdd2ZynXQDkMdxQsSXHOO+q5jzxAiCPoYbKLTnGedc055kXAHkMNXQIB4xx3hXNuajfPhK3BccTb+e58XZeBW/nZfB2XgVv52Xwdl4Fb+dV8HZeBm/nVfB2XgVv51Xwdl4Eb+dV8HZeBW/nVfB2XgRv50Xwdl4F0dsC4+08Id7Oi+DtvAjezovg7bwK3s6r4O28Ct7Oi+DtvArezqvg7bwK3s6r4O28DN7Oq+DtvArezsvg7bwK3s7LcCRuC44n3s5z4+28Ct7Oy+DtvArezsvg7bwK3s6r4O28DN7Oq+DtvArezqvg7bwI3s6r4O28Ct7Oq+DtvAjezovg7bwK04b+AI9qkryB06IcAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAABEVBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0BAQECAgIFCwU+mT4oKCg+Pj4UFBQJFwkQKBAICAgNDQ0EBAQLHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4XFxciVSIucy4AAQAKCgoFBQUyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQSEhIrKyszfzMJCQk2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIEBAEFBQJ4eDGZmT4YGAofHw08PBic0cRKAAADH0lEQVRoge2aZ3PUMBCGBQRCKuXAlECAECDU0EINhN5DJ5T//0M4W7K0ktfSSlodMNz7JXNZ+0ksz+j1c2Mhhtkmimb7jqL4iZ27SMdN7k7CT03P0A5M5M/OzRfl79lLPDCRv2+//Dk40CSC7z9DTsXBalZ+PnS4yRE633+GnIqj1YL8fOx4k0U633+GnIoT1Ul4Pezrc6pagtfDvj6nl8/A62FfH3H2XC8xwKdlZTqfr+7EAJudX76QzZ+Ud+IiOrx0+Uouf1XeiavocP7a9Vy+PzduJp74d2WNuE+n5tbtO2X/wN173nHy/W1zf26pKF+sPyjLf1itFeVvVI/S+MHuUHm8QuAjW1mwO1Se+PZqxX/aoJ5Zo2B3qDxfD/MXG9QLa0Rdn5evwnwsxPWZev0mjU9cn7fVuzQ+MTObvqaJ5A+6t+T9B98JkXzZmfA3Hz9tMPJX1fOJzufNCf8/lLn+C1/yzv9zGfujJ2N/9Kf1RyqfuteraH+k8tG9vv/xX/sjlY/t9Vhnqmh/pPKx9cE6U0X7I5VPfVZQ0f5I5VOfFdr8C/6I5eu3Ojz+iGXrex3B4o9YfvysI8b+SA2fP+J9y+aPfX3L5I+mb7d+WQMefwR96/B5/BH0rctn8UfQty4/2R9hQN+6/NYf8bbz+CMI7NsOX/pjT9t5/BEE9m2HL/2xp+08/ggC+7bDT/VHENi3Lj/ZH0Fg37p8Fn8EfevyWfwR9K3LZ/FH0LcOn8kfTd/afC5/NH1r89n8ceR9W8Yfdd8W8se2b3n8sbPXtH3L5I8IX/Ytkz8ifNm3TP6I8Zu+jfVHE8uUMH7dt9H+aGKZEsav+zbaH00sU0L5w76N9keT4PrUfRvtjybh9Rn2bbQ/mgTXp+lbJn/E+E3fMvkjxm/6lskfMb7sWx5/RPiqb3n8scvXfVuoz0b9fe3/7Y/m/pbxR80q5I+aVcgfNauQP2oWwR9z+AR/zOIT/DGLX8ofW1Ypf2xZpfxRs8L+aN62sd67sb/fdqeaFfZH87aN9d6N4vdMNSvsj+ZtG+u9G8XvmRpWGX80rJH642/0EqK2D8mg4wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492359442;4.copy,1.1,2.40,3.209,4.1160,2.19,2.14,1.1,2.30,3.209;4.copy,1.1,2.50,3.228,4.1150,2.19,2.14,1.1,2.40,3.228;4.copy,1.1,2.60,3.266,4.1140,2.19,2.14,1.1,2.40,3.266;4.copy,1.1,3.240,3.342,3.960,2.19,2.14,1.1,3.230,3.342;4.copy,1.1,3.960,3.361,3.240,2.19,2.14,1.1,3.950,3.361;4.copy,1.1,4.1000,3.380,3.200,2.19,2.14,1.1,3.990,3.380;4.copy,1.1,4.1050,3.418,3.150,2.19,2.14,1.1,4.1040,3.418;4.copy,1.1,4.1060,3.437,3.140,2.19,2.14,1.1,4.1050,3.437;4.copy,1.1,4.1050,3.475,3.150,2.38,2.14,1.1,4.1040,3.475;4.rect,1.1,2.33,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1010,3.286,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.291,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.316,2.95,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.405,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.440,2.15,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.516,2.14,2.99;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.639,1.5,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.43,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.630,2.17,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.33,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.981,3.250;4.blob,1.1,1908.iVBORw0KGgoAAAANSUhEUgAAAEMAAAA2CAMAAACr+9QzAAAC+lBMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0dR0c0f38DBwc8k5MSLCxHHR1/NDQoYmIpZWUMHh4+mJgHEBARKio8lJQDCAgeDAyYPj4QBwcjVlYucXEBAgI4iooYOztWIyNxLi45jIwXODgiU1MvdHQCAQGMOTk4FxcSLS07kpIAAQECBQUBAwMLGxsIExMtEhKSOzsHAwMSLi4+mZkramozfX0eSkplKSliKCgECQkRKSkNHx8JFRUcREQ1goIJBASUPDwpEREYPDw3iYkGDg49l5cNISE8GBiJNzcBAAAsbm4kWVl0Ly9TIiIIFBQLGhoWNTU5jo4BBAQUCAgaCwseS0syfHw7kZETMDBLHh58MjI0gIAbQ0MmXl4pZmaANDRDGxsOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnFtLG03NzfBwcH39/fp6emTk5MMDAwrEiuZPpksEhJtLCwCAQI3Fjd+M354MXgnJyf29va4uLhISEhiYmLu7u61tbUIAwg0FTQDAQEFAgI3FhZ+MzOZPj54MTEFAgVBGkGGNoaVPJViKGIiDiKqqqra2toEBARHR0f///9BQUGLOItMH0wyFBRBGhqGNjaVPDwiDg5kKWSXPZdNH00LBQv09PSEhITr6+uMjIyBNIFZJFkfDQ0KBARkKSmXPT1NHx8LBQUwEzCDNYORO5EcCxwJCQlsbGzR0dGgoKB/M38wExODNTWROztZJCQcCwsBAAF6MXp3MHf19fWNjY2FNoVSIVJ6MTF3MDAoEChwLXCSO5Ktra1ERESVPZUoEBBwLS0bCxspKSm3t7dfX1/t7e0aCxodDB0bCws6OjrExMSXl5cODg5DG0OKOIp6MnpLHkuJOIkZChkpESktEi0p+UseAAACV0lEQVRIiWNgwAUYmcAUMwsrTiUEARMjhGZj5yDXCE4ubvLthwIeXoqN4OMXoNgMQSFhis0QEaXYCDFxCYrNkJSSptgMGVmKjZCTV6DYDEUlio1gUFah3IxRMNiAqhoOCXUNTewSWtroImqquEzX0cUurq2FJqCnb4DLDEMjY2zCJqZmaCLmFriMYLC0ssYmbGOLrs7OHqcZDA6OWASdnF3QRFzd1EGUuwcIeKKwGBi89L0xzfDx9UMT0dUBU/4BIBCIwgKCoGBMM0JC0QTCjMIhdAQIRKKwgCAqGsOImNg4NJH4BHdMmxAgMSkZXSglNQ1NxNEBnxEMDOkZ6CKZWWgC2fo5+M3IzctHFSgwLURTUlSM3wgGj5JSVIGycnQlFZUEzGCoqkbl19QS0jEKYKCunnIzGhqbKDekuYVyM1rb2ik3pKOTVB3tXSCyu6e3r38CRGTipDoi9U6eAiSmTps+aQaQnjlr9py58+ZDZBZMWohL06LFYADO9E5Lli5bzrBi5arVa9aC+OvWb2Bg2LhpM0Tllq24zAhdBgbbGBgWb9+xM3QXA8PuPXv3QeT2HwCRBw9BeIeP4DKj4CgYHGNgOH7i5CmQyOkzZ4+cAzHOb7oAoi5egqi83EHYL1euXrt+AyR0s+HWpNvTgIw7EHfchai8d5+wXxjStj1Y9nAJWPTR4ydA8ikkPJ6BhaY+X0nYLyDw4qUvVPwVEL/ufbPx7bvZEIH3kz7gMgMdfETmfPrce/DLVwj72/ebxJqBE/z4SbERp38toNSI39//UOyMR39JUQ0AH7++IXsO4ZAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.991,3.297;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAALAAAAAqCAMAAAAklCFJAAACT1BMVEWtra3a2toEBAQAAABHR0f///9EREQCAQKVPZVBGkEUCAgfDQ0KBAQoEBBwLS2SOzsGDg4pKSn39/e3t7dfX1/t7e24uLgaCxqZPpkdDB0bCwsECwtf7Oxh7+8GEBA6OjrExMTr6+uXl5cODg5DG0OKOIoBAAEDBwdX19dY29t6MnpLHkswEzCJOIkIAwgZChkpESkoECgtEi08k5MSLCwdR0c0f38HAwOTPDwsEhIoYmIpZWViKChlKSkRKio8lJQDCAgMHh4+mJgHEBAqERGUPDwIAwMBAgI4iooYOzsjVlYucXECAQGKODg7GBgiU1MvdHQ5jIwXODhTIiJ0Ly8LGxsIExMSLS07kpKYPj4TCAgzfX0eSkp9MzNKHh4cREQ1goIECQkRKSlEHByCNTU9l5cNISEYPDw3iYkAAQEOBgaXPT0hDQ0sbm4kWVluLCxZJCQWNTU5jo4BBAQIFBQLGho1FhaOOTkEAQECBQU7kZETMDAeS0syfHwFAgKROzswExMmXl4pZmYxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkp3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl4SEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFxKSrc8PJXCTk4kJFlfX+wCAgb+Z2cEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZeuASNAAACXklEQVRYhWNgYGRiZmZhZWMGAXYOTmYcgIsbDHggPF4+flwKaQkEBJgZBIWEWURExSAC4hKSxOqVopWj8ABpGVk5BmZ5BSFFJWWIiIqq2gC4g2igrqEpzYAioqU9QE4hHqA4WEdXb6DcQTRAdrC+qsGAuYNogOxgQ6MBcwbxgIGwksEFRh1Ma8CgbmxCSI2pGQrX3MKSZs4hDBiYrawJqTEzReXb2NLKNUQABmY7ewf8ShydnFEFXFzdaOYegoCB2d3DE78SL280AR9fP5q5hyAAZjr/ALwq3AOD0IWCQ2jmHoIA6OBQpzB8KsIj1NGFpCKjaOciAgBUrEXH4FNhbYUpFhtHI+cQBiAHxyfgUZBon4QpmJxCK/cQBCAHC6Sm4VaQnpGJKZiVnUMzFxEA4JouNw+3ggB/bKL5BbRxDmEAdnBhUTEu+RKnUmzCZeUVtHIRAQB2cGVVNZAsrgQDd2QWc00tVm119Q10dCQygDR+GpuARHMLGLQis5jb2rHr6+ikmxNRAVJrrasbDHqQWYMPDL3m5UA7gFQw6mBag6Hs4N6+fsrMmjCRMv1EAeQQnjSZMrMmTqBMP1EA2cFTpk6jxKjpM+gxoons4JmzZlNi1Jy5FLqFKICS6ebNp8CkBQs7KHQLUQDFwYsWLyHfpKXLllPqGGIAarG2YiX5Jq1aTaFTiAOoDl6zlmyD1q3fQKlbiAKoDt64aTO5Bm3Z6kOxY4gBaDXdtu3kGrTDl1KnEAfQHLxz127yzMnZQ6cRQjQH7923nzxzDhyk3C1EAfTGz6HD5JlzhI9SlxAJAN0humukOv2kAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.345;4.blob,1.1,3772.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.922,3.364;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAMAAABw3UvaAAABYlBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxtHHUd/NH8HAweTPJMsEix3dzDU1FZiKGJlKWUeDB6YPpgQBxAqESqUPJQIAwgyMhT9/WYbGwtWI1ZxLnECAQKKOIo7GDuQkDq8vEyMOYw4FzhTIlN0L3QEBALp6V5eXiYtEi2SO5IBAAEFAgUDAQMbCxsTCBP09GMLCwQuEi6ZPplqK2p9M31KHkqpqUSjo0IJBAkpESkfDR8VCRVEHESCNYIPDwb392RFRRw8GDyJN4kOBg6XPZchDSFkZCjk5FxuLG5ZJFnCwk6KijgUCBQaCxo1FjWOOY4EAQQhIQ3+/mcsLBJLHkt8MnyRO5EwEzB9fTLOzlOANIBDG0NeJl5mKWbW1lZwcC3Eo5vCAAABHElEQVQ4jWNgQAGMTAzkASZG8vQxs7CSp5GNnTx9HJxc5Gnk5uElTyMfP3n6BASFyNMoLCJKnkYxcfL0SbBIkqdRSpo8fQwysmRqHAXUBXLyOCQUFJWwSyirgCl5OVxGqqphF1dRBpHqGpq4NGpp62AT1tXTB1EGhrj0MRgZm2ATNjUDS5pb4NTIYGmFRdDaxhZE2dkrgCgHRxBwQmExMDhruGBqlHJ1A1FqqmCeuwcIeKKwgMDLG1Ojjy+I9NP2B/P8AkAgEIUFBEHBGPpCQsNAVHiEA24vMjBERkWjC8XEcoAoK0t8+hgY4uLRRRISQWSSRjJ+jSmpaagC6RmZICorG78+BsecXFSBvHwwVVBIQCNDUTEqv6QURAIAda8nUX6ziz4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.400;4.blob,1.1,3952.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.421;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAASgAAABbCAMAAAD3GOjwAAABTVBMVEUAAAAwdzBW1FYdHUc0NH8UMhRm/WYLGwsMDB4+PpgHBxA6kDpMvEwjI1YuLnECBAJe6V4mXiYBAQI5OYwXFzgeSx5j9GMECwQSEi07O5IDAwdEqURCo0IpKWUoKGIGDwZk92QcRRwEBAk8PJQRESkoZChc5FwBAgEYGDw3N4kAAAFOwk44ijgvL3QiIlMNIQ1n/mcSLBIICBQLCxoCBgIDCAMBAwEyfTJTzlMeHksyMnxRyFFn/2cnYCdW1lYtcC00NIAbG0MQKBAVNBUIEwgeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyAJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4CBQIfTB9HsEcOIw4GDgZf7F9h72EGEAYDBwNX11dY21gICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzU5jDlFrEVX2FcAAQDnNrACAAACUklEQVR4nO3c2VMTQRAG8OXwiKjxQrwgciUoHqAGPLiUI4Cc8URQEPBW/v9Hq5aySjepyWxPz07P+P1e0i892/O0s1+2NoqkaWqm97a08s0hXnMTvbe1hW8O6Y4cPUbuPZ47wTiJcG0n6b2nTvPNIV3+zFly77nzFxgnEa79Yge599LlK4yTCHf1Gr23s4tvDukK17vJvT29fYyTCNdfLJF7B27cZJxEuMFb9N7bd/jmkO7u0DC5917uPuMkKg/KsRFKxWT0Ib330WO2MRp4MhYbp1RMJibpvVNP2cZo4Nl0bIZSAQAA+GF2rnJYzC9Ei88TVfpVtCv/LBWX49/5lWhxNVGlX0W/8tbaelR9kaigjpevotdvEhUAq1L81PvW6sq6lWgb8VPvO6sr61aiFeKn3k2rK+tWEJytLTkT6FYudLz/sO3y+n9PoFs5sfNxl/7nJPMEepXF0DosFkPrsCC0BgAAcz7HudlO73ec6/f0APCf8CRkds+TkNk9hMwiqUPXvT2Oa/CsomY7PFaHrvufPn8xvwbPKmrWw2N1PPz12/d982vwrKLmPuYGAAAA8J3fMXeWrAfF7l8K8oP7l4I8gaclAIAQmBwPTMJee0GxnQOPyfHAJOy1FxRbOvCYHA9Mwl57QTEOPAAAAADgpZCjYM69hRwFs+4t5CejkPcGAPAv3Vto+ug2i7eC1ZJ7+zFWJq+lewtNH91m8VawWs3e2oby5MV0b6Hpo9ss3gr+o/6HJGr29vNXVgNJpfchicJCNZtx5NL7kES+cpDNOD76Dfc4wHmcGImUAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.971,3.457;4.blob,1.1,3840.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.23,3.514;4.blob,1.1,2584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1121,3.651;4.blob,1.1,1584.iVBORw0KGgoAAAANSUhEUgAAAEwAAABXCAMAAACZWFNBAAACKFBMVEUAAAAODgYLCwTs7F/v72EQEAYHBwPX11fb21h3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6Kijg5jDln/2cDCAMhIQ3+/mcsLBIBAQECAgI6kDpn/mcCBAJ9fTLOzlMxMTE+Pj4XFxdFrEVX2FfW1lZwcC0KCgoNDQ0FBQUGDwZi82IsbiwiVCIAAQAqKioaGhovLy8sLCwGDgY3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAYnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21iqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4ICAhNTR9JSR1DQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxI8PBh4eDGXlz1lZSkQEAddXSaSkjuRkTtVVSISEgeGhjZERBwICAMXFwkNIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDtTIlN0L3QoKCgUFBQbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbA5zA5AAACN0lEQVRYhWNgoBZgZKSaUQxMzCysVDOMjZ2DiWqGjQKiASJBUJ40EAmCCkkDkSBGk8YooAHg5MLCItcwLk4sLDLN4ubhxcIi0zA+fnws0oCAoBAeFolAWIQJD4tEICqGj0UaEJeQxMMiEUhJy+BhkQhk5fCx8AB5BUV0lpKyCgNuFgSoqoGBKqph6hqa6CwtbZgkNhYE6OiCgR6qqL4BBsvQiAEPCwKMTcDAFEXQzNwCg0U20LS0wmDRDahiBDoFwFpX14Z6htmiBTpFhtlRzSh6GGZvTx4LbpiDo5OziyuY6ebu4clADgtmmJe3j6+ffwCYHRgU7MZADgtmWEhoGANDeEQktqAgGsAMi4oGkTGx1DAsLiIeRCUkUsMwhiSIy5KpYlgKJMxSwRxKk0aaU3p4RqYPmE1x0mDIynaKyckFMylIGoO1CMpDL/dHwSjAAOTmSBgrvwDRFCU7R8JYhUXFJaVQw8jOkXBWWXlFZVU14SAgFtTU1tVTySi2hsam5haqGMXb2tbe0UkVoxgYhLq6e+AcSpNGL1LzneKkgQwoTxqjYBSQAvoU+tFYEyZOgorgZ2E1bDI6a8pUmCR+FiaYpjAdnTVj5iwGYliYYPYcDNbcefOJYkEAtCeM04IFC4ljgcEiSE94MS7DlixdRhQLDPIgPeEwnE5bvoI4FggQ8ibDylXEsUCAkDcZVq9ZSxQLBAh6k2HdeuJYRIENGzfhZeEYGsEONm/ZipeFY2gEB9i2HS8LAL4P8f3YsEneAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492359542;4.copy,1.1,2.60,3.209,4.1140,2.19,2.14,1.1,2.40,3.209;4.copy,1.1,2.70,3.228,4.1130,2.19,2.14,1.1,2.50,3.228;4.copy,1.1,2.10,3.304,4.1190,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.270,3.342,3.930,2.19,2.14,1.1,3.250,3.342;4.copy,1.1,4.1000,3.456,3.200,2.19,2.14,1.1,3.990,3.456;4.copy,1.1,4.1010,3.475,3.190,2.38,2.14,1.1,4.1000,3.475;4.copy,1.1,4.1000,3.494,2.10,2.19,2.14,1.1,3.990,3.494;4.rect,1.1,2.33,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.250,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.269,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1050,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.367,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.383,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.405,2.26,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.516,2.24,2.69;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.33,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.73,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.982,3.250;4.blob,1.1,1060.iVBORw0KGgoAAAANSUhEUgAAALkAAAAgCAMAAAB5GinlAAABelBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0dR0c0f38DBwc8k5MSLCxHHR1/NDQoYmIpZWUMHh4+mJgHEBARKio8lJQDCAgeDAyYPj4QBwcjVlYucXEBAgI4iooYOztWIyNxLi45jIwXODgiU1MvdHQCAQGMOTk4FxcSLS07kpIAAQECBQUBAwMLGxsIExMtEhKSOzsHAwMSLi4+mZkramozfX0eSkplKSliKCgECQkRKSkNHx8JFRUcREQ1goIJBASUPDwpEREYPDw3iYkGDg49l5cNISE8GBiJNzcBAAAsbm4kWVl0Ly9TIiIIFBQLGhoWNTU5jo4BBAQUCAgaCwsECwtf7Oxh7+8GEBAeS0syfHw7kZETMDBLHh58MjJX19dY29s0gIAbQ0MmXl4pZmaANDRDGxvC6cAoAAABXElEQVRYhe3OZ1PCMBjA8YB77z2gyLCKouIEFUHFvbd174F7r+8u1VehTWlylz5619+btM+T3P0Rwlis6J+yWqALGKWkpkEnMErPgC5glJmVDZ3AKCc3DzqBUX4BdAGjwqJi6ARGJaVl0AmMyiugCxhVVlVDJzCqqYUuYFVXD11gMplMf4PNTlgIjgb1hdPFq4WO3UbauD3qc5eTVwuVRrGJtGr2tqiNW31t/HIotHcQV/7OLrVxdw+3GBr+3j7yMhBUGfYPDHKroREaEuQjHJENY18IjYijyhfRsXEjA4k87p9jYlI2hX3FTc8oX8zOGVenYd678Hsuypawr7jlFcWL1bV1A/vINjbDWmtpaztxtLO7x62GRjCgvd8/SJwcHvFq0U2SEDoWT7QvnZ6d44ML3yW/JH1iV9c36PYuya3I/QM+eHziVqSX8PwSQ69vya69f+D/n1+8gqh8A9uaLLH5cMIrAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.971,3.286;4.blob,1.1,2268.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.345;4.blob,1.1,4436.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.362;4.blob,1.1,8064.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;4.blob,1.1,476.yRaymOFT+MdXH88kZiZbyCzKy1l+f3tuLgyL53mAxSpvb/fTaLnxN5WCubvRMO4Zr2JXgRhw+Lv5WwgmIkajY9u2fDwevHYtgRPwcHE4jPn520AQPzZ2Lc6m0nEknaLH0CPjypKtIhClUq1QLKzBFAAAtVopFivibyd9o+2G8UYWMSuflp9sIbM4dep+YWFGcD56crl//1RGRiEnyLkcLmk6kgIA4PK5CjMKWUTWncd3kq3leyYmPKtWcUUiandMH2UlCI9ngstdRaWKHj4M/C4aFul7bQMAoMfYU51VjcMsrJRSpVLd1FRIICysP41arSwsbALBuF4HLqxDmmdUZhUWxIafxZp/uroeEAjYxM1ixcaDB11YLCH8LFZE0nckBQDAD/k5JE4uLbff3J9sLd/j9foLCzNWrOCcOYPYim/x4/d7MzIKOZwVGs2ZmBv5f/2QDAsSq/tLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.440;4.blob,1.1,2992.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492359645;4.copy,1.1,2.50,3.209,4.1150,2.19,2.14,1.1,2.40,3.209;4.copy,1.1,2.60,3.228,4.1140,2.19,2.14,1.1,2.50,3.228;4.copy,1.1,2.60,3.285,4.1140,2.38,2.14,1.1,2.40,3.285;4.copy,1.1,2.20,3.304,2.40,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.280,3.342,3.920,2.19,2.14,1.1,3.270,3.342;4.copy,1.1,4.1030,3.475,3.170,2.38,2.14,1.1,4.1020,3.475;4.copy,1.1,4.1020,3.494,2.10,2.19,2.14,1.1,4.1010,3.494;4.rect,1.1,3.992,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.269,3.135,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.53,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.103,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.962,3.250;4.blob,1.1,1104.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAgCAMAAACGuAwHAAABjFBMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijgGDg4hIQ3+/mcsLBIECwtf7Oxh7+8GEBB9fTLOzlMDBwdX19dY29vW1lZwcC0dR0c0f388k5MSLCxHHR1/NDQoYmIpZWUMHh4+mJgHEBARKio8lJQDCAgeDAyYPj4QBwcjVlYucXEBAgI4iooYOztWIyNxLi45jIwXODgiU1MvdHQCAQGMOTk4FxcSLS07kpIAAQECBQUBAwMLGxsIExMtEhKSOzsHAwMSLi4+mZkramozfX0eSkplKSliKCgECQkRKSkNHx8JFRUcREQ1goIJBASUPDwpEREYPDw3iYk9l5cNISE8GBiJNzcBAAAsbm4kWVl0Ly9TIiIIFBQLGhoWNTU5jo4BBAQUCAgaCwseS0syfHw7kZETMDBLHh58MjI0gIAbQ0MmXl4pZmaANDRDGxtcwBdiAAABa0lEQVRYhe3O1VLDQBSA4bS4u0OAYkFaqBAoFCjaYi3u7u7u8uI07U22kU5md3NmmHw3mz0nO/MzDMJkDh9x8QnMP2A2Rc7EpGTYEBJSUtOgEwhKz4AuICgzKxs6gaCc3DzoBILyC6ALCCosKoZOIKiktAw6gaDyCugCLCwrvlVWVUOFkGCpqa0TXesbwEpI4BqbLKJrcwtYicFgMBgUWG0KC661TX5hd1CLwWazKm2cLvm5w06rBVs736G06nR3yY27PT30cjD19imuvP0DcuPBIWoxuLzDI8pLn19mODo2Tq0G18QkJxyBoGAK+WKYaX5G+mJ2bl7PQE1czvCxsChYQr5CllekL1bX9KvTaN29ETk3BVvIV8j2juTF7t6+bnVaHRwG1Nbs0XH06OT0jF4OJr9PfX9+ET25vKLVgu2av1H/4fbuHh08eB7p5WB6eo7xQ/DlFR28vVOLwfbxGeuPr2/0/vNLqwXbH+IwMX1eSHTMAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.63,3.259;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.345;4.blob,1.1,4424.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.326;4.blob,1.1,8064.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;4.blob,1.1,1508.m5kEMOp0OH4IDo8HzcpiFxUlsVg0s9lusfjvl4pQU59O1V+ddVHWbNCYNIlcMvD3gQkjhisr6nbzKyqEGzcykpOtWq3NgPORfPG/LbYZbN9d/A7f6SEShVdHlcl022RayuPVZGSsTU/XWCzX9PqOIcyPolQEcY7NSBIIPFirVKbbt01Ll/JqajLWrk3XaCzXruk7fB6Bh24OZT+Xzc5mjw5439EGBp/rwmBz83cXL2Zv31525MiSF180tLV9+/77vU1NmBqBIIjOok8M47nBADyhMDHxUEnJsaefxnoiBYZXvfde+roZr395PEZmJtvrExfn53/pwsLEQ4dKjh3z32/xr4rzdudhlVR6uDTnubC8H4UbNmxpbd3n82AXFAqVcsB+oPilBblby7xDyGJhPYWVnr765Mn4jLDe/QqF/vvlV/BX/tdKTO4HDB5j9YnVrHTMX8QXbgnmdUPcYm4j2shbygu/98BE/3tHCIJ02LOeE4uKHN9/P6bVBj80QL+zbLfi635AoVFgOuz1oUx7qUSI68IkI3fvYj1FuEE4/nDcdBv/k1CIROG9IyEIKiv1168HSJALhyn3A5Pqhz9w0PQDfgX/4RcPIyEmFPLl+d9+8C3xiZeAUEguK5O+/bbf3LkIQWL6QVCytmXV6eqQhDla1AOYQVxamvT3v08CKUUQBEFQUlGSXC8XVYvIFhKrJBYW4rjZj1aE64XizcBJDQAAAAAAQKyyiLroeNXx4oDbwYvFtQcO2HNydsyZqvh4utXaQJbfrbi29oDdnrPD//edrZZOj29osIrFtYS3HFvsK9x3oOhA4GOysp6pq9MymXNnZN7UtP7jjzfOWXdeZD3zTJ1WyxT4/76z1a5f37Rx48eRaDmGWJy0+N2qdxlhb1BGLJs2icbHGxIW1Os9kWhTQ8M4gRvrx8QkoRf3zffHXePlKeVkC5nB5cs6s9mxc2dYiyTmGJ3ussNhzsnZSVSDsRiOHtTTMdSxUrCSbCEzcLvR06d7FQoJ2UIwgKLu3t7TEomCbCELHCFLeGL1iWRGMtlCZlBSwvV4GjMzMexTTzpcbkljo4fNziSktShcDR4Ko87RpbylMAXu/X7uLLeCMjRke/bZbDodvnGDtNUSWLHZhrKzn4Vh+sOHN8JvLRYH60naDG1SgZRsFd4olWq5fCGN1xAEqdVKiUROSFOxG443h26mMFKy2dlkC5nBmTN9ubkJvikQ85m+vjMJCbl8H/cGHMToYA1BkN1tz03I5TK43SPdZGt5wtiYc+VKgVgc34Ir1ZAUnM4xgWBlfLz4wQPvDQWwErtXRwiC2obaKlIqaJT5tQZZqVTv2pWLIAvpT6NWK3Nzd8FwuC9NF9J3JhyVUUWFqYEnDOee5uZBBKGSNWGIj8HBZioVCTxhGAqxO1hDEORBPXwmP5Od2WnsJFvLE1wuT25uwvLl/E8/JdjLMnJ4PK6EhFw+f7lG82k47fw/by85EIwEyXEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.440;4.blob,1.1,3344.iVBORw0KGgoAAAANSUhEUgAAAVAAAADoCAMAAACO2ExHAAACglBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAIEwgICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzU5jDk6kDpn/mcCBAJFrEVX2FcAAQAPJA8KGAovdS9QxVAbRBtg7mANIQ0MDAyKiorh4eH19fW5ubksLCxBokFHr0dY2lgtcC0HBwfAwMC/v79UVFRISEiSkpLr6+seHh4IFQhj9WMdSR0hUiEFDAV2dnaxsbEXFxfDw8P8/Px3d3eZmZk/nD9Fq0UCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf398dSB1f6l8wdjA1NTXExMTt7e0xMTGsrKzg4OAjViNdXV2cnJwuLi5HR0eWlpbS0tIJCQle6F4zfzMQJxAbQhtxcXGCgoJGRkavr6+AgIABAQHa2to8lTwTLhMZPhlpaWmMjIw4ODjc3NwfHx+4uLiNjY1eXl6rq6tV01U/nT8LHAtEREQGBgb6+vpkZGT29vb09PQrKyta3lo3iDdl+mUpZSkICAjs7Ow7OzsZGRkUFBRQxlBnZ2fx8fF7e3tQUFBra2sSLBIUMRQzfjNaWlrOzs739/fn5+d5eXld5l0LGgtSzFIyfTI5jTlNv00gUCBc5VxTzVM2hTYRKREcRRwIFAgxejEeSx4NIA0LGwsOIg5k92RCpEIHEQc8lDwqaSokWiRb4lsweDBj9mNDp0MjVyNi8mIpZikTLxNW1lZl+2W1Crd6AAAHA0lEQVR4nO3d938URRgG8IUUC4RAQoJrILEAEQE7oogF7BqxRiyIvWBv2AUU7GIXu1iwd8WKPfZe/x/N3oW93M3NTXl355255/vLzm1yk1k+nnl3n8xMFEUjRjZEicamqHmTspayjb0ot8K16WabJ8fGUVHz6LKWfi/qreC1jIlax5a1wMK4tqh9fFkLgLWOzkETMu1ZtRWELeJBW2bas2orCF0TB03KtGfVFkAN3d18RqDa4qxnq6234TIC1RZr206e0sNlBGqtqUmF0Nlb2gIL2yUVQjyttAUWtk8qhInTS1sAAAAg43eMwXH0fscYfo8eAICFwMIV9wILV9xDuFIX5GHDjBkUP4OmFzkuoYk8bJi5w4472f8Mml7k2IQm8lhk5112nWn/M2h6kXMf7wAAAABAfeMYkPiNTUDC5W44FGzuhkOBu2EAAODDpmyyCTmyC0jcFoI2ZZNNyJFdQOK4ELQpm2xCjuwCEhSCAAAAAABgLeQIxMW1hRyBOLm2kO98Q742AIAwqZYW+pFFHrNA5EzLpt3iTuOfqVpa6EcWecwCkTMum2btPtv4h6qWFvqRRR6zQIaIF8wyLpv22JNgTF6jXTCrq6mVpiN/0S6YNbthDk1HAADc7VX2ei6eh1jZe5+yEw1tXYTd191ciH33m5cc5+9/wIEHHZw0Dzm08tvM/13YzIXIR+9hhyfHviMWHHnU0cccO9g+rv/4ym9U+nehecDvdQSysP+E5HjiSScvOmXx4lOTF6dpbtgzhOYBv98RyOmFxXHOOPOss88597wl5yevLojNPqU0D/j9jgkuvCg5XHxJ36XzL7s8uqJv8FV3fKXTQXlserwwOS696upF0TXXRtddn7y84UaXg/LZsnh5clxx080ro6Wrbrm1cHrybQ7H5LXb4zuS45133b36nnvvu/+BwukHH3I4Jq89HBcqpDULHln96GOPP/Fk4fRTT5t1Jy94VMshn8umqWufSY7PPvf8knXRuhcKZ3tHNkveU/165QWPajnkd9n0YvH/li+9/MqaV18rnnw9fqP6OyTXKy94VMshv8umN6cUG2+9/c677xXb7es7qr+jcr8RKPH+2pbKkx98qPBO7DIi9tHHFWnFJxtUfitglxGxnk8/Kzvz+fovnIwkFF9+VXZi+ddOxgGQGYQmxCpDE/kDfvlXB+JvCMZkw31sUxmayB/wS786EDuvHJzHNsLQxNS3MZbYNw5NRCZ9R9eXt0xDEz4mFO6kJffcufI/NPm+cCc97LeRyz0+vA9N5hXupH8oPedyjw/vQxPRR97lHh/ehyaij7xL1UMT1ViEJvgwnuch+sgPQx3MyPurHpqoxiI0wYc/i1nV6K96aKIai9AEH/4sZlVjo3VpaAISVTZaVwpNQEC80bpaaAKqEJoQQ2gCAKCrsSlqJnyuDI2joubROm/w+c8UxWivqGVM1DpW4/v9/jNFEeIrGtcWtY/X+H6Of6ZYI/ioMUmd4xU5Jn0K2vFj/4af/j/OmpvhCALbSl36FPTnX0b8+tvvA3/8meV/hoFtpS79yP81LYr+/if+N9M/gQ1sK/XawcecZYH9Ji3KaAmrmsGHnE3ZRFByWayO5X4JKxGbsomi5LJYHSvPJazU2ZRNFCUXVseihdWxiGF1LAAAcEw+pyP9qvuZF3Ly69AfvfFcF/mcjpKvOp95IVdjbor26I3nusjndPgz44N6pMb9yed0+DPjg3qk/ly5IWazQPzHbRaI97jNAvEet1kg3uM2C6SczZJYTvYCGfaRzy7aMO3ZZkks93uBZBdtGPdssySW+71AKKIN4r1AAMtaEcOyVgAAUE/cL3DlSkZXzmCBK0fMr1x6p6r80D+42SLGcYf8TlX1oX94s0WM4w7sBQIAAHyICh79Ioh72aQavdhfh6jg0S+CuJdNeQQpRaKCR78I4l425RGkAAAAAIAZ/Yf+oQQkbOKOUAKSjK5D/6G/P/NB5DK6Dv2H/qHMigjlOiAkmC1CDLNFiGG2SMCczPggey+/sMb9jA+b9zIMa9zP+LB5L0IOAAAAAL+4jzvSEYjGorp4Fxvu4450BKKxKC/exYX7uCMdgWgs3i3e5T4mSEcgGksoi3exU/eLY6VRhLylivtKOZlLowh5S5XltgH+S6MIeUtV3X/kqXH/yNMsLyVv2ajohWxxrGzQLC8lb9nIaAmr7FQGBqKtwMXbg4u2TafeSp1meS6nRFuBV9keHFSItgIXbw8OAAAAjKWbfTPd9ls/DHEr3exbe9vvfOiHIW6lm33rbvudE/0wxK10s2/dbb9zoh+GAAAAAGs0i3fBEJrFu2AjmsW7AAAAAADKCWZ8lIQw/mzIzoZgxkdJCOPPhuxsCGZ8lIQwnEMOpgQzPkpCGL4hx38HbIo64TrcUQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1111,3.649;4.blob,1.1,1580.iVBORw0KGgoAAAANSUhEUgAAAFcAAABZCAMAAAB8HEguAAACE1BMVEUAAAB3dzDU1FYODgYyMhT9/WYbGwsLCwTs7F/v72EQEAaQkDq8vEwHBwPX11fb21gEBALp6V5eXiZLSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0GDgYECwRf7F9h72EGEAYDBwNX11dY21g5jDln/2cDCAMBAQECAgI6kDpn/mcCBAIxMTE+Pj4XFxdFrEVX2FcKCgoNDQ0FBQUGDwZi82IsbiwiVCIAAQA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5NTR9JSR1DQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxI8PBh4eDGXlz1lZSkQEAddXSaSkjuRkTtVVSISEgeGhjZERBwICAMXFwkNIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbCCQLmAAACSUlEQVRYhe2YZ1PUUBSGL6CsqKisYO9lUVFXVOxd1wKKVEGx997B3hBsqKiIUuxdrD9RcpPNuZM9M3vLyTiOeT7sPrnJfWcnc2bfSRjzg5RUX2JZagpdVlqaqz16ppPFhnpl9I57n75ksSyzX/+QowOywnS5AgOzQ8kv0iBnkC+xg4cM9SV32PAR5iEwXa6NHGUeC9Pl2ugxY81zYbpcGzfePBZjwkR/cgP+R6BpMNMHmgYzbaBpEItEtHOhaRItd9LkKZqx0DSI5U2dlquZC02DmT7QNJhpA02DmT7QNJjpA02DmRzTozO8Bk2DmbjFQ/5MTr7ls2YXOKuuQdNgJm7xMGcuZ57l8xfEV12DpsFM3OJh4SLO4m5dsnSZswiWBKkLC5avSDDpLQEBSYAuMTGblatiq9es5QpdYmI26wqL1m8o3sgdusTEbEpKyxgrr6hkxGyqsj6rNxPHbqmosb62biPOZdvt37uDOnenfX938QPCOdsd21O+d18Rd/M5Ezpn/4FY9cFD/Jz5nImdQ4nQOQEB/zY0/wrcDh+BxwKa9rHt6LHjJ046uTTt49ip02fO1tYl3hMCzp2/cJE+NfPS5StXr1Gnpl+/UX+zgTqVsXDjrdvuAeGc3REeuyjnTIR0zgIC/hp3o/c81nT/gbMia3juQ681P4qflDWEx9EnXmt52srUDOHZ8wRra+9QNEk6X6iaHC9fvVY0Sd68VTU53r1XNTk+fPykaJJ8/qJqcnzt+qZoFuLbOJzvP34qmoXEk9Gv37L2B7H347Mm6E91AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB7UlEQVR4nO2Zx1JCURBEASOiF8kYwAhGMAdMGP7/nywfSrl4c4vFUNNNzVne2fSCV9TpzmRmhGzOOoEmc/ML1hE0WVyyTqDJcn7FOoImhVXrBJqshax1BEWKYd06gialsnUCTSpV6wSa1ArWCTSpN6wTKNLc2LSOoMhW2LaOoEirvWMdQZHdPesEiuwfFK0j6HHY7lhHUKR7ZJ1gmrC66HHqK6mLnpymv1O6aOfsPP3A6KLNXks6EbpoPy9+7YQuenEpnghd9OpavtG56E3oy0c6F70NXflI56J34V4+0rnoQ5D/VPhc9HHwJN4IXfRZ/tIJXbTcE0+ELvoyeBUulC76Nkz/PXG6aO79I/Wd1EU/v6wTTJV0F+Vi3ANILkrFXw8guigXox4g4qJUjHqAiItykfQAERflIukBYi5KxU8PEHVRLkrluItyUanGXZSLWiHqomTUG1EX5SLpASIuykXSA0RclIukB5BdlIxRDyC5KBm/PYDkolyMe4CZcFHSHmBCfJMGwDdpVHyTxsU3aVh8k8bFN2lcfJMGxjdpYHyTBmYmegAZ36TR8E0aGN+kgfFNGhjfpHHxTRoW36Rx8U0aFt+kYSHtASbEN2kAfJNGxTdpXHyThsU3aVx8k8bFN2lgfJMGxjdpYP73AN9wtznR168+twAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492359751;4.copy,1.1,2.70,3.209,4.1130,2.19,2.14,1.1,2.50,3.209;4.copy,1.1,2.80,3.266,4.1120,2.57,2.14,1.1,2.60,3.266;4.copy,1.1,2.70,3.285,2.10,2.38,2.14,1.1,2.50,3.285;4.copy,1.1,2.20,3.304,2.50,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.980,3.323,3.220,3.190,2.14,1.1,3.970,3.323;4.copy,1.1,3.300,3.342,3.680,2.19,2.14,1.1,3.290,3.342;4.copy,1.1,3.890,3.361,2.90,2.19,2.14,1.1,3.880,3.361;4.copy,1.1,3.930,3.380,2.50,3.133,2.14,1.1,3.920,3.380;4.copy,1.1,3.890,3.437,2.40,2.76,2.14,1.1,3.880,3.437;4.copy,1.1,3.390,3.456,3.500,2.19,2.14,1.1,3.380,3.456;4.copy,1.1,3.410,3.475,3.480,2.19,2.14,1.1,3.400,3.475;4.copy,1.1,3.420,3.494,3.470,2.19,2.14,1.1,3.410,3.494;4.rect,1.1,2.31,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.250,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.387,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.83,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.133,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,3.212;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACwVBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4GDg4ICBQLCxoWFjU5OY4BAQQECwtf7Oxh7+8GEBAeHksCAgU7O5ETEzADBwdX19dY29s0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlZNlivDAAACmklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRgjJcXXHqdNNyxybs4ekFpr19fP1wafXHXvYGBAaB6eCQUG9cWsPCsYtHROLSMQoYosjWGR1Drs7YuHgIIyExiTSdySmpDDCtaaRpTc/IhLKyErNRpXJy8/BqzS+AsQqLIHRxSSmEUVZeUVkFZlXXgEEtqta6enTDGhozmiCB3tzS2tbeAWR0doFBN4q6nt50DIf09U+YWDAJwp48pWsqA8O06WAwA0XZzN5Z2Lwxe07vXCA1b/6ChYsW43Dw7N5JmBozlyxdtnwFw8pVq9esXceAy8Hrezega9y4afOWrduAjO07dkJLC6wO3rV7D7rWvfv2HwAzDh7C5hcEOHwEXWTmUTzKvQLAwBDEPnYcv9Fo4MRJMDgFYp/efYYUraICYHAWzNl67jxJ9iKBCxcvkauV4fIVsrUOAYCztYLWqsEGcLVW0Fs1WACO1gpGqwYLwNFawWjVYANYWytYWjVYANbWCpZWDTaArbWCrVWDBWBprWBt1WABWForWFs12AC8tQIH2Fs1WACstQIHOFo1WACktYJU1OBo1WAD4NYKUlGDq1WDC6AUNaOAVuDqNbK1XrtKrs7rE1eQq/XGTXJ1Hr11m1ytd+5eIFfrvfvk6ux78JBcrUsePSZX65On5OqMf/acXK0vXpKrk+FVKk4pALQLsNLaKndxAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.231;4.blob,1.1,1168.iVBORw0KGgoAAAANSUhEUgAAANgAAAAgCAMAAABHP0arAAABv1BMVEUAAAAgICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0pn/2cdSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChRyFFl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjsGDg4tEhIQJxACBAIbGwsECwtf7Oxh7+8GEBACBgIDCAMBAwEDBwdX19dY29snYCcQKBAVNBUIEwjU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lbvEi+VAAABZklEQVRYhe3W5VMCQRjH8QUDEwMTxO5u7MRW7MCzRQzsxu5u/YN1Th3R4Zhxbp99Ruc+b3Z3fvfi+/IIsSGTO5F/SSZ3xk6A4SJ3xU6gTOHGH+4ePwdPL2/bp9KHURAVvn7+qgCBLTAoOCT0467WhGnDWUWJFxEZFR0TKzjHxSckJiW/XVJS09IzMtl1iZaVnZPr+Iu8fF0BIYVFxSVsiigpLSuvqHSwV1Xra2rrCKlvaGxqZlZFQ4uhVdXWLjB2dHZ19/Ty1z5jv5bTsOuiYWBwSGAZHhkd+3qNmyaY9IhmNn/eJgW+mJr+/p4BrKHHMjs3b3dYWOQtMe6hZnll1WJ30Ot4a4x74K1v8DaxOyQSiQQJZ+UPxZYBOYQ2K/d+bu/s4oZQZtz7G79Kv7Z/gF0A4/DoGDsBxsnpGXYCjPML7AIYl1fX2Akwbm7V2Akw7u6xC2A8PCqxE2A8PWMXAHkxYReAeAVQ/TUYpZWsEQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.345;4.blob,1.1,4440.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.440;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAR4AAAAyCAMAAAC9DkQdAAAAnFBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAIEwgICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzVHf0ObAAABN0lEQVRoge3aSVPCQBAF4BECqAiCKBBZZQeDsvz//0ZlDqlUCqZaZnqW8n0X3qlnOHXyKkKIh1JZSFFFVGuFRJZNIadQPD49y9+oLqovhfT3KfQUmEZTvLYKCTLtN9F5LySAu310Uz3WydTkoX6c+mSdTE0eGgxTI9bJ1ARBG4/9uQE12TOZfs3sn3r9BtRk0XyxnFg/9MYNaGklt153nU+Q2citF2/zCTI7ufWG3/kEAAD/UXiFaB7/7YMtRKWwbw8AgfO6pnXP65rWPdS0zqlryyQxcYaZKWo89au6ttz//B70zzAzRY2pflUXrMfTea9/hpkpau6LYgAAAADbwi6K+TFVre4/b/GZ+89bvIa3FgAA/+gsdp26lK9qNfmoorPYdepSvqrV6KOKzmLXqUv5qtb0H10AuqEr3IDddEEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.113,3.499;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1064.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACDElEQVRoge2Y11ICQRBFwYzoopgwgBGMYA6Yw///k8uMUPQUO9VsX6tf+n7AmX48cwoF9RUntC/wm5ya1j7Bb2ZW+wK/udK89gl+5QXtC/wWk6L2CW6VZEn7BL/lqvYFfiur2hf4rZW1L/Bb39C+wK22uaV9gtt2sqN9glu9sat9gtvevvYFbgeHFe0TejtqNLVPcGsda18weuP42QnkxdGUMfzs9AxxRhaF7WfN8wvAGZkUrp/V2nXAGREK0886JYTpRyhMP7u8ApwRozD97PoGcUeMwvKz26QDOCNKYfnZXdIC3BGlsPzsPnkA3BGlsPzsMUF8v2IUnp89dZ8Bd8QoTD97gVh+hML0s2obcUeEwvSz1+4b4I5sCtvP3j8QXptF4fvZxOcX4I4syhh+9v0DuANE+YfltTxM6RtQclsepvT1KQLLw5Q+T5FYHqb0eYrI8jClz1FElocpfY4isjxM6etRhJaHKX0pRWh5mNKXUoSWhyl9KUVoeZjSl1JklocpfY4isjxM6XMUkeVhSp+jiCwPU/o8RWB5mNL3R8lveZjSN6Dk9jNM6bNeGKdYLwxmvTCY9cJg1gvprBeSWS+ks15IZr2QzHphf9YLhynWCwnFeiGlWC8kFOuFlGK9MKBYL6QU64UBxXohkoKf9cJg1guDWS+ks14YzHohnfVCMuuFdNYLh2e9MN0vO5RXGcOcTbgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,1544.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAABHVBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsxMTEYGBgFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBUBAQECAgI4izgfTB8oKCg+Pj4UFBQ0gTQkWSQICAgNDQ0EBAQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4XFxcTMBM4iTgKCgoFBQUKGQoRKREQKBASLRIJFgk0NDQREREcRhwwdjA6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0FCwUJFwkSEhIrKysLHAsPJQ8JCQkHEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCADAwMFDAUeSR4EBAEFBQJ4eDGZmT4YGAofHw08PBhol7uaAAADI0lEQVRoge2aaVfTQBSGA25VRINVrIqouIBrFUTcAPcV9x2X//8zbCedJTd3bjK593L4wPulc2bah3MmkHce0ixzGRvPVLNr9x7dH7B3H7nc2c/kH5g4qMrPJg/p8g/nY6r8qfxICr971CTy9i6yeGw6hX+8Z3ICf3uxWp47eSqFP3PaZBZ/e7FanjszmcJP35+z51L4yfszd/5CCj95fy7ml1L4yZlfuNyOP7oS3Rr+lavUKsHvFFfiGo2/fmOqJb9fXImbJP7WwiK5zt3/pdu8z9emG/1bYWa5eLnT661o4O/eK177Kyr8xfsPRqOHJL/l9Z1bnbdDFf7ahDuXqPDXH7mhCv/xEz6faIKn+VoiH7mVEU3wLF9K4z83qBelJaIJXuav0vizBvW6tETsz5vcH9pa7z+xP2833vH5VFO+92cSld/P6VUdvj2ffNj4aGdmJPkdez759HnU6jX350R+355Pxr98dTPf5Pg+33+0/OD2yo4/1mTHH2vSyB9pK6LTxB/Re32j438zf8Tu9VhnYmnij9j+YJ2JpYk/0tZIppE/0tZIZtv6I5afv4YpTbX2Ryybv4cJZ9r7I5Y/f4cJJnb8MRYdf3R9q+SPtm/V/LHoWz1/LPpW0R9N3yr6o+lbCX+MZNi3mD/ibUf4YyyDvkX8MdJ2hD/GMuhbxB8jbUf4YyyDvhXxx1gGfSvij5GYvlX0R9O3Wv6YjfpWyx8z27dK/uj6VssfXd8q+aN634LI+eMyOivmj7ZvYVj+uPnPjnzf+jkTlj86VtC3gM/yR8cK+hbyOf7oWEHfQj7n+aNjBX0L+Zznj5YV9m2Fz3j+aFlh31b4jOePlhX2bYXPeP5oWWHfQj7n+aNlhX0L+Rx/dKygbyGf44+OFfQt5HP80bF830I+yx89y/Ut4PP80bNc3wK+WJ9t+f9r8T7jpuKPwqn6I52m19el4o/C/Io/CvMr/ijNh/4ozYf+KM2H/ijOB/4ozgf+KM4H/ijNh/4ozS/5o/+ODTby/Mgqxi/5o/+ODTby/Mgqxi/5o/+ODTby/Mgqwof+WJPU/d8Sf/wPkACtTIP3HxYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492359853;4.copy,1.1,2.80,3.247,4.1120,2.95,2.14,1.1,2.70,3.247;4.copy,1.1,2.70,3.266,2.10,2.76,2.14,1.1,2.60,3.266;4.copy,1.1,2.60,3.285,2.10,2.57,2.14,1.1,2.50,3.285;4.copy,1.1,2.10,3.304,2.50,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.330,3.342,3.870,2.19,2.14,1.1,3.320,3.342;4.copy,1.1,4.1000,3.475,3.200,2.38,2.14,1.1,3.990,3.475;4.copy,1.1,3.990,3.494,2.10,2.19,2.14,1.1,3.980,3.494;4.rect,1.1,3.971,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.234,3.176,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.364,2.27,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.387,2.17,2.28;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.386,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.413,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.850,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.113,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.163,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.63,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.221;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAAOIAAAAYCAMAAADQx9GaAAABa1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBACBgIDCAMBAwEDBwdX19dY29tRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvBnanWAAABE0lEQVRYhWNgGN6AkXGgXUBrwMTMworEZWMHAw5k1lAHnFzcTEhcHl4w4ENmDTPALwAGgsisUTAKRsEoGAXkASFhkYF2Aq2BkLDoQDuB1kBMWHygnUAzICEJpqSk0SVkZOWQufIK9HEPtYGikrKKKg45NXUNTS0oW1tHV0+fXo6iJjAwNDI2McUpbWZuYWllDWTY2NrZOzjSz11UBE7OLq74Vbi583owMHh6efvQx0VUB75+/gGBeOSDgnlCQsMYGMIjIqOi6eYq6oKY2DiV+AQckolJySmpaWBmekamXpYO3ZxFZZCdk4tDJi+/oBDBKyouoYt7aAJKcYiXlaPyK2juEjqB4TOwgRMM24ENBBheAxsAwzQgI8xhU0EAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.345;4.blob,1.1,4416.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.362;4.blob,1.1,8064.iVBORw0KGgoAAAANSUhEUgAAAO4AAACUCAIAAAAbNYLSAAAABmJLR0QA/wD/AP+gvaeTAAAZEElEQVR4nO3de1BTd74A8JOT5JgHEBJCEkh4QwANBUQkbPEthkWnVYtlVR67osudbt11tna8f7Tj7t1O53bXvdPRPnTvTneXom2VrowzS91xffcWsAWD2lWCBOokwYRE00DIO+f+gUXI+yQnD8zvM/nDnpPzO98kvx5+55zf93yJEAAEi0ejoShqczqjHQgEQRAc7QCARayGx/ty61YGgkQ7ELxJJBmHD6+IdhRARHWsW3dWIol2FBCE71FZLOb29alxbBCIfa/19m4SCH6ckRHtQPDrypmZCWlptP5+DV4NAovCpNn8yf37B0tLox0Ifl1ZLOYOD+v1egteDQKRJxKx9u8XzV9SVVV19epVk8mkVquPHTuWkJDgvlWXXL6ez+dSqZEKc4HM+vr6nh4Igki4NAfDhJUrOV1dclxaAyIMhgmVlakSSQafTx8bm5pbXlhYePny5WvXrm3bti09Pf3IkSO5ubmbN2922fwrtRqCoDXp6adHR/GJh0wmEIkuC51WKzrvUglMIuU1NpYdOsQqKdH090N4deVly5gIAt+8qcWlNSBiyGS4poZXWytgMJCBAW1n54hcbphb+7vf/U6hUGzZssVut0MQpFQqz58/v27dusuXL89vxGC1qk2m4uRkvKJa+5e/FOze7bLwwo4d8q4uCIJIVGpRW9tzr71GS0uTnzlzrb1d3dsL4dWVxWKuVKqzWBy4tAZETGtrYUUFu6fnwaVLKqPR5rK2vr7+3Xffne3HEAT985//1Gq1mzdvdunKEAQ9tlg4+A0wvn7zzdvvvuuy0PDDIX/NRx/lNjTcfPvtO0ePmnW6uTfg0JWpVFJpacr7738belNAhH3zjSYrK2HjRkFCAvn69QmFwji3ikql0un0hw8fzn+/SqVis9nu7didTorbkCBoRoViZmLCZaHTap39x+hnn6VWVJQcOEBhs++eOKG7dWt2OQ5duaKCbTTa7t17HHpTQIRJpbqhIV15ObuuLmPt2nS53HDlimr2MpTJZJqZmeHxePPfn56e/q9//cu9HTqZPGk24xWV7wHGeHf3d+fO5WzfXnbo0LJXXlH39n77wQcjnZ047PjgwdKXXsrFoSEgqoqKkg8cKDl69Pm5JZ9//rlMJiORnhzvJBIJiqIbN2502ZBIIFj27XtVJIJwkpiTk7pihctrCZPp/k7+hg1bLlzYMzXlvgozNpty/Pjq9HQ6Dm0BMYDPf/pTFhcXm0ymL774QiKRtLa26nS68+fPu28iYrHQ9vZyTwOPyGCVlODQyubNmW+8sRyHhoCY9KMf/ejLL780mUyTk5MffvhhUlKS+3t+VVKiam6GCYTIh4en3/xmxYYN/GhHAUTTN9u3v7kcHM6ARW5rdrayqSnp2ZscB8SVYiZT1dxcKxBEOxAACM16Pn9zZma0owAAAAAAAIgNkgzJ4RWHcWlqCXHJsZpjIhYOt4gOHSq7c+fl0NsBXJATyG3Gtsz6sI+Gyw6VvRzwL0hOSGgzGjPr612WY5t6L+aK+9R9mDbxxuKw3NTerOZWh95Uc7Pw449lobcDuLBN28bOjglbhOHekbBZKAv4F7RNT4+dPStsaXFZjqErZyZkptHS+jX9gW/iW5+6rzSllEKkhNLI8uXs4uLkzs4RvKIC5pN1yLJeyEKSwnjZmL2cnVycPILlF5R1dGS98AKy8NYjhq4s5oqH9cN6iz7wTXy7p783Y5+pSK0IpZGWFuHlyyql0uj/rQB2yotKq96auyOM08WELULVZZURyy+ovHjRqtfn7tgxf2GgXRkmwCs5K3vVvRhi9MeJOvs1/aGMMUgkeOfO/I4OMLoIF9SBjpwcCd8YAybB+TvzZRh/QdThGDl50mWMEWhXXsZchsDITe3N+QsJEIEMk+e/iARigGtn9an78hn5KZQUTJ9kjkQioNPJn38OcgrDSNYhS1uVlpiVGI7GBRIBmU6WY/8FZR0daatWJWZlzS0JdOq9mCuW6qQWx4KE6hJWyS9Ev5i/ZEg39MG3HwSydpbSqFQalVWcqp4HPYF/jDktLcKzZ8eMRnsQ2wIBenT7ke6WrqC5YPCtQdwbF7YIx86O2bH/go9u39bdulXQ3Dz41lsYNqOSqO/VvFfMLHZfnpWYNf+VSk0NcO2cjYKN/1X5X1g/CQRBDAZiMu2trQUTAMLuuV8/95Phn+DeLMJA9pr2CoL9BZ/79a9/MjyMbZsaXs07Ve8QoLBMSE1Ckj5c9WFOYg7WDffuLVIommB4kU+TXQxoPNrP7T/nVHHwbbZob1GTookQ7C9I4/F+brdzqqpm/zOgsbKYK74xeQOF0OB26ZvBarj7+K6YK8a6YUuL8NSp+05nWKIC5pt5OKO4oMD95E/YIrx/6j4a7C848/Ch4sKFuZM//12ZTWHnM/LxvXbholfTW5laSSJgyJnNyUmsqUkD1y4iRtYhy2vMgxHcHmeVmJOYVpOG9dqFW1QdeY2NMIJAgXTlKk6VYlqhMqpC2aVvUq2UCBMx3cRuaiqQSrV37jwKX1TAfOPd40SEOP8mNozARArR5UUgEgJZC0FQQVOBVqp9FNovON7dTUSQ2ZvY/g+ElZzK6xPXQ9mfXzanbWByYCVnpVQnDXCTnTvz//Snu2GNCpjPbrKPnh4t2FUw3j0+u+TFay+6j56v/OzK8F+H/a6FICh/Z/7dkH9Bu8k0evp0wa5d493d4JwJCFJyUTI5geyycGpsyqwz+10LAAAAAACwKIT6yDoajYeiqNPp+hBIAIiwUC8T8ng1W7d+iSAMXKIBgGhat65DIjkb7SiASPOWmLSIUSipbW3GjIwfRzsQINLWd3Zu/PTTaEeBqzVr/rxly8VoRwFEmmDTpraZGcTTMxEjz3WsXF+f2dOz4E9GIDWC5PIuPn89lcoNY6TeuccMRIbHxKQoI5Hg3bsLbt3agaLtfX3b5pYXFhbOzMycP3++rq5uz549jx49+sc//uG+OYIktbejeXm4ZfCTyTCFQnR5uczn9BYzEEniP/zhhatXox0FBEEQRKWSXn1VNDa2y2ze+/HH66urFxxZT58+7f7c83Xr1rm309LysKICn0dkQBDU2bkeRdtdXg0NuYHEDEQSq6Sk3emcn5gUNZ98ssFm2/fb365ISfGQxD89Pf3WwoSTycnJI0eOuL+zsfFuTc37eEWVk5Po9gT/VCZzSSAxAxHWIJUuf+ONaEcBkT77bLSiIvXAgRI2m3LixN1bt55Wj8JUI8jptBNDe6LFfAqFcWJixmWh1fqkAqGPmIHIk3V0LG1vx5ZjFyYwTGhoyP366+0o2v7VV1ubmgrmVhmNRvej8h//+Ef3RnbtkldV/TdeIfkeYPiOGYgwl8SkmLBhA//ChS1TU3vmlgRYI4hAIO7bZxGJXsUrEt8DDN8xA5FX/8UXNe/jNrzETUkJa+7fAdYIYrFE7e0om10ewTAXmB8zEHn5O3e2arVwjJdxCKRGUEnJr5qbVQQCbolfwOJColL3GAzZW7dGO5CQbd/+zfLlb0Y7CiCa1vz5z7WnT0c7itBkZ29talIiSEzcvQSAIDGZxc3NKoGgNtqBAEBo+Pz1mZmbox0FAAAAAAAAAEQcjnWcfMNUeyohgWw0ttWHv3JRbJJkZBxesSLaUcQcPzc1cKzj5Bum2lPT07azZ8dawl+5KDaJudw+tTraUcQc//fncKnj5FsQtac6OmQvvJCVFM7KRbEpMyEhjUbr12iiHUjM8d+Vcanj5FsQtacuXlTq9dYd4axcFJvEXO6wXq+3WPy/Nc7478qh13HyE0FQtaccDvTkyZF4G2PABMJKDqcXjC48CWgCUIh1nHzzWHsqEB0dslWr0rLCU7koNi1jMhEYvqnVRjuQWBRQV56r4xSOCDzWngrE7duPbt3SNTfH0aR7MZcr1eksDke0A4lFgU7L7FX3BlEuxC8qiVqaUhp0dYiODllzc7yMMagkUmlKChhdeBNoV76huZFKSQ2ijpNvFewKo8147/G94DY/dep+Xl5SFd6Vi2JTBZtttNnuPX4c7UBiVKBdOeg6Tr6FWHvq4cOZCxcUcXLyJ+Zyb0xOgnpY3mDI+wiijpNvuNSe6uiQNTbmIfhVLopNbAoln8EAowsfMPQA9zpOJALJpYo1GSbDP6RF+V4L4VR7qrt7HEGIz/xN7CoORzE9rTIaox1I7MJwiHWv43Sw7KD76Plvw3/7Sv2V37UQTrWnTCb76dOju3YVdP9QueiZVMnhXJ+YiHYUMS2kClE8Gm8J0TWhX2vWGm1Gv2sBAAAAAAAAAAAAAAAiI84Tk8InQ5Kx4nCgKU/EJcSaYzUsUbw/NS+km2RxnpgUPlwxV90X6I09h8Whvanlxv2j/0O93xu3iUnhk5CZQEujafoxpDyp+9QppSlESqi1cRe1ULty3CYmhQ9XzNUP6y16DBO49ff09hl7akVq+KKKfaF25fhMTAofAkzgrOSoe7FNG0KdqKZfE+djDBwmlMVhYlL4MJcxYQTW3sSc8qTuUzPyGZQ4rjOEQ1eOw8Sk8OGKuTqpzmHBnPJkVBqNSiMnPrIQPMJnmm9cJSaFD4lKSilNwTq6mKPuVXPF8TvGwKcrx1ViUviwK9g2o+3xvSBTnjQ3NJRUSmJOnI708OnKcZWYFD5cMXfyxmSw2WGQ1WB9fPdx3B6YccsjipPEpPChsCmMfEbQo4tZml5NamUqgRTSNPRFCreeFyeJSeHDqeJMK6aNqpDyErRSLUyE4/MmNm5deS4xCa8G4w2nEvPlZHdOm3NyYJKzEpy0AAAAAAAAAADwg7ieFriIzBarRVHwDE+vwGXgxSEpKb+09HUSiRrtQGIX6Mq+lB0qe/nOyxHbXXZ2NoqifD7ffZVWO2g0KgsLfxqxYCIpQyJZcTjQ+mDegK7si7BZKPtYFuGdms1mj8vl8i4mcykr/IXnIo8rFqv7Aq0P5g3oyl6xl7OTi5NHOkcitkcYhiEIMhgMHtfabFMazdcCQW3E4omMhMxMWlqaph9DfTCPQFf2StgiVF1WGZVhecIdSyQS7d/vspBAIJjNZpvN5m0rrXYgOblo9hQwHEQs0X6Ra1ThxhWL9cPDFj2G+mAe4faw5GcMTILzd+b3vR7qXz0XBBhOrazMkEjofP7U2JjL2tHRUSrV14nd99+PQhDEYAgnJ78JcI9EAnH+g4Bn2Z32+Y9nhwlwZWqlJEPCp/PHplyjCisCDHNWrpR3dYXeFOjKngkkAjKdLP9cjleDMJnMq6kR1NYiDIZ2YGCks9Mgx9y4w2G2Wg00Gi/wTVoLW93rIZ3494lB7SAEQWSYXMOrqRXUMhDGgHagc6RTbsDtIweCuWwZjCDam5jrg7kDXdkzYYtw7OyY3WjHq8HC1lZ2RcWDnh7VpUu2EJ74bbfPkMkYJtefGz93UXnRZeGkaXL2H62FrRXsip4HPZdUl6LysGCuWKyTSh14VNQEt0g8QBjImv9d0/+f/Qa55zOwIKBOZ2J2NrO4mESnW/R6m5dzO7/S0tbYbAadbijA91sclmnb9JRtav7L6rDOrnWizuzE7GJmMZ1E11v0BhtunzcQJCpV2Nw89ve/m/GoRAiOyh7k7sg168zKi0oc29RJpbqhIXZ5eUZdXfratQa5XHXlShCn7UQiYrNNB/5+3wMMqU46pBsqZ5fXZdStTV8rN8ivqK5gKjYeCnZFhc1ofHwvyPpgLkBX9kDYIrx/6j7qxLsaE4pqBwe1g4PJRUUZdXUFu3dj7coEArxkSbLFgiH5z/cAA4IgFEIHtYOD2sGi5KK6jLrdBbsj1pW5YvHkjRsQ6vV7RpKSIAiyevkL5nstACXmJLY7230kYlRXH2lvR4nEUJ84Qfd0V8/PJvT01atPJCRkhLhrH/h0zFH5UH3kSDuKEikevisKm736+HF6erq3bUl0eqtW+7PHj5Hk5EDWgqOyq4KmAq1U++jOI29vIBBIEISiaKhnhEYl5gFMcnKx1fr99LRiQTwkAoHgmsyHOtDg/qoojXgOqwgkEoSiqN3Dd8WpqppWKIwqr/XBULvdPDlJIJGcni60u68FXdlV/s78u3+66+MNdLpAr5c5nbhd3Agcl1ulUl2FFuZklx0sc39gwPDfhtVfRb/IH10g0MtkTo9dubJy4rqv+mAOi+Wz4uLg1gL+IQhjz54pkeiXkd91SkqZWPyO+8CGxqMlZiW6vMh0cuQjdIEwGHumpkS/jMJ3BfgHw6Tc3IYQi8QFgUZLE4t/z2QupuMQTCLlNjRAboMfIK4lJxexWCXRjgIAgPADd/uwmb2WiTpAYpJ/NB4NRVGnzRmZ3YFJntgk5eeXvv46yef8NWAWr4a39cutCCNCxT1AV/bAV2LS4KBRqSz86U/x3SOOVZ4wVZcKnY/vSt4l193WrfvrushEArqyV14Tk7q6mEuXskR4JibhWOUJU3UpvHj7rnpf6xVsEmT8OIy3J+eAruyBn8SkqSnN118LanFOTMKlylMQ1aVC5Pu7Mk+a739yv/RgaSQiicA+YpmIxdrvdnz1n5g0MJBcVDR7ChjkfkWs/fsX7BeXKk9BVJcKXGZ9fX1Pj8tCv9+VvEvOX8+ncsN+dhGnN65hAqEyNVWSkcGn08emplzW+k9MGh2FIIghFE5+8zQxiUgkwLDr7QC73Tl/4hcMEyorUyWSDD6fPja2YL9zVZ4e/t/DoD7Tk+pS8i6c00BgEimvsbHs0CFWSYn7VD6/39Xs/fP0Nemjp0fxDcxF3HVlMgzX8Hi1AgEDQQa02s6RETn2WYIOs9lqMNB4CxKTWlsL3UtYnDjx78FBLQRBZDJcU8OrrRUwGMjAgLazc0TuNq9f3acW1AooKRSzzvPQ07egq0t5Q6JSi9rannvtNVpamvzMmWvt7ereXqyNWA1Wk9qUXOxhdhu+4q4rtxYWVrDZPQ8eXFKpjN7/LPpln5khJy6YxHPu3PhFt9n6k5OmJ/ttLayoYPf0PLh0SWU0et7vXJWnBz0Pgggp6OpS3qz56KPchoabb7995+hRs04XdDuWxxYqJ+wDjLi7ReJE0ezExGImk04i6S0WQ7C9OW3NGpvBoBt6mphksTimpxcmHk3ZrNYnHcvpRLOzE4uLmXQ6Sa+3GAye90tEiLznearLXqc+ekOikoTNwrG/j5m1wRzRPUIdDk5lJX/jRkpKilGhMKmDvDCy9D+WmtSm7859h1dgHsXdUVmq0w3pdOVsdl1Gxtr0dLnBcEWl6tdgPuUnIohtekFiku8BhlSqGxrSlZez6+oy1q5Nl8sNV66o+t0uNWhuaHJeyknMSZwacx3B+xZidSmPxru7vzt3Lmf79rJDh5a98oq6t/fbDz4Y6ezE2g6ZTjZP4vY/GOBBUXLygZKSo88/j3VDAgyvev/99HULLv6z2ZSsrESXF43m4WBRVJR84EDJ0aOe9yv6pSh/Zz7WkEoPlua+FMZK4/wNG7ZcuLDH7RTZLwKRsM+yT/TqM/h8sJjDp9OxbkJPT1994kRCRkhX/vl8z/vlVHKq/6caU5UnCpuy+vhqejrmD4IVqwTz7DyWiNWOtrPL2eGIZ754v64MQZAS+1MpkouLrd9/P61Q+H+rj/16eYSXe5UnAokAk2GXF2HehT9cqksF4tHt21g34W/gz0zM6IaCP2sMUNyNlXHBrapSXb3qI1U4FHNVnnTSJz+/35QnTiVn4vpEOIIJXUFzwbcffot/+joQupSyMvE773jMIg6TmE158it7a3aTsglJitDkOAADWlqa+Pe/Z4IEyQAwi5nNqmZBrSDagQCeJBcVBXHqE5/46/mZm0F1XQAAAAAAgGfFEuKSYzXHRD5L12Rm1u/bZ8nNbYhYVAkJZKOxrb4+FsedmfX1+yyW3AbP34a3tWRyQlubMTOzHveWgaf2FO3ZV7zP93uys19salJQqTjkLwWos3P9p59ujNjuMMl+8cUmhYLK9fxteFu7fn3nxo2fhqNl4ImlzKXv1bxHCflBnfjatEkwM9OW;4.blob,1.1,592.9AxdoBUINrW1zeBYIgjcuHZ1T39vxj5TkVoR7UAWuHhRqddbd+wI44ShCFMqL1qt+tzcHXg1CLqyKyfq7Nf0V3Orox3IAg4HevLkSEuLMNqB4AZFHSMjJ4XClmgH8kzj0/nHVx9PoaREO5AFSkpYTmd7VhaGmjoxjsUqaW93JiZm4dJa3GWRBGLKNlXOLocJ8Mj3kSul6pdGY9q2LYdMhq9di9GZQ1iZTJqcnG0wTJ6YuBZ6a2CA4VmvulfMFUc7ClcdHbLm5mdnjAFBkEzWIRQ249IU6Mqe3dDcSKWk5iTmRDuQBU6dup+Xl+SedrV43b9/Kikpj+NWwyoIYIDhmcVhyUvKY1FYdx7diXYsT01P26qruZmZCT1BpWTHIJttmsutTkjIfPDA9WExWIGjsle9mt7K1EoSIbayEzo6ZI2NeQjy7PxwMllHXl4jDId6yfzZ+UZwJ9VKiTDR903syOvuHkcQYmzexA7O+Hg3kYj4vokdCDDA8MqJOjlUTlZi1oB2INqxPGW3O/Pyklas4Jw5E9G66uHjdNqTkvI4nBVy+ZlQ2vl/hFUQbq9rO+YAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.141,3.440;4.blob,1.1,2992.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAqUlEQVQ4je3Sxw6CQBCA4QUrootiL2AFK9gL9vL+7+TN+JuYmHhlbt/MZLKZHSFeoagCEYnGmIgn6KSWYkJP0xmpwIbMsiFn0vkCXdTpUhmsVGtwXTZgy27CrTbY6Rrv7NkOym5ffIkBORyBzniCR3oWyr7GPU9nnDZfgEvpwyvpwmu5gbeSn7IL9px/+Nix6dHH4MTE+cItqtcbG+4P8UuE9xXel/j3vp4mDhXHgBNYGQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492359958;4.copy,1.1,2.90,3.228,4.1110,2.19,2.14,1.1,2.70,3.228;4.copy,1.1,3.100,3.247,4.1100,2.76,2.14,1.1,2.80,3.247;4.copy,1.1,2.90,3.266,2.10,2.57,2.14,1.1,2.70,3.266;4.copy,1.1,2.80,3.285,2.10,2.38,2.14,1.1,2.60,3.285;4.copy,1.1,2.20,3.304,2.60,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.950,3.323,3.250,2.38,2.14,1.1,3.940,3.323;4.copy,1.1,3.350,3.342,3.600,2.19,2.14,1.1,3.340,3.342;4.copy,1.1,3.930,3.456,3.270,2.19,2.14,1.1,3.920,3.456;4.copy,1.1,3.950,3.475,3.250,2.38,2.14,1.1,3.940,3.475;4.copy,1.1,3.930,3.494,2.20,2.19,2.14,1.1,3.920,3.494;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.rect,1.1,2.41,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.63,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.221,3.216,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.143,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.193,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1160,3.196;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.202;4.blob,1.1,1924.iVBORw0KGgoAAAANSUhEUgAAADoAAABjCAMAAAD95OMlAAACwVBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlajoF/HAAACnUlEQVRYhWNgIB4wMpKgGAUwMbOwkqmVjZ2DiVxrR8HgApxc3GTr5eElWysfvwC5WgWFhMm2VkSUbK1i4hJk65WUIlurtAzZWmXl5MnWq6BItlYlZRVytaqqqZNtrYYm2VpHAW2AljYKV0dXj2it2lqofH0DYnUaGhmjCpiYmhGp1dwCTcDSypo4nZY2tuhCdvbEaRVz0EEXcjRyIkqrgT6mmDNRxbmqqQumoKsbMVrdPTwxBQW8vInQam+HTdRHibBOXyM/bML+AYEEtQZhL3uDQ0IJag0Lxy4eEUlQ68gFUWTrjI4hV2dsXDyEkZCYRJrO5JRUBpjWNNK0pmdkQllZidmoUjm5eXi15hfAWIVFELq4pBTCKCuvqKwCs6prwKAWVWtdPbphDY0ZTZBAb25pbWvvADI6u8CgG0VdT286hkP6+idMLJgEYU+e0jWVgWHadDCYgaJsZu8sbN6YPad3LpCaN3/BwkWLcTh4du8kTI2ZS5YuW76CYeWq1WvWrmPA5eD1vRvQNW7ctHnL1m1AxvYdO6E9H6wO3rV7D7rWvfv2HwAzDh7C5hcEOHwEXWTmUTzKA4PBwBLEPnYcv9Fo4MRJMDgFYp/efYYUrbISYHAWzNl67jxJ9iKBCxcvkauV4fIVsrUOAYCztYLWqsEGcLVW0Fs1WACO1gpGqwYLwNFawWjVYANYWytYWjVYANbWCpZWDTaArbWCrVWDBWBprWBt1WABWForWFs12ABmawV7qwYLwGit4GjVYAGQ1gpSUYOjVYMNgFsrSEUNrlYNLoBS1IwCWoGr18jWeu0quTqvT1xBrtYbN8nVefTWbXK13rl7gVyt9+6Tq7PvwUNytS559JhcrU+ekqsz/tlzcrW+eEmuToZXqTilAI+qswpeN0hBAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.223;4.blob,1.1,1660.iVBORw0KGgoAAAANSUhEUgAAABwAAAB0CAMAAAChdKKRAAACkVBMVEUAAAACBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/cEAgJbJSXSVVX/Z2fIUVEJBARsLCzfWlr4ZGSjQkI5FxenQ0P7ZWWBNDQTCAhQICDaWFjxYWGVPDwuExMCAQFUIiLLUlLGUFBcJSVDGxu7TEzzYmItEhJ3dzDU1Fb5ZWVPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0DBwc8k5MSLCwoYmIpZWURKio8lJQDCAgBAgI4iooYOzsiU1MvdHQAAQECBQUBAwMLGxs+mJgIExMSLi4+mZkramozfX0eSkoECQkNHx8JFRUcREQ1goIGDg49l5cNISEsbm4kWVkWNTU5jo4BBAQ7kZETMDAmXl4pZmYOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnErEiuZPpkIAwg0FTSLOItMH0yBNIFZJFl/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0dR0c0f38MHh4HEBAjVlYucXE5jIwXODgSLS07kpIRKSkYPDw3iYkIFBQLGhoeS0syfHwxeHgXOjo0gIAbQ0MKGBgFCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarfgiI0AAACBklEQVRIiWNggANGJjBgRmbBAQsrGLAhs+CAnQMMOJFZgxlwcfPgk+TFLcnHzY9FVEAQTAkJY8iIiIqJS2A3SlJKWkZWDoc98gqKSjgdoayiqqaOU1ZDU0tcWwenNIOunj5uSQYGA3ySqABLMkEALMkEAQZ5MjE0AlMCxppYJI0MIbSJqRmGnLmFJW5Traxxy9nY2uGWtHdwxC3p5IxbzsXVDbeku4cnbkkvb9xyPr5+uCX9A3DLMQQG4ZEc8iA4JBSPbFg4HsmIyCjcktExsXi0xsWDqYREEEhCYTEwJKekgqi0dBDIQGEBQWYWiMzOAYFcFBYQ5OXjsbSgsAiPbHEJHsnSsnLckokVlXi0VlXjkaQlqKnFI1lX34BHtrEJj2RzSyse2bZ2PJIdnTW4Jbs6u/Fo7enFI9nXj0dyQhseyYmTcMtNnjIVt+S0zum4JWfMnIVbcvYc3HJz53XhlJs/cwFujQsX4ZajN1i8BI/kksW45ZamLMMtuXwFbrnolatwS65eE4xbMjwMt1x25FrckuvWJ+CWjI/DLbchZSOYLgeXeInRyCyGTZshiraAS7z0rcgshm3bIZI7wCVezk5k1uAFu3bvwSO7dx8eyf0HDuKWPHT4CB6tR4/hkTx+4iQe2VOn8UieOYtH8tz5C3hkL17CI3n5ylXckteu38Cj9eYtrMIA+mOIW+hRngYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.345;4.blob,1.1,4332.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.362;4.blob,1.1,8064.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;4.blob,1.1,616.KXvpuzXv0qL8sFx8bdwomppqS1pAF6RFoo1tbVM4Fh4DUwA83TXenXJOVaRWEB0IBhcuqI1G+/btUZy2FWNq9QW73Zibux2vBkFH9+RG3f26/mp+NdGBYOByoSdOjLS0iIkOBDco6hoZOSEWtxAdyIImZAqPrTqWQkshOhAMSko4bnd7VhaGSl1xjsMpaW93JyZm4dLaosswCsWEY6KcWw6T4JHv4qVsdFA6nWXr1hwqFb56NU7nb2FlsehycrbCMPXhw6uRtwaGLr71anulfCnRUWDT0aFobl44oxcIghSKDrG4GZemQEf37brueiotNScxh+hAMDh58l5eXpJ3Ot/8de/eyaSkPJ5X3bwwgKGLbzaXLS8pj0Pj3H58m+hYQjU56aiu5mdmJvSE9ZiAOORwTPL51QkJmQ8eeD4aCStwRPerV9dbmVpJIc2n3JSODkVjYx6CLJyvVaHoyMtrhOFIbxEsnE8Ed3K9nAyTA08HiDfd3fcRhByf0wHCc/9+N5mMBJ4OEAowdPHLjbp5dF5WYtaAfoDoWELldLrz8pJWrOCdPo3zo+eI4nY7k5LyeLwVSuXpSNr5f69/EG6WmKvzAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.440;4.blob,1.1,2992.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1101,3.668;4.blob,1.1,1564.iVBORw0KGgoAAAANSUhEUgAAAGEAAABHCAMAAAAgLdm6AAACDVBMVEUAAAB3dzDU1FYyMhT9/WYbGwsGDgaQkDq8vEwECwRf7F9h72EGEAYEBALp6V5eXiYDBwNX11dY21hLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6Kijg5jDln/2cDCAMhIQ3+/mcsLBI6kDpn/mcCBAJ9fTLOzlNFrEVX2FfW1lZwcC0GDwZi82IsbiwiVCIAAQABAQECAgI0NDQ+Pj4REREKCgoGBgY3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4ICAgNDQ0DAwNNTR9JSR1DQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxIHBwM8PBh4eDGXlz1lZSkQEAddXSaSkjuRkTtVVSISEgeGhjZERBwICAMXFwkNIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDtTIlN0L3QoKCgUFBQbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWYcfVwxAAACQUlEQVRYhWNgIA8wMuFjUQMwMeJjUQEws7DiZrGxUcEGdg7cLE4ubh6KLeDl48fNEhAU4qTYBmERUTwsagAxcXwsKgAJSSk8LGoAaRlZPCxqADl5fCxSgYKiEjpLWUWVATcLSSFCLz6gpq6BztLUgkliYyEpROjFB7R1MFi6egx4WEgKEXrxAH0DQwwWsVqI06FhZIzBIlYL0TooByampjS2wczc3IK2Nlha0NoGBqthagOiJqQGC2aDtY2tnb0DmImoCanCgtrg6OTs4urmDhZC1IRUYUFt8PD0YmDw9vFloD6A2uDnDyIDAmlmQ5BPMIgTEkozGxjCIH4Ip50NEZB4iASLUSe1otkQZRvtHRPrDBaiTmqFV6Ow/BAXbxuQkAhmUie1wqpRkySalRrQapR2pTesGrVMTk6hjQ10rEZHwcgD1K07oazUNET3i8p1J5SVnpGZlQ21gcp1J4yVk5uXX1DIQFtQVFxSSkvzy8orKquqaWc+a01tXX0D7cxnYOBvbGqGc6idWsGgBakbTO3UitkZpXZqJbIzSgkgqjNKCSC6+0o2GK1FBz9oVWxDY7V3dEJFiGUhm4LNhi50VncPTJJYFpIpmKBXsQ+d1T9hIgNpLCRTMMGkyRisKVOnkciC6jUxBQOcdiHA9BmksiBgpjkYzCJsw+w5c0lkQUBSMhh4EbaBYd58UllgQHwoMSxYSCoLDIgPJYZFi5eQyAIDEkKJYekyUlmkguUrVpLIIhWsWr2GRBbJYO06Uln0AADC/tD8tQcAcgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.742;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492360063;4.copy,1.1,2.70,3.209,4.1130,2.19,2.14,1.1,2.60,3.209;4.copy,1.1,2.80,3.228,4.1120,2.19,2.14,1.1,2.70,3.228;4.copy,1.1,2.90,3.247,4.1110,2.95,2.14,1.1,2.80,3.247;4.copy,1.1,2.80,3.266,2.10,2.76,2.14,1.1,2.70,3.266;4.copy,1.1,2.70,3.285,2.10,2.57,2.14,1.1,2.60,3.285;4.copy,1.1,2.10,3.304,2.60,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.370,3.342,3.830,2.19,2.14,1.1,3.360,3.342;4.copy,1.1,3.990,3.456,3.210,2.57,2.14,1.1,3.980,3.456;4.copy,1.1,3.970,3.475,2.20,2.38,2.14,1.1,3.960,3.475;4.copy,1.1,3.960,3.494,2.10,2.19,2.14,1.1,3.950,3.494;4.rect,1.1,2.63,3.196,4.1106,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.364,2.18,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.173,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.183,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.223,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1160,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.63,3.183;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.345;4.blob,1.1,4332.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.771,3.362;4.blob,1.1,8064.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;4.blob,1.1,644.Wxz6k5yudeXK9tWrP4lFzwAmc/lz361+lxXjh8aTa80a2dhYS8pTc0tBJlvT0jJGYglVsCwFn9vW22PeMWW6kupAcDh3Tm+1ujdvjuESxhlFrz/ndlvz8zeT1SEYJPj4UX+PqWexeDHVgeDg86FHjw42NckjvzUhoKhvcPCoXN5EdSBPMSlXenjp4TRWGtWB4FBWJvD7W3NycFQVndUEgrLWVn9ycg4pvYHMRNxGPCPzhfNhGjz4/SDVsWBlMjk2bMhjMuHLl2flWka8HA5TXt4GGGY+eHA5+t7AdIuILmOXSqyiOgp82to0jY1Py4wLgiCNpk0ubySlKzBIiLhquprOSs9LzqM6EByOHbtTUJASnEKcqO7cOZaSUiAKqh5MAJhuEeHyuQpSCgQswc1HN6mOBavRUc/ixeLs7KROQo9TmXU8nlGxeHFSUvb9+9M+FA8jcCYhqMvUVZleyaDNpqy1tjbNli0FCPK0/E/XaNoKCrbAcLQ3iJ6Wz4t0arOaDtPDL1GZaTo67iEIfTYuUSHm3r0OOh0Jv0QFCzDdIsiP+kVsUU5yTq+5l+pYsPJ6/QUFKQsXik6c0FIdSzz4/d6UlAKRaKFWeyKafv4fi1s5aqFyI64AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.440;4.blob,1.1,2992.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1072.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACEklEQVRoge2Y11ICQRBFUVGiacSEilkxopgDxv//J5cZxJ0pdqrZvlXtQ/cHnLlvc+oUCoI3Ifn4301OSS+wV5yekZ7Qv1K5Ij3BXrVWl55gb3ZOeoG7+QXpBfYWTVV6gr0l05CeYG/ZrEhPsLdq1qQn2FtvbkhPcLe5Jb3AXassvcDddnNHeoK73b196Qn26geH0hPcHR1LL8i4vH7WhvzcQ0puPzs5PQPs+KUw/Oz8ArBjQOH42WUN8Uk4CsvPOleAHY7C8rNr0wbssBSWn3XNDWBHn8L0s9sWYEefwvSzO8jvnVCYfnbfQexIKEw/e3hE7EgoPD8rPT0DZlgKy89ezCtgh6Ww/KzSQ7iMpbD87O0dMGNAYfjZx2cXMGNAye9nX70iYMaQktvPGt+AGSAK/saxPEzpG00Zw/IwpS+LQrY8TOnLpFAtD1P6IhSi5WFKX4RCtDxM6YtQiJaHKX0xCsnyMKUvSiFZHqb0RSkky8OUviiFZHmY0hej0CwPU/piFKLlYUpfhEK0PEzpi1CIlocpfdkUsuVhSl8WhW55mNKXRRnDzzClT3thnKK9ME3RXuhTtBd6FO2FPkV7oU/RXhhQtBcGFO2FAUV74cjTXhic9sLgtBf6p70wOO2F/mkv9E57oX/aC9OnvfC/nfbCNEV7oUfRXuhTtBd6FO2FPkV7YUDRXuhTtBcGFO2FKcoPcyRYKaNg5/kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.723;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAABEVBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0BAQECAgIFCwU+mT4oKCg+Pj4UFBQJFwkQKBAICAgNDQ0EBAQLHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4XFxciVSIucy4AAQAKCgoFBQUyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQSEhIrKyszfzMJCQk2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIEBAEFBQJ4eDGZmT4YGAofHw08PBic0cRKAAADH0lEQVRoge2aZ3PUMBCGBQRCKuXAlECAECDU0EINhN5DJ5T//0M4W7K0ktfSSlodMNz7JXNZ+0ksz+j1c2Mhhtkmimb7jqL4iZ27SMdN7k7CT03P0A5M5M/OzRfl79lLPDCRv2+//Dk40CSC7z9DTsXBalZ+PnS4yRE633+GnIqj1YL8fOx4k0U633+GnIoT1Ul4Pezrc6pagtfDvj6nl8/A62FfH3H2XC8xwKdlZTqfr+7EAJudX76QzZ+Ud+IiOrx0+Uouf1XeiavocP7a9Vy+PzduJp74d2WNuE+n5tbtO2X/wN173nHy/W1zf26pKF+sPyjLf1itFeVvVI/S+MHuUHm8QuAjW1mwO1Se+PZqxX/aoJ5Zo2B3qDxfD/MXG9QLa0Rdn5evwnwsxPWZev0mjU9cn7fVuzQ+MTObvqaJ5A+6t+T9B98JkXzZmfA3Hz9tMPJX1fOJzufNCf8/lLn+C1/yzv9zGfujJ2N/9Kf1RyqfuteraH+k8tG9vv/xX/sjlY/t9Vhnqmh/pPKx9cE6U0X7I5VPfVZQ0f5I5VOfFdr8C/6I5eu3Ojz+iGXrex3B4o9YfvysI8b+SA2fP+J9y+aPfX3L5I+mb7d+WQMefwR96/B5/BH0rctn8UfQty4/2R9hQN+6/NYf8bbz+CMI7NsOX/pjT9t5/BEE9m2HL/2xp+08/ggC+7bDT/VHENi3Lj/ZH0Fg37p8Fn8EfevyWfwR9K3LZ/FH0LcOn8kfTd/afC5/NH1r89n8ceR9W8Yfdd8W8se2b3n8sbPXtH3L5I8IX/Ytkz8ifNm3TP6I8Zu+jfVHE8uUMH7dt9H+aGKZEsav+zbaH00sU0L5w76N9keT4PrUfRvtjybh9Rn2bbQ/mgTXp+lbJn/E+E3fMvkjxm/6lskfMb7sWx5/RPiqb3n8scvXfVuoz0b9fe3/7Y/m/pbxR80q5I+aVcgfNauQP2oWwR9z+AR/zOIT/DGLX8ofW1Ypf2xZpfxRs8L+aN62sd67sb/fdqeaFfZH87aN9d6N4vdMNSvsj+ZtG+u9G8XvmRpWGX80rJH642/0EqK2D8mg4wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492360168;4.copy,1.1,2.80,3.209,4.1120,2.19,2.14,1.1,2.60,3.209;4.copy,1.1,2.90,3.228,4.1110,2.19,2.14,1.1,2.70,3.228;4.copy,1.1,3.100,3.247,4.1100,2.95,2.14,1.1,2.80,3.247;4.copy,1.1,2.90,3.266,2.10,2.76,2.14,1.1,2.70,3.266;4.copy,1.1,2.80,3.285,2.10,2.57,2.14,1.1,2.60,3.285;4.copy,1.1,2.20,3.304,2.60,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.400,3.342,3.800,2.19,2.14,1.1,3.380,3.342;4.copy,1.1,4.1040,3.361,3.160,3.152,2.14,1.1,4.1030,3.361;4.copy,1.1,4.1000,3.399,2.40,3.114,2.14,1.1,3.990,3.399;4.copy,1.1,3.840,3.418,3.160,2.95,2.14,1.1,3.830,3.418;4.copy,1.1,3.800,3.437,2.40,2.76,2.14,1.1,3.790,3.437;4.copy,1.1,3.510,3.456,3.290,2.19,2.14,1.1,3.500,3.456;4.copy,1.1,3.530,3.475,3.270,2.19,2.14,1.1,3.520,3.475;4.copy,1.1,3.540,3.494,3.260,2.19,2.14,1.1,3.530,3.494;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.copy,1.1,4.1110,3.665,2.90,2.19,2.14,1.1,4.1100,3.665;4.rect,1.1,2.63,3.177,4.1106,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.364,2.18,2.80;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.980,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.368,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.383,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.203,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.253,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.231,3.345;4.blob,1.1,4336.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.751,3.362;4.blob,1.1,4820.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.440;4.blob,1.1,716.iVBORw0KGgoAAAANSUhEUgAAAR4AAAAyCAMAAAC9DkQdAAAAnFBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAIEwgICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzVHf0ObAAABN0lEQVRoge3aSVPCQBAF4BECqAiCKBBZZQeDsvz//0ZlDqlUCqZaZnqW8n0X3qlnOHXyKkKIh1JZSFFFVGuFRJZNIadQPD49y9+oLqovhfT3KfQUmEZTvLYKCTLtN9F5LySAu310Uz3WydTkoX6c+mSdTE0eGgxTI9bJ1ARBG4/9uQE12TOZfs3sn3r9BtRk0XyxnFg/9MYNaGklt153nU+Q2citF2/zCTI7ufWG3/kEAAD/UXiFaB7/7YMtRKWwbw8AgfO6pnXP65rWPdS0zqlryyQxcYaZKWo89au6ttz//B70zzAzRY2pflUXrMfTea9/hpkpau6LYgAAAADbwi6K+TFVre4/b/GZ+89bvIa3FgAA/+gsdp26lK9qNfmoorPYdepSvqrV6KOKzmLXqUv5qtb0H10AuqEr3IDddEEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.233,3.499;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1091,3.684;4.blob,1.1,1220.iVBORw0KGgoAAAANSUhEUgAAAGEAAAA2CAMAAADgUwfeAAABtlBMVEUAAAAGDgY3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAYnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21iqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e05jDln/2cDCAM6OjrExMSXl5cODg46kDpn/mcCBAJFrEVX2FcGDwZi82IsbiwiVCIAAQBNTR9JSR0LCwRDQxuUlDyTkzxZWSQWFgkJCQQ/Pxp6ejGYmD5qaislJQ8cHAtubiyZmT4rKxIHBwM8PBh4eDGXlz1lZSkQEAcbGwtdXSaSkjuRkTtVVSISEgdeXiaGhjZERBwICAMXFwkCAgExMTEYGBgNIA0LGwsHAweTPJMsEiwIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgOIw5k92QCAQKKOIo7GDsBAQECAgJTIlN0L3QoKCg+Pj4UFBQbCxuYPpgTCBMICAgNDQ19M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbKzvuhAAABlklEQVRYhe2W5U8DMRiH38GAYcNhGzDcGT7c3d3d3d3dnf+YrHe7Y90ttyZtQrL7fbh72kv7pL0mbwGUuHZUKrrExc1d7eHphVDj7eMLFImLn782IDAoGHFIaJgGKBKX8AgdgN4QCcwSFW15GmOYCWINcZZXfAIzAyRya0hiZ0jm/kMKatA8o0JS1Wn69AwtYkpnNNOUZaPIzlEbc/MQUjqj+QVmB8uhlcIixoLiklLGBnNZOWODEhcO7dqJqKKyShDQrp0cVdfU1tXzBtq1k6eGxqbmllZgm7b2jk6W83d19/T29bObf2BwaHhklN38AGPjE5NCg8lNb2paZOo3PbyK0r/pKVXUiShV9J9lZtaua840j9HC4hLf4yz9mUXSsIzTyqr1o7MkjpUwrJnWcdrY3AIyEsdKGLZ37Gh3b5+QxLG84eAQxc5mzdExKQnhDSenKGeODOcXl4SEG66uUXQOF3FzS0qYQW6X4O6elDCD3C7Bw+MTIWEG2V2C5xdSsjXI5/XtnZBIDR+fX4REaoDvH1IC+AUotJ7LfFr/0wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492360266;4.copy,1.1,2.80,3.209,4.1120,2.19,2.14,1.1,2.70,3.209;4.copy,1.1,2.90,3.228,4.1110,2.19,2.14,1.1,2.80,3.228;4.copy,1.1,3.100,3.266,4.1100,2.57,2.14,1.1,2.80,3.266;4.copy,1.1,2.90,3.285,2.10,2.38,2.14,1.1,2.70,3.285;4.copy,1.1,2.20,3.304,2.70,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.900,3.323,3.300,2.38,2.14,1.1,3.890,3.323;4.copy,1.1,3.410,3.342,3.490,2.19,2.14,1.1,3.400,3.342;4.copy,1.1,3.880,3.456,3.320,2.19,2.14,1.1,3.870,3.456;4.copy,1.1,3.900,3.475,3.300,2.38,2.14,1.1,3.890,3.475;4.copy,1.1,3.880,3.494,2.20,2.19,2.14,1.1,3.870,3.494;4.rect,1.1,2.51,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.402,1.8,2.42;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.31,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.250;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAABsAAABZCAMAAAD4mq8AAAACB1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0DBwc8k5MSLCwoYmIpZWURKio8lJQDCAgBAgI4iooYOzsiU1MvdHQAAQECBQUBAwMLGxs+mJgIExMSLi4+mZkramozfX0eSkoECQkNHx8JFRUcREQ1goIGDg49l5cNISEsbm4kWVkWNTU5jo4BBAQ7kZETMDAmXl4pZmYOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnErEiuZPpkIAwg0FTSLOItMH0yBNIFZJFl/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0dR0c0f38MHh4HEBAjVlYucXE5jIwXODgSLS07kpIRKSkYPDw3iYkIFBQLGhoeS0syfHwxeHgXOjo0gIAbQ0MKGBgFCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRar0dXw/AAABfUlEQVRIidXUVVMCcRQF8D/Y3d2BgoiiKCbYgYGdYLfYCnZ3d3fnh5RdRwcYz6OOnoe7Z/a3d/btEkKFwSTa0dM3+KxMho4RQyPjj2JiaqZrXzG3gGRpZQ3NxtYOmr0DJEcnZ2gurm7Q3D0geXp5Q/PxhUT8/LH947ACAjGyOdiCuMHQeCGheJEfRs1wAZUIrUZIpDBKPaNjqMRqNXXi4tVDJKaSoNXUSUzCP0xOScWYlo4tI1MCTZCVjRdzcrH9VKR52PILCjEWFWMrKS3DWF6BrVImhSaXVeHF6hpstXXY6suxNTRCampugdYqa4PWruiA1tkFqbtHjqhX0QfX+gcg/WqUKmwqJaRB4RC04RFIvNExaOMTLGgcNiQRdxLa1HQ4tDA+pBnhLPWQ0FdMwNNsZG6e/mSBvmIxi5qNLC3TtkJfMfGqZvuLWVvfwLi5hW17Zxfa3v4BXjw8wnZ8corx7BzbxSW2q+sbjLd32O4fHqE9Pb/gxde3796+A5ySUcH16WX+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.345;4.blob,1.1,4348.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.731,3.362;4.blob,1.1,4368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.440;4.blob,1.1,1108.iVBORw0KGgoAAAANSUhEUgAAApsAAAAOCAMAAABXeCePAAABa1BMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwMDAX19WNKSh4dRx00fzQDBwM8kzwSLBIgTyBc5FwJFwlf619Is0ikpEKoqEQoYigpZSkXOhdZ3VksbixDpkNGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMYOxhUz1Qtby0+mj4DAwHm5l1jYygjViMucS4BAgE4ijiLizjBwU45jDkiUyIvdC8CBQItLRL+/mcfHw0SLRI7kjsLGwsIEwgfTB9n/2dHsEfQ0FR8fDIzfTMGDwYVNBUOIw5yci7Z2VgECQQRKREcRBw1gjUYGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSQECwRf7F9h72EGEAZZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAFX11dY21gCBgIBAwEJCQTy8mJQUCAeSx4yfDI7kTsTMBNRyFEnYCecnD+qqkU0gDQbQxsmXiYpZikQKBBCZJTUAAABjklEQVRoge3XV1MCMRQF4KCIBdauoNhQwC4WwIrYsHds2Hvv/ec77AzsbjYMAZbcEfK97MmdzZ3zGoSQLicXifR5yJCPJWrRLdSJY6ugsAi6QixGk+IoFJdEYmlZufjVVyBDJZboRbbQJ46tqmroBrGYjMqz2YL/UVOLrHVY4jJHfUMjdAWyJluzctBid2C/OFtRWzuWuMzR0dkFXYGsuwcbuHqdIEU4MH390A2IXAN6fOT2UFxzhHnTUSi6mTZxqRocGoauQDIyKuCjMZsv7rVxf9hEGgpJm2kTl7LJKegGJBazejati3ttJhA2m4ZC0mbaxKVsbh66AcGCfVE9XFpmX4SDtLK6Bl1BbX1jUz0Mbm0ntCQY1KhN0qQGtIlT2NmFbqDmcZOm1r1EdoT2Dw61aZMsqQFt4pSOjk+gK+BObWek8fnFZQJLhKvrkEZ9kiQ1oEs34hvfcStP2e3u/gG6Au7xiTj2Pr8wLsLWq/jG97/JU5Z7/4BugPv8Is+/f9j2YOxXfOMHfPLE/Rt/nE5XGZoCBt0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.313,3.459;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAANYAAAAMCAMAAAApmLNVAAAAYFBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwkBAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYICAMECwRf7F9h72EGEAYHBwOOjjmPjzoKCgQDBwNX11dY21gEBAKBgTSDgzUi5FNBAAAAgklEQVRIie2PyQqAMAxEq3VfW/fd//9LzaUUob0YCgbfbWBI5jHm+fy7mNYzHoSR4y2YGNYz1zvc8Gt9CSJacQKkKhPRynKgUJmIVlkBtcpEtJ7oWkLYmlJi/MO5Yuf20LSatuvN3WGc5vcfca7YAQ9Na1m3xlzej3N4/xLnih3wuABzuyHLBGd5VQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.333,3.476;4.blob,1.1,1108.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABjFBMVEUAAAAGDg4DBwcUMjIyfHwECQkeSh5l+WUiVCIgICD///8bGxsnYWEraWkgTyBc5FwJFwkTExMFDQ08k5MSLCwGDgYiIiIFBQUmXl4ucXEECwRf7F9h72EGEAYsEhJtLCwjIyP39/cSKys+mZksLBJtbSwDBwNX11dY21gCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAICAMoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjsHBwOOjjmPjzobCwsLGhoMHR0bGwsEBAKBgTQbQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0VA21YAAABbUlEQVRoge3XZ08CQRAG4MXO2QuK2D0rIgoidgF7xd6wN+yKXbHrHzd7QS+BA40Xd5Zkng+7k9nd5P22GUIQIkQTA50A8S02Lh46wn9LSEyCjhCFtEJyoEpJBQ3CQlp6BnSE6KMVMgNVVnZOuEs6HaM0iD+5Qt5Xqc8Pc8dQUFjEKA7iR3GJtJWWfXfKRY3CvYpKUlVdY2CUCnGi1lhnqg9umsUGujVaJFZaN9ma7S2swyFwrW3tHZ1dof1uB12ddomLEEtPb5+zn3U6BG9gcGhYqT8yStexcYmbkInJqWm2yRAfZmbn5hcU+ot6usq/zJJneWWVcTbEhbX1DdOmMaS9tU1X+ZchVteOfdembtr1emHeRobz+4/29g+CW4dHx3STfxnq5PRM1bTrO79wQ7yNDOf337gMblyJ10r3blRNu7d3Hh/E28hwfv+Te/8DdATEtccn6ASIa88vZugIiGev/jfoCIhr7x/hTj4BYYY2H6SD1msAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.263,3.499;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.459;4.blob,1.1,1476.iVBORw0KGgoAAAANSUhEUgAAABAAAAF5CAMAAAChoVp1AAACN1BMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MSLCwiIiIFBQUmXl4ucXEjIyP39/cSKys+mZkDCAgVNDQ4i4sfTEw0gYEkWVkzf382hYUhUlIBAgI9lZUaQUELGhoMHR0bQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWYJFgkcRhwwdjARKRE6jzoIFAg1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcBBAE9lj0ZPRkkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYyfDIECQQnYScraSsFDQUucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQwyejITMBM4iTgKGQoSLRKUZhCwAAAB1UlEQVRYhe2Y6TPVURjHz7WUJS24rqSE7EslKiKuEi2E7GuENktFqz37Jfl17bJnKdFGFH+ce811+T4zZjBjxovn8+Kc8/2c55wzvzPn1U8ILTIDgRjIMBsaGaM4cBCziakZCvNDFigOH8F89JglCitrOQobBWbb43brwxP2JzXtKQf93GlHJ03rfEYvXFxxsZu7BwonTy+xQ7x9iPA9e26tP+93QWf8A3Tiok5cuhyo7YL8rqwvCg7RtldD9buEKb1x23DlNXLQ9QgibkQSERVMxM1bmG/fiUYRo7yLIjYuHsW9BMyJSeGQk+NSsCA1TeyO9IxM/Tgr21PT3s/ZmM19kCdEfsFDXPPo8ROyy9NCIoqKS4h59pyIF6VElL18RczrN0S8fVeOoqKyipRU1wiGYRiGYRiGYRiGYZh9Sy3J7+sw1zc0QpY3NWNBi6oVRdsHsmX7R8wdUguKT5IaRafUhaJbskPR09tHTpH1EzHQRMTn3kFihoZHULSOjpGS8S9ie0yQaxCGk1PETH8l4puKfJYwmyHiuzSBYlaaIyU/Boj4Sa/iF/lfK37/wSyfX0DxV1pE0awYQbFkjvnf/1nIy4p6LFCviC3hV7gZfoU69uoVrgIrJYU0AuNAPwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492360375;4.copy,1.1,2.90,3.209,4.1110,2.19,2.14,1.1,2.70,3.209;4.copy,1.1,3.100,3.228,4.1100,2.19,2.14,1.1,2.80,3.228;4.copy,1.1,2.90,3.266,4.1110,2.76,2.14,1.1,2.80,3.266;4.copy,1.1,2.80,3.285,2.10,2.57,2.14,1.1,2.70,3.285;4.copy,1.1,2.10,3.304,2.70,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.430,3.342,3.770,2.19,2.14,1.1,3.420,3.342;4.copy,1.1,3.580,3.456,3.620,2.19,2.14,1.1,3.560,3.456;4.copy,1.1,3.600,3.475,3.600,2.19,2.14,1.1,3.580,3.475;4.copy,1.1,3.610,3.494,3.590,2.19,2.14,1.1,3.590,3.494;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.copy,1.1,4.1110,3.665,2.90,2.19,2.14,1.1,4.1100,3.665;4.copy,1.1,4.1110,3.722,2.90,2.19,2.14,1.1,4.1100,3.722;4.rect,1.1,3.893,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.413,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.432,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.263,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.862,3.250;4.blob,1.1,340.iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAMAAACXZR4WAAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAAS0lEQVQImVWIRRLAMBDDNikzM8P/31jISTrYI4m8KP2tWLYjBq3Mu57/fxBGAuKEnmY5Q1FWDHVDb7ueYRgnhnmhr9vOcJx0uW76A+3cAp67rvAdAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.345;4.blob,1.1,3276.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.362;4.blob,1.1,2784.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.400;4.blob,1.1,2184.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.421;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAAFcAAAAOCAMAAABtl3BhAAAAdVBMVEUAAAAdHUc0NH8MDB4+PpgHBxAjI1YuLnEBAQI5OYwXFzgSEi07O5IDAwcpKWUoKGIEBAk8PJQRESkYGDw3N4kAAAEvL3QiIlMICBQLCxoCBgIDCAMBAwEeHksyMnxRyFFn/2cnYCc0NIAbG0MQKBAVNBUIEwhas9TuAAAAYElEQVQ4jbXMNRLAMBBD0bXjMDjMTPc/YiZbu/KMfiNVjwiRkBCWpICwjnIhrudD2CCMIG6cpBA30xA2L0qIW9UNxG07CNur4Z9x4mbzs2hZebadO8zPovPiuR/uNT/rPlz3Cs1rX4OVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.421;4.blob,1.1,1000.iVBORw0KGgoAAAANSUhEUgAAALEAAAAOCAMAAABXaw1XAAABcVBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh5HHR1/NDRiKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYeDAyYPj4QBwcCAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyhWIyNxLi5TIlN0L3SMOYw4FziLizjBwU4CAQGMOTk4FxcbCxsTCBMtEi2SO5ItLRL+/mcfHw0tEhKSOzsHAwN9M31KHkrQ0FR8fDJlKSliKChEHESCNYIJBAkpESlyci7Z2VgJBASUPDwpEREOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxY8GBiJNzcBAABuLG5ZJFm3t0qVlTx0Ly9TIiI1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgIUCAgaCwsFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCBLHh58MjJeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkWANDRDGxsYChgfDR8LBQvMQupaAAABOElEQVRIic2U1VIDQRBFJ3QCRIDAQiAsDgnu7u7uEjy4Q/CvJ7ubVM1az1OnOA9dPbduV52nYcyRBgKcLt0zPSNTdEGH28PA6xO1XE79OyubykeMx80gx5+Ll/KkfH1QECikU8IpChYzkEtK8VZZuSGoqKwiUxJQXQMMIBRGS3JtnTGqbyBTwmlsalaMW6RWrNXWzoxRR2cXnRVGd0+vYgx9/VjL5zVnA4NESgKGhkE1HhlFSmP+cXM4MUmkhDM1PaMZz87N27cWFpfM4fLKKpkWwtr6hmYMm1v2rXDIKt3eoXHC2d2DhPH+QcSudCgdWcXHJ6dEVghnwXNIGEcvLuMzElWR+Q2uri2Pb27vUmea5P5BmdrP9fgUH88vKq/8Bm8x6+v3jxRpcnx+KZP7a79/VH757R/yB4xrSo7+uLLpAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.440;4.blob,1.1,1104.iVBORw0KGgoAAAANSUhEUgAAAmkAAAAOCAMAAABDwXsrAAABa1BMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwMDAX19WNKSh4dRx00fzQDBwM8kzwSLBIgTyBc5FwJFwlf619Is0ikpEKoqEQoYigpZSkXOhdZ3VksbixDpkNGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMYOxhUz1Qtby0+mj4DAwHm5l1jYygjViMucS4BAgE4ijiLizjBwU45jDkiUyIvdC8CBQItLRL+/mcfHw0SLRI7kjsLGwsIEwgfTB9n/2dHsEfQ0FR8fDIzfTMGDwYVNBUOIw5yci7Z2VgECQQRKREcRBw1gjUYGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSQECwRf7F9h72EGEAZZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAFX11dY21gCBgIBAwEJCQTy8mJQUCAeSx4yfDI7kTsTMBNRyFEnYCecnD+qqkU0gDQbQxsmXiYpZikQKBBCZJTUAAABjElEQVRoge3XV1PCQBQF4EWxAnYFxYYCdrEAVsSGvWPD3nvvP98hMxByswwLhFwms99Lzt7J3jmvSwjR5eQSgT6P5BeAxCy6hTlx6SgsKsauEI/BKDmaSkojsay8QvjqK0l+FUjsIlvYE5eO6hrsBvEYDdKz2QL/qK0j1nqQuGzV0NiEXYGu2dYiHbTaHeAXZxtp7wCJy1adXd3YFeh6esHA1edEKcIppH8AuwGVa1APR24PwzVHmDcThaKbWRMnNTQ8gl2BZnTMBEfjNl/CaxP+sMkMFBI3syYOmJrGbkBjMctnM7qE12YDYXMZKCRuZk0cML+A3YBi0b4kHy6vqF+EU87q2jp2BbmNzS35MLi9k9SSYFChNikTG7AmTdvdw24g53HTptb9ZHaEDg6PlGmTKrEBa9K245NT7ArQme2cNr64vEpiien6JqRQnxSJDdjSrfBuddzFJi25f3jErgA9PVPH3pdXlYuo6014t/rfY5OmfHxiN4C+vunzn191e6jsT3i3BnyxiUPyD03FVxn7eLtGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.343,3.459;4.blob,1.1,508.iVBORw0KGgoAAAANSUhEUgAAAOoAAAAfCAMAAADeFaHWAAAAYFBMVEUeSh5l+WUiVCIAAAAgTyBc5FwJFwkBAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYICAMECwRf7F9h72EGEAYHBwOOjjmPjzoKCgQDBwNX11dY21gEBAKBgTSDgzUi5FNBAAAA2ElEQVRYhe2YSQ7CMAxFA2Ue2wJlhvvfErJLpNiisi2R37y16/otIlvfudG4ypc+07tqMp0ZzmJNj+md5Rz/RVFFBER1vvAs2RoQ1dXas2FrQFS3O8+erQFR/YVQta65yqbR+J9OFx7CI1BtD8cT/X13vlzlU+h04aE8AtXb/dHSDZ6vdycfQ6cLD+Ux0LcKTlFFpKgiUlQxiOMYaNU4jkmr8tdwpiRV+Ws4V5Kq/DWcK9hvNaKoIjJ4VcmykUQqdnHM10h92UgiFbs4xhupLxtJpGIXx3ijD35WXHIzhAy7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.293,3.499;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1081,3.687;4.blob,1.1,1288.iVBORw0KGgoAAAANSUhEUgAAAHUAAAAiCAMAAABWUWbBAAAB5lBMVEUAAAAqKiosLCx3dzDU1FYGDgYyMhT9/WYbGws3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAaQkDq8vEwnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21gEBALp6V5eXiaqqqra2toEBARHR0f///9BQUFLSx709GMLCwT09PSEhITr6+uMjIypqUSjo0IJCQlsbGzR0dGgoKAPDwb392RFRRz19fWNjY1kZCjk5FwCAgGtra1ERETCwk6KijgpKSm3t7dfX1/t7e05jDln/2cDCAMhIQ3+/mcsLBI6OjrExMSXl5cODg46kDpn/mcCBAJ9fTLOzlMCAgIBAQFFrEVX2FfW1lZwcC0+Pj4aGhoGDwZi82IsbiwICAgNDQ0FBQUiVCIAAQAMDAX19WNKSh6kpEKoqERGRhz29mMODgZNTR9JSR0DAwHm5l1jYyhDQxuUlDyTkzxZWSQWFgmLizjBwU4JCQQ/Pxp6ejGYmD5qaislJQ8tLRIfHw0cHAtubiyZmT4rKxLQ0FR8fDIHBwM8PBh4eDGXlz1lZSkQEAdyci7Z2VhdXSaSkjuRkTtVVSISEgcYGAr8/GY3NxaGhjZERBwICAO3t0qVlTwXFwns7F8GBgLy8mJQUCCcnD+qqkXdgw+HAAABmUlEQVRIiWNgYGBkYqAvYGZhGABbWZhx2crKSisWAxs7B7KtnFzcPLx8YCa/gKAQA01YDAzCIgxItoqKiUtISkmD2TKycvwMNGExyCsoItuqpKzCwKCqps5AW6ChqYVsq7YOiNTVo7Gt+gYMSLYaqhmBKGMT2lpqamaObCuDBcSvlrS11craBsVWW0i82oE5VMolmMDegQHFVkduJ1VnF3Ewm0q5xNXNHY3l4emFaiuDtw+3rq8fmEmlXOIfEIjGCgpmgNkaEoonSCgBYeHorIhImK1RUdG0sTQmNg6DBQPxCQmJtLE1MCkZgzUKRgG1QEpq2kBYm56BKUa7dguMlZmVDaJycrXgltKu3QJn5eUXgKjCouKSUqittGu3IFhl5WCqorKquqaWgV6gzrMeympobGqmm7UtrWCqrb2js6ubbrb29AIJjr7+CRMn0c1OBobJU6YyMChOmz4DLkL1dj42MHMWA8NsGwSf6u18zBYMEJTMmYviCqq38zFbMEBQMW8+jlCgEsBswYDAgoU0tRRfC4Z2AGcLBgAbG1xXckMTvAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB7UlEQVR4nO2Zx1JCURBEASOiF8kYwAhGMAdMGP7/nywfSrl4c4vFUNNNzVne2fSCV9TpzmRmhGzOOoEmc/ML1hE0WVyyTqDJcn7FOoImhVXrBJqshax1BEWKYd06gialsnUCTSpV6wSa1ArWCTSpN6wTKNLc2LSOoMhW2LaOoEirvWMdQZHdPesEiuwfFK0j6HHY7lhHUKR7ZJ1gmrC66HHqK6mLnpymv1O6aOfsPP3A6KLNXks6EbpoPy9+7YQuenEpnghd9OpavtG56E3oy0c6F70NXflI56J34V4+0rnoQ5D/VPhc9HHwJN4IXfRZ/tIJXbTcE0+ELvoyeBUulC76Nkz/PXG6aO79I/Wd1EU/v6wTTJV0F+Vi3ANILkrFXw8guigXox4g4qJUjHqAiItykfQAERflIukBYi5KxU8PEHVRLkrluItyUanGXZSLWiHqomTUG1EX5SLpASIuykXSA0RclIukB5BdlIxRDyC5KBm/PYDkolyMe4CZcFHSHmBCfJMGwDdpVHyTxsU3aVh8k8bFN2lcfJMGxjdpYHyTBmYmegAZ36TR8E0aGN+kgfFNGhjfpHHxTRoW36Rx8U0aFt+kYSHtASbEN2kAfJNGxTdpXHyThsU3aVx8k8bFN2lgfJMGxjdpYP73AN9wtznR168+twAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492360478;4.copy,1.1,2.90,3.209,4.1110,2.19,2.14,1.1,2.80,3.209;4.copy,1.1,3.100,3.228,4.1100,2.19,2.14,1.1,2.90,3.228;4.copy,1.1,3.110,3.266,4.1090,2.57,2.14,1.1,2.90,3.266;4.copy,1.1,3.100,3.285,2.10,2.38,2.14,1.1,2.80,3.285;4.copy,1.1,2.20,3.304,2.80,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.870,3.323,3.330,2.38,2.14,1.1,3.860,3.323;4.copy,1.1,3.450,3.342,3.420,2.19,2.14,1.1,3.440,3.342;4.copy,1.1,3.840,3.456,3.360,2.19,2.14,1.1,3.830,3.456;4.copy,1.1,3.860,3.475,3.340,2.38,2.14,1.1,3.850,3.475;4.copy,1.1,3.840,3.494,2.20,2.19,2.14,1.1,3.830,3.494;4.rect,1.1,2.61,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.293,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.343,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.250;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAABsAAABZCAMAAAD4mq8AAAACB1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0DBwc8k5MSLCwoYmIpZWURKio8lJQDCAgBAgI4iooYOzsiU1MvdHQAAQECBQUBAwMLGxs+mJgIExMSLi4+mZkramozfX0eSkoECQkNHx8JFRUcREQ1goIGDg49l5cNISEsbm4kWVkWNTU5jo4BBAQ7kZETMDAmXl4pZmYOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnErEiuZPpkIAwg0FTSLOItMH0yBNIFZJFl/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0dR0c0f38MHh4HEBAjVlYucXE5jIwXODgSLS07kpIRKSkYPDw3iYkIFBQLGhoeS0syfHwxeHgXOjo0gIAbQ0MKGBgFCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRar0dXw/AAABfUlEQVRIidXUVVMCcRQF8D/Y3d2BgoiiKCbYgYGdYLfYCnZ3d3fnh5RdRwcYz6OOnoe7Z/a3d/btEkKFwSTa0dM3+KxMho4RQyPjj2JiaqZrXzG3gGRpZQ3NxtYOmr0DJEcnZ2gurm7Q3D0geXp5Q/PxhUT8/LH947ACAjGyOdiCuMHQeCGheJEfRs1wAZUIrUZIpDBKPaNjqMRqNXXi4tVDJKaSoNXUSUzCP0xOScWYlo4tI1MCTZCVjRdzcrH9VKR52PILCjEWFWMrKS3DWF6BrVImhSaXVeHF6hpstXXY6suxNTRCampugdYqa4PWruiA1tkFqbtHjqhX0QfX+gcg/WqUKmwqJaRB4RC04RFIvNExaOMTLGgcNiQRdxLa1HQ4tDA+pBnhLPWQ0FdMwNNsZG6e/mSBvmIxi5qNLC3TtkJfMfGqZvuLWVvfwLi5hW17Zxfa3v4BXjw8wnZ8corx7BzbxSW2q+sbjLd32O4fHqE9Pb/gxde3796+A5ySUcH16WX+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.345;4.blob,1.1,3288.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.692,3.362;4.blob,1.1,2792.iVBORw0KGgoAAAANSUhEUgAAASkAAAAjCAIAAABHF2sHAAAABmJLR0QA/wD/AP+gvaeTAAAH4klEQVR4nO3db0xT5x4H8Ken7ZFC+Wvpf9qBbaWBCvKvnbfeyYTbXTBO3RjiaMm9ME22u1yjJryZcZlmyRJfENlk24vtpkNv5iCQvUAMOhTNLeyqVMQgBQp3aSuFFhuwHFpKe1/Ui6VdLv1zSjd8Pjkv4Pf84fvieXIOh3MKEUDQS4MZH+/xeJbd7lgHAQAAJNYBIGjjyJnMOwcOJKNorIOESKHIOHOmKNYpICgi6tLSDoUi1ikACOm8J5Mx+vvN0YsCQRvgpEbzJy73zxkZsQ4S9N7j8agsVvzAwExU00BQtM0uLf1zfPxUXl6sgwS992QyxuiozWZzRDUNBIUkNzftww9zfStSqfTWrVsYhpnN5ubmZiqVGjiqTa9/ncNhUCgbFXMNXkVFRVcXAIAUTG8EIZSU0Nva9FFOBUFBQRBCcXG6QpHB4SRMTi6s1rdv397b29vX13fw4EE2m33+/PmsrKzKykq/4f8ymwEAr7HZVyYm8MlDJhOIRL+i2+n0+NxQRUikbdXV+Y2NaRLJzMAACHLv5eSkoigyOGjBJSgEhY1MRuRyZnk5NzkZvXfP0to6ptfPr7aePXvWYDDs27fP5XIBAIxGY3d3d2lpaW9vr+8k806nGcPEKSl4pdrz7bfCd9/1K/ZUVenb2gAAJAolu75+x8mT8SyW/ocf+o4dM2s0IMi9J5MxtFqrw7GCV1YICk9d3fbCQlpX1y8//WSy25f9WisqKpqamrwbDwBw7do1i8VSWVnpt/cAAE8dDjp+15z/Pn36YVOTX3H+fyfV1775Juvttwc//XT4woUlq3W1w/p7j0Ih5eVt/eKLR3gFhaCw3b07w+dTy8q4VCr59u0nBoN9tYlCoSQkJExPT/v2N5lMNBotcB6X2x0XcJUYNrvBsPjkiV/R7XR6v5j4/vv0wkLJ8eNxNNrIV19Zh4a89fX3XmEhzW5ffvz4KV5BIShsWq31wQPrzp20N97I2LOHrdfP37xp8t5+xzBscXGRyWT69mez2devXw+cJ4FMnl1awivV/7/mnOrs/M+PP2YeOpTf2Jjz/vtmjebRxYtjra3rz3vqVN5bb2XhlRKC8JKdnXL8uOTChT+sVtrb23U6HYn0/IyiUCg8Hk9ZWZnfQCKB4Hjvvb/l5gKcJGZmphcV+R1bUlMDe3L27t3X0/PXhYXAJn80WtyXX/6RzU7AKyUE4YvDebE4xWIxhmFXr15VKBR1dXVWq7W7uztwSG5amufYsZ2/di26MdIkkvU7VVbyPvqoIPphIAgfu3btunPnDoZhs7OzLS0tSUlJgX3+LpGYlEqEQNj4eCH4+OOivXs5sU4BQXi6e+jQ6QJ4RoGgjXXglVeMtbVJv7tXGSDod02cmmpSKsu53FgHgaCXzOscTiWPF+sUEARBEARBEBQLigzFmaIzuEy1hbilWd6cm4bDowONjfnDw+9EPg+06ZGp5Hp7Pa8i6r/R5TfmvxP0miRTqfV2O6+iwq++5t1ZGUPWb+7HJZxjxTFoGXyV8WrkUymVou++00U+D7TpLT9bnuyYFKlE0f5BIqVIF/SaXH72bLKjQ6RS+dVf7D0elceKZw3MDOCVr9/cn7c1L44YF8kkBQU0sTiltXUMr1TQ5qZT6/j7+WhSFP98RyugpYhTxkJZkzq1mr9/P7r2IZsXe0/GkI3aRm0OG14RH9seL7oWC9MLI5lEpRL19pqMRvv6XSEIAOMNo9PmzKqK4tP/IpXI1Guyh7ImjTduOG22rKoq3+LzvYcQkBJ6icaswTGi2+MemBmI5LKTREJqagRqNbzghILlWfGMXRqL3mUnQkIENQJdiGvSs7IydumS32Xn872Xk5qDIuigZdC3jQAIZITsexAJxCBbvfrN/YJkwda4rSEFXaVQcBMSyO3t8HNioBDo1DrWblYiPzEak3MVXHICWR/6mtSp1azduxP5/NXK8zedZAyZ1qp1rKz5GDJJmuSD3A98Kw+sDy4+uhhMq5fRbjTajVK6tOuXrlCzAgBUKlFHx6Td7gpjLPTSmns4Zx2yCpXC++fu4z65SCWa7Jh0hb4m5x4+tA4NCZXK++fOvahSSJTP5Z+LU8V+vSkkCj+R73ukU9KDbF1Vxi37pPiTUIMCAJKTUQxrKC+Hj95BIdtxYsfh0cO4T4smow1YAzfcNbnjxInDo6NrSnKm/DPpZwQQldeZktCklt0tmYmZoQ5saMg2GGoR5Lf9khX0mxTPjD/qOkqX0vGdNrshu9ZQSwh3TcYzmUddLrpU6v0WAQDIGLKfZ3/2AA9uGX3MO+dHno7IGLJQB6pUosuXx93uqKSCNrfF6UVDjwH3Oy4ilWj88rgn3DW5OD1t6OlZveOC0OJogmQBvnc4/WhmNMXpxSRCUJ9H6JWZmSiXs+AdTihsOrVuW/U2BMXtP20lZiay5KxQ73AGpFJvq65GUBQAgEjpUsMzg8luwinhr9BatESEGNLzZbW1Qq3WMjw8F71U0OY21TlFRIm+z5chKEKMI/odBCIhmFYAgLBWaNFa5iJbk1OdnUQU9T5fRiqmF99+cjuS6da17F6+N3uvhF6itWqDHFJTI/j665GopoI2NxfmmrgyITwinOqc8lbe7Hsz8DfAm3+5OfqP0XVbAQCCGsFIxGvShWETV64IjxyZ6uyEdzKgl0VKdgqZSvYrLkwuLFmX1m2Nhv8Ceb+8ncXvrgMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.400;4.blob,1.1,3580.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.440;4.blob,1.1,4932.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.323,3.514;4.blob,1.1,2584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1064.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACDElEQVRoge2Y11ICQRBFwYzoopgwgBGMYA6Yw///k8uMUPQUO9VsX6tf+n7AmX48cwoF9RUntC/wm5ya1j7Bb2ZW+wK/udK89gl+5QXtC/wWk6L2CW6VZEn7BL/lqvYFfiur2hf4rZW1L/Bb39C+wK22uaV9gtt2sqN9glu9sat9gtvevvYFbgeHFe0TejtqNLVPcGsda18weuP42QnkxdGUMfzs9AxxRhaF7WfN8wvAGZkUrp/V2nXAGREK0886JYTpRyhMP7u8ApwRozD97PoGcUeMwvKz26QDOCNKYfnZXdIC3BGlsPzsPnkA3BGlsPzsMUF8v2IUnp89dZ8Bd8QoTD97gVh+hML0s2obcUeEwvSz1+4b4I5sCtvP3j8QXptF4fvZxOcX4I4syhh+9v0DuANE+YfltTxM6RtQclsepvT1KQLLw5Q+T5FYHqb0eYrI8jClz1FElocpfY4isjxM6etRhJaHKX0pRWh5mNKXUoSWhyl9KUVoeZjSl1JklocpfY4isjxM6XMUkeVhSp+jiCwPU/o8RWB5mNL3R8lveZjSN6Dk9jNM6bNeGKdYLwxmvTCY9cJg1gvprBeSWS+ks15IZr2QzHphf9YLhynWCwnFeiGlWC8kFOuFlGK9MKBYL6QU64UBxXohkoKf9cJg1guDWS+ks14YzHohnfVCMuuFdNYLh2e9MN0vO5RXGcOcTbgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,1544.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAABHVBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsxMTEYGBgFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBUBAQECAgI4izgfTB8oKCg+Pj4UFBQ0gTQkWSQICAgNDQ0EBAQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4XFxcTMBM4iTgKCgoFBQUKGQoRKREQKBASLRIJFgk0NDQREREcRhwwdjA6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0FCwUJFwkSEhIrKysLHAsPJQ8JCQkHEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCADAwMFDAUeSR4EBAEFBQJ4eDGZmT4YGAofHw08PBhol7uaAAADI0lEQVRoge2aaVfTQBSGA25VRINVrIqouIBrFUTcAPcV9x2X//8zbCedJTd3bjK593L4wPulc2bah3MmkHce0ixzGRvPVLNr9x7dH7B3H7nc2c/kH5g4qMrPJg/p8g/nY6r8qfxICr971CTy9i6yeGw6hX+8Z3ICf3uxWp47eSqFP3PaZBZ/e7FanjszmcJP35+z51L4yfszd/5CCj95fy7ml1L4yZlfuNyOP7oS3Rr+lavUKsHvFFfiGo2/fmOqJb9fXImbJP7WwiK5zt3/pdu8z9emG/1bYWa5eLnT661o4O/eK177Kyr8xfsPRqOHJL/l9Z1bnbdDFf7ahDuXqPDXH7mhCv/xEz6faIKn+VoiH7mVEU3wLF9K4z83qBelJaIJXuav0vizBvW6tETsz5vcH9pa7z+xP2833vH5VFO+92cSld/P6VUdvj2ffNj4aGdmJPkdez759HnU6jX350R+355Pxr98dTPf5Pg+33+0/OD2yo4/1mTHH2vSyB9pK6LTxB/Re32j438zf8Tu9VhnYmnij9j+YJ2JpYk/0tZIppE/0tZIZtv6I5afv4YpTbX2Ryybv4cJZ9r7I5Y/f4cJJnb8MRYdf3R9q+SPtm/V/LHoWz1/LPpW0R9N3yr6o+lbCX+MZNi3mD/ibUf4YyyDvkX8MdJ2hD/GMuhbxB8jbUf4YyyDvhXxx1gGfSvij5GYvlX0R9O3Wv6YjfpWyx8z27dK/uj6VssfXd8q+aN634LI+eMyOivmj7ZvYVj+uPnPjnzf+jkTlj86VtC3gM/yR8cK+hbyOf7oWEHfQj7n+aNjBX0L+Zznj5YV9m2Fz3j+aFlh31b4jOePlhX2bYXPeP5oWWHfQj7n+aNlhX0L+Rx/dKygbyGf44+OFfQt5HP80bF830I+yx89y/Ut4PP80bNc3wK+WJ9t+f9r8T7jpuKPwqn6I52m19el4o/C/Io/CvMr/ijNh/4ozYf+KM2H/ijOB/4ozgf+KM4H/ijNh/4ozS/5o/+ODTby/Mgqxi/5o/+ODTby/Mgqxi/5o/+ODTby/Mgqwof+WJPU/d8Sf/wPkACtTIP3HxYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492360587;4.copy,1.1,3.100,3.209,4.1100,2.19,2.14,1.1,2.80,3.209;4.copy,1.1,3.110,3.228,4.1090,2.19,2.14,1.1,2.90,3.228;4.copy,1.1,3.100,3.266,4.1100,2.76,2.14,1.1,2.90,3.266;4.copy,1.1,2.90,3.285,2.10,2.57,2.14,1.1,2.80,3.285;4.copy,1.1,2.10,3.304,2.80,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.470,3.342,3.730,2.19,2.14,1.1,3.460,3.342;4.copy,1.1,3.710,3.361,3.490,2.19,2.14,1.1,3.700,3.361;4.copy,1.1,3.750,3.380,3.450,2.38,2.14,1.1,3.740,3.380;4.copy,1.1,3.890,3.418,3.310,2.19,2.14,1.1,3.880,3.418;4.copy,1.1,3.900,3.437,3.300,2.19,2.14,1.1,3.890,3.437;4.copy,1.1,3.920,3.456,3.280,2.57,2.14,1.1,3.910,3.456;4.copy,1.1,3.900,3.475,2.20,2.38,2.14,1.1,3.890,3.475;4.copy,1.1,3.890,3.494,2.10,2.19,2.14,1.1,3.880,3.494;4.rect,1.1,3.863,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.440,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.323,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.333,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.832,3.250;4.blob,1.1,340.iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAMAAACXZR4WAAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAAS0lEQVQImVWIRRLAMBDDNikzM8P/31jISTrYI4m8KP2tWLYjBq3Mu57/fxBGAuKEnmY5Q1FWDHVDb7ueYRgnhnmhr9vOcJx0uW76A+3cAp67rvAdAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.345;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAALEAAAAgCAMAAABqzWkRAAACZ1BMVEUAAAAFDAxj9fUeSkoMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUUwdzBW1FYFDAVj9WMeSh4FBQxjY/UeHkowd3dW1NRCpEJEqERCQqRERKgUMhRm/WYLGwscRhxj9mMGDgYcHEZjY/YGBg4UMjJm/f0LGxs6kDpMvEwBAwFd5l0oYygBAQNdXeYoKGM6kJBMvLwCBAJe6V4mXiY4izhOwU44OItOTsECBARe6ekmXl4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0SEi1nZ/4NDR8eS0tj9PQECwsBAgIDCAgCBQVEqURCo0IfTB9n/2dHsEdU0FQyfDJUVNAyMnxEqalCo6MfTExn//9HsLAGDwZk92QcRRwVNBUOIw4uci5Y2VguLnJYWNkGDw9k9/ccRUUVNDQOIyMoZChc5FwKGApm/GYWNxYKChhmZvwWFjcoZGRc5OROwk44ijhKt0o8lTxKSrc8PJVOwsI4iooNIQ0SLBIkWSRf7F8CBgIkJFlfX+wCAgYNISESLCwyfTJTzlMECQRi8mIgUCAEBAliYvIgIFAyfX1Tzs5W1lYtcC0/nD9FqkU/P5xFRapW1tYtcHCzylDwAAACLUlEQVRYhWNgIBIwMjETq5SqgIWVjVyt7BzUdAjxgJOLXJ3cPLzUdAjRgI9fgEydgkLCVHUJsUBEVIxcreIS1HQI8UBSilyd0jKy1HQI0UBOXoFcrYpKVHQHCUBZhVydqmrUdAfxQF2DXJ2aWtrUdAjRQEdXj1yt+gbUdAjxwNCIXJ3GJqbUdAjRwMzcgkydllbWVHUJscDG1o5crfYOVHQHCcDRaWDsHQWjYBQMYYCzN+TsgkOHq5s7Fez18PTCLuHtg0MH3KW4ekMuzrgs8/UjwWU4gX8AdnEfb1w6YC7F0RsKDArGpTMkNIwUp+EA4RGR2ISjomNw6YC5FEdvKDYOp13xCYmkOQ4rSEpOwSacmoZTB9ylWHtD6RmZuC3LyibFabhATi4Wwbz8Atw6YC7F2hsqLCoGUSWlIFCGwmJgKK+opNC1IFBVXYMpWFtXD6IaGkGgCYWF5FJsvaHmFjDV2gYC7SgsIOjopIKLGbq6McV6esFUXz8ITEBhIbkUS29o4qTJEHoKCExFYQHBtOnUcPGMmRhCs2bPgdBzQWAeCgvJpVh6Q/MXlOCza+GixRS6FgSWLF2GLrR8RQM+HXCXYvaGVq7Cb9nqNSS4DCdYuw5dZP0G/DpgLsXoDW2s2IRf5+YtW0lxGg6wbfsOVIGdMrvw64C5FKM3tHsPAbv27ttPmuOwggMHD6EKHD5CQAfcpei9oaPHCFl2/ATxDsMNTp5C5Z8+Q0iHvQMAXCeBXJ1vyQAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.682,3.364;4.blob,1.1,296.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAWlBMVEUAAABHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxt3VIV4AAAAP0lEQVQImR3MRwKAIBAEwSWIYMKEmf9/U5o5VN9GpExpFK3Q2Ia4Fn3oSD+MZIo4LyvZ9kSOEy97k+etR1/GHzcdAbswyA83AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.381;4.blob,1.1,4308.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.421;4.blob,1.1,6392.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.353,3.514;4.blob,1.1,2584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492360686;4.copy,1.1,2.90,3.209,4.1110,2.19,2.14,1.1,2.80,3.209;4.copy,1.1,3.100,3.228,4.1100,2.19,2.14,1.1,2.90,3.228;4.copy,1.1,3.110,3.266,4.1090,2.57,2.14,1.1,2.90,3.266;4.copy,1.1,3.100,3.285,2.10,2.38,2.14,1.1,2.80,3.285;4.copy,1.1,2.20,3.304,2.80,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.840,3.323,3.360,2.38,2.14,1.1,3.830,3.323;4.copy,1.1,3.490,3.342,3.350,2.19,2.14,1.1,3.480,3.342;4.copy,1.1,3.810,3.456,3.390,2.19,2.14,1.1,3.800,3.456;4.copy,1.1,3.830,3.475,3.370,2.38,2.14,1.1,3.820,3.475;4.copy,1.1,3.810,3.494,2.20,2.19,2.14,1.1,3.800,3.494;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.copy,1.1,4.1110,3.665,2.90,2.19,2.14,1.1,4.1100,3.665;4.rect,1.1,3.843,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.432,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.811,3.250;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAABsAAABZCAMAAAD4mq8AAAACB1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0DBwc8k5MSLCwoYmIpZWURKio8lJQDCAgBAgI4iooYOzsiU1MvdHQAAQECBQUBAwMLGxs+mJgIExMSLi4+mZkramozfX0eSkoECQkNHx8JFRUcREQ1goIGDg49l5cNISEsbm4kWVkWNTU5jo4BBAQ7kZETMDAmXl4pZmYOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnErEiuZPpkIAwg0FTSLOItMH0yBNIFZJFl/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0dR0c0f38MHh4HEBAjVlYucXE5jIwXODgSLS07kpIRKSkYPDw3iYkIFBQLGhoeS0syfHwxeHgXOjo0gIAbQ0MKGBgFCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRar0dXw/AAABfUlEQVRIidXUVVMCcRQF8D/Y3d2BgoiiKCbYgYGdYLfYCnZ3d3fnh5RdRwcYz6OOnoe7Z/a3d/btEkKFwSTa0dM3+KxMho4RQyPjj2JiaqZrXzG3gGRpZQ3NxtYOmr0DJEcnZ2gurm7Q3D0geXp5Q/PxhUT8/LH947ACAjGyOdiCuMHQeCGheJEfRs1wAZUIrUZIpDBKPaNjqMRqNXXi4tVDJKaSoNXUSUzCP0xOScWYlo4tI1MCTZCVjRdzcrH9VKR52PILCjEWFWMrKS3DWF6BrVImhSaXVeHF6hpstXXY6suxNTRCampugdYqa4PWruiA1tkFqbtHjqhX0QfX+gcg/WqUKmwqJaRB4RC04RFIvNExaOMTLGgcNiQRdxLa1HQ4tDA+pBnhLPWQ0FdMwNNsZG6e/mSBvmIxi5qNLC3TtkJfMfGqZvuLWVvfwLi5hW17Zxfa3v4BXjw8wnZ8corx7BzbxSW2q+sbjLd32O4fHqE9Pb/gxde3796+A5ySUcH16WX+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.345;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAALsAAAAgCAMAAAB97/nYAAACZ1BMVEUAAAAFDAxj9fUeSkoMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUUwdzBW1FYFDAVj9WMeSh4FBQxjY/UeHkowd3dW1NRCpEJEqERCQqRERKgUMhRm/WYLGwscRhxj9mMGDgYcHEZjY/YGBg4UMjJm/f0LGxs6kDpMvEwBAwFd5l0oYygBAQNdXeYoKGM6kJBMvLwCBAJe6V4mXiY4izhOwU44OItOTsECBARe6ekmXl4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0SEi1nZ/4NDR8eS0tj9PQECwsBAgIDCAgCBQVEqURCo0IfTB9n/2dHsEdU0FQyfDJUVNAyMnxEqalCo6MfTExn//9HsLAGDwZk92QcRRwVNBUOIw4uci5Y2VguLnJYWNkGDw9k9/ccRUUVNDQOIyMoZChc5FwKGApm/GYWNxYKChhmZvwWFjcoZGRc5OROwk44ijhKt0o8lTxKSrc8PJVOwsI4iooNIQ0SLBIkWSRf7F8CBgIkJFlfX+wCAgYNISESLCwyfTJTzlMECQRi8mIgUCAEBAliYvIgIFAyfX1Tzs5W1lYtcC0/nD9FqkU/P5xFRapW1tYtcHCzylDwAAACLklEQVRYhWNgIBIwMjETq5RGgIWVjVyt7BzUdAg5gJOLXJ3cPLzUdAgZgI9fgEydgkLCVHUJ6UBEVIxcreIS1HQIOUBSilyd0jKy1HQIGUBOXoFcrYpKVHQHWUBZhVydqmrUdAc5QF2DXJ2aWtrUdAgZQEdXj1yt+gbUdAg5wNCIXJ3GJqbUdAgZwMzcgkydllbWVHUJ6cDG1o5crfYOVHQHWcDRaaBdMApGwSgYUQBnX87ZBYcOVzd3qrrAw9MLu4S3Dw4dcDfj6su5OOOyzNePBJcRAfwDsIv7eOPSAXMzjr5cYFAwLp0hoWGkOI0gCI+IxCYcFR2DSwfMzTj6crFxOO2KT0gkzXEEQFJyCjbh1DScOuBuxtqXS8/IxG1ZVjYpTiMMcnKxCOblF+DWAXMz1r5cYVExiCopBYEyFBYDQ3lFJYWuRQVV1TWYgrV19SCqoREEmlBYSG7G1pdrbgFTrW0g0I7CAoKOTqq6naGrG1OspxdM9fWDwAQUFpKbsfTlJk6aDKGngMBUFBYQTJtOXbfPmIkhNGv2HAg9FwTmobCQ3IylLzd/QQk+uxYuWkyha1HBkqXL0IWWr2jApwPuZsy+3MpV+C1bvYYElxEB1q5DF1m/Ab8OmJsx+nIbKzbh17l5y1ZSnEYQbNu+A1Vgp8wu/Dpgbsboy+3eQ8Cuvfv2k+Y4AuDAwUOoAoePENABdzN6X+7oMUKWHT9BvMOIASdPofJPnyGkw94BADzEgVw+/3pWAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.662,3.362;4.blob,1.1,1324.iVBORw0KGgoAAAANSUhEUgAAATMAAAASCAMAAAAAAclLAAACB1BMVEUAAAAYCgoLBARUIiLPVFQPBgZHRx1/fzSiQUGvR0cVCAj1Y2NJHR0eHgyYmD4QEAecPz+9TExWViNxcS4sLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQkeSkpKtrYCAgGMjDk4OBc3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMgtLRKSkjsHBwMFBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzNCpKQiVFQECQksbGxa399k+PhCo6MXOTllZSlkZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExMJCQSUlDwpKREwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi48PBiJiTcBAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFx0dC9TUyIoKBBwcC2tra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/MUFAgaGgsbGwspKSm3t7dfX1/t7e0sEhIxFBQSLS1LSx58fDI6OjrExMSXl5cODg5vLS3mXV0CAQGAgDRDQxvMUlJ9MjJQICDlXFwpERFFHBxCGxtLHh4lyAsCAAABlElEQVRYhWNgGAUMjEwD7YKhB5hZWEnWw8ZOA4cMJcDBSbIWdjYauGMoAS5uHhJ18PLx08QlQwgICJKoQUiYJu4YvEBEFESKiUtISklDRGRk5YjUK68AIhWVlGnhsMEKFFVU1dSBtIamlraOrh5EUF/WAJd6QyMwMAaxTUzNzC1ADEsrazo4dZAAG1s7ewdHEMvJ2YWBwdXNHSLu4YlLh5c5GHgzMPj4+vkHBIIFgxxo79RBA4JDQsMgrPAIEBkZBeFFx+DSERsHBvEMDAmJSckQsZTUNNo6c1CB9IzMrGwQI8ctF0Tl5UPECwpx6UDkzaLiktIysFh5RSXNXTqIQGVVtVqNCpBRC0lndRDh+gZcGhB5k8HYu9G8qRnIaGmlvUMHF2hrtwKSHZDyrBMs1NXdg0s1Im+CQG9fPwPDBL6J9HDn4AKTgHiyxBTXqdO0IALTZWcQq3cmA8Os2TRy16AHc+ZKRM6bD2EvWLiIBJ2Ll9DEQUMMLF020C4YcmD5Cv2BdsJQAysXrhpoJww5sHoNScoBi0tK0alR1AwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.381;4.blob,1.1,5108.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.342,3.421;4.blob,1.1,3652.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.383,3.476;4.blob,1.1,3756.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.383,3.554;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAAUQAAABFCAMAAAAFH2/lAAAA+VBMVEUAAAAXOBdi82IsbCxMvUxf619Is0gGDgYXOhdZ3VksbixDpkMECwRf7F9h72EGEAYYOxhUz1Qtby0+mj4DBwNX11dY21gCBQIDCAMBAgEAAQBCpEJn/2ciVCI8lDxj9WNc5VwqaSo6kDoKGAoNIQ0VNBUHEQckWiRb4lseSh4weDBj9mNDp0MNIA0jVyNi8mIfTB9HsEcpZiknYCcTLxNW1lZl+2UGDwYOIw4QJxAICAM5jDkHBwOOjjmPjzoKCgRn/mcCBAIEBAKBgTSDgzVFrEVX2FcLGwtl+WUIEwggTyBc5FwJFwkOIg5k92QCBgIBAwFRyFEQKBBAbjl5AAACY0lEQVR4nO2baVMbMQyGN6EFChTKTegGKOUuodzQEI7QAwq00P7/HwOzmUwmwyKvbMvrNe/zhQ+yLGk2XmRpFUXAhFI56nmTtxNFp/Q26ulVLerrc+GKS+xG1P8uGhhUrBl6Pzxi02b+WI7ow2g0Nq5YMzE5NWTRpBWmZxIqL4hnaW0fI8qBj3FCNVVYmZtf+PT0d/GzoAeV5ClOC1oQZ2k5YSVVuLq2vvFls7b1VfLntp08xR1BC+KQx3l3L4r2D+LDPUkPjpKneCxpQhryOCfMfgvnv2G9LrIteZzVmKQ4mron8Yyuxcbp2bmurhwmKY6u7uJFU9fk5fcfDV1dOUxSHF3dn790LYI2R+WBvF0oPs2q4gIAAAAAqKnFV5mk69fE3csD6Dj43tP7PVv8O5v05vaO6YdT6Dj43iv26+ZPTNXKaKlP2PaUtd/xX32pT9j2tDiRM1A0CkAW0iqLAZTu3ZJWWQygdO+WtOMcQOneLepGgXvo4reJtAO/ZUBodB1nubI/Z2e6+G0i7cBvGWTVkCv7s3ami98m0g78lkFWDRtl//vWO/bB3s6vkH+td6xozzp4/rfesYwLMgAAAOAeVkE8KCxGziqIBwUvcvJmmLkgHtyUAasVQN8MsxbEw5syYLUC7NwMcb8EAADQJi054Scsvqc4WdsSenGkJSf8hMX3FEe4yZCWnPATFt9THBdNBgAAAACAUOEXxENpHuTaCgileWAxDv639sWZI6CxGAf/2/hQvqYPJQ5QRDBlYAFMGVgAUwYBkMukgDVdPxoZ+U8KmOh60sjIf1LARFeiAfAI1TxPoGjVogEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.684;4.blob,1.1,1748.iVBORw0KGgoAAAANSUhEUgAAAH0AAAA4CAMAAADnywfIAAACeVBMVEUAAAAHBwOTkzwsLBJ3dzDU1FZiYihlZSkqKhGUlDwICAMGDgYyMhT9/WYbGwsCAgGKijg7Oxg3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAaQkDq8vExTUyJ0dC8nJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21gEBALp6V5eXiaYmD4TEwiqqqra2toEBARHR0f///9BQUFLSx709GMLCwR9fTNKSh709PSEhITr6+uMjIypqUSjo0JERByCgjUJCQlsbGzR0dGgoKAPDwb392RFRRwODgaXlz0hIQ319fWNjY1kZCjk5FxubixZWSStra1ERETCwk41NRaOjjkEBAEpKSm3t7dfX1/t7e05jDln/2cDCAP+/mcFBQKRkTswMBM6OjrExMSXl5cODg46kDpn/mcCBAJ9fTLOzlNmZilFrEVX2FfW1lZwcC0GDwZi82IsbiwiVCIAAQAMDAX19WOkpEKoqERGRhz29mNNTR9JSR0DAwHm5l1jYyhDQxsWFgmLizjBwU4JCQQ/Pxp6ejFqaislJQ8tLRIfHw0cHAuZmT4rKxLQ0FR8fDI8PBh4eDEQEAdyci7Z2VhdXSaSkjtVVSISEgcYGAr8/GY3NxaGhja3t0qVlTwXFwns7F8GBgLy8mJQUCCcnD+qqkUNIA0LGwsHAweTPJMsEiwgIA3//2cIEwhiKGJlKWUOIg4CBQIqESqUPJQIAwgiIg4OIw5k92QCAQKKOIo7GDsjIw5TIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWaudWnXAAACYElEQVRYhWNgGAUDBBiZmOltJQsrgs3GTm/bWVkQbA5OLiwquLlpxWLg4eWDsRgY+AUEoRwhYRFRMXEwU0JSSpqBJiwGBhlZOAuI5eQhbAVFJWUVVTUwW11DU4KBJiwGLW0dOAtI8OnqgTn6BoYMDEbGJgy0BaZm5nAWiLSwBHOsrEGkjS2NbbezR2U5OIJIJ2NnEOXiSlvL3dw9UFmeXt4gygfid1/a2u7nz4/GCggEkUGQeA8GC1Epd2GCEAF0VmhYOJCMEIk0iopWAotQKXfFxMahsbzjYUUrnJWQmASiklNEbFLTwCJUyl3pGZlorKxsmNcRLJ0c9ACiDsjNQ2flF8BEECwagcKiYgwW/UBmSSkGaxSMAnqDsnJLDBYdQUUlJgsGaNeegrGqqj0ZkFg1tbDKnpbtKTirrr4BahmY1cjJFNgEFaBdewrBam6B+RXMam1r1+3oZKAX6IrvRmP1BPT20c36/gkoLMaJk7zYJ9PN9ilTkVh806YnzphJN7sZGGbNngNnMejMdUD0Zajeb8EG5s2HsxgW8CPEqd5vwWxZAUHgwkUwFoqrqN5vwWxZAUHr4iUwFgNNAWbLCgSWLqOtrVAw2rIaBUMHLI9dgcZauWo1VIRYFjZTkMGatXwYYjDV69BZ6zfAJIllYTMFxXY9HLZvjN2Eztq8ZSsDaSxspiCBbWsTcNi+fQcGa+eu3SSysJmCBPa447AcK9i7j1QWNcH+AwdJZFEVHDpMKoua4MhRUlnUBMeOnyCRRVVw8hSpLGqC02fOksiiJjh3/gKJLKqCi5dIZY0CXAAAracfddoN228AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.723;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAAlMAAABxCAMAAADGZNbOAAAAzFBMVEUAAAAGDgYDBwMJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR7wO7TDAAAEj0lEQVR4nO3c2W5TQRCE4SQsAQKELIQDYQmEsENYwr7D+78TxoaIC1wXZ8bVUz31P4A1UkuWZX2qpaXKLa/U/sQ8nYh+gGgnT52OfkKrrZ6JfoFqZ89Fv6DR1s5fiH6CahfXL0U/ock2Nrein6Db9uXoFzTZzrp/aY7uyrAc/YQWu3ot+gXC7Q7Xo5/QYjduRr9AuVt70S9osNvDTvQTlLuzH/2CBrs7HEQ/Qbl729EvaLD7w4PoJyj38FH0Cxrs8eC/WMa38eRp9BMa7Nnh8+gnCPdieBn9hBZ75V+Z49s6eh39hBbb24x+gXBv3ka/oMneHb6PfoJsHz7uRj+hzT599vf3uL4crUU/odFWvn6LfoJoB9+jX9BsP35Gv8A5+UrVL0PGZtC3PenqQvXLkLEp9G1XurpI/TJkbBJ925OuLlG/DBmbRd92pasL1C9DxqbRtz3p6gL1y5CxafRtT7q6QP0yZGwafduVrh6tfhkyNpG+7UlXj1a/DBmbSN/2pKtHq1+GjE2kb3vS1aPVL0PGJtK3Henq8eqXIWPz6NuedHWB+mXI2DT6tiddXaB+GTI2jb7tSVcXqF+GjE2jbzvS1UXqlyFjk+jbjnR1mfplyNgc+rYnXV2ofhkyNoW+ta52bkw1RS5Dxqrq2wzyGXd8maoilyFjRfVtCvmM+3uZyiKXIWMl9W0S+YybXaa2yGXIWEV9m0U+42aXqS5yGTJWUN+mkc+46WWqi1yGjBXUt2nkM256meoilyFjBfVtGvmM+32ZBYhchoyV07eJ5DNucpkFiFyGjJXTt4nkM25ymQWIXIaMldO3ieQzbnKZBYhchoyV07eJ5DNucpn6IpchY/X0bR75jJteprrIZchYQX2bRj7jppepLnIZMlZQ36aRz7jpZaqLXIaMFdS3aeQzbnaZyiKXIWMl9W0S+Yz7c5m6IpchYzX1bQ75jDu+TFWRy5Cxovo2hXzGiV7GCeXdYU6q8hn3/8t4d5iTqHzGzbuMd4c5Scpn3NzLeHeYk6J8xoHLeHeYk6B8xoHLeHeYk6B8xoHLeHeYk6B8xqHLeHeYk5x8xsHLeHeYk5x8xsHLeHeYk5x8xsHLeHeYk5x8xqHLeHeYk558xqHLeHeYk6B8xoHLeHeYk6B8xoHLeHeYk6B8xs2/jHeHOUnKZ9y8y3h3mJOmfMbNu4x3hzml9LUpLuPazrvDnDLIZ5x3h8mlkM847w5zSyKfcd4dZpZFPuO8O8wsjXzGeXeYWBr5jPPuMLE08hnn3WFeieQzzrvDtBLJZ5x3h2klks847w7TSiSfcd4dppVHPuO8O0wsjXzGeXeYWBr5jPPuMLE08hnn3WFmSeQzzrvD1HLIZ5x3h8l14GtFL+OE8u4wJ1X5jPPucGSi8hnn3eHYJOUzzrvDwSnKZ5x3h8MTlM847w6HJyifcd4dDk9QPuO8OxyfnHzGeXe4geTkM867ww0kJ59x3h1uIDn5jPPucHx68hnn3eH4BOUzzrvD4QnKZ5x3h8MTlM847w5HJymfcd4djk1TPuO8OxxbSl/772V+AS6YkKGlxknNAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492360796;4.copy,1.1,3.110,3.209,4.1090,2.19,2.14,1.1,2.90,3.209;4.copy,1.1,3.120,3.228,4.1080,2.19,2.14,1.1,3.100,3.228;4.copy,1.1,3.130,3.247,4.1070,2.95,2.14,1.1,3.110,3.247;4.copy,1.1,3.120,3.266,2.10,2.76,2.14,1.1,3.100,3.266;4.copy,1.1,3.110,3.285,2.10,2.57,2.14,1.1,2.90,3.285;4.copy,1.1,2.20,3.304,2.90,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.520,3.342,3.680,2.19,2.14,1.1,3.500,3.342;4.copy,1.1,3.890,3.456,3.310,2.57,2.14,1.1,3.880,3.456;4.copy,1.1,3.870,3.475,2.20,2.38,2.14,1.1,3.860,3.475;4.copy,1.1,3.860,3.494,2.10,2.19,2.14,1.1,3.850,3.494;4.rect,1.1,2.71,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.367,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.386,2.18,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.440,2.15,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.51,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.345;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAALsAAAAgCAMAAAB97/nYAAACZ1BMVEUAAAAFDAxj9fUeSkoMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUUwdzBW1FYFDAVj9WMeSh4FBQxjY/UeHkowd3dW1NRCpEJEqERCQqRERKgUMhRm/WYLGwscRhxj9mMGDgYcHEZjY/YGBg4UMjJm/f0LGxs6kDpMvEwBAwFd5l0oYygBAQNdXeYoKGM6kJBMvLwCBAJe6V4mXiY4izhOwU44OItOTsECBARe6ekmXl4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0SEi1nZ/4NDR8eS0tj9PQECwsBAgIDCAgCBQVEqURCo0IfTB9n/2dHsEdU0FQyfDJUVNAyMnxEqalCo6MfTExn//9HsLAGDwZk92QcRRwVNBUOIw4uci5Y2VguLnJYWNkGDw9k9/ccRUUVNDQOIyMoZChc5FwKGApm/GYWNxYKChhmZvwWFjcoZGRc5OROwk44ijhKt0o8lTxKSrc8PJVOwsI4iooNIQ0SLBIkWSRf7F8CBgIkJFlfX+wCAgYNISESLCwyfTJTzlMECQRi8mIgUCAEBAliYvIgIFAyfX1Tzs5W1lYtcC0/nD9FqkU/P5xFRapW1tYtcHCzylDwAAACLklEQVRYhWNgIBIwMjETq5RGgIWVjVyt7BzUdAg5gJOLXJ3cPLzUdAgZgI9fgEydgkLCVHUJ6UBEVIxcreIS1HQIOUBSilyd0jKy1HQIGUBOXoFcrYpKVHQHWUBZhVydqmrUdAc5QF2DXJ2aWtrUdAgZQEdXj1yt+gbUdAg5wNCIXJ3GJqbUdAgZwMzcgkydllbWVHUJ6cDG1o5crfYOVHQHWcDRaaBdMApGwSgYUQBnX87ZBYcOVzd3qrrAw9MLu4S3Dw4dcDfj6su5OOOyzNePBJcRAfwDsIv7eOPSAXMzjr5cYFAwLp0hoWGkOI0gCI+IxCYcFR2DSwfMzTj6crFxOO2KT0gkzXEEQFJyCjbh1DScOuBuxtqXS8/IxG1ZVjYpTiMMcnKxCOblF+DWAXMz1r5cYVExiCopBYEyFBYDQ3lFJYWuRQVV1TWYgrV19SCqoREEmlBYSG7G1pdrbgFTrW0g0I7CAoKOTqq6naGrG1OspxdM9fWDwAQUFpKbsfTlJk6aDKGngMBUFBYQTJtOXbfPmIkhNGv2HAg9FwTmobCQ3IylLzd/QQk+uxYuWkyha1HBkqXL0IWWr2jApwPuZsy+3MpV+C1bvYYElxEB1q5DF1m/Ab8OmJsx+nIbKzbh17l5y1ZSnEYQbNu+A1Vgp8wu/Dpgbsboy+3eQ8Cuvfv2k+Y4AuDAwUOoAoePENABdzN6X+7oMUKWHT9BvMOIASdPofJPnyGkw94BADzEgVw+/3pWAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.642,3.362;4.blob,1.1,1324.iVBORw0KGgoAAAANSUhEUgAAATIAAAASCAMAAADvw6J1AAACB1BMVEUAAAAYCgoLBARUIiLPVFQPBgZHRx1/fzSiQUGvR0cVCAj1Y2NJHR0eHgyYmD4QEAecPz+9TExWViNxcS4sLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQkeSkpKtrYCAgGMjDk4OBc3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMgtLRKSkjsHBwMFBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzNCpKQiVFQECQksbGxa399k+PhCo6MXOTllZSlkZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExMJCQSUlDwpKREwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi48PBiJiTcBAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFx0dC9TUyIoKBBwcC2tra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/MUFAgaGgsbGwspKSm3t7dfX1/t7e0sEhIxFBQSLS1LSx58fDI6OjrExMSXl5cODg5vLS3mXV0CAQGAgDRDQxvMUlJ9MjJQICDlXFwpERFFHBxCGxtLHh4lyAsCAAABk0lEQVRYhWNgGAUMjEwD7YIhB5hZWEnVwsZOC4cMIcDBSaoOdjZauGMIAS5uHtI08PLx08YlQwcICJKmXkiYNu4YtEBEFESKiUtISklDRGRk5YjUK68AJBSVlGnisEEKFFVU1dSBtIamlraOrh5EUF/WAJd6QyMwMAaxTUzNzC2AtKWVNT2cOjiAja2dvYMjiOXk7MLA4OrmDhH38MSlw8scDLwZGHx8/fwDAkFiQQ50cOpgAcEhoWEQVngEiIyMgvCiY3DpiI0Dg3gGhoTEpGSwUEpqGo2dOZhAekZmVjaIkeOWC6Ly8iHiBYW4dCAyZlFxSWkZSKi8opL2Lh08oLKqWq1GBciohaSyOohwfQMuDYiMyWDs3Wje1MzA0NJKB4cOKtDWbgUkOyBlWSdYqKu7B5dqRMYEgd6+foYJfBPp4czBBSYB8WSJKa5Tp2lBBKbLziBW70yGWbNp5KxBD+bMlYicNx/CXrBwEfEaFy+hjYOGFli6bKBdMNTA8hX6A+2EIQZWLlw10E4YamD1GlJUAwAw0krRrVDAGAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.381;4.blob,1.1,6468.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.440;4.blob,1.1,6684.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.413,3.554;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAAUQAAABFCAMAAAAFH2/lAAAA+VBMVEUAAAAXOBdi82IsbCxMvUxf619Is0gGDgYXOhdZ3VksbixDpkMECwRf7F9h72EGEAYYOxhUz1Qtby0+mj4DBwNX11dY21gCBQIDCAMBAgEAAQBCpEJn/2ciVCI8lDxj9WNc5VwqaSo6kDoKGAoNIQ0VNBUHEQckWiRb4lseSh4weDBj9mNDp0MNIA0jVyNi8mIfTB9HsEcpZiknYCcTLxNW1lZl+2UGDwYOIw4QJxAICAM5jDkHBwOOjjmPjzoKCgRn/mcCBAIEBAKBgTSDgzVFrEVX2FcLGwtl+WUIEwggTyBc5FwJFwkOIg5k92QCBgIBAwFRyFEQKBBAbjl5AAACY0lEQVR4nO2baVMbMQyGN6EFChTKTegGKOUuodzQEI7QAwq00P7/HwOzmUwmwyKvbMvrNe/zhQ+yLGk2XmRpFUXAhFI56nmTtxNFp/Q26ulVLerrc+GKS+xG1P8uGhhUrBl6Pzxi02b+WI7ow2g0Nq5YMzE5NWTRpBWmZxIqL4hnaW0fI8qBj3FCNVVYmZtf+PT0d/GzoAeV5ClOC1oQZ2k5YSVVuLq2vvFls7b1VfLntp08xR1BC+KQx3l3L4r2D+LDPUkPjpKneCxpQhryOCfMfgvnv2G9LrIteZzVmKQ4mron8Yyuxcbp2bmurhwmKY6u7uJFU9fk5fcfDV1dOUxSHF3dn790LYI2R+WBvF0oPs2q4gIAAAAAqKnFV5mk69fE3csD6Dj43tP7PVv8O5v05vaO6YdT6Dj43iv26+ZPTNXKaKlP2PaUtd/xX32pT9j2tDiRM1A0CkAW0iqLAZTu3ZJWWQygdO+WtOMcQOneLepGgXvo4reJtAO/ZUBodB1nubI/Z2e6+G0i7cBvGWTVkCv7s3ami98m0g78lkFWDRtl//vWO/bB3s6vkH+td6xozzp4/rfesYwLMgAAAOAeVkE8KCxGziqIBwUvcvJmmLkgHtyUAasVQN8MsxbEw5syYLUC7NwMcb8EAADQJi054Scsvqc4WdsSenGkJSf8hMX3FEe4yZCWnPATFt9THBdNBgAAAACAUOEXxENpHuTaCgileWAxDv639sWZI6CxGAf/2/hQvqYPJQ5QRDBlYAFMGVgAUwYBkMukgDVdPxoZ+U8KmOh60sjIf1LARFeiAfAI1TxPoGjVogEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.780;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAh4eDE8PBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIueUspAAAAqUlEQVQoke3SNxLCQAyFYQEm2yYtBkzOYHLOmHj/K0FB4b9ghgPwCs1+0o4qibzjE8QfALVg6PMKR94lGouL17phwomkwKk0nFE6nFUWnFN5uKBsuFgqc3+lStdidL3UgKXZasNmpwtLry+/xDHpwXDExnhCTw2bjdmcXigHXqoVP6xr9KZKb2f0bg9GD0f4pM5w3G3Dlyt4uy+9fLgaxtZTvuR/X17jvl53hhE6RXbxjQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492360897;4.copy,1.1,3.100,3.209,4.1100,2.19,2.14,1.1,2.90,3.209;4.copy,1.1,3.110,3.228,4.1090,2.19,2.14,1.1,3.100,3.228;4.copy,1.1,3.120,3.247,4.1080,2.95,2.14,1.1,3.110,3.247;4.copy,1.1,3.110,3.266,2.10,2.76,2.14,1.1,3.100,3.266;4.copy,1.1,3.100,3.285,2.10,2.57,2.14,1.1,2.90,3.285;4.copy,1.1,2.10,3.304,2.90,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.530,3.342,3.670,2.19,2.14,1.1,3.520,3.342;4.copy,1.1,3.720,3.456,3.480,2.19,2.14,1.1,3.710,3.456;4.copy,1.1,3.740,3.475,3.460,2.19,2.14,1.1,3.730,3.475;4.copy,1.1,3.750,3.494,3.450,2.19,2.14,1.1,3.740,3.494;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.rect,1.1,3.361,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.423,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.463,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.331,3.345;4.blob,1.1,1880.iVBORw0KGgoAAAANSUhEUgAAAR8AAAAgCAMAAAAc0oyzAAACvlBMVEUAAAAFDAxj9fUeSkoMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUUwdzBW1FYFDAVj9WMeSh4FBQxjY/UeHkowd3dW1NRHRx1/fzRCpEJEqERCQqRERKgUMhRm/WYLGwscRhxj9mMGDgYcHEZjY/YGBg4UMjJm/f0LGxseHgyYmD4QEAc6kDpMvEwBAwFd5l0oYygBAQNdXeYoKGM6kJBMvLxWViNxcS4CBAJe6V4mXiY4izhOwU44OItOTsECBARe6ekmXl4CAgGMjDk4OBceSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0SEi1nZ/4NDR8eS0tj9PQECwsBAgIDCAgCBQUtLRKSkjsHBwNEqURCo0IfTB9n/2dHsEdU0FQyfDJUVNAyMnxEqalCo6MfTExn//9HsLBlZSliYigGDwZk92QcRRwVNBUOIw4uci5Y2VguLnJYWNkGDw9k9/ccRUUVNDQOIyMJCQSUlDwpKREoZChc5FwKGApm/GYWNxYKChhmZvwWFjcoZGRc5OQ8PBiJiTcBAQBOwk44ijhKt0o8lTxKSrc8PJVOwsI4iop0dC9TUyINIQ0SLBIkWSRf7F8CBgIkJFlfX+wCAgYNISESLCwUFAgaGgsyfTJTzlMECQRi8mIgUCAEBAliYvIgIFAyfX1Tzs5LSx58fDJW1lYtcC0/nD9FqkU/P5xFRapW1tYtcHCAgDRDQxvXmeFyAAACfklEQVRoge2Y1VcVURSHx+5ExcAOsFHsVlBUQgQDTMQCFLsDFRsLuxMkVFARO8FABYO0sPu/8J57ZWadu8+Zy4N7bR/me5i9Z8/81vqef4pSRIoVL1HUX9EpWao0tQKkTFlqA41y5akNIBUqVqJWUKlcpSq1AqBadTtqBZUaNWtRK0Dsa1MbaNSpS20AqedQn1pBpUHDRtQKkMZNqA00mjajNoA0b0FtoOHoRG0AadmqNbWCSpu27agVIO2dqQ00OnSkNoC4dOpMraDSpWs3agVA9x49qRVUevXuQ60A6duP2kCj/wBqAwMDAwMDg/8WaW/q6iZJDBzkjuQyeMhQ8QcPT0kCufX18pb3pm6ustQwHyyf4b7iu6eHLIHb+np7SXtTvxEjZalRo/2RfALGjBWdx42fIEugtr4TAydJe9OgydLYlKnTkISmB4eIzqEzpAnU1ndmGHsKe9NZs+fIc3PnIQkp8xcIjgsXLZYnEFvfJUuXsSHsTZevWMlG+CrGam5TlDURa5GU1q3fAI8bN21mI3ILYyu3oba+27bvME9Rbxq10zx27Wbs4TYTe/dhOe0/AG8HD5nH4SOMo9ymYLa+x45bpqA3PXHylGVGM2K4zcTpWCynuHhwSjhz1jLPMRK5TUFsfZPOX7Asgt70YnK4XvRSymUcJ+XK1WvWp+s3IvUSaK3vzVu3/26wN71zVz97LxVByEzafevLg4f6CazW91F64QZ608cRT/SzTzMyMZRMPHv+gj+8dMjSTyC1vtmBOYUr6E1z82yE81+9RlBivHn7jj8UvLeRQGp9P3zUduve9NNnW+kvX/+xjsq37/z7j5+2Ejit76/f7PkHevGepgzLJ5QAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.362;4.blob,1.1,1836.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA1CAMAAADPs73kAAAC3FBMVEUAAAAYCgoLBARUIiLPVFQPBgaiQUGvR0cVCAj1Y2NJHR2cPz+9TEwsLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQkeSkpKtrYCAgE3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMgFBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzNCpKQiVFQECQksbGxa399k+PhCo6MXOTlkZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExMwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi4BAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFwoKBBwcC2Skjutra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/MbGwspKSm3t7dfX1/t7e0sEhIxFBQSLS06OjrExMSXl5cODg5vLS3mXV0CAQHMUlJ9MjJQICDlXFwpERFFHBxCGxtLHh4FDAVj9WMeSh4wdzBW1FYFDAxj9fVCpEJEqEREqKgcRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4BAwFd5l0oYyg6kDpMvEwBAwNd5uYoY2M4izhOwU4CBAJe6V4mXiY4i4tOwcESLRJn/mcNHw0eSx5j9GMECwRn/v4NHx9U0FQyfDJEqURCo0JU0NAyfHwuci5Y2VgGDwZk92QcRRwucnJY2dkKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzdKt0o8lTxOwk44ijhKt7ckWSRf7F8CBgINIQ0SLBIkWVlf7OwCBgYECQRi8mIgUCADCAMyfTJTzlNi8vI/nD9FqkVRyFFn/2cnYCdW1lYtcC0/nJxFqqoQKBAVNBUIEwg6BZj8AAACP0lEQVRIiWNgwAYYmbAKkwaYWVipYAobOxUM4eDkooIp3Dwka+HlA5H8AoJCwiIQEVExcSL1SkiCSClpGVk5IC2voKikrKIKkVITU8elS0MTDLRAbG0dXT19BgYDQyNjE1OQgJm5BQODpZU1RKmNLS5D7PTAwJ6BwcHRydnFFSjk5u7hCZH08gaRPr4Qnp8/LkMCAsEgiIEhOCQ0DCwUHhEZFQ1ixFjFgqi4eIjShETC3klKTklNA4ulZ2TKZkkDGdkQl+RAlObmEfYOg5Z9vl5BIUS4qLgESJZCwqQMLFReUUnYOyBQVV0Dk6gF4jrBesuGRkWIQJNYMy5D0EELCq+1TdCnvQPC7uzqJtYQ3KCnl3Iz+vrVKDZjQtdEyh0yaTLlZgwLMGXqNEJKps9A4c6cJYGhZPYcQobMmI7Kt5uLoWTe/AX4zVi4aDGqwJKly9DVLF+xEr8hq1ajCaxZuw5D0foNeM3YuGkzutCWrRiqtm3fgc+Qnbt2owu17NmLoWzffnyGHDiIKXboMIbQkaN4zDh2/ASm4MlTGEKnz5zFbci58xcwBS9euowhduUqbkOuXccmeiMVQ+jmrdu4zLiz/S424Xv3H6ALPXz0GEjefgIGy5FZDE+fYTXb4XkShtiLl0Di1WsweIPMYnj7DrsL33/ALv7xExh8RmaNgsECsBV7pAMsxR7pAEuxRzrAVuyRDrAUe6QDbMUe6QBLsUc6wFLskQ6wFXukAyzFHukAS7FHOsBW7JEOcBV7WAAAq8y/7sYfdcUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.381;4.blob,1.1,3100.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.332,3.400;4.blob,1.1,2076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.372,3.421;4.blob,1.1,1504.iVBORw0KGgoAAAANSUhEUgAAAcgAAAAOCAMAAACcuXzFAAACPVBMVEUAAAAwdzBW1FYdHUc0NH8HAweTPJMsEixHHUd/NH8MDAX19WNKSh5HHR1/NDRiKGJlKWWkpEKoqEQUMhRm/WYLGwsMDB4+PpgHBxAqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYeDAyYPj4QBwc6kDpMvEwjI1YuLnECAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyhWIyNxLi4CBAJe6V4mXiYBAQI5OYwXFzhTIlN0L3SMOYw4FziLizjBwU4CAQGMOTk4FxceSx5j9GMECwQSEi07O5IDAwcbCxsTCBMtEi2SO5ItLRL+/mcfHw0tEhKSOzsHAwNEqURCo0IpKWUoKGJ9M31KHkrQ0FR8fDJlKSliKCgGDwZk92QcRRwEBAk8PJQRESlEHESCNYIJBAkpESlyci7Z2VgJBASUPDwpEREoZChc5FwBAgEYGDw3N4kAAAEOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxY8GBiJNzcBAABOwk44ijgvL3QiIlNuLG5ZJFm3t0qVlTx0Ly9TIiINIQ1n/mcSLBIICBQLCxo1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgIUCAgaCwsyfTJTzlMCBgIDCAMBAwEeHksyMnwFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCBLHh58MjJW1lYtcC1RyFFn/2cnYCc0NIAbG0NeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkWANDRDGxsQKBAVNBUIEwgYChgfDR8LBQvbF8GFAAAB5klEQVRYhWNgAAJGJoZBA5hZaGAoKxs7ISUcnChcLm4eGriDZoCXD0wxMQ6wO5AACzMtTOUXIKSCkwOVLyhEC3fQCvDxgkhhEdGBdggciIlL0MJYSSlp/ApkZOVQBeQVFGnhENoAJWUVEKWqNtAOQQB1DZoYq6mljV+Bji6agJ6+AU1cQhNgaAQijU1MB9ohcGBmbkEbgy2t8EprWtugC9na0cYlNAD2Do4gysnZZaBdAgeubu60MdhD1hOftJc3K7qQj68fbZxCfeAfEAiigoIH2iEIEBJKK5PDwvHJCvBjikVE0sot1AZR0SAyJjZuoB0CB/EJibQyOikZj2SKVCqmYFo6rdxCZZCRmQWisnNyB9olcJCXX0ArowuLinFLlpSWYQqWV1TSyjHUBVXVNSCqtm6gHYIA9Q20M7uxCbeclSU20eYWWrmFuqC1DUS2d3QOtEPgoEu8m3aG9/T24ZLql52ATXjipMm0cw71wBTlqSBq2nSqmjpjJhjMIofFMHsOVd2CCubOmw8k++aCgSYyi2HBQqw6Fi1eQkP3UA0sXQamlq+gqqkrV4HBanJYDGvWUtUtaGDdeiCxYSMYbEJmMWzegl3H1m20dA+1wPYdtDB15y4w2E0Oix5gz14w2IfMGhYAABJXvT8e7ATeAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.440;4.blob,1.1,1696.iVBORw0KGgoAAAANSUhEUgAAAY0AAAAfCAMAAAAsoGEfAAACNFBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwdRx00fzQDBwM8kzwSLBIgTyBc5FwJFwlf619Is0goYigpZSkXOhdZ3VksbixDpkMMHgw+mD4HEAcRKhE8lDwDCAMYOxhUz1Qtby0+mj4jViMucS4BAgE4ijg5jDkiUyIvdC8CBQISLRI7kjsLGwsIEwgfTB9n/2dHsEczfTMGDwYVNBUOIw4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0kWSQECwRf7F9h72EGEAYIFAgLGgsWNRY5jjkBBAFX11dY21gCBgIBAwEeSx4yfDI7kTsTMBNRyFEnYCc0gDQbQxsmXiYpZikQKBAGBg4DAwcUFDIyMnwEBAkwdzBW1FYgICD///8bGxsnJ2ErK2kTExMFBQ08PJMSEiwUMhRm/WYiIiIFBQUmJl4uLnE6kDpMvEwSLCwsbW0jIyP39/cSEis+PpkCBAJe6V4BAgIWNzczfn4+mZkxeHgDAwgVFTRj9GMCBQUaQUE2hoY8lZUoYmIOIiI4OIsfH0xEqURCo0IpZGQ9l5cfTU0FCws0NIEkJFlk92QcRRwTMDA1g4M7kZEkWVkLHBwzM38oZCgAAQEUMjIxenowd3c2NoUhIVIICANOwk4QKCgtcHA7kpIBAQI9PZUaGkEHBwOOjjmPjzoKCgRn/mc5OYxnZ/8LGxsLCxoMDB0EBAKBgTSDgzUyfTJTzlM6OpBnZ/4CAgQbG0M4OIoAAAFB2mUwAAACfklEQVRogWNgYGBkYmYAAxZWBjZ2NBbRAG4K0awRDTg4Ubhc3DwwJi8fP5hmEWBgE0RjEQ9gphDPGsmAkwOVLySMrkJElEFMHI01CmgCJCSlUAWkZWTRlMjJMygoorFGAU2AkjKagIqq3IA4ZBQAw16NBV1IXYMIbbIgoEkLB8FNJpY1jICWNhe6kI6kLkFtevogYEADByFMJpY1jICwEKaYISNBbUbGIGBCAwchTCaWNXyAqYwZpqC5Bf0dMgqAwNLKGlPQxtaOJENsbKjkGrIBwgXEsgYl0FDHJipmT4oZDo5OztRxDbkA4QJiWYMSuEi6YhN2c/cgwRAuTy8H6jiHXIBwAXEsb3B7TNYHmTUIgK8fVmFN/wA6O4S+IBDcHtMPQmYNAhAcgl08NIy+7qAzCAe3x4x1kVmjYBSMglEwCkbBkAURkQPtglGAAFHRMZQbMrRnUyl0fWwcxS6IT0iEspKSKTZsqM+mUub6uFiKHRCfkAJlpaalU2zaSAYZmToUm5GVkA1j5uRSbNpIBnn5FGguKARTRcVwkZLSCAodNJJBWXkouVorKquqa9AFa0vrKHPQcAFkzfH61juQZ1tDY1NzSyumeFs7eeYNN0DWHG9HJ5m2dXX39GIT7+sn08BhBsiZ4zWaMJFM2yZNnjJ1Ghbx6TlkGjgKGGbwqZCrdeas2dVzKjGE586jyEGoAP+c5/z51LCDOqbgB0TO3S5QpcSShYsWowstWbqMEhNRAf45z+UrVq6i3A7qmIIfEDl3a7cavnh5zdpaMuxZhy6wvnQDGcbgAPhnZzdu2ryccjuoYwp+QOQs85atcOa27TuoYfHOXbtBlIcmGAAAageJG2H1BUoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.443,3.478;4.blob,1.1,5056.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1061,3.668;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAAIcAAAA1CAMAAABcOwhGAAACClBMVEUHBwOTkzwsLBIAAAB3dzDU1FZiYihlZSkqKhGUlDwICAMyMhT9/WYbGwsGDgYCAgGKijg7OxiQkDq8vEwECwRf7F9h72EGEAZTUyJ0dC8EBALp6V5eXiYDBwNX11dY21iYmD4TEwhLSx709GMLCwR9fTNKSh6pqUSjo0JERByCgjUPDwb392RFRRwODgaXlz0hIQ1kZCjk5FxubixZWSTCwk41NRaOjjkEBAE5jDln/2cDCAP+/meMjDn//2cFBQKRkTswMBM6kDpn/mcCBAJ9fTLOzlNmZilFrEVX2FfW1lZwcC2srEXY2FcGDwZi82Isbizz82IiVCIAAQBUVCIBAQA3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4MDAX19WOkpEKoqERGRhz29mNNTR9JSR0DAwHm5l1jYyhDQxsWFgmLizjBwU4JCQQ/Pxp6ejFqaislJQ8tLRIfHw0cHAuZmT4rKxLQ0FR8fDI8PBh4eDEQEAdyci7Z2VhdXSaSkjtVVSISEgcYGAr8/GY3NxaGhja3t0qVlTwXFwns7F8GBgLy8mJQUCCcnD+qqkWwYXuYAAACi0lEQVRYhe2YZ1cTQRSGBy+IoAFEsMSo2FBEAU3sQVGx9x5FsYOKFHtDsYGC2HvvXf+jZEOcWebOkJkzs34g74fkIZl7eLLJ7nl3CEnpBxpJTZORegj0T9eZS0uVkY7HgIxM9bGBg3xiysrS8cjOGaw+ljtETHn5Q4dpeMDwEcpT/pEBMY0aPSZPx8NXMFZ1atz4CRLSSZcHTCxUnZo0WUa6HkVTFIeKp06TkLZHSWmZ2tD0GdkS0vaAYEhtaGaOjPQ9Zs2eI1wwd978nlQWjl+CMWIW0ll5yhdkOh4LKxYJ1yxeUtmTli6Lv4kRs5DOypMb9jseEFguXLNiJUerVoOEmIV0Vp41a2PfiyTr1m/gKNGRRCeKNwZ79ajctJmjREcSnfBv2dqrh1dJerjTlz2wJvk/PLAmKfKg3c404Z2S9di2PbJjZ5WDtNuZJkGnZDx27a7es3fffodptzNNgk7JeBw4eAigpvYw2A3eKRmPI0ejj3XHLHvgnZJ61Nc2RJ8am+xqCDolczyOx47HCbsegk7JeJyM/T5OOX8YOkf5CDol43E6cqbm7Llqhw2do3ypFHVK9vpx/kKk7mKzg4bOUb5Uijql3es6XypFndKqh0KptOqhUCr7cv/AkvRwx2OPS5cLcfL6eLRcwcntYa8NxunqtRLAiFy/Qbe17LXBf9TadrP7n7mJ3MpICbV3v2CvDVLquB3/1C4i0HnnbsG9++BVHoQfYuT8Ph4FHz/xTOTpM4y6PMjzF6XpLz3zePUaI+J787bi3XvPLAA+fPyEEAl8LqL7/Mbv3bB8+YoQ+cZsexq/d0M2GwFC33/w5LqOGb93QzYbATp//uLJ614Yze8/PCV7oTt/Ac7l+R3OVFQfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1072.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACEklEQVRoge2Y11ICQRBFUVGiacSEilkxopgDxv//J5cZxJ0pdqrZvlXtQ/cHnLlvc+oUCoI3Ifn4301OSS+wV5yekZ7Qv1K5Ij3BXrVWl55gb3ZOeoG7+QXpBfYWTVV6gr0l05CeYG/ZrEhPsLdq1qQn2FtvbkhPcLe5Jb3AXassvcDddnNHeoK73b196Qn26geH0hPcHR1LL8i4vH7WhvzcQ0puPzs5PQPs+KUw/Oz8ArBjQOH42WUN8Uk4CsvPOleAHY7C8rNr0wbssBSWn3XNDWBHn8L0s9sWYEefwvSzO8jvnVCYfnbfQexIKEw/e3hE7EgoPD8rPT0DZlgKy89ezCtgh6Ww/KzSQ7iMpbD87O0dMGNAYfjZx2cXMGNAye9nX70iYMaQktvPGt+AGSAK/saxPEzpG00Zw/IwpS+LQrY8TOnLpFAtD1P6IhSi5WFKX4RCtDxM6YtQiJaHKX0xCsnyMKUvSiFZHqb0RSkky8OUviiFZHmY0hej0CwPU/piFKLlYUpfhEK0PEzpi1CIlocpfdkUsuVhSl8WhW55mNKXRRnDzzClT3thnKK9ME3RXuhTtBd6FO2FPkV7oU/RXhhQtBcGFO2FAUV74cjTXhic9sLgtBf6p70wOO2F/mkv9E57oX/aC9OnvfC/nfbCNEV7oUfRXuhTtBd6FO2FPkV7YUDRXuhTtBcGFO2FKcoPcyRYKaNg5/kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,3172.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;3.end,1.1;4.sync,10.6492361003;4.copy,1.1,3.120,3.209,4.1080,2.19,2.14,1.1,3.100,3.209;4.copy,1.1,3.130,3.228,4.1070,2.19,2.14,1.1,3.110,3.228;4.copy,1.1,3.140,3.247,4.1060,2.76,2.14,1.1,3.120,3.247;4.copy,1.1,3.130,3.266,2.10,2.57,2.14,1.1,3.110,3.266;4.copy,1.1,3.120,3.285,2.10,2.38,2.14,1.1,3.100,3.285;4.copy,1.1,2.20,3.304,3.100,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.790,3.323,3.410,2.95,2.14,1.1,3.780,3.323;4.copy,1.1,3.550,3.342,3.240,2.19,2.14,1.1,3.540,3.342;4.copy,1.1,3.620,3.361,3.170,2.19,2.14,1.1,3.610,3.361;4.copy,1.1,3.660,3.380,3.130,2.38,2.14,1.1,3.650,3.380;4.copy,1.1,3.830,3.418,3.370,2.19,2.14,1.1,3.820,3.418;4.copy,1.1,3.840,3.437,3.360,2.19,2.14,1.1,3.830,3.437;4.copy,1.1,3.860,3.456,3.340,2.57,2.14,1.1,3.850,3.456;4.copy,1.1,3.840,3.475,2.20,2.38,2.14,1.1,3.830,3.475;4.copy,1.1,3.830,3.494,2.10,2.19,2.14,1.1,3.820,3.494;4.rect,1.1,2.81,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.406,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.478,2.25,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.443,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.453,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.493,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.61,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.345;4.blob,1.1,5960.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.392,3.421;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAAaAAAAAOCAMAAABeiThBAAAB5lBMVEUAAAAwdzBW1FYHAweTPJMsEixHHUd/NH8MDAX19WNKSh5HHR1/NDRiKGJlKWWkpEKoqEQUMhRm/WYLGwsqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYeDAyYPj4QBwc6kDpMvEwCAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyhWIyNxLi4CBAJe6V4mXiZTIlN0L3SMOYw4FziLizjBwU4CAQGMOTk4FxceSx5j9GMECwQbCxsTCBMtEi2SO5ItLRL+/mcfHw0tEhKSOzsHAwNEqURCo0J9M31KHkrQ0FR8fDJlKSliKCgGDwZk92QcRRxEHESCNYIJBAkpESlyci7Z2VgJBASUPDwpEREoZChc5FwBAgEOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxY8GBiJNzcBAABOwk44ijhuLG5ZJFm3t0qVlTx0Ly9TIiINIQ1n/mcSLBI1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgIUCAgaCwsyfTJTzlMCBgIDCAMBAwEFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCBLHh58MjJW1lYtcC1RyFFn/2cnYCdeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkWANDRDGxsQKBAVNBUIEwgYChgfDR8LBQvnUR+FAAABnklEQVRYhd2PZVcCQRSGF1BRCRPFQsVOsLu7u7u7xU7s7u5/KrOfyOUwO8McfT7ce/e9M3OepSgNHC71N+HZ2Jo7YsfX+bR3cMRmgwGBkG5cDmEPaERicyf4drrfTs64XHAgFIDq4upGWgQWd4kH8wFPqZdu4O3ji08HNX4yf9ACAkmLQCMPCmY+EBKqF4SFR2CzQU5kFKjRMbGkReBRKBnX8rh4/SghEZsMapKSU0BLTUsnbQJPhjSTaZ2VzdOPcnLz8OmgJb+gELSiYtIibCgpZdqKRYZZWTkuF9RUVIJaVV1DWoQNtXUMy3pJg2HY2IRNBi3NLa2gtbV3kDZhQ2dXt+llT2+fYdg/MIhPByVDwyOgjY6RFmHH+ITpnVJhLJ2cwuWClukZUGfn5kmLsGNhUWVqtSRdNhavrK7h00HHumwDtM0tTO9v79DswkyWoN7b11SVmkauPVEHh0ZvHB2fsP47K3B6RrfzC0zvX17RXMNMFnFzqyl39zQP2hP1+GT8xvMLy3+zCq9veN9//6D5hJks5+ub5kd7+hf8Am3TlkHjSoVcAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.440;4.blob,1.1,6728.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492361104;4.copy,1.1,3.110,3.209,4.1090,2.19,2.14,1.1,3.100,3.209;4.copy,1.1,3.120,3.228,4.1080,2.19,2.14,1.1,3.110,3.228;4.copy,1.1,3.130,3.247,4.1070,2.95,2.14,1.1,3.120,3.247;4.copy,1.1,3.120,3.266,2.10,2.76,2.14,1.1,3.110,3.266;4.copy,1.1,3.110,3.285,2.10,2.57,2.14,1.1,3.100,3.285;4.copy,1.1,2.10,3.304,3.100,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.570,3.342,3.630,2.19,2.14,1.1,3.560,3.342;4.copy,1.1,3.780,3.456,3.420,2.19,2.14,1.1,3.770,3.456;4.copy,1.1,3.800,3.475,3.400,2.19,2.14,1.1,3.790,3.475;4.copy,1.1,3.810,3.494,3.390,2.19,2.14,1.1,3.800,3.494;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.copy,1.1,4.1070,3.684,3.130,2.38,2.14,1.1,4.1060,3.684;4.copy,1.1,4.1060,3.703,2.10,2.19,2.14,1.1,4.1050,3.703;4.rect,1.1,3.391,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.364,2.18,2.71;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.473,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.483,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.687,1.7,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.401,3.345;4.blob,1.1,560.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAANCAMAAACEnpynAAAAyVBMVEUFDAxj9fUeSkoAAAAMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUU9sF9qAAAAlklEQVRIic3ORRZCQRBD0YbC3R0+7u5u+18Up6unmYc3SKbXGJ9f/q9AMGTPSDjCpqCiMbtG4okkmwJKpTNiddlcnk0BFYolsTopV9gUVLUmqqs3mmwKqOW1VSedLpuC6vWdbjBkS1CjsdNNpjM2BTRfLFUnqzWbgtpsnW63P7ApoOPprLrL9camgO6Pp+rk9SZLYJ/vD1voH8b+L6jCAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.362;4.blob,1.1,2488.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.381;4.blob,1.1,4116.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.383;4.blob,1.1,892.iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAMAAACfHyDkAAABNVBMVEUFDAVj9WMeSh4AAAAwdzBW1FYFDAxj9fUeSkpCpEJEqERCpKREqKgcRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4BAwFd5l0oYyg6kDpMvEwBAwNd5uYoY2M4izhOwU4CBAJe6V4mXiY4i4tOwcESLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx9U0FQyfDJEqURCo0JU0NAyfHwuci5Y2VgGDwZk92QcRRwucnJY2dkKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzdKt0o8lTxOwk44ijhKt7c8lZUkWSRf7F8CBgINIQ0SLBIkWVlf7OwCBgYECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFA/nD9FqkVRyFFn/2cnYCdW1lYtcC0/nJxFqqoQKBAVNBUIEwiMBJkkAAABIUlEQVQ4je3U11bCQBAG4MUloljAFsWKBSwoNsAKqGAPKsWCCtjf/xHczHAOqYtnrp2Lze6f821y9TPm6eBtxquYjp2+Lv3BeLe/nVS85nNPL8q+/oAcBgcGzcHQ8AhIdXRMLkPjlmBicgokn56RwvDsnDWaX0AZiS7K5NLyijWKra6B5PF1mdzYtGdb2ygTSQlM7ezaw719lAeHaXeZyR7Zw+OTHEieP3WXZ+dO6cUlyqtrzQ0WojdO8e1dEWSpXBGrdg+jGnf84dHxwqfqM0j+8iqWWh2mYdzxt3fnf/n4ZK3D1zfMj3EnGSZ9+y9NstkSlG9iS1AktgRFYktQJLYESUJLkCS0BE3qLUGTekvQpN4SRClagihFSxClaIm/yl9LyjzBpmkHeAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.402,3.421;4.blob,1.1,1096.iVBORw0KGgoAAAANSUhEUgAAAYwAAAAOCAMAAAAL6NsfAAABoVBMVEUAAAAwdzBW1FZHHUd/NH8MDAX19WNKSh5HHR1/NDSkpEKoqEQUMhRm/WYLGwseDB6YPpgQBxBGRhz29mMODgYeDAyYPj4QBwc6kDpMvExWI1ZxLnEDAwHm5l1jYyhWIyNxLi4CBAJe6V4mXiYCAQKMOYw4FziLizjBwU4CAQGMOTk4FxceSx5j9GMECwQtEi2SO5IHAwctLRL+/mcfHw0tEhKSOzsHAwNEqURCo0JlKWViKGLQ0FR8fDJlKSliKCgGDwZk92QcRRwJBAmUPJQpESlyci7Z2VgJBASUPDwpEREoZChc5FwBAgE8GDyJN4kBAAEYGAr8/GY3NxY8GBiJNzcBAABOwk44ijh0L3RTIlO3t0qVlTx0Ly9TIiINIQ1n/mcSLBIUCBQaCxpZWSTs7F8GBgIUCAgaCwsyfTJTzlMCBgIDCAMBAwEEAQQFAgVLHkt8MnwJCQTy8mJQUCBLHh58MjJW1lYtcC1RyFFn/2cnYCd4MXiZPpk6FzqANIBDG0OcnD+qqkWANDRDGxsQKBAVNBUIEwgYChgfDR8LBQtc+6rGAAABTklEQVRYhd2PxVYDQRBFJwIkWIIFhwDB3Z3g7u7u7u4OXw3dq7HVvJyuA3dRr/pt6rYk/WIyS38Yi1Xx9PMPIBIBsdl5mE3EHhBWi/IdGETjgWK3sRkcEkotAuBwhimL8IhIGhOMKFc0i5hYahGEuHhVkZCYRCICkuxmMyU1jdgDwZOeoa4ysyhEQLJzclnk5RdQmwAUFhWrq5LSMgoTjPKKShZV1dQiCDW12q6uXrwHSoOXzcamZmoRgJbWNm3Z3iFeBKSzq5tFT28ftQlA/8CgthwaHhFvgjE6Ns5iYpJaBGFqWq+dmRXtgTI3z+bC4hK1CMCyc0WvXl1bF22CseHaZLG1LfDmzi5nz8i2f8DxyDfp8Ej3zvHJqcBf+YCzcx4XlwJvXl1zboxst3ece/kmPTzqH3p6FvgrH/DyKv7m2zvnw8j2+cX5lm//jB9QkHh+nTrYtQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.440;4.blob,1.1,1756.iVBORw0KGgoAAAANSUhEUgAAATMAAAAyCAMAAAAHrcx9AAACE1BMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwdRx00fzQDBwM8kzwSLBIgTyBc5FwJFwlf619Is0goYigpZSkXOhdZ3VksbixDpkMMHgw+mD4HEAcRKhE8lDwDCAMYOxhUz1Qtby0+mj4jViMucS4BAgE4ijg5jDkiUyIvdC8CBQISLRI7kjsLGwsIEwgfTB9n/2dHsEczfTMGDwYVNBUOIw4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0kWSQECwRf7F9h72EGEAYIFAgLGgsWNRY5jjkBBAFX11dY21gCBgIBAwEeSx4yfDI7kTsTMBNRyFEnYCc0gDQbQxsmXiYpZikQKBAGBg4DAwcUFDIyMnwEBAkgICD///8bGxsnJ2ErK2kTExMFBQ08PJMSEiwiIiIFBQUmJl4uLnESLCwsbW0jIyP39/cSEis+PpkBAgIWNzczfn4+mZkxeHgDAwgVFTQCBQUaQUE2hoY8lZUoYmIOIiI4OIsfH0wpZGQ9l5cfTU0FCws0NIEkJFkTMDA1g4M7kZEkWVkLHBwzM38AAQEUMjIxenowd3c2NoUhIVIICAMQKCgtcHA7kpIBAQI9PZUaGkEHBwOOjjmPjzoKCgQLGxsLCxoMDB0EBAKBgTSDgzUbG0M4OIoAAAEyMnoeHksxeDE+mT4TEzA4OIkKGAoNHw0KChkRESkQECgSEi1xQzndAAACzUlEQVRoge2a91sTMRjHg1aEukHQKsVVhSpDxW1V3Li34qBuxVkRce+9FSfugXv/iT7N0+u1SbhLL7nkQvP5Jd++zb355qe75/u8AICcLl0BxNcN5HZHFDXJLtRKAfLy0376e/Q0ZK/efeDq6wty+yGKHqMLvfI++XnpvwsK0R39i0DxAERlNQMDg9ILg0uCyJbSIWDoMERlNcNHIIXQyFIpRtQhNMqHlsrKKR4Lxgm7YSjZmVYJZ/QYP1qqCFTaPlZVHWesC4bMzrRKOIUFeG1cju1j42viTHDBkNmZVolmYskkvDh5ingjCjF12nS8GJkxM6MmkQgnN44xHdAqBsrLSNXiWZn0qJ09Zy4HKwyYDmgVA/MC80nlBQvrMmjiX7S4ltkJE6YDOrUEvnODS1MVNcuWE8vhFSszdK0Wq+A7t3p1qqJmzVpyfd16Lt68ygb4zq2pTFUajUaTxdRvlO1APTZt3sLeRKl8GoPWfUN0a0Jt287hWJXyaRxK9w3RHQm1c9duF+10JvZE9xqycZ9MIyqw/wBcDh5KVg7H6mWZUYEjTUebj6HFlthxGV68Byk1P3Hy1OkzZ/G9584LMuVxSKn5hYuXLpP2XrkqxJLnIaXm167fuHmLsPd2oxhPSnLn7r3m+01Y+cFDjmdYp8itrTzO4NPFmpR7PHr8BP336bPn/I6yTpHbXrx8xX4Gny7WpN/jNfr3m9hbfmdZ593v3n9oYz+DTxdrbHL7j+2f4ktdGOK2mc7B5y9w+foNItmMGnz/0QLXn78gkt0owe/2P7ItKMfff7IdaDQajQNsk29kllsD7JNvdJabBfmTVkLAZrkZkD9pJQZslpsB+ZNWQiDMcmtsIMxya2wgzXJrLCHOcmssIc5yO4flW4MlvXYv+SbciDzL7RSWbw2W9Nq95Jtwow5muZ3C8q3Bkl67l3wbN0ok2iFgzHL/BwovnfT9lT5hAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.503,3.499;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1082,3.668;4.blob,1.1,624.iVBORw0KGgoAAAANSUhEUgAAAHMAAAAPCAMAAADgfQBuAAAAzFBMVEUAAAB3dzDU1FYyMhT9/WYbGwsGDgYODgaQkDq8vEwECwRf7F9h72EGEAYLCwTs7F/v72EQEAYEBALp6V5eXiYDBwNX11dY21gHBwPX11fb21hLSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6Kijg5jDln/2cDCAMhIQ3+/mcsLBKMjDn//2cICAM6kDpn/mcCBAJ9fTLOzlNFrEVX2FfW1lZwcC2srEXY2FcGDwZi82Isbizz82JubiwiVCIAAQBUVCIBAQDJPg7/AAAAwklEQVQ4jbXN1xKCMBBA0YAKiIqKvWJvWLH39v//5AukOGZhcHKfzk52ASFOkgxJTLIESUiRaIwvRQn/YVXlPmlxvvREMhX2l0Y6k+U8mbk8X4ViSQ/7z3KlanCeanUDkJgaTUhCslptQGLqdHuAxNQfQPq/4Wj8rYk9RXxRi+QWbjZfMFyuHHfEWm+8jV+iFsktnGabDLc7b8TaHxAgapHcwh1PDM+XqzsR+YQXg15YtztD5/F0RyKf8GLQC/P1pvkBrEwbXycYhOsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1073,3.725;4.blob,1.1,848.iVBORw0KGgoAAAANSUhEUgAAAH0AAAAPCAMAAAD+tDDdAAABLFBMVEUNIA1n/2cLGwsAAAAHAweTPJMsEiwgIA3//2cbGwsMDAX19WNKSh4IEwhiKGJlKWUTEwikpEKoqEQOIg4CBQIqESqUPJQIAwgiIg4FBQIODgZGRhz29mMOIw5k92QCAQKKOIo7GDsjIw7392QLCwTs7F/v72EQEAYDAwHm5l1jYyhTIlN0L3QHBwPX11fb21iLizjBwU4bCxuYPpgTCBMtLRL+/mcfHw19M31KHkrQ0FR8fDJEHESCNYJyci7Z2VgOBg6XPZchDSEYGAr8/GY3NxZuLG5ZJFm3t0qVlTw1FjWOOY4EAQSMjDkICANZWSQGBgIFAgWRO5EwEzCQkDoEBAIJCQTy8mJQUCBeJl5mKWasrEXY2FecnD+qqkUPDwbz82JubixUVCIBAQAKQ/19AAABC0lEQVQ4jWNgYGRihgAYi4WVDSpCLAuhF5mFAOwcnGgiXNw8YMUMjLxwfVAWHz9MEbEsZiymoNgugC4kKARWLMwoAhWAs0TFxJlJYzFjMQUJSHBIwphSUhBaWgbEYJCVg0nAWfIKiiSymLGYggSUlGEsFVU1dTBDQ1MLZDumWmZmbR1SWcQCXT19FQjLwBCX7UbGJiSySAemZuY4bGe2sCSVRTqwssZlu40tqSzSgZ09LtsdHJ1IZJEOnF1ccdjO7OZOKot04OGJy3Yvbx8SWUQCXw4/GNNfNQCH7YFBwSSyiAQhZqEwZlh4BA7bmSOjSGURB6JjEOzYOFy20wjEJyQic+lse2hSMjIXAPZfQptSSv7qAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.723;4.blob,1.1,1912.iVBORw0KGgoAAAANSUhEUgAAAlMAAABxCAMAAADGZNbOAAAAzFBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUFCwU4izgfTB8JFwkQKBA0gTQkWSQLHAsPJQ8zfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQw4ijgAAQAGEAYOIw4yejIeSx4iVSIucy4TMBM4iTgyezIgUCAKGQoFDAUeSR4SLRKZlla/AAAEh0lEQVR4nO3c6U7TURjEYQQ3XAARXKqoiLviivuu939P1qJ8shPs/zBvZ878LqA5yZsmbfJkFhaadazdR1m3uFT9ApmOn6h+gUgnT52ufoJIy2fOVj9BpXPnq1+g0crqWvUTZLqwfrH6CRJtrOdXwqHbvFT9AokuX6l+gVBXR4vVT1Do2vXqFwi1NbpR/QSBbo42qp+g1K3t6hcIdHu0U/0Epe7crX6BQPdG96ufoNSDzeoXCPRwlL/H/9Gjx9UvEOjJ7tPqJwi18ux59RMUepFfCIfv5ehV9RMU2l6tfoFQa3uvq5+g0Jvdt9VP0Ond++oXaPThY757h+zT563qJ2i09OVr9RNE+ra3XP0Elb7/qH6BSDs/q1+QkmIt1S9Dxqrq2450dVP1y5Cxovq2I13dWP0yZKykvu1IV7dWvwwZq6hve9LVzdUvQ8YK6tuedHVz9cuQsYL6tidd3Vz9MmSsoL7tSFcfgfplyFg5fduTrj4C9cuQsXL6tiddfQTqlyFj5fRtT7r6CNQvQ8bK6duedHV79cuQsXr6titd3Vz9MmSsoL7tSVc3V78MGSuob3vS1c3VL0PGCurbrnR1Y/XLkLGS+rYnXd1W/TJkrKa+7UpXN1W/DBkrqm+jq1Ma3FCRy5CxDvpWVT7j/n2ZgSKXIWMt9K2ofMZNu8wgkcuQsSb6VlI+46ZeZojIZchYF32rKJ9x4DIDRC5DxtroW0H5jAOXGSByGTLWRt8KymccuMwAkcuQsTb6VlA+49BlZha5DBlrpG/l5DMOXmZmkcuQsUb6Vk4+4+BlZha5DBlrpG/l5DMOXmZmkcuQsUb6Vk4+49BlZhe5DBnro2/15DMOXWaAyGXIWBt9KyifceAyA0QuQ8ba6FtB+YwDlxkgchky1kbfCspn3PTLDBK5DBlrom8l5TNu2mWGiVyGjPXQt5ryGTftMgNFLkPGWuhbUfmMs7hMmu+yO8zJQT7jDi6T3WFOFvIZ9/cy2R3mZCKfcfuXye4wJxf5jNu/THaHOdnIZ9zkMtkd5mQjn3GTy2R3mJONfMb9vkx2hzkZyWfc+DLZHeZkJJ9x48tkd5iTkXzGjS+T3WFORvIZN75Mdoc5+chn3OQy2R3mZCOfcZPLZHeYk418xk0uk91hTjbyGbd/mewOczKRz7g/l8nuMCcP+Yw7uEx2hzl14GtFL5OEyu4wJ1X5jMvucGWi8hmX3eHaJOUzLrvDxSnKZ1x2h8sTlM+47A6XJyifcdkdLk9QPuOyO1yfnHzGZXd4DpKTz7jsDs9BcvIZl93hOUhOPuOyO1yfnnzGZXe4PkH5jMvucHmC8hmX3eHyBOUzLrvD1UnKZ1x2h2vTlM+47A7XZulrLS6T5rvsDnNykM+47A6Ts5DPuOwOczORz7jsDjNzkc+47A4zs5HPuOwOE7ORz7jsDhOzkc+47A7zMpLPuOwO0zKSz7jsDtMyks+47A7TMpLPuOwO0/KRz7jsDhOzkc+47A4Ts5HPuOwOE7ORz7jsDjMzkc+47A5T85DPuOwOk+vA104u8wvWzJEjaQrcmAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492361207;4.copy,1.1,3.110,3.209,4.1090,2.19,2.14,1.1,3.100,3.209;4.copy,1.1,3.120,3.228,4.1080,2.19,2.14,1.1,3.110,3.228;4.copy,1.1,3.130,3.266,4.1070,2.57,2.14,1.1,3.110,3.266;4.copy,1.1,3.120,3.285,2.10,2.38,2.14,1.1,3.100,3.285;4.copy,1.1,2.20,3.304,3.100,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.760,3.323,3.440,2.38,2.14,1.1,3.750,3.323;4.copy,1.1,3.590,3.342,3.170,2.19,2.14,1.1,3.580,3.342;4.copy,1.1,3.810,3.456,3.390,2.19,2.14,1.1,3.800,3.456;4.copy,1.1,3.830,3.475,3.370,2.19,2.14,1.1,3.820,3.475;4.copy,1.1,3.840,3.494,3.360,2.19,2.14,1.1,3.830,3.494;4.rect,1.1,3.752,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.364,2.18,2.80;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.478,2.26,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.513,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.731,3.250;4.blob,1.1,1368.iVBORw0KGgoAAAANSUhEUgAAACQAAABZCAMAAABhYna1AAACGVBMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC0DBwc8k5MSLCwoYmIpZWURKio8lJQDCAgBAgI4iooYOzsiU1MvdHQAAQECBQUBAwMLGxs+mJgIExMSLi4+mZkramozfX0eSkoECQkNHx8JFRUcREQ1goIGDg49l5cNISEsbm4kWVkWNTU5jo4BBAQ7kZETMDAmXl4pZmYOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnErEiuZPpkIAwg0FTQDAQEFAgKLOItMH0xiKCiZPj6BNIFZJFkUCAgfDQ1/M3+FNoVSIVICAQKVPZVBGkEaCxodDB1DG0OKOIoBAAF6MnpLHkswEzCJOIkZChkpESkoECgtEi0dR0c0f38MHh4HEBAjVlYucXE5jIwXODgSLS07kpIRKSkYPDw3iYkIFBQLGhoeS0syfHwxeHgXOjo0gIAbQ0MKGBgFCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaobKRyDAAABoklEQVRIieXVRVMDQRAF4MHd3V0CBAKB4K7B3YK7uwd3d3d3/4WwW1DsHpbuGxS8y76p+bZnbkMIFRlZwhU5eYWPJivDiYiikjL9VVFV40afUdeAjaaWNox0dPVgpG8AG0MjYxiZmJrByNwCNpZW1jCysYUNsbNHoH8XB0cnhHLmIZCLqxuM+O4eiFECT9bSS0jFm9UI8RH5MpGfP5UAVntPYBATBYdQCWW194SFIy4VERmFUNExCBQbJ4aRMD4BMSoxCYF+MskpCJSalo5QGZkIlJWdg1C5eQiUL0mGUYGkkGurqJgKXUtKuVBZORW6VlRyoapqKnStyUUcV1sHH1ff0Agf1yRp5kJfaWltg1F7B2w6uwpA093aAw/q7YPNb4m0H4H6pbAZEA3CaGgYNvyRURiNjTvAiOcMm2DXCRhNTnnByFMAm2nRDGstpl8UIZ/ZyOwc+6d5+kXxX2A2srjERsv0ixKywmx/J6tr6wi1sYlAW9s7MNrd20eMOjhEoKPjE4Q6PUOg8wsEury6RqibWwS6u3+A0ePTM2LUy+u3229d8mGfUqylPAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.345;4.blob,1.1,560.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAANCAMAAACEnpynAAAAyVBMVEUFDAxj9fUeSkoAAAAMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUU9sF9qAAAAlklEQVRIic3ORRZCQRBD0YbC3R0+7u5u+18Up6unmYc3SKbXGJ9f/q9AMGTPSDjCpqCiMbtG4okkmwJKpTNiddlcnk0BFYolsTopV9gUVLUmqqs3mmwKqOW1VSedLpuC6vWdbjBkS1CjsdNNpjM2BTRfLFUnqzWbgtpsnW63P7ApoOPprLrL9camgO6Pp+rk9SZLYJ/vD1voH8b+L6jCAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.362;4.blob,1.1,2344.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.381;4.blob,1.1,3360.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.383;4.blob,1.1,892.iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAMAAACfHyDkAAABNVBMVEUFDAVj9WMeSh4AAAAwdzBW1FYFDAxj9fUeSkpCpEJEqERCpKREqKgcRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4BAwFd5l0oYyg6kDpMvEwBAwNd5uYoY2M4izhOwU4CBAJe6V4mXiY4i4tOwcESLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx9U0FQyfDJEqURCo0JU0NAyfHwuci5Y2VgGDwZk92QcRRwucnJY2dkKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzdKt0o8lTxOwk44ijhKt7c8lZUkWSRf7F8CBgINIQ0SLBIkWVlf7OwCBgYECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFA/nD9FqkVRyFFn/2cnYCdW1lYtcC0/nJxFqqoQKBAVNBUIEwiMBJkkAAABIUlEQVQ4je3U11bCQBAG4MUloljAFsWKBSwoNsAKqGAPKsWCCtjf/xHczHAOqYtnrp2Lze6f821y9TPm6eBtxquYjp2+Lv3BeLe/nVS85nNPL8q+/oAcBgcGzcHQ8AhIdXRMLkPjlmBicgokn56RwvDsnDWaX0AZiS7K5NLyijWKra6B5PF1mdzYtGdb2ygTSQlM7ezaw719lAeHaXeZyR7Zw+OTHEieP3WXZ+dO6cUlyqtrzQ0WojdO8e1dEWSpXBGrdg+jGnf84dHxwqfqM0j+8iqWWh2mYdzxt3fnf/n4ZK3D1zfMj3EnGSZ9+y9NstkSlG9iS1AktgRFYktQJLYESUJLkCS0BE3qLUGTekvQpN4SRClagihFSxClaIm/yl9LyjzBpmkHeAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.422,3.421;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAW4AAAAOCAMAAAA4/wZTAAAAz1BMVEUAAAAwdzBW1FZHHR1/NDQUMhRm/WYLGwseDAyYPj4QBwc6kDpMvExWIyNxLi4CBAJe6V4mXiYCAQGMOTk4FxceSx5j9GMECwQtEhKSOzsHAwNEqURCo0JlKSliKCgGDwZk92QcRRwJBASUPDwpEREoZChc5FwBAgE8GBiJNzcBAABOwk44ijh0Ly9TIiINIQ1n/mcSLBIUCAgaCwsyfTJTzlMCBgIDCAMBAwFLHh58MjJW1lYtcC1RyFFn/2cnYCeANDRDGxsQKBAVNBUIEwhk3NpBAAAAqklEQVRYhe3ORRbCQBAE0IlACBrcCe7u7vc/E/QcYRbUm9f8RVXvuoT4Mkzx9wOWLcs0wDuYsC3KQNBBD2Eh5IapIlH0EB5iccqEl0QPYSGVzlBlc3n0EhYKxRJVuYIewkO1RunXG+ghLDRbbapOt4dewkJ/MKQajdFDeJhMKWfzBXoIC0t3RbXeQL5vd9Je5dLS4SjrdIZ8v1ylm8qlpfsD+f35kt4ql8Y+SiUplp5DhmUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.440;4.blob,1.1,1316.iVBORw0KGgoAAAANSUhEUgAAAR4AAAAzCAMAAAB2Upe4AAABelBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwdRx00fzQDBwM8kzwSLBIgTyBc5FwJFwlf619Is0goYigpZSkXOhdZ3VksbixDpkMMHgw+mD4HEAcRKhE8lDwDCAMYOxhUz1Qtby0+mj4jViMucS4BAgE4ijg5jDkiUyIvdC8CBQISLRI7kjsLGwsIEwgfTB9n/2dHsEczfTMGDwYVNBUOIw4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0kWSQECwRf7F9h72EGEAYIFAgLGgsWNRY5jjkBBAFX11dY21gCBgIBAwEeSx4yfDI7kTsTMBNRyFEnYCc0gDQbQxsmXiYpZikQKBAsEiwDAQMFAgUBAAECAQI3Fjd+M36ZPpliKGIyFDJBGkGGNoaVPJUiDiIUCBQfDR8KBApkKWSXPZdNH00LBQswEzCDNYORO5FZJFkcCxx6MXp3MHcICAMoEChwLXAHBwOOjjmPjzoKCgQEBAKBgTSDgzUNdNS6AAACG0lEQVRoge2aV1PbQBSFFzDEmBY6BkwJvZoSQjMlAZLQey/GdAKE3uG/M9IAtuWdZUd3xa7gfi8+uiOdPXrQrHxGhJCo6Bii44glcV8MiptXF24lEWd82KErIZFxclJyiv7r+EriUg2KnxcXfiWPeGf4cVo6x0UZmSQr26A+JDnu3PBBXr7n7asKCklRsUF9SL6VGAalZQVSgihJabnDOKqoNOfk0agCJ2I58yphVNe4jKNad50Zp3qvRgM8EsOZVwkjPS1y1hhlxqmpWeM7NBDTmVeJoiX/R+SwtU3gCramvaMzcujr6ob6+nxQB3EJeBWFygraNKsHmK33568+oIWwBLyKQr97gDb+/ecvLJxrcKgX5gAlmIBPDeu7nmckVJHRMap31fiERamVZVLf9bxToYpMz9BPnp1712wKMK/ves11oQpBEAT5jChRiJrG+vQqFKLmsXd6xC4syA6gGItLOsuaXlld88vOIxFaTbvu1wkQsrSxubW+LSmaCtBq2p1dnT1C9v8dHEoKpga0mjb4cB39Pz45lZRMWYIPF1kOnPnPoX7sgvXiAuovzoXN830EHy6NyyugK7tgvb65vQMuIMyFjUVFMbtgvX94vIavIcaFjfyiGEEQBEEQ5L2xd1FsPRZVrfI/b1EZ+Z+3KA3+a0EQBFEPyMYOqUutq1pFvqpANnZIXWpd1Sr0VQWysUPqUuuqVnxVeZMnHR96WyssgfQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.533,3.499;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1064.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACDElEQVRoge2Y11ICQRBFwYzoopgwgBGMYA6Yw///k8uMUPQUO9VsX6tf+n7AmX48cwoF9RUntC/wm5ya1j7Bb2ZW+wK/udK89gl+5QXtC/wWk6L2CW6VZEn7BL/lqvYFfiur2hf4rZW1L/Bb39C+wK22uaV9gtt2sqN9glu9sat9gtvevvYFbgeHFe0TejtqNLVPcGsda18weuP42QnkxdGUMfzs9AxxRhaF7WfN8wvAGZkUrp/V2nXAGREK0886JYTpRyhMP7u8ApwRozD97PoGcUeMwvKz26QDOCNKYfnZXdIC3BGlsPzsPnkA3BGlsPzsMUF8v2IUnp89dZ8Bd8QoTD97gVh+hML0s2obcUeEwvSz1+4b4I5sCtvP3j8QXptF4fvZxOcX4I4syhh+9v0DuANE+YfltTxM6RtQclsepvT1KQLLw5Q+T5FYHqb0eYrI8jClz1FElocpfY4isjxM6etRhJaHKX0pRWh5mNKXUoSWhyl9KUVoeZjSl1JklocpfY4isjxM6XMUkeVhSp+jiCwPU/o8RWB5mNL3R8lveZjSN6Dk9jNM6bNeGKdYLwxmvTCY9cJg1gvprBeSWS+ks15IZr2QzHphf9YLhynWCwnFeiGlWC8kFOuFlGK9MKBYL6QU64UBxXohkoKf9cJg1guDWS+ks14YzHohnfVCMuuFdNYLh2e9MN0vO5RXGcOcTbgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,1544.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAABHVBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsxMTEYGBgFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBUBAQECAgI4izgfTB8oKCg+Pj4UFBQ0gTQkWSQICAgNDQ0EBAQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4XFxcTMBM4iTgKCgoFBQUKGQoRKREQKBASLRIJFgk0NDQREREcRhwwdjA6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0FCwUJFwkSEhIrKysLHAsPJQ8JCQkHEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCADAwMFDAUeSR4EBAEFBQJ4eDGZmT4YGAofHw08PBhol7uaAAADI0lEQVRoge2aaVfTQBSGA25VRINVrIqouIBrFUTcAPcV9x2X//8zbCedJTd3bjK593L4wPulc2bah3MmkHce0ixzGRvPVLNr9x7dH7B3H7nc2c/kH5g4qMrPJg/p8g/nY6r8qfxICr971CTy9i6yeGw6hX+8Z3ICf3uxWp47eSqFP3PaZBZ/e7FanjszmcJP35+z51L4yfszd/5CCj95fy7ml1L4yZlfuNyOP7oS3Rr+lavUKsHvFFfiGo2/fmOqJb9fXImbJP7WwiK5zt3/pdu8z9emG/1bYWa5eLnT661o4O/eK177Kyr8xfsPRqOHJL/l9Z1bnbdDFf7ahDuXqPDXH7mhCv/xEz6faIKn+VoiH7mVEU3wLF9K4z83qBelJaIJXuav0vizBvW6tETsz5vcH9pa7z+xP2833vH5VFO+92cSld/P6VUdvj2ffNj4aGdmJPkdez759HnU6jX350R+355Pxr98dTPf5Pg+33+0/OD2yo4/1mTHH2vSyB9pK6LTxB/Re32j438zf8Tu9VhnYmnij9j+YJ2JpYk/0tZIppE/0tZIZtv6I5afv4YpTbX2Ryybv4cJZ9r7I5Y/f4cJJnb8MRYdf3R9q+SPtm/V/LHoWz1/LPpW0R9N3yr6o+lbCX+MZNi3mD/ibUf4YyyDvkX8MdJ2hD/GMuhbxB8jbUf4YyyDvhXxx1gGfSvij5GYvlX0R9O3Wv6YjfpWyx8z27dK/uj6VssfXd8q+aN634LI+eMyOivmj7ZvYVj+uPnPjnzf+jkTlj86VtC3gM/yR8cK+hbyOf7oWEHfQj7n+aNjBX0L+Zznj5YV9m2Fz3j+aFlh31b4jOePlhX2bYXPeP5oWWHfQj7n+aNlhX0L+Rx/dKygbyGf44+OFfQt5HP80bF830I+yx89y/Ut4PP80bNc3wK+WJ9t+f9r8T7jpuKPwqn6I52m19el4o/C/Io/CvMr/ijNh/4ozYf+KM2H/ijOB/4ozgf+KM4H/ijNh/4ozS/5o/+ODTby/Mgqxi/5o/+ODTby/Mgqxi/5o/+ODTby/Mgqwof+WJPU/d8Sf/wPkACtTIP3HxYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492361310;4.copy,1.1,3.130,3.209,4.1070,2.19,2.14,1.1,3.110,3.209;4.copy,1.1,3.140,3.228,4.1060,2.19,2.14,1.1,3.120,3.228;4.copy,1.1,3.150,3.247,4.1050,2.76,2.14,1.1,3.130,3.247;4.copy,1.1,3.140,3.266,2.10,2.57,2.14,1.1,3.120,3.266;4.copy,1.1,3.130,3.285,2.10,2.38,2.14,1.1,3.110,3.285;4.copy,1.1,2.20,3.304,3.110,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.740,3.323,3.460,2.95,2.14,1.1,3.730,3.323;4.copy,1.1,3.610,3.342,3.130,2.19,2.14,1.1,3.600,3.342;4.copy,1.1,3.620,3.361,3.120,2.19,2.14,1.1,3.610,3.361;4.copy,1.1,3.630,3.380,3.110,2.38,2.14,1.1,3.620,3.380;4.copy,1.1,3.620,3.399,2.10,2.19,2.14,1.1,3.610,3.399;4.copy,1.1,3.790,3.418,3.410,2.19,2.14,1.1,3.780,3.418;4.copy,1.1,3.810,3.437,3.390,2.19,2.14,1.1,3.800,3.437;4.copy,1.1,3.840,3.456,3.360,2.19,2.14,1.1,3.830,3.456;4.copy,1.1,3.860,3.475,3.340,2.19,2.14,1.1,3.850,3.475;4.copy,1.1,3.870,3.494,3.330,2.19,2.14,1.1,3.860,3.494;4.rect,1.1,2.91,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.369,1.7,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.440,2.15,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.478,2.25,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.533,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.543,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.71,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.345;4.blob,1.1,5808.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.762,3.421;4.blob,1.1,296.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAWlBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtMM6c0AAAAP0lEQVQImR3MRwKAIBAEwSWIYMKEmf9/U5o5VN9GpExpFK3Q2Ia4Fn3oSD+MZIo4LyvZ9kSOEy97k+etR1/GHzcdAbswyA83AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.440;4.blob,1.1,1088.iVBORw0KGgoAAAANSUhEUgAAAT0AAAAyCAMAAAAZZPzOAAAA/1BMVEUMDAX19WNKSh4AAAAeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQgTyBc5FwJFwlf619Is0hGRhz29mMODgYXOhdZ3VksbixDpkMDAwHm5l1jYygYOxhUz1Qtby0+mj6LizjBwU4tLRL+/mcfHw0BAgEDCAMCBQLQ0FR8fDIfTB9n/2dHsEdyci7Z2VgGDwYVNBUOIw4YGAr8/GY3Nxa3t0qVlTwGDgZZWSTs7F8GBgIECwRf7F9h72EGEAYJCQTy8mJQUCADBwNX11dY21gCBgIBAwGcnD+qqkVRyFEnYCcQKBAIEwgICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzWV4Su9AAAB60lEQVRoge2aZ0/DMBCGAwZK2XvvUUYZZZa9N7TM//9baIxAxVWsc1+7ltV7vvQ+JOfzozSJXiWKGhqFjqbmlp8i1SrSbUpF5q8LuQqCSLR36I/o7OqWv6keke5VKjq/XehVCESir3+AdOTgkBgeUap6JxKjY+OkIycmxdS0UtU7kRAzs76HCJaSvbn5hSpPXszELFkdSO1MrbxQsieWV6o8eTUbs2ZznorO1MoLsb31jSpP3szFbNmcp6IztfJCbG97Z9fX8oET2xN7+xY65fMWmliagFqhSHsHh0dwo+OT0zO4iaUJqBWMtHd+cQk3urq+OYabWJqAVt3K53XmrrwyRNoT9w/Y4EHyKJ/X2afyypDIwViB8Cyf17mX8sqQOrZnAbaHwPYQ2B4C20NwYC+wdF3BaHoX115Y6bqKyfT8z0VgewhsD4HtJUDK/NleAqTMn+0lQMr82R6CW3v6DLxQsLGGnS56kvbh1J4+Ay++vr3ja9jpoidxH07t6dP6j8+vIr6GnS56EvfB9z0EtofA9hDYHgLbQ2B7CGwPge0ZoeT2bM+M/7l9rez5/z7NBTWy5//7NCfUyJ7/79OcwPc9BLaHwPYQ2B5CCG8sSPbuLrePdxTAGwuSvbvL7eWOAnhjQbJ3d7m93NE3o24GiW341+sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.563,3.499;4.blob,1.1,2904.iVBORw0KGgoAAAANSUhEUgAAAU4AAAB8CAMAAAAxSKlJAAAC1lBMVEUAAAAGDgYcHEZjY/YGBg4ECwRf7F9h72EGEAYBAQNdXeYoKGMDBwNX11dY21g4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjcICANKSrc8PJU5jDln/2cDCAMHBwOOjjmPjzoKCgQkJFlfX+wCAgY6kDpn/mcCBAIEBAKBgTSDgzUCBgIBAwEEBAliYvIgIFBFrEVX2FdRyFEnYCc/P5xFRaoGDwZi82IsbiwQKBAVNBUIEwgiVCIAAQAPJA8KGAovdS9QxVBUz1QeSh5l+WUbRBtg7mANIQ0MDAyKiorh4eH19fW5ubksLCxBokFHr0cgTyBc5FwJFwlY2lgtcC0HBwfAwMC/v79UVFRISEiSkpLr6+seHh4IFQhj9WMdSR0hUiEFDAV2dnaxsbEXFxfDw8P8/Px3d3eZmZk/nD9MvUxFq0VHsEcCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf398dSB1f6l8wdjA1NTXExMTt7e0xMTGsrKzg4OAjViNdXV2cnJwuLi5HR0eWlpbS0tIJCQle6F4zfzMQJxAbQhtxcXGCgoJGRkavr6+AgIABAQHa2to8lTwTLhMZPhlpaWmMjIw4ODjc3NwfHx+4uLiNjY1eXl6rq6tV01U/nT8LHAtEREQGBgb6+vpkZGT29vb09PQrKyta3lo3iDdl+mUpZSkICAjs7Ow7OzsZGRkUFBQsbCxQxlBnZ2fx8fF7e3tQUFBra2sSLBIUMRQzfjNaWlrOzs739/fn5+d5eXktby1d5l0BAgELGgsXOhdSzFIyfTI5jTlNv00gUCBc5VxTzVM2hTYRKREcRRwIFAgxejEeSx4NIA0LGwsOIg4CBQIOIw5k92RCpEIHEQcfTB8XOBdf619Is0hZ3VlDpkMYOxg+mj48lDwqaSokWiRb4lsweDBj9mNDp0MjVyNi8mIpZikTLxNW1lZl+2UBsFZAAAAFZUlEQVR4nO2d93sURRjHN0AQUFApAoIsINIliLSAkogCCipKDVggUqQpCgjYqIINsGNBBQRpSo+9UCOKgI3QRRDpSPkPkLn4JHe3Ozc7+869M8P7+WV2Z3fee999srl353vvrOPAkJICZEhDeLEVKVpMwSemFr+khAKzWsCNrWSpSxV85GWly6QqMKsF/NguvyJ5nlwEXFm2HLYLVlG+ArYHVnFVRWwPrKJS5avhjYomSlWqBLUcfAQ0CWKreo1ndzW3uvQniiZKNWpeWyuY5eAjoEkU23W163h1161XX/ojRROlBg2vrxHMcvAR8jSqzkiL7k0UW+Mbmnh139gUzjEzaeYymgcc1qKlR2d6q9YQLpnMTTcz2kDYqp+RCWGGIAhCZ26J2W9r7YxOMrj1tpiOjHbpYMbbd8gAs2UEt9/RkbWd7rzr7s73sM17u8SfJntdunbrLu2agaT16MnarF6977v/gQf7XNjum/1Q/IkC1wVGljBa3OiX3Z+1AwY+PGjwkCFD2c6wR2RMwcgSZosbjw5nzWOPjxg56onRY8ayvSddmTsURpYwW9x46mnWPPNs1rhO4yc4E7Mu7KW4k1CdMpY2bj/WTn5uyiBn6vPOCy+y3ZdexnTKXKa501k745VXX3Mmv/7Gm5Hu0m8h+mQwM923WfvOu+/Nev+DD2fPiXTP/QjPJZOZ50Zyovm9P561YOGixUsi3Z98KmOMn+KIJkAmJ0qNli5j7fIVK8esclatjvSmdcjhjPGLl5/iiCZAZidKn+X/l/z8iy/nf/V1fuc37rf+I3zj5ac4ogmQ2YnSd2XyN75fs3bd+vztDRtz/Uf8H6+3HHKR88PSTfGdP/4kMFJSDrGczT9nxnZt2SrybQAph9hD6rZfYnp+3fgbiid28PsfMR3Tt6P4QRBKIDkElFg5hD91zz+a5+4A8UkefEEmVg7hT91zj+a56LkCuiDjKYfIsdPdBWXKXOTkEC9274GyZDBycog+7Io8MXOerZOK6XLI3sgTc9R3UC67wjj/egyXQzpGnpj3Fe77k13h4Sj+GC6HeN3s6ewK70bxx3A5xOtmx8RPDhEVPGAkDenaDK+bPQpoyYVvz08OERU8YCQNdbUZ0JJLAnt+coio4AEjaairzYCWXOIljShxgyuHEL4USBpR4oaQHELEUSBpFBY3xOQQQgySQ0AhOYQgCEKU/a2cHLBZY2L/X07OAfHTTf6hoTewEW066LT+W/hss39o6AVwRIfaORv+ET5bxx8aJpA0MvmjdYwIFe4sZ+7h7K1H/mvrtlXoAaaAAg53lvPosfbHT5zMO/Wvyj9BTAEFHO7Nfrq545w5655T+gNWTAEFnMSSRuY0y74/GYoWlEooafAJkyiFTrJCrFWFv6CUF2ESpfBJVoi1qpK5oJQ4YRKl8EkWrVUFCa1VBQqtVUUQBEGgwK/DKDiKXy3Bhx9HcO8l61P4dRiFjqJXS/BJUE8S2HvJ+hR+HYY5VRrQnkra49dhmFOlAe2pOZFLoVnlhunoVrlhOLpVbhiObpUbhqNb5UY0YRaoQnnnRtTNrk60kLMcZoEq/HduqBMtJC2HWaAK/50bEKKF3Ds3CB9okSlQaJEpgiAIwnbwl5vCQknkGiw3hYRs5NwnUuHpfOsqPCSFDP4Tqeh0vn0VHpJCBr1zgyAIgsDGK8UJnvboniiJiiph4/BKcYKnPbonSsmQSBheKU7wtEf3RCkZEglBEARBEAQhRvDpfFukD02EDFukDyVxBJ/ON6eGg4+SOIJP59tSyWBLHIQtUIUHKFThAQpVeFgKSpUG2FjdZBj8Ko0wY7WTYfCrNMKMVStfnAdfHE/BqNi9gwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492361410;4.copy,1.1,3.120,3.209,4.1080,2.19,2.14,1.1,3.110,3.209;4.copy,1.1,3.130,3.228,4.1070,2.19,2.14,1.1,3.120,3.228;4.copy,1.1,3.140,3.247,4.1060,2.38,2.14,1.1,3.130,3.247;4.copy,1.1,3.130,3.266,2.10,2.19,2.14,1.1,3.120,3.266;4.copy,1.1,2.10,3.304,4.1190,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.730,3.323,3.470,2.38,2.14,1.1,3.710,3.323;4.copy,1.1,3.640,3.342,2.90,2.19,2.14,1.1,3.620,3.342;4.copy,1.1,4.1070,3.646,3.130,2.19,2.14,1.1,4.1060,3.646;4.copy,1.1,4.1060,3.722,3.140,2.19,2.14,1.1,4.1050,3.722;4.rect,1.1,3.712,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.291,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.364,2.26,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.367,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.383,2.18,2.59;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.413,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.478,2.25,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.497,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.613,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.681,3.286;4.blob,1.1,1664.iVBORw0KGgoAAAANSUhEUgAAAEQAAAA1CAMAAADPs73kAAACjlBMVEUAAAAOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnFtLG0rEiuZPpksEhJtLCwCAQI3Fjd+M354MXgIAwg0FTQDAQEFAgIBAAACAQE3FhZ+MzOZPj54MTEFAgVBGkGGNoaVPJViKGIiDiKLOItMH0xiKCgyFBRBGhqGNjaVPDwiDg5kKWSXPZdNH00LBQuBNIFZJFkUCAgfDQ0KBARkKSmXPT1NHx8LBQUwEzCDNYORO5EcCxx/M38wExODNTWROztZJCQcCwsBAAF6MXp3MHeFNoVSIVJ6MTF3MDAoEChwLXCSO5IGDg6VPZUoEBBwLS2SOzsbCxsECwtf7Oxh7+8GEBAaCxodDB0bCwsDBwdX19dY29tDG0OKOIp6MnpLHkuJOIkZChkpESktEi08k5MSLCwdR0c0f38HAwOTPDwoYmIpZWVlKSkRKio8lJQDCAgMHh4+mJgHEBAqERGUPDwIAwMBAgI4iooYOzsjVlYucXGKODg7GBgiU1MvdHQ5jIwXODhTIiJ0Ly8LGxsIExMSLS07kpKYPj4TCAgzfX0eSkp9MzNKHh4cREQ1goIECQkRKSlEHByCNTU9l5cNISEYPDw3iYkAAQEOBgYhDQ0sbm4kWVluLCwWNTU5jo4BBAQIFBQLGho1FhaOOTkEAQECBQU7kZETMDAeS0syfHwmXl4pZmYxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarrIbjeAAACDElEQVRIiWNgwAYYmbAKkwaYWVipYAobOxUM4eDkooIp3Dwka+HiRRfh42ckUq+AIIgUEhbhF0WXEuMXx6VLQhIMpEBsaRlZOXkGBgVFJWUVVUylauq4DNGQAwNNBgZJLW0dDV2gkJ6+gSE2pUbGuAwxMQUDMwYGcwtLK7CQtY2tsR0WpfbchL3j4Ojk7AIWc2V243cXxlDq4UnYOwxSml5y3jIQYR9fPwjD3x+mUihAkbB3QCAwKBgmEQImQ8PCI6ACkfxRuAxBB9Go3JjYuFAoMz7BlVhDcIPEJMrNsE4Wo9iMlIRUyh3ik0a5GcMCxKRnEFKSmYXCzc4RwFCSm0fIkKxMVL5GPoaSgsIi/GYUl5SiCpSVV6Crqayqxm9ITS2agHRdPYaihka8ZlQ2NaMLtbRiqGoracdnSEdnDLpQdFc3hrKeXnyG5OViivX1YwhNmIjHjEmFkzEFp0zFEPKfNh23ITNmzsIUnG0xB0Ns7jzchjQ2YBOd74whtGDhIlxmLC5Zgk146bLl6EIrVq4CkotWgEElMoth9RqsZks6OWCIrV0HJNZvAIONyCyGTZuxu3DLVuzi27aDwQ5k1igYLGDnrt1UMGXPXioYsm//AcoNOXjoMOWGMBw5SgVDjh0/QQVTTp6igiGnz1DBkLPnzlPBlAsXqWDIpctXKDfk6rXrlBvCcOMm0UoBxD+JJFl/2/YAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.345;4.blob,1.1,8064.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;4.blob,1.1,544.cTFMOADPYTMYcSEhMNXgYRQfeaNyo0YHR7svdHt+1zf6b8z1nRsZGEnsZuN58dpxbdOTJmyrnzz5MDp6jpzoXCUAphLP42nHx5uePKG6kNmF4iOvRCl5ePKhxWzx/K5HxkYanzQSftqrEChuDNywIBj/Rb29utraLvieDXiMQiC4MTBAwSdwdqPyyBsYGTgvaR4lUw0T6vrrVsxdwaAxiNogz5cn4ogwTzVMqKxsefXVaBZxuUoATIXn6yvicGCqwfOo/HiLi8TqevXQ/SGqCqhX19NRuu2dxAwag4ky7V7oT5lA0y9FEETOl3dpunq0PXiqqqnpZLHo3n8nMZ60J6qWAjtyPr9Lo+nReuhSemBF2OkeBuTl/bho3Dx+e+B2Ij+xfrB+omXnsp2OM79fNX91te/qjEsRBFnBX3H58WWcVen1xurqtsJCcc1PuUreCU/aE1VLgZ0VfP7lx4+prmI2gnOBSUL9Qn3o9kns6lG1dlw749LZBk/aE1VLAfAS/w8FJFPwq+KeAgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.440;4.blob,1.1,1224.iVBORw0KGgoAAAANSUhEUgAAAYMAAAAiCAMAAACKjUXfAAABa1BMVEUMDAX19WNKSh4AAAAeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQgTyBc5FwJFwlf619Is0hGRhz29mMODgYXOhdZ3VksbixDpkMDAwHm5l1jYygYOxhUz1Qtby0+mj6LizjBwU4tLRL+/mcfHw0BAgEDCAMCBQLQ0FR8fDIfTB9n/2dHsEdyci7Z2VgGDwYVNBUOIw4YGAr8/GY3Nxa3t0qVlTwGDgZZWSTs7F8GBgIECwRf7F9h72EGEAYJCQTy8mJQUCADBwNX11dY21gCBgIBAwGcnD+qqkVRyFEnYCcQKBAIEwgdR0c0f38MHh4+mJgHEBAjVlYucXEBAgI5jIwXODgSLS07kpIDBwcpZWUoYmIECQk8lJQRKSkYPDw3iYkAAQEICAMvdHQiU1MGDg4HBwOOjjmPjzoKCgQIFBQLGhoECwtf7Oxh7+8GEBAEBAKBgTSDgzUeS0syfHxX19dY29s0gIAbQ0MAnyimAAAB5klEQVRoge2ZZ1PCQBCGo6ci9t57wYIFKyr23kDsYhcFG/b68yVxyNxkjpDAHRvgni+8s2R2N/N8ycwKQlo6YkVGZtZ/MGUjc44i6e+iOSUYAsrNY9c9v6BQ+jUVIXOxIunvoj0lFgIqKS1jPqW8AlVWKRInhICqa2qZT6mrRw2NisQJISDU1Ay9RIoTdNDS2gYwuN0i0sG0s9YETNAB6uwCGNxtFelh2llrAkZ00NsHMLjfJjLAtLPWBIzoYHBoGHqNlEZ0gEZGgbew24EXwDbQmughORgbn6DfWQeOyalp0AWwDbQmikgOZmbnqDfWw/zCogN0AWwDbWlJ+qayLOMpaiQHaGU1hhapyJr0TWVdx1PUCNTWSik2pG8q2yaeooY7gIc7gIc7gIc7gIc7gMdgDhL2HikRcXuni1Q1mIOEvUf+E2l7l5NUNZqDpGbLvU0qcwdxZGeXWOYO4sfe/gGxzh0wIMyV9PDIQ3ycO2BAmCvp8Qn5ce6AAeQr6enZOflx7iBuXFxekf8wrgP1q6HXS2MGnS7qyO9xfSPXfD48GdaB+tXQf3t3H/sMOl3Ukd/jwf0YqgWenl+wZFgH6vfN17d3f+wz6HRRR36Pj0+55vn6DmDJsA6Sjp/fcP9wB/BwB/D8AWnG7y/e+uM9AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.593,3.476;4.blob,1.1,4588.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1041,3.668;4.blob,1.1,1848.iVBORw0KGgoAAAANSUhEUgAAAJ0AAAA1CAMAAABstxlnAAACOlBMVEUAAAAHBwOTkzwsLBJ3dzDU1FZiYihlZSkqKhGUlDwICAMyMhT9/WYbGwsGDgYODgYCAgGKijg7OxiQkDq8vEwECwRf7F9h72EGEAYLCwTs7F/v72EQEAZTUyJ0dC8EBALp6V5eXiYDBwNX11dY21jX11fb21iYmD4TEwhLSx709GN9fTNKSh6pqUSjo0JERByCgjUPDwb392RFRRyXlz0hIQ1kZCjk5FxubixZWSTCwk41NRaOjjkEBAE5jDln/2cDCAP+/meMjDn//2cFBQKRkTswMBM6kDpn/mcCBAJ9fTLOzlNmZilFrEVX2FfW1lZwcC2srEXY2FcGDwZi82Isbizz82IiVCIAAQBUVCIBAQABAQECAgI0NDQ+Pj4REREKCgoGBgY3NzfBwcH39/fp6emTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWqqqra2toEBARHR0f///9BQUH09PSEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg4ICAgNDQ0DAwMMDAX19WMxMTEYGBikpEKoqERGRhz29mNNTR9JSR0DAwHm5l1jYyhDQxsWFgmLizjBwU4JCQQ/Pxp6ejFqaislJQ8tLRIfHw0cHAuZmT4rKxLQ0FR8fDI8PBh4eDEQEAdyci7Z2VhdXSaSkjtVVSISEgcYGAr8/GY3NxaGhja3t0qVlTwXFwkGBgLy8mJQUCCcnD+qqkVrLGKvAAAC6UlEQVRoge2Z91/TQBjGrwgiaCmIqMVR68KBIgrauqui4t4LBNS6cIOKe4EL99577731f7MkTS/m7n2T5nO5+kOfH5pvk3vfPJ+0n8uTCyEcuVJa8XbrlZqGkRhB/Vqnm1WmpWIkRlC/NhmZeGHbdm6YsrLsO/J4OOcwKDunPd4ktwNMeR07dbZrzpvfpSvb2ahu3dEmvh5+mHr26p1n152rT18v05mRu6Af1qT/AC9CYoT1G1iIVQ4ajJEYYf2KhiCFxUOHISRGaD9PSSl8cPiIbITECO8XCMLHRuZgJEZ4v1GjxyjbsePGR/fEqDSk3Up4pBtIa3FNmJhpRH0/jiaVTVa2U6aWR/fEaNp0bRCPdANpLa7ckM+I+n48+Wcom5mztB0xmj2HIKQbSGtxzZ3HoL4frPkLFjJktcRqRfGiAAetqHzxEoasllit8C1dxsGk4lRFZWWiLSBaXlVVnWgPsGqqE+4OS/0rEu4OS/3W3NH0LZrw1A+7W7kqvHrNWgVp+hZNeOqH3a1bX7th46bNCtP0LZrw1A+727J1GyF19dv5R4UJT/2gux07Wz4bdjnqzSz1Q+521+9p2ezd56AzYpr6wWu3X712B5z0Zpr6QXcH1f/dIeWLoNmDlUnqB90dDh+pa2yqVVjQ7MHGfrPUD893R4+FG46fUFDQ7MHGfrPUL/NOxsZ+k9RfcVKeu/hjv8wEFX/sr2luPuWcn6SS+h91+kwhQhGdPSfbkl7nL2CEu3Mur2t08ZK2qM4jxt3lK3R51rm8HqOr165HT8Yjxt2NjJTgzSg7l9cp3bqtnZlHzC975+69gvsPiCw9DD1CiPe/exx48lSCMVXPnmPEuHO9eFmS/kqCL1Wv32BkcOd++67s/QcpvlR9/PQZIYM7/5ci+sZO+HM/T1+/IWRw9133WkD4cz9nwZ6QYP4PmJDZWPhzP2fBPjJJ/PwFk8w7GWfBPqLff2CS6M7Ggr1EdzYW7P919xfCwvR6rGxpNQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1004.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAB30lEQVR4nO3ZyVbCUBAEUFSU0SnihIIDDjiiKM44/v8/SV7ElXnHRXO6uk/dRZJlL1NVhYJ5U9oHSJqe0b5AUHF2TvsEOaVyRfsEQdVaXfsEQfML2hdIWlzSvkDQclLVPkHQStLQPkHQarKmfYKg9WRD+wRBm80t7RMkbbe0L5DULmtfIGmnuat9gqS9/Y72CYLqB4faJ0g6Ota+YKI8ZNHuOBm4yKInp2fh7SSLnl+kTy9Z9LKW/rK5yaK9q4KjLHqddB1l0X5y4ymL3rY9ZdFBy1MWvet5yqL3D46yaOnxyVEWfU5eHGXRyrDjKIu+vqVPJ1n0/aOfvnxk0c9hMftwkUUbX9oXTFLXaDL4uwcYZ1Fj8nqALIsak9sDZFnUlkgPELKoLZEeIGRRWyI9QJpFjYn1AKMsaku0BxhYSwfRHmCURW2J9gCjLGpLrAcIWdSUWA8QsqgtkR4gZFFbIj1AlkVNye8BfrKoLXk9wG8WNSWvBzCaRV30APm4SaPhJg2MmzQwbtLAuEnj4iYNi5s0Lm7SsLhJwzLaA/wTN2kA3KRRcZPGxU0aFjdpXNykcXGTBsZNGhg3aWAueoB83KTRcJMGxk0aGDdpYNykcXGThsVNGhc3aVjcpGGFHuAbwYQ6lGQMnMAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492361522;4.copy,1.1,3.140,3.209,4.1060,2.19,2.14,1.1,3.120,3.209;4.copy,1.1,3.150,3.228,4.1050,2.19,2.14,1.1,3.130,3.228;4.copy,1.1,3.160,3.247,4.1040,2.19,2.14,1.1,3.140,3.247;4.copy,1.1,2.20,3.304,4.1180,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.710,3.323,3.490,2.38,2.14,1.1,3.700,3.323;4.copy,1.1,3.660,3.342,2.50,2.19,2.14,1.1,3.650,3.342;4.rect,1.1,3.101,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.269,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.286,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.364,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.386,2.16,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.413,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.593,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.603,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.643,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.661,3.269;4.blob,1.1,2612.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.345;4.blob,1.1,8064.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;4.blob,1.1,2072.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.623,3.497;4.blob,1.1,2672.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAqUlEQVQ4je3Sxw6CQBCA4QUrootiL2AFK9gL9vL+7+TN+JuYmHhlbt/MZLKZHSFeoagCEYnGmIgn6KSWYkJP0xmpwIbMsiFn0vkCXdTpUhmsVGtwXTZgy27CrTbY6Rrv7NkOym5ffIkBORyBzniCR3oWyr7GPU9nnDZfgEvpwyvpwmu5gbeSn7IL9px/+Nix6dHH4MTE+cItqtcbG+4P8UuE9xXel/j3vp4mDhXHgBNYGQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492361625;4.copy,1.1,3.130,3.209,4.1070,2.19,2.14,1.1,3.120,3.209;4.copy,1.1,3.140,3.228,4.1060,2.19,2.14,1.1,3.130,3.228;4.copy,1.1,3.140,3.285,4.1060,2.38,2.14,1.1,3.120,3.285;4.copy,1.1,2.20,3.304,3.120,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.690,3.323,3.510,2.38,2.14,1.1,3.680,3.323;4.copy,1.1,3.680,3.342,2.10,2.19,2.14,1.1,3.670,3.342;4.copy,1.1,4.1070,3.646,3.130,2.38,2.14,1.1,4.1060,3.646;4.copy,1.1,4.1060,3.722,3.140,2.19,2.14,1.1,4.1050,3.722;4.rect,1.1,3.682,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.250,2.15,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.413,1.8,2.59;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.432,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.440,1.5,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.459,2.46,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.633,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.687,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.652,3.250;4.blob,1.1,2604.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.345;4.blob,1.1,6808.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.440;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAawAAAAOCAMAAABEtdjPAAAA51BMVEUMDAX19WNKSh4AAAAeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQgTyBc5FwJFwlf619Is0hGRhz29mMODgYXOhdZ3VksbixDpkMDAwHm5l1jYygYOxhUz1Qtby0+mj6LizjBwU4tLRL+/mcfHw0BAgEDCAMCBQLQ0FR8fDIfTB9n/2dHsEdyci7Z2VgGDwYVNBUOIw4YGAr8/GY3Nxa3t0qVlTwGDgZZWSTs7F8GBgIECwRf7F9h72EGEAYJCQTy8mJQUCADBwNX11dY21gCBgIBAwGcnD+qqkVRyFEnYCcQKBAIEwgVC++zAAABEElEQVRYhe2WyU5CQRBFWwqZFGXGASdABkEEJxQQkFHA//8eXreLl3RiUiTVVEPe2fRZ3b7J3ZQQBz7YZfyHgT8JhiAc0WzzFLRxIODomPF7AqInp+oNxiAc12zzFLwxICCRTPF9T0g6A9kzzfYMAecXl9wlSMhdwfWNZnuGALi94y7hgcMZK18ocrcwxH1JUjaajDUKnLGgUiUKs42HmqRuNBlrFMixHhtEYbbx1JS0jCZjjQI51vPLK1Gah1HkWPD2zl1jC7Tb9jTAmoYa6+OzY6CbXXR7X31bGmBNR401GH6bbGkFo/Gka0sDnE3VJVmauabGgvnPVmt7YFioS7K2dE1wV/L4j5W6JJu/rq0B3Yx31VyVpLoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.459;4.blob,1.1,4484.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.653,3.554;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAAUQAAABFCAMAAAAFH2/lAAAA+VBMVEUAAAAXOBdi82IsbCxMvUxf619Is0gGDgYXOhdZ3VksbixDpkMECwRf7F9h72EGEAYYOxhUz1Qtby0+mj4DBwNX11dY21gCBQIDCAMBAgEAAQBCpEJn/2ciVCI8lDxj9WNc5VwqaSo6kDoKGAoNIQ0VNBUHEQckWiRb4lseSh4weDBj9mNDp0MNIA0jVyNi8mIfTB9HsEcpZiknYCcTLxNW1lZl+2UGDwYOIw4QJxAICAM5jDkHBwOOjjmPjzoKCgRn/mcCBAIEBAKBgTSDgzVFrEVX2FcLGwtl+WUIEwggTyBc5FwJFwkOIg5k92QCBgIBAwFRyFEQKBBAbjl5AAACY0lEQVR4nO2baVMbMQyGN6EFChTKTegGKOUuodzQEI7QAwq00P7/HwOzmUwmwyKvbMvrNe/zhQ+yLGk2XmRpFUXAhFI56nmTtxNFp/Q26ulVLerrc+GKS+xG1P8uGhhUrBl6Pzxi02b+WI7ow2g0Nq5YMzE5NWTRpBWmZxIqL4hnaW0fI8qBj3FCNVVYmZtf+PT0d/GzoAeV5ClOC1oQZ2k5YSVVuLq2vvFls7b1VfLntp08xR1BC+KQx3l3L4r2D+LDPUkPjpKneCxpQhryOCfMfgvnv2G9LrIteZzVmKQ4mron8Yyuxcbp2bmurhwmKY6u7uJFU9fk5fcfDV1dOUxSHF3dn790LYI2R+WBvF0oPs2q4gIAAAAAqKnFV5mk69fE3csD6Dj43tP7PVv8O5v05vaO6YdT6Dj43iv26+ZPTNXKaKlP2PaUtd/xX32pT9j2tDiRM1A0CkAW0iqLAZTu3ZJWWQygdO+WtOMcQOneLepGgXvo4reJtAO/ZUBodB1nubI/Z2e6+G0i7cBvGWTVkCv7s3ami98m0g78lkFWDRtl//vWO/bB3s6vkH+td6xozzp4/rfesYwLMgAAAOAeVkE8KCxGziqIBwUvcvJmmLkgHtyUAasVQN8MsxbEw5syYLUC7NwMcb8EAADQJi054Scsvqc4WdsSenGkJSf8hMX3FEe4yZCWnPATFt9THBdNBgAAAACAUOEXxENpHuTaCgileWAxDv639sWZI6CxGAf/2/hQvqYPJQ5QRDBlYAFMGVgAUwYBkMukgDVdPxoZ+U8KmOh60sjIf1LARFeiAfAI1TxPoGjVogEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1031,3.687;4.blob,1.1,1316.iVBORw0KGgoAAAANSUhEUgAAAJQAAAAiCAMAAACOcQCOAAAB41BMVEUAAAB3dzDU1FYGDgYyMhT9/WYbGws3NzfBwcH39/fp6emTk5MMDAwECwRf7F9h72EGEAaQkDq8vEwnJyf29va4uLhISEhiYmLu7u61tbUDBwNX11dY21gEBALp6V5eXiaqqqra2toEBARHR0f///9BQUFLSx709GMLCwT09PSEhITr6+uMjIypqUSjo0IJCQlsbGzR0dGgoKAPDwb392RFRRz19fWNjY1kZCjk5FwCAgGtra1ERETCwk6KijgpKSm3t7dfX1/t7e05jDln/2cDCAMhIQ3+/mcsLBI6OjrExMSXl5cODg46kDpn/mcCBAJ9fTLOzlNFrEVX2FfW1lZwcC0GDwZi82IsbiwiVCIAAQAMDAX19WNKSh6kpEKoqERGRhz29mMODgZNTR9JSR0DAwHm5l1jYyhDQxuUlDyTkzxZWSQWFgmLizjBwU4JCQQ/Pxp6ejGYmD5qaislJQ8tLRIfHw0cHAtubiyZmT4rKxLQ0FR8fDIHBwM8PBh4eDGXlz1lZSkQEAdyci7Z2VhdXSaSkjuRkTtVVSISEgcYGAr8/GY3NxaGhjZERBwICAO3t0qVlTwXFwns7F8GBgLy8mJQUCABAQECAgKcnD+qqkUxMTE+Pj4XFxcKCgoNDQ0FBQVEz3UIAAABs0lEQVRYhe3XxW7DQBCA4W1TSpmZU2ZmZmZmZmZmZmZ61DabuK127ZFaeZ1D+x+Sz87BIyuWxghJn5Y2JA2lrQUJSCZjJaSjqweITN9AbmhkjGliamaOmAghC0tIRFbWNrZ29g7Yjk7OJoiJkIurGyAydw9PhBRe3gI/i5WPrx8gMv8A5WdgEOOhgkMgEYV6hSm/wiPYzhQZFQ2IKkZ1p2LZDhUXnwCIKlH1n0rCByI9/nTJKZCoUuVpivQMG2yRHv/MrGxCObl56jN84im/QB5YWIQp0uNfXFJKqKycuxqfJKmiklRVNXeGT1JUU1tHSeOV1jdQ+u+/P1BjUzMgTdXSCok3dkswp7b2DiQsrs6ur/2K3RL8qe6eXvXF+MTV1z8wOKQ2uyX4S8Mj3JX5xDU6Nj4xOUWeZdZ07gygb83OzS9INRRaXILEtbyyura+IdVMaHMLkiq97Z3dvX3JRkLo4PAIkCq345PTzwPR34b5OjuHhLv4trOL/jZMr8MfDV5eAaIS/W2YXoc/Gr2+EdDtHe5WaD5xotdhZfcPAnp8wj0znemn6/DLK+6N4Ui/X4ffAa8Gijde5gArAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1072.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACEklEQVRoge2Y11ICQRBFUVGiacSEilkxopgDxv//J5cZxJ0pdqrZvlXtQ/cHnLlvc+oUCoI3Ifn4301OSS+wV5yekZ7Qv1K5Ij3BXrVWl55gb3ZOeoG7+QXpBfYWTVV6gr0l05CeYG/ZrEhPsLdq1qQn2FtvbkhPcLe5Jb3AXassvcDddnNHeoK73b196Qn26geH0hPcHR1LL8i4vH7WhvzcQ0puPzs5PQPs+KUw/Oz8ArBjQOH42WUN8Uk4CsvPOleAHY7C8rNr0wbssBSWn3XNDWBHn8L0s9sWYEefwvSzO8jvnVCYfnbfQexIKEw/e3hE7EgoPD8rPT0DZlgKy89ezCtgh6Ww/KzSQ7iMpbD87O0dMGNAYfjZx2cXMGNAye9nX70iYMaQktvPGt+AGSAK/saxPEzpG00Zw/IwpS+LQrY8TOnLpFAtD1P6IhSi5WFKX4RCtDxM6YtQiJaHKX0xCsnyMKUvSiFZHqb0RSkky8OUviiFZHmY0hej0CwPU/piFKLlYUpfhEK0PEzpi1CIlocpfdkUsuVhSl8WhW55mNKXRRnDzzClT3thnKK9ME3RXuhTtBd6FO2FPkV7oU/RXhhQtBcGFO2FAUV74cjTXhic9sLgtBf6p70wOO2F/mkv9E57oX/aC9OnvfC/nfbCNEV7oUfRXuhTtBd6FO2FPkV7YUDRXuhTtBcGFO2FKcoPcyRYKaNg5/kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAMAAACENI+BAAABEVBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0BAQECAgIFCwU+mT4oKCg+Pj4UFBQJFwkQKBAICAgNDQ0EBAQLHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4XFxciVSIucy4AAQAKCgoFBQUyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQSEhIrKyszfzMJCQk2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIEBAEFBQJ4eDGZmT4YGAofHw08PBic0cRKAAADH0lEQVRoge2aZ3PUMBCGBQRCKuXAlECAECDU0EINhN5DJ5T//0M4W7K0ktfSSlodMNz7JXNZ+0ksz+j1c2Mhhtkmimb7jqL4iZ27SMdN7k7CT03P0A5M5M/OzRfl79lLPDCRv2+//Dk40CSC7z9DTsXBalZ+PnS4yRE633+GnIqj1YL8fOx4k0U633+GnIoT1Ul4Pezrc6pagtfDvj6nl8/A62FfH3H2XC8xwKdlZTqfr+7EAJudX76QzZ+Ud+IiOrx0+Uouf1XeiavocP7a9Vy+PzduJp74d2WNuE+n5tbtO2X/wN173nHy/W1zf26pKF+sPyjLf1itFeVvVI/S+MHuUHm8QuAjW1mwO1Se+PZqxX/aoJ5Zo2B3qDxfD/MXG9QLa0Rdn5evwnwsxPWZev0mjU9cn7fVuzQ+MTObvqaJ5A+6t+T9B98JkXzZmfA3Hz9tMPJX1fOJzufNCf8/lLn+C1/yzv9zGfujJ2N/9Kf1RyqfuteraH+k8tG9vv/xX/sjlY/t9Vhnqmh/pPKx9cE6U0X7I5VPfVZQ0f5I5VOfFdr8C/6I5eu3Ojz+iGXrex3B4o9YfvysI8b+SA2fP+J9y+aPfX3L5I+mb7d+WQMefwR96/B5/BH0rctn8UfQty4/2R9hQN+6/NYf8bbz+CMI7NsOX/pjT9t5/BEE9m2HL/2xp+08/ggC+7bDT/VHENi3Lj/ZH0Fg37p8Fn8EfevyWfwR9K3LZ/FH0LcOn8kfTd/afC5/NH1r89n8ceR9W8Yfdd8W8se2b3n8sbPXtH3L5I8IX/Ytkz8ifNm3TP6I8Zu+jfVHE8uUMH7dt9H+aGKZEsav+zbaH00sU0L5w76N9keT4PrUfRvtjybh9Rn2bbQ/mgTXp+lbJn/E+E3fMvkjxm/6lskfMb7sWx5/RPiqb3n8scvXfVuoz0b9fe3/7Y/m/pbxR80q5I+aVcgfNauQP2oWwR9z+AR/zOIT/DGLX8ofW1Ypf2xZpfxRs8L+aN62sd67sb/fdqeaFfZH87aN9d6N4vdMNSvsj+ZtG+u9G8XvmRpWGX80rJH642/0EqK2D8mg4wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492361730;4.copy,1.1,3.150,3.209,4.1050,2.19,2.14,1.1,3.130,3.209;4.copy,1.1,3.150,3.266,4.1050,2.57,2.14,1.1,3.140,3.266;4.copy,1.1,3.140,3.285,2.10,2.38,2.14,1.1,3.130,3.285;4.copy,1.1,2.10,3.304,3.130,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.640,3.323,3.560,2.19,2.14,1.1,3.630,3.323;4.copy,1.1,3.700,3.342,3.500,2.19,2.14,1.1,3.690,3.342;4.copy,1.1,3.710,3.361,3.490,2.19,2.14,1.1,3.700,3.361;4.copy,1.1,3.720,3.380,3.480,2.38,2.14,1.1,3.710,3.380;4.copy,1.1,3.710,3.399,2.10,2.19,2.14,1.1,3.700,3.399;4.copy,1.1,3.760,3.418,3.440,2.19,2.14,1.1,3.750,3.418;4.copy,1.1,3.930,3.437,3.270,2.19,2.14,1.1,3.920,3.437;4.rect,1.1,3.111,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.250,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.345,2.45,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.432,2.18,3.115;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.440,1.4,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.663,3.573,2.14,2.42;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.639,1.5,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.630,2.17,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.91,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.652,3.231;4.blob,1.1,1040.iVBORw0KGgoAAAANSUhEUgAAAEMAAAAgCAMAAAB+dDW1AAABqlBMVEUAAAAgICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0pn/2cdSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChRyFFl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmIGDg4/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIECwtf7Oxh7+8GEBAQJxACBAIbGwsDBwdX19dY29vU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lbRI+LLAAABG0lEQVRIiWNgwA8YmZgJqCAMGJlYKDaDlYmNfM3sHGCKkwtdgpuHF5nLx4/DAAFBIWERHHKiYuISklC2lLSMrBxWVfIKikrKKjhdqKqmrqGpBWRo6+jq6RtgV2RoZGyC0wQwMDUzt2BgsLSytsGlwtbO3sERjwlOzi6ubu4MDB6eXt4+uBT5+vkLBwTikAwKDgkNCwczIyKjZKOlcdoVExuHLhQfD6YSEpOSEYIpqWl4XJyOxs/IzMoG0Tm5qOJ5eMxAB/kFhRkkKB8FwwdEF+GUYi/2I86MomjcciWlZcQYEVlOSnrFDioqKTaiqrqGYjNq6+opNqOhkWIjmppbKDajtU2KYjPaOyg2orOLj2IzunsoNoKhN5ViIwBmeSsEYAdM1AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.335;4.blob,1.1,5588.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.421;4.blob,1.1,1296.iVBORw0KGgoAAAANSUhEUgAAAT4AAAAOCAMAAACB64AbAAAB5lBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh4wdzBW1FYdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYUMhRm/WYLGwsMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyg6kDpMvEwjI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CBAJe6V4mXiYBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0eSx5j9GMECwQSEi07O5IDAwd9M31KHkrQ0FR8fDJEqURCo0IpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgGDwZk92QcRRwEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxYoZChc5FwBAgEYGDw3N4kAAAFuLG5ZJFm3t0qVlTxOwk44ijgvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgINIQ1n/mcSLBIICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCAyfTJTzlMeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkVW1lYtcC00NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwjT0DcAAAABoUlEQVRYhWNgYGRiJgBYWFG4bOwcyFxOLkL6BzPg5qFIOwMzLx8hNawsqHx+AWQeFydFDhhgwMNNkXYGZkEhYfxKRETFUAXEJSQRHClpGYocMLBAVk6eIv0MzAqKSviVKKugCaiqqSM4GpoU2T/AQEubMv0MzMw6unhVKOjpowsZGMKZRsYmlDlgQIGpmTllBgCDz0LUEp8KK2sGdCEbWzsY097BkTIHDChwcnahzABQ0Li64VPBx4sp5u4BY3l6UWb/wAJvHwoNAAWfrx8eBf5CAZiCgUFQRnBIKIUOGEgQFh5BoQmg4IuMisatICY2DlMwPiERwkhKTqHQAQMJUtPSKTQBXK5lZOJWoKuDTTQrG0Ln5FJo/4CCvHxKTQAHX0FhES75YtESbMKlZeUgqqKyilIHDCColquh1Ahw8NXW1QPJolowUEBmMTc0YtXW1NwColrbKLV/IEF7B5TR2QUG3aSzII2Snl4g0dcPBhOQWcwTJ2G3evIUEDl1Gu09STswfQaUMXMWGMwmnYXUppszFwzmIbNGBpi/AAwWks4CAKPfycYD/T+YAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.440;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAd4AAAAOCAMAAAC2CY1qAAAA51BMVEUMDAX19WNKSh4AAAAeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQgTyBc5FwJFwlf619Is0hGRhz29mMODgYXOhdZ3VksbixDpkMDAwHm5l1jYygYOxhUz1Qtby0+mj6LizjBwU4tLRL+/mcfHw0BAgEDCAMCBQLQ0FR8fDIfTB9n/2dHsEdyci7Z2VgGDwYVNBUOIw4YGAr8/GY3Nxa3t0qVlTwGDgZZWSTs7F8GBgIECwRf7F9h72EGEAYJCQTy8mJQUCADBwNX11dY21gCBgIBAwGcnD+qqkVRyFEnYCcQKBAIEwgVC++zAAABEUlEQVRYhe2WyVICMRRFgw9sBnEAGRQEnFqQqQGVUVRAUeH/vwcSFl2V1euqxJfGPpuc1c2tupvHWOgA/hfhyOFOrCjE4pJ5T0EbBQwSR4Tfk5A8PhGvdQqxM8m8p+CNAAap9Dnd96RkspDLS7ZnMLi4LFCXIKJ4BaWyZHsGA6hcU5cI0MV23pvbO+oWxnBvcx60JmNNBdt5oVpTFOZ/HuuchtZkrKmAz9tsKQrzP22H09GajDUV8Hm7vSdFaQGGweeF5xfqGkbS75vTAGsSYt7BcKShm98ZT16npjTAmoyY9+39Q2dLnzKbL8amNMDZp7i67S/XxLyw/P7T2gF6+BFXd/3XNUZdKUAdK3F1O2vXNnTHgAklLjHcAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.457;4.blob,1.1,5464.iVBORw0KGgoAAAANSUhEUgAAAaoAAABeCAIAAAD9mccaAAAABmJLR0QA/wD/AP+gvaeTAAAPt0lEQVR4nO3dfUwc550H8Gdedna8y8KyLCxmWQzEvDlQjAkBEmQ7uSA2adS6jkvrgo2dyEWKZCknxfHJziknndpKVutEuJVCVOnaE3eSfa5bOzKKFdkmctr4jS3Ijl9KvBDKS2AHA7ss7PvcH0QODLC7s8zszOz+PuIP+2FefiNmn52XZ75DICAcikpFCLFsUOpCAACR4VIXkFBSUzdXVh4hyQ1SFwIAiIxf97f16Nbmu80ilaIU+fn5LMuazeaVv2IYm9s9WlJyQIz15r2Sd8h7qHBPoRgLBwkM9hxhNN9t3np0q9RVSGyx+8vIyFj1tyqVrqHhlMFQLsqqf5jfOtK6wQRHl4Af2HPWy7jN+PPgz7VmrdSFSKywsJBlWZVKtdYExcX7v/e9f41nSQCAGPA4+S3eXzx2dcw96havGrkxlJeXHz7MacQwzOPx+P3+teZimF69vnTxNggAQLbIKKfDSXzz3s3Xj1wXtRqZwHA8s6bG0tSkNZtdg4Oc3z569GjDhnAnEbOzjxBCaWnFDsftKNdIYASOcb+KAqEAi9ioqwYA8BNt95fblKvSqux/sotajeRwlSq7oSG3sZFKS2N6ewe6upx23pscDHp8PqdGkx39LG0lbbVZtZzGznudNsbGd+0ARAnDMZxa9qXLBtmQPyRVPfEXbfdXvL948M+DAXdA1GokV9LWZqyuHu7uHrtyxe+O/TQ/EJhXqXTRT39h6MLl0cucRseCI+YCAIgo75U868fWpS1D54cu7bokVT3xF1X3R6VR+T/I/+QHn4hdjeQmb99O2bQp96WXVCkp49euuUdGYlsOy4ZwfM17IytNe6dnfbOcxkAowb9sgLTGr42fqzm3tMU77ZWqGElE1f0V/rjQM+UZvTwqdjWSm+rrm+rvN1ZVWazWnJ07nXb7WE/P5I0bfJdDEJTfPxf99HDyC+LPN+tz3E7qM4your/i/cVf/e9XbCg5LsOzLGOzMTabvrTUYrUWtbTw7f4wDFer9V7vdPSzCHLyS6VSCCGf08drrmjQNIEQ8ngS52G+xNsi8Yi3XymArkDXHmo3lBvWmqC+/tft7SxB0PGsKm60qz3dEWEWbc727Z0pKRYx6lkLqSXbmLaD0wcpPSXsktVq4uTJ+vfff06jifZKscwl3haJR7z9Sg4i//mLWouYPubx3cdrTYBhJEIsyybmhSr3KO9Tfr2+zOebnZtbdt0QIzEMwzhTskFWqGNqNsB6HB6MxAS/cxcMsi6XH8exYDBBDv8Tb4vEI95+JQfcD+RKzfea7390/84Hd9aaoLHxrMFQfvp0qaCFKdi2bccYpn94+OLSxqp/q9IVcO8FP/zjw4m/TcSxNADAdyIf/Z3ZcibMbykqzWJpunnzuHAlKVtGxlaKShtdcSHv4R8eEmqC0+hhPPGqCwAgNBwnCwv3RHMUmQw0mo11dSfS08ukLgQAAOJLry81GCqkrgIAAAAAYG3cq1F8UampCCE2COOnAAAKs96w+9TNmyuPHCHDJqAAAIAMRdX9hYt3t9nco6MlBw4IXJcsEWqi4VRDmBHg0bM0WZ5575n1LwcACSk9Rp/H0Z/Hs/ooDfvZs+lbthjKRYl3l5WgN8j8nTHVm9a/KFOdaeI6jPgDyjbcPfxp86fPffCcQmP0o+r+cBxHCDmdzlV/63e5Jm/dym1sFLIuuZq4PpFRmUHQ67pmmpKXotmombwxKVRV0aBSqcWHNwEQ0ND5oa7croWJBakLiQW3+ys3GA6vOI6LHO/e26svLV28DRKb8nLD4cMKOH6ceTATmA9kVmeuZyGmOtPMwxnvTPzChUgtude+t+XrloR8chOA2Hz71AeOYTWZmU0Wi1mrHXS5OBNFjnd/9AghlFZc7Lj9Xbw7QWA4zh0OHQiE2CXPWeI4VlOT2dRkMZu1g4Pc9coQG2Inb0ya6k3f/PWb2JaA4VjWs1n2s3HNzU7sJzcBiA2pwvGG7OzG3Nw0iuplmK6BAfsaJ7lhBD0en9OpyV4W797WVlJbm8WZsrPzns3GIIRUKryhIbuxMTctjertZbq6Bux23uuVxMT1idzGXDqD9kzF8sha+tPpOIUzf2cELyyMoDd4uux0PNcIgPyRbSUl1UZj9/DwlbEx99qntxEF5udVumWP9F+4MHR5RUKqw/HtNYK2tpLqamN39/CVK2Nud+zrjT/3qNs96s6qzRruHo5hdlOdaapvKuiFkZIASIwIsWy+TleWnq4lyRmv1xlrD7hxxw6/0znV3/+kxesNzs35Xa5lPz7ftx/7UIjNz9eVlaVrteTMjNfpVFIPSFBE9vPZY1fH+M5IbiCL9xUPnhuEsAMAJEf2TU31T01VGY1Wi2VnTo7d6ewZG7sxyfumJEFR/rll8e7hT377+qb6+6eqqoxWq2Xnzhy73dnTM3YjvjdDYzZ5c7LgtQJdgc7F83qlsdrod/unH/AIggYAiIRECLEI2RjGxjCler3VYmkpKuLb/WE4rtbrvdPLPtXhT34RQiyLbDbGZmNKS/VWq6WlpUgp3Z/P6Zu+P22qM/Ht/kx1JsdNhyQv71ViZLkSI+mVWLN4lLfXmbVavrNoc3K2d3amWNYV7242816vhLJqsupP1mMkj6Qv2khv/3C7NkeCzVRiZLkSI+mVWLN45L/XrTLseZT/+231ZWW+2dm5WF8L+e16R2N/r278MX0MTuBLH4DDSAxX4ZwfbMnQn6zarLmROfeYBJu5OPBlgVlQ0MCXxUj6uTm/giLplVizeOS/1wkTU7rt2DGmv3/44sXIkyaQ4v3FBE3c/+j+4n8jxtk/8x/PjF8bT4b3hQKgCAJ0fxlbtxbt3XvrvfeCazwUnCQ02ZpV4+z9ihrWAwCIlmbjxroTJ9LLIN4dAJBk9KWlhgqIdwcAAAAAAAAAAAAAQGnUhPpUw6lyQ7gkvry8Vw4d8hYW7olbVQAAsH4RUouDbHCjZmNeSp6Nsa01zezswOPHd55//tTAwP8EAkoaugwAAOFsSd/y24bf0gQtdSFgXSDsHsiN5Ptk5Hd9PJh5MB+Yr86sjkM1QCQQdg/kRg77ZOTuL8SGbkzeqDfVx6EaIBL5P30Jko1i9kmz1vzh9g8z6AypCwEAAMFE9cJGl99VZazCMXxgdkDsggAAID6ifc35FxNf1JnqRC0FAADiKdru7+bkzUw6s0BXIGo1AAAQN1Gd/CKEvEHvU6lPGWjD3cd3RS0IiIRKpQg1Ef83zNE0QZJ4ICCv+E95VpVspNonn4j26A8h9MXkFzWZNSSW7Cne9b+ub2fbCTrabw45kGqQgVpN/PKXz/7qV7WyCn+XZ1XJRhkDX57oY/oInAj/AFwywEgMsYhV1IGDVIMM5Bn+Ls+qlAWncIImOD8YwSM+WQ4DX/ilPe8v3k8T9Ef3PxKpGkVoPNtoKDecLj0tdSEASOZH13+UteI1tj0Hex7+4aEk9cRGmHd9JA8qjWodab15/ObdDrgGCpKXvlSvSlFxGl2DLs9UUr/xIsHhJF64pxC+NQAAAAAAAAAAAAASTNrmNF7Ta7I1pFbu44p4DHwBACSnyiOVL/zxBV6zZDdk7/p8F5UGAWvJJO+VvEPeQ4V7CqUuBABhmF8yH3h8QFeg47SnpKScOHHi66+/drvdly5dKi/njgh+4b9faPpzU2wrhc+RUuX/ML91pHWDaYPUhQCwXhiB/fQfP614i/sub7Va3dPTc/Xq1T179lit1o6ODofDkZeXt3QaOpN+w/2G5WVLbKuGz5FkJI/hFlzibRGIg4LdBW+431g5xO+dd945f/68yWS6du1aIBA4evTo0aNHOzs7OZPt+P2OVy+/Gq9igRBILdnGtB2cPpgw0fCJt0UgPhr/r7HpL9wTWBzHR0ZGcnNzu7q6zpw509ra+tlnn2m12sHBQc6UFqulnW2X7REc3PpYhRyeRhRW4m0RiI+cHTkTf5vgNFZXVw8NDTkcjpdffvn111//8ssvHQ6H2+3GMEytVi+dcnHenB058auYD7nfmZZE0Bs8XZZQj/Qm3haBOKAzaDqTnv1qltNeWlr64MGDkpKSe/fuzc3NZWVlTU5OIoScTieOLzui8jl9CxML+jJ9/IrmA47+AACro400Qsg34+O0G43GsbGx7OxshmEQQovdH4ZhNE0vLCxwJvZOezdkwckvAEBRCDWBEAoFuBdMPB6PRqNxOp0VFRWbNm1qaWnR6XT79u3r7+9fuZBQICTbcEw4+QUArM7z2IMQWvnwxsDAQHNz87Fjxxb//eabb3Z0dIRCodra2pULUWlVHodMY2Cg+1vd4hgRn5N72C/nJctzvUC5FiYXQv5QSm4Kp/3zzz+vqKioqamprKxMTU0dHx+/ePGi3+9fPBdeCiMwrVnrHnELXpsg+zOc/K5CvBhuqQK+5RAsDhQn5As5bjsytnJf8O3xeI4fP97d3f3WW289/fTTu3bt2r1798q+DyGUXpaOU/g3f/1G2MKE2p/h6G8Vi8NEMBITfJiIeEuW53qB0v3zk38W7Sta2d7Z2elyud5+++133313Zmamo6Nj1dnN/2KeH5+f6p8Stqq19mecwjGcG8YZ8ofYNd5qALmdAIA1aXO0Pxv62YWdF1aO/ovG7tu7h84P2f7TJnhhq+IbwQ/dHwAgnPrf1Bu3GT9+8WPE88VQ+bvyG37XcKbsTNyuOEMEPwBASKSWfK33tWd/8SyvudLL0veN7cttzBWpKgAAiAfaSFcdq+I1i/lFc9738yJPBwAAIP5kOhobAAAEp8nWsCz75H4xjPsDACQLiOBfL/FiuMVbsi5f1862a81awZcMogcB7nKwngh+gJCYMdwiLXmx+6MzaGEXC/iCAHfJrTOCHyhPamFqO9uOq+BaBwDfRfDD5yE5YCjoCcITbwAghOxn7eYXzXAMDoAwcBVO0ATnZ+Xzp0AOqFSqnW1/qvkpiDwAQAA7/2tnUQs3GuDTH39qP2uPOC+GYzi17DyMDbJwqC6eJxH88O0EgAB0BbqVd5acj5zeaW/EeTe9usn6sXVpy9D5oUu7LglZH1juJ/d/MnplFI7+ABCAe8Q9Pz7PaQz5ojqCG782fq7m3NKWaDpNsB6LEfzQ/QEggPWc/PpmfY7bDnHqAqtbjOCH7k94UgXlJ16cPU0TCCGPJyh1IZHd+vdbdz64w2l0PnIKuIrE+/uGJ972ihfBn+xILdnGtB2cPihGUH6YJYu3Xqmo1cTJk/Xvv/+cRgNf0gn49w1P1O01lBva2XZjlRF2LIFJFZSfeHH2wSDrcvlxHAuukVSeVBLv7xtebHH2UYbdP4nghzu/AADFCB9nH2XY/ZMIfuj+AACKET7OPpqw+/hH8AMAgPQggh8AkKQ4Efz/DwWyxGru2Yh9AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.683,3.554;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAAUQAAABFCAMAAAAFH2/lAAAA+VBMVEUAAAAXOBdi82IsbCxMvUxf619Is0gGDgYXOhdZ3VksbixDpkMECwRf7F9h72EGEAYYOxhUz1Qtby0+mj4DBwNX11dY21gCBQIDCAMBAgEAAQBCpEJn/2ciVCI8lDxj9WNc5VwqaSo6kDoKGAoNIQ0VNBUHEQckWiRb4lseSh4weDBj9mNDp0MNIA0jVyNi8mIfTB9HsEcpZiknYCcTLxNW1lZl+2UGDwYOIw4QJxAICAM5jDkHBwOOjjmPjzoKCgRn/mcCBAIEBAKBgTSDgzVFrEVX2FcLGwtl+WUIEwggTyBc5FwJFwkOIg5k92QCBgIBAwFRyFEQKBBAbjl5AAACY0lEQVR4nO2baVMbMQyGN6EFChTKTegGKOUuodzQEI7QAwq00P7/HwOzmUwmwyKvbMvrNe/zhQ+yLGk2XmRpFUXAhFI56nmTtxNFp/Q26ulVLerrc+GKS+xG1P8uGhhUrBl6Pzxi02b+WI7ow2g0Nq5YMzE5NWTRpBWmZxIqL4hnaW0fI8qBj3FCNVVYmZtf+PT0d/GzoAeV5ClOC1oQZ2k5YSVVuLq2vvFls7b1VfLntp08xR1BC+KQx3l3L4r2D+LDPUkPjpKneCxpQhryOCfMfgvnv2G9LrIteZzVmKQ4mron8Yyuxcbp2bmurhwmKY6u7uJFU9fk5fcfDV1dOUxSHF3dn790LYI2R+WBvF0oPs2q4gIAAAAAqKnFV5mk69fE3csD6Dj43tP7PVv8O5v05vaO6YdT6Dj43iv26+ZPTNXKaKlP2PaUtd/xX32pT9j2tDiRM1A0CkAW0iqLAZTu3ZJWWQygdO+WtOMcQOneLepGgXvo4reJtAO/ZUBodB1nubI/Z2e6+G0i7cBvGWTVkCv7s3ami98m0g78lkFWDRtl//vWO/bB3s6vkH+td6xozzp4/rfesYwLMgAAAOAeVkE8KCxGziqIBwUvcvJmmLkgHtyUAasVQN8MsxbEw5syYLUC7NwMcb8EAADQJi054Scsvqc4WdsSenGkJSf8hMX3FEe4yZCWnPATFt9THBdNBgAAAACAUOEXxENpHuTaCgileWAxDv639sWZI6CxGAf/2/hQvqYPJQ5QRDBlYAFMGVgAUwYBkMukgDVdPxoZ+U8KmOh60sjIf1LARFeiAfAI1TxPoGjVogEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.630;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAqCAMAAAAnIy9hAAAAmVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwlIzrfvAAABSElEQVRoge2ZW1MCMQyFy4qLAopyE/ECAgIqivD/f5wz3YeWmEm23ULrmO/pzKRNzkNezkQpi1p2puJiHGBeaH+wWsvq4Yx5YRxgXmh/sHqe5eGMeWEcYF5of7DauAjnyw/jAPNC+4vv3o/8UtOMM72ph+esKksr07SP45bjSg+/ZlVZOjea2+O45ejq4Q1WlSXupoWG3LRez7+x+UurKvzqcrBpoNofDO98B5m/tKoC3QVWR/fj/uGLh2IvHzll/6VVFegu/IynYi+fOfU3mBR7WeeUIAhCckxf1GwOVFI4ZerpQs1egUoKp0y9XKn1G1BJ4ZSp3z/U5hOopHDP1IIgCMmBpfAwyTwCWH4Ok8xjgCXkMMlcEARB+F8g92cry5vq1zbS2ckJ5P5sZXkrK3/v9ie25gFyf7ayfPz7uBvI/dnK8l5Z+Qd2Shs7pPRqWwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.742;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492361832;4.copy,1.1,3.160,3.266,4.1040,2.57,2.14,1.1,3.140,3.266;4.copy,1.1,3.150,3.285,2.10,2.38,2.14,1.1,3.130,3.285;4.copy,1.1,2.20,3.304,3.130,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.660,3.323,3.540,2.19,2.14,1.1,3.650,3.323;4.copy,1.1,3.720,3.342,3.480,2.19,2.14,1.1,3.710,3.342;4.copy,1.1,4.1020,3.665,3.180,2.19,2.14,1.1,4.1010,3.665;4.rect,1.1,3.711,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.623,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.364,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.387,1.8,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.413,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.459,2.24,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.632,3.221;4.blob,1.1,1124.iVBORw0KGgoAAAANSUhEUgAAAE0AAAAqCAMAAADBJiZgAAABv1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBACBgIDCAMBAwEDBwdX19dY29tRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lZDXIszAAABR0lEQVRIiWNgoAgwMlKmHwUwMbOwkqOPjR0MOJBZDAycXNxM5JjGwwsGfMgs8gG/ABgIIrNGwVAHQsIiVDVNlIqmiQmLU8MYCUkwJSWNLiEjK4fMlVcgaJSikrKKKg45NXUNTS0oW1tHV0+fgFkGhkbGJqY4pc3MLSytrIEMG1s7ewdHQi5zcnZxxa/CzZ3Xg4HB08vbh5BZDAy+fv4BgXjkg4J5QkLDGBjCIyKjogkbFxMbpxKfgEMyMSk5JTUNzEzPyNTL0iFsHkN2Ti4Ombz8gkIEr6i4hAjTGBhKcYiXlaPyK4gyDRUgl+SUA2qU5AgwWpIPCZBVSYQiiapY4kyrzCJGVXVNLTHKMurIyRO4QH0DFQ1rbGqmomktrW1UNK29g4qGdXZ1U9G0nl5tKprW109FwyZMlKeiaZMmU9EwhinFVDQMAG3dMjit+6aGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.326;4.blob,1.1,812.iVBORw0KGgoAAAANSUhEUgAAAMUAAAAgCAMAAACVb0zzAAABLFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaoFDAxj9fUeSkoMBQX1Y2NKHh5CpKREqKikQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUVpIQeMAAAA8ElEQVRYhe3O2VaBARSGYSkUmTIk8ywNJEMoVCKVUEqGkNz/PVjr35ew9/Kd/M/Jt8/2q9GA7Gh3Ua8l7enQBRL0hn10goADowmdIOHQjC6QYLHa0AkS7EfoAgkOJ7pAgst9jE6Q4DlBF0jw+vzoBAGBYAidICEcQReoVCrVFkRjcXQCQyKZouM0jQ3hOTunvbjMYENYslc5Za/zBXAJR7F0Q0e5gg3hqd7S3tXq2BCWxv0DHY9NbAjPU4u2/Yzt4Om80L6+dbEhLO+9Ph2DD2wIz+eQ9ut7hA1h+RlPlJ3OfsElHPPFko6/FTaE53+9AaDIE1fmzJXUAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.362;4.blob,1.1,8064.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;4.blob,1.1,48.FAAAkA0emxlfRQOL/wejqWsIyMQrowAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.440;4.blob,1.1,1136.iVBORw0KGgoAAAANSUhEUgAAAhoAAAAOCAMAAABev0WwAAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABo0lEQVRYhe2XV1fCMBiGowEURVRwKwqKE3GCExy4xY174957/XxpPBKb9iJgaEIPz03fvqf5+lx8NwEgKxtmkGEwyl5NObnxbM7L/wmWAmgtJBI18SnUiQcAFhVz/L2QGA3yd5sd55LSMvS0lENrBZHo+Z1CnzgAYGVVNb/fi0iNo1Ze1Dldio/qG6C7kUg6A8Cm5hbeEmLR2kYUnnav4iNvB+zsIpLOABB29/CWEApPr4WsfH4eIryJrUZf/wBvC5EYHDKR1bAjQHHQ45IIpkAJT6ZNLIitBhwZZTRMF9htym7MTHFwPCQxwdpHNpk2sUBajckpRsP0wLRzRlnOzlGcnA9LLDA3+juZNrFAWo3FpWVG03TAyuqasoysb2hvwhtpNeDmFm8NcfD71Fr3doJjIhEGLv8CG9AmArQaO7t7KXBLS/YdB2r14dFxQmOiJ6dnTHySBhvQJhK0GucXl6m0TCeurlXr4M1tQmNMd/dRFjrJgw3o0gO63bgecUKrAZ+eNdUWmJdX9f7tXVsPzflAt5vQJ06At1IGMfhCt5twAKdv11auENTihjoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.457;4.blob,1.1,5920.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.713,3.554;4.blob,1.1,1372.iVBORw0KGgoAAAANSUhEUgAAAUQAAABFCAMAAAAFH2/lAAABF1BMVEUAAAAXOBdi82IsbCxMvUxf619Is0gGDgYXOhdZ3VksbixDpkMECwRf7F9h72EGEAYYOxhUz1Qtby0+mj4DBwNX11dY21gCBQIDCAMBAgEAAQBCpEJn/2ciVCI8lDxj9WNc5VwqaSo6kDoKGAoNIQ0VNBUHEQckWiRb4lseSh4weDBj9mNDp0MNIA0jVyNi8mIfTB9HsEcpZiknYCcTLxNW1lZl+2UGDwYOIw4QJxAICAM5jDkHBwOOjjmPjzoKCgRn/mcCBAIEBAKBgTSDgzVFrEVX2FcLGwtl+WUIEwggTyBc5FwJFwkOIg5k92QCBgIBAwFRyFEQKBAZGRk+Pj4GBgYPDw85OTknJyc3NzcgICAxMTEYGBik4vbpAAACqUlEQVR4nO2bW1cTMRCAUyoitYh4g5ZFsaJQtQpUKCCKgOAFvIBaVPj/v8M2PZ6ePWyTTDKT3Wbne+nD7CQzs83uZGYjBONCYUQUr6RtxLBTGBXFq7qLxsZ8mOITXI+ujYvSdc015Ykbk5hzpg+yRzenxK3bmmvu3L1XRpwShekZSWWAuKrWzqJHKTAbSeYShZX7D+Yfdn5rjwgtqMi7OE04AzkLjyVPEoWLS/Wnz543Xryk/Lsty7u4QjgDOcrlvNoU4tVatN6ktKAl7+IG5RTUKJezpLoZzttwa4tkWOVy1uOS4ljqvo5mbGfcfvN2x1aXDpcUx1a39m7Xdsq9/ffbtrp0uKQ4troHh7YzMv9pjZTSNmH42Z3TbAAYhmEYRk8j+mAkrX9U7L0ygNoPuPXq8S5d/MlM+vnoGGiHV9R+wK3XjBfnS6SqlamlWQLbUtB4G1/tpVkC29Lh8RyAplHAmJBUWQygdO+XpMpiAKV7vyQt5wBK937RNwr8oy5+u0j7wFsGCo3YcqYr+0NGVhe/XaR94C0DUw26sj9oZHXx20XaB94yMNXAKPt/6z1jv+ONnENOes9Y0p518Jz2nrGADTLDMAzD+AdUEA8KI89//JRoh8rr+97I81/tdvvsd1uzMzQuiAd3ysDY8z9/dTtD04J4eKcMjFsB3SDi7AxzvL/sBpFxhIOIAAcRAQ4iAjKISckJPGHJeopj2paA+zEoxYEnLFlPcQibDINSHHjCkvUUh7DJwM9EhmEYhmGCB94KCKV54OTH+UV8KGgrIJTmgZMf8SDCv7UfnnMEapz8iAcR/m18KF/TO/kRDyJjRZ6DiHbKIM9BRDtlkOcgop0yyHMQ0bAMYionBdB0sRsZdkFM/6SAiy56I8MuiOmfFHDRRW9kdIL4D9ptY9mL+myyAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.630;4.blob,1.1,800.iVBORw0KGgoAAAANSUhEUgAAAM0AAAA0CAMAAAAe/0yKAAAAsVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwkBAQECAgIxMTE+Pj4XFxcKCgoNDQ0FBQWFmTQ7AAABYElEQVRoge3ZWU8DIRQFYDrWqdbd1n1prfu+1P3//zATxgSKN5eBoV6M53u6DR04D7ycoJSlVcwoWSYBlYXP5662ina6YFFMAioLn89dnS3KdMGimARUFj6fu9qZS5crjklAZeHzyaePU85rXZnTu/rw0jvVtVBoi9NJ67OkD1/2TnWtrGpr00nrs64P73inumRvWmrsTev14jc23/JTEz92mbhpzmp/Y3Mr9iDzLT81we/irm7v7PYn/7FX3ct932R/y09N8Lv4zzio7uWhb/obBtW9bPsmAIDsDI/U6NiZshLUqYcnanTqTFkJ6tRn5+ri0pmyEtSpr67Vza0zZSW8UwMAZIdq4WmauQCqP6dp5hKohpymmQMAwP9CvD9bXd6s3t0LPTsFId6frS5vdeWHx6dfjhaBeH+2urz8+3gY4v3Z6vLoygAAkI/xszaWzpHGy6v2Jp0jjfcP7fP75xfSdiBRA26YPAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1083,3.649;4.blob,1.1,372.iVBORw0KGgoAAAANSUhEUgAAABkAAAANCAMAAABrcDXcAAAAclBMVEUAAAB3dzDU1FYODgYyMhT9/WYbGwsLCwTs7F/v72EQEAaQkDq8vEwHBwPX11fb21gEBALp6V5eXiZLSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC3Afep9AAAAXklEQVQYlWNgwA4YmXBIMDAxIvOYmeFMFlY2JAl2Dk4uGJubB1kLLx8/O5QpICiEwxZhEXYcMqJiOCTEJSRxyEhJy6C6Fc6SlUN1K5wlr6CI6lY4S0kZhy0MKqogEgCHZgOGY8IicwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1021,3.684;4.blob,1.1,2032.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.723;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492361939;4.copy,1.1,3.160,3.228,4.1040,2.19,2.14,1.1,3.140,3.228;4.copy,1.1,3.150,3.266,4.1050,2.76,2.14,1.1,3.140,3.266;4.copy,1.1,3.140,3.285,2.10,2.57,2.14,1.1,3.130,3.285;4.copy,1.1,2.10,3.304,3.130,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.740,3.342,3.460,2.19,2.14,1.1,3.730,3.342;4.rect,1.1,3.671,3.221,2.26,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.364,2.66,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.383,2.38,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.413,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.421,2.16,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.440,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.478,2.17,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.668,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.622,3.202;4.blob,1.1,1136.iVBORw0KGgoAAAANSUhEUgAAAEsAAAA9CAMAAADS62QEAAABv1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sCBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lbtUSKNAAABUElEQVRYhWNgoBJgZKSWSQxMzCys1DKLjZ2DiVpmjYJRMApGwSggBnBygQE3MotcwMMLBnzILHIBvwAYCCKzRsFQBELCIlQ0S5RqZokJi1NuiIQkmJKSRpeQkZVD5sorEDBIUUlZRRWHnJq6hqYWlK2to6unj9ckA0MjYxNTnNJm5haWVtZAho2tnb2DI35XOTm7uOJX4ebO68HA4Onl7YNfHQODr59/QCAe+aBgnpDQMAaG8IjIqGhChsXExqnEJ+CQTExKTklNAzPTMzL1snQImcaQnZOLQyYvv6AQwSsqLiFoFgNDKQ7xsnJUfgURZqECystoBKC8jEaA0TJ6CICsSpxSElWxpJlVmYVbrrqmlhSjMupIzwe4QH0D1YxqbGqmmlktrW1UM6u9g2pGdXZ1U82snl5tqpnV1081oyZMlKeaWZMmU80ohinFVDMKAGL3MneFd1oxAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.345;4.blob,1.1,8064.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;4.blob,1.1,456.DH3asMLCWA6BA17kC3SMdWQtyWLQFp6BGyVBsEDKk2IeGZjV2Kh96aUkFnHRKf4oNCE0OjcajAz4L0FwsJTH87WRgeBgAY8nBSMDKDE4nPI7d7Z9+y0rPHx2iRdXpU5dJx2mOz4gy6AxmDDT6QX/EAnjeS0EQTnCnCHD0IhxBM8htbYOslj0p/wBWVmlTNepm7g1QXUhAEY5QuGQwTBi9K0bloXCHINhyIjvDHWFJ9yIqrVoIFbr1Pi4Waezz8zMLvHiq+iMfeba+LVsYXanvnN2yRsr3nAdjf1j7x8vjl5ccC0EQVnCrPN3z6MvwC2z2drc3F9RIWv9ITrlKQTiXvxdllB4/u5dqqtwJhRm3cV9hrrCE25E1Vo0bBZLU0qK4xJcYTBRIVFBdOdwbN2UzjhjXHAtAABPJzzhRlStxeb/ASkEbXy2FsN1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.440;4.blob,1.1,1124.iVBORw0KGgoAAAANSUhEUgAAAkwAAAAOCAMAAADqtbO/AAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABmUlEQVRoge2Xx1cCMRjEowEUxQZ2RUGxIlawggW72LF37L23P182Hngb9hAe+Uh2H7/Lzs5hZg7fJQjl5OIsKkxm1a8lLz+NMGtB4b+wFeHiEkqlnsKsRIBwaZnAeikxm9T/dkc6aeUVleRrq8LF1ZRKPYVdCQDhmto6cfUyUu9sUBuNLjeH2KZm7GmhlMFAuLWtXfQIuejopAxvl49DrK8b9/RSymAgjPv6RY+QCu+Ajbb8ARFD9Ef8mAaHhkWvkImRUQttjTmDIFVet0IINJlV8SB+THh8glOYIXDYk71JK0jVVFhhGjSZVfFAOaaZWU5hRmDONZ9sLiyCdC1FFJZBk1kVD5RjWlld45RmANY3NpPN6NZ25pfoD+WY8M6u6BnyEPBruZ498OJoFLyCeQGroiDHtH9wCLBNlxw5j7Xsk9Mz4OLY+cUlcAXzAlZFQ47p6voGcqWeuL3TtEP3D8DFlsenGHAF8wI29Uxegu6XhCLHhF/fMjpbYt4/tP3Pr8zu0AHf5CUY/kkoJHpSFr3yS16CkWBC/QGxprZELDkQCgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.457;4.blob,1.1,4484.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.743,3.514;4.blob,1.1,2928.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.771,3.630;4.blob,1.1,784.iVBORw0KGgoAAAANSUhEUgAAAM0AAAA0CAMAAAAe/0yKAAAAq1BMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwkBAQECAgIxMTE+Pj4KCgoNDQ3rk+Z6AAABW0lEQVRoge3ZR3PDIBAFYKw4cuL02OnFjtN7L///l0WDDmCyswiEs2TyvtPOIME7cHmDUpZOMadkmQRUFj6fu9opuumCRTEJqCx8Pnd1vijTBYtiElBZ+Hzuam8hXa44JgGVhc8nnz5Ouaj1ZU7v68NL79TUUqEtzyatz4o+fNU7NbW2rm3MJq3Ppj68552akr1pqbE3bTCI39j8y09t/Nhl6qY5q8Ot7Z3Yg8y//NQGv4u7uru3P5z+4qC+l4e+yf6Xn9rgd/GfcVTfy2Pf9DeM6nvZ9U0AANkZn6jJqTNlJahTj8/U5NyZshLUqS8u1dW1M2UlqFPf3Kq7e2fKSninBgDIDtXC0zRzAVR/TtPMJVANOU0zBwCA/4V4f7a6vFl9eBR6dgpCvD9bXd7qyk/PL78cLQLx/mx1efn38TDE+7PV5dGVAQAgR69vFekQybx/VKRDJPP5VfkGJMkeYlqWHQQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1064.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACDElEQVRoge2Y11ICQRBFwYzoopgwgBGMYA6Yw///k8uMUPQUO9VsX6tf+n7AmX48cwoF9RUntC/wm5ya1j7Bb2ZW+wK/udK89gl+5QXtC/wWk6L2CW6VZEn7BL/lqvYFfiur2hf4rZW1L/Bb39C+wK22uaV9gtt2sqN9glu9sat9gtvevvYFbgeHFe0TejtqNLVPcGsda18weuP42QnkxdGUMfzs9AxxRhaF7WfN8wvAGZkUrp/V2nXAGREK0886JYTpRyhMP7u8ApwRozD97PoGcUeMwvKz26QDOCNKYfnZXdIC3BGlsPzsPnkA3BGlsPzsMUF8v2IUnp89dZ8Bd8QoTD97gVh+hML0s2obcUeEwvSz1+4b4I5sCtvP3j8QXptF4fvZxOcX4I4syhh+9v0DuANE+YfltTxM6RtQclsepvT1KQLLw5Q+T5FYHqb0eYrI8jClz1FElocpfY4isjxM6etRhJaHKX0pRWh5mNKXUoSWhyl9KUVoeZjSl1JklocpfY4isjxM6XMUkeVhSp+jiCwPU/o8RWB5mNL3R8lveZjSN6Dk9jNM6bNeGKdYLwxmvTCY9cJg1gvprBeSWS+ks15IZr2QzHphf9YLhynWCwnFeiGlWC8kFOuFlGK9MKBYL6QU64UBxXohkoKf9cJg1guDWS+ks14YzHohnfVCMuuFdNYLh2e9MN0vO5RXGcOcTbgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.723;4.blob,1.1,2072.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;3.end,1.1;4.sync,10.6492362043;4.copy,1.1,1.0,3.190,4.1200,2.19,2.14,1.1,1.0,3.171;4.copy,1.1,1.0,3.228,3.110,2.19,2.14,1.1,1.0,3.209;4.copy,1.1,3.140,3.228,3.500,2.19,2.14,1.1,3.140,3.209;4.copy,1.1,3.170,3.266,4.1030,2.57,2.14,1.1,3.150,3.266;4.copy,1.1,3.160,3.285,2.10,2.38,2.14,1.1,3.140,3.285;4.copy,1.1,2.20,3.304,3.140,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.630,3.323,3.570,2.19,2.14,1.1,3.620,3.323;4.copy,1.1,3.760,3.342,3.440,2.19,2.14,1.1,3.750,3.342;4.rect,1.1,3.693,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.364,2.18,2.89;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.383,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.476,2.15,2.33;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.573,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.592,2.27,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.668,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.101,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.602,3.223;4.blob,1.1,1068.iVBORw0KGgoAAAANSUhEUgAAAE0AAAAoCAMAAACM7odrAAABp1BMVEUAAAACBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lbAjbNVAAABM0lEQVRIiWNgIA4wMoEBMzKLfMDCCgZsyCzyATsHGHAis0bBUAdc3DxUNY2XiqbxcfNTwxgBQTAlJIwuISIqhswVlyBolKSUtIwsDjk5eQVFJShbWUVVTZ2AWRqaWto6ujil9fQNDI2MgQwTUzNzC0tCLrOytrHFr8LOntWBgcHRydmFkFkMDK5u7h6eeOS9vFl8fP0YGPwDAoOCCRsXEhomEx6BQzIyKjomNg7MjE9IVEtSIWweQ3JKKg6ZtPSMTAQvKzuHCNMYGHJxiOflo/ILiDINFVCjJEcAapTkCDBakg8JkFRIhCKBolDiTCtMIkZVcUkpMcoSysjJE7hAeQUVDausqqaiaTW1dVQ0rb6BioY1NjVT0bSWVmUqmtbWTkXDOjrFqWhaVzcVDWPoyaaiYQBKnytojYVmKgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.371,3.440;4.blob,1.1,1128.iVBORw0KGgoAAAANSUhEUgAAAn4AAAAOCAMAAACGs+G6AAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABnklEQVRoge2XV1MCMRRGowEURVSwKwqKdcUKVhDFLnbsHXvv7efLxhmBsDsTZnaTEDkv++33cO95uC8BICcXZlHBYEz6NeXlU1hqLij8DZYiaC3GUvpTiBMLACwpZbiec4yG5H+bncbWsvIK9LVUQmsVltKfQp4YAGB1TS279XxT56hPLhqcLorrG5uguxlLggFgS2sbawleae/ACqnTQ3G9pwt292BJMACEvX2sJThF6rfgldfHQkRcYuc3MDjE2oJPhkdMeDXq8LMw+UNyyQR0nUyatCB2fnAsqNEwwbDbUrtxM32PBCZCMpO6TiZNWiCf39S0RsPEYsY5m1rOzdMXSWAhLLOo62TSpAXy+S0tr2g0TShW19ZTy8jGJn0TcZHPD25ts9bgEZ9XqXXv0PZQJRLhx4A0YaDz293b18EtwzlwHCrVR8cntE1UiJ6enfNiQJpw0PldXF7paZmZXN8o1oHbO8oiapjuH6K8GJClR/Rqdj3FEzo/+PxCVTsjeH1T7t8/6HoIxCd6NYe+4gmwVsryf/hGr+awP55+AHhivnh8XOQsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.457;4.blob,1.1,4792.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.773,3.514;4.blob,1.1,2584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.630;4.blob,1.1,968.iVBORw0KGgoAAAANSUhEUgAAAM0AAAA0CAMAAAAe/0yKAAAA9lBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4eSh5l+WUgTyBc5FwJFwkeHgxWViMCAgGMjDktLRKSkjtlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAiYmD4aGgsBAQECAgJLSx58fDIxMTE+Pj4XFxeAgDRDQxsKCgoNDQ0FBQVFn8CcAAABmklEQVRoge2Z11LDMBBFFRMSCJ2E3kLovffeQm///zPMKA9SxI4Uy2uvGPY83RnZu+dBL3ckhEYuahO0KAPIxe5nnuaiPJ6YF8oAcrH7maftUQFPzAtlALnY/czTYgeelx/KAHKx+9Hb+1HolJRotpfk8oIztUpXJOlOx9ZFj1ze60yt0tcvGUjH1sWgXF50plahvWnYWG9auew/WP1rT0n4NaXpphmnlaHhEd9F6l97SoJ9ink6OjZeaf5ionEvJ11J/9eekmCf4t4x1biX0670N5hp3Mu8KzEMwwRHdVbU5owUFLE6dXVe1BaMFBSxOvXiklheMVJQxOrUq2tifcNIQRG/UzMMwwQH1MJxmjkBUH/GaeYUQA0Zp5kzDMMw/wvg/Vnr8up0c4vo2SkWwPuz1uW1rry9s5uxmgfA+7PW5X3ex/dwxLwA3p+1Lu/TlfcRrILh4JDaAJOjY2oDTE5OqQ0QOTu/oFZA5PLqmloBkZtbagNE7u4f0hxff5TUM5r39Iy1COTlVfKW0bz3D6xFIJ9fku8M5/0Amg4u91mma/IAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.326;4.blob,1.1,8064.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;4.blob,1.1,836.eDjvuu66qzvW1GhXrQpbTE/gFiAuIiuCy+d2fdrFdCHz3BMLFvBw/LpOx3QhbrJgwRM4ztO5PjJ4A0IDd5+xr8/YlyamZd1xtUTdom8xW13+7e/GjaHWVn1pqbdHKDBOUaboru+2GC1MFzLPqSWSFr3ebLUyXYibSCRqvb7F6vrI4A2ILsTaPNCslqBfEd+P45cYkujqPMmkmhptaSnMljCJJ+BF5UbBPAnd/DicxJAQ75kn4XD8QkISYZ7kxxAduC/fv7zQd2F0YDTa0yeJkozjxrYHbeR2P3nydmxsUBrqwC1AXExBzKh+tO9MH9OFzHNJIpFxfLztwQOmC3ETkShpfNz4gOzIMO8RHbgfjj289eAW8otutUR9efCyHbOT2/3evZHGxl64RckgRZni9snbdhvJ/4KAILVEcnlw0Hv+lSUS9eDgZYzsyDDvuZBZ03y/OWVhCoc1e/YCQSJfkUwgIz1PMqGmRrttWywPXeAWIC4wOjAsPQzmSegm8vWVCQTeM0/i6ysSCGQwTzIDF8a7Fl0LG2dPff2dw+Jwca7DB/8hwGzmVgzD0sRpvYbefmM/lb9AQ0MPj8eG198ZIS+R61p0QzeHmC5knksTi3sNhn6jtzwmLxanGQy9Rmojg6uoBPW5v9WFy+dx2/jVwaup4tQWfcvElr3L9zrPen/c/vGFgQuztmIYliJOOXf3HPECpmUyWerqOouL5Q0/BG4Bt4FwMvdIEYvP3b3LdBXuIxan3KU8MriKSlCf+1spRZeF+of6sH0cNupGdcZx46ytAADgOagE9bm/9f8B/1p/iAz8QUcAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492362148;4.copy,1.1,3.160,3.209,4.1040,2.19,2.14,1.1,3.140,3.209;4.copy,1.1,3.170,3.228,4.1030,2.19,2.14,1.1,3.150,3.228;4.copy,1.1,3.180,3.247,4.1020,2.76,2.14,1.1,3.160,3.247;4.copy,1.1,3.170,3.266,2.10,2.57,2.14,1.1,3.150,3.266;4.copy,1.1,3.160,3.285,2.10,2.38,2.14,1.1,3.140,3.285;4.copy,1.1,2.20,3.304,3.140,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.550,3.323,3.650,2.19,2.14,1.1,3.530,3.323;4.copy,1.1,3.750,3.342,3.450,2.19,2.14,1.1,3.730,3.342;4.copy,1.1,3.820,3.361,3.380,2.19,2.14,1.1,3.810,3.361;4.copy,1.1,3.840,3.380,3.360,2.38,2.14,1.1,3.830,3.380;4.copy,1.1,3.830,3.399,2.10,2.19,2.14,1.1,3.820,3.399;4.copy,1.1,3.880,3.418,3.320,2.19,2.14,1.1,3.870,3.418;4.copy,1.1,4.1050,3.437,3.150,2.19,2.14,1.1,4.1040,3.437;4.rect,1.1,3.693,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.345,2.25,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.368,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.668,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.668,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.523,3.335;4.blob,1.1,372.iVBORw0KGgoAAAANSUhEUgAAAC0AAAAXCAMAAACoJTZjAAAAeFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sFDAxj9fUeSkpCpKREqKgcRkZj9vYBAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVkCBgYECQli8vIgUFA/nJxFqqoLgEMnAAAAWElEQVQ4je3StRWAQAAE0RPc3V3775AWmISIif/baIWQUrxPacN8ry3bUWD875Nczyc8CImOYnKnJM3IeF4QXVY14U1LdNcTPYwT4fNC9Ko3oPfjJOPX/QAazAMUAOFQWQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.362;4.blob,1.1,6240.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.421;4.blob,1.1,1560.iVBORw0KGgoAAAANSUhEUgAAAhAAAAAOCAMAAABJndV5AAACPVBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh4wdzBW1FZHHR1/NDQdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYUMhRm/WYLGwseDAyYPj4QBwcMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyg6kDpMvExWIyNxLi4jI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CBAJe6V4mXiYCAQGMOTk4FxcBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0eSx5j9GMECwQtEhKSOzsHAwMSEi07O5IDAwd9M31KHkrQ0FR8fDJEqURCo0JlKSliKCgpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgGDwZk92QcRRwJBASUPDwpEREEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxYoZChc5FwBAgE8GBiJNzcBAAAYGDw3N4kAAAFuLG5ZJFm3t0qVlTxOwk44ijh0Ly9TIiIvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgINIQ1n/mcSLBIUCAgaCwsICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCAyfTJTzlNLHh58MjIeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkVW1lYtcC2ANDRDGxs0NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwhv+AyeAAACD0lEQVRYhWNgYGRiJgBYWFG4bOwchHQMJsDJRSuTuXloZTI2wMtHF2sYmPkFCKlhZUHlCwrRyjW0AFyctDKZh5tWJmMDfLx0sYaBWVhEFL8SMXEJVAFJKWnaOYjaQEZWjkYmyyso0shkbEBJWYUu9jAwq6qp41eioYkmoKWtQzP3UB3o6tHKZH0DWpmMDRga0cceBmZmYxO8KlRNzdCFzC1o5h5qA0sraxqZbGNrRyOTsQF7B0f6WARMEE7izvhUuLgyoAu5uXvQzEFUBp5e3jQy2cfXj0YmYwP+AYH0sQgU2UHB+FQI8GOKhYTSyDlUB2HhtDI5IpJWJmMDUdF0sgiUIGJi8SiIE4nHFExIpJV7qAySklNoZHJqWjqNTMYGMjKz6GQTKEFk5+TiVpCXX4ApWFhUTDMXURWUlJbRyOTyikoamYwNVFXX0MkmcPugtg63AhNjbKL1DbRxDrVBYxOtTG5uoZXJ2EBrG71sAieI9o5OXPJd4t3YhHt6+2jlImqC/gkTaWTyJIXJNDIZG5iiPJVeVoETxLTpM4Bk5zQwUEVmMc+chVXb7Dlz6eVCSsC8+bQyecFCWpmMDSxaTKKGJUvBYBnpLEiXcvkKILFyFRisRmYxr1mL3cZ16ynwH93Aho20MnnTZlqZjA1s2Uqihm3bwWAH6SykMYadu8BgNzJrFAxNsGcvGOwjnQUAXq0TY7M+9SIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.351,3.440;4.blob,1.1,1136.iVBORw0KGgoAAAANSUhEUgAAArAAAAAOCAMAAADgxd+oAAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABo0lEQVRoge2YR1vCQBRFowMoiqhgVxQUK2IFK1iwix17x957+/mSccGXIeIAybwk5mzmzl28OYu3Go7LykY6f2IwCq6mnFwgETHMefk/wVKArIVESn0KdYKAQ0XFgM+rBqNBeLfZYTzEKSktw6elHFkriJT6FPoEAIcqq6rhnlcLNY5aYVHndMGYJKW+AbkbiaQxONTU3AItoXxa24jC0+4FEUmOtwN1dhFJY3AIdfdASygeT6+FrHx+CBGd2ML29Q9AWyidwSETWQ07AhAmKeNx8QRlnUybpCC2sGhkVKJhmsVuS+zGzOw90mA8xDMh62TaJAX8wk5OSTRMq0w7ZxLL2Tn2ImkwH+ZZkHUybZICfmEXl5YlmqZRVlbXEsvI+gZ7Ex1+YdHmFrSGsvH7xFr3NmuPjIlElGNAmwjwwu7s7sngphn2HQdi9eHRMWuTDImenJ4pxYA2keCFPb+4lNNS7Vxdi9bBm1vGIpliuruPKsWALj3gHwbXYzzhhUVPz0y1VcbLq3j/9s7W4x/ygX8YQp/xxEEr6ej8zhf+YQgH4ukbrpjGrK8YbdMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.457;4.blob,1.1,5544.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.803,3.514;4.blob,1.1,2584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.630;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAAQsAAAAgCAMAAAAyl60hAAABRFBMVEUAAAANIA1n/2cLGwsHBwOTkzwsLBIIEwhiYihlZSkOIg4CBQIqKhGUlDwICAMOIw5k92QCAgGKijg7OxgDCAMBAgFTUyJ0dC9CpEIiVCIbGwuYmD4TEwgfTB9HsEcNIQ0VNBUHEQd9fTNKSh4GDwZERByCgjUODgaXlz0hIQ0GDgZubixZWSQECwRf7F9h72EGEAY1NRaOjjkEBAEDBwNX11dY21gCBgIBAwEFBQKRkTswMBNRyFEnYCdeXiZmZikQKBAXOBdi82IsbCxMvUx3dzDU1FZf619Is0gXOhdZ3VksbixDpkMyMhT9/WYYOxhUz1Qtby0+mj4LCwTs7F/v72EQEAaQkDq8vEzX11fb21gEBALp6V5LSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FzCwk7+/md9fTLOzlPW1lZwcC1txKgnAAAB50lEQVRoge2Z508CMRyGK6KoqAiKA/dEUNx74EBwT9x7z///u1qkB1K6D0pyzwfyHr3+7glJc8kLACkU2YpBfjEMcC5kv+SqvaRUiYlDwRQ1BjgXsh9aLStXYFJhcyqYosYA50L2Q6uVVdXyJq4a+RmqDHAuZD+06vbUKpXSGmcdxJttvb4hlzZ8eKG6k5pYabRBmrKt+5pbZJVNoxWqt1ETK+0dkM6sN3R1SxqbRw9Ud1ETK7QzAnr7JI0LB9oZAf7+gODoYFBwY9pecpIhY0raGcE+Y2BQ7FGhoeERsZ2pe8lJBvIU/Oro2LjQsyYmp0Lp30wnzuMMLaXuJScZyFPwq7Nz8/IPhiwkzuMiLWlMeEnRoOXEeXTQkoWFhYWFBVhZBZG1f0kr+Nu+JFxtXzT28wusg8gGvDKSVvC3fQieti8WBWBzC2zvwCsjaQV/24egtX1+P4q7ez4A9g/A4RG8NJJW8Ld9CErbFz8+OU3ms3NOrYKD3PbZLy7jf/HqOpwDnbzC3Pbd3MbpNxU4rG3f3b2pGlrA2PY9PD6ZLKIBjG3f84vbbBMZcN2dQGeIafuMNylKrx7uwTkE192JdIaZbZ/xJkUp8Kbi72jTwHV3Ip1hZttnvElRev/gFyxEWNq+z6/fz2+OY0mx+UywCQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.668;4.blob,1.1,4248.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1004.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAB30lEQVR4nO3ZyVbCUBAEUFSU0SnihIIDDjiiKM44/v8/SV7ElXnHRXO6uk/dRZJlL1NVhYJ5U9oHSJqe0b5AUHF2TvsEOaVyRfsEQdVaXfsEQfML2hdIWlzSvkDQclLVPkHQStLQPkHQarKmfYKg9WRD+wRBm80t7RMkbbe0L5DULmtfIGmnuat9gqS9/Y72CYLqB4faJ0g6Ota+YKI8ZNHuOBm4yKInp2fh7SSLnl+kTy9Z9LKW/rK5yaK9q4KjLHqddB1l0X5y4ymL3rY9ZdFBy1MWvet5yqL3D46yaOnxyVEWfU5eHGXRyrDjKIu+vqVPJ1n0/aOfvnxk0c9hMftwkUUbX9oXTFLXaDL4uwcYZ1Fj8nqALIsak9sDZFnUlkgPELKoLZEeIGRRWyI9QJpFjYn1AKMsaku0BxhYSwfRHmCURW2J9gCjLGpLrAcIWdSUWA8QsqgtkR4gZFFbIj1AlkVNye8BfrKoLXk9wG8WNSWvBzCaRV30APm4SaPhJg2MmzQwbtLAuEnj4iYNi5s0Lm7SsLhJwzLaA/wTN2kA3KRRcZPGxU0aFjdpXNykcXGTBsZNGhg3aWAueoB83KTRcJMGxk0aGDdpYNykcXGThsVNGhc3aVjcpGGFHuAbwYQ6lGQMnMAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492362254;4.copy,1.1,3.160,3.209,4.1040,2.19,2.14,1.1,3.150,3.209;4.copy,1.1,3.170,3.228,4.1030,2.19,2.14,1.1,3.160,3.228;4.copy,1.1,3.180,3.247,4.1020,2.38,2.14,1.1,3.170,3.247;4.copy,1.1,3.170,3.266,2.10,2.19,2.14,1.1,3.160,3.266;4.copy,1.1,3.540,3.304,3.660,2.19,2.14,1.1,3.530,3.304;4.copy,1.1,3.570,3.323,3.630,2.19,2.14,1.1,3.560,3.323;4.copy,1.1,3.590,3.342,3.610,2.19,2.14,1.1,3.580,3.342;4.rect,1.1,3.131,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.291,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.386,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.392,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.459,2.54,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.478,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.480,2.36,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.499,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.668,2.13,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.111,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.523,3.286;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAAGAAAABICAMAAAA+uQBRAAAC1lBMVEUAAAAOBg4HAwcyFDJ8MnwJBAlhJ2FpK2kNBQ2TPJMsEixeJl5xLnFtLG0rEiuZPpksEhJtLCwCAQI3Fjd+M354MXgIAwg0FTQDAQEFAgIBAAACAQE3FhZ+MzOZPj54MTEFAgVBGkGGNoaVPJViKGIiDiKLOItMH0xiKCgyFBRBGhqGNjaVPDwiDg5kKWSXPZdNH00LBQuBNIFZJFkUCAgfDQ0KBARkKSmXPT1NHx8LBQUwEzCDNYORO5EcCxx/M38wExODNTWROztZJCQcCwsBAAF6MXp3MHeFNoVSIVJ6MTF3MDAoEChwLXCSO5IGDg6VPZUoEBBwLS2SOzsbCxsECwtf7Oxh7+8GEBAaCxodDB0bCwsDBwdX19dY29tDG0OKOIp6MnpLHkuJOIkZChkpESktEi08k5MSLCwdR0c0f38HAwOTPDwoYmIpZWVlKSkRKio8lJQDCAgMHh4+mJgHEBAqERGUPDwIAwMBAgI4iooYOzsjVlYucXGKODg7GBgiU1MvdHQ5jIwXODhTIiJ0Ly8LGxsIExMSLS07kpKYPj4TCAgzfX0eSkp9MzNKHh4cREQ1goIECQkRKSlEHByCNTU9l5cNISEYPDw3iYkAAQEOBgYhDQ0sbm4kWVluLCwWNTU5jo4BBAQIFBQLGho1FhaOOTkEAQECBQU7kZETMDAeS0syfHwmXl4pZmYxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaoFDAxj9fVCpKREqKgcRkZj9vYBAwNd5uYoY2M4i4tOwcFn/v5U0NAucnJY2dlm/PwWNzdKt7c8lZUCBgZi8vIgUFA/nJxFqqoNaMMYAAAChElEQVRYhWNgIBUwMpGshTTAzMJKYxvY2GlsAQcnF41t4OahqnFcvOgifPyMROoVECSkQkhYhF8UXVCMXxyXeglJMJACsaVlZOXk8RuvoKikrKKKKa6mjkuHhhwYaDIwSGpp62jo4jefQU/fwBCbuJExLh0mpmBgxsBgbmFpRcB4BgZrG1tjOyzi9ty4dCCCyMHRydmFoA2uzG787sIYwh6euDQggohBStNLzluGoBUMPr5+EIa/P0xIKEARl2pEEIFAYFAwYQsYGELAZGhYeARUIJI/ihh9IBBNrEIGhpjYuFAoMz7BlXh95IDEJNqab50sRlPzUxJSaWo+g08abc0fBThATHoGISWZWSjc7BwBkmzIzSOkIisTla+RT5IFBYVF+BUUl5SiCpSVV5BiQWVVNX4FNbVoAtJ19aRYwNDQiN8BTc3oQi2tJFnQVtKOT7qjMwZdKLqrmyQbenrxyeblYor19ZNkwYSJeCQnFU7GFJwylSQL/KdNxy05Y+YsTMHZFnPAGv0xpbCCufNwyzU2YBOd78yAUhUSAAsWLsIltbhkCTbhpcuWo1SFBMCKlauA5KIVYFCJzGJYvQarDkknB+KMhoK164DE+g1gsBGZxbBpM3YdW7aSZAEYbNsOBjuQWaNgFJAGdu7aTWMb9uylsQX79h+grQUHDx2mrQUMR47S2IJjx0/Q2IaTp2hswekzNLbg7LnzNLbhwkUaW3Dp8hXaWnD12nXaWsBw4yaNLRgFo4AicOs23n4CFcCduzS24N59Ytv7ZIIHDx/R1gKGx09obEHH0+00tuEZ9u4G9cDzFzS2YNvLVzS24fUbGlswL+wtbS2Y9O49bS1g+PCRaKUAiEynD2GCraEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.362;4.blob,1.1,5416.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.421;4.blob,1.1,1564.iVBORw0KGgoAAAANSUhEUgAAAkwAAAAOCAMAAADqtbO/AAACPVBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh4wdzBW1FZHHR1/NDQdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYUMhRm/WYLGwseDAyYPj4QBwcMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyg6kDpMvExWIyNxLi4jI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CBAJe6V4mXiYCAQGMOTk4FxcBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0eSx5j9GMECwQtEhKSOzsHAwMSEi07O5IDAwd9M31KHkrQ0FR8fDJEqURCo0JlKSliKCgpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgGDwZk92QcRRwJBASUPDwpEREEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxYoZChc5FwBAgE8GBiJNzcBAAAYGDw3N4kAAAFuLG5ZJFm3t0qVlTxOwk44ijh0Ly9TIiIvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgINIQ1n/mcSLBIUCAgaCwsICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCAyfTJTzlNLHh58MjIeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkVW1lYtcC2ANDRDGxs0NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwhv+AyeAAACEklEQVRogWNgYGRiJgBYWFG4bOwchHQMRcDJRb5ebh7quYN6gJePzhYyMPMLEFLDyoLKFxSilWsGEnBxkq+Xh5t67qAe4OOls4UMzMIioviViIlLoApISknTzkEDBWRk5cjWK6+gSEWXUAsoKavQ2UYGZlU1dfxKNDTRBLS0dWjmngEDunrk69U3oJ47qAcMjehtIwMzs7EJXhWqpmboQuYWNHPPQAFLK2uy9drY2lHRJdQC9g6O9LYSmJicxJ3xqXBxZUAXcnP3oJmDBgh4enmTrdfH14+KLqEW8A8IpLeVoIQSFIxPhQA/plhIKI2cM2AgLJx8vRGR1HMH9UBUNN2tBCWmmFg8CuJE4jEFExJp5Z4BAknJKWTrTU1Lp6JLqAUyMrPobicoMWXn5OJWkJdfgClYWFRMMxcNCCgpLSNbb3lFJRVdQi1QVV1DdzvB7aHaOtwKTIyxidY30MY5AwUam8jX29xCPXdQD7S20d9OcGJq7+jEJd8l3o1NuKe3j1YuGgjQP2Ei2XonKUymokuoBaYoT6W/peDENG36DCDZOQ0MVJFZzDNnYdU2e85cOjqS5mDefPL1LlhIPXdQDyxaTLbWJUvBYBnpLEi3f/kKILFyFRisRmYxr1mL3cZ168l27CAEGzaSr3fTZuq5g3pgy1aytW7bDgY7SGchjSHt3AUGu5FZo2DkgT17wWAf6SwA/nkdOyrAazAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.321,3.440;4.blob,1.1,1140.iVBORw0KGgoAAAANSUhEUgAAAuwAAAAOCAMAAABD7bluAAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABpUlEQVRoge3YR1fCQBQF4OgAiiIq2DUKihWxghUs2MWOvWPvvf18ybjgMGQxOWcyj4n5Nrl5i5e7eKtIUk4uMmlgsaa92vLygYqwYS8o/AuOIuQsJpL2LdQJgoRKSgE/LyCrJf3d5YbpwUpZeQV+OiqRs4pI2rfQJwASqq6phfu8eOrk+vRBg8cL04SxxibkayaSwUiopbUNuoRI2juIgb8zAFKEtUAX6u4hksFICPX2QZcQiL/fQY6CIYgiJu2Sxz4wOATdQhzDIzZyNCqHIZpw4PcqIrpupk0sJI8djY0zWvYPuF2Zswk7/x5cTEYVU7pupk0sKMc+PcNomfHNeuYyh/ML/ItwsRhTLOm6mTaxoBz78soqo22Gt7a+kTmMb27xb2LSTjl2tL0DXUMUoaDa1LfLuweAeDx7GtAmAj72vf0DHboZ0KF8pDY+Pjnl3YS7xNn5RbY0oE0kfOyXV9d6tjSOm1vVceTunnMR/mwPj4lsaUCXnvCfHO9zKuFjRy+vXGsL6+1dff7xybeHicIX/pMT/U4lCbqSyaSPH/wnJxZOpV8NvdCE+0YwCAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.457;4.blob,1.1,5600.iVBORw0KGgoAAAANSUhEUgAAAnIAAAA3CAIAAAAHRjA0AAAABmJLR0QA/wD/AP+gvaeTAAAQHElEQVR4nO3df0yTeZ4H8OdXH0p/UUppkf6gFC1Fi8IiQ9kjwDowcOxmHT3UGBBGWZbLJJpMZidO9nLxkkvczGTiXMbZiU4m3q5h5sYbd9b1smQ3RsfTm2N0BSEy6w+kICllgVagpdDfz/2B8bBA6VP79OmPzyv9Q56fb/AL36fffn/gCIgPJClCEISi/GwHAQAAEDmM7QDgGZFo844d7xBEOttBAAAARI5etVpyvGT/0H6GoqQCjUZDUZRCoVi9y2rtdzonCgvfiHkoEH2qhoadJ06wnSKuqZvUne5ObbOW7SAgwSRbydk/tL/keAnbKRLYcrWalZW15l4OR1hVdVoiMcQ4FYi6nSdOqBoa2E4R7zS7Na3m1nQ5tNAAepKn5Eh/IP25/+d8BZ/tIAlMq9VSFMXhcNY7QKdr2779rVhGAlEnUKurz5xJE4vZDgIAYAGNRmBdm87yjcU54WQuTTKRGAyGo0eDNqIo6nK5vF7vemdZrX1isX65+xITDBLDUUNwKhBdcqNx7uFD99wc20EAACwgwjwOI7DNBzd/9853jKZJAiiGZZeXqxoa+AqFY3Q0aO/IyEh6eqiGi/n5EQRBMjJ0MzN3wrwjjuIYGvx45Av4KIR6/iWGYuXZ5Q2qBgVfMeoITgWiCMUw2SuvmC5eZDsIAIAd4VarygYlh88x/c7EaJqEhnE4OVVVyvp6MiPD2tc33N1tN9H+cfn9Lo/HzuPlhH9Ke2F7hawiaOPZv57tt/YjCMLBOFU5VfXK+gwyo8/a1z3cbbLDfyKDMrdtw0jSevcu20EASC0ohmLkC28wKD8V8AZinyTcalXXphv9/ajP6WM0TUIrbG+XlpWN9/RYrl3zOiNvKvf5FjkcYfjHXx67fHXiatDGmaWZ5X+0F7aXSct6xnuuWa45vdCAzzi50WgbGPC73WwHASC1qJvUjf/VuHLL2B/G/vz6n2OfJKxqlcwgNT/V/Omnf2I6TUKbvnNHkJenrKvjCASTN286zebIrkNRAQxbt0/TarPu2XnPfNBGX+DZA9Cd6Tt5grw6ZZ2AI7g5edPsjDAVCAeRnp61Y8f3v/4120EASDmTNye/Lv965Rb3LDtPt2FVq9p9WpfNNXF1guk0Cc02MGAbHJSWlqoaG3Nra+0mk+X69elbt+heB8dJr3ch/ONDNwIP2AYGbYOl0tJGVWNtbq3JbrpuuX5rmnYqEA5pWZnX6Zx98IDtIACkHM+8Z+bODNspECTMalXXpnv8xWMqQG18aIqjKGt/v7W/X6zXqxobt7S00K1WURRLSxO73bPhnxK6ERhBEAqh+q39/dZ+vVjfqGps2dIC1SpD5EbjzO3bCLXubwopEiEI4rHbI9ibakgRiSCIx+6J+pW5XBxBEJcreSYKTb7viDnMlSsahPnCrkCXxCBZ74DKyg+6uigc58YyVULgrzWb0gan8HOrq88KBCom8ixT8GmnAs9VfvBBF0Xh3DVKO1cqrT5zhp+bu965BJ/fbrUenp0l1xrSGnpvqiH4RLu1/fDsYVJMRvfKaWn4qVOVH374Qx4v3J4lcS75viPmMFeuXrjLhkdsad1iHbA+HXq63gEoSiAIRVHQmymYc4J2s7lYXOTxzC8svPAJKEqgKIoGHUn5qcjaDyac0JgfOZQgEIqifGuUdllFxYLZ7LRY1juX8vlcMzMoQQTWGrgcem+qoXyUa8aFEmjUe3L6/ZTD4cUw1O9Pkua35PuOmMNcuVpp42p188HN9z+9H+IAPl85N/coEIBqNQrk8gqL5b8R5IVfj5JflAjzg/sGP/ztw6n/nYphNIAgCMJXKucePQqsWa2Wl0/evBniXL/bfaGoKLK9qcbv9l8ousDElX2+wIkT4Q4KTwjJ9x0xh7lyFU0kmXHkiMNgOMZ2kGSQlVViNL63ujmdl8MT5gmDXhw+jd7CICrIjIwjDofhGJR2AABjMIzQapsRJLiJEtDF420yGt/PzIT3K/ELIwhtczOyqkEeAABA3BGL9RJJMdspAAAAAAAAACA+4C95/vJIO8oP46VA8uPl8CiKnVlGAQCJgsbCcGsSbd684513iJCrsgCQHHKqcl7/n9fJDAZHvAEAEl1Y1apGo6EoSrHW5AbW/n7nxEThG29EOVfSwdPwqtNVIWbVCJ+qQbXzxM6Xvw5YU4jSbrpost2z/eg3P4p9KnVTU6fbrW1ujv2tAUgR6iZ1p7tT26yNxc2W/9BkZWWtuZcjFFadPi0xGGIRJZHpj+iLOqPQ0XfniZ2qBganYUpxoUs7N5vb4exQ/T0LP3/N7t2tZnO6XB77WwOQIjS7Na3m1nQ58+2vWq2WoigOZ92Bkrq2tu1vvcV4jgSXuTWz6uMqnPtSn2cL1ILqM9Vp4rRopQJBNiztNZ/V/OTqT2IZCaxGisjlyV0BiDfBjcAGieToqvedKIq6XC7v+nOqWfv6xHr9cvelyBgMkqNHk/z97tyDOd+iL7ss+2UuIjfK5x7OuedgOc8oUDc1NfX0BG3csLSbLpoUuxSxeJ6NNnWTuqmnie0UUUDwiYOmgy1PWhid2RWAyDybvBBD0fLs7AaVSsHnjzocQQeNjIykh+yUND8ygiBIhk43c+f/59DCcRTDggfO+3yBlct7YBhaXp7d0KBSKPijo8H3TTJUgJq+NS2vlP/t279FdgUUQ2WvyEwXTdENlmowgig4cKDk+HFJcfHqJYY2LO3Lc0bm1uSO/OcIgynDg3EwFA/+LQt4Aivni8YIrOBAQcnxEkmxZPrWdGwDMiI2M7sCEBmCg2FVOTn1SmUGSfZZrd3Dwyb661L5XS6P3c7LyVm5sb29sKJCFnTk2bN/7e+3IgjC4WBVVTn19cqMDLKvz9rdPWwyJf96WFPfTSnrldwsrsvmiuD0zG2ZGIlZ71qjHixFEOnp+o6O7W+/zdu0yfTVVze6uqZ6e+lexGP3LE0tiYviYp2Z2n+v3dKyJWjjlX1Xlp+9iHRC36Hf/vZ23iae6SvTja4bU73JMI90YszsClIV0V5YWCaV9oyPX7NYnC+xdIZvcZEjfGE6+MuXx66uWvl8ZmZp+R/t7YVlZdKenvFr1yxOZ6os2eGccDonnLIK2XjPeASny41y24DN74ZRwhGqOXdO29x89+TJoY8+ctlsEV/HPetOl8VFI/Bf/vkv9/7tXtBG+8izJ9SaczXaZu3dk3eHPhqK7EkOAEAXHqAojVBYlJnJJ4g5t9seac26qabGa7fbBgefb3G7/QsLXofjhZfH86xKCAQojUZYVJTJ5xNzc267PVVqVpzEc/4ux/LNusuHrYdIJ3SHdKNfj7qs8PcxQpTfLysvV9TVcbOynGbz0lSEb922/uPWpamlJ5efRDdeBHxOn8vqWppeWvnyLfqW10Ci/JSsXKaoU3CzuE6zc2lqie28ACQ/YsBmG7TZSqXSRpWqNjfXZLdft1huTdP+AAYnSe/CwsotoRuBBwZsg4O20lJpY6OqtjbXZLJfv265lRQf/IQ2fXs6/x/yhflCB83PkqVlUq/TO/tglqFgqWDs0qUnly/n791bcvz4tjffnOrt/f6TT4a7u+leh8PnuGbi4uEmdCPw2KWxJ5ef5O/NLzlesu3NbVO9U99/8v1w9zAbSQFIFS90dtCLxY0qlVYkOvbtt/SugmFVp0+PXLxo+eab5xulUi5/1eJlMzNLi4vBa1Xq9eLGRpVWKzp2jN59E5ThmME143r8H49pnbXjFzscow7T76C/UnQoXn219N13ZUbjOWHwWrahoTj6s8Wf9b7dO/TxEEPZwifMF3KzglcStI/Y3bPBfcUVrypK3y2VGWXnhOdilY5By6NrPHYP20Fo4HJxBEFcrkT6ECcRMzMn8lKn4PPpnsLPza0+e1ageqkx8goF7fsmKFm5rPJUJUrQWF+MK+VWn6nm56bKjyhmJMW0Vw2SGCRdVJe0VMpEHqZJiqMwzxfrCD7Rbm0/PHs4gQbYpKXhp05VfvjhD3k8gu0s4UrEzMwJv9StMXnhhNNJ937ioiLP/PyC2Uz3xBfuO0H7vgnKOmDFcGzlRIYogWIcLOiFrhieJKuQLZgXnJZU+RHFzNN7wf19NqR4VbE4uWgbjLzHE4ue3nvKdoQoWB5gs2RdSqABNn4/5XB4Fxa8fj+18dHxIREzMyf8UhedBZl/8MtfWgcHx//4x6hcLRXo2nQ4F7//6f3lL0vfLRXmBzdFPvztw+UhkgiC7PyXnZM3JydW9awGsbf3zt6xP4z1/2s/20EAAEkqq6TE+N57ODf4Ax4QPl4OT5gnDHpxVn0yDVineV3TOtEK0+YBAJjC27TJ+P77mUVRmEEegDiXWZR5yHJIWa9kOwgAIHmJ9foIOn0AkIgUuxTqH6vZTgEAAAAAAAAAAAAAAAAAAADiUhqedrrqtEESaiVUtbqps9Ot1TbHLFXyEQg4TmdHUxN8bsc+dVNTp9utbV67PK+3l8MRdHQ41epQq5lGduVw9gIAEskR/ZHOos7Qx2g0u1tbzenp8thESkrd3bu+/LKO7RQAQRBEs3t3q9mcLl+7PK+3d9eu7rq6L5m4cjh7AQAJY2vm1o+rPubiMCyVWa+9plxc7BDBgMiEpVS+1tGxSJIitoOkBFJEwuhhEFeel8k1Ji8M8mDuwaJvsSy7jPlUKe3q1Ym5Oc++fVq2g4AITUxc9XjmtNp9bAdJfgSfOGg62PKkJYHmBAbJbWWZ3LhaDVCBW9O3KuWVMUiWyvx+6vPPh9vadGwHARGiKP/w8Oc6XRvbQZJfIs4JDJIb7TKp4CvOVJ/J4mYxHCzVFRdLAoGuvDx665SB+CGRFHd1BYTCPLaDAABYg4dzkMPrKJWWYig2PA8LIDNoenppz558Dge7cWOS7SwgEktL0/n5ezCMMzl5g+0sAAB2bNwIvKx3qtcoNzIaBSAIcv78o0OHoB04gT16dF6nO8R2CgAAa8KtVm9P387mZucL8xlNA7744nFBgaiiQsZ2EBChx4+/EIkKZLIKtoMAANgRViMwgiBuv7tAVCDhSoaeDjEaKMUtLHgrK+VqtaCnZ5ztLCASXu+CXF4pEKjHx3vYzpLMSBGJp+F+tz/G9+VycYLAfL74WtY7PlOlmudlMtx3qwiC9E73lmeXEyjBXCyAIMj5848OHCggw+ikDeLTo0fnCwoOYFhijP2o/KCyi+rCueE+YccDtgbYpKXhJ0++8qtfVfB4cfRnMD5TpRp6A2yeG7AO4BgeeiJD8PIuXRojSRwmMkxcY2OXcJwMPZFh/EAJFKEQKqHe6LA1wMbvpxwO78KC1++Pox9XfKZKLBiJ4Vw86IXiaPhXWFkmaZyGIEibro2Lcz+9/ynNzICezz6rEYnI/fuvsB0ERKim5jOSFF25sp/tIBurv1gvMUgu6C+wHQQA1uz5bo9sVY+W64evP/zNwwiuRq9aBQAkEzKDbDW33v6n20MfQZ8JkLrEejFHwAna6Bh1uGwuVvIAABIVRmDaZi08XQMQRf8HkrUiDby2TK8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.833,3.514;4.blob,1.1,2584.iVBORw0KGgoAAAANSUhEUgAAAU4AAABtCAMAAAD5wnh3AAACglBMVEUAAAAPJA8KGAoECwQvdS9QxVAiVCJUz1QGDwYeSh5l+WUbRBtg7mANIQ0MDAyKiorh4eH19fW5ubksLCxBokFHr0cgTyBc5FwJFwkBAwFY2lgtcC0HBwfAwMC/v79UVFRISEiSkpLr6+seHh4IFQhj9WMdSR0GDgYhUiEFDAV2dnaxsbEXFxfDw8P8/Px3d3eZmZk/nD9MvUxf7F9h72EGEAZFq0VHsEcCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf398dSB1n/2cDBwNX11dY21hf6l8wdjA1NTXExMTt7e0xMTGsrKzg4OAjViMIEwhdXV2cnJwuLi5HR0eWlpbS0tIJCQle6F4zfzMQJxAbQhtxcXGCgoJGRkavr6+AgIABAQHa2to8lTwTLhMZPhlpaWmMjIw4ODjc3NwfHx+4uLiNjY1eXl6rq6tV01U/nT8LHAtEREQGBgb6+vpkZGT29vb09PQrKyta3lo3iDcCBgJl+mUpZSkICAjs7Ow7OzsZGRkUFBQsbCxQxlBnZ2fx8fF7e3tQUFBra2sSLBIUMRQzfjNaWlrOzs739/fn5+d5eXktby1d5l0BAgEDCAMLGgsXOhdSzFIyfTJRyFEnYCc5jTlNv00AAQAgUCBc5VwQKBAVNBVTzVM2hTYRKREcRRwIFAgxejEeSx4NIA0LGwsOIg4CBQIOIw5k92RCpEIHEQcfTB8ICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzUXOBdi82Jf619Is0hZ3VksbixDpkMYOxg+mj48lDwqaSo6kDokWiRb4lsweDBj9mNDp0MjVyNi8mIpZikTLxNW1lZl+2U5jDln/mcCBAJFrEVX2Fcw7Kc2AAAEyklEQVR4nO2d91fUQBDHIyggCvaCIlYEC2LHjkawK9h7b9jFLlgQe5cidrErir2Dig17R/8fZXM+uLvc3mZ3w2bz5vPLJpvMvNk8cpnsN7MoClBKJZd9H18hYdiEylVcOvz8A7g5rxrox82XFFSrHoTa4Bo1a9Wugzbr1nM/jfa61G/QkDo0CQlp1Bi1oU3CmjZr3qJl6Xar8NbuJxJcl4gIHhHx8SKIyPA2qG3brn1Uh+jojminU2caV75dunZjD4iPF1F0j0FNj569evfp2y+2P9oboNLcoQPj4jk8xPh4EcWgwagZMjR0WPDwEcrI0NK9CHWU0KCkJUGNRG3i6DFRythxyvgJaHfiJJFByctkdQpqp06bPkNJnDlrttYdN0dgTBIzV52H2vkLFiYtWrxk6TKte/kKgTFJzEpVy4mSw1YlrV6zdt16rXvDRhpn+BSHNAGSOVFKSd2E2s1btsamKWnbtN6QwHSMjafx4lMc0gRI7kRpu+NXcsfOXcm79zg696r7PFt4HC8+xSFNgOROlPbHOzYOHDx0+IhjOyMzy7PF//GmZCNCzI1PMo6m5rh3HjtOYHlCRZzkHpLUnDp9xrXrbC7J0+DceUSCCTFJjO+Fiy49lzIvC4nEHly56tIx5ZqQOADAFEAO4YqrHIKfuscfzVOvc4mJHvGCjKscgp+6xx7NU4XnCsIFGV05hI4baj4vV/JCJ4focfMWL08SQyeHWId87Y0Z825docguh9zW3pidnkFZ6AqL+emRXA4J0t6Y75Tvu4uucIyQeCSXQ/Ru9gB0hW8KiUdyOUTvZheJJzmEVPDgI2ncu0dpqHezO8FbcsH78ySHkAoefCSN+w8ePmL3ogdvycWLP09yCKngwUfSePzk6X12L3rwllzcJQ0ncQMrhwAeKZM0nMQNIjkEcKNM0igvbpDJIQAZIIdwBeQQAAAAUgoKlXRus8ZAwTMl/Tn56TJ/aKgP3xHlvFCKXhKfLfeHhnpwHtErfyXjNfHZVvzQ0Iuk4fbxljNWHJFQsLOcWW/Cc9/+a4t9TIxApIDCHews57v3VT98/JT3+YuZf4IiBRTuYG/2rycV5dt39YepH7CKFFC4413SODPZZs9PBLVogcerpIGHJVFiTrJ+qtm0puaJFiywJErsSVbxrxJaU/NECxZYEiX2JOv3HzZ7oDwBhUWiQ7ATJX5eXjIAAAAAwAzwdRhlR8VXS+DBj8N49JT1Kfg6jHJHhVdL4PFST2I4esr6FHwdhjxVGrwjpfSHr8OQp0qDd6TyjJwKi1VuyI7VKjckx2qVG5JjtcoNybFa5YYzLAtUkU77Gxc8MBZON7t5ogWdZ5YFqkin/Y0LHqQW5okWlJ5ZFqginfY3LniQWvAQLfQXmYLvRiiBRaa4AotMAQAAAHZH/HJTojBl5BZYbkoQtCPHvpEST+fbrsKDUsjAv5GSTufbr8KDUsiA/7kBAAAAiEYvxTGe9lg9USIVVVjHoZfiGE97rJ4oVYREgtBLcYynPVZPlCpCIgEAAAAAAADIMD6dbxfpwyJChl2kD1PGYXw6X54aDjymjMP4dL5dKhnsMg7ALkCFB1egwoMrUOFhU4RUaXCztZoMI75Kg8XWcjKM+CoNFltz5Yu/Gq6uMb20RrMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.630;4.blob,1.1,1232.iVBORw0KGgoAAAANSUhEUgAAAM0AAAA0CAMAAAAe/0yKAAABX1BMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUwHBwOTkzwsLBJf619Is0hiYihlZSkXOhdZ3VksbixDpkMqKhGUlDwICAMYOxhUz1Qtby0+mj4CAgGKijg7OxhTUyJ0dC8bGwuYmD4TEwh9fTNKSh5ERByCgjUODgaXlz0hIQ1ubixZWSQ1NRaOjjkEBAEFBQKRkTswMBNeXiZmZikeSh5l+WUgTyBc5FwJFwkyMhSQkDoEBALp6V5LSx709GOpqUSjo0IPDwb392RFRRxkZCjk5FzCwk45jDn+/mcBAQECAgI6kDpn/mcCBAJ9fTLOzlMxMTE+Pj4XFxdFrEVX2FfW1lZwcC0KCgoNDQ0FBQV/CWLKAAAB90lEQVRoge2ZV1MCMRRGlxVBsAP2BqhYsQv2ir333rH38v/HMTizuyEmmA17V2fP0zdzU85DXr6JJKmwyRkSLIoByYXuh09tsl2cGBeKAcmF7odPM2WHODEuFAOSC90PnzqzxHnxoRiQXOh+8PZ8OFwIN8ztbnS5g5lSJVtG5KTHlkUuujyPmVIlvwBRmB5bFh50uZOZUgX2pYmG+tK8Xv6Dlb30pIekUzQvDZv6iopLeC9S9tKTHuin4NPSsnKfdkVF4l1WspJ6Lz3pgX4K+46qxLusZqW/QU3iXdpZycLCwsJ0+ANSsBZLpoLWqevqQ9qBv0EKNmLJVFA7dVOzdtDSKoXbsGQqqJ26vaNTM+jqlnp6sWQqqJ06Eu0zVCbN9A9AG4hkcGgYWkEkI6PQBiIZG4c2EMnEZAxaIQVILZzYzKem0+6iG1J/Jnfqmdk5I4R0QWrI5NY8v7BohJBRLC1DG1hYWFj8Mwj/z6our0xXVoG+nX4F4f9Z1eVV/XltfcNgNQ4I/8+qLs/zP74pRowLwv+zqsvz/DBvCbAyDds70AYi2d2DNhDJ/gG0gUAOj46hFQRychqBVhDIWRTagJdz2YWn2EXox+XfxC8RcaPXsbi6vsHT7R1z1/0D4tHodSyenpPSyytz19s74sPodQw8gXBS+uITq2pQSzFHUkEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492362355;4.copy,1.1,3.180,3.228,4.1020,2.19,2.14,1.1,3.160,3.228;4.copy,1.1,3.190,3.247,4.1010,2.19,2.14,1.1,3.170,3.247;4.copy,1.1,3.530,3.304,3.670,2.19,2.14,1.1,3.510,3.304;4.copy,1.1,3.580,3.323,3.620,2.19,2.14,1.1,3.570,3.323;4.rect,1.1,3.611,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.269,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.286,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.383,2.18,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.459,2.24,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.481,1.7,2.47;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.516,2.14,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.573,2.14,2.42;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.639,1.5,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.630,2.17,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.668,2.13,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,2.45,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.591,3.221;4.blob,1.1,236.iVBORw0KGgoAAAANSUhEUgAAACYAAAAFCAMAAAAe224EAAAANlBMVEUAAAAGDg4ECwtf7Oxh7+8GEBACBgIDCAMBAwEDBwdX19dY29tRyFFn/2cnYCcQKBAVNBUIEwjrAuWZAAAANUlEQVQImWNgIAQYGQkqAQImZhZWIMXGDgYcyCxkwMnFzQSkeHjBgA+ZhQXwC4CBIDILEwAAlwQCcf5j2sEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.523,3.269;4.blob,1.1,2908.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.345;4.blob,1.1,1044.iVBORw0KGgoAAAANSUhEUgAAAGkAAAANCAMAAACdObBEAAABpFBMVEUAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQMBQX1Y2NKHh5CpEJEqESkQkKoREQUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxtGHBz2Y2MOBgY6kDpMvEwBAwFd5l0oYyg6kJBMvLwDAQHmXV1jKCgCBAJe6V4mXiY4izhOwU4CBARe6ekmXl6LODjBTk4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwstEhL+Z2cfDQ1EqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6PQVFR8MjIGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUVyLi7ZWFgoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIYCgr8ZmY3FhZOwk44ijhKt0o8lTxOwsI4ioq3SkqVPDwGDg4NIQ0SLBIkWSRf7F8CBgINISFn/v4SLCxZJCTsX18GAgJf7Oxh7+8GEBAyfTJTzlMECQRi8mIgUCAyfX1Tzs4JBATyYmJQICADBwdX19dY29tW1lYtcC0/nD9FqkVW1tYtcHCcPz+qRUWmZUmNAAABJklEQVQ4jYWO1VYDQRBEOwESPLhLcLcAARYJ7u7uEtzd3X6a3fA0u1O99dI9t849PURqLFaSx88/QF7Y7MAIDAoGjS9WC2pCQuXcbkNGWDhzyBERiaqo6BgZjo2LR0ZCYhK+lJwCq9S0dBl2ZkAjMysbdjm5efgX+QUSWFhUjI2SUliVlVdow1WppUrYiKrdNUajtk7Bl+obGlHV5PGN5hYtrcKmpq3daHR04kNEXd2g6Ont+5/9WgaETc3gkMEYHhnlLo2Ng2Ji0sV5U9MzejQ7N88ZC4tL8mJ5hdOIVtf0ZH2DNza3DMjrJdp27/De7t6+CA4Oj3jj+ORUR5Sz8wu6vOI1ur65FcHdvYnx8PikI88vrwq9vZt49PEpvr++zYyfXwn8AwamL94QF6t1AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.362;4.blob,1.1,5856.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.421;4.blob,1.1,1568.iVBORw0KGgoAAAANSUhEUgAAAn4AAAAOCAMAAACGs+G6AAACPVBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh4wdzBW1FZHHR1/NDQdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYUMhRm/WYLGwseDAyYPj4QBwcMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyg6kDpMvExWIyNxLi4jI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CBAJe6V4mXiYCAQGMOTk4FxcBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0eSx5j9GMECwQtEhKSOzsHAwMSEi07O5IDAwd9M31KHkrQ0FR8fDJEqURCo0JlKSliKCgpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgGDwZk92QcRRwJBASUPDwpEREEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxYoZChc5FwBAgE8GBiJNzcBAAAYGDw3N4kAAAFuLG5ZJFm3t0qVlTxOwk44ijh0Ly9TIiIvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgINIQ1n/mcSLBIUCAgaCwsICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCAyfTJTzlNLHh58MjIeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkVW1lYtcC2ANDRDGxs0NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwhv+AyeAAACFElEQVRogWNgYGRiJgBYWFG4bOwchHQMZ8DJhU+Wm4de7qAe4OUbMKsZmPkFCKlhZUHlCwrRyjVDAXBx4pPl4aaXO6gH+HgHzGoGZmERUfxKxMQlUAUkpaRp56DBDmRk5fDIyiso0s0l1AJKyioDZjcDs6qaOn4lGppoAlraOjRzz6AHunr4ZPUN6OUO6gFDo4Gzm4GZ2dgErwpVUzN0IXMLmrlnsANLK2s8sja2dnRzCbWAvYPjwFkOTH5O4s74VLi4MqALubl70MxBgxx4ennjkfXx9aObS6gF/AMCB85yUNIKCsanQoAfUywklEbOGfQgLByfbEQkvdxBPRAVPYCWg5JfTCweBXEi8ZiCCYm0cs8gB0nJKXhkU9PS6eYSaoGMzKwBtB2U/LJzcnEryMsvwBQsLCqmmYsGNSgpLcMjW15RSTeXUAtUVdcMoO3gdl1tHW4FJsbYROsbaOOcwQ4am/DJNrfQyx3UA61tA2k7OPm1d3Tiku8S78Ym3NPbRysXDWbQP2EiHtlJCpPp5hJqgSnKUwfSenDymzZ9BpDsnAYGqsgs5pmzsGqbPWcuHR05aMC8+fhkFyyklzuoBxYtpoIhS5aCwTLSWZBBleUrgMTKVWCwGpnFvGYtdhvXraeCs4cc2LARn+ymzfRyB/XAlq1UMGTbdjDYQToLaUxv5y4w2I3MGgWjgDDYsxcM9pHOAgBBJCVvyHGnLwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.440;4.blob,1.1,1140.iVBORw0KGgoAAAANSUhEUgAAAx4AAAAOCAMAAACW2joKAAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABp0lEQVRoge3YR1fCQBQF4NEBFEVUsCsKihWxghUs2MWOvWPvvf18ybjgMGQxeJJ5k5Bvk5u3eLmbtwlCObnY8C8mc8qrJS8fqAhf1oLCv2ArwvZiKmW+hTlBQLikFPDzmmY2pb47nDA9eCsrryBPWyW2V1Ep8y3sCQDC1TW1cJ/XsjpXfeqgwe2BaQKksQl7m6mkMwi3tLZBl9Cm9g5q4Ov0gxSB4u/C3T1U0hmEcW8fdAlN8vXb6FEgCFHEoJ7EeQwMDkG30KLhEQs9GnWFIJoIxOeRhFXdzJqUkDgPPDau0LKs4nSkzyas/HsIZTIimVJ1M2tSgnQe0zMKLcsms+659OH8Av8iQlmMSpZU3cyalCCdx/LKqkLbssja+kb6MLa5xb+JQT3SeeDtHega2hMMyE29u7x7CCwWE6cBa6KQ89jbP1Chm64duo7kxscnp7ybCCt+dn4hSgPWRCPncXl1rWZLPbq5lR2H7+45FxGX5eExLkoDtvRE/np5npOJnAd+eeVaWwfe3uXnH598exgU9EX+ekW+kwlBVzIYRPFD/npFQ8n0C5+i2LhFfr2dAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.457;4.blob,1.1,5632.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.863,3.514;4.blob,1.1,2584.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.630;4.blob,1.1,5800.iVBORw0KGgoAAAANSUhEUgAAAQsAAACCCAIAAADe/3qhAAAABmJLR0QA/wD/AP+gvaeTAAAQs0lEQVR4nO2dW2wU1xnHz8yOZ29e73rt2ASMwY4NNjUBxwUvwU2VIOIE0qi0XOIAppBEfqmiqlFEpURqH/pQIUutoFKrKlIrN0WKhRSSVEmQg0hSFAhNghuDnTVmsRPbYLyO7V3vzd7d6cOijbM7c3ZuZ2d29/s95DL/mTnf2TPHc+bM95+DkAhsa21dXJd1lVXMzgAh8K2gpI3ItW8eXDm0+F1j4Ri5OACR4FtBSRuRa9+cvnJE9RCKphBCi75FwsEAOPCtoKSNyLVvHlw54u4hFIqFY/GlOOFgACz4VlDSRuTaN/evHErrAAD9QhfRlCH1Cokvxrk4p0k8mgA9RAIUTdHs9+66XIxL/oEkp2rFY68/Vn+wPmVj374+zxmPJvFoAvQQCax5as0T7zyxfMvoW6PnfnqOtKoVthqbqcyUstF30xeZjWgSjyZAD5EAa2ft9fblWyKzEd9NH2lVK2CUhaCHABhglIWW9xC2hEW5NjGHj5mcmovIqJHIUVb+/VY8MFbmiPfI0dmjrIPVOhax4GMmp+Yi5GqUf79VCkziX1yUC0+HKYaSNH9Cs3TildBy4ktxLsYRVcXETE7NRcjVKP9+qxQUPYfsubynorUiZeOHRz90/8NNVAWArKGohzgaHEXFRSkb/bf84ZkwURUAAAAAAAAAAAAAAAAoWCpdlcf8xxBCTb9seur8U5JUICfIgkf3+PHN167tlxWdrrmXcZ30SUaD0fSd8CqQKxD16B4+vO6f/xyWfX7dQif+cS+phkZL/qX0XXAqkAuQ9ug+9FB5Y6Pj9ddvyAtPz9AIIYqilnxL9/5jIbUP4FUgNyDs0e3sXHfhwuTEREBmeACQxzAMPTXV2dm5TutAAECX7N5dvbDwnNXKaB0IESR8LwsAeOnsXPfmm7cCAZjFAYA07HY2FHp+584qrQMBAF3y/PMN4+OH6DQzT94Ao6z8gS1hE4bYbB7b2bnu9OmReCF92wHISZS4YWUfW1Nji8e7mpqcUkvMIfJz/qEAUeKGlX3soUP1/f3ea9e+lVoiABQEg4P7f/WrjVpHAQAAAAAAAAAAAAAAAAAAQJL29tW//e0PUzbKXs82oxcaf+bqXdUvRF6o3VuLjxnvpM1Xn60QifpC1gkpXK7Ky5eneCV569mK8UILHfv1u1/37e97+E8PmyvNmKLxTtp89dkKkagvvFMnQnV18f33Wz799G7Kdvnr2WbyQmf0yo6+NTr61igmZryTFqPm4uoIJSUsQsgnHHOyvnAPIYLLVel2z83Npa1mJnc928xeaMWrzuKdtEIqY2U6PB0Hxw7m0OoIVivj8XSMjR10CMcMvmKC0DTV3b3N5arUOhAJ4J20GNVgNBwYOvDMjWeY3PEYGo2GoaEDN248I+SLBF8xWTZudJ48ud1oNGgdiATwTtr89tmms7y+MMpSH5ersr9/JhKR/3Gq7IN30haaz7bQ6ptVzGbmz39ua2ws1ToQCeCdtIXms02pL9xDVKalpTwQWPrqq1mtA5HAvn21MzPh8+cnZKj5R0p9oYeojMtVeeXKNJdTplS8k7bQfLaFVt+sUl5u+utfH1m5Us4HpLUC76QV47Pd1r2ti+symHhmJjASUbq7t3Fcl0m4XKEd0uvLUBRFUakfquA4jiP8ZzAvy21trRgfX5iczKVJdLyTVozPlmIoxCEuyvMDYiSiMAzFcSgqXK7QDun1ZTZv3myz2VL2c7vdU1P8GRNqkZflbtlS8Z//3FZ+nmzS0VH3t78NyVMTWKusc8Nz8SjPy0qMRJSqKuvw8FxUuFyhHXjqa7FYbGkUFaWuQ6s6hVZuvsLa2WP+Y00vNkmSiGK3s37/sReFy824AwCoBs3QtXtreVcdx0hEYRh6797atKG0hB0AABCLqH6UfLqNxyUPKJPHyngazsVyAf0jqX1FZdq0tLRYLBaE0MDAwOystHdhjY2N5eXlCKGRkZHJyUlJx+ZiuYD+kdS+onrI4OCg0WjcuFHmt8Pm5+c9Hk84HJZ6YI6WC+gcSe0r6p16MBgMBOTP8cdiMb/fv7QkeYU3nZfL67MFVEeJN5hXlXRdQdaJfDA+W0BFlHiDlTuHoYfIRMhnqxD8KgWFpiIF3uCMqkigh8hE0GcrTGtr60cffRQKhaampk6dOlVcXJyyA97RWmhqAnneYDGqSArFNaYuNE1t3Vpx5oxH/CHr16+/cOHCxx9/vGfPnpUrV3Z3d9fW1u7evXv5PvhVCgpNRQgxDN3RUffyy5dVV9WHZdlHHnmktFSyMWjDhg1NTfJf7+uzXBk+297e3uHhYYa59yepvb2d47hHH31UdoSFgBJvMF4Vf13BKEsOMny2u3bt6u3tjUbvGTvPnTvn9XpT7iFACkq8wWo5aaGHSMZsZjZtKrt0ScIsltlstlqtd+7cWb5xcnIy8U4T4MVuZ59+em1PD/9MlBJVEtBDJCPDZxsKhYLB4IoVK5ZvXLly5czMjNrR5Q9KvMEqOoehh0hGns/2/fff379///LnkPLy8vfeey9lN33OuiqcsZWHEm+wik5a6CHSKC831dXZJQ2xErz66qurV69+55132tvbjxw5cvr06XPnzn3wwQfL99HnrKvCGVu8EVdIramxtbXdLzRMUqJKRdFsb146afHI9tkODQ3t2LHjxIkTZ8+eXVhY6O3tPX78eMo++px1VThjizfiCqlKvMGyV+jlva5E9RCKomia524j3tFK07S8LHRdlYuU+Ww/+eSTtrY2zA6xSOyNxjfySUWZjLhCqhJvcEbnsKTrSlr2ewput9tgSL0/pufSOp3OtrY2JVnoOikXIfS7330m6VQFDmtnV7evvvLKFanqhg29mNMqUZHE60oUSW+3jONNJpNsL3gulgssB2/E1cqmC+0LAAAAAAAAAACQgzQ3N6ckiQBZo7i4KBB4bteuatVVGcA7dUB3LCwsvfnmLaFF0pSogGqQu4foM3tKb+rjj1cFg8+VCByoRJUK3ENU4yc/WfPkk6vxi/3pM3tKh+r58xNzc4v79tWmH6VQlUqGHpJ4P5+CKgWTQ6uYg8Ho7t1r/vAHV0dHXUWFmXefRBZTyBvC5DiBihCKxbh//euG0GBJiSqVDO8zGxoaKioqUjYODg56vV7lZadcuGqlHqoSc3Nz8+3bt1M8Txkxm5mtWyu2b6+srrZ9+eVMX9/4jRvzks4AJNm40fm//+2rqTk9NuZXV8WQfk1m6CEmkyk9ayMUCiXdpLJxOp0pPvKZmZnr168rPC1SKWZ5PSRJVZX1Zz+r+cEPnCdPXrt+XXKSKZCgv3/vmTOe3//+C9VVXnivyQzHkBuxMAyTsoiH2cw/MpGKKjHLflI3Gg1tbSt+85vmv/zlRy+80OhwGGWcBEjw618/6HY/Q0Llhfea1HKURQitRlmrVlkfe2zVli33cRy6ePH2+fMT334r4WtaQDorVljGxw9t336W98t9SlTxZMh+Hx0dnZhINfuGQiElRZJGq5h37FjV0OB4++2xixdvh8OCn0FJTG4u+hYLRFXCnTvBvr7xzs51vFe5EhVQioxRVmWlmaYz3JMZK3PEe+To7FGh2c88U5FcF26Sjo46r/cIy/KPk5WoIqF5R+3pXkRe8MeSO7MSyEU1NRXK+OkAHc6rElWRXBdukrNnR1nWIJRFIlWV0fpUc3Oz7LVh8ceSO7MSRJ6Z9zmEXFR5zM4zO51Nzjca+J26eDXBa6/9uKSE3b+/T7kqowUpi8XC62gVs+wG/lhyZ1aCyDPz9hByUeUrrJ09NH7oyitXrp28JlUlAbSgakBuryro04ULAAAAAAWFWSDVDwC0RReJulWPV63/xXqtowAALFo9m5Y2lj78x4dN5aYsl6vDZ3HbWlsX12VdZZWkGg3GU22nmpz8ywlppeJjFqPiWbvWxnFdqyQeK8Ojq/E9hKKpumfrxv49FvZKXvU8X4kJZ6zwqpFY5Kr36rbKbbz7a6XiYxav4sFk9/Aiw6OrcQ8p21RmdBjvXJSZZJ5nUDSFhBOcMOrlqcubyjaZDPz3Ya1UfMwZVTyJBB+f8LElJSyvEbenZ/jpp9eI9+hq3EMqtlbMDs3GpCx3ls9QKBaOCaVvYNSv5r4KRoMt97XwHqeVio85s4qFolA4HFsSONZqZTyejrGxgw6J/t50NO4h9nq776Yvfbs+3b+ko/Ld9L1mfk2GGufin979VGjAo5WKjzmjiufmTZ9Z+NholJueDnu9ofQuJNWjS3a1aBrrsy2yFhXZikJ3efLS169fr0Nfij6jSnB56vLOqp1lprKZMI8tTitVKyKRWKPwmg09PcMvvbRpzRqbGI8uwR6S0WfLFDMIoWiIxxyrT1+KPqNKMBGYmAhMtFa0vvv1u/pR9cnAwLdffjlz+HC9GI8uwaGLz+e7+n08Hs/3yi6iEUJcjCfzORKJBNJQbo5XiD6jSnJp6pKr0qU3VZ/09AwfPixqoEXwHhKNRv1+3F0sGogihAxGHveMPscz+owqyZW7V35e8/MaW80t/y39qPrk9OmREydcra0VGR2IZJ9D8Cz6F7kYZyzl+daBPscz+owqiW/RNzQ75Kp08V6pWqn6RLxHV8sJIi7K+cf81iqe16LhcNifhubjGX1GtZxLdy9tuW8LQ/H/4dNK1YTu7m0c12US9vf29AwfOPBARo+uoh6i3Cs7e322dEOpkhj0AznnsHj6vf0G2iCUCaKVqgkMQ3Ecisr19353HiVBiF+TVojbF29X76oueaCE961IbqH811DOUnzp8+nPt1Zs7Z/p14+qCVVV1uHhuajAGrwIoVAo2tt789ln68+eHRV1RhmZfMkVE5cjdWXN2n21D770YPaNZqpnLqryawCqYLezfv+xF19U9Z6mVa6rwWh46JWH1v50bZbL1WFuL6AWDEPv3Vub3REuSYqKi6qfVG3RIABQkbzpZQAgFoqiEjMovMsNJNV4PI60fR+Chy1hY5EYpP0CqtPY2FheXo4QGhkZmZycTFFbWlosFgtCaGBgYHZ2VvuEWSFK6ko2vbyJMeu3DwO5y/z8/NWrV6enp9OlwcHBgYGB5P9+10P09uTq/cIbmAiQ86/rrb75ij5/51gs5vf7eT8kFwwGA4FA8n/1ew9BCHnOeEo3lDqbnFoHAhQuuu4hS/6lu/+9W7WzSutAgMJF1z0EIeT93OtocGCWGwYAomR4Dk7OfC0nMQuWHeZvziOE7Ovs05/xPFTpCq1+K83bKMtkub4ZeohCRwTehSuGWDi26Fu0rLBIOkoJsmPWyj2ic9eKPDCtkOX6ElylTa3VbqPBaJEtS9lNSmLWyj2ic9eKDPCtkOX6ZughkUhkcTH1k0Qi72gJF+7yLfKsFFycS/h1s4CSmJX8VkrQqlxy4Fshy/UlOMrK6MIViYE1LC1kaQEUJTHDKEst8K2QP6MsVaBoyugwRmZzYNllGGVlB32NssLhcDis5Rd1LSssFEP5RnLAX6XVb6V5G2WZLNdX71lPjkbH4vziwviC1oGQhXcGU8bUX65Arr6qn1nvPaSytXLyo0mUn9fJd+jBwZtNyNVX/JlpmhbKfl8+16zrHlK2uYy1sxPnUwed+Yfb7eZdo1WTYLIAufqKPLPT6Wxra8NnvyfQbw+x3G+pf7be/Xe3kvUlcoVgMKh1CFmFXH3FnNnj8XzzzTdIoE8ODg4m+pjeG8XR4HBuhKxeQGP+D6+JntWFsrOiAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1072.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACEklEQVRoge2Y11ICQRBFUVGiacSEilkxopgDxv//J5cZxJ0pdqrZvlXtQ/cHnLlvc+oUCoI3Ifn4301OSS+wV5yekZ7Qv1K5Ij3BXrVWl55gb3ZOeoG7+QXpBfYWTVV6gr0l05CeYG/ZrEhPsLdq1qQn2FtvbkhPcLe5Jb3AXassvcDddnNHeoK73b196Qn26geH0hPcHR1LL8i4vH7WhvzcQ0puPzs5PQPs+KUw/Oz8ArBjQOH42WUN8Uk4CsvPOleAHY7C8rNr0wbssBSWn3XNDWBHn8L0s9sWYEefwvSzO8jvnVCYfnbfQexIKEw/e3hE7EgoPD8rPT0DZlgKy89ezCtgh6Ww/KzSQ7iMpbD87O0dMGNAYfjZx2cXMGNAye9nX70iYMaQktvPGt+AGSAK/saxPEzpG00Zw/IwpS+LQrY8TOnLpFAtD1P6IhSi5WFKX4RCtDxM6YtQiJaHKX0xCsnyMKUvSiFZHqb0RSkky8OUviiFZHmY0hej0CwPU/piFKLlYUpfhEK0PEzpi1CIlocpfdkUsuVhSl8WhW55mNKXRRnDzzClT3thnKK9ME3RXuhTtBd6FO2FPkV7oU/RXhhQtBcGFO2FAUV74cjTXhic9sLgtBf6p70wOO2F/mkv9E57oX/aC9OnvfC/nfbCNEV7oUfRXuhTtBd6FO2FPkV7YUDRXuhTtBcGFO2FKcoPcyRYKaNg5/kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAALkAAABLCAMAAAAbKdZ8AAABEVBMVEUAAAAGDgYDBwMJFgkUMhQyfDIECQQcRhwwdjAnYScraSsxMTEYGBgRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBUBAQECAgI5jDkdRx04izgfTB8oKCg+Pj4UFBQFCwU0gTQkWSQICAgNDQ0EBAQJFwkQKBASEhIrKyszfzMLHAsPJQ8JCQk2hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAEBAEFBQIyejIeSx4XFxcGEAYOIw54eDGZmT4TMBM4iTgKCgoFBQUiVSIucy4YGAofHw0KGQoyezIgUCASLRIFDAUeSR48PBgMKzsgAAADlklEQVRoge2a53LUQBCEzyZjDBgHjMCYYDLG5GgwJmNyDu//IJRWYUe7s6vp2zlKOuhfOpVu+lNppVJXazCoNTE5UNc2/ZGMtu/YqT1y127tibz27BUeOLVPdtz0/gOq84I6OHNIdqDQaXZuXnVeRAuHVZ0WZ4R3Tjr5kWxC0+noMaFvOvlSdnw4p+UTRs7ek6eEvuU8fopMp1cQJ6szZ43ONXaezxaFtuU8doo5meXWERcuIk5Wly4brTZ2XsnWRNPqedyUq+ZkrrWOuL6AOFmx1/lGdlM0LbpaVs3J3GodcfsO4mTFXue7mfAhG10tMs3eu484WbGr5cH6Q6FvZLUI9SjbQJza9Fh212g8Fec3n6Q6lWvVPAxW5oS+IPnTZ7kau56/SHaaKtbqy3z71frr5Hmctt7konvevltKdnpfrNUP5sfHT8nXkNPnL7nIjq+b08K/Sp0mv31XnRfS2o+0/zP6+Ut95Lho1JlLLyc6pCPPXGo50SGVZi4r+I5qyYl4Otz6PQAyF+5UqyUn4unQkIszF+xEFM+JeDo05OLMBTsRxXMing4NuThzeU5A+ornRCE5Ic3J5ZnLc0Lep8ucyGezijye3ChpTi7PXJ4T8j5d5MRANivntSQ3SpqTyzOX54Rk9SInBrJZOa8luVHSnFyeuTwnZLVEc6JsnVPSnFyeuTwnYLXEc6KMnJKaZ4s4c6FOVPGciKdDQy7OXLATUTwnCucRUkMuzlywE1E8JwrnEVJDLs5csJNVS06UzrOkBbk0c+FOldpyIp4OC/LRZy61nDh26bA/3ZxL2p9uziPtaDdX3o1ULmlHuzmG3CPtZjfHkHuk3ezmOHKXdOhuzoq+s6PdHD+FJfdIwW6OSV/knR3u5tgpPLlHinVzXPoi7+xwN8dOCZC7pFg3x6Uvcp3hbo6dEiB3SYft5qzIdYa7OXZKgNwhHbqbsyLXGe7m2Ck8uUvazW6OI3dJFbo5KqVujiN3SRW6OSqlbo4jd0g1urmGdLo5htwh7Wo355O7pP3p5kZA+tf1v5sL6V/t5uwd2rduribvXTdXk/eum6vJ9bo5QCndXE2u180hiuZEGbliN4comhNl5IrdHKJoTpSRK3ZziBK6uYpcsZsDlNLNVeT96+bqZ4teN2e/quS2GirTV+C4yDxKrtfN2a8qua2GyvQVOC4yj5LrdXP2q0pui6pKX4HjIvMoee+6OUs+Jt3cH3JZz8EVIMMEAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492362466;4.copy,1.1,3.170,3.228,4.1030,2.19,2.14,1.1,3.160,3.228;4.copy,1.1,3.530,3.285,3.670,2.38,2.14,1.1,3.520,3.285;4.copy,1.1,2.10,3.304,3.520,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.850,3.361,3.350,2.19,2.14,1.1,3.840,3.361;4.copy,1.1,3.860,3.380,3.340,2.38,2.14,1.1,3.850,3.380;4.copy,1.1,3.850,3.399,2.10,2.19,2.14,1.1,3.840,3.399;4.copy,1.1,3.970,3.418,3.230,2.19,2.14,1.1,3.960,3.418;4.rect,1.1,3.601,3.221,2.26,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.250,1.6,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.345,2.36,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.367,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.405,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.468,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.478,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.476,2.14,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.497,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.527,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.544,2.16,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.630,2.26,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.649,2.15,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.668,2.13,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.523,3.202;4.blob,1.1,1804.iVBORw0KGgoAAAANSUhEUgAAAGgAAABQCAMAAADC68BTAAACuFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sCBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lYdR0c0f388k5MSLCxHHR1/NDQoYmIpZWUMHh4+mJgHEBARKio8lJQDCAgeDAyYPj4QBwcjVlYucXEBAgI4iooYOztWIyNxLi45jIwXODgiU1MvdHSMOTk4FxcSLS07kpIAAQECBQUBAwMLGxsIExOSOzsHAwMSLi4+mZkramozfX0eSkplKSliKCgECQkRKSkNHx8JFRUcREQ1goKUPDwpEREYPDw3iYk9l5cNISE8GBiJNzcBAAAsbm4kWVl0Ly9TIiIIFBQLGhoWNTU5jo4BBAQUCAgaCwseS0syfHw7kZETMDBLHh58MjI0gIAbQ0MmXl4pZmaANDRIr8QRAAACSklEQVRogWNgoAdgZKSLNQxMzCysdLGIjZ2DiS4WjYJRMApGwSgYBaOAeMDJBQbcyCyaAB5eMOBDZtEE8AuAgSAyaxSMAloDIWERelkkSh+LxITFaWyDhCSYkpJGl5CRlUPmyitQYouikrKKKg45NXUNTS0oW1tHV0+ffGsMDI2MTUxxSpuZW1haWQMZNrZ29g6O5NvD4OTs4opfhZs7rwcDg6eXtw8F1jAw+Pr5BwTikQ8K5gkJDWNgCI+IjIqmyKaY2DiV+AQckolJySmpaWBmekamXpYORVYxZOfk4pDJyy8oRPCKiksos4iBoRSHeFk5Kr+CUotQAY2rcgSgcVWOAKNV+SigCsiqJEKRRFUsxRZVZhGjqrqmlkJ7MuqoXHjgAvUN9LGnsamZPha1tLbRx6L2DvrY09nVTR+Lenq16WNRXz8WQRoMkk+YKI8pSItB8kmTsQjSYpB8SjG1TRwFo2AQgKnTcEiwTZ+BXWLmLLIsmjYVl8zsOdjFZ80kx5658+bjklqwcBE24cVLlpJj0bLlOKVWrFyFTXj1GnLsWbF2HW7J9RuwCMZs3ESORZu3sIGordtAYDsKi4Fhx7ydmDpKd+0mx6I5s8HUnr0gsA+FBQT7D2DqOHiIHHsOLzwCoY+CwDEUFhAcP4Ghw+DkKXIsOn1mKz5pxrPn0IXOX7hIgvnwKnrDevwKL11GF7lylQR74FX0tXnX8au8cfMWqsDtJXdIsAheRd+9R0DltvsPUAUePiLBHgR4/ISQiqfPUPnPs0kwHgAKnpSK1blCRgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.326;4.blob,1.1,1844.iVBORw0KGgoAAAANSUhEUgAAAR8AAAAgCAMAAAAc0oyzAAACuFBMVEUFBQxjY/UeHkoAAAB3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl5eJiYSEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgGDg4kJFlfX+wCAgYhDQ3+Z2csEhIECwtf7Oxh7+8GEBAEBAliYvIgIFB9MjLOU1MDBwdX19dY29s/P5xFRarWVlZwLS0FDAxj9fUeSkowdzBW1FYFDAVj9WMeSh4wd3dW1NQMBQX1Y2NKHh5CpKREqKhCpEJEqESkQkKoREQcRkZj9vYUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxtGHBz2Y2MOBgYBAwNd5uYoY2M6kDpMvEwBAwFd5l0oYyg6kJBMvLwDAQHmXV1jKCg4i4tOwcECBAJe6V4mXiY4izhOwU4CBARe6ekmXl6LODjBTk4SLS1n/v4NHx8eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQtEhIfDQ1U0NAyfHxEqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6PQVFR8MjIucnJY2dkGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUVyLi7ZWFgKGBhm/PwWNzcoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIYCgr8ZmY3FhZKt7c8lZVOwk44ijhKt0o8lTxOwsI4ioq3SkqVPDwkWVkCBgYNIQ0SLBIkWSRf7F8CBgINISESLCxZJCTsX18GAgIECQli8vIgUFAyfTJTzlMECQRi8mIgUCAyfX1Tzs4JBATyYmJQICA/nJxFqqpW1lYtcC0/nD9FqkVW1tYtcHCcPz+qRUVYb77/AAACaklEQVRogWNgYGRiHpKAhZUetjAws7HTwx7qA1YWetjCwMzByUUPi6gNuHl46WENAzMfvwA9LKI2EBSiizUMzMzCInSxibpAVEycLvYAw0dCUoouVlEVSMvI0sUeYPgwy8nTxSqqAgVF+tgDCh8lZfrYRUWgoqpGH4tA4aOuoUkfy6gHtLR16GMRKHyYdfXoYxn1gL4BHSwxNISGj5GxCR2soyIwNTOnvSUWllbWkPCxsbWjvXXUBPYOdLDE0cnZAhI+zC6udLCPisDNnV42MdDLoiEKRsMHPxgNH/xgNHzwg9HwwQ9Gwwc/oCh8PDy9qOUOYoG3Dw4JXz9/7BIBgWRZFBQcAqIoSz+hYRRpJwP4eOOSCY/ALh4YQJ5NkVEgkrLwiY4xpEg/ySA2Lh6XVEJiEjbh5JRU8qxKS89gpjR8MrOyKdJPMsjJxSmVl1+ATbiwiEyriktKmSkun8vKKdNPIqiorMItWV2DRbC2rp5cyxoamSkOn6bmFsoMIA20trWDqI5OEOhCYTEzd/f0Yuro67cg17IJZhMpr98nTabQAJLAlKlgatp0EJiBwgKCmbMwdcyeQ75tc+dRHj7zF1BoAClg4aLFEHoJCCxFYQHBsuUYOlasXEW+davXUB4+a9etp9AEEsCGjR34pDdt3oIutHXbdvKt27FzF+Xt5917KDWBeLB3H375/QfQRQ4eosS+w0coD5+jlscoNYJYcLznBH4FJ0+dRhU403yWEgvPnb9AcfhcvHSZUiOIBVeuElBw7foNVIGbtyiy8Padu5T3T+/dp9gIIsGDh4RUPHqMyn/ylDIbnz0HABvo6SYYWIkkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.362;4.blob,1.1,5276.iVBORw0KGgoAAAANSUhEUgAAAkEAAAAlCAIAAADKnKqfAAAABmJLR0QA/wD/AP+gvaeTAAAPKElEQVR4nO3de1BT17oA8J2dnYSYhMSQAvIIIQQwDAEJSKhFUxSNBicHeZU3PUTJdE7b4/R6h6FHatvT61yd8ZTR4qPDtLeonYHR0h57AIciR2XUjq3HglUMBWx5KEKQwYQQIMn9A4thJ2Kys0MaWb/JH7hW9pdv8Ft7h7UfiwgBAAAATvBfscJsNs+YTO5OZDmC3Z0AAACAZ0v2929PT2eSye5OBFiUTBa8b1+Cu7MAAA9DotOVOh1XLnc+1JryNTm3cpyPA0EQiU5S6pRcOReXaEBtSkqDTObuLOxFItGVSh2Xi0tNlufcuuV8HAjrSHHg77CkJL9r14YdzAoAlrsZrbavoSGiuNj5UBFFEeqTaufjQBA0o53pa+iLKI7AJRrwX1evbgkK2hYc7O5E7DIzo+3ra4iIwKUmi9QnTzofB8J1pNjA5dKPH9/AYlFcEh0AXmhBW7YoJyfJ3t7OBOGIOWXGMlogDb+sgpSTSrI3mAHDR41U2rp9u7uzsFdQ0BalcpJMdrImxWVGIy0wELesHB8p9v4dlpTkd/fu+Pi4AVNiALCsDba2To+P87OznQkSURwx1DakG9Thl9Xg9Pg0P5uPV8AXRnQ0+623oi1bJBLJxYsX9Xr98PDwkSNH6HS69VZnens3Bgb6UalLleYCXLlc3tho//sHB1unp8f5fCdrsniorU03OOhMkAVZOT5S7DqGwTAhMdH36lUwkQgAWJiNxu7Tp52ZJIERWJAnUNfiM5H4e1bm7tPdYDpxHgwTJBLf996Lf+utaBqNNN8eGRnZ1tam1+t37NhRUVFRUFBQV1dnvfmV4WEIgqQBAbjlQyIRvbxQLwK8YKcNI0h4QUF2R8e2f/2LwmbbH9xsNnZ3n3ZmOhFGEEFenrq2FnMEG1k5PVJsE4nYhw+/QqEQcY4LAMsGWyRSmUyMkBBsm3PTuEqtEqEhlo0EmED0Ilq+YBJsZ+/vWbFVJhUjhIEtqxcGiQSnpATs359YXZ1cWrqaz18wl1VfX69WqxHkyS9fJpOZzeaUlBTrOA+Ki/fFx+OV1cZTp1RmM+rFz8qa60Wo1Og338zv69s5NbXx5Em/l192ND6bLVKpTAwG5ppMU2q1CG3B5DYBhlEHXZhEsrP3SVYOjhTk+W+BoKQkv5s3NQaD0c6gAACgjHV2ajo6wouKbnz0EYbNI4oj+hr6ZnWzlo1cOXfrua2WLfe+uXc+/bw9vb9nNabp0IQXhd/46AaGrF4YJSWR8fGcxsbfLlwY0ulmUL1yubyqqmp29skv//z586Ojo2lpaW1tbah3PjIYfPGbS7xeWdlZVYVqnOjpmftB+tln/Kys/+zff+vw4SmNBkP8sbFOjaYjPLzoxg1sNVnc19Awq1swuc2Vy7eeO2fZcu+bb86np9vT+yQrB0fK849hVCoSG+tTXf2zPeEAAHgWdW1tlEqF4RhGZpJ5Cl6zohnVfv/y/a/WfmXZYnhksLPXIit1lCpqmR/DfvjhYUgIPTU1iE4nXb58f2Dg6X6ZSqXSaLQHDx5Yvn9oaIjD4VjHmTWZvIi4zVfpBgYm799HNZqmp+d+6Kmreyk+XrR7txeHc+fECU1HB4aPUKtro6JUGI5hZCaTp1A0KxSo9vuXL3+1dq1li+HRIzt7n2aFdaTYlpzsf+CAhEDAJxoALFsr/P3LZmd9JRJHN1y9c3XhQCEBdskgXOG/omy2zFfi64rgHoRAgMRizrvvxp04saG8fI3E4hei0+k+Wrg/HRkZOXTokHWQ3vz8/3X8//dZFp9LhCCIAMP8rKyM69dVZnP6lSvhhYWOfsSKFf5lZbO+vhhqcmfhwADq5BxeMI8U2/bsic3MBFcuAQAO5E1NydXVjm6luKRIOpjkinzmyJvkydXJrovvWVavZu3eLTp8+JX5lrNnz1qfD0tNTUVtSCQQDLt2vRkdDeGEERr6UkIC6kVZudL6nYGbNm1vaSl9/BjDp8jlTcnJGGryUtLBgxg+zk7YRooNHI7X8eMbAgJwuyUFAJYzQV5eyego7MhDiRihDJVJxY524JIzx7MSlIyWwGTw5LmnAi3uwxMKhXq9vqmpSSaTlZSUaDSa5mb0vC4EQdFstlmlirM1x7g02CIRhq0EgrySklEYdqgmQ1UmExu/o7WNrBwfKbalpXH37hXjkRIAABBCpZZOTPAWnsRenLhSnHkj03UpQRCEUJHSiVJeOs+ln+LR1q1b197ertfrR0ZGjh075m3rJty/ikRDRUWwp513QRBqaekEj+dQTVZm3nDtCVQMI8W2999P2LQJt3uwAQCQ1tRsrq+3//05t3NEu7F8v3aItEa6uX6zqz/lxfZDRkal2CO/8UulNZs3O1STt0W7d7sunzmOjhQAAAAAo3Qeb7Cw0Bs8uh4AAADwLMKVK4eKijYHBbk7EQAAAABw0MbAwDQuWMUGAAAAAAAAAAAUpoDp7hQAYAFfKg531oM7QgDgxRf737EpX9h4Ri0AuMuWoC2vR76Oc1BZsGxfwj6cgzqtvHzNLZzWXweAZSgwNfD1sdcZocv94fSYkegkpU7Jlbv8jNea8jU5du/rSHS6UqfjyuUuTclFhCuFH6/7mOOFw/3gC/4OS/JLujZ8zfmg+CoqijiJ0/rrALDcEIiE9UfX//jhj4/7sDyICIAgaEY709fQtwQLrUUURajt3tfNaLV9DQ34L7XlejABzhfkf/vrt6NTozhEm/+JS+euWrHq+4ffOx8UR2IxRyhknTrV7e5EAMAj8f7EowXSumq63J2IZ1PXqkMUIWRvF97+xRFzWEJWtyP7OnVtbYhCQbb10JA/slifWBaF1f6gHZdoT49hSX5Jd8fvjhvGcYmLl+LiiLa2oUH81l8HgCWW8MEHcRUVDq2xiyNBnmCgZWBGi14TC4IgiURy8eJFvV4/PDx85MgROp0+3/VBQkJFXBybQlnCTP/QBlsHp8en+dkufPp5RHHEUNuQzpF93WBr6/T4OD8729HPSkj4IC6ugkJxT00m+ibeeXTHYLSxEtAiNfmscfTkGAYT4ETfxKvDV12XNwYIAuflCWpxXX8dAJaYYWxMXFlZ2N+f/MknTIEA1WvPevPOCJAGDF8Ztm6PjIxsa2vT6/U7duyoqKgoKCioq6ub7x0zGCrF4v7Cwk+SkwVMcEEjZDaau093u246EUZgQZ5A7eC+zmw0dp8+jWE60WAYE4srCwv7k5M/YTKtahImEVFLgBO9CATcajKcGd4z0WPdvnhNLj6OIBFbdPiVwxTigq9dBIhAgkmWLyKBaGcvLtLSuFqtkkaza7FpAPjDIjOZUW+8kXH9epnRKPv661UbNsx3PXeNKGd4+XipzKrQjFDrrvr6euv1RFJSnl67yCST34iKup6RYSwr+1om27BqFS4peS62iK0yqRghLrk0hpvGVWqViOP7OrZIpDKZGCEhjm5IJjOjot7IyLheVmaUyb5etcqiJjeeUqnMqBefj09N0ki0ExtOxHHirLueW5M2x9GTRyzvEu4ymo2fdX1mGTGGHfOX6L9Ytvyk+enoz0ft6cVFXV3q9LSpqOgCjjEBwI18YmIkBw4Eb93auG1bf3MzBEGM0FAvHx/U2yZ6emyub+soViTrta7Xvt307eCFQVSXVqutqqrau3fvfMvIyMgXX3yxZ88e1DtjfHwOSCRbg4O3NTY29/c7n5XnyrqZ1Xum1xVrXqfWpZqmTRcw7euybt7sPXMG86rHPj4xEsmB4OCtjY3b+vubIQhiMEK9vKxqcqLHYMChJv2ofh+u/fDjjo+7xtHnaO2vSctxhEAQREWosT6x1T+jFxzrnuje/5/9li2Ts5N29jqPySQrFDyF1frrAOCJSHR6WG6ucOdOTnx8T13dWGfnXPvi6807iUghQhBkmjWh2qlUKo1Ge/DggWXj0NAQZ+HaV3QSKTcsbKdQGM/h1PX0dI6N4ZKV51LXqqNUUbgfw8hMMk/Ba8a6r1PX1kapVBiOYSQSPSwsVyjcyeHE9/TUjY39XpO6gclJq5o04VOTJJgEQZDRbES121mT1uMIgSAonhOvm9F1PUIfFfWz+l8f//qsVBbvdV52Nl+jmWptRX9/BADPwhaJRG+/HZabazaZumpqWnJytL/9Nt/76uefhxcUoDZpyc7uPXPG+Y+eGpuCIMh6hkqv109OTvr7+1s2BgQEfPfdd3M/i9jst0Wi3LAwk9lc09WV09Lym1brfD6e7pcvf0k6mOQr8X34/UMcw/Kz+VOaqUGs+7pfvvwy6eBBX4nk4ff2XlXOZotEorfDwnLNZlNXV01LS45Wa1GTr34eHm5Vky3Zvb041KRuVgdBEOq8FWRHTS42jvbE7snku2qRPbK3N7ZLPy9dUhx05frrALA0pDU1+ffuxbzzjs2BYP968xjAZHjX9C7hLqF119mzZ63PPaSmps79s0YqvZef/05MDFhMBEXeJE+uTsY3puKSIsm5fZ28qSm5Gj2RtgiptCY//15MzDtksq2aZIS+9FIC6kWh4FOTCAE5uv7o+lXrrbsWr8lnjiOOF+f4huMBtABc8kOnS6OVjI7++dEjMovl0IahoQyTSRXtyvXXAWBpsCIjYcRt1yWlX0m3uc8VCoV6vb6pqUkmk5WUlGg0mubmp3NZkSwWgt+1kS8SQZ6gZLQEJuP2y2GEMlQmFdu5fZ0gL69kdBS2+wsHixUJw26ryfI15XmCPOv2xWvymeMojZu2V7zXRgceiBTKa3fu5HZ3IzSaQxtWVopvuHj9dQBYDuLfi8/tzrXZtW7duvb2dr1ePzIycuzYMW9Pu1XWLRAqUjpRykvnzbfAZNjqQnQigUiwpxeCIHGlONPpfR1CpZZOTPDS052MszS2h2z/+9q/2+zCUJOE9xPev3z/cutgK955OuX27ZxPP71TVdXp7kQAwLPRAmj59/L/+eo/bd4lBmAgrZGSvcktOS1z/9xxbYevBP389X//+d93/+/uc3shCMq5nXPn0zudTu/rpDU1ZG/vlhwPeLQsi8zaL9l/6KdDNu8ScxTh+W8BAMCTvXzoZY6Yc27jOcjs7lReRKzVLBKdhGp83Pd4SjP13N5lK5ufzaVz/9HxDzMoSgAAFofQkMwfMxP/J9HdiQDAExQi5W/iv6XzPGPyEwAAN/PieMW9a+PJCADgLnQSfRt3m/Nx/h+7U/c4gangEAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.400;4.blob,1.1,908.iVBORw0KGgoAAAANSUhEUgAAAEMAAAASCAMAAAA3xpMTAAABYlBMVEUAAAAKChgEBAsiIlRUVM8GBg9BQaJHR68ICBVjY/UdHUk/P5xMTL1KSh62tko3NzfBwcH39/fp6emTk5MMDAwdHUhnZ/8JCRcEBAJbWyXS0lX//2fIyFEnJyf29va4uLhISEhiYmLu7u61tbUGBg4jI1YFBQIICAMCAgEJCQRsbCzf31r4+GSjo0I5OReqqqra2toEBARHR0f///9BQUFeXugzM3+kpEJUVCKnp0P7+2WBgTQTEwj09PSEhITr6+uMjIxXV9c8PJUhIQ00NBUREQdQUCDa2ljx8WGVlTwuLhMJCQlsbGzR0dGgoKBVVdM/P53Ly1LGxlBcXCX19fWNjY1aWt43N4hDQxu7u0zz82Ktra1EREQBAQNlZfksLGwtLRIpKSm3t7dfX1/t7e0SEiwUFDE6OjrExMSXl5cODg4tLW9dXeYBAQJSUswyMn0gIFBcXOURESkcHEUbG0IeHksr3oR5AAABAUlEQVQ4jWNgwAYYmbAKkwSYWVgpN4SNnXIzODi5KDeEm4dUHbx8IJJfQFBIWAQiIiomTopeCUkpaRkgLSsnr6CopAyRURFTxaVJTR0MNBjgejW1tHV09UB8fQNDBgYjYxOISlMzXGaYS4OBBQNcr6WVtQ1EztYORNo7QHiOTrjMcHYBA1eEXjd3D08vEMPb2AdE+fpBVPoHEPYLXK+GRaB0UDCQEQJxRyhEZVg4Yb8g9DIwRERGAcloSHjEgIVi4+IJ+wWhFwQSgDhRMMkoOUUeIpAqlobLDHSQgMxJzxC0z8yCsLNzcok1AyfIy6fYiIJCFUqNKMopptgZJaWkqAYAKrgsScryxF4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.562,3.402;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAARQAAAAOCAMAAADZlBMCAAAB+1BMVEUAAAAwd3dW1NQFDAVj9WMeSh4wdzBW1FYFDAxj9fUeSkowMHdWVtRCpEJEqERCpKREqKgUMjJm/f0LGxscRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4UFDJmZv0LCxs6kJBMvLwBAwFd5l0oYyg6kDpMvEwBAwNd5uYoY2M6OpBMTLwCBARe6ekmXl44izhOwU4CBAJe6V4mXiY4i4tOwcECAgReXukmJl4eS0tj9PQECwsSLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx8eHktjY/QEBAtEqalCo6NU0FQyfDJEqURCo0JU0NAyfHxERKlCQqMGDw9k9/ccRUUuci5Y2VgGDwZk92QcRRwucnJY2dkGBg9kZPccHEUoZGRc5OQBAgIKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzcoKGRcXOQBAQJOwsI4iopKt0o8lTxOwk44ijhKt7c8lZVOTsI4OIoNISESLCwkWSRf7F8CBgINIQ0SLBIkWVlf7OwCBgYNDSFnZ/4SEiwyfX1Tzs4ECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFAyMn1TU84DCAhW1tYtcHA/nD9FqkVRyFFn/2cnYCdW1lYtcC0/nJxFqqpWVtYtLXBRyMhn//8nYGAQKBAVNBUIEwgQKCgVNDQIExPhhKN/AAABqklEQVRIid2QZVMCURSGF1RQwe5WDOxuxcLu7u7uFgO7u7v1Z8rsrjMLLMuce/3k82HnzD37vHPmJQgVPD7BxMDQiNCDQKjvjz/C2MQUL0AkhubRbfB56s9m5vpEoQByGA4Wlni+WATNo9qwsrZRf7a1s+f2HBydYKeh4+ziiqO7uXsA8+g2PL003iXePtyirx/wNnSk/gE4emAQNI9qIzgkVHMRFs7pRURGwU7DIToGQ46Niwfm0W0kJCZpbpJlKVxialo68DgMMuSZ6HJWdg4wj24jN097lV/AJRYWwU7Do7gE3S0tg+ZRbZRXVGqvqqo5vJraOtBlmNQ3IKuNTc3APLqNltY27V17R6dusau7B3gcFr19/ajqwOAQMI9uY3iEbTk6plscn4CdhsvkFKo5PQPNo9qYlc+xLecXFLq8RdkS7DRclleUaOLq2jowj25jY5N1u7W9o/oqdkkkzInY20c7EZmDwyM08fiEI095SiJlTr9tnJ2zB15cqj5X1yQ3zIm4vUM7EZ37BzTv8Ykj7/mF5JU56WyDyds7yQdz+i98fpF8MyeaHyavej1f6eDrAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.271,3.421;4.blob,1.1,1360.iVBORw0KGgoAAAANSUhEUgAAArAAAAAOCAMAAADgxd+oAAAB5lBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh4wdzBW1FYdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYUMhRm/WYLGwsMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyg6kDpMvEwjI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CBAJe6V4mXiYBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0eSx5j9GMECwQSEi07O5IDAwd9M31KHkrQ0FR8fDJEqURCo0IpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgGDwZk92QcRRwEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxYoZChc5FwBAgEYGDw3N4kAAAFuLG5ZJFm3t0qVlTxOwk44ijgvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgINIQ1n/mcSLBIICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCAyfTJTzlMeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkVW1lYtcC00NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwjT0DcAAAAB0UlEQVRoge2YVVPDUBBGA8FavFBciru7u7u7u7u7u7vDP6W5famm05kuOxc4D5nNly/p6cw+ZMIwBoasFoyMFU5NTM203fF3EQixDeAwt8A2kMKwllbaOsZGiufWNlA29CMUYBvAYWGObcByC2srsuOv2IsdFANHJ2c4IbpxcXXDVgDD3cMTW4HlFlbi5c1f8fFVCvz8A8B8KCcwCNsAjuAQbAMOhmVDw3gbkvAI5SgyCsyHbqJjYrEVwIiLT8BW4JAubKI4ia+RnMIoR6lp6XBGNJORmYWtAEZ2Ti62Age3jHn5fA0rS9WsoBBIh3KKirEN4CgpxTYgcAtbVs5TqBBVqoZV1VA+VFNTW4etAEZ9QyO2AoFb2KbmFs2F1rZ21bCjswvMiGK6e3qxFcDo6x/AViCQ99PBIc2FsFB16fAIjA7djI5hG8AxPoFtIIMs7OTUtKbrM+JZdfHc/AKUEb0sLi1jK4Cx4rGKrSCDLOza+ob0OL1GkMhP7OaW2tu2d3Z/UJIS9vaxDeA4ONTr446OCSe6T7JPVqdn0sP5BeFSfmKvrtX/4s2tXv/Ar+DuHtsAjodHvT7u6Znwovsk94319Y3wLj/98w8EH5+EL92nb/RZBokPfPocAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.440;4.blob,1.1,1144.iVBORw0KGgoAAAANSUhEUgAAA1AAAAAOCAMAAAAWqQ0ZAAABa1BMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBIeSh5l+WUiVCIXOBdi82IsbCxMvUykpEKoqEQoYigpZSkgTyBc5FwJFwlf619Is0hGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMXOhdZ3VksbixDpkMDAwHm5l1jYygjViMucS4BAgE4ijgYOxhUz1Qtby0+mj6LizjBwU45jDkiUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwgCBQLQ0FR8fDIzfTMfTB9n/2dHsEdyci7Z2VgECQQRKREcRBw1gjUGDwYVNBUOIw4YGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEECwRf7F9h72EGEAYJCQTy8mJQUCAeSx4yfDI7kTsTMBNX11dY21gCBgIBAwGcnD+qqkU0gDQbQxsmXiYpZilRyFEnYCcQKBCkHI25AAABqElEQVRoge3YR1fCQBQF4OgAiiIq2BUFxYpYwQoW7GLH3rH33n6+JC44DFkMnmTezJBvk5u3eLmbt4kk5eQiw7+YzCmvlrx8oCKssxYU/gVbEbIXYynzLcQJgoRKSgE/zzWzKfXd4YTpwb6y8grlaatE9iosZb6FPAGQUHVNLdzneVbnqk8dNLg9ME240diEvM1YEoyEWlrboEvwqb0DG/g6/SBF+OHvQt09WBKMhFBvH3QJLvn6bfgoEIQoYmBJ4qAGBoegW/BoeMSCj0ZdIYgmXPN5ZGFdN5MmLSQOCo2Na7Qsqzgd6bMJK/0enJuMyKZ03UyatCAf1PSMRsuyyax7Ln04v0C/COcWo7IlXTeTJi3IB7W8sqrRtiyytr6RPoxtbtFvYmCJfFBoewe6Bn+CAbWpd5d2D6HEYuw0IE0Y5aD29g906Ca0Q9eR2vj45JR2E4HEz84vWGlAmnDKQV1eXevZUkQ3t6rj8N095SIisTw8xllpQJaelD+EnudkUg4KvbxSrS2At3f1+ccn3R4GUF/KH8LIdzJJ0JUMBn79KH8Io6Fk+gUkLeDslxSN/gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.457;4.blob,1.1,5652.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.893,3.514;4.blob,1.1,2356.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.630;4.blob,1.1,1088.iVBORw0KGgoAAAANSUhEUgAAAM0AAAA1CAMAAADVo58vAAABHVBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj5HRx1/fzQeSh5l+WUgTyBc5FwJFwkeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgs5jDkBAQECAgJLSx58fDI6kDpn/mcCBAIxMTE+Pj4XFxeAgDRDQxtFrEVX2FcKCgoNDQ0FBQUAAQDwh6n8AAABzElEQVRoge2Z124CMRBFlw2BQEgD0huQRhqkkt57IY309v+fEckr5MWxbK89KzuRz9NIM2OfB79c2XF8RNwmRy/YgObC9iO7ETcKJyYFNqC5sP3IbrMbgxOTAhvQXNh+ZDfeAuclBzagubD99NvLEUsgknpuT6LLY9xKlFYXkQrHlkcburydW4nS0YnoCseWRxpdHudWouh9adAwX1omI38w3mVXKvw6peGlEd1sd0+v7EV4l12pwD6F7Pb1D2QbJwa9dznEq/y77EoF9in8O4a9dznCq/4Go967jPIqi8ViMY5c3imMEZVRBMrUuXGnMEFURhEoU09OOcVpojKKQJl6ZtaZmycqowieqS0Wi8U4aCkcJplrgJafYZK5DmgJGSaZWywWi+XfUCoLDFH+n31ZHncXFjV9O9UplwSGKP/Pvizvy8pLyyuwesFYrawJTFH+n31ZXv//eJ31DZEpyv+zL8sbk5U3t7Z1KwCys7unWwGQ/QPdBoAcHh3rVgDk5PRMtwIg5xe6DQC5rFyx2tduQvroILvVG0RVce72jrl9/1ATNlLZfXxCPCvOvbwyt9/ehYWUdj8+EV9Qc1TS+aLUnupuONRS3yHu/gBTxzlfcwEi5gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB7UlEQVR4nO2Zx1JCURBEASOiF8kYwAhGMAdMGP7/nywfSrl4c4vFUNNNzVne2fSCV9TpzmRmhGzOOoEmc/ML1hE0WVyyTqDJcn7FOoImhVXrBJqshax1BEWKYd06gialsnUCTSpV6wSa1ArWCTSpN6wTKNLc2LSOoMhW2LaOoEirvWMdQZHdPesEiuwfFK0j6HHY7lhHUKR7ZJ1gmrC66HHqK6mLnpymv1O6aOfsPP3A6KLNXks6EbpoPy9+7YQuenEpnghd9OpavtG56E3oy0c6F70NXflI56J34V4+0rnoQ5D/VPhc9HHwJN4IXfRZ/tIJXbTcE0+ELvoyeBUulC76Nkz/PXG6aO79I/Wd1EU/v6wTTJV0F+Vi3ANILkrFXw8guigXox4g4qJUjHqAiItykfQAERflIukBYi5KxU8PEHVRLkrluItyUanGXZSLWiHqomTUG1EX5SLpASIuykXSA0RclIukB5BdlIxRDyC5KBm/PYDkolyMe4CZcFHSHmBCfJMGwDdpVHyTxsU3aVh8k8bFN2lcfJMGxjdpYHyTBmYmegAZ36TR8E0aGN+kgfFNGhjfpHHxTRoW36Rx8U0aFt+kYSHtASbEN2kAfJNGxTdpXHyThsU3aVx8k8bFN2lgfJMGxjdpYP73AN9wtznR168+twAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492362566;4.copy,1.1,3.180,3.209,4.1020,2.19,2.14,1.1,3.160,3.209;4.copy,1.1,3.530,3.266,3.670,2.38,2.14,1.1,3.510,3.266;4.copy,1.1,3.180,3.285,3.350,2.19,2.14,1.1,3.160,3.285;4.rect,1.1,3.623,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.583,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.307,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.326,3.105,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.345,2.66,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.364,2.38,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.478,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.499,2.26,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.514,2.25,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.544,1.4,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.594,2.24,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.592,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.639,1.5,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.630,2.17,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.687,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.620,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.121,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.522,3.231;4.blob,1.1,1044.iVBORw0KGgoAAAANSUhEUgAAAE0AAAAgCAMAAABgvQUGAAABp1BMVEUAAABKHh62Sko0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0pn/2cdSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChRyFFl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmIGDg4/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIECwtf7Oxh7+8GEBAQJxACBAIbGwsDBwdX19dY29sCBgIDCAMBAwEnYCcQKBAVNBUIEwjU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lZRwIz2AAABIklEQVRIiWNgGAVwwMiEQ4KZhRWZy8ZO0CgOTi5uHhxyvHz8AoJQtpCwiKgYAbPEJSSlpGVwSsvKySsoKgEZyiqqauoahFymqaWtg1+Frp6+AQODoZGxCSGzGBhMzcwtLPHIW1nb2NrZMzA4ODo5uxA2ztXNndvDE4ekl7ePr58/mBkQGCQaLEzYPIaQ0DAIIzwcTSYiMioawYuJjSPCNAaGeDCZkJiUjCqekorKTyPKNAhIz8hMANFZ2WCQQ4JWPMBGHwxyqWNaXj4YFFDHtFFAIxBcSIQixiI34kwrDCZGVXFJKTHKAstIyROEQHkFFQ2rrKqmomk1tXVUNK2+gYqGNTY1U9G0llYhKprW1k5Fwzo62ahoWlc3FQ1j6ImlomEAlhMvm21Ial0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.307;4.blob,1.1,2444.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.252,3.362;4.blob,1.1,5480.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.400;4.blob,1.1,908.iVBORw0KGgoAAAANSUhEUgAAAEMAAAASCAMAAAA3xpMTAAABYlBMVEUAAAAKChgEBAsiIlRUVM8GBg9BQaJHR68ICBVjY/UdHUk/P5xMTL1KSh62tko3NzfBwcH39/fp6emTk5MMDAwdHUhnZ/8JCRcEBAJbWyXS0lX//2fIyFEnJyf29va4uLhISEhiYmLu7u61tbUGBg4jI1YFBQIICAMCAgEJCQRsbCzf31r4+GSjo0I5OReqqqra2toEBARHR0f///9BQUFeXugzM3+kpEJUVCKnp0P7+2WBgTQTEwj09PSEhITr6+uMjIxXV9c8PJUhIQ00NBUREQdQUCDa2ljx8WGVlTwuLhMJCQlsbGzR0dGgoKBVVdM/P53Ly1LGxlBcXCX19fWNjY1aWt43N4hDQxu7u0zz82Ktra1EREQBAQNlZfksLGwtLRIpKSm3t7dfX1/t7e0SEiwUFDE6OjrExMSXl5cODg4tLW9dXeYBAQJSUswyMn0gIFBcXOURESkcHEUbG0IeHksr3oR5AAABAUlEQVQ4jWNgwAYYmbAKkwSYWVgpN4SNnXIzODi5KDeEm4dUHbx8IJJfQFBIWAQiIiomTopeCUkpaRkgLSsnr6CopAyRURFTxaVJTR0MNBjgejW1tHV09UB8fQNDBgYjYxOISlMzXGaYS4OBBQNcr6WVtQ1EztYORNo7QHiOTrjMcHYBA1eEXjd3D08vEMPb2AdE+fpBVPoHEPYLXK+GRaB0UDCQEQJxRyhEZVg4Yb8g9DIwRERGAcloSHjEgIVi4+IJ+wWhFwQSgDhRMMkoOUUeIpAqlobLDHSQgMxJzxC0z8yCsLNzcok1AyfIy6fYiIJCFUqNKMopptgZJaWkqAYAKrgsScryxF4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.402;4.blob,1.1,1360.iVBORw0KGgoAAAANSUhEUgAAARUAAAAOCAMAAAA2Vng8AAAB+1BMVEUAAAAwd3dW1NQFDAVj9WMeSh4wdzBW1FYFDAxj9fUeSkowMHdWVtRCpEJEqERCpKREqKgUMjJm/f0LGxscRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4UFDJmZv0LCxs6kJBMvLwBAwFd5l0oYyg6kDpMvEwBAwNd5uYoY2M6OpBMTLwCBARe6ekmXl44izhOwU4CBAJe6V4mXiY4i4tOwcECAgReXukmJl4eS0tj9PQECwsSLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx8eHktjY/QEBAtEqalCo6NU0FQyfDJEqURCo0JU0NAyfHxERKlCQqMGDw9k9/ccRUUuci5Y2VgGDwZk92QcRRwucnJY2dkGBg9kZPccHEUoZGRc5OQBAgIKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzcoKGRcXOQBAQJOwsI4iopKt0o8lTxOwk44ijhKt7c8lZVOTsI4OIoNISESLCwkWSRf7F8CBgINIQ0SLBIkWVlf7OwCBgYNDSFnZ/4SEiwyfX1Tzs4ECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFAyMn1TU84DCAhW1tYtcHA/nD9FqkVRyFFn/2cnYCdW1lYtcC0/nJxFqqpWVtYtLXBRyMhn//8nYGAQKBAVNBUIEwgQKCgVNDQIExPhhKN/AAABuklEQVRIid2QVVPDUBCF0yJFirs7xd3d3d3d3d2Ku7s7/ExKSEqapjfd4T7xPWR27mbPOXMI4huBkGCioalF8KAt4vtDbXR09bBpcaAvhrrRbQgFiu8GhnyXIm1AMB6MjPFpKSPWh7pRbZiYmim+m1tYog+trG1A0ZDY2tnjE2Pj4OgEdKPbcHZhLVzd3NGXHp6wbEgkXt4Y1Vj4+ELdqDb8/APYm8Ag5GFwSCgoGg9h4TjVFIiIjAK60W1Ex8SyV3HxCajLxKRkWDg0KalpOOWYpGdkAt3oNrKylXc5uajLvHxQNF4KCvHq/VJUDHWj2igpLVPelVcgDiurqiHJ+Kmpxasnp66+AehGt9HY1Ky8bGltU33Z3tEJC8dHV3cPXkGa3r5+oBvdxsAg13ZoWPXlyCgomhqMjeNW/GFiEupGtTGVOs21nZmdU3U4H78AiqYGi0tS3JLfLK+sAt3oNtbWOdcbm1uy79w2iStzInZ2/56Xxd7+AXZNGYdHCDfpMYmEOcnbODnlVjw7l30uLkmumBNxfYM//+0dfk2CuH9AuD0+kTwzJ5VtKPDySvLGnP4L7x8kn8yJ4gvG0Xo9pkDbhwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.421;4.blob,1.1,1596.iVBORw0KGgoAAAANSUhEUgAAAuIAAAAOCAMAAABdJIndAAACPVBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh5HHR1/NDQwdzBW1FYdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYeDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyhWIyNxLi46kDpMvEwjI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0tEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwd9M31KHkrQ0FR8fDJlKSliKChEqURCo0IpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxY8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAFuLG5ZJFm3t0qVlTx0Ly9TIiJOwk44ijgvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgIUCAgaCwsNIQ1n/mcSLBIICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCBLHh58MjIyfTJTzlMeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkWANDRDGxtW1lYtcC00NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwgLGONaAAACKUlEQVRogWNgYGRiJgBYWFG4bOwchHSMAmZmTi58stw89HIH/QEv30C7AAUwMPMLEFLDyoLKFxSilWuGE+DixCfLw00vd9Af8PEOtAtQAAOzsIgofiVi4hKoApJS0rRz0HABMrJyeGTlFRTp5hJ6AyVllYF2AgpgYFZVU8evREMTTUBLW4dm7hk2QFcPn6y+Ab3cQX9gaDTQLkAFDMzMxiZ4VaiamqELmVvQzD3DBVhaWeORtbG1o5tL6A3sHRwH2gmoAJjEncSd8alwcWVAF3Jz96CZg4YJ8PTyxiPr4+tHN5fQG/gHBA60E1ABKPkGBeNTIcCPKRYSSiPnDBsQFo5PNiKSXu6gP4iKHmgXoAFQEo+JxaMgTiQeUzAhkVbuGSYgKTkFj2xqWjrdXEJvkJGZNdBOQAOgJJ6dk4tbQV5+AaZgYVExzVw0LEBJaRke2fKKSrq5hN6gqrpmoJ2ABsDt7No63ApMjLGJ1jfQxjnDBTQ24ZNtbqGXO+gPWtsG2gXoAJzE2zs6ccl3iXdjE+7p7aOVi4YD6JedgEd24qTJdHMJvcEU5akD7QR0AE7i06bPAJKd08BAFZnFPHMWVm2z58yloyOHHJg3H5/sgoX0cgf9waLFNDJ4yVIwWEY6CzIguHwFkFi5CgxWI7OY16zFbuO69TTyyrAAGzbik920mV7uoD/YspVGBm/bDgY7SGchjXnv3AUGu5FZo2AUDA6wZy8Y7COdBQC+ezXUVyIbvQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.440;4.blob,1.1,760.iVBORw0KGgoAAAANSUhEUgAAAVsAAAANCAMAAAAwsT2BAAABCFBMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBKkpEKoqEQoYigpZSlGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMDAwHm5l1jYygjViMucS4BAgE4ijgYOxiLizjBwU45jDkXOBciUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwjQ0FR8fDIzfTMeSh5yci7Z2VgECQQRKREcRBw1gjUYGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwsbiwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEJCQTy8mJQUCAeSx4yfDICBQI7kTsTMBOcnD+qqkU0gDQbQxsmXiYpZintXti2AAAA7ElEQVRYhWNgYGRiHgUUAhZWFC4bOweIYmDm5BoQ5wwrwMqCyufmAZEMzLx8/APhnOEEBASFUAWERUSZQWErJi4xIA4aRkBSCk1AWkaWGRS2zHLyA+GeYQSkFRTRhZSUmcFhq6KqRnfnDCugrsGGLqQpqAUOW2ZtnQFw0DACPNyYYrp6kLDVN6C7c4YTMBQxwhQ0NoGEramZOd0dNIyAhaUVpqC1jS04bJnt7OntnuEElJWwiTo4QsLWydmFvs4ZTsBV0A2bsLuHJzhsvbx96Oue4QR8/bAK+wcEgsOWOSiYnq4ZXiAkFLt4WDgAiMtDZb6vrf0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.440;4.blob,1.1,484.iVBORw0KGgoAAAANSUhEUgAAAO4AAAAOCAMAAAAfdNCSAAAAhFBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAIEwj8IddVAAAAoElEQVRIie3UyRKCMBBF0VYZHFBREQURnAf8//+z0gugsnoSAlaKs8ldvepViGgwHBGzbHJcqWDFClxdGU+m/Fozcjypfl/Bq2PzBS19qQy2WtMmkKpnsG0o7LQuo9WCfSTEWpfRasEhEY5al9HqaZWm/3MBWvVlp/NFfaWZC9BScL3dM+WRhi7A6sG/evislsFe/KtH72oZLOdfPfmU9QV5ZRur5PlfkwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.457;4.blob,1.1,5636.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.923,3.514;4.blob,1.1,2076.iVBORw0KGgoAAAANSUhEUgAAARUAAABtCAMAAAC4NgXIAAACIlBMVEUAAAAPJA8vdS9QxVAeSh5l+WUiVCIbRBtg7mANIQ0MDAyKiorh4eH19fW5ubksLCwgTyBc5FwJFwkBAwFY2lgtcC0HBwfAwMC/v79UVFRISEiSkpLr6+seHh4GDgYhUiFj9WMFDAV2dnaxsbEXFxfDw8P8/Px3d3eZmZkECwRf7F9h72EGEAZFq0VHsEcCAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf398DBwNX11dY21hf6l8wdjA1NTXExMTt7e0xMTGsrKzg4OAIEwhn/2ddXV2cnJwuLi5HR0eWlpbS0tIJCQkQJxAbQhtxcXGCgoJGRkavr6+AgIABAQHa2toTLhMZPhlpaWmMjIw4ODjc3NwfHx+4uLiNjY1eXl6rq6sLHAsdSR1EREQGBgb6+vpkZGT29vb09PQrKysCBgJl+mUpZSkICAjs7Ow7OzsZGRkUFBRQxlA8lTxnZ2fx8fF7e3tQUFBra2szfjNaWlrOzs739/fn5+d5eXkLGgsXOhc5jTlNv00AAQBTzVM2hTYIFAgxejENIA0LGwsOIg4CBQIOIw5k92QDCAMBAgFCpEIVNBUHEQcfTB8GDwYICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzU8lDxc5VwqaSo6kDoKGAokWiRb4lsweDBj9mNDp0MjVyNi8mIpZiknYCcTLxNW1lZl+2U5jDln/mcCBAJFrEVX2Fdi82IsbixRyFEQKBAlDAWEAAADrElEQVR4nO2c51cUMRTFoyIKdlHEChZELNhRsctgxd6xYwUL9l6xoCBYALtiV2xY/z8hC0c4J2aSTWbem+H9vrw9O5ucmznMvJ27NzBGNNAGWgBG2rZz/0xM+1jvhWCiQ8c4XuM7de7Stdv/PtW9R0/fFCEgoVdvXhP7JPXt13/AwPqXgwbZmNjOLEAkpwzmdcjQYanD09JGMJY+ctRo83ntzALFmAxexo4bP2HipMmZUxibOi0r3XxeO7NAMX0GLzNnJc6OnzOXzUsE1oOCbCeZ15z5C1LZwkVs8RJgQSjIdZbyumz5ipUsZ9XqNcB6cLDWWcfr+g0b8zZt3rJ1G7AeHGx3dvCan7Qzb9fuPXv3Mbeeqtpxg9yZCwr383rg4KHMIlZ0mLn1VNWOG+zOfORopB47fiL/5KmGV/Keqtpxg92ZT2c1vjhz9tz5C6BSEHGx8BK0BIxcvlIMLQEh6VevQUvAyPUb0AoIIpzIfUn50RLnpm05mnjmqsp9SenREifbuhxNELqqt5xSaAkIKbsNrYBoorScUwGtAxd3HE6L22wFP1Gt+XqOu8u51/y9+/xEZUBJQoDoCqrkJ6oMShICRFeQh6i6lnZ8yaqqKAeKrqAWWPVNVV1LO75k9YOHj8xnEWHXN1V1Le34ko+fPK02n0VEsH1TgiAIgiAIwjJBTmCIsbCiYCcwRNhYEcYnCRdf0uV3dIwrsoHUVal4lvL8RX2teemrJnikrsqr1zFv3r4ref8hlH8QEqRX0Mdaxj59dr7U+iwKHHdfsjgXcYuI2nmU4+pLyrHxXeOrUx7tUO+cRxOsfNeo+VYX7VDvnEcTrHTm7z8sKAkblT9/QUtASF0sRS4JgiC8Qp6I/HcU+25w+Tp01csTkc2OIswtNscl2ampXp6IDE5e0q5SeSIyOHnJ4Ci1CWUoRVCGUgRlKEVQhlKELxlKk/3eqr6fvmspGdHiCjJxHiVjTfZ7q/p++q6l6ggT51E21mS/t6rvp+9aqo4wcR6bxhZE7lMJ0c4TTn5H7lOt7rckOX8i9ynwbXEEQRBEA/C7tzGCYPc2DNLnB2WPL2RZS/nzg6rHF7asJf0fSoIgCF8Q9VT9Pou9M6s6o43rEPVU/T6LvTPr+pyinqrfZ7F3Zj98ToIgCIIgvEffjQyLfylbh74bGRb/UrYO/cRhcNKUcmTr0E8chiWjGJZ1EN5AWUsRlLUUQVlLXwDJS1ob65GXCp+XNBnrlZcKn5c0Gauk/i+cgyatlFGEFQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.630;4.blob,1.1,636.iVBORw0KGgoAAAANSUhEUgAAAM0AAAAfCAMAAABzlLl/AAAAilBMVEUAAAANIA1n/2cLGwsIEwgOIg4CBQIOIw5k92QDCAMBAgFCpEIiVCIfTB9HsEcNIQ0VNBUHEQcGDwYGDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAXOBdi82IsbCxMvUxf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj5R2X9gAAABDElEQVRYhe2X2Q6CMBBFCyIo7or7hvv+/79nUh6qYzMDpaQ16Xm6yUDnPMzLZewDz68xswgDmQvuB6eeH+gTU0IYyFxwPzit+6E+MSWEgcwF94PTqKHPSw1hIHPB/czbqxE2ObGZ7TFfHpIpLy2f067GlqLDl3fJlJdenzOoxpZiyJdHZMqL2UvTDXppo5H6w+JfPJXh55WvSwPTZDyZqi4S/+KpDPgrcDqbL5LvL5bZXa6o9PkvnsqAv0LvWGd3uaHSf7DN7jKgksPhcFhHumP7A0hWUahTp0e2P4FkFYU69fnCrjeQrKJQp74/2PMFklUU79QOh8NhHbIWrqeZG0DWn/U0cxPIGjLZmt9uxhdn4nxDYgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.991,3.668;4.blob,1.1,2492.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;3.end,1.1;4.sync,10.6492362672;4.copy,1.1,3.190,3.266,4.1010,2.19,2.14,1.1,3.170,3.266;4.copy,1.1,3.530,3.323,3.670,2.19,2.14,1.1,3.520,3.323;4.rect,1.1,3.620,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.563,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.286,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.291,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.364,2.45,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.364,2.18,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.402,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.459,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.478,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.478,2.18,2.54;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.506,2.24,2.41;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.539,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.535,2.15,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.578,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.582,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.611,2.23,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.668,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.502,3.221;4.blob,1.1,1128.iVBORw0KGgoAAAANSUhEUgAAAFcAAAAqCAMAAADxqjdBAAABv1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBACBgIDCAMBAwEDBwdX19dY29tRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lZDXIszAAABSUlEQVRIiWNgoAgwMlKmHwdgYmZhpZZZbOxgwAFic3JxM1HLXB5eMOCjlnkwwC8ABoLUNncUDFUgJCxCI3NFaWKumLA4dQ2UkARTUtLoEjKycshceQUSDFVUUlZRxSGnpq6hqQVla+vo6ukTbaqBoZGxiSlOaTNzC0srayDDxtbO3sGRaGMZnJxdXPGrcHPn9WBg8PTy9iHeVAYGXz//gEA88kHBPCGhYQwM4RGRUdGkGBwTG6cSn4BDMjEpOSU1DcxMz8jUy9LBZQrW+iU7JxeH8rz8gkIEr6i4BIc6XPVLKQ71ZeWo/Aoc6oirX5BrJGqC0RppFJAEsipJUi5RFUucwsos0txRXVNLjLKMOlz5jjJQ30ATYxubmmlibktrG03Mbe+gibGdXd00MbenV5sm5vb108TYCRPlaWLupMk0MZZhSjFNjAUA1IYxSIoa7QQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.291;4.blob,1.1,992.iVBORw0KGgoAAAANSUhEUgAAAVoAAAAJCAMAAABE4hSpAAABgFBMVEUAAAAsEixtLG03NzfBwcH39/fp6emTk5MMDAwrEiuZPpkOBg4sEhJtLCwCAQI3Fjd+M354MXgnJyf29va4uLhISEhiYmLu7u61tbUIAwg0FTQDAQEFAgIBAAACAQE3FhZ+MzOZPj54MTEFAgVBGkGGNoaVPJViKGIiDiKqqqra2toEBARHR0f///9BQUGLOItMH0xiKCgyFBRBGhqGNjaVPDwiDg5kKWSXPZdNH00LBQv09PSEhITr6+uMjIyBNIFZJFkUCAgfDQ0KBARkKSmXPT1NHx8LBQUwEzCDNYORO5EcCxwJCQlsbGzR0dGgoKB/M39eJl4wExODNTWROztZJCQcCwsBAAEyFDJ6MXp3MHf19fWNjY2FNoVSIVJ6MTF3MDAoEChwLXCSO5Ktra1ERESVPZUoEBBwLS2SOzsGDg4bCxspKSm3t7dfX1/t7e0aCxodDB0bCwsECwtf7Oxh7+8GEBA6OjrExMSXl5cODg5DG0OKOIoDBwdX19dY29tk2pUQAAABI0lEQVRIiWNgAAFGJhDJzMLKxs4BFmDg5OJmIA7w8BKpcAQCPn4BLkEgLSQsIiomLgERlOSSwqVeWgYMZEFsOXkFRSW6uHIIAmUVVTV1DRBLU0ubgUFHVw8irm+AS4ehIhgYMTDIGJuYGprRx51DEJhbWFpBWNY2INLWDsKzd8Clw9EJDJwZGFxc3dxp7sChCzw8vRy8QQwfXV8Q5ecPEQ8IxKUDUSAEBYeEhtHDkUMUhEdEckXxAxnRkFQbAxGOjcOlAVEgMMgaxSsmyNPDlUMVJCYlA8kUSFmbChbiS1PBpRpRIIBAekYmPZw41EBWFoyVDcQ5rLk6efkiEIECrkJiTSmiuruGPiguKS1D5pdXsNpWVkHY1TXhA+Gk4QJq6+qLAVt6Kwrz4+yGAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.307;4.blob,1.1,992.iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAMAAACfHyDkAAABfVBMVEUDBwc8k5MSLCwAAAAdR0c0f38HAwOTPDwsEhIoYmIpZWViKChlKSkRKio8lJQDCAgMHh4+mJgHEBAqERGUPDwIAwMBAgI4iooYOzsjVlYucXECAQGKODg7GBgiU1MvdHQ5jIwXODhTIiJ0Ly8LGxsIExMSLS07kpIbCwuYPj4TCAgzfX0eSkp9MzNKHh4cREQ1goIECQkRKSlEHByCNTUGDg49l5cNISEYPDw3iYkAAQEOBgaXPT0hDQ0sbm4kWVluLCxZJCQWNTU5jo4BBAQIFBQLGho1FhaOOTkEAQECBQU7kZETMDAeS0syfHwFAgKROzswExMmXl4pZmYxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaptCG/OAAABJElEQVQ4jWNgYGRiJgBYWFG4bOwcIIqBmZOLkE5WFlQ+Nw9EJy8fP36NAoJCqALCIqJgnWLiEvh1SkqhCUjLyIJ1MsvJ49UopqCILqSkDNGpIqiKT6eaOgO6kIamFlgns7YOPp1cnJhiunoQnfoGeDQa8hlhChqbQHSampnj1mlhaYUpaG1jC9bJbGePW6e8HDZRB0eITidnF1waXQXdsAm7e3iCdXp5+wBJFy8wEENmMfv6YTXQPyAQEuJBwUAiJBQMwpBZzOER2N0SGYUUV9ExYBCLzMIDMGKZaDACdcbFJ5BrZ2ISuTqTU1LJ1JmWnkGmTubMLHJ1ZufkkqmTOS+fXJ0FheTqLCouIVMnc2kZuTrLKyrJ1FlVXUOmTubaOmJ1AgDVoUBO8n519gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.345;4.blob,1.1,2876.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.354;4.blob,1.1,1820.iVBORw0KGgoAAAANSUhEUgAAAFYAAABACAMAAAC3B3BDAAACxFBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tHRx1/fzQeHgyYmD4QEAdWViNxcS4CAgGMjDk4OBctLRKSkjsHBwNlZSliYigJCQSUlDwpKRE8PBiJiTcBAQB0dC9TUyIUFAgaGgtLSx58fDKAgDRDQxtHHUd/NH8HAweTPJMsEix3dzDU1FZiKGJlKWUeDB6YPpgQBxAqESqUPJQIAwgyMhT9/WYbGwtWI1ZxLnECAQKKOIo7GDuQkDq8vEyMOYw4FzhTIlN0L3QEBALp6V5eXiYtEi2SO5IBAAEFAgUDAQMbCxsTCBP09GMLCwQuEi6ZPplqK2p9M31KHkqpqUSjo0IJBAkpESkfDR8VCRVEHESCNYIPDwb392RFRRw8GDyJN4kOBg6XPZchDSFkZCjk5FxuLG5ZJFnCwk6KijgUCBQaCxo1FjWOOY4EAQQhIQ3+/mcsLBJLHkt8MnyRO5EwEzB9fTLOzlOANIBDG0NeJl5mKWbW1lZwcC0KChgEBAsiIlRUVM8GBg9BQaJHR68ICBVjY/UdHUk/P5xMTL1KSh62tko3NzfBwcH39/fp6emTk5MMDAwdHUhnZ/8JCRdbWyXS0lX//2fIyFEnJyf29va4uLhISEhiYmLu7u61tbUGBg4jI1YFBQIICANsbCzf31r4+GQ5OReqqqra2toEBARHR0f///9BQUFeXugzM3+kpEJUVCKnp0P7+2WBgTQTEwj09PSEhITr6+uMjIxXV9c8PJU0NBUREQdQUCDa2ljx8WGVlTwuLhMJCQlsbGzR0dGgoKBVVdM/P53Ly1LGxlBcXCX19fWNjY1aWt43N4i7u0zz82Ktra1EREQBAQNlZfksLGwpKSm3t7dfX1/t7e0SEiwUFDE6OjrExMSXl5cODg4tLW9dXeYBAQJSUswyMn0gIFBcXOURESkcHEUbG0IeHkvCGq7LAAACSklEQVRYhWNgoD5gZKSBoQxMzCysNDCWjZ2DiQbGjoJRQAzg5KKJsVyctDCVm4eXFsby8dPCVAFBIVoYKywiSgtjxcRpYaqEpBQtjJWWkaWFsXLytDBVgUeRFsYqKdPCVAYVVZoYOwpGgZo6DgkNTS3sEto6RBirroZLRlcPu7iONmFT9Q0McUkZGZtgEzY1MydsrIUlTikraxtswrZ2hE21snfALenohEXQ2cWVsLFu7hogysMTBLxQWAwM3gY+mDqUfP0IG6unC6b8A0AgEIUFBEHBmDpCQgmbGmYcDqEjQCAShQUEUdEYOmJi4wgbG5/ggU86MSkZXSglVYCwsU6O+OXT0tFFMjIJm5plkI1fQU5uHqpAfkEhYWOLigko8CwpRRUoKydsKkNFJSEVVdWo/JpaIowdBfQAdfU0MbahsYkm5ja30MTY1rZ2mpjb0UkFQ7q6QWRPb1//hIkQkUmTp5CkFxM4T502fQaQnjlr9py58+ZDBBdMXojLnEWLwUAAWS8GkFiydFnochBrxcpVDAyr16yFiK9bj8vYDdPBYCOyXgywafOWrRDWtu0gcsdOCG/XblzG5u8Bg73IejHAvv0HDh4CMQ6vOQKijh6DiB8/gctYRCDA9WIBAhtPTj91Gsg4A3HtWYjwufO4jEUEAkIvVqB64SKQvAQJ28tgoStXr+FSjQgEhF4cQBiIr/fdWH3z1myIwO3Jd3CrxtSLD9y917fj/gMI++Gjx8QaSwp48pQWpj57voAGpr549JIGpjK8ek2hAQAWrbPfax/S7wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.232,3.381;4.blob,1.1,3140.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.592,3.402;4.blob,1.1,1400.iVBORw0KGgoAAAANSUhEUgAAAR4AAAAOCAMAAADOtoPLAAAB+1BMVEUAAAAwd3dW1NQFDAVj9WMeSh4wdzBW1FYFDAxj9fUeSkowMHdWVtRCpEJEqERCpKREqKgUMjJm/f0LGxscRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4UFDJmZv0LCxs6kJBMvLwBAwFd5l0oYyg6kDpMvEwBAwNd5uYoY2M6OpBMTLwCBARe6ekmXl44izhOwU4CBAJe6V4mXiY4i4tOwcECAgReXukmJl4eS0tj9PQECwsSLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx8eHktjY/QEBAtEqalCo6NU0FQyfDJEqURCo0JU0NAyfHxERKlCQqMGDw9k9/ccRUUuci5Y2VgGDwZk92QcRRwucnJY2dkGBg9kZPccHEUoZGRc5OQBAgIKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzcoKGRcXOQBAQJOwsI4iopKt0o8lTxOwk44ijhKt7c8lZVOTsI4OIoNISESLCwkWSRf7F8CBgINIQ0SLBIkWVlf7OwCBgYNDSFnZ/4SEiwyfX1Tzs4ECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFAyMn1TU84DCAhW1tYtcHA/nD9FqkVRyFFn/2cnYCdW1lYtcC0/nJxFqqpWVtYtLXBRyMhn//8nYGAQKBAVNBUIEwgQKCgVNDQIExPhhKN/AAAB2klEQVRIiWNgAAJGJgZkwMzCykAAsLETUoEVcHBykaWPKoCbB4VLhFug4cLEiCrMy0dIIzsbKQ5DAH4B8vRRA/Bwo/IJuwUSLoJCwqjCIqJi+PWJS0iS5jQYkJKWIU8j5UBWTh5VgKBboOGioIgmrqSsgl+jqhqJboMBdQ1NMnVSDLS00QQIugUSLjq6eugS+gZ49RkaGZPmNAQwMSVXJ4XAzNwCXYiAW6DhYmlljS5jY2uHT6O9gyOJjoMDJ2cXcrVSBlzd3NGFCLgFGi4enphSXt74NPr4kuY0ZODnT75eSkBAIKYYfrdAwiUoOARTKjQMj77wiEiSXIYCoqLJ10sBiImNwxTE6xZouMQnJGLKJSWn4NaYmpZOouOQQEZmFvmayQfZObmYgnjdAg2XvHxskgWFuDUWFZPmNFRQUkqJbnJBWTk2UXxugYRLhXMlNsmq6hpc+mpt60hzGiqob2ikRDt5oKm5BZswHrdAw6W1Datse0cnkKzpAgMlZBZDdw9FLu3t66dIP1lgwkSswhC3NE4CA3VkFixcJk/BbuDUaUBi+gwwmInMYpg1mzKnzplLmX5ywLz52MXBblmwEAwWIbNwhgsyWLwEDJYis4YfWLYcDFYgs6AAAB3mej3qZVacAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.421;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAAxQAAAAOCAMAAACB+KrDAAACPVBMVEUHAweTPJMsEiwAAABHHUd/NH8MDAX19WNKSh5HHR1/NDQwdzBW1FYdHUc0NH9iKGJlKWWkpEKoqEQqESqUPJQIAwgeDB6YPpgQBxBGRhz29mMODgYeDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxACAQKKOIo7GDtWI1ZxLnEDAwHm5l1jYyhWIyNxLi46kDpMvEwjI1YuLnFTIlN0L3SMOYw4FziLizjBwU4CAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgbCxsTCBMtEi2SO5ItLRL+/mcfHw0tEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwd9M31KHkrQ0FR8fDJlKSliKChEqURCo0IpKWUoKGJEHESCNYIJBAkpESlyci7Z2VgJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESkOBg6XPZchDSE8GDyJN4kBAAEYGAr8/GY3NxY8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAFuLG5ZJFm3t0qVlTx0Ly9TIiJOwk44ijgvL3QiIlM1FjWOOY4EAQQUCBQaCxpZWSTs7F8GBgIUCAgaCwsNIQ1n/mcSLBIICBQLCxoFAgWRO5EwEzBLHkt8MnwJCQTy8mJQUCBLHh58MjIyfTJTzlMeHksyMnwCBgIDCAMBAwFeJl5mKWZ4MXiZPpk6FzqANIBDG0OcnD+qqkWANDRDGxtW1lYtcC00NIAbG0NRyFFn/2cnYCcYChgfDR8LBQsQKBAVNBUIEwgLGONaAAACMUlEQVRogWNgYGRiJgBYWFG4bOwchHSMAmZmTi7y9XLzUM8dgxfw8g20C3AABmZ+AUJqWFlQ+YJCtHLNcAJcnOTr5eGmnjsGL+DjHWgX4AAMzMIioviViIlLoApISknTzkHDBcjIypGtV15BkYouGaxASVlloJ2AAzAwq6qp41eioYkmoKWtQzP3DBugq0e+Xn0D6rlj8AJDo4F2AS7AwMxsbIJXhaqpGbqQuQXN3DNcgKWVNdl6bWztqOiSwQrsHRwH2gm4ADBTOIk741Ph4sqALuTm7kEzBw0T4OnlTbZeH18/KrpksAL/gMCBdgIuAErwQcH4VAjwY4qFhNLIOcMGhIWTrzciknruGLwgKnqgXYATgDJFTCweBXEi8ZiCCYm0cs8wAUnJKWTrTU1Lp6JLBivIyMwaaCfgBKBMkZ2Ti1tBXn4BpmBhUTHNXDQsQElpGdl6yysqqeiSwQqqqmsG2gk4Abi/UFuHW4GJMTbR+gbaOGe4gMYm8vU2t1DPHYMXtLYNtAtwA3CmaO/oxCXfJd6NTbint49WLhoOoF92Atl6J06aTEWXDFYwRXnqQDsBNwBnimnTZwDJzmlgoIrMYp45C6u22XPm0tGRQw7Mm0++3gULqeeOwQsWLaa5FUuWgsEy0lmQ4dblK4DEylVgsBqZxbxmLXYb162nuaeGMNiwkXy9mzZTzx2DF2zZSnMrtm0Hgx2ks5DmIHbuAoPdyKxRMAqGKtizFwz2kc4CABWMPghCMG1uAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.440;4.blob,1.1,760.iVBORw0KGgoAAAANSUhEUgAAAVsAAAANCAMAAAAwsT2BAAABCFBMVEUMDAX19WNKSh4AAAAdRx00fzQDBwM8kzwSLBKkpEKoqEQoYigpZSlGRhz29mMODgYMHgw+mD4HEAcRKhE8lDwDCAMDAwHm5l1jYygjViMucS4BAgE4ijgYOxiLizjBwU45jDkXOBciUyIvdC8tLRL+/mcfHw0SLRI7kjsLGwsIEwjQ0FR8fDIzfTMeSh5yci7Z2VgECQQRKREcRBw1gjUYGAr8/GY3NxYYPBg3iTcAAQAGDgY9lz0NIQ23t0qVlTwsbiwkWSRZWSTs7F8GBgIIFAgLGgsWNRY5jjkBBAEJCQTy8mJQUCAeSx4yfDICBQI7kTsTMBOcnD+qqkU0gDQbQxsmXiYpZintXti2AAAA7ElEQVRYhWNgYGRiHgUUAhZWFC4bOweIYmDm5BoQ5wwrwMqCyufmAZEMzLx8/APhnOEEBASFUAWERUSZQWErJi4xIA4aRkBSCk1AWkaWGRS2zHLyA+GeYQSkFRTRhZSUmcFhq6KqRnfnDCugrsGGLqQpqAUOW2ZtnQFw0DACPNyYYrp6kLDVN6C7c4YTMBQxwhQ0NoGEramZOd0dNIyAhaUVpqC1jS04bJnt7OntnuEElJWwiTo4QsLWydmFvs4ZTsBV0A2bsLuHJzhsvbx96Oue4QR8/bAK+wcEgsOWOSiYnq4ZXiAkFLt4WDgAiMtDZb6vrf0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.440;4.blob,1.1,652.iVBORw0KGgoAAAANSUhEUgAAAPYAAAAyCAMAAABYtdZYAAAAnFBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gCBgIBAwFRyFEnYCcQKBAIEwgICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzVHf0ObAAABCElEQVRoge3Zxw6DMBAEUKf33ivpvef//y3ChwhxQBt2wUSed2EujH1baa2USqUzSsvmVL7gS2TfFnIyrVgq62+2ovJVX/q9hZ4SolZXjaYvWaDVVp2uL4FFen3XINJmaorRcOQaR9pMTTGaTF2zSJupCWI1nyfnBtTE5yyWK7k23g2oScB6s3XEypg3oKWdngL9vTdZ4KCnwOjoTRY46SkwPXsTAAC4krMYCiP87RO3GPrJf98eAAAgvOD1zeUicYZMi6Tg9c31dn/wz5BpERW8aHq+3lf+GTItAAAAAJYy/wxsgvlnYCPMPwMDAMjhDDDO2sjsyokzwDhrI8MrJ84A46yNwv37AXYLJxxiwjGpAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.457;4.blob,1.1,3816.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.497;4.blob,1.1,1196.iVBORw0KGgoAAAANSUhEUgAAAqQAAAAPCAMAAAAF3C2fAAABpFBMVEUHAweTPJMsEiwAAAAeHkplZfkiIlQMDAX19WNKSh4eSkpl+fkiVFQFBQxjY/ViKGJlKWUgIE9cXOQJCRekpEKoqEQgT09c5OQJFxdCQqRERKgqESqUPJQIAwhGRhz29mMODgYcHEZjY/YGBg4GDgYCAQKKOIo7GDsDAwHm5l1jYygBAQNdXeYoKGMECwRf7F9h72EGEAZTIlN0L3SLizjBwU44OItOTsEDBwNX11dY21gbCxuYPpgTCBMtLRL+/mcfHw0SEi1nZ/4NDR99M31KHkrQ0FR8fDJUVNAyMnxEHESCNYJyci7Z2VguLnJYWNkOBg6XPZchDSEYGAr8/GY3NxYKChhmZvwWFjduLG5ZJFm3t0qVlTxKSrc8PJUICAM1FjWOOY4EAQRZWSTs7F8GBgIkJFlfX+wCAgY5jDln/2cDCAMHBwOOjjmPjzoKCgQFAgWRO5EwEzAJCQTy8mJQUCAEBAliYvIgIFA6kDpn/mcCBAIEBAKBgTSDgzVeJl5mKWacnD+qqkU/P5xFRapFrEVX2FcGDwZi82IsbiwiVCIAAQB1+tM8AAABl0lEQVRoge3Y5U/DQBjH8YMb7u4+HIa7DHd3H67DneEu/zTtCGFZ0ku77Pg1aT+vrmnu6ffF86qEeHjSXwYvb/r/fHz9AF+V4h8Q6HQKCjYw3jqedHwQGhL69xQWHgFoiIwCfFRSdEys0ykunvXW8aTjgtCExCRwQ3JKKriALS09A52gekYjx+GEZmZlc5wvR05uHriALb+gEJ2gdqai4hJ+0wmlpWX8xstTXoEuYKusQheoXXVNrYnfdGFJ6+ob+M2XpdHcBC5ga25pRSdomrCktK0dXdHRiS5g6+pGF2iauKQ9veiKvn50AdvAILpA08QlHRoeAVeMjo2DC9gmJqfQCVomLimdnkFnzM6hC9jmF9AFKif3F5TFonSycMO+pItLy0qvutnK6hq4gG19YxOdwN3W9o7Ld+X+grLu7u0rmyzesC/pweGR8i63Oj45BRewnZ1foBO4u7yyuXxX7i+o65tbq7LJ4g37ktK7e8VZbvbwiC5ge3pGF3D38ooukELQATqVeHv/QCdI0ZdU98P2+YVOkPINg8ykB7JgDh8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.953,3.516;4.blob,1.1,2176.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.780;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAh4eDE8PBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7ML5yjAAAAqUlEQVQoke3SVw7CQAxFURN6GyD0koQaOoTeO+x/SwgJIa4EEgvgffnYo5E/LPKKSxPE7fGy4fPTgWCIjXCEjioXHFNxPkjodDJFp8N0Jgvm8gW4qEqwYVpwuQJWa7F31s0GxnZTvqRFtjtgo9t7Vv3BY8mhIe92gho8Ggs8mcIz5cBzZcMLtYRXKgSvN1v+v0vR+pDebw6wHE8WrJ0vsFxv8kv+9/Xhvu6uLhPOluhdiAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492362772;4.copy,1.1,3.530,3.228,3.670,2.19,2.14,1.1,3.510,3.228;4.copy,1.1,2.10,3.304,4.1190,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.520,3.323,3.680,2.19,2.14,1.1,3.500,3.323;4.rect,1.1,3.151,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.221,2.16,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.553,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.269,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.345,3.335,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.350,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.345,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.364,2.18,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.459,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.578,2.15,2.45;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.668,2.13,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.492,3.202;4.blob,1.1,1128.iVBORw0KGgoAAAANSUhEUgAAAEsAAAA9CAMAAADS62QEAAABtlBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sCBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBIEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT4JBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC0tEhIQJxACBALU1Fb5ZWVPICDkXFwXCQn9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lZZyIsIAAABUUlEQVRYhWNgoBJgZKSWSQxMzCys1DKLjZ2DiVpmjYJRMApGwaADg7zs5eQCA25kFrmAhxcM+JBZ5AJ+ATAQRGaNgqEIhIRFqGiWKNXMEhMWp9wQCUkwJSWNLiEjK4fMlSdkkIKikrIKDjlVNXUNTShbS1tHF79JevoGhkbGOKVNTM3MLSyBDCtrG1s7e/xmOTg6OeNX4eLK68bA4O7h6YVfHQODt4+vnz8e+YBAnqDgEAaG0LDwiEhChkVFxyjHxuGQjE9ITEpOATNT09J1MwgZxsCQmZWNQyYnNy8fwSsoJGwWA0MRDvHiEmJ04wOUl9EIQHkZjQCjZfSgBRmlRCiSKIsmxqxSIrISA0N5RSVhRWlV1cSYRRSoqaWaUXX1DVQzq7GpmWpmtbRSzai29g6qmdXZpUU1s7p7qGZUbx/B+pZo0D+BakYxTCSq+iAKAADGizAwE8Hr+QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.212;4.blob,1.1,1688.iVBORw0KGgoAAAANSUhEUgAAADoAAABHCAMAAABh2aQFAAACalBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTHQssakAAACQklEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClq0AAAPb+OAibGcR8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.482,3.269;4.blob,1.1,1012.iVBORw0KGgoAAAANSUhEUgAAAVsAAAANCAMAAAAwsT2BAAABblBMVEUAAAAdR0c0f38DBwc8k5MSLCxHHR1/NDQoYmIpZWUMHh4+mJgHEBARKio8lJQDCAgeDAyYPj4QBwcjVlYucXEBAgI4iooYOztWIyNxLi4WNzdOwcFk9/de6ek7k5MFDAw5jIwXODgiU1MvdHQCAQGMOTk4FxcQJydj9vZKuLgdSEhg7u5JtbUSLS07kpIAAQECBQUBAwMLGxsIExMtEhKSOzsHAwNFqqpY2toCBARn//8aQUESLi4+mZkramozfX0eSkplKSliKChj9PQ1hIRf6+sECQkRKSkNHx8JFRUcREQ1goIJBASUPDwpEREsbGxU0dFBoKAYPDw3iYkGDg49l5cNISE8GBiJNzcBAABj9fU5jY0sbm4kWVl0Ly9TIiJGra0bREQIFBQLGhoWNTU5jo4BBAQUCAgaCwtKt7cmX19g7e0eS0syfHw7kZETMDBLHh58MjIXOjpPxMQ0gIAbQ0MmXl4pZmaANDRDGxtL6jm1AAABRElEQVRYhWNgAAJGJgbsgJmFFbsEGzsOHaMADTAx4pLh4MQuzs5GK7cMM8DFzYNLipePH5uwgKAQ7ZwzrICwCE4pUTFxbMISkjRzzHAAUtIysnLyIJaogiJuZUrKWARVVNVo5KphAdQ1NLU4tHVATF09ZhClbwAChigsBgYjbmNMzSamZvRz6dAD5haWwPaBlTWQyckBFrGxBQE7FBYQ2DtganZ0opczhyRwdgGRrgoMDG587mARNw8Q8ERhAYGXN4ZeH18/ejlzKAI3K38QFRDIwBAUrI9PZUhoGLpQeEQkrdw1LEAUJN1GMzAoK+FXGROLLhIXTxs3DReQAClvExmSuJPxq0xJTUMVSBfMoJ27hgNwl8lkzMrWZGDIySWg0iAvH1WgoJBmrhomoKhYxjU0hIGhpJSQyrJyVH5FJa3cNMwAAHENKWmTgVHVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.162,3.286;4.blob,1.1,1264.iVBORw0KGgoAAAANSUhEUgAAAXkAAAASCAMAAACJmV4iAAAB2lBMVEUAAAAOBg4HAwcyFDJ8MnwJBAl3MDDUVlZhJ2FpK2kNBQ2TPJMsEiwyFBT9ZmYbCwteJl5xLnGQOjq8TExtLG03NzfBwcH39/fp6emTk5MMDAwrEiuZPpksEhJtLCwEAgLpXl5eJiYCAQI3Fjd+M354MXgnJyf29va4uLhISEhiYmLu7u61tbUIAwg0FTQDAQEFAgIBAAACAQE3FhZ+MzOZPj54MTFLHh70Y2MLBAQFAgVBGkGGNoaVPJViKGIiDiKqqqra2toEBARHR0f///9BQUGLOItMH0xiKChBGhqGNjaVPDwiDg6pRESjQkJkKWSXPZdNH00LBQv09PSEhITr6+uMjIyBNIFZJFkUCAgfDQ0KBARkKSmXPT1NHx8LBQUPBgb3ZGRFHBwwEzCDNYORO5EcCxwJCQlsbGzR0dGgoKB/M38wExODNTWROztZJCQcCwtkKCjkXFwBAAF6MXp3MHf19fWNjY2FNoVSIVJ6MTHCTk6KODgoEChwLXCSO5Ktra1ERESVPZUoEBBwLS2SOzshDQ3+Z2cbCxspKSm3t7dfX1/t7e0aCxodDB19MjLOU1M6OjrExMSXl5cODg5DG0OKOIrWVlZ6MnpLHkuJOIkZChkpESktEi2RxkqzAAABlElEQVRYhWNgGAVUAoxMA+2CkQqYWVhJ1sPGTgOHjDzAwUmyFnY2Grhj5AEubh4SdfDy8dPEJSMOCAiSqEFImCbuGO6ARwREioqJS0hKQUSkZRiJ1CsrByLlFRRp4rJhDZSUVWRUgbSauoamlrYORFBXRg+Xen0DMDAEsY2MTUzNQAxzC0s6OHVYAStrG1s7exDLwdGJgcHZxRUi7uaOS4eHKRjwMjAYeHp5e/iABX396ODW4QX8AwKDIKzgEBAZGgbhhUfg0hEZBQbRDAwxsXHxELGExCTaOnMYguSU1Ig0ECPdJQNEZWZBxLMFcOlAlDY5uXn5BWCxwiIjmrt02IFi5hKZUmUgowyS5sshwhWVuDQgShsGQ94qUzZjIKO6hg4uHYagtq4eSDZAyvlGsJBSkzUu1YjSBgSaW1oZGNraZenhzuEIOoC4U7zLubtHAyLQK9NHrF5gD6p/Ao3cNULAxEnioZOnQNhTpxWToHN6C00cNCLBjJkD7YIRCpJn6Q60E0YmmD1tzkA7YYSC2rkkKQcAwLVCyqadtkkAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.303,3.326;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAMMAAAANCAMAAAAjQypcAAAAflBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjcGDg5KSrc8PJUECwtf7Oxh7+8GEBAkJFlfX+wCAgYDBwdX19dY29sEBAliYvIgIFA/P5xFRaq7G+foAAAAZUlEQVRIidXOtRHAABADwTczMzP136DdgwKNN7j4RH5MUTX2Ak432Ac407LZCzDH9dgLOD9gH+DCKGYv4JKUfYDLcvYBriirr3XN/oA0rUjXDyP7AzHNi6zb3rE/EMd5sRdw9/MCTb8DkeedwmQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.345;4.blob,1.1,5312.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.364;4.blob,1.1,2540.iVBORw0KGgoAAAANSUhEUgAAAEQAAABZCAIAAAAIORWgAAAABmJLR0QA/wD/AP+gvaeTAAAHJElEQVR4nO2aW0wTWRjHT6ft0HIpC/QCAYvIRVFY1FI6mPqAonVxY9B4WZGWBHB50GSNMfFpYzQ+rIk+4Up8tN4iK4EXkYQY4yVQcA0V3QhV0ZhSKW2xwU4rtHT2oW6pLU7ncsxotr/MQ/udnu/8/+2ZzjnzDQDw0OmWnThRCTEhXRCIuTBMYTLZISakCzQzSmVqTk7y0NA0rIQMgGYGwxTj4263ew5WQgbAMYMgvKoq+eAgl3MMwDKzZk0GiiIjI04o2RgDxwyGKcxm19zcApRsjIFgRiwWVFRkcT7HABQzKpUUx/1jY+/Zp2IJBDMYphgedhAE+0xsYWtGKhUVFaV/C3MMsDej0citVo/NhkNRwxK2ZtRq7i8vCRIkSPC/RrdMd6LyBJRUSfykdm17WWYZ+1THj6999mwvoHudwRSYyW5iPzwAYG5hbsQ5Uq2oZp9Kry+5fNkCaJlRpipzknOGpofYDx/CZDdVZFWI+CI2Sdavl5aW/nDlygtAywymwMbd4+45N5uxIxlzj3kDXpVMxSaJwVBy965tchIH1M0gPKRKXjVoH2QzcBRBIjg0PcRmpgkEyP79RUajJfSWqpk1GWtQBB1xjkQGeYAnRISRB5/Hp9gawmQ3FaUXZYmymJnR6fJSUoRdXROfvFHshikws8s8t/DZzZfyzPJDZYciI09cTy78c4FKa4hJfHISn9TINb1ve2nZCGEwlHR3v8bxAI0+YoH4vPZ8aUZpbDw/LT/ykIllFFvD1ObVnlKfYuAkPR31+Vq3bMmj102brT2jOcMDPAZDxkWCSjo2dhSkFdDt2Nq6ymptRJBFVZTOGUyBDTuGCfBVdsaz87PP3z/HFBjdjgZDybVrL4PBRVXxzUhF0qL0Irj/Y1EMTg+qZWoBj+oJDAAoKEjTanPC/2Mh4pvRyDVWj9WG22hrpIzZaeYjfFpLm8bGYrPZ+ezZTGQwvhm1XP1VfxYAgD/of+x4XCWvot4l8vKSIEEChkQvluiSnJxNEEQw6IeihiVsbwJmZ2vr6x+iaDoUNdxTU2PU6bq5VgEJkUjW0oIvW/YT10JYnzMAgEDAK5GsUCq3WyxG9tnYEH3O1NUpe3vrIiMajebevXs+n89ut7e3t6empsZmmZi4mZu7SSxWfEWlXyZas0CAHDhQPDq6hyDaTKad4fjKlSu9Xm9fX9+2bduam5tnZmZu3boVmw5FJW1tRGHhXlj6hEJEJOJHHZGr/aU1i8WCw4fLXr9u+Pix9fLlTdXVn327nZ2dFotFIPi0ntXpdARB1NTUxA5vMEypVHBuqQEArlzZRBBtUcfu3StCrV/UfP36Zr//4MmTlVlZS9zy8Xg8p0+fjow4HI6zZ8/GfnLfvuda7Z+wzBQUpFVWyqKOjIwkcs2CGzdeqVSyI0fKpVLRxYvPR0dd4TaxWJySkjI1NRXZwWazSaXS2OGDwQCf3R2wSKxW/N07b1Rwfj4YekGiGSAIb/fuFY8e7SKItoGB+sbG4nATjuOxv8y5c+dih29omNBo/oBlhnyakWv+xObNuf39P3/40ByOdHV1xZ4ztbW1UR15PP7Bg3NlZYdhmSGfZuSaP6O8PDP8urS01Ofz3b59W6fTNTU1uVyuvr6+2C6ZmWVtbYRUug6SF9pEaiZjw4YNDx8+9Pl8Doejo6NDIpEsles3vd7G48F8eo0zdu36e/3637lWAYPly+sbGydRdIlf7DsjI6NUr7fl5W3hWggMcnM3KZXbuVaRIME3A8SaMDm06tipqUIcb6mrU0bF41zmINaEyaFVx/Z4/N3drw2Gkqh4/Gs2lJowOQzq2EajZceOfIkEjQzGNwOlJkwOgzr2nTuTbvf8nj0rIoPxzbCvCZPDrI69sEBcvfoiaqZRWhqyrAmTs2QdmwpGo2Xjxpz8/LRwhJKZcE2Y7nhUWLKOTYWnT2dGR116/eK2jOqifdA+yKDsGBexQFyRVcG4mGU0WvT6xZlG1czw9LBMJGNQEyZHJVXhfnzs/Riz7teuvSwslGg08tBbqmYY14TJYVnHnpry9vdbw38DNPaGDGrC5ECpYxuNln37ClEUAbTMxNaEBTxB1NMxQkSI/Ld5Jm8FkOrYPT1vUJQfWtrQ+JrDNWGzyxyKHFt7LPYsujR+acA+ELcVAKCWqx+8e8DMQxifL9DZ+aqhobin5w2rJ0iyk7OT+NG3f5wfnbgfj9uaIEGCBN8OX9q+cgWrAu38fHD16ox166Q3b07AEsQlW7fmeb0tUdvX7xU+n2ez6VtaVnEtBAD2j5ssuX39jikvzwwG2yK3r1wB4QmN6Wnfzp0FQiFy//479tm45+jRH8fHf+FaBSSys5MDgV/D21eugDDNAAAej7+6WqFUpvb2voWSkGP27y9yOptC29fvHrFYMDvbXF+/nEMNcKYZACAQCBYWSior5X/9xdnS5l9BAuok/Tbi4AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.562,3.421;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAAecAAAAOCAMAAAAi7ySYAAABJlBMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8eDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxBWIyNxLi46kDpMvEwjI1YuLnECAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgtEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwdlKSliKChEqURCo0IpKWUoKGIJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESk8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAF0Ly9TIiJOwk44ijgvL3QiIlMUCAgaCwsNIQ1n/mcSLBIICBQLCxpLHh58MjIyfTJTzlMeHksyMnwCBgIDCAMBAwGANDRDGxtW1lYtcC00NIAbG0NRyFFn/2cnYCcQKBAVNBUIEwhxM2wnAAABB0lEQVRYhe3O6VaBARDG8deaSnZJspNos1bKTqUQUdoX938TnPcKhnMeM87x+zSf/vMoyoxGq4Do9KiyJAYj9wIarQZV1utQZUmMBu4FJBumTVB5a9sMKkuyY7FyTyCx2VFlhxNVlsTl5l5AsuvZA5W9+z5QWZIDf4B7AkkwFAaVI9EYqCxJ/DDBPYHkKIkqp45RZUlOTrkXkJydp0HlTDYHKkuSL1xwTyC5vCqCytc3JVBZknKlyj2BpFZHlRtNVFmS1i33ApI70z2o3H54BJUl6Vi63BNIek+ocn+AKkvyPFzis9GL6nWBa/yGGvX+gSpL8vm1xGffP6rfRa611fH3r5rMf00B5XxCur8TlhcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.552,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.981,3.440;4.blob,1.1,2348.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.457;4.blob,1.1,4612.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAAOsAAABxCAMAAAADKaTCAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACtklEQVR4nO2a2VJTYRCE2VQgclB2VBaXREHZFJcICMr7v5PJSeSCnCrmn2l7UtDfA3T3ddc3MZHO5FT2Ah7TM4+yJ/B4/CR7AY/ZufnsCTxaT7MX8FioJrMn0FisnmVP4PF8KXsBj+WV7AU8VlvZC3isrWcvoLGx+SJ7Ao2X1avsCTS2tneyJ9DYfZ29gMabt4vZE1i8225nT6DReZ+94H5T8oV8gDRiUjwdBV/I3j5iBibF12H+QtofPwFmYFKcHdYvZONgCzADk+LuMH4hh3OIlxOT4u4wfiFHx4gdmBR3h/ELOfmM2IFJ8XeYvpAv1SFgBiYl0GH6Qk6rDmAHJiXQYfpCvlbfADswKYEO0xfyvULc9JgUf4ftC/nR/QnYgUnxdxi/kDPIw4lJcXcYv5ClA8QOTIq7w/iFnHcvADswKd4O8xfy6xLxhWFSfB32L2Tq6jdgBybF11Hwhfy5RgzBpOR3jC3eLwRjsDA8mJsO9xeCMVgYHsy/jsAXgjFYGB7MoCPyhWAMFoYHM+gIfSEYg4XhwdQdoS8EY7AwPJi6I/SFYAwWhgfT7wh+IRiDheHB9DqCXwjGYGF4ML2O4BeCMVgYHkyvI/iFYAwWhgfT64h9IRiDheHB1B2hLwRjsDA8mLoj9IVgDBaGB1N3hL4QjMHC8GAGHYEvBGOwMDyYYYf/C8EYLAwP5qbD/VNgDBaGB/OQXRt5MI3IgylEHgwUeTA18mBGkAdTiDwYLPJghsiDuYU8mGLkwWCRB9NHHkwD8mCKkQfzn5EHczfyYJJSLB3yYIzIg8lJMXTIg7EiDyYn5c4OeTBm5MGkpBg65MEYkQeTk2LpkAdjQR5MTkp+x7giD6YReTCFyIOBIg+mRh7MCPJgCpEHg0UezBB5MLeQB1OMPBgs8mD6yINpQB5MMWwP5i/5IHRh9HW7CQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.723;4.blob,1.1,1468.iVBORw0KGgoAAAANSUhEUgAAAGsAAABxCAMAAADlLK3DAAABCFBMVEUAAAAGDgYDBwMUMhQyfDIECQQxMTEYGBgnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBUCAgIBAQE4izgfTB8SEhI+Pj4rKys0gTQkWSQEBAQNDQ0JCQkzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAXFxcyejIeSx4KCgoFBQUTMBM4iTgKGQoRKREQKBASLRIJFgk0NDQREREcRhwwdjA6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0oKCgUFBQFCwUICAgJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCADAwMFDAUeSR5eLJNzAAAC/0lEQVRoge2Za1PTQBSGAwiCCAQoUBUQC3IVRBDxBqggotSCcvv//wTbbLLr7J6es5tzlmGm75fupE2fmZ1M3pMnSRIhXd0xKFl6HvQGn9v30POE/oF4rEeDj6OxkqHheKyRtCsaazQdE2CNN1OxDk9M8rOmqs08sY4/fcbPmp5pZtY6/nyInwVl7kU0Vm1+IRrrZbrIxaqMA5dfnqXlFS5WX+vqq66CZ6y9CkTZrPXW1TezAZ3wenOUjYXkzfJWKMo722+joVrXjjxkJ/t4V63uSqPef8g+13eDWdRrY+vjJ7X6LM2q7S3lS3HW/mAxq4mzDr4Uy9IsdRcEf/b1Gx/rMLsLHv33nb4Jf0/3+VjH2V1w2vzKmAF+pNt8LNceGjPASfqTj+XcQ51fqR52RfbQyGn9Nx8LS0PPaeKsyb14rLP6uVpVjsXvvX/+qommRKdQWd0Xl9ni3zxyFcgi5/pGmtA2O8L/b3iAvKnFoj2Abmpqgj2A0dRirNwDGE0txso9gNHUcizlAYymDmZh04DyAGZTB7OQJkuUBzCbOpiFNFmiPIDZ1MEsdA8zD2A2dTAL38OWBzCbOpiF7qHyAA1/oxLsAYymZmABRkB5AN3UHCzACOQeoGhqDpbbCBQeoGhqDpYzhgcQb+q79QASxh7yAGWMPRDYA5CNPYMHIBt7Dg9ANfYcHoBq7Dk8ANXYs3gAorGnPcMiHoBo7GnPsIgHIBp72h4iHoBo7Dk8ANXYc3gAqrHn8ABUY8/hAajGnsEDkI19eQ9AN/blPYBAU3c8AFs6HoCBdV89gA7QaeU9gONRC+q0sh7A9e4f6rSyHsD17h+aC/g8gA60h3weQAfYw3vvAYCIeAAgIh7AnY4HEIigB7Ai6AHsCHoAK4IewI6cB7Aj5wHseHoALO2nCz8PgASZLvw8ABJkuvDzAEiQ6cLPAyBpP114egAk7acLOQ9gx9MDaO/vWunpwvl+wNMDaO/vWunpwvV+wNcDaO/vWiXFdOF4PyDoAayIe4BbUg6KCabExccAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492362878;4.copy,1.1,3.190,3.228,4.1010,2.19,2.14,1.1,3.180,3.228;4.copy,1.1,3.190,3.285,4.1010,2.19,2.14,1.1,3.170,3.285;4.copy,1.1,3.330,3.304,3.870,2.19,2.14,1.1,3.310,3.304;4.copy,1.1,3.500,3.323,3.700,2.19,2.14,1.1,3.490,3.323;4.copy,1.1,3.930,3.361,3.270,2.19,2.14,1.1,3.920,3.361;4.copy,1.1,3.940,3.380,3.260,2.38,2.14,1.1,3.930,3.380;4.copy,1.1,3.930,3.399,2.10,2.19,2.14,1.1,3.920,3.399;4.copy,1.1,4.1120,3.475,2.80,2.19,2.14,1.1,4.1090,3.475;4.rect,1.1,3.563,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.250,1.6,2.32;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.478,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.433,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.535,2.27,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.578,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.639,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.649,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.649,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.668,2.14,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.521,3.183;4.blob,1.1,256.iVBORw0KGgoAAAANSUhEUgAAAC4AAAArCAMAAAAwqkq2AAAANlBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sCBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwjFSUnhAAAARElEQVQ4jWNgIB4wMpKgmIGJmYWVBOVs7BxMpBg/CkbBcACjmWoUjILhBzi5wIAbmYUH8PCCAR8yCw/gFwADQWQWbgAAhm4Cv3YFdtEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.472,3.250;4.blob,1.1,640.iVBORw0KGgoAAAANSUhEUgAAAWUAAAANCAMAAABGi48KAAAA5FBMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwWNzdOwcFk9/de6ek7k5MFDAwEBALp6V5eXiYQJydj9vZKuLgdSEgoYmJg7u5JtbVLSx709GMLCwRFqqpY2toCBAQdR0dn//8aQUGpqUSjo0Jj9PQ1hIRf6+s5jIwPDwb392RFRRwECQksbGxU0dFBoKBkZCjk5FwCAgFj9fU5jY3Cwk6KijhGra0bREQhIQ3+/mcsLBIRKSlKt7cmX19g7e19fTLOzlMXOjpPxMQ9l5cGDg7W1lZwcC3G796MAAAAt0lEQVRYhe3URRKDQBCF4QdxJx7iAjHi7u65/30C4QQsUl3V5FvM9KIX/2JqAJ0gwgqH02Vp/+9LFKztuz3e34Rw5vMHqBNsIBiiLmArHJGisbgxJZIp6hiu0hk5m8sXjLFYKhPHsFWp1gBFretjo0kdw1arbZxaB+j2+tQxXA3UoXGNxsBkOqOuYWtuvuUFsFxRt/C1Nv/lDba7PXULXwfpqJzOMnC5UqdwdrtL2uMJvN7UJTbwAf1EDLaBHaUqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.462,3.269;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAADgAAAANCAMAAADL710yAAABDlBMVEUAAAAdR0c0f38DBwc8k5MSLCxHHR1/NDQoYmIpZWUMHh4+mJgHEBARKio8lJQDCAgeDAyYPj4QBwcjVlYucXEBAgI4iooYOztWIyNxLi45jIwXODgiU1MvdHQCAQGMOTk4FxcSLS07kpIAAQECBQUBAwMLGxsIExMtEhKSOzsHAwMSLi4+mZkramozfX0eSkplKSliKCgECQkRKSkNHx8JFRUcREQ1goIJBASUPDwpEREYPDw3iYkGDg49l5cNISE8GBiJNzcBAAAsbm4kWVl0Ly9TIiIIFBQLGhoWNTU5jo4BBAQUCAgaCwseS0syfHw7kZETMDBLHh58MjI0gIAbQ0MmXl4pZmaANDRDGxuQgjh0AAAA1ElEQVQokYWPxXYCQRBFCx1gcAkOCQ7B3SUElyDB/v9HmOpdM93DW9Sten3uogGkqNTAjkarYz/oBQK1iiOCwcjuBT1Ok2jmiRarjVXbHU6Ey83zwPPhZdU+P3kMBLkihMKMMhL9RHzFNIh4ApOkNoCUmJaLmWwOYTSQ6zuPKVCblGJJLpYrOKvWGrmqdUyD2qQ0WzKv3ekiev04/4sAg+HotRpPfhDhkJIHMP19bWZznAtxqSyu1hu62Dp2iP2fsgeJw5EuTmeC/8sbEa43+r4/cD4BGskWcfgTV+cAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.303,3.316;4.blob,1.1,524.iVBORw0KGgoAAAANSUhEUgAAAK8AAAAXCAMAAABK1e9fAAAAqFBMVEUAAAAGDg4sbm4kWVkECwtf7Oxh7+8GEBAWNTU5jo4BBAQDBwdX19dY29sCBQU7kZETMDAmXl4pZmYxeHg+mZkKGBgNHx8FBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaoPCaM/AAAAmklEQVRIie3OSxeBQADF8UmDhCRC3vLIK4Xw/b+Zzqxazl3dFvNb3HPu7i+EZYl6a9jVJ5utNqtEj9NxK6/b60taihZv4Jfrego7RscwKGc0Vtgt2sKJws4wDKOGprOInYCZL9gFmOVqzU6AbLY7dgIm3rMLMIfjiZ2ASc7sAszlyi7A3O4pOwHzyNgFmPz5YidA3sWHnYD5/v5K3Qc67vZVigAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.345;4.blob,1.1,4992.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.542,3.421;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAiMAAAAOCAMAAADKWexCAAABJlBMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8eDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxBWIyNxLi46kDpMvEwjI1YuLnECAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgtEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwdlKSliKChEqURCo0IpKWUoKGIJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESk8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAF0Ly9TIiJOwk44ijgvL3QiIlMUCAgaCwsNIQ1n/mcSLBIICBQLCxpLHh58MjIyfTJTzlMeHksyMnwCBgIDCAMBAwGANDRDGxtW1lYtcC00NIAbG0NRyFFn/2cnYCcQKBAVNBUIEwhxM2wnAAABHElEQVRYhe3SSVtBcRiG8WMMRZMGkVASKSqZGkg0EmlEA9//S+Q61/nbv2fRvfFbvbv7XTyaNmaxagibnelSHE76Azm1DauF6dttTJfidNAfyBnbmHG5kbxndg7pUry+efoFMbWNhUWmv7TMdCn+FfoDOWMbq2vrSD6wEUS6lNBmmH5BTG1jKxJF+rHtHaRLie8m6BfE1Db2kkw/tc90KekD+gM5YxuHmSySPzo+QbqU3GmefkFMbaNQLCH98tk50qVcXFboF8TUNqpXTL92zXQp9Qb9gZyxjRvXLZK/u39AupRHX5N+QUxto/XE9Nsdpkt57iLZl1fdm5lrso33D+R37bPHdCn9AZL9+tb9mLmwbUz9q9+hbmTmUv4AWvZHgk0v5YgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.532,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.981,3.440;4.blob,1.1,6144.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.457;4.blob,1.1,4616.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.723;4.blob,1.1,604.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAs0lEQVQ4je3Stw7CMBSFYQOhJIRmQofQIXQIvYT6/u8EA0N+JCQ2Fp/t87UsXesI8UpAIMEQqIUjfkZjOsZG3IQTSb6WSoMZacBZacE5mYcLsgiXyhW+X63Rdoyulxs8aLbasNnp8kKvL36Jw73FYDjiwXhCT+NcRczm9EI6sCuXvLCy6fXH7psZvd2B0f0BPsoTrHv8mfMFvN5cP++ehrH1EF+i+oWofr2j+iVUv/z5f7+eewQhEEkL2uMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492362982;4.copy,1.1,3.190,3.209,4.1010,2.19,2.14,1.1,3.170,3.209;4.copy,1.1,3.190,3.266,4.1010,2.19,2.14,1.1,3.180,3.266;4.copy,1.1,3.320,3.285,3.880,2.19,2.14,1.1,3.310,3.285;4.copy,1.1,3.450,3.304,3.750,2.38,2.14,1.1,3.440,3.304;4.copy,1.1,2.10,3.323,3.440,2.19,2.14,1.1,1.0,3.323;4.rect,1.1,3.563,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.523,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.558,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.630,2.16,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.658,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.668,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.668,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.462,3.177;4.blob,1.1,1356.iVBORw0KGgoAAAANSUhEUgAAAE0AAABWCAMAAAC9xuvaAAACHFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4CBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwggICD///8bGxsTExMiIiIFBQVKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDEJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg6nQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwVQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsCAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzBDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjstEhIQJxACBAIbGwvU1Fb5ZWVPICDkXFwXCQn9/WaQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FzCwk6KijghIQ3+/md9fTLOzlPW1lZdDovvAAABmElEQVRYhe2UVU/EUBBGBxZ3d3d3d3d3d3d398Xd3V3/IFBItpB02yzzQnLPQ+83ncnJTZMOwB8QE+dJSEr9xUBDWkZWTl5BEcmmpKwCoKqmjmPT0Px8ammjyHTUdD8PPX0UGxh83c0Qx2b09d2McWwmPFNVM3NZHBmAhSVPy8oay0YgEAgEAoFAIBCEYGNLYUdPomPvQOFIT6Lj5EzhQk+E/46rmzuqzQPR5unmhaHx9qEOX7/fDf+AQHoZFMyqCgkNC49g6EVGRcfEfue4+ITEJBZXckpqWnoGYzszKzsnN+8j5BcUFhWXsN2stKy8QvhEZZVDNUBNbV09mwugobGpuUVIv7XNvr2jE6Cru6e3j13XPzAYPjTM0BwZHRufmKTi1PRMIj+e3Qezc/MMnYXFpWVBtbK6xsEGsM7wfmPzZ73FyfYTjE0uAGOTCyCb/F/A3+Yw5L0zwM22zecytbu3z2Vs+kCUf4KJwyNE2fHJKaLt7PwC0XZ5hSi7vrlFtN3dxyHaHh4RZU/PQYi2l1dEGbytIsreASP6UNRdxskeAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.820,3.234;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.303,3.297;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.641,3.345;4.blob,1.1,4688.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.532,3.421;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAAkEAAAAOCAMAAAAfSzgPAAABJlBMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8eDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxBWIyNxLi46kDpMvEwjI1YuLnECAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgtEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwdlKSliKChEqURCo0IpKWUoKGIJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESk8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAF0Ly9TIiJOwk44ijgvL3QiIlMUCAgaCwsNIQ1n/mcSLBIICBQLCxpLHh58MjIyfTJTzlMeHksyMnwCBgIDCAMBAwGANDRDGxtW1lYtcC00NIAbG0NRyFFn/2cnYCcQKBAVNBUIEwhxM2wnAAABCElEQVRYhe3OxVqCYRBA4Y/Gwm5FaewODDBARMDu9v5vQp9/PRtmMccF7+osj3N/fH73DwWC9IGtUJg+0PP76ANJMEAf2AqH6AO1SLSDXhB0dnXTC6Z6Yr30glpfP30gGRikD2wNDdMHaiOjY/SCYHxikl4wNTUdpxfUZmYT9IIgmUrTC6Yy2Ry9oJafow8k8wv0ga3FJfpAbXlllV4QrK1v0AumNre26QW1nd0CvSDY2z+gF0wdFkv0gtrRMX0gOTmlD2yVK/SB2lm0Si8IzmsX9IKpeqxBL6g1L+kDydU1fWDr5hYeuLv3PCjq8Ql+Fz2/0Ae2Xt/ggfcPz6em2tqc+/r2/LRevy/HQrqMb2l2AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.522,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1030,3.440;4.blob,1.1,2312.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.457;4.blob,1.1,4616.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;3.end,1.1;4.sync,10.6492363080;4.copy,1.1,3.330,3.266,3.870,2.57,2.14,1.1,3.310,3.266;4.copy,1.1,3.310,3.285,2.20,2.38,2.14,1.1,3.290,3.285;4.copy,1.1,2.20,3.304,3.290,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.470,3.323,3.730,2.19,2.14,1.1,3.460,3.323;4.rect,1.1,3.520,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.234,3.298,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.503,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.432,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.440,1.5,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.487,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.733,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.601,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.639,1.5,2.44;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.620,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.630,2.17,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.668,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.141,3.212;4.blob,1.1,1540.iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAACalBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTHQssakAAAB0klEQVRIiWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5ix2cQBzpHd6vb5l7gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.215;4.blob,1.1,472.iVBORw0KGgoAAAANSUhEUgAAAVIAAAALCAMAAAAa/fVWAAAAk1BMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0CBgIDCAMBAwEXOjpPxMQ9l5cGDg5RyFFn/2cnYCcQKBAVNBUIEwhtyTO8AAAAiUlEQVRIie3UyQ6CMBSF4QtFJsciFBUcGVSU4f2fjrRsuhaTm9z0W7Rn+S+aAhj/YtnMWbjYFZR4fhAuV2vsDEo22x0Aj/bYHYTEiTxFit1BxyE6yuuUYYcQkk+v9IzdQchl+kuv2B2E3NidP4oAoKyUWl/GT54vJt4NwOertPoyZul6ZdCXMccIJ+gLzhQVNQcAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.162,3.231;4.blob,1.1,1244.iVBORw0KGgoAAAANSUhEUgAAAW8AAAAOCAMAAADXPW1tAAAB9VBMVEUAAAAdHUc0NH8DAwc8PJMSEiwgICD///8bGxsoKGIpKWUTExMMDB4+PpgHBxARESo8PJQDAwgiIiIFBQUjI1YuLnEBAQI4OIoYGDtKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSw5OYwXFzgiIlMvL3QEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDESEi07O5ILCxsICBMJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg4zM30eHkqnQ0P7ZWWBNDQTCAgTLhNKt0pn/2cdSB1kZCmXlz1NTR8LCwUEBAkRESkcHEQ1NYJQICDaWFjxYWGVPDwuExMFDAUoZChRyFFl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsYGDw3N4kAAAEGBg49PZcNDSECAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzAsLG4kJFlDGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjsICBQLCxoWFjU5OY4BAQQtEhIQJxACBAIbGwseHksyMnwCAgU7O5ETEzACBgIDCAMBAwE0NIAbG0MmJl4pKWYnYCcQKBAVNBUIEwhJwhNzAAABaUlEQVRYhWNgAAJGJgZkwMzCyjAKSAds7BzEKWRiROVzclHfMSMAsLFzE6WOh5cPVYBfQJAGzhn2QIhdmCh1IqJoAmLiEtR3zTAGklJgSloGXUJWTh6Zq6AIIsWUlNHVqajSyGXDEKipa2hq4ZDT1tHV04eyDQyNjE1ADFMzZnR15rwWtHLeMAOWVtY2tnY4pe0dHJ2cXYAMVzd3D08vsBgXJ6Y6bx8auW+4AV8//wD8KgKDgkMYGELDwiMg/EiBKExF0THUd9qwBLFx8QmJeOSTklNS09IZGDIys7JzwCK5efmYygoKi2jjvmEHiktKNcvKcUhWVFZV19SCmXX1DcaNhkCGqgo2lU3NNHLfMAQtrW04ZNo7OrsQvO6eXgaGPt5+bConTJxEA5cNVzAZh/iUqaj8aQwM02dgVTlz1mzqOmkEgTlzwWAeVsn5C7BrWriIdg4a5iAlGAwWD7Q7RgpYshQMlmGTAwC5QkAJQUUq9gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.442,3.250;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAADcAAAANCAMAAAA65Aa/AAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAAVElEQVQokZ3LxxGAMBQDUdnkaHLO0H+NwEADX3uRLg94UhqSLNv5jlYiB9fz3wnCSOb+4oRiqckolxcl5aqaYk3bUa4fRspNM8WWdaPcflAM50WxGx79Ap7c3b50AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.269;4.blob,1.1,920.iVBORw0KGgoAAAANSUhEUgAAAJIAAAAgCAMAAADOp9HCAAABKVBMVEUDAwc8PJMSEiwAAAAdHUc0NH8oKGIpKWURESo8PJQDAwgMDB4+PpgHBxABAQI4OIoYGDsjI1YuLnEiIlMvL3Q5OYwXFzgLCxsICBMSEi07O5IzM30eHkocHEQ1NYIEBAkRESkGBg49PZcNDSEYGDw3N4kAAAEsLG4kJFkGDg4WFjU5OY4BAQQICBQLCxoECwtf7Oxh7+8GEBACAgU7O5ETEzAeHksyMnwDBwdX19dY29smJl4pKWYxMXg+PpkXFzo0NIAbG0MKChgNDR8FBQt3MDDUVlYyFBT9ZmYbCwuQOjq8TEwEAgLpXl5eJiZLHh70Y2MLBASpRESjQkIPBgb3ZGRFHBxkKCjkXFwCAQHCTk6KODghDQ3+Z2csEhJ9MjLOU1PWVlZwLS31AsG9AAABRElEQVRYhe3Ux1LDMBCAYcGmEDCmJPTeCQQChN5bQu+9l/d/CGTZZlaymMmF3Uv+g8aze/B3sCVEVTVYi8Xt839PQCJp38RjtJLfBNSkam2LOqee2hIkwG1otC2amqkpYQIgnbHM3ZZWckuQJLU57dF5R6egx/h5L+7qjs6TCXJKmEfq6Y2M+1L99JYgjzQwOGSOh0dGySlh6osZGzfHmTQ9RZXN+qSJyZy+mHKmOTwA+ZnZOUUqzC/IM1dQufJxcYlHBMsrq3n/V19bl8fGpmpLPm7vMJG80O2zu6fa58P4sV2If1chlVOFVE4mqVhiYeBMUqnIwsAZpIPDIx4HyiAdn/AwcDrp9OycyYHSSReXV0wOlE66vmFi4DTS7d09lwOlkR4en7gcKI30/MLFwGHS69s7mwOFSR+fbAwcJn19szFwP3HhTWj7W1MyAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.345;4.blob,1.1,4948.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.522,3.421;4.blob,1.1,1060.iVBORw0KGgoAAAANSUhEUgAAAmkAAAAOCAMAAABDwXsrAAABg1BMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8HAwOTPDwsEhJiKChlKSkeDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxAqERGUPDwIAwNWIyNxLi46kDpMvEwjI1YuLnECAQGKODg7GBiMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzhTIiJ0Ly8tEhKSOzseSx5j9GMECwQSEi07O5IDAwcbCwsTCAhEqURCo0IpKWUoKGJ9MzNKHh4JBAQpEREGDwZk92QcRRwEBAk8PJQRESlEHByCNTU8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAEOBgaXPT0hDQ1Owk44ijgvL3QiIlNuLCxZJCQUCAgaCwsNIQ1n/mcSLBIICBQLCxo1FhaOOTkEAQFLHh58MjIyfTJTzlMeHksyMnwFAgKROzswExMCBgIDCAMBAwGANDRDGxtW1lYtcC00NIAbG0NeJiZmKSl4MTGZPj46FxdRyFFn/2cnYCcYCgofDQ0LBQUQKBAVNBUIEwiwJK7sAAABU0lEQVRoge3P1U4DURSF4VOHlsEKxYtLi7u7u7sVLe7uj85kXoC0WXtWSPpdTM7Vv/YopbNY1T9hs7MvYHE4TZ90xcWjk1YLuijFbmNfwOJ0mL/p9oCDCVoiuCglKTmFfQJJqjfN/NF0XwY2mJmF7cnJzmFfwJKbRxj15xdge4VF0J6c4pJS9gkkZeUVjNlAEJqrrHJBe3Kqa2rZJ5DU1TcwZhu1JmTO40bWJDW3sC9gaW3j7LZ3AGOdvi5gTVJ3Ty/7BJK+/gHO8OAQMDY8MgqsSRobn2CfQDI5Nc0Znpmdw8WCAVxL1vwC+wKWxSXW8vIKLLWqrcFastY3NtknkGx5t1nTO7shVGpvH1WSdnDIvoDl6Jg2HT451b+hsMGv1Nm54SKK1+UV7S8idH3DvoDl9o63ff+gfx6fDM9Kvbwa3qJ5xcT85f3D8KnU17fhJ/LXL3AZZy+R5l7sAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.512,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.440;4.blob,1.1,844.iVBORw0KGgoAAAANSUhEUgAAAHUAAACRCAMAAADKDwcaAAAArlBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw4GDgYECwRf7F9h72EGEAYDBwNX11dY21gICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzU5jDk6kDpn/mcCBAJFrEVX2FcAAQANIA0LGwsIEwgOIg5k92TvVG+fAAABhElEQVR4nO3aW08CMRCG4SqCZ8ETuiKgqOBZUfHw//+YWYhiduNktu22iO9z1WSTfjcOGWdqjFlYrJixpaqpLWdOat+3aE8rq2uTrHVT28ic9L5u0Z8mNrdMvZE5lW97x+zuZU7/yH4zdRA49TBJHQVObR2n2oFTZ0CnEyG0e3LaC596dn7RDZ8KwM20Hwkq24UA+AvkrqbfLyVU7moGl1fXZaTKXc3N7d2gjFQAUOP/TMAGlQMAcfE7DNjQVk5uLnOfNK1DtZWTn8s8PA6tU7WVk5/LPD1bh9prVesRUoeVlwipmHtzuyfy03sUvMVP71H0Fj+9Bx0MxuS/eW1FeK0cbUX4rRxtRVA5QFhy3yJ/HSWvtrFy3yJ+HSVvtqkO3pPQr1FT7Y8IocDvtF2N15mltqvxO7PUdjX0LQAiYTsEhGb/ktdhteTwktdhteTwkpfVEqAmT1SmX/1um+SJyo+vXrdN8kSlrHmLPFFh3oKZ5bJPsn4H47JPsn8H47JPKvQO5hOwuyuc/lXXBQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.457;4.blob,1.1,4632.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1033,3.592;4.blob,1.1,1620.iVBORw0KGgoAAAANSUhEUgAAAKUAAABGCAMAAACaJaTEAAAB2lBMVEU+Pj4CAgIAAAANIA1n/2cLGwsPDw85OTknJycIEwg3NzcgICAGDgYOIg4CBQIECwRf7F9h72EGEAYOIw5k92QBAAADBwNX11dY21gCAQGUPDz1Y2PlXFxpKiqQOjoYCgpaJCTiW1tKHh54MDD2Y2OnQ0MgDQ1XIyPyYmILBARmKSlgJycvExPWVlb/Z2f7ZWUnEBAQBgYxMTEYGBgICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzUBAQCGhjZLSx6TkzwsLBIpKRGZmT6FhTZiYihlZSlkZCltbSyXlz0oKBAqKhGUlDyVlTwrKxFraytjYygCAgGKijg7OxiIiDcvLxNTUyJ0dC9QUCGLizhAQBobGwuYmD4TEwgSEgc0NBV9fTNKSh5ERByCgjUODgYhIQ1ubixZWSQ1NRYEBAEFBQKRkTswMBMCBgIDCAMBAwFeXiZmZilRyFEnYCcQKBAVNBV3dzDU1FYXOBdi82IsbCxMvUxf619Is0gyMhT9/WYXOhdZ3VksbixDpkMLCwTs7F/v72EQEAaQkDq8vEwYOxhUz1Qtby0+mj7X11fb21jp6V709GOpqUSjo0IPDwb392RFRRxkZCjk5FzCwk7+/md9fTLOzlPW1lZwcC02Ar6bAAACn0lEQVRoge2ZZ1cTQRSGxyFEURRbRMHeFQsiQdAIKqgolqDYsAtiFxsgdo299+5/1TOYbZnZaXcz5Jx5vuQ9m5m7z4fN3b1ZhAgjsB5FsWLNCqGg+MhR8Xhct0xRrATChgXCo8eIrSwtDflybGwcQBUmwpZl4ydMZH87abLY6cKrMHEtE86xBG3hlPKpZQr1YapkLadVVE6f8e9z5iw36UtBkbWcPWfuvPkLFi5avMRNpt1cspZLqzBetnzFyipPGj74fj2J6lU5aVig14nk+4qBTiTfV7Q7EQdaD5HvK8qdqBCwlnBYSzisJRwI16yW3CI/PWjPG0qWstOD9ryhYCk8PWjsCKBgKTo96OwIoGBpAGsJh7WEI0pL0emhtpa3IkJL0ekhWbemnrMkQkvR6aFh7bokZ4m9LuEoFMtCwFrCUSCWqfWNJCSbNoAUjORtBdq4qTlFUstmkIKRvK1AW7a2biNpexv3diqC9vRAA+3YuWs3Sen2PRAFtacHGmhvqqNt6Ga/b38E9WFAB3D64CESOw8fMSzDBB3FuOPYUD5+wqwLG2+/PHnKkAQXr2VXa7cxj3B8957TPcp11N49BPeyks/yTN1ZxRMpvnsI7GUmn+W58xcUz5Q7PVy8RLjMS969zOR/2ui9omiZy9UY4RovCRHZM9H1G4QSXjJrCYq1hMNawsGy7OuXqTJwEw/eCiRIWJb9fTJVBm7jwTuBBInvaaPLiXfvdcpUuf8AP3wUSJB4LDOPnzzN5mfPpaq8eIlfvQ4kSDyWyTdvM/9jw7te8DPpQL8uG99nqMdNQbf88DHPGhyolp8+f8m3RzhUy6/f0vn2CAd5+o+TvrcbsmGB3P7jpO4fMH9swYHc/uOkn78MClGhXZe//+Rdg8Nf8yHPCQm2XdoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.668;4.blob,1.1,5948.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1088.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACHUlEQVRoge3YR1MCQRCGYVSUZFwxiwkDRhTFnP3//0m2Z1l2ptgpvrGp9tDPYeHS0Ld9qwsFQROSfz4wOSW9ASlOz0ivECuVK9IrkGptVnoFMjcvvYGxsCi9AVmKqtIrkOWoLr0CWYlWpVcga9G69ApkY3NLegVjuyG9gbFTlt7A2N3ck17B2D9oSq9AZg+PpFcwjk+kN8iB9xln0bX673+8z1iL7vTsnD7xPmMuuovL+In3GXfRXdXiVw3eZ+xF174uhPQZe9HdRK2QPmMvuk50G9BnYyi6u52APhtD0XUbAX02hqK7bwf02RiK7uExoM/4i6709BzSZ+xF9xK9hvQZe9FV3pohfcZedO8f8RPvM+ai+/zqxB94n/EW3fdb0XzB+4y16Oo/jD/GqAW/zfEJ2/C67PfZ6PAJS15dmj5D4BMZuXVp+gyBTwx46pL6DIJPpDx1SX0GwSdSnrqM+wyDT6R8ddnrMxA+kfDWZRd+o+MTCW9d9voMhE8kvHXZ6zMQPpHw1SX1GQSf6PPVJfUZBJ9IeeqS+gyCT6Q8dWn6DIFPpPLrMukzAD6RkVeXaZ+NDJ/IyqtLvM/+WHR6LxxK74UOvRc69F5o03uhQ++FNr0XWvReaNN7YZbeC/30XujQe6FD74U2vRc69F5o03uhRe+FNr0XZum98L/Re2FM74UOvRc69F7o0HuhTe+FFr0X2vReaNF7oYXq8he7oFQYbb+g1AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492363192;4.copy,1.1,3.210,3.228,3.990,2.19,2.14,1.1,3.190,3.228;4.copy,1.1,3.330,3.247,3.870,2.76,2.14,1.1,3.310,3.247;4.copy,1.1,3.310,3.266,2.20,2.57,2.14,1.1,3.290,3.266;4.copy,1.1,3.200,3.285,3.110,2.38,2.14,1.1,3.180,3.285;4.copy,1.1,2.20,3.304,3.180,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.450,3.323,3.750,2.19,2.14,1.1,3.440,3.323;4.rect,1.1,3.491,3.215,3.338,2.11;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.364,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.386,2.19,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.413,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.432,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.440,2.15,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.478,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.480,1.4,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.723,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.506,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.582,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.820,3.196;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.223;4.blob,1.1,176.iVBORw0KGgoAAAANSUhEUgAAABIAAAADBAMAAABsakJaAAAAHlBMVEUCBgIDCAMBAwEAAABRyFFn/2cnYCcQKBAVNBUIEwiW0PgOAAAAH0lEQVQImWNgFBQUMgYRDK6hoWHGIIKhoqOj0xhEAABNlgewKGXCoQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.303,3.259;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.345;4.blob,1.1,5340.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.364;4.blob,1.1,2540.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.502,3.421;4.blob,1.1,1104.iVBORw0KGgoAAAANSUhEUgAAApsAAAAOCAMAAABXeCePAAABg1BMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8HAwOTPDwsEhJiKChlKSkeDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxAqERGUPDwIAwNWIyNxLi46kDpMvEwjI1YuLnECAQGKODg7GBiMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzhTIiJ0Ly8tEhKSOzseSx5j9GMECwQSEi07O5IDAwcbCwsTCAhEqURCo0IpKWUoKGJ9MzNKHh4JBAQpEREGDwZk92QcRRwEBAk8PJQRESlEHByCNTU8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAEOBgaXPT0hDQ1Owk44ijgvL3QiIlNuLCxZJCQUCAgaCwsNIQ1n/mcSLBIICBQLCxo1FhaOOTkEAQFLHh58MjIyfTJTzlMeHksyMnwFAgKROzswExMCBgIDCAMBAwGANDRDGxtW1lYtcC00NIAbG0NeJiZmKSl4MTGZPj46FxdRyFFn/2cnYCcYCgofDQ0LBQUQKBAVNBUIEwiwJK7sAAABcklEQVRoge2S5U/DYByEO4eNYoPhxWXD3d3d3YYOd/c/neb9xvqGhSaXS8ieD80v1+bJNTlF0bFYlX+Gzc5uwMfhBEhdMbHyF6gNWS0YLw+7jd2Aj9OBsLo98hy0oTg1HuLlkZCYxK5AJ9mbgtCm+tJkMWpD6RkQLZHMLHYDPtk5EK2WmyeLQRvS8gsgXh6FRcXsCnRKSsswYn9AEqI2VF7hgnh5VFZVsyvQqamtw4jr1QZjiNqQxw3REmlsYjfg09yCMre2GTPQhtp9HRAvj86ubnYFOj29fSh1/4AhQm1ocGgY4uUxMjrGrkBnfGISpZ6angmPUBsK+CFaIrNz7AZ85hdw7sWl8AS0oWV1BeLlsbq2zq5AZ8O7iZNvbQd/BqgN7exCtET29tkN+BwcAuWho2P9GQwJNCXChk5OBWcmrvML4F9QuLxiN+BzfYO0397pj/sHwaN+/rqhp2fBi5krShQzvL4J3iN99/Ep+Pr79Q07tGxtw8gebgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.492,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.440;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAAH8AAAAyCAMAAABCpfSTAAAA5FBMVEUFDAVj9WMeSh4AAABl+WUiVCIXOBdi82IsbCxMvUxCpEJEqEQgTyBc5FwJFwlf619Is0gcRhxj9mMGDgYXOhdZ3VksbixDpkMBAwFd5l0oYygYOxhUz1Qtby0+mj44izhOwU4SLRJn/mcNHw0BAgEDCAMCBQJU0FQyfDIfTB9n/2dHsEcuci5Y2VgGDwYVNBUOIw4KGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECwRh72EGEAYECQRi8mIgUCADBwNX11dY21g/nD9FqkUICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzVzkg1CAAABFElEQVRYhe3WV2/CMBAHcMNBmwIdQCmri03LHiXQXQir/f7fB0WIgqzEcn0Jkej9n+7Bd78Hy/Ix5vODKP5AcF0cHYN2wlXS+Z3CVwxCYXFr5PRsrZ6DdsFV8tlM4SsG0VhcasJlAq6SXIUPg1Q6I3Uyew03t1zlhA939w7NUvRz+YJic7Fkpoz0oVJVbH54NFPD+vWGYnOzZaaN9TvdHmYEKqYP/ScHJsXlnrGVP9CHaH6kP7+o+q9v72j/4/NrpOrDeIL2FcO8gskn/zD97Ybljb+zYXnj/yXkk0++WxHvZIbhsi/eyaaz+cJdX7yTLb9/pgd+/+STTz759j/Bnnzbn2BPvu1P8F/un3xvfXp/1u9vBSlUXqbJHegEAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.457;4.blob,1.1,4632.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1103,3.499;4.blob,1.1,896.iVBORw0KGgoAAAANSUhEUgAAAF4AAACaCAMAAAAXdQ/+AAAAtFBMVEUAAAAGDgYECwRf7F9h72EGEAYDBwNX11dY21g5jDln/2cDCAM6kDpn/mcCBAJFrEVX2FcGDwZi82IsbiwiVCIAAQAeSh5l+WUgTyBc5FwJFwkNIA0LGwsIEwgOIg4CBQIOIw5k92QICAMHBwOOjjmPjzoKCgQEBAKBgTSDgzUCBgIBAwFRyFEnYCcQKBAVNBUXOBcsbCxMvUxf619Is0gXOhdZ3VlDpkMYOxhUz1Qtby0+mj4ZILDyAAABpklEQVRoge2a2VICMRREAy7ooKiAKyIKuK+4L///X1bNi9Y43NwlKTPQ5ylVSfqpi87twbkw1GqBhEqpLywuRZRfbqzUI8qDf8RvzNWsqVZnGHNtvaWWZxhzY1OtzmCr3Ykp3+pux5QHSbCz242qv7d/EEoqTIxNUwkTY1NVwsQYwjBFaGNybaszJte2SmNyDQdjgqpCRyC928sOvfp0BJK7vazvlTdwlA1iyh+fxFQHlYEbkLoXHjcglS88bkAiAgFIENSfYOYYDr1HDN3paHx65jtj6E7PLy5HvjPoTkE60HPez66yTqXnvF+7ujqVnvPMUyA952EKBAUshan/NWcpTBmvOUthitccmCU49adJ3lp/kr8W7ODTfZrhBh++Gc4hZZaSFxUSY8qLCpEx5TaDMUFVkQef6IY8+EQ35BOf6IZ84sOMCERwo5JRk5bAjUpOTVoCN/g4NSkAaZP8jEiCv8iAlLB8zLZWp+a7f4Pvqplz7Vspp8WbLOfWt1Jyd5/T963AXPPQdpPHwiqk/JObPBdWAXl5dZ23wiog7x/u86uwEvEN6VshsF6xawwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.723;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAAlMAAABxCAMAAADGZNbOAAAAzFBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUFCwU4izgfTB8JFwkQKBA0gTQkWSQLHAsPJQ8zfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQw4ijgAAQAGEAYOIw4yejIeSx4iVSIucy4TMBM4iTgyezIgUCAKGQoFDAUeSR4SLRKZlla/AAAEn0lEQVR4nO3c+U4UURDFYQQ3XAARXFpREXfFFfdd3/+dHGeUmPTtTnWsW4dT9/weYHLrj0lmki9nacmtY34flbrlFfQLaDp+Av0Ckk6eOo1+AkmrZ86in8DSufPoF3C0tr6BfgJNFzYvop9A0damfiWY276EfgFFl6+gX0DU1W4Z/QSGrl1Hv4Cone4G+gkE3ey20E9g6tYu+gUE3e720E9g6s5d9AsIutfdRz+BqQfb6BcQ9LDT3+MJPXqMfgFBT/afop9A1Nqz5+gnMPRCvxDsvexeoZ/A0O46+gVEbRy8Rj+BoTf7b9FP4Onde/QLOPrwUd89Y58+76CfwNHKl6/oJ5D07WAV/QSWvv9Av4CkvZ/oFyjFm49pjZCxrPq2PV3tY1ojZCypvm1RV/uY1ggZS6lvm9TVPqY1QsYy6ttGdbWPaY2QsYT6tlFd7WNaI2Qsob5tVFf7mNYIGUuob1vV1T6mNULG0unbZnW1j2mNkLF0+rZZXe1jWiNkLJ2+bVZX+5jWCBlLp29b1dU+pjVCxvLp21Z1tY9pjZCxhPq2UV3tY1ojZCyhvm1UV/uY1ggZS6hv29TVPqY1QsZS6tsWdbWPaY2QsZz6tkVd7WNaI2Qsqb6VrlbqP/IxrREyNoO+ZZXPlg5v8zGtETI2hb4llc+m/t7mY1ojZGwSfUspn40tbvMxrREyNou+ZZTP1ha3+ZjWCBmbRt8Symdz89t8TGuEjE2jbwnls7n5bT6mNULGptG3hPLZ3O/bfExrhIxNpG/p5POEZrf5mNYIGZtI39LJ5wnNbvMxrREyNpG+pZPPE5rd5mNaI2RsIn1LJ58nNLvNx7RGyNg8+pZPPtub3+ZjWiNkbBp9Syifzc1v8zGtETI2jb4llM/m5rf5mNYIGZtG3xLKZ3OL23xMa4SMTaJvKeWzsT+3+ZjWCBmbQ99yymdbh7f5mNYIGZtC35LKZ1OZb1NHI+0O1y6DfB6qfJt2hyuXQj4PNHSbdoerlkQ+Fxu8TbvDNcsin0uN3Kbd4Yqlkc+FRm7T7nDF0sjnQiO3aXe4Ymnkc6Gx27Q7XK1E8rnX6G3aHa5WIvnca/Q27Q5XK5F87jV6m3aHq5VIPvcau027w/XKI5/7jd2m3eGKpZHPhUZu0+5wxdLI50Ijt2l3uGJp5HOh4du0O1y1JPK52NBt2h2uWw75XG7oNu0OVy6FfB4o823qiKTd4chY5bMl7Q5jIpXPprQ7DIpSPhvT7jAmRvlsTbvDoAjlszntDmMilM/mtDuMiVA+m9PuMCg6+Twh7Q5jopPPE9LuMCY6+Twh7Q5jopPPE9LuMCQ++WxPu8OYCOWzOe0OYyKUz+a0O4yJUD6b0+4wJEr5bEy7w5A45bMt7Q5jIpXPpjLfpo5G2h2uXQb5PJR2hyGlkM8DaXcYUhL5XEy7w5CyyOdS2h3GlEY+F9LuMKY08rmQdocxpZHPhbQ7DCmRfO6l3WFMieRzL+0OY0okn3tpdxhTIvncS7vDmPLI537aHQaVRj4X0u4wpjTyuZB2hzGlkc+FtDsMKol8LqbdYUw55HM57Q6DSiGfB/r3tl8asZELMLbjIwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492363289;4.copy,1.1,1.0,3.190,4.1200,2.19,2.14,1.1,1.0,3.171;4.copy,1.1,1.0,3.228,3.160,2.19,2.14,1.1,1.0,3.209;4.copy,1.1,3.190,3.228,3.270,2.19,2.14,1.1,3.190,3.209;4.copy,1.1,1.0,3.247,3.140,2.57,2.14,1.1,1.0,3.228;4.copy,1.1,3.200,3.247,3.220,2.19,2.14,1.1,3.200,3.228;4.copy,1.1,3.500,3.247,3.700,2.38,2.14,1.1,3.500,3.228;4.copy,1.1,3.140,3.266,2.10,2.38,2.14,1.1,3.140,3.247;4.copy,1.1,3.210,3.266,3.200,2.19,2.14,1.1,3.210,3.247;4.copy,1.1,3.470,3.266,2.30,2.19,2.14,1.1,3.470,3.247;4.copy,1.1,3.150,3.285,2.20,2.19,2.14,1.1,3.150,3.266;4.copy,1.1,3.200,3.285,3.200,2.19,2.14,1.1,3.200,3.266;4.copy,1.1,2.10,3.304,4.1190,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,4.1020,3.361,3.180,2.19,2.14,1.1,4.1010,3.361;4.copy,1.1,4.1030,3.380,3.170,2.38,2.14,1.1,4.1020,3.380;4.copy,1.1,4.1020,3.399,2.10,2.19,2.14,1.1,4.1010,3.399;4.rect,1.1,3.820,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.269,1.7,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.345,2.36,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.421,2.57,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.440,2.56,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.440,2.14,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.459,2.24,2.50;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.476,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.363,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.713,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.563,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1153,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.151,3.212;4.blob,1.1,5368.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.345;4.blob,1.1,5704.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.81,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.492,3.421;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAAsMAAAAOCAMAAAD9u+EzAAABg1BMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8HAwOTPDwsEhJiKChlKSkeDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxAqERGUPDwIAwNWIyNxLi46kDpMvEwjI1YuLnECAQGKODg7GBiMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzhTIiJ0Ly8tEhKSOzseSx5j9GMECwQSEi07O5IDAwcbCwsTCAhEqURCo0IpKWUoKGJ9MzNKHh4JBAQpEREGDwZk92QcRRwEBAk8PJQRESlEHByCNTU8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAEOBgaXPT0hDQ1Owk44ijgvL3QiIlNuLCxZJCQUCAgaCwsNIQ1n/mcSLBIICBQLCxo1FhaOOTkEAQFLHh58MjIyfTJTzlMeHksyMnwFAgKROzswExMCBgIDCAMBAwGANDRDGxtW1lYtcC00NIAbG0NeJiZmKSl4MTGZPj46FxdRyFFn/2cnYCcYCgofDQ0LBQUQKBAVNBUIEwiwJK7sAAABfElEQVRoge2SVVPDUBSEU4eWYIXixaXF3Snu7k7R4u7+08nkjSYvnGTunhn6Pdw5s5nN7sNKkoLFKv0DbHZ0A044nCSbKy5e/wN6Q1YLNl8Mdhu6ASecDprP7dHXwRtKkBOh+WJISk5BV2BEqjeNZkz3ZejJ6A1lZkHjBZGdg27Aidw8otGfX6AngzfkLyyC5ouhuKQUXYERZeUVVGsgqCOiN1RZ5YLmi6G6phZdgRF19Q1Ua6PcpBXRG/K4ofGCaG5BN+BEaxvd296h1cAb6vR1QfPF0N0TQldgRG9fP908MKiR0BsaGh6B5othdGwcXYERE5NTdPP0zGy0hN5QMACNF8TcPLoBJxYWjbiXlqMV8IZW5FVovhjW1jfQFRix6d0yYt/eCf8W0Bva3YPGC2L/AN2AE4dHhuyR4xPlDUdU/JJJGzo9UzknXBeXJuSz5+oa3YATN7fG/Hf3yvPwqPKknKZs6PlF5ZVyxYhB4e1d5cOs/31+qXz//foBQKpsbXONipAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.482,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1061,3.440;4.blob,1.1,668.iVBORw0KGgoAAAANSUhEUgAAAIgAAAAfCAMAAAALB3WbAAAAzFBMVEUFDAVj9WMeSh4AAABl+WUiVCIXOBdi82IsbCxMvUxCpEJEqEQgTyBc5FwJFwlf619Is0gcRhxj9mMGDgYXOhdZ3VksbixDpkMBAwFd5l0oYygYOxhUz1Qtby0+mj44izhOwU4SLRJn/mcNHw0BAgEDCAMCBQJU0FQyfDIfTB9n/2dHsEcuci5Y2VgGDwYVNBUOIw4KGApm/GYWNxZKt0o8lTwkWSRf7F8CBgIECwRh72EGEAYECQRi8mIgUCADBwNX11dY21g/nD9FqkX2vNuvAAAA4klEQVRYhe3Wxw6CQBCAYWQs2Av23ntv2Ov7v5MuaqITCRuzLB72P81tviwJGUlyyMAi2el6DG4PKF40USSBz88EAoFg6LE+DEoETVSQaExlI3kWT0AyhSYqSDqTZQrJ5aFQRBMVBEplppAfu0Mq1ZrFS+oNUtMMAq22xZBOl9QzhfQHFkOGI9LYFDKZziyWUEQgMF9w3Kh+/1vokKW24uZYa5utIWS3P3CDHE/ntSEELlduEKMkuwGvBAQnIDgBeTsu9ex8kddxqSc+DU5AcAKCE5CP7ufjX0DI+fgXEHI+3gBCgj7RgTxQswAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.457;4.blob,1.1,4616.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1133,3.507;4.blob,1.1,608.iVBORw0KGgoAAAANSUhEUgAAAEIAAACJCAMAAACvpR6tAAAAeFBMVEUAAAA5jDln/2cDCAM6kDpn/mcCBAJFrEVX2FcGDwZi82IsbiwiVCIAAQAeSh5l+WUgTyBc5FwJFwkGDgYECwRf7F9h72EGEAYDBwNX11dY21gNIA0LGwsIEwgOIg4CBQIOIw5k92QCBgIBAwFRyFEnYCcQKBAVNBUlIIs0AAABCklEQVRoge2Y2QrCMBBFa+q+7/u+/v8fCkXbQuNlxila5Z6nwCRj4YbDxCCIKbkwMFKuVK0tanVrh0azZW1RbXesLYiXbq9t7tEfDDXbRyPrD44n05mxxXyxHFs/gyTgUCWR41BFkeNQGTnBupPJEOtOKUPyh0hl+HqfVIZgn1SG1CL5KpwHiQ++f2P4/s2BlVuLqmAKXLkNbBFXX0+BW7cDLXD1wf7wfpXkCB+95KfAChS2QAp8Au++SHL47oskx7ufL75QdcO7L1Tl8O4LlUGTBL3kMidkkoMnRJLDJ/STHGe/gsD/NEjB+NjsB9FrMQMlVxAKKrljGHFKr5ScXcQlvVJyvUVsktUda8sXkbhuVQAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1023,3.649;4.blob,1.1,680.iVBORw0KGgoAAAANSUhEUgAAAJoAAAANCAMAAABmQofeAAAA51BMVEUAAAB3dzDU1FYHBwOTkzwsLBIXOBdi82IsbCxMvUxiYihlZSlf619Is0gODgYyMhT9/WYbGwsqKhGUlDwICAMXOhdZ3VksbixDpkMLCwTs7F/v72EQEAaQkDq8vEwCAgGKijg7OxgYOxhUz1Qtby0+mj7X11fb21gEBALp6V5eXiZTUyJ0dC9LSx709GOYmD4TEwipqUSjo0J9fTNKSh4PDwb392RFRRxERByCgjVkZCjk5FyXlz0hIQ3Cwk5ubixZWST+/mc1NRaOjjkEBAF9fTLOzlMFBQKRkTswMBPW1lZwcC1mZimhb59DAAAA0ElEQVQ4jcWVxxKCMBQAAyhiQ7FjA7ti7xV71///HqUzlBkvJntINvMue3oBwBkM/x6Ex+sy/gukD1B+izmAY9IZCEKqkiFDgApbTIWmdY1EGemKxRMQ05IpkM5YTIHN5vKaF4ryxfEliGnlCqjWLKZA1Busqs2WoEi7AzHtJ7o9NZLpD9CW2BiONBtPUHbYmc7mmi6WKEPsrNacpvRGRNdhrAzdtrwx3u2h1pgxVoZu4sH0CRxPZwRVMsbK0O1yNc1v9wf8KFeeL/NLeCPK+AAXow+YCX0z3QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.961,3.668;4.blob,1.1,2316.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;3.end,1.1;4.sync,10.6492363395;4.copy,1.1,3.330,3.209,3.870,3.133,2.14,1.1,3.310,3.209;4.copy,1.1,3.310,3.228,2.20,3.114,2.14,1.1,3.290,3.228;4.copy,1.1,3.230,3.247,2.80,2.95,2.14,1.1,3.210,3.247;4.copy,1.1,3.220,3.266,2.10,2.76,2.14,1.1,3.200,3.266;4.copy,1.1,3.210,3.285,2.10,2.57,2.14,1.1,3.190,3.285;4.copy,1.1,2.20,3.304,3.190,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.660,3.475,3.540,2.19,2.14,1.1,3.650,3.475;4.rect,1.1,3.820,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.350,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.345,2.56,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.364,2.38,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.90,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.462,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.693,3.468,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.459,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.478,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.703,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.507,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.516,2.24,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.535,2.14,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.544,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.573,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.573,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.594,2.24,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.611,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.611,2.13,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.630,2.27,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.303,3.221;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.345;4.blob,1.1,5772.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.61,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.472,3.421;4.blob,1.1,744.iVBORw0KGgoAAAANSUhEUgAAAiIAAAANCAMAAACjD/XSAAABC1BMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8eDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxBWIyNxLi46kDpMvEwjI1YuLnECAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgtEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwdlKSliKChEqURCo0IpKWUoKGIJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESk8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAF0Ly9TIiJOwk44ijgvL3QiIlMUCAgaCwsNIQ1n/mcSLBIICBQLCxpLHh58MjIyfTJTzlMeHksyMnyANDRDGxtW1lYtcC00NIAbG0OV8a0MAAAA3klEQVRYhe3OxUJCARSE4XvpDqWVDhXpVrAA6e73fxI4LHiFmQXfYmb7K8qFqlHubrQ6dAETveF6GhXcQUWnRRcwMehljSYzOoSIxWpDJxCxO5xyLjc6hMnDI7qAiccr6/MH0CFEgqEndAKR53BELhqLo0uIJJIpdAKRdOZF7vUNHcIk+44uYJLLyxaKJXQIkXKlik4gUqs35JqtD3QJkc92B51A5Ov7R+73Dx3CpNtDFzDp/8sOTEN0CJHReIJOIDJ1zOTmC3QIk+UKXcBkvbnedgfuoLI/oAuYHE+yZ9nMD3jtfGWeAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.462,3.440;4.blob,1.1,480.iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAMAAACAR47fAAAApVBMVEUAAAAdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZik8rvcAAAAAfUlEQVQYlW3JVxKCQAAD0NBdRCwUKQp2BTsC9z8aoOi4JR9JZh7QRpLxH0XVfl+WKIJufN+AmDQNrVH/7DEtmExn/XFchuD5n50HCkshid5r6KwA8aLrpZXwlK66Xm+2PO32h7Z9jxfgeAIykovofLnidhcJHs8Cr1JIqOoG30wGOlegTlgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1161,3.440;4.blob,1.1,632.iVBORw0KGgoAAAANSUhEUgAAACYAAADVCAMAAAAM5XIrAAAAllBMVEUAAAAeSh5l+WUiVCIXOBdi82IsbCxMvUwgTyBc5FwJFwlf619Is0gXOhdZ3VksbixDpkMYOxhUz1Qtby0+mj4BAgEDCAMCBQIfTB9n/2dHsEcGDwYVNBUOIw45jDk6kDpn/mcCBAJFrEVX2FcAAQAGDgYECwRf7F9h72EGEAYDBwNX11dY21gNIA0LGwsIEwgOIg5k92QVGRv7AAAA/0lEQVRoge3Z5w6CMBQF4DrALW5FxA3u9f4vZ1ApBJtyVVQg5/vV0EPS3JamoYyxTDbHbvIKUwuBlk+xVL53VphaDbQEanWmNQItgWaLtTuBVqS6PUc/LDbQHcOwmDFymNEMDQAAACCRxnqPEptMZ5TYfEFJGYpGic1yS0osIfg5PYR7TvexLMqL9mq9IcS2u71NGkiMyQvi9soLwnvlBUlDub7tg6UNL8FOkGaY3ffgDBO9g36kxU6U2FkP/YPnMC+UVILhC4+pl5e7dCb5cpfPJF/uaZhJUUGen4kKIngmKkgaivQ72L8BIHI4wvyf8IJfEJNd8HukF/yexwX/FZ7cG8/XNaokAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.457;4.blob,1.1,4164.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.780;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAh4eDE8PBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7ML5yjAAAAqUlEQVQoke3SVw7CQAxFURN6GyD0koQaOoTeO+x/SwgJIa4EEgvgffnYo5E/LPKKSxPE7fGy4fPTgWCIjXCEjioXHFNxPkjodDJFp8N0Jgvm8gW4qEqwYVpwuQJWa7F31s0GxnZTvqRFtjtgo9t7Vv3BY8mhIe92gho8Ggs8mcIz5cBzZcMLtYRXKgSvN1v+v0vR+pDebw6wHE8WrJ0vsFxv8kv+9/Xhvu6uLhPOluhdiAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492363492;4.copy,1.1,3.310,3.209,3.890,3.133,2.14,1.1,3.300,3.209;4.copy,1.1,3.220,3.228,2.90,2.19,2.14,1.1,3.210,3.228;4.copy,1.1,3.230,3.247,2.80,2.95,2.14,1.1,3.220,3.247;4.copy,1.1,3.220,3.266,2.10,2.76,2.14,1.1,3.210,3.266;4.copy,1.1,3.210,3.285,2.10,2.57,2.14,1.1,3.200,3.285;4.copy,1.1,2.10,3.304,3.200,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.500,3.475,3.700,2.19,2.14,1.1,3.480,3.475;4.rect,1.1,3.181,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.364,1.8,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.432,2.28,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.440,2.24,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.462,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.673,3.468,2.14,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.516,1.4,2.88;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.683,3.497,3.493,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.535,1.4,2.80;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.556,1.4,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.639,1.5,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.161,3.196;4.blob,1.1,2616.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.345;4.blob,1.1,5816.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.41,3.364;4.blob,1.1,2528.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.462,3.421;4.blob,1.1,748.iVBORw0KGgoAAAANSUhEUgAAAkAAAAANCAMAAAB2HSGfAAABC1BMVEUAAABHHR1/NDQwdzBW1FYdHUc0NH8eDAyYPj4QBwcUMhRm/WYLGwsMDB4+PpgHBxBWIyNxLi46kDpMvEwjI1YuLnECAQGMOTk4FxcCBAJe6V4mXiYBAQI5OYwXFzgtEhKSOzsHAwMeSx5j9GMECwQSEi07O5IDAwdlKSliKChEqURCo0IpKWUoKGIJBASUPDwpEREGDwZk92QcRRwEBAk8PJQRESk8GBiJNzcBAAAoZChc5FwBAgEYGDw3N4kAAAF0Ly9TIiJOwk44ijgvL3QiIlMUCAgaCwsNIQ1n/mcSLBIICBQLCxpLHh58MjIyfTJTzlMeHksyMnyANDRDGxtW1lYtcC00NIAbG0OV8a0MAAAA30lEQVRYhe3OxUJCARSE4XvpDqWVDhXpVrAA6e73fxI4PADbmQXfYmb7K8qFqlHubtLq0AWc9IbraVRwBz2dFl3AyaCXNZrM6BByFqsNnUDJ7nDKudzoEHYPj+gCTh6vrM8fQIeQC4ae0AmUnsMRuWgsji4hl0im0AmU0pkXudc3dAi77Du6gFMuL1soltAh5MqVKjqBUq3ekGu2PtAl5D7bHXQCpa/vH7nfP3QIu24PXcCp/y87MA3RIeRG4wk6gdLUMZObL9Ah7JYrdAGn9eZ62x24g97+gC7gdDzJngGUHg94YvTLBAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.440;4.blob,1.1,2056.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1191,3.440;4.blob,1.1,208.iVBORw0KGgoAAAANSUhEUgAAAAcAAACkBAMAAACp9CmgAAAALVBMVEUAAAAeSh5l+WUiVCIgTyBc5FwJFwkGDgYECwRf7F9h72EGEAYDBwNX11dY21gRKq8UAAAAKElEQVQokWNgEDJgYGBgCWMYBQMJ2AuAROdqIHH2BflKRgE5gNSwBwAwgw4dJwSsbgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.291,3.476;4.blob,1.1,1840.iVBORw0KGgoAAAANSUhEUgAAALwAAAAiCAMAAADS+0OqAAACzVBMVEUAAAAGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkDBwM8kzwSLBIdRx00fzQTExMFDQ08k5MSLCwoYigpZSkiIiIFBQUmXl4ucXERKhE8lDwDCAMMHgw+mD4HEAcsEhJtLCwjIyP39/cSKys+mZksLBJtbSwBAgE4ijgYOxgjViMucS4CAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEiUyIvdC85jDkXOBcFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg4LGwsIEwgSLRI7kjtkKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUzfTMeSh4wExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAscRBw1gjUECQQRKREBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAGDgY9lz0NIQ0YPBg3iTcAAQAoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjssbiwkWSQbCwsLGhoMHR0bGwsWNRY5jjkBBAEIFAgLGgsbQ0M4iooAAQECBQI7kTsTMBMeSx4yfDIyenoeS0smXiYpZikxeDE+mT4XOhc0gDQbQxsTMDA4iYkKGAoNHw0FCwUKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfkiIlQMDAX19WNKSh5iKGJlKWUgIE9cXOQJCRekpEKoqEQqESqUPJQIAwhGRhz29mMODgYCAQKKOIo7GDvm5l1jYyhTIlN0L3SLizjBwU4bCxuYPpgTCBMtLRL+/md9M31KHkrQ0FR8fDJEHESCNYJyci7Z2VgOBg6XPZchDSEYGAr8/GZuLG5ZJFm3t0o1FjWOOY4EAQTs7F8GBgIFAgWRO5EwEzAJCQTy8mJQUCBeJl5mKWacnD+qqkUXITvcAAACUUlEQVRYhWNgwAYYmbAKDw3AzMI60E4gGbCxc0BZnFwD6hAkwM3Di12Cjx+Vz8YuAGUJCgnT1EkkABFR7OL8fKh8MXZxGFNCkpYOIgVISctgE5aVk4eyFBTBlJIyXE5FlRGLDjV1ajuNMNDQ1MImrK0DpnT19A0M0eWMVI1BlIkpGJiB2OYWllbWNHQlLmBji0VQw84eSDo4Ojm7uGLKurmDSA8rMPBkYDD18vbx8KWtM7EDPzl/TMGAQG4gGRQcEopNS1g4iIyIBIMoBobomNg4mroRN4hPwBQTFQGRiUnJKalYdKRJgEhEsknPyMzKpqUTcYOcXAyhPOl8MF1QWGRQrIchXVIKIhHJhsHMs8yq3IK2zsQOKiqr0IWqa2phzLr6BnTZxqZmEIVINiDQ0tpGMxfiA+0d6CK2NkicTnTZLtVubMb0UNFJxIPevn5UgQlyE/GpnzR5Ci2dQxqYOm06kOyfCgYaQOaMmXjVz5pNF2cRCebMBRLz5oPBAiBz4SJ8qhcvMaKLq0gBS5eBwXJC6lZMXkkP59AGrFo90C4YBaOADmDN2nVw9voNGwfQJdjBps1b8Mhu3YZgb9+xk+auIRXs2o1Hcs/efXRzCDlg/4GDuCUPHT5CP5eQAUyOHsMje/wE3RxCFjh5Co/k6TNn6eYQcsC585F4ZC9cpJtDyAKXLuORvHKVbu4gC1y7jkfyxs1bdHMIOeD2HXz90Lv36OYQssB9HzySDx4+optDyAFZj5/glnz67Dn9XEIGePHyFR7Z12/o5hCywNt3SBwA7deJ832UDkEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.623,3.497;4.blob,1.1,392.iVBORw0KGgoAAAANSUhEUgAAAC0AAAANCAMAAAAKaBeeAAAAeFBMVEUeSkpl+fkiVFQAAAAFBQxjY/UeHkogT09c5OQJFxdCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaoIjVkSAAAAaElEQVQokZXNxw6DMBREUZMhoSX0ntDb//8hEthZgDfzVqPrI1kI44Hz1DKfL+DS5BKwbEcGtVzvry+vAvd7f3xNPT7QtCCMCI04YXSa5YRGUTK6qhn9/TWERtsxuh9GQk/zQmism67ub3kJi4/nUncAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1288.iVBORw0KGgoAAAANSUhEUgAAAOsAAABxCAMAAAADKaTCAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAACs0lEQVR4nO2a2VZTURBEAVEE9AYCYhyYCYqYIIMDTkz//08kNzFvHk+d7lsdtfZ7r+rnvfbMTDizc9Ef8Hgw/zD6BR6PFqI/4PF4cSn6BR7LT6I/4PG0mo1+gUarWol+gcdqO/oDHmvr0R/weLYc/QGPjefRH9DovHgZ/QKNV9Xr6BdobG5tR79AY2c3+gMae/ut6BdYHGx1o1+gcfgm+oN/G9yFWO3JW9u5YQN3IUZ7cvTOcm3bwF2IyZ50j98bro0buAux2JNOb7P41mEDdyEGe9JfbN6VJjZwF2KwJycfSi9dNnAXYrAnp2ellz4buAsptifnVb/w0mkDdyHF9uSiOiy8dNrAXUixPflYfSq8dNrAXUixPflcNS/7Uxu4Cym3J18uvxZe+mzgLsRgT74RPGliA3chBnvS7pVeumzgLsRgT75f/ii+tW/gLsRkT35eNW/UfreBuxCbPZm7vjFc2zZwF2K0J7d3pvOp2ZhacBfiaU8YHcxkA3chrvaE0cH82sBdiLM9YXQwow3chXjbE0YHM9rAXYi7PWF0MPUG7kLc7Qmjg6k3cBfibk8YHcxwA3chDdgTRgcz2MBdSAP2hNHBDDZwF9KAPWF0MIMN3IU0YE8YHcxgA3ch/vaE0cHUG7gLcbcnjA6m3sBdiLs9YXQw9QbuQtztCaODGW3gLsTZnjA6mPEG7kJ87Qmjg5ls4J7C1WwwOpj/ubVRB5NCHUwu6mBcUQdTow4mhTqYHNTB+KIOZow6mATqYLJQB+OLOpgh6mASqIPJRh1Mw6iDSaAOphR1ML6og/kz6mAMqIPx31AHk0IdjAl1MP4b6mBSqIMxoA7GFXUwOaiD+YtQB5NCHUwu6mBcUQdTow4mhTqYHNTB+KIOZow6mATqYLJQB+OLOpgh6mASqIPJht3B3AOs33BATaf3twAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,792.iVBORw0KGgoAAAANSUhEUgAAABEAAABxCAMAAAAER7iSAAAA81BMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIBAQECAgIJFgk0NDQ+Pj4REREcRhwwdjAKCgo6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4ICAgiVSIucy4yezIgUCANDQ0DAwMFDAUeSR4xMTEXFxcFBQXscelFAAABGUlEQVQ4je2TXVcBURSGt6kU6pAofaCE0OiTiiIpiqj+/6+J9p6ZPa+brq15bs5ZzzprzZw9zxC5hCwCVlbXUIXX0WxEoqhim2i2TAhM3CTw0HYSzU4KTTqGZncPRGb/AMyhOQKTzeXBHJ+AKJzG/aKYK8GR8hm+DFWqVWdb4+Xctuu8u7jk9aoupnR9I2dv2WQaWfKbZsQCc3dPYB5aYNqmCebRlME8mQ6YromCee694LP6KTTJBprX3pszjYHcdPieh2lYHyOZxnj8ybvJlP5L0KqPoNWgVWFJW1XUUDitunitCqpVQbUqqFYF1SqjW2V0q4xuldGtMrpVob/wRZxWZ3/pnIrX6pf9xze5rc66nPNDqlUPf6u/o34+Q0AcW+AAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492363599;4.copy,1.1,3.220,3.209,3.980,2.19,2.14,1.1,3.200,3.209;4.copy,1.1,3.230,3.228,3.970,2.19,2.14,1.1,3.210,3.228;4.copy,1.1,3.240,3.247,3.960,2.76,2.14,1.1,3.220,3.247;4.copy,1.1,3.230,3.266,2.10,2.57,2.14,1.1,3.210,3.266;4.copy,1.1,3.220,3.285,2.10,2.38,2.14,1.1,3.200,3.285;4.copy,1.1,2.20,3.304,3.200,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.390,3.323,3.810,2.19,2.14,1.1,3.380,3.323;4.copy,1.1,3.500,3.456,3.700,2.57,2.14,1.1,3.490,3.456;4.copy,1.1,3.480,3.475,2.20,2.38,2.14,1.1,3.470,3.475;4.copy,1.1,3.470,3.494,2.10,2.19,2.14,1.1,3.460,3.494;4.rect,1.1,3.300,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.383,2.27,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.405,2.18,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.432,1.8,2.21;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.440,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.518,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.313,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.594,1.4,2.10;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.687,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.300,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.345;4.blob,1.1,5588.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.364;4.blob,1.1,2540.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.442,3.421;4.blob,1.1,584.iVBORw0KGgoAAAANSUhEUgAAAVAAAAANCAMAAADIUcZ2AAAAzFBMVEUAAABHHR1/NDQwdzBW1FYeDAyYPj4QBwcUMhRm/WYLGwtWIyNxLi46kDpMvEwCAQGMOTk4FxcCBAJe6V4mXiYtEhKSOzsHAwMeSx5j9GMECwRlKSliKChEqURCo0IJBASUPDwpEREGDwZk92QcRRw8GBiJNzcBAAAoZChc5FwBAgF0Ly9TIiIGDg5Owk44ijgUCAgaCwsECwtf7Oxh7+8GEBANIQ1n/mcSLBJLHh58MjIDBwdX19dY29syfTJTzlOANDRDGxtW1lYtcC38vbc4AAAAo0lEQVRYhe2ORQ7DUBQDf6ApM2PKnELKTPe/U+ucIZGlp87Cs/Qo9UPT1R9fMExPukbuEINpYENWmB0ihEg0BsUT7BApJFPYdCbLDhFCLl+AiqUyu0QIlWoNqjfYIVJotrB2u8MOEUK314cGwxG7RAjjyRSazdkhvuM4lNvFEruy1pT3AHE32x3hdn84Qqcz4TtYLtebS7i9Pzw9X4Rvkbw/2C++YAlWnhvB8gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.440;4.blob,1.1,3408.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.649;4.blob,1.1,2532.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.723;4.blob,1.1,576.iVBORw0KGgoAAAANSUhEUgAAAA8AAAAlCAMAAACqP0MoAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAnklEQVQokY3QxxKCQBBF0VFRomnEhApmMaKYA8b//ydZcl35FlN1uru6qkeIOCmBpDOgks0lqWo62oZpwfkCtxVLYFkacEXacFXW4LpswE2nxf3tDu1qtOd0Wej1B7A1HHFgPBH/xOfdYjqbs7BY0iuTp4hgTW+kD4dyy4GdS+9/bj8E9PEEqucLfJU3WI/4M/cH+HyFSb4jBW37Ez9fUOELBttAkfgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.761;4.blob,1.1,864.iVBORw0KGgoAAAANSUhEUgAAAOsAAABLCAMAAACmyIAJAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAABdUlEQVR4nO3a2U6CQRCE0V9BWd1G3FBxF1xRFMQF1/d/J42XNSHhpruSSp8nqO9uJumi+DNX6IK2+RJnhgdoKy8skobYg7ZKtcZaYg7b6o0maYk9bFtaJg1xgG0rq5wdHqBtLdVJQ+xh23pqkZbYw7aNtElaYg/bttI2aYk9bNtp75KW2Mva9vY5QzxgW6fK2eEB2w7ah5QdHrK2o+MTyhAP2NY8PSMtsZe1nXc5Qzwot82op/u3y9ouLq84Qxxkbdc3nCEesO22ofs0ztr6d5whHrDtPvU4Qxxg2yA9kJbYy9oeO5whHrBtKPy/w7ZRn7PDA7Y9jTk7PEBb5fmFNMQetr2mN9ISe9hWm+j+2rHt/YM0xAG0fX4NSEPsQdv3pMxaYg7bWj+kIQ6U26aLOxgJcQejKO5gNMUdjKS4g9EUdzCa4g5GVNzBiIo7GFHKbTOKOxgNcQcjKu5gRMUdjKi4g9EUdzCS4g5GU9zBSIo7GEn/bb+OBiwVZ4nxLwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492363702;4.copy,1.1,3.210,3.209,3.990,2.19,2.14,1.1,3.200,3.209;4.copy,1.1,3.220,3.228,3.980,2.19,2.14,1.1,3.210,3.228;4.copy,1.1,3.230,3.266,3.970,2.57,2.14,1.1,3.210,3.266;4.copy,1.1,3.220,3.285,2.10,2.38,2.14,1.1,3.200,3.285;4.copy,1.1,2.20,3.304,3.200,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.370,3.323,3.830,2.19,2.14,1.1,3.360,3.323;4.copy,1.1,4.1040,3.399,3.160,2.19,2.14,1.1,4.1030,3.399;4.copy,1.1,2.40,3.437,4.1160,2.19,2.14,1.1,2.30,3.437;4.copy,1.1,3.310,3.456,3.890,2.19,2.14,1.1,3.300,3.456;4.copy,1.1,3.330,3.475,3.870,2.38,2.14,1.1,3.320,3.475;4.copy,1.1,3.310,3.494,2.20,2.19,2.14,1.1,3.300,3.494;4.rect,1.1,3.300,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.413,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.20,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.430,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1181,3.136;4.blob,1.1,228.iVBORw0KGgoAAAANSUhEUgAAABEAAAAMCAMAAACz+6aNAAAANlBMVEUAAAABAgIDCAgCBQUfTExn//9HsLAGDw8VNDQOIyMGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tR2PV+AAAAL0lEQVQImWNgoANgZAIBZiQRFlYQYEMSYecAAU7sBnBxoQlw8/DyoYrwCwhyI3EBMYIA60b9rM8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.342,3.250;4.blob,1.1,356.iVBORw0KGgoAAAANSUhEUgAAAEEAAAANCAMAAADBs/NgAAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAAVklEQVQokaXMxxGAMBQDUdnkaHLO0H+NwEAFX3uRTg94UhqyLNv5jlZCAa7nvxOEkVT4ixMSSE1GCnlRkkJVk0DTdqTQDyMpTDMJLOtGCvtBAjgvErgBrtsCnsQrTrIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.341,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.572,3.345;4.blob,1.1,1280.iVBORw0KGgoAAAANSUhEUgAAAfoAAAANCAMAAAB2K1xuAAAB71BMVEUAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFDAxj9fUeSkoMBQX1Y2NKHh5CpEJEqERCpKREqKikQkKoREQUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscRkZj9vYGDg5GHBz2Y2MOBgY6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAwNd5uYoY2MDAQHmXV1jKCgCBAJe6V4mXiY4izhOwU4CBARe6ekmXl44i4tOwcGLODjBTk4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSLS1n/v4NHx8tEhL+Z2cfDQ1EqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NU0NAyfHzQVFR8MjIGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUucnJY2dlyLi7ZWFgoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIKGBhm/PwWNzcYCgr8ZmY3FhZOwk44ijhKt0o8lTxOwsI4iopKt7c8lZW3SkqVPDwNIQ0SLBIkWSRf7F8CBgINISESLCwkWVlf7OwCBgZZJCTsX18GAgIyfTJTzlMECQRi8mIgUCAyfX1Tzs4ECQli8vIgUFAJBATyYmJQICBW1lYtcC0/nD9FqkVW1tYtcHA/nJxFqqqcPz+qRUWzXFTfAAABi0lEQVRYhc2OZXPCQBRFF9pC3d3d3Z221Ki7UXd3d3d39x/aBNrOhCQww+xm93zY93Jz38wBgEIkBtwYGBpx/5BIeS7wY2xiiluBcMzMLf53sYivZWnFnUsl0IWgYW2D24B0bO3+NnsHR76Sk7MLV+zq5o5CCQ4enl64FQjH28f3d/Pz5y0FBAZxxcEhKIwgERoWjluBcCIio9RLdEwsfysuniNMSExCogSJ5BTcBqSTmqae6RmZ9JBl0WQzNgBy5Lnsy7z8AqEk9aFQUYRbgXCKS0pVs6xcNSoqaaoYG0V1Dfuytk4gRT2pb8BtQDqNTfSrbG5RfSlbadoYG0V7B+uus6tbMEe96OnFbUA6ff30OzAo01YaGh7RjEbHxlEpwWFicgq3AuFMz8xS79y89tbComaytIxICBorq7gNSGdtHYAN+ab20tb2DjPYVewhM4LE/sEhbgXCOTo+AadnOkrnF5fM4OoamRAsbm7vcCsQzv3DI3h61tV6eWV+v70j0oHIxyduA9L5+v4B7gNAVBdFl6gAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.362;4.blob,1.1,1804.iVBORw0KGgoAAAANSUhEUgAAAO0AAAASCAMAAACAV6lxAAAC3FBMVEUAAAAYCgoLBARUIiLPVFQPBgaiQUGvR0cFDAxj9fUeSkowdzBW1FYFDAVj9WMeSh4VCAj1Y2NJHR1CpKREqKhCpEJEqEScPz+9TEwcRkZj9vYGDg4UMhRm/WYLGwscRhxj9mMGDgYsLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQlKtrYBAwNd5uYoY2M6kDpMvEwBAwFd5l0oYygCAgE3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMg4i4tOwcECBAJe6V4mXiY4izhOwU4FBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzMiVFQECQksbGxa399k+PhCo6MXOTkSLS1n/v4NHx8eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1kZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExNU0NAyfHxEqURCo0IfTB9n/2dHsEdU0FQyfDIwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi4ucnJY2dkGDwZk92QcRRwVNBUOIw4uci5Y2VgBAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFwKGBhm/PwWNzcoZChc5FwKGApm/GYWNxYoKBBwcC2Skjutra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/NKt7dOwk44ijhKt0o8lTwbGwspKSm3t7dfX1/t7e0sEhIxFBQkWVlf7OwCBgYNIQ0SLBIkWSRf7F8CBgI6OjrExMSXl5cODg5vLS3mXV0CAQFi8vIyfTJTzlMECQRi8mIgUCDMUlJ9MjI/nJxFqqpW1lYtcC0/nD9FqkVQICDlXFwpERFFHBxCGxtLHh4EqQZXAAACJklEQVRYhWNgwAYYmbAKD1PAzMI60E6gJ2BjH2gX4AMcnFzYJbh5cOjg5ePHY56AoBClTqIlEBbBLs7DjUuHqBg+88QlKHMPbYGklDQ2YRlZOVw65BUU4WwlZRCpoqqmrqEJEdHS1iHSZi5dYt1IPaCnb4BN2NAIpw5jE1MIw8zcwtIKSFvb2NrZOzhCBJ20nXFpdHEFAzcQ293D08ubXDdTAHx8sQj6+Qfg1hEYBCKDQ0LDwiNArMioaAaGmNg4iGx8Ai59wl5gkMjAkJSckpqWTr6byQcZmVmYgtk5uSAqLx8EClBYDAyFRcVAsqS0rByiuKISRFZVQ3g1tbhsqqsHgwYGhsam5hbq+YAk0NqGKdbeAaY6u0CgG4UFBD29QKKvf8LESSDe5NgpIGrqNIjk9Bm4LEKk5JmzZs+ZS0UvkADmzccQWrBwEYReDAJLUFhAsHQZiFy+YqXlKnMgYzUkbtdAJNeuw2URIiUzuCWu99qwkYqeIBps2rwFXWjrtjx8Orbv2Alh7Nq9B0juheTbfWCh/QcO4tKGSMkgcOjwETIdTBk4Ogdd5Nhx/DpOnISxTgHxabUzMWfP2UIEzmtfINbeDGIVUhVcvHQZVeBK0VX8Oq5dv4HMvXlLrer2HQj77r371HQb9UHSg5moAg8fEdDx+MlTXFLPnlPBRTQFL16i8l+9JqTjzVscEu/eO1HBQUMEfLj3caCdQEfw6fNAu4A2AADquZ4ItkiK7QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.364;4.blob,1.1,2516.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1031,3.364;4.blob,1.1,804.iVBORw0KGgoAAAANSUhEUgAAADkAAAANCAMAAAAkLTYMAAABNVBMVEUFBQxjY/UeHkoAAAAwd3dW1NQFDAxj9fUeSkpCQqRERKhCpKREqKgcHEZjY/YGBg4UMjJm/f0LGxscRkZj9vYGDg4BAQNdXeYoKGM6kJBMvLwBAwNd5uYoY2M4OItOTsECBARe6ekmXl44i4tOwcESEi1nZ/4NDR8eS0tj9PQECwsBAgIDCAgCBQUSLS1n/v4NHx9UVNAyMnxEqalCo6MfTExn//9HsLBU0NAyfHwuLnJYWNkGDw9k9/ccRUUVNDQOIyMucnJY2dkKChhmZvwWFjcoZGRc5OQKGBhm/PwWNzdKSrc8PJVOwsI4iopKt7c8lZUkJFlfX+wCAgYNISESLCwkWVlf7OwCBgYEBAliYvIgIFAyfX1Tzs4ECQli8vIgUFA/P5xFRapW1tYtcHA/nJxFqqpz75zbAAAA4UlEQVQokWNgYGRixgpYWLGLM7Oxc4AoBmZOLuwKWFlw6GTm5oHo5OXjxyYtICiES6ewiChYp5i4BDZpSSlcGpmlZWTBOpnl5LHIKigq4dTJrKwC0amqpo4pqaGpBaK0dUBAF4XFzKynbwDWyWxohKnT2ARMmZqBgDkKCwgsLCE6rawxNNrY2kFoexBwQGEBgaMTRKeziyu6Tjd3bdzeZGb28PQC62T29kGX8vXDp5GZ2T8AojMwKBhVIkQ/FL/OsPAIsM7IqGhUiZhY/BqZ4+ITwDqZE5NQJZJTCOhkTk0DAKMdIxY2dv3+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.381;4.blob,1.1,2788.iVBORw0KGgoAAAANSUhEUgAAAhAAAAASCAIAAACFNXD8AAAABmJLR0QA/wD/AP+gvaeTAAAH3klEQVR4nO3ca3BSVx4A8MMFLqRAQEAiyYaEgEQyQgzQPJRAzWSKpZ1sngx5bOIaDeOXfHC642Rrdtet2w+O2t31VTvMtJuqM3Hq6LSd4gxmrN1Ma9bR2s12E4nZpGqi5IEZQ0Iewt0PODFeCCFwWWL2/OZ+gPM/59w/M5wDnHsuAEBQvLGl7HinAEFrnCBBEH0nSPRdQFA0sn+Tvf1v2+OdBQStZW/+4s2dmTsJ6IjKpDZONYqMIgL6CmnL/i2mf5nCrExlMhunpkRGY0xTguIupThlp2snS8yKdyIQtCoYUlN/r9GEWZlGJh/XajdzuaGrydfJP9z6IZ/Ojzo7gMy75wcuDcjqZdH3FZrsVzLHZ44wK8+73QOXLsnq62OaEhRfJDKp8FThrT/emhyYjHcuELQq5Ccl3XA6w6w86/X+MDZWkJQUog5CQmqkNV/9/NXYzFj06SEAAEebI60kDU1Eo+9uKXwVnyPn9J3tC7+Jo60traQETUyMXVZQfKX/Mp2Rwui19sY7EQhaFURMpvC117pGRsJvcsPpzObx6GTyUhWyedkcGqfzcScRCQIEADDUMTQ3MZdRlUFIj0HJ6mXD14anhqbCbzLU0TE3MZFRVRW7rCDNwYM5LS205X7Sxoi0WvrQ/nDePR8YysvLu379usfjcTqdx48fZzKZC6GDGk1LTg6XRvsfZgpBkdNoDubktNBoy4+y/KSkuxMTE7Oz4XfeOzEx/eyZev36pSrkCnJ7nvTMeoP0GWKULTUzIAAAzIv1neuL3aoUQkGk1VJHW7jrUX6Y19t37hxclYqpWZdL1dpa9+CB9sQJtlSKiyJUKplOxx0khLCNEsn6ZOd3QX59Z2ZmXrt2zePxlJWVtbS01NbWtre3L0Rds7OtKtWDuroTWq2UDbdXQavd7KxLpWqtq3ug1Z5gs/GjbAFCIuUKBN+HvR7l58OwrpGREKtSG9kb+5/2B5aHHmWhZwbAVXAtPgsrLSbXHkVvixrdjRQGZaUNuQqFxedjpaXFIivID2Wzs/buLb95s8nrNVy+LNTpFkJFZ89aMAx3ZFRWEnJeOo9uwSzicnFg6MKFCw6Hg0J5/oYxGAwYhm3f/mInFRtF92Zl3Swv9zY1XTYYdEIhISlBUIygKDsra295+c2mJq/BcFko1AXWUXC5f922jbb04tJSUhiMj3Q6Hp0eGGJQGWd0Z3L4OYGhZUdZiJkBAAAq71SqDqhWmms4ituLiz4riqxt5Z07qgMHiM0HCoqnVBptNguGpe7Y4S9hicXrNRrcQVu3jpDTcTI5FsySUpQSGHK73YcOHVpcMjo6euTIkcCaSh7PZjRiFsuO1FRCsoKgmOLxlEajzWLBUlN34EJ75PJdmzZF1m2rWm0UBdnpmpSQdEZ3ZhMnSLfhj7LFM8OLb/2ONkeWJev2oduRZbwUlI2ml6RfKbkSWXNHW1uWxXL75RcGEYvKZErMZvnu3Xy1ur+93dXd7S+fevhw+tEjXGXf3BwhJyXTyAAA3zMfrjwhIYHBYDx+/Hhx4fDwMJ//0qZAJpVqlkh2y+VqPr+9v7/b5SIkKwiKESqVKZGY5fLdfL66v7/d5epeHE2gULJ5vJM//RRZ5987nTqh8Ov79/EnRagAAC/mxZWHOcoCZ4YXHxj3zt/LP5wvyBOMdK3gGv2yMqoyZsZnhjqGImt+7/z5/MOHBXl5I11dBGYF+XEVCkVzs8Rsxny+XqvVbjK5F73n3vjkk421tbgm9qqq/3z+efSnnnHNAAACFyo9Hs/09PSGDRsWFyYnJ1+9etX/WMHlNisUZonEh2HW3l6T3X7f7Y4+HwiKES5XoVA0SyRmDPP19lrtdpPbjZ/Z1Xz+1Px875MnkZ3iHyMjFWKxmMUamHxph/rUsykAAI2M3yGy7CgLPTM8Z7QZtSe1kWW8lJJvS/IP50fTg9Fm0548SVQ+0GJ6q7VmcFC5b1/Q7csxXZJCUGTP3B75Hnlg6OLFi4Grq8XFxf6nVr1+sKZmn1KZiMZwIzgEEUWvt9bUDCqV+1B0yZsE3s3OrsiIap9q8+bN1QFXpykkyqnCU4XCwsD6oUdZ6JnhOWm1tGGsAUEJ2wbDErMsPgt3c1S7NqXV1Q1jYwicHWKAk5mJUFa8GYEopd+VBv2CIpfLPR6PzWYzGAwNDQ3j4+NXrrxY0szkcCjE7dSCoFjjcDIRJNQo49PpH+l0yQxGNGd5XSA4VlBAIZFw5fu37K+WVgfWDz3KwpoZKAmUXU93pZemL5QgKEKmk3EHiUwKJwoAULWqKm5XrOx1B8kqYdfTp+mlpVH2A6026t+pzX3moKGtW7d2dnZ6PJ7R0dHTp08nwvs3obXrbZHogCraDUdUBPnLtm1beDxc+Ttp77z/+vtBm0QwyvAfR3qrHk1E7Sa7/2nZjTJBHv4/Dr/59Td3P727bBQAYPq3qefjnu4/d4Po6K1WNDHRbgr3r6igVwIjmVEzWPPFG18EvRsDgv5P/EGj+fujRx1DEV7oXVAvk9HJ5I97ehYXclDOB3kfHP3xaNC7MVYK/4GBw9nEoTKpuMLJgcmZ8ZlloxC0rIKjBXwV/8uiLwEW71QgaI2qyqgSMUXH/nkMg8MMeqVRGJSKWxW5f8qNdyIQtGbRyLT3VO+VpsNVfejVR+fTc34b5E5UCIKIwqQy3xK9FX0//wUotOnJcbdDwgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.402;4.blob,1.1,1084.iVBORw0KGgoAAAANSUhEUgAAANkAAAAOCAMAAACVW0nTAAABm1BMVEUFDAxj9fUeSkoAAAAwd3dW1NQFDAVj9WMeSh4wdzBW1FZCpKREqKhCpEJEqEQcRkZj9vYGDg4UMjJm/f0LGxscRhxj9mMGDgYUMhRm/WYLGwsBAwNd5uYoY2M6kJBMvLwBAwFd5l0oYyg6kDpMvEw4i4tOwcECBARe6ekmXl44izhOwU4CBAJe6V4mXiYSLS1n/v4NHx8eS0tj9PQECwsSLRJn/mcNHw0eSx5j9GMECwRU0NAyfHxEqalCo6NU0FQyfDJEqURCo0IucnJY2dkGDw9k9/ccRUUuci5Y2VgGDwZk92QcRRwKGBhm/PwWNzcoZGRc5OQBAgIKGApm/GYWNxYoZChc5FwBAgFKt7c8lZVOwsI4iopKt0o8lTxOwk44ijgkWVlf7OwCBgZh7+8GEBANISESLCwkWSRf7F8CBgINIQ0SLBIECQli8vIgUFADBwdX19dY29syfX1Tzs4ECQRi8mIgUCADCAMyfTJTzlM/nJxFqqpW1tYtcHA/nD9FqkVRyFFn/2cnYCdW1lYtcC0QKBAVNBUIEwgXRtbbAAABTUlEQVRIiWNgYGRiHvSAhRWFy8bOQUgHJxcDMzcPzRxENcDKgsrn5SOkg4uTgZlfQJBWDqIWEBIWQRUQFRPHr0NCUoqBWVpGlnZuog6Qk0cTUFBUwq9DWYWZgZlZVY1mTqIOUNfQRBfS0sarQ0dXD+QzfQNDmjmKKsDI2ARdyNTMHJ8OC0srkM+YrW1o5iiqAFs7TDF7B3w6HJ2YwT5zdqGRk6gDXN3cMQU9PPHo8PL2gfjM18+fVq6iBggIDMIUDA4Jxa0jLDwC4jPmyCgqOECQVpVHdAw20dg43DriE5ihPktMSqbYfpOklFSKDcEG0gzSsQlnZGbh0pFtlsMM9VluXj7FDigoLMIowagCikuwCpeWlQPJrAowUEBmMVdWgRSAfcZcXUMTR1EF1NZhF69vABKNTWDQjMxibmkFyTPQy4G0AW3tYNCBzIICAMZnWucaQQxHAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.421;4.blob,1.1,296.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAWlBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtMM6c0AAAAP0lEQVQImR3MRwKAIBAEwSWIYMKEmf9/U5o5VN9GpExpFK3Q2Ia4Fn3oSD+MZIo4LyvZ9kSOEy97k+etR1/GHzcdAbswyA83AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.782,3.421;4.blob,1.1,964.iVBORw0KGgoAAAANSUhEUgAAASgAAAAOCAMAAACrW3G0AAABaFBMVEUAAAAwdzBW1FYHAwOTPDwsEhJHHR1/NDQdHUc0NH9iKChlKSkUMhRm/WYLGwsqERGUPDwIAwMeDAyYPj4QBwcMDB4+PpgHBxA6kDpMvEwCAQGKODg7GBhWIyNxLi4jI1YuLnECBAJe6V4mXiZTIiJ0Ly+MOTk4FxcBAQI5OYwXFzgeSx5j9GMECwQbCwsTCAgtEhKSOzsSEi07O5IDAwdEqURCo0J9MzNKHh4pKWUoKGIGDwZk92QcRRxEHByCNTUJBAQpEREEBAk8PJQRESkoZChc5FwBAgEOBgaXPT0hDQ08GBiJNzcBAAAYGDw3N4kAAAFOwk44ijhuLCxZJCQvL3QiIlMNIQ1n/mcSLBI1FhaOOTkEAQEUCAgaCwsICBQLCxoyfTJTzlMFAgKROzswExNLHh58MjIeHksyMnxW1lYtcC1eJiZmKSl4MTGZPj46FxeANDRDGxs0NIAbG0MYCgofDQ0LBQUMhQSSAAABJElEQVRYheWOR1MCQRCFF1CiKLqKuhgJ5pwzRhRzjhgxgVkE/r7TUzMH2Tk3XeV36PfV68vTNIbFqv1nbCWl6ofdIc3p4mG1oAwii9uj7h12aS4n3DJvOc4gqlT4KlV1lV4trMZfC1FXjzaJJkagQVU3NklrboHbGgwhDSJLOKIojbZ2YR2dXRDdPb14k2jSp/eby4FBm7Ch4RGI0THESUQZnzB3Hre0ySm40zOzeIOoMhc1VfO+BWGLS8sQK7FVzEk0WYuvF1Ybm1vCtnd2Ifb2UScR5eCwsImEpR0dwz05PcMcRJXzi8Tf4lK/Enbtv4G4vcNdRJTk/QO7iSTHYPr4JF/PKR7plyJNI8brGzvvH5xPpl/f8pP5Kd4qqmRznLzi9Qv3mCQOaVPRRgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.459;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACQ1BMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MSLCwiIiIFBQUmXl4ucXEsEhJtLCwjIyP39/cSKys+mZksLBJtbSwCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjsbCwsLGhoMHR0bGwsbQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbvuD9ZAAABlUlEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS0hKwZjSMrKE1cvJw5kKikqE1SurwJmqaiS5TF1DkyT1SlraJKmnNdDRJU29nr4BMcoMjYyhLBNT4tSbQVnmFpZEqLcysoYxbWzxKbSzB1MOjnARJ2cdLOpcXIGEm7uHpxe6jLezD4jy9QMDfxA7IDAoOIQhNCw8IjIK06joGBAZGwwGcQwMfvEJibFJDAzJKalp2JyYngEiM7PAIJuBISc3Lx8kUlBYVFyCRX2pDap7ysorKqtAQtU1tZ517hjq6xtQ3cPgH9cY3BQIlmtuaUVX3tbegeoeEOjs6oZK96Cr73Xuw+arfmyCIDBh4iRcUljB5CkkKZ86zZsU5dMnziDJ+JmzSFI+OMDsOXPh7HnztQhrWLAQwV60eAlB9UuXLSfJQStWriJJPcPqNaSpX7tuPWkaNmwkTf2mzaSp37J1G2katu8gTf3OXbtJUr9n7z7SLNh/AL88ACvKW5JCGC6UAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492363801;4.copy,1.1,3.230,3.209,3.970,2.19,2.14,1.1,3.210,3.209;4.copy,1.1,3.240,3.228,3.960,2.19,2.14,1.1,3.220,3.228;4.copy,1.1,3.230,3.266,3.970,2.76,2.14,1.1,3.220,3.266;4.copy,1.1,3.220,3.285,2.10,2.57,2.14,1.1,3.210,3.285;4.copy,1.1,2.10,3.304,3.210,2.38,2.14,1.1,1.0,3.304;4.copy,1.1,3.470,3.456,3.730,2.57,2.14,1.1,3.460,3.456;4.copy,1.1,3.450,3.475,2.20,2.38,2.14,1.1,3.440,3.475;4.copy,1.1,3.440,3.494,2.10,2.19,2.14,1.1,3.430,3.494;4.rect,1.1,3.191,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.403,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.12,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.386,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.400,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1173,3.136;4.blob,1.1,276.iVBORw0KGgoAAAANSUhEUgAAABkAAAAMCAMAAACgLOZ5AAAARVBMVEUAAAANICBn//8LGxsIExMOIiICBQUOIyNk9/cBAgIDCAgfTExHsLAGDw8VNDQGDg4ECwtf7Oxh7+8GEBADBwdX19dY29vxr7pyAAAARElEQVQYlWNgwAIYmZixCYNlWHDIsDKx4ZBh58AhgQY4uUAAmyncTCDAg0WGlw8E2ImzgJ8fh4SAoJAwdhkRUTEBrBIArLABmf95t+0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.212;4.blob,1.1,1868.iVBORw0KGgoAAAANSUhEUgAAADoAAABZCAMAAABYBcfuAAACrFBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaodHUc0NH8DAwc8PJMSEiwoKGIpKWUMDB4+PpgHBxARESo8PJQDAwgjI1YuLnEBAQI4OIoYGDs5OYwXFzgiIlMvL3Q7O5ILCxsICBMzM30RESkcHEQ1NYIYGDw3N4kAAAE9PZcNDSEsLG4ICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWYkDw91Ly/FUFBEGxvuYGAhDQ0gICD///8bGxsDAQHaWFhwLS0TExNSISH1Y2MMBQUiIiIFBQU0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwctb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRkTLi5Kt7cdSEgNISEVNDQHEREnEBBCGxsuExO3SkpIHR0FDAwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsSLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAw/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgYQJycCBATGUFCVPDwEAgJ+MzPbWFgxMXg+PpkXFzoaCws6FxcFBQu/TU0BAAALBATNU1OFNjYUCAh6MTF3MDDUVlYyFBSQOjq8TEzpXl5eJiZLHh70Y2OpRESjQkL3ZGRFHBzkXFwCAQHCTk6KODj+Z2csEhJ9MjLOU1PWVlag17VUAAACh0lEQVRYhWNgwAsYmZjxK8ADWFjJ1srGzkGuVk4ubrKt5eElWysfvwDZegWFyNYqLEK2VlExcbL1SkiSrVVKWoZcrbJy8mRbq6BIttZRQBugpIzCVVFVI1qrshIqX12DWJ2aWtqoAjq6ekRq1TdAEzA0MiZOp6GJKbqQmTlxWvksVNCFLLWsiNKqoY4pZk1UcS6ra4MpaGtHjFZ7B0dMQQ4nZyK0mpthE3WRIqzTVcsNm7C7hydBrV7Yy15vH1+CWv38sYsHBBLUOnJBENk6g0PI1RkaFg5hRERGkaYzOiaWAaY1jjSt8QmJUFZSZDKqVEpqGl6t6RkwVmYWhM7OyYUw8vILCovArOISMChF1VpWjm5YRWVCFSTQq2tq6+obgIzGJjBoRlHX0hqP4ZC29o7OjC4Iu7unqZeBoa8fDCagKJvYOgmbNyZPaZ0KpKZNnzFz1mwcDp7c2oWpMXHO3HnzFzAsXLR4ydJlDLgcvLx1BbrGlatWr1m7DshYv2HjJogQVgdv3rIVXeu27Tt2ghm7dmPzCwLs2YsuMnEfHuWe3mBgCGLvP4DfaDRw8BAYHAaxj2w5SopWUQEwOAbmrD1+giR7kcDJU6fJ1cpw5izZWocAwNlaQWvVYAO4WivorRosAEdrBaNVgwXgaK1gtGqwAaytFSytGiwAa2sFS6sGG8DWWsHWqsECsLRWsLZqsAAsrRWsrRpsALO1gr1VgwVgtFZwtGqwAEhrBamowdGqwQbArRWkogZXqwYXQClqRgGtwLnzZGs9f45cnRc6F5Cr9eIlcnXuu3yFXK1Xr50kV+v1G+TqbLt5i1ytc27fIVfr3Xvk6gy//4BcrQ8fkauT4XEsTikAUf6mwFjKO9AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.332,3.250;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAADcAAAANCAMAAAA65Aa/AAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAAVElEQVQokZ3LxxGAMBQDUdnkaHLO0H+NwEADX3uRLg94UhqSLNv5jlYiB9fz3wnCSOb+4oRiqckolxcl5aqaYk3bUa4fRspNM8WWdaPcflAM50WxGx79Ap7c3b50AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.562,3.345;4.blob,1.1,1276.iVBORw0KGgoAAAANSUhEUgAAAhgAAAANCAMAAADc3ucjAAAB71BMVEUAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFDAxj9fUeSkoMBQX1Y2NKHh5CpEJEqERCpKREqKikQkKoREQUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscRkZj9vYGDg5GHBz2Y2MOBgY6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAwNd5uYoY2MDAQHmXV1jKCgCBAJe6V4mXiY4izhOwU4CBARe6ekmXl44i4tOwcGLODjBTk4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSLS1n/v4NHx8tEhL+Z2cfDQ1EqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NU0NAyfHzQVFR8MjIGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUucnJY2dlyLi7ZWFgoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIKGBhm/PwWNzcYCgr8ZmY3FhZOwk44ijhKt0o8lTxOwsI4iopKt7c8lZW3SkqVPDwNIQ0SLBIkWSRf7F8CBgINISESLCwkWVlf7OwCBgZZJCTsX18GAgIyfTJTzlMECQRi8mIgUCAyfX1Tzs4ECQli8vIgUFAJBATyYmJQICBW1lYtcC0/nD9FqkVW1tYtcHA/nJxFqqqcPz+qRUWzXFTfAAABiUlEQVRYhc2O1XICQRBFB5JA3N3d3Z0kxIi7EXd3d3d39w8NC0mqFnbhhZnp8zDde/d21UFIgUCIuDEwNOL+IRLzXEDH2MSUtgJwzMwt/nehgK9lacWdi0V6FyKEtQ1tA+jY2v1t9g6OfCUnZxeu2NXNHYcSCTw8vWgrAMfbx/d38/PnLQUEBnHFwSE4jIgQGhZOWwE4EZFRqiU6Jpa/FRfPESYkJmFRIkJyCm0D6KSmqWZ6RiYzJFkM2awNoRxpruZlXn4BKUn9Uygroq0AnOKSUuUsK1eOikqGKtamoLpG87K2jpAiFuobaBtAp7GJeeXNLcoveStDG2tT0N6hcdfZ1U3MEQM9vbQNoNPXz7wDgxJtpaHhEfVodGwclxIJJianaCsAZ3pmVvHOzWtvLSyqJ0vLmIQIsbJK2wA6a+sIbUg3tZe2tnfYwa5sD5sREfYPDmkrAOfo+ASdnukonV9csoOra2xCZLi5vaOtAJz7h0f09Kyr9fLK/n57x6RDjI9P2gbQ+fr+AQXzQFSGntUsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.362;4.blob,1.1,3032.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.364;4.blob,1.1,1272.iVBORw0KGgoAAAANSUhEUgAAADAAAAAjCAMAAADlnnmAAAAB+FBMVEUAAAAwd3dW1NQFDAxj9fUeSkpCpKREqKgUMjJm/f0LGxscRkZj9vYGDg46kJBMvLwBAwNd5uYoY2MCBARe6ekmXl44i4tOwcEeS0tj9PQECwsBAgIDCAgCBQUSLS1n/v4NHx9EqalCo6MfTExn//9HsLBU0NAyfHwGDw9k9/ccRUUVNDQOIyMucnJY2dkoZGRc5OQKGBhm/PwWNzdOwsI4iopKt7c8lZUNISESLCwkWVlf7OwCBgYyfX1Tzs4ECQli8vIgUFBW1tYtcHA/nJxFqqoWCRZGHEZ2MHYpESmPOo8UCBQCAQKDNYNDG0MxFDGTPJMHAwdnKmdqK2o3NzfBwcH39/fp6emTk5MMDAw0gYExeXkHEhKMOYxHHUcnJyf29va4uLhISEhiYmLu7u61tbUtb288lJQPJCQLBQuZPpmqqqra2toEBARHR0f///9BQUEqaWlSy8sZPj4XCRcoECj09PSEhITr6+uMjIwTLi4dSEgcCxwlDyUJCQlsbGzR0dGgoKBRyMhl+/sRBxEsEiz19fWNjY0/m5ti8/Nh8fE5jY0MHh4EAQSWPZY9GT2tra1ERERa4OB3MHdZJFkpKSm3t7dfX1/t7e0QJydMH0w6OjrExMSXl5cODg4QBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkk5fmu+AAABfUlEQVQ4jWNgAAFGJgbsgJmFFas4EyMODQxs7NhEOTi5cGng5uHFIsrHj0s9g4CgEKagsIgoTg0MYuKYYhKSUiBKWgYEZFFYDAxy8goYGhSVwJSyCgioorCAQE0dXb2GphaE1gYBHRQWEOjqoWvQN5DG7QUGBkMjYzQRE1N86hkYzMxR+Rbylvg1WFnboPBt7fCrZ7B3cEThOzkT0MDg4kpIxbABbiSqd/cgTb2nlzdJ6n18/UizwD8gkDQNQcFQRkhoWHhEJJARFR2DT0NsHISOT0hMSk5JBbLSeFjSM3Cqz8zyhzCyc3IZGPLyC4BMjcIiTtViHBpKskohjLJyEFlRCeFVmalUY9dQk1ULpuvy60FUQyOIZNZvambHUYC1ZLVCGG0QG9qBpUdHZ1d3Dy4/9Pb1QxgTIH6YCMwUk3SxlYEwMHkKhJ4aNi1v+oxEIGumMB7lDAyzfKGM2XPCKubOw6sWDOb3LSCsCAUsXLSYNA2BS5aSaMWy5djFAffIRTse3l2cAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,1212.iVBORw0KGgoAAAANSUhEUgAAACUAAAA0CAMAAAA6ygEPAAABzlBMVEUAAAAHAweTPJMsEix3dzDU1FZiKGJlKWUqESqUPJQIAwgyMhT9/WYbGwsCAQKKOIo7GDuQkDq8vExTIlN0L3QEBALp6V5eXiYBAAEFAgUDAQMbCxuYPpgTCBNLSx709GMLCwQuEi6ZPplqK2p9M31KHkqpqUSjo0IJBAkfDR8VCRVEHESCNYIPDwb392RFRRwOBg6XPZchDSFkZCjk5FwCAgFuLG5ZJFnCwk6Kijg1FjWOOY4EAQQhIQ3+/mcsLBKRO5EwEzB9fTLOzlNeJl5mKWbW1lZwcC1KSh62tkoFBQIICANbWyXS0lX//2fIyFGkpEJUVCIJCQRsbCzf31r4+GQ5ORc0NBUREQenp0P7+2WBgTQTEwhQUCDa2ljx8WGVlTwuLhPLy1LGxlBcXCVDQxu7u0zz82ItLRJHHUd/NH8MDAX19WOoqEQeDB4QBxBGRhz29mMODgZWI1ZxLnEDAwHm5l1jYyiMOYw4FziLizjBwU4tEi2SO5IfHw3Q0FR8fDIpESlyci7Z2Vg8GDyJN4kYGAr8/GY3Nxa3t0oUCBQaCxpZWSTs7F8GBgJLHkt8Mnzy8mJ4MXg6FzqANIBDG0OcnD+qqkUYChgLBQvON31AAAABeklEQVQ4je2VVVOCQRhGX5QQAwNQUCwMwC5MwFYsBOxAsQG7u7u7/q3w4QgbjF55xblg5jlzmN2Lb2YBfmAFBAIVNsd7cXn0isP2XkH8YFoUEhrmPQXhEbQqMgrdQhElEkfHAEikLmIZESeLJ6uExCSAZLmLFLdJTSOrdIXzR6lykeE2mVlElJ2Ti6u8/AJcFRapiX8Wl+CmtIy8RHmFBhVaXSVZSauqUVFTS0YAdfXobmikVX7+C30TVTe3MDCfjLi1zdBOrYwGBhOAuaOzS9FNP0Lbw9AL0Nc/MOjrIp4TLUPD1hEfledEUJtGDWPjv5zoYmJyytehCLY/VX58Yncgc3pGT6scdnQbZynRnGweFQuLS2S1vIKJ1bV1IhJsbOJqa5uodnZZuLLp9nDF45KX2D/AhJJ/SFZHx5g4OZWQ1dn5BSpEQjICuLQi80p2Tatubu9Aw7xDUoFz3j/QIjA/WuCJeYfkz8758kqt4O0dPph3SPVJD775AuxyRBPQFOPqAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.402;4.blob,1.1,1888.iVBORw0KGgoAAAANSUhEUgAAAhkAAAAOCAMAAAC1iP6zAAACqVBMVEUFDAxj9fUeSkoAAAAwd3dW1NQFDAVj9WMeSh4wdzBW1FYgICD///8bGxthJydpKytCpKREqKhCpEJEqEQTExMNBQWTPDwsEhIcRkZj9vYGDg4UMjJm/f0LGxscRhxj9mMGDgYUMhRm/WYLGwsiIiIFBQVeJiZxLi4BAwNd5uYoY2M6kJBMvLwBAwFd5l0oYyg6kDpMvEwSLCwsbW0jIyP39/crEhKZPj4OBgZKtko4i4tOwcECBARe6ekmXl44izhOwU4CBAJe6V4mXiYBAgIWNzczfn4+mZkxeHgIAwM0FRUCBQIDCAMBAgElWyVV0lVn/2dRyFESLS1n/v4NHx8eS0tj9PQECwsSLRJn/mcNHw0eSx5j9GMECwQCBQUaQUE2hoY8lZUoYmIOIiKLODhMHx8iVCIECQQsbCxa31pk+GRCo0IXORdU0NAyfHxEqalCo6NU0FQyfDJEqUQpZGQ9l5cfTU0FCwuBNDRZJCQNIQ0VNBUHEQdDp0Nl+2U0gTQIEwgucnJY2dkGDw9k9/ccRUUuci5Y2VgGDwZk92QcRRwTMDA1g4M7kZEkWVkLHBx/MzMgUCBY2lhh8WE8lTwTLhMKGBhm/PwoZGRc5OQKGApm/GYWNxYoZChc5FwAAQExenqFNjZSISFSy1JQxlAlXCVKt7dOwsI4iopKt0pOwk44ijgQKCgtcHA7kpICAQGVPT1BGhobQxtMu0xi82Jf7OwCBgYNISEkWSRf7F8CBgISLBIaCwsdDAwECQli8vIgUFAyfX1Tzs5i8mIyfTJTzlNDGxuKODgBAAAEAQEFAgIDCAg/nJxFqqpW1tY/nD9FqkUnYCdW1lYtcC16MjJLHh54MTE6FxdRyMhn//8nYGAQKBAwExOJODgYCgofDQ0LBQUVNDQIExOMJxuGAAACmUlEQVRYhWNgYGRiHuKAhRWFy8bOQUgHJxfNHDNYADcPL5TFx0+GdhZWBmYBQWo6aCAAKwsqX0iYkA4uTlq5ZdAAbh4RKEtUTJx07awsDMwSklJUdRLdgbSMLKqAnLwCfh2KSsq0csygASo8qjCmmjrJuoFhysCsoalFVSfRHWjroAno6unj12FgSDPHDDwwMgZTJqZwETNzC7w6OCwxhIBhysDMbGVNXafRGdjY2qEL2Tvg1eHo5Ewrxww0cHF1c/dAF/Q090IV8PYBA18Q29HPPyAQXQcoTIEpIyg4hFYOpQcIDQtHF4qIjMKnIzomlnbOGUgQF5+QmJSMKZ6SisoXCgCDNGbm9IzMrOwcDA2gMAWmDObcPJq4k04gvwBTrLAIn47ibFq5ZYBBSWlZOTbxikpUflU1GNQwM9fW1Tdg0QAKU1DKaGyiviPpBppbWjEF29rx6Ojo7KKZawYWdPf09vVjEZ+ghspH1CYTJ02eMhVDPThMQSlj2nRXmjiULmDGTBdMwVmz5+DWMXeeL+2cM7BgvvQCdxbMyFy4CJWPqE2YfdMWByxZiqYeHKaglMG8LJFGLqUDWL4Cm+jKKbh1rFpNK7cMBrBm7Tp0ofUbNqIKIGoTENi0eQuaBnCYglNG39ZttHAkPcD2YCNswjt27sKloypyN+2cMxiALLrAHvO9+HVEoHIhYQpOGfv2H6Cau+gMDh7CKpx+eCKQ3AWpT3WRWcxHjtLVgYMAHDt+AkSdPAUG67Er2nYaDDSYYWEKThnMZ87Sx43UB+fWYhc/fwFIBELq04vILOZLl+npvsEArlwFU9fMweA6dkU3boLBLWZYmDLQy3kDAW5D6tMGZNbIA3fueoLpe/fB4AF2VWsegsEjuAAAOpYFoKpk3c0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.402,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.802,3.421;4.blob,1.1,952.iVBORw0KGgoAAAANSUhEUgAAASgAAAANCAMAAAAtzwMaAAABX1BMVEUAAAAwdzBW1FYHAwOTPDwsEhJHHR1/NDQdHUc0NH9iKChlKSkUMhRm/WYLGwsqERGUPDwIAwMeDAyYPj4QBwcMDB4+PpgHBxA6kDpMvEwCAQGKODg7GBhWIyNxLi4jI1YuLnECBAJe6V4mXiZTIiJ0Ly+MOTk4FxcBAQI5OYwXFzgeSx5j9GMECwQbCwsTCAgtEhKSOzsSEi07O5IDAwdEqURCo0J9MzNKHh4pKWUoKGIGDwZk92QcRRxEHByCNTUJBAQpEREEBAk8PJQRESkoZChc5FwBAgEOBgaXPT0hDQ08GBiJNzcBAAAYGDw3N4kAAAFOwk44ijhuLCxZJCQvL3QiIlMNIQ1n/mcSLBI1FhaOOTkEAQEUCAgaCwsICBQLCxoyfTJTzlMFAgKROzswExNLHh58MjIeHksyMnxW1lYtcC1eJiZmKSl4MTGZPj46FxeANDRDGxs0NIAbG0OePa8JAAABJElEQVRIiWNgAAJGJoaRAphZWLFLsLHj08bBCaaYGKnuoEELuLixi7Oz4dPFyQEieXj5qO+gwQr4BQSxCQsJi+DRJComDqIkJGnipMEJpKRlsAnLyuHTJK8AIhWVlGngoEELVFSxCEqpqePRoqGpBaK0dXRp46TBCfSE9TEFDQyZ8WgxMjYBUaZmNHLSIAXmFphi3Fz4dFhagUhrG1vaOGiwAjt7DCEHAUc8GpycXUCUq5s7rZw0OIGHpxe6kLePLx4Nfv4BICowiGZOGqQgOARdRFUFn/rQMBAZHhFJKwcNVhAVHYMqECsch0d5vFgCiEpMop2LBilITkkFkjHJYCAFZKal41OekQmmsrLp4LRBBnJygURePhgUAJmFRfhUF5eASACJgSBefohzPAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.457;4.blob,1.1,3136.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.649;4.blob,1.1,5660.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1088.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACHUlEQVRoge3YR1MCQRCGYVSUZFwxiwkDRhTFnP3//0m2Z1l2ptgpvrGp9tDPYeHS0Ld9qwsFQROSfz4wOSW9ASlOz0ivECuVK9IrkGptVnoFMjcvvYGxsCi9AVmKqtIrkOWoLr0CWYlWpVcga9G69ApkY3NLegVjuyG9gbFTlt7A2N3ck17B2D9oSq9AZg+PpFcwjk+kN8iB9xln0bX673+8z1iL7vTsnD7xPmMuuovL+In3GXfRXdXiVw3eZ+xF174uhPQZe9HdRK2QPmMvuk50G9BnYyi6u52APhtD0XUbAX02hqK7bwf02RiK7uExoM/4i6709BzSZ+xF9xK9hvQZe9FV3pohfcZedO8f8RPvM+ai+/zqxB94n/EW3fdb0XzB+4y16Oo/jD/GqAW/zfEJ2/C67PfZ6PAJS15dmj5D4BMZuXVp+gyBTwx46pL6DIJPpDx1SX0GwSdSnrqM+wyDT6R8ddnrMxA+kfDWZRd+o+MTCW9d9voMhE8kvHXZ6zMQPpHw1SX1GQSf6PPVJfUZBJ9IeeqS+gyCT6Q8dWn6DIFPpPLrMukzAD6RkVeXaZ+NDJ/IyqtLvM/+WHR6LxxK74UOvRc69F5o03uhQ++FNr0XWvReaNN7YZbeC/30XujQe6FD74U2vRc69F5o03uhRe+FNr0XZum98L/Re2FM74UOvRc69F7o0HuhTe+FFr0X2vReaNF7oYXq8he7oFQYbb+g1AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492363912;4.copy,1.1,3.220,3.209,3.980,2.19,2.14,1.1,3.210,3.209;4.copy,1.1,3.230,3.228,3.970,2.19,2.14,1.1,3.220,3.228;4.copy,1.1,3.240,3.266,3.960,2.57,2.14,1.1,3.220,3.266;4.copy,1.1,3.230,3.285,2.10,2.38,2.14,1.1,3.210,3.285;4.copy,1.1,2.20,3.304,3.210,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.340,3.323,3.860,2.19,2.14,1.1,3.330,3.323;4.copy,1.1,3.410,3.456,3.790,2.57,2.14,1.1,3.400,3.456;4.copy,1.1,3.290,3.475,3.120,2.38,2.14,1.1,3.280,3.475;4.copy,1.1,3.270,3.494,2.20,2.19,2.14,1.1,3.260,3.494;4.rect,1.1,4.1173,3.145,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.383,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.388,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.383,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.392,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.432,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1163,3.136;4.blob,1.1,736.iVBORw0KGgoAAAANSUhEUgAAACUAAAAvCAMAAABT2/NXAAAA7VBMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDQCBgYDCAgBAwNRyMhn//8nYGAIExMNICALGxta398yfX0bRERZ3d0OIiICBQVDp6dKtrZl+/sbQkIOIyNk9/cHERFk+PgdR0dIsrJDpaUsbGxc4+MgT08GEBBUz88CBARe6Ogrampj9fVc5eUqaWk6kJAKGBgECwsMHh4jV1ckWlpb4uIweHhj9vZi8vIpZmZW1tYQJydrkG5tAAAA9UlEQVQ4je2VWU8CMRhFWzZZBQYYkEUou7KDsm/qiOz//+cwaVqKMx/0hQRjOE+nzU36Pdy2CAFgixXaNmCzO7A89eB0uaUhj9f36JemAkGshDyyVDiC1GhMEnqKJxBSktIj/zqpZ0r6cipDKNnLKXeSkrvedLdG9BgyjugxZBzRY8gYoseQcUSPIeOIHkPGED2G7M7/IE8KzHCxZDKR4le3TF6w0TivpMKsWqs3jMZptpi0O2/vXYOZ6fXVQWv428x/w8iCxpPpqamh2fxDX39+HUNa+BuhweLUfpbx1bqaX2y0M8dTtvrzpuxIXfLK0dH2+oQHKPocSqUlWcQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.312,3.250;4.blob,1.1,356.iVBORw0KGgoAAAANSUhEUgAAAEEAAAANCAMAAADBs/NgAAAAb1BMVEUAAAB3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC2B0+icAAAAVklEQVQokaXMxxGAMBQDUdnkaHLO0H+NwEAFX3uRTg94UhqyLNv5jlZCAa7nvxOEkVT4ixMSSE1GCnlRkkJVk0DTdqTQDyMpTDMJLOtGCvtBAjgvErgBrtsCnsQrTrIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.311,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.552,3.345;4.blob,1.1,1276.iVBORw0KGgoAAAANSUhEUgAAAjYAAAANCAMAAACNStRAAAAB71BMVEUAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFDAxj9fUeSkoMBQX1Y2NKHh5CpEJEqERCpKREqKikQkKoREQUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscRkZj9vYGDg5GHBz2Y2MOBgY6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAwNd5uYoY2MDAQHmXV1jKCgCBAJe6V4mXiY4izhOwU4CBARe6ekmXl44i4tOwcGLODjBTk4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSLS1n/v4NHx8tEhL+Z2cfDQ1EqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NU0NAyfHzQVFR8MjIGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUucnJY2dlyLi7ZWFgoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIKGBhm/PwWNzcYCgr8ZmY3FhZOwk44ijhKt0o8lTxOwsI4iopKt7c8lZW3SkqVPDwNIQ0SLBIkWSRf7F8CBgINISESLCwkWVlf7OwCBgZZJCTsX18GAgIyfTJTzlMECQRi8mIgUCAyfX1Tzs4ECQli8vIgUFAJBATyYmJQICBW1lYtcC0/nD9FqkVW1tYtcHA/nJxFqqqcPz+qRUWzXFTfAAABiUlEQVRYhdWOVVPDUBBGbwu0uLu7u3uBYsXdiru7u7u7+w+laYGZtEn7QrLLebi7+fLtzCFEgUBImNHTN2D+IRKzXPxvDI2MoRWQY2Jq9rsLBWwtcwvmXCz6cyEUWFpBG2DH2uZns7WzZys5ODoxxc4urlwowePm7gGtgBxPL+/vzceXteTnH8AUBwZxYYSA4JBQaAXkhIVHqJbIqGj2VkwsQxgXn8CJEgISk6ANsJOcopqpaenUkGRQZNI2QrKk2ZqXObl5fEnyTb6sAFoBOYVFxcpZUqocZeUUFbRNQWWV5mV1DU+KANTWQRtgp76BeuWNTcoveTNFC21T0Nqmcdfe0cmbI+90dUMbYKenl3r7+iXaSgODQ+rR8MgoV0rwjI1PQCsgZ3JqWvHOzGpvzc2rJwuLHAmhYGkZ2gA7K6uErEnXtZc2NrfowbZshzMjBOzu7UMrIOfg8Igcn+gonZ6d04OLS86EMHB1fQOtgJzbu3vy8Kir9fRM/3555UgHCW/v0AbY+fj8Ah3UQFTBS06tAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.362;4.blob,1.1,1860.iVBORw0KGgoAAAANSUhEUgAAASkAAAASCAMAAAAwjdhqAAAC7lBMVEUAAAAYCgoLBARUIiLPVFQPBgaiQUGvR0cFDAxj9fUeSkowdzBW1FYFDAVj9WMeSh4VCAj1Y2NJHR1CpKREqKhCpEJEqEScPz+9TEwcRkZj9vYGDg4UMhRm/WYLGwscRhxj9mMGDgYsLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQlKtrYBAwNd5uYoY2M6kDpMvEwBAwFd5l0oYygCAgE3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMg4i4tOwcECBAJe6V4mXiY4izhOwU4FBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzMiVFQECQksbGxa399k+PhCo6MXOTkSLS1n/v4NHx8eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1kZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExNU0NAyfHxEqURCo0IfTB9n/2dHsEdU0FQyfDIwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi4ucnJY2dkGDwZk92QcRRwVNBUOIw4uci5Y2VgBAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFwKGBhm/PwWNzcoZChc5FwKGApm/GYWNxYoKBBwcC2Skjutra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/NKt7dOwk44ijhKt0o8lTwbGwspKSm3t7dfX1/t7e0sEhIxFBQECwtf7Oxh7+8GEBAkWVkCBgYNIQ0SLBIkWSRf7F8CBgI6OjrExMSXl5cODg5vLS3mXV0CAQEDBwdX19dY29ti8vIyfTJTzlMECQRi8mIgUCDMUlJ9MjI/nJxFqqpW1lYtcC0/nD9FqkVQICDlXFwpERFFHBxCGxtLHh4cUPDfAAACP0lEQVRYhWNgwAYYmbAKjwIMwMzCOtBOGCqAjX2gXUArwMHJhV2CmweHDl4+fjzmCQgKUeqkwQqERbCL83Dj0iEqhs88cQnK3DN4gaSUNDZhGVk5XDrkFRThbCVlEKmiqqauoQkR0dLWIdJmLl1i3Tg4gJ6+ATZhQyOcOoxNTCEMM3MLSysgbW1ja2fv4AgRdNJ2xqXRxRUM3EBsdw9PL29y3TxAwMcXi6CffwBuHYFBIDI4JDQsPALEioyKZmCIiY2DyMYn4NIn7AUGiQwMSckpqWnp5Lt5YEBGZhamYHZOLojKyweBAhQWA0NhUTGQLCktK4corqgEkVXVEF5NLS6b6urBoIGBobGpuYV6PqAbaG3DFGvvAFOdXSDQjcICgp5eINHXP2HiJBBvcuwUEDV1GkRy+gxcFiFy38xZs+fMpaIX6ATmzccQWrBwEYReDAJLUFhAsHQZiFy+YqXlKnMgYzUkTa2BSK5dh8siRO5jcEtc77VhIxU9QRewafMWdKGt2/Lw6di+YyeEsWv3HiC5F1JO7QML7T9wEJc2RO4DgUOHj5DmTmmslTRdwdE56CLHjuPXceIkjHUKiE+rnYk5e84WInBe+wKx9mYQqxAMLl66fIUkDTQAVy9dQxW4XnQDv46bt24jc+/cVau6dx/CfvDwETXdhgCPnzy9SBuTiQdJz2aiCjx/QUDHy1evcUm9eUsFFw1a8O49Kv/DR0I6Pn3GIfHlqxMVHDQCwLeH3wfaCUME/Pg50C4YfAAAWmKlq4b0zPoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.364;4.blob,1.1,804.iVBORw0KGgoAAAANSUhEUgAAADkAAAANCAMAAAAkLTYMAAABNVBMVEUFBQxjY/UeHkoAAAAwd3dW1NQFDAxj9fUeSkpCQqRERKhCpKREqKgcHEZjY/YGBg4UMjJm/f0LGxscRkZj9vYGDg4BAQNdXeYoKGM6kJBMvLwBAwNd5uYoY2M4OItOTsECBARe6ekmXl44i4tOwcESEi1nZ/4NDR8eS0tj9PQECwsBAgIDCAgCBQUSLS1n/v4NHx9UVNAyMnxEqalCo6MfTExn//9HsLBU0NAyfHwuLnJYWNkGDw9k9/ccRUUVNDQOIyMucnJY2dkKChhmZvwWFjcoZGRc5OQKGBhm/PwWNzdKSrc8PJVOwsI4iopKt7c8lZUkJFlfX+wCAgYNISESLCwkWVlf7OwCBgYEBAliYvIgIFAyfX1Tzs4ECQli8vIgUFA/P5xFRapW1tYtcHA/nJxFqqpz75zbAAAA4UlEQVQokWNgYGRixgpYWLGLM7Oxc4AoBmZOLuwKWFlw6GTm5oHo5OXjxyYtICiES6ewiChYp5i4BDZpSSlcGpmlZWTBOpnl5LHIKigq4dTJrKwC0amqpo4pqaGpBaK0dUBAF4XFzKynbwDWyWxohKnT2ARMmZqBgDkKCwgsLCE6rawxNNrY2kFoexBwQGEBgaMTRKeziyu6Tjd3bdzeZGb28PQC62T29kGX8vXDp5GZ2T8AojMwKBhVIkQ/FL/OsPAIsM7IqGhUiZhY/BqZ4+ITwDqZE5NQJZJTCOhkTk0DAKMdIxY2dv3+AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.381;4.blob,1.1,4744.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,708.iVBORw0KGgoAAAANSUhEUgAAABEAAAAzCAMAAABG1xP1AAABDlBMVEUAAAB3dzDU1FYyMhT9/WYbGwuQkDq8vEwEBALp6V5eXiZLSx709GMLCwSpqUSjo0IPDwb392RFRRxkZCjk5FwCAgHCwk6KijghIQ3+/mcsLBJ9fTLOzlPW1lZwcC1KSh62tkoFBQIICANbWyXS0lX//2fIyFGkpEJUVCIJCQRsbCzf31r4+GQ5ORc0NBUREQenp0P7+2WBgTQTEwhQUCDa2ljx8WGVlTwuLhPLy1LGxlBcXCVDQxu7u0zz82ItLRIMDAX19WOoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4fHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0pZWSTs7F8GBgLy8mKcnD+qqkXUv323AAAAvklEQVQokdXQRQ4CURBF0cLd3bXpxt3d3X3/GwF6AjxGTEi4w5Oq/Pwiek8gBCChAEAkloBIZQByhRJEpdaAaHUAeoMRxGS2gFhtAHaHE8TlBiCPF+U/8vkpEOTjzyAPhZkIsQwfRxSNxRO65P0EKb40USabyz8mn1uFYqlcuctziyxclanVX7YeNZqtj+fbP/vo93W6PiS2h9IfDEFG4wkOTWcobcccabFEWa1RNtsd0r6McjieQKLnAg5drjdZYBd5SpovZAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.392,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.822,3.421;4.blob,1.1,956.iVBORw0KGgoAAAANSUhEUgAAASgAAAANCAMAAAAtzwMaAAABX1BMVEUAAAAwdzBW1FYHAwOTPDwsEhJHHR1/NDQdHUc0NH9iKChlKSkUMhRm/WYLGwsqERGUPDwIAwMeDAyYPj4QBwcMDB4+PpgHBxA6kDpMvEwCAQGKODg7GBhWIyNxLi4jI1YuLnECBAJe6V4mXiZTIiJ0Ly+MOTk4FxcBAQI5OYwXFzgeSx5j9GMECwQbCwsTCAgtEhKSOzsSEi07O5IDAwdEqURCo0J9MzNKHh4pKWUoKGIGDwZk92QcRRxEHByCNTUJBAQpEREEBAk8PJQRESkoZChc5FwBAgEOBgaXPT0hDQ08GBiJNzcBAAAYGDw3N4kAAAFOwk44ijhuLCxZJCQvL3QiIlMNIQ1n/mcSLBI1FhaOOTkEAQEUCAgaCwsICBQLCxoyfTJTzlMFAgKROzswExNLHh58MjIeHksyMnxW1lYtcC1eJiZmKSl4MTGZPj46FxeANDRDGxs0NIAbG0OePa8JAAABJ0lEQVRIiWNgAAJGJobhCJhZWLFLsLGTahQHJ5hiYqTIQYMWcHFjF2dnI9UkTg4QycPLR5mDBivgFxDEJiwkLEKiQaJi4iBKQpJiJw1OICUtg01YVo5Ug+QVQKSikjKFDhq0QEUVi6CUmjqJxmhoaoEobR1dyp00OIGesD6moIEhM4nGGBmbgChTMyo4aZACcwtMMW4uUk2xtAKR1ja2lDtosAI7ewwhBwFHEg1xcnYBUa5u7tRw0uAEHp5e6ELePr4kGuLnHwCiAoOo4qRBCoJD0EVUVUg1IzQMRIZHRFLDQYMVREXHoArECseRaES8WAKISkyijosGKUhOSQWSMclgIAVkpqWTakRGJpjKyqay0wYZyMkFEnn5YFAAZBYWkWpCcQmIBAABUyBekwLjeQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.221,3.459;4.blob,1.1,1984.iVBORw0KGgoAAAANSUhEUgAAALEAAAAzCAMAAADvjxkkAAAC+lBMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwSLCwsbW0CBAJe6V4mXiYBAgIWNzczfn4+mZkxeHgeSx5j9GMECwQCBQUaQUE2hoY8lZUoYmIOIiJEqURCo0IpZGQ9l5cfTU0FCwsGDwZk92QcRRwTMDA1g4M7kZEkWVkLHBwoZChc5FwBAgEAAQEUMjIxenowd3dOwk44ijgQKCgtcHA7kpIGDg4NIQ1n/mcSLBI5OYxnZ/8DAwgLGxsECwtf7Oxh7+8GEBAyfTJTzlM6OpBnZ/4CAgQDBwdX19dY29tW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MiIiIFBQUmXl4ucXEsEhJtLCwjIyP39/cSKyssLBJtbSwCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAoEBBwLS2SOzs9lZUoKBBwcC2SkjsbCwsLGhoMHR0bGwsbQ0M4iooBBAECBQIyenoeS0sxeDE+mT44iYkKGAoNHw0KGRkRKSkSLS0HAweTPJMsEiweHkplZfkMDAX19WNKSh5iKGJlKWUgIE9cXOQJCRekpEKoqEQqESqUPJQIAwhGRhz29mMODgYCAQKKOIo7GDvm5l1jYyhTIlN0L3SLizjBwU4bCxuYPpgTCBMtLRL+/md9M31KHkrQ0FR8fDJEHESCNYJyci7Z2VgOBg6XPZchDSEYGAr8/GZuLG5ZJFm3t0o1FjWOOY4EAQTs7F8GBgIFAgWRO5EwEzAJCQTy8mJQUCBeJl5mKWacnD+qqkW1usjPAAACkElEQVRoge3XVVBUURzH8QsWBngt7EYxwEDXxgZbUVlbbEVEQFxbQbGxW+xuxe7u7u7u7pxx7hV2Z8+eA/8L4/+vM/t5uPfM7+zD9+G+rCSZs7GV/jO2NtQFGiVImIg6QaPESagLuOySim6SJU+BGQJj75BSTiW6TJ0mLWYLRDrH9BkyZhJeZ86C2AKTNVv2HOLbnLlyo5VAOeXJ65xPeJu/QEHEFiAX10JyYQfBZZGiqC1gbsWK/znodOYXJUqWij6WLlMWMylW5dSne/kKFc3mSpWNxypVPTCDgDyrVXc3G2rUNB5r1cauiac6detRJ2jk4VWfOsHqn6PzpC7QyrVBQ+oEGG99o6hT4yakIWDe+qZRp2bN7UhLoFroW0YffVpRhsSudRv11badcWkv6zi/69ARKShmnXw7+3VhR3+5q/IKCFQFKeduwd0NPbDjOHr26t2nbz/Lvf8A5RliUIVKUuDAQWEhg7HreIYMHTact49wVp4jw1WjJGn0mLHjcMtExk+YOGkyZ5/iozxNX8XUadMjZiC3CcycNdtvjq/FPHee8jR9FVJQ6HzDgmDkOJGFixazk/0SR+Vl+ioUS5ctxw2LwQp2WCmv4v1u9d9Pias1kS7UCay161Si6/UbMGNANm5SCW6dNvuj1kBs2ariX26L3I5bE29uO6gLrKziaOeu3cbznr1ehCV8+/YfYKeDh0znw0eOYtaAHDvOLidOnqIIATt95iyznDt/gaQEKuDiJXa6fIUiBO7qNXa5fuMmRQjYrdvh7HTnLkGHBvfus8uDhxQdcI8es8uTp88oQsCev7D42/byFUUI3Oswdnnz9h1FCFjE+w/M8vHTZ5ISqC9fv7HT9x8UIXA/f/0GZT+mxeT4ktIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.723;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAM0AAABxCAMAAABBatdVAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAB7UlEQVR4nO2Zx1JCURBEASOiF8kYwAhGMAdMGP7/nywfSrl4c4vFUNNNzVne2fSCV9TpzmRmhGzOOoEmc/ML1hE0WVyyTqDJcn7FOoImhVXrBJqshax1BEWKYd06gialsnUCTSpV6wSa1ArWCTSpN6wTKNLc2LSOoMhW2LaOoEirvWMdQZHdPesEiuwfFK0j6HHY7lhHUKR7ZJ1gmrC66HHqK6mLnpymv1O6aOfsPP3A6KLNXks6EbpoPy9+7YQuenEpnghd9OpavtG56E3oy0c6F70NXflI56J34V4+0rnoQ5D/VPhc9HHwJN4IXfRZ/tIJXbTcE0+ELvoyeBUulC76Nkz/PXG6aO79I/Wd1EU/v6wTTJV0F+Vi3ANILkrFXw8guigXox4g4qJUjHqAiItykfQAERflIukBYi5KxU8PEHVRLkrluItyUanGXZSLWiHqomTUG1EX5SLpASIuykXSA0RclIukB5BdlIxRDyC5KBm/PYDkolyMe4CZcFHSHmBCfJMGwDdpVHyTxsU3aVh8k8bFN2lcfJMGxjdpYHyTBmYmegAZ36TR8E0aGN+kgfFNGhjfpHHxTRoW36Rx8U0aFt+kYSHtASbEN2kAfJNGxTdpXHyThsU3aVx8k8bFN2lgfJMGxjdpYP73AN9wtznR168+twAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492364010;4.copy,1.1,3.240,3.209,3.960,2.19,2.14,1.1,3.220,3.209;4.copy,1.1,3.250,3.228,3.950,2.19,2.14,1.1,3.230,3.228;4.copy,1.1,3.240,3.266,3.960,2.57,2.14,1.1,3.230,3.266;4.copy,1.1,3.230,3.285,2.10,2.38,2.14,1.1,3.220,3.285;4.copy,1.1,2.10,3.304,3.220,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.330,3.323,3.870,2.19,2.14,1.1,3.310,3.323;4.copy,1.1,3.420,3.437,3.780,2.19,2.14,1.1,3.410,3.437;4.copy,1.1,3.440,3.456,3.760,2.57,2.14,1.1,3.430,3.456;4.copy,1.1,3.420,3.475,2.20,2.38,2.14,1.1,3.410,3.475;4.copy,1.1,3.410,3.494,2.10,2.19,2.14,1.1,3.400,3.494;4.rect,1.1,3.201,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.373,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.350,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.345,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.550,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.364,2.26,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.383,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.383,2.28,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.421,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1153,3.136;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAABa1BMVEUAAAAwd3dW1NQUMjJm/f0LGxs6kJBMvLwCBARe6ekmXl4eS0tj9PQECwtEqalCo6MGDw9k9/ccRUUoZGRc5OQBAgJOwsI4iooNISFn/v4SLCwCBgYDCAgBAwMyfX1Tzs5RyMhn//8nYGBW1tYtcHAQKCgVNDQIExMAAQE2hoYRKSk+mZk2hYUpZGQsbW09l5cECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFA4i4saQEADBwceSkoHEhINICBa398FDAxj9fUbRERZ3d1CpKREqKgOIiICBQVDp6dKtrZl+/sbQkIcRkZj9vYGDg4OIyMHERFk+PgdR0dIsrJDpaVd5uYsbGxc4+MgT08GEBBOwcFUz89e6Ogrampc5eUqaWkKGBgSLS0NHx8MHh4jV1ckWlpb4uIweHhi8vJU0NApZmYucnJY2dkQJydm/PwWNzdKt7ckWVlf7OwECQkgUFA/nJxFqqrYa40lAAABT0lEQVRIiWNgIB4wMpGgGAiYGElSzszCSpJ6NnaSlHNwcpGknpuHlyT1fPwkKRcQFCJJvbCIKEnqxcRJUi4hKUVYkbQMGMgCmXLyRBiqoAgGSkCmsgoR6lXVwECdCKUjCmhocuNhYQItbR0N3CxMoKunr4qbhQEMDI2MTXCyMIGpmYa5hQEuFiawtGIQtbbBxcIAtnb2DAzmajhYo2AUUAIcFGG1koajHAYLBpyc7eDqYcWXi6KrBjoLDtzcoQwPRU8oy8vbxxedBQd+/gEQRqAgVCQoOCQ0DI2FALLh6LkxIlI0SjAalYXkKusYNPWxmgwccfHILFEL54REIJ8tCUgkS6agKOe1TGVgiEpDZqVn2GX6ezmkZYEr0mxLBgIgB1hRmCsr+iiBebl5hNSDgUZ+NISRVFBIlAY4KDIkTX1xiTRJ6kuzykizoLyCgQEAgtE8OgV3PjoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.212;4.blob,1.1,4376.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.326;4.blob,1.1,312.iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAMAAABSF4SHAAAAZlBMVEUFBQxjY/UeHkoAAABCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRarem3QuAAAAP0lEQVQImSXFxxGAMBADwAORc7bJ0H+TMNJ+1iwI8TNEsU7SjOdFyVHVumk7jn7Q46TnxXH4VW/7wc/r5njeD26UAt2rwGVsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.345;4.blob,1.1,8064.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;4.blob,1.1,1208.n3S/1z1rLoIgUrX0xjs3CEYFQEAFiYmfDg767F70y9zcNC7X58y/dndfHsI8TQgrqVR94wbxOujbWz194YL/099Pnn22+733Zs1FcLUM8F4GACEWnxHP5PhO3rhvuD819WLmXACok5uQoJbJXr12bdzl8k5Pio2NovtuOGsaH7c9fFWsMBefkcH0G1S/bzCMm82z5gIAAADkWBIbe6iwMHPRolAHAgAAAESGjPh4RbjuWQQAAAAAAAAAAAAAAAAAAADA/JNbl1vRVRHqKMC8F0WnHykqyiLjaW7JsmWv5ucTL2e+WLasJD//VYKFzPmCkwAAAuRVcv1x2CYBEDXhcn1lMj2SmEi8qMLExM+on9EbPhITC4eGPiNYCHS9AMwbAqUgPjO+50RPqAMBC8FnQ0M5CQnRfjN0MRFzOEtiY68OD5MVVZjjcMSxsUuGh68SLAe6XgDmDblGPtg2aDPi33sVgGk3R0fHnM68xYuJFFKYmNg9Ojo6MUFWVGEuMbFwdLR7YmKUYDnQ9QIwP6AMVKqWwqa8gCxuj+fq8DCRMWeURlstFF6JmNFmGg0VClcPDV0hXhR0vQDMD6ISEZPN7DvdF+pAwMLx2dCQlMdLiI7Gd/nPFi1ioehXJhO5UYWtRYt+hqIsk+kr4kVB1wvA/CDXyA1NBqfNGepAwMJhtNmMNluB0Hd/jiAVJiZeN5snHlzheQFLTCw0m6+7XCSMrkPXC8A8wOKxUktTYbQZkO7K0FAhrjHnGAYjJyEhckabGYyYhIQcUkabEeh6AZgXJOWScfO4sRXzfqsAzOzz4eHF0dH+mwDOKk8gsDkcN+/epSKqMCQQ5Dkctrt3b5JSGnS9AMwDco381vu3PG7P7KcCgMW9yckbd+/i+OJbmJj4+chI5PxFJiYWjox8jiDkfGLoegEId9w07pKiJTDaDChyZXh41eLFDBqG7dsF0dFSHi9yRpujowU8npSs0WYEul4Awp+sUma6brJ0WUIdCFiYrptMdBT1XlSSQaMxUdTnQL365gKhcMBqHbRFyhRzobDAah2w2QbJKpBBVkEAAIpI1dIb79wIdRRgwXK43V+OjKwWCq+bzVMpv8zN9X/6+9fu7ss/fs1dJRRevH17TqMMKaFw1e3bF0ksEMMIAwAAgEiQFBsb5bfApGl83OZwhCSehef/AcwaIlGDbAyZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.372,3.421;4.blob,1.1,548.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAAyVBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIGDg4IFAgLGgsECwtf7Oxh7+8GEBAeSx4yfDIDBwdX19dY29s0gDQbQxtcHkO7AAAAjElEQVQokc3NRxKCAAxA0YDYxYJdEcSCvYuCFbn/oXTryN/7F1nkTSYiXymqUKpCktCSRKk0SSabI8oXdKJiiaRcMYiqtTpRo0nS0tpEnS6JmD2kf86ykWyLpO8MiIYjkrE7IZrO5kSLJclqvSHa7vZEh2PM0vM+4+Scf8UPLleR2z3m6PEMfZFXRJ/eQtcJdvXu+wIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.457;4.blob,1.1,3168.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.649;4.blob,1.1,3524.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAqUlEQVQ4je3Sxw6CQBCA4QUrootiL2AFK9gL9vL+7+TN+JuYmHhlbt/MZLKZHSFeoagCEYnGmIgn6KSWYkJP0xmpwIbMsiFn0vkCXdTpUhmsVGtwXTZgy27CrTbY6Rrv7NkOym5ffIkBORyBzniCR3oWyr7GPU9nnDZfgEvpwyvpwmu5gbeSn7IL9px/+Nix6dHH4MTE+cItqtcbG+4P8UuE9xXel/j3vp4mDhXHgBNYGQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492364121;4.copy,1.1,3.230,3.209,3.970,2.19,2.14,1.1,3.220,3.209;4.copy,1.1,3.250,3.228,3.950,2.19,2.14,1.1,3.240,3.228;4.copy,1.1,3.250,3.266,3.950,2.57,2.14,1.1,3.230,3.266;4.copy,1.1,3.240,3.285,2.10,2.38,2.14,1.1,3.220,3.285;4.copy,1.1,2.20,3.304,3.220,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.240,3.456,3.960,2.19,2.14,1.1,3.230,3.456;4.copy,1.1,3.260,3.475,3.940,2.38,2.14,1.1,3.250,3.475;4.copy,1.1,3.240,3.494,2.20,2.19,2.14,1.1,3.230,3.494;4.rect,1.1,4.1180,3.174,2.18,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.353,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.364,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.386,2.18,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.402,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1143,3.136;4.blob,1.1,1504.iVBORw0KGgoAAAANSUhEUgAAADcAAABJCAMAAACuLU7FAAACDVBMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDQ5jIxn//8DCAg6kJBn/v4CBARFrKxX2NgGDw9i8/Msbm4iVFQNICALGxsIExMOIiICBQUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///8fTExHsLBQUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHwECwtf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKytX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OAKGBhUz89a398yfX0FDAxj9fVBoqJHr68bRERZ3d1CpKREqKgIFRUdSUlDp6dKtrZl+/sbQkIcRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaUBAwNd5uYdSEgJFxcsbGxc4+MgT09OwcEjVlZe6Ogrampc5eUqaWkSLS0NHx8zf38MHh4jV1ckWlpb4uIweHhi8vJU0NApZmYnYGBW1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t5Kt7dl+fkkWVkCBgYSLCwUMTEECQkgUFAtb29FqqpSzMwcRUX/jHf2AAACFklEQVRIiWNgIBIwMjETqxQFsLCyMZKjj52Dk4sMbdw8vHz8ZOgTEGQUEuYmXZ+IKIOYuATJ2iSlpBkYhGRIt28IAlk5ebL0KSgqkaVPWYUsbapq6mTpU9IgK30PL4AoHbCxcANE6YCNhRsgSgdsLJwAUTpgY+EGiNIBGws3QJQO2Fg4AaJ0wMYaBaNgaAFNOS0y9WmTpU9HTpcsfXr6UIaBoZGxiSnJ+s3MLSytrG3wqhGTBwFU99naMTDYOzjitdBJDgScUQVdXN0cHR3d8elTlQEBPRQxD08vbx9f/PqwAT9/kJ049AUE4NQXGAQkgrHrCwkNC8elL8IzMira3DEGm5xkbFwILn3xCYlJySmp3jgdNAooB2k4gx8/0EhXBVGIMoExIxODBQNZ2VJwdk4uRB+sTMiTy2dEZ8FBQSGcWZRdzIBcJpSUlpWjs+CgohKRjKuqGZDKhJrauvoGNBYCNDYh2hDNci1IMq1tYu364agsJNeKd8CZAXKdSPrSmRiUurqRWWLC2T29QL5CGpDoU+yHK+2agNAWIjKRgaF9EjJr8hSpqZUlmpOmgWNsughcbSwPAz4wYyawxTFLrmwmmDd7Dlxi7jy8+sCAcT40W6ctWAgTWyRIWB8CLIa5rnFJKyn6loYugzCWy60gRd/KaasgjNVNYqToY6haA6HXoqde4sCqHtwlJx7A0rSOLOvKwa1yANiKZuAMEDf9AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.231,3.240;4.blob,1.1,680.iVBORw0KGgoAAAANSUhEUgAAAHQAAAAXCAMAAADtJJvhAAAA+VBMVEUAAAAGDg5DGxu7TEzzYmIECwtf7Oxh7+8GEBAtEhIDBwdX19dY29t3dzDU1FZKHh75ZWVUIiJPICDkXFwXCQkyMhT9/WYbGwuBNDR5MTESBweQkDq8vExvLS32Y2P1Y2OUPDwkDw8EBALp6V5eXiYPBgZpKirLUlL9ZmawR0c+GRlLSx709GMLCwQuExO3Skr/Z2dIHR2pqUSjo0IMBQVkKCjIUVH7ZWWoREQbCwsPDwb392RFRRybPz/xYWGNOTkeDAxkZCjk5FwCAgGcPz/gWlpyLi4OBgbCwk6KijgnEBAEAgIhIQ3+/mcsLBJ9fTLOzlPW1lZwcC1rAfsBAAAAvklEQVRIie2WtQLCQBAFN0CAAAnu7u7u7s7/fwzQQMq7W0iVqW6LuWkfAADHwf/RaHXyk9cbjApUQZAfJrOFVyKqoqKiMKLEKFptduaoJLKaDqeL0XR7vKzRNz5/gMEKhjBNCEeisTitlEimUFFIZ7K5fIHOKZbKuOiLSrVWpxIaTWyy1e50e30aYzAc4ZLCWDeZzuic+WKJi67Wm+3nIBwuuz2uCYfj9004XE7nCzIqh3C4XG8/bJJyfyA/eAKekw28D2X5SAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.281,3.326;4.blob,1.1,620.iVBORw0KGgoAAAANSUhEUgAAAXgAAAANCAMAAACU24VSAAAA2FBMVEUFBQxjY/UeHkoAAAB3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl5eJiYSEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgGDg4kJFlfX+wCAgYhDQ3+Z2csEhIECwtf7Oxh7+8GEBAEBAliYvIgIFB9MjLOU1MDBwdX19dY29s/P5xFRarWVlZwLS2FShxiAAAAtElEQVRYheXQhRHCUBRE0Q8vwd3d3YMGd+i/IxIo4maG28DZWaVcbvnjNB2ClXi8EO2IdA2Clfj8Ach2QMFQGJKVRKIxyHZA8QQlK5FkisLx0pksRVvH5/IFSqcrlsoUbR0vlSql09XqGG0f32hiPFur3cFs+/hur4/5aIPhCLPt42U8wXy06QyCDeN3/HyxhBagrdYbBja3u/33+MPxxCxgO18g+Hq7m9/j5fGEJqC93iD+AWAwQtPUpWzuAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.522,3.345;4.blob,1.1,1280.iVBORw0KGgoAAAANSUhEUgAAAnwAAAANCAMAAAAE0kMpAAAB71BMVEUAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFDAxj9fUeSkoMBQX1Y2NKHh5CpEJEqERCpKREqKikQkKoREQUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscRkZj9vYGDg5GHBz2Y2MOBgY6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAwNd5uYoY2MDAQHmXV1jKCgCBAJe6V4mXiY4izhOwU4CBARe6ekmXl44i4tOwcGLODjBTk4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSLS1n/v4NHx8tEhL+Z2cfDQ1EqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NU0NAyfHzQVFR8MjIGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUucnJY2dlyLi7ZWFgoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIKGBhm/PwWNzcYCgr8ZmY3FhZOwk44ijhKt0o8lTxOwsI4iopKt7c8lZW3SkqVPDwNIQ0SLBIkWSRf7F8CBgINISESLCwkWVlf7OwCBgZZJCTsX18GAgIyfTJTzlMECQRi8mIgUCAyfX1Tzs4ECQli8vIgUFAJBATyYmJQICBW1lYtcC0/nD9FqkVW1tYtcHA/nJxFqqqcPz+qRUWzXFTfAAABi0lEQVRogeWOVVPDUBBGbwu0uLu7u3uBYsXdiru7a3F3d/2hJCkwkzZpX7i9s3Ae7m6+fDtzEKIQCBE3evoG3D9EYp6L/4uhkTFpBTCYmJr97EIBX8vcgjsXi35dCDyWVqQN4GBt873Z2tnzlRwcnbhiZxdXHEqwcXP3IK0ABk8v76/Nx5e35OcfwBUHBuEwAk5wSChpBTCEhUcol8ioaP5WTCxHGBefgEUJOIlJpA3gkJyinKlp6fSQZNBksjaEsqTZ6pc5uXm6koREvqyAtAIYCouKmVlSyoyycpoK1kZRWaV+WV2jI0Vg1NaRNoBDfQP9yhubmC95M00La6NobVO7a+/o1JkjKLq6SRvAoaeXfvv6JZpKA4NDqtHwyCguJdiMjU+QVgDD5NQ09c7Mam7NzasmC4uYhMCztEzaAA4rCoRWpWuaS+sbm+xgS7aNzQg4O7t7pBXAsH9wiI6OtZROTs/YwfkFNiHoXF5dk1YAw83tHbp/0NZ6fGJ/P79g0vkDvL6RNoDD+8cnFvdAVPcGY8gAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.362;4.blob,1.1,1076.iVBORw0KGgoAAAANSUhEUgAAAEQAAAASCAMAAADVGohqAAABvFBMVEUAAAAYCgoLBARUIiLPVFQPBgaiQUGvR0cVCAj1Y2NJHR2cPz+9TEwsLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQkeSkpKtrYCAgE3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMgFBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzNCpKQiVFQECQksbGxa399k+PhCo6MXOTlkZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExMwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi4BAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFwoKBBwcC2Skjutra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/MbGwspKSm3t7dfX1/t7e0sEhIxFBQSLS06OjrExMSXl5cODg5vLS3mXV0CAQHMUlJ9MjJQICDlXFwpERFFHBxCGxtLHh6SdBSJAAABJElEQVQ4jWNgwAYYmbAKkwaYWVipYAobOxUM4eDkooIp3Dwka+HlA5H8AoJCwiIQEVExcSL1SkiCSClpGVk5IC2voKikrKIKkVITU8elS0MTDLRAbG0dXT19BgYDQyNjE1OQgJm5BQODpZU1RKmNLS5D7PTAwJ6BwcHRydnFFSjk5u7hCZH08gaRPr4Qnp8/LkMCAsEgiIEhOCQ0DCwUHhEZFQ1ixFjFgqi4eIjShETC3klKTklNA4ulZ2TKZkkDGdkQl+RAlObmEfYOg5Z9vl5BIUS4qLgESJZCwqQMLFReUUnYOyBQVV0Dk6gF4jrBesuGRkWIQJNYMy5D0EELCq+1TdCnvQPC7uzqJtYQ3KCnl3Iz+vrVKDZjQtdEyh0yaTJJygHWuTd8bWoczgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.364;4.blob,1.1,1400.iVBORw0KGgoAAAANSUhEUgAAAWUAAAANCAMAAABGi48KAAACBFBMVEUFDAxj9fUeSkoAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFBQxjY/UeHkpCpKREqKhCpEJEqERCQqRERKgcRkZj9vYGDg4UMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscHEZjY/YGBg4BAwNd5uYoY2M6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAQNdXeYoKGM4i4tOwcECBAJe6V4mXiY4izhOwU4CBARe6ekmXl44OItOTsESLS1n/v4NHx8eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSEi1nZ/4NDR8BAgIDCAgCBQVU0NAyfHxEqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NUVNAyMnwfTExn//9HsLAucnJY2dkGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUuLnJYWNkVNDQOIyMKGBhm/PwWNzcoZChc5FwKGApm/GYWNxYoZGRc5OQKChhmZvwWFjdKt7c8lZVOwk44ijhKt0o8lTxOwsI4iopKSrc8PJUkWVlf7OwCBgYNIQ0SLBIkWSRf7F8CBgINISESLCwkJFlfX+wCAgYECQli8vIgUFAyfTJTzlMECQRi8mIgUCAyfX1Tzs4EBAliYvIgIFA/nJxFqqpW1lYtcC0/nD9FqkVW1tYtcHA/P5xFRapqlBW+AAAB0UlEQVRYhWNgYGRixgpYWLGLM7Oxc+CQGeSAk4tCA7h5eEk0GRq6DMx8/NgVsLLgskxAkCS3DRrAxUmpCULCpJoMCV0GZhFRMWzS4hKSuHRKScuQ5rjBAWTl5Ck1QkFRiUSTIaHLwKysoopNWk0dp10amlqkOm8wAG0dio3Q1dMn0WRI6DIwMxsYYpE1MjbBbZmpGYmuGwzA3MKSckOsrEk1GRy6wFC2sbXDlLR3cARRTs4g4ILCYmZ2dXOn3MH0Bh6eXpQb4u3ji9NkP38QCEBhQUMXGMrMgUGYOoNDwFRoGAiEo7CAICKScgfTG0RFU8OUmFicJsfFg0ACCosZErqgUE5MwtCYnJIKodNAIB2FBQQZmdRwMV1BVnYONYzJzcNpclY+CBSgsJghoQsK5cKiYnSdJaVO+OwqK6+g3MH0BZVVftQwprqmlkSTQaELCmXmunp0qYZG/JY1NZPktkEAWlqpY05bO6kmA0MXHModnV2oEt1uPfh19vb1k+a4gQYTbCdSx6BJk6eQaDIwdMGhPHXadFSJGTMJ2DVr9hwSXTfAYO48Khk0f8FCEk0Ghi44lJkXLUaVWLKUkGXLlpPgskEAVqyklkmrVpNq8qLFAP0ImhcA+1XSAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.381;4.blob,1.1,1808.iVBORw0KGgoAAAANSUhEUgAAAWYAAAASCAMAAABfPIRHAAAC2VBMVEUAAAAPJA8vdS9QxVAFDAVj9WMeSh4wdzBW1FYFDAxj9fUeSkobRBtg7mANIQ1CpEJEqERCpKREqKgBAwFY2lgtcC0cRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4hUiFd5l0oYyg6kDpMvEwBAwNd5uYoY2M0gYExeXkHEhJFq0VHsEc3NzfBwcH39/fp6emTk5MMDAyBNDR5MTESBwc4izhOwU4CBAJe6V4mXiY4i4tOwcEtb288lJQPJCQCBQUDCAgBAgJf6l8wdjAnJyf29va4uLhISEhiYmLu7u61tbVvLS32Y2P1Y2OUPDwkDw8SLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx8GDw8qaWlSy8tm/f1HsLAZPj5n//8iVFQIEwhn/2eqqqra2toEBARHR0f///9BQUEPBgZpKirLUlL9ZmawR0c+GRlU0FQyfDJEqURCo0JU0NAyfHwTLi5Kt7cdSEgNISEVNDQHEREQJxAbQhv09PSEhITr6+uMjIwuExO3Skr/Z2dIHR0uci5Y2VgGDwZk92QcRRwucnJY2dkoZGRRyMhl+/sLGxsTLhMZPhkJCQlsbGzR0dGgoKAMBQVkKCjIUVH7ZWWoREQbCwsKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzc/m5ti8/Nh8fE5jY0MHh4LHAsdSR319fWNjY0tEhKbPz/zYmLxYWGNOTkeDAxKt0o8lTxOwk44ijg8lZU/nJxa4OACBgJl+mUpZSmtra1EREScPz/gWlpyLi4OBgYkWSRf7F8SLBIkWVlf7OwCBgYQJycCBARQxlApKSm3t7dfX1/t7e0nEBAEAgIECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFAzfjNY21g6OjrExMSXl5cODg4/nD9FqkVRyFEnYCdW1lZFqqoLGgsXOhcQKBAVNBU5jTlNv00AAQBTzVM2hTYIFAgxejHbYNr5AAACLklEQVRYhWNgGAXUBIwD7YARAZiYcUiwsLIR0svOgcLl5OKmhouGI+Dh5cMlxS9ASDMHOypfUIhyBw1LICwiilNOTFwCv2ZJKWlUARlZOSq4aRgCeVYWnHLCCor4NSspowmoqKpR7qShA9Q1NIlUqaUNZejo6ukbGAIZRsYmMElTM7x6zS0s0YWsrIl14nAANrJctnZglr0DGDjiUunkDKFdXN3cPTy9gCxvH18/f4hgQGAQPluCQ0LRhcLCI8h181AEkVHRMbFxQIZgPBgk4FCXmCQPYSSnpDIwpKVnAJmZWdk5uXlg0fwCfJYUFmGKFZeQ7eahCUrL4ssZGCoqwaAKh6LqpBoIo7YORNY3QHiNTc0tILq1DY8F7R2dmIJd3WQ6d2gCzp7ePqF+goXGhKSJYHpS+mQQNWUqiJw2fcbMWbNBrDlz5+G2Yv6ChZiCixYvocTZQwuELV22fMVKEItAobEqaTWEsQaSmtcyMKxbv2Hjps1Q+S1bcVuybTs20bIdZLl4SIKdu7qgDVgChcbuPXshjH2Qsnk/A8OBg4cOw+WPHN2Nyw6+wGPYhI+fOEmem4cgOHWaWJVnoMn1rN65tPMX3ICsi5eQpC9fuQokd18DA2FkFsP1G1gNvHnrNtnOHr7gzl0o4959vfoHDzHkHz0GEk+SwOApMovhGY7u487ntHLrEAYv9rwkrOjVazBIRGaNApLAm7fvBtoJIwGEvv8w0E4YEeDjJ+ziAMXmqYDPxEcCAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1111,3.381;4.blob,1.1,1136.iVBORw0KGgoAAAANSUhEUgAAAEQAAAASCAMAAADVGohqAAAB3VBMVEUAAAAWCRZGHEZ2MHYpESmPOo8UCBQCAQKDNYNDG0MxFDGTPJMHAwc0NIExMXkHBxJnKmdqK2o3NzfBwcH39/fp6emTk5MMDAw0gYExeXkHEhItLW9jY/ZjY/U8PJQPDyQCAgUDAwgBAQKMOYxHHUcnJyf29va4uLhISEhiYmLu7u61tbUtb29j9vZj9fU8lJQPJCQGBg8qKmlSUstmZv1HR7AZGT5CQqRnZ/8iIlQLBQuZPpmqqqra2toEBARHR0f///9BQUEGDw8qaWlSy8tm/f1HsLAZPj4TEy5KSrcdHUgNDSEVFTQHBxEXCRcoECj09PSEhITr6+uMjIwTLi5Kt7dn//8dSEgFBQwoKGRRUchlZftERKgLCxscCxwlDyUJCQlsbGzR0dGgoKAFDAwoZGRRyMhl+/tEqKgLGxsSEi0/P5tiYvNhYfE5OY0MDB4RBxEsEiz19fWNjY0SLS0/m5ti8/Nh8fE5jY0MHh4/P5xaWuAuLnIGBg4EAQSWPZY9GT2tra1EREQ/nJxa4OAucnIGDg4QECcCAgR3MHdZJFkpKSm3t7dfX1/t7e0QJycCBARMH0w6OjrExMSXl5cODg4QBhAjDiNVIlVzLnMBAAF7MntQIFAMBQxJHkmkvpX9AAABMUlEQVQ4jWNgIAUwkqQaO2BiptwMFlY2is1g5+Ck3CFc3Dy4pHj5+Ik0REAQyhASFhEVEwcyJCSlICLSMrJy8mCWgiIYKOEyRFkFQquqqWtoamkDWTq6evoGYDFDI2MTUzMgw9wCDCxxmGFlzQVh2NjaMTDYOzgCmU7OLq5u7hBhD08LLwYGbx8w8MVhiJ+1P4QREAgig4IhvJDQsHAgFREZFR0TS9A7cdbxYDrBIRFEJSWDyJTUtPSMTIas7JzcvHwGwt4psC6EMIogLilmYCgpLSuvqARyqqpraiGSBLxTV98AYTRCwqSJgaG5pbUNLNTegUMTBujsgtDdIj32vX3qQFb/BGL1wsFEDihj0mSRoClTSdYPBtPqp5OnEQXMmDmLckN4Zs+h3BCGufOwiwMAFr89ts4JgjYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.402;4.blob,1.1,2220.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.362,3.421;4.blob,1.1,732.iVBORw0KGgoAAAANSUhEUgAAACMAAAAgCAMAAACvkzHFAAABFFBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIGDg4UCAgaCwsECwtf7Oxh7+8GEBBLHh58MjIDBwdX19dY29uANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilzzlr0AAAAyklEQVQ4jd3ORRICMRRF0eDu7u7QuLu7O+x/H8wgVvXnZJT76nRXECKOSIzAIxaBRCKVgUauAIlSpQaNRqsDjd4AEqPJDBqL1QYau4MzOp14uaRulni8Pj+WgSDnN6FwxINlNAa+5g9PPEFkMpVmTSJOdibLkJyQJ4dCsUSbcoUaqrU6vTSa9FetNjV0ukna9IQ+OWQzzAvRYEjkqDhmzWRK5Gy+YM1ytcaz3WIJQpstFjthzzOH4+kX5wuPoOvt/ovHk2vQ6/29fgAiixKYLsaE5QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.852,3.421;4.blob,1.1,940.iVBORw0KGgoAAAANSUhEUgAAATIAAAANCAMAAAAdQxI7AAABX1BMVEUAAAAwdzBW1FYHAwOTPDwsEhJHHR1/NDQdHUc0NH9iKChlKSkUMhRm/WYLGwsqERGUPDwIAwMeDAyYPj4QBwcMDB4+PpgHBxA6kDpMvEwCAQGKODg7GBhWIyNxLi4jI1YuLnECBAJe6V4mXiZTIiJ0Ly+MOTk4FxcBAQI5OYwXFzgeSx5j9GMECwQbCwsTCAgtEhKSOzsSEi07O5IDAwdEqURCo0J9MzNKHh4pKWUoKGIGDwZk92QcRRxEHByCNTUJBAQpEREEBAk8PJQRESkoZChc5FwBAgEOBgaXPT0hDQ08GBiJNzcBAAAYGDw3N4kAAAFOwk44ijhuLCxZJCQvL3QiIlMNIQ1n/mcSLBI1FhaOOTkEAQEUCAgaCwsICBQLCxoyfTJTzlMFAgKROzswExNLHh58MjIeHksyMnxW1lYtcC1eJiZmKSl4MTGZPj46FxeANDRDGxs0NIAbG0OePa8JAAABG0lEQVRIidWNx1YCURBEhyBREBxFHQUTiDlnojlgwJxQVAQjGP//+Hp2MG/ZteAuqvpUL66iCExmpZ6wWBvkD5sdL3c49TKb8CpOXG75brfh3U4HZaPHi1dx0uTzy+ZmtQWubg20UbV3wE28aJ1dsjkYwqu7eyh7+/rxKl7CEcmoDUTh4sGhYaqR0TG4iplxdcI4Tk5Z4OLpmVmquXm4iZ2FRePmduG9S8uUsXgCr+ImmTJMad8KXLu6tk61sbkFV7GzvbNbO2X29uHag8Ms1dEx3ATg5LR2iYTx1rNzyovLK7yKn+ubXPVwq97BpfnAPdXDI9yEoPBUFJkr6GjiLD3jpS+ver2941UIPsoiKp86X+L8/sE7f/8o/wH1jiBeOmfXygAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.459;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACQ1BMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MSLCwiIiIFBQUmXl4ucXEsEhJtLCwjIyP39/cSKys+mZksLBJtbSwCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjsbCwsLGhoMHR0bGwsbQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbvuD9ZAAABlUlEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS0hKwZjSMrKE1cvJw5kKikqE1SurwJmqaiS5TF1DkyT1SlraJKmnNdDRJU29nr4BMcoMjYyhLBNT4tSbQVnmFpZEqLcysoYxbWzxKbSzB1MOjnARJ2cdLOpcXIGEm7uHpxe6jLezD4jy9QMDfxA7IDAoOIQhNCw8IjIK06joGBAZGwwGcQwMfvEJibFJDAzJKalp2JyYngEiM7PAIJuBISc3Lx8kUlBYVFyCRX2pDap7ysorKqtAQtU1tZ517hjq6xtQ3cPgH9cY3BQIlmtuaUVX3tbegeoeEOjs6oZK96Cr73Xuw+arfmyCIDBh4iRcUljB5CkkKZ86zZsU5dMnziDJ+JmzSFI+OMDsOXPh7HnztQhrWLAQwV60eAlB9UuXLSfJQStWriJJPcPqNaSpX7tuPWkaNmwkTf2mzaSp37J1G2katu8gTf3OXbtJUr9n7z7SLNh/AL88ACvKW5JCGC6UAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.780;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAA0lBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAh4eDE8PBg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR7ML5yjAAAAqUlEQVQoke3SVw7CQAxFURN6GyD0koQaOoTeO+x/SwgJIa4EEgvgffnYo5E/LPKKSxPE7fGy4fPTgWCIjXCEjioXHFNxPkjodDJFp8N0Jgvm8gW4qEqwYVpwuQJWa7F31s0GxnZTvqRFtjtgo9t7Vv3BY8mhIe92gho8Ggs8mcIz5cBzZcMLtYRXKgSvN1v+v0vR+pDebw6wHE8WrJ0vsFxv8kv+9/Xhvu6uLhPOluhdiAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492364216;4.copy,1.1,2.10,3.171,4.1190,2.19,2.14,1.1,1.0,3.171;4.copy,1.1,3.250,3.209,3.950,2.19,2.14,1.1,3.240,3.209;4.copy,1.1,3.260,3.228,3.940,2.19,2.14,1.1,3.250,3.228;4.copy,1.1,3.290,3.247,3.910,2.19,2.14,1.1,3.280,3.247;4.copy,1.1,3.250,3.266,3.950,2.38,2.14,1.1,3.230,3.266;4.copy,1.1,3.240,3.285,2.10,2.19,2.14,1.1,3.220,3.285;4.copy,1.1,3.220,3.456,3.980,2.19,2.14,1.1,3.210,3.456;4.copy,1.1,3.240,3.475,3.960,2.38,2.14,1.1,3.230,3.475;4.copy,1.1,3.220,3.494,2.20,2.19,2.14,1.1,3.210,3.494;4.rect,1.1,3.233,3.240,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.259,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.307,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.421,2.25,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1133,3.136;4.blob,1.1,1528.iVBORw0KGgoAAAANSUhEUgAAAEEAAABJCAMAAABVersaAAACDVBMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDQ5jIxn//8DCAg6kJBn/v4CBARFrKxX2NgGDw9i8/Msbm4iVFQNICALGxsIExMOIiICBQUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///8fTExHsLBQUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHwECwtf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKytX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OAKGBhUz89a398yfX0FDAxj9fVBoqJHr68bRERZ3d1CpKREqKgIFRUdSUlDp6dKtrZl+/sbQkIcRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaUBAwNd5uYdSEgJFxcsbGxc4+MgT09OwcEjVlZe6Ogrampc5eUqaWkSLS0NHx8zf38MHh4jV1ckWlpb4uIweHhi8vJU0NApZmYnYGBW1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t5Kt7dl+fkkWVkCBgYSLCwUMTEECQkgUFAtb29FqqpSzMwcRUX/jHf2AAACKElEQVRYhWNgoAAwMjFToh0IWFjZGCkzgZ2Dk4siA7h5ePn4KTJBQJBRSJibEhNERBnExCUoMEBSSpqBQUiGEjcMaSArJ0+hCQqKShSaoKxCoQGqauoUmqCkQWFuGukAUaJhYxEDECUaNhYxAFGiYWMRARAlGjYWMQBRomFjEQMQJRo2FhEAUaJhY42CUTAKiAGacloUm6BNoQk6croUmqCnD2UYGBoZm5hSYJKZuYWllbUNkarF5EEA1fW2dgwM9g6ORDrCSQ4EnFEFXVzdHB0d3YkzQVUGBPRQxDw8vbx9fIk1ARvw8we5g6AJAQE4pQKDgEQwIRNCQsPCcclFeEZGRZs7xuA3QTI2LgSXXHxCYlJySqo3fhNGwYCBNJxRRyzQSFdFFUCUaIwZmRgsGMjKloKzc3JR9SJKtDy5fEZ0FhwUFMKZRdnFcBNAehElWklpWTk6Cw4qKhHZp6oayoDohZdoNbV19Q1oLARobEK02prlWiAMuF4IaG0Ta9cPR2Uh+UW8A84MkOtkwAbSmRiUurqRWWLC2T29QL5CGpDoU+yHK+2agM2AEJGJDAztk5BZk6dITa0s0Zw0DZwCpovA1cbyYHUDJpgxE9jamyVXNhPMmz0HLjF3HpEmgAHjfGgBlLZgIUxskSApJiDAYpjbG5e0kmfC0tBlEMZyuRXkmbBy2ioIY3WTGHkmMFStgdBr0XMNqWBVD+76gSjA0rSOQieUo/XOAHn6aJdPhWevAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.233,3.221;4.blob,1.1,2748.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.653,3.316;4.blob,1.1,244.iVBORw0KGgoAAAANSUhEUgAAAiIAAAAFCAMAAABPXHe/AAAANlBMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29sCBgIDCAMBAwFRyFFn/2cnYCcQKBAVNBUIEwjFSUnhAAAAPElEQVRIie3OtxEAMAgEMHDOYf9lfccAbqF4TSAiZgL4cD5E7QOYlnJx2gewqDbRtR9g1phiaT/ArH3EfWRvAWDoRO3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.261,3.326;4.blob,1.1,560.iVBORw0KGgoAAAANSUhEUgAAAQsAAAANCAMAAACJpbvJAAAAwFBMVEUFBQxjY/UeHkoAAAB3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl5eJiYSEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgkJFlfX+wCAgYhDQ3+Z2csEhIEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZwLS0obG7AAAAAnklEQVRIie3QRxaCQBRE0a8F5gjmhBExZzGz/11pA3uoHngHNX6nRBJJ/P0YpiCVZlfowTQEmWyOnaGDfKEoKJUr7A4dVC0IYNfYHRqoN5rqi1a7wy7h6/b66gsMHHYJ33CE8IvxhBzCN5250Rdzb8FuYVuu1tEX2GzZLWy7PeIvDscTuYXsfLki/sK/3ckxZI+n2vALvN7UFLpPoPYLmCkv0X7FMLoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1131,3.326;4.blob,1.1,2292.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.512,3.345;4.blob,1.1,1324.iVBORw0KGgoAAAANSUhEUgAAAq0AAAANCAMAAAC0AadeAAACAVBMVEUAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFDAxj9fUeSkoMBQX1Y2NKHh5KSh75+WVUVCJCpEJEqERCpKREqKikQkKoRERPTyDk5FwXFwkUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscRkZj9vYGDg5GHBz2Y2MOBgY6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAwNd5uYoY2MDAQHmXV1jKCgCBAJe6V4mXiY4izhOwU4CBARe6ekmXl44i4tOwcGLODjBTk4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSLS1n/v4NHx8tEhL+Z2cfDQ1EqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NU0NAyfHzQVFR8MjIGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUucnJY2dlyLi7ZWFgoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIKGBhm/PwWNzcYCgr8ZmY3FhZOwk44ijhKt0o8lTxOwsI4iopKt7c8lZW3SkqVPDwNIQ0SLBIkWSRf7F8CBgINISESLCwkWVlf7OwCBgZZJCTsX18GAgIyfTJTzlMECQRi8mIgUCAyfX1Tzs4ECQli8vIgUFAJBATyYmJQICBW1lYtcC0/nD9FqkVW1tYtcHA/nJxFqqqcPz+qRUWqIgQBAAABmklEQVRoge2OVXMCMRhFFyrU3d3d3Z221Ki7u7u7u7u7/8qy5aULCTywTCabnpcvuXfuzKEoCTw+BUZDUwtcaAsgi3/+oqOrh1oBQ/QNDAGpkbGJ9MHnwYamZuBcoM2CFQGYW6A2wBFLK1BqbWNLHzt7B9jO0ckZFLu4urHjxXXcPTxRK2CIl7cPvPT1g1b+AYGgOChYZSMyCAkNQ62AIeERkdAuKjoGPoyNA4TxCYmqK5FBUjJqAxxJSYVWaekZ9BFm0mQxXhSVLcqRX+Tm5atFkoMUiAtRK2BIUXEJrCot+z3lFTSVjJeEqmr5RU2tOhS5SV09agMcaWiEFE3NLdLbStPGeElo75BbdHZ1q0WRk/T0ojbAkb5+SDEwKFS0GxoekY1Gx8ZZUSKCickp1AoYMj0zCy7m5hUPFxZlk6VlFnyIYWUVtQGOrK0D4w3RpuLd1vYOM9gV77GkRAT7B4eoFTDk6PgEFJ+eKdmdX1wyg6trlozI4Ob2DrUChtw/PILip2dlw5dX5v/tnRUfYvj4RG2AI1/fgPAHfa1FH5RgKMYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.362;4.blob,1.1,1076.iVBORw0KGgoAAAANSUhEUgAAAEQAAAASCAMAAADVGohqAAABvFBMVEUAAAAYCgoLBARUIiLPVFQPBgaiQUGvR0cVCAj1Y2NJHR2cPz+9TEwsLBJtbSw3NzfBwcH39/fp6emTk5MMDAxIHR3/Z2cXCQkeSkpKtrYCAgE3NxZ+fjOZmT54eDEnJyf29va4uLhISEhiYmLu7u61tbUOBgZWIyMCBQUDCAgBAgICBAQlW1tV0tJn//9RyMgFBQJBQRqGhjaVlTxiYigiIg6qqqra2toEBARHR0f///9BQUHoXl5/MzNCpKQiVFQECQksbGxa399k+PhCo6MXOTlkZCmXlz1NTR8LCwX09PSEhITr6+uMjIzXV1eVPDwNISEVNDQHERFDp6dl+/s0gYEIExMwMBODgzWRkTtZWSQcHAsJCQlsbGzR0dGgoKDTVVWdPz8gUFBY2tph8fE8lZUTLi4BAQAyMhR6ejF3dzD19fWNjY3eWlqINzdSy8tQxsYlXFwoKBBwcC2Skjutra1EREQDAQH5ZWVsLCwbQ0NMu7ti8/MbGwspKSm3t7dfX1/t7e0sEhIxFBQSLS06OjrExMSXl5cODg5vLS3mXV0CAQHMUlJ9MjJQICDlXFwpERFFHBxCGxtLHh6SdBSJAAABJElEQVQ4jWNgwAYYmbAKkwaYWVipYAobOxUM4eDkooIp3Dwka+HlA5H8AoJCwiIQEVExcSL1SkiCSClpGVk5IC2voKikrKIKkVITU8elS0MTDLRAbG0dXT19BgYDQyNjE1OQgJm5BQODpZU1RKmNLS5D7PTAwJ6BwcHRydnFFSjk5u7hCZH08gaRPr4Qnp8/LkMCAsEgiIEhOCQ0DCwUHhEZFQ1ixFjFgqi4eIjShETC3klKTklNA4ulZ2TKZkkDGdkQl+RAlObmEfYOg5Z9vl5BIUS4qLgESJZCwqQMLFReUUnYOyBQVV0Dk6gF4jrBesuGRkWIQJNYMy5D0EELCq+1TdCnvQPC7uzqJtYQ3KCnl3Iz+vrVKDZjQtdEyh0yaTJJygHWuTd8bWoczgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.364;4.blob,1.1,1400.iVBORw0KGgoAAAANSUhEUgAAAW8AAAANCAMAAABRqR/DAAACBFBMVEUFDAxj9fUeSkoAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFBQxjY/UeHkpCpKREqKhCpEJEqERCQqRERKgcRkZj9vYGDg4UMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscHEZjY/YGBg4BAwNd5uYoY2M6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAQNdXeYoKGM4i4tOwcECBAJe6V4mXiY4izhOwU4CBARe6ekmXl44OItOTsESLS1n/v4NHx8eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSEi1nZ/4NDR8BAgIDCAgCBQVU0NAyfHxEqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NUVNAyMnwfTExn//9HsLAucnJY2dkGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUuLnJYWNkVNDQOIyMKGBhm/PwWNzcoZChc5FwKGApm/GYWNxYoZGRc5OQKChhmZvwWFjdKt7c8lZVOwk44ijhKt0o8lTxOwsI4iopKSrc8PJUkWVlf7OwCBgYNIQ0SLBIkWSRf7F8CBgINISESLCwkJFlfX+wCAgYECQli8vIgUFAyfTJTzlMECQRi8mIgUCAyfX1Tzs4EBAliYvIgIFA/nJxFqqpW1lYtcC0/nD9FqkVW1tYtcHA/P5xFRapqlBW+AAAB0UlEQVRYhWNgYGRixgpYWLGLM7Oxc+CQGZSAk4sGhnLz8JJoGzScGZj5+LErYGXBZZmAIEluG2DAxUkLU4WESbUNEs4MzCKiYtikxSUkcemUkpYhzXEDCWTl5GlhrIKiEom2QcKZgVlZRRWbtJo6Trs0NLVIdd7AAW0dmhirq6dPom2QcGZgZjYwxCJrZGyC2zJTMxJdN3DA3MKSNgZbWZNqGzicgeFtY2uHKWnv4AiinJxBwAWFxczs6uZOuYPpAzw8vWhjsLePL07b/PxBIACFBQ1nYHgzBwZh6gwOAVOhYSAQjsICgohIGviAJiAqmlYmx8TitC0uHgQSUFjMkHAGhXdiEobG5JRUCJ0GAukoLCDIyKS++2kCsrJzaGV0bh5O27LyQaAAhcUMCWdQeBcWFaPrLCl1wmdXWXkF5Q6mB6is8qOV0dU1tSTaBgpnUHgz19WjSzU04resqZkktw0YaGmlndlt7aTaBgxncHh3dHahSnS79eDX2dvXT5rjBgZMsJ1IO8MnTZ5Com3AcAaH99Rp01ElZswkYNes2XNIdN2AgLnzaGj4/AULSbQNGM7g8GZetBhVYslSQpYtW06CywYMrFhJS9NXrSbVtkWLAWjHm50dCRH3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.381;4.blob,1.1,1808.iVBORw0KGgoAAAANSUhEUgAAAXoAAAASCAMAAABiruUhAAAC2VBMVEUAAAAPJA8vdS9QxVAFDAVj9WMeSh4wdzBW1FYFDAxj9fUeSkobRBtg7mANIQ1CpEJEqERCpKREqKgBAwFY2lgtcC0cRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4hUiFd5l0oYyg6kDpMvEwBAwNd5uYoY2M0gYExeXkHEhJFq0VHsEc3NzfBwcH39/fp6emTk5MMDAyBNDR5MTESBwc4izhOwU4CBAJe6V4mXiY4i4tOwcEtb288lJQPJCQCBQUDCAgBAgJf6l8wdjAnJyf29va4uLhISEhiYmLu7u61tbVvLS32Y2P1Y2OUPDwkDw8SLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx8GDw8qaWlSy8tm/f1HsLAZPj5n//8iVFQIEwhn/2eqqqra2toEBARHR0f///9BQUEPBgZpKirLUlL9ZmawR0c+GRlU0FQyfDJEqURCo0JU0NAyfHwTLi5Kt7cdSEgNISEVNDQHEREQJxAbQhv09PSEhITr6+uMjIwuExO3Skr/Z2dIHR0uci5Y2VgGDwZk92QcRRwucnJY2dkoZGRRyMhl+/sLGxsTLhMZPhkJCQlsbGzR0dGgoKAMBQVkKCjIUVH7ZWWoREQbCwsKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzc/m5ti8/Nh8fE5jY0MHh4LHAsdSR319fWNjY0tEhKbPz/zYmLxYWGNOTkeDAxKt0o8lTxOwk44ijg8lZU/nJxa4OACBgJl+mUpZSmtra1EREScPz/gWlpyLi4OBgYkWSRf7F8SLBIkWVlf7OwCBgYQJycCBARQxlApKSm3t7dfX1/t7e0nEBAEAgIECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFAzfjNY21g6OjrExMSXl5cODg4/nD9FqkVRyFEnYCdW1lZFqqoLGgsXOhcQKBAVNBU5jTlNv00AAQBTzVM2hTYIFAgxejHbYNr5AAACLklEQVRYhWNgGAW0BowD7YARC5iYcUiwsLIR0svOgcLl5OKmhotGCuDh5cMlxS9ASDMHOypfUIhyB40YICwiilNOTFwCv2ZJKWlUARlZOSq4aYQAeVYWnHLCCor4NSspowmoqKpR7qShDdQ1NIlUqaUNZejo6ukbGAIZRsYmMElTM7x6zS0s0YWsrIl14nAFNrJctnZglr0DGDjiUunkDKFdXN3cPTy9gCxvH18/f4hgQGAQPluCQ0LRhcLCI8h183ABkVHRMbFxQIZgPBgk4FCXmCQPYSSnpDIwpKVnAJmZWdk5uXlg0fwCfJYUFmGKFZeQ7ebhA0rL4ssZGCoqwaAKh6LqpBoIo7YORNY3QHiNTc0tILq1DY8F7R2dmIJd3WQ6d/gAzp7ePqF+ggXOhKSJYHpS+mQQNWUqiJw2fcbMWbNBrDlz5+G2Yv6ChZiCixYvocTZQx+ELV22fMVKEItAgbMqaTWEsQaS6tcyMKxbv2Hjps1Q+S1bcVuybTs20bIdZLl42ICdu7qgDWwCBc7uPXshjH2Qsn4/A8OBg4cOw+WPHN2Nyw6+wGPYhI+fOEmem4cJOHWaWJVnoMn6rN65tPMX3ICsi5eQpC9fuQokd18DA2FkFsP1G1gNvHnrNtnOHlngzl0o4959vfoHDzHkHz0GEk+SwOApMovhGY5u8M7ntHLrMAMv9rwkrOjVazBIRGaNAorBm7fvBtoJIxWEvv8w0E4YseDjJ+ziADxyqYAylgb4AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.402;4.blob,1.1,2312.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.352,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.862,3.421;4.blob,1.1,960.iVBORw0KGgoAAAANSUhEUgAAATwAAAANCAMAAAADiiKIAAABX1BMVEUAAAAwdzBW1FYHAwOTPDwsEhJHHR1/NDQdHUc0NH9iKChlKSkUMhRm/WYLGwsqERGUPDwIAwMeDAyYPj4QBwcMDB4+PpgHBxA6kDpMvEwCAQGKODg7GBhWIyNxLi4jI1YuLnECBAJe6V4mXiZTIiJ0Ly+MOTk4FxcBAQI5OYwXFzgeSx5j9GMECwQbCwsTCAgtEhKSOzsSEi07O5IDAwdEqURCo0J9MzNKHh4pKWUoKGIGDwZk92QcRRxEHByCNTUJBAQpEREEBAk8PJQRESkoZChc5FwBAgEOBgaXPT0hDQ08GBiJNzcBAAAYGDw3N4kAAAFOwk44ijhuLCxZJCQvL3QiIlMNIQ1n/mcSLBI1FhaOOTkEAQEUCAgaCwsICBQLCxoyfTJTzlMFAgKROzswExNLHh58MjIeHksyMnxW1lYtcC1eJiZmKSl4MTGZPj46FxeANDRDGxs0NIAbG0OePa8JAAABLElEQVRYhc2ORVdDMRSE0xaqQAsPCjysQIu7e3F3l6LF3f7/ITecLujLJllk+BZ3ciaL+RjjuNzs/+PJyZV/eH1mRTL4AyLcLsy8GsGQvPd5zXpkCPjp5uUXYObVCEcKZXWRVWzaRFASLaUoK4esq2JXVMrqqmrTIr/UxOjW1tVj5lWJJySl3dBoXIRoam6haG1rh8wr02F1Osuubo95E05Pbx9F/wBkXYPBIWcXCpr3IIZH6I6OjWPm1ZlIOqrJyBRAhLHpmVmKufkFyLwGi0vL2dXK6hrChK1vbFJsbUPWtdjZzW4ScYQHY3v7dA8OjzDzOhyfpP4Wp9YZROQ8ekFxeQVZ1yN9fcNvKi2w+fP2DiNy/yDi8Qkzr8fzCz+vb4J3/vz4xHh8fdP9AbYsIF49VcDXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.171,3.459;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACQ1BMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MSLCwiIiIFBQUmXl4ucXEsEhJtLCwjIyP39/cSKys+mZksLBJtbSwCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjsbCwsLGhoMHR0bGwsbQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbvuD9ZAAABlUlEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS0hKwZjSMrKE1cvJw5kKikqE1SurwJmqaiS5TF1DkyT1SlraJKmnNdDRJU29nr4BMcoMjYyhLBNT4tSbQVnmFpZEqLcysoYxbWzxKbSzB1MOjnARJ2cdLOpcXIGEm7uHpxe6jLezD4jy9QMDfxA7IDAoOIQhNCw8IjIK06joGBAZGwwGcQwMfvEJibFJDAzJKalp2JyYngEiM7PAIJuBISc3Lx8kUlBYVFyCRX2pDap7ysorKqtAQtU1tZ517hjq6xtQ3cPgH9cY3BQIlmtuaUVX3tbegeoeEOjs6oZK96Cr73Xuw+arfmyCIDBh4iRcUljB5CkkKZ86zZsU5dMnziDJ+JmzSFI+OMDsOXPh7HnztQhrWLAQwV60eAlB9UuXLSfJQStWriJJPcPqNaSpX7tuPWkaNmwkTf2mzaSp37J1G2katu8gTf3OXbtJUr9n7z7SLNh/AL88ACvKW5JCGC6UAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.723;4.blob,1.1,792.iVBORw0KGgoAAAANSUhEUgAAABEAAABxCAMAAAAER7iSAAAA81BMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIBAQECAgIJFgk0NDQ+Pj4REREcRhwwdjAKCgo6jzoIFAgGBgY1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4ICAgiVSIucy4yezIgUCANDQ0DAwMFDAUeSR4xMTEXFxcFBQXscelFAAABGUlEQVQ4je2TXVcBURSGt6kU6pAofaCE0OiTiiIpiqj+/6+J9p6ZPa+brq15bs5ZzzprzZw9zxC5hCwCVlbXUIXX0WxEoqhim2i2TAhM3CTw0HYSzU4KTTqGZncPRGb/AMyhOQKTzeXBHJ+AKJzG/aKYK8GR8hm+DFWqVWdb4+Xctuu8u7jk9aoupnR9I2dv2WQaWfKbZsQCc3dPYB5aYNqmCebRlME8mQ6YromCee694LP6KTTJBprX3pszjYHcdPieh2lYHyOZxnj8ybvJlP5L0KqPoNWgVWFJW1XUUDitunitCqpVQbUqqFYF1SqjW2V0q4xuldGtMrpVob/wRZxWZ3/pnIrX6pf9xze5rc66nPNDqlUPf6u/o34+Q0AcW+AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1616.iVBORw0KGgoAAAANSUhEUgAAAakAAABxCAMAAABY6KyfAAAAzFBMVEUAAAAGDgYDBwMJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzA4ijgAAQAyejIeSx4GEAYOIw4TMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR7wO7TDAAADq0lEQVR4nO2bx3JUQRAEZfAChAzigTDCCAkrjPBOwP//ExHctufUPbPdVbuVX9BRh32xkZMrK+WsrlVfgMt69QEznDt/ofoEVC5eqr5glstXqi8AZePqteoTZrm+eaP6BEi2tneqT7Ds3qy+AJK9Tbgv+K1ptfoERG7fqb6gYX+6W30CIvfuV1/Q8uCg+gJAHk571Se0PHpcfQEgT6bD6hNanu5WXwDI0XRcfULLs+fVFwDyYsL787L18lX1CYC8PnlTfULD2+ld9QmIvMf7eu+cfqg+AZGD7eoLGj5+qr4Aks8nX6pPMHz9tl99Aibff2D91vw83ag+AZS1X2fVJ8xw+Lv6Alj+/K2+QHTht+S9Xj3DPWP57Rh2Z78l7/TqGe4ZzW+HaHb2W/Iur57hnuH8dgy7s9+S93j1DPcM6LdDNDv7LXmHV89wz4B+O4bd2W/JO7x6hnsG9Nsx7M5+S97h1TPcM6LfDtHs7LfkYa+e4Z4h/XYMu7Pfkoe9eoZ7hvTbMezOfkse9uoZ7hnSb8ewO/stedirZ7hnRL8dxOzst+Rxr57hnhH9dgy7s9+Sd3j1DPcM6Ldj2J39lrzDq2e4Z0C/HcPu7LfkHV49wz3j+e0gZme/Je/y6hnuGc1vBzE7+y15n1fPcM9ofjuG3dlvyTu9eoZ7Xgi/rfcLfPgN9kjnndHOs/b5Zme/wR7qvDPaedI+3+zsN9iDnXdGO0/Z55ud/QZ7tPPOaOcZ+3y7s99gD3feGe08YZ9vd/Yb7OHOO6OdJ+zz7c5+gz3ceWe084R9vtnZb7Dn4Lwz2nm6Pt/u7DfYc3DeGe08XZ9vd/Yb7Dk474x2nq7Ptzv7DfYcnHdGO0/X59ud/QZ7vPPOaOf5+vxmZ7/BHu68M9p5wj7f7uw32MOdd0Y7T9jn2539Bnu4885o5wn7/GZnv8Ee7Lwz2nnKPt/u7DfYY513RjvP2ec3O/sN9lDnneGeSf32QrwtWGbUzqOidp4FtfM0qJ1nQe08DWrnWVA7z4LaeRrUzrOgdp4FtfMsqJ0nQe08C2rnWVA7z4LaeRLUzpOgdp4F0rcFS43aeVTUzpOgdp4EtfMkqJ1nQe08C2rnWVA7T4LaeRbUzrOgdp4FtfMsqJ2nQe08C2rnWVA7T4PaeRbUztOwEG8Llhm186ionWdB7TwNaudZUDtPg9p5FtTOs6B2nga18yyonWdB7TwLaudJUDvPgtp5FtTOs6B2ngS18ySonWfh/87/AHBile1FWaKgAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492364326;4.copy,1.1,3.260,3.228,3.940,2.19,2.14,1.1,3.240,3.228;4.copy,1.1,3.280,3.247,3.920,2.19,2.14,1.1,3.260,3.247;4.copy,1.1,3.250,3.266,3.950,2.19,2.14,1.1,3.240,3.266;4.copy,1.1,3.400,3.456,3.800,2.57,2.14,1.1,3.390,3.456;4.copy,1.1,3.380,3.475,2.20,2.38,2.14,1.1,3.370,3.475;4.copy,1.1,3.370,3.494,2.10,2.19,2.14,1.1,3.360,3.494;4.rect,1.1,4.1133,3.179,2.15,1.7;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.191,2.36,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.223,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.291,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.307,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.316,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.411,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.371,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.687,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1123,3.136;4.blob,1.1,1988.iVBORw0KGgoAAAANSUhEUgAAAEwAAABcCAMAAADzn6OCAAACeVBMVEUAAQE2hoYeS0sAAAARKSk+mZk2hYUpZGQsbW09l5cQKCg8lZURKysra2soY2MECgo3iIgTLy88lJQaQUEhUFABAgI4i4saQEAyfHwHEhIVNDQDBwceSkoPJCQvdXVQxcUwd3dW1NQbRERg7u4NISEBAwNY2totcHAUMjJm/f0LGxshUlJj9fUFDAw6kJBMvLxFq6tHsLACBARe6ekmXl5f6uowdnZj9PQECwsIExNn//9EqalCo6MQJycbQkIGDw9k9/ccRUUTLi4ZPj4oZGRc5OQLHBwdSUlOwsI4iooCBgZl+vopZWVn/v4SLCxQxsYDCAgyfX1Tzs4zfn5Y29tRyMgnYGBW1tYLGhoXOjo5jY1Nv79Tzc0IFBQxenoNICAOIiICBQUOIyNbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgiIiI0NDQHBwddXV3///8fTExQUFDIyMjz8/MgICBKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHxf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKytX19cBAQF9fX3i4uL29va2trZaWlrg4OAKGBgiVFRUz89a399BoqJHr69Z3d1CpKREqKgIFRVDp6dKtrZl+/scRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaVd5uYdSEgJFxcsbGxc4+MgT09OwcEjVlZe6Ogrampc5eUqaWkSLS0NHx8zf38MHh4jV1ckWlpb4uIweHhi8vJU0NApZmYucnJY2dlV09M/nZ1m/PwWNzda3t5Kt7dl+fkkWVkUMTEECQkgUFAtb29FqqpSzMz65xqVAAADFElEQVRYhe2Z+VPTQBSAF4KooELRYoWqgNQDCipeJUpbvC2CogjeKN54az0RD1TEC++KNyJ4VhFFvFDxvkX9i4zZZLdNm9rsdkadyfsh+yVv3zfJJPuSaQEICmZIA9dCAiFtQgGpDNdCAm3btQ8jleFaSCC8Q8dOhK4IVCsQiASaqAgyWWdUKxDowmiju5LJdKhWINCNYTQxRK5YvVgrEvGd9BaqTJWpsr8pkzZrTAQyabPGRCCTNmtMymUezRqTcplHs8akXObRrDEplnk2a7VtqzJVRiPrHkBZj570srh4OCb0SqSXxcfxg6F3H5kJCmR9+yXxY7IxhV6W2h+OAwbKzfBfljZoMIQhQ+llwcNM/JjOJtPLho+AYwZrppZZrJkQRrKjqGWjx2ghjGXHUcvGTxDAljWRVpaYnSPipHAimW0yHwYOc6ego1PzpFmRfMqmsXzkc1iAl9D0rBmSrEg+ZWExfKRLDs+cBdyzIpG0INPsUO8Jon42Z24AZXLxn8kK2aRAyqRPA4VsHjs/cLIiqwALFi5avGQpnUyMZcXLV6xctVq5TMuvVffLW7OWYdatt/t9aki2gV+rkhfPxk2b7Xb7FsUyC79Wi9ySW0u2lW7fQSDzFjt3/T47JbKyMtnk7j3cZq8Cmal8X4Vccn/JgYOHiu2H/ZbFVuaZ5JJHjh47fuLkqVK/Zf5OVGX/iswhe/MJZKerLLIy3KLBmVwPEiPFqEd89pxIuBYSwC06gT0PpITiwkWEl4ziNxWuhQRwi66+XGOWEoortXgJ110VANdCAqhFX7t+4+YtCeEwOPEv4LfZOxBQrUD4curvahusFe7kcrHR9xCWsfcZr4GnVwUxaY0PXEkbZWx6yO2nOrjNo+zHaGrjkz/ITLqnDNPQ7ErPnutf1FYXNrfwT9ZLHSqqlPl29PWcveK+4zQFbE0+v/f6DUq8fadcBidkCL3T8f6DeOxjJKEMxyfx4gyf66llX8ptEHLYr9Syby2tEL47tdQypu4HHH9KVy6JTIjWJrmXo3JZiDNTLqVcZpb/O+4XxwH4KRghTX4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.233,3.202;4.blob,1.1,180.iVBORw0KGgoAAAANSUhEUgAAA34AAAADBAMAAAA+U8ClAAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAJ0lEQVQ4jWNgFGAYBUMVACNP2XWgHTEKyAbAyEtvGmhHjAKyQXoTAFOwAsXfRJbhAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.212;4.blob,1.1,4996.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.653,3.297;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1151,3.318;4.blob,1.1,2180.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.251,3.326;4.blob,1.1,560.iVBORw0KGgoAAAANSUhEUgAAAQsAAAANCAMAAACJpbvJAAAAwFBMVEUFBQxjY/UeHkoAAAB3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl5eJiYSEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgkJFlfX+wCAgYhDQ3+Z2csEhIEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZwLS0obG7AAAAAnklEQVRIie3QRxaCQBRE0a8F5gjmhBExZzGz/11pA3uoHngHNX6nRBJJ/P0YpiCVZlfowTQEmWyOnaGDfKEoKJUr7A4dVC0IYNfYHRqoN5rqi1a7wy7h6/b66gsMHHYJ33CE8IvxhBzCN5250Rdzb8FuYVuu1tEX2GzZLWy7PeIvDscTuYXsfLki/sK/3ckxZI+n2vALvN7UFLpPoPYLmCkv0X7FMLoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.345;4.blob,1.1,2456.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.345;4.blob,1.1,1704.iVBORw0KGgoAAAANSUhEUgAAAWUAAAAgCAMAAAD9uZniAAACeVBMVEUAAAAFDAxj9fUeSkpKSh75+WVUVCIMBQX1Y2NKHh5CpKREqKhPTyDk5FwXFwmkQkKoREQcRkZj9vYGDg5GHBz2Y2MOBgYBAwNd5uYoY2MDAQHmXV1jKCg4i4tOwcGLODjBTk4SLS1n/v4NHx8tEhL+Z2cfDQ1U0NAyfHzQVFR8MjIucnJY2dlyLi7ZWFgKGBhm/PwWNzcYCgr8ZmY3FhZKt7c8lZW3SkqVPDwkWVlf7OwCBgZZJCTsX18GAgIECQli8vIgUFAJBATyYmJQICA/nJxFqqqcPz+qRUUwdzBW1FYFDAVj9WMeSh4wd3dW1NQFBQxjY/UeHkpCpEJEqERCQqRERKgUMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscHEZjY/YGBg46kDpMvEwBAwFd5l0oYyg6kJBMvLwBAQNdXeYoKGMCBAJe6V4mXiY4izhOwU4CBARe6ekmXl44OItOTsEeSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSEi1nZ/4NDR8BAgIDCAgCBQVEqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NUVNAyMnwfTExn//9HsLAGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUuLnJYWNkVNDQOIyMoZChc5FwKGApm/GYWNxYoZGRc5OQKChhmZvwWFjdOwk44ijhKt0o8lTxOwsI4iopKSrc8PJUNIQ0SLBIkWSRf7F8CBgINISESLCwkJFlfX+wCAgYyfTJTzlMECQRi8mIgUCAyfX1Tzs4EBAliYvIgIFBW1lYtcC0/nD9FqkVW1tYtcHA/P5xFRapXMgb0AAACP0lEQVRogWNgIBIwMjETq3SEARZWNpxy7BycpBnGxU2ha4Yt4OHlwynHL0CaWYJCwhS6ZiQCEVExktSLS0jSyCXDGUhJy5CmQVaONg4Z3kBegTT1ikrKNHHH8AYqqmqkaVDXoI1DhjfQ1CJNvbYObdwxvIGuHmnq9Q0MaeOQYQ2MjE1I02BqRhuHDG9gbkGaeksra9o4ZFgDG1s7ktTbOzjSyCXDGTg5u5CmwdWNNg4Z3sDdY6BdMApGwSgYBaNgFIyCYQpwzjR5euHQ4e3jSzPXUAj8/OlkUUBgEGkuwDXT5OWJy4rgEFIdRS/g70cvm0LDSHMBjpmm8IhIXDZERceQ7ix6gNi4eHpZlZCYRJILcMw0JafgtCE1LZ0Md9EBZGTSzaqs7BzSXIB1pik3Lx+3FQWFJLuKHqCouIR+lpWWkeYCrDNN5RWVIKqqGgRqUFgMDLV19VRxKZVBQ2MT/SxrbmnF6YK2dhDoQGFhnWnq7AJT3T0g0IvCAoK+fpq4nEIwYSI9bZs0GacLpkwFgWkoLGwzTdNnzITQs0BgNgoLCObMpYnDKQPz5i+gp3ULF+F0wbzFILAEhYVtpmnpsip8NixfsZIaDqUuWLW6jZ7WrVm7jjQXYM40rd+A34qNm0h2Fc3B5i30tW/rNtJcgDHTtL1uB34bdu7aTbqzaAv2KO2lr4X79h8gyQUYM00HDxGw4fCRo6Q7i7bg2HE6W3ji5CnSXIA+03T6DCErzp4j1VG0Bucv0NvGi5eIdQEA+W6Vh7jXWBAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.381;4.blob,1.1,1900.iVBORw0KGgoAAAANSUhEUgAAAgQAAAASCAMAAAATzDYLAAAC61BMVEUAAAAPJA8vdS9QxVAFDAVj9WMeSh4wdzBW1FYFDAxj9fUeSkobRBtg7mANIQ1CpEJEqERCpKREqKgBAwFY2lgtcC0cRhxj9mMGDgYUMhRm/WYLGwscRkZj9vYGDg4hUiFd5l0oYyg6kDpMvEwBAwNd5uYoY2M0gYExeXkHEhJFq0VHsEc3NzfBwcH39/fp6emTk5MMDAyBNDR5MTESBwc4izhOwU4CBAJe6V4mXiY4i4tOwcEtb288lJQPJCQCBQUDCAgBAgJf6l8wdjAnJyf29va4uLhISEhiYmLu7u61tbVvLS32Y2P1Y2OUPDwkDw8SLRJn/mcNHw0eSx5j9GMECwQSLS1n/v4NHx8GDw8qaWlSy8tm/f1HsLAZPj5n//8iVFQIEwhn/2eqqqra2toEBARHR0f///9BQUEPBgZpKirLUlL9ZmawR0c+GRlU0FQyfDJEqURCo0JU0NAyfHwTLi5Kt7cdSEgNISEVNDQHEREQJxAbQhv09PSEhITr6+uMjIwuExO3Skr/Z2dIHR0uci5Y2VgGDwZk92QcRRwucnJY2dkoZGRRyMhl+/sLGxsTLhMZPhkJCQlsbGzR0dGgoKAMBQVkKCjIUVH7ZWWoREQbCwsKGApm/GYWNxYoZChc5FwBAgEKGBhm/PwWNzc/m5ti8/Nh8fE5jY0MHh4LHAsdSR319fWNjY0tEhKbPz/zYmLxYWGNOTkeDAxKt0o8lTxOwk44ijg8lZU/nJxa4OACBgJl+mUpZSmtra1EREScPz/gWlpyLi4OBgYECwtf7Oxh7+8GEBAkWSRf7F8SLBIkWVkCBgYQJycCBARQxlApKSm3t7dfX1/t7e0nEBAEAgIDBwdX19dY29sECQRi8mIgUCADCAMyfTJTzlMECQli8vIgUFAzfjNY21g6OjrExMSXl5cODg4/nD9FqkVRyFEnYCdW1lZFqqoLGgsXOhcQKBAVNBU5jTlNv00AAQBTzVM2hTYIFAgxejHPFRLsAAACYUlEQVRogWNgGAUjBzAOtANGwYADJuaBdgEQsLCyEVLCzoHC5eTipplrRhzg4eUbaCeAAL8AIRUc7Kh8QSFauWXEAWER0YF2AhiIiUvgVyApJY0qICMrRzvnjCwgz8oy0E4AA2EFRfwKlJTRBFRU1WjmmmEB1DU0iVSppQ1l6Ojq6RsYAhlGxiY0chVeYGqGV9rcwhJdyMqaZo4ZFsBGlsvWDsyydwADR1wqnZwhtIurm7uHpxeQ5e3j6+dPD0eigoDAIHzSwSGh6EJh4RG0c85wAJFR0TGxcUCGYDwYJOBQl5gkD2Ekp6QyMKSlZwCZmVnZObl59HEnEsgvwCdbWIQpVlxCK7cMG1BaFl/OwFBRCQZVOBRVJ9VAGLV1ILK+AcJrbGpuob0LUUFrGx7J9o5OTMGubpo5ZngAzp7ePqF+gtXBhKSJYHpS+mQQNWUqiJw2fcbMWbPp404EmDN3Hm7J+QsWYgouWryEds4Z+iBs6bLlK1aCWASqg1VJqyGMNZCSYC0Dw7r1GzZu2gziydG3D7ZlK265bduxiZbtoJVbhgPYuasLGoEEqoPde/ZCGPsgbYL9DAwHDh46DBY6cvTYcdo7FQFOnNyNS4ov8BQ24dNHz9DOOUMenD1HrMrz0Ox3Qe9i2qXLbkDWlatQqWvXbxyhvtNwg5u3bgPJ3XfAQBiZxXD3HlYd9x88pKcDhy149BjKePJUr/7Z8wF1y4uXQOJVEhi8RmYxvMExrLnzLT3dN2zBuz3vB9oJqODDRzBIRGaNAhqDT5+/DLQTRsFAg9Cv3wbaCaNgwMH3H9jFAQQgsZxy4W+DAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.402;4.blob,1.1,2908.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.332,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.457;4.blob,1.1,3156.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.649;4.blob,1.1,2740.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;3.end,1.1;4.sync,10.6492364431;4.copy,1.1,3.250,3.171,3.950,2.19,2.14,1.1,3.240,3.171;4.copy,1.1,3.250,3.228,3.950,2.19,2.14,1.1,3.240,3.228;4.copy,1.1,3.260,3.247,3.940,2.19,2.14,1.1,3.250,3.247;4.copy,1.1,2.20,3.304,4.1180,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.530,3.323,3.670,2.19,2.14,1.1,3.510,3.323;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,4.1191,3.185,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.233,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.221,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.269,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.286,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.653,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.329,2.17,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.551,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1163,3.345,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.392,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.211,3.183;4.blob,1.1,4636.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1113,3.193;4.blob,1.1,1316.iVBORw0KGgoAAAANSUhEUgAAAFQAAAAjCAMAAAA9kt2KAAAB2lBMVEUAAAANICBn//8LGxseSkpl+fkiVFQIExMgT09c5OQJFxcOIiICBQUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgBAgIDCAgiIiI0NDQHBwddXV3///8fTExHsLBQUFDIyMjz8/MgICAGDw8VNDRKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHwECwtf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysDBwdX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OAKGBhUz88AAQFa398yfX0FDAxj9fVBoqJHr68bRERZ3d1CpKREqKgIFRUdSUlDp6dKtrZl+/sbQkIcRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaUBAwNd5uYoY2MdSEgsbGxc4+M4i4tOwcEjVlY2hoYCBARe6Ogramo8lJRc5eUqaWk6kJASLS1n/v4NHx8zf38yfHwMHh4jV1ckWlpb4uIweHhi8vJU0NA8lZUpZmYnYGATLy9W1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t43iIhKt7ckWVkCBgYSLCwUMTEECQkgUFAtb29FqqpSzMwRKSkcRUUeS0ug37kEAAABuklEQVRIiWNgwAIYmZixCRMFWFjZsEswMrGTbSgDBycXVnFuJh7yDcUFePmgDH4BQSFhEeoaLiomLiEpJU2+ATKyIIDqbTl5BgYFRSXynarMBAIqqIKqaupKSkoaZBuqqQUCvChi2jq6evoGFBiKDRgaAQlVcgw1NsYpZWIKJMzIMNTcwtIKl5y1jo2tnZiSPcmGOjg6meOSc3ZxdXP38NQj2dBRMFyBF87EQgFg89YkqAZRdfj4+mGwYMA/gAXODgzC1IvGQlQdwUwhPugsOAgNgzPDAyLgBrBjZyGqjsio6Bh0FhzExiGKiPgEKAOhF40FrzoSk5JTUtFYCJCWngFnZzJBqza4XqwsEMjKluHgs0JlIQVCTi6cacyUx0Ak8M5nKCgsQmbJFAeUlAL5ZV5AoryiEq60sIpIM82ra4B1di0yq66epSEukrG2EZwym6rhah2biXUpJmhpZWBoa2eKbgXzOjrhEl3d5BsKBj490DLcq7cPJtY/gUJDEWAizNNprFlUM3SSxWQIYwrTVKoZOq1xOoQxI12GaoYyxM+E0LPQSwYqgOkluCt1csHs9DlUN5MhZi5BJQCgT0x+yqbiYgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.650,3.272;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.326;4.blob,1.1,2812.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.345;4.blob,1.1,5700.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.332,3.421;4.blob,1.1,296.iVBORw0KGgoAAAANSUhEUgAAAAYAAAANCAMAAAC91e+5AAAAWlBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxtMM6c0AAAAP0lEQVQImR3MRwKAIBAEwSWIYMKEmf9/U5o5VN9GpExpFK3Q2Ia4Fn3oSD+MZIo4LyvZ9kSOEy97k+etR1/GHzcdAbswyA83AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.742;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAAsElEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYuLFG9/t2ZlMMpsR4pWQQMIRUInG/IyrGsp6woCTKU5LZ8Cs1OGcNOG8LMBFWYLLVoXzqzXaVum61eBDs9WGjU6XDb2++CUO9xaD4YgP4wk9TXAV4c7ouXTghVyyYWXT64/dNy693YHx/QE+yhOsefyZ8wW83hZ+3j0FZfMhviS4LyS4r3eC+xL/vq8nay4ZhXPYYbEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAAArUlEQVQ4je3SRw+CQBCG4VVRAbGt2FCxK1bsHev//0968MBrYmI8892enckksxkhXgkJJBwBlWjMz7iqoawnDDiZ4rR0BsxKHc5JE87LAlyUJbhsVTi/WqNtla5bDT40W23Y6HTZ0OuLX+JwbzEYjvgwntDTBFcR7oyeSwdeyCUbVja9/th949LbHRjfH+CjPMGax585X8DrbeHn3VNQNh/iS4L7QoL7eueP+3oCzzgWCy3eoeAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492364530;4.copy,1.1,3.260,3.171,3.940,2.19,2.14,1.1,3.250,3.171;4.copy,1.1,3.270,3.228,3.930,2.19,2.14,1.1,3.250,3.228;4.copy,1.1,2.20,3.285,4.1180,2.38,2.14,1.1,1.0,3.285;4.copy,1.1,3.520,3.323,3.680,2.19,2.14,1.1,3.500,3.323;4.copy,1.1,3.940,3.342,3.260,2.19,2.14,1.1,3.920,3.342;4.copy,1.1,2.20,3.456,4.1180,2.57,2.14,1.1,1.0,3.456;4.rect,1.1,3.233,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.243,3.202,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.223,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.253,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.269,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.303,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.272,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.373,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.706,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.201,3.183;4.blob,1.1,4596.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1103,3.193;4.blob,1.1,1332.iVBORw0KGgoAAAANSUhEUgAAAF8AAAAjCAMAAADFciZ9AAAB2lBMVEUAAAANICBn//8LGxseSkpl+fkiVFQIExMgT09c5OQJFxcOIiICBQUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgBAgIDCAgiIiI0NDQHBwddXV3///8fTExHsLBQUFDIyMjz8/MgICAGDw8VNDRKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHwECwtf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysDBwdX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OAKGBhUz88AAQFa398yfX0FDAxj9fVBoqJHr68bRERZ3d1CpKREqKgIFRUdSUlDp6dKtrZl+/sbQkIcRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaUBAwNd5uYoY2MdSEgsbGxc4+M4i4tOwcEjVlY2hoYCBARe6Ogramo8lJRc5eUqaWk6kJASLS1n/v4NHx8zf38yfHwMHh4jV1ckWlpb4uIweHhi8vJU0NA8lZUpZmYnYGATLy9W1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t43iIhKt7ckWVkCBgYSLCwUMTEECQkgUFAtb29FqqpSzMwRKSkcRUUeS0ug37kEAAABxklEQVRIiWNgwAIYmZixCRMFWFjZCKphZGIn23wGDk4uQkq4mXjIN58IwMsHZfALCAoJi9DMHlExcQlJKWmqmCUjCwKo4SInz8CgoKhElgfQzVNmAgEVVEWqaupKSkoa5JiPbp6mFgjwoqjR1tHV0zcgz3xs5qEDQyMgoUqe+XBgbIxTysQUSJhRZr65haUVLjlrHRtbOzEle0rMd3B0Mscl5+zi6ubu4alHifmjYBSgAC+cyY06gM1bkxTliLrQx9cPgwUD/gEscHZgEKZe3CxEXRjMFOKDzoKD0DA4MzwgAm4CO0EWoi6MjIqOQWfBQWwcopiKT4AyEHpxs+B1YWJSckoqGgsB0tIz4OxMJmgNDtdLgAUGWdkyHHxWqCykUMrJhTONmfIYSAfe+QwFhUXILJnigJJSIL/MC0iUV1TClRZWkW68eXUNsO1Si8yqq2dpiItkrG0Ep/imarhax2Yy3I8JWloZGNramaJbwbyOTrhEVzdVzAcDnx5o9ePV2wcT659APfMRYCIsVNJYs2hh/iSLyRDGFKaptDB/WuN0CGNGugwtzGeInwmhZ6GXTtQF00twt2ioAGanz6Gl8Qwxc0lRDQCoak7UoRVsFwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.650,3.253;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.326;4.blob,1.1,2832.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.345;4.blob,1.1,2604.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.364;4.blob,1.1,1284.iVBORw0KGgoAAAANSUhEUgAAAUcAAAANCAMAAAANI1znAAAB71BMVEUFDAxj9fUeSkoAAAAwdzBW1FYFDAVj9WMeSh4wd3dW1NQFBQxjY/UeHkpCpKREqKhCpEJEqERCQqRERKgcRkZj9vYGDg4UMhRm/WYLGwscRhxj9mMGDgYUMjJm/f0LGxscHEZjY/YGBg4BAwNd5uYoY2M6kDpMvEwBAwFd5l0oYyg6kJBMvLwBAQNdXeYoKGM4i4tOwcECBAJe6V4mXiY4izhOwU4CBARe6ekmXl44OItOTsESLS1n/v4NHx8eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw0eS0tj9PQECwsSEi1nZ/4NDR9U0NAyfHxEqURCo0IfTB9n/2dHsEdU0FQyfDJEqalCo6NUVNAyMnwucnJY2dkGDwZk92QcRRwVNBUOIw4uci5Y2VgGDw9k9/ccRUUuLnJYWNkKGBhm/PwWNzcoZChc5FwKGApm/GYWNxYoZGRc5OQBAgIKChhmZvwWFjdKt7c8lZVOwk44ijhKt0o8lTxOwsI4iopKSrc8PJUkWVlf7OwCBgYNIQ0SLBIkWSRf7F8CBgINISESLCwkJFlfX+wCAgYECQli8vIgUFAyfTJTzlMECQRi8mIgUCAyfX1Tzs4EBAliYvIgIFA/nJxFqqpW1lYtcC0/nD9FqkVW1tYtcHA/P5xFRao6bEqUAAABjklEQVRYhb2QVXPCUBSE0x5oC3V3d3d32lJ3d3d3d3d3lx9akjyF3ADJzL3fA+dOlp3dWYoyMgYkMjn6O5iYmgko2FAoSScajLmFJX0osLJG/0EuE7La2OKpJIxSQTrRcOzs6V8KHBydULKzi6uQ083dA1cpNJ5e3mQDxeDj6wf0jv4BgSg5KFjQGRIahqsUmvAIsnmiiIyKBnpHiIlFqHHxCcLWxCRcpZAkp6QSzRNJWjowO2ZkZvHF7Jxc+qjyaPI5L4ACdSHBnlBUXEIyTiylZeXMjlBRyRerqplTU0tTx3lpqG8g1lJDYxPJNPE0t7A7trbxpPaOTvZ20XRzXhp6eomVBOjrHyCYJoHBIXbH4ZFRbWlsXKXLOTE5ha0Vj+mZWXJhUpibX2B2hMUlbWl5Rbd1dQ1PJRTrG+SypLG5xe64vbPLFfbU+7qdB4dHmDrxOM48IRUlldOzc2bHi8srrnB9o8d5e3ePqROPh0dSSZJ5en5hdoTXN67w/qHP+vmFpRGC7x9SSdL5/fsHDP9wEDGbfFwAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1191,3.386;4.blob,1.1,328.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAb1BMVEU0NIExMXkHBxIAAAAtLW9jY/ZjY/U8PJQPDyQGBg8qKmlSUstmZv1HR7AZGT4TEy5KSrdnZ/8dHUgFBQwoKGRRUchlZftERKgLCxsSEi0/P5tiYvNhYfE5OY0MDB4/P5xaWuAuLnIGBg4QECcCAgT7PaiKAAAAQElEQVQImWNgYGRiBgEGFlY2dg4Qg5mTi5uHlw/IAAJ+AUEhIENYRFRMXIJBUkpaRlYOqEZeQVEJrEtZBaybGQBSnQLs5Twb0QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.402;4.blob,1.1,1728.iVBORw0KGgoAAAANSUhEUgAAAUcAAAAOCAMAAACLty5JAAACmlBMVEUAAAAwd3dW1NQFDAVj9WMeSh4wdzBW1FYgICD///8bGxthJydpKyswMHdWVtRCpEJEqEQTExMNBQWTPDwsEhIUMjJm/f0LGxscRhxj9mMGDgYUMhRm/WYLGwsiIiIFBQVeJiZxLi4UFDJmZv0LCxs6kJBMvLwBAwFd5l0oYyg6kDpMvEwSLCwsbW0jIyP39/crEhKZPj4OBgZKtko6OpBMTLwCBARe6ekmXl44izhOwU4CBAJe6V4mXiYBAgIWNzczfn4+mZkxeHgIAwM0FRUCBQIDCAMBAgElWyVV0lVn/2dRyFECAgReXukmJl4eS0tj9PQECwsSLRJn/mcNHw0eSx5j9GMECwQCBQUaQUE2hoY8lZUoYmIOIiKLODhMHx8iVCIECQQsbCxa31pk+GRCo0IXORceHktjY/QEBAtEqalCo6NU0FQyfDJEqUQpZGQ9l5cfTU0FCwuBNDRZJCQNIQ0VNBUHEQdDp0Nl+2U0gTQIEwhERKlCQqMGDw9k9/ccRUUuci5Y2VgGDwZk92QcRRwTMDA1g4M7kZEkWVkLHBx/MzMgUCBY2lhh8WE8lTwTLhMGBg9kZPccHEUoZGRc5OQKGApm/GYWNxYoZChc5FwAAQExenqFNjZSISFSy1JQxlAlXCUoKGRcXOQBAQJOwsI4iopKt0pOwk44ijgQKCgtcHA7kpICAQGVPT1BGhobQxtMu0xi82JOTsI4OIoNISFn/v4kWSRf7F8CBgISLBIaCwsdDAwNDSFnZ/4SEiwyfX1Tzs5i8mIyfTJTzlNDGxuKODgBAAAEAQEFAgIyMn1TU85W1tY/nD9FqkUnYCdW1lYtcC16MjJLHh54MTE6FxdWVtYtLXAQKBAwExOJODgYCgofDQ0LBQU314wBAAACL0lEQVRYhWNgAAFGJgZkwMzCykAAsLETUkEh4ODkgrK4eWhsFeWAlw9CMzGiivMLENLJzkYL9yABDk5BKEtIWITGdlEM+HjBlKiYOKq4hKQUfo3SMrI0chIMyHHKw5gKijS2i1KgpKwCplXV0CTUNTTx69TSpo2LgEBHF0zp6cNFDAyN8OpgNaaZY4gDJqZgyszcAl3G0gqvRmsbW9q4yM7ewdEJXdDZ0AVVwNUNDNzBTvHw9PKmjWOIBT6+fmDaPyAQXSooOASfztCwcFo4KCIyKjomFlM8Lh6Vz+8FBgkMDIlJySmpabRwCwkgPSMTTGdlY8rl5OLTmZdKEwflFxQWYRMvLkHll5aBQTkDQ0VlVTVNnEIKqKkFU3X1DZhyjU14NDa3tNLEQW3tHZ1dWMS7FVD5iHzd09vXP4EmbiEeTJw0GUxPmWqHKTlt+gzcOmfOcqeNk2aLznFktMcQnjsPlY/I1wzuCfO9FiykjWuIBIsWLwHTS5dhk13ej1vnipU0cRAYrFq9Bl1o7br1qAKIfA0CGzZuop1ziACbt4Cprdt0sMlu37ETl8bS4F00chIYiKML7Dbcg19HEK2cQgzYu28/mD5wEKt04qEeILkTUhKpI7MYDh+hnytB4Oix4yDqxEkwWEtfywmCU6ch9JnV2OXPngMS3pCS6Dwyi+HCRXq5EQIuXQZTVwzB4Cp9LScIrl0nQtENSElUjcyiN7h5yxlM374DBnfp7wIiAAAZI4/c0/8BUgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.649;4.blob,1.1,2644.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.432,3.742;4.blob,1.1,596.iVBORw0KGgoAAAANSUhEUgAAAA8AAABeCAMAAADL2r4qAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAArklEQVQ4je3SRw+CQBCG4cWO6KLYC1jBCvaCvfz//+TN8JqYePLEd3tmNpvN7AjxjhIRSDQWZyGRpFNqmgUtQ2elAusyxwN5gy4U6ZJGlytgtVaHG7IJm1YLbnfAbk8Psm/ZaDsD8SVDcjQG7ckUj3RNtD2Vc57NedtiCa6kB6+lA2/kFt5JfsreP/D+48eMDZc++WcWLldOMXK788DjKX5JuF/hfolwvwL5w369ADtLGShRxShLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.780;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAAA4CAMAAAAVd1JtAAAA0lBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAh4eDE8PBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRIueUspAAAAqUlEQVQoke3SNxLCQAyFYQEm2yYtBkzOYHLOmHj/K0FB4b9ghgPwCs1+0o4qibzjE8QfALVg6PMKR94lGouL17phwomkwKk0nFE6nFUWnFN5uKBsuFgqc3+lStdidL3UgKXZasNmpwtLry+/xDHpwXDExnhCTw2bjdmcXigHXqoVP6xr9KZKb2f0bg9GD0f4pM5w3G3Dlyt4uy+9fLgaxtZTvuR/X17jvl53hhE6RXbxjQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492364635;4.copy,1.1,4.1120,3.171,2.80,2.19,2.14,1.1,4.1110,3.171;4.copy,1.1,2.10,3.266,4.1190,2.38,2.14,1.1,1.0,3.266;4.copy,1.1,3.270,3.304,3.930,2.19,2.14,1.1,3.250,3.304;4.copy,1.1,3.420,3.323,3.780,2.19,2.14,1.1,3.400,3.323;4.copy,1.1,3.950,3.342,3.250,2.19,2.14,1.1,3.930,3.342;4.copy,1.1,3.150,3.456,4.1050,2.19,2.14,1.1,3.140,3.456;4.copy,1.1,3.170,3.475,4.1030,2.38,2.14,1.1,3.160,3.475;4.copy,1.1,3.150,3.494,2.20,2.19,2.14,1.1,3.140,3.494;4.rect,1.1,3.243,3.183,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.283,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.307,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.354,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.350,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.345,2.17,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.362,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.394,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1093,3.193;4.blob,1.1,1368.iVBORw0KGgoAAAANSUhEUgAAAGsAAAAjCAMAAACkagQ/AAAB2lBMVEUAAAANICBn//8LGxseSkpl+fkiVFQIExMgT09c5OQJFxcOIiICBQUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgBAgIDCAgiIiI0NDQHBwddXV3///8fTExHsLBQUFDIyMjz8/MgICAGDw8VNDRKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHwECwtf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysDBwdX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OAKGBhUz88AAQFa398yfX0FDAxj9fVBoqJHr68bRERZ3d1CpKREqKgIFRUdSUlDp6dKtrZl+/sbQkIcRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaUBAwNd5uYoY2MdSEgsbGxc4+M4i4tOwcEjVlY2hoYCBARe6Ogramo8lJRc5eUqaWk6kJASLS1n/v4NHx8zf38yfHwMHh4jV1ckWlpb4uIweHhi8vJU0NA8lZUpZmYnYGATLy9W1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t43iIhKt7ckWVkCBgYSLCwUMTEECQkgUFAtb29FqqpSzMwRKSkcRUUeS0ug37kEAAAB4klEQVRIiWNgwAIYmZixCRMFWFjZSFLPyMROtl0MHJxcpCjnZuIh3y4SAS8flMEvICgkLEIXO0XFxCUkpaSpbq6MLAighp2cPAODgqISWR7DZh4MKDOBgAqqoKqaupKSkgY5dmE1Dwo0tUCAF0VMW0dXT9+APLuwmYcPGBoBCVXy7MIKjI1xSpmYAgkzKtgFtcPcwtIKlxJrHRtbOzEle0qtgtnh4OhkjkuNs4urm7uHpx6lduGzYxSMArKAFx2TFJu3JrlaEfW9j68fBgsG/ANY4OzAIEy9+FkI9bD6PpgpxAedBQehYXBmeEAEhl78LBhA1PeRUdEx6Cw4iI1DFJvxCRh68bNgAF7fJyYlp6SisRAgLT0Dzs5k4kLTS4CFAbKyZTj4rFBZSCGZkwtnGjPl4TQFG0CPDwYG73yGgsIiZJZMcUBJKZBf5gUkyisq4UoLq0iwCcUUCDCvrgG27WqRWXX1LA1xkYy1jeAc1VQNV+vYTIJdqKbgAi2tDAxt7UzRrWBeRydcoqubBLtQTcELfHqgValXbx9MrH8CCXahmkIkmAgLuTTWLFLtIhVMspgMYUxhmkpru6Y1TocwZqTL0NouhviZEHoWemlJOzC9BHcrj8pgdvocelnFEDOXXJ0A4m1bYpYLaGgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.223;4.blob,1.1,2252.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.650,3.234;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.191,3.307;4.blob,1.1,992.iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAMAAACfHyDkAAABfVBMVEUDBwc8k5MSLCwAAAAdR0c0f38HAwOTPDwsEhIoYmIpZWViKChlKSkRKio8lJQDCAgMHh4+mJgHEBAqERGUPDwIAwMBAgI4iooYOzsjVlYucXECAQGKODg7GBgiU1MvdHQ5jIwXODhTIiJ0Ly8LGxsIExMSLS07kpIbCwuYPj4TCAgzfX0eSkp9MzNKHh4cREQ1goIECQkRKSlEHByCNTUGDg49l5cNISEYPDw3iYkAAQEOBgaXPT0hDQ0sbm4kWVluLCxZJCQWNTU5jo4BBAQIFBQLGho1FhaOOTkEAQECBQU7kZETMDAeS0syfHwFAgKROzswExMmXl4pZmYxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYEBAliYvIgIFA/P5xFRaptCG/OAAABJElEQVQ4jWNgYGRiJgBYWFG4bOwcIIqBmZOLkE5WFlQ+Nw9EJy8fP36NAoJCqALCIqJgnWLiEvh1SkqhCUjLyIJ1MsvJ49UopqCILqSkDNGpIqiKT6eaOgO6kIamFlgns7YOPp1cnJhiunoQnfoGeDQa8hlhChqbQHSampnj1mlhaYUpaG1jC9bJbGePW6e8HDZRB0eITidnF1waXQXdsAm7e3iCdXp5+wBJFy8wEENmMfv6YTXQPyAQEuJBwUAiJBQMwpBZzOER2N0SGYUUV9ExYBCLzMIDMGKZaDACdcbFJ5BrZ2ISuTqTU1LJ1JmWnkGmTubMLHJ1ZufkkqmTOS+fXJ0FheTqLCouIVMnc2kZuTrLKyrJ1FlVXUOmTubaOmJ1AgDVoUBO8n519gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.335;4.blob,1.1,2620.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.345;4.blob,1.1,2092.iVBORw0KGgoAAAANSUhEUgAAAEIAAABZCAMAAAC9mwKCAAACx1BMVEUAAAAFDAxj9fUeSkpCpKREqKgcRkZj9vYGDg4BAwNd5uYoY2M4i4tOwcESLS1n/v4NHx9U0NAyfHwucnJY2dkKGBhm/PwWNzdKt7c8lZUkWVlf7OwCBgYECQli8vIgUFA/nJxFqqowdzBW1FYFDAVj9WMeSh5CpEJEqEQUMhRm/WYLGwscRhxj9mMGDgY6kDpMvEwBAwFd5l0oYygCBAJe6V4mXiY4izhOwU4eSx5j9GMECwQBAgEDCAMCBQISLRJn/mcNHw1EqURCo0IfTB9n/2dHsEdU0FQyfDIGDwZk92QcRRwVNBUOIw4uci5Y2VgoZChc5FwKGApm/GYWNxZOwk44ijhKt0o8lTwNIQ0SLBIkWSRf7F8CBgIyfTJTzlMECQRi8mIgUCBW1lYtcC0/nD9FqkUPJA8vdS9QxVAbRBtg7mBY2lghUiE0gYExeXkHEhJFq0U3NzfBwcH39/fp6emTk5MMDAwtb288lJQPJCQCBQUDCAgBAgJf6l8wdjAnJyf29va4uLhISEhiYmLu7u61tbUGDw8qaWlSy8tm/f1HsLAZPj5n//8iVFQIEwiqqqra2toEBARHR0f///9BQUETLi4dSEgNISEVNDQHEREQJxAbQhv09PSEhITr6+uMjIwoZGRRyMhl+/sLGxsTLhMZPhkJCQlsbGzR0dGgoKA/m5ti8/Nh8fE5jY0MHh4LHAsdSR319fWNjY1a4OBl+mUpZSmtra1EREQQJycCBARQxlApKSm3t7dfX1/t7e0ECwth7+8GEBAzfjNY21g6OjrExMSXl5cODg4DBwdX19dY29sLGgsXOhc5jTlNv00AAQBTzVM2hTYIFAgxejEwd3dW1NQUMjI6kJBMvLxe6ekmXl4eS0tj9PREqalCo6Nk9/ccRUVc5OROwsI4iooSLCwyfX1Tzs5W1tYtcHBRyFEnYCcQKBCdkxN1AAADFElEQVRYhWNgIBIwMjETqxQnYGGl2Ag2dg5KjeDk4qbYGTy8FBvBxy9AsRmCQhQbISxCsRGiYuIUmyEhSbERUtIylBohKydPsTMUFCk2YhTQAeAs0JSUcehQUVVDE8FVoCkr4bJVXQNNAEeBpqmljcsIHV09VAEcBZq+AS4TGAyNjNFEsBZoJqZmOI1gMLdAE8BaoFlaWYMoG1sQsENhMTDYOziiKcdWoDk5gykXVxBwQ2EBgbsHmnIsBZqnlzeE9gEBXxQWEPj5o6nHUqAFBNpgugwBgoJD0EQwC7TQMHwmMDCER6AJYBRokQ5R+I2IjolFFcAo0OLi8ZvAkJCYhCaCXqAlpxAwgiE1jZCKUUAQpFNsQkYmpSZkZUdSaIJhDsHUQgjkqqpgl8jLLyDSiEJoYcFQVFxSWlaOkKhgZ6qsArOqa8CgFpcRdfUQuqGxqbmltQ1Jpr2js6u7B8hg6QWDPhwm9LvmQhgTJk5iYJg8ZSqK7DSJ3ukMDDNmgsEsHEbMdp0DYcydByLnL0CSY1y4aDHrEoIeWeq6DEwvn7ICRK1cBZfhW71m7br1DIQ9ssF1I4SxCeKKzXAZhS3C0NqMgEdit26DMLZDwmIHmMMB1LxzFw4tGGA3tLzcU7J38r79TWD2AemDh4jVDwSHj0AZR4+VzD9+Asw8eer0ARKMOLP1LAmqsYNz5y9QaoT1xUsUO+PyFYqNGPzg6jUULmabDgNgtAevXUXlY7TpMAB6e/B61xJUAYw2HTrAaA/euImmArNNhwbQ24O7bt1GV4LRpkMFGO3BO3cPoKvBbNOhAGh7EAHu3cdUhNGmQwHQ9iActD94iKkIo02HDGDtQThY+AhLcYnZpkMCGO3Bx0+wKcNo0yEB9PbgDP6n2JRhtOkQAKM9+Ow5VnWQNl0suOVta4jMwmwPvniJ3S5wm+4VuOXt+hqZRUR7EBm8Abe8ffqRWaNgEAGc3V/iAe7uL7EAT/eXWICn+0skwNv9JQ5gFHekA/TijnSAUdyRDgh0f4kBhLq/hAHB7i9hQLD7SxjgLO4A8LTJmE4LCgIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.292,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.459;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACQ1BMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MSLCwiIiIFBQUmXl4ucXEsEhJtLCwjIyP39/cSKys+mZksLBJtbSwCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjsbCwsLGhoMHR0bGwsbQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbvuD9ZAAABlUlEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS0hKwZjSMrKE1cvJw5kKikqE1SurwJmqaiS5TF1DkyT1SlraJKmnNdDRJU29nr4BMcoMjYyhLBNT4tSbQVnmFpZEqLcysoYxbWzxKbSzB1MOjnARJ2cdLOpcXIGEm7uHpxe6jLezD4jy9QMDfxA7IDAoOIQhNCw8IjIK06joGBAZGwwGcQwMfvEJibFJDAzJKalp2JyYngEiM7PAIJuBISc3Lx8kUlBYVFyCRX2pDap7ysorKqtAQtU1tZ517hjq6xtQ3cPgH9cY3BQIlmtuaUVX3tbegeoeEOjs6oZK96Cr73Xuw+arfmyCIDBh4iRcUljB5CkkKZ86zZsU5dMnziDJ+JmzSFI+OMDsOXPh7HnztQhrWLAQwV60eAlB9UuXLSfJQStWriJJPcPqNaSpX7tuPWkaNmwkTf2mzaSp37J1G2katu8gTf3OXbtJUr9n7z7SLNh/AL88ACvKW5JCGC6UAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.723;4.blob,1.1,1088.iVBORw0KGgoAAAANSUhEUgAAAIcAAABxCAMAAADI8kA8AAAAzFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgyejIeSx4TMBM4iTgKGQoSLRI7pCEkAAACHUlEQVRoge3YR1MCQRCGYVSUZFwxiwkDRhTFnP3//0m2Z1l2ptgpvrGp9tDPYeHS0Ld9qwsFQROSfz4wOSW9ASlOz0ivECuVK9IrkGptVnoFMjcvvYGxsCi9AVmKqtIrkOWoLr0CWYlWpVcga9G69ApkY3NLegVjuyG9gbFTlt7A2N3ck17B2D9oSq9AZg+PpFcwjk+kN8iB9xln0bX673+8z1iL7vTsnD7xPmMuuovL+In3GXfRXdXiVw3eZ+xF174uhPQZe9HdRK2QPmMvuk50G9BnYyi6u52APhtD0XUbAX02hqK7bwf02RiK7uExoM/4i6709BzSZ+xF9xK9hvQZe9FV3pohfcZedO8f8RPvM+ai+/zqxB94n/EW3fdb0XzB+4y16Oo/jD/GqAW/zfEJ2/C67PfZ6PAJS15dmj5D4BMZuXVp+gyBTwx46pL6DIJPpDx1SX0GwSdSnrqM+wyDT6R8ddnrMxA+kfDWZRd+o+MTCW9d9voMhE8kvHXZ6zMQPpHw1SX1GQSf6PPVJfUZBJ9IeeqS+gyCT6Q8dWn6DIFPpPLrMukzAD6RkVeXaZ+NDJ/IyqtLvM/+WHR6LxxK74UOvRc69F5o03uhQ++FNr0XWvReaNN7YZbeC/30XujQe6FD74U2vRc69F5o03uhRe+FNr0XZum98L/Re2FM74UOvRc69F7o0HuhTe+FFr0X2vReaNF7oYXq8he7oFQYbb+g1AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.723;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAAA8AAABxCAMAAAA9IAnJAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAr0lEQVQ4je3Sxw6CQBSF4cGO6KDYC1jBCvaCvbz/O7kz/CYmLl1wdt+dyYRcjhDvKBGBRGNxDhJJOqWmOdAydFYqsC5zvJA36EKRLml0uQJWa3W4IZuwabXgdgfs9vQg+5aNY2cgvmRIjsagPZniI10Tx57KPc/mfG2xBFfSg9fSgTdyC+8kf8reP/D948eODZc++WcOLlduMXK788LjKX5J2K+wXyLsVyBhv/6uXy8EFiCqzOTwCwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.741;4.blob,1.1,600.iVBORw0KGgoAAAANSUhEUgAAABEAAABfCAMAAAA54dzUAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAsElEQVQ4je3SRxKCQBRFUTAj2igmDGAEI5gD5rD/PTlxINfSBVi84alX3V39vyT9iByhRGNxUiJJSSlpkpqhZIUM0USOpbxOKRQpJZVSrgCMag1SFw2IaTUhrTag09WC0LNsVJw+H/OeAWE4AtjjSRAM10TFUziV6YznzheApfAgK+FA1mID2QoOcufvedfhYyK6Szn6J9L5wv+OXG8s3R+Urwl3NZBwV8NdfeWPdvUJOVgZKLRB534AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492364736;4.copy,1.1,2.10,3.171,4.1190,2.19,2.14,1.1,1.0,3.171;4.copy,1.1,3.430,3.304,3.770,2.19,2.14,1.1,3.400,3.304;4.copy,1.1,3.500,3.323,3.700,2.19,2.14,1.1,3.470,3.323;4.copy,1.1,3.980,3.342,3.220,2.19,2.14,1.1,3.950,3.342;4.copy,1.1,3.340,3.456,3.860,2.57,2.14,1.1,3.330,3.456;4.copy,1.1,3.320,3.475,2.20,2.38,2.14,1.1,3.310,3.475;4.copy,1.1,3.310,3.494,2.10,2.19,2.14,1.1,3.300,3.494;4.rect,1.1,4.1121,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.212,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.223,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.231,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.234,3.368,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.273,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.286,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.292,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.307,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.335,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.311,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.469,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.481,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.123,3.497,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.687,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.725,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1083,3.193;4.blob,1.1,1424.iVBORw0KGgoAAAANSUhEUgAAAHQAAAAjCAMAAAByz95aAAAB4FBMVEUAAAANICBn//8LGxseSkpl+fkiVFQIExMgT09c5OQJFxcOIiICBQUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgBAgIDCAgiIiI0NDQHBwddXV3///8fTExHsLBQUFDIyMjz8/MgICAGDw8VNDRKSkr+/v6mpqZLS0s1NTVzc3O0tLTNzc0GDg63t7e/v798fHwECwtf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysDBwdX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OACBgYBAwNRyMgnYGAQKCgKGBhUz88AAQFa398yfX0FDAxj9fVBoqJHr68bRERZ3d1CpKREqKgIFRUdSUlDp6dKtrZl+/sbQkIcRkZj9vY/nJxMvb0HERFk+PgdR0dIsrJDpaVd5uYoY2MdSEgsbGxc4+M4i4tOwcEjVlY2hoYCBARe6Ogramo8lJRc5eUqaWk6kJASLS1n/v4NHx8zf38yfHwMHh4jV1ckWlpb4uIweHhi8vJU0NA8lZUpZmYTLy9W1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t43iIhKt7ckWVkSLCwUMTEECQkgUFAtb29FqqpSzMwRKSkcRUUeS0sgS16cAAACBUlEQVRIiWNgwAIYmZixCRMFWFjZyNPIyMROtqUMHJxcZOnjZuIh31JyAS8flMEvICgkLEJfy0XFxCUkpaRpZ4GMLAigBqucPAODgqISWV7FZh4GUGYCARVUQVU1dSUlJQ1yLMVqHjrQ1AIBXhQxbR1dPX0D8izFZh5RwNAISKiSZyl+YGyMU8rEFEiYUcFSdDvMLSytcKm11rGxtRNTsqfUTgw7HBydzHEpdnZxdXP38NSj1FKYHV7gFC3rTal5JAEfcIpm8qWrpX7gFK1FQcE+CmgC/HEmdhoCtgBNis1ANE0Cg4IxWDAQEsoCZ4eFY+rFz8JiKSwFRzBFBqKz4CAqGs6MCY3F0IufhQEQTZO4+IREdBYcJCUjis+UVAy9+FkYAN40SUvPyMxCYyGAd3YOnJ3LxIWmlwALN8jLl+Hgs0JlIQVyQSGcacxURNg4JBCIhQUFAcUMJaVlyCyZ8tCKSiC/yh9IVNfUwpWW1pFgJcIUOAsuZ17fAGyzNiKzmppZWpLjGBtbwTmzrR6u1rGdBEsRpsBZ+JR3AKuDzi6mBEit0N0Dl+jtI8FShCmo5uEDgf3Q+td/wkSY2KTJJFiKagoSiygwBRao3qx5pFpKNphq4QVhTGOaTjdLZ7TOhDBmZcvQzVKGlNkQeg56yUwHMLMCd6OVVmBu9jy628mQOJ9iIwBnDGlZR4Kp3gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.161,3.212;4.blob,1.1,5076.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.650,3.215;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.316;4.blob,1.1,836.iVBORw0KGgoAAAANSUhEUgAAAR8AAAAXCAMAAAAFrbumAAABKVBMVEUAAAAvdHQiU1NuLCxZJCQGDg4IFBQ+mJgLGho1FhaOOTkEAQEECwtf7Oxh7+8GEBABBAQCBQUBAgIeS0syfHwFAgKROzswExMDBwdX19dY29sxeHg+mZkXOjo0gIAbQ0NeJiZmKSkKGBgNHx8FCwsFBQxjY/UeHkp3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl4SEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgkJFlfX+wCAgYhDQ3+Z2csEhIEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZwLS09mdzNAAABBElEQVRYhe3O105CQRAG4FFEQXpRQFCqFLFQFbDQEVABBVRUsLz/Q5BzgHgu9nJPZkj2u9j5s9nM/gBMG5usW80W+zU5Wq26+7d3dKxr/a5B3X85MZrMFl67rDaZXZnA4WS+3dt38fpWVW7PgZHXLq9PdqhMcORnPw4EeX27NkJhWUSZBEEQBIG642gMuwJd8QTASRK7BV2JOMDp2Tl2DaouUmmATDaH3YOq/KV0XhWwexBVLAWkcX1zi1yEqLtyRZ7VGm4PquqNxWy2cHsQdd/uLEL34RG3CU1Pvf4yDZ5RixD1Mlyl0fgVswhNb++TVfz4/MJsQtN09p+/f9BqkPX7J51z/PMXhuy6iOIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.345;4.blob,1.1,2456.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.345;4.blob,1.1,2612.iVBORw0KGgoAAAANSUhEUgAAAEQAAABZCAIAAAAIORWgAAAABmJLR0QA/wD/AP+gvaeTAAAHXElEQVR4nO2be0xTVxzHT2/bC3j7slbkZaX0gSW2yiMSCZO5yGpYMsEN0kopc4U2/mMWksWwxCUm7j//08XENHHBRwKOwLJkuCBhGrd/zIwRM6G8GgWE0XZG217s4979UQLlFuTe2+MuS/rJ/QPO4/egt+ee3/0eAOAIoUhkDwaVdXUQbfIh2mIEEQ5vLylRlJZO/fgjVzHApODjj+2hECqRcB0IDHh8fsvc3F67HZZBBJYhFpCx2PjNmzqbjcMYYCI3GJwEId6zB4o1zhaAOPjff6saGhCh8OX9+9xGAgdjR4d5bIzrKCCxLSfHEY1mV1amborj2wwAEAkEdh06JFIqn//yC9exwEBjsbR6vQiKch0IDARZWV++fl1YX5+iHe5vMwAAEY1K1Orsioqp27e5jiVNmjRptgAQy9cDZw80PW1K3Q4AQCgS2oN2ZZ2S0SwkEghM9/VBKSp0LTr3dXfqdgAAkUBkum9aZ9MxngmlfFWUKRwxB5aPpWJkbVQF9pAdlTDY4yAAgNmhofCrV0WNjan41tl0c8NzwdlgKkYSmR2aDb8KFzUW0Z+CABjlKyJANBaNuwvOPRaHjJHjN8fZ3Gkplq/KT5T2gF2ACRIbeQiPn8lPvBAhs1cOcoPcSTjFe8Q0xy+794+M+J480ba0PLpwgZG/ODqbbrpvOhqMJjYq65THfj6W2OL5yfNr/a/0zfpH/L4nPm2L9tGFR8wCYl2+olK0DW8rqC1Ibt9ZsTPxkqgZrzHGDqN5zMw4Jtbl6962vdYZKw/hMXZJK6ptjqgjuzKbzuDVmzg0Pz8zOMhiGdDZdBO3JkiCZDoxDiqRvOOpEJoPzQzOsFkGWJSvYpXYSTjl++SMnQEAABBgWKvXe+qff1CZbOOoNK3eVgTdfPFYM8LT389HUUZbG61V633s9T/105+SCBmNLi0u4l4vEYlsNMbT7+GjfKZbGwAAqHG5ant66I9v+qvJ8JWBsRuG1Lhqantq37eXNGnScIRUI+U6BEjs/3p//e+pvs7cEuQfzf/C/4VYRXdrvHXh8XlmtxnWk4pLTRMAUHi8EMvHRl2jUKwhFefPl3Z2ZshZbq5SRGPRzAzORALr7GUqKyvv3buH4/jCwsKlS5dEItFK1/mKis7SUnlGBmUK8tbvLzt3zvriRfXly1KNhtotFPIzMykXD4H2eebV5C38sZDcXlxcPDw8jON4Q0NDZ2dnc3Nzd3f3Sq//7dtzZWUvrNbL1dUa6dplEJVKS06fPvHwoSMWM/X35x4+vNL10Y0bTpKkXEWffw4lk8wdmU7SqTqhSu7q6elxu90CwXIhbDKZSJI8cuTIygApip4uKXl44kTM4eg3mQ7n5lJN7DAa6wYGnCS5+9hyuStWqXZWVFCujO3boSQjK5Y5SWf+R/nJXYFA4MLaAn5xcfHixYvJI407dgzU1ZFO57Hdu5dTF4pEarNZ39amKC+f7O72j4zE24MzM6GXLynziXAYQioA8DP4AAAiSlDas7KyMAybn59PbJybm1MoFIktIqHQrFa36fXlCkX35OSI3y+QGwyGM2fUZjNJEKMu12BTU+D585UJH167pm1upjgbbGyEcnpnyb8EAKC80wEA4DgeCoVycnISG/Py8u7evRv/2SCXnzEYzGo1QZKu0dGmwcHngQAAANS4XCc9HmNHx7q163u9zRAUaQ+369v1yV29vb3J35mjR4/Gf3XV1HhOnuwwGiWUolhWXIwIqH+b/4z6P+qrv69Obtfr9TiODwwMmEym1tZWn893586dld5imUwAb0WFRvm35ebx9d8kVVVVPXjwAMfxxcXFK1euSLb+SS4sD2sPt++q2gXFGsfSeeRNJEOWobVq4b6n5gwBJvjsz88OfneQ60AgkanILP2mlOso0qRhxYGzZ5uePqU5mJ0mzAKaOjb1OapraXFfv07TB3tNmCFsdGxFWZkjFsPy19mTbwQLTZgp9HXsNZ+MzmabGx4Ozs7S98RCE2YKfR17NRlEINBYLO6uLkae2GvC9GCkY68mU2AyCTFsqreXqT93lzv3g1z6mjAjCkwFQkw41TtFZ/BqMjqbbbqvLxpkfCphRRNmOpEO6+rYm4BKpW04XlDLUtBhqQlvxkY69kYsfzJFjY1LPt/s0BA7rxO3JiRqCU1NmD5FjUVLvqXZIboL0nIyOptt4tYtkqC+W6AJe034nbDRscUqlZMg5Pv2peKYviZMOyrGOjYCANBard7Hj/20dzHrkqwJIyhCOTvDz+Tz+Dw6vYCVji0AAGgslmdXr6aSCQAgikcneya1J7Wefk+85fj948nfot9O/Tb2w9imvQAAjUXz7OozRjG8lzMicWR7ZUKRkNL4ZvrNkm9p0940adKk+Z8C5YD3Vnn9DOWA95ZIRlGmkOll4zfGU7SzJZKBdcCb+2QgHvDmPhlGhfG74T4ZNoXxBnCcDCpFCz8thCXOcJwM08L43XCcTIoHvClwmYxYJc6tzoUoAHKZTIoHvJPhMhno/z/0L5TO4LUfSWQdAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.272,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.457;4.blob,1.1,3156.iVBORw0KGgoAAAANSUhEUgAAAOQAAAA1CAIAAADeV9BQAAAABmJLR0QA/wD/AP+gvaeTAAAI8klEQVR4nO3dTWwa2R0A8DcfTBzGfBoDNuDYxMbgEsWUsLYV6vjiNcphpVU3u4rShEirbU7OqWkr9ZB7VPWSlTZuL23qXHbddpWDb3acVGlMsrBYjTYfyBBZgV3DkOABHGBgpgdHjY1tmOHL2Hk/+eDMvJn3j/hrPG/e+w8YgKBKEYQUAMBxhcZ0hzamG+hAkkp7jx+/guOHG9OdsGQd/N3gp48/rVMoUHPq7u7mOE6n023fRVG+dDrc33+xMZEIS1bTedPzvz+vUyhQM8tkMjtuDwZnFIoBpdLagBgEJKvq5yq5RR6YDtQvGqgJoSgKAKBpese9DJOMRh/p9eONiIR/U9MFU+ROJB1O1y8aaG8prVbr5GTRRgRBMpkMwzC7HUVRXrncvDHYqger0jppnQQA4DwPQHG092zv4pXFOgUE7SEERdsdDsPEBKnTJUOhor3Ly8uHD5caQq2tLQMAZDJTLPYdzx4xBEOR4gtlns1zgPv/P1EEdbQ7JgwTOlIXSoYA/2TVT+hFpCj4jyDP9tC+gIpEWqdTPz5OyGSU1xuYnqaDgj/iQiGTy9FisZb/Ie5+95B6qGjj1A9TPsoHABChIqfWOa4flxEyL+WdDkwH6SDgn6ymC6bQv0L5dJ5/QFDz63e7VXb7yuxsZH6eSVd+g5fPr4tEEv7tb7+4PReeK9oYexPb+MXd77ar7LMrs/OR+TTzLiqMz6kJGXHqL6c8v/fQwZ3vsqF9imNZSXe3wmLBSTKbSDC7jKLK6ug4xTB0PL7Es322kE0xqSST3PyTK+Q29rIc2y3ptigsJE4msgmaeRsVryur8YwxE8+E58IV/DegZhb3++NLSyqbzeBydY6N0cFgZGEh6vEIPQ+GEQyT4t++9G2AP+5fii/ZVDaXwTXWORakgwuRBU/Ug/A59Uf3PoouRhd/C0dXB5ncbDa4XFKj8f7ly4IORBDU6by+vDwTidzheYiqRUWKyKKNsTex9fx60Uaz3OwyuIxS4+X7PKKS9EgusZeUVuVuDUZG/njpEodhLTwDhZoZudNMVZlDyM7R0anWVkM94tmgI3WAz21A36/6KD/16vGr3RogCA4Ax3Fw7HUQpMOCb/bkcksut5ZKvdy8EcERBCn+u80VOI7lgHDhdBjwSdbes71P/vykRAOS1CcSz1kWJut7SqMZikTuArAlCwd/MyjpKX4+8Oxvz1b/s1pxR+WT9euBr0vsJQiZwTDx8OEfKo4A2tfa2gYJQhbe9hzq2V+fYYeKnzVlqJ0XGDQIiuJG4ycA8BqoQQeMWNwxPHxNobDsdSAQVI5cblYqj+11FBDUfHjNYJVASKUAAK7QoMIG6H1WbVmLtLf3+JUreMlVORBUE7yStVRhg8+XDof7L16scVxQE8AOYc7rzhLzQfwZJgwnrp6o8iQCrqy7FjbMzCgGBpTWRhQ2QI1UyBao7ynNiKb6U2mGNauLlT9h3cArWcsUNiST0UeP9OONKGyAGmx1cbXteBvWUtXYprWrVdwhjnqiVQZTnKxWpXJy2zWyfGGD1ys3mzcGW5WxWpWTk/Da3HQSTxP59Xy7vb2ak2iGNYlniWwiW2Uwb2ewUARxtLdPGAw6kgwlk0WNyhc2LC8DAGQmU+y7d4UNGIagaPFkQT7Pcpum5VAUcTjaJyYMOh0ZChX3C+05juWinqhmRPPT/Z8qOwOCIuoP1MGZGtSY4CIUdWq143q9jCC8FDUdCASFr8AtZDI5mhZrtxQ2uN39Q0PqopZTUz/4fBQAQCRCnU7t+LheJiO8Xmp6OhCEK7ub0uriqn5c39LWkolXMlmq+JkCJVDqe6r6SHB3f79dpZpdWZmPRNK7/6EvK7++LpJsWbhw+/aLuW3rtWOxNxu/uN39drtqdnZlfj6STlfeL1Rv6XA6HU6rh9QrsysVHK4Z1sT98UK2Bk/iMZbjuiUSi0JB4ngim6UrzdeOU6cYmo4vvStsyGYLqdTWwoUkk8u9DZplue5uicWiIEk8kcjSNMzX5oURmPakNnInIvRA/DBuOm8K/TNUkyUsuD8eX4rHbSqVy2AY6+wM0vRCJOKJCh64YQTBpLYUNpS+DfD740tLcZtN5XIZxsY6g0F6YSHiqXrACNVD9GG055c9kh5JUuC4QmVXMWnm9dPXNQkDBwBwAPgoykdRZrncZTCc6+sTmqwIih6Sy7Ovt8RU+jYAAMBxwOejfD7KbJa7XIZz5/pgsjanHJ17/eS1ZlgjNFk1w5rYwxioZL01PzqyuDimLLKzc3RqqtVQVWGDTie4X6hh1A71yJ9GEFzAWtAWVcvojVGys2Yf6w6TAmHh9eNyiyW3tpZ6+bJ8092F4YuJmhjlp1AM3Tz1iuAIKkKLfpBNDyvVQ+rUy1Q6UrOPle9LLkrTDA1F7t4FXP0u99AeYxk25o2pP1DH/fGNLWULV9QO9Y///rGGMdRghX/b4GDf2bOPrl4t7LJ4ADqQxFrxjoUrTNM+iBR3dAxfu6awwMIGqOnJzWblMVjYAEEQBEEQBO2dQ9ih687r1pJfb9DVdfqLL7JG4ycNiwpqBq2tonT689OnuxrWY5kV4AWu0CHu6Grt2ngX4Y7W1gKvXv335MnrgcCtfB4+2H9f5HLswIDCZlPN1GKtam0MKAa+dH7ZAl8SCG3z4Yf69fXPpVKiMd2Vr8F6mni6nl+3t9sbEA20v8zNhROJ3JkzxsZ0Vz5ZWY71RD0jmpEGRAPtL4UCd+tW4MIF014HsomO1N0YvdHW0rbXgUBN59gxJcteOnJEwLdfVIxXiW2SSdpUNhRBA2vw6wWhLaLRNx9/3CMSoffu1XLNyo74vuTiweqDYc1wXUOB9qmbN5+fP99MdwJSQvrVL77qkfTsdSBQ09Fqxfn8r7eXMNUc3zdtZAvZo9Kjyhbl41eP6xoQtO+kUszIiKarq3W2ovJX/gS86+pB9IGj3YEjtVmvDR0kN28+/+yzowRR7UspSxNwdj/lx1Cs9NQr9H769tsXBIHVe+pVwAu3WI5VH1YfkRzxUt76BQTtR/k8e/So9MQJ9Tff1HHq9X/hVV1xqhruRQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.649;4.blob,1.1,2740.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.766;4.blob,1.1,328.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAb1BMVEWBgTR5eTESEgcAAABvby329mP19WOUlDwkJA8PDwZpaSrLy1L9/WawsEc+PhkuLhO3t0r//2dISB0MDAVkZCjIyFH7+2WoqEQbGwstLRKbmz/z82Lx8WGNjTkeHgycnD/g4Fpyci4ODgYnJxAEBALKBJZnAAAAQElEQVQImWNgYGRiBgEGFlY2dg4Qg5mTi5uHlw/IAAJ+AUEhIENYRFRMXIJBUkpaRlYOqEZeQVEJrEtZBaybGQBSnQLs5Twb0QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492364843;4.copy,1.1,2.10,3.171,4.1190,2.19,2.14,1.1,1.0,3.171;4.copy,1.1,3.400,3.304,3.800,2.19,2.14,1.1,3.380,3.304;4.copy,1.1,3.480,3.323,3.720,2.19,2.14,1.1,3.460,3.323;4.copy,1.1,3.980,3.342,3.220,2.19,2.14,1.1,3.960,3.342;4.copy,1.1,3.980,3.361,3.220,2.19,2.14,1.1,3.970,3.361;4.copy,1.1,3.990,3.380,3.210,3.133,2.14,1.1,3.980,3.380;4.copy,1.1,3.980,3.399,2.10,3.114,2.14,1.1,3.970,3.399;4.copy,1.1,3.970,3.418,2.10,2.95,2.14,1.1,3.960,3.418;4.copy,1.1,2.10,3.437,3.960,2.19,2.14,1.1,1.0,3.437;4.copy,1.1,3.120,3.456,3.850,2.19,2.14,1.1,3.110,3.456;4.copy,1.1,3.140,3.475,3.830,2.38,2.14,1.1,3.130,3.475;4.copy,1.1,3.120,3.494,2.20,2.19,2.14,1.1,3.110,3.494;4.rect,1.1,4.1111,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.215,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.234,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.269,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.221,3.269,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.307,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.650,3.193;4.blob,1.1,1148.iVBORw0KGgoAAAANSUhEUgAAAiUAAAAOCAMAAADHR5wFAAABmFBMVEUAAAANICBn//8LGxseSkpl+fkiVFQwd3dW1NQIExMgT09c5OQJFxcOIiICBQUUMjJm/f0WNzdOwcFk9/de6ek7k5MFDAwOIyNbW1vMzMz09PTl5eWZmZkTExM6kJBMvLwQJydj9vZKuLgdSEgoYmJg7u5JtbVVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgCBAQmXl5FqqpY2todR0caQUEBAgIDCAgiIiI0NDQHBwddXV3///8eS0tj9PQECws1hIRf6+s5jIwfTExHsLBQUFDIyMjz8/MgICBEqalCo6MECQksbGxU0dFBoKAGDw8VNDRKSkr+/v6mpqZLS0s1NTVzc3McRUVj9fU5jY20tLTNzc0oZGRGra0bREQGDg63t7e/v798fHxOwsI4iooRKSlKt7cmX19g7e1f7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysNISFn/v4SLCwXOjpPxMQ9l5cDBwdX19dY29sBAQF9fX3i4uL29va2trZaWlrg4OACBgYBAwMyfX1Tzs5RyMgnYGBW1tYtcHAQKCiDTSmtAAABfklEQVRYhWNgGAVDFTAyMZOtl4WVjVil7Bxk2zIKBh4wMnGSr5mLm4dIlRzs5NsyCgYc8DLx0cEWfgFwiSUoJCwiKkYH+0YBdYG4MJQhISklLSNLI1vk5EGkgqKSsoqqGo3sGAW0B+oamlraOrq0MVxPRB9EGRjqMTAYMRnTxpJRQF1gYgoCqDWNmTkDg4WlFVmFCTbzUIC1jS2IsrEDkfYO5NgxCugNHJlAwAlV0NnF1crKyo1q5iEDdw8Q6cnkBaK8fcixYxTQG/j6gYA4iph/QGBQcAh5qQSbeSjywqFgOgxSloSTY8coGAwgIhJIOJOXSgiBKG4TMB0NaZfE0MKOUUA1EBuLUyouHkgkUCGVYLEjMQlCJwunGKWmKVFsxSigJbBNz8jEJZcVkJ2Tq2GVRwM78gsKoayiYmH7EtwpdRQMBlBaVm6LS66isqq6prYuiFp21IP7PaYNQGZjE6WGjoJhCprB/R6mFiCztW2gHTMKBiloB/d7/JAmiQCWlTipDByrTwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1073,3.210;4.blob,1.1,972.iVBORw0KGgoAAAANSUhEUgAAAH8AAAASCAMAAABFCfGlAAABO1BMVEUAAAAKGBgECwsiVFRUz88GDw8NICBn//8LGxsAAQFa398yfX0FDAxj9fUeSkpBoqJHr68IExMbRERZ3d1CpKREqKgIFRUdSUkOIiICBQVDp6dKtrZl+/sbQkIcRkZj9vYGDg4/nJxMvb0OIyNk9/cHERFk+PgdR0dIsrJDpaUBAwNd5uYoY2MdSEgJFxcsbGxc4+MBAgIgT08GEBA4i4tOwcEjVlY2hoYCBARe6Ogramo8lJRc5eUqaWk6kJASLS1n/v4NHx8zf38yfHwMHh4jV1ckWlpb4uIweHhi8vJU0NBX19c8lZUpZmYnYGATLy9W1tYucnJY2dlV09M/nZ0QJydm/PwWNzda3t43iIhKt7dl+fkkWVlf7OwCBgYSLCwUMTEECQkgUFAtb29FqqpSzMwRKSkcRUUeS0vTxm9oAAABV0lEQVRIicWVaVOCUBRAH2a8qLB9M00s26QytM2y1axssX3fbf3/vyDzwQV58OI5zHQ+4AG5587AOCLEixDgHvGVhmCjnzkRN+kmNbdQZtAqh8Db2ulZttGYPRF36NaJuyS7Ad09oL1yHzXLNgeg148HdAsPRqJ2A4ZiCnh8mJplmwPQG0noV0bHxicmbWaSVKfAp/GMbfYPc8DaI6RmtXQiU2uWtzA3D6rgBUaZRnIwa48QXERL2WWraStybrVyviZUDusbm3Brdotju1lx7f0SyG8jlC5YbWc3tBcLi4Vi9Re/n4d7Dw459psV154LRyWEjk9wpFQ9Oz2DL84vOPabFdceC+kyQ0S4ujau3dxy7K+tOPa8cWc89eR9inc/s+eRh8cnIs/4xY/90PPIa7FM5E3V/NgPPa/E38nnh/3foU6MHiflnOLP/vr4VL/+cz2KfvtZ+wHmEjO3T5Z66gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.151,3.234;4.blob,1.1,4980.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.297;4.blob,1.1,152.iVBORw0KGgoAAAANSUhEUgAAAAQAAAADBAMAAABG2rP1AAAAG1BMVEUAAAAGDg4ECwtf7Oxh7+8GEBADBwdX19dY29tPTM8iAAAAEUlEQVQImWNgFGBQdmVIbwIAA5QBYwkrWiAAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.326;4.blob,1.1,2668.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.345;4.blob,1.1,2632.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.421;4.blob,1.1,1676.iVBORw0KGgoAAAANSUhEUgAAABAAAAGfCAMAAABhvKLqAAACeVBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQMHgw+mD4HEAcjViMucS4BAgE5jDkXOBcSLRI7kjsDBwMpZSkoYigECQQ8lDwRKREYPBg3iTcAAQAvdC8iUyIIFAgLGgseSx4yfDI0gDQbQxsGBg4DAwcUFDIyMnwEBAkgICD///8bGxsnJ2ErK2kTExMFBQ08PJMSEiwiIiIFBQUmJl4uLnEjIyP39/cSEis+PpkDAwgVFTQ4OIsfH0w0NIEkJFkzM382NoUhIVIBAQI9PZUaGkELCxoMDB0bG0M4OIoAAAEyMnoeHksTEzA4OIkKChkRESkQECgSEi08kzwSLBIRKhEDCAM4ijgYOxgLGwsIEwgzfTMeSh4cRBw1gjUGDgY9lz0NIQ0sbiwkWSQWNRY5jjkBBAECBQI7kTsTMBMmXiYpZikxeDE+mT4KGAoNHw0MDAX19WNKSh6kpEKoqERGRhz29mMODgYDAwHm5l1jYyiLizjBwU4tLRL+/mcfHw3Q0FR8fDJyci7Z2VgYGAr8/GY3Nxa3t0qVlTxZWSTs7F8GBgIJCQTy8mJQUCCcnD+qqkUUMhQnYScraSsFDQUSKxIVNBU4izgfTB80gTQzfzM2hTYhUiE9lT0aQRoMHQwyejI4iTgKGQoQKBAJFgkcRhwwdjA6jzo1gzUUMRQqZyoraisFCwUJFwkLHAsPJQ8HEQc9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6M8IwHAAACKklEQVRYhe3Y108UYRQF8I8iFhTsigVcdRGpKlWwgIiKWBaxV+wCsmJbCyzsylBU7IBd7GLFXrCAHSvqXyRMFvEcY2JM1vhwz8NMzi93Z5LZ7+kqBXFxxa5cXbC7ubdB8GiLvV37DgieHTsheHlj79ylK0K37j0QevbC3tvdB6FPX+yqX3/1b+PrR+Dni32AYSDCoMHYjf5DEAKGBiIEBWMPCQ1DGDZ8BEJ4BPZIQxRCdAx2NTJWOTNxowhGjxmr3+MTxjkkcbwDkhwwYeKk5ltywuSWH6VMab5OnfbjKdNNcfjYVNMMelHaTIJZswnmpBDMnYd9/oKFCItMixGWpC9FWLYc+4qVqdBXpa/GgTUZ6i+TmUUQHESwNjQbwWheRyMR4QQ5hvUkGzYSbNpMYNmylWTbdoLcPCtCfoGt6WrN16OLfUfTpVDT0zpXVKxHOTclpTtJdu0mKNuzF2Hf/gM0cvAQQXlFJcnhIwRHjxEcP3GS5FQVwekzZxHOnb9AIxcvKYlEIpFIJBKJRCKRSCTOiIX2d6o6JoTk8hWCq7+scey0J1TXNAtCtnadRm7UENzkBcwtO8HtO9iNd+8hRGn3EWLNtG18EI3d9hD3TY/MtK+sDVC/zWPqT55iD3sWCd1YR5vL+kz6/M9f0CP9aUX7UqtHeKXVIrzW3iC81ejvsja8o7e8509fU0fwoeEjyafP9GkDG7/QyNdv6s8ip1BOoZzCn/I/n8Lvmqy9iM6fSogAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.71,3.459;4.blob,1.1,1192.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAAB5lBMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEgICD///8bGxsTExMiIiIFBQUsEhJtLCwjIyP39/csLBJtbSwCAQE3FhZ+MzOZPj54MTEDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg5iYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQUUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwswMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDB6ejF3dzAoEBBwLS2SOzsGDg4oKBBwcC2SkjsbCwsECwtf7Oxh7+8GEBAbGwsDBwdX19dY29sHAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWZTdDDwAAABUUlEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS0hKwZjSMrKE1cvJw5kKikqE1SurwJmqaiS5TF1DkyT1SlraJKkfokBHV49E9fokqTfQNSROoZExmDIxJaDOzBxIWFhaWdvgUGBrBwb2ILaDo5OzC4Orm7uHpxcuA72dwcCHgcHO18/fO4CBITAoOAS3A0LDwCCcgSEiMioaJBITGxefgFM9wj2JSckpqSChtPQM60xLgu5hsPfJcs52BIvm5OahK8zPR3MPCBQUFkGli9GUl5SWlWOzrwKHOyqrqktwemoU0ATU1NbB2fUNWoQ1NDYh2M0trQTVt7V3kOSgzq5uktQz9PSSpr6vfwJpGiZOIk395CmkqZ86bTppGmbMJE39rNlzSFI/d9580ixYsBC/PACuSUH1QgZgbgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.755;4.blob,1.1,508.iVBORw0KGgoAAAANSUhEUgAAABIAAAAfCAMAAADdjm27AAAAulBMVEUEBAEFBQICAgEAAAB4eDGZmT46OhcYGAofHw0LCwUgICD///8bGxsTExMiIiIFBQUjIyP39/eBgTR5eTESEgdvby329mP19WOUlDwkJA8PDwZpaSrLy1L9/WawsEc+PhkuLhO3t0r//2dISB0MDAVkZCjIyFH7+2WoqEQbGwstLRKbmz/z82Lx8WGNjTkeHgycnD/g4Fpyci4ODgYnJxAEBAITCAiZPj4QBwcLBQUUCAgDAQEVCQmUPDyJJ+z7AAAAfUlEQVQokWNgYAQDJmY4YGBhBQM2JCF2DjDgRBJixgBUFuLi5sEU4kUX4uPmRxcSEIQwhYRF0I0XFROXkESzUUpaRlZOHt0RCopKyihCKqpq6hqaSEJa2jq6evooZhkYGhmj2Whiis+Pg0LIzNwCU8gSXcjK3BpdyMYW1SwAHFEN/xx9t0QAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.842,3.761;4.blob,1.1,592.iVBORw0KGgoAAAANSUhEUgAAAA8AAABLCAMAAACYwS0CAAAAzFBMVEUAAAAGDgYDBwMUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIJFgkcRhwwdjA6jzoIFAg1gzUUMRQqZyorais5jDkdRx0FCwUJFwkLHAsPJQ8HEQcBBAE9lj0ZPRkwdzAGEAYOIw4iVSIucy4yezIgUCAFDAUeSR6G+6pxAAAAqUlEQVQ4je3Sxw6CQBCA4QUrootiL2AFK9gL9vL+7+TN+JuYmHhlbt/MZLKZHSFeoagCEYnGmIgn6KSWYkJP0xmpwIbMsiFn0vkCXdTpUhmsVGtwXTZgy27CrTbY6Rrv7NkOym5ffIkBORyBzniCR3oWyr7GPU9nnDZfgEvpwyvpwmu5gbeSn7IL9px/+Nix6dHH4MTE+cItqtcbG+4P8UuE9xXel/j3vp4mDhXHgBNYGQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492364944;4.copy,1.1,3.670,3.171,3.530,2.19,2.14,1.1,3.660,3.171;4.copy,1.1,2.20,3.304,4.1180,2.19,2.14,1.1,1.0,3.304;4.copy,1.1,3.970,3.323,3.230,2.19,2.14,1.1,3.950,3.323;4.copy,1.1,4.1000,3.342,3.200,2.19,2.14,1.1,3.980,3.342;4.copy,1.1,3.310,3.456,3.890,2.57,2.14,1.1,3.300,3.456;4.copy,1.1,3.290,3.475,2.20,2.38,2.14,1.1,3.280,3.475;4.copy,1.1,3.280,3.494,2.10,2.19,2.14,1.1,3.270,3.494;4.rect,1.1,3.650,3.196,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.196,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.223,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.234,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.269,2.17,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.286,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.297,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.491,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.345,2.15,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.481,2.17,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.489,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.497,2.16,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.723,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.742,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.761,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.3,3.782,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.780,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.799,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.818,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.650,3.177;4.blob,1.1,352.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAeFBMVEUAAAAWNzdOwcFk9/de6ek7k5MFDAwQJydj9vZKuLgdSEgoYmJg7u5JtbVFqqpY2toCBAQdR0dn//8aQUFj9PQ1hIRf6+s5jIwECQksbGxU0dFBoKBj9fU5jY1Gra0bREQRKSlKt7cmX19g7e0XOjpPxMQ9l5cGDg4kAio/AAAASklEQVQImSWKRRKAMADEAsWKa3G3//+QdrhlswEsWziuB/iBDKM40ZRmORRlBXWjJ6qlK3tDwwjT72ZY/m6FTezFcUpzXLdQz8sHgf0DwhfBvy4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1063,3.191;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAIcAAAAlCAMAAABf7QrdAAACEFBMVEUAAAAKGBgECwsiVFRUz88GDw8NICBn//8LGxseSkpl+fkwd3dW1NRBoqJHr68IExMgT09c5OQJFxcIFRVj9fUdSUkOIiICBQUUMjJm/f0/nJxMvb0OIyNk9/dbW1vMzMz09PTl5eWZmZkTExM6kJBMvLwdSEhVVVX9/f2AgIBDQ0NcXFzY2Ni4uLgCBARe6ekmXl4GDg4jVlYBAgIDCAgiIiI0NDQHBwddXV3///8eS0tj9PRe6Ogzf38fTExHsLBQUFDIyMjz8/MgICBEqalCo6NX19c8lZUVNDRKSkr+/v6mpqZLS0s1NTVzc3McRUVV09M/nZ20tLTNzc0oZGRa3t43iIi3t7e/v798fHxOwsI4iooBAwMsbGxf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysNISFn/v4SLCwUMTEDBwdY29sBAQF9fX3i4uL29va2trZaWlrg4OACBgYyfX1Tzs4tb29d5uZRyMgnYGBW1tYtcHBSzMwQKCggUFBc5eURKSkbQkIAAQFa398FDAwbRERZ3d1CpKREqKhDp6dKtrZl+/scRkZj9vYHERFk+PgdR0dIsrJDpaUoY2Nc4+M4i4tOwcE2hoYramo8lJQqaWkSLS0NHx8yfHwMHh4jV1ckWlpb4uIweHhi8vJU0NApZmYTLy8ucnJY2dkQJydm/PwWNzdKt7ckWVkECQlFqqrn3NjeAAAClUlEQVRYhWNgGGjAyDTQLoAAZhZWXFJs7BxkG8vJxUysUm4eMMXLh9sd/GS7g0FAUIhIlTzcYEpYRBSHAjF2cfLdQTSQkISGupQ0DhUyslCGnLyCopIyjdyhogplqLETCEF1DU0tbR1d2jhDT98AyjJkN0IIG5uAAGp8mJoxMJhbWJIVINjMQwFW1vAMa2OLELZjBwF7VLUOjk6WlpbO5LgDq3nIwMUVznRzRwizeoCADIpSTy9vH18/8tyBzTwUeVl/ODsgEL9ZQcFAwoE8dxACIYLGcHZoGJAwNMSpNjwCSERSwR1Y7IiKhjNjuGIZGJji4hNwaU/0SkpO0bBMpdQZWOxIS8+AszPYMxkYstyycVY0Obl5+QWFRT6UugNmRzE4D5nEAJklpQjpsnJjHBppBCrAeYi9EsisqkYI15TQ1xkMteA85IFWedXV406hdAQN5f6EFdEBNFoNtAsoA9Rux5FrHp52HCXmIdqATc0lGCwYaBHhhLMR7TiEXvwsTIBpHqIN2Mre1oTOgoP2DjgT0Y5D6MXPwgIwzEO0ATu7uhvRWXDQ04vI5PB2HEIvfhYWgGEevA3Y1z9h4iQ0FgLElE+Gs+HtOLheAiwsAKt5YBA7xVhANgGVhRQ7U6fBmSjtOCJAExYWbvNYpjPo2cxAZhnPFKmfBeSrMAKJ2elz4EqR23EEAcIUosxjmjsP2PeYj8xasJBzUW8n2/zF4By+ZC5cLXI7jiBAmEKueUuBFeOyKvbuSjBv+Qq4BKF2HA5TKDKvaWUChMG4ajVMDNyOIwnATaGCeWtgoQdux1EOyDVvbVwxhAFux1EOyDVv3eI6CINK7TiyzZNaD6Gp1Y6j0Dxqt+PINI/a7ThyzaN2Ow5iHgAr26mlIZnsAQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.223;4.blob,1.1,3648.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.393,3.278;4.blob,1.1,2816.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.335;4.blob,1.1,2680.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.242,3.421;4.blob,1.1,676.iVBORw0KGgoAAAANSUhEUgAAABoAAAAgCAMAAAA7dZg3AAAA/FBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0sbiwkWSQIFAgLGgsWNRY5jjkBBAEeSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZilbC6HNAAAAuElEQVQokc3O1w6CUAwG4KK4996Agihuwb333r7/uyiuhNF7e9H+J99JWgBFEQbAykBgYiRNGJktmFhtdowcThdGbg8mXp8fo0AwhFE4gkmUjGEUT2ACyRRK/1wUrXgy6cwv05TyK8t9U5bPKSkvFD6pWFItKFeqn1Crq5eL0ns2moyaWnz7NTlWe3OnK/ee0NfSYCj30Xiipels/uySqBWAxRJgxa/1aLPdwf6gJ3A8neFy1SW43R88fQ9RAYbUogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.457;4.blob,1.1,3216.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.342,3.723;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUGDgYDBwMAAAAUMhQyfDIECQQnYScraSsFDQU8kzwSLBImXiYucS4SKxI+mT4DCAMVNBU4izgfTB80gTQkWSQzfzM2hTYhUiEBAgE9lT0aQRoLGgsMHQwbQxs4ijgAAQAyejIeSx4TMBM4iTgKGQoRKREQKBASLRIC+uieAAAAUElEQVQImRXMRwKAMAwDQWM6gYTeCaH//4fIlzmtROQxM/lBCDmKxSTNIKtcLDRBo0vIVS02rdgpsR/gOM1w0Svc7A7dge15GabbPvh8P7Q/jP4DuQRHJToAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.723;4.blob,1.1,360.iVBORw0KGgoAAAANSUhEUgAAAAUAAAASCAMAAACkYuT0AAAAeFBMVEUAAAAJFgkcRhwwdjARKRE6jzoIFAgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4JFwkQKBALHAsPJQ8HEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCAFDAUeSR6Pqj51AAAAUElEQVQImRXKRxaAMAgEUOwxRqPYY+/3v6EDiz/wBiKMJ/gBCKOYKFEpVp0ZmBfS2RJUrGHNDWy5gz0PcHST/MyLuCpxc7vEcV7Q3I8c7/cDgvQDe1gTQrEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.932,3.741;4.blob,1.1,1472.iVBORw0KGgoAAAANSUhEUgAAAF8AAABfCAMAAAC5kuvHAAABHVBMVEUAAAABAQECAgIJFgk0NDQ+Pj4REREcRhwwdjAKCgoRKRE6jzoIFAgGBgYxMTEYGBgBAgE1gzUbQxsUMRQ8kzwDBwMqZyorais5jDkdRx0FCwU+mT4oKCgUFBQJFwkQKBASEhIrKysICAgNDQ0EBAQLHAsPJQ8JCQkHEQcSLBIBBAE9lj0ZPRkwdzAkWSQfTB8GEAYOIw4iVSIucy4AAQAyezIgUCADAwMFDAUeSR4GDgYUMhQyfDIECQQnYScraSsFDQUmXiYucS4SKxIDCAMVNBU4izg0gTQzfzM2hTYhUiE9lT0aQRoLGgsMHQw4ijgEBAEFBQIyejIeSx54eDGZmT4TMBM4iTgYGAofHw0KGQoSLRI8PBgXFxcFBQUx62VQAAAC7ElEQVRogdWZZ1cUMRSGZ8FFQUXa2kZFAQuiYMGGFcVesGAv//9nOJOZtDs3yczeezn6ftmchDx7TrJnXp7dLLPpjYxkIhmtXvb0+2MS+L37qtfxMRH+xP4D9ehglD95aCj81PSMHorwZ+cGovzDR8xQhH/0GJ1ffLLLYEvH89mOfIXqeUsn+ionkV2n8vlu/NMKdcZbWlhUWUJ2nc3PdeMvKdR5bylyPhfy5W58LJHzubhyic6PnE92eZXOj2VtWobfq6/kyspVPbPAyZ9UV1IMrl1fr2YSz+eO/HF1JcVgcOOmmbnFx7e5fWfIjf9WNgbpv6Hk7r37sm/w4GF0eej71Xk0txxbJvOzzcey/Cf5hih/K3+a5kee9ck8W0vz0Wc90plYnq9GFms+9qzHOhPLi800HzsfrDOxvHyV5ke6MJWp12/S/FgXJvI2f5fmEzKzvc7Hf/+hjDf18VNsQ0f+zucy7syXr1uM/G/fyzgTP7Ynohuo5z//k7Y/mf/MH03fCvmj7lsxf6z6Vs4fq74V9EfVt4L+qPqWwx8DKfsW80e87SL+GErRt4g/Btou4o+hFH2L+GOg7SL+GErRtyz+GErRtyz+GIjqW0F/VH0r5Y9Z3bdS/pjpvhXyR9O3Uv5o+lbIH8X7FoTPH0fRWTZ/1H0LQ/LHnV96ZPvWzqmQ/NGwnL4FfJI/GpbTt5BP8UfDcvoW8lv5o41nSobl9C3kt/JHG8+UNMvt2wa/jT/aeKakWW7fNvht/NEGPR+3bxv8Nv5og56P27eQ38ofbdDzcfsW8in+aFhO30I+xR8Ny+lbyKf4o2HZvoV8kj9alulbwKf5o2WZvgV8tj7b9e9r8T6jpuGPzGn6Yzxt79ek4Y/M/IY/MvMb/sjNh/7IzYf+yM2H/sjOB/7Izgf+yM4H/sjNh/7Izff8sf5vo4ePLD+wivE9f6x+L+z/xkeWH1jF+J4/Vr8XLv7BR5YfWEX40B8T6Xr+u+KPfwETo4pnNAHkVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.742;4.blob,1.1,1840.iVBORw0KGgoAAAANSUhEUgAAAnwAAAA4CAMAAABQZdU3AAABg1BMVEUAAAAGDgYDBwMJFgkUMhQyfDIECQQcRhwwdjAnYScraSsRKRE6jzoIFAgFDQU8kzwSLBIBAgE1gzUbQxsmXiYucS4UMRQSKxI+mT4qZyoraisDCAMVNBU5jDkdRx04izgfTB8FCwU0gTQkWSQJFwkQKBAzfzMLHAsPJQ82hTYhUiEHEQc9lT0aQRoBBAE9lj0ZPRkLGgsMHQwwdzAEBAEFBQICAgE4ijgAAQB4eDGZmT46OhcyejIeSx4GEAYOIw4YGAofHw0LCwUTMBM4iTgiVSIucy4KGQoyezIgUCASLRIFDAUeSR4gICD///8bGxsTExMiIiIFBQUjIyP39/eBgTR5eTESEgdvby329mP19WOUlDwkJA8PDwZpaSrLy1L9/WawsEc+PhkuLhO3t0r//2dISB0MDAVkZCjIyFH7+2WoqEQbGwstLRKbmz/z82Lx8WGNjTkeHgycnD/g4Fpyci4ODgYnJxAEBAITCAiZPj4QBwcLBQUUCAgDAQEVCQmUPDyEqeFbAAADmklEQVR4nO2cV3NTQQyFndAJEFIIF0IJJXQIPfTeIab33nuvMfWnMzbmcm0Tz9XuHlna0fcSv5zRznnweDKfVCjETFs7PlHLOL+4mBlofHtWwPgJE+GJGiZN9knLmQHHs2cVTJmKT2TomDbdIy1nBgNePetgRudMeOIfXd09zllJMzjw6VkLvbPwiZS+TvwvGY4ZLHj0rIXZSRs8kTJnrmtS1gwWPHrWQn8yD55Imb/ANSlrBgsePath4QA+UWVR0ueYlDWDCeee9bB4CT5RZWky6JiUNYMJ5571sKwXn6iyPFnhmJQ1gwnnnvWwchU+UWV1gv/vAccMJpx7VkPXmrXwxF/WDa13TMqawYN7z2rYkGyEJ1I2MfyK4ZjBQrnnzVsqbC1kPkVEz/A2eCJloNs1KWsGC+Wet++osLOQ+RQRu3bjEyl7hvY6ZyXNYKHc8779FQ5kP8XDwUP98ESGw0ecvzVFzWDAq2cVHB3ugCeytB877pGWMwOPX88qGDyBT9Rw8pRXXMwMOJ49G4bxX+iqeUg5nUMS1yqix7AE0By6ah5UTueQxJWK6GP2PFI8zfoQGHTVPLCcziGJqxTRx+55pHiG9SUo6Kp5aDmdQxLXKKI36fls8RznS2DQVfPgcjqHJK5QRG/S8/kLf/5evHSZ6zUQ6Kp5cDmdQxJXKKLn6PnK1WvXbzA8BQVdNQ8up3NI4gpF9Dw937x1+87de/i3YKCr5gA5nUMSVyei5+35/oOHj8BPQUFXzQFyOockrk5Ez9fz4ydPnz1/AX8MBrpqDpDTOSRxdSJ6np5fvnr95u07hsdgoKvmADmdQxJXJ6Ln6fn9h4+fGJ6Cgq6ah5fTOSRxfSJ6np4/f2F4CBC6ah5cTveQ8UXNCExdzzHK83TVPLic7iHji5oRmLqeY5Tn6ap5cDndQ8YXNSMwdT3HKM87qOaB5XQOSVyliB7JEkAz6Kp5WDmdQxLXKaLHsQTQHLpqHlRO55DElYroUSwBGIZs7Bq9VLQuARCwa/RSaex5tPS1JS/BYdfopdLQ82jpW0segsOu0UuloefvpR+teQkOu0Yvlfqef/5qyTOQ2DV6qShcAqBi1+ilonAJgIxdo5eKuiUAOnaNXirqlgDo2DV6qahbAqBj1+ilom4JgIxdo5eKviUAMnaNXioKlwCo2DV6qShcAqBi1+ilonAJgIhdo5eKyiUAEnaNXio6lwBI2DV6qVR6/g1yIX6AEFSDRAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.212,3.799;4.blob,1.1,1136.iVBORw0KGgoAAAANSUhEUgAAAakAAAAlCAMAAADP9+Z+AAAAzFBMVEUAAAAJFgkGDgYDBwMcRhwwdjAUMhQyfDIECQQRKRE6jzoIFAgnYScraSsBAgE1gzUbQxsFDQU8kzwSLBIUMRQmXiYucS4qZyoraisSKxI+mT45jDkdRx0DCAMVNBUFCwU4izgfTB8JFwkQKBA0gTQkWSQLHAsPJQ8zfzMHEQc2hTYhUiEBBAE9lj0ZPRk9lT0aQRowdzALGgsMHQw4ijgAAQAGEAYOIw4yejIeSx4iVSIucy4TMBM4iTgyezIgUCAKGQoFDAUeSR4SLRKZlla/AAACQklEQVRoge2Z2U4CQRREEdxwAURwGUVF3BVX3Hf9/3/S+HgnTqemq28lxvN+q5LKpDPJqVS+Gaug4Be/U60Rw4QdKTA7j0+gAfhFAZNT08Q0XUcCzM71mVkwAL8oZG6emabroGN2bjRbYAB+UcxCe5Gap+pgY3futNE3HL8I0F3i5qk6yNidl1fQBPwiwGpWJSdqOsjYndfW0QT8IkAv2yAnajrImJ03sw4YgF8E2eqzEzUdVOzO29kATMAvguzsshM1HVTsznvZPpiAXwQ56LITNR1U7M6HGfr7il8EOTpmJ2o6qNidT4anYAJ+EaJxdk5O1HRwye18Ab/f+EWAy+yKnKjpIGN37jfRBPwiQGt0TU7UdJCxO98Mb8EE/CLA3T03T9VBJrfzwyP6teEXhTw995hxsg46dufayyuYgF8U8TaqE9N0HXxyO79/oBH4RQGDT2KYsCMB1J3/8Qc32LHOm+n4lR2psTvjBjvSeVMdv7AjObmdcYMd5bzJjl/W4YDdGTfYMc6b7fhVHR7kdsYNdoTzpjt+UYcLdmfcYEc4b7rjF3W4YHfGDXaE86Y7flGHC7mdcYNd2nkncPySDifszrjBLu28Ezh+SYcTdmfcYJd23gkcv6TDCbszbrBLO+8Ejl/S4YTZGTfY5Z033/FrOnywO+MGO8J50x2/qMMFuzNusCOcN93xizpcsDvjBjvCedMdv6jDBbMzbrCjnDfZ8cs6HDA74wY7znlzHb+uIz12Z9xgRzpvD/f8J/z2z85fG9030/e5FhQAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492365052;4.copy,1.1,3.970,3.304,3.230,2.38,2.14,1.1,3.950,3.304;4.copy,1.1,3.950,3.323,2.20,2.19,2.14,1.1,3.930,3.323;4.copy,1.1,3.100,3.456,4.1100,2.57,2.14,1.1,2.90,3.456;4.copy,1.1,2.80,3.494,2.20,2.19,2.14,1.1,2.70,3.494;4.rect,1.1,3.650,3.177,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.172,2.38,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.191,1.5,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.212,2.17,2.14;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.210,3.125,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.251,3.231,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.274,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.269,2.57,2.30;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.393,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.291,2.17,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.288,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.318,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.191,3.307,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.326,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.345,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.364,1.8,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.381,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.440,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.459,2.14,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.497,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.649,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.678,1.4,1.5;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.668,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.687,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.725,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.755,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.13,3.782,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1053,3.136;4.blob,1.1,2016.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.201,3.212;4.blob,1.1,1216.iVBORw0KGgoAAAANSUhEUgAAAEMAAAAhCAMAAAC1KOYQAAAB7FBMVEUAAAAFBQxjY/UeHkpCQqRERKgcHEZjY/YGBg4BAQNdXeYoKGM4OItOTsESEi1nZ/4NDR9UVNAyMnwuLnJYWNkKChhmZvwWFjdKSrc8PJUkJFlfX+wCAgYCBgIDCAMBAwEEBAliYvIgIFBRyFFn/2cnYCc/P5xFRaoQKBAVNBUIEwggICD///8bGxsdHUc0NH8DAwc8PJMSEiwTExMoKGIpKWUiIiIFBQUMDB4+PpgHBxARESo8PJQDAwhKHh62SkojIyP39/c0gTQxeTEHEgcjI1YuLnEBAQI4OIoYGDsEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA85OYwXFzgiIlMvL3QJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhk7O5ILCxsICBOnQ0P7ZWWBNDQTCAgTLhNKt0odSB0zM31QICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwsRESkcHEQ1NYICAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwYGDw3N4kAAAE9PZcNDSFDGxu7TEzzYmI/nD9a4Fouci4GDgYsLG4tEhIQJxACBAIICBQLCxoWFjU5OY4BAQQeHksCAgU7O5ETEzA0NIAbG0MmJl4pKWZlK9p+AAABX0lEQVRIiWNgIBkwMjGTrgkdsLBSbgYbOwfFZnBycVPuEB5eys3g4xeg3BBBIcrNEBah3AxRMXHKDZGQpNwMKWkZrOKycmAgj8zCBRQUlbCKK6uAgSoyCydQU8cqrKEJBlrIrFEwGIC2ji5+BXr6KFwDQyMsZhjjN0NfD5VvYoqhxEzHHK8RFpZWqALWNrZwtp09mHJwRNfl5OyCxHN1Q5N29/CEMLy8fXz9cNjsHxAYFAzXERKKLh8WDiIjIqOiY2JxOj8uPiExKRnC5ksxQJdOtUwDkukZmVk4TQCD7ByVXDDD1ARTMg9UX+UXFBYV4zGhpFS5rLwCxFKwqcSUrqoGkTW1db71DThMaGxqbmltg7DbOzoxFXB0dUMYPb19OMzonzBxEowdHoZNxWQpGGsKDjOmToMzp1vOwKZi5qzZWHViLQvnYK9T5s6bj1Uca1m4YCF2py5ajFWYxLIQAB/VQRLOR548AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.132,3.248;4.blob,1.1,1484.iVBORw0KGgoAAAANSUhEUgAAAQsAAAASCAMAAAB7JQuHAAACSVBMVEUAAAAkDw91Ly/FUFB3dzDU1FZKHh75ZWVUIiJEGxvuYGAhDQ0gICD///8bGxtPICDkXFwXCQkDAQHaWFhwLS0TExMyMhT9/WYbGwtSISH1Y2MMBQUiIiIFBQWQkDq8vEw0gYExeXkHEhKrRUWwR0cjIyP39/eBNDR5MTESBwcWNzdOwcFk9/de6ek7k5MFDAwEBALp6V5eXiYtb29j9vZj9fU8lJQPJCQCBQUDCAgBAgLqX192MDBvLS32Y2OUPDwQJydKuLgdSEgoYmJg7u5JtbVLSx709GMLCwQGDw8qaWlSy8tm/f1HsLAZPj5CpKRn//8iVFQTCAj/Z2cPBgZpKirLUlL9ZmY+GRlFqqpY2toCBAQdR0caQUGpqUSjo0ITLi5Kt7cNISEVNDQHEREnEBBCGxsuExO3SkpIHR1j9PQ1hIRf6+s5jIwPDwb392RFRRwoZGRRyMhl+/tEqKgLGxtkKCjIUVH7ZWWoREQbCwsECQksbGxU0dFBoKBkZCjk5FwCAgESLS0/m5ti8/Nh8fE5jY0MHh4cCwtJHR0tEhKbPz/zYmLxYWGNOTkeDAzCwk6Kijg/nJxa4OAucnIGDg4GAgL6ZWVlKSmcPz/gWlpyLi4OBgZGra0bREQhIQ3+/mcsLBLGUFCVPDwEAgIRKSkmX19g7e19fTLOzlMBAQQCAgUBAQJ+MzPbWFgXOjpPxMQ9l5fW1lZwcC0xMXg+PpkXFzoaCws6FxcKChgNDR8FBQu/TU0BAAALBATNU1OFNjYUCAh6MTF7NmLyAAABy0lEQVRYhWNgGEDAOJCWDy7AxDzQLsACWFipaBgbOwdxCjm5uCEMHl4+KtpPIWBloaZp/AKCxCgTEhaBsnh4RalpP0VATFxiAGyVlJKGsmR4ZQfAfuxATp4WpiooKuGVV1aBsVTVILS6hiYtHEIYaGnr6Orpg1gGhka0sMDYxNTMHMyysAQDK1R5axt0HbZ2UvYDUbU4mDg6Obu4gphu7h40scLTy9vH1w/I8A8Ag0AU2aBgSQwdIaFh4SoRNHEMPhAZFc3AEBMQC2TGxdPMloTEACcGhqRkMEhBkUoNTsOmIz0jOJNmzsEBsrJBZE4uA0NefgGN7NAvLCouKcWRR9KDsSQA6bLyisoqGjkHF6gOqAFRtXUMDPUNjTSxoqm5pbWtHcTCmkc6gjvRdXR19/T29dPEMXiBKSRdtDEwTJhIGxsmTZ4yFcLCmkemTZ+BrmPmrNlzaOMW/GAupLyYxzB/wULa2OAQjV9+0WJ0kdQltHEJIbBUJzFm2XJHBoYVK+lo66rVYLAGxF67jo4W4wfrN+jkbAQm4k2b6Wjplq1gsA3E3j59Bx1tHnxg5y4w2A3m9O3ZO8DOGTxg3/4DA+2EwQMOHhpoF6ACACvgbBN0LBmkAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.111,3.269;4.blob,1.1,2940.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.316;4.blob,1.1,3464.iVBORw0KGgoAAAANSUhEUgAAAEwAAAB2CAIAAADtFOK3AAAABmJLR0QA/wD/AP+gvaeTAAAJ2klEQVR4nO2ce0xTeRbHf729LcW2tNMWChQrj7Y8QkEeCiiDqzJT05lBUCA8SpmRR2Mymgm7G4NZzbpx/zHuP+qsO4ZkNoo7wgyBzSTgBB1G4qq7Dq5RJ2IZHqsFKZRCoKWFPu7+gdbSFujjXi+S+0kT6Dm/nvs98Ot9nHt+F4DXUENCqCEhYAMD0+nVOt1n09NUNhtvLegDL/1ArFbz5CQJhu0WC76CAgeiQiSI5GwhrTT03aXoXlFYVpizZQMmyU5gUxgUvFUQEBAQbEyio6MRBBEIBAAACG8x2GI2m8EGThKCIADA7Ows2BhJyuXCzk65i5FEIpnNZsu7fpYKw1BlpfjRoxIEUd27V4S3HLQJDoY//zx5eLjCbK69cmVPTg4fb0UY8M03ey2WulOnMrlcmjfjyVgLwgKbDdm2LSw/X8Dl0jQao1ZrwlsRNkAQqbg49v79AwiiunOnUKEQ460IS/buFXR3fzw3dwhvIdgjlXLwlkBAQEBAQEDgGxQGo8ZoFMpdrwPRQi4XLizUFRfHYhTfW/Y0N+dfu4Zd/P37ozUaBZ8fjN0m1ibqww9r5uc3+P1CEplcNTaWUFOD9YbwrPEgNtvA1asSpRJHDW8DjlSqstuZW7ZguhWcKwOmiYmYoiKIQnnZ24uvEmxJaWgoe/YMbxUYsyk8vN5qDcvKwm4T+BeyLAYDPyeHIRQ+7+zEWwuWiMrLq3U6iErFWwiWwMHBh2ZnowsLMYqP/3QFANit1pC4uLDMzKFvv8VbCwEBAQGB16BYhth6bGvpk9LA4wAAKAxKjbFGKBeiEg2yGAzD7e2oXNRJqiTqK+rA4wAALAbLcPuwRClBJRoAKJUheOm8els9XUBHT1VUzXwNNQSFcz0IADB68+bizExsSUkggSRKyVjPmHHUGLimJUZvji7OLMaWoFBugwAaZQgIhkTlIvVldObqEogNGbg6gOaMDbAMIfxIWGOogemws5EEkcg0svMLokBeel+r4qjsKuYWpn+qHLySpX/8eOrRI3FV1YPTp/2IIlFKhtuHrUars1EoF+77fp+zZeSfIz8U/uCN97Uq/dSjKXGV+MHpB36ocvCmPTuloSFJpboWH+9rCCqLqhxXXi+4runWuNhZYpazZWF6YXZw1huvk6qUJFXStXiUatB+lyESahMUGoVLAz9abArfVG+td2mc95U3X4P58XFNd7cfux+JUvLrP35F7EggOlZifnxe061Bc/fjRxmCGcNU2VWcZAybL0TlompdNUT1vw6+7JMjHR1kKtWnUzyxQqx7qNM/0futYE1GOkbIVHIgp3jLkrSaTIOtreKKCu8/j/rh0R2ryTrYOiiu2NA9VwQEBDjAErHWHvROk/r71MJ/YVU+XxcI8gWf6j9lxgR6qbESss2bcV4yQSKT3v/r+31/6psbnsNoE9l8Ps5JRu+Ppgvo/U39GMUXMhgRmzZBmadOpTU2BnHw6fwVlYs03RqLwcMSlaysrFu3bplMJq1We/78eQaD4XCdysxsTEvjBAWtGT+bz382MwMt6PXpJ04oXrzIvXCBJRK5DIIoFDKN5vIiQaj9/yN3RWrvaN3t8fHxPT09JpOpqKiosbGxsrKypaXF4dUvLJxIT3+hUFzIzRWxVtwtQyTS9rCwu1otAABQWaykw4cP3L9fb7PJOjoi8vIc4/Y0N6sQxOUVW1yMSoY0Lk2FqGIOxLi7Wltb1Wo1DL8qXMhkMgRBdu/e7RjAolIPJyXdP3DAVl/fIZPlRUS4B5FyOOd27gwiL789yU1JkXd1qRBk875XhQlmTExoZqbLK+i991BJkh3PViEqwR6Bu8tgMJxeXoiZnJw8e/as+8gULrdLLkdUqn2bN7u46hITDyUkAEeNh8JgxJWVJdbW8jIyBlta9I8fL9mNGs38y5cuH7YvLvqVlCvkIDIAwG61u9iDg4PpdPr4+LizcWxsjMfjOVsYFEpZXFxtYmIGj9cyOPhYv+xyLxiGU7ncL3/5BQAAc6RS6dGjcWVliN3e39TUXVpqeP7cMfQ3X38trqx0EdFdUjL03XcB5wjMejMAwKXGBwAwmUzz8/Ph4eHOxsjIyBs3biz9LuVwjkqlZXFxdgRp6u8v7e5+bjC4BMng8YwWS//0NAAA7GpqqhgZSWlo8FhBx3S6QlSobrEusS7R3dXW1ub+nczPz19627Rr10hFRUNKSsjKRYzfpaYejH1dmGbHx0Ow69/yrVF4pzD3y1x3e2Jioslk6urqkslk1dXVU1NT169fd3jj2Wx41T08j0b7W15eJB21exYBkXEyo2ygzKNrx44dt2/fNplMk5OTFy9eDPHlVs1HQuEf0tNR0hgw9Eh63WIdfwfKCyD/mJm5V+Bhp40bOX/J+aTnk434EBInYDp8sO/g9j9vx1sIxtB4tLTjaXirICBYl2w9dqz0yRMvB6Pbo7EKfvSVrPbsD0lVlfrKFS8Dod+jsQJ+95UsPftjGbz09Hqbje7LYRTFHo2V8K+vJDY2FkEQCoUCXP6TEqVyrKfHODrqfSwUezRWYs2+Ek5ycvKRIy5G52d/vEkSgmFRebn68mWfFKDfo7GcVfpKSBAUlpWVcfJk8pEjFLdz8cHBweDgV6u03lx/RMlkFDp9qK3NVx3qy+rU36YytzDn/od+WTFKFkWhU4bahpyNEIUSnpsb9cEHVBZL19c30Nw8OzS0UgTgnKREqRxub7cafe42QqtHwyMe+0riq6t5GRnPOzvHfvzR4oXgV9OVymJFFxT4OlcdqC+rJVXoz1gqixpdEO0+Vyd+/tms00Xl528pKKBHRXkbLqG2VqHR+F1rRKVHw5OqlftKSCReenra8eN5X3219dgxr5pWCnp7s8+cCUSQvEvu8Ro/EAp6C7LPZK8+hp2QIP3ii53nzq0RixkTo7LbOcnJgQgKvEfDTZUPfSWrH9shAIBYodA9fKj3+mzOI+49GhAVcumeI9PIJDLJGy/wsa9k9WM7DAAQlZc/vXTJn8yccPRojHSMLFn29+53/5b+9NlPz/7+bE0vAEBULnp66WmAqpbAsOrg8RGkc8Nz5inzml4CAgICAlRAceFMEJl8Pjc32alBYL08MBPFhTMLNtt/dboc/ptbD+siSV46j53IHmgeQCvgPa02lculvb6Rvi6SRH3hTP/MzLzVmhEauvQW/ySxWDhjR5B/T0w4Ziz+SXoscATOPa1WxGJxaTSwHpL0WOAInFGjcdRozAoLA7gnuVKBAxXuarXZfD7APcnYkljzlHn0pg+VXu/5z8REKI0Ww2TinCSmC2dmFxefTk/j3CXJjGFG5EZguuLi7sTEttBQPJN8CwtnHup0ZAi9fkc/eAsLZyx2e9/k5P8BbqG6cPauLnUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.131,3.326;4.blob,1.1,560.iVBORw0KGgoAAAANSUhEUgAAATMAAAANCAMAAADygXkFAAAAwFBMVEUFBQxjY/UeHkoAAAB3MDDUVlZCQqRERKgcHEZjY/YGBg4yFBT9ZmYbCwsBAQNdXeYoKGOQOjq8TEw4OItOTsEEAgLpXl5eJiYSEi1nZ/4NDR9LHh70Y2MLBARUVNAyMnypRESjQkIuLnJYWNkPBgb3ZGRFHBwKChhmZvwWFjdkKCjkXFwCAQFKSrc8PJXCTk6KODgkJFlfX+wCAgYhDQ3+Z2csEhIEBAliYvIgIFB9MjLOU1M/P5xFRarWVlZwLS0obG7AAAAAn0lEQVRIie3QRQ7DQABD0WmdlJmZmZnh/reqJs0FurIs9S28/rIxgSD+fuC4BqEwu0KL6xhEojF2hpJ4ImmQSmfYHUqyORggX2B3CCmWyvazSrXGLtFRbzTtZ2i12SU6Ol14n/X65BAdg+Ho+9l4MmW3qJjNF9/PsFyxW1SsN/A/2+725BYRh+MJ/mfny5UcI+J2t+t9hseTmiLj9bb7ASvnNenwCfZ7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.345;4.blob,1.1,2456.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.93,3.421;4.blob,1.1,804.iVBORw0KGgoAAAANSUhEUgAAAKUAAAAgCAMAAABEiEiDAAABFFBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAB0Ly9TIiIUCAgaCwtLHh58MjKANDRDGxsdRx00fzQDBwM8kzwSLBIoYigpZSkMHgw+mD4HEAcRKhE8lDwDCAMjViMucS4BAgE4ijgYOxg5jDkXOBciUyIvdC8SLRI7kjsLGwsIEwgzfTMeSh4ECQQRKREcRBw1gjUYPBg3iTcAAQAGDgY9lz0NIQ0GDg4sbiwkWSQECwtf7Oxh7+8GEBAIFAgLGgsWNRY5jjkBBAEDBwdX19dY29seSx4yfDICBQI7kTsTMBM0gDQbQxsmXiYpZimQvMZgAAABAUlEQVRYhe3Ox1ICURCF4QsCiggqoKjkNAoCIkgwEFSCiaCAor7/e+h2Ulev7qGK+RZd1Wf1C7GqbHZ0AYfdhi5g2HA40QkMrk10AcOWexudwODZ8aITGHy76AKGvX0/OoEhEDxAJzAchtAFDEeOY3QCw0kYXcARiaILLBbLOovFVW8imQKFkOIx9Z/OYDpIWeVUPZzl8pgSynlBMxRLF5AQSrF8qZ0qVUQI6aqW0E51pQEIIWXS+q15Lb+DdJO71Y93LfkhpHanqx/vHx7/b68nO8ZUtWK09gdCDJ+eX2TXmHhV3ozm0Xgipu8fQ9k5JmZzw3nx+SU5hLT8Nt5/fv8AotwSmCtyaNoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.31,3.459;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAAC8AAAAzCAMAAAAw7aF+AAACQ1BMVEUAAAAwdzBW1FYUMhRm/WYLGws6kDpMvEwCBAJe6V4mXiYeSx5j9GMECwREqURCo0IGDwZk92QcRRwoZChc5FwBAgFOwk44ijgNIQ1n/mcSLBI5OYxnZ/8DAwgyfTJTzlM6OpBnZ/4CAgRW1lYtcC1FRaxXV9gGBg9iYvMsLG4iIlQAAAEGDg4DBwcUMjIyfHwECQkgICD///8bGxsnYWEraWkTExMFDQ08k5MSLCwiIiIFBQUmXl4ucXEsEhJtLCwjIyP39/cSKys+mZksLBJtbSwCAQE3FhZ+MzOZPj54MTEDCAgVNDQDAwEFBQIBAQACAgE3NxZ+fjOZmT54eDEFAgJBGhqGNjaVPDxiKCgiDg44i4sfTExiYigyMhRBQRqGhjaVlTwiIg5kKSmXPT1NHx8LBQU0gYEkWVkUFAgfHw0KCgRkZCmXlz1NTR8LCwUwExODNTWROztZJCQcCwszf38wMBODgzWRkTtZWSQcHAsBAAAyFBR6MTF3MDA2hYUhUlJ6ejF3dzAoEBBwLS2SOzsBAgI9lZUaQUEoKBBwcC2SkjsbCwsLGhoMHR0bGwsbQ0M4iooAAQEyenoeS0sTMDA4iYkKGRkRKSkQKCgSLS0HAweTPJMsEiweHkplZfliKGJlKWUgIE9cXOQJCRcqESqUPJQIAwgCAQKKOIo7GDtTIlN0L3QbCxuYPpgTCBN9M31KHkpEHESCNYIOBg6XPZchDSFuLG5ZJFk1FjWOOY4EAQQFAgWRO5EwEzBeJl5mKWbvuD9ZAAABlUlEQVRIiWNgQAWMTAwkASZGkpQzs7CSpJ6NnSTlHJxcJKnn5uElST0fP0nKBQSFSFIvLCJKknoxcZKUS0hKwZjSMrKE1cvJw5kKikqE1SurwJmqaiS5TF1DkyT1SlraJKmnNdDRJU29nr4BMcoMjYyhLBNT4tSbQVnmFpZEqLcysoYxbWzxKbSzB1MOjnARJ2cdLOpcXIGEm7uHpxe6jLezD4jy9QMDfxA7IDAoOIQhNCw8IjIK06joGBAZGwwGcQwMfvEJibFJDAzJKalp2JyYngEiM7PAIJuBISc3Lx8kUlBYVFyCRX2pDap7ysorKqtAQtU1tZ517hjq6xtQ3cPgH9cY3BQIlmtuaUVX3tbegeoeEOjs6oZK96Cr73Xuw+arfmyCIDBh4iRcUljB5CkkKZ86zZsU5dMnziDJ+JmzSFI+OMDsOXPh7HnztQhrWLAQwV60eAlB9UuXLSfJQStWriJJPcPqNaSpX7tuPWkaNmwkTf2mzaSp37J1G2katu8gTf3OXbtJUr9n7z7SLNh/AL88ACvKW5JCGC6UAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.649;4.blob,1.1,2472.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.755;4.blob,1.1,684.iVBORw0KGgoAAAANSUhEUgAAACYAAAAfCAMAAAC8lk/5AAABAlBMVEUAAAAEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwUgICD///8bGxsTExMiIiIFBQUsLBJtbSwjIyP39/eBgTR5eTESEgc3NxZ+fjNvby329mP19WOUlDwkJA9BQRqGhjaVlTxiYigiIg4PDwZpaSrLy1L9/WawsEc+PhlkZCmXlz1NTR8uLhO3t0r//2dISB0wMBODgzWRkTtZWSQcHAsMDAVkZCjIyFH7+2WoqEQbGwsBAQAyMhR6ejF3dzAtLRKbmz/z82Lx8WGNjTkeHgwoKBBwcC2SkjucnD/g4Fpyci4ODgYnJxAEBAITCAiZPj4QBwcLBQUUCAgDAQEVCQmUPDx8vwL5AAAAuElEQVQ4jWNggANGJjBgRmZhASysYMCGzMIC2DnAgBOZNfwBFzcPccp4iVHGx82PRVRAEE1ASBhCi4iKwYSYxSVYWXCYKiklLSMLYjDJySsoKuG0XVlFVU1dg4FBU0ubQNzp6OrpMxgYGhmb4FFkamZuYWnFwGBtY8tqJ45Dkb2Do5OzC5Tj6uaOQ5mHp5c3EtcKhzIfXwwhvEkbAfAmbQQYSUkbAfz8A4hTFkiMsiD/YGKUhYSi8gG+yhD8HhNgmwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492365154;4.copy,1.1,2.10,3.190,4.1190,2.19,2.14,1.1,1.0,3.190;4.copy,1.1,3.950,3.304,3.250,2.38,2.14,1.1,3.920,3.304;4.copy,1.1,3.460,3.323,3.490,2.19,2.14,1.1,3.430,3.323;4.copy,1.1,3.220,3.437,3.980,2.76,2.14,1.1,3.210,3.437;4.copy,1.1,2.10,3.456,3.210,2.57,2.14,1.1,1.0,3.456;4.rect,1.1,4.1081,3.177,1.8,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.172,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.223,2.18,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.234,1.8,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.250,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.213,3.250,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.253,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.153,3.278,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.269,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.286,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.307,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.131,3.326,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.345,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.345,1.7,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.345,1.4,1.2;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.362,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.364,2.18,2.51;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.381,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.383,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.431,3.402,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.413,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.405,1.7,1.8;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.421,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.93,3.449,1.4,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.755,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.23,3.782,1.3,1.4;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1043,3.136;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAAJkAAAA2CAMAAADjyMuzAAAB5lBMVEUAAAAAAQE2hoYeS0sRKSk+mZk2hYUpZGQsbW09l5cQKCgECgo8lZURKysra2soY2MaQUE3iIgTLy88lJQyfHwhUFABAgI4i4saQEADBwceSkoHEhIVNDQ5jIxn//8DCAg6kJBn/v4CBARFrKxX2NgGDw9i8/Msbm4iVFQKGBgECwtUz88NICALGxtl+fkwd3dW1NRBoqJHr68NDSBnZ/8LCxsIExMgT09c5OQJFxcIFRVj9fUdSUkICBMOIiICBQUUMjJm/f0/nJxMvb0ODiICAgUOIyNk9/dbW1vMzMz09PTl5eWZmZkTExNMvLwdSEgODiNkZPdVVVX9/f2AgIBDQ0NcXFzY2Ni4uLhe6ekmXl4GDg4jVlYiIiI0NDQHBwddXV3///9j9PRe6Ogzf38fTExHsLBQUFDIyMjz8/MgICBEqalCo6NX19dKSkr+/v6mpqZLS0s1NTVzc3McRUVV09M/nZ20tLTNzc0oZGRa3t63t7e/v798fHxOwsI4iooBAwMsbGxf7Oxh7+8GEBBpaWl5eXlHR0eLi4srKysNISESLCwUMTFY29sBAQF9fX3i4uL29va2trZaWlrg4OACBgYyfX1Tzs4tb29d5uZRyMgnYGBW1tYtcHBSzMwgUFBc5eUbQkJkMxRXAAACS0lEQVRogWNgoAAwMjHjYVHHPPIACysbI24WheZR5DJ2Dk4u3CwKzaPEYdw8vHz8OFmUmkeJywQEGYWEuXGxKDWPEpeJiDKIiUvgYlFqHgUOk5SSZmAQksHBoti8UTDCgayc/EA7AQdQUFQaaCfgAMoqA+0CHEBVTX2gnYADKGmQXWOPglEw1AD+9jSlbWJKTMbfnqakZU3QDgK68LenKWlZE7QDvyb87WlKWtaE7cCvC397mpKWNWE78OvC356mpGVN2A68mvC3pylpWRNhxygYBaNgFIyCUTBwQFNroF2AC2hoqxKvWEdOl2yLpPQ0iFWqbwCmDI0wpYxNTLFq0ZEzI89ZIGBuYUmkSgN9MGVlbYMhZWxii1WLnZw9ue4iATg4QmPGyRlDzsXEFaseN3cow8PTy9vHl0YuU/CDMvzlMEI5IBC/3qDgkNCw8AgauAoIlCKjoKxouRh8CsXkQQA1FmPjGBjiExLJCjRs5qEA5iR4cZGcgs+kVDkQSEMVTM/ITExMzCLHZVjNQwbZOXBmLg8+k1RlQMANRSwvv6CwqJg8l2EzD0XevQTOLi0j1fTyCiCRTp7LCIFKC0TvqEoQq5LoaJy6q2uARC0VXIbFjrp6OLNBrxGbJq2m5hZcBrbmt7V3BCd2UuowLHZ0KXbD2d1yPdh0Seb24qxS+/onTJw0eUohpS6D2TEVnF/lG4DMadMR0jNmUjLJRBUwC5xf5WYDmXPmIoTnTRswF8EAFzi/yqBVyvMX4E7pAwpYZpYQVjQgYCGO0UUA9wpfeCP0pTMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.181,3.223;4.blob,1.1,1556.iVBORw0KGgoAAAANSUhEUgAAANoAAAAWCAMAAACR6XImAAACdlBMVEUAAAACBgIDCAMBAwEEBAliYvIgIFBRyFFn/2cnYCc/P5xFRaoQKBAVNBUIEwggICD///8bGxsdHUc0NH8DAwc8PJMSEiwTExMoKGIpKWUiIiIFBQUMDB4+PpgHBxARESo8PJQDAwhKHh62SkojIyP39/c0gTQxeTEHEgcsLBJtbSwjI1YuLnEBAQI4OIoYGDsWNzdOwcFk9/de6ek7k5MFDAwEAgJbJSXSVVX/Z2fIUVEtby1j9mNj9WM8lDwPJA8CAgE3NxZ+fjOZmT54eDE5OYwXFzgiIlMvL3QQJydj9vZKuLgdSEgoYmJg7u5JtbUJBARsLCzfWlr4ZGSjQkI5FxcGDwYqaSpSy1Jm/WZHsEcZPhkFBQJBQRqGhjaVlTxiYigiIg4SEi07O5ILCxsICBNFqqpY2toCBAQdR0dn//8aQUGnQ0P7ZWWBNDQTCAgTLhNKt0odSB1kZCmXlz1NTR8LCwUzM30eHkpj9PQ1hIRf6+s5jIxQICDaWFjxYWGVPDwuExMFDAUoZChl+2VEqEQLGwswMBODgzWRkTtZWSQcHAsRESkcHEQ1NYIECQksbGxU0dFBoKACAQFUIiLLUlLGUFBcJSUSLRI/mz9i82Jh8WE5jTkMHgwBAQAyMhR6ejF3dzAYGDw3N4kAAAEGBg49PZcNDSFj9fU5jY1DGxu7TEzzYmI/nD9a4Fouci4GDgYoKBBwcC2SkjssLG4kJFlGra0bREQtEhIQJxACBAIbGwsICBQLCxoWFjU5OY4BAQQRKSlKt7cmX19g7e0eHksyMnwCAgU7O5ETEzAXOjpPxMQ9l5cGDg40NIAbG0MmJl4pKWZ7ZOvYAAAB00lEQVRYhWNggANGJjBgRmaRAlhY2UjTQD/AzgEGnMgskgAXN03cRQXAwwsGfMisUTAKRsEoGAUQwC8gSLomIWEUroioGJVcQ1XALyBOuiZhIVS+hCR1HENdICUgTbIeGVk5VAF5BUUqOYcqQEkZTKmookuoqWsgczW1MLRq66AJ6OrpU9Fl5AADQyNjE1MQy8zcwtIKhyprG1s7eyjbwdHJ2QVdga6rG7qQuwf1XEkO8PTy9vH182dgCAgMCg4JxakuLDwiMioayIiJjYtPSMSQT0oWQRdKkU2lqlNJBWnpGQwMmVnZDDm5efn4lRYUchQxMBSXlJZhkZSUwBQrr6CKE8kFlVUgsrqGobauvqERj8KmZvaW1jYGhvaOzq5uDFkWhR5MLb191HIlOaA/awKImjiJgWHylKmW06bjUDdj5qzZc+aCmfPmL3Be6Igmv2jxEkxNS5ctp6JTSQYrILG2EsxZtXoNDmVr163fgOBt3LQZTd7DHZuuLVspdh8FYBskr22HcnfgULZzFyp/Nyp3j+xebLr27T9AkeMoAweNDmUePuKNXZLoAYSjx7AKHz9xkhK3UQpOnTaqPnMWuxzRAwjnzmMXv3CRApfRFAyPAQQAEfNesAMqqtgAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.101,3.250;4.blob,1.1,2968.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.943,3.297;4.blob,1.1,4016.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.326;4.blob,1.1,2668.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.93,3.421;4.blob,1.1,380.iVBORw0KGgoAAAANSUhEUgAAAJEAAAANCAMAAACeonwpAAAAclBMVEUAAABHHR1/NDQeDAyYPj4QBwdWIyNxLi4CAQGMOTk4FxctEhKSOzsHAwNlKSliKCgJBASUPDwpERE8GBiJNzcBAAAGDg50Ly9TIiIECwtf7Oxh7+8GEBAUCAgaCwsDBwdX19dY29tLHh58MjKANDRDGxuaw9PKAAAAZklEQVQ4jc3ONQ7AQBBD0c2GmZnp/leMRopS+ALOK+z2K/UvhmYXIG2wC4Bp2ewE4LjsAuD5ATsBhFHMTgBJyi4AWV6wE0BZ1XJNww75tJ1sP4wTu+Q1W4vcuu09O+V1nOwCdN2yD6eXAvZ0CoJVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.755;4.blob,1.1,712.iVBORw0KGgoAAAANSUhEUgAAADAAAAAfCAMAAACWJr5WAAABAlBMVEUAAAAEBAEFBQICAgF4eDGZmT46OhcYGAofHw0LCwUgICD///8bGxsTExMiIiIFBQWBgTR5eTESEgcsLBJtbSwjIyP39/dvby329mP19WOUlDwkJA83NxZ+fjMPDwZpaSrLy1L9/WawsEc+PhlBQRqGhjaVlTxiYigiIg4uLhO3t0r//2dISB1kZCmXlz1NTR8MDAVkZCjIyFH7+2WoqEQbGwswMBODgzWRkTtZWSQcHAstLRKbmz/z82Lx8WGNjTkeHgwBAQAyMhR6ejF3dzCcnD/g4Fpyci4ODgYoKBBwcC2SkjsnJxAEBAITCAiZPj4QBwcLBQUUCAgDAQEVCQmUPDxQrDjFAAAAzklEQVQ4jWNgwAIYmcCAGZmFF7CwggEbMgsvYOcAA05k1ijAB7i4eUjVwEuaBj5uflQBAUEhZK6wCJoGUTE0deISklLSUElmGVlWFhw2IdTJySsoKikDGUwqqmrqGjjdBlcHBJpa2joMDLp6+gTSDEQdg4GhkbGJKQODmbmFpRUe5VB11ja2dvYOYBFHJ2dWFxkcyuHqXN3cPRDCnl7eODTA1fn4okqY4tCArg4FEJkxEYDIjIkAoxmTVODnH0CqhkDSNAT5B5OmISQUlQ8A3b8XbCz8pqAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492365254;4.rect,1.1,3.500,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,3.632,3.817,3.568,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.817;4.blob,1.1,3348.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;3.end,1.1;4.sync,10.6492365269;4.sync,10.6492366269;4.sync,10.6492367269;4.rect,1.1,3.510,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.817;4.blob,1.1,400.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAtLS20tLTt7e3q6uqtra0mJiYUFBTs7Oy6urpMTExVVVXQ0NDi4uIPDw9ISEj///8qKiolJSU1NTUVFRXr6+u9vb1NTU0ODg4kJCShoaHv7+/6+vo5OTkDAwOxsbH39/cnJyd3d3fR0dFhYWEvLy+wsLBLS0tKSkqvr6/09PQ3Nze5ubm7u7s6OjrU3fexAAAAWElEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXj5gEx+AUEGBiEmYSBTRFRMXAKqVlJKWoZTFsqRk5VXUATSSspyQL0CKkCmqoKauoamliRIWluHQ1pXjzS3AACK/QTzFNOpawAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492367406;4.rect,1.1,3.520,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.817;4.blob,1.1,188.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAAIVBMVEUAAABoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwuQ5JRAAAAJklEQVQImWNgwACMSspAkiU0GcwrJolkCc0InQA0QUlpAabBEAAAgcEHSHIQjjIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492367485;4.copy,1.1,1.0,2.19,4.1200,3.798,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.817,3.520,2.19,2.14,1.1,1.0,3.798;4.copy,1.1,3.530,3.817,3.670,2.19,2.14,1.1,3.530,3.798;4.rect,1.1,3.520,3.817,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.817,3.509,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492368042;4.rect,1.1,1.0,2.83,4.1200,3.373;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.457,4.1187,3.379;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.456,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.sync,10.6492368053;4.rect,1.1,4.1190,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.475,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1181,3.470;4.blob,1.1,160.iVBORw0KGgoAAAANSUhEUgAAAAgAAAADBAMAAABc5lN7AAAAG1BMVEUGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExN0aDc2AAAAF0lEQVQImWNgFBQUYjBxcXFlSC8vrwAADmEDBCg/VwgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492368092;4.rect,1.1,4.1190,3.475,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1171,3.356;4.blob,1.1,448.iVBORw0KGgoAAAANSUhEUgAAABwAAACJCAMAAAAIeKhWAAAAeFBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExNkZGR3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUXk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCVuj5aAAAAk0lEQVRIie3XyQ6CMBSF4QrIDILK4ACogLz/G5K0i5LQI8sWc/9NF19XTbo4jCk6WDxbZcw58lwlej4vUCJFUdT/5oSEO0MdGfcIhFuoI+MegXAL9RTFPzCOsCXpCWOWYztfrhiLssJY37DdH0+MYdNi7F7Y3p+en3LVLPbNMIpLctUs9s13EihXze72jXE/hHCNM8H3B6ch3KbNAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368132;4.copy,1.1,2.10,3.456,4.1190,2.19,2.14,1.1,1.0,3.456;4.rect,1.1,4.1194,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1174,3.345;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAABoAAACoCAMAAADJlg6CAAABDlBMVEUAAADIyMj////w8PC8vLxJSUnCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExNkZGR3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl5LS0v09PQLCwujo6MPDw/39/dFRUXk5OQCAgKKioohISHOzs7W1tZwcHAFBQVMTEwjIyMMDAz19fWkpKSoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBg3Nze3t7dZWVns7OwJCQny8vJQUFCcnJyqqqpYasx3AAABWklEQVRYhe3YV1PCQBQF4EuMqBGwoiiIWAB7QcXee+/t//8RmTsm2dm950FnlH3Y88ADH2Q2bJaTDZGehOe1+K3G20zJtvaOoFOkVOMlnelC1N3Ti4j6+iFlB35Dg/CAuSE4jGF58I1TznvKKRdGOEX+oUb9kvpZjzMmHGZ8gjMpkI1JlB1ZR/+bShVStYJkanoG0ayPJDc3j2hhcQlRfhlJbWUVUXmtjii5jmQjkP4YOOlNJLS1DcneWHKlO2pWLDllR82KOgytAlTSKkAhvQIU0isgJqMCYjIqICajAiIyKyAiswIiMisgJKECQhIqICShAuy/AFzzxxGm/fveX5r28N5fmHb77/1tXfd13m3tkLDud3m3lSJh3dd4t7VHbt3/NPsHJWiHR5COT04RFc/O4dcuLiFdBdfQbm4h3d1Desg8QnvKQnp+KSB6fXsn9YmAmo9P+ssnAl9nhDKcd0ucFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492368173;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.rect,1.1,4.1191,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1184,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1151,3.362;4.blob,1.1,1164.iVBORw0KGgoAAAANSUhEUgAAADAAAACVCAMAAAApDYnoAAABPlBMVEUAAAAkJCR1dXXFxcXIyMhkZGRERETu7u4hISEDAwPa2tpwcHBSUlL19fUMDAyrq6uwsLDq6up2dnYTExP///8nJydCQkIuLi4+Pj4cHBxJSUkGBgb6+vplZWXGxsaVlZV+fn7b29saGho6OjqNjY2/v78BAQELCwvNzc2FhYUUFBR6enp3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PSpqamjo6MPDw/39/dFRUXk5OQCAgLCwsKKior+/v4sLCx9fX3Ozs7W1tYICAhgYGAoKCg0NDQFBQWkpKRUVFQRERFMTEwjIyNKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3Nze3t7dZWVns7OwJCQny8vJQUFCcnJyqqqri/oAYAAAB5klEQVRYhe2ZV1MCQRCEVwUFBRNnBHPAAOaIimIWzDnn+P//gOXi3Z5umnnDc/uJGuarWih6uwFCMCpCbRNSXALZ8vntR6VlARQQLK8AncMBQuFKHFBVDdpnQE0tDohYIRxQZ9XjgAarEQc0Wc04IBprwQGktQ0JtHcggc5YFw4g3T29OCDe1w87lKOBQSRQOEokkUAygdsfGh7BAaNjuP3xiUkcMDUdxwEzs7j91Nw8DvAvpHHA4hJuP5BZxgErq7h9sga7sY1gYreRAQzgOcALKsC31QAFCkTXqYJgwGdRbYCBzS2qCBj4D3K/aFDRdQOgousCYEXXBcCKLgOARZcBwKLLAGDRdQBo0XUAaNF1AGjRtQFw0bUBcNG1AXDRNSkKkwe/gWbz1730s84ZM5e/7rdlAGfMQP6635Hs88bUHIk3puZIvDHVR1IZk6WjKydVxmTp6MpJlTFZOupy0uhbHs9OsR+47EzTrSyR+YHLzl269fXrstgPXHam6Nae/khQiyqyU30kk51/U5XhffETUtvmDsRzqW0Pj45FY7ltgyenorHCtmfngqGq8l5kLvmhsvJeXfMzZeW9ueVG6sp7d//we6SpvI/cPyaayvv0HP050Nn25fWNgJOV6v2DgJOViU/WT/i/XM94xJoNAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368214;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,4.1181,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1174,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1192,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1141,3.345;4.blob,1.1,1224.iVBORw0KGgoAAAANSUhEUgAAADoAAACUCAMAAAD1c8qEAAABI1BMVEUAAADIyMj////w8PC8vLxJSUnCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExMkJCR1dXXFxcVkZGRERETu7u4hISHa2tpwcHBSUlL19fUMDAyrq6vq6up2dnYnJydCQkIuLi4+Pj4cHBz6+vplZWXGxsZ+fn7b29saGho6OjqNjY2/v78BAQELCwvNzc2FhYUUFBR6enp3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl5LS0v09PSjo6MPDw/39/dFRUXk5OQCAgKKiorOzs7W1tYFBQWkpKRUVFQRERFMTEwjIyOEMc/PAAACLklEQVRoge3Z6VLCMBAA4FIRFcEbRcEbFUXxPvBWPMBbUVHxev+nEFKZMpPtZrMz4CDdH+qk+YZMaTe70TDQ8Jhmk7cZn+NEfS2tbf52Fg0UfwQ7Orm0q7uHS43ePjYN9f8FHWAvODzIvk1DvC+n+EhETI1HIjosYkQ8iKPeMaer0GeZIsYdVoJdnZgUEYMpfvXfxBRbTs/ozffEy3/NziWYdGR+QU/aNLm4xKXLAU1p05VVLo2ZSS5dM9e5dMPc5NItU3sDKdNoaptLjZ0Qm+7u/X48lmBgup86sAbQ9ANS4/DouPSLnmBsmj45VU93iLNzNq2XyGTZNJvhyovLKy699nJl+OaWS+/u01waeeDK3OMTl8af81zqe+HKhJ9T+IgIvnKl8aa7u7lR/bCzr0td6tKa0EaKuvtyXNog1G6MVC2SRO3GSNUiSdRujFQtkptgSFF5m+QWCb2JlRflFolKgRaJSoEWiUihFolIoRaJSKEWiUbBFolGwRaJRsEWiUThFolE4RaJROEWifwM1442VmAnL4rbhJ284BQ9ecEpevKCUimtFKytMa+mUlp5t7bGDzWV0krC2ho/lVROK+QFy2mFvGA5rVAXrDp5sShYmahOXiwKViaqkxeL0isTibKiwRMMXrfA84AhzQSD1y1UqptgkLpF9b5KdUtezC8Y6vdVqlu+xPzS/7tU76tUt+TE/G+dBesnGKRuoS6YlmDAIVqCAYdoCUY1VBX6AzNFXVxF5Ma/AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368254;4.copy,1.1,2.10,3.437,4.1190,2.38,2.14,1.1,1.0,3.437;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1171,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.440,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1144,3.330;4.blob,1.1,1500.iVBORw0KGgoAAAANSUhEUgAAADcAAACjCAMAAAAZ8nYhAAABcVBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQRERHIyMjw8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYDAwPx8fFKSkpgYGAoKCgTExMkJCQYGBgLCwt1dXXFxcXPz88PDw9ERETu7u6ioqKvr6/a2tpwcHAVFRX19fVSUlIMDAycnJy9vb2rq6tISEgXFxfq6up2dnYODg5WVlZ/f38nJydCQkLX19cuLi4+Pj7T09OdnZ0cHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb2/m5uYaGho6OjrMzMyNjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0t3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl709PSjo6P39/fk5OSKiorOzs7W1tZMTEwjIyNXIry3AAACr0lEQVRoge2Z51vUQBDGg7Cc4gkqcmBDaWcBQU+xgNgAATt2ihSxUezdvx7IcSk7szOz6+M9EPN+gFxmfs9tNsncvLueZ6eKbb4qLTGvSvmqtuUy233tsOW2yjhTJVU1Su3M7qISavHTdbv37K3fZ881rP3JNTY5cfsPHHTivEOH3bjmI+XljrqNs6XVbV7aHO7D2n1vV9L73lGsb3n/OTuWPR5PDaM6V1OsbycMXxGNxriTxfrWiXOxqOH6WLly/1Zd2udT3SKs57R2ovpMwZgcXvnZcxk92Hue5/IXLoLgpT5j8Qm4/r7LMDpwheWuNiDRa+o6x90YRKJDapjhOlU/Fm69yXAjahQLjzUz3C11Gwvfuctw9xQ65fcfMFzH+EMkmn/0mOG8J9iVNKmnHPfs+cYXR+vExKSpWwq4qfHp4olonXiRM2CR53pmdm79X7ROzL8c4rnuhVda7PXkGxMW1dt32onRRQm22bW07MYtLzlhK+8/OHEfs05Yy6fPTtziF1lR1tX+1QkrfBM9gkC1363tiK+6H05Ypt7cg1DK/XTCvF/wNyhVGVXuvivlUi6JXNK1Ve5DyiWMC90GdmTmQreBHZm50G1gR399fUlXdF6g7zDPWjQCfYeIQ3yHiEN8h4TDfIeEw3yHhMN8h4BDfYeAQ32HgEN9B8/hvoPncN/Bc7jvkD2f5eCSL2pVgpoXalWC4MhVCYIjVyXMHKgOsb1FMweqQ2xv0cyB6hDbWzRysDrIxgmrg2ycsDqIxsmtSuhcqTvgViV0rtQdcKsSOkfscpCcVP9bnaC7CDxP/2xTJ+guQsRZ1QmiiyDfP9BFVPrJFR7z/oEu4refvL4hQ75/oIso+Ml/xOO0rBNEFyEap22doLsIkBf4DrqLAFzgO6Tv8UZe4DssuZJWAYNCWm5odTntAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368294;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1194,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1184,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1144,3.330;4.blob,1.1,1212.iVBORw0KGgoAAAANSUhEUgAAADYAAABqCAMAAADA11JjAAABcVBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQRERHIyMjw8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakDAwPx8fFKSkoGBgZgYGATExMoKCgkJCQYGBgLCwt1dXXFxcXPz88PDw9ERETu7u6ioqKvr6/a2tpwcHAVFRX19fVSUlIMDAycnJy9vb2rq6tISEgXFxfq6up2dnYODg5WVlZ/f38nJydCQkLX19dMTEwuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb2/m5uYaGho6OjrMzMyNjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0t3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl709PSjo6P39/fk5OSKiorOzs7W1taj/f65AAAB10lEQVRYhe2XZ1PCQBCGg3hgQVARxIaCoICKih3sYu9iF3sXsPdfLwlKYrJJjpuRkUzeD8eye88kl1techSFI00eI206wqKofMRIl47wMH0Bo8J0hIflxE2qUpiKECo2lEhNMIJZU2lZubkiY8ySHKyVNhKsqrqGBKNq64gwe302sQaim3Q4iR5JY+YbkNxuF8Lfbtq+3ExzNRmaf8/0pMzNDWG0fXlFLpAyNy+E0fblg7GWlLn5IAxXhNhfqpX3vc2PQ7V38BK6zoDYXHbRXd16frGnVxZz9/ULigNBMaNJY6HgoLA6NCyHjViA6igak8HGJ4BqGE1KYz4UgsrOKXrUMt2tAbBpNANhs3Z6nGO6m7uKH2weLUDY4hI9BpjuXgawFQQ+69U1KMtinsg6UHVvbEpj1JYdqNrQtgy2s/t9Wa4p7EW1Mth+5CCV4JrCoRWmOK18dHxCf3BN4fQsLIv5zy94tcvolQjF1fUNLzETw6D+teIJIiwRJ6Fu7+5JsAcDCeV4fCLBYs9Y1suX64WECrzitJ1AxjeRH5S0TO8klN4s/nIhIesHCUV9Cv9lVGVD2X2XUjEVUwimZOXEBqiYQjD20CARCTH20CARCTH20CAREa7tCxAPNAVw/8hvAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1121,3.459;4.blob,1.1,852.iVBORw0KGgoAAAANSUhEUgAAAE4AAAAiCAMAAADGQh8OAAAA81BMVEUAAAB3d3fU1NTIyMhkZGQyMjL9/f0bGxuQkJC8vLw3NzfBwcH39/fp6emTk5MMDAwEBAReXl4FBQUICAgCAgInJyf29va4uLhISEhiYmLu7u61tbVLS0v09PQLCwukpKT///9UVFSqqqra2tpHR0dBQUGpqamjo6MhISE0NDQRERGEhITr6+uMjIwPDw9FRUUJCQlsbGzR0dGgoKDk5OT19fWNjY3CwsKKioqtra1ERET+/v4sLCwpKSm3t7dfX1/t7e0GBgYDAwN9fX3Ozs46OjrExMSXl5cODg5gYGDW1tZwcHAoKCgTExNMTEywsLAjIyNSz6I5AAABRklEQVRIie2VaVPCMBCGF8QDLYpYxQO0KAoKgheoHOKB9/n/fw2SlJnQ7mYJZPzk+6FkNstDs8M8AaASiZJbMBWj94hEIzZx0zOzNnFzcc1mGDe/4CQWl8gvJBPLw4XUioiL41bX0usbm1skLpPdHi7seCI5HLe7lwTIe/sU7qAQKBQPRY5wXLbUf5aPCVrFqQYq2sOeeKf9j7NzAhe7cAMV/WFr8u3qBO7yKljRH/Zazq6B04rNFvE7gOPazk2+c5sGuJMzuVdX8NDV0pD/3eOTU35++d2RM3lVV/D2boob5EPO5FNdsRlDAX+I+0846ogtyF1tsyB3pc2G3JU2Q7kzbYZy53C+3F3BSAHnOw7ny/1LML6B8x2DG8i9Ihg/MOFhTeXO4EzlrscZy13fNqLc0YsBwY0od/RiQHBc/D7uYjDEhdMDmcYtNL8K/o8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492368335;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.437,4.1190,2.38,2.14,1.1,1.0,3.437;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1152,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1124,3.330;4.blob,1.1,1712.iVBORw0KGgoAAAANSUhEUgAAAEAAAACjCAMAAAANZ+jAAAABpFBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQRERHIyMjw8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYDAwPx8fFKSkpgYGAoKCgTExMkJCQYGBgLCwt1dXXFxcXPz88PDw9ERETu7u6ioqKvr6/a2tpwcHAVFRX19fVSUlIMDAycnJy9vb2rq6tISEgXFxfq6up2dnYODg5WVlZ/f38nJydCQkLX19dMTEwuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb2/m5uYaGho6OjrMzMyNjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0t3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl709PSjo6P39/fk5OSKiorOzs7W1tY3NzfBwcGTk5P29va4uLhiYmKqqqpHR0eEhIQJCQnR0dGtra23t7dfX1/t7e3ExMSXl5cjxCG/AAADGUlEQVRoge2aeVsTMRDGF2uoYgUVqVi1UoR6oKgVRYsKahW8D7xFvEUFPBDrLYq3fmnZ7ZElMzubMWjFJ+8fS8hsfm3S5N2d7DoOT1VzPEXKJWZ7Z67wVF0ucQHReZ7ml0tcwH/QBSsrTdUIsSC2kDqhNgRQt2jxkvqlBoCGqUN8WaMZYHlihRnAWbnKEJBcXWlAk2EXUs2Gg7jG5Gecmkgtgj2RWgsmnfam8trYuqBoIKCmYNLrAz7UH8UBGwom3YYDpkXDxiBUxoC/rY3K/5vaee03b1EqqrdmwlvJYdrWEVWD23cwAOnOnSC4K0sZpgLoyu6G0T179QHdDUi0R+zTBuw/gERz4qAuoE10YeHmQ+4x4q2vKhLQK/qw8OGkezzirS+sjxJwVBzDwsdPuMeMt75OkoBTAv3FTp9BWyGA1v6zSDR97rwuwLmQRKKN4qI24NLl4lfxW9qVgYg24Gr/YKHCb2nX4mHtfYvp+o2b7h+/pd26nWMA2u/cVWJDA/dC2/t1/4FS0TfMaj+LNTJqCBgdMWv/8NFjM8CTmFn71NhTM8DwOPPyo6rlmVn7TJ433YFqn4cueFp1L8zaR+uDb/G0FH9p1t55Ba/IVrNHlb8HtgALsIAZAlj9C7+CBVjAnwHIdJMoUQCZbhIlCiDTTaI0k2NgNX0QYeKpMcT+U2DiyQMgiScPgCSeLACWeLIAWOLJAmCJJweAJp4cAJp4cgBo4skA4IknA4AnngwAnngy10JlAFauqB00rUGkdtB0AOQOmg6A3EGDgNdv8mNv/c8fgJHJtx0wQO+7iZ73HU2+GmBk8m0HDPChM+U4k/7LOzAy+bYDBhj/6B4TsgIaGdmFT8Lbov8sa6CR0V3Iqt8AGhndhS/KGITtoAHAUP7r5LfvE05p2z9sBw3Og8Ef+cTPnFPa9g/bQQucicRzTj2ArqylEaLvzfDzAgO/ZWn0vRkPwLQ0EGBaGgQULU0+yaT9AAKKliafZNJ+AAAlS5NPMpld4FoaAHAtTQWwLU0NaFoaTDzpezMAgImnrtMUz4OJJxMA9AuzVG8Lm7LM4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492368375;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1141,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1174,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1180,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1101,3.330;4.blob,1.1,1824.iVBORw0KGgoAAAANSUhEUgAAAGIAAACjCAMAAABGzzstAAABrVBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQRERHIyMjw8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYDAwPx8fFKSkpgYGAoKCgTExMkJCQYGBgLCwt1dXXFxcXPz88PDw9ERETu7u6ioqKvr6/a2tpwcHAVFRX19fVSUlIMDAycnJy9vb2rq6tISEgXFxfq6up2dnYODg5WVlZ/f38nJydCQkLX19dMTEwuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb2/m5uYaGho6OjrMzMyNjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0t3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl709PSjo6P39/fk5OSKiorOzs7W1tY3NzfBwcGTk5P29va4uLhiYmKqqqpHR0dBQUGEhISMjIwJCQnR0dGgoKCtra23t7dfX1/t7e3ExMSXl5cUgzOgAAADZklEQVRoge2b+V/TMBjGiximOEHFTZw6GcI8UNSBosMDFQXvA28R8UQFPBDnLYr3+TfL2vnptrxL3yRvdOyT54cu65v0C02bJ33TOY6Gqua4qg4qaWguc1UTVNJQaJ6r+UElDdkTZWVl9X9Vy9iC8EJRhTphc2E0V6d+0eIlDUuNIiIzm+iyRtOI5bEVphHOylXGEfHVlYBoMn6iEs3Gu3uN2Yt25tZrYQZuvVZvepJ0B5C14XWlohqIWm96sh4RVUVs8KYnbYiofl8E6h8gZqM2Fn3f1E5N2LylaEfN1hTFcf0u6+gMFQe3bSdFJLt2cMGdaZGxSyO607v46O49lIi9ESDaw/YRIvYfAKK97CAdoo11Q+HmQ9lttTsyVpUoYRF9rB8KH45nt0fckTFSooRFHGXHoPDxE9ltyh0ZT5YoYRGnGHh9nj6DOAYS0TpwFogmz52nQzgX4kC0kV0kRFy67H0WGOuVQb3sQCHi6sCQtyPfWK9F9Ql5w+Dw9RvZj3xjvXmrlxTRfvtOUWxk8C4BIV/37hft6B8lJlgFaGxctSV6HjU+Zhrx4OEj04jHYVUCFpGYeGIaMTqpPuVDIlqeKhOQiFRGYxjCIeqeaRgCDlH/XJ2AQ4QaSj8QEyGiLzQIOMRLfjZOjdBTZSCsKETTUcKjWIRFWIRFWIRphFX5qDImWRZhERZRHgg/ASxfQiL8BLB8CYnwE8DyJSTCqpKV3918Khh7MaCnanwqmBoBpIKpEUAqmBgBpYKJEVAqmBgBpYJpEWAqmBYBpoJpEWAqmBQBp4JJEXAqmBQBp4LJx6jZi7AqJ4lWVom6W7SySoMQrqzSIIQrq3zTV68zE2+496eECM5OC34TwjXtezvV866zSQrB2WnBb0K4pu+7Eo4zzT7IIDg7LfhNCNd08mN2G/skgeDtVHiiPjP35Z8vXyUQvJ2KT1Ta+y+GJRC8nYpP1DevLzrwiKCVVa7pSOb79I+fU3A98AkzaGWV/+uGfmViv7lXgLx64BNm0Mqq3N2Nf8JURijJGmtFSPycCtfDHg/YZchYxc+p1AhJY1VASBqrCiJnrP6bvWK/UEHkjNV/s1fsFwqIv8bqv9lLfqJkjVUBIWus8ghpY5VHII01MAEsQCCNNTABHDBGIRCBCWB9BK7eHzh3hDfQ34PoAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368416;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1191,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1170,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1162,3.267;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAACYAAAA4CAMAAACmP3p3AAABRFBMVEUAAAAkJCR1dXXFxcVERETu7u4hISEMDAyKiorh4eH19fW5ubksLCwDAwPa2tpwcHAHBwfAwMC/v79UVFRISEiSkpLr6+seHh5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmrq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf39/q6uo1NTXExMTt7e0xMTGsrKzg4OATExP///9dXV2cnJwuLi5HR0eWlpbS0tIJCQknJydCQkJxcXGCgoJGRkavr6+AgIABAQE+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl5JSUkGBgb6+vpkZGT29vb09PQrKytlZWUICAjs7Ow7OzsZGRkUFBTGxsaVlZVnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXkaGho6OjrNzc2FhYV6enqan5ruAAABG0lEQVRIiWNgwAEYcUmgACZmYlSxsLKBaXYOTi5uHlyqePn4wbSAoJCwiKiYOA5lElzsYFpSSlpGVk5OHocyBUUwpaSsoqqmrqGphUOZtiSY0tEV0GPXN2AwFMCqyshYAkybmJrJMJhbMFhaYVVmbWwDpm3t7B0YTByd+LDbaWbsDKZdXN3cPTy9vBWwK1Mx9gHTLEK+7n7+AYFB2JX5+gWD6ZDQMM1whvAI7KoYGCKjIHR0TCxLXDwuVQwJiVBGUnJKahpOZel+GTjlkIGXkBMxyjQzs4gyLiKbKGWjYBSMSECLUhs/gJXaBACs1CYAoKU2IQAttQkAWKlNAMBKbQIAVmoTALBSmwCAldqEAKzUJgDgpTZ+MHhLbQBGHCSz74qb2wAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1111,3.345;4.blob,1.1,416.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAPCAMAAABXwPhJAAAAclBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExOQtl5TAAAAgUlEQVQ4jWNggANGJiZmFlYG3ICRDY8kHllGdg5OLm4eGhjMCyT4+AVoY7CgkDBtDGYQEaWRwWLiQ81gCRoFhaQUjSJPmhbJDZhBZJiolkFk5cBAHpylFVgUcckSazBcB9A4EFDCoRpZliiD4TqUVcBAFbtqFFmiDMZvHl6txMkCAIIACmtTKGhfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1091,3.421;4.blob,1.1,1048.iVBORw0KGgoAAAANSUhEUgAAAGwAAABICAMAAAAkheDfAAAA81BMVEUAAADIyMhkZGQGBgYICAgDAwP///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwsCAgIFBQWpqamjo6NMTEywsLAPDw/39/dFRUUjIyPk5OTCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHA3NzfBwcGTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWkpKRUVFSqqqra2tpHR0dBQUERERGEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5+JitcAAAB2UlEQVRYhe2ZaVPCMBCGC2o9wAsUiwf1wvvEW1S87+v//xqH9EPp7LLZJE1Hx7wfIDPZ7jMsneTdxPNw5fJdJmzIwRzMwRwsRVhPr1Cf2YgJy/lC/WYjJmxgUGjIbMSEOTl1qvMFKRSpWW4WZlixkB1seGQ0O9jYuG4SdVipPJEdbLIyZQoLxDpcZcCmZ6hZFmxWrMNzclgtnDeG1cQ6vCCH5RcDYxg7bGlZP4kqrL6ymh1sbd0giSpsYzNDmFGSXwlz+ouCZiBW6i8INAP2YIgZsAdDzACVZGs7LO/sasKAGahGbU+AJ9nbbxwcHh13gSWeRQTMwEnU9pzisLPzkuc1/QsclngWETAD9ajtucRhlav2Z+sahyWehYJmgCzjjX/b/rq7x2GSMkIzQJfxIfpljzhMUkZoBugyPkX/2TMOo8uImwGQJNZL+Np8e2/I4tCeHjcDBMz7+AxbX9+yOLSnx80ABePF8Xv6FGBacrbgn4o+I8DjuPnISeu2gD4jsAdTtAVGMEVbQOfD9zNwRhD3+fR+RsPw/QycEcR9Pr2f0TB8PwNnBHGfb7GMqraAhknKqGoLaBhdRmVboBNHnxGAOOmFAQvGtAXSCwP22siASS8M0oSpxv0ARmYqPVsFhaYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492368456;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1121,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1101,3.345;4.blob,1.1,416.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAPCAMAAABXwPhJAAAAclBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExOQtl5TAAAAgUlEQVQ4jWNggANGJiZmFlYG3ICRDY8kHllGdg5OLm4eGhjMCyT4+AVoY7CgkDBtDGYQEaWRwWLiQ81gCRoFhaQUjSJPmhbJDZhBZJiolkFk5cBAHpylFVgUcckSazBcB9A4EFDCoRpZliiD4TqUVcBAFbtqFFmiDMZvHl6txMkCAIIACmtTKGhfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1081,3.421;4.blob,1.1,1340.iVBORw0KGgoAAAANSUhEUgAAAHYAAABaCAMAAABaF1JuAAABL1BMVEUAAADIyMhkZGQGBgYICAgDAwP///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwsCAgIFBQWpqamjo6NMTEywsLAPDw/39/dFRUUjIyPk5OTCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHA3NzfBwcGTk5MMDAwnJyf29va4uLhISEhiYmLu7u61tbWkpKRUVFSqqqra2tpHR0dBQUERERGEhITr6+uMjIwJCQlsbGzR0dGgoKD19fWNjY2tra1EREQpKSm3t7dfX1/t7e06OjrExMSXl5cODg5KSkqoqKhGRkbm5uZjY2OLi4stLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/PyVlZVZWVns7Ozy8vJQUFCcnJw2VVOuAAACeElEQVRoge2ZZ1PcQAyGl3aE3uFICEcn9BZCKOHoHUISEnrn//8G5uwJxkhotV6dPTD7fuB25JWeYe/Gfi0phaug8JUL+ZXDOqzDOuwbwxYVeyqRWjGxBSlPpVIrJvZDmadyqRUT6+Rkp+c/qYpK6iq3inFCZUUS2KrqmiSwtXWRy1lg6xsak8A2NbfYYtPe/b81tNJhP36irrKwbd79/3NopcG2Zzqsse3e/b8ztNJgC7vS1li+nhK6eyzKRcb29vUngf0yYFMuMnZwKBGsXbm3gnV6z4JWJlAef1LQysSBRaxMHFjEylDlhkcyDaNj1lhgZVr9V8Q0Xm58YnLq6/S3V7ChXFLAysz4r4jfcezsXL1S86kFHBvk6kwNsDK9/iviDxzbvJj7m13CsUGuxtRAK0Me8nJqJfexuoZjg1yNqYFWhj7kdf+/3cCxoVxK0MrQh7zpf7dbODaUSwi3MqBcoO3Mzvzu3qR235PQLgpuZahy+weZ7M9DPhbtouBWhlOOu4/fRRHFRpIzNU5M0f0ZfB+3HnNbjKaG7s/EgTU0NUJYQ1ND19OZGtCfCUwI/byl6+met6A/E5gQ+nlL19M9b0F/JjAhsRyyqamh67EP2dTU0PW4h2xsauz20f0ZsE87YDLEMk2NdsAU4Z7M2KcdMOUHK7bvfSr1Xw6rxtZ/4WmU0bHHqpnfeJwyOgLYPxPgLSon0ugIYEuO/mJh0ugIYNW/ESSIDaJkscd9JzCIDaJkser0DMawQZQw9vwChNBBlDD28mr4ZQgdRAlj1c71ywg6iJLG3twWhQM6oyODXb67V0bdGxmsephVRt0bIawng+6NEfYR3vs9tU5pTJEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492368496;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1111,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1150,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.345;4.blob,1.1,2292.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;3.end,1.1;4.sync,10.6492368537;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1101,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1140,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1081,3.345;4.blob,1.1,416.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAPCAMAAABXwPhJAAAAclBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExOQtl5TAAAAgUlEQVQ4jWNggANGJiZmFlYG3ICRDY8kHllGdg5OLm4eGhjMCyT4+AVoY7CgkDBtDGYQEaWRwWLiQ81gCRoFhaQUjSJPmhbJDZhBZJiolkFk5cBAHpylFVgUcckSazBcB9A4EFDCoRpZliiD4TqUVcBAFbtqFFmiDMZvHl6txMkCAIIACmtTKGhfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1061,3.421;4.blob,1.1,1872.iVBORw0KGgoAAAANSUhEUgAAAIsAAABcCAMAAABp/LZaAAABtlBMVEUAAADIyMhkZGQGBgYICAgDAwP///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwsCAgIFBQWpqamjo6NMTEywsLAPDw/39/dFRUUjIyPk5OTCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0uLi43NzfBwcGTk5MMDAwBAQHr6+t/f3/n5+eCgoInJyf29vZISEhiYmLu7u61tbUZGRlQUFCkpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKwRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIJCQlsbGzR0dGgoKBmZmYvLy/7+/u5ubmxsbGNjY0QEBCFhYWtra1ERESWlpYzMzMpKSm3t7dfX19nZ2ehoaE6OjrExMSXl5cODg6GhoaoqKhGRkbm5uZjY2OLi4stLS0fHx/Q0NB8fHxycnLZ2dn8/PyVlZVZWVns7Oz5+fmcnJyfn5/X19fLy8v+i2VIAAADf0lEQVRoge2Z6VvTQBDGw5WqoCIoFA+qIqhIEaGIIghVKV6IKIgXeID3reCteCuK139sk5aEZGdnZ7tpGzXvhzTPZnbm93RD92VW02AVFHIeeChqjYBFLU5FAYtajYBFLU5FAYtaDSauqNhUiVd3dg3HGImlQDcV8urOruEYI7EsWmxqiVd3dg3HGIklC8pFjUD/nxa+V6Vl2FNqFm9Yykp9w7J02XLfsJSvyLiG1ywVlSt9w7KqqlqVJWxufjXCOyHL6jXYUxLLWnPzWye8E7HURtYrs9Sam98G4Z2IpXBjWJlFUVaWuk0KNbxlqW/Y7BuWLVtVanjL0rjNPyxqNf49lkCB5MQ6S1vevrtN0ebtLTuwCNZZZomltS3WvrNjFxIBOMsssezuLDaMwx5+BOAssRpd3ZHKvT2ZsPTG9xnX/Qe4EYyzrEl1JsJwjb5EtP/gocMcFsdciyH9eUQ/anzE+GaKcZYDqc7EMZhl8HiFpg3pJ2AWe67lJ8Mnh0dOJR+Vjzbpp42YM3VcFsZZ1qc6E2dhlqoW4xo/B7PYcy0/eX5s/ELi4qXLE9VCFtZZoms0qV8xPq5eg1nsuZafvB7StBuN+s3Q/Brdus1jYZ0lvkbDqe/lDszimLtAvX13k5c2493VRu7xWFhnia/R/dT78gBmccxl9LAz+TvXrz/ioMDOkqlhayoyPfS4IyqMg9RaGWt/En+qcXqMsLPEajx7Hom/eJkRizY13Tz2ytgDwB4j7Cxla0h7KU6PMS8sGclPLIECGcK7l3AcNZ8KS848pnhu7jymeK6kx8wmi6THxPOBHpPOkvaYdo8R9y94Pp5/IbKkPabdY8T9C54P9y8ilnmPafcY87dGsh4Tz6e2RrIeE8+ntEbSHlMxDptL9JjU03AlFqLHpJ6GK7EQ46in4blg8SwuECvdUr5J/iqWnuFxeB7mO0kCMou+l4HX8DjmO2liM4tYZhLMv+mGUN9JE5tZxFLy5i00jPpOmtjMwnf3XTcwCJ2aS4vJLGR53/CBHYROzaXFZBb/TX/8xI5Bp+bycmcWs3z+wgyBp+bycmcWs4zOdrmHwFNzebkzE353p7+6R8BT8wzkykxg+TZX5BwQ+U6yXJkJLJMTRjtaordJliuz/j1iahbZG38MalK9TbqcmfX06/NTtE9L9DYlZWXWf/02Ned/z5Anlj8Ci3dhb6VUCAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492368577;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1182,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1130,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.508,1.8,1.3;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1122,3.248;4.blob,1.1,1368.iVBORw0KGgoAAAANSUhEUgAAAE4AAABLCAMAAADpuUGcAAABj1BMVEUAAAAkJCR1dXXFxcVERETu7u4hISEMDAyKiorh4eH19fW5ubksLCwDAwPa2tpwcHAHBwfAwMC/v79UVFRISEiSkpLr6+seHh5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmrq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf39/q6uo1NTXExMTt7e0xMTGsrKzg4OATExP///9dXV2cnJwuLi5HR0eWlpbS0tIJCQknJydCQkJxcXGCgoJGRkavr6+AgIABAQE+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl5JSUkGBgb6+vpkZGT29vb09PQrKytlZWUICAjs7Ow7OzsZGRkUFBTGxsaVlZVnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXkaGho6OjrNzc2FhYV6enoYGBjPz88PDw+ioqIVFRW9vb0ODg5WVlbo6Oh/f3/X19fT09OdnZ3e3t6IiIj5+flsbGxvb2/m5ubMzMx9fX3l5eUpKSlFRUVLS0tr0C+EAAACLUlEQVRYhe2Y6VdSURTFn4aSKEo4QZIp0YCaVg9JTdMoowhpcgA0bLbJTMuhQUvrD3etG89z31udwz138a33+3L2Wpt3P/Bhr722YWhRo/cZQu2xar7mqasX13u8wdfYZFd8/M0t4gZOBFvb2js6ZaVByOcVN3yyK3Kqu/u0rDTo6RUneiZ29tz5C/E+SenQHxZn4GJg0Dt0ybgcAKXx2hUzJG5iOBkxro4Yo2OgNJ67Zo6LO3F9cspI3Eg1S0qDpHlT3FvTt9N37mbu9UhKg5iZFdcTnEnn7j94+EhSGszkHos7OzcfXzAW8rLSoVD8exeXnnhKy3alwdNnZfH8xctXrx2Kz0rujeaX/yYTTFXzufjbd9V8zsi/r+pzfHjx/SFO+8z4bl39SNlWfCuzNkWYVnyr88mXxU0rvhkMr+NeOb45tJldqFeObw4b5mfMsuKbxZdNzLHim8VWEXOs+GaxvYM5Vnyz+PoNc6z45uD//gP1Cuj/gNJkDqHeUXyrs7sXRT2N+P75izDZ8V3a3yBcbnwf7P0mfWZ8j/9h/dzFxcXF5X9HpaVX6uaAUkuv0M0BamSR5haymwPUyCLPLWQ3B6iRxTa3UN0cIEYW+9xCdXOAGFnscwvRzQFqZHHMLXg3B6iRxTG34N0coEYWx9yCd3OAGlkccwvezQFqZLHPLVQ3B6iRxTa3UN0cIEcWeW6hujmg3NLJbg4otnS6mwNqLb1SNweUWrpaNz8E5SmWbPHZnwQAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.345;4.blob,1.1,416.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAPCAMAAABXwPhJAAAAclBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExOQtl5TAAAAgUlEQVQ4jWNggANGJiZmFlYG3ICRDY8kHllGdg5OLm4eGhjMCyT4+AVoY7CgkDBtDGYQEaWRwWLiQ81gCRoFhaQUjSJPmhbJDZhBZJiolkFk5cBAHpylFVgUcckSazBcB9A4EFDCoRpZliiD4TqUVcBAFbtqFFmiDMZvHl6txMkCAIIACmtTKGhfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1051,3.421;4.blob,1.1,1780.iVBORw0KGgoAAAANSUhEUgAAAJQAAABaCAMAAABpAI8iAAABiVBMVEUAAADIyMhkZGQGBgYICAgDAwP///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwsCAgIFBQWpqamjo6NMTEywsLAPDw/39/dFRUUjIyPk5OTCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0uLi43NzfBwcGTk5MMDAwBAQHr6+t/f3/n5+eCgoInJyf29vZISEhiYmLu7u61tbUZGRlQUFCkpKRUVFSqqqra2tpHR0dBQUFAQECsrKwRERGMjIwJCQlsbGzR0dGgoKC5ubmxsbH19fWNjY3l5eWFhYWtra1ERESWlpYzMzMpKSm3t7dfX19nZ2ehoaE6OjrExMSXl5cODg7i4uKGhoZKSkqoqKhGRkbm5uZjY2OLi4stLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/PyVlZVZWVns7Ozy8vKcnJyG3dqiAAADaUlEQVRoge2a91cTQRDHl3YWsBHFoEJUBBtBpIgiCLGADREbNuzE3nsvf7neXbi9ZOfmZvZ2Iz7v+0Oyb8vM5zH3uO+brBCwamojFgyKnSOFsnZAQymUtRwplLUDGkqhrOVQDtTVe2owNZI5IlYpUDWOpyWmRjJHxCoFaukyT8tNjWSOiFUKlAVVI0eqVKjCD2FjE7ZKjWJA4XBNjbrJ7EGtWLlKN5k9qNVrtJNZg2rOrNVOZg1qXct67WSlfVnvPdvKGMVBbdiIrZKgNnnv2TbGKAaqPbc5MVS7957dwhjFQNVuzSaGMqUgXMe2BMksQXV2bU+QzBLUjp1JklmC2rU7STKL7z79ZP8DVKpU5qWaYCkTD3p3vmdP714eE2CCacmI+/r6Bwb3De3nMQEm2CjUgeF616scZEEBJhhLNjKayxwao0ONFw67n0eOcpgUE9zqt2mycLJjE/nJ4ydORkCVnfV1yjntfg20hVeBfWVSTPCU36Y5A0NNn20WYsY5B0PJs4Hh7XbOuysXOsKrZTkAKSa402/TXIShWnrdz8IlGEqeDQxvCEquluVQpZpgtHyzzmX368pVGEqeDQxvqXzXrjPKp5pgvHxz/l/qBgwFlGW8333Qxc1bjPKpJhgv323/mboDQ0FluTv85x/npHOPXj7YBCvJpOZzxZn7Q/nYfVJ9mYHBB4WH8CLYm4VNMJbs0eNc4clTBpSYL/Y8ex7xmgF7s7AJpiXT2Vcpem+2ilBaWpRQqVJRhfeE4X3UeNrCe8L8ZKahbNthuvCeMD+ZYSimHcbjxdlcKlTJDst+Le6n8HhxNpcKVbLDsl+L+yk8XozNpUIt2GHZr10E5ePaYTyeofJx7TAez0z52HY44T5SEKIdpl6HMANFtMPU6xBmoIj7qNchqgplbF8qnpwF/W2QsP5BqLG5F/AxzCKTFBk5HkpMvYTnMYtMU1RkAtSrCaVX4Qq1yDRFRKZANbx+A02jFpmmiMgUKPF2FJiErk2wBUamQb3req9OQtcm2AIj06DEh4/qHHRtgi8oMhHq02dlCrw2wRcQmQr15etI5RR4bYIvIDIVShS/Vc6A1yY0pEYmQ33/UVc+EWeRyVIi06Fmf7o/CTA6xmRVRg5GhBfyr2nB6hjTVRE5GFFdAqNjzBRgoAOo35HTboI98eFTAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368618;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.57,2.14,1.1,1.0,3.361;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,4.1081,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1061,3.345;4.blob,1.1,416.iVBORw0KGgoAAAANSUhEUgAAAFgAAAAPCAMAAABXwPhJAAAAclBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExOQtl5TAAAAgUlEQVQ4jWNggANGJiZmFlYG3ICRDY8kHllGdg5OLm4eGhjMCyT4+AVoY7CgkDBtDGYQEaWRwWLiQ81gCRoFhaQUjSJPmhbJDZhBZJiolkFk5cBAHpylFVgUcckSazBcB9A4EFDCoRpZliiD4TqUVcBAFbtqFFmiDMZvHl6txMkCAIIACmtTKGhfAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1041,3.421;4.blob,1.1,1716.iVBORw0KGgoAAAANSUhEUgAAAJ4AAABICAMAAAAwPLx7AAABqlBMVEUAAADIyMhkZGQGBgYICAgDAwP///9gYGAoKCg0NDQTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwsCAgIFBQWpqamjo6NMTEywsLAPDw/39/dFRUUjIyPk5OTCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHAMDAz19fVKSkqkpKSoqKhGRkb29vYODg43NzfBwcGTk5Pm5uZjY2MnJye4uLhISEhiYmLu7u61tbUBAQGLi4tUVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS0fHx8RERGEhITr6+uMjIxaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwJCQlsbGzR0dGgoKBmZmYvLy/7+/tycnLZ2dmNjY0QEBD8/Pytra1ERES3t7eVlZUpKSlfX1/t7e1ZWVns7Ow6OjrExMSXl5dQUFCcnJwqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoaxF8T/AAADFklEQVRoge2a+VPTQBTHw5WqoCJVKCpURVCRglZQKWoVUUSligeK910Rb1AOFfG+/2ebpGTT7uvu2yPBGfP9IbxM3vEZtu1+ZyeGAausvMQDjVKYEeKFeEoK8VQU4qkoxFORTryKSltVuiIyg5uHwSszbUV0RWQGNw+Dt2y5rRW6IjKDm4fB80FBzAgVSrO8H9vqGtZTbBet8jauqZYdGwTeylWrZccGgVe7RnpsAHh10bXSYwPAW1ffID02nxez9/dGqYiHt34D6ykKb6O9vzdJRRy85vgmZbxme3/fLBVx8Mq3xJTx9Mtt3LJVYazveK1t2xTG+o63fYfKWN/x2neqjA1kz5Uf+7/ihQq1dKItPJFPX42ORCc6l7bw4mNFv7ldu7CZgIUXHyuKtzu5B5kJWHjW2O6eeHRvBz+Prap9+3GJlIVvdI60YvDY3mSq78DBQyXwCmoXlQYi43APDo+y8F3OkdYRGK//aJ1hDJjHYDxS65r02PHE4Inco9ohEuUuJ9tOofAoC9/qHGmdhvHqh61r5gyMR2pdk352pPNc8vyFi6MNJLJSL13G0NEWnrm4Y+YV68/VazAeqXVN+vWIYdxoN29GPJGlW7cxeLSFZy9uwvnv3YHxCmo9SvfeLY6G7nUj8GgLz17c+85n7wGMV1DLUfYhPwe28NRYovF4duDRRIqbx9fjJxXeW/A0HLbwrLFPn8Uzz6nfVAm8sdEXBR2g03DYwouPlbGjL/u9d/jT8IDwNOgfxwsVSrfY5/FwHrafo8nU1Kvh16JcQDtfzPz0zOzcm4m3wmBUO3/M/Lv5SstVvRdHK2onaOZxeenMgnX98FEUrLidoJln93NrP5n2hjrb5O3HjmC8vJknJ+Rsv8fGc2snzc/W/ZcWbz92BOPlzTw5IWf7PTaeW+vBI/3YEYi3aObJCbnOxf36TXFxRc08G8+tTc8sWPeD3xUXV9TMs/FI7Y/53E9yn/lTbXGFzTw2bzo6O/cr8xtXXbId0sxjX6TxaDw7NfJHdVNDmnnsizS6JLho2BdplghPW15J/QXxtXI6pWlM6AAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492368658;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.456,4.1190,2.19,2.14,1.1,1.0,3.456;4.rect,1.1,4.1071,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1051,3.345;4.blob,1.1,1604.iVBORw0KGgoAAAANSUhEUgAAAJQAAABuCAMAAAD268qZAAABfVBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExMkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIDa2tpwcHAVFRX19fVSUlIMDAycnJy9vb2rq6tISEgXFxfq6up2dnYODg5WVlZ8fHzh4eF/f38CAgIFBQUnJydCQkLX19dMTEyTk5Pm5uYuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb28aGho6OjrMzMyNjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0t3d3fU1NQyMjL9/f0bGxuQkJDp6eleXl709PSjo6P39/eKiorOzs7W1tbythv5AAAC70lEQVR4nO2a+VcTMRDHt7GAiK2AWgXBigKCWkXxAlRAQUABq6KICt73wSEeoPC3292+Z9PdScjmYILk+8M2bDqZz2uHZLrv63n/lCBkR7LCYytRyZncYFZWiaqd1btqdsumNQSVKlzSe2ol0xqEqqvfK5nWIJS3b79kWpNQmQOSabcd1EELv76GRgsL/ZBtW0Jh82wiVmyezYcDZYNj5kiyhTUrClWKUBgVUHwdZWSiZ4WgShEKo2OtgdrgTGWzQlClCJWRuDAK3UlS7aG/j3egYJSp80ToxslTORQQqlhPn+kKT549p2VljrrP+9cLFxmh2UuXIyE9vbwGfhOg+nqvRGOuXsOF6k8BMQNkEBXq+g0gZogMG4a66R99IwyoNtIHBTWO+tex4NS8xRgpQRXPPgbUbTIOBU1k/OtkEJlijJSg7vhHX54BdZfcg4LuT/nXXHBqPmCMlKC4NfWQgP/9048EVjYG1TzzGIjJPnmKCeXNZoCYWjKHCvXsefG1rB1+kR9DhXo586p4g26HX6elmVRawFLom7fv/Be6QX3/YQgZquPjp9Dc5/wX6XV1Nctf50M3xhd0LOu0/bS4JBup4VchvE953tKiJJNBqG/L3+2D+pGUZTIH1fDzFyoU2A4vrMj/DNYBBbbDTavSTFqgoHY491vheDNVU5Xd8g2TMaiqP/JMpqC6atiPq9Gg0msKTKag1qNPWmLIyieiDsrJKb70FKHmfcpB8eSgRHPQ7bA9UFQ7bA8U1Q7bA2VlTTkoByWeNnYOB+XkhKXNKEKkfYovByWqLQylvR3mC6kd5gupHeZrC9eUg9IBpcX/C/qO+e/jQmnx/4K+4w3fx/5o9fh/Id+xuGPYmppycjIpugijZgnREtVcyvRyUbMEPhRglsCHAswS6FCQWQIdCjJLxITiO4tFR3RayCwRE4rvLBYdUWlBs0RMKL6zWHREpQXNEtg1BZolkKFgswQyFGyWQIaCzRLYNaWU7H+H+gthk6kANSe7NwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1044,3.478;4.blob,1.1,1212.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAjCAMAAAC0JoimAAABUFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhoacnJyqqqpKdxpMAAAB9klEQVRYhe2WV1PCQBSFw4IVAZVYwI6oYBexUOyoYO+9YO/6/98kuwFTls1mY4Y443nI3od7T76Zu4TDcTZQkN0BikraRxJtH3kWVpzUy2E3/k6T2MrKK4y/0yS2yqpfeKc5bNXOGnmryw3lYWGTzRpnq62rFw4PNHXlKi8P1cDCJps1ztbYBI9maOrLVf4WqFYWNtmsYba29g50QtNOYKWd2rqURtbZaaBb2WqZnfqDPZRztP76VYytt49qLoTuURhfmcTWP0A1x6F7NIivTGKjnBtC92gYX5WW7df6yLOIjd3JdFmQjc/rn02XVGwjo2P4TlJOp5LEOTIenZic0s0GvNP4TlJOp1PBORZPJGdm5/SzzS8s4hqJOZ1OBeellFuIYMu62cIrq7hGYk6nU945nVkTnusbutnA5hamT5XTWSQ6b/M7wpHwSdMdpsKw7Qb31LZiTjcm0TnC7wvHQUCa7jAV7htyeKS2FXO6QSFnCdtPusNUOLbjE5VpPqcbFHIWd3p6pn+n4PziUmmqzulMQs7puPBbAFfXDDsF2RulqTqnswk536Zy3907/p5hp+DhMSS31Mrp1ELOMWci+ZR51mrGsr28ChdCkrC1cjq1kDN4y0bfPxj+swR9fgFZwtbK6fSCzpQi5BBZwi6FCGwl159g+waDH3keC+uOaAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492368699;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.38,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1061,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1100,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1041,3.345;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAjCAMAAABSD0PiAAABtlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwyMjL9/f0bGxsKCgrr6+uSkpKQkJC0tLTJyckEBATp6eleXl6VlZXc3NxLS0v09PQLCwupqamjo6O1tbUPDw/39/dFRUXo6Ojk5OQCAgKDg4OKioohISEGBgYICAgDAwPx8fFKSkrOzs5gYGDW1tZwcHAoKCg0NDQTExMkJCQYGBh1dXXFxcVUVFTPz89ERETu7u6ioqKvr694eHjg4OCAgIAMDAz19fXa2toVFRWkpKSoqKhSUlKcnJy9vb1GRkb29vYODg6rq6tISEgXFxfm5uZjY2Pq6up2dnZWVlZ8fHzh4eGLi4vBwcF/f38FBQUtLS0fHx8nJydCQkLX19dMTEyTk5PQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIg3Nzf6+vplZWX5+flsbGy3t7fGxsYxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjrMzMyqqqqNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpXQNJFAAACSElEQVRYhWNggANGJiZmFlYG3ICRDY8kAVlyADsHivmcXNw8vHzkOoD6zuNgRzGfH0gICAqR6QCqO09YRBTFfJDzxMQlyHQA1Z0nyYJqPsh5DFLSZDqA2s6TkZVDNR/sPHkFMh1AbecpKimjmj+4nKeiimY+2HlqgyRy1TU00cwHOU9Ga5BkDTZtHTTzQc7THSwFC6ceuvnAYlmFaZAUy/q8kGAyMAQDI3ClZsxigqoKIUus8xA6KGExCJhCTWUCAzMcdiLLEuU8hA5KWAzmFhBTLa3AwBq7nSiyRDkPoYMSFjmA3k2CUUAzYIPGt1XGqmyAgJ09moCDo/qAOAQJIJK3k7M+uqSLK1VMxgO03UCkuwcDg6eXCRZ5uCFG3hYYkj5e+Doi1HUeg68fPkP8vTwxZQMCyXUc6c4LCg7BY0goPxbdYUzh5LqOZOcZRUTiMSQqGovuEKYYcl1HpPNiQVVuHMh5DPEJuA2xZvLHpl0rEUTqgOvtJBwsipwHqXPBzkvmTcFpSCpTGjbt6fIgMgNsBj8OFkXOywRVuRFg5zFkxeI0JJspB5v23DwQqQ6ut/NxsChyHiLtMTAUFOI0pIgJaxlSXEKEHdgB6c6zFSzFZYhBWTkW3UYVlXR0HkOVPE5DqjGkgECIqYZMx5HlvNo6A1yG1DdAaJTGfGMEWueJts5ram7BZUhrWRtEALkx3y5AtuvIaqwGdOA0pLOrG0QhN69berDUM7R0Hh5DlHv70OT6I9C67WSaTB0wYSKaQJoidS0gCgAAXrFtW+7kK3oAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1021,3.421;4.blob,1.1,1404.iVBORw0KGgoAAAANSUhEUgAAALIAAAA1CAMAAADS4UE6AAABYlBMVEUAAADIyMhkZGTk5OR4eHjg4OCAgIB8fHwICAjh4eH///+Tk5M0NDTm5uYGBgYDAwNgYGAoKCgTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwsCAgIFBQWpqamjo6NMTEywsLAPDw/39/dFRUUjIyPCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHAMDAz19fVKSkqkpKSoqKhGRkb29vYODg43NzfBwcFjY2MnJye4uLhISEhiYmLu7u61tbUBAQGLi4tUVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS0fHx8RERGEhITr6+uMjIxaWlri4uKnp6cgICBXV1fy8vLQ0NAJCQlsbGzR0dGgoKBmZmYvLy/7+/tycnLZ2dmNjY0QEBD8/Pytra1ERES3t7eVlZUpKSlfX1/t7e1ZWVns7Ow6OjrExMSXl5dQUFCcnJxYRu1wAAACdUlEQVRoge2ZaVfTQBSGA2UtWwVUBIGySEVBRMpS2XeKsosoiwLuCCjb/6dJSCZlbu9kMtMO4eT5EO45cyfznJ5pmTfRNJi8/AwDEnG1RqhAvxYWSbqdIIFyoOx9jVBxSYpSXymHDXylXFaeosJXyj7cy4GyGNlWriwxqJJVkTXwPqKcNteNcp75YxORVZE1mH2UgUvlB+UG1bIqsgazjzJwqZwFcrFGQIAPcX41amqxUbd3yTrOxWprvKqoUn746LFXFVXKdU88qyhSrm946llFkXJjU7NnlZu+qHGeaZFWsZRb27BRV8rtxnnmmbSKodwRey6s3GGcZzqlVQzl/FBUWDk32Iu9eCmgokS5q/uVgIoS5Z7XIipKlHvfiKgoO2PwjvL3ScGHygEB9wc6PhGy9PXri/ezWjArID7xq/D+YgwMsjowKyA+8avwKg8l3uINqBUQnzCV4ZFYQ1kfuw+nqmIUb8CsqPjUYj4qjcIqY4nxicmp6dt3uelLm2sxA1Ta7AhqDIU6Gyo+DZiPSudg5fmFek1LhhdhZTLXDkPRd/H3S6mhumVSpS4r3auYMhTqbKj41GU+Kl2DlZvW9evGB1iZzLXD0ObH/oLE1qfP282k0lt3ijFlKNRZ0PEJ3Ri74T39z5evsDKZa4eh/YimHfSGDyOOSufbd8QYDHUWdHzCN0bc/JR/wMppcx3MjP28XS3/GuaxckDHJ3xj/Db38h9YOW0ug6O/PFYOPzA+USqE49hR8uR0nNnH5t//SpYV+LYIjk+Yytl5bOOC+j/gQXl3+zLTkGUFvgWC4xO/ipcj/tV8phHLCn8LJKhyh1KJUuVrGZFV8iFqvK8AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1041,3.494;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAHcAAAATCAMAAACdgmL0AAABLFBMVEUAAAD///8MDAz19fVKSkp3d3fU1NTV1dVHR0cODg4fHx97e3v4+PikpKSoqKjj4+MVFRVFRUWxsbGVlZUSEhJhYWFGRkb29vYyMjL9/f0bGxtmZmYiIiL39/ezs7PR0dEDAwPm5uZjY2OQkJC8vLz+/v4UFBSAgIAYGBh9fX2Li4vBwcEEBATp6eleXl6vr69PT08tLS1LS0v09PQLCwu/v79TU1M9PT3Q0NB8fHypqamjo6NycnLZ2dkPDw9OTk78/Pw3NzdkZGTk5OQCAgIaGhp6enq3t7fCwsKKioppaWnMzMxZWVns7OwGBgYhISEsLCwWFhaYmJgJCQny8vJQUFAICAjOzs7W1tZISEgdHR15eXmcnJyqqqrIyMhgYGBwcHAoKCg0NDQTExNvEeiXAAABPklEQVRIiWNgoCdghAO6WjsY7GViZsGuhpWNQkuwmMzIyM7BycXNA/IvLx92bWysFNqLxWRGfgFBIWERUZC9YuKc2DRJSEpRai+myYzSMrKMjHIM8kB7FRSVsGlSVqHUWiwmq6qpA+NWVUMTlK60tLHo0dHVo9heTJMVGfRBiUrQAGSvoSoXphYjYxPK7cUwmZ3BFGSvmTk4H1lYYmqxsqbcWkyTUe21scXQYCcrSA170U2GhrOYPdheDQdHdA1Ozi7UsBfdZFUBULpidHWDlFfuwugaPDypYS2GyYxeMsAyw53BG2Kvj68fqnJ/1QDq2ItmMiN/oKBQkJoetHwODgkFkn5hYKAAZGqGU8dadJMZGSMiOaOieWD1QkwskIiDlNjxQGZEApXsRTMZa32UmAQGydSyEovJg6AeHCB7AcJFKEDp3btDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368739;4.copy,1.1,1.0,2.19,4.1200,3.247,2.14,1.1,1.0,1.0;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.380,4.1190,2.38,2.14,1.1,1.0,3.380;4.rect,1.1,4.1172,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.250,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1130,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1090,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1071,3.248;4.blob,1.1,1428.iVBORw0KGgoAAAANSUhEUgAAAIAAAABcCAMAAACRHE2tAAABoVBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkFBQU0NDQRERHIyMhgYGAoKCghbXUPAAACR0lEQVRoge2ZWVNTQRCFBwPRsASICUsGgYAIajQRDQpxIeACogTQiMYF1LC4o+wguAv4q6ncPHQVD8y0nDEq8z2dh+7qrrpzq06dFmKvFLCqD7j2PHAHhUWscvfBQ9j5nuISXkNpGXS+t7yC2VHpO4xcwO8LcFuqqpEL1NSyW4KyDrjAkXp2S4NsxM0PST+/qakZt8BR2cJvOtaKW6BNHuc3nTiJWyAsf+OfOnUat0Akeobd420/i1tAnON/z5jsAC5w/gK7pbMrDlzgYvQSt+XyFeB8IboTPbyG3qsN0AVc166z6m909UHnC9F/k1XeMgCe/0ewpitnugK3bvsGY2plynQlhxLu4PDIHZUyZrrq79al7o2O3lcpYch0xR+E0w8fPXY9UagsRkzX2HjyaaDjmXie3F1la42YrkxVW0pMTIqp6d2VU2zCdL14+apMZF73lCuUgwnT9ebtu5n3H7pnaxTKwYTp8iQiM9G5+YVFhXIwYbqWlldcq2K1X6WymDFdH9fWPb2f1EoYM12fv3z99l1DWdNlTde/abosFovFYrFYLH8ROokYPgcjtBIxeA5GaJ4hwTkYoXuGBOdghPYZEpuDEdpnSGwORmifIaE5GME4QyJzMIJxhkTmYATjDInMwQjGGRKZgxH6Z0hsDkZonyGxORihfYbE5mCEdiIGzsEIzUQMnYMReokYPgcjtBIxm4NZLP8ZP5Yc4ipljLR0cKuUMUp+OmyolDHsJ8j7J9i3RHKvy5u3BTZzr2srbwv8yr2u0DYqD+gBjksp0QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1044,3.362;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAJsAAAASCAMAAAB7AFyuAAABVlBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkoDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEj///8XFxfm5uZjY2Pq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcETExPo6Oh/f38CAgIFBQUtLS3+/v4fHx8nJydCQkLX19eVlZVMTEyTk5M0NDTQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjpgYGDMzMx9fX2qqqqNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0vqE7BcAAABaklEQVRIic2VV1vCMBSGj+DAvah1gooY66AqigvBuje4t7j3/P83kvTB0nLig7RUv4vkJO15+140LUBaCkAfhxP+SwqLDBvFJa4/EUmltCxVlVdUGi9WVVtC/iE1tXSsqwdwCw1cgtjYlNHZLLTY5gatbVyCR3Bntnrb7XPr6PTxCF1+pLWb9NjmJkq9PEJfP9LqIwN5dgvIyQxSNxga5hCCxIP1jozSMUQB8hinMuVGWJjb+MQkTpgiYax3OkLHKAP4OZUptxklGYm5wWwAJ8yReax3YZGOLgpQljiVKTftfQNYXsEJqwT9XKytZ/EAq9wcG5soIRbfQlrF7R0b3WA3ghP29Ptq9smBnW6HRzGUcHyizjF2/mSRLU6lkJ1uZ+eJdINvwkX8UkWqp/qKLa5vclbLzs0Q7226gUa4u3+g0yM7f0qQ1okn428kz26gM9AIzucXw02v0lvuarm7YXn/MGyEPy2k/z5fSB05G0oY4HYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1011,3.421;4.blob,1.1,2152.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;3.end,1.1;4.sync,10.6492368781;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.rect,1.1,4.1101,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1080,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.482,2.28,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1001,3.330;4.blob,1.1,3356.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;3.end,1.1;4.sync,10.6492368821;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1091,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1070,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.508,1.8,1.3;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1024,3.330;4.blob,1.1,1480.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAyCAMAAAB8rFmYAAABtlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NROTk6hoaH+/v50dHR9fX38/PwsLCwyMjL9/f0bGxsKCgrr6+uSkpKQkJC0tLTJyckEBATp6eleXl6VlZXc3NxLS0v09PQLCwupqamjo6O1tbUPDw/39/dFRUXo6Ojk5OSDg4PCwsKKiorx8fFKSkrOzs7W1tZwcHAkJCQYGBh1dXXFxcXPz89ERETu7u6ioqKvr694eHjg4OCAgIAMDAz19fXa2toVFRWoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEgXFxfm5uZjY2Pq6up2dnZWVlZ8fHzh4eGLi4vBwcF/f38tLS0fHx8nJydCQkLX19dMTEyTk5PQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIg3Nzf6+vplZWX5+flsbGy3t7fGxsYxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjrMzMyqqqqNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpfgrwhAAACW0lEQVRYhWNgwA0YmcCAmRBrIAALKxiwEWINBGDnAANOQqyBAKNxSh4YzHE6CjABFyQlcw+0O7ABHkhK5h1od2ADfJCUzD/Q7hgFo2DQAAFBITyyPML49OKXJQeIiCLzxMQlJMm1nfpuExVB5UtJy5BpO9XdJisnjyqgoKhEpu1Ud5uyILqIiiqZtlPbbWrqGuhCmlpk2k5tt2nr6KILDRq36eljCBkMkjg1NDJGF1IzGSR5QdgUo/NhNljKEHMLNAExPdZBUvayS6CHkaWgFaoASouYKLchdFDCYpCyJuh8lBYxUW5D6KCExWBjS9BtKC1iotyG0EEJi2RA77p+FFAb2KHx7TGqtwEDDo5oAmxOhgPiEBhApGdnF3Z0SVc3qpiMB5i6g0gPTwYGL28rdEm4Cdw+mOWLrze+zgR13cbA4ofTBH9vL0ytAYH0c1tQcAguE0LDsGgNZ42gm9u4I6NwmRAdg0VrCGssjd0WB6pO40FuY0hIxGECP6s/Nr0mSSCSGVwhM+JgUeQ2SH0KdluyRAp2E1JZ07DpTdcEkRlgA8JwsChyWyaoOo0Eu40hKw67CdmsOdj05uaBSENwhZyPg0WR2xDpjYGhoBC7CUWsWIuL4hIiLKCW2+ylS7GawFVWjkUrd0UlHd3GUKWJ3YRqVHEIkGGtoafbauu4sJpQ3wChUdrkjZHkz7uQ4bam5hZkF8BNaC1rgxiJ3CZvlyLbaWS1PAM6kF2AMKGzqxtEIbeSW3rQqxEau40BxQUIE3R7+9AU9UdidLRJAFRtsU+YiCaQpk1F00kHAMBiU8zFC9ljAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.991,3.402;4.blob,1.1,1568.iVBORw0KGgoAAAANSUhEUgAAANAAAABICAMAAACwT4toAAABX1BMVEUAAADIyMhkZGTk5OR4eHjg4OCAgIB8fHwICAjh4eH///+Tk5M0NDTm5uYGBgYDAwNgYGAoKCgTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUUCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHAFBQVMTEywsLAjIyMqKiq4uLjx8fGEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0uLi43NzfBwcEMDAwBAQHr6+t/f3/n5+eCgoInJyf29vZISEhiYmLu7u61tbUZGRlQUFCkpKRUVFSqqqra2tpHR0dBQUFAQECsrKwRERGMjIwJCQlsbGzR0dGgoKC5ubmxsbH19fWNjY3l5eWFhYWtra1ERESWlpYzMzMpKSm3t7dfX19nZ2ehoaE6OjrExMSXl5cODg7i4uKGhobXqs7OAAAC9ElEQVRoge2Z+VfUMBDHC4iuBU8QlRVUVhC8EFkQFjk8WFBRUBHv+wZv/f+f2xaaYqaTNDOUdl8+P3TzXjKZ+b5Ndvt94zgwDY0xE4nAd9HK0bTDezbvpO1iBRntYgWZ75IlQbsKNXbXkSDXp44EtbTW2FNHguruDllBpGWkXawgbJe9BZ99pGRKGATp5mgIft73p5IsjRwHWn0OppJsG3NYLBYm0rhqPP9DjtPWzpWMCJeg9jauZESYBB3qOMyVjAiToCNH2ZIR4bHgncVjbMmI8Fjwru7jbMmI8FjwEyf5khFhuUM9pVN8yYiwCGps6uVLRoRFUN9pxmREOAT1D5wxTCYsLs9I5MDXCUHgLmfPSfVpChIWl2ckcijXIRU45y9Is5qChMXlGYkcynVIBdCspqAtwJpniyVHRC+sbHF1r3OGrn20FNni5lsQYHHzLQiwuLkWBFncXAuCLG5CQb3+e+NgSiOVIMjiJhR00X9vHEpppBAEWtyEgnr898ZLKY0UgkCLm+c7BFrcHAuCLW6OBYUWF5zV3SUDbJQSWlxwVneXDMDT7rWCLBZLdsF6yxw/CsPlkebRy8lqIsVivWUGQWPjlYkrk1MJiyLEor1lBkHTMwXvnf9qsqoIsWhvWS702vVSseWGet0Gs9U57zl/M1FRhFjJeA8G7YrAS0iF3rpdXrhzd/H/XdbXbYoNWHLveR+Voeis5kgRCyMZ7/tBu+IBLGj5YafjrLiPYEEiNjTKw+5jb+ZJX3RWc6SIhZGMd3/QrngKC+oe9Z7VZ7AgERsa5UhRYlZzpIgFkY03euSeuy+8j5evYEEiNjTK68fm9RvzIxcXCyIbb/zIvQ2+oXewIOA4zI57F9t5/8HgyCliQWTjjR+5j8Ed+gQLgo7D55naH+OC+8XgyCliIVS9ZUnQamlt5etkWblOMFasTHyrfkfTGMXiveUY5EJ//CxVf/1WrxOsro38+Wv46oPF4r3lGLJs8PDecgxZFmREhgX9Azx6jMKK68EWAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1011,3.497;4.blob,1.1,748.iVBORw0KGgoAAAANSUhEUgAAAKgAAAAOCAMAAACM0Kd1AAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAABGklEQVRIia2O604CQQyFB7sIyEUuiqAgCCggIioi3lARef9XYnYSQ6btJu1mz4/JpDmXz5jUAbAK0vxdrMhmwQbNGjjM8N50oOOiimqWbJCsgWzuiHPmC0UlF1FEs2iDZA2Ujsucs1LVkyFFNIs2SNYA1E4Y42n9TE+GxTYLN3DWgjaa59R30WrHIENim4UbOGtB4bJDfd2rOGRYXLN0A2VD0F6fuAbXN2oqRkyzeANlQ9DhaIxdt5M7NRUjplm8gbIhKEzvsWv2EI8MizbLN/ysA318mvue5+YiHhgWaVZs+FkH+rJ8te/8zalkv+8fCUByzZoNP+tA4XNln69vpx/7Xf8mBIqbVRte1uzvmz+nbVKMXLN+4z+xA2ixQq/CySghAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368860;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,4.1081,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1060,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1014,3.330;4.blob,1.1,1480.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAyCAMAAAB8rFmYAAABtlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NROTk6hoaH+/v50dHR9fX38/PwsLCwyMjL9/f0bGxsKCgrr6+uSkpKQkJC0tLTJyckEBATp6eleXl6VlZXc3NxLS0v09PQLCwupqamjo6O1tbUPDw/39/dFRUXo6Ojk5OSDg4PCwsKKiorx8fFKSkrOzs7W1tZwcHAkJCQYGBh1dXXFxcXPz89ERETu7u6ioqKvr694eHjg4OCAgIAMDAz19fXa2toVFRWoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEgXFxfm5uZjY2Pq6up2dnZWVlZ8fHzh4eGLi4vBwcF/f38tLS0fHx8nJydCQkLX19dMTEyTk5PQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIg3Nzf6+vplZWX5+flsbGy3t7fGxsYxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjrMzMyqqqqNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpfgrwhAAACW0lEQVRYhWNgwA0YmcCAmRBrIAALKxiwEWINBGDnAANOQqyBAKNxSh4YzHE6CjABFyQlcw+0O7ABHkhK5h1od2ADfJCUzD/Q7hgFo2DQAAFBITyyPML49OKXJQeIiCLzxMQlJMm1nfpuExVB5UtJy5BpO9XdJisnjyqgoKhEpu1Ud5uyILqIiiqZtlPbbWrqGuhCmlpk2k5tt2nr6KILDRq36eljCBkMkjg1NDJGF1IzGSR5QdgUo/NhNljKEHMLNAExPdZBUvayS6CHkaWgFaoASouYKLchdFDCYpCyJuh8lBYxUW5D6KCExWBjS9BtKC1iotyG0EEJi2RA77p+FFAb2KHx7TGqtwEDDo5oAmxOhgPiEBhApGdnF3Z0SVc3qpiMB5i6g0gPTwYGL28rdEm4Cdw+mOWLrze+zgR13cbA4ofTBH9vL0ytAYH0c1tQcAguE0LDsGgNZ42gm9u4I6NwmRAdg0VrCGssjd0WB6pO40FuY0hIxGECP6s/Nr0mSSCSGVwhM+JgUeQ2SH0KdluyRAp2E1JZ07DpTdcEkRlgA8JwsChyWyaoOo0Eu40hKw67CdmsOdj05uaBSENwhZyPg0WR2xDpjYGhoBC7CUWsWIuL4hIiLKCW2+ylS7GawFVWjkUrd0UlHd3GUKWJ3YRqVHEIkGGtoafbauu4sJpQ3wChUdrkjZHkz7uQ4bam5hZkF8BNaC1rgxiJ3CZvlyLbaWS1PAM6kF2AMKGzqxtEIbeSW3rQqxEau40BxQUIE3R7+9AU9UdidLRJAFRtsU+YiCaQpk1F00kHAMBiU8zFC9ljAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.981,3.402;4.blob,1.1,2160.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;3.end,1.1;4.sync,10.6492368901;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.456,4.1190,2.19,2.14,1.1,1.0,3.456;4.rect,1.1,4.1180,3.231,2.20,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1174,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1092,3.210;4.blob,1.1,1300.iVBORw0KGgoAAAANSUhEUgAAAGwAAAA4CAMAAAAvp+0eAAABj1BMVEUAAAAkJCR1dXXFxcVERETu7u4hISEMDAyKiorh4eH19fW5ubksLCwDAwPa2tpwcHAHBwfAwMC/v79UVFRISEiSkpLr6+seHh5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmrq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcELCwvf39/q6uo1NTXExMTt7e0xMTGsrKzg4OATExP///9dXV2cnJwuLi5HR0eWlpbS0tIJCQknJydCQkJxcXGCgoJGRkavr6+AgIABAQE+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl5JSUkGBgb6+vpkZGT29vb09PQrKytlZWUICAjs7Ow7OzsZGRkUFBTGxsaVlZVnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXkaGho6OjrNzc2FhYV6enoYGBjPz88PDw+ioqIVFRW9vb0ODg5WVlbo6Oh/f3/X19fT09OdnZ3e3t6IiIj5+flsbGxvb2/m5ubMzMx9fX3l5eUpKSlFRUVLS0tr0C+EAAAB+0lEQVRYhb2XV1MCMRSFo6IooiLYQewFG+oqNuwFRcDeFXvvvWP94Q6RdXTiZLO5G87LPQ+ZfI/fHISEJkbs938SGxc9li4+AV99YpIh2SiWlZKahq8p3WzJyMzKFgrLMejxzc2z2vLt9gKhsMIifIpLSsvKKyodVUJh1bn41NSa6vTOetRgEshqlHLwbWp22VBLK2prFwjrkNz4dnZ196Cm3r5UgSzkkvrxHRgc8gyPeEcLRcJKJR++OrPfExgbn5gUCfMHpvCdnpl1zKG5eZEshBYWv+/S8oouuCqWhdbWI2Vjc2t7RzBsN7AnmPA7XnNf9GCO/YPowdD8YRRhkLBI/sihDYtJ8pbjEy1YsuQVctqjAUuWvFLODD44TJa8YprP4bCI5JWTIVnBsIjklXMhXUJZsuQZcnUNhcmSZ8jNIhQmS54ht3dQmCx5htw/QGGy5JWT8vgEhf1IXjFGyQmG/UheKc+hYjCMWfIvr2AWs+SDbxcawNgk/x760IDFKHn3pyYsjaJu08PEr3LTg8RPbnp6g4if3PT0BhI/uenpDUHET2x6eguHX/zEpqe38Ftu8ZObnt7wY17xk5ue3nB4xU9uenrD4RU/uenpDYdX/OSmp7dw+MVPbnp6QxDx/7Pp6Q0ifo5NDxC/6k0PEb/aTQ8Tv8pNzy/+L8LElmycHz5PAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1031,3.267;4.blob,1.1,1356.iVBORw0KGgoAAAANSUhEUgAAAIAAAABJCAMAAADCB96FAAABoVBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkFBQU0NDQRERHIyMhgYGAoKCghbXUPAAACEUlEQVRoge2Y21NSURTGd5IoIagoRh5veCWzoFIrMRO1vItlatlNDdPMSq2Usnt5yb/a4eB2vWyGs5qPYUb27+l7WGvWN3P2efkJkZ4zFmaIPBtr3AJn81nj9oJC7H3HOSdvocgFve8uLmFulHrKkAXKPV7uSsV5ZAHfBfZKpVEFLFBdw16pNepw9/1GOX+pvgFXoNFo4i81t+AKBIyL/KXWS7gCbcZ//FOXr+AKBENX2Tvua9dxBUQ7/3t2GJ3AAjdusldudYWBBbpDt7krPXeA94XojfTxFvoHaqEFbHfvseYHu4ag94UYHmGNN42C72s0Go1Go9Focg0rRgzvwQhLRgzuwQhpxLxj456JjlQJ7cEIacSikxF75f0HU+oE92CENGI1D6umZ2ZnH6mTQHsw4tiIhR+3zT15+sz2XJkSYD0YcWzEXsxHF7ydi+JlVJUSE1APRkgjFqsITIulV2J5RZXMEaQHI6QRe736xiVia33FymSC9GCENGJv371f39js/eBTJhOkByOkEXNEguuhj5+2tpXJBOnBCGnE4p+/2HbEzrA6JcB6MEIasa/fvjv6f6RKAu3BiBMj9vPX7z9/Uya0ByMsGzGwByMsGjG0ByOsGTG8ByMsGTHtwTSaU8Zu3CScLmWMOcPEni5lDOeeyX66lDH0J8j6J8hZgsnX5c5agYPk6/qXtQKHydflPwKIXb18Mr2BkAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.994,3.362;4.blob,1.1,1920.iVBORw0KGgoAAAANSUhEUgAAAM0AAABdCAMAAAAxBBIYAAABm1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkoDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEj///8XFxfm5uZjY2Pq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcETExPo6Oh/f38CAgIFBQUtLS3+/v4fHx8nJydCQkLX19eVlZVMTEyTk5M0NDTQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjpgYGDMzMx9fX2qqqqNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0t3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl709PSpqamjo6P39/fCwsKKiorOzs7W1tY8PDwmJiahoaH4+PiEhIRgGjV+AAADv0lEQVR4nO2bZ1sTQRSFV7BEFI0KxoKgIq6xEBVFUUSxdxAVu1iwV8DeSyw/W3bzZLPl7p12TWbyzPmwTDJwz7wfZjeHO3EcUDNirxsa4d8zQjNnxd6YPSdTk4XIa25TeTRvfnN8csFCksqIsou86+IljtPSulTBLO6ZW7Y8MbmidSVBZUwVGqdtlbxXwrO9tSU527GaoDKmEM2atZ3yZnHPdV3A7Hp3g3plTCGaXH6jtFfCc9NmYLbT3aJeGVO2uzCtrR6Ns227tFfcs8dth6Z37PSuvZ5lYVfKiFEZVdb15dPs7tsjtHTEc6/bD03vG/Cu+33LrpQRozKq7IHBaeV9Gudgt8jKMc9D7mFo+shR75rxLAePpYwYlVGF9o3jHD/Bv27c86QL3oxPnVaujCpC03DmrLRb1HNo+Bwwmxs5r1wZVYTGuTAg7RbzvAhVGnUvqVfGFKW5fGVI2i7qefVa6eeQf68q5PwX1/O96pUxRWlu3ByLrIB3lPS8NXy79EbpnnnHf3F3XBqGjyamjnuRFfCOAM/7Dx56Px7596rBHm889ljhw4YMjRNdAe8I8Gx88jRW9ln+ueSCopVrohcvY2/0T9RkHVZWBmhySvYv8X0u8bwh8Jia5HAlcQJETfPq9RsOVwonSNQ0b99xmJI4QSKmef/hI4cphROocJIm8Jj4JP8PTQqaUJIm8Pj8hcOTxAlUJEkre2S+KnwU027fNGXlA4x+NN++c1iSOMEipWnuG+WwpHBKESnN+A8ORxKnFJHS/Ez2BQREQKOFR/WcLI2VlRVb2uxQxeeNgJNiFUsjV8XSiFapRpIWcFKs8t+TdNAV14dGIUkHXXF9aBT2TdAVrwsaMSfFKpZGropxNHydaCVVMa1xdqIJnKRmBT04O9EETlKzNB5WVlayqsbeonne4D3zkodJNFjP3DgatGduHA3aM9eNhpWk8Z65bjSsJI33zHWjYSVpvGeuGw1j3zB65obRMHrmhtEweuZm0bB65ik04ieqmeetkQxcGVVowCpBzxz1SNCIn6hmnrdGMjCQhuHZoGeOeiRoxE9UM89bIxkYSMNys5rtGwM8rKzqU+Hdk0yqvHurJnuwrXSHLqasI5lUtab5VSyO/C4Ww18MCq0DSKpa00zrz9/UdQBJ1VwaKKmaSwMlVUEa/FvU1COUBkqqgjT4t6ipRxgNmFQFafBvUVOPMBowqRq7b8CkaioNnFS1pkGenvDpbq1pKp9sgkxdXgd8ultrmpB9OVPT9F9rTBNk6rqgKesfD6ov+YKzzg4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.984,3.478;4.blob,1.1,1348.iVBORw0KGgoAAAANSUhEUgAAANcAAAAjCAMAAAAwoG+IAAABUFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhoacnJyqqqpKdxpMAAACXElEQVRYhe1YWVvTQBQNoYgIbVmC2ioKBdlxgYJ2wQXK7sLmwqLWBURZ/P9vNjNpO8ncJnfuUD+bz/PQmYd7Ts75eiftXMNoMitojpg1Idb5AVvnz1VX8XANUSHSjOFh9dVRp1wtV1oxPKy+OuqU62obiofVV0d9cl1r73CXRmMMcaUnOXUuLtGbDlfI1dnVbS9xZiha2vVYDL1KT3LqXFyiNx2ukOv6DbbcZIYSpV3yFsNtpSc5dS4u0ZsOt5qr785dvjJD/WZY+rBpwGsiHH2YGvSWhqIPk0P3kDysvjrqkWt4BMUb5edmDN6RHNX0psOt5BqfQPEMfm4m4R3JUU1vOlxDsb+m+Lm5D+9Ijmp60+Gq5rq0On+ufi66i38aIctllfE/V0NAyvXg4SO40m82gIKgPD2Tnp17TJPBceXvq+cJXOk3G8ChopzJ5vLzT5+RRJBcOdfzFwtQoe9sAIeK8mIhZl+DligiSK6ca2x5BSr0nQ3gUFZeXVu3PzdeEjSwXOC98eo1UCfNBihwlN9Ym/aSS4i3M+QOywVybQ1ty5ac2YAeHOVpa8dedlPi7Qy5w3Kh9/zbd7IlZzagCa4seKvezpA7LBfK9f6DZKg8G9AEV3Z6aW+f3oeBXCjXweFHryF5NkACV17N2mff/PSZ0IdYLpTLLH7xGpJnAzRw5a+F0u/qN+s7oQ+xXDDX0fGo207QbAANrpxpz+V/rJ2QFJBcMNfPX3YTC7f6oNkAGlzZPC2mz86J/6NwXDCXefHbdN3qg2YDeDDlvwA4F4PrVt9o8MnV0Ah9rj9KL6sfQoagqgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492368943;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1061,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1040,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.994,3.330;4.blob,1.1,1480.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAyCAMAAAB8rFmYAAABtlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NROTk6hoaH+/v50dHR9fX38/PwsLCwyMjL9/f0bGxsKCgrr6+uSkpKQkJC0tLTJyckEBATp6eleXl6VlZXc3NxLS0v09PQLCwupqamjo6O1tbUPDw/39/dFRUXo6Ojk5OSDg4PCwsKKiorx8fFKSkrOzs7W1tZwcHAkJCQYGBh1dXXFxcXPz89ERETu7u6ioqKvr694eHjg4OCAgIAMDAz19fXa2toVFRWoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEgXFxfm5uZjY2Pq6up2dnZWVlZ8fHzh4eGLi4vBwcF/f38tLS0fHx8nJydCQkLX19dMTEyTk5PQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIg3Nzf6+vplZWX5+flsbGy3t7fGxsYxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjrMzMyqqqqNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpfgrwhAAACW0lEQVRYhWNgwA0YmcCAmRBrIAALKxiwEWINBGDnAANOQqyBAKNxSh4YzHE6CjABFyQlcw+0O7ABHkhK5h1od2ADfJCUzD/Q7hgFo2DQAAFBITyyPML49OKXJQeIiCLzxMQlJMm1nfpuExVB5UtJy5BpO9XdJisnjyqgoKhEpu1Ud5uyILqIiiqZtlPbbWrqGuhCmlpk2k5tt2nr6KILDRq36eljCBkMkjg1NDJGF1IzGSR5QdgUo/NhNljKEHMLNAExPdZBUvayS6CHkaWgFaoASouYKLchdFDCYpCyJuh8lBYxUW5D6KCExWBjS9BtKC1iotyG0EEJi2RA77p+FFAb2KHx7TGqtwEDDo5oAmxOhgPiEBhApGdnF3Z0SVc3qpiMB5i6g0gPTwYGL28rdEm4Cdw+mOWLrze+zgR13cbA4ofTBH9vL0ytAYH0c1tQcAguE0LDsGgNZ42gm9u4I6NwmRAdg0VrCGssjd0WB6pO40FuY0hIxGECP6s/Nr0mSSCSGVwhM+JgUeQ2SH0KdluyRAp2E1JZ07DpTdcEkRlgA8JwsChyWyaoOo0Eu40hKw67CdmsOdj05uaBSENwhZyPg0WR2xDpjYGhoBC7CUWsWIuL4hIiLKCW2+ylS7GawFVWjkUrd0UlHd3GUKWJ3YRqVHEIkGGtoafbauu4sJpQ3wChUdrkjZHkz7uQ4bam5hZkF8BNaC1rgxiJ3CZvlyLbaWS1PAM6kF2AMKGzqxtEIbeSW3rQqxEau40BxQUIE3R7+9AU9UdidLRJAFRtsU+YiCaQpk1F00kHAMBiU8zFC9ljAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.961,3.402;4.blob,1.1,1764.iVBORw0KGgoAAAANSUhEUgAAAO4AAABICAMAAADGdTnjAAABcVBMVEUAAADIyMhkZGTk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6P39/dFRUXCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCkpKQ8PDwmJib5+fmhoaEODg74+PiEhIQMDAz19fVKSkqoqKhGRkb29vY3NzfBwcFjY2MnJye4uLhISEhiYmLu7u61tbUBAQGLi4tUVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS0fHx8RERHr6+uMjIxaWlri4uKnp6cgICBXV1fy8vLQ0NAJCQlsbGzR0dGgoKBmZmYvLy/7+/tycnLZ2dmNjY0QEBD8/Pytra1ERES3t7eVlZUpKSlfX1/t7e1ZWVns7Ow6OjrExMSXl5dQUFCcnJyA4wQSAAADdUlEQVR4nO1b6V/TQBANh1JbKIqAgoqgoFVBRepJ0YLggSIeqHgi3jfe119vrjZpdrKzm0mbo/s+lCG7s/NeSTbJ+w2aBqOl1WdACvxVhGq0tRufmzbTVsGg5Ia+ipLLotnkdmR0bGkauVkTgeTmjG8q01kTEaigCENuV15HdyC5W81valtNRKCCIuJrt8f4pvLbayICFRRqq5KtoeQGWAVD4uT2mntvps8diSM2ckVrtFg3rH53JL1IOFQaUWOHuffmd7oj6UXCoRJhDQUFhVSjERtAOPddTRsYJNZIltzBAWKNRMndtXsPsUai5A7tpdaIk1zMvBke2UetESe5mHmzf3SMWiNOcjHz5sBBco04yUWu3Z7CIXKNBMltbcuRayRI7uEj9BrJkTs+cZReA5gGmSOUyKnBn+fIBVc5dpzDD6ohKBcyRyiRUwOdx2GgTZ7gjQI1BOVC5gglcmqg8zgM0FGmhqDcOiAtNRQUFCKD+xJnzRHRDSCSjWLKuukUZXLcRFlzJNZyTxaLp04Xi2dkclxEAXMk1nJ1nD0nmeAiCpgjKZYLmSMplguZI5JyoQ6Y+kU0uZA5IikX6oCpX0SSC5ojknKhDpj6RSS5oDmS3msXNEdSKxc2R2Itl/KYUTVHwFHRVRoK5yFSvBunQrRqjoCjGCJ+uRbvxgmniSRiueLdOKmQq6CgkH6E0M8iu1VNl2awKb6sKLkGQuhnkd6Zp85jM/xZUXLD6WeRlnuhjDz6cVhRcqX7WWbnCiNd0/g8Pvq6L/IncFhRclnLptN66rTeBhkZ8+WFS5evXPWuYs+rya1gEYi0a3NcxhVWlFwQjGVjP3hfN39h5C7dGNa05exNz2F7npNbtVhyt0q37+hDQytOpH/cnbjHo2yxouT6gLFsxq2nzvtuGQ5GzRfM1Qeew/Y8J7dqsTx8NNNefvzk6dqYExlTn3XwKFusKLkwWMuGezKvZ58bP168hOU6uVWL5ZX+cvJ6Mvum3xUZePuOw9hmRcmFwVo2/JO5ZP1133sOMydzLRbnP3ijlY+zYqwouQxYy4Z/Mn+yrt3PnsPMyYxj44sMq3BypftZvhY2lr99X0Dn4fjxszcoK5Fcfj+LD1gZv34XVv8w9/kActfX/voNYaxEcvn9LD6o5+v9vyW/EYyVSG6gfzdqMjcjsXL/A/XMkKX+h/b3AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.981,3.494;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAHcAAAATCAMAAACdgmL0AAABLFBMVEUAAAD///8MDAz19fVKSkp3d3fU1NTV1dVHR0cODg4fHx97e3v4+PikpKSoqKjj4+MVFRVFRUWxsbGVlZUSEhJhYWFGRkb29vYyMjL9/f0bGxtmZmYiIiL39/ezs7PR0dEDAwPm5uZjY2OQkJC8vLz+/v4UFBSAgIAYGBh9fX2Li4vBwcEEBATp6eleXl6vr69PT08tLS1LS0v09PQLCwu/v79TU1M9PT3Q0NB8fHypqamjo6NycnLZ2dkPDw9OTk78/Pw3NzdkZGTk5OQCAgIaGhp6enq3t7fCwsKKioppaWnMzMxZWVns7OwGBgYhISEsLCwWFhaYmJgJCQny8vJQUFAICAjOzs7W1tZISEgdHR15eXmcnJyqqqrIyMhgYGBwcHAoKCg0NDQTExNvEeiXAAABPklEQVRIiWNgoCdghAO6WjsY7GViZsGuhpWNQkuwmMzIyM7BycXNA/IvLx92bWysFNqLxWRGfgFBIWERUZC9YuKc2DRJSEpRai+myYzSMrKMjHIM8kB7FRSVsGlSVqHUWiwmq6qpA+NWVUMTlK60tLHo0dHVo9heTJMVGfRBiUrQAGSvoSoXphYjYxPK7cUwmZ3BFGSvmTk4H1lYYmqxsqbcWkyTUe21scXQYCcrSA170U2GhrOYPdheDQdHdA1Ozi7UsBfdZFUBULpidHWDlFfuwugaPDypYS2GyYxeMsAyw53BG2Kvj68fqnJ/1QDq2ItmMiN/oKBQkJoetHwODgkFkn5hYKAAZGqGU8dadJMZGSMiOaOieWD1QkwskIiDlNjxQGZEApXsRTMZa32UmAQGydSyEovJg6AeHCB7AcJFKEDp3btDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492368981;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.rect,1.1,4.1051,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1030,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.984,3.330;4.blob,1.1,1480.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAyCAMAAAB8rFmYAAABtlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NROTk6hoaH+/v50dHR9fX38/PwsLCwyMjL9/f0bGxsKCgrr6+uSkpKQkJC0tLTJyckEBATp6eleXl6VlZXc3NxLS0v09PQLCwupqamjo6O1tbUPDw/39/dFRUXo6Ojk5OSDg4PCwsKKiorx8fFKSkrOzs7W1tZwcHAkJCQYGBh1dXXFxcXPz89ERETu7u6ioqKvr694eHjg4OCAgIAMDAz19fXa2toVFRWoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEgXFxfm5uZjY2Pq6up2dnZWVlZ8fHzh4eGLi4vBwcF/f38tLS0fHx8nJydCQkLX19dMTEyTk5PQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIg3Nzf6+vplZWX5+flsbGy3t7fGxsYxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjrMzMyqqqqNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpfgrwhAAACW0lEQVRYhWNgwA0YmcCAmRBrIAALKxiwEWINBGDnAANOQqyBAKNxSh4YzHE6CjABFyQlcw+0O7ABHkhK5h1od2ADfJCUzD/Q7hgFo2DQAAFBITyyPML49OKXJQeIiCLzxMQlJMm1nfpuExVB5UtJy5BpO9XdJisnjyqgoKhEpu1Ud5uyILqIiiqZtlPbbWrqGuhCmlpk2k5tt2nr6KILDRq36eljCBkMkjg1NDJGF1IzGSR5QdgUo/NhNljKEHMLNAExPdZBUvayS6CHkaWgFaoASouYKLchdFDCYpCyJuh8lBYxUW5D6KCExWBjS9BtKC1iotyG0EEJi2RA77p+FFAb2KHx7TGqtwEDDo5oAmxOhgPiEBhApGdnF3Z0SVc3qpiMB5i6g0gPTwYGL28rdEm4Cdw+mOWLrze+zgR13cbA4ofTBH9vL0ytAYH0c1tQcAguE0LDsGgNZ42gm9u4I6NwmRAdg0VrCGssjd0WB6pO40FuY0hIxGECP6s/Nr0mSSCSGVwhM+JgUeQ2SH0KdluyRAp2E1JZ07DpTdcEkRlgA8JwsChyWyaoOo0Eu40hKw67CdmsOdj05uaBSENwhZyPg0WR2xDpjYGhoBC7CUWsWIuL4hIiLKCW2+ylS7GawFVWjkUrd0UlHd3GUKWJ3YRqVHEIkGGtoafbauu4sJpQ3wChUdrkjZHkz7uQ4bam5hZkF8BNaC1rgxiJ3CZvlyLbaWS1PAM6kF2AMKGzqxtEIbeSW3rQqxEau40BxQUIE3R7+9AU9UdidLRJAFRtsU+YiCaQpk1F00kHAMBiU8zFC9ljAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.402;4.blob,1.1,2608.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;3.end,1.1;4.sync,10.6492369023;4.copy,1.1,2.10,3.342,4.1190,2.19,2.14,1.1,1.0,3.342;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.rect,1.1,4.1041,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1020,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.482,2.28,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.974,3.330;4.blob,1.1,1480.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAyCAMAAAB8rFmYAAABtlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NROTk6hoaH+/v50dHR9fX38/PwsLCwyMjL9/f0bGxsKCgrr6+uSkpKQkJC0tLTJyckEBATp6eleXl6VlZXc3NxLS0v09PQLCwupqamjo6O1tbUPDw/39/dFRUXo6Ojk5OSDg4PCwsKKiorx8fFKSkrOzs7W1tZwcHAkJCQYGBh1dXXFxcXPz89ERETu7u6ioqKvr694eHjg4OCAgIAMDAz19fXa2toVFRWoqKhSUlKcnJy9vb1GRkb29vYODg6rq6uwsLBISEgXFxfm5uZjY2Pq6up2dnZWVlZ8fHzh4eGLi4vBwcF/f38tLS0fHx8nJydCQkLX19dMTEyTk5PQ0NAuLi4+Pj7T09OdnZ0jIyNycnLZ2dkcHBze3t6IiIg3Nzf6+vplZWX5+flsbGy3t7fGxsYxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFAaGho6OjrMzMyqqqqNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpfgrwhAAACW0lEQVRYhWNgwA0YmcCAmRBrIAALKxiwEWINBGDnAANOQqyBAKNxSh4YzHE6CjABFyQlcw+0O7ABHkhK5h1od2ADfJCUzD/Q7hgFo2DQAAFBITyyPML49OKXJQeIiCLzxMQlJMm1nfpuExVB5UtJy5BpO9XdJisnjyqgoKhEpu1Ud5uyILqIiiqZtlPbbWrqGuhCmlpk2k5tt2nr6KILDRq36eljCBkMkjg1NDJGF1IzGSR5QdgUo/NhNljKEHMLNAExPdZBUvayS6CHkaWgFaoASouYKLchdFDCYpCyJuh8lBYxUW5D6KCExWBjS9BtKC1iotyG0EEJi2RA77p+FFAb2KHx7TGqtwEDDo5oAmxOhgPiEBhApGdnF3Z0SVc3qpiMB5i6g0gPTwYGL28rdEm4Cdw+mOWLrze+zgR13cbA4ofTBH9vL0ytAYH0c1tQcAguE0LDsGgNZ42gm9u4I6NwmRAdg0VrCGssjd0WB6pO40FuY0hIxGECP6s/Nr0mSSCSGVwhM+JgUeQ2SH0KdluyRAp2E1JZ07DpTdcEkRlgA8JwsChyWyaoOo0Eu40hKw67CdmsOdj05uaBSENwhZyPg0WR2xDpjYGhoBC7CUWsWIuL4hIiLKCW2+ylS7GawFVWjkUrd0UlHd3GUKWJ3YRqVHEIkGGtoafbauu4sJpQ3wChUdrkjZHkz7uQ4bam5hZkF8BNaC1rgxiJ3CZvlyLbaWS1PAM6kF2AMKGzqxtEIbeSW3rQqxEau40BxQUIE3R7+9AU9UdidLRJAFRtsU+YiCaQpk1F00kHAMBiU8zFC9ljAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.941,3.402;4.blob,1.1,2504.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;3.end,1.1;4.sync,10.6492369063;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,4.1182,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1110,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1050,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1010,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.508,1.8,1.3;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1092,3.210;4.blob,1.1,1216.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAlCAMAAACQ7/xbAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAABu0lEQVRIibWVVU9DQRSEF4oVK5QWu8WteHGX4l6suLu7u/1w0oYlgXv29A4J39Mkc+ZpN/mE+BNByibYhC4CERKqrMLCI8BFAMyRUeoyOgZdsMRa4pg23poALlhsVjtXJyahC47kFLZO1RzggiMtna0ztExwwZCl2fiD7Bx0oSZXy+MP8gvQhRqnVsgfFBWjCzUlmv5v/6C0DF2oKXdVsH1sZRW44Kj+/SY/qdFqwQVHXT1bNzQ2gQuOZlcLV7e2oQuWdneHuuzsygAXPKbuHmXX29gHLgLRP6Cs8gbRxX9iRNkq3aMYUrZC9yhS2fahYetIjSrRukeRyvaMusNSx8Yn6ETrHkYqO33S4Z2anp6hkyB1D/Ol7KbZkrn5hUXTEpl8ELqH+VL28opn1V67JtY9VPJdELpHkcreSHR6xeaW2N6hkv9Ep3sYqezdvf0YsXHQYSGTH53uYaSyD4+OT07P2s+TyeRHp3sYqWyzu/zEdXF5dU0mPzrdw0hl39zeme7FfT+dfOh1jyOV/fD4ZO58ViVB6h7mW9kvr2/vH8pE6h7GsLIJ3eMYVDapexhjyqZ1j2NI2QrdQ3wCkyh5Cjzhzq0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1002,3.248;4.blob,1.1,1296.iVBORw0KGgoAAAANSUhEUgAAAGwAAABLCAMAAACiEZJxAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB9klEQVRYhe2ZR09CQRSFR7GhIoqi6FOxYVewFywgNmzYexd7w967P9yAi7sxzNw7b2XmW93FnJzk5SUnOYcxEjGo17EGmssvcfGo5wmJSXQvY3IKTpBqInulmdORigxLJtUsy2LFSrJzqGa2XLQkT8snmhUUoiV2rYjmVaxl4UUlpTSzMs2BF5VX0MwqtSq8qLqGZlarEf7junqamdPVgNakNTbRzFgz/vu3aK1Es7Z2tKSj000063J1YyU9vUQvxjzePpzA128nmxkGBlHvhzqHyV6M+UdQzx2jEl6689+D3zo2bplo4V96BH9g0puQNzU9w7t0Cf7C2fy5+YWFRd7FdAh+91Lt8srqmmGdc4WRDv6NzcCWtXWb7QSiX+G30sEfzK6cY7t7bP8g+hV5LBv8h0fHJhY86TNzrgiywX96dh66uPRc2ThXBNngN3qdIdf1ze0d54ogG/z3D4+GJ/bk511h5IP/+eXV6HvjX0yX4H//+Pz6FrhU8P+JCn6FQqFQKBQKOiLNgFwfAAg1A1J9ACA4CUj0AYDoJCDRBwDCkwC9DwCEJwF6HwAITwLkPgBATALUPgBATALUPgBATALUPgBATALUPgAQnwTofQAgPAnQ+wBAeBKg9wGAcDMg0QcAgs2ATB8AiDUDcn0AINQM6NEH/ABrA50y8+C4fgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.345;4.blob,1.1,1652.iVBORw0KGgoAAAANSUhEUgAAAPgAAAAjCAMAAACO9jfVAAABtlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkrCwsI8PDxOTk6hoaH+/v50dHSkpKSoqKiwsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vYODg4KCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExMkJCR1dXXFxcVUVFTPz89ERETu7u6ioqKvr694eHjg4OCAgIDa2toVFRVSUlK9vb2rq6tISEgXFxfq6up2dnZWVlbh4eF/f38FBQUnJydCQkLX19dMTEyTk5MuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb28aGho6OjrMzMyNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enomKxqNAAAC2klEQVRoge2Z91cTQRDHN2ukRNSoCdhQTFQsiCiKsVAsaGyoqNi72Bv2hr13/2PZvXdtdzZ3tzdZzvf4/HDZcjM73wfh5r4Q4pCidFJ6MlGTqqmwGbCrQ20ddsYx6jNTxKVUw9Rp07Mz1DGmhdfVYmdkzJwlrqRyY5d8Y5MyxLDw2XPmImfkzJvfLKxw4QsWtihDDAtflEZOaFEoLhZWuHCyZKkyxKzw1mXLcRParFgpLFjC21YpI8wKb1/dgZvQZk12rX8hYcI71+Hmc1nf5Z9bwjck5Fe9tHETaj4Pm7f451x4a3eLMsCo8JqeXtR8Hvoat/rmXPi2pDzOGrajpvOxo803ZQ1MJ01IA9OfVf8AYrNzV5mQ8m5Ogbese9JCP+fukpDC3Yg4I5LfWxXJFvv2D3C5jAMKNd7dUMLdiDgjcvAQqlSBwcOEHDnKGYLv8O2GEu5GxBklC9MvKRNMYIRjwryvSq1z0jh+Qlg4eao0LoUYwf0DdfpMv7h59hxK5gr0nGfXCxdBgwgTydRyyitckp+jlzOVDLkAIgoHDCJMJFPLKW84Uy/fPnhF/6iowmWDCBHZ1HLKu5oD7r9Gr2ufFVW4bBAhIptaTnk3bgL3N9Nb2meFE97FWvXbTLhsEOEBmFp2eUN0GIrovsOuvfxN4q5ipCCccKtX58IlgwgPwNSyy7tHR6CI+/w99gGvLqcYKQgn/CFr1YtcuGQQ4QGYWnZ5j+hjKOLJU3Yt8TeJZ4qRgqjfcdkgQgMytezynlPwyfXipfZp0YWLBhEakKlll1cefQVEFF6/0T4tunDRIEIDMrWc8t5ChzbRd9qnaQjnBhE+oKnllPf+g/Xps54+FvWNTw3h3CBCsrKCTC2nvE+jn60Fr/X0Ja+tW8umYAYRkpUVZGq55X399p19eM2ggR8xukhtfwbHygoytdzyOn7+EvZ+F+P8a+P/Mab+/BUWRtrHpY5q8Q+n7LfM7U+kxAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.931,3.402;4.blob,1.1,1764.iVBORw0KGgoAAAANSUhEUgAAAQwAAABICAMAAAA07DtvAAABa1BMVEUAAADIyMhkZGTk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExN3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6P39/dFRUXCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCkpKQ8PDwmJib5+fmhoaEODg74+PiEhIQqKiq4uLjx8fEHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0uLi43NzfBwcEMDAwBAQHr6+t/f3/n5+eCgoInJyf29vZISEhiYmLu7u61tbUZGRlQUFBUVFSqqqra2tpHR0dBQUFAQECsrKwRERGMjIwJCQlsbGzR0dGgoKC5ubmxsbH19fWNjY3l5eWFhYWtra1ERESWlpYzMzMpKSm3t7dfX19nZ2c6OjrExMSXl5fi4uKGhoYr9a49AAADeUlEQVR4nO2baVcTMRSGAxWtA1TBFdyoolbEvYpCEYooLtQNd3Hfd3D/+XY6ZSaY29ysnZk2z4dyz0lubuY9aSZ9TyAEpqOzQYMU/FGEamTW+J9da/VG0cOJYbyEE0N4FCeGbI3MumyV9U4Mn4xXQ0mMbl/HbI9EpDFRFBNi9OaqbFASY2NNxz6JSGOiKDHvGf2+jrlNEpHGRFHcBio8ihNDtoYTg0JUjM21N0J2Cx2ZIjFiiNboCF7BW+nIFKkTY1vtjZDbTkemSJ0YDofDkRSasS2ZOWcQMjCoWQMjTWIMDmjWwEiRGDt27tKsgZEiMXbv0a2BkRwxMNtvKL9XtwZGcsTAbL99w/t1a2AkRwzM9jtwULsGRnLEQPaM/sIh7RoYqRGjM9OtXQMjNWKMHNavgZEWMUaPHNWvgcEMAtlqOlFUg98vEgMc5dhxzvxEa2BGISMGZKvpRFENtB9nBuTESV6rYA3MKGTEgGw1nSiqgfbjzABtFaqBGYWJ2TNSUMPhcDhWQW88rK0mui3Fsn2dCl6URXMj0o/B2mqJFuN0sXhmrFg8a25E6jEAWy3RYlQ5N250OOoxAFutbcWAbLW2FQOy1STFkL91pxMRi2JAtpqkGPK37nQiYk8M0FaTFEP+1p1OROyJAdpq7bpngLZam4oB22qJFsPeoSu01cBW0VGaSnQcVzIjAVYeI7TVwFaMmK0VJTMSGsfI1bSYxVAyIwFaQgyHw+GIBxN36Hj9JkqTXePn5eYUW66JO3ScflPT5ZkLsxclJxVTrpE7dJx+l+ay/u/uy3KziilX8g7dlauFfO81vN8K85Xr/ueNm1KTiimXMft6gvN78Hueechbt0sLd+7e+3+Uer9VuQH3vQf+n3If3SoYWcyFYcy++s+fh7AYjx4PEbLoPYHFiHJDc27Ce+q3PBuhWwUji7kwjNk3Gpzfn8NiDNcMhMoLWIwoNzTnqElFrYKRxVwQ1uzjfk1eeq/8P6/fwGJEuaE5V1+ub9+pL3UbuSCs2cf/mrwPVsYHWAxgGc5P+xsZ+fhJYalbzAVhzT7+1+RzsGd8gcWAluHXuerBZ8H7prDULeZCSN+hWyosL36fLaH9Iqby5ZkflTFumabn8u/QNYB9yJ+/CpXfjO3IO5wtLU/++at4pLaVy79D14BWNXeU/jm2VcVQokXF+AeFQ8esSyBNOgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.951,3.497;4.blob,1.1,760.iVBORw0KGgoAAAANSUhEUgAAAOQAAAAOCAMAAAAIVkBbAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAABIUlEQVRIia2P11ICQRBFBxsEkWQEBCUYMKECKpgT/v8vOTsvW+709N7Vvg9bW1N9z6lrTG6F2OQL/DucIBlw6HYNrRb520I+TZOWEBlxqHYNldbK3OV6pZqmSUuADDlUu4Zq9QZ3ubEpS4AEyJBDtWuItraZw53dpixBwpJBh2bXjmy19/y7TndflEBhyaBDs2tH0kHPv+sPJAUajow6FLvRyOGhd3V0fCJB0DBk2KHYjUaOTs+SV+cXlxIEDUOGHYrdaCSNr5JX1zcSA49Pxh16XTdyMp39vrlt38kQNB45g0Ov60bezxf2O3twqdnfxyeZASdJzuLQ67qR9PxiP69vLu/29+Pzf9viJMiZHGpdE79/LV2+/zwomJic3aHR/QHup15eaxlFVAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492369105;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.961,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1000,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.941,3.345;4.blob,1.1,876.iVBORw0KGgoAAAANSUhEUgAAAQIAAAAPCAMAAAA4eDEIAAABBVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkrCwsI8PDxOTk6hoaH+/v50dHSkpKSoqKiwsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vYODg4KCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExNyf6QMAAABR0lEQVRIic2XeU/CQBDFt7UCCmo9QLwRD1QOBbzvWzzA2+//UWy3gV0aHzZ0Munvj2abN/PafU3TqRAdDNMcsAYFxoj1EP9R+yGeoHZ0GBpOYtFIjYyO2eM9CpgjSMSpHV0mJrFmTDmHdGYaF/BGkJ2ZJXaUzM0vQE1GsLiUwwW8ESxbxIYe+ZVVqMkIxNo6LmCNoLCxSWvYZqsIJS+CUhkXsEZQ2d6hNWxTtWtIilgE9V1aP8XePlK8CA4i8iIcHh2T+mmcnCJFRlA4y8FW1ghi5xekfhqXmSugyAiuo/JRTN2Q2nVxWwKCOxrVzYiMRnc2fhShuX9o6KeNR0leDshPlm96VKoIGIHqCLMS6WfCLft5abb0O3U27vIK9qWrgSJQHWFW4u2dcs9+Pj71O/36lvz8XdulBopAdYRZcdDP1bh/k5j4BcteQ/ofM1IQAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.402;4.blob,1.1,2296.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;3.end,1.1;4.sync,10.6492369143;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.437,4.1190,2.38,2.14,1.1,1.0,3.437;4.rect,1.1,3.951,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.931,3.345;4.blob,1.1,2224.iVBORw0KGgoAAAANSUhEUgAAAQwAAABbCAMAAACxrktaAAABtlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkrCwsI8PDxOTk6hoaH+/v50dHSkpKSoqKiwsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vYODg4KCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExMkJCR1dXXFxcVUVFTPz89ERETu7u6ioqKvr694eHjg4OCAgIDa2toVFRVSUlK9vb2rq6tISEgXFxfq6up2dnZWVlbh4eF/f38FBQUnJydCQkLX19dMTEyTk5MuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWX5+flsbGzGxsYxMTF+fn7b29tvb28aGho6OjrMzMyNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enomKxqNAAAEiUlEQVR4nO2b91/UMBjG7yqyVVSGC8U7FQciiiIOhgPFhYqKW3HgXrgX7r39j6U97tq7S968zZuWtOb5oYRL+r7Jlw9p+9zbRCKnpGVNKZma4CtZCnQKemVUVq464rgqKqsww5LV06bPqJkJDAgZRnmZ6oi2Zs3GjErWjh/q6hv4A8KFMWfuPMURHc1f0IgY5cBYuKiJPyBcGItLFAfMKJVeghjlwEgsXcYfECqM5uUr1AbMauUqxKAMjJbV/AGhwmhd06Y2YFZra9aJB2kGo3292niuNnSIx2RgbNTk36Rz02al8TzaslU8xoHR3NXEHxAmjNLuHqXxPOqt3yYc48DYrsultXqH0nB52tkiHGLfdLVbmtx09dXw/yhk7drdz+7o3+Mo5dyO7y2p4vUmkDDcMyitRN0+8pL52n9ggD3TcQS2DnJW6O1FwXDPoLQShw6rXH2hBo+wZ3r0mKMh9ll5vSgY7hmUVhii5Q37Qc3ISHsdL/i9N6BHhSjoxMmCD06d7pyUiUya3E3wzNm+ws5z55VEBtQ9bB8vXESbc7IqNhQZ88t9lLpUfJ2/XAkZpAL5hIE052RVbChCMEYqK4pDDF6RT+8XBs6ckxTDUIRgXK1lxLhmXZfO7xcGzpyTFMNQhGDcuMmI0Wjdks6Pg9FhPyLctmHgzDk5sQxFAMaQNcKK0nXHPvY4TzV3OS2OcDAyzwgODJQ5JyeWoQjAuGeNsqLcd3yAB86MazktjnAwHtqPCGkHBsqckxPLUARgPLIes6I8eWofO52nmmecFkd+9wycOSclpqEIwHhuMa+iL15Kz8A/DIw5JyWmoQjA6B97xYiSev1Gegb+YWDMOSkxDUXoavKWNZEG6530DCRgcM05mtiGIgTj/YfMzzzb72Na3rCWgME154IwFCEYn8Y+Zz7w2n5f6vwsX5hMKJ45F4ShCMFIfP323f7hNcQGfhDukKV9MDU2otDYA2G0/fxV0Pc7TfmKS3dTEJ7fn78FH4y2BjgXIyOjiEq+wk7Btyr59xnB5PBzrnyFXfxgECrs4geDUGEXOxiUCjsVMDy2X1A58OdSKuxUwPDYfkHlwJ9LqbBTAcNr+wWUA30uqcIubnsGqcIubjBIFXYxg0GrsIsZDFqFXcxg0Crswqj4CvnZJKhwBobyZJGBYWRk9L9Im82NeJ+hRAaG8hQGBjqKgeE3B9H2UyJ9YBBsP7gGEdvSCQbB9oNrELEtnWAM20e5PQOuQcS2YgJDlQwM5SkMDHQUpTCYVXyKpA0MbA5mFZ8iRQ5GkK8FRw6GkZGRkS4KY1tSc58BVyPS1jEROUowoGpE2jomIkcIBliNSFpHNnKEYIDViKR1ZCPrA0Nk+8HViJR15CLrA0Nk+8HViJR15CLrA0Nk+8HViJR15CLrA2PYPvL3DEE1ImEdbuTIwBBUIxLW4UaODAxBNSJhHW7kqMAQVSPKr8MTuSiI8hdrQcPObbkw4NdzKTlEL/4WwVD+Yi1o2LGsO/j1XEoO0Yu/RTACeLEWMOxY1p1ULyqHyDLUZs+Y7Bz/AIGPoHtJNLmYAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.924,3.478;4.blob,1.1,1368.iVBORw0KGgoAAAANSUhEUgAAARMAAAAjCAMAAACAeh6TAAABUFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhoacnJyqqqpKdxpMAAACbUlEQVRoge1YaVcUMRAcAoiAXDKCXKIccqjcyLGAoiiHouIBcsilyA3//xs7yeyQ2fTOdnrZzLy3Ux9IPnTVdNdLwr6yrCLmobiEZYRcFwRsXTBXX+UOuZasUFKM4WH19RFBT0rvlWF4WH19RNCT++UoHlZfH9HzpKLygb+0qpqjRutLbp2PS+wtLK7kSW3dQ2ep4cNUJXf1NscjrS+5dT4usbewuJInDY18ecyHaUrumls4WrW+5Nb5uMTewuLeetL2pF2sfJinLL47jBU9Sx8gvjsdnemlBX93mru6kTysvj6i5snzHhSvV7wTffCO1FHG3sLiep70v0DxLPFOvIR3pI4y9hYW19K8E6/EOzEA70gdZewtLK6uJ3dWF8wN1xNdfgEg9sSDnULsiYfYExWKJ4NDw3BlUB6JgqQ8Mjo2/nqCJpN/rnpO6ifhyqA8EgdPeWo6MTM794YkYoCrevJ2/h1UGJhH4uApv1+odqKIDxQRA1zVk76Pi1BhYB6JQ0p5aXnF+fvpM0HDBBd4Y1e/AHVKHkmBq/zV/uYsiSY5XUHuTHABT9a6vqvjuHlkbnCVR+wfzvKzQ05XkDsTXOh/8a91dRw3j8wRQlnq7TZdQe5McCFPNn4rw6TyyBwhlN0zvLlFP/955UKebO/8SR9GzSNJEMpL085bx3b3COffBBfyhO0fpA+j5pE0COXDheTvpr/2P8L5N8EFPTn63+sfJVseiYZQnqpMzBwvn5AUDHBBT07PnIsnJYnZ8kg0hDI73x+7uCT+Ps8/F/SEXV0zX5KYLY/EgytHHLAnHL4ksZAQ4EnBIvZEhefJDaXw3SCxVK7kAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492369184;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,3.941,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.980,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.921,3.345;4.blob,1.1,928.iVBORw0KGgoAAAANSUhEUgAAARYAAAAPCAMAAAAWPRCaAAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABYElEQVRYhc2X51LCQBSFNzECKovEgmCvWLBgxY69Yu++/4MYlyHZ4N5rxr2z5vvBLDlzDpuTSbhhzMey7RanlcFYCUT8Rf0LyRR1okdbeweipm0Blw5ZGd6Zdbtgj+laUknqxG/S3YjYw3lvlvOcdMjq8z7yhX7QY7iWgcEh4kTB8EgO1UfHwt9FLeMTk6DBcC1TDnFgneL0DKora2Gzc6DBbC2l+QXawAaLS6isrqW8DBrM1rKyukYb2GDd3cDkmNdS2aTNC9jaxlR1LTsxuYl29/ZJ8ySqB5iqrKV0GJNHbuLomDRP4qRwiqjKWs7i8gedOSeNC3FRRsQftXjjXMWOyTh36cKXR5ur6xqg+ONc7UZQFMP/rdM0GQcqi1hL4NBZsfyd7rkj3D88Ajv1h3+rvngCzlVWI9USOHRW7PmFsodmXt+Anfq8fwg+1f6QGqmWwKGzMgHV75p+VfxHvgC9RVCOir/k3gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.402;4.blob,1.1,1944.iVBORw0KGgoAAAANSUhEUgAAASkAAABICAMAAACdmPP7AAABg1BMVEUAAADIyMhkZGTk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzDw8MVFRV3d3fU1NS0tLQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6P39/dFRUXCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHC2trYiIiKkpKQ8PDwmJib5+fmhoaEODg74+PiEhIQMDAz19fVKSkqoqKhGRkb29vY3NzfBwcFjY2MnJye4uLhISEhiYmLu7u61tbUBAQGLi4tUVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS0fHx8RERHr6+uMjIxaWlri4uKnp6cgICBXV1fy8vLQ0NAJCQnR0dGgoKBmZmYvLy/7+/tycnLZ2dmNjY0QEBD8/Pytra1ERES3t7eVlZUpKSlfX1/t7e1ZWVns7Ow6OjrExMSXl5dQUFCcnJyCa20SAAAD6klEQVR4nO1c+VvTMBguDAW3MRQBnQoeCAo6FVRUpqIMHQgeKOKBiififeJ9/el27baUJs2XNOnSjLw/7Mma78r70LR59z1YFhkNjQETXKBHYcqRaCp9rlsvFiVCGKZYYZhihWGKFfFhqrnFxgbDFIhE0kEoplIlklvS0kbhVwFCBlOtGRttoZja6JC8Sdoo/CpAKN6n2kskZzZLG4VfBQizo8uJYphijWKYYo0ilakO5wnV0ukd1QSxYYo1R4P7NtHlHdUE2jG1xXlCZbZ6RzWBdkwZGOiEdO2eD5ojm0xuU12DHshuz+wInKzFPinnfcqyunsEc0CRszspNjox1dMtmAOKXC9M7dq9RzAHFLlemOrdK5oDiqwJU5A63Ne/TzQHFFkTpiB1eP/AoGgOKLImTEHq8IGDwjmgyJowBexT7blDwjmgyPXBVGMiJZwDilwfTB0+Ip4DilwXTA0NHxXPAUXmY4qkvoqMUA66HWKKGOXYcUp9rDnokXmZIqmvIiOUA7SjVGCNnKDNMuagR7aZOklRXTCmSOqryAjlAO0oFYCzTDkgZZmqusRmn4pDjlMZiupiYBACRh1mhVGHWcGsDuPqK+s+qeS3uFH3SZ+X58v8PoWrr7Fm6nQ+f+ZsPj8mz5eVKYL6GmumbJw7L9WXlSmC+mqYQkBrJKmvhikEtEaS+srJlOweXrDDVw1TJPWVkynZPbxgh68SpojqKydTsnt4wQ5fJUwR1VezTyFU10hUXw1TCJU1ktXXWDOl6M3To5ESZiEoPs3wa8ICpxmPRkqYhaC4BzOUZk0AnzrMMctvFxHENGEEAXVYE6ZkwajDBgYGmkNGRy7njj5emIBMAqtS5WvJ6cjlffaNXoAsgqtS5SunI5eXqYtF4AxCqUqVL29H7uRUrr91HLajo7PtEt2AUpUqX0wTTrtnI1eCwRiYLs5cvnL1mj9K2W6VbwWzhJF1fYpacKUqVb4kYJpw+ex4w/mCMTV3s8+y5pO3fJfLdsi3quGmbhfu3LWnehfQyP64N3yfVrFblSpfMjBNeMg9Gz1wvmBMDTiizuJD3+WyHfKtariPHk80FZ88fbY0iEYl0+fNtIrdqlT5EoFrwtS7b9k9Qb546XPC7r6qhvvKPri/Hkm+6fKMSnj7jlJwuSpVvkTgmjD97iu4f1PvfZexu281Zqc/+EcLHyeDK/ZWpcrXD1wTpt99n9x96rPvMnb3wVj5EjwH9Amr8OXuyP2aW5n/9n0GtIPx42dH2Koi9oX6ZonAGfj1O7f4B3t9C8HU8tLfoCmoqoh9ob5ZIqJU8v7NBc1AVUXsG+o/MqwxzVMAa5Gp//sY3cVp92BUAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.921,3.494;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAHcAAAATCAMAAACdgmL0AAABLFBMVEUAAAD///8MDAz19fVKSkp3d3fU1NTV1dVHR0cODg4fHx97e3v4+PikpKSoqKjj4+MVFRVFRUWxsbGVlZUSEhJhYWFGRkb29vYyMjL9/f0bGxtmZmYiIiL39/ezs7PR0dEDAwPm5uZjY2OQkJC8vLz+/v4UFBSAgIAYGBh9fX2Li4vBwcEEBATp6eleXl6vr69PT08tLS1LS0v09PQLCwu/v79TU1M9PT3Q0NB8fHypqamjo6NycnLZ2dkPDw9OTk78/Pw3NzdkZGTk5OQCAgIaGhp6enq3t7fCwsKKioppaWnMzMxZWVns7OwGBgYhISEsLCwWFhaYmJgJCQny8vJQUFAICAjOzs7W1tZISEgdHR15eXmcnJyqqqrIyMhgYGBwcHAoKCg0NDQTExNvEeiXAAABPklEQVRIiWNgoCdghAO6WjsY7GViZsGuhpWNQkuwmMzIyM7BycXNA/IvLx92bWysFNqLxWRGfgFBIWERUZC9YuKc2DRJSEpRai+myYzSMrKMjHIM8kB7FRSVsGlSVqHUWiwmq6qpA+NWVUMTlK60tLHo0dHVo9heTJMVGfRBiUrQAGSvoSoXphYjYxPK7cUwmZ3BFGSvmTk4H1lYYmqxsqbcWkyTUe21scXQYCcrSA170U2GhrOYPdheDQdHdA1Ozi7UsBfdZFUBULpidHWDlFfuwugaPDypYS2GyYxeMsAyw53BG2Kvj68fqnJ/1QDq2ItmMiN/oKBQkJoetHwODgkFkn5hYKAAZGqGU8dadJMZGSMiOaOieWD1QkwskIiDlNjxQGZEApXsRTMZa32UmAQGydSyEovJg6AeHCB7AcJFKEDp3btDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492369224;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.rect,1.1,4.1142,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1100,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1040,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.970,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1052,3.210;4.blob,1.1,1316.iVBORw0KGgoAAAANSUhEUgAAAIcAAAAlCAMAAABf7QrdAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACBklEQVRYhcXW+zdUURjG8c24NJpME2MaRTQTYig6lJL7ZQqhlDAuiaiUCpXkVv5wZrPWezj7PftZ27F8ftnvctbzkzVrfYUwksF+yfR5tQBkZbOfcnIvebMA+PMuyzdwJT94NXTyEtcKXBZKygWgMFwk38j1aE7xjZsl9kuI0uAtdqGmWiDKggH5lt+Oxe9UVFTar0NVd9kFQ7FAVNfIJ1Fbd+9+fYPvge1KK7ZizIKjWCAay+XT9DDyKND8WDyJ0JX+e4v1lFlwFAtAq1Um37aq9rjo6BRd3XTJDz29zILlWCD6rKR8nz3vLxBtA4Nh2yW9GGIWLMcC0W4Ny3fk5avR12/G3lbbLml8glmwHAtEnXX0M/NHJ0dTU9Mzs7ZLejfHLFiOBWIy9V6+8wsffIticcl+pRV+/MQsOM4F5PPxf3P5y1f/yreT16GQ1cwtGIoF4vuP42N1bf3nr1OXEL83EuxCTbFA/Eltun3+u+XBAjIWHeQ/rmy3eLFA+HZ22W97G/88WUCW/rOfkvseLS4Q32zkDPWGcmk2Yl5vKNdmI6b1hnJvNmJabyhNsxHDekNpmo0Y1htK02zErN5Q2mYjRvWG0jYbMao3lLbZiFG9obTNRozqDaVrNmJYbyhNsxHDekNpmo0Y1htK02zEtN5Qrs1GjOsN5dZs5Az1hnJpNnLO9XYALLVs6kXcc8kAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.962,3.248;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAGkAAABLCAMAAABEOFk1AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACDklEQVRYhe2YV1NUQRCFGxaB1YUlui6mJSNJ0auIgiCgZJQgcc0iiIFgQFQUxR/u3oaqfmN6zvAk8730eeipU3XrVp06TQSRZbWdHcFcMuScsFrPzcsHjaInT/GMFRTGi4rNikpKMaOy8tM8E2eSuRVnz503KaIL8YuQUyoe41lZVV1TW1dXb1IZGi5BTo1NPJpbWi9fabsauWZQIRVBNeJ0vZLHjfbEzVjHLbqdOFyFu51BF2B0J0jx7G7oqaG7vdTXf7ji5Xv3AaeBYJDn0PBIKXWPjpUbFDP+AHDqCR7ynJicmn40MzvXaFDM/ALg1Brs/7LR5OJ0+vGTp88Minn+AnBaTL/k+WrpdWSZlldMKqTszSrgRG8Pvvm79x+ia+tmlaE46ECcNjYPxMdPn79sKRTR1+1mxOlb+rvtkx87iBHRbHLM7sHaz07MKfJr12r/9/YfzIhoZc9qffAvanS0/L/5rcY1v/W45rcFbvltg1t+2+CW31Y45bcVTvlthVN+W+GU3zY45rcFrvmtx+e34PPb4/F4PB7P8UXT0x3auaDq6Xg7F3R3dridC7o7O97OBd2dneB2Lqju7CFgOxdUd/ZwA2vngu7OzitQOxd0d3YGaueC7s7OQO1c0N3ZGaidC7o7ewjYzgXdnZ3gdi4o7+xwOxfUPR1t54Kyp8PtXND1dId2Lqh6unM7/wfJR9dXnMccngAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.911,3.345;4.blob,1.1,940.iVBORw0KGgoAAAANSUhEUgAAASAAAAAPCAMAAABz0OLlAAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABaUlEQVRYhdWXd2/CMBDFnTQF2mIgndBJFx100Ek33ZPu3e//QZoaBQeUO0fJyUp/f0SWn+7F96IkNmNNDNPssDoZjJFARIUahmSK2tGhq7sHUdOmgPuKRoZnc3YvXK07oFSS2vGPdB8i9nM+kON80Fc0hpxLvjAMVmsOaGR0jNhRMD7h375LcRJSREBT0zNgqeaAZi1iwwaluXlUVwTEFhbBUr0BlZeWaQ1dVlZRWRVQZQ0s1RvQ+sYmraHLlr2Nyf8moOoOrZ9kdw9TVQHtx+QVOzg8IvXzUDvGVEVA5ZOYfKQTp2ekfh7OCxeIqgjoMi6/+cwVqV0L1xVERAJyNopVMyYbxRsbflCRub2rA4rPRrF+LyiJo8aD1bYPlyoLGJCsiDJi+ceQzQfh6fkFWKk8ajTnjMbUK9C1Vw0UkKyIMmJv75SJtPPxCazU04479/Ut+PF3alEDBSQroox0gN83zFp0H1ZjwS/zI1X2k++AogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.402;4.blob,1.1,2800.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;3.end,1.1;4.sync,10.6492369267;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.rect,1.1,3.921,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.960,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.482,2.28,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.901,3.345;4.blob,1.1,940.iVBORw0KGgoAAAANSUhEUgAAASoAAAAPCAMAAABk8nIsAAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABaUlEQVRYhdWXd0/DMBDFnRDaAnVpGKVlzzLKKLPsvSl78/0/CMFVcVp6F6s+Web3R3S6J784L0p0ZuwXx3VbvFYG48QQMUJthniC2jGgrb0DUZOugEf0nBTvTPtdsI/pqBJxascfkt2I2MN5b5rzTETP6Qsu2Vw/6GM4qoHBIWJHwfBIBtVHx6J7IqrxiUnQxHBUUx6xYYX89AyqK0fFZudAE7NRFeYXaA2rLC6hsnpUxWXQxGxUK6trtIZV1v0NTP6HUZU2af0kW9uYqh7VjiUf4O7ePqlfiINDTFWOqnBkyW89dnxC6hfiNHeGqMpRndsyLKQuSO1quCwiolJUwQhaci0ZQa98+JVpc31TBhR0BC3fCvLiYHPn1U39UmWKUckVOhXL3jeXghIPj0/ATuUhpkHPqRTPwPOHVaWo5Aqdir28UmZTz9s7sNPQ4/ztfXwKvhp71qhKUckVOpUJ8Pvq7cX0cdkyvgFVW1lO6gIi/gAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.881,3.402;4.blob,1.1,2712.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;3.end,1.1;4.sync,10.6492369305;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.rect,1.1,3.911,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.508,1.8,1.3;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.871,3.345;4.blob,1.1,3360.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.891,3.497;4.blob,1.1,764.iVBORw0KGgoAAAANSUhEUgAAASAAAAAOCAMAAAC4jDFAAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAABJElEQVRIic2QyVICQRBEWwsEFRFQUBBRAVfcAFfcEOX/f8mevhBO11Rnn6g8TEx0ZL4XUcasrBKbXJ5/h5NJBhx6tobWCnw3nwtpQskiIw41W0PF9Q2uuVnaCmlCySBDDjVbQ+XtCtes1mQJkAwy5FCzNUQ7u0yx3tiTJUhYMujQsrUH2m+2/N5B+1CUQGHJoEPL1h6IOkd+7/hEUqDhyKhDyTY5ULfntfqnZxIEDUOGHUq2yYHOLy7TravBtQRBw5Bhh5JtciC6uU237u4lBh6fjDt0bN2BhqPx/85D81GGoPHIEQ4dW3egp+cX+x2/upTt7+RNZsBJk2McOrbuQPT+YT+fXy5T+/s9C0DgpMhRDhVbs3j/+XWZh/bxWZDjHcve/gHTYHoNe6VAhgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492369346;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.901,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.881,3.345;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABbklEQVRYhdWX527CMBRGnTQF2mJKOqF70kEHnXTTPeneff8HaeoocUDcG8exrPT8QNH95C/JQQibEB/DNNusdgJjpJAwJJUhnVHd6NDR2YWkWZNBw2Y+Ro525+0euFG3tExadeMf2V4k7KO0P0/pQNjMxxh0PgrFIbBRs7ThkVHFjYyx8dav7zExKTZzYdKmpmfAOs3SZi3FhS6luXk0l5BGFhbBOr3SykvLags9VlbRWEZaZQ2s0yttfWNTbaHHlr2Nxf9aWnVHbR9ndw9LZaTtJ+TneXB4pLQvQO0YSyWklU8S8keQOj1T2hfgvHiBpBLSLpOy5chdKa1r4LqChBGlOZvbqpmQze2NDX95sbm9qwOJ4Oa2fs8osWPUg9V0xuApEZTGV8S5IoXHSBqi8fT8AjwpPzKhM8MdvQImgqmQNL4izhV5e1dpqZmPT+BJA6+Dzb6+GT+t2xtSIWl8RZwrHeD3FZ2FofvAnlh+ATOOXrbFd5mXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.884,3.402;4.blob,1.1,1080.iVBORw0KGgoAAAANSUhEUgAAATwAAAAiCAMAAAD1cJVrAAAA9lBMVEXIyMhkZGQAAADk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzU1NRERETDw8MVFRUrKytHR0d3d3e0tLQYGBgyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4BAQFLS0v09PQLCwuUlJT19fXl5eVpaWmpqamjo6NaWlri4uJKSkr29vanp6cgICBXV1fy8vL39/dFRUVmZmYvLy/W1tb7+/snJycQEBDCwsKKioohISH+/v4sLCx9fX3Ozs5wcHC2trYfHx8iIiINDQ0u8tM9AAAB7klEQVRoge2YWVPCMBSFS0HFFqOioogbouKC4r4rivuu///PWNqS9iHNDdxOmzA5D3DnpnNO+s2QMNcwMmYM4rsIZWRznc+hYZxLojI0vP6l4SGk4SEkEbyRvKNRDa+nVV9Zy1Vf8OwO93wh6UoieGPE0Xhf8CZc7pNJVxLBQ5x5xQ53MpV0NRjwUpKGh5CGh5B68Kbduy4/E65SkjzwRDMM7y9NKVylJPXgzbp3HZkLVylJPXgSyUh7AypLwwurQK8f5zKyo3u+NLywypY171UVy1qI7vnS8MIqL5Ilr1peofAYPV8xXRh8xfM/zzSrFWQG5FxepZ0ahcfodTNVglepIjMg5wGGt7a+gcyAnAcYXn0TmwE5qwsPGsNvbe9gMyBnQXiNbqY88KAx/O5eE5sBOQvBs/cPDo+c73pNInjQGP74BJ0BOQvBOz07z11cXl3fNCWCB5x5xdsWOgNyFoJ3VzLN+7b1UJLpZwvAy2TtqCXhDMhZ/MJoPD5JdeYB8J5f8BmQs7q3LR/e69s7PgNyRsNjjbkxVfBi/OcCeEyXj0/O/kQz+M4xwGONuTFV8GLgc5wdmO0v3qpgBt/ZAfVNx08/FB6jFwmPNebGVMGLgc9xdgCuCmVAI/xeR1LSnHkyZPwSOn4i5C+65+sfKiaYKVTFU3AAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.861,3.459;4.blob,1.1,1676.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAiCAMAAADoDqvwAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+UlEQVRoge1ZaVfTQBQdaCm4VYRWFKEUtQoRUURUlCrigiJuFXfUKqK4L6BQVMB9/882MyGZTDpLpuY4I7kfwps3777zeg+TNrkA0FBRSd0CkSh9T6bOQlWsmldCnUphLkJlBX0vID1BzTJeBX0qdbkQy1espG8Gpeeq+Gp2AWMqZbkItWsYm16d6uoTybVV/Do2Gtatl55KWS5EY3KDO9HUDJGCC49OLfF068ZNm8kuVp2Lu4hMiQhsqReaSicuwta2dneixoDYBhcePTu2NwLQaewg0ladw01BYZuKwc5Y167iVm23ExUvu3v28KfSi4uwdx+R6N0PcQAuPHq29ZnX7EEibdU53ENQ2H4ADg9UH4kfPXZ8sN2JzNITJ/lT6cWFGEqcIjLM8z5snDb/nDlLkDznfQgKew6A8zkALowYF3NYZOLSZf5UWnERoldSRIZ93mPo//MqkfacdzcyLdfIqPt6ndhUunARRm+QGfZ5v4nun7eItOe885G/7Wcq9bkQvT13mPsePccS+c6742luHR/37k/ITqUEdwLd2xrwCDx4yG7g1enR40T2ieeHrYSew4NPaVu8qZTgRtC9LYdHYOQZu0FQz0cmnnfQdnhTKcF9ge5tL/GIiyD1XIoI9QwRIkSIEEEC//4Ixu+YTE+96nvtdy5duOTnxdeB+B3TM4XZN+Nvxdj6cRl6BuN3vJtrNl/azYvRteMy9PTpd4jVZbIL5vX9BzG6dly6nj79DnZ/m/vRgA+6hX68n2CkALcMPS2/w/YnOO8/2f1t7qTxyVx/HsX7CUYKcMvQ0/I7bH+C8/6T3d/mYrM5/QQjBbjyei76HbY/8VfP+5ev8ufuX3Ll9fTrd7D729zMzIK57vomce4U4Mrr6dfvYPd3uN/nir+LW40fEudOAa60nr79DtG66WRh9mf2lxhbPy5NT0G/o5RXgrkmpXQfy08N/JZ87lOfS9NT0O8o5ZVgrsnSe5/Men4X4JXySlyuSainHK/cuv8FkegfkZST0yv+c54AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492369385;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.rect,1.1,4.1102,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1030,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.970,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.930,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1012,3.210;4.blob,1.1,1240.iVBORw0KGgoAAAANSUhEUgAAAJsAAAAlCAMAAABif2u7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwDAwPa2tpwcHAVFRVJSUkHBwfAwMC/v79ISEiSkpLr6+seHh5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZmrq6uwsLD///8CAgLk5OQcHBykpKSqqqpcXFzBwcHf39/q6uoODg5WVlY1NTXExMTt7e0xMTGsrKzg4OATExPo6Oh/f39dXV0uLi5HR0eWlpbS0tIJCQknJydCQkLX19eVlZVxcXGCgoJGRkaAgIABAQE+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKytlZWX5+flsbGwICAjs7Ow7OzsZGRkUFBTGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29tvb2/m5uZaWlrOzs739/fn5+d5eXkaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0t7vWM+AAABzUlEQVRYhc2W104CURRFR7FhQREbgl0QcbB37L1j72Bv2HvvfriPDMrZd67JSVxPJ9l3vc0kS1H+RBS5RBv4DUhMLDnFxSewGwhjYhI9JqcAw5SaZk63hF/YkCQjMwus2eYc0rDm2uLsefkF2gsbshSaTWguKiaNklKHs8zlKtde2JDFXQFnu+ogDE9lVXVNbZ2hXnNhQ5qGEjg3qk2E0dxibTV525R2a+jChiwdaiF+0NlFGN1FPU6lt0/pHwhd2JBlUB3CD4ZHCGN0bDxF6Z7wZWoubMjSo07iB1PThDEzOze/sLi07NZc2JClSv39y4exskoYRpt/PrC2vrGpubAhiz+wBfeM7R3C2N3bNxwoB0HthQ1pDn9+HeFYVC9lHB2fGE/Pwi9syHJ+AefLKw9pXN/c3t3/uLAhyUPgEc1Pz/wGzZLNR4+nL43sBsDw+kZu71cf7AYk+ElOQ1/8xn9BT/1S5cyMrvolypkZ1MuicmYG9bKonLlBvSwqZ25ALwvLmRvQy8JyZgb1sqicuUG9LCpnblAvi8qZG9TLonLmBvWyqJzZQb0sKmduYC8Lypkb3fUboZzZ0Vm/EcuZG331G7mc2dFVv0Q5c/INTeC3922LphUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.922,3.248;4.blob,1.1,1296.iVBORw0KGgoAAAANSUhEUgAAAGwAAABLCAMAAACiEZJxAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB9klEQVRYhe2ZR09CQRSFR7GhIoqi6FOxYVewFywgNmzYexd7w967P9yAi7sxzNw7b2XmW93FnJzk5SUnOYcxEjGo17EGmssvcfGo5wmJSXQvY3IKTpBqInulmdORigxLJtUsy2LFSrJzqGa2XLQkT8snmhUUoiV2rYjmVaxl4UUlpTSzMs2BF5VX0MwqtSq8qLqGZlarEf7junqamdPVgNakNTbRzFgz/vu3aK1Es7Z2tKSj000063J1YyU9vUQvxjzePpzA128nmxkGBlHvhzqHyV6M+UdQzx2jEl6689+D3zo2bplo4V96BH9g0puQNzU9w7t0Cf7C2fy5+YWFRd7FdAh+91Lt8srqmmGdc4WRDv6NzcCWtXWb7QSiX+G30sEfzK6cY7t7bP8g+hV5LBv8h0fHJhY86TNzrgiywX96dh66uPRc2ThXBNngN3qdIdf1ze0d54ogG/z3D4+GJ/bk511h5IP/+eXV6HvjX0yX4H//+Pz6FrhU8P+JCn6FQqFQKBQKOiLNgFwfAAg1A1J9ACA4CUj0AYDoJCDRBwDCkwC9DwCEJwF6HwAITwLkPgBATALUPgBATALUPgBATALUPgBATALUPgAQnwTofQAgPAnQ+wBAeBKg9wGAcDMg0QcAgs2ATB8AiDUDcn0AINQM6NEH/ABrA50y8+C4fgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.871,3.345;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABbklEQVRYhdWX527CMBRGnTQF2mJKOqF70kEHnXTTPeneff8HaeoocUDcG8exrPT8QNH95C/JQQibEB/DNNusdgJjpJAwJJUhnVHd6NDR2YWkWZNBw2Y+Ro525+0euFG3tExadeMf2V4k7KO0P0/pQNjMxxh0PgrFIbBRs7ThkVHFjYyx8dav7zExKTZzYdKmpmfAOs3SZi3FhS6luXk0l5BGFhbBOr3SykvLags9VlbRWEZaZQ2s0yttfWNTbaHHlr2Nxf9aWnVHbR9ndw9LZaTtJ+TneXB4pLQvQO0YSyWklU8S8keQOj1T2hfgvHiBpBLSLpOy5chdKa1r4LqChBGlOZvbqpmQze2NDX95sbm9qwOJ4Oa2fs8osWPUg9V0xuApEZTGV8S5IoXHSBqi8fT8AjwpPzKhM8MdvQImgqmQNL4izhV5e1dpqZmPT+BJA6+Dzb6+GT+t2xtSIWl8RZwrHeD3FZ2FofvAnlh+ATOOXrbFd5mXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.851,3.402;4.blob,1.1,2968.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;3.end,1.1;4.sync,10.6492369429;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.rect,1.1,3.881,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1170,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1180,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.861,3.345;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABbklEQVRYhdWX527CMBRGnTQF2mJKOqF70kEHnXTTPeneff8HaeoocUDcG8exrPT8QNH95C/JQQibEB/DNNusdgJjpJAwJJUhnVHd6NDR2YWkWZNBw2Y+Ro525+0euFG3tExadeMf2V4k7KO0P0/pQNjMxxh0PgrFIbBRs7ThkVHFjYyx8dav7zExKTZzYdKmpmfAOs3SZi3FhS6luXk0l5BGFhbBOr3SykvLags9VlbRWEZaZQ2s0yttfWNTbaHHlr2Nxf9aWnVHbR9ndw9LZaTtJ+TneXB4pLQvQO0YSyWklU8S8keQOj1T2hfgvHiBpBLSLpOy5chdKa1r4LqChBGlOZvbqpmQze2NDX95sbm9qwOJ4Oa2fs8osWPUg9V0xuApEZTGV8S5IoXHSBqi8fT8AjwpPzKhM8MdvQImgqmQNL4izhV5e1dpqZmPT+BJA6+Dzb6+GT+t2xtSIWl8RZwrHeD3FZ2FofvAnlh+ATOOXrbFd5mXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.402;4.blob,1.1,2956.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;3.end,1.1;4.sync,10.6492369466;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.rect,1.1,3.871,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1170,3.494,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.851,3.345;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABEVBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQCAgIYGBg3NzeDg4OKioq3t7chISFZWVns7OwGBgYICAjx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCg0NDQTExOKkmJ4AAABbklEQVRYhdWX527CMBRGnTQF2mJKOqF70kEHnXTTPeneff8HaeoocUDcG8exrPT8QNH95C/JQQibEB/DNNusdgJjpJAwJJUhnVHd6NDR2YWkWZNBw2Y+Ro525+0euFG3tExadeMf2V4k7KO0P0/pQNjMxxh0PgrFIbBRs7ThkVHFjYyx8dav7zExKTZzYdKmpmfAOs3SZi3FhS6luXk0l5BGFhbBOr3SykvLags9VlbRWEZaZQ2s0yttfWNTbaHHlr2Nxf9aWnVHbR9ndw9LZaTtJ+TneXB4pLQvQO0YSyWklU8S8keQOj1T2hfgvHiBpBLSLpOy5chdKa1r4LqChBGlOZvbqpmQze2NDX95sbm9qwOJ4Oa2fs8osWPUg9V0xuApEZTGV8S5IoXHSBqi8fT8AjwpPzKhM8MdvQImgqmQNL4izhV5e1dpqZmPT+BJA6+Dzb6+GT+t2xtSIWl8RZwrHeD3FZ2FofvAnlh+ATOOXrbFd5mXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.854,3.402;4.blob,1.1,1304.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAiCAMAAADoDqvwAAABOFBMVEXIyMhkZGQAAADk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzU1NRERETDw8MVFRUrKytHR0d3d3e0tLQYGBgMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLxjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwuUlJTl5eVpaWktLS3+/v4fHx+pqamjo6NaWlri4uKnp6cgICBXV1fy8vLQ0ND39/dFRUVmZmYvLy/W1tb7+/tycnLZ2dknJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7Ox9fX3Ozs4JCQlQUFBwcHC2tracnJyqqqoiIiINDQ2LqbumAAACU0lEQVRoge2ZeXfSQBTFQ4pCAw2VQhWxtojdtBU33LqAtrW41a5Wrdq6f/9vYAg2mYRk3pA35/RNz9w/wjtDuPfll3MyYcYwUqYE8V2EMobS3eOFiziXs5aheUqV5ilXmqdcEeKZyToa1jxdGwk8LVeJeOa6tyKbJ1AR4jliOyok4jnq3opLBCpCPBHPz2L3VthjBKrzwZOONE+50jzlSj2eJXcmzZbZio7o8BTNMHrvVeNsRUfq8bzszqT2FbaiI/V40pZx1g2cM2merPLe7ObMdbn4sXhpnqwqlnW1V1Ut61r8WLw0T1aVCft6r5qc8nhGjMVL0nwEhEh5/zTNWhWZATlXbngjdY9nxNipbk7PhNtQiWe1hsyAnAflac7OhdtQiOf8rdvIDMh5YJ4Li3dCbSjEs3EXmwE5D8yzXLgXaoMOT2i/4/6Dh9gMyFmQZ9P/6aPHoTbo8IT2O548fYbNgJyFeOaWppdXnM9G3TmsttrBNujwhPY7nr9AZ0DOQjzX1mfSixsvNzvuTXiVCbZBhyfw/Cy+foPOgJyFeL4dN813W9b73rrW9k6wDWV4poa4f/YQ1+E7i89Hzd29/2P7B4E2lOH54RCfATkPPL87+vgp0IYqPD+3jvAZkHMSnl++ltg2+vqI2k/AVP618s/zeUa6fDvm9CeawXdOxvOk853J7ecZtZ+AqfxrBc/jdGBu/eB9K5jBd3bY/fTW5toez4ixgH79ZnL7eUbtJ2Aq/1rB8zgdgN8KZUB7JcnX60796Dw/KWT8sb21Odv+Gz8Wr38AOqqSyh/WhAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.459;4.blob,1.1,2016.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;3.end,1.1;4.sync,10.6492369506;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.copy,1.1,2.20,3.494,4.1140,2.19,2.14,1.1,2.10,3.494;4.copy,1.1,4.1170,3.494,2.30,2.19,2.14,1.1,4.1160,3.494;4.rect,1.1,3.861,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.841,3.345;4.blob,1.1,1004.iVBORw0KGgoAAAANSUhEUgAAAWYAAAAPCAMAAADgdJUCAAABGlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcEFBQUICAgCAgKVlZXc3NxLS0v09PQLCwstLS0fHx9UVFSpqamjo6PQ0NB8fHwhISE0NDQRERG1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7OwGBgbx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCgTExNmAdOjAAABkUlEQVRYhd2YZ2/CMBCGnTQFWjAlndA96aATumkL3XvQPf//32jqNMRI9cXCFyvq8wFZ99qH70W65CCkjmGaLVYrEWPEADFAbYZ4AjujQ1t7ElBTJoMGxRQw0rQjY3cCGzTbnIhjZ/wh1QWI3ZT2ZCjtDYopYPQ5H9lcv3iDXpsHBoeQMzKGR2DDRsfkYs3CbB6fmBRv0GvzlIWc0CU/PQPqWmwms3PiDVptLswv4Cb0WFwCZVSbl1cYRS7k2lxaFZ7Ra/Pa+gZuQo9NewuSUW3+fXxuc6GI2Vzewc3ns7sHqag2V6qMfS7k2nwQkaZxeHSMmo/j5BRStTSNwllEHoGx82Lwpua4yF0CqpamcRWVF7r0NWq6Bm5KgBh603DGk7IZkfGkYot/bmVu72oCJbTxpOZ2jzwbtu+tpEglkjb7J1RWJPugVBXM49Oz4Kb+YA3HpOuou+MmeRF4x6tSNvsnVFbk9Q3BTiHvH4KbcuWAMek6PD7d7vH1930aVCmb/RMqKx3A3wvHwqxD919H/4hvjedonFwgNjsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.844,3.402;4.blob,1.1,1304.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAiCAMAAADoDqvwAAABOFBMVEXIyMhkZGQAAADk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzU1NRERETDw8MVFRUrKytHR0d3d3e0tLQYGBgMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLxjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwuUlJTl5eVpaWktLS3+/v4fHx+pqamjo6NaWlri4uKnp6cgICBXV1fy8vLQ0ND39/dFRUVmZmYvLy/W1tb7+/tycnLZ2dknJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7Ox9fX3Ozs4JCQlQUFBwcHC2tracnJyqqqoiIiINDQ2LqbumAAACU0lEQVRoge2ZeXfSQBTFQ4pCAw2VQhWxtojdtBU33LqAtrW41a5Wrdq6f/9vYAg2mYRk3pA35/RNz9w/wjtDuPfll3MyYcYwUqYE8V2EMobS3eOFiziXs5aheUqV5ilXmqdcEeKZyToa1jxdGwk8LVeJeOa6tyKbJ1AR4jliOyok4jnq3opLBCpCPBHPz2L3VthjBKrzwZOONE+50jzlSj2eJXcmzZbZio7o8BTNMHrvVeNsRUfq8bzszqT2FbaiI/V40pZx1g2cM2merPLe7ObMdbn4sXhpnqwqlnW1V1Ut61r8WLw0T1aVCft6r5qc8nhGjMVL0nwEhEh5/zTNWhWZATlXbngjdY9nxNipbk7PhNtQiWe1hsyAnAflac7OhdtQiOf8rdvIDMh5YJ4Li3dCbSjEs3EXmwE5D8yzXLgXaoMOT2i/4/6Dh9gMyFmQZ9P/6aPHoTbo8IT2O548fYbNgJyFeOaWppdXnM9G3TmsttrBNujwhPY7nr9AZ0DOQjzX1mfSixsvNzvuTXiVCbZBhyfw/Cy+foPOgJyFeL4dN813W9b73rrW9k6wDWV4poa4f/YQ1+E7i89Hzd29/2P7B4E2lOH54RCfATkPPL87+vgp0IYqPD+3jvAZkHMSnl++ltg2+vqI2k/AVP618s/zeUa6fDvm9CeawXdOxvOk853J7ecZtZ+AqfxrBc/jdGBu/eB9K5jBd3bY/fTW5toez4ixgH79ZnL7eUbtJ2Aq/1rB8zgdgN8KZUB7JcnX60796Dw/KWT8sb21Odv+Gz8Wr38AOqqSyh/WhAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.821,3.459;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAAVwAAAAiCAMAAAAkl5EbAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkocHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKgyMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi5GRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MBAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MEBAReXl4FBQUCAgInJydISEhiYmLu7u61tbUZGRlQUFCwsLCLi4tLS0v09PQLCwtUVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBhAQECsrKzCwsItLS3+/v4fHx+pqamjo6MhISE0NDQRERGMjIxaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbFycnLZ2dnk5OSNjY0QEBCFhYX8/PyKioqtra1ERESWlpYzMzO3t7eVlZUsLCwpKSlfX19nZ2ehoaFZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5eGhoZwcHCcnJwoKCgTExPIC94xAAAC6UlEQVRoge1Z+VvTQBBdriJSoIh4AdGK0EpVFCl4oIKAIoqoeOCBIl6I961VRMUT9X82R5vsJpvdndCvrOm+H5Ltzrz55nuQSbsPIT+UlPqGUFm5fwyeVxGpXFW1WqyidNzqaE0AemmJfyyv4tbWxerXNKwVqygft3EdnL5+w0b/YF7F3dTUjFCLtlmspHTcLfGtYHrrNkbQK1pbeyK5vZqf50VHaodx3bkL0p1E3M7de6D0ruRecqO72UTa/OARrSce6d23/4C7SjaP4NoNZu8HtT7jFjuE5wmuJOAidLgdKu6R/gFyo1EzcZQu7uBQF0LD2jG6uA43bXbXrS+OR0dO6KHW0QrtpJFzagzPE1xJwEXo9PgZoLhnz7k2Js6buEAXt7/KuKYu0sV1uC1md/of/NJkzeX4lavXpgawRp08wZUEXB3Xb8C0nU7cdO0wx8KMdsu43b5DF9fhTpvd3UXo3ixC9+e0B7O5R+zho+CP50pydTx+AhO3/GnatcMeC1HrP/cZXVyCi6Gj57l+qTNeDmjkRYDHUwKujtGXbSBxx165d9hj4bU1c9/QxSW4Hrxt0r+M92rvAjyeEnANZN5DtJ0Y/8CMe8SdT2SGPzZEuHk01CZj9QupT+LdScf9/GWRnrZozZFOfIW+fmPX9or2/Uci9dPzbVrsx8Z8pnLyV8CfoVJwZ6b6iKCtZJk1R/T3i7NCc0vs0vk9W/j/8XuQ+Ggr+ceaI38RtuJCicsEQEkKlLgKCgoKClIDfwEVzubhceFVVp7LCRbM5uFywydu4WweLjd84gJtnuXlsbmhExdo87DrUW0e8UZDJ27W5rFtGc55Lrue33muYKOhEzdr89i2DOc8l12PfZ7L7SVs4uZsHtuWUWMBxmUFoTYPu54aC0QQavOw66mxgAfBNs8y89jckIkraPPQLCLMLCpacQkNPIUFbR6aRYSZRUUrLqEBpbBQEZpFRFgcRSou3ebJ9ywtUnFz+AcGqEh75GisBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492369547;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1062,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1020,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.960,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1173,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,4.1022,3.210;4.blob,1.1,1252.iVBORw0KGgoAAAANSUhEUgAAAK8AAAASCAMAAAAaGH7sAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAAB1UlEQVRIia3UVVfDQBAF4IVihUKxUlqsuBUP7u7uUNwp7u4/nHTaQNjuZHIOuS+52e4385JTxuSEMCyhJvH5/wV2T4cIC0dNRGSU6NgAgdzTIczRMfC0xMZZ4xP+NpaYJBilCGE0BTVZc4dfJNtS4M2e6ohwpqVnqBtjmdasoFGKEEdLUJO1d/iFy2qBt+yc3Lz8goJCdZNTVBzkFIFEQ1CTiR0gSkqhu8vKKyqrqk01quaLU8rlWUBgwQU5mdgBojYbel29vcHS2MSa7b/Nd94itfIsILDggpxM7PCJNskFvb2oI491drHunt8GP/T2cUoRaFBBTSZ3yKJfGoA6ODScxNpHRm2qBhkb55Ai0KCCmkzukEWHNAF1cmp6ZnZufqFE1SCLSxxSBBpUUJPJHbIol/x/K2bH8oxnZXVtXdUgG5scUgQaVFCTyR2yWPZsQd3e2TXtsb19dfMl+eCQQ4rAggtqMrUDhDfwFR0dn5hPz/42OQlSI8+8+HdHCGoysQPE+UXg7fLq+uaWa4zd3bt59iPE0RLEZGIHiAfPo9b2p+egI4OE4J4uMe8Yxd3pS0vwoSFCeE+PML2+oer9/kNwaoQQ39Ml9j9RNfAlPDZAIPco8Q1cRJhQo/31wAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.902,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.882,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.831,3.345;4.blob,1.1,1004.iVBORw0KGgoAAAANSUhEUgAAAWYAAAAPCAMAAADgdJUCAAABGlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcEFBQUICAgCAgKVlZXc3NxLS0v09PQLCwstLS0fHx9UVFSpqamjo6PQ0NB8fHwhISE0NDQRERG1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7OwGBgbx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCgTExNmAdOjAAABkUlEQVRYhd2YZ2/CMBCGnTQFWjAlndA96aATumkL3XvQPf//32jqNMRI9cXCFyvq8wFZ99qH70W65CCkjmGaLVYrEWPEADFAbYZ4AjujQ1t7ElBTJoMGxRQw0rQjY3cCGzTbnIhjZ/wh1QWI3ZT2ZCjtDYopYPQ5H9lcv3iDXpsHBoeQMzKGR2DDRsfkYs3CbB6fmBRv0GvzlIWc0CU/PQPqWmwms3PiDVptLswv4Cb0WFwCZVSbl1cYRS7k2lxaFZ7Ra/Pa+gZuQo9NewuSUW3+fXxuc6GI2Vzewc3ns7sHqag2V6qMfS7k2nwQkaZxeHSMmo/j5BRStTSNwllEHoGx82Lwpua4yF0CqpamcRWVF7r0NWq6Bm5KgBh603DGk7IZkfGkYot/bmVu72oCJbTxpOZ2jzwbtu+tpEglkjb7J1RWJPugVBXM49Oz4Kb+YA3HpOuou+MmeRF4x6tSNvsnVFbk9Q3BTiHvH4KbcuWAMek6PD7d7vH1930aVCmb/RMqKx3A3wvHwqxD919H/4hvjedonFwgNjsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.811,3.402;4.blob,1.1,2932.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;3.end,1.1;4.sync,10.6492369590;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.rect,1.1,3.841,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.821,3.345;4.blob,1.1,1004.iVBORw0KGgoAAAANSUhEUgAAAWYAAAAPCAMAAADgdJUCAAABGlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcEFBQUICAgCAgKVlZXc3NxLS0v09PQLCwstLS0fHx9UVFSpqamjo6PQ0NB8fHwhISE0NDQRERG1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7OwGBgbx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCgTExNmAdOjAAABkUlEQVRYhd2YZ2/CMBCGnTQFWjAlndA96aATumkL3XvQPf//32jqNMRI9cXCFyvq8wFZ99qH70W65CCkjmGaLVYrEWPEADFAbYZ4AjujQ1t7ElBTJoMGxRQw0rQjY3cCGzTbnIhjZ/wh1QWI3ZT2ZCjtDYopYPQ5H9lcv3iDXpsHBoeQMzKGR2DDRsfkYs3CbB6fmBRv0GvzlIWc0CU/PQPqWmwms3PiDVptLswv4Cb0WFwCZVSbl1cYRS7k2lxaFZ7Ra/Pa+gZuQo9NewuSUW3+fXxuc6GI2Vzewc3ns7sHqag2V6qMfS7k2nwQkaZxeHSMmo/j5BRStTSNwllEHoGx82Lwpua4yF0CqpamcRWVF7r0NWq6Bm5KgBh603DGk7IZkfGkYot/bmVu72oCJbTxpOZ2jzwbtu+tpEglkjb7J1RWJPugVBXM49Oz4Kb+YA3HpOuou+MmeRF4x6tSNvsnVFbk9Q3BTiHvH4KbcuWAMek6PD7d7vH1930aVCmb/RMqKx3A3wvHwqxD919H/4hvjedonFwgNjsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.824,3.402;4.blob,1.1,1304.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAiCAMAAADoDqvwAAABOFBMVEXIyMhkZGQAAADk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzU1NRERETDw8MVFRUrKytHR0d3d3e0tLQYGBgMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLxjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwuUlJTl5eVpaWktLS3+/v4fHx+pqamjo6NaWlri4uKnp6cgICBXV1fy8vLQ0ND39/dFRUVmZmYvLy/W1tb7+/tycnLZ2dknJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7Ox9fX3Ozs4JCQlQUFBwcHC2tracnJyqqqoiIiINDQ2LqbumAAACU0lEQVRoge2ZeXfSQBTFQ4pCAw2VQhWxtojdtBU33LqAtrW41a5Wrdq6f/9vYAg2mYRk3pA35/RNz9w/wjtDuPfll3MyYcYwUqYE8V2EMobS3eOFiziXs5aheUqV5ilXmqdcEeKZyToa1jxdGwk8LVeJeOa6tyKbJ1AR4jliOyok4jnq3opLBCpCPBHPz2L3VthjBKrzwZOONE+50jzlSj2eJXcmzZbZio7o8BTNMHrvVeNsRUfq8bzszqT2FbaiI/V40pZx1g2cM2merPLe7ObMdbn4sXhpnqwqlnW1V1Ut61r8WLw0T1aVCft6r5qc8nhGjMVL0nwEhEh5/zTNWhWZATlXbngjdY9nxNipbk7PhNtQiWe1hsyAnAflac7OhdtQiOf8rdvIDMh5YJ4Li3dCbSjEs3EXmwE5D8yzXLgXaoMOT2i/4/6Dh9gMyFmQZ9P/6aPHoTbo8IT2O548fYbNgJyFeOaWppdXnM9G3TmsttrBNujwhPY7nr9AZ0DOQjzX1mfSixsvNzvuTXiVCbZBhyfw/Cy+foPOgJyFeL4dN813W9b73rrW9k6wDWV4poa4f/YQ1+E7i89Hzd29/2P7B4E2lOH54RCfATkPPL87+vgp0IYqPD+3jvAZkHMSnl++ltg2+vqI2k/AVP618s/zeUa6fDvm9CeawXdOxvOk853J7ecZtZ+AqfxrBc/jdGBu/eB9K5jBd3bY/fTW5toez4ixgH79ZnL7eUbtJ2Aq/1rB8zgdgN8KZUB7JcnX60796Dw/KWT8sb21Odv+Gz8Wr38AOqqSyh/WhAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.801,3.459;4.blob,1.1,2284.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;3.end,1.1;4.sync,10.6492369628;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.rect,1.1,3.831,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.811,3.345;4.blob,1.1,1020.iVBORw0KGgoAAAANSUhEUgAAAYQAAAAPCAMAAADTY0hOAAABGlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcEFBQUICAgCAgKVlZXc3NxLS0v09PQLCwstLS0fHx9UVFSpqamjo6PQ0NB8fHwhISE0NDQRERG1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7OwGBgbx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCgTExNmAdOjAAABnklEQVRYheWYaVPCMBCG01oBhSL1BO8TD7zxRgXv+8D7/P9/Q2ykpTPJNtBtyIzPB2Zn38026cukbQhx0HS9xWglfLQIIPqojRCNYXes0NYeB9SEbmP65UJDS5odKasTKJBsQiyK3fGXRBcgdptmT8o0e/1yoaH1VX7SmX5+gVwTBgaHkDvaDI/At3N0TCwXDrYJ4xOT/AK5JkwZyA0p2ekZUFfABDI7xy+QakJufgG3YZXFJVBGNWF5xWaVHTGgJuTXuB3lmrC+sYnbsMqWtQ3JqCb8PdR32BEDxUwo7OL2c9nbh1RUE4olmwN2xICacKjIdnR0fILar4bTM0hVYDvKnSvyYI5csGeJwGXmClAV2I6uVXlFTd6gtvNwmwfEJm9HlY+1gq7Ix1rR4v8ZAnN3X+YoTfpYK9MdKmsfWzwYcZ5KBE1wRwSJSPoxlNVSnp5fODN1jyjgnPA6QJw6jV7ilV3mUYVMcEcEicjbe333tT4+PjkzrVkOmBNeB4hT90V3qG92mUcVMsEdESSSAXxdOIezjkbWK/sA79/wA5/EfD6nk5vuAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.814,3.402;4.blob,1.1,1304.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAiCAMAAADoDqvwAAABOFBMVEXIyMhkZGQAAADk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzU1NRERETDw8MVFRUrKytHR0d3d3e0tLQYGBgMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLxjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwuUlJTl5eVpaWktLS3+/v4fHx+pqamjo6NaWlri4uKnp6cgICBXV1fy8vLQ0ND39/dFRUVmZmYvLy/W1tb7+/tycnLZ2dknJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7Ox9fX3Ozs4JCQlQUFBwcHC2tracnJyqqqoiIiINDQ2LqbumAAACU0lEQVRoge2ZeXfSQBTFQ4pCAw2VQhWxtojdtBU33LqAtrW41a5Wrdq6f/9vYAg2mYRk3pA35/RNz9w/wjtDuPfll3MyYcYwUqYE8V2EMobS3eOFiziXs5aheUqV5ilXmqdcEeKZyToa1jxdGwk8LVeJeOa6tyKbJ1AR4jliOyok4jnq3opLBCpCPBHPz2L3VthjBKrzwZOONE+50jzlSj2eJXcmzZbZio7o8BTNMHrvVeNsRUfq8bzszqT2FbaiI/V40pZx1g2cM2merPLe7ObMdbn4sXhpnqwqlnW1V1Ut61r8WLw0T1aVCft6r5qc8nhGjMVL0nwEhEh5/zTNWhWZATlXbngjdY9nxNipbk7PhNtQiWe1hsyAnAflac7OhdtQiOf8rdvIDMh5YJ4Li3dCbSjEs3EXmwE5D8yzXLgXaoMOT2i/4/6Dh9gMyFmQZ9P/6aPHoTbo8IT2O548fYbNgJyFeOaWppdXnM9G3TmsttrBNujwhPY7nr9AZ0DOQjzX1mfSixsvNzvuTXiVCbZBhyfw/Cy+foPOgJyFeL4dN813W9b73rrW9k6wDWV4poa4f/YQ1+E7i89Hzd29/2P7B4E2lOH54RCfATkPPL87+vgp0IYqPD+3jvAZkHMSnl++ltg2+vqI2k/AVP618s/zeUa6fDvm9CeawXdOxvOk853J7ecZtZ+AqfxrBc/jdGBu/eB9K5jBd3bY/fTW5toez4ixgH79ZnL7eUbtJ2Aq/1rB8zgdgN8KZUB7JcnX60796Dw/KWT8sb21Odv+Gz8Wr38AOqqSyh/WhAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.459;4.blob,1.1,2224.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;3.end,1.1;4.sync,10.6492369669;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.19,2.14,1.1,1.0,3.437;4.rect,1.1,3.821,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1112,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.801,3.345;4.blob,1.1,1844.iVBORw0KGgoAAAANSUhEUgAAAY4AAAAjCAMAAAC0Lx3KAAABwlBMVEUAAADIyMj////w8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJADAwPm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcEFBQUICAgCAgKVlZXc3NxLS0v09PQLCwstLS0fHx9UVFSpqamjo6PQ0NB8fHwhISE0NDQRERG1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7OwGBgbx8fHOzs4JCQny8vJQUFBgYGDW1tZwcHCcnJyqqqooKCgTExMkJCR1dXXFxcXPz89ERETu7u6ioqKvr694eHjg4OCAgIDa2toVFRVSUlK9vb2rq6tISEgXFxfq6up2dnZWVlbh4eF/f38nJydCQkLX19dMTEyTk5MuLi4+Pj7T09OdnZ0jIyMcHBze3t6IiIj6+vplZWVsbGzGxsYxMTF+fn7b29tvb28aGho6OjrMzMyNjY2/v78BAQHl5eXNzc2FhYUpKSkUFBR6enpfqbfCAAADX0lEQVRoge2a91vTQBjH01gZhQBVoQX3alUcCCIKStU6KM46UFHcG/fALYp77//X5mJJ2r733iV3Te556OeH9Lg373u5fnmu1/tW0yYJ6fq08HSNTqgKCTKiXqiukV0xR22kDonW6wSD1ecDoQajsSk6A7nBZzlqqmVXNKmfiQRnGUZzk2G0sPp8IBTLXeKtbfQb/JVj9py5kisS5s3H39gFC/n6yg2RY9HiJfQb/JVjaVhyQYtEchkaV0oObfkK+g2+ytG+cpXcgnlWr0HDUuXoWEvohFsolhxd6+g3+CpH9/oeuQXzbIhuxMJS5fi/DeiFWyiKydG3SW49m839WFSqHKkthK1wC8WSY5sii1V6+w6p9Rzs3IVFlVqs2gcU+SivyrCe1zODrbuRqFKL1R5VNroNe6WWK2BfFxJUZrHKfQ3s0xX5GpiK0v8thNl/IEuJBP41MGutZAlySHIwXEeLapxy2BkiLS1+qCyztTh8ZIjypPaBCN7HPQ8UICNkDXYUTiiIcslhZ4i0tGPH3b3D7hg+QXlSx3TQPu55oAAZJ62VbAROKIhyyWFniLT8AB8X75MzD7GZ+32EWKFChQocnCr6e7BMR0gVeDh9pqij92w6iOeYytgfx+fOp4qDFy5KqYyQuWReL19hWajClNq+vBsRXzcsk4Mlrpbu+69FMCOdtzKGLQduoQpTavuqLcdopLY0OnxdQmUMhxwsC1UIwPZVW44bMSB6U78lXhnDIQfLQhUCsH3VluP2HSDaot8Vr4yR6TcPbu6ZcrAsVBEg2zdgOWAPJD/YiD4KJQ3cN6+dJLOD0qLAJ4d1ckPkYFioIkC2b8BywB5IfrAH+hiU9JD4BI9IZozSosAnx2Pz4CZJ5GBYqCJAtm/AcsAeSH6wJ/pTKOnZc/OaJpkvKC0Kbj87WBaqAKDtq/RiNa6De9qXrzyP514O3EIVALR9lV6sshOvgZxE8xvP47mXA7dQBQBtX6UXK+0t9Fa06e88j+dBDrqFKgRs+6q90X3/wXotsBk/Jr3/uMODHHQLtQy2r9pyfJr4bHU4bcYvcQmVXUC1UMtg+6oth/b123fzxWkaDv0QOLfwPA05Zi/T/FRcjp6fv4piv5MiPwtU3bpVUg4Hf/4WdYx1B/IcU4t/GUX5MhT7YGMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.804,3.402;4.blob,1.1,1304.iVBORw0KGgoAAAANSUhEUgAAAU8AAAAiCAMAAADoDqvwAAABOFBMVEXIyMhkZGQAAADk5OR4eHjg4OCAgIB8fHwICAjh4eH///8CAgIFBQWTk5M0NDTm5uZMTEywsLAPDw8jIyMGBgYDAwNgYGAoKCgTExOsrKxsbGzU1NRERETDw8MVFRUrKytHR0d3d3e0tLQYGBgMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLxjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwuUlJTl5eVpaWktLS3+/v4fHx+pqamjo6NaWlri4uKnp6cgICBXV1fy8vLQ0ND39/dFRUVmZmYvLy/W1tb7+/tycnLZ2dknJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7Ox9fX3Ozs4JCQlQUFBwcHC2tracnJyqqqoiIiINDQ2LqbumAAACU0lEQVRoge2ZeXfSQBTFQ4pCAw2VQhWxtojdtBU33LqAtrW41a5Wrdq6f/9vYAg2mYRk3pA35/RNz9w/wjtDuPfll3MyYcYwUqYE8V2EMobS3eOFiziXs5aheUqV5ilXmqdcEeKZyToa1jxdGwk8LVeJeOa6tyKbJ1AR4jliOyok4jnq3opLBCpCPBHPz2L3VthjBKrzwZOONE+50jzlSj2eJXcmzZbZio7o8BTNMHrvVeNsRUfq8bzszqT2FbaiI/V40pZx1g2cM2merPLe7ObMdbn4sXhpnqwqlnW1V1Ut61r8WLw0T1aVCft6r5qc8nhGjMVL0nwEhEh5/zTNWhWZATlXbngjdY9nxNipbk7PhNtQiWe1hsyAnAflac7OhdtQiOf8rdvIDMh5YJ4Li3dCbSjEs3EXmwE5D8yzXLgXaoMOT2i/4/6Dh9gMyFmQZ9P/6aPHoTbo8IT2O548fYbNgJyFeOaWppdXnM9G3TmsttrBNujwhPY7nr9AZ0DOQjzX1mfSixsvNzvuTXiVCbZBhyfw/Cy+foPOgJyFeL4dN813W9b73rrW9k6wDWV4poa4f/YQ1+E7i89Hzd29/2P7B4E2lOH54RCfATkPPL87+vgp0IYqPD+3jvAZkHMSnl++ltg2+vqI2k/AVP618s/zeUa6fDvm9CeawXdOxvOk853J7ecZtZ+AqfxrBc/jdGBu/eB9K5jBd3bY/fTW5toez4ixgH79ZnL7eUbtJ2Aq/1rB8zgdgN8KZUB7JcnX60796Dw/KWT8sb21Odv+Gz8Wr38AOqqSyh/WhAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.781,3.459;4.blob,1.1,2300.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;3.end,1.1;4.sync,10.6492369710;4.copy,1.1,4.1110,3.494,2.90,2.19,2.14,1.1,4.1100,3.494;4.rect,1.1,4.1022,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1172,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.890,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.850,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.982,3.210;4.blob,1.1,1244.iVBORw0KGgoAAAANSUhEUgAAAM0AAAASCAMAAADPCqqhAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwDAwPa2tpwcHAVFRVJSUkHBwfAwMC/v79ISEiSkpLr6+seHh5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZmrq6uwsLD///8CAgLk5OQcHBykpKSqqqpcXFzBwcHf39/q6uoODg5WVlY1NTXExMTt7e0xMTGsrKzg4OATExPo6Oh/f39dXV0uLi5HR0eWlpbS0tIJCQknJydCQkLX19eVlZVxcXGCgoJGRkaAgIABAQE+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKytlZWX5+flsbGwICAjs7Ow7OzsZGRkUFBTGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29tvb2/m5uZaWlrOzs739/fn5+d5eXkaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0t7vWM+AAABz0lEQVRIia2U51PCQBTET2PDgqJYEAuoIGIUe29g7x079t577/7hAuNpPPLe3UzyPu1s9rf75SaEBC+KQBctqfvaCSinmYiJBb/HxSeo2ToQQE4zYUhMghPJKSomJYypaab0jP8KJ3jN2IYQYc7MQiLZppwIjxKWXGtcXn5BoVLhBK8Z2xAjbCYjkiH2ogiLEsUlDmepy1WmVDjBa8Y2xAh3ORIhJE92sNYPUVHpqaquqZXqFAonuM3IhiBRXwwngtcgN7LWD9HUbGkxtraRdsufwgluM7IhRnTINjgRus4uxqCE1+5zku4e0tv3p3CC14xtiBH98gCYCN/gEGNQYnhkNIV4x8YzFQoneM3YhhjhkyfARPgmpxiDEtMzs/65+YVFt0LhBK8Z2xAjPDL22wve0jJjUMJgXfEHVtfWNxQKJ3jN2IYYsRLYBBOhM29tMw4ldnb3pH2yf6BUOMFrxjYEiUP4LYYuQ25lLUocHZ8YTs/+K5zgNWMbYsT5BZwI3uVVBWv9Etc3t3f3jMIJTjO6IUQ8BB7hCCFPzxGWToRKTgdiwToOZ05fGiJNXQjVnHZCen0DE+9XHyquHoR6Tgfi4BNMDHyp2joQQE4b8Q2mgKHNArxY5AAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.862,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.771,3.305;4.blob,1.1,5296.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;3.end,1.1;4.sync,10.6492369755;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.copy,1.1,2.20,3.494,4.1070,2.19,2.14,1.1,2.10,3.494;4.copy,1.1,4.1100,3.494,3.100,2.19,2.14,1.1,4.1090,3.494;4.rect,1.1,3.861,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.369,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1123,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.781,3.330;4.blob,1.1,2172.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.761,3.437;4.blob,1.1,2624.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1081,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492369791;4.copy,1.1,2.10,3.418,4.1190,2.19,2.14,1.1,1.0,3.418;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.851,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1184,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1113,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1141,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.771,3.330;4.blob,1.1,2436.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.751,3.437;4.blob,1.1,2612.iVBORw0KGgoAAAANSUhEUgAAAbYAAAA4CAMAAACmGi1eAAACClBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGR3d3ekpKQ8PDy0tLQYGBjw8PC8vLxJSUkmJib5+fmhoaEODg7CwsJOTk7+/v50dHQyMjL9/f0bGxv4+PiEhISwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpIEBATp6eleXl7JyclLS0v09PQLCwuVlZXc3NxUVFSpqamjo6NMTEwhISEREREPDw/39/dFRUUjIyO1tbXk5OTo6OiKioqDg4POzs7x8fFKSkrW1tZwcHBgYGC2trYfHx8oKCgTExMiIiINDQ0qKiq4uLjg4OAHBwcMDAz19fVISEhaWlq3t7ccHBzq6uq6urpqamrt7e2enp6oqKjQ0NDNzc1fX18/Pz+ZmZnd3d0uLi5GRkb29vZZWVlCQkLS0tLHx8c3NzfBwcGTk5MBAQF/f3/n5+eCgoLm5uZjY2Pe3t5PT08nJydiYmLu7u4ZGRlQUFCLi4vV1dWqqqra2tpBQUFAQEAtLS0JCQmMjIx8fHx7e3vh4eHR0dGgoKC5ubmxsbFycnLZ2dl6enqNjY3l5eWFhYX7+/tmZmatra2WlpYzMzNlZWUpKSlnZ2fs7Ow6OjrExMSXl5fi4uKGhoby8vKcnJyUlJRpaWl4eHinp6cgICBXV1cvLy8QEBBpgqgQAAAFV0lEQVR4nO1c+X8TRRSfpm3GarQUQq1S24JKOYytiigKRECgIAJChUKgoFhFiwLWGxVFoCq3XB6ogCiX/I/skeyRmZ1587LZ3bLz/WEzmZn3ZvK+n8xm9n0zhGhI0ZDJNNqlpkymObhObKERMbKU3meXWii9P7hObKERMbIP5B60Sw+1OrRx6sQWUWBSm1ue3CJqhXqJDFOohXx4ttmpTrHdoY1TJ7ZgMYnShzseAU0MGElvt5bJSCfx0PZoPj+tM59/LDzbutHWle/u7JkOmZg6bTMefwLpJB7aDDw5M1TbutHWa1xmzZ4DmJU6bXM7sE40bfzWCizanio8DZiVMm19/c9gnWja+K0VWLSRqc8CZlWOpLGxMBG4pXAD/ty85wWtoMGarbEaIiqRCUbb/BcAsypHsvyT6UVJNwMLXhK1ggZ72RqrN6ISuYdpW5izsEjSjZDFxVcErbDBFltjLYmoRCYYbUvrsUi2LeP00fe28Gjre1XhJwl4kexaLmqFDRY5JhJtK1Q2ANBFcmEPz2miaZtY2+0FtB7b7Vkra3AS98OtJvtO0AgvRf5wa6BjFehDKdK2+rUanMS2SFaGt0lYAy/xkX3dScOsdWjj1Iktavso6s8k0U7ipm2dfSdYDy/xkYDETZpoCwtv5Jw0TC63IbhObFET7pFIamhoaGhoqIOVIrgI4yfJxsGBN2duUptTAm03D8E2XhxsoVuNa8OyEtYBD6wUwUUItG3bPty9Y+dbipNKoO2Ut1G+TOx6x7iM0HfRDlhwpAguQqDtvd0ZM9vyvuK0kmf7wSjqMZqJPfRDQj7aizXngSNFcMHSsW9/sf/jzfJ+FYwVPjGvn36GmFqybBs//wLhyzb9smSslF9hzTlgpAi+TA9Dx4HRwS1ff7O02ktwluhbetB8Ge71tgJLCbD14rv92CCTHXROx/djaHMWjBTBl+lhaDv0Qx8hrfRwVTWTJXKkAxvpEbMl2+VtBZYSYOvF0Z612CiP9++lI1hjHhgpgi/Tw9A2z0pSFX6sqmayRI50wBMCtxVYSoCtD7t+Qof5Z3qsAW3MgpUiCBfJcfvB6fETVUbMIulIB8oLzslT+MUqTlsfTp9Bx3lRzy9oWw5YKYJ4kRyyv21nq6qDU+lj283bOzl3HrFYJcDWh/bZ+1BBNnHhItqUA1aKIF4kf7XvbdUpCkEq/bfdm8wN5++IxSoBtn6U5qMDPe0PtCkLvhTBBUPbpWKpdWTnoLSfi239w91/FjpR00ua7Z6/mlD+DBSRCRleaj5AiuCCpePvy8XCFWbfKdqWXyoNXP0H+ZApYbbj1w763kMlEAaG2pQsnBI3Nc+XIrhIWZpUin8P+d6qSyCU5RPw1Lx3FE2bCOoSiLDkE2Jo2jQ0NDQ0NDTqCPH5CPx+UH/4uah7id8Wg6qIw+UO4vMR+P2g/lQRf+ijpq064mC5g/h8BG4/qD9lxB/6iGljIg6WO4jPR+D2g/pTRvyhj5g2JuJguYPgfASxKEHsT/bXVclc0kFbJeIejQJU7sCcj+CePyDOt4n9yf66KplLOmizI97839C568br3HYClzsw5yO45w+I821if7K/rkrmkg7a7IhvvbrqxujNW7evWd8aoNzBGbYiSnDPH9CLpJKtMsoRv7iGkP9X0wt2fgAod3CGVRUliP3pRVIOb8THDtyxC0C5gzOsqihB7E8vknJwT6QAyh0qwyqLEmrsJ7ZNA20BEYfJHSrDAkUJ0pR7SmlTP6EhKOK23CEgusyUgaIEaco9pbQhTmgIirgld5Cd6aC4+EnT5imlLWyJgcwi7HtWSmmrP+4Ck/FjwJRZSqsAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492369831;4.copy,1.1,2.10,3.418,4.1190,2.19,2.14,1.1,1.0,3.418;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.841,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1174,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1103,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1131,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.761,3.330;4.blob,1.1,2448.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.437;4.blob,1.1,2692.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;3.end,1.1;4.sync,10.6492369872;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.418,4.1190,2.19,2.14,1.1,1.0,3.418;4.copy,1.1,4.1040,3.475,3.160,2.19,2.14,1.1,4.1030,3.475;4.copy,1.1,4.1060,3.494,3.140,2.19,2.14,1.1,4.1050,3.494;4.rect,1.1,3.982,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1182,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.375,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1093,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1121,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.942,3.210;4.blob,1.1,1292.iVBORw0KGgoAAAANSUhEUgAAANoAAAASCAMAAAAKeDAwAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAAB80lEQVRIibWUVV9CQRDFV7FQFBuxscXWa3d3BwZ2d3fHBxdWrlz3zuw8XDkvzG/P/M+cB4Axj4IYpmAT/G6cwPaMEHqFhKJWWHhEgAhkzwihlzkyin9aomOssXF/JxafICFASQkqWXpDSkDtE5OSuWdLsYelpqVnaCfGMq1ZuhSVgCUjqGT5DRkBts+2WrjpyMnNyy8oKNROHhUV62JUApGEoJKJGxICbO8s4V5pWXlFZVW1qUYzeZWq5IoxPgITTpDJxA2cgNvXOrhZV29rsDQ2sWabf/K+tyitYo6PwIQTZDJxAyfA9m1KNjfbizryWGcX6+7xT9zo7RNiVAIVSlDJ5A2UANv3KwPcHBwaTmDtI6NJmolrbFyIUQlUKEElkzdQAmzfoUxwc3JqemZ2zjXv1ExcC4tCjEqgQgkqmbyBEmD7cuXnH9VsX5pxL6+srmkmrvUNIUYlUKEElUzeQAmw/ZJ7k5tb2zumXba7p528Stw/EGJUAhNOUMnUDZyA2x/6vr9Hxyfm07O/k0dxSqOYc4j/RgiCSiZuSAiw/fmFz728ur65FSbG7u5LxZhfApaMIJKJGzICav/gfpQVfXrWPf0TAewZISC57KO4efrSEiAC3DNCADK9vqHe+/1HgAh4zwgBae8TtQa+AkUge0YIQd/nVcLiauW9kwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.822,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.791,3.305;4.blob,1.1,1168.iVBORw0KGgoAAAANSUhEUgAAAIAAAAAjCAMAAABraPK5AAABoVBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0sFBQU0NDQRERHIyMhgYGAoKCiaV1XPAAABhUlEQVRYhe2TR08CURSFr6IogiICIthAEBERLGNBEbBjwYqigh0FK3bF3tuvFh5sTB6ZicnNLOTbnG9xknuSeQPwmyxgJ1vAofRHcnI5lIR5+Vj3RQVikpLCImmxLJ1BiRzpvkJZSlJVphZqyisq6QZQJa3GGaCVSkjqavSGWqOxjm5xTPU4A8wNJCyNVltTc4uglWoJNIweZUCbjkR7h6pTYu+CbhXNEg0H04Nx38loSbpMbgP09kH/AM1IZXAIY8Aw4yE5MjomB9e4V0k1wsQkxgA3M0VyembWNzfvXzBTjbC4hDHAyiT/LpE64Asur6yuUY2wvoExIBDcJBna2haEIRyhWwLFzi7GANhLfdn9g0NR9CidxZExdpQBxycpOT07v7hMawBXMQvKgOvgDbfi7R3KfQC/2sulFr13IA0QPDxyaD3FnpHuA0ReOJQ8r2j3M2TIwAdvIYKFzdCwMQQhm6Ehfid8sBkamU/A+yf4twSSr0vB24DP5Ov64m3Ad/J1OX8AnC6gVcN/EogAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.751,3.337;4.blob,1.1,1080.iVBORw0KGgoAAAANSUhEUgAAAaIAAAAXCAMAAAB+pbsvAAABGlBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExPw8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSkqkpKQ8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJDm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcEFBQUCAgKVlZXc3NxLS0v09PQLCwstLS0fHx9UVFSpqamjo6PQ0NB8fHwhISERERG1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7Ozx8fHOzs4JCQny8vJQUFDW1tZwcHCcnJyqqqodhKGLAAAByklEQVRoge2ZZ3PCMAyGoZCuFGghFDqhew866aYt3Xvv//83miblWJEcjOgpVz8fOJ1fJGyJ89mWz8ccf5NFgMrijgfnHNQsmqks7nhwzi2tFm1UFne8OGeFQqFQKBR8MA957XoH9oUQ6o6qMoQj1BFNOruiiBqzD7qGaKyhwJkMxo3uRLJHxlWsyhAJU0f8IdaLiH2G0Z8wjAHRWENBSjRofqTSQxKuYlWC4ZFR4ogWY+N4sicm3Y01DkGJpqZnJFzFqgSzOnFAm8DcPKqzL5FvYVHCVazWTmZpmTZggZVVVCYt0Zr9zrbubAGISpTdkHAVq7WzubVNG7DATnIXk0lL9HvU2HO2ADxTotw+bbwiB4eYSlqivP3OduRsAYhKdMxkozs5PSONV8L5Baay3+gyl0yOC6EreA11cp2+QVT2G90tl0N3/I40XBn3WURkvdGZV9ecxuTqmk/Cf5W6eXj0AwrLq2ux/RrUtCc9CqkOro6BidrXqWeyFVfz8voGzLT42IOP0bThAY/KTOLt1zLVVYmI2tfvH27zLcPnFzDTkuWgYzRteMCjMpN4+7VMdVUi77Sv8d/Fx2jWAXhUZdI9f/2M+l+pyOQ3d1w3h7WlAeYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.754,3.399;4.blob,1.1,520.iVBORw0KGgoAAAANSUhEUgAAAbMAAAASCAMAAADmBMBKAAAAYFBMVEUAAAAFBQUICAgDAwOsrKz///9sbGzDw8M0NDQVFRXIyMhkZGTk5OR4eHjg4OCAgIC0tLR8fHzh4eECAgKTk5Pm5uZMTEywsLAPDw8jIyMGBgZgYGC2trYoKCgTExMiIiLvqlQTAAAA4UlEQVRYhe2Z6wqDMAxGtWu3zt3v9+3933I2jk5ZcFYFm5DzQ0KRph9HsNokEWInVWo09BqEMLQx46HXIIShJ3ZaGchmfUxbP0ujHvOFuy5X3WYhD5JSr//f00+n0B7iDBBn9BBn9KDlbKNytuLsZyhiZwZo5WzndKuUfIWnjNjZ3uYcWjk7gu4T+QpPGbGzDu+zs9NtL+QrPCVPZ4wQZ/QQZ/Rg6ewKuyz3p/tbMaLGmc8bjbOmPbLim+BWrhiBObsXz6XPS87ZA3ZZ9lmuGIE5+5zF+LzknDEHSfmy1bOYN22BG9O3umXXAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.731,3.437;4.blob,1.1,1988.iVBORw0KGgoAAAANSUhEUgAAAbYAAAAlCAMAAAAZUjwbAAAByFBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGR3d3ekpKQ8PDy0tLQYGBjw8PC8vLxJSUkmJib5+fmhoaEODg7CwsJOTk7+/v50dHQyMjL9/f0bGxv4+PiEhISwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpIEBATp6eleXl7JyclLS0v09PQLCwuVlZXc3NxUVFSpqamjo6NMTEwhISEREREPDw/39/dFRUUjIyO1tbXk5OTo6OiKioqDg4POzs7x8fFKSkrW1tZwcHBgYGC2trYfHx8oKCgTExMiIiINDQ0MDAz19fVISEhaWlq3t7eoqKjQ0NDNzc1fX18/Pz9GRkb29vZZWVlCQkLS0tLHx8c3NzfBwcGTk5Pm5uZjY2Pe3t5PT08nJye4uLhiYmLu7u4BAQGLi4tqamrV1dWqqqra2tpBQUGUlJTl5eVpaWktLS0JCQmMjIzi4uJ4eHinp6cgICBXV1fy8vJ8fHx7e3vh4eHR0dGgoKBmZmYvLy/7+/tycnLZ2dl6enqNjY0QEBCtra1lZWUpKSnt7e3s7Ow6OjrExMSXl5dQUFCcnJwvcfjLAAADxUlEQVRoge2a+VfTQBDHty10RatcBasg1pNLBBVQFKiCF4h4UKiIggJeoKh44okX4n3rv2tIICnZe9ukCeTzQ9683Z3dab6vm2xmAPBg4vP7A5qV5fdnk9voHh42E4RwhWblQLiS3Eb38LCZ4KrQas1ak6vLhmmje9hBXr5hF+TQenlnsY1CqBJOn2+wSDeLddkwbXQPlDwI10bWcQXGeSeTh+UUSE6SGdnWh8MlpeHwhvT5WiZbWXhjaXQTT2Dism3eslVykszIprBte1p9LZOtXLlUVFZxRCUuW3VEdhJPNnzvAqpsO2p2ckQlLFtt3S7ZSTzZ8L0LqLKBot0cUc3fSeVgMQfxSGHc8D31DZRersWy1bV8NlnAZbI17uWIav5Ozr8y7WMMU2jaT+vlWuyAula5TRZYwrI1h1RaGMMAaI0dpPTyLdaqrnXIJgu4TLY2KzbJ/HbMGO/Zlj7Zag8LvJJwb5JlR2i9fIvZjptkOypyAODdJJujuEkdLZu7jttN0IrjdsWxFCbJ9MetLO1JEOC3bP+4dTzSwfWjBGXrPJHCJBnbJBeW10To4rfwBE/qaZhuXTZMG90jtZ8i/k1SepJMy3ZKexKc5rfwOCBxs5xkSxdnQnoaJhQ6S26je6TEErmTHh4eHh4e4qClCAYWvZL0xJmHGGJUDvYl0Qv7lKuvPSE7AQ60FMHAqjfJwnOsEeSonOtLpP+8chmAF6QnQMGUIhhYJdvFQcYnKUpUjvUlMwQvAXB5WNYdB6YUwQCVY2Q0Vnelhz2OTuDqNemoHOtLJnA9oeyUN2TdMSClCIsyPYgcY4PjvTdvtZlnoWWJJjAWuD3KFZWbfGncgVWRuxPscdwgpQiLMj2IbJP3agHIhfdNzUiWSC8dyH4Qf/hI6aouNizl8jjazY7KXb40puqG4YCsMw6kFGFRpgeRrV5NUtU8MTUjWSK9dKDvacezwecvXk43GNbc0P5X7Kjc5UvlNXzjk3ZGQUsRqJvklPbh9O07kxOySeqlAzNdALzvhLNdSdYcHz6yo3KVL52W6CdpXwxoKQJ9k4xr/7bPpmZGKn1i7IvZKq4c4YvKLb4MZmekXTGgpQj0TfKr9mwzpyg4U+nJJBpFonK+L4OSb9KuKPhSBANEtu+xRO7Aj3HmODZDP7Nko3KiL4uYZEIGl5onlCIYoHL8+h2r+YOcOyVkm5r+S+piReUYX94SCIV4vpCHbmFT8/hSBAMr06T/Jkk9rKgc4yteAiFcPsGfmk9eZXllt0URL4FIV/kEHU+2DPMfHa8XJmM/mdoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.744,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492369914;4.copy,1.1,2.10,3.418,4.1190,2.19,2.14,1.1,1.0,3.418;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.copy,1.1,4.1050,3.494,3.150,2.19,2.14,1.1,4.1040,3.494;4.rect,1.1,3.821,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1181,3.375,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1083,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1111,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.741,3.330;4.blob,1.1,2460.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.721,3.437;4.blob,1.1,1988.iVBORw0KGgoAAAANSUhEUgAAAbYAAAAlCAMAAAAZUjwbAAAByFBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGR3d3ekpKQ8PDy0tLQYGBjw8PC8vLxJSUkmJib5+fmhoaEODg7CwsJOTk7+/v50dHQyMjL9/f0bGxv4+PiEhISwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpIEBATp6eleXl7JyclLS0v09PQLCwuVlZXc3NxUVFSpqamjo6NMTEwhISEREREPDw/39/dFRUUjIyO1tbXk5OTo6OiKioqDg4POzs7x8fFKSkrW1tZwcHBgYGC2trYfHx8oKCgTExMiIiINDQ0MDAz19fVISEhaWlq3t7eoqKjQ0NDNzc1fX18/Pz9GRkb29vZZWVlCQkLS0tLHx8c3NzfBwcGTk5Pm5uZjY2Pe3t5PT08nJye4uLhiYmLu7u4BAQGLi4tqamrV1dWqqqra2tpBQUGUlJTl5eVpaWktLS0JCQmMjIzi4uJ4eHinp6cgICBXV1fy8vJ8fHx7e3vh4eHR0dGgoKBmZmYvLy/7+/tycnLZ2dl6enqNjY0QEBCtra1lZWUpKSnt7e3s7Ow6OjrExMSXl5dQUFCcnJwvcfjLAAADxUlEQVRoge2a+VfTQBDHty10RatcBasg1pNLBBVQFKiCF4h4UKiIggJeoKh44okX4n3rv2tIICnZe9ukCeTzQ9683Z3dab6vm2xmAPBg4vP7A5qV5fdnk9voHh42E4RwhWblQLiS3Eb38LCZ4KrQas1ak6vLhmmje9hBXr5hF+TQenlnsY1CqBJOn2+wSDeLddkwbXQPlDwI10bWcQXGeSeTh+UUSE6SGdnWh8MlpeHwhvT5WiZbWXhjaXQTT2Dism3eslVykszIprBte1p9LZOtXLlUVFZxRCUuW3VEdhJPNnzvAqpsO2p2ckQlLFtt3S7ZSTzZ8L0LqLKBot0cUc3fSeVgMQfxSGHc8D31DZRersWy1bV8NlnAZbI17uWIav5Ozr8y7WMMU2jaT+vlWuyAula5TRZYwrI1h1RaGMMAaI0dpPTyLdaqrnXIJgu4TLY2KzbJ/HbMGO/Zlj7Zag8LvJJwb5JlR2i9fIvZjptkOypyAODdJJujuEkdLZu7jttN0IrjdsWxFCbJ9MetLO1JEOC3bP+4dTzSwfWjBGXrPJHCJBnbJBeW10To4rfwBE/qaZhuXTZMG90jtZ8i/k1SepJMy3ZKexKc5rfwOCBxs5xkSxdnQnoaJhQ6S26je6TEErmTHh4eHh4e4qClCAYWvZL0xJmHGGJUDvYl0Qv7lKuvPSE7AQ60FMHAqjfJwnOsEeSonOtLpP+8chmAF6QnQMGUIhhYJdvFQcYnKUpUjvUlMwQvAXB5WNYdB6YUwQCVY2Q0Vnelhz2OTuDqNemoHOtLJnA9oeyUN2TdMSClCIsyPYgcY4PjvTdvtZlnoWWJJjAWuD3KFZWbfGncgVWRuxPscdwgpQiLMj2IbJP3agHIhfdNzUiWSC8dyH4Qf/hI6aouNizl8jjazY7KXb40puqG4YCsMw6kFGFRpgeRrV5NUtU8MTUjWSK9dKDvacezwecvXk43GNbc0P5X7Kjc5UvlNXzjk3ZGQUsRqJvklPbh9O07kxOySeqlAzNdALzvhLNdSdYcHz6yo3KVL52W6CdpXwxoKQJ9k4xr/7bPpmZGKn1i7IvZKq4c4YvKLb4MZmekXTGgpQj0TfKr9mwzpyg4U+nJJBpFonK+L4OSb9KuKPhSBANEtu+xRO7Aj3HmODZDP7Nko3KiL4uYZEIGl5onlCIYoHL8+h2r+YOcOyVkm5r+S+piReUYX94SCIV4vpCHbmFT8/hSBAMr06T/Jkk9rKgc4yteAiFcPsGfmk9eZXllt0URL4FIV/kEHU+2DPMfHa8XJmM/mdoAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.741,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492369952;4.copy,1.1,2.10,3.418,4.1190,2.19,2.14,1.1,1.0,3.418;4.copy,1.1,4.1050,3.475,3.150,2.38,2.14,1.1,4.1040,3.475;4.copy,1.1,4.1040,3.494,2.10,2.19,2.14,1.1,4.1030,3.494;4.rect,1.1,3.811,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1171,3.375,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1073,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1101,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.731,3.330;4.blob,1.1,2548.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.711,3.437;4.blob,1.1,2964.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;3.end,1.1;4.sync,10.6492369995;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.copy,1.1,4.1040,3.475,3.160,2.38,2.14,1.1,4.1030,3.475;4.copy,1.1,2.20,3.494,4.1010,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.801,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.369,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1161,3.375,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1193,3.399,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1063,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1091,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.721,3.330;4.blob,1.1,2248.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.701,3.437;4.blob,1.1,2204.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.714,3.478;4.blob,1.1,616.iVBORw0KGgoAAAANSUhEUgAAARMAAAAPCAMAAADwFNveAAAAjVBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExPSj7TGAAAA+klEQVRYhe2U2Q6DIBBFEe1ea/fFLnbf2///vFowFoyYGWICSb0vzMOc4c5NgBCHpnI9qpTYVyRoXzGLn1IiS8QJngvhoPPxsjCTWr0B4aDz8bIwk2YLxEHn42VfJu1OV271e0wB6qakT2I1vZlihUz6g+H3CNgyflyNxkwT1E1Jn8RqejPFCplMZ+yYs2UWcRUumVaom5I+idX0Zor9ZbLeRPxky2xp9XYodXbZBaq3sz9kW//+7YTHE5CDzsfLtkzOFxB35f/ELb/ScqT0ZopNM7k/QBzh/8Qzv9JypPRmiiXIN/Hi/8Q7v9JypPRmisVmUlpfMWs0kw8gei+gCtQxOgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1021,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370034;4.copy,1.1,2.10,3.475,4.1190,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.942,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1140,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.810,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.369,1.7,2.48;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.364,1.2,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1151,3.375,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1183,3.399,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1053,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.770,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.902,3.210;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAARYAAAASCAMAAACpdQHfAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwDAwPa2tpwcHAVFRVJSUkHBwfAwMC/v79ISEiSkpLr6+seHh5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZmrq6uwsLD///8CAgLk5OQcHBykpKSqqqpcXFzBwcHf39/q6uoODg5WVlY1NTXExMTt7e0xMTGsrKzg4OATExPo6Oh/f39dXV0uLi5HR0eWlpbS0tIJCQknJydCQkLX19eVlZVxcXGCgoJGRkaAgIABAQE+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKytlZWX5+flsbGwICAjs7Ow7OzsZGRkUFBTGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29tvb2/m5uZaWlrOzs739/fn5+d5eXkaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0t7vWM+AAACFklEQVRYhbWVWVcTURCER4NoQKKRIMQEScRExEFwi7IIJLjENYKKRiCyyeYSF8AFBEV+OD4wMLm3b3Wfw0w99albX9fphzljWf91yDLpcID2D06Ycgcn+JxMVUeMT9VHj/lEGHIeEGxOpmBNrfnxeB0gQidOhk/VV06Y4DajDinB5XRRd0QaTgOiMdykeQ4RPROrjjefbXFPmOA2ow4pweV0kXckwiHEJM9plkO0nk+lL7S1XXRPmOA2ow4pweV0kXe0X4JM3E6p1i7Rcbmz68rVa4HrrgkT7GbQISXYnCb6jhutEMrYN1Vrl7jVHe0J9fZZt6P7EybYzaBDSrA5TeQd/XYCUwODiuEQ2WQubQ3dse7e258wwW1GHVKCy+ki77hv5zH14KFiOMSjx0/qrOzTQoNrwgS3GXVICS6ni7wjZz/D1PCIYjjE8xcvR1+9Lr5pd02Y4DajDinB5XSRd3TazN9sbFwxHCIYmxgtvZ2cmnZNmOA2ow4pweV0kXdMlGYgFJl9pzgOMTe/EFi0FpfcEya4zahDSnA5XfQd7/F3WG/3qpZDfPj4KVj+XDlhgtuMOqQEl9NF3vHlK2S+LXeo1h6xsvr9x09lwgSzGXZICSZHiLrjV2kNIeu/Ncsjgsh5RMCcVMVYwfxY3sj4RJA5TwgmJ1Rg84/x7e/ylk8EnfOC4HJSLf0zPuW3/SIMOQ8INifQDtiT2F/8HnBVAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.782,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.691,3.305;4.blob,1.1,4696.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;3.end,1.1;4.sync,10.6492370077;4.copy,1.1,2.10,3.361,4.1190,2.76,2.14,1.1,1.0,3.361;4.copy,1.1,3.990,3.475,3.210,2.38,2.14,1.1,3.980,3.475;4.copy,1.1,2.10,3.494,3.980,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.781,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.364,1.2,2.72;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1043,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.701,3.330;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAAaIAAAAeCAMAAABZqurnAAABGlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSko8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJDm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7Ozx8fHOzs4JCQny8vJQUFDW1tZwcHCcnJyqqqo07GOSAAAB5UlEQVRoge2aZ1PCQBCGUYkoYEFACYIV7L1gQUWx9971//8NYyJDvb1wbmQz7vOBubmX3Vx2mU3uFo/HJk3NJi2yEdMwvJpJq2zENAxfm0m7bMQ0DC505OFCRx4udAzjVvzWUy6ANaKOC9cctJ5yHVgj6rhwzZ3WU64La0QdN66ZYRiGYRg6GC953aEe6Ath0BxUVYhEsT0a9PbFAPXnIEuXzTmKOJLBuN6fSA6omMpVFaIRbI/feAcBcUjXhxO6PiKbcxQgRaPGRyo9pmAqVxUYn5hE9mgyNQ0He2bW3pxzSFI0N7+gYCpXFVgMITu0CCwtgzr5FHlWVhVM5Wr9ZNbWcR0W2NgEZdQUKfXWZCnKbimYytX62d7J4TossJvcg2TUFCn11lyTovw+rr8iB4eQipoipd6aLEVHRArd8ckpqr8Szs4hlXyhy1wQeV0IXzr2R4ir9DWgki90N1ReuuO3qO7KuMsCIulCZ2xd8xqRrasvKf6p/Jr7B79AIbl1LbZfg5r2GIqJ1BqmNR0jta9TT2h3XM3zy6tgpcXDHngOpw0vsKiMJNx+LVNtpQipff32bjfeKnx8ClZacjvgHE4bXmBRGUm4/Vqm2kqRe9rX8HXhOZz7EFhURdI+f32M+l+piOQXJBE+kHWRhKsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.437;4.blob,1.1,2080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.694,3.478;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAAR0AAAAPCAMAAADu3ettAAAA/1BMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExNhUoHKAAABZ0lEQVRYheWWaVPCMBCGwwKiQvEGooIHUu8DxfvA+771//8Wm5RJVmw7SaYzKeN+oNuZ98kkz2SZEpICUekMhBbORdXfXLYv1z8wqEYnjCX4NJl0eN7YTr7gFIeGR7Q3mAQW2xkdGw8HjO1MlMoAFTqpv0f7LLYzNR0BmNqp1mbY7+yc9hYTwCI78/WF36FGmZfLXzTtCHaRLrF3Zxmvp9hZZ5GdldU19nB5pOF165TXhokdwWbpJnvfauL1FDvrLLKzvcMfFR7xlENrl9eeiR3Bol3K9RQ766y0s39w6D955AjinazjE/Mbbo+VdlKnbtdBY5msaoH9w8FZ2+CGW2elneZ590FjmSy4KHlfZJf0yuCGW2eFndb1jcqpVe3Iyted4m3tTo1OGCvs3D9EA53coz+bT8EdBFl8fsm9vhl+0VtmhZ33j+h8J0f82fwM7kD9jvVEEc2J+fJn8zu4g39uJ7ZcT9QPLfjCnR7Hz20AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492370113;4.copy,1.1,2.10,3.361,4.1190,2.76,2.14,1.1,1.0,3.361;4.copy,1.1,3.980,3.475,3.220,2.19,2.14,1.1,3.970,3.475;4.copy,1.1,4.1000,3.494,3.200,2.19,2.14,1.1,3.990,3.494;4.rect,1.1,3.771,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.345,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.345,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1033,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.691,3.330;4.blob,1.1,1152.iVBORw0KGgoAAAANSUhEUgAAAfwAAAAeCAMAAAD+d1wcAAABGlBMVEUAAAAFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwPIyMhgYGAoKCgTExPw8PC8vLxJSUlkZGR3d3fU1NQMDAz19fVKSko8PDzCwsJOTk6hoaH+/v50dHSoqKgmJib5+fkODg6wsLB9fX38/PwsLCwyMjL9/f0bGxtGRkb29vb4+PiEhIQKCgrr6+uSkpKQkJDm5uZjY2O0tLTJyckEBATp6eleXl6Li4vBwcGVlZXc3NxLS0v09PQLCwstLS0fHx+pqamjo6PQ0NB8fHy1tbUPDw/39/dFRUVycnLZ2dno6Ojk5OQYGBg3NzeDg4OKioq3t7dZWVns7Ozx8fHOzs4JCQny8vJQUFDW1tZwcHCcnJyqqqo07GOSAAACAElEQVRoge2aZ1PCQBCGoxJRwIKAGooV7L1gwYq9967//2+IiRmIM7e5nBuScPt8YG7uZfe4XWa5HKsonDQ167TYjYgGJKTqtNqNiAYk3KbTbjciGhAq+xJDZV9iqOwTBFE/IsZpIoo18jvY+w10NGLGaaIDa+R3sPcb6Gh0GqeJLqyR38Heb7CjQRAEQRAEQWBReQDojvdAb0iA5qAqQjKF7bFCb18/oP5eU2t2c66CH0n7NWJpLZPNDfAbOFFFSCWxPf4QGgTEIU0bzmraiN2cq3iS/NHKS74wxm3gRBVgfGIS2aPO1DScxplZvjn38Cz5c/ML3AZOVAEW48gODaJLy6AucfKVlVVuAyeqc4pr67gOTTY2QRk1+UK9D94lv7TFbeBEdc72zi6uQ5O93D4koyZfqPeBkq+UD3D9VTk8glTU5Av1PniX/GOflP2T0zNUfzWcX0CqxGW/eOmTA1/iyrWGwOvCDaBKXPZv/fKol75DdWfhvgSIkpb9tJYpqz655Ann2F/Cf/PwGGEokl3yVFt6Yqr6FP9z92lp+OFKPlJ7Uf7ZhR2bvLy+MT5p9SoXnsNpk2JYoEYSXANu6bGoXMlHai96/+BIojCfX4xPWrMdcA6nTYphgRpJcA24pceiciU/OO1F8LrwHM4+GBaokYTX4Kfef+zISt1+878BbCRLVgkz9C0AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.671,3.437;4.blob,1.1,2080.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.684,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370154;4.copy,1.1,2.10,3.323,4.1190,3.114,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.475,4.1190,2.19,2.14,1.1,1.0,3.475;4.copy,1.1,3.990,3.494,3.210,2.19,2.14,1.1,3.980,3.494;4.rect,1.1,4.1191,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1023,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.661,3.437;4.blob,1.1,2088.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.681,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492370191;4.copy,1.1,2.10,3.323,4.1190,2.76,2.14,1.1,1.0,3.323;4.copy,1.1,3.990,3.475,3.210,2.38,2.14,1.1,3.980,3.475;4.copy,1.1,3.980,3.494,2.10,2.19,2.14,1.1,3.970,3.494;4.rect,1.1,3.902,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1102,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1143,3.399,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1013,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.862,3.210;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAUgAAAASCAMAAAAOqLckAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACcElEQVRYhbWVWVsTQRBFC6JoNBIRMAY3EEQExG1cUBRwxQVXFJGAu6CoqOCCCuLyw0namaSn07eqP5vcF+qr6VPnPgWifKoIpTph3/sT6J0P4ZOqVXCsWQs/1axbXyECvPMhfBLavBzJDRvV39Sm2vTmuvhEW+oZwhqWkC6zDpawtndO0Sa04rwNjVvVJrMtW9O0fcdOfSLald5dxkaEPRwhXeYdHGFv75qSjW/Feak5nVKrlj2tbXvb2/fpUz4d+8vgiABhCOmy4GAI0N4xmo1txXmps0ttug/0HDx0+EjiqDYV0hS0mnBIoGBCvCw4MIHaO0azsa0YL9GxFrU6fiJzMtV7ik5nSlNh3xecMemQQMGEeFlwYAK1d4xmY1sxXjobNKtVf8dAGw2eo/MXSpP6cPGSAUcEDCSky6IDErC9U2I2phXnpcvBkFpduXqtnvqvDzdqk8qNmwYcETCQkC6LDkjA9k6J2ZhWnJcGgltqdfvO3ZF790cfdGqTythDA44IGEhIl0UHJGB7p8RsTCvOSz3Bv//3yez4SG5i8tFjbVJ58tSAIwIGEtJl0QEJ2N4pMRvTivPSeO6ZWj1/8TIxRVPT+lRIw6vXBhwRKJiQLksOTKD2btFtXCvOSzQT/ia8efsuOfs+PuVTF/Sa9Az/K8IQ0mXBwRCgvWM0G9uK89KHj+Fubv7T5y/GRPR1oduEi4Q9HCFcFhwcYW/vGM3GtmK933LfuYc/FstWq0RY3vkQPtFsHo7R7DD+OLvUVyHC+s6H8EnR5uNI/FyG334t/K4QYX/nQ/gksvk5pv/AT0N/K0WAdz6ET0Lb/ztWAJlo7kg8xplsAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.742,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.722,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.651,3.399;4.blob,1.1,3928.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;3.end,1.1;4.sync,10.6492370239;4.copy,1.1,2.10,3.323,4.1190,2.76,2.14,1.1,1.0,3.323;4.copy,1.1,3.980,3.475,3.220,2.38,2.14,1.1,3.970,3.475;4.copy,1.1,2.20,3.494,3.950,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.674,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.402,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1133,3.399,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.704,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1003,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.704,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.641,3.399;4.blob,1.1,3856.iVBORw0KGgoAAAANSUhEUgAAAi4AAABwCAMAAAAOjwtDAAACDVBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGTk5OR4eHjg4OCAgIC0tLQYGBh8fHzh4eGkpKRUVFSTk5Pm5uZMTEywsLAhISEREREPDw8jIyNgYGC2trYfHx8oKCgTExMiIiINDQ13d3cMDAz19fVKSkqoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLxjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwuUlJTl5eVpaWktLS3+/v6pqamjo6NaWlri4uKnp6cgICBXV1fy8vLQ0ND39/dFRUVmZmYvLy/W1tb7+/tycnLZ2dknJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUsLCxZWVns7Ox9fX3Ozs4JCQlQUFBwcHCcnJyqqqo8PDzw8PBJSUkmJib5+fmhoaFOTk50dHT4+PiEhIQKCgrr6+uSkpLJycnc3Ny1tbXo6OiDg4Px8fEqKiq4uLgHBwdISEgcHBzq6uq6urpqamrt7e2enp7Nzc1fX18/Pz+ZmZnd3d0uLi5CQkLS0tLHx8d/f3/n5+eCgoLe3t5PT09iYmLu7u4ZGRnV1dXa2tpBQUFAQECMjIx7e3vR0dGgoKC5ubmxsbF6enqNjY2FhYWtra2WlpYzMzNlZWUpKSlnZ2c6OjrExMSXl5eGhoY+DUh3AAAI+UlEQVR4nO2d+X8UNRjGp9tjRKuccglyiHhA8UIqtSKKFkGFiqAItRQRlaqAYlWU+1AUFe/7vvH6G9070867yZvkzWyy835/WOazO2/eSeb5NNnZhzdRxARKW6HQjjmvo1DodH0tjPd0xfElmPMmxfGlrq+F8Z6uy7ovx5x3xWT3cpky1X0rqBzTppdeZ1xp10rwAL3smomMnQXIRX/UpBEsF79gubBcNGC5sFw0YLkg5TK7UGQOyyX1lnu5tBXKdKoj/JFLXMZILp3l3rYFfwT30r1c5lbG/ip1hD9ymdddZL6RXK4u93ZB8EdwL93LZWF3mUXqCH/kYrF2WVzu7TXBH8G95MkIgJe6ZXgyYrlowJMRy0UD/iJNK5eOyjzbnjxqISRygXo+bgzyJBdsjimVeXZJ8qiFgORybUUOUM+TY9CxlOWSauW6yjx7ffKohYDkUjUwQD1PjgFoYMi7XFocoJc3dCMNDN3dN2La078ChmFsETZHYWSE3mOYKGlzFOsA6D2GiZI2R2FkhN7LL1ksbGieu0TRskmWOVQtJx6I1Z9hQO/VWN6zwiYrBPX98PKbkcUF1EDIZdIyyxyqlnXlEs29ySYrBMuFSi4333KrZQ5Vy9pyuW3l7RZpIVguVHJZ1WubQ9Wytlza599hkRaC5UJkvlzdd6dtDlXLSLn0i9C71pinBWG5EJkv7157j20OVcsouXTe27PuvuK/q2YVX+4fWGqeF6IpclHZPzWbs4TGfLn+AescqpZRctmwccX0lQ8+9PCmssY2zzbPC9EUuajsn5rNWUKydlk8+Ih1DlXLKLlsWRJFj26Nt1V+CX/sceO8IE2Ri8r+qdmcJSRymTpN+gTeoh+iZfxSt3/7E9X3duw0TgzBaxcauQw9aZ9D1bL2N6Miw7uME0OwXEjksnBgxD6HqmUTuex+qsM0M0RocpFb/PSPRA75eUIuYCt7npZcHzaHvGUzuezd9AzZqKlulgGu5SK3+OkfiRzK8yRXEG19VvYpMoe8ZWFzTBoZoffG8dw+slFT3SwDXMtFbvHTPxI5lOdJrkD5KSqHyrhpbmCgHisyWnXt4kMOYXMURkboPYd4LheGYczQN1+yNTPH6K9d2JqZY/TNl3mzZiYXNmlzI3bZ05TlUbVuwChdrP5zF9VTmQrFr8rP976AujDPl7rJD9PmRq/l8uLo6P4Do6NGfjY41plchkYPHhh4CXNh4cgFMDd6LZciLx8ijXUml5I3YM+OEcRVhSMXwNzIcqGTyytjryKuKhi5QOZGlgudXKKZryGuqjqSovyXzVHkUC6QuVFTLpnXiQxKLrteR1xVdSRF+S+bo8ihXCBzo6ZcMq8T2bJyEeW/bI4id3IBzY2acsm8TmRQcjncSpMRaG7ktQudXFa/obHU9X4yAs2NLBc6ubyp80Xa98kINjd6LZewHtOtj1vpMV3CgmiQrMk/AujbHDP/EeBIL65YgyO5UNk/ax8mLIjAp8iLahZGNkcAffOl0pqp3RU3cqGyf8ovLxC52FkuBR4YGBzJhcr+2RJyoULffEluzfR87cIwDMMwDBMWFPUkcecdPXZkxqHjuBa9i7Wocnki3lB8bZs2bNqABTRfZRJQ1JNEnXfy1OmDZ86+hWvRv1iLKpeb3y6+nIvfMW7AHGq5kNSTRJ337vlCyX/wHq5J72Itqlzujt+Pog8umIbbQC0XzXqSO9cM9s1bbpK2f+zD0utHH+tcnUexFlUu2z8ZLs5In5qG20Asl5TlUu6W2L7y2InPPj/cIO242Bq1OpFfxKXKFtHpBQbODQ9irapcnolHer/sV59HD7FcUpZLuVti31ero2hy/DWcVsTWLZKiTuTR+JvSOV1DBs4ND2Ktqlzu7bsQnzMNtoJYLinLpdwtsbZsEhn7Fk4rYusWSVEnMjH02s4ND2IjqyqX38Vz2oyDbaCVS9pyKZ2M9lZ+UPv+BzitiK1bJEWdyOof9h9/Mp8UmhkbWVW5XDTws3GsFbRySVsu5ZNRT+Wvyy9w2nGxCcp1IvtPlZaN0bpfDSYFD2IjuyqX27YYh1pBK5e05VI+Gf1WWbtM/Kk+NRlB/H7+eOmR1R8mNsLmx5awqHK5/0/jUCtI5aJdT/Li4PDkc2ePGaU92Xf64F9jB/BX512sRZXLwSbZAkzloqr6iGzu738Gx/5NPa/CqfTi8JGN/xk+jPcitlLlUqBhaezRM0FmUXVU+qmq6iNIzuxRSspVLgX6Vk/quqI2VUelnxpt181ykaJv9aSuK2pTdVT5qTYsl9Ah/0WaYRiGYRjGd5JLnOzMl6pYm/8T06xYEyaMuJatU3a3nJHsbmbmS2VsXuQyccR1bJ2yu+WMRHezM18qY3Mil9SIa9g6pXfLGYnukmzmzXLRIDXiGrZO6d1yhuiupvlS3h5ovsRfSz7kUhtxk83L5VuvO0N0t2q+FPUkjUpVKfwuyGvJh1wqI262ebl863VniO5WzZeinqRRqSqU30V5LfmQS2XEzTYvl2+97ox6d2vmS1FPkicjrVhtqiNutHm5Yut1Z9S7q2u+lLfHk5Ga5Ijrbl6u2HrdGfXu6pov5e3xZKQG3j4dZ+tUbL3ujFp3qTbz5i/SWBqMOMrWqbpbzqh1F2m+dLpZdvNvuXGs3SbnSTCblyvvljNqA4Q0XzrdLDtgudhtcj4OxOblyrvlDM1Jxulm2QHLhariZg2bWJdQr0lyKheGYRiGYRjGWxra/qwtfghDYcMcIcZicTfiWdDI9mdv8VMbChvnCDEWi7sRz4AGtj8Ci5/SUCjJEWIsFncjngENbH8EFj+loVCSI8RYLO5GPAtA2x+JxU9hKJTmCDEWi7sRzwDQ9kdi8VMYCqU5QozF4m7EswCy/dFY/OSGQnmOEGOxuBvxDABsf0QWP6mhUJEjxFgs7kY8AwDbH5HFT2ooVOQIMRaLuxHPgrTtj8riJzMUqnKEGIvF3YhnQMr2R2bxkxgKlTlCjMXibsQzYKLtj87i19hQqM4RYiwWdyOeBRNsf4QWv4aGQkSOEGOxuBvxrHBn8bOxEYYYq5/DR/4HQzGQgvCHZ3EAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492370275;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.672,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.694,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.993,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.694,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.662,3.383;4.blob,1.1,624.iVBORw0KGgoAAAANSUhEUgAAAhkAAAAPCAMAAAB+1C0WAAAAjVBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAyMjL9/f0bGxuQkJC8vLwEBATp6eleXl58fHwICAjh4eFLS0v09PQLCwv///+pqamjo6OTk5M0NDTm5uYPDw/39/dFRUUCAgLCwsKKioohISH+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExNdQpfWAAABAklEQVRYhe2XyQ6CQBBEWd1X3EXFfdf//zwRjYYgE6xpQyf2O3CAqakO8w5gGCGmZYDYDv70iVu4X4ulX3ZoZnU6svLu+NT2/T2amS0TTYoZVLA0o1ypolExgwqWZtTqcFTMoIKjGY1mC85SmNH2QjpihqotHzO6vT6cpTBjECFmqNryMWM4wrMUZoz9kImYoWrLxYzpLMDD8p1BBUMzHHeOh8UMKhiasVhqhMUMKviZsVpvNNJiBhX8zNjudNJiBhWJM917EYfUCdTr4Jlf+x1P4A4Z+mne6J+aYT/+5s+pE6jXwTPH9sMRM6hInOnFj7imTqBeB88c2w9HzKCC3XfGDQJtEZ0KUJnOAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.631,3.437;4.blob,1.1,2796.iVBORw0KGgoAAAANSUhEUgAAAjgAAAA4CAMAAADHNHLtAAACClBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGR3d3ekpKQ8PDy0tLQYGBjw8PC8vLxJSUkmJib5+fmhoaEODg7CwsJOTk7+/v50dHQyMjL9/f0bGxv4+PiEhISwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpIEBATp6eleXl7JyclLS0v09PQLCwuVlZXc3NxUVFSpqamjo6NMTEwhISEREREPDw/39/dFRUUjIyO1tbXk5OTo6OiKioqDg4POzs7x8fFKSkrW1tZwcHBgYGC2trYfHx8oKCgTExMiIiINDQ0qKiq4uLjg4OAHBwcMDAz19fVISEhaWlq3t7ccHBzq6uq6urpqamrt7e2enp6oqKjQ0NDNzc1fX18/Pz+ZmZnd3d0uLi5GRkb29vZZWVlCQkLS0tLHx8c3NzfBwcGTk5MBAQF/f3/n5+eCgoLm5uZjY2Pe3t5PT08nJydiYmLu7u4ZGRlQUFCLi4vV1dWqqqra2tpBQUFAQEAtLS0JCQmMjIx8fHx7e3vh4eHR0dGgoKC5ubmxsbFycnLZ2dl6enqNjY3l5eWFhYX7+/tmZmatra2WlpYzMzNlZWUpKSlnZ2fs7Ow6OjrExMSXl5fi4uKGhoby8vKcnJyUlJRpaWl4eHinp6cgICBXV1cvLy8QEBBpgqgQAAAF4klEQVR4nO2c+X/URBjGp9t2x+pqCyy1Sm3rRTlcWxVRFFgFj4KIBxUKCwXFKloUsN6oKB71PhE88EK89X90k+wm2Wb23XnfmdlNNvP9YTtN8kzeTJ5PJ5s8DWOWhnRkMp1eqyuT6a6/DFZYUkeW8wu8Vg/nF9ZfBissqSN7Ue5ir3VJr28cwTJYkQ76FgXtxT3QWtlemsYS7pLXp80u9Zv9vnEEy2BFlD7OLx24TKow3SOJ709SEd6sZzF1ty0xzuX5/LLBfP4KfVpjxhnKDw+OXClTWBKNc9XV11B32xLjlLl2uVatMeOMlj9WrFwlUVUSjbN6gLxba5zGxrmucL1EVQk0ztj4DeTdWuM0Ng5beqNEVZWRLH/Nd+hWa7GmGOemNTdTO6lu1+1W3NGkFkuYcdbeIlFVZSQrF++3qrVYU4yz7jZyJ9XtbncrHm1Si7WxcdbnXDaotVgzjLOxeAe5k+p2G92K72xSiyXMOJvac6patFlwx9xe4+gzzthdiIvjBE1VQ3fTO7HGEa+t4hrnHszX8eRMVetHRIcVa+Mk6wbgOt6eNwBX3Kuy2xY/cujyZvVO+VbTHzlMDGyROihDxpEdF5ECLnTrfdBayfJaRZ9ng23yLTHZ+/2QxHbfOIJlsELtUMwYBzEuEQWl0IQY5wFvVn9QviUmBrEKQ8ZBjEtEQSk0IcbRxUM5PySRyz1cfxmsUCIx1zgWi8VisVgs7Uk0MBqg4+J4x+TEI8t34mqKoXbXlNyNGAG7+Z7yZ8fmErUDBfR8+RESDYziOwa227tvenj/gUeRRcVQu+QxUl8OBx8vf8zwJ8gd0DFnHEFgFN8xsN2ThzJOFuIpZFnx0z49S3q44XCYP8PYs0eochXMGUcQGIU6PnqsOP7cLvkC5grPO58vvEgoLV7azpdeJvTlSV8pleerV6lyFYwZJxIYhdMcx2cnd7/2+qY6BdRoPd7gJ5wf06OEPEkMtGHePEYdZLafrxp4a44sV8CYcSKBUTjNcfLtMcZ6+TviAgKtH/Dcwd911mSHCHmSGGjDvDeynTrK8+NH+AxVrIQx40QCo3CaY40bYim8Ly4g0PoBz9BJQOdJYqCt4eAH5GH+kH/UQRarYMo40cAoOFXNe4/0Pv5EXECg9QOelT/7n35GnzJaqa3h8y+ow8w2jHxJ1iphyjjRwCg8VU15f3G+EhdQo/WY2+dcaLJTXxOmjBhoa+hfeZQ0yA6nz5ClSpgyTjQwCk9V33jXOAsDBJGpKuDbQzudW2DfUaKPrdfWUlpLHWe27HuyVAlDxhEHRoGOzxZLvTMHJhEF7B2fHv6hMEgqL27awz92kforU2xRWEHdOMKgoDgwCnX808/Fwi+RO2FQAWdLE+d+Jd76j5l2/vyJmt8RgcwpXIRTT4uB0VF4rd8SBgXFgdGAlAW5GvLbyZpf8UFVfMhVpcXA6Ci81m/JByjDx2mNA4EPquJDriotBkZH4bUIlwiwxkk6Bp+OWywWi8VisbQL4Ysi09FRea3K/wC1SkthwYijQqnQ2dKN4CjDiwxHRxHatBhn4YhjQqnQ2dINbBzT0VGENiXGiYw4IpQKni3dwMZBRkfVtoO1KTFOZMQRoVTwbOkGNA4yOgrvQhAdxZSXDuNURzyUJJUOpYreDGsO0DiV6GjwLk/Si8Dq53Ew5aXDON6Id/8+deqP8s/V/QwRShW9GdYcoHEq0dHgXZ6kF4EBeRxEeekwjjfie85t+XP2r7//Oe86QTaUKnozrDkg41Sjo8G7PO1UhdKiqYz4mW2M/buVn/aeUkuGUoVvhjUHZBxsdBTehZ2qGhMe8bnj/3kNyVCq8M2w5oCMg42OwruwU1VjhG93lQylirXGAIyDjo4qbgdr02CcOiMuFUptdLZ0AxhHMjoqG1BULC9xxiGEOeuMuBdKpWmNARhHMjoqG1BULC9xxiGEOeuNuBtKJWpNAd85lpHKBhQVy0uccXS97bSK/ginEurG0bYdrE2ccdoc9yj/B6gpm897aZ+gAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492370315;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.rect,1.1,3.721,3.369,1.7,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1081,3.375,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.983,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.652,3.362;4.blob,1.1,1800.iVBORw0KGgoAAAANSUhEUgAAAiMAAAAkCAMAAABsbsoSAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAADcUlEQVR4nO2a6VvTQBDGV1BEtFqVCvVAUPHAWE/wBFREEcX7Pos33oL3iccfLknXNtkMu53ZTZvncX4f0u3O5p1Z+j5NUkaICHOib0VDo2CYMHPnKRNN85vrUgiTLha0/BstXJRRg4uXOFHWkF3qH5ctF6I1t8IimZG2dnWmqvoQ62xwncOtXlktv3JVLLg6t8aBso6KR0THWnouM+1t6gx7BK3WmWuNR7vWOVDWEfLI+g3d9GQmNm7arE6xR9BqW3qA6FZvm72yjpBH8oXt5FxGduyMTbFH0Gq7dgPRbm+PvbKObG/fDHt9j4h9+8m5TBw4eCg2V2eP9PcFDCSSIxmPDHqdUPjwEf84EGynf5aRTZ1ZLyDwyNGhY5jKMQwfjz/G19kjHaWdNyWSIxmPnPBGoPDJUf94KthOzywjmzqzp8dmKAQeEWd6MZVjOHsuPldnj2TGAs4nkiMZj1zwLkLhS5f9Y3OwnSuzjGzqDN2PCHH1WvV1o2i+fiM+ydcarNpND3zMvXXbWllLxCMNd+6Ss2lpyQ7EJ/lag1Urjt8Dovn7D6yVtUQ8Ih6OkrNpefQYmORrDVrtCfT5THhP7ZV1RD3y7HmRnE5DZmgCmOVnX7Tai5el12LpOpkP3rwqAF/SWGUdUY+8fjMZqcDNSEy9JdeHWGeDzGHYRxnjOgc1h/TKau/G35fkS9fJD8Gbj1P0JJQ6uz5FKnAzEp/j/2VA1FdDjxj2UVluWueg5pBeRe3L12/+y/fSdXLQH0/+sPh5nFxnpQI3I8v6auiRavdhXOeg5pBeRa1x+qey7FcBeGSsmlr8bW1IoUdSq1fm9x9lYmQ4oUwMwzAMwzAR4l181aK/MyL8PpJMDstza3vPCmXDz7mpuaIS7+LDa+CjEvaIkiOVHgG6+NAahKiEPaLkSKVHgC4+tAYhKmGPKDnS6BGoiw+rQYlKwr2KSeWwPJc9AnXxYTUoUUm4VzGpHJbnskegLj6sBiUqifQqJpTD8tz/3iNgFx9SgxSV8P2IkiOFHgG7+JAapKiEPaLkSKFHwC4+pAYpKmGPKDnS5xG4iw+nQYtK2CNKjvR5BO7iw2nQohL2iJJDjoydh/p15JoBPbiLr1qS+/xqkSPVHjF2HurXkWt23fHIHnFG7NM1dh7q15Frdt3xyB5xRorvR/4CpBHWmbwhCDEAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.621,3.437;4.blob,1.1,2832.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.641,3.497;4.blob,1.1,812.iVBORw0KGgoAAAANSUhEUgAAAY4AAAAOCAMAAAAPHQsiAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAABSElEQVRYhdWRWU8CQRCER3sRvPBARVDxQAXvA8Ub7///l5wdYow73ZuazLx0PWw2W1v1JdXGTEwSq6zCf4clNgMMjVlUZYsbmqryZiWLxIrNCENjFlXJ4oZq0zOcNzs3H4sVmiGGxiyqksUN1RcWOXNpOZYqNUMMjVlUJYsbosYK462uNaOxfDPI0JhFJS9uz7HeavvmxuZWPJZtBhkas6jkxe05qLPtmzu78VS+GWVozKISF8/Psdf1vP2DwxRYphlmaMyiYhjj5vwcvf5R0Tw+OU2BZZphhsYsKnHx/Bx0dl40Ly5TULlmnKExi0pa3J3j6nrw37tp3abBes0BDI1ZVNLi7hzDu3v7HDw41e3r41MaqtccwtCYRSUt7s5Bzy/2MXp1erOv7x+JsMXmIIbGLCphcfP3x+eX03cqItccztCYDWf86gcSRaGJry65ZQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370358;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.862,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1060,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1122,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1180,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.730,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1071,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.973,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.690,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.822,3.210;4.blob,1.1,1552.iVBORw0KGgoAAAANSUhEUgAAAUcAAAASCAMAAAD/o+ypAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAChklEQVRYhbWW91MTURDHV6NoVKKhBA8swZgEEaRI8QUQlVBUSBSxYW+ISixgQ1EsWLC3P9ickzPHe/d2d4Z73x+Snb3PZ3eWGTIHkM8K0GVlwLu/fEPHLd+gOUNZtVr7qGTNWkOGhvPBIDlDCa5br3+4oRQxQhs3hcvKl1a4QU3GdnANilPjeQczFZWRqs1Wvqiu2YJgW8PblJ5jWNujJbU7YjvdFW5Qk7EdXIPi1HjfwUs8kazbVb87XzWEQxjYuEdpOUZTc0vr3ra2dneFG9RkbAfXoDg1mjtYae/oBNgnUgBd3ShYK1rkVsHo2R/vPXDwUKDPVeEGORnZwTVITonuDk7SsX77c2AQINGEkkPisNwqGEeOWvWh4RGosooVbpCTkR1cg+SU6O7gJCOy9leyG46JBhw93i81HGO0MdUKJ8bg5KlihRvUZGwH16A4Ndo7GKkQp+2vkTNwVozj6LnzUsMxLgxeLIXRS+kaV4Ub1GRsB9egODXaOxgp/h1T4jKOXrkqNRzj2vUbEzcrJ291uSrcoCZjO7gGxanR3sFI4f+6rBnignhJuH1HajhGMDo1kbt77/4DV4Ub1GRsB9egODXaOxhJJ/79gkzPwFTuIUpWP3osdRyj88nTQAYys+4KN6jJ2A6uQXFqdHewMtZh2e8HzwCe478l5WJYbjnGXORFMPtyaYUb1GRsB9egODWaO1iJzyfr5mKv8tXrNyj4dqFHbv033r3/MPBRqnCDmIzu4BoE5xHvO3hZ/BT5/MV+T/qa+4Zx338oLZ8MD84nA+WMZTKa1j/MTg8ZMjw5XwyCM5XAzxnts8WFX4YMb84Pg+KMZfa39tH4H1OGhvPBIDkT+Qv2qQJJq6bYZwAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.702,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.682,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.644,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.437;4.blob,1.1,3296.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;3.end,1.1;4.sync,10.6492370400;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.701,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1061,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.664,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.963,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.664,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1062,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.634,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.437;4.blob,1.1,3288.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;3.end,1.1;4.sync,10.6492370437;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,3.930,3.494,3.270,2.19,2.14,1.1,3.920,3.494;4.rect,1.1,3.691,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1051,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.953,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1052,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.624,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.591,3.437;4.blob,1.1,2932.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.611,3.494;4.blob,1.1,984.iVBORw0KGgoAAAANSUhEUgAAATUAAAATCAMAAADGQ2qpAAABF1BMVEUAAAD///8MDAz19fVKSkp3d3fU1NSIiIgrKyukpKSoqKhGRkb29vYODg4yMjL9/f0bGxvNzc0CAgLk5OQDAwPm5uZjY2OQkJC8vLxvb29DQ0OLi4vBwcEEBATp6eleXl77+/sWFhahoaEtLS3+/v4fHx9LS0v09PQLCwu0tLTQ0NB8fHypqamjo6NWVlZcXFxycnLZ2dkPDw/39/dFRUXw8PAICAi6uroYGBj8/Pw3NzdkZGSbm5u3t7eVlZXCwsKKioo9PT11dXVZWVns7OwGBgYhISEsLCze3t4BAQHT09MJCQny8vJQUFB9fX3Ozs6CgoIxMTGcnJyqqqrIyMhgYGDW1tZwcHApKSmPj48oKCg0NDQTExNp6XG9AAABhElEQVRYhe2Y11LCQBiFWZViBQF7VxTsHbvYsPfe3v853E2EYHazexIv/J3Jd5HJhFOYM8yQJBIJQWFV/vqb/CfC1YJQs1pdfYNaE439ssQzGegg6bUXiyfEb62xSa2JRU3dJrySkQ6KXnu1RFys1tzSqpK0JVOmbhMeyVAHRa81Wns6I1bLdnSqJF3d+mYAj2Sog6LXWq2n1/436OtXKAYGh/TNCMpksIOgV4w2PDJqrzaWG5cVE/mCthlCmQx2EPSK1SYL+e87j6lpWTEzq+tFUSWjHfS8YrW5+cr92sKiJFhaXtEloyiS4Q56Xj7XanGtstr6xqZbsJVJ65JRFMlwBz0vn2s7law+G+zsugWlPV0wjpyMd5Dz8rn2D5wnqsOj8s/Pj3Mn+mQUKdlHBzkvY6dn585qF5dX/FguWmT56fWNPhjGneyng5yXsdu72qf3+wd+eLSvPPHT5xdDMowr2VcHNS9jr2/SO4/3D4tPU6h/nGT/HYS84ZuiIISrBcFZ7QtsZGMizRNRkAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370478;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,2.20,3.494,3.890,2.19,2.14,1.1,2.10,3.494;4.copy,1.1,3.920,3.494,3.280,2.19,2.14,1.1,3.910,3.494;4.rect,1.1,3.681,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1041,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.943,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.614,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.581,3.437;4.blob,1.1,2308.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.594,3.478;4.blob,1.1,1344.iVBORw0KGgoAAAANSUhEUgAAAl0AAAAPCAMAAADphYrMAAABQVBMVEXIyMhkZGQAAAB3d3fU1NQMDAz19fVKSkr////w8PC8vLxJSUmkpKSoqKjCwsI8PDxOTk6hoaH+/v50dHQyMjL9/f0bGxtGRkb29vYODg6wsLB9fX38/PwsLCyQkJADAwPm5uZjY2MKCgrr6+uSkpIEBATp6eleXl4FBQUICAgCAgIBAQGLi4vBwcG0tLTJyclLS0v09PQLCwtUVFSUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6NMTEwhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OQnJycQEBA3Nzfo6OiKioq3t7eDg4NZWVns7OwGBgbOzs4JCQlQUFDx8fFwcHCcnJyqqqooKCgTExMh5kVtAAACaElEQVRoge2Ya1fTQBCG03BprLVIESy2lIuitUVQRKulCl5AFC+lar2AVVBR+P8/wGQT0k12d5LZNMk5pu+HZk9m3unu5Dln96yipFRbQ8OqUHQeJL95sBdfJX6vjFwdHxlNS3tDFbNKRdPOZc4L062oQvuGhxD1A+bB3qTQ5e549oK8N0yxdOXGLo7nJ0TpVpSm69LkFKJ+wDzYmxC6mI5fLkxLe8MUS9cV/adYmhGkW1GarnIGUz9gHuxNCF1Mx2fn5qW9YYpP18LVa4J0K0rRtXj9hjOncpOoyq8Pz8Ph9av4CYmWrrOO13qvlm4hvdGIT5e6vCJIt6IUXbfvrBqPKsGioo+yGtFdfn14Hg6vX8VPSLR0mR2vro3eu68/y3X950H+IcYblQR0NdYF6VaUoqv5iDweEyyM8MYm0RN+fXgeDq9fxU9ItHSZHX/6LP28sLX9Yofg8vIVxhuVAtO1+/qN+SRYvFUHOyPSi5bV8XctVd1ra+9b5OWHjxhvVBLQ1QF3xg61M6Y+uVEY7IwoL1p0x2ufv5iDeukr1huB+HQt7kOnej3aoyt34M4Z7IwoL1psxw19a8h7QxOfri54I9GlbiQ28oJMUf2AebA3CXQJOv79x6G0NzRxb1ObGnSbakRtuopHvuofmuepWf6INw+E4idE2gv3hdsrQcd/7vzyrOf5tfotZpWKpv3OpJ3v2KhNV/vYV33FPE+1+CM1sXTBfeH2StTxP38963l+rX6LWSUV4nNgxpA73ol5njrlj1SZ78P8h1SVmL1wXwS9AhTEG4KYVcIztW39Pk8llK7/XJKr/AdmmLeXn5lF1QAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.901,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370518;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.822,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1080,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1140,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.704,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1031,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.933,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.782,3.210;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAYMAAAASCAMAAACO90JyAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAAC50lEQVRYhb2WaVfTQBSGL1ZRtFoQKBa0WLUtIpuAYAq4FlDAVsQVd0VU6goqKijugvv2g03GpJ2kuXcmjvH5QO6ZzHPf9xzOySmATglgLAu4n6sb2D0VQ4WS/5BBsHwF+qp05SqfDOSeiqGCmeZrBkHZ6jXsGVy7LlReYZ9gfSVhuEIaos1kBmm4tpcmnyZoReV6p6o6XLMhog+1dRvZQWRTtLR+c2wLPwFsDW0rUi3DHcoQbaYzKMO9vSyFNLoVleudeCLZsL1xhz41hYLspLmltW1ne3sHP+l07ipyLQOBMESbBRmEgbSXhEsjW1G53uno6gbYraUAenrZQd+e+N59+w8EDnKTQb3W6nRNAwM3hJsFGbiBtZeESyNbEbneScf6jb8DgwCJZnZy6HCkMTg0DDWRwmScj2hHnLJpYOCGcLMgAzew9pJwaWQrIteDZJLRssYj2QtHtSZ2MtqZaoNjY3D8RGFiL072O1zLQEEN0WZhBmqg7aWwpRGtqFwPkkmVdsp4DJ+GM9o4Ozk7eK4SRs+n67iJceGiw7UMFNQQbRZmoAbaXgpbGtGKyvVO4X+Q0i6xk8tXrk5cq5683sNNjBs3Ha5loKCGaLMwAzXQ9lLY0ohWVK53zG9ReQvEtT8/xsqiUxO5W7fv3OUmxr37DtcyUFBDtFmYgRpoeylsaUQrKtc76QT76k3PwFTuATvpfvgokIHMLD8Z1D5+4nAtAwM3RJtFGbiBtZeDT6NaUbl/wVhXxPgd9hRgzvz+zYeflWWf2yedCm3I6c7RX0zCEG0WZBAG0l4SLo1sReV6J76QbJiPvdCnl6/Mo9dv3g68c0wA7xf7nG7ecIcyBJsFGZTh3l4SLo1sReZ6Z+lD+OMn41ft59wX6t7Xb0VH/8hwuadiqMCl+ZZBMhlN4y+z0yM+Ga73VAwV8mk+ZlAEvs+g75YWf/hkuN9TMVSw0vzMIJn9ib4a/+WXgdxTMVQw03zNwPgNgOEZP0YGfh4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.662,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.642,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.604,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.571,3.437;4.blob,1.1,2228.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.584,3.478;4.blob,1.1,1344.iVBORw0KGgoAAAANSUhEUgAAAmcAAAAPCAMAAACWVJg9AAABQVBMVEXIyMhkZGQAAAB3d3fU1NQMDAz19fVKSkr////w8PC8vLxJSUmkpKSoqKjCwsI8PDxOTk6hoaH+/v50dHQyMjL9/f0bGxtGRkb29vYODg6wsLB9fX38/PwsLCyQkJADAwPm5uZjY2MKCgrr6+uSkpIEBATp6eleXl4FBQUICAgCAgIBAQGLi4vBwcG0tLTJyclLS0v09PQLCwtUVFSUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6NMTEwhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OQnJycQEBA3Nzfo6OiKioq3t7eDg4NZWVns7OwGBgbOzs4JCQlQUFDx8fFwcHCcnJyqqqooKCgTExMh5kVtAAACaUlEQVRoge2YeVvTQBDGQzgaK4cUUS4BuSmgcsglUBREbgrK4QGKCqLf/wPYbqBsMrPTzKZJHkjfP5p9MvPu7E5+z7NpDKPCLKiyylRKzqPkNY/28meJ3qsjV8eraxLa3kAFdmlY1oPkQ2U6iBryDFWVjEo+82hvXDhzd7y2Tt8bpCBn9Q2PGlNNqnQQlTl73PyEUclnHu2NCWeg409bWrW9QQpy1pb7ae94pkgHUZmzziSnks882hsTzkDHu7qfa3uDFM5ZT2+fIh1EJc76Bwad2UPDQmm8Er0ih9eromclXM5uOj5ye2t0jOkNRzhn5ouXinQQlTh7NT6Rv6QFIEO5Ua0lNIlXolfk8HpV9KyEy5nd8fRUzevp3LVzJvczm5rjeMOSgrP5N4p0EJU4W1gUlyUBSD4xsyz0Fq9Er8jh9aroWQmXM7vj71YSqy3v1z6sC3A2NjnesFRCzra2d+yrAGTXLJ+bTC9b1x3fy5rm/oH1MStufjrkeMOSgrMj8tw8Qs/NimM3FOVzk+VlS+74yMlnezDT8YXrDUE4Z/1fqf8BjugtZ/Xf3Nnlc5PlZQt2PK/TeX1vYMI5OyO/a5yh3zUyKYVHVclnHu2NA2eKjn//ca7tDUzod9oFi/pO64wWOGv/6anSuf3e1YWPsBUxFD0r2l66L2ivFB3/tf676HxFn1apBXZpWNZFMuG8R0ULnB1ceqpk2O9dWXxkxpYzui9or1Qd/3NVdL6iT6vUAruUQjgHrqjBPA//2u9d//CRqfOkQA2tWSL20n1R9IqQH28AArukVwqjXM5Klkd77xxn91y+d/kfsM283NCO/fAAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492370561;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.661,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.694,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1021,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.923,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.982,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.594,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.561,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.574,3.478;4.blob,1.1,2060.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;3.end,1.1;4.sync,10.6492370600;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.651,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1011,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1064,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.614,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.913,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.614,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.972,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.584,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.564,3.478;4.blob,1.1,2088.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;3.end,1.1;4.sync,10.6492370641;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.641,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1001,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1054,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.903,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1002,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.574,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.554,3.478;4.blob,1.1,2076.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;3.end,1.1;4.sync,10.6492370680;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,3.870,3.494,3.330,2.19,2.14,1.1,3.860,3.494;4.rect,1.1,3.782,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.980,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1042,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1100,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.650,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.664,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.991,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1044,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.893,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.610,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.992,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1192,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.742,3.210;4.blob,1.1,1648.iVBORw0KGgoAAAANSUhEUgAAAb8AAAASCAMAAAD8OCDEAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC0ElEQVRYhd2YZ1cTURCGV6NoVIKhBAOWYEyCCFKkuEFshKJCoogNe0NUYsGKoliwYG8/WOPJssude2fmks2XfT+QObPvc59zD4eQE8P4l2WGKst98n3hhKpXOEH3PJYVK5WPSlatLhKh6LlAkD2Pxb9mrfrhulKECJStD5ZXLJ5wgjoZc3AJqgcjvQczlVWh6g1hTSHw6mfBW1O7EaltCm4GO4sIb4mU1G2NbnNOOEGdjDm4BNWDkd+Dl1g8Ub+9YYeWD3r1Y3sbgwGs2LQTrCyiuaW1bVd7e4dzwgnqZMzBJagejOIerHR0dhnGbjOpJQRe/dje7j1osc5sFVd5omdvbN/+Awd9vY4JJ8iTEQeXIHsgqntwkor25X72D2j4oFc/Dm+8GW0OmofEVZ44fCTcEBgaNqrD9oQT5MmIg0uQPRDVPThJm5ncSwL/G6C8+qztPWo24tVjfcLCIkaakm3G8VHjxEl7wgnqZMzBJagejPIejFSap3Ivw6c1fNCrz9reM+YYXj17TlhYxPmBC6XGyMVUrWPCCepkzMElqB6M8h6MFPL707fJvEnzEl69fEVYWMTVa9fHb1RN3Ox2TDhBnYw5uATVg1Heg5H8+1h5i4YPevVje2Mm8WH71m1hYRH+yOR49s7de/cdE05QJ2MOLkH1YJT3YCQV//9OPfVAwwe9+rG9k9mHaLPm0WNhYxFdT5760kZ62jnhBHUy5uASVA9GdQ9WRjvDuc+7zzQQ6F1CbO9z/H9FhTkkrixiJvTCn3m5eMIJ6mTMwSWoHoziHqzEZhP1M9FXOojEqx/b+/oNWnw71yOuFoh37z/0fxQmnCBORh1cguhJIr8HL/OfQp+/LPH7M32bxPs1+w3rff8BVi4Rkp5LBNrzXCYiKfXDzNRgkQhpzxWC6Hktvp/qT0/zc7+KRMh7bhBUz3OZ/q18NPanWISi5wJB9ryUvwvfKp5FCW/aAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.622,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.602,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.564,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.531,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.544,3.478;4.blob,1.1,1632.iVBORw0KGgoAAAANSUhEUgAAAo8AAAAPCAMAAACyYdW4AAABmFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkr////w8PC8vLxJSUkcHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKjCwsI8PDyhoaH+/v50dHQyMjL9/f0bGxuZmZnd3d0ICAhMTEwuLi5GRkb29vYODg6wsLB9fX38/PwsLCyQkJABAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MKCgqSkpIEBATp6eleXl4FBQUCAgIZGRlQUFCLi4vBwcG0tLTJyclLS0v09PQLCwtUVFRAQECsrKyUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6MhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyO5ubmxsbFmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OSFhYUnJycQEBA3Nzfo6OiKioqWlpZISEgzMzO3t7eDg4NnZ2dZWVns7OwGBgbOzs4pKSmGhoYJCQlwcHCcnJyqqqooKCgTExNJZPYQAAAC6UlEQVRogeWZ6VcTMRTFhwBWkcYKrYqVugGKgLQqLiAF9w1RRFRccNeK+y4uuOu/bSdTZCZ5yczLdIYovw+dnL5325fbe06mrWXVkL/U1hEp7j4VQfvmqF+SWLqsAacxSYvdrxfO8eWNSW1tpAi7tChdkVopbdepsvew3O9UV4uYKGRfhabmdGbV6jUojVHacHnkHW9Zq6+NEjGP2XWZ1tx6WbtOVcjjho2bEBOF7Kuwua2dkA66BSUySRsqj4LjWzu3aWujRMxjV/mhu2e7pF2nKuSxN4WZKGSfQ76ww37cuQsjMkobKo+C432792hrowTO497CPkm7TpXPY//Afm/DYDujCE+kntyjlTNEh+1LusutCLgyQIvwBWLO8fz8UwcOIrXxAOeRHDosadep8nk8cvSYfSky2wfLqxbKOA5PpJ7co5VTT0/Yl5NZtyLgygAtwhcIx/HiqcaR0+Vr72j54UzuLEYbF5I8jp2TtOtU+TyOn2eXDma7LZm4wLgIT6Se3KOV4/ps5xUBVwZoEb5AOI5fmkxe7rxy9doUC9j1GxhtXCxAHm/euu1cme13SJzn9d17+ufmQmoRvgBUHL9fIuTBNH1YYk8+eozRxoUkj0+UJzKyyuWx5ikfnhjO63yz/d2AjDzTODcN0CJ8AXA7nn/+wlmM9rzEamMAzmP/K9U3FmyVy2P2Na+L4bwmb9oaCHlL32mcmwZoEb4AiI7bzIzpayMDzuN75S862Ko3jxM5iVo2Uci+Ck0D6cyHQitKY5RWP48Sxz9+mtXWRgb4e/g4Vf3ija5689j9OdBEs85dVB+8gib34ctMYvKr5v92JmgD+QJ6JXH829Sw7+v5flrVRtilRWkilfQ+F6ZK+DxOfw80keXcRZXgFQl1fv2TBPIF9Erm+I+fvq/n+2lVG2GXrhKcA2SV8HkMONEv5y7qN7wiizaPal8kXikIo40AYZfqSfFVopnHqvX9LyyO/caxS/YefwACvbG+JmGTlgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.551,3.494;4.blob,1.1,984.iVBORw0KGgoAAAANSUhEUgAAATUAAAATCAMAAADGQ2qpAAABF1BMVEUAAAD///8MDAz19fVKSkp3d3fU1NSIiIgrKyukpKSoqKhGRkb29vYODg4yMjL9/f0bGxvNzc0CAgLk5OQDAwPm5uZjY2OQkJC8vLxvb29DQ0OLi4vBwcEEBATp6eleXl77+/sWFhahoaEtLS3+/v4fHx9LS0v09PQLCwu0tLTQ0NB8fHypqamjo6NWVlZcXFxycnLZ2dkPDw/39/dFRUXw8PAICAi6uroYGBj8/Pw3NzdkZGSbm5u3t7eVlZXCwsKKioo9PT11dXVZWVns7OwGBgYhISEsLCze3t4BAQHT09MJCQny8vJQUFB9fX3Ozs6CgoIxMTGcnJyqqqrIyMhgYGDW1tZwcHApKSmPj48oKCg0NDQTExNp6XG9AAABhElEQVRYhe2Y11LCQBiFWZViBQF7VxTsHbvYsPfe3v853E2EYHazexIv/J3Jd5HJhFOYM8yQJBIJQWFV/vqb/CfC1YJQs1pdfYNaE439ssQzGegg6bUXiyfEb62xSa2JRU3dJrySkQ6KXnu1RFys1tzSqpK0JVOmbhMeyVAHRa81Wns6I1bLdnSqJF3d+mYAj2Sog6LXWq2n1/436OtXKAYGh/TNCMpksIOgV4w2PDJqrzaWG5cVE/mCthlCmQx2EPSK1SYL+e87j6lpWTEzq+tFUSWjHfS8YrW5+cr92sKiJFhaXtEloyiS4Q56Xj7XanGtstr6xqZbsJVJ65JRFMlwBz0vn2s7law+G+zsugWlPV0wjpyMd5Dz8rn2D5wnqsOj8s/Pj3Mn+mQUKdlHBzkvY6dn585qF5dX/FguWmT56fWNPhjGneyng5yXsdu72qf3+wd+eLSvPPHT5xdDMowr2VcHNS9jr2/SO4/3D4tPU6h/nGT/HYS84ZuiIISrBcFZ7QtsZGMizRNRkAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370724;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,3.860,3.475,3.340,2.38,2.14,1.1,3.850,3.475;4.copy,1.1,2.20,3.494,3.830,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.621,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.981,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.584,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.911,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.584,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.554,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.521,3.437;4.blob,1.1,2308.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.534,3.478;4.blob,1.1,616.iVBORw0KGgoAAAANSUhEUgAAARMAAAAPCAMAAADwFNveAAAAjVBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExPSj7TGAAAA+klEQVRYhe2U2Q6DIBBFEe1ea/fFLnbf2///vFowFoyYGWICSb0vzMOc4c5NgBCHpnI9qpTYVyRoXzGLn1IiS8QJngvhoPPxsjCTWr0B4aDz8bIwk2YLxEHn42VfJu1OV271e0wB6qakT2I1vZlihUz6g+H3CNgyflyNxkwT1E1Jn8RqejPFCplMZ+yYs2UWcRUumVaom5I+idX0Zor9ZbLeRPxky2xp9XYodXbZBaq3sz9kW//+7YTHE5CDzsfLtkzOFxB35f/ELb/ScqT0ZopNM7k/QBzh/8Qzv9JypPRmiiXIN/Hi/8Q7v9JypPRmisVmUlpfMWs0kw8gei+gCtQxOgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.841,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492370759;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.475,4.1190,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.611,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.844,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.971,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.574,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.873,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.901,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.574,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.544,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.511,3.437;4.blob,1.1,2228.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;3.end,1.1;4.sync,10.6492370798;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.601,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.834,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.961,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.564,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.863,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.891,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.564,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1174,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.534,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.501,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.514,3.478;4.blob,1.1,1624.iVBORw0KGgoAAAANSUhEUgAAAqoAAAAPCAMAAAAbFR0sAAABmFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkr////w8PC8vLxJSUkcHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKjCwsI8PDyhoaH+/v50dHQyMjL9/f0bGxuZmZnd3d0ICAhMTEwuLi5GRkb29vYODg6wsLB9fX38/PwsLCyQkJABAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MKCgqSkpIEBATp6eleXl4FBQUCAgIZGRlQUFCLi4vBwcG0tLTJyclLS0v09PQLCwtUVFRAQECsrKyUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6MhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyO5ubmxsbFmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OSFhYUnJycQEBA3Nzfo6OiKioqWlpZISEgzMzO3t7eDg4NnZ2dZWVns7OwGBgbOzs4pKSmGhoYJCQlwcHCcnJyqqqooKCgTExNJZPYQAAAC5UlEQVRogeVZ+VvTQBBNF7CKdKnQqlipF6AISKviAVJRvEUUERUPvLXifYsH3vpv2yRaQvfIzOQwre+HZJuZN7vz9n1ftq1hxFgZdfVMCWeeDmJew5L40mWNMHb1caG6yFGh+PKmBJkbKIQuDc6bkyuU6ZSoXkkjZjgT6ut0qbpCmryW1lR65arVMHb1cb1ZtVLxtjV0bpAQrZpZm27PrlOlU6IYq67fsBGxWGjepo5Oxrr4Zhi96rierCoovqV7K5kbJESr9pQuvX3bFOmUKMaq/UnMYoF5ufx287pjJ4xedVxPVhUUH9i1m8wNEnKr7snvVaRTogirDg7tWxwd7rRQABQSJixz9/MR83Oqx1kPOIoAF9ovCX8Vzy08OnAQyQ0Hcquy0UOKdEoUYdXDR46at4K1X8OlURu3cAxQSJiwzG3gx83PJzLOesBRBLjQfkmwFS+cbBo7Vbr3j5cup7NnMNywoLDqxFlFOiWKsOrkOevWZe2XWW3qvIULgELChGWuY9sX6gFHEeBC+yXBVvzidOJS9+UrV2cs7127juGGhWhZ9cbNW/bd2q/bzN8DwJ279Bfxv+RC+6Xgj+L3iozdn+UPitbDh48w3LCgsOpj7SseGYVbNfakUBH15QCQazW/orCxp4QXcQS40H4pcCqee/bcHoz3vcByQ4DcqoMvdV+csFG4VTOvKqO+HADY645Gxt7wt4QXcQS40H4pEBU3MTdB5wYGuVXfaX+OwkbBVp3KKgqDCmnyWoZS6ff5dhi7+rh0qyoU//BxnswNDNK/ACa57kd+dBRs1d5PoMXO2+e5AflIOuHnufj0F+IfnNHngnSRaqVQ/OvMiGs9193yG0KXBufxZGLxMy9RhrDq7DfQYg37PFeUj1wnrD2AdJFqpVL8+w/Xeq675TeELh0huQ+QUYawKnCxP+3z3C/5yHXC2gNIF4VWGnjhBgChS/1K8VHmv1V9y6sV/B/9htGlm1V/A5WJtLvtx0ovAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492370841;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.742,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.792,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1000,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1060,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1180,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.951,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.554,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.853,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.881,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.554,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.952,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1164,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.822,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.702,3.210;4.blob,1.1,1724.iVBORw0KGgoAAAANSUhEUgAAAcAAAAASCAMAAAD7ev7RAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADB0lEQVRYhb2YaVcTMRRAg1UUrRYEigUtVm2LyCYgOEVcCyhgK+KKuyIqdcUFFdw3cN9+sJ0402am816SifF+oDmZ3Nx3DofSU0LylBGIJQHvfXUDOqdiqFD2Hxq6WLoMfFS+fIUmAzinYqhg1bQ2dFGxchV9Da5eE6qscq7I2mrE8AQ1eDejDdTwnF6YQo0zFdaVp6Y2XLcu4s8tdusb1tOdyIZoeePG2CZ2Rcjm0JYS1za8wQzezXgDM7ynF6VYw6fCuvLEE8mmrc3b/KhstyUUpFutbe0d2zs7u9hVnu4dJbJtACAG72ZOAzGA6QVhauhUWFeerp5eQnYaKT8u0+3bRXf6d8f37N23P3CAWZk0Gu1u2TIgYIN7M6cBG9D0gjA1dCqkK086NmD+HBzy4bLdRCvdOngo0hwcHiF1keLK3B81Drtty4CADe7NnAZsQNMLwtTQqZCuhGSRMbLmSxL/c+B2jxgtdGusO9VBjo6TY8eLK/rgxIBLtg0Q0ODdzG2ABji9EI4aMhXWlZAsaoyT5svIKXmV7Z42JujWmaGz1WTsXLqBWVHOX3DJtgECGrybuQ3QAKcXwlFDpsK68qj8ApluyrhIty5dvjJ5tXbqWh+zoly/4ZJtAwQ0eDdzG6ABTi+Eo4ZMhXXlsd5CK9t8uEw3bvz93FwRnZ7M3bx1+w6zoty955JtAwQ0eDdzG6ABTi+Eo4ZMhXXlSSfom/XMfR8u053OPaBbvQ8fBTIkM8uuTOofP3HJtgEBG7ybeQ3YgKYXg61hU2FdH4z3RMxPvU99qGx3znrPnw8/q8g+d67yVBnDbnsO/y+BGLybOQ3EAKYXhKmhU2FdeeIvkk3zsZe+XKb76rW19+btu8H3rhUhHxb63XLB8AYzODdzGpjhPb0gTA2dCu3Ks/gx/Omzz6/Sit0vua/YwW/fS7b+keFxTsVQgalpa+hjKpqGH2ZnRjUZnudUDBUKNY0NbQR+wJ+DFhd+ajK8z6kYKtg1nQ19zP4CH0381mUA51QMFaya1oYW/gBn2zBzTATATgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.582,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.562,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.524,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.491,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.504,3.478;4.blob,1.1,2132.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;3.end,1.1;4.sync,10.6492370886;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.581,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.614,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.814,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.941,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.544,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.843,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.871,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.544,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.942,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1154,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.514,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.494,3.478;4.blob,1.1,2236.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;3.end,1.1;4.sync,10.6492370923;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.rect,1.1,3.571,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.804,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.931,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.534,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.833,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.861,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.534,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.550,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.932,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1144,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1132,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.504,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.471,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.484,3.478;4.blob,1.1,2256.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;3.end,1.1;4.sync,10.6492370964;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.380,4.1190,2.57,2.14,1.1,1.0,3.380;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.561,3.369,1.7,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.364,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.794,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.921,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.364,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.524,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.823,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.851,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.524,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.922,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1134,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1192,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.494,3.362;4.blob,1.1,1460.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw/IyMhkZGRERETu7u4hISGioqKvr6/k5OR4eHjg4OCAgIAMDAz19fVKSkp3d3fU1NQDAwPa2tpwcHAVFRVJSUmkpKSoqKhSUlKcnJy9vb1GRkb29vYODg4yMjL9/f0bGxurq6uwsLBISEj///8XFxfm5uZjY2OQkJC8vLzq6up2dnZWVlZ8fHwICAjh4eGLi4vBwcEEBATp6eleXl4FBQUCAgITExPo6Oh/f38tLS3+/v4fHx9LS0v09PQnJydCQkLX19eVlZVMTEyTk5M0NDTQ0NCpqamjo6MREREuLi4+Pj7T09OdnZ0jIyNycnLZ2dn39/dFRUUcHBze3t6IiIj8/Pw3NzcGBgb6+vplZWX5+flsbGy3t7fCwsKKiorGxsYsLCwxMTFZWVns7Ox+fn7b29tvb28JCQny8vJQUFB9fX3Ozs4aGho6OjpgYGDMzMyqqqrW1taNjY2/v78BAQEoKCjl5eXNzc2FhYUpKSkUFBR6enpqH2qIAAACc0lEQVRoge2ZaVcTMRiFIwhUtDosBSqL7OtQcQEEoYjIvm8qKFhwxQ1kVQFF4IfDZHCmM0mTZpm2nJPnwzR9k3Pfm/aeptMCEMUV4CQtHSgUNlczXIXMLF9SjChSiWvZ/0fXb/jdkzdvSVEmoOUY19w8APIDBQLNqBQWuStx+WNYJ4LsHjL1LK3g7WJksiRQKkGZhJ0QUHaHvxedokJ3RSWEUas8kI/OVlRKUCYRlZCq6hr+ZjRq6+rdJZUQRq2GRsxsk94srkwiKiHB0F3uXlRa7iEllRBGrfsPMLM1+kNxZRJaa9s57UZCwKMO7l40Oh93IbUkJ6S7DRL2pIcXCenRy3HTT3qNaxhupjvGSMSlpkNgQp72PWNxzkL/AHrjnuSElJk7z/SkhxcJGdSHcNPDI8Z1FG6mMcZIxKU2Nn5OCCYETLSyOGdhcgqtJTkh/nHItCc9vEjIjD6Lm56bN64+uJnnMUYiLqO+hwDw4mX8vpnwLSyiRXXKsGm90rE3tq+XhJWJOBKStvyGuxuRbC2MFtUpw6YVWVnFzAbfvhNWJuJICHg/wt2NyIePmKI6ZRi1PuHenTX9s7gyCWdCvnyNcLcj4O9bw1TV3S6j1rfv5mPEPB+D8Ml6CPPxzKpMwpmQjR+bDgdyRmBrm9sfwzoRLnpQ9mFBXSfBs6Vnae2s7Jri5vm4B5/83OJvweOy4pfDgZwR+I3+n8DgL4EJoezDXk5bJ8GzpWdr7R8cGg9/zPOxxxhv/hX4IZzbpe1AzkjQXwITEu8+qOskeLb0bK30o3+uRcchzE1i3CTilRUhBROSsnoXnJy6CkP9nvRRXCbOAHkDqLCUkDvJAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.461,3.437;4.blob,1.1,2308.iVBORw0KGgoAAAANSUhEUgAAAjgAAAAlCAMAAAB4fGOoAAACClBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGR3d3ekpKQ8PDy0tLQYGBjw8PC8vLxJSUkmJib5+fmhoaEODg7CwsJOTk7+/v50dHQyMjL9/f0bGxv4+PiEhISwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpIEBATp6eleXl7JyclLS0v09PQLCwuVlZXc3NxUVFSpqamjo6NMTEwhISEREREPDw/39/dFRUUjIyO1tbXk5OTo6OiKioqDg4POzs7x8fFKSkrW1tZwcHBgYGC2trYfHx8oKCgTExMiIiINDQ0qKiq4uLjg4OAHBwcMDAz19fVISEhaWlq3t7ccHBzq6uq6urpqamrt7e2enp6oqKjQ0NDNzc1fX18/Pz+ZmZnd3d0uLi5GRkb29vZZWVlCQkLS0tLHx8c3NzfBwcGTk5MBAQF/f3/n5+eCgoLm5uZjY2Pe3t5PT08nJydiYmLu7u4ZGRlQUFCLi4vV1dWqqqra2tpBQUGUlJTl5eVpaWlAQEAtLS0JCQmMjIzi4uJ4eHinp6cgICBXV1fy8vJ8fHx7e3vh4eHR0dGgoKBmZmYvLy/7+/u5ubmxsbFycnLZ2dl6enqNjY0QEBCFhYWtra2WlpYzMzNlZWUpKSlnZ2fs7Ow6OjrExMSXl5eGhoacnJyFw3kOAAAEc0lEQVR4nO1a918TMRwNBRrRKqAFURHqRMQKLlxoVRyAOEFBy1LEhYqKG/cWceBC3Hv7P3rXo1fwQpp8c9feQd4P1y9J3ve+F96nSXMPIYmoSHC5ErUoyeVKHryNzpAYdnBjPEKLUjAeOXgbnSEx7OAe5RmtRWNSdeEQ2uiM4YG09Eg8NoXWy5olZhiHQ/Cax3Vn6GGmLhxCG51hRBrG47MmMBVm9kzy52Nk9B+WMhZ627gIZ6LXOynb651sHtcy4eR4c7N9U1gKc6Jwpk6bDr1tXISjYMZMU7mWCSdPuczKn81QlROFU5AFvq0UTnThzPHPZajKgcIpLJoHvq0UTnThoIz5DFX1zaTyM19FsliEYiKcBQsXQZOExyWHKk6IUYQcJpzixQxV9c1k3+Z9iViEYiKcpcvAScLjlocqzotRhIawcEo8IawQi1AshLMysAqcJDxuZaji1TGKkMOEs2ZoLlXppYQTc7nHMU84hWs5NscOWqpy1sGTSOGQe8MICWc9z89x5yxVJT7SY9laOM46AFyKh+YB4KwNIreN8yuHJG1VT2SPYv7KoSyrnOmhLBIO67yQGPRCKzbSehnLixfSNBlUskdkuDfpJonNunAIbXSG2KNYIxyOeTEwIIU6RDhbtFV9K3tEhg1sFRYJh2NeDAxIoQ4RjlnY5tFNEh7P9sHb6AwhOGaPIyEhISEhISExNGE0jEZg7ua4qrpsx8ydbBltx62pZTuIIWAX3q1cE0qD0AQCMOfHDxFGwyh/YqZxdfUNuY1Ne9gy2o87bi8og4rmfcqlBe8HJ4DDOuEQDKP8iZnGHTjoUl0Rh9hS2o57uBX0ckPFEXwUoWNtULoIrBMOwTBKS3z8RKDoZA2kgHb/KfV6+gxPdTbiJp49B8gQQuL5oLJeXYDSRWCZcAyGUbqbo6O1etfFS2sGKWAAN4z2vs/L+Ir60ZAHcJbYgIvQ1RPgWW7Es7OutUcfZz4sE47BMEp3c1y/UYhQKr5JLiDC1Q2eybdqb99Rugoyq/BddYw7B+AssQEXoXu+zdBZ7ixqwy1QshAsE47BMEp3cywMmVj898kFRLi6wXN3V/mD1oePHncv6vdP4HaW2ICroPkJeJqf4mcJYLIIrBKO0TBKXao6tVd6z1+QC4hwdYNnTyVCLytwb2X4a//Va/iSEU+ugjdvodOMVvjegblCsEo4RsMofamq1b5x3pMLGMDth/aOD8qlXt1ootsfAUuGDbgKMvOPQ+cZ9faAqUKwSjhGwyh9qfqk7XH+NxAYlioSPh/cqR6GfYGYIOPPVREshs4zmvQVTBWCRcIhG0Ypib8FgqktTdWgAuqKGnK/+7M5yrMb98iPJFAWBYE4mRXEhUM0CpINo7TEP38F/L8NJ2Fsyv0WLOv6Azz6twW3s/vKgE4OQ2Ytn4XTnAhRraP0Xj0iGgXJhtEIhpmRKyr+Xh/wJ79Rld/kKhIhqnWU3qtH7AbK/s8phUMDv1GV3+QqEiGqdZTey6ESAqRwnA7hPc4/R9dTMDXE0ckAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.474,3.478;4.blob,1.1,1440.iVBORw0KGgoAAAANSUhEUgAAAssAAAAPCAMAAAAlMHJiAAABQVBMVEXIyMhkZGQAAAB3d3fU1NQMDAz19fVKSkr////w8PC8vLxJSUmkpKSoqKjCwsI8PDxOTk6hoaH+/v50dHQyMjL9/f0bGxtGRkb29vYODg6wsLB9fX38/PwsLCyQkJADAwPm5uZjY2MKCgrr6+uSkpIEBATp6eleXl4FBQUICAgCAgIBAQGLi4vBwcG0tLTJyclLS0v09PQLCwtUVFSUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6NMTEwhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OQnJycQEBA3Nzfo6OiKioq3t7eDg4NZWVns7OwGBgbOzs4JCQlQUFDx8fFwcHCcnJyqqqooKCgTExMh5kVtAAACsElEQVRoge2ZaVvTQBDHQ0AaKqBUUG4UuSx4cSq3goicFZBL5fBA9Pt/ANoNtrvd3cnOpNk80P5fNHky85/Znf5ebBvHqXLzqq5xteLzIJnmwV58lfi9FBVN/E5tguyNVNIuHc+rS97VplOi8CQNVuDwOTXViFoh82BvubBcPPH6Bro3SskkNd6735R6oEunRLEsS1V4lptbHiJqhcyDvWXCsjTxR61tZG+Ukklqz350dHZp0ilRLMtSFZ7l7iSmVsg82FsmLEsT73n8hOyNUmqSep/2adIpUQrLQhWO5f6BQTF76BlT2qCT1FPwmip+Hu2y/H/iw4VHI8+RXjtSk+S+eKlJp0QpLAtVOJZfvR7NXdIMwqHsXb3HNGbQSeopeE0VP492WfYnnh6vnZjMXrunsh9vUm8xXlvSkDQ9o0mnREks81U4lmfn2GWeQZhLXFhkemfQSeopeE0VP492WfYn/n4psdz6YeXjKoPz0xrGa0s3jOX1jU3/yiDccitnDKQXreuJb2dc9/OOt5thD/e+YLy2pCFpHzxFIKMklveVZ4yqg2LwKmcMlBctfuLDh0f+zVTnMdZrQWqS+r9Cv+6wUQrLQpUCy43fiu2VMwbKi5Y88Zy+T9O9kUlN0gn4rxs2SmH5RPmf3EJK09moEz4P9pYDy5qJn56dk72RSfmmYtaD3oago4R3JWKVPMsdP6BK+Vrn/jm4R30XuCKjHqQqMXvhuShnpZn4z9VfgfUCv61SS9ql43m/kwnxWZioa8gyVCXP8s6F0W4c/xycUd8FrsioB6lKzF54LspZ6Sb+5zKwXuC3VWpJu+RCag6QUdeQZaiKY/rtXef99c/B/9R3gSsy6kGqErMXnotmVoDCeCOQtEt4pfhooQd9BViWS5YHe28cy7dcNnaJPC/LugKcZ+QEmyLmFwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371003;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.702,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.962,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1020,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1080,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1140,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.662,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.570,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.554,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.584,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.784,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.964,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1034,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.514,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.813,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.841,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.514,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.530,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.912,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1124,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.662,3.210;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAAfwAAAASCAMAAACJtZxnAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC1klEQVRoge2YZ1dTQRCGV6NoVKKhBAOWYEyCCFKkuEGsoaiQKGLD3hCVWLCi2LFgbz9Y48k1lzt3Z2bJ5tt9PpA5c99n37OHAyEI8ZdFQsVin/u+eEOVK96gcx4FlixVPipbtrxEhiJnwCBzHgX8K1aqH64qR4zA6jXBisr5E25QJ2MdXIPKQVzvwaSqOlSzNqxZCHr1MdNbW7cOya0PbgA7ywhvjJTVb4putk+4QZ2MdXANKgdxvwePWDzRsKVxq1Yf7NXHUG9TMIAlm7eBlWW0tLa1b+/o6LRPuEGdjHVwDSoHUdyDRWdXtxA7ZFKrEPTqY6i3ZyearJdtzlXe6N0V271n7z7fftuEG+TJSAfXIHMA1T04pKJ9ua/9Axp9sFcfU73xFjQ6KA84V3nj4KFwY2BoWNSECxNukCcjHVyDzAFU9+CQlpncSwL/AaJ69V1DvYdlE5490udYWMZIc7JdHB0Vx44XJtygTsY6uAaVgyjvwaBKnsi9DJ/U6IO9+q6h3lNyDM+ePuNYWMbZgXPlYuR8qs424QZ1MtbBNagcRHkPBsV8E/TbjPcm5QU8e/GSY2EZl69cHb9WPXG9xzbhBnUy1sE1qBxEeQ8G+V+/Fa0afbBXH0O9MUl8Lrpx07GwDH9kcjx76/adu7YJN6iTsQ6uQeUgynswSMX/vcFM3dPog736GOqdzN5Ho7UPHjo2ltH96LEvLdLT9gk3qJOxDq5B5SCqe7AY7QrnPl080VBg7wIw1PsUf3+slEPOlWXMhJ75M8/nT7hBnYx1cA0qB1Hcg0XsRaJhJvpSR3Hp1cdQ76vXaPLNbK9z9d94++59/wfHhBvEyWgH1yByLrjfg8fcx9Cnzwv8N6t+m+neL9mvWPDbd7AyZLjkDBlozsPORCSlfpiZGiyR4ZozYhA5Dxu+H+q/Gedmf5bIcM+ZMKich53pX8pHY79LZShyBgwy55HnD9DxQjHzzAEvAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.542,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.522,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.482,3.383;4.blob,1.1,840.iVBORw0KGgoAAAANSUhEUgAAAswAAAAPCAMAAADH7GkbAAAA4VBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl58fHwICAjh4eGLi4vBwcFLS0v09PQLCwv///8tLS3+/v4fHx+pqamjo6OTk5M0NDTQ0NAPDw/39/dFRUVycnLZ2dkCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vJQUFDW1tZwcHBgYGCcnJyqqqooKCgTExPL7jW6AAABUElEQVRoge2Y11ICQRBFh2RAFJWkBLMoIEklGTAgGP7/g9xAeMCd0e6G2rLueZidYmfvbarOw9YqZREIKiKhMP3umMiKva6uLbKD+Syn47fMOn5q+/tvMjMv458LsB7dmO6DAWoKZJYCMnOIbU52W/FtaghklgIyc9jZTYx3yRQ5BDJLAZk5pDN77mY/myOHSMicL1gcQGZdG2Q2cHjkXo9PTskZEjKfOUBmXRtkNnBevHCulyV6hoTM5YpFBjLr2iCziau8vVZrdXoE3pmlgMw8Gk17DUeu6RGQWQrIzOPmtmWt7Q4jAjJLAZmZdHtK3RXvGQmQWQrIzOThsa+enjkJkFmKOQ37BYe05wT6c+SZjb0+5eV1oN6GnITFibaMDl/LHHI/WY48J9CfI89s7PUr7x/MAMgsxZyGnxWHL88J9OfIMxt7/y2QWQq8M/P5Bs2bHV1iVus5AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.451,3.437;4.blob,1.1,2228.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.464,3.478;4.blob,1.1,1444.iVBORw0KGgoAAAANSUhEUgAAAt8AAAAPCAMAAAALdVPwAAABQVBMVEXIyMhkZGQAAAB3d3fU1NQMDAz19fVKSkr////w8PC8vLxJSUmkpKSoqKjCwsI8PDxOTk6hoaH+/v50dHQyMjL9/f0bGxtGRkb29vYODg6wsLB9fX38/PwsLCyQkJADAwPm5uZjY2MKCgrr6+uSkpIEBATp6eleXl4FBQUICAgCAgIBAQGLi4vBwcG0tLTJyclLS0v09PQLCwtUVFSUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6NMTEwhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OQnJycQEBA3Nzfo6OiKioq3t7eDg4NZWVns7OwGBgbOzs4JCQlQUFDx8fFwcHCcnJyqqqooKCgTExMh5kVtAAACs0lEQVRoge2ZW1vTQBCGQ0AaC6JWRBQETyAURREVRZSjigpYOQmeURH0//8A2w2mm+7u7Myk2TzSfhdNnsx8M7uT92IhntfiR2pt842S8yBh82AvvUr2Xo5qJn6iPcf2pipll14QnMx3GNM5UXiSzBV4sq+tlVA/YR7sbRS+ayfeeYrvTVMqXV2nz5wtnDOlc6JUvlE9ZL67z/cQ6ifMg70Nwrcy8Qu9F9neNKXSdan809d/2ZDOiVL5RvWQ+R7IU+onzIO9DcK3MvHBK1fZ3jSlp+va9RuGdE6Uw7e1h8T30PDNeM7IqFAR0V1ZR8yLVfaMuuX738THqo9u3SZ63UhPlz9+x5DOiXL4tvaQ+L47ca9yKQowR8p3nYHQJKK7so6YF6vsGXXLdzjx4v32Bw/L14Gp8s+jwmOK15UMdE0/MaRzoiy+bT0kvmeeisszAWYlPDsnNI/orqwj5sUqe0bd8h1OfGExt9T7/MXLZQHsq9cUrysdA77frKyGVwHmmt88nxC9ZB1N/G3J99+tBxsl8XBzi+J1JQNd2+DpgBhl8W3rUeW75X0tjM3zCclLljzxsZ3d8Gaq/wPV60B6uoY+Qn/dUaMcvq09qnx3farNaZ5PSF6y1IlX9Hma701Nerq+gP+do0Y5fFt7RHzPFgyZqO70PNjbCHwbJv712x7bm5q0X1dmAujrCjnK+L5j7xHx3fcdqh7V3wvP1YP6O+sqUT1YVTL2wnPRzsow8R/LP631rG+r3lJ26QXBfj4Xf5Yk6iP5pvaI+F7/hdqhF56rS/o76ypRPVhVMvbCc9HOyjTxg0NrPevbqreUXUohPQfEqI/km9rDw77Ro7zf4bn6j/7OukpUD1aVjL3wXAyzApTEm4KUXcIrpUerPeq7AirfdcuDvf8d38dcLnZJPH/j9Bc5jfAoCFmR0wAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371046;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.copy,1.1,2.10,3.494,4.1190,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.482,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.544,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.574,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.611,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.674,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.774,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1024,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.504,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.803,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.831,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.504,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.902,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1114,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.472,3.383;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAAtcAAAAPCAMAAAAYohMEAAAA4VBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl58fHwICAjh4eGLi4vBwcFLS0v09PQLCwv///8tLS3+/v4fHx+pqamjo6OTk5M0NDTQ0NAPDw/39/dFRUVycnLZ2dkCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vJQUFDW1tZwcHBgYGCcnJyqqqooKCgTExPL7jW6AAABW0lEQVRoge2Y2VLCQBBFh01xRVHBBRRccIn7riDI5vb/H2SMVplkkhntbqg83PNAVZrJvZ2q85CKUi6ptCKSydL//SE38fU7mR9lB/NeTsdf+e2Iavv/TGbncTy5AFPTM1HjdIoaCK+lgNccZucihvOFBWoevJYCXnNYLC7pw+UVch68lgJecyiVV7XZ2voGOU/C60rVZRNem9rgtYWtmjaqb++Q4yS83vWA16Y2eG1hr7EfHh0c0uMkvD5yXMrw2tQGr20cV0KDk9Mzehrer6WA1zzOL0KDbO6SngavpYDXPK6ub4KD2ztGGryWAl4zuX8IXD42mowweC0FvGbSemr7LzvPnDB4LYVmZLvqUYrdwHyOvLO1N6F0e33l234w5ISNzrlxdCTa68z398+X2A3M58g7W3uTyuubCm1PB15LoRn57nh8xG5gPkfe2dqbaALb04HXUuD9WpRP8GYhFTWminsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.441,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.454,3.478;4.blob,1.1,1692.iVBORw0KGgoAAAANSUhEUgAAAukAAAAPCAMAAABumKGPAAABmFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkr////w8PC8vLxJSUkcHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKjCwsI8PDyhoaH+/v50dHQyMjL9/f0bGxuZmZnd3d0ICAhMTEwuLi5GRkb29vYODg6wsLB9fX38/PwsLCyQkJABAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MKCgqSkpIEBATp6eleXl4FBQUCAgIZGRlQUFCLi4vBwcG0tLTJyclLS0v09PQLCwtUVFRAQECsrKyUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6MhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyO5ubmxsbFmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OSFhYUnJycQEBA3Nzfo6OiKioqWlpZISEgzMzO3t7eDg4NnZ2dZWVns7OwGBgbOzs4pKSmGhoYJCQlwcHCcnJyqqqooKCgTExNJZPYQAAADGElEQVRogeVZaUPTQBANC1hFulZoVazgBSgC0qp4gFS8L0QRUfHAWyvet3jgrX/bJtF06e4mM5PDtL4PyTYzb+fY92HSGEYdc1DfwLQQ/dwg+zUuSixe0gRjVx8X2hc1Kjq+tDlJ5oYKqUqD82Wp5Vp3itW9k74zMMQdGuoRkaB+La3pzIqVq2Ds6uP6U3plx9tW07lhQtZZdk2mvWOtzp1ixSodGUNU+rr1GxCRoH4bO7sY6+abYPSq4/pSutTxzT1byNwwIeust3Tp69+qcadYsUpHxhCVPpDCRAL65fLbzOv2HTB61XF9KV3q+ODOXWRumFDrbHd+j8adYqUoHRFDUPrQ8N6F3iNdFgqAPKSMHO4+Pmr+TveK+wFXMeBC6yXhb8dz5Uf7DyC50UCtM3bwkMadYqUoHRFDUPrhI0fNW8E67pHSqo1bOAbIQ8rI4Tby4+bvE1lxP+AqBlxovSTYHS+cbB47VboPjJcupzvOYLhRQaOzibMad4qVpHR4DEHpk+esW7d13Kbj1HkLFwB5SBk5XEE15f2AqxhwofWSYHf84nTyUs/lK1dnLOleu47hRoWaUvqNm7fsu3Xct1mw08udu/Qp4l9yofVS8Kfj94qM3Z/lD4rWw4ePMNyooNHZY9fZAWklKR0eo6z0uieFCu9Appdcq/l2x8aeEqaIGHCh9VIgdjz37Lm9GO9/geVGALXOhl66vQ9irRSlI2KUlZ59VekdyPTCXnc2MfaGvyVMETHgQuulQO64ibkJOjc0qHX2zvU/PqyVonREDEfpUx0aDigPF7+W4XTmfb4dxq4+Ll3pmo5/+DhP5oYG5XebSe723QZtJXw5wsRwlN73yS2OE2nenmUH1Stlvp/nEtNfiF/l488F9UXZK03Hv86Meu7neVpBQ6rS4DyRSi585sfKgEqnx3CUPvsNVKthz7JF9coz39oDqC/KXuk6/v2H536epxU0pCoFk1oHSCsDKp0ew0BOJT/tWfaXeuWZb+0B1BdNr1zghxsCpCrdM8VbGVDp9BhYpQfmVyv4P+qNokrknI7Fb7Im4VH+Lw1JAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492371083;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.rect,1.1,3.472,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.534,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.564,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.664,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.764,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.894,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.944,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1014,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.494,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.761,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.793,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.821,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.494,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.478,2.18,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.892,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1104,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.852,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1032,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1092,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1162,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.462,3.383;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAAtcAAAAPCAMAAAAYohMEAAAA4VBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl58fHwICAjh4eGLi4vBwcFLS0v09PQLCwv///8tLS3+/v4fHx+pqamjo6OTk5M0NDTQ0NAPDw/39/dFRUVycnLZ2dkCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vJQUFDW1tZwcHBgYGCcnJyqqqooKCgTExPL7jW6AAABW0lEQVRoge2Y2VLCQBBFh01xRVHBBRRccIn7riDI5vb/H2SMVplkkhntbqg83PNAVZrJvZ2q85CKUi6ptCKSydL//SE38fU7mR9lB/NeTsdf+e2Iavv/TGbncTy5AFPTM1HjdIoaCK+lgNccZucihvOFBWoevJYCXnNYLC7pw+UVch68lgJecyiVV7XZ2voGOU/C60rVZRNem9rgtYWtmjaqb++Q4yS83vWA16Y2eG1hr7EfHh0c0uMkvD5yXMrw2tQGr20cV0KDk9Mzehrer6WA1zzOL0KDbO6SngavpYDXPK6ub4KD2ztGGryWAl4zuX8IXD42mowweC0FvGbSemr7LzvPnDB4LYVmZLvqUYrdwHyOvLO1N6F0e33l234w5ISNzrlxdCTa68z398+X2A3M58g7W3uTyuubCm1PB15LoRn57nh8xG5gPkfe2dqbaALb04HXUuD9WpRP8GYhFTWminsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.431,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.444,3.478;4.blob,1.1,2228.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;3.end,1.1;4.sync,10.6492371125;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.rect,1.1,3.462,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.524,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.554,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.754,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.884,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.934,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1004,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.484,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.751,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.783,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.811,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.484,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.654,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.714,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1094,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.752,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.842,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1022,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1082,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1152,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.452,3.383;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAAtcAAAAPCAMAAAAYohMEAAAA4VBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl58fHwICAjh4eGLi4vBwcFLS0v09PQLCwv///8tLS3+/v4fHx+pqamjo6OTk5M0NDTQ0NAPDw/39/dFRUVycnLZ2dkCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vJQUFDW1tZwcHBgYGCcnJyqqqooKCgTExPL7jW6AAABW0lEQVRoge2Y2VLCQBBFh01xRVHBBRRccIn7riDI5vb/H2SMVplkkhntbqg83PNAVZrJvZ2q85CKUi6ptCKSydL//SE38fU7mR9lB/NeTsdf+e2Iavv/TGbncTy5AFPTM1HjdIoaCK+lgNccZucihvOFBWoevJYCXnNYLC7pw+UVch68lgJecyiVV7XZ2voGOU/C60rVZRNem9rgtYWtmjaqb++Q4yS83vWA16Y2eG1hr7EfHh0c0uMkvD5yXMrw2tQGr20cV0KDk9Mzehrer6WA1zzOL0KDbO6SngavpYDXPK6ub4KD2ztGGryWAl4zuX8IXD42mowweC0FvGbSemr7LzvPnDB4LYVmZLvqUYrdwHyOvLO1N6F0e33l234w5ISNzrlxdCTa68z398+X2A3M58g7W3uTyuubCm1PB15LoRn57nh8xG5gPkfe2dqbaALb04HXUuD9WpRP8GYhFTWminsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.434,3.478;4.blob,1.1,2252.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;3.end,1.1;4.sync,10.6492371165;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.rect,1.1,3.662,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.712,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.762,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.812,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.980,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1040,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1100,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1160,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.514,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.544,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.614,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.644,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.704,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.744,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.874,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.924,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.994,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.474,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.741,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.773,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.801,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.474,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.459,1.7,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.872,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1084,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.742,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.832,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1012,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1072,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1142,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.622,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.502,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.482,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.442,3.383;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAAtcAAAAPCAMAAAAYohMEAAAA4VBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl58fHwICAjh4eGLi4vBwcFLS0v09PQLCwv///8tLS3+/v4fHx+pqamjo6OTk5M0NDTQ0NAPDw/39/dFRUVycnLZ2dkCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vJQUFDW1tZwcHBgYGCcnJyqqqooKCgTExPL7jW6AAABW0lEQVRoge2Y2VLCQBBFh01xRVHBBRRccIn7riDI5vb/H2SMVplkkhntbqg83PNAVZrJvZ2q85CKUi6ptCKSydL//SE38fU7mR9lB/NeTsdf+e2Iavv/TGbncTy5AFPTM1HjdIoaCK+lgNccZucihvOFBWoevJYCXnNYLC7pw+UVch68lgJecyiVV7XZ2voGOU/C60rVZRNem9rgtYWtmjaqb++Q4yS83vWA16Y2eG1hr7EfHh0c0uMkvD5yXMrw2tQGr20cV0KDk9Mzehrer6WA1zzOL0KDbO6SngavpYDXPK6ub4KD2ztGGryWAl4zuX8IXD42mowweC0FvGbSemr7LzvPnDB4LYVmZLvqUYrdwHyOvLO1N6F0e33l234w5ISNzrlxdCTa68z398+X2A3M58g7W3uTyuubCm1PB15LoRn57nh8xG5gPkfe2dqbaALb04HXUuD9WpRP8GYhFTWminsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.411,3.437;4.blob,1.1,2096.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.424,3.478;4.blob,1.1,2268.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;3.end,1.1;4.sync,10.6492371209;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.399,4.1190,2.38,2.14,1.1,1.0,3.399;4.copy,1.1,2.20,3.494,4.1180,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.442,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.504,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.534,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.383,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.604,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.634,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.694,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.734,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.864,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.914,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.984,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.464,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.681,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.731,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.763,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.791,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.464,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.691,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.862,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1074,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,4.1192,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.432,3.383;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAAtcAAAAPCAMAAAAYohMEAAAA4VBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl58fHwICAjh4eGLi4vBwcFLS0v09PQLCwv///8tLS3+/v4fHx+pqamjo6OTk5M0NDTQ0NAPDw/39/dFRUVycnLZ2dkCAgIYGBj8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vJQUFDW1tZwcHBgYGCcnJyqqqooKCgTExPL7jW6AAABW0lEQVRoge2Y2VLCQBBFh01xRVHBBRRccIn7riDI5vb/H2SMVplkkhntbqg83PNAVZrJvZ2q85CKUi6ptCKSydL//SE38fU7mR9lB/NeTsdf+e2Iavv/TGbncTy5AFPTM1HjdIoaCK+lgNccZucihvOFBWoevJYCXnNYLC7pw+UVch68lgJecyiVV7XZ2voGOU/C60rVZRNem9rgtYWtmjaqb++Q4yS83vWA16Y2eG1hr7EfHh0c0uMkvD5yXMrw2tQGr20cV0KDk9Mzehrer6WA1zzOL0KDbO6SngavpYDXPK6ub4KD2ztGGryWAl4zuX8IXD42mowweC0FvGbSemr7LzvPnDB4LYVmZLvqUYrdwHyOvLO1N6F0e33l234w5ISNzrlxdCTa68z398+X2A3M58g7W3uTyuubCm1PB15LoRn57nh8xG5gPkfe2dqbaALb04HXUuD9WpRP8GYhFTWminsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.401,3.437;4.blob,1.1,2308.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.414,3.478;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAxEAAAAPCAMAAACsjbIiAAABQVBMVEXIyMhkZGQAAAB3d3fU1NQMDAz19fVKSkr////w8PC8vLxJSUmkpKSoqKjCwsI8PDxOTk6hoaH+/v50dHQyMjL9/f0bGxtGRkb29vYODg6wsLB9fX38/PwsLCyQkJADAwPm5uZjY2MKCgrr6+uSkpIEBATp6eleXl4FBQUICAgCAgIBAQGLi4vBwcG0tLTJyclLS0v09PQLCwtUVFSUlJTl5eVpaWkYGBgtLS0fHx+VlZXc3Nypqamjo6NMTEwhISE0NDQRERFaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUUjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dm1tbXk5OQnJycQEBA3Nzfo6OiKioq3t7eDg4NZWVns7OwGBgbOzs4JCQlQUFDx8fFwcHCcnJyqqqooKCgTExMh5kVtAAACvElEQVRoge1Za1fTQBANAWmoPLQioLxVFIogiooCigIqviuivEFABfz/P8B2g+mmuzvZmWQ3R9L7IcnJzE3u3s49J2kcp8EN0NjkKsH3QdDtg7n4q6TPpaDG8QvNOTLXKIRVOp7Xkr+obKdUYSetKXD4OzU1IhTF7IO5WUlEreOtbXSuSYjz2N5x6XLhiqqdUsUmwpACPhGdV7sQimL2wdyMJEJwvLvnGplrEuI8Xi9vevv6Fe2UKjYRhhTwiRjIYxTF7IO5GUmE4Pjg0DCZaxLyebxx85ainVKlJMKAAi4RI7fvhBtGxxiKGnoF5SGuLtKfaruJ+Of4ePXU3Qkk1w7k8+hO3lO0U6qURBhQwCVi6v6Dyq7IRnm0fNTqMUxr6BWUh7i6SH+q7SbCd7z4sPnR4/J+YKa8eVJ4iuHagmIeZ+cU7ZQqKRHJK+ASMf+M7Z6zUa5QFl4wvNTQKygPcXWR/lTbTYTv+OJSbrnn1es3K2zE377DcG0hk4l4/+Gjv2ej/MmtPzUhuWicOf655LpfVr2vJXZy7RuGawuKefwOPpUgq6REJK+gmoiG9drxrT81obho8I6Pb2z6BzN9W1iuBcjncWQbenPFVimJMKCgmoj2nVpe/akJxUVDdLyC3Vk61xjk87gH/ruJrVISYUBBkIiFgoKtpRffB3OzkAiF4/s/DshcY5B+H5v3oC9g6CrhC50JBUEieg8hPYGiA//9YFB+JFOOQPpTTebCvki9Ujh+tPIz8nqRv1bSEFbpeN6vfC58Lk7V1UyEeQVBIlZ/a3ni+O8HJflR5Lq07kG6Sspc2BepVyrHj08irxf5ayUNYZVcST4HyKob5b01BY7uDJz1nfrvB3/kR5Hr0roH6Sopc2FfFF4BiMM1AGGVsFJ8tXqPtBVgE5FYH8z97xJxzmFjlcj3CFMK/gJfPgfklV3iqwAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371245;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.10,3.475,4.1190,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.432,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.494,3.383,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.524,3.383,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.383,1.8,2.31;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.594,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.624,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.684,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.724,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.854,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.974,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.424,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.824,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.883,3.399,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.904,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.954,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.454,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.671,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.721,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.753,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.781,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.454,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.701,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1194,3.478,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.422,3.383;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAAwoAAAAPCAMAAABzw8g9AAABPlBMVEUAAAB3d3fU1NTIyMhkZGTk5OR4eHjg4OCAgIAMDAz19fVKSkrX19eqqqqkpKSoqKglJSX////x8fEFBQUyMjL9/f0bGxtGRkb29vYODg50dHRERESQkJC8vLwDAwPm5uZjY2PCwsKjo6ORkZEEBATp6eleXl58fHwICAjh4eGLi4vBwcEUFBT8/PxbW1uNjY3e3t5LS0v09PQLCwstLS3+/v4fHx9fX18VFRUrKyupqamTk5M0NDTQ0NCtra3Ly8sPDw/39/dFRUVycnLZ2dkHBwcQEBC9vb3FxcUCAgIYGBg3NzeKioq3t7eVlZWYmJjn5+dAQEBQUFAhISEsLCxZWVns7OwGBgYBAQHl5eWUlJTMzMysrKx9fX3Ozs4JCQny8vI1NTU+Pj55eXnW1tZwcHBgYGCcnJwoKCgTExOiv70QAAABwklEQVRoge2aV1PCUBCFL82GLSiCDQQLWBBFEVTsir2ABbvY9f//AZPAiDNIEncXzMN+D7AD99xzmLlnJskghIzFKoDY7PBvizjqlNf6hmp6ILUYD6OUPH5z+/tnNJlr8csJaGxyYuTNLd+j1QLdhKtABVcBQ2sbQtwuuTqKY6e7C7oLV4EKrgIGj7cbLu5xSb3Fsa8fvAtXgQquAgaffwAuDgStg4VpaHgEvAtFFUJhmVGugpYbV0GHsXGwdCIyGZ0qjNOxGfA2FFWQVLgKWm5cBR1m43NQaSKe9Ejz6rgQhCegqMJiSsbPVdBy4yrosRSCKpdXRNirXqWvrq3DA/C9AhVcBRwbm0DhViyaTm/vKKPdsQsPwFWggquAYy+yDxM61etzd1IeAweIAFwFKrgKSA6PYLrjk0wmk5USQpzGzxD+XAUquApIzi9yENnl1bXydnMrxN09xp+rQEXZIc6FVXwVE2ivA2fW9TUpD/ms+Jne4PQoPSnq53xOvLxi/Kt3TGvhYeoq2AoPmd8qJtBeB86s62tW3pV/EpXSG52o4CpQUXaIP1IqnxUTaK8DZ9b1NTWl9EYnKrgKVPC9wn/zBQAYROo4W36OAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.414,3.399;4.blob,1.1,2112.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;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1191,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAgAAAA1AgMAAAABhUJrAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAAEklEQVQImWNgbGAgHiEDumgEAACYFq4rVCAgAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.391,3.459;4.blob,1.1,1660.iVBORw0KGgoAAAANSUhEUgAAAygAAAAPCAMAAAA4axvQAAABuVBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkpISEj///9aWloFBQXk5OS3t7ccHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKjQ0NDNzc1fX18/Pz8yMjL9/f0bGxuZmZnd3d0ICAhMTEwuLi5GRkb29vYODg5ZWVlCQkLS0tLHx8eQkJC8vLw3NzfBwcH39/fp6emTk5MBAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2Pe3t5PT08EBAReXl4CAgInJydiYmLu7u61tbUZGRlQUFCwsLCLi4ssLCzV1dVLS0v09PQLCwtUVFSqqqra2tpHR0dBQUFAQECsrKzCwsItLS3+/v4fHx8JCQmpqamjo6MhISE0NDQRERGMjIx8fHx7e3vh4eEPDw9FRUVsbGzR0dGgoKAjIyO5ubmxsbFycnLZ2dl6enqNjY3l5eWFhYUYGBj8/Pz7+/tmZmaKioqtra1ERESWlpYzMzOVlZX5+fllZWUpKSlnZ2ehoaHs7OwGBgZ9fX3Ozs46OjrExMSXl5fi4uKGhoby8vJgYGDW1tZwcHCcnJwoKCgTExPvXGFoAAAC3UlEQVRoge2a91cTQRDHF4hBiqwhEEDE2ABFFIGLiYoFYwNRFFExRhEL9t4rqNi7f7FXfJfbsJnMzeU9LmY/P1wmu/edzfvuzsvcSxjLRVl5zilWEcg9h71vUbBycVU1Lo+PtTW1S2i5GKvjS/VrqD5MTeABeAex+1sa5HGjvIwsxdzX0Bhpam5ZhsvjZ23rclIug7YV+iXKV5IT0FGFggd2Y9XqNVQp6r617R2MdfJ1uEQ+1q7v2kDJZdDNNzK2qYcq94IqFDywG5t7XUn7+rXYlhr8EvHEVuO6bTv0GYpCO7BjJyGXJd0V1vuv3VS5F1Sh4AHdGIztEQdCHSZJuXRvV7Bu3/4DOZYQtBYH+ZDxEhl2ziIjH2idHOrPY3RumvlI7+E4We4BVSh4QDeOjB4VB1q5yTG5dOz4IGPj/IR8iYw2aZ65kP5YzE8aM6cmnLPIyAdaJ6dTZ9CeZ5GO9fAoVewJVSh4QDfOnssamDxvMiWXjlYZ18QF+RIZbad55oaFQsnMIiMfaAXaLqL8lnGJXw6RxV5QhYIHcmNau5I1ArZeaX7VeLl2Xb5ERjttnrkbdut18xa9BVpIrcDtO0jH5zOVukvWekIVCh7IjUB9MmsEbr1qrW+Ue/IlBK1FvNF4MGb3HxBaIB9oBR4+6gONhnj8hCz1hCoUPJAbE0+zR+DW65n1jPJcvoSg/ceL9mrjJ7eXhBbIB1qR8CuM31Jez5ClnlCFggdwYzI14k46q4XHoy1BF0s0xCJNbxJv4Y9YJNrud3OkfDraAh1JVSh4LDfmrA58wBmx9x8wUicfP2mJz/N+eYMMnw1XfvlK/CuJz7Tpb0PCe5mnUp/1njXgSlGYiNk743621CLbjQqrA//ujNiPn/CBKcR/vf4nfo0Jb2WeSn12rShMxOydcT9bapHtxm+rA//jjPKiCgVE5insM1ZRmIjZO+N+ttQi5ukUq0IpdtQzCh7Tjb8tOho39n5ZkAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371285;4.copy,1.1,2.10,3.323,4.1190,3.114,2.14,1.1,1.0,3.323;4.copy,1.1,3.690,3.475,3.510,2.38,2.14,1.1,3.680,3.475;4.copy,1.1,2.10,3.494,3.680,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,4.1190,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.440,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.444,3.440,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.440,1.8,2.29;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.711,3.437,1.7,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.743,3.437,1.4,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.771,3.440,1.8,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.444,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.651,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.404,3.437;4.blob,1.1,1060.iVBORw0KGgoAAAANSUhEUgAAAiEAAAASCAMAAAC6uP6fAAAA+VBMVEUAAAAFBQUICAgDAwMGBgYCAgKsrKz///9sbGzU1NRERETDw8M0NDQVFRUrKytHR0fIyMhkZGR3d3ekpKQ8PDy0tLQYGBjw8PC8vLxJSUkmJib5+fmhoaEODg7CwsJOTk7+/v50dHQyMjL9/f0bGxv4+PiEhISwsLB9fX38/PwsLCyQkJAKCgrr6+uSkpIEBATp6eleXl7JyclLS0v09PQLCwuVlZXc3NxUVFSpqamjo6NMTEwhISEREREPDw/39/dFRUUjIyO1tbXk5OTo6OiKioqDg4POzs7x8fFKSkrW1tZwcHBgYGC2trYfHx8oKCgTExMiIiINDQ1EbDSLAAAB3ElEQVRoge2ZaVPCMBCGQ4FGtCpgUVREPMETb0UR7/v2//8YsYXiYEi2Tdomnb4fmLchu2zDM7NpilCsnhKalrRdStPSg8foEbGiKx3jIdtlMB4ePEaPiBVd6SPGqO3Gxh1CCGP0iIgpm+v5fIb2LTRLYJrAlkxxsXrBsZMOIYQxesR/ZTGeKk6DChO9ku7z9Uf8vc7kveYPhZAZ05wtmeacuFjfCCmb86XKAqQwqQlZXFr2mj8UQtpaWRUa6xsh1fZHbW0dUJXUhGwUPeePCWETsrm1DahKZkLqO7ue88eEsAlBhT1AVZ2VbD9F/yrN55BYQvYPDpmzGVnTVmmJgBxSjJCjY0BVnZXs7KRP+BwSS0jjlD2bkfXMKq0akEMRJqRpWDrnc0goIa2LS/ZsRtaWVdpVQA4pRsi14l0md0M4NI73IeIIqd+62KnK2GXKd4DZ0KxBSSVC7t087UrYZZoVUv1SE6LWiVkDK35iVnvgyR/yqXvK7rxJuAv81P2x+AS6KZ8Iga4LIaJb0fMLT71hdZnuz9v/9yvckaW/Oe/y3x1CCGP0CL5b8YcQF+vSH0GvSBFCPuzO+wl3ZEnw9t8nQlysS39EJAgRpS/DeZdvGN+Dx+gRXJJuH/IDeGtimSDXFWUAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,4.1181,3.440;4.blob,1.1,184.iVBORw0KGgoAAAANSUhEUgAAABIAAAAPBAMAAAAbqIIhAAAAIVBMVEUAAADIyMhkZGQGBgYICAgDAwP///9gYGAoKCg0NDQTExMEPl2PAAAAIklEQVQImWNgYFRggAJ6sUxcXFwhLLG0tHQIq3PmzFkIdQDvjQaPAkWYiQAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.381,3.459;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAAzIAAAAPCAMAAAAI5wrxAAABg1BMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkpISEj///9aWloFBQXk5OS3t7ekpKSoqKjQ0NDNzc1fX18/Pz8yMjL9/f0bGxtGRkb29vYODg5ZWVlCQkLS0tLHx8eQkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2Pe3t5PT08EBAReXl4ICAgCAgInJye4uLhiYmLu7u61tbUBAQGLi4tqamosLCzV1dVLS0v09PQLCwtUVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx8JCQmpqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLDi4uJ4eHinp6cgICBXV1fy8vJ8fHx7e3vh4eEPDw9FRUVsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dl6enqNjY0QEBD8/PzCwsKKioqtra1ERESVlZX5+fllZWUpKSnt7e3s7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExPbZMWoAAACrUlEQVRoge2Z91cTQRDHBwiBJQQxtojSLsaCBtQoCiKoGKOI2EXFBoK9F+zlT/eK5HLnltnd8Lwj+/nhMm93v7Pzvpd52X0BYNHQyJyCpgR7TmXdX5qTLaIlzKoirGXRStrsZ6o9rZpAA/6bkXxvaxy0G40N+klkre9YJ1rBriq6Wiad6+1HhmxQTqCOaRk8WDc2btqsn0TW+i3ZrfwFnKoiq2XTRbYBbO9WletgWgYP1o2eXqkkff1Wbkez6mYr5HfuUq4qslo2+d1p+3S2R1Wug2kZPEg3BnJ7gwOpfS4FepLB7FDr/gMHGZsFtCsUKREc6kdVFSctj8NkuPdIUbyu9piWwYN04+jIaHCgg7gcoycZOz4AME4m6Jv52oLbOyk7OJE8ecqe6pn0I/txunRGXFW8tDzKuW6SURVrYVoGD9KNs+dCA1PnXabpSUYuOM+Zi/TNfO0lt3cuA7RdabmavXb9xuyoHzlLO2+Kq4qXlsstcjulLNbBtAwenBtz1p3QCPdgViZ3nY979+mb+do5t3ceAMwvADxcJEsLVZHDo8fiqmKl5TNdeqKs1cK0DB6cG4n2QmiEfzBLer8yT+mbBbRVFAefhaPJ5324quKiFbA0ryzVwrQMHpwbL16GR/gHs1feXeY1fbOAVkD6jUxV0dcKePtOWaqFaRk8KDemSsNySd5b6fHMhyGlzYJ0fVxWrSqKWhHWf/pympbBE3Zj2btn5Ksj+PRZLgnAl6/WzLd//tNTsL48+501JaoqMlqap1Sf7RNtQkpRmwgqb0Z+tt4iihtN3j3Dvsj6ESz+4H9HVuvff4efY6wZUVWR0dI8pfosrahNBJU3Iz9bbxHFjV/ePeM3VEVCVrNl1gA0T/k+YxW1iaDyZuRn6y2iuaGCaZm4Y+4yeEJu/AE7sH+uEwQ7xgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.394,3.478;4.blob,1.1,912.iVBORw0KGgoAAAANSUhEUgAAAR0AAAAPCAMAAADu3ettAAAA/1BMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExNhUoHKAAABZ0lEQVRYheWWaVPCMBCGwwKiQvEGooIHUu8DxfvA+771//8Wm5RJVmw7SaYzKeN+oNuZ98kkz2SZEpICUekMhBbORdXfXLYv1z8wqEYnjCX4NJl0eN7YTr7gFIeGR7Q3mAQW2xkdGw8HjO1MlMoAFTqpv0f7LLYzNR0BmNqp1mbY7+yc9hYTwCI78/WF36FGmZfLXzTtCHaRLrF3Zxmvp9hZZ5GdldU19nB5pOF165TXhokdwWbpJnvfauL1FDvrLLKzvcMfFR7xlENrl9eeiR3Bol3K9RQ766y0s39w6D955AjinazjE/Mbbo+VdlKnbtdBY5msaoH9w8FZ2+CGW2elneZ590FjmSy4KHlfZJf0yuCGW2eFndb1jcqpVe3Iyted4m3tTo1OGCvs3D9EA53coz+bT8EdBFl8fsm9vhl+0VtmhZ33j+h8J0f82fwM7kD9jvVEEc2J+fJn8zu4g39uJ7ZcT9QPLfjCnR7Hz20AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492371323;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.680,3.475,3.520,2.19,2.14,1.1,3.670,3.475;4.copy,1.1,3.700,3.494,3.500,2.19,2.14,1.1,3.690,3.494;4.rect,1.1,3.622,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.672,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.772,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.882,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1000,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1060,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1120,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1190,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.582,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.550,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.490,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1191,3.451,1.8,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.661,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.582,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.462,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.442,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.384,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371364;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.690,3.494,3.510,2.19,2.14,1.1,3.680,3.494;4.rect,1.1,3.412,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.381,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492371400;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.690,3.475,3.510,2.38,2.14,1.1,3.680,3.475;4.copy,1.1,3.680,3.494,2.10,2.19,2.14,1.1,3.670,3.494;4.rect,1.1,3.461,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.621,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.364,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492371442;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.670,3.456,3.530,2.19,2.14,1.1,3.660,3.456;4.copy,1.1,3.680,3.475,3.520,2.38,2.14,1.1,3.670,3.475;4.copy,1.1,2.20,3.494,3.650,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.372,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.404,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.631,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.341,3.459;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAoKCgTExOo8xYqAAACg0lEQVRoge1ZZ1cTQRQdWgAh9LYUEyAgEkAFpSgYOihVpBuxS1GqItL+O1tCMrv7pmySk+yczP2wO8zc+847N3l7yF2ESMjKJh6hnFzymXNenie/oPABX0VxtNlZ5LOk+ldU7C0pLSvnqyiMtqKyinyYVP+qa2oRqlPq+UqKom1opMjtvjQ99PmbW9g8O1oDbdq1/RGbKpC2w//YvNFZqyOo/2Hzpavb0/Pk6TNrlQjPpI32ELn3Kn3azfsc53GuXKAl4EX/gHljUNExBPv38lUHQsPKCOxfTBvUG+hUF69Do2PqUcN4njKhcSancB7nygVaAqZnLBuzb3S8hf3rL9SugTnYv5i2Tm9A/djmFxaXupffrbwfwHqJ8ThXLtDCWPWtWXao87uubGi3zS3Yv5h2VW9gG6EPYYQ+7iifwvez8PlL/HOUTi2M3K9Byw59fkPG9+8b7J9Ji6G167t6KdaexWj0Rxxz5AItjKmf1h36/O4az7892D+T1ob9GvX/0B7lII45coEWxOyv3yRnYf8OfUfDx2UeJg9Ckd9bchI45WC6UXtmzPQffIX+ntPldl/+XfgC/y/ZPAiHR/kLV3H+jkq7NseY6TC+QjvXdHVyf/8KjRtjpm/xFRPSv8Qg/ZOQkJCQwIE/71OX37O0zqukX5vC/J6pFdK/1OX3TK2Q/jnM7xPj0bUi+ucwv6fXA/N7/l5E9C+S30fzdkb+R69Hyv84exHRv0h+H83bGfkfvR49/2P2IqB/9/l9NG+X8+tI6zS/p9fLvPl1mt/T62Xc/DrO7xPk0bXi+ceZ30PZP/YWIHP948zvoewfewuQuf5x8qDs3/QWQPqXGh5d62b/7gAdsBDicr7wWgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.661,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371482;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.660,3.456,3.540,2.57,2.14,1.1,3.650,3.456;4.copy,1.1,2.10,3.475,3.650,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.582,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.632,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.682,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.732,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.782,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.960,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1020,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1080,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1150,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.394,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.641,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.542,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.422,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.402,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.331,3.459;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABUFBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUFAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIwPDw9FRUUJCQlsbGzR0dGgoKAjIyO5ubmxsbHk5OT19fWNjY3l5eWFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg7i4uKGhoZgYGDW1tZwcHAoKCgTExMRitOtAAABr0lEQVRYhWNgwAUYmXBKMTCz4JYjVh0rGzsHJxdx5gwZvUyMuOWoEGjcPLx8/AKCxJkzVPQKCYvglqRCoImKiTMwSEhKEWfQENErLYNHN2ZgyMrJKygqEVYHA8oqqiBSTZ2AO4eUXg0FTVQBLXEw0AZzMAJDR5dNT9/AEN0UqDoUvRBgJGkMonhNkGWJZA0CvdiBqZk5qoCFJBhYYg80K2sNBgYbSVvsgYbQqw22XwtYpEragWTsHZBliWQNAr3YgaMTmoCzCxi4Yg80M04QqeKGPdAQeiXA9pugBBpClkjWINCLFbjLe6CJ4M2enpJeIMrbB3ugIfS6g+33hWdPP3/ys8lA6sUKWAK00UTwZ89ASEoLwh5oKHohQJkHVKgyBIeQkU0GgV6swCEUXQR/9gyDlGnh2AMNRS8URIgBG4l6kpFkZJNBoBcbcI6KxhGaKIGBADHysTZxAmwE1SEAtwIvX7xKAl5rBq3eREiOTUJmMSSn4NeNGRipafIq6RmE1SFATCx7ZhaZ3ZmB1ssMybHZyCyGnFz8mqnR9xzKIA+SY/ORWQTBSA80ssAIDzQA8QPRHc9SRN8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492371525;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.650,3.456,3.550,2.57,2.14,1.1,3.640,3.456;4.copy,1.1,3.630,3.475,2.20,2.38,2.14,1.1,3.620,3.475;4.copy,1.1,2.10,3.494,3.620,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.352,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.384,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.591,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.321,3.459;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+0lEQVRoge1ZaVfTQBQdtoJbRWhFEUoRqxARRURFqSIuLOJWcUetIor7AgpFRVxx/c82kzSZzJ4cYyaH3A/py8y70zf39M1pbgBgoaycOQUqKtlzXvJMVMWqRSnMqoLiMlFexp7zST9Qs0qUwa4qKC4Dq9esZU/6pd+6+Hp+AqeqoLgM1G7gTJK61NUnkhurxHl8NGza7LmqoLh0NCa3OAeamiFS8IbQpSWebt3atg1fxcxzcEvIUCKwvV6qKqW4VOxo73AO1GgQO+ENoV/nrkYAurTd2LCZZ3NTUMimYrAn1r23OFXbY0fFy77e/eKqFONSceAgNtB3COIwvCH0a+/Xr9kj2LCZZ3OPQiEHADg2WH08fuLkqaEOO9JTh0d4+zCqUo1LwWjiNDbC7d8x7Yz+cfYcRiL6dxQKeR6ACzkALo5rl3JIpOPyFc42zKpU41JQeTWFjfD7N2b8/q5hw0T/OpFpuY5HPTfq2PtAq1KIS8HETXyE37+3jPPvNjZM9K8Y+TvsObIqNbgE+nrvcucJ/SYT+a57U2lhnhj3H0x7rSoQ7rRxNjWgEXj4iP9lpC6PnySyT4k/oR70Gxt6xpoSVRUIt8I4m3JoBMaf87/Mr+cPHS86WTOiqgLhvjTOpldoJISf+q0ERPpFiBAhQgQU6Hnvj38/k5593f/GbV1h4aL79cW/n5svLLydeifHDh8X2a8//v37xWbdxPogRw8dF9mvS/9eLi+TXdKvHz/J0UPHtffr0r/nr2dxP2vwIbMwgK4nGSnAdaGf6d9bfrvA/+OvZ3FntC/6/dcJdD3JSAGuC/1M/97y2wX+H389i4vUYq8nGSnAldev5N9bfvs/7d9vy977KEiuvH5u/Xv+ehY3M7+k33d/99BHCnDl9XPr3/PXs7k/Fov/Q1u1nx76SAGutH6u/XvZvLlkYeFX9rccO3zc0n4l/Xua94+8BaDpPJmfHfzj8TlKfW5pv5L+Pc37R94CrDz/1GVf0rx/x1uASL//kxde/AV9t4yMOf6tGgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371563;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.620,3.475,3.580,2.19,2.14,1.1,3.610,3.475;4.copy,1.1,3.640,3.494,3.560,2.19,2.14,1.1,3.630,3.494;4.rect,1.1,3.421,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.601,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.324,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371603;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.630,3.494,3.570,2.19,2.14,1.1,3.620,3.494;4.rect,1.1,3.352,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.321,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492371641;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.630,3.475,3.570,2.38,2.14,1.1,3.620,3.475;4.copy,1.1,3.620,3.494,2.10,2.19,2.14,1.1,3.610,3.494;4.rect,1.1,3.542,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.592,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.692,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.802,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.980,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1040,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1110,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.502,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.410,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.561,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.502,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.382,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.362,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.304,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492371687;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.610,3.456,3.590,2.19,2.14,1.1,3.600,3.456;4.copy,1.1,3.620,3.475,3.580,2.38,2.14,1.1,3.610,3.475;4.copy,1.1,2.20,3.494,3.590,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.312,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.344,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.571,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.281,3.459;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAoKCgTExOo8xYqAAACg0lEQVRoge1ZZ1cTQRQdWgAh9LYUEyAgEkAFpSgYOihVpBuxS1GqItL+O1tCMrv7pmySk+yczP2wO8zc+847N3l7yF2ESMjKJh6hnFzymXNenie/oPABX0VxtNlZ5LOk+ldU7C0pLSvnqyiMtqKyinyYVP+qa2oRqlPq+UqKom1opMjtvjQ99PmbW9g8O1oDbdq1/RGbKpC2w//YvNFZqyOo/2Hzpavb0/Pk6TNrlQjPpI32ELn3Kn3azfsc53GuXKAl4EX/gHljUNExBPv38lUHQsPKCOxfTBvUG+hUF69Do2PqUcN4njKhcSancB7nygVaAqZnLBuzb3S8hf3rL9SugTnYv5i2Tm9A/djmFxaXupffrbwfwHqJ8ThXLtDCWPWtWXao87uubGi3zS3Yv5h2VW9gG6EPYYQ+7iifwvez8PlL/HOUTi2M3K9Byw59fkPG9+8b7J9Ji6G167t6KdaexWj0Rxxz5AItjKmf1h36/O4az7892D+T1ob9GvX/0B7lII45coEWxOyv3yRnYf8OfUfDx2UeJg9Ckd9bchI45WC6UXtmzPQffIX+ntPldl/+XfgC/y/ZPAiHR/kLV3H+jkq7NseY6TC+QjvXdHVyf/8KjRtjpm/xFRPSv8Qg/ZOQkJCQwIE/71OX37O0zqukX5vC/J6pFdK/1OX3TK2Q/jnM7xPj0bUi+ucwv6fXA/N7/l5E9C+S30fzdkb+R69Hyv84exHRv0h+H83bGfkfvR49/2P2IqB/9/l9NG+X8+tI6zS/p9fLvPl1mt/T62Xc/DrO7xPk0bXi+ceZ30PZP/YWIHP948zvoewfewuQuf5x8qDs3/QWQPqXGh5d62b/7gAdsBDicr7wWgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.601,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371724;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.600,3.456,3.600,2.57,2.14,1.1,3.590,3.456;4.copy,1.1,2.10,3.475,3.590,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.302,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.334,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.581,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.271,3.459;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABUFBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUFAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIwPDw9FRUUJCQlsbGzR0dGgoKAjIyO5ubmxsbHk5OT19fWNjY3l5eWFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg7i4uKGhoZgYGDW1tZwcHAoKCgTExMRitOtAAABr0lEQVRYhWNgwAUYmXBKMTCz4JYjVh0rGzsHJxdx5gwZvUyMuOWoEGjcPLx8/AKCxJkzVPQKCYvglqRCoImKiTMwSEhKEWfQENErLYNHN2ZgyMrJKygqEVYHA8oqqiBSTZ2AO4eUXg0FTVQBLXEw0AZzMAJDR5dNT9/AEN0UqDoUvRBgJGkMonhNkGWJZA0CvdiBqZk5qoCFJBhYYg80K2sNBgYbSVvsgYbQqw22XwtYpEragWTsHZBliWQNAr3YgaMTmoCzCxi4Yg80M04QqeKGPdAQeiXA9pugBBpClkjWINCLFbjLe6CJ4M2enpJeIMrbB3ugIfS6g+33hWdPP3/ys8lA6sUKWAK00UTwZ89ASEoLwh5oKHohQJkHVKgyBIeQkU0GgV6swCEUXQR/9gyDlGnh2AMNRS8URIgBG4l6kpFkZJNBoBcbcI6KxhGaKIGBADHysTZxAmwE1SEAtwIvX7xKAl5rBq3eREiOTUJmMSSn4NeNGRipafIq6RmE1SFATCx7ZhaZ3ZmB1ssMybHZyCyGnFz8mqnR9xzKIA+SY/ORWQTBSA80ssAIDzQA8QPRHc9SRN8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492371763;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.590,3.456,3.610,2.57,2.14,1.1,3.580,3.456;4.copy,1.1,3.570,3.475,2.20,2.38,2.14,1.1,3.560,3.475;4.copy,1.1,2.10,3.494,3.560,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.292,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.324,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.531,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.261,3.459;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+0lEQVRoge1ZaVfTQBQdtoJbRWhFEUoRqxARRURFqSIuLOJWcUetIor7AgpFRVxx/c82kzSZzJ4cYyaH3A/py8y70zf39M1pbgBgoaycOQUqKtlzXvJMVMWqRSnMqoLiMlFexp7zST9Qs0qUwa4qKC4Dq9esZU/6pd+6+Hp+AqeqoLgM1G7gTJK61NUnkhurxHl8NGza7LmqoLh0NCa3OAeamiFS8IbQpSWebt3atg1fxcxzcEvIUCKwvV6qKqW4VOxo73AO1GgQO+ENoV/nrkYAurTd2LCZZ3NTUMimYrAn1r23OFXbY0fFy77e/eKqFONSceAgNtB3COIwvCH0a+/Xr9kj2LCZZ3OPQiEHADg2WH08fuLkqaEOO9JTh0d4+zCqUo1LwWjiNDbC7d8x7Yz+cfYcRiL6dxQKeR6ACzkALo5rl3JIpOPyFc42zKpU41JQeTWFjfD7N2b8/q5hw0T/OpFpuY5HPTfq2PtAq1KIS8HETXyE37+3jPPvNjZM9K8Y+TvsObIqNbgE+nrvcucJ/SYT+a57U2lhnhj3H0x7rSoQ7rRxNjWgEXj4iP9lpC6PnySyT4k/oR70Gxt6xpoSVRUIt8I4m3JoBMaf87/Mr+cPHS86WTOiqgLhvjTOpldoJISf+q0ERPpFiBAhQgQU6Hnvj38/k5593f/GbV1h4aL79cW/n5svLLydeifHDh8X2a8//v37xWbdxPogRw8dF9mvS/9eLi+TXdKvHz/J0UPHtffr0r/nr2dxP2vwIbMwgK4nGSnAdaGf6d9bfrvA/+OvZ3FntC/6/dcJdD3JSAGuC/1M/97y2wX+H389i4vUYq8nGSnAldev5N9bfvs/7d9vy977KEiuvH5u/Xv+ehY3M7+k33d/99BHCnDl9XPr3/PXs7k/Fov/Q1u1nx76SAGutH6u/XvZvLlkYeFX9rccO3zc0n4l/Xua94+8BaDpPJmfHfzj8TlKfW5pv5L+Pc37R94CrDz/1GVf0rx/x1uASL//kxde/AV9t4yMOf6tGgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371804;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.560,3.475,3.640,2.19,2.14,1.1,3.550,3.475;4.copy,1.1,3.580,3.494,3.620,2.19,2.14,1.1,3.570,3.494;4.rect,1.1,3.502,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.552,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.602,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.652,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.702,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.940,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1000,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1070,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.541,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.462,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.342,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.322,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.264,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371848;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.570,3.494,3.630,2.19,2.14,1.1,3.560,3.494;4.rect,1.1,3.292,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.261,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492371883;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.570,3.475,3.630,2.38,2.14,1.1,3.560,3.475;4.copy,1.1,3.560,3.494,2.10,2.19,2.14,1.1,3.550,3.494;4.rect,1.1,3.341,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.501,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.244,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492371925;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.550,3.456,3.650,2.19,2.14,1.1,3.540,3.456;4.copy,1.1,3.560,3.475,3.640,2.38,2.14,1.1,3.550,3.475;4.copy,1.1,2.20,3.494,3.530,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.252,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.284,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.511,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.221,3.459;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAoKCgTExOo8xYqAAACg0lEQVRoge1ZZ1cTQRQdWgAh9LYUEyAgEkAFpSgYOihVpBuxS1GqItL+O1tCMrv7pmySk+yczP2wO8zc+847N3l7yF2ESMjKJh6hnFzymXNenie/oPABX0VxtNlZ5LOk+ldU7C0pLSvnqyiMtqKyinyYVP+qa2oRqlPq+UqKom1opMjtvjQ99PmbW9g8O1oDbdq1/RGbKpC2w//YvNFZqyOo/2Hzpavb0/Pk6TNrlQjPpI32ELn3Kn3azfsc53GuXKAl4EX/gHljUNExBPv38lUHQsPKCOxfTBvUG+hUF69Do2PqUcN4njKhcSancB7nygVaAqZnLBuzb3S8hf3rL9SugTnYv5i2Tm9A/djmFxaXupffrbwfwHqJ8ThXLtDCWPWtWXao87uubGi3zS3Yv5h2VW9gG6EPYYQ+7iifwvez8PlL/HOUTi2M3K9Byw59fkPG9+8b7J9Ji6G167t6KdaexWj0Rxxz5AItjKmf1h36/O4az7892D+T1ob9GvX/0B7lII45coEWxOyv3yRnYf8OfUfDx2UeJg9Ckd9bchI45WC6UXtmzPQffIX+ntPldl/+XfgC/y/ZPAiHR/kLV3H+jkq7NseY6TC+QjvXdHVyf/8KjRtjpm/xFRPSv8Qg/ZOQkJCQwIE/71OX37O0zqukX5vC/J6pFdK/1OX3TK2Q/jnM7xPj0bUi+ucwv6fXA/N7/l5E9C+S30fzdkb+R69Hyv84exHRv0h+H83bGfkfvR49/2P2IqB/9/l9NG+X8+tI6zS/p9fLvPl1mt/T62Xc/DrO7xPk0bXi+ceZ30PZP/YWIHP948zvoewfewuQuf5x8qDs3/QWQPqXGh5d62b/7gAdsBDicr7wWgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.541,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492371966;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.540,3.456,3.660,2.57,2.14,1.1,3.530,3.456;4.copy,1.1,2.10,3.475,3.530,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.462,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.512,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.612,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.722,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.900,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.960,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,4.1030,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.422,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.330,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.274,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.290,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.521,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.422,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.302,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.282,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.211,3.459;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABUFBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUFAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIwPDw9FRUUJCQlsbGzR0dGgoKAjIyO5ubmxsbHk5OT19fWNjY3l5eWFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg7i4uKGhoZgYGDW1tZwcHAoKCgTExMRitOtAAABr0lEQVRYhWNgwAUYmXBKMTCz4JYjVh0rGzsHJxdx5gwZvUyMuOWoEGjcPLx8/AKCxJkzVPQKCYvglqRCoImKiTMwSEhKEWfQENErLYNHN2ZgyMrJKygqEVYHA8oqqiBSTZ2AO4eUXg0FTVQBLXEw0AZzMAJDR5dNT9/AEN0UqDoUvRBgJGkMonhNkGWJZA0CvdiBqZk5qoCFJBhYYg80K2sNBgYbSVvsgYbQqw22XwtYpEragWTsHZBliWQNAr3YgaMTmoCzCxi4Yg80M04QqeKGPdAQeiXA9pugBBpClkjWINCLFbjLe6CJ4M2enpJeIMrbB3ugIfS6g+33hWdPP3/ys8lA6sUKWAK00UTwZ89ASEoLwh5oKHohQJkHVKgyBIeQkU0GgV6swCEUXQR/9gyDlGnh2AMNRS8URIgBG4l6kpFkZJNBoBcbcI6KxhGaKIGBADHysTZxAmwE1SEAtwIvX7xKAl5rBq3eREiOTUJmMSSn4NeNGRipafIq6RmE1SFATCx7ZhaZ3ZmB1ssMybHZyCyGnFz8mqnR9xzKIA+SY/ORWQTBSA80ssAIDzQA8QPRHc9SRN8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372008;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.530,3.456,3.670,2.57,2.14,1.1,3.520,3.456;4.copy,1.1,3.510,3.475,2.20,2.38,2.14,1.1,3.500,3.475;4.copy,1.1,2.10,3.494,3.500,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.232,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.264,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.471,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.201,3.459;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+0lEQVRoge1ZaVfTQBQdtoJbRWhFEUoRqxARRURFqSIuLOJWcUetIor7AgpFRVxx/c82kzSZzJ4cYyaH3A/py8y70zf39M1pbgBgoaycOQUqKtlzXvJMVMWqRSnMqoLiMlFexp7zST9Qs0qUwa4qKC4Dq9esZU/6pd+6+Hp+AqeqoLgM1G7gTJK61NUnkhurxHl8NGza7LmqoLh0NCa3OAeamiFS8IbQpSWebt3atg1fxcxzcEvIUCKwvV6qKqW4VOxo73AO1GgQO+ENoV/nrkYAurTd2LCZZ3NTUMimYrAn1r23OFXbY0fFy77e/eKqFONSceAgNtB3COIwvCH0a+/Xr9kj2LCZZ3OPQiEHADg2WH08fuLkqaEOO9JTh0d4+zCqUo1LwWjiNDbC7d8x7Yz+cfYcRiL6dxQKeR6ACzkALo5rl3JIpOPyFc42zKpU41JQeTWFjfD7N2b8/q5hw0T/OpFpuY5HPTfq2PtAq1KIS8HETXyE37+3jPPvNjZM9K8Y+TvsObIqNbgE+nrvcucJ/SYT+a57U2lhnhj3H0x7rSoQ7rRxNjWgEXj4iP9lpC6PnySyT4k/oR70Gxt6xpoSVRUIt8I4m3JoBMaf87/Mr+cPHS86WTOiqgLhvjTOpldoJISf+q0ERPpFiBAhQgQU6Hnvj38/k5593f/GbV1h4aL79cW/n5svLLydeifHDh8X2a8//v37xWbdxPogRw8dF9mvS/9eLi+TXdKvHz/J0UPHtffr0r/nr2dxP2vwIbMwgK4nGSnAdaGf6d9bfrvA/+OvZ3FntC/6/dcJdD3JSAGuC/1M/97y2wX+H389i4vUYq8nGSnAldev5N9bfvs/7d9vy977KEiuvH5u/Xv+ehY3M7+k33d/99BHCnDl9XPr3/PXs7k/Fov/Q1u1nx76SAGutH6u/XvZvLlkYeFX9rccO3zc0n4l/Xua94+8BaDpPJmfHfzj8TlKfW5pv5L+Pc37R94CrDz/1GVf0rx/x1uASL//kxde/AV9t4yMOf6tGgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372046;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.500,3.475,3.700,2.19,2.14,1.1,3.490,3.475;4.copy,1.1,3.520,3.494,3.680,2.19,2.14,1.1,3.510,3.494;4.rect,1.1,3.301,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.481,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.204,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372086;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.510,3.494,3.690,2.19,2.14,1.1,3.500,3.494;4.rect,1.1,3.232,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.201,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372125;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.510,3.475,3.690,2.38,2.14,1.1,3.500,3.475;4.copy,1.1,3.500,3.494,2.10,2.19,2.14,1.1,3.490,3.494;4.rect,1.1,3.422,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.472,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.522,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.572,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.622,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.860,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.920,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.990,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.441,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.382,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.262,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.242,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.184,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492372170;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.490,3.456,3.710,2.19,2.14,1.1,3.480,3.456;4.copy,1.1,3.500,3.475,3.700,2.38,2.14,1.1,3.490,3.475;4.copy,1.1,2.20,3.494,3.470,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.192,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.224,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.451,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.161,3.459;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAoKCgTExOo8xYqAAACg0lEQVRoge1ZZ1cTQRQdWgAh9LYUEyAgEkAFpSgYOihVpBuxS1GqItL+O1tCMrv7pmySk+yczP2wO8zc+847N3l7yF2ESMjKJh6hnFzymXNenie/oPABX0VxtNlZ5LOk+ldU7C0pLSvnqyiMtqKyinyYVP+qa2oRqlPq+UqKom1opMjtvjQ99PmbW9g8O1oDbdq1/RGbKpC2w//YvNFZqyOo/2Hzpavb0/Pk6TNrlQjPpI32ELn3Kn3azfsc53GuXKAl4EX/gHljUNExBPv38lUHQsPKCOxfTBvUG+hUF69Do2PqUcN4njKhcSancB7nygVaAqZnLBuzb3S8hf3rL9SugTnYv5i2Tm9A/djmFxaXupffrbwfwHqJ8ThXLtDCWPWtWXao87uubGi3zS3Yv5h2VW9gG6EPYYQ+7iifwvez8PlL/HOUTi2M3K9Byw59fkPG9+8b7J9Ji6G167t6KdaexWj0Rxxz5AItjKmf1h36/O4az7892D+T1ob9GvX/0B7lII45coEWxOyv3yRnYf8OfUfDx2UeJg9Ckd9bchI45WC6UXtmzPQffIX+ntPldl/+XfgC/y/ZPAiHR/kLV3H+jkq7NseY6TC+QjvXdHVyf/8KjRtjpm/xFRPSv8Qg/ZOQkJCQwIE/71OX37O0zqukX5vC/J6pFdK/1OX3TK2Q/jnM7xPj0bUi+ucwv6fXA/N7/l5E9C+S30fzdkb+R69Hyv84exHRv0h+H83bGfkfvR49/2P2IqB/9/l9NG+X8+tI6zS/p9fLvPl1mt/T62Xc/DrO7xPk0bXi+ceZ30PZP/YWIHP948zvoewfewuQuf5x8qDs3/QWQPqXGh5d62b/7gAdsBDicr7wWgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.481,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372207;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.480,3.456,3.720,2.57,2.14,1.1,3.470,3.456;4.copy,1.1,2.10,3.475,3.470,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.182,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.214,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.461,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.151,3.459;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABUFBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUFAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIwPDw9FRUUJCQlsbGzR0dGgoKAjIyO5ubmxsbHk5OT19fWNjY3l5eWFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg7i4uKGhoZgYGDW1tZwcHAoKCgTExMRitOtAAABr0lEQVRYhWNgwAUYmXBKMTCz4JYjVh0rGzsHJxdx5gwZvUyMuOWoEGjcPLx8/AKCxJkzVPQKCYvglqRCoImKiTMwSEhKEWfQENErLYNHN2ZgyMrJKygqEVYHA8oqqiBSTZ2AO4eUXg0FTVQBLXEw0AZzMAJDR5dNT9/AEN0UqDoUvRBgJGkMonhNkGWJZA0CvdiBqZk5qoCFJBhYYg80K2sNBgYbSVvsgYbQqw22XwtYpEragWTsHZBliWQNAr3YgaMTmoCzCxi4Yg80M04QqeKGPdAQeiXA9pugBBpClkjWINCLFbjLe6CJ4M2enpJeIMrbB3ugIfS6g+33hWdPP3/ys8lA6sUKWAK00UTwZ89ASEoLwh5oKHohQJkHVKgyBIeQkU0GgV6swCEUXQR/9gyDlGnh2AMNRS8URIgBG4l6kpFkZJNBoBcbcI6KxhGaKIGBADHysTZxAmwE1SEAtwIvX7xKAl5rBq3eREiOTUJmMSSn4NeNGRipafIq6RmE1SFATCx7ZhaZ3ZmB1ssMybHZyCyGnFz8mqnR9xzKIA+SY/ORWQTBSA80ssAIDzQA8QPRHc9SRN8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372247;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.470,3.456,3.730,2.57,2.14,1.1,3.460,3.456;4.copy,1.1,3.450,3.475,2.20,2.38,2.14,1.1,3.440,3.475;4.copy,1.1,2.10,3.494,3.440,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.172,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.204,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.411,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.141,3.459;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+0lEQVRoge1ZaVfTQBQdtoJbRWhFEUoRqxARRURFqSIuLOJWcUetIor7AgpFRVxx/c82kzSZzJ4cYyaH3A/py8y70zf39M1pbgBgoaycOQUqKtlzXvJMVMWqRSnMqoLiMlFexp7zST9Qs0qUwa4qKC4Dq9esZU/6pd+6+Hp+AqeqoLgM1G7gTJK61NUnkhurxHl8NGza7LmqoLh0NCa3OAeamiFS8IbQpSWebt3atg1fxcxzcEvIUCKwvV6qKqW4VOxo73AO1GgQO+ENoV/nrkYAurTd2LCZZ3NTUMimYrAn1r23OFXbY0fFy77e/eKqFONSceAgNtB3COIwvCH0a+/Xr9kj2LCZZ3OPQiEHADg2WH08fuLkqaEOO9JTh0d4+zCqUo1LwWjiNDbC7d8x7Yz+cfYcRiL6dxQKeR6ACzkALo5rl3JIpOPyFc42zKpU41JQeTWFjfD7N2b8/q5hw0T/OpFpuY5HPTfq2PtAq1KIS8HETXyE37+3jPPvNjZM9K8Y+TvsObIqNbgE+nrvcucJ/SYT+a57U2lhnhj3H0x7rSoQ7rRxNjWgEXj4iP9lpC6PnySyT4k/oR70Gxt6xpoSVRUIt8I4m3JoBMaf87/Mr+cPHS86WTOiqgLhvjTOpldoJISf+q0ERPpFiBAhQgQU6Hnvj38/k5593f/GbV1h4aL79cW/n5svLLydeifHDh8X2a8//v37xWbdxPogRw8dF9mvS/9eLi+TXdKvHz/J0UPHtffr0r/nr2dxP2vwIbMwgK4nGSnAdaGf6d9bfrvA/+OvZ3FntC/6/dcJdD3JSAGuC/1M/97y2wX+H389i4vUYq8nGSnAldev5N9bfvs/7d9vy977KEiuvH5u/Xv+ehY3M7+k33d/99BHCnDl9XPr3/PXs7k/Fov/Q1u1nx76SAGutH6u/XvZvLlkYeFX9rccO3zc0n4l/Xua94+8BaDpPJmfHfzj8TlKfW5pv5L+Pc37R94CrDz/1GVf0rx/x1uASL//kxde/AV9t4yMOf6tGgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372288;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.440,3.475,3.760,2.19,2.14,1.1,3.430,3.475;4.copy,1.1,3.460,3.494,3.740,2.19,2.14,1.1,3.450,3.494;4.rect,1.1,3.382,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.432,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.532,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.642,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.820,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.880,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.950,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.342,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.250,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.421,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.342,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.222,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.202,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.144,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372331;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.450,3.494,3.750,2.19,2.14,1.1,3.440,3.494;4.rect,1.1,3.172,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.141,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372366;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.450,3.475,3.750,2.38,2.14,1.1,3.440,3.475;4.copy,1.1,3.440,3.494,2.10,2.19,2.14,1.1,3.430,3.494;4.rect,1.1,3.221,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.381,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.124,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492372409;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.430,3.456,3.770,2.19,2.14,1.1,3.420,3.456;4.copy,1.1,3.440,3.475,3.760,2.38,2.14,1.1,3.430,3.475;4.copy,1.1,2.20,3.494,3.410,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,3.132,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.164,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.391,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.101,3.459;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAoKCgTExOo8xYqAAACg0lEQVRoge1ZZ1cTQRQdWgAh9LYUEyAgEkAFpSgYOihVpBuxS1GqItL+O1tCMrv7pmySk+yczP2wO8zc+847N3l7yF2ESMjKJh6hnFzymXNenie/oPABX0VxtNlZ5LOk+ldU7C0pLSvnqyiMtqKyinyYVP+qa2oRqlPq+UqKom1opMjtvjQ99PmbW9g8O1oDbdq1/RGbKpC2w//YvNFZqyOo/2Hzpavb0/Pk6TNrlQjPpI32ELn3Kn3azfsc53GuXKAl4EX/gHljUNExBPv38lUHQsPKCOxfTBvUG+hUF69Do2PqUcN4njKhcSancB7nygVaAqZnLBuzb3S8hf3rL9SugTnYv5i2Tm9A/djmFxaXupffrbwfwHqJ8ThXLtDCWPWtWXao87uubGi3zS3Yv5h2VW9gG6EPYYQ+7iifwvez8PlL/HOUTi2M3K9Byw59fkPG9+8b7J9Ji6G167t6KdaexWj0Rxxz5AItjKmf1h36/O4az7892D+T1ob9GvX/0B7lII45coEWxOyv3yRnYf8OfUfDx2UeJg9Ckd9bchI45WC6UXtmzPQffIX+ntPldl/+XfgC/y/ZPAiHR/kLV3H+jkq7NseY6TC+QjvXdHVyf/8KjRtjpm/xFRPSv8Qg/ZOQkJCQwIE/71OX37O0zqukX5vC/J6pFdK/1OX3TK2Q/jnM7xPj0bUi+ucwv6fXA/N7/l5E9C+S30fzdkb+R69Hyv84exHRv0h+H83bGfkfvR49/2P2IqB/9/l9NG+X8+tI6zS/p9fLvPl1mt/T62Xc/DrO7xPk0bXi+ceZ30PZP/YWIHP948zvoewfewuQuf5x8qDs3/QWQPqXGh5d62b/7gAdsBDicr7wWgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.421,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372449;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.420,3.456,3.780,2.57,2.14,1.1,3.410,3.456;4.copy,1.1,2.10,3.475,3.410,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.342,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.392,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.442,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.492,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.542,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.780,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.840,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.910,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.154,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.401,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.302,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.182,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.162,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.91,3.459;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABUFBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUFAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIwPDw9FRUUJCQlsbGzR0dGgoKAjIyO5ubmxsbHk5OT19fWNjY3l5eWFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg7i4uKGhoZgYGDW1tZwcHAoKCgTExMRitOtAAABr0lEQVRYhWNgwAUYmXBKMTCz4JYjVh0rGzsHJxdx5gwZvUyMuOWoEGjcPLx8/AKCxJkzVPQKCYvglqRCoImKiTMwSEhKEWfQENErLYNHN2ZgyMrJKygqEVYHA8oqqiBSTZ2AO4eUXg0FTVQBLXEw0AZzMAJDR5dNT9/AEN0UqDoUvRBgJGkMonhNkGWJZA0CvdiBqZk5qoCFJBhYYg80K2sNBgYbSVvsgYbQqw22XwtYpEragWTsHZBliWQNAr3YgaMTmoCzCxi4Yg80M04QqeKGPdAQeiXA9pugBBpClkjWINCLFbjLe6CJ4M2enpJeIMrbB3ugIfS6g+33hWdPP3/ys8lA6sUKWAK00UTwZ89ASEoLwh5oKHohQJkHVKgyBIeQkU0GgV6swCEUXQR/9gyDlGnh2AMNRS8URIgBG4l6kpFkZJNBoBcbcI6KxhGaKIGBADHysTZxAmwE1SEAtwIvX7xKAl5rBq3eREiOTUJmMSSn4NeNGRipafIq6RmE1SFATCx7ZhaZ3ZmB1ssMybHZyCyGnFz8mqnR9xzKIA+SY/ORWQTBSA80ssAIDzQA8QPRHc9SRN8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372491;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.410,3.456,3.790,2.57,2.14,1.1,3.400,3.456;4.copy,1.1,3.390,3.475,2.20,2.38,2.14,1.1,3.380,3.475;4.copy,1.1,2.10,3.494,3.380,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,3.112,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.144,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.351,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.459;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+0lEQVRoge1ZaVfTQBQdtoJbRWhFEUoRqxARRURFqSIuLOJWcUetIor7AgpFRVxx/c82kzSZzJ4cYyaH3A/py8y70zf39M1pbgBgoaycOQUqKtlzXvJMVMWqRSnMqoLiMlFexp7zST9Qs0qUwa4qKC4Dq9esZU/6pd+6+Hp+AqeqoLgM1G7gTJK61NUnkhurxHl8NGza7LmqoLh0NCa3OAeamiFS8IbQpSWebt3atg1fxcxzcEvIUCKwvV6qKqW4VOxo73AO1GgQO+ENoV/nrkYAurTd2LCZZ3NTUMimYrAn1r23OFXbY0fFy77e/eKqFONSceAgNtB3COIwvCH0a+/Xr9kj2LCZZ3OPQiEHADg2WH08fuLkqaEOO9JTh0d4+zCqUo1LwWjiNDbC7d8x7Yz+cfYcRiL6dxQKeR6ACzkALo5rl3JIpOPyFc42zKpU41JQeTWFjfD7N2b8/q5hw0T/OpFpuY5HPTfq2PtAq1KIS8HETXyE37+3jPPvNjZM9K8Y+TvsObIqNbgE+nrvcucJ/SYT+a57U2lhnhj3H0x7rSoQ7rRxNjWgEXj4iP9lpC6PnySyT4k/oR70Gxt6xpoSVRUIt8I4m3JoBMaf87/Mr+cPHS86WTOiqgLhvjTOpldoJISf+q0ERPpFiBAhQgQU6Hnvj38/k5593f/GbV1h4aL79cW/n5svLLydeifHDh8X2a8//v37xWbdxPogRw8dF9mvS/9eLi+TXdKvHz/J0UPHtffr0r/nr2dxP2vwIbMwgK4nGSnAdaGf6d9bfrvA/+OvZ3FntC/6/dcJdD3JSAGuC/1M/97y2wX+H389i4vUYq8nGSnAldev5N9bfvs/7d9vy977KEiuvH5u/Xv+ehY3M7+k33d/99BHCnDl9XPr3/PXs7k/Fov/Q1u1nx76SAGutH6u/XvZvLlkYeFX9rccO3zc0n4l/Xua94+8BaDpPJmfHfzj8TlKfW5pv5L+Pc37R94CrDz/1GVf0rx/x1uASL//kxde/AV9t4yMOf6tGgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372530;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.380,3.475,3.820,2.19,2.14,1.1,3.370,3.475;4.copy,1.1,3.400,3.494,3.800,2.19,2.14,1.1,3.390,3.494;4.rect,1.1,3.181,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.361,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.84,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372569;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.390,3.494,3.810,2.19,2.14,1.1,3.380,3.494;4.rect,1.1,3.112,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372608;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.390,3.475,3.810,2.38,2.14,1.1,3.380,3.475;4.copy,1.1,3.380,3.494,2.10,2.19,2.14,1.1,3.370,3.494;4.rect,1.1,3.302,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.352,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.452,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.562,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.740,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.800,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.870,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.262,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.170,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.321,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.262,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.142,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.122,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.64,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492372653;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.370,3.456,3.830,2.19,2.14,1.1,3.360,3.456;4.copy,1.1,3.380,3.475,3.820,2.38,2.14,1.1,3.370,3.475;4.copy,1.1,2.20,3.494,3.350,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,2.72,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.104,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.331,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,3.459;4.blob,1.1,1456.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAoKCgTExOo8xYqAAACg0lEQVRoge1ZZ1cTQRQdWgAh9LYUEyAgEkAFpSgYOihVpBuxS1GqItL+O1tCMrv7pmySk+yczP2wO8zc+847N3l7yF2ESMjKJh6hnFzymXNenie/oPABX0VxtNlZ5LOk+ldU7C0pLSvnqyiMtqKyinyYVP+qa2oRqlPq+UqKom1opMjtvjQ99PmbW9g8O1oDbdq1/RGbKpC2w//YvNFZqyOo/2Hzpavb0/Pk6TNrlQjPpI32ELn3Kn3azfsc53GuXKAl4EX/gHljUNExBPv38lUHQsPKCOxfTBvUG+hUF69Do2PqUcN4njKhcSancB7nygVaAqZnLBuzb3S8hf3rL9SugTnYv5i2Tm9A/djmFxaXupffrbwfwHqJ8ThXLtDCWPWtWXao87uubGi3zS3Yv5h2VW9gG6EPYYQ+7iifwvez8PlL/HOUTi2M3K9Byw59fkPG9+8b7J9Ji6G167t6KdaexWj0Rxxz5AItjKmf1h36/O4az7892D+T1ob9GvX/0B7lII45coEWxOyv3yRnYf8OfUfDx2UeJg9Ckd9bchI45WC6UXtmzPQffIX+ntPldl/+XfgC/y/ZPAiHR/kLV3H+jkq7NseY6TC+QjvXdHVyf/8KjRtjpm/xFRPSv8Qg/ZOQkJCQwIE/71OX37O0zqukX5vC/J6pFdK/1OX3TK2Q/jnM7xPj0bUi+ucwv6fXA/N7/l5E9C+S30fzdkb+R69Hyv84exHRv0h+H83bGfkfvR49/2P2IqB/9/l9NG+X8+tI6zS/p9fLvPl1mt/T62Xc/DrO7xPk0bXi+ceZ30PZP/YWIHP948zvoewfewuQuf5x8qDs3/QWQPqXGh5d62b/7gAdsBDicr7wWgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.361,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372690;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.360,3.456,3.840,2.57,2.14,1.1,3.350,3.456;4.copy,1.1,2.10,3.475,3.350,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,2.62,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.94,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.341,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.31,3.459;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAATQAAAAPCAMAAABdlcN3AAABUFBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUFAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIwPDw9FRUUJCQlsbGzR0dGgoKAjIyO5ubmxsbHk5OT19fWNjY3l5eWFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaEGBgYDAwN9fX3Ozs46OjrExMSXl5cODg7i4uKGhoZgYGDW1tZwcHAoKCgTExMRitOtAAABr0lEQVRYhWNgwAUYmXBKMTCz4JYjVh0rGzsHJxdx5gwZvUyMuOWoEGjcPLx8/AKCxJkzVPQKCYvglqRCoImKiTMwSEhKEWfQENErLYNHN2ZgyMrJKygqEVYHA8oqqiBSTZ2AO4eUXg0FTVQBLXEw0AZzMAJDR5dNT9/AEN0UqDoUvRBgJGkMonhNkGWJZA0CvdiBqZk5qoCFJBhYYg80K2sNBgYbSVvsgYbQqw22XwtYpEragWTsHZBliWQNAr3YgaMTmoCzCxi4Yg80M04QqeKGPdAQeiXA9pugBBpClkjWINCLFbjLe6CJ4M2enpJeIMrbB3ugIfS6g+33hWdPP3/ys8lA6sUKWAK00UTwZ89ASEoLwh5oKHohQJkHVKgyBIeQkU0GgV6swCEUXQR/9gyDlGnh2AMNRS8URIgBG4l6kpFkZJNBoBcbcI6KxhGaKIGBADHysTZxAmwE1SEAtwIvX7xKAl5rBq3eREiOTUJmMSSn4NeNGRipafIq6RmE1SFATCx7ZhaZ3ZmB1ssMybHZyCyGnFz8mqnR9xzKIA+SY/ORWQTBSA80ssAIDzQA8QPRHc9SRN8AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372730;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.350,3.456,3.850,2.57,2.14,1.1,3.340,3.456;4.copy,1.1,3.330,3.475,2.20,2.38,2.14,1.1,3.320,3.475;4.copy,1.1,2.10,3.494,3.320,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,2.52,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.84,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.291,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.21,3.459;4.blob,1.1,1680.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAiCAMAAAAeRy5oAAABqlBMVEUAAAB3d3fU1NTIyMhkZGQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLw3NzfBwcH39/fp6emTk5MDAwPm5uZjY2MEBAReXl4FBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4tLS0v09PQLCwv///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6MhISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dnk5OSNjY0QEBD8/PzCwsKKioqtra1ERES3t7eVlZUsLCwpKSlfX1/t7e1ZWVns7OwGBgZ9fX3Ozs46OjrExMSXl5dQUFBwcHCcnJwoKCgTExMqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoZJYSYRAAAC+0lEQVRoge1ZaVfTQBQdtoJbRWhFEUoRqxARRURFqSIuLOJWcUetIor7AgpFRVxx/c82kzSZzJ4cYyaH3A/py8y70zf39M1pbgBgoaycOQUqKtlzXvJMVMWqRSnMqoLiMlFexp7zST9Qs0qUwa4qKC4Dq9esZU/6pd+6+Hp+AqeqoLgM1G7gTJK61NUnkhurxHl8NGza7LmqoLh0NCa3OAeamiFS8IbQpSWebt3atg1fxcxzcEvIUCKwvV6qKqW4VOxo73AO1GgQO+ENoV/nrkYAurTd2LCZZ3NTUMimYrAn1r23OFXbY0fFy77e/eKqFONSceAgNtB3COIwvCH0a+/Xr9kj2LCZZ3OPQiEHADg2WH08fuLkqaEOO9JTh0d4+zCqUo1LwWjiNDbC7d8x7Yz+cfYcRiL6dxQKeR6ACzkALo5rl3JIpOPyFc42zKpU41JQeTWFjfD7N2b8/q5hw0T/OpFpuY5HPTfq2PtAq1KIS8HETXyE37+3jPPvNjZM9K8Y+TvsObIqNbgE+nrvcucJ/SYT+a57U2lhnhj3H0x7rSoQ7rRxNjWgEXj4iP9lpC6PnySyT4k/oR70Gxt6xpoSVRUIt8I4m3JoBMaf87/Mr+cPHS86WTOiqgLhvjTOpldoJISf+q0ERPpFiBAhQgQU6Hnvj38/k5593f/GbV1h4aL79cW/n5svLLydeifHDh8X2a8//v37xWbdxPogRw8dF9mvS/9eLi+TXdKvHz/J0UPHtffr0r/nr2dxP2vwIbMwgK4nGSnAdaGf6d9bfrvA/+OvZ3FntC/6/dcJdD3JSAGuC/1M/97y2wX+H389i4vUYq8nGSnAldev5N9bfvs/7d9vy977KEiuvH5u/Xv+ehY3M7+k33d/99BHCnDl9XPr3/PXs7k/Fov/Q1u1nx76SAGutH6u/XvZvLlkYeFX9rccO3zc0n4l/Xua94+8BaDpPJmfHfzj8TlKfW5pv5L+Pc37R94CrDz/1GVf0rx/x1uASL//kxde/AV9t4yMOf6tGgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372771;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.320,3.475,3.880,2.19,2.14,1.1,3.310,3.475;4.copy,1.1,3.340,3.494,3.860,2.19,2.14,1.1,3.330,3.494;4.rect,1.1,3.262,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.312,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.362,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.412,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.462,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.700,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.760,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.830,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.301,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.222,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.102,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.82,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.24,3.478;4.blob,1.1,1416.iVBORw0KGgoAAAANSUhEUgAAATIAAAAjCAMAAAAg5XZ9AAABXFBMVEXIyMhkZGQAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4FBQUICAgCAgJLS0v09PQLCwukpKT///9UVFSpqamjo6NMTEywsLAhISE0NDQREREPDw/39/dFRUUjIyPk5OTCwsKKior+/v4sLCx9fX3Ozs4GBgYDAwPW1tZwcHBgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0uLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFAtLS0fHx9AQECsrKzQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OxnZ2ehoaEJCQny8vIpKSni4uKGhob5+fmcnJyqqqqfn5/X19fLy8tzMdZ2AAACg0lEQVRoge1Y+VMTMRhtl4oH0KqsB6daUSkeaAWUtoAHKniBXF5ViwdeeCD//wzdJLvd3Xxsv3xlDJnJ+6HJzH7vJd+bJrP7Uqm0E6At4+yKcF0SsHXJXHWV/8dNhYsybRhZ7PLqMM+yA+0HMbLY5dVhnmWHDqNkscurwzjLjnR0Rp91ZRlyShsRdREuFsZZdvTYcW/IsV676rNul+GE0kZEXYSLhXGWnTzFhtOs1576rLePoV9pI6IuwsXCNMsGBs/wkfV61rEHc7fqoCh9Lt6fPZhwdVCUPx9/Zg8mXO0X9Q5dQMpil1eHYZZdvISSHeZ3VAGekTYsrUFS0WDZyGWUbIrfUVfgGWnD0hokFU3fmAjZq/yOugbPSBuW1iCp7F/L9qwumbuvLVOVt7CWIeEGsJYhYS1ThmzZ6PUbcGlSuI1CSLl4c2x84hZNRjcX+Jd134YpSeE2DoHyZKlcmZqeIYlo5wKW3bl7D6Ikhts4BMr3Z7NetvSAIqKdC1hWePgIoiSG2zj4ynPzj73fJ08JGvq50PX/7DlAkcJtCoTygrvoDeWecJqGnOnnQpa9GFqSuxXhdmsQykV32RtW8uE0DTnTzwVfMlbX5G5FuN0iuHJo6400DTnTzwUte/lK6tUPt1sEVxZ/8tdv6AdEIxe07G31XbxXOdwmgSvPlbyr1Hn/gXBA9HNBy5zaerxXOdymgSt/nK2/En5yPxMOiH4ubNmXjeFop83CbTS48mRHufJ1/htJQTsXtuz7D+/ghmLpZuE2GlzZ+Vkb2/xF/HDRzXV/DzJUo5/lf/46kVi6WbiNB1M2Gq646LeAJCMSS1v4cP9tM2zY8AcL+C6zSEDDsh0fMAKoOGSzyQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372814;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.330,3.494,3.870,2.19,2.14,1.1,3.320,3.494;4.rect,1.1,2.52,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.21,3.497;4.blob,1.1,644.iVBORw0KGgoAAAANSUhEUgAAAGwAAAAOCAMAAAD9hAmuAAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAy0lEQVQ4ja2NxQ7DMBAF3W5SbsqQMjOnzPj/v1THlyq7PlSy38GyVqMZxnx+kM4w5fe/R80MAkE5axqKMWpmEApHZGQ0FleNETMDK5GUkam0aouaGUAmKwFz+YJyjJh5rGiXKFeuVNVj2MxjUKtTrtFUbxGzG2u1CdXp9nTEkNmN9QdDTI3GEx0xZHZjMJ1har7Q0cJmEVuuHC+ztjd6Yl6ziG13e/46BzGLf48nPS1kFjE4X/hzvYnd+ffx1BTzmtnv/nqLfXR1qPkLQW8nAIULukoAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372849;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.330,3.475,3.870,2.38,2.14,1.1,3.320,3.475;4.copy,1.1,3.320,3.494,2.10,2.19,2.14,1.1,3.310,3.494;4.rect,1.1,3.101,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.42,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.261,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.4,3.478;4.blob,1.1,1412.iVBORw0KGgoAAAANSUhEUgAAATsAAAAhCAMAAACROPy8AAABUFBMVEXIyMhkZGQAAAB3d3fU1NQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLwBAQHr6+t/f3/n5+eCgoIEBATp6eleXl4FBQUCAgIZGRlQUFCwsLBLS0v09PQLCwukpKRUVFRAQECsrKzCwsKpqamjo6MhISE0NDQREREPDw/39/dFRUUjIyO5ubmxsbHk5OTl5eWFhYWKioqWlpZISEgzMzP+/v4sLCxnZ2ehoaF9fX3Ozs4GBgYDAwMpKSm3t7fi4uKGhobW1tZwcHBgYGAoKCgTExMMDAz19fVKSkqoqKhGRkb29vYODg7m5uZjY2OLi4vBwcEtLS0fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3NzeVlZVZWVns7OwJCQny8vKcnJyqqqrxKZu4AAACjklEQVRoge2Z6VfTQBTFw7ApUESUJbIoqwoiIiA7yOICCMoiioAsgoqi/v/faCZp8pKZSd9MbfN6Tn8fyPTMu+81Fwaai2WVMZ/yCqYE1sWBrctQWVV942aNnoaI1oL3WlGurs+Td7V1qfpbDbe1NFS00LvGO3fVgjx519TcwlirfU9LREQLvWtrjxHkx7uOzvvO1wddOiIqWuBdd09vuKivhdPPX2h6F9KqeWg/ci6px1CBXCWuBd4NDD5xLv28pC+9GrI5T028C2nVVNrDzuXZCFQgV4lrgXfPR/mllZekvyFsbJzzwsS7kBblXaBArhLXBt5NTE65V14yzQp5Zmdmzc9OctrAu7K56I0W4Mx21Dm/d9n8gsHZSVwbeDfyMnpjBTizbLE5/fl0yV42ODuJa33vxlZeYTzBeoeltidV/7rzjZaGitb37u1qvMCrW3NP/bp8xfSfyd5tVG++N3w2Sljre/dhK77eq7PcU78tXzF974oYS/Ms7rinfle+YiXvpIV5ylGKGCvpN1DElLwzp+SdOSXvzMl493Hvk7wgLodHoeyMmEFYy8DP3dBneUFcDo9D1Rkzg66WAe/2vxzI9mNzeByKzqgZZLUOvnfrh0ey/dgcHoeiM2oGWa1D8Lfi67FkW8jhTZB2Rs4gquUE3p2snIrbXg6fG9LOyBlEtRzwGeXsm7jt5fA5IuuMnUFTywHenV8Iu5kcPkckndEzSGpdgHfff/yM7oo5vBGSzugZJLUu8Lli4zK6K+bwZoid8TMoal2gd79+r4U3s+XwaITOGjMIaj2gd1d/nH+egQQ9Ww6PJtpZZwZBrUcoC/j7j4US9Gw5PJ5IZ60Z9LQeYo4SStD/K4qUvmi1117EYcdjNC59AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492372891;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.310,3.456,3.890,2.19,2.14,1.1,3.300,3.456;4.copy,1.1,3.320,3.475,3.880,2.38,2.14,1.1,3.310,3.475;4.copy,1.1,2.20,3.494,3.290,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,2.12,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.44,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.271,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.459;4.blob,1.1,1452.iVBORw0KGgoAAAANSUhEUgAAASsAAAAiCAMAAAAwAg/6AAABelBMVEUAAAB3d3fU1NTIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp4yMjL9/f0bGxuZmZnd3d0ICAhMTEz///8uLi6QkJC8vLw3NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIEBAReXl4FBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLBLS0v09PQLCwukpKRUVFSqqqra2tpHR0dBQUGUlJT19fXl5eVpaWkYGBhAQECsrKzCwsKpqamjo6MhISE0NDQRERGMjIxaWlri4uJKSkp4eHinp6cgICBXV1fy8vIPDw9FRUUJCQlsbGzR0dGgoKAjIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbHk5OSNjY0QEBCFhYWKioqtra1ERESWlpYzMzP+/v4sLCwpKSm3t7dfX19nZ2ehoaF9fX3Ozs46OjrExMSXl5cODg6GhoZwcHAGBgYDAwMoKCgTExOSFG95AAACgklEQVRoge1Y91vTUBS9rJZVQJQRVosts4AgSwHZKMpGkFWGKCpTwcFQ/3czStMkLzfvpf2SZ7+cH5LHl3PuzTv0vq89ABKyssEUObnmz9h5eT5/fkEhXUU+tdlZ5sy0elVUHCgpLXtAV5FLbfnDR+bUtHpVUVkFUC3U0JXkUVtbh1CNHtQ3BEONj615RoQjTdK1uYX2PbnTtobatI/bq2RE5T8MHnR0+rqedPfoa8Z5Gm2iX/z+VOiVboG+ZB7ligOtiP6BQe22nwkynpO9GhpuBRgRXpC9UrVRuVm7uBgdG58QH9VO5glTEmd6JplHueJAK+LlK922Z1/LeEP2aqBAukbmyF6p2mq5mfjvmF9YXOpcXll9O5jUV+VRrjjQAqwF13XbRmfwnbAh3Ta3yF6p2jW52TbATgxgd0/Yj91/ng/e258FN7UAuYdR3bbxGRxTPlcfyF5ptEkId3wUL8XSOQnjRzZmgQMtwMwn/b7wGfysnFdfyF5ptAYcV4rf6bqEExuzwIEWZk/PyPvSeqDiPHgx8rXMZ8kjoSgUKPkWuaRgcqm9+o5TjR78+BmM/Lq25pFwfuFfuLH5W8N97d4tzkzv78HMhucVPTyvPHjw4OH/hHMZspWWvYrTWscyZEst9145lyFbarn3ijFDTo2Ha3n3ijFDxvsSM2RKLUM3t7TxDDmR+VrkV3hfs/yKRsvQzS1tPENOZL4W+RXeF8+vcC1DN5e09xlyIvP1ZtAUrBky3jezZ5A1Q8b7ZvQMMmfIKfJwLd9eUWbId8o59Ju8svWmhh62qjippcyQc5RzKEZe2XpTQw9bVdzSIvX+KOfQX/IqxW4Z5lXaeLiWZ6/+ATqhBmcJyiOLAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.494;4.blob,1.1,320.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAZlBMVEX////z8/MKCgq1tbVbW1tXV1e5ubkJCQnx8fH8/PwZGRmcnJx0dHQ+Pj7S0tIBAQHg4OAvLy+Dg4ONjY0mJibn5+cDAwPIyMhISEhqamqmpqYTExP5+fn29vYNDQ2vr69jY2NVVVVPa7gFAAAARUlEQVQImWNgIAgYmZjhbBZWOJONnQPG5OTihgvz8MKZfPwCcLagEJwpLAJnioqJw9kSknCmlLQMjCkrJw8XVlAk7FgGALPlAjIxOXUZAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.301,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492372932;4.copy,1.1,2.10,3.323,4.1190,2.76,2.14,1.1,1.0,3.323;4.copy,1.1,2.60,3.399,4.1140,2.57,2.14,1.1,2.50,3.399;4.copy,1.1,2.10,3.418,2.50,2.38,2.14,1.1,1.0,3.418;4.copy,1.1,3.300,3.456,3.900,2.57,2.14,1.1,3.290,3.456;4.copy,1.1,2.10,3.475,3.290,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.222,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.272,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.372,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.482,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.660,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.720,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.790,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.182,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.90,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.4,3.402,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.459,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.34,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.50,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.281,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.182,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.62,3.229;4.blob,1.1,1328.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACEElEQVRYhe2YV08bQRSFL5hmMJjumFBD723pvSWE3qvpvZfQE3p+OPbgZYU0ju5ojhQh8b3c8zDSeVit9OkQwQhivAm24fq8hIQyHoWFRwAr7ZFR4jqiY5yxcYESxSfgKhOTksV1fXGHpXxNTZMnonRnBqwz0+kQN+tbdk5uXl6+PHkpKIR1FhWLU1JaVl5RWWWrliYfKUY2qrMmS5zaOle9o6GRmlyy5HvRbLSAKluNTHHbCtpzqKOTurplSTzp+Q7q/GH0ivuzrz+B2gYGk6RJMDQM6mw3RsQdHRufmJyanimSJsHsHKizzHj9Bezu+QnPwuLSsjQJVlZBnfOeNXHXNzZtW7S1LU8+End2QZ205/9K+weH9qPjQMlLnNGA6jw59YdfZ+cXlwET0dV1CarzxvOb9/DPLaqSaNo9yHl2dNeM67TdPzBePV4/4SqJtp8Zj3r/IiuxcJzDAmIfLOewQNiH6Rxs9O3DdA4++vZhOocC2vbhdw4VtO3D7xwq6NqH6RxKaNqH6RxKaNqH6RxKaNqH6RxKaNqH6RwqaNvHnvq30baPN+fgo20fbOew0LcPpnNYAOyD5xwWEPtgOYfFp3284z/ax78XD+j2wVs8sNsHb/HAbh+sxQO8fbAWD+z2wVs8sNsHb/HAbh+8xQO7ffAWD+z2wVs8wNsHb/HAbh/MxQO6fXzaRwA+pH28AIO411d+N5HnAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.42,3.305;4.blob,1.1,612.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAAA5FBMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0ucVj+5AAAAoElEQVQokY3KxwLBUBSE4SF6l0S9iBbRRSd6b+//PhLszVn8ZxYfYJ8L/88t/YbHS2ifP/D5wVCY0IhEncbiCQYjKSt2VTlFaaQzdrI5DiMvCkCxRGpNlFERKqlRraEudFY3DDRFi9XtDrpCYXWvj4E5JHFsNAYmBqmnYgbMF6ReWitgbW44vd053R+ODD6dNedJlyuBb9b9Ox5PQusvO299GQzkrqGxtAAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.459;4.blob,1.1,888.iVBORw0KGgoAAAANSUhEUgAAAQwAAAAPCAMAAAAmsQG7AAABAlBMVEUAAADIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi43NzfBwcH39/fp6emTk5MMDAwBAQHr6+t/f3/n5+eCgoIFBQUCAgInJyf29vZISEhiYmLu7u61tbUZGRlQUFCwsLCkpKRUVFSqqqra2toEBARHR0dBQUFAQECsrKzCwsIhISE0NDQRERH09PSMjIwJCQlsbGzR0dGgoKAPDw8jIyO5ubmxsbH19fWNjY3l5eWFhYWtra1ERESWlpYzMzMpKSm3t7dfX19nZ2ehoaE6OjrExMSXl5cODg7i4uKGhoYw28CsAAABUklEQVRIiWNgQAaMTAxEAXzqmFlY2dg5iDNnUOulQmBwcnHz8PLxk+WmwaWXCoEhICjEwCAsIkqOowaXXkxPiolLSEpJo4viDgwZWTkQKa9AhpsGXq+iEBgogYUxPKmswqKqpq6Brh2qDkUvBGiKaIEobm1kWSJZA69XRwQMdLEHhp6+AQODoYgR9sBA6FUCm6sILIpEjEEyJqbIskSyBl6vmTkYWGAPDEt2EClrhT0wEHqFweZqowQGQpZI1sDrxZtNrEVsQJStHfbAQOi1B5vrAM8mjk7kJ9cB1Is/mzhDUoYLoWwCBzJcoMKIwdWNjOQ68HrxZxN3SJnhgT0wUPRCgacgsPGiKuJFRnIdBHqxeBIBvCV8DH35WNBE8Ta6JLl5/GT9ccrjA4NLL6YnAwIlZIOC0UXxNc68fVhDQslsFg8qvdTomwwbMBoYSGCEBwYArzebKXpsNOgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492372974;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.50,3.380,4.1150,2.76,2.14,1.1,2.40,3.380;4.copy,1.1,2.10,3.399,2.40,2.57,2.14,1.1,1.0,3.399;4.copy,1.1,3.290,3.456,3.910,2.57,2.14,1.1,3.280,3.456;4.copy,1.1,3.270,3.475,2.20,2.38,2.14,1.1,3.260,3.475;4.copy,1.1,2.10,3.494,3.260,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,1.2,3.383,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.24,3.459,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.231,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.459;4.blob,1.1,1524.iVBORw0KGgoAAAANSUhEUgAAARcAAAAiCAMAAABCzW1MAAABqlBMVEUAAADIyMhkZGQMDAz19fVKSkp3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxs3NzfBwcH39/fp6emTk5MDAwPm5uZjY2OQkJC8vLwFBQUICAgCAgInJye4uLhISEhiYmLu7u61tbUBAQGLi4sEBAReXl7///9UVFSqqqra2tpHR0dBQUGUlJTl5eVpaWkYGBgtLS3+/v4fHx9LS0v09PQLCwshISE0NDQRERGEhITr6+uMjIxMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHypqamjo6MJCQlsbGzR0dGgoKAPDw8jIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dlFRUWNjY0QEBD8/Pzk5OStra1ERES3t7eVlZXCwsKKioopKSlfX1/t7e1ZWVns7OwGBgYsLCw6OjrExMSXl5dQUFB9fX3Ozs6cnJxwcHAqKirx8fHg4OAHBwccHBzq6uq6urpOTk5qamqenp6ZmZnd3d0uLi5/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpYzMzNnZ2ehoaGGhoYoKCgTExNejxvHAAACh0lEQVRoge2Y+1fTMBTHL2w8dD5gE0UYA5yjIoqIAsoEJ4oIKDjx/ZiIKL4VdAwVxDci+D+7pKXt2jTtcja9PfT7Q3bb3E+bfE9vThYAvUpKwZGc5iny+cvsUsorkLE5KpIvULnFLqOiHBurV7F82RrYxk/YvmMnNlYv83yrqoOhXT77PL5qdu/hJ9TuxcbW1VOF6YVpvg2BSGNT8z4jpOTlsBuKMiLYX80dXizUgo2tlKgO0AuTL60HYwBt0iHDbSVPY8PUoLpscNjffiTbVduhRdnmaOcx3viOd3UDMrbnBNVJti9dvaSNn2L7orF91KB+gNOJsjOBgbPnBru1iKSeH+KN78IwaVGx3DoakUbJz8VLbF80dowaNA5wOQlwZUK6mtRFRNeuc4Y3FrxBflCx/Dryy9/LTbYvOaxO0YZbxqjjdpX1+ErvaEsUFpZfR3fl9eWe4bapjuyVum/dN/kAJ6vK5MtUMNX2cDpim2evR49nrLp6Op/gZFWZ5/v0WTD+3LQ5EvBlZPCFVdfLV0hZVcXa7xK9brXqmXiDld1QMX1xszxfPHny5OnfSnzdnY3Mve19J/ZW/KywL+n5zML76Q95Dsw1rLAvHxfryWHDUp5Dcwsr6ks0/om0y5/zHBpiln+OaSHj+csXif4JyfTrn+cwQsCyxD9/4fuisrPSV3L9bVL/PIcRApYl/vkL3xeV1b1De57DCAHLUiHr6PsP8e/5f7IsFaSOovNkDYP2nwLfMwKWpYLUEawsZvdHjdIvge8ZAet0vvnnpUOZhdX4b2e0+1hlvjNyDdawI2D5N5WaS6wJ7sfxs8p8S+QaTLIj2HznUsp81+Ua/MOOYNP6UrA89+ov+2hocT9asicAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373012;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.260,3.475,3.940,2.19,2.14,1.1,3.250,3.475;4.copy,1.1,3.280,3.494,3.920,2.19,2.14,1.1,3.270,3.494;4.rect,1.1,2.61,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.241,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,1024.iVBORw0KGgoAAAANSUhEUgAAAQ0AAAAjCAMAAAC5Ha/IAAABFFBMVEUAAADIyMhkZGQFBQUICAgCAgKkpKT///9UVFQhISE0NDQREREGBgYDAwNgYGAoKCgTExMMDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBweoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d1MTEwuLi7m5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFCwsLAtLS3+/v4fHx9AQECsrKzCwsLQ0NB8fHxycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7Ozp6elnZ2ehoaEJCQny8vIpKSni4uKGhob5+fn39/ecnJyqqqqfn5/X19fLy8uRec5tAAABpUlEQVRoge2YZ1MCMRCGgyKxgBWxwGHHAvZeUVBs2Lv+///hJXfK6WSY3N6eq07eD8l+2Gdn551kOcIYY5EGpiXdvPqs/yo/yxo31AROXn3WuPGP3WiMSjWF3BUV6zMvxqWaQ+6KivWZ19Iq1RZyV1SsuSlqQivP3BRvnrkpwF5U7B9xI+7Mg4Q6AvUSpCsq1s2LOPOgXR2BegnSFRXr5nU486BTHYF6CdIVFWvmhpGRWvxT1J38Bhk3vEJyo6u75yNM9qb6+gdgZahZrLMRG3SDdMbKDg2PgIqQs1hujI6NO8FELsrYJJ+CFCFnsdxITM/IPV+YFevcPKAGPYs2RRcW5bbEl8VmrXhfPzQjehbNjdW1dbEl+YbYNre8rx+aET2L9wu7vfPNjdrrh2ZEz+K5sbsnVvfUFffhJ5aQxXPjoFS213xGTCR2eAQ4sfQsnhuscizWk5z9FXPKzwAnlp5FdOO8GrfX9IWVvSxcgSqQs4huXN/I63dbSd3dA7+QqVn+8ChVQvjX9vQcvAateNnZX8x/WFv89U2qatxg5n3jq2puvANsSVam5n9vqgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373052;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.270,3.494,3.930,2.19,2.14,1.1,3.260,3.494;3.img,1.1,2.14,1.1,9.image/png,2.51,3.497;4.blob,1.1,376.iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAMAAAAVBLyFAAAAe1BMVEUMDAz19fVKSkoAAACkpKSoqKhGRkb29vYODg4DAwPm5uZjY2OLi4vBwcEtLS3+/v4fHx/Q0NB8fHxycnLZ2dkYGBj8/Pw3Nze3t7eVlZVZWVns7OwGBgYJCQny8vJQUFAICAicnJyqqqrIyMj///9gYGAoKCg0NDQTExO9CmGPAAAAWUlEQVQYlWXLRw6AMAxEUYNpofcaer3/CYmyQdh/MYsnDYBh4j9Ay2bkuB4l4QeUMIwYxUlKCbOcUVEyquqGErYdo36QlMZpVisXndCE66ZmP3QnfIfr1j0ver8Ht2wohXIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373091;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.270,3.475,3.930,2.38,2.14,1.1,3.260,3.475;4.copy,1.1,3.260,3.494,2.10,2.19,2.14,1.1,3.250,3.494;4.rect,1.1,3.182,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.232,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.282,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.332,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.382,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.620,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.680,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.750,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.201,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.142,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.22,3.229;4.blob,1.1,1268.iVBORw0KGgoAAAANSUhEUgAAAHMAAAA4CAMAAAD5Ajd7AAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAAB4klEQVRYhe3WR09CQRQF4FEUxS4KKk+xoljBAvYC2LBh77333rHrD1eI44sb507eSVzoWd3FSc5iMsnHGCwRhE6kDrf3kahoQkkfEwucNMTFU2oJibjJpOQUUi/VmAbbTDeaaEVzBmwzM4tYtCjZqM0cK7GYq+SBJvOVdGq1oBC0WaTYqNXiEtCmXSmlVsvKQZsVCvkLVFaBNh3OamIzqaYWtMnqqK/kUtyozfoGYrGxqRm12eJspRXb2lGTjHV4vJSarzMXt6nr6ia0epp6cZOM+fsIJVs/chIbijnUQPRBMocahD64OUwDg8Yhl/gC6IObIzDs0VtGRsdEF0If3BzW8eyJyampadHFAPr4NEfzTMXs3PyCblFwhaJZH5/mWFoOrJjcq2wt8PMV6mrVBzfHutk+wTY22db2z1e4rFEf3Bw7u3uJbH3fmyy4wtGoD26Og8Oj45PTjrNMwRWORn1wcxg8jmPn+cXlleAKR6M+uDmub251QRb0i65QNOuDm+Pu/sHgexRfDKCPL3M8Pb+8vhEugD7I5lCjXR9Ec6gB6INmDjUQfZDMoeZfH9/yi/ogB6cPenD6kAhKHzJB6UMmKH1IBaQPqYD0IRWQPqQC0odMYPqQCE4f9Pzrg5o/oY93LjidMj2yYk4AAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.2,3.305;4.blob,1.1,1032.iVBORw0KGgoAAAANSUhEUgAAAC0AAAASCAMAAAD46KfQAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAABMklEQVQokY3S2TsCYRQG8JchIpIkZamUJMn2WSLKniVZIpR9KWt2sm9/uJlTFy6+ecx7cc7vPM97Nd8AYvLwf/KFHAoKFbRVRcW01SWltDVl5doKnZxQqZdmlaGaLmONSWWuravnC2jQWsRp1WqobWu0O5qczma+xLhaxOFuJXvavO0dnV1CN1dSzMwO9NjIvX3Gfo1vAINGnqSGnw1hmFmpHXAFHRgZxdg4T1SZmMQUCxGnZ2b1CMyFDVxR5iMIsgXi4tJydGU1tubmirK+AS+zZL+6KR5NbG5t73BF2d1DPLFPPDg8EpJIpviihzk+AU4j2ePs/EKdvpSTGB3zAVfXuevm9u7+QVbAY8YDPCWe5f+lv3l5lWbMFFZSTr/5pSW8fygof2a+skh9K2iHfsTxC86TVfkODQQDAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.478;4.blob,1.1,1056.iVBORw0KGgoAAAANSUhEUgAAAO4AAAAhCAMAAADpjmdxAAABTVBMVEUAAADIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhoYMDAz19fVKSkp3d3fU1NSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBAReXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3Nzfk5OSVlZWKiopZWVns7OwGBgYsLCwJCQny8vJ9fX3Ozs6cnJyqqqpgYGDW1tZwcHAoKCgTExMUyMZhAAABhUlEQVRYhe2Y11PCQBCHDxALwQJGsIsKdkXFBnbsir13xV7//0dJ4mBebi93L+7O5HtIdmbvm5vfzGZyc4wx5vEyKXwl/tKycjkHkSsZtyKgBSurqpV2xeBKxq0JhRmr1etUtsXgysWNROuNZ0Ojwq4o3N+4TWGTZoHaorcaL63NbjisELjFuDHdpF0Q16d3GK/OuN1wWCFwi3ETXSbdzuP+GQ4rBK7iMPf0qg/Vf7qywxwJGJ896+tXGCoEruwws4FQ4Xc9qA8pDBUCV/6YkdSCw9ERKQeTK3uIHE35x8YVD3MIXNm4xHHjuri4uKBnYnJKtCSdoedyiU2LVmTS9FwuM7Nz8IL5hUVyLp/s0jK8YGWVnguwtg62N5Kb5FyIrdw21N7Z3SPnguwfQN3DI3ouyPEJ0Dw9OyfnwlxcXvGb3mvwQgulKyB1w+/Fb+m5Au7u87xWIvdAzhXx+GTcVeatq8usvWLPL/RcIa9vhYfHurp8t1fs45Oe64wv6+ry215Rdn8Ag+zK/Wr6avsAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373136;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.250,3.456,3.950,2.19,2.14,1.1,3.240,3.456;4.copy,1.1,3.260,3.475,3.940,2.38,2.14,1.1,3.250,3.475;4.copy,1.1,2.20,3.494,3.230,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,1.0,3.462,1.9,1.9;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.211,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.11,3.459;4.blob,1.1,856.iVBORw0KGgoAAAANSUhEUgAAAOUAAAAiCAMAAACX+u4oAAAA51BMVEUAAADIyMhkZGQqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFSUlJT19fXl5eVpaWmQkJAYGBhAQECsrKzCwsIhISE0NDQRERFaWlri4uJKSkp4eHj29vanp6cgICBXV1fy8vILCwsPDw8jIyNmZmZgYGAvLy/W1tb7+/u5ubmxsbEnJycQEBCFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7eGhoaDxXnKAAABVUlEQVRYhe2Y6VICMRCEBwEPFkUwAgoqKp4oKHij4n2///OYpKB2sVLlECMZZfrHbqqYj66GXjYLAEBsDBCKJ5LjE5OYSZosKuVUKkhPz2SszEiwqJSz2RzAnJi3cSPBYlLmC0V1XFi0MKPBdlOWclrl/snueUksq1OwEp1DrgiwYcqK0FoFKOuxklysrVc35EubW3GxrWZ2dqNzyBUBNkxZ29PaV1VWkh9BvXFw2GwdHZ+cRohwDrkiwJoae6bHzgEu2gCXV+K63fv2Ozf2zfHJmhr75SK+vZOHlLqSoXpv0RwCrKmxJj1k5d31UTxZNIcAC9hdwXOQfim8IiaJsrgd3tt7svFhudOiwOJS/nVxShaLxfo9/eTXJ2QHf5fhspzSvZsvdqRSGv8Rce/mi/3m+dKxmy8W9XzpzM0Xy4117+aLHanGWolT0mI5pXs3X+z/T/kJvPeEf4d4rosAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.241,3.497;4.blob,1.1,308.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAMAAAAliK2kAAAAXVBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl5LS0v09PQLCwupqamjo6MPDw/39/dFRUVkZGTk5OQCAgLCwsKKioohISH+/v4sLCx9fX3Ozs7W1tZwcHCUE+ueAAAAQ0lEQVQImWNgAAFGJgYIYGKE0MwsrBAGGzuE5uDkgjC4eXghDD5+CC0gKARhCIuIQhhi4hBaQlIKwpCWgRovK8eAAgBZOwHVB8yFBgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373173;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.240,3.456,3.960,2.57,2.14,1.1,3.230,3.456;4.copy,1.1,2.10,3.475,3.230,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.221,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.4,3.459;4.blob,1.1,620.iVBORw0KGgoAAAANSUhEUgAAANcAAAAPCAMAAABAzqrFAAAAqFBMVEXIyMhkZGQAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQREREPDw8jIyO5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhoZkKn9mAAAA40lEQVRIie2W2Q6CQAxFsYoL4AKOooLivu/r//+ZzCQIhtCQvjQm3oehSec0ucltBk0rQKaKJb1cqWb3MTGzGuKrZphWvdEkjedmMV8t2wFoiw5lPjeL+Oq6PXn2B4Tx7Gzky3OU/MSdoRjJjxkkuzkrdjbyNRZKEwBfXfHCDRRT2ZnNk92cFTsb+VoslVYynFLBl6+4m7NiZ9M5XKsrm08Otzt6HvjYdA7jHTTkDsL+QMgDO5vOYayjHb6NJ3Em5IGdRd/li2ld3VtmHxM3i/mC+0N/voj/M8ws6uuH9ff1W3oDgQt+kry0YaUAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373212;4.copy,1.1,2.80,3.323,4.1120,3.133,2.14,1.1,2.70,3.323;4.copy,1.1,2.10,3.342,2.70,3.114,2.14,1.1,1.0,3.342;4.copy,1.1,3.230,3.456,3.970,2.57,2.14,1.1,3.220,3.456;4.copy,1.1,3.210,3.475,2.20,2.38,2.14,1.1,3.200,3.475;4.copy,1.1,2.10,3.494,3.200,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,1.1,3.330,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.171,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.459;4.blob,1.1,1144.iVBORw0KGgoAAAANSUhEUgAAANsAAAAiCAMAAADhwFyjAAABa1BMVEUAAAAMDAz19fVKSkp3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLwFBQUICAgCAgIBAQGLi4vBwcEEBATp6eleXl7///9UVFSUlJTl5eVpaWkYGBgtLS3+/v4fHx9LS0v09PQLCwshISE0NDQRERFMTEywsLBaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHypqamjo6MPDw8jIyNmZmZgYGAvLy/W1tb7+/tycnLZ2dn39/dFRUUnJycQEBD8/Pw3NzdkZGTk5OS3t7eVlZXCwsKKiopZWVns7OwGBgYsLCwJCQlQUFB9fX3Ozs6cnJyqqqpwcHAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0uLi7r6+t/f3/n5+eCgoIZGRlAQECsrKy5ubmxsbGFhYWWlpZISEgzMzNnZ2ehoaEpKSmGhoY6HhKKAAABqUlEQVRYhe2YV1PCQBCAVymKHYGoGEVEBRWxYEERe0PsFVEpFsTey8+XywMJDrnc5EEXJ9/Dscntx87NbIYsAIyUlOqUUvQGZC4zxjKlDIMem8tKuamCnlBZVY3NZaWmto6eYK7H5lqsAra8m1yBCBoaqSWa7M3YXCMv0AJgEw5pyQatpY627JbZKUbZpd3VQavR2eUGZK6nW6AHoFc4pBegz6frNw0MDvndYkS+ZXiEVmN0jKyoXLEnA8IhxwEmggCTIX4qKIkI0zOUEoHZOfKByhV7Mh9ufuFn5Fxckq+xvCI+slhcsSeVCa/K70XWcLqsrG9sym15XFs4XVa2/TtyW7t7SF1m9g/kdkKHWF0NDQ0NDRaiR7Hjk9N/6cYTydTZ+YWqEtjdy7SVDDpXamogd7nMNVlvblWUQOrm5rc7XnhpS3ql/zMwRgjcQuTmtyh/T64fItKZjjFC4BYiN79J8sSZjjFC4LL05OOT+t74S5fak1yCPJfgeFbRGwhcak/CSzr7G/jKv6noDQQunbg9mXrPfCilFaf7GY75vlS++xSjq6Hx23wDjJL9DbJAa8sAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373254;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.200,3.475,4.1000,2.19,2.14,1.1,3.190,3.475;4.copy,1.1,3.220,3.494,3.980,2.19,2.14,1.1,3.210,3.494;4.rect,1.1,3.142,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.192,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.292,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.402,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.580,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.640,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.710,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.102,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.250,2.30,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.10,3.305,2.37,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.181,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.102,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.229;4.blob,1.1,1408.iVBORw0KGgoAAAANSUhEUgAAAGEAAABeCAMAAAAE9IrpAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68DAwPa2tpwcHAHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUlSUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb2rq6uwsLACAgLk5OQcHBykpKSqqqpcXFzBwcHf39/////q6uo1NTXExMTt7e0xMTGsrKzg4OAODg5WVlYTExNdXV0uLi5HR0eWlpbS0tIJCQno6Oh/f38nJydCQkJxcXGCgoJGRkaAgIABAQHX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+4uLiNjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIhlZWUICAjs7Ow7OzsZGRkUFBT5+flsbGzGxsZnZ2fx8fF7e3tQUFBra2t+fn7b29taWlrOzs739/fn5+d5eXlvb2/m5uYaGho6OjrMzMx9fX3l5eXNzc2FhYUpKSlFRUV6enpLS0u61u1yAAACS0lEQVRoge2XWU9TURCARyposVIrSy0qsomIiApXFEFANuuCC6Co1AVUdgF3QUFEfzjt4Q735TRnZk5OTJP7vcw8nHSSpsnXD0DIAcKbooj007McLCY8Kjl0WHwgWnpEzdjRsvixRL4NjpdLD1RUVqmZPJEqqT556rR+A6iJnxFeqI3H1Kyrb2g829R0Tr9laT4vvNByQY3Wi22XLl9pj3RotxzVXoPswtU6NTqvJa/Hum5Ad1K35V70eDdFB3q9WjX7mvsb4dYADA7pNvVkeER04baXVvPO3Xvl0Hd/tFK7KR48FF3o9x6p+XhsfOLJ08lnLdpN8fyF6EKbt/cjjKamJjIvX71+o90U0zOiC1OZt2q+ez8bmYO5ef2Wo2JhUXQBlvxvd/nDSnR1Ld+WJeF1yS58/OQvn798/fY97wbwY71VdmEj85P28Nem7ADAZGqU8mx1q0d6IfJ7m/Dqz/qO9ADA/F/Co/Q/+QEbKHYMEHiSZMcAvifRjmS4nkQ70uF6Eu3IgOlJ344cmJ707ciB50m0IwuWJ9GOLFieRDuyYHkS7ciC5Um0IwemJ5f4/z2Ynty3Ix2mJ8l2DOB6kmjHALYnaXYMEHiSZMeA/+VJHlY9ScKmJxFnPYm460nEXU/6OOxJH3c9ibjrScRdTyLuehJx15OIw55E3PXkPs56koy8J4lY9CQNq54kURieDAkJCQkJCZFSGLVpwL42TdjXphHb2jRjW5tmbGuTgGVtErCsTQKWtUnAsjbNWNemEfvaNBHWppmCr81d8NLC+X3NZBMAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAANEAAAAjCAMAAAA9vh/PAAABC1BMVEUAAADIyMhkZGT///8MDAz19fVKSkoqKiq4uLjx8fHg4OCEhIQHBwekpKSoqKgcHBzq6uq6urpOTk5qamrt7e2enp5GRkb29vYODg6ZmZnd3d0ICAhMTEwuLi4DAwPm5uZjY2MBAQHr6+t/f3/n5+eCgoKLi4vBwcEZGRlQUFCwsLAFBQUCAgItLS3+/v4fHx9AQECsrKzCwsJUVFTQ0NB8fHwhISE0NDQRERFycnLZ2dm5ubmxsbEYGBj8/Pw3Nzfl5eWFhYW3t7eVlZWWlpZISEgzMzNZWVns7OwGBgbp6elnZ2ehoaEJCQny8vIpKSni4uKGhob5+fn39/ecnJyqqqqfn5/X19fLy8vsDwfRAAABXklEQVRYhe2WWVPCMBSFo1HZRCgiIosKCioICu4Li4iKivv6/38JTYra1JfOnWRup5PzkGRy5zvTM1kaQtxrYvL/yOusOmedSBarzlknksWqc9aJZLHqnHUiWaw6Z51IFqvOWSeSxapz1olksVreEf0V9pfIkq8TTU3P/MwGgqFwZBbmiM3a1yg6Ny7G4kZiPrkAMkZn7YlSi2mrupTJEpKjeYgzOmtPtLyyyouF4hpr10sAY3xWuBnKG7y6SbdYZ1QIqWa5tl2P8FkhUa2+w6YDdJd1jaZ5tKzanusRPive3vsHjkSHR1zHrkf4rJjo5NS2687O4auPyIqJWu0OO19xdspI9wKw+vismIj0Llnbz5h/qit6DVh9fNaR6GZwa7axOyNxXxwCLlEPsI5ED498Oz71Qs8vwNcINktf37ja45fq+wfMzzuiHav/9M/b++uba+CfROI58oH+Eo0AwbaM3O9UDbYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373296;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.210,3.494,3.990,2.19,2.14,1.1,3.200,3.494;3.img,1.1,2.14,1.1,9.image/png,1.1,3.497;4.blob,1.1,168.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOBAMAAADgeEClAAAAHlBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExNXEbp8AAAAGklEQVQImWNgIA8IKSkpM7iGhoYxVHR0dAIAFJID0E03MR0AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373332;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.210,3.475,3.990,2.38,2.14,1.1,3.200,3.475;4.copy,1.1,3.200,3.494,2.10,2.19,2.14,1.1,3.190,3.494;4.rect,1.1,2.21,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.141,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.10,3.478;4.blob,1.1,1000.iVBORw0KGgoAAAANSUhEUgAAAL0AAAAhCAMAAAC7rVo6AAABTVBMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIZGRlQUFCwsLAFBQUCAgJAQECsrKzCwsKkpKRUVFQhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhoZ3d3fU1NQMDAz19fVKSkqoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBAReXl6Li4vBwcFLS0v09PQLCwstLS3+/v4fHx+pqamjo6PQ0NB8fHwPDw/39/dFRUVycnLZ2dlkZGTk5OQYGBj8/Pw3NzeKioqVlZUsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vLW1tZwcHCcnJyqqqrIyMhgYGAoKCgTExNq5NU0AAABWklEQVRYhe2Yx1PCUBCHF1EhWMAY7CjFrqgo2BVFxYq9d7HX//9oipOXywvxXXYd8x0ym/zy7WUnLzMLAJ4yb3lFJQiB7vr8UqCqukaoCb5bGwwB1Mn1Il3QXSXcoN4qjU0CTfDdZrlFeyC1ArSFdCKOK3zXI7drVUcUICbrxB1X+K6lS6JTp8txhe/+TKG7R3yCiK7i174A6O0TmCABtz+onvoD8qDABAm4vqQUGAoPCxxcJNyRlHd0TPCP/RddFxcXl/9MOsMJxicmqbqMTJqXxKaouibTM7O8aG4+S9NlLCxyo9zSMk3XZCWZ54erayRdxvrGJj/cKmxTdBk7u3bp3j5F1+Tg8MguPj4h6DJOzyJ28fnFJT2XEb2yz1PX9FyTROHG/oXbuyI1l3H/UOKFxydtAVE09hE5a4XmMp5fSnSB1zf18m7sIz6sFZr7az6NfcSXtcJ2vwHYPa89D4F+lQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373374;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.190,3.456,4.1010,2.19,2.14,1.1,3.180,3.456;4.copy,1.1,3.200,3.475,4.1000,2.38,2.14,1.1,3.190,3.475;4.copy,1.1,2.20,3.494,3.170,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,2.31,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.459;4.blob,1.1,1320.iVBORw0KGgoAAAANSUhEUgAAAL0AAAA2CAMAAAClfmgZAAABg1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkocHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKiZmZnd3d0ICAhMTEz///8uLi5GRkb29vYODg4BAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MFBQUCAgIZGRlQUFCwsLCLi4vBwcFUVFRAQECsrKzCwsItLS3+/v4fHx8hISE0NDQRERHQ0NB8fHy5ubmxsbFycnLZ2dnl5eWFhYUYGBj8/Pw3NzeWlpZISEgzMzO3t7eVlZXp6elnZ2ehoaFZWVns7OwGBgYpKSni4uKGhoYJCQny8vKcnJyqqqrIyMhkZGSIiIgrKyt3d3fU1NTNzc3k5OQyMjL9/f0bGxtvb29DQ0OQkJC8vLz7+/sWFhYEBAReXl60tLQLCwv09PRLS0tWVlZcXFypqamjo6Pw8PAPDw/39/dFRUWbm5s9PT11dXWKiore3t7T09MsLCwxMTF9fX3Ozs6Pj49gYGDW1tZwcHAoKCgTExOxdzSCAAACFUlEQVRoge2ZZW/DMBRFPYZ23M6DjtcxMzMzdszMzPjTZyftVGmzE3lz38D3Q2XVPc5R5SSWLkIC8fMPCAwKFiG/iQ0JDRNbgSTcYo2IjIqGZGNihVagibPZEYrHCYBsYlKyyAokjpRU+pmWDshmZGbpX2bbtThNj3JwLuWseXAsQvkFun0M1lJoeuSHiyhXXALHIlRaVq7ZV1RqqTI98loFiiWprvnSzqmtg2NJ6hvEdo7DQu8e1NgEx5I0t7QK7RzUZiNvjHbcAcfSdHYJPLdIwrutET0pvcBsX/+A0CposDNgaFjwbf9t7MhortgqPyNj49AGKioq/zsTkx9HP52FN1D2yt73LLyBslf2vmfhDZS9svc9C2+g7H9f8HugTUSi7OGim09NM+xNtHOuGcaED1jdfnqK9d8bt3MzLtaMfFaTn3XOsewN27n5hUXWlHxWs19aZu7793aOlZVV5pR8lsqvrfey71pPO8fIRvcme1I6S+23tnfY9p52jpHdnW32pHSW2u/t856Y7naOkYND3qxslmgf2a08e3c793mOT05515DNEu2zxQWevbud+zyTc06egWyWaJ9f8N+1vHau5JInIJ3F+MpxzbfntHMVZTd8A8ksxum3BuccvZ0b0DvrDO8RurvnC8hmMR58MDqlae3chP6rR+8Reno2MJDMmj5jvuid9av3yGyksX/hhPxL7d8AdWkhEfLBtuYAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373414;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.180,3.456,4.1020,2.57,2.14,1.1,3.170,3.456;4.copy,1.1,2.10,3.475,3.170,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.102,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.152,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.202,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.252,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.302,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.540,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.600,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.670,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,3.229,2.37,2.37;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.32,3.267,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.269,2.30,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.305,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.161,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.62,3.210;4.blob,1.1,1776.iVBORw0KGgoAAAANSUhEUgAAAkIAAAASCAMAAACAaEHsAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAADLklEQVRogd2Z+VPTQBiGF6totVoQKBa0WLUtIpeAYIp4FlDAVsQTb0VU6okHKijegvf1B9usSbtN9/s2yRrj5P2BfrPZ53veGYZpOxCSSxmBssTHP5cnoHsyhEzK/oHDu1m6DHxUvnyFQwRwT4aQiWZz1OHd+Feuoq+B1WuCFZXFE1lbhRDcoIRoM+pACW5708nbBK0wr/VU14Rq14XtsW55eQ3q6tfTk/CGSHnDxugmdiJkc3BLCasT/GCEaDPuwAh+e7Mp2PBWmNd6YvFE49ambXZQ17zcBs3BAD1qaW1r397R0clOuXTtKIF1AghCiDYLHAgBtDcZxoa2wrzW09ndQ8hOJWmHdcvLbdC7i5707Y7t2btvv+8AM6lpUNqMsEZAgQnhZoEDJqD2JsPY0FaI13pS0X7158CgDdYtL79BvIUeHTwUbgoMDZPacGFSz0eUw0ZaI6DAhHCzwAETUHuTYWxoK8RrAdKSVjLqSwL/g/y/vNwGR5RmejTalWwnR8fIseOFiT440W+AdQIMSIg2Cx0gAbY3lSIb0grzWoC0VCsn1ZfhU9ZR17zcBqeVcXp0ZvBsFRk9l6pnJprzFwywToABCdFmoQMkwPamUmRDWmFe65H5Vbrl5TZIKhfp0aXLVyau1kxe62Ummus3DLBOgAEJ0WahAyTA9qZSZENaYV7r0d5QKlptsG55uQ1iyp9vsf7I1ET25q3bd5iJ5u49A6wTYEBCtFnoAAmwvakU2ZBWmNd6UnH6ljl93wbrlpfbYCr7gB71PHzkS5P0DDupqXv8xADrBBSYEG0WOWACam8urA1rhXltZKw7rH4DfGoDdcvLbzCrvffPhZ75M8+Lp1wqlSEjPYt/WkAI0WaBAyGA9ibD2NBWmNd6YvOJxrnoC1usW15ug5evtLPXb94OvDNMhLxf6DPCeYIfjBBsFjgwgt/eZBgb2gr1Ws/ih9DHTzb/0eCWl9fgc/YLdvHrt5Kjv0Rw7skQMmFsjjm8nMlICn6YmR5xiODekyFkkrc56PBwfN/hz+aLCz8cIvj3ZAiZ6DYnHV7OzE/w0fgvpwjgngwhE83mqMOj+Q1thFhYH0SAVgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.229;4.blob,1.1,1140.iVBORw0KGgoAAAANSUhEUgAAADkAAAAlCAMAAADP0rFXAAABj1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68DAwPa2tpwcHAVFRX19fVJSUlSUlIMDAycnJy9vb2rq6uwsLBISEj///8XFxfq6up2dnYODg5WVlYTExPo6Oh/f38nJydCQkLX19eVlZUuLi4+Pj7T09OdnZ0cHBze3t6IiIgGBgb6+vplZWX5+flsbGzGxsYsLCwxMTF+fn7b29tvb2/m5uYCAgIaGho6OjrMzMx9fX2NjY2/v78BAQFQUFDl5eXNzc2FhYUpKSlFRUUUFBR6enpLS0uKiorh4eG5ubkHBwfAwMCSkpLr6+seHh6xsbHDw8P8/Px3d3eZmZnk5OSkpKSqqqpcXFzBwcHf3981NTXExMTt7e2srKzg4OBdXV1HR0eWlpbS0tIJCQlxcXGCgoJGRkaAgIBpaWmMjIw4ODjc3NwfHx+4uLheXl5kZGT29vb09PQrKysICAjs7Ow7OzsZGRlnZ2fx8fF7e3tra2taWlrOzs739/fn5+d5eXkBbBgiAAABg0lEQVRIiZWUV1PCQBSFV6MoKqAREAmCjaKiYAEVLBQbNmyIvWJv2At2/eEOeSG7dx2v39O5JzkvmclHCEMeW3DIFzhlQSFiqSoqBp26pBSxJGUattHqyjFDUiFWMo1eNKCWxFjFFKZq3JCYJQtd1FiRS5tUS911kh65JPUN1Nko2bFLh5M6XVITdtncQp1uif3Yv9LaRp0ebztyqO3opIsuJ/9FgE/y00V3D3LZGwjSRZ+3H7ccGGSbUDiCGUaHbGwlDI8ghqOBMVjGxhFL+wTipX/D9QUKni8ghskpcdpHJ44vIPGZsMo8OzevTDxfQKwLlsRiMrmkTITjC0Bw2b2yurYubChSFuALwOZWfNvg3yG78VzK9qwvICmjK0H29snBYS7JDxhfQI6OTzQkdRrRKZKM468/7uz8In15Fbo2KZIM4wuIOuxJe29u7+4VSYbxBeTh8UnIkExMmbIAX0CeX17V0Tc6EY4vOLx/fH59M4njCzTQF0g4vsDB9QUKhC9+AFtiTq5AZGV8AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,3.459;4.blob,1.1,516.iVBORw0KGgoAAAANSUhEUgAAAIEAAAAMCAMAAAByUC5kAAAAnFBMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIZGRlQUFCwsLAFBQUCAgJAQECsrKzCwsKkpKRUVFQhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhobkMmDDAAAAoElEQVQ4ja2UxxLCMBBDFQIkDiXBOPSe0Dv8/78Rezhw9CzSSbszTweNvQCCWlhvNCEShY1ilbTaHVEIh+2mGdDTfUkKhTX5oBrNcCQI4bBjPbELNQVmmdPc23HYQC+sW66AtXbaeDsO+5NSlE5bb8dhv23s9vIm/2RNbF8EDkdBkyT2lFZX4awvgiZJbHRVyS2/Cz4UjX08w9dbeFkJ7AfV/0GLoOREzAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373456;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.170,3.456,4.1030,2.57,2.14,1.1,3.160,3.456;4.copy,1.1,3.150,3.475,2.20,2.38,2.14,1.1,3.140,3.475;4.copy,1.1,2.10,3.494,3.140,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,1.1,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.459;4.blob,1.1,1100.iVBORw0KGgoAAAANSUhEUgAAAJ8AAAAiCAMAAAB2kft5AAABaFBMVEUAAAB3d3fU1NQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwsCAgKUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6NaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUVmZmZgYGAvLy/W1tb////7+/tycnLZ2dlkZGTk5OQnJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQlQUFBwcHCcnJyqqqoqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEwuLi7r6+t/f3/n5+eCgoIFBQUZGRmwsLBUVFRAQECsrKw0NDQRERG5ubmxsbGFhYWWlpZISEgzMzNnZ2ehoaEpKSmGhoaF2EDqAAABiklEQVRYhe2VV1PCQBCADwQrYsNYQEQsWLAisSsi9oaoFAso9t7175vLMOFguCMTc5zM5Hu4W3b3Yx82kwCQiU4PclNiMGIqdN0s9DpcpbSMjZtBeUUlrlRlqmbiZmCuwZZq6+qZuCgNlkbx5qRMOgJNzWxchJZWq3Da2gz2duE2O9KRcHQ4O0kzqLkIXd3w7HEZe019/QNuazqC+cEh0gx6rsTwyCi8xjwAjHv5CQ8SQSanCCMouhLTMzYp5mbnsiPH/AJ+BkVXwreI/w+Ifwlfo+mmCDiXyQ0rq2tM3BTrG3kaNt1bTNwU3u18HTu7bFwNDY1iJ7gX2j84/LduOBKNHR2fKBpRCPc0ngDgjD9XMqMALpe8gOfllYIRFN3rhIgN3PDiBzJ6i+TkRiq5uSjlRe5AkL+Hvx98SE5upJKbi8CjyBPaJ+XkRiq5cvb7/KJ8R391ifvlIvA5BfZXBTtSySXuF7zFhXfkO/+hYEcquWTClmjsM/mVr42d++0PuX4UfqNYuRrFzS9PwRy3n1xHPgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373494;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.140,3.475,4.1060,2.19,2.14,1.1,3.130,3.475;4.copy,1.1,3.160,3.494,4.1040,2.19,2.14,1.1,3.150,3.494;4.rect,1.1,1.1,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.121,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,700.iVBORw0KGgoAAAANSUhEUgAAAJUAAAAjCAMAAACq77gVAAAAulBMVEUAAADIyMhkZGT///8qKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEwuLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhob5+fn39/f8/Pw3Nzefn5/X19fLy8vs7OwQHkYLAAABDElEQVRYhe2V1w6CQBBFR9cuNuy99977//+Wgols4saQcXbFyH2AzcK5OclQAOzH431dqWDlNbtWalh5za6VGlZes2ulhpXX7FqpYeU1/5vVf4Y9820TPr9k5fMHgqEwrpGCFVpFolosnkiiiklYoVVKTwNkWBbTTMKKrHL5gnEslhDFNCxnVU6bqUCV1YybtDpYe3ZXNCxn1Xicm+BjLeNquwPWnt0VDctZdXtm+nzzc8/uioZ9M8HBED+FD1nRBHNR46mD0RgxBRpWNEGY6Pcv2ZTNEFOgYTkrK5G5Flvkl4iXm4gVWsFqHdhskX8NCpbt9mYOzvo7Hx/nk7OszhczV2dZCZ+rb8eyugH9qUjmHZwHMAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373534;4.copy,1.1,2.10,3.323,4.1190,2.19,2.14,1.1,1.0,3.323;4.copy,1.1,2.80,3.342,4.1120,3.152,2.14,1.1,2.70,3.342;4.copy,1.1,2.10,3.361,2.70,3.133,2.14,1.1,1.0,3.361;4.copy,1.1,3.150,3.494,4.1050,2.19,2.14,1.1,3.140,3.494;4.rect,1.1,1.2,3.345,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492373573;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,3.150,3.475,4.1050,2.38,2.14,1.1,3.140,3.475;4.copy,1.1,3.140,3.494,2.10,2.19,2.14,1.1,3.130,3.494;4.rect,1.1,2.62,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.112,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.212,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.322,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.560,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.630,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.22,3.248,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.229,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.250,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.81,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.22,3.210;4.blob,1.1,1700.iVBORw0KGgoAAAANSUhEUgAAAkEAAAASCAMAAABrX/rvAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAC90lEQVRoge2X51cTURDFV6NoVKKhBAOWYEyCCFKkuCDWUFRIFLFhb4hKLFhR7Fiwtz9Y48nKsvPezDzyct6X3A9kzuz9zZ05HEhiWX+1yJJpsU/cz5+Q+fInaF9RmrVkqfRRybLlBSIkPg0E6StKs/wrVsofripFiMDqNcGy8vkVTlCTsQwuQfmghHcwVVEZqlobVgwEueoylSvYoLpmHWJbH9wAeg4R3hgpqd0U3eyucIKajGVwCcoHJb6Dp1g8UbelfqtSHsxVl6lc0QYNwQBmbNwGWg7R1NzSur2trd1d4QQ1GcvgEpQPSnIHS+0dnZa1w+5SCgS56jKVK9qgeydqrLVbvK0c0bMrtnvP3n2+/a4KJ8jJSAaXIH1Asjs4SkZ7sz/7+hXyYK66TOUKN4g3oc4B+4C3lSMOHgrXBwaHrKrwXIUT5GQkg0uQPiDZHRyl7HT2JYH/FVK56qypXNEGh+0G3Hqk19NwiOHGrlbr6Ih17PhchRPUZCyDS1A+KOkdDFXYJ7IvQycV8mCuOmsqV7TBKXsUt54+42k4xNn+c6XW8PlkjavCCWoylsElKB+U9A6G8vlNqqeZzxVt0GVfwK0XL3kaDnH5ytWxa5Xj17tdFU5Qk7EMLkH5oKR3MJT7X17WrJAHc9VlKle0QcwmvvreuOlpOIQ/MjGWuXX7zl1XhRPUZCyDS1A+KOkdDCXj/94vJ+8p5MFcdZnKFW0wkbmPOqsfPPR0HKLz0WNfykpNuSucoCZjGVyC8kHJ7mBppCOc/e73RAGBuQuQqVzRBk/xzwzl9qC35RDToWf+9PP5FU5Qk7EMLkH5oCR3sBR7kaibjr5UQQS56jKVK9rg1WvU+Gamx9v6T7x9977vg6fCCWIymsElCJ9A4jt4mv0Y+vR5gd+L1dPM5wo2+JL5ivm+fQctTYTAp4lAfUVp13gkKX+YnhwoECH0aSEIX1G65fsh/0Q/O/OzQITYp4OgfEVp19Qv6aPR34UiJD4NBOkrSqf+AMkOUvOqJy3wAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.0,3.229;4.blob,1.1,2660.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;3.end,1.1;4.sync,10.6492373618;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.130,3.456,4.1070,2.19,2.14,1.1,3.120,3.456;4.copy,1.1,3.140,3.475,4.1060,2.38,2.14,1.1,3.130,3.475;4.copy,1.1,2.20,3.494,3.110,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,1.1,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.91,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.459;4.blob,1.1,1280.iVBORw0KGgoAAAANSUhEUgAAAIEAAAA2CAMAAADXsQqvAAABg1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkocHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKiZmZnd3d0ICAhMTEz///8uLi5GRkb29vYODg4BAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MFBQUCAgIZGRlQUFCwsLCLi4vBwcFUVFRAQECsrKzCwsItLS3+/v4fHx8hISE0NDQRERHQ0NB8fHy5ubmxsbFycnLZ2dnl5eWFhYUYGBj8/Pw3NzeWlpZISEgzMzO3t7eVlZXp6elnZ2ehoaFZWVns7OwGBgYpKSni4uKGhoYJCQny8vKcnJyqqqrIyMhkZGSIiIgrKyt3d3fU1NTNzc3k5OQyMjL9/f0bGxtvb29DQ0OQkJC8vLz7+/sWFhYEBAReXl60tLQLCwv09PRLS0tWVlZcXFypqamjo6Pw8PAPDw/39/dFRUWbm5s9PT11dXWKiore3t7T09MsLCwxMTF9fX3Ozs6Pj49gYGDW1tZwcHAoKCgTExOxdzSCAAAB+ElEQVRYhe2Y5U8DMRyGO1xu+CgyYMhwGcPdbcPdneHuzp9O726QI9DeL+3C9qHvh6VZ97RPdtLkRYgjlrDwiMgoHtLARsfE8q1AEhevWBMSk0TZ5BRug9Q0G0LpOEOQzczK5hSw5+Sqn3kOQTa/oFD/ssimxQkeFeMSlVNKxViEysp1g2SspQI8suBKlauqFmMRqnHVagbuOi314JFhFRGWpKFR6Co0NYuxJC2tfFfBHq/eTaitXYwl6ejs4roKqDuNvFF6cK8Yq6avn+N5IokbUKyDOUMBYIdHPHwK3r7w0THOt/IPdnyihG+VwGVyKtgGMjKhmumZ36P/YKWBNJAG0kAaSANpEErB35EGwTaYnaMYABqv+QXKBJDVDeZmaf+BeeO1ME+bgbGawKJziWZg2ngtr6zSpmCsZrC2Tr0PvhsvWjY2qVMwVhXY2h6i34lfjRclOwO79EkQqxrs+fbpBl+NFyUH+z76JIhVDQ6PWE+jv/Gi5PiENQthydanNoVl4G+8/s7Z+QVrDwhLtr5cXWEZ+BuvvzOz5GQZQFiy9dU1+53Iaryqb1gCIBbjW/sd24DReLld92wDAIux48HkXNAbL4/ei+YbR+jxiS0AYTH2PpudTFrjNa3/6sU4Qq9vJgYAFnw2vuu96IdxBA2TDZXTOYgGn6Cqyx64i1jfAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492373655;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.120,3.456,4.1080,2.57,2.14,1.1,3.110,3.456;4.copy,1.1,2.10,3.475,3.110,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,3.101,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,3.459;4.blob,1.1,508.iVBORw0KGgoAAAANSUhEUgAAAEUAAAAMCAMAAAADBIC/AAAAnFBMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIZGRlQUFCwsLAFBQUCAgJAQECsrKzCwsKkpKRUVFQhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhobkMmDDAAAAnElEQVQokZ2TWQ+CMBCEB0GheIBr8Va8b8Xj//8324bQPjY7T9Mm36Sz2QIIWmHU7oClho0TkXZ7fVaIZQdZDgxpxElpWFmM1VFOpowQy85ori/EAljmRitvZ9mA1tqVG2BLRjtvZ1knZX8wOno7y9avOp35jRQrEz0hXK6MRg57y9TW3OnBaOSw8VOkr6LirIvLvj/h98f8ATX7B4KAI62ACsWVAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492373695;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,3.110,3.456,4.1090,2.57,2.14,1.1,3.100,3.456;4.copy,1.1,2.90,3.475,2.20,2.38,2.14,1.1,2.80,3.475;4.copy,1.1,2.10,3.494,2.80,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,1.1,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.463,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.459;4.blob,1.1,1080.iVBORw0KGgoAAAANSUhEUgAAAGMAAAAiCAMAAAB84ZduAAABaFBMVEUAAAB3d3fU1NQMDAz19fVKSkqkpKSoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBATp6eleXl4BAQGLi4vBwcFLS0v09PQLCwsCAgKUlJTl5eVpaWkYGBgtLS3+/v4fHx+pqamjo6NaWlri4uJ4eHinp6cgICBXV1fy8vLQ0NB8fHwPDw/39/dFRUVmZmZgYGAvLy/W1tb////7+/tycnLZ2dlkZGTk5OQnJycQEBD8/Pw3NzfCwsKKioq3t7eVlZUhISEsLCxZWVns7OwGBgZ9fX3Ozs4JCQlQUFBwcHCcnJyqqqoqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEwuLi7r6+t/f3/n5+eCgoIFBQUZGRmwsLBUVFRAQECsrKw0NDQRERG5ubmxsbGFhYWWlpZISEgzMzNnZ2ehoaEpKSmGhoaF2EDqAAABfUlEQVRIie2UV1PCQBCADwRs2DEWIiIWLFiR2BURe0NUCBZQ7L3r3zeXYZKD4e4yy/DG93BZdvebDZtJEMrGZEb5KbNYKRW+m4PZRKvYyuFuFhWVVbRStb0G7GZRW0ct1Tc0gl2SJkezehW0jB6hlla4S9DW7lROscPi6sQ35tYj5ejydLNmMF2Cnl589nmt/faBwSGfU49wfniENYPtaoyOjePLhB+hyYA05ScizPQMYwTH1ZidE7VYmF/IjdyLS/QZHFcjuMy4UYXQCr3GczOEPavshrX1DbCbYXOL07Dt2wG7GQK7vI69fbhbokTxiBxED4+Oi+rG4nLi5PQMNMKoe55MIXQhXUJmGHSF9BU+r28AIzjubUpFRHeS+jGS74mc0Yhw82GTVB5QRHrEv5+CRM5oRLj5CD+rvJB9Ws5oxJmR+39f3+C7wi5zV0IcPzfkegfsinCZu0IfSeUd+pS+ALsiXDYxh5z4Tv/w2gpzf0NR7x/wW1KIW0LnHyjrp6MydUNDAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492373735;4.copy,1.1,2.10,3.323,4.1190,2.57,2.14,1.1,1.0,3.323;4.copy,1.1,2.50,3.380,4.1150,2.95,2.14,1.1,2.40,3.380;4.copy,1.1,2.10,3.399,2.40,2.76,2.14,1.1,1.0,3.399;4.copy,1.1,2.80,3.475,4.1120,2.19,2.14,1.1,2.70,3.475;4.copy,1.1,3.100,3.494,4.1100,2.19,2.14,1.1,2.90,3.494;4.rect,1.1,2.22,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.72,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.122,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.172,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.222,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.460,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.520,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.590,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.229,2.17,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.4,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.478,2.38,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.210;4.blob,1.1,1744.iVBORw0KGgoAAAANSUhEUgAAAjAAAAASCAMAAABy1BRJAAABv1BMVEUAAAAYGBgLCwskJCRUVFTPz88PDw91dXXFxcUMDAyKiorh4eH19fW5ubksLCyioqKvr69ERETu7u4hISEqKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkDAwPa2tpwcHAcHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb1SUlLd3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcHf39+rq6uwsLABAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFBdXV1HR0eWlpbS0tIJCQno6OgTExNAQEDCwsJxcXFGRkaAgIDX19eVlZUnJydCQkJpaWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0+Pj4GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYXs7Ow7OzsUFBT5+flsbGxlZWUzMzNnZ2d7e3tra2vGxsbp6emhoaFaWlrOzs739/d5eXlvb2/m5uZ+fn7b29spKSm3t7fi4uKGhobMzMx9fX0aGho6OjpFRUXNzc1LS0t6enpphLEGAAADF0lEQVRogeWY91MTQRiGz4AlGpAoBGMQFUyCSBEQ8IIVAyhggtgrKmIhVlQsqFhR7O0PdnI52b3N7vft3k48h7w/kMzu97zPN8MwR2IYVJb4DG5K+McKhGhOh9BJyT9wFEFKly7jHS9foU0I5nQIndi2gjoWb/wrVwXKyq23qys498E1a8UwSGDNoAMkSDPlkM6CDdkK8qqnsipUvS7sjvXKy9sgvD5SWrOhdmP2/abA5rzJuvotQA9EYM2wAyJIM+2QDbHBW0Fe9URj8YatjdvcoJ55uRs0Nbe0bm9ra7fOO3bkjXYG/FATQGDNiAMgSLPDIRnKBm4FedXT3tVtGDvNhBvWKy9vg55d0d179u7z7bfOa8wWdrT3ANgkJtBmxCEmSLPTIRnKBm4FeNWTrO3L/uwfcMF65eVucPBQuNE/OGRUW0+5YfMwOxtrAqvEBNqMOMQEaXY6JEPZwK0ArwJkJ2Wmsy9x+M/v//JyNxjpSLQaR0aNo8esm+N9zOgJsxPuEhJYM+oQEqSZcUjFYQO2grwKkJ1K82T2ZeiUOuqZl7vB6YEzFcbI2WR97ubceWb0gjkGdwkJrBl1CAnSzDik4rABW0Fe9ej84rzycje4eOny+JWqiau9uZtr15nRhHkD7hISWDPqEBKkmXFIxWEDtoK86rEfDWXNLlivvNwNgpHJ8czNW7fv5G7u3mNGoybyyVNIYM2oQ0iQZsYhFYcN2AryqicZsx5+U/ddsF55uRt0P3joSxmp6dxF3aPHzOhk5glYJSawZswhJkiz0yEX2gZtBXldZLQrnP1U9tQF6pWXv8FM6Fkw/dy+KDcH2dkX8FMeILBmxAEQpNnhkAxlA7eCvOqJzsYbZmpfumK98vI3ePX6Tf9b+/zdXA87+v4D2AQRSDPigAjSTDskQ9nArUCveuY/hj59dvkVvVdedIMvX/OOvmW+Q0WyBGdOh9AJZSuYo0iSnhrOP5yIJPUJ7pwOoZMFWwEdRZH5uR+cU99P8X/YsgR/TofQyV9bIR1FkbFf3OPp39qEYE6H0IltK6hjkeYPrxY0C02kKyYAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,648.iVBORw0KGgoAAAANSUhEUgAAAFkAAAAjCAMAAADIbFY6AAAAulBMVEUAAADIyMhkZGT///8qKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEwuLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhob5+fn39/f8/Pw3Nzefn5/X19fLy8vs7OwQHkYLAAAA5klEQVRIie2U1w6CMBSGjxZxAA5QcO+99/b9X0tGoI32gpyQGGL/C3pS+L6kh7YA4ZNIflfRRJiFWZiF+R/Mvw0JEnezlJLTmSzO6LNcc05RtXyhiBIHLNdc0g2AMqlgzAHLM5tW1XnW6ggxZRlzw3DThBZpOx+pHaBzYSvKMuauN/ZAIn3n7WAIdC5sRVnGPBq7mbDmYC5sxTV/rmg6w3fDZnndMBXnL8B8gegGZXndgKVu7/QVWSO6QVn+Sdmo2tbaITYdw3LNsD/IxxPydPssOV/cXKO/kW7eeI/e/Hi6ecXyfn4DzGMssHUoUdwAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373777;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,2.90,3.494,4.1110,2.19,2.14,1.1,2.80,3.494;4.sync,10.6492373815;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,2.90,3.475,4.1110,2.38,2.14,1.1,2.80,3.475;4.copy,1.1,2.80,3.494,2.10,2.19,2.14,1.1,2.70,3.494;4.rect,1.1,2.21,3.501,2.18,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,976.iVBORw0KGgoAAAANSUhEUgAAAE4AAAAhCAMAAABA1m2gAAABTVBMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhoZ3d3fU1NQMDAz19fVKSkqoqKgyMjL9/f0bGxtGRkb29vYODg6QkJC8vLwDAwPm5uZjY2MEBAReXl6Li4vBwcFLS0v09PQLCwstLS3+/v4fHx+pqamjo6PQ0NB8fHwPDw/39/dFRUVycnLZ2dlkZGTk5OQYGBj8/Pw3NzeKioqVlZUsLCxZWVns7OwGBgZ9fX3Ozs4JCQny8vLIyMhgYGDW1tZwcHCcnJyqqqooKCgTExMbL70rAAABSklEQVRIiWNgQABGJmYWVjYGsgCmXnYOTi5uHl6yTMOil49fgIFBUEiYHOMw9YqIioFIcQkyTEPolRQAAykGaSEZkAynLANCjFgWQq+cEBjIMzAKKYCEFJUYEGLEshB6lVXAQBXZOLgYsSyEXnQHq6mT71mgXriDRThAwcmgoUmGZxF6EU7X4gcmQ20hHTI8i6QXDth1Obn0RPXJSCfY9RoYMhsZk5nJKNE7CkaBiSkOCTNzCzKMMzXBJSNnSbppVtY2uKRs7exJNs7BEaeUk7MLqaa56rrhlnT3INU4Ty9v3JI+vn4kGucfgE82MIg004JDQvFJh4WTZlxEpBQ+6ajoGJKMU4rFL28YR4ppyr7x+BUkJCYRMiMJUrk5AZnJKQTUpqbJoOhA0gsD6ZDKLQPIzMwiZHd2DooOJL0wkAup3PIImYRNB6ZeAEk0Rp0Ii5Q/AAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492373856;4.copy,1.1,3.160,3.323,4.1040,3.190,2.14,1.1,3.150,3.323;4.copy,1.1,2.10,3.342,3.150,3.114,2.14,1.1,1.0,3.342;4.copy,1.1,2.70,3.456,2.90,2.19,2.14,1.1,2.60,3.456;4.copy,1.1,2.80,3.475,2.80,2.38,2.14,1.1,2.70,3.475;4.copy,1.1,2.20,3.494,2.50,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,1.1,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.482,2.38,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.459;4.blob,1.1,1176.iVBORw0KGgoAAAANSUhEUgAAAEUAAAA2CAMAAACm5aR0AAABg1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwcMDAz19fVKSkocHBzq6uq6urpOTk5qamrt7e2enp6kpKSoqKiZmZnd3d0ICAhMTEz///8uLi5GRkb29vYODg4BAQHr6+t/f3/n5+eCgoIDAwPm5uZjY2MFBQUCAgIZGRlQUFCwsLCLi4vBwcFUVFRAQECsrKzCwsItLS3+/v4fHx8hISE0NDQRERHQ0NB8fHy5ubmxsbFycnLZ2dnl5eWFhYUYGBj8/Pw3NzeWlpZISEgzMzO3t7eVlZXp6elnZ2ehoaFZWVns7OwGBgYpKSni4uKGhoYJCQny8vKcnJyqqqrIyMhkZGSIiIgrKyt3d3fU1NTNzc3k5OQyMjL9/f0bGxtvb29DQ0OQkJC8vLz7+/sWFhYEBAReXl60tLQLCwv09PRLS0tWVlZcXFypqamjo6Pw8PAPDw/39/dFRUWbm5s9PT11dXWKiore3t7T09MsLCwxMTF9fX3Ozs6Pj49gYGDW1tZwcHAoKCgTExOxdzSCAAABqElEQVRIiWNgIAMwMjGzsLIBGewcnOToBwMubh5ePn4BEFNQiGxThEVEGRjExCWATEkpaTINkZGVA5HyCkBSUUkZIqgiCgaqRLPUxNVB+ng0QKSmFsQUQXEw0CaaxSiuA9Knqwci9Q0MwaYYGYOBCdEsFFMYTM0o8pG5BVi7pRV5PpLhBoUug7UNWLutnT1ZPmJwEAGmOEdxJ0i4OruQF9Vcrjy8brLuUJ6Hpxd5xng7M/v4skE5fv7q5JmCCgICqWHKKKAvCArGZI2aMmrKqCkj3RRygTgcDC9TQkJxmEJEKzIsHGZKaAgutxBuRYaHQU2JUI3EZQrBVmRUdAzUlNg4nOECb0XiAvEJDBBTEpPccYcurBWJAyS7pkBNSU1Lx20KrBWJA2Skp0FNyczCF9PQViQOkJ3DADElV5QHnynQViR2kJdfADWlMCYanynQViR2EBypCjWlqBh/2sXXitQrYYCYUipTht8UPK1II4NyqCkKFQTyEaQV6QVpeysisxgqqxigpnhXE8qN4FZkEERVDTKLobYOZgqReboe0vZuQGbBwSAqXwCWdHU6/ZO/HAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492373896;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,2.60,3.456,4.1140,2.57,2.14,1.1,2.50,3.456;4.copy,1.1,2.10,3.475,2.50,2.38,2.14,1.1,1.0,3.475;4.rect,1.1,2.32,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.132,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.242,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.420,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.480,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.550,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.10,3.210;4.blob,1.1,1668.iVBORw0KGgoAAAANSUhEUgAAAf0AAAASCAMAAABmd/dZAAABv1BMVEUAAAAYGBgLCwskJCRUVFTPz88PDw91dXXFxcUMDAyKiorh4eH19fW5ubksLCyioqKvr69ERETu7u4hISEqKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkDAwPa2tpwcHAcHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb1SUlLd3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcHf39+rq6uwsLABAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFBdXV1HR0eWlpbS0tIJCQno6OgTExNAQEDCwsJxcXFGRkaAgIDX19eVlZUnJydCQkJpaWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0+Pj4GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYXs7Ow7OzsUFBT5+flsbGxlZWUzMzNnZ2d7e3tra2vGxsbp6emhoaFaWlrOzs739/d5eXlvb2/m5uZ+fn7b29spKSm3t7fi4uKGhobMzMx9fX0aGho6OjpFRUXNzc1LS0t6enpphLEGAAAC30lEQVRoge2XV1NTURSFrxFLNCBRCMYgKpgEkSIg4A1WDKCACWKvqIiFWFGxoGJFsbcf7OQmMyc5e+UUuJnzkvVA2fdb+9szMIRYVk6WeSyY5dz3hbilN+RcKcVK2YqVaLxqtRrnQkPKleJyvGvW+sornC/XVYLn/vUb+BHkaEO2GTgkHA1z5NgUU1UdqNkY1BQSr35MecEFwU2hstrNdVvSw62+bQSsb9hOZoijDdlm5BBzNMyRa1NLOBJt3NG0U8tHvfox5UUXNLe0tu1qb+9wxp27Cdnl89I64GhDthk6hBwNc+TZlNLR3WNZe+yYlpB49WPKCy7o3Rvet//AQc8hZ1xrt/Jk32FQBxxpSDdDh5AjYY58m0ridf3pjwODGj7q1Y8pL7rgyNFgk3do2KpxXodG7GM8GmkGfcCRhnQzdAg5EubIt6kkYSfTn6Lot1vdq9815UUXjHbG2qzjY9aJk86DU/0cedruQgsIRxuyzQUcAo6GOTibQqrsM+lPw2c1fNSr3zXlRRecGzxfaY1eiDdkHly8xJGX7XG0gHC0IdtcwCHgaJiDsylkKT8FfZt5L7rgytVrE9erJ2/0ZR7cvMWRMfs2WkA42pBtLuAQcDTMwdkUkv37V96i4aNe/Zjyogv8oamJ1J279+5nHjx4yJFhG74FIxxtyDYXcAg4GubgbAqJR5zXmOlHGj7q1Y8pL7qg5/ETT8JKzGTm9U+fceRU6jnoU442ZJuxQ8TRMEe+TSlj3cH0e4wXGhXqXURMedEFs4GX/uSr7LjCHuLJ1+h1GHC0IdsMHUKOhjnybEoJz0UbZ+ve6FSAVz+mvPCCt+/eD3zIjj/O9/Lkp8+gDjjQkGyGDiEHwhy5NrUsfAl8/bbI9076NvNe2QXffxDwZ+oXbQPOpYaQK6WYSU6P0OFkKK7EudKQcKUULwvzv8HU84f/7xRzbjRkXCnFy/hfOJ75p8a50JBypbiZ/6YlFG74Fyh7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.30,3.459;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAh1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIZGRlQUFCwsLBAQECsrKzCwsK5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhobRBqaVAAAAYklEQVQImU2MSRKCQBTFgoyNItg0oDIpqAxy//Pxu8qFu7xKvQDOwfX8AAgjFR9PidA5zeCic0xRyjTVlZu+C6FqHN1Yars/+tn+gYnsg+cAYyrVl35L+aPiqZitWFb3uwXsB0MFYdnVL+sAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373937;4.copy,1.1,2.10,3.323,4.1190,3.133,2.14,1.1,1.0,3.323;4.copy,1.1,2.50,3.456,4.1150,2.57,2.14,1.1,2.40,3.456;4.copy,1.1,2.30,3.475,2.20,2.38,2.14,1.1,2.20,3.475;4.copy,1.1,2.10,3.494,2.20,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,1.1,3.463,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.459;4.blob,1.1,808.iVBORw0KGgoAAAANSUhEUgAAACcAAAAiCAMAAADrsDC0AAABIFBMVEUAAAB3d3fU1NQyMjL9/f0bGxuQkJC8vLwEBATp6eleXl4BAQFLS0v09PQLCwsCAgKUlJT19fXl5eVpaWkYGBipqamjo6NaWlri4uJKSkp4eHj29vanp6cgICBXV1fy8vIPDw/39/dFRUVmZmZgYGAvLy/W1tb////7+/tkZGTk5OQnJycQEBDCwsKKioohISH+/v4sLCx9fX3Ozs5wcHAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEwuLi7r6+t/f3/n5+eCgoIFBQUZGRlQUFCwsLCkpKRUVFRAQECsrKw0NDQRERG5ubmxsbGFhYWWlpZISEgzMzNnZ2ehoaEpKSm3t7eGhoaPOQICAAAA+ElEQVQ4jWNgQAWMTAxEASZGopQxs7ASpY6NnShlHJxcYJobLsKNVR0PLx+Q5BcQFBIGGS6CYKGqExUDkeISklLSMrJy8nwIFooyBUUlEKWswsCgqqauoYLEQgGaWvwIh2nrYLBgQFePsFeBQN/AkCh1RsZEKWNQMyFO3UgDpmbmFpZWBJVZ29ja2Ts4ElTn5OzCwOCq7kZAGbe7B4j09MIu7e0CBvwMPuq+IL6tH3Z1/upgEMBgqh4I4gfpYlenHwwGIYTUodsbGkbAXm4bkD8YhMIJ2MsQ4QwM40j1KOzqEMCa09Yu2j2GkDIGhtg4c4l4wvFGVwAA5HQlZ8usfJgAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492373976;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,2.20,3.475,4.1180,2.19,2.14,1.1,2.10,3.475;4.copy,1.1,2.40,3.494,4.1160,2.19,2.14,1.1,2.30,3.494;4.rect,1.1,1.1,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.494;4.blob,1.1,536.iVBORw0KGgoAAAANSUhEUgAAAB0AAAATCAMAAABbR/ZNAAAAtFBMVEUAAAD///8qKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEwuLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhob5+fn39/f8/Pw3Nzefn5/X19fLy8vs7OxT7krFAAAAmElEQVQokWNgwASMcIBFkixZJmYWVjZ2HLIcnFzcPLx8OGT5BQQZGIQYhbHKioiKgUhxCWRZSUEwkGKQZpQBKeKSRZaVg9DyDEyMCiBZRSVkWWUVMFDFLotuspo6VpNFOEGuYtDQxGoyg5YAMCS0GXVwhIYuF7eeqD6ukDQwZDEyBoWkiSkYmGGPBXMIbYFd1tIKDKwpil8AL/QOIIyLL+0AAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374016;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,2.30,3.494,4.1170,2.19,2.14,1.1,2.20,3.494;4.sync,10.6492374056;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,2.30,3.475,4.1170,2.38,2.14,1.1,2.20,3.475;4.copy,1.1,2.20,3.494,2.10,2.19,2.14,1.1,2.10,3.494;4.rect,1.1,2.42,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.92,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.142,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.380,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.440,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.510,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.210;4.blob,1.1,1656.iVBORw0KGgoAAAANSUhEUgAAAeAAAAASCAMAAAC0J/0BAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAAC1UlEQVRogd2Y91MTQRhAD6NoNBoQCAYUjJoEkSYgeEGsARQwEbFiV0QlViyoYG9gb3+wk80dW8z3sXuXuM69H9i7nXv7vmGYFAyDUGLwLPEZi6BuuKHkHzS8zNJlwkbp8hWFNtxg1Yra8DL+lavIGli9JlhWTi7XVkgZDKhBT2YayvMtNhXWVaeyKlS9LuzM1dXNP0FN7XqyhjfUldZvjGzKXm8ObkFs22DBDHoy25CF1vCpsK460Vi8YWvjNieqti4wQVMwQNbmlta27e3tHeSmcwei2wYHYtCTuYYkTA2dCuuq09HVbRg7zYQTV1cXmKBnF1l6d0f37N2333eA3NWbrbBuGTywQU/mG5IwNXQqpKtOMtKX/dk/4MDV1YUmiDWT5eChcGNgcMioJq//w+Zh2LcMHtigJ/MNSZgaOhXSVZAsUmY6u8Tz/Sn/r11ggiNmE9kc6Uy0GUdHjWPHye2JPlC3DQHQoCcLDSm4GjIV1lWQLCrNk9ll6JS6qq0LTHDaHCObZwbOVhgj55K1uWfOXwB12xAADXqy0JCCqyFTYV113PyidXWBCRLmRbJ56fKV8atVE9d6cs9cvwHqtiEAGvRkoSEFV0OmwrrqWC+VZS0OXF1dYIKomfvu4a+bHM/cvHX7Tu6Zu/dA3TYEQIOeLDSk4GrIVFhXnWSMvBlM3Xfg6uoCE0xmHpDN7oePfCkjNZ17pObxE1C3DR7YoCfzDTnYGjYV1nXAaFc4+6n9qQNVVxeaYMZ6X5sNPfOnn1uPlJuDsD+T750QMejJXEMSpoZOhXXVib6IN8xGXjpydXWBCV69ti7evH3X/966/jDXC+sLBgtm0JPZhiRMDZ0K7aoz/zH06bPDfxnq6uaf4Evm698PfPuO2OqGG5ha0RreZqIuKW6lp4YLa7hhoVbEhqfx/RA/s83P/Syw4Qa7VsyGt5n+JWyM/S644QarVtSGR/kDrLP3xeKTggsAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,520.iVBORw0KGgoAAAANSUhEUgAAABIAAAAhCAMAAADj/gtmAAAArlBMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIFBQUCAgIZGRlQUFCwsLCkpKRUVFRAQECsrKzCwsIhISE0NDQRERG5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhoYGBgYDAwPIyMhgYGAoKCgTExOp3K5hAAAAkUlEQVQokWNgQABGJmYWVjYkAQZ2Dk4ubh5eZCE+fgEGBkEhYYSIiKgYiBSXYJAUAAMpBmkhGZAMpyyDnBAYyDMwCimAhBSVGJRVwEAVSQhdo5o6QqMIB8h4Bg1NhEYGLX6gM7WFdJCdqsvJpSeqj+xUBgNDZiNjFA+NAuoBE0ikmSIJmUEizRxJyAISaZYIEQChAw2Ikk0XIgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492374098;4.copy,1.1,2.10,3.323,4.1190,3.152,2.14,1.1,1.0,3.323;4.copy,1.1,2.20,3.475,4.1180,2.38,2.14,1.1,2.10,3.475;4.copy,1.1,2.10,3.494,2.10,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,1.1,3.482,1.8,1.6;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492374137;4.copy,1.1,2.10,3.323,4.1190,2.38,2.14,1.1,1.0,3.323;4.copy,1.1,2.80,3.361,4.1120,2.19,2.14,1.1,2.70,3.361;4.copy,1.1,2.90,3.380,4.1110,3.133,2.14,1.1,2.80,3.380;4.copy,1.1,2.10,3.399,2.80,2.95,2.14,1.1,1.0,3.399;4.copy,1.1,2.60,3.494,2.30,2.19,2.14,1.1,2.50,3.494;4.rect,1.1,1.4,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492374177;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.sync,10.6492374217;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.rect,1.1,1.2,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.52,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.162,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.340,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.400,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.470,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.10,3.210;4.blob,1.1,1568.iVBORw0KGgoAAAANSUhEUgAAAa0AAAASCAMAAADfY3ERAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISEMDAyKiorh4eH19fW5ubksLCyioqKvr68qKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHDAwMC/v79ISEiSkpLr6+seHh4VFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp5SUlJ2dnaxsbEXFxfDw8P8/Px3d3eZmZmcnJy9vb3d3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFATExNdXV1HR0eWlpbS0tIJCQno6OhAQEDCwsInJydCQkJxcXFGRkaAgIDX19eVlZU+Pj5paWmMjIw4ODjc3NwfHx+NjY1eXl7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYVlZWXs7Ow7OzsUFBT5+flsbGwzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29taWlrOzs739/d5eXlvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0uuZNGJAAACkklEQVRYhe2WaVfTQBSGB6totVoQKBa0WLUtIpuA4BRwLaCArYgr7oqo1BUXVFDcQHDffrAnk8RpMjOZuZxy5kueD53k9n3Pcz8lQYhQgpysCiAJJYo5n6Kzeo1rULp2nVJDmvMpOsH1G8gZ2rgpXFZOLjdXKDVkORbqKLApUlkVqd4SBQoZLxxdXu4GNbVbyRndFiut2x7fYVzvDO/yKNsNWY6FOgptaiSSqfrdDXtAPtYLR5eXv0FjOETOpuaW1r1tbe3kpmOfR9tuyHIs1OGwKdHe2YXQfpwGCRkvHF1e/gbdPWTUeyBx8NDhI4Gj5K4Ot4jbVkOaY6AOp02FTLzP+O0fAPhYLxxdXsEGySYyO3Y82hAaHELV5Pk4jE+I61ZDmmOgDqdNhSzOGUeqRxb09MK7urz8DU7iRjIb6Ui3olOj6PQZcnu2T9i2G7IcC3W4bApU4nPGMXQe4GO98K4uL3+DC3iMzC4OXKpAI5cztWbkylVh227IcizU4bIBd4YCt+n38jdI42tkdv3GzfFbVRO3u83InbvCtt2Q5Viow2VTwHoelDUDfKwXji4vf4MENj/Cg7HJ8fy9+w8empFHj4VtuyHLsVCHy6ZAJkmeuVNPAD7WC0eXl7/BZP4pmXU9ex7Iouy0mah58VLYthuyHAt1OG1KjHZGjW/QV4AK610Gurz8DWasN89s5HUw98YKlONBcXuGvqs8cyzU4bApkZhL1c/G30IqHC8cXV7+Bu/eW8MPH+f7F6zrT4u94vb/hiTHgToKbWosfY58+brMb2G4Tb+Xu8G3/Hf2/x8/PcoFDc+czwowEcu4R7mpYaWGJOdTfAK/3N87S4u/lRqynM8KMP3HNRj7q9aQ5nyKyT+fDdg0/l8g+gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492374259;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.sync,10.6492374298;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.sync,10.6492374338;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.sync,10.6492374378;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.rect,1.1,2.12,3.210,1.5,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.62,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.300,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.360,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.430,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,3.210;4.blob,1.1,1400.iVBORw0KGgoAAAANSUhEUgAAAXIAAAASCAMAAABxeaXVAAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw8MDAyKiorh4eH19fW5ubksLCxERETu7u4hISGioqKvr68qKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79ISEiSkpLr6+seHh4DAwPa2tpwcHAVFRVJSUkcHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZlSUlKcnJy9vb3d3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcHf39+rq6uwsLABAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwODg5WVlYZGRlQUFBdXV1HR0eWlpbS0tIJCQkTExPo6OhAQEDCwsJxcXFGRkaAgIAnJydCQkLX19eVlZVpaWmMjIw4ODjc3NwfHx+NjY1eXl4+Pj7T09OdnZ0GBgb6+vpkZGT29vb09PQrKyve3t6IiIjl5eWFhYXs7Ow7OzsUFBRlZWX5+flsbGwzMzNnZ2d7e3tra2vGxsbp6emhoaFaWlrOzs739/d5eXl+fn7b29tvb2/m5uYpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0vY/W0dAAACFElEQVRYhWNgIBMwgkkmZnL1jwJSAQsrmGJj5xhghwxJwMnFzcPLR5oefgFBCENImA62wYCIqJi4hCR5egfKXmwukJSSZpORlZMnRbeCohKUpcyjQpK95NgGA6pq6hqaWtrkaB0we7G6QEdXT9/A0NCIFO3GPJwwpokpSRaTYxsMGJmZMzBYWFqRo3eg7MXmAmsbVVs7ewdmR1K0OznDmTKWeiRoJMs2KHCRcwWRbu5k6B0oe7G6wMNTUovTy5tBnJSySk0HzvSx9CVBI1m2QYGfpT+IUncmpHAQ2YvVBQEmVvoMgUEMwSHEaw+1NEZwwlxJsJgc22BAxDIcRHlHkK51wOzF6oJI9yhhhoBoF0UStMdYxiI4cfEk6CTHNhigxOsDZS9WFyQkJiWniKamOZGg3coyHcHJyCRBJzm2wQA0g/PqkqF3oOzF6gJ+6azk7JzcvHwStKtaIrUMCwpJ0EmObTDgogYuwoqKydA7UPZidYF5SSmzH4NfGSnas7LL4WyFikoSdJJjGxwEmUmCWkhVZGgdKHuxu6BarIbfv5Y0/XWI8pvP0osUneTYBgOq9eoa1XINZOkdKHuxu6CxqdmthTTtrW1wZnuHNUlaybANDjq7xLp7yOx4D5S91HEBA0Nvdh+M2T+BUqeMAqJAqrQLhOFf5DOwLhkxgHkipP7u7Jg0wC4ZOaBsMpiKnTLA7hiCAAAIXJZYWA68NQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492374420;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.sync,10.6492374458;4.copy,1.1,2.10,3.323,4.1190,3.190,2.14,1.1,1.0,3.323;4.sync,10.6492374499;4.copy,1.1,2.10,3.323,4.1190,3.171,2.14,1.1,1.0,3.323;4.copy,1.1,3.150,3.494,4.1050,2.19,2.14,1.1,3.140,3.494;4.rect,1.1,1.2,3.497,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492374539;4.copy,1.1,2.10,3.342,4.1190,2.76,2.14,1.1,1.0,3.342;4.copy,1.1,2.70,3.418,4.1130,2.95,2.14,1.1,2.60,3.418;4.copy,1.1,2.10,3.437,2.60,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.20,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.82,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.260,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.320,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.390,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.101,3.337,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.4,3.421,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.212;4.blob,1.1,972.iVBORw0KGgoAAAANSUhEUgAAAT8AAAAMCAMAAAAj4UouAAABO1BMVEUAAAAMDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79UVFRISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcELCwvf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwZGRlQUFCwsLBdXV2cnJxHR0eWlpbS0tIJCQlAQEDCwsJxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6tEREQGBgb6+vpkZGT29vb09PQrKyvl5eWFhYXs7Ow7OzsUFBQzMzNnZ2d7e3tra2vp6emhoaFaWlrOzs739/d5eXkpKSm3t7fi4uKGhoawTIRNAAABWUlEQVRIicWW2U7CQBSGDypCsSLWUkQRWSyuWEGliOK+4oL7ivv6/k+gTUw6xnMxZ27OfzHzZ5Ke77uYTAoAgbb2jmAngNhkEwprkS6d8oUfOo2fixjo3dGeWK/RJzbZmHEr0Z8cUBKg0/i5mMFgaig9nMlkxSabbC4PMGIXVAzoNH4uYjA6Zo5PTE4Vp4UmG8eY8dZSWUGATuPnYgazc3oyMF+BiO432SmuXfU2a0HBgE7j52IGtcVCGpbqsLziN9kpIXvV2yprCgZ0Gj8XM1gvb2xCbcvZFhp9Cj10Gj8XM9jZ3Wvshw8Oj4Qmm99bHEwpGNBp/FzMoBk9bpycnp1fCE02Ttx7ReHySsGATuPnYgb565uiC+4tCE069dzPKxyz7xQMFGj8XMygpd03qw/emd9kYz5aiZbxpGRAp/FzUYPnl9fSG/xtsnn/0D6/FP8E6DR+7j+Db443aKy05BRmAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492374581;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.91,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.81,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374620;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.81,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.71,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374660;4.copy,1.1,2.10,3.361,4.1190,3.114,2.14,1.1,1.0,3.361;4.copy,1.1,3.100,3.475,4.1100,2.38,2.14,1.1,2.90,3.475;4.copy,1.1,2.10,3.494,2.90,2.19,2.14,1.1,1.0,3.494;4.rect,1.1,2.71,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.2,3.478,1.6,2.13;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.61,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374700;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.40,3.212,2.20,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.220,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.280,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.350,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.2,3.210;4.blob,1.1,1336.iVBORw0KGgoAAAANSUhEUgAAAT4AAAASCAMAAAD1/0L7AAABv1BMVEUAAAAkJCQYGBgLCwt1dXXFxcVUVFTPz88PDw9ERETu7u4hISGioqKvr68MDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwcDAwPa2tpwcHAVFRVJSUnAwMC/v79ISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp5SUlKcnJy9vb12dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi6rq6uwsLACAgLk5OSkpKSqqqpcXFzBwcHf398BAQF/f3/n5+eCgoIODg5WVlY1NTXExMQxMTGsrKwZGRlQUFATExPo6OhdXV1HR0eWlpbS0tIJCQlAQEDCwsInJydCQkLX19eVlZVxcXFGRkaAgIA+Pj7T09OdnZ1paWmMjIw4ODjc3NwfHx+NjY1eXl7e3t6IiIgGBgb6+vpkZGT29vb09PQrKyvl5eWFhYVlZWX5+flsbGzs7Ow7OzsUFBQzMzPGxsZnZ2d7e3tra2vp6emhoaF+fn7b29tvb2/m5uZaWlrOzs739/d5eXkpKSm3t7fi4uKGhoYaGho6OjrMzMx9fX3Nzc1FRUV6enpLS0tiZRsyAAAB5UlEQVRYhe2XV1PCQBSFV7GhgoKIYgURUMQCirrYFbGDYu+9g733rtjbD9aAgg874+z1YWX0PmQzZ3LO+fKQTYLQ+wRwBxTIQ/8DmKBg9xISGsYYxC+HHx7hOYkUUDqFUdEicQysVRIrjYuXwbysekkECYlJH1qyKIUqQ5YqD1GkKdMh/Sq1JiNTmwWxMuslEuhEwk81O4cqJDdPb8gvKDBCAIyFRQgVYxPEy6qXSFBS6lUVWE+RUVauqqisqubVAPrNylruaKkDeFn1kgnUuV65HjdQhDQ2ybTC5hYUB9hJrNjGLZrS7y78Rb1Eglas8+lttRQh9myTAbV3oM4uegAJ7uaWlh56K7NeIkEv7vPp/QMUIYN1QwJkHzYnAgB+chuseokEJjzi00fHKELGJyanpmNnZksAAB8PkTgP4GXVSyRQ4S9fK3PzFCF8uWPKubC4tAwAMKvd28TKKsDLqpdI4HCueeWE9Q2KkKLNLZ4VWbdBBB2FMu5NvwOwsuolE+z69rsY3EyTsifd59sOYASqQ03GnvII5GXVSyQ4PvGqp2dlVCnnF5eWKyCB61p6cwv8eWLVSyK4c95/ig+PP439gzMjN3tObCv1bEn8cnhPnveQ6+yZMYl/zvaLe+l7Zczhh/MGYtCA9szpE2QAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.51,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374742;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.51,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.41,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374781;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.41,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.31,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374821;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.31,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.21,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374861;4.copy,1.1,2.60,3.361,4.1140,3.152,2.14,1.1,2.50,3.361;4.copy,1.1,2.50,3.380,2.10,3.133,2.14,1.1,2.40,3.380;4.copy,1.1,2.10,3.399,2.40,3.114,2.14,1.1,1.0,3.399;4.rect,1.1,1.2,3.210,2.15,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.180,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.240,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.310,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.4,3.364,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.20,3.212;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAQMAAAAMCAMAAABRLiiYAAABO1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwcMDAyKiorh4eH19fW5ubksLCwcHBzq6uq6urpOTk5qamrt7e2enp7AwMC/v79UVFRISEiSkpLr6+seHh6ZmZnd3d0ICAhMTEz///8uLi52dnaxsbEXFxfDw8P8/Px3d3cBAQF/f3/n5+eCgoICAgLk5OSkpKSqqqpcXFzBwcELCwvf398ZGRlQUFCwsLA1NTXExMQxMTGsrKxAQEDCwsJdXV2cnJxHR0eWlpbS0tIJCQlxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6vl5eWFhYVEREQGBgb6+vpkZGT29vb09PQrKyszMzPs7Ow7OzsUFBTp6elnZ2ehoaF7e3tra2spKSm3t7fi4uKGhoZaWlrOzs739/d5eXmcWjJRAAABLUlEQVRIicWVV1PCQBSFLwSDiiGIIkbAICARrBgsKIqCVCv2hr39/18gmfHN++JhxrtPuztzzvc9bCEil1vx9KkEDW//wKBvCMtKcRkDza8HhoMjUIk6GhoLjxsTSFaKyxlEojGiSTOOtEwlkqnpdDqCZKW4jIFlzHSXViYLlMzOafMLi0u5ZSArxeUMbDPvbOgrQMvqmhr0rhfIA9xqKS5n4DI3nFlhE2gpbsVTtF2ind2/Z6W4nEEvLuVsZY+KVavWk8H/cjmDnxPhSwAt9Uazte8+ODwCslJczsDyOy8DHZ8ALe3Qaevs/OLyCshKcVmDUrT7soTNa6AldnObs8m+gxSkuJyBdq8HOsYD1NJRHtv5J8xAissaPL8or2/gL/P+8Zn5AhWkuL8MvgGLIkKqnkBKFgAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.11,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374902;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.11,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.345;4.blob,1.1,124.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPAgMAAACkZGagAAAACVBMVEUAAADIyMhkZGQQ1Hj0AAAADklEQVQImWNgbGAgGgEApoYHkHRbj1MAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492374942;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,1.1,3.337,1.8,2.23;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492374982;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.sync,10.6492375022;4.copy,1.1,2.10,3.361,4.1190,3.152,2.14,1.1,1.0,3.361;4.rect,1.1,2.20,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.140,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.200,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.270,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.212;4.blob,1.1,916.iVBORw0KGgoAAAANSUhEUgAAAMgAAAAMCAMAAAAQ/wIOAAABO1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwcMDAyKiorh4eH19fW5ubksLCwcHBzq6uq6urpOTk5qamrt7e2enp7AwMC/v79UVFRISEiSkpLr6+seHh6ZmZnd3d0ICAhMTEz///8uLi52dnaxsbEXFxfDw8P8/Px3d3cBAQF/f3/n5+eCgoICAgLk5OSkpKSqqqpcXFzBwcELCwvf398ZGRlQUFCwsLA1NTXExMQxMTGsrKxAQEDCwsJdXV2cnJxHR0eWlpbS0tIJCQlxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6vl5eWFhYVEREQGBgb6+vpkZGT29vb09PQrKyszMzPs7Ow7OzsUFBTp6elnZ2ehoaF7e3tra2spKSm3t7fi4uKGhoZaWlrOzs739/d5eXmcWjJRAAABLUlEQVRIiWNgYGBkYmZhZWMgC7BzcHJx85CnlxJ7sbmAl49fQFBImCxT2ERExcQlJKXI0UuJvVhdIC0jy8AgJ69AjjGKSsoqqmpq0uTopcRebC5Ql9QA8tU1tcgwRVuHV1dP38DQiAy9lNiL1QXG8iYgEX5TMowxM2cTYrewZGAhI6VTYi9WFzDKW4FELK3JMMbGVkGFwc6ewcGRdL2U2IvVBZQY6KTl7MJg46ruRoZe6ngEyQXQKOZWIsMYdw9PL28mH18/MvRSYi9WF6jzgTIdg38AGcYEigZ5BYeEhoWToZcSe7G7wF4GmFXF5SPIMEY2MsrQmME4miw3UGAvdhfwxvALxErGkWVOLHN8oEkCeW6gxF7sLkhMYk5OIbOpkJqWrplBphsosRfTBQCvPjifz7bjZAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492375063;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.254,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.244,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375103;4.copy,1.1,2.10,3.361,4.1190,2.38,2.14,1.1,1.0,3.361;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.244,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.234,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375143;4.copy,1.1,3.160,3.380,4.1040,2.19,2.14,1.1,3.150,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.161,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.4,3.383,1.2,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.234,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.224,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375183;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.40,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.100,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.160,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.230,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.151,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.224,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.212;4.blob,1.1,904.iVBORw0KGgoAAAANSUhEUgAAAMcAAAAMCAMAAADh9FmDAAABO1BMVEUAAAAMDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79UVFRISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcELCwvf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwZGRlQUFCwsLBdXV2cnJxHR0eWlpbS0tIJCQlAQEDCwsJxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6tEREQGBgb6+vpkZGT29vb09PQrKyvl5eWFhYXs7Ow7OzsUFBQzMzNnZ2d7e3tra2vp6emhoaFaWlrOzs739/d5eXkpKSm3t7fi4uKGhoawTIRNAAABJklEQVRIiaWU11bCUBBFBxEhGCkxBFFEWrBiBJUgiqhYsYBdELCX//8CzVq+OS+cmYd7n87Ze61biMg15B72jBA0Xp/iH1WxrITLGKhjgWAorI0jJXrEiE7EJiEBCZczmIpPJ2aSyRTSkkpniLJmDslKuIzB7Jw+v7C4lF8GSixtxVkLRSAr4XIGq2tqzLVeIj9wy22z7GzGBmAg4XIGlc1cgraqtF0bvMVr7jhbaRcwkHA5g71ifZ8qB9ahqGXwkXA5g6Pjk8ap7+z8Amj5O1VPHMhKuJxBM9BqXF5d39wCLVbEeWV0dw9kJVzOIPPQzttkd6Caavr3lYbMRyAq4nIGXaXXLPexFv3JiHa1Zygr4bIGL69vhXew5uNT+foGf04J95/BDyXAOfuPoQaaAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.214,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375224;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.141,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.214,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.204,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375264;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.131,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.204,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.194,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375304;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.121,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.194,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.184,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375344;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,1.0,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.60,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.120,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.190,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.111,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.184,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.20,3.212;4.blob,1.1,876.iVBORw0KGgoAAAANSUhEUgAAAIwAAAAMCAMAAACHrqXUAAABO1BMVEUAAAAMDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79UVFRISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcELCwvf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwZGRlQUFCwsLBdXV2cnJxHR0eWlpbS0tIJCQlAQEDCwsJxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6tEREQGBgb6+vpkZGT29vb09PQrKyvl5eWFhYXs7Ow7OzsUFBQzMzNnZ2d7e3tra2vp6emhoaFaWlrOzs739/d5eXkpKSm3t7fi4uKGhoawTIRNAAABD0lEQVQ4jWNgYGBkYmZhZWMgC7BzcHJx85CnFwEQLuDh5eMXEBQSJscUEVExcQlJKQrdguQCaRlZOXkFBUVyjFFUUmZgUFFVo8wxCBeoa4hoamnr6OqRYYq+kAGINDSiyC1ILjA24ZFkNDVj4CIj5s1VLUCUmCVFjkFygZW1mhyDjS2DnT3pxrCrOoAoM0eKHIPkAicjZxcGK1d9NzKMoY5jkFzg7uHp5c3h4+tHhjHQaGKVocgxSC7w5wvwCgwKDgklwxh9UVACZggLp8gxSC5QjojUNWcwjyLLHFslYLIXUI2myDHILojhjPW3iCPPHJF4MfEYoQSK3ILqgsSkZMMUMs1JTeNMz6C4OoC5AABg7y6yfPzRogAAAABJRU5ErkJggg==;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.174,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375385;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,3.101,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.174,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.164,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375424;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.91,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.164,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.154,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375465;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.81,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.154,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.144,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375505;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.20,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.80,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.150,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.71,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.144,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.40,3.212;4.blob,1.1,820.iVBORw0KGgoAAAANSUhEUgAAAE8AAAAMCAMAAAAUJhB2AAABO1BMVEUAAAAMDAyKiorh4eH19fW5ubksLCwqKiq4uLjx8fHg4OCEhIQHBwfAwMC/v79UVFRISEiSkpLr6+seHh4cHBzq6uq6urpOTk5qamrt7e2enp52dnaxsbEXFxfDw8P8/Px3d3eZmZnd3d0ICAhMTEz///8uLi4CAgLk5OSkpKSqqqpcXFzBwcELCwvf398BAQF/f3/n5+eCgoI1NTXExMQxMTGsrKwZGRlQUFCwsLBdXV2cnJxHR0eWlpbS0tIJCQlAQEDCwsJxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6tEREQGBgb6+vpkZGT29vb09PQrKyvl5eWFhYXs7Ow7OzsUFBQzMzNnZ2d7e3tra2vp6emhoaFaWlrOzs739/d5eXkpKSm3t7fi4uKGhoawTIRNAAAA50lEQVQokWNgYGBkYmZhZWOgELBzcHJx8wAZPLx8/AKCQsKUGSciKiYuISkFZEnLyMrJKygoUmaeopIyA4OKqhqDuoaIppa2jq4eRcbpCxmASEMjBmMTHklGUzMGLh5KzDNXtQBRYpYMVtZqcgw2tgx29pSYx67qAKLMHBmcjJxdGKxc9d0oMQ7JPHcPTy9vDh9fP4rMg/qXVYbBny/AKzAoOCSUIvP0RUHxwRAWzqAcEalrzmAeRZFxDAy2SsD4FFCNZmCI4Yz1t4ij0DgGkXgx8RihBBAzMSnZMIVS8xhS0zjTM3gYAHcJHP5Wlz7AAAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,3.134,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375545;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.61,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.134,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.124,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375585;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.51,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.124,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.114,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375626;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.41,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.114,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,3.104,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375666;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.40,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.110,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.104,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.212;4.blob,1.1,820.iVBORw0KGgoAAAANSUhEUgAAAFAAAAAMCAMAAADCg8oTAAABO1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwcMDAyKiorh4eH19fW5ubksLCwcHBzq6uq6urpOTk5qamrt7e2enp7AwMC/v79UVFRISEiSkpLr6+seHh6ZmZnd3d0ICAhMTEz///8uLi52dnaxsbEXFxfDw8P8/Px3d3cBAQF/f3/n5+eCgoICAgLk5OSkpKSqqqpcXFzBwcELCwvf398ZGRlQUFCwsLA1NTXExMQxMTGsrKxAQEDCwsJdXV2cnJxHR0eWlpbS0tIJCQlxcXFGRkavr6+AgIDa2tppaWmMjIw4ODjc3NwfHx+NjY1eXl6rq6vl5eWFhYVEREQGBgb6+vpkZGT29vb09PQrKyszMzPs7Ow7OzsUFBTp6elnZ2ehoaF7e3tra2spKSm3t7fi4uKGhoZaWlrOzs739/d5eXmcWjJRAAAA50lEQVQokWNgYGBkYmZhZWOgELBzcHJx84BYvHz8AoJCwhSaxyYiKiYuISkFZErLyDIwyMkrUGagopKyiqqamjQDg7qkBpCvrqlFkXnaOry6evoGhkYMDMbyJiARflOKDDQzZxNit7BkYGFjYJS3AolYWlNkoI2tggqDnT2DgyOVDHTScnZhsHFVd4N7mVuJIgPdPTy9vJl8fP2A0cEHihQG/wCKDAwUDfIKDgkNCwey7WWAiVpcPoIiA2UjowyNGYyjQWzeGH6BWMk4isxjYIhljg80SYCwE5OYk1MoznqpaemaGUAaABFtHFB7LMj7AAAAAElFTkSuQmCC;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.94,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375706;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.21,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.94,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.84,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375746;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.76,2.14,1.1,1.0,3.437;4.rect,1.1,2.11,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.84,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,2.74,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375786;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.57,2.14,1.1,1.0,3.437;4.rect,1.1,1.1,3.375,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.74,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.50,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.64,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.21,3.497;4.blob,1.1,568.iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAMAAAALzYw2AAAA0lBMVEUMDAz19fVKSkoAAAB3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxsDAwPm5uZjY2OQkJC8vLyLi4vBwcEEBATp6eleXl4tLS3+/v4fHx9LS0v09PQLCwvQ0NB8fHypqamjo6NycnLZ2dkPDw/39/dFRUUYGBj8/Pw3NzdkZGTk5OQCAgK3t7eVlZXCwsKKiopZWVns7OwGBgYhISEsLCwJCQny8vJQUFAICAh9fX3Ozs6cnJyqqqrIyMj///9gYGDW1tZwcHAoKCg0NDQTExMgDlSgAAAAkklEQVQYlW3J1RaCUBCF4aMbbLEDC7sbu/P9X8lZI6LC+S/2mjWfEB4vpCkqBHx+OaoKYSAYklk4EiXUYnEZJpIgRCotsUw2x5jXC24slsqMqBhurNbwxnrDZc1W28JOt+fE/mBoIUZjJ06m+OBsbv7bQl/auFpvaM0tp9G528NGHI40pzN3ofN6+0Hu/uCe388LmlIRCdFZjeMAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492375827;4.copy,1.1,2.10,3.380,4.1190,2.19,2.14,1.1,1.0,3.380;4.copy,1.1,2.10,3.437,4.1190,2.38,2.14,1.1,1.0,3.437;4.rect,1.1,1.0,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.70,3.212,2.10,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.64,3.402,1.2,2.34;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.50,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,2.30,3.212;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAh1BMVEUAAAAqKiq4uLjx8fHg4OCEhIQHBwccHBzq6uq6urpOTk5qamrt7e2enp6ZmZnd3d0ICAhMTEz///8uLi4BAQHr6+t/f3/n5+eCgoIZGRlQUFCwsLBAQECsrKzCwsK5ubmxsbHl5eWFhYWWlpZISEgzMzPp6elnZ2ehoaEpKSm3t7fi4uKGhobRBqaVAAAAYklEQVQImU2MSRKCQBTFgoyNItg0oDIpqAxy//Pxu8qFu7xKvQDOwfX8AAgjFR9PidA5zeCic0xRyjTVlZu+C6FqHN1Yars/+tn+gYnsg+cAYyrVl35L+aPiqZitWFb3uwXsB0MFYdnVL+sAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,2.54,3.402;4.blob,1.1,128.iVBORw0KGgoAAAANSUhEUgAAAAIAAAAiAgMAAAAIdOCBAAAACVBMVEXIyMhkZGQAAACdXjlrAAAAEUlEQVQImWMQYMAHF0AhXlUAlQQEYWBDlbIAAAAASUVORK5CYII=;3.end,1.1;3.img,1.1,2.14,1.1,9.image/png,1.1,3.478;4.blob,1.1,800.iVBORw0KGgoAAAANSUhEUgAAADAAAAAhCAMAAACoVtiLAAABBVBMVEUAAADIyMj////w8PC8vLxJSUlkZGTCwsI8PDxOTk6hoaH+/v50dHSwsLB9fX38/PwsLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakGBgYICAgDAwPx8fFKSkpgYGAoKCg0NDQTExMMDAz19fV3d3fU1NSkpKSoqKhGRkb29vYODg4yMjL9/f0bGxvm5uZjY2OQkJCLi4vBwcHp6eleXl4tLS0fHx9LS0v09PQLCwvQ0NB8fHyjo6NycnLZ2dkPDw/39/dFRUUYGBg3Nzfk5OQCAgK3t7eKiopZWVns7OwhISEJCQny8vJQUFDOzs6cnJyqqqrW1tZwcHBU55izAAABDElEQVQ4jWNgwAIYmZiYWVgxhdmwKQbLsHNwcnHzkKCBF0jw8QuQpkFQSJg0DQwioiRqEBOntQYJEp0kKUWip6VJCVZgxMkw4Yg4WTkwkEdmAZOGAosiqixcA1ASBJSQWUiGIotBNCirgIEqMgsBUMRw+wGX10jVQBJgggG6alBTV8SuWEMThw1a2tg1aGrg0KCjq4dNvb6BIQ4N8kbG2DSYsODwAwODqRkW9ZLmFjg1WHJbYWqwtrHFqYHBzh5Tg4wDA24Njk4Y6p1dXPFocON3R9fA5uGJRwODlxi6BnZvBnwafHxlUQX8uAXwavAPCGRAyZh8QQx4NTAEhzCgZMzQMAIawABLZoVrAADnXxqeLm/Y0gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492375868;4.copy,1.1,2.10,3.437,4.1190,2.38,2.14,1.1,1.0,3.437;4.rect,1.1,2.50,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.40,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.30,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,1116.iVBORw0KGgoAAAANSUhEUgAAADEAAACACAMAAACV1HH+AAABX1BMVEUAAADX19eqqqolJSX////x8fEFBQV0dHRERETCwsKjo6PU1NSRkZEUFBT8/PxbW1uNjY3e3t5fX1/+/v4VFRVGRkYrKyutra3Ly8sICAj29vZ4eHgHBwf09PQQEBC9vb3FxcVKSkr9/f2YmJjn5+dAQEBQUFABAQHl5eWUlJTMzMysrKwGBgYDAwM1NTU+Pj55eXny8vLIyMhgYGAoKCg0NDQTExNkZGTw8PC8vLxJSUk8PDxOTk6hoaGwsLB9fX0sLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4OpqakMDAz19fV3d3ekpKSoqKgODg4yMjIbGxvm5uZjY2OQkJCLi4vBwcHp6eleXl4tLS0fHx9LS0sLCwvQ0NB8fHxycnLZ2dkPDw/39/dFRUUYGBg3Nzfk5OQCAgK3t7eKiopZWVns7OwhISEJCQnOzs6cnJzW1tZwcHDlb3x1AAABn0lEQVRYhe3ZZ0/CQBgH8Ec9REARGSooKCi4QAUH4gIXiqK49957f//YNkZGr+N5AWnw/i/ay6W/tHftk1yuAOpTUYm4mE8V0VXjhF5HanDCYDTVokCdud7SgBJWm91BGjGiqRmcrhYEaHVbPJ62doTwEj4+u3rR0en3+wPEqhp0dffwp94+gKBTSEih1U8GeDEYDkJEeD4yBAqtbIZHhIwqtVhQiUSZYOK/iHKJNmeXCSaKIcol2pxdJkogVK6QcwRihfwrECtkVrXqo+nvioliCla1Wg03k2OxcXG39HgjhonJKZseI6a5Q9ycQIqZ2TmkgPkFrEguFl8sYZ8qtYwd+Qpqdrk3mCbKbzBbl9xXoot58/togrbfRKvVbGj7TRqvVfKXEovVNS/96oxJ6h7rG3RhykgJh2uTBrZ821IitLNLE3sxqXEA7B9QQOrwSFoc207E4tR9Ji3g/EIs0kaQEZdXInB9cysn7sz3hSL68Cgn4ClZKAzPICteXoP5HW+2hLx4Dwcgr1bjHyAv4JP/65BTq1/fSkIIpX5p4gfK73PIfGKp6gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492375908;4.rect,1.1,2.40,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.51,3.451,1.8,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.30,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.20,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAADAAAACACAMAAAB6FhrAAAABHVBMVEUAAADX19eqqqolJSX////x8fEFBQV0dHRERETCwsKjo6PU1NSRkZEUFBT8/PxbW1uNjY3e3t5fX1/+/v4VFRVGRkYrKyutra3Ly8sICAj29vZ4eHgHBwf09PQQEBC9vb3FxcVKSkr9/f2YmJjn5+dAQEBQUFABAQHl5eWUlJTMzMysrKwGBgYDAwM1NTU+Pj55eXny8vLIyMhgYGAoKCg0NDQTExNkZGTw8PC8vLxJSUk8PDxOTk6hoaGwsLB9fX0sLCwKCgrr6+uSkpK0tLTJycmVlZXc3Ny1tbUEBATo6OiDg4Opqal3d3cyMjIbGxuQkJDp6eleXl5LS0sLCwsPDw/39/dFRUXk5OQCAgKKioohISHOzs7W1tZwcHDsen38AAABYklEQVRYhe3WeU/CMBgG8KrvxIEiMjxQQUHnidc8cF7gLQre9/X9P4YbIXPGuvVJxCyzzx9b07y/pO3yZmXMLy2tviVf0kZKOwQiCnVAQI3GOpH6rnh3ogcBSS3VS30A6B9g6cEh8frhTCKbHRkVBzmyk08Jg7FxXdcnKClaPzk1bb9mZl1zhXQ9c9zRPC3YNYtLhU9g1FdJy/wRJyur9azxRzKCMYoSSBBaEIYE8FglkOC3QBgSwGOV4E+A50XXBZw534tuAzhzvhfdBhC//MoWleAfAdmiwYh1XOvmxvfpH7dqqJtb21oEADvWoxQvY2B3bx8D7OAQBEfHzQYn4JIqp+Cmz5BjtT5clZAPR6SYOXvEa0zP8BrTM7zGFE9zG5OcBALUYiCI1TBwnr/AwKXJIFC5usbATeYWA9Uog8Dd/QMGio9PGFCfGQRetLIAcDVm6ZUJAFdjvr2LAM7f0RN8ANjdYyRtOZ8fAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492375948;4.rect,1.1,2.30,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.41,3.451,1.8,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.20,3.478,2.10,2.35;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.10,3.494,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,788.iVBORw0KGgoAAAANSUhEUgAAACYAAACACAMAAABQputvAAAA7VBMVEUAAADX19eqqqolJSX////x8fEFBQV0dHRERETCwsKjo6PU1NSRkZEUFBT8/PxbW1uNjY3e3t5fX1/+/v4VFRVGRkYrKyutra3Ly8sICAj29vZ4eHgHBwf09PQQEBC9vb3FxcVKSkr9/f2YmJjn5+dAQEBQUFABAQHl5eWUlJTMzMysrKwGBgYDAwM1NTU+Pj55eXny8vLIyMhgYGAoKCg0NDQTExNkZGR3d3cyMjIbGxuQkJC8vLwEBATp6eleXl5LS0sLCwupqakPDw/39/dFRUXk5OQCAgKKioohISEsLCx9fX3Ozs7W1tZwcHBBMiVtAAABHUlEQVRYhe3WaVPCMBAG4IALCuVsCwoCcli8QBAPkFMuAVH+/89x2qk1zqRkdYCJQ94vzSTPdHaS/bCEsOPxuhz8yAH4/Ah26IMjBAsElRBfhSPRWJzPVE1PQJLLjk9IKn3KU5lsLJc7y/NYAcwUdQ4rnRuGUQZ1vbq4vDI/1zfUXiVlpUqtbqFmntTvKt+sYdUB9/SKkYdHK0/0aq/SaEom2QaYyBH53iT7R0zkiHxv+8sY4wrFnD2XccVmzp7LuGIz3ggjm1yyrTDZ5BuIEC8pmStjtTbrB4zWZoTV2n+v7bcBJztiLQXFlBaGPRfbGNbpYmrr9QcY9pIdYtgoSBBsPJliWPN1hmGBOUGwhfaGYct3gmEfKxT7ylr2CSDRSXJTTxueAAAAAElFTkSuQmCC;3.end,1.1;4.sync,10.6492375988;4.rect,1.1,2.30,3.212,1.9,2.12;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.20,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.31,3.451,1.8,2.22;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.10,3.475,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,1.2,3.494,2.18,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.383;4.blob,1.1,568.iVBORw0KGgoAAAANSUhEUgAAABwAAABuCAMAAAADOYNsAAAAqFBMVEUAAADX19eqqqolJSX////x8fEFBQV0dHRERETCwsKjo6PU1NSRkZEUFBT8/PxbW1uNjY3e3t5fX1/+/v4VFRVGRkYrKyutra3Ly8sICAj29vZ4eHgHBwf09PQQEBC9vb3FxcVKSkr9/f2YmJjn5+dAQEBQUFABAQHl5eWUlJTMzMysrKwGBgYDAwM1NTU+Pj55eXny8vLIyMhgYGAoKCg0NDQTExNkZGRxdis0AAAAu0lEQVRIie3VVw/CIBAHcNSre9RaRx114qyrru//zQzYIE2O+GJSSPi/EO73cBdCcoTIyeWJMgVwikosOVBWYqVaq6us0Wy5bRV6Hb8LPQX2ByQYjnAbT9wwnM5wnAPLwkdxuaKUrsHDbLPdsWN/kGpRwHMkJziz++UafTHmneCGdro/eJ74kFonflk0DLOIdo9g8RdmEe0eQXsUS0dCUUstnQRFLbV0EsQXkf0mxqO+3wRE/oSfMSwagm+/yzZbmmfjKgAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492376028;4.rect,1.1,2.10,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.21,3.451,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.20,3.456,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,1.4,3.475,2.16,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.0,3.383;4.blob,1.1,528.iVBORw0KGgoAAAANSUhEUgAAABMAAABbCAMAAACmhU7/AAAAqFBMVEUAAADX19eqqqolJSX////x8fEFBQV0dHRERETCwsKjo6PU1NSRkZEUFBT8/PxbW1uNjY3e3t5fX1/+/v4VFRVGRkYrKyutra3Ly8sICAj29vZ4eHgHBwf09PQQEBC9vb3FxcVKSkr9/f2YmJjn5+dAQEBQUFABAQHl5eWUlJTMzMysrKw1NTU+Pj55eXny8vIGBgbIyMhkZGQDAwNgYGAoKCg0NDQTExOxlhh8AAAAnUlEQVQ4jWNgAAJGJgZ0wMzCyoYuxs7KwoEuxsnFzYMmxMvHLyCIJiYkLCLKIoYqJi7BICkljSIkIysgJyevgCKmyAICSiLIYsoqqqqqaixCSELqGpogSksbSUyHRRdE6ekboDt78ABDo1ExYsWoDQaT3wa7GLXBYPIbjcQMJMHAGFnMEFyasZggi5magYE5TvOoDQZhWFFbjBphDwAnECLgWIi4fQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492376068;4.rect,1.1,1.0,3.383,2.10,2.53;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.11,3.451,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.10,3.456,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.20,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.440;4.blob,1.1,176.iVBORw0KGgoAAAANSUhEUgAAAAgAAAAiBAMAAACQFoXoAAAAHlBMVEUAAAAGBgYICAgDAwPIyMj///9gYGAoKCg0NDQTExNXEbp8AAAAH0lEQVQImWNgIA8IKSkpM7iGhoYxVHR0dJJpCEnGAwC5OAef+CyP8QAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492376108;4.rect,1.1,1.0,3.437,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.456,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.1,3.470,1.8,1.3;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.sync,10.6492376148;4.rect,1.1,1.0,3.437,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,3.500,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,1.3,3.817;4.blob,1.1,3340.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;3.end,1.1;4.sync,10.6492376231;4.sync,10.6492377232;4.sync,10.6492378232;4.rect,1.1,3.510,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.500,3.817;4.blob,1.1,396.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAjVBMVEUAAAAeHh6qqqrz8/Pu7u6enp4QEBAVFRXk5OTS0tJUVFRjY2Po6Oi3t7eLi4vy8vIYGBhCQkL///8yMjLW1taurq4ICAgJCQn29vZqamrt7e2Hh4fe3t6rq6s0NDQcHByXl5fg4OAMDAwbGxvq6urQ0NBdXV1FRUX6+votLS0kJCStra3w8PDAwMBDQ0N/MhKmAAAAVklEQVQImWNgoAJgZGJmYWUDsdg5OLm4eXhBTD5+AQYGQSFhIFNEVExMTFxCEsiUEgIDaSBTRlYOBOSBTAVFJSCpDDZBRVVNnU9DE8TW0tZh1tUjzS0AuAsFYo/6x8YAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492378469;4.rect,1.1,3.520,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.510,3.817;4.blob,1.1,404.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAk1BMVEUAAACysrLm5uYUFBRCQkL9/f11dXUWFhbp6emxsbETExPl5eW+vr4CAgJLS0v///9paWmwsLDu7u4cHByXl5dWVlYZGRn8/PzV1dWlpaXo6Oj6+vpkZGRbW1v+/v5FRUV9fX309PQmJiYgICDx8fGUlJQEBATKysrLy8sFBQUDAwPFxcXZ2dkKCgooKCj39/eIiIg8M8yQAAAAVUlEQVQImWNgoBwwMjEzMLCwsgGZ7BycDFzcPLwgYT5+AUEhYYgSEVZ+UahqMXEJmEZJKWkZCEtWTl5BUQnEUlZRZVBT19BkYNDS1tFlYNDTNyDJMQBgWQStw0kdzAAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492378689;4.rect,1.1,3.530,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.520,3.817;4.blob,1.1,212.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATBAMAAABbxYHdAAAALVBMVEUAAACLi4vT09MREREgICBoaGj////o6OgYGBg8PDykpKSIiIjt7e0oKCisrKwurY7pAAAALElEQVQImWNgwAKEwKQJnM+alg4kOWYuB/O24yE5Zq6ZeQGoPi3tATaDQQAA9KQKwX61QqEAAAAASUVORK5CYII=;3.end,1.1;4.sync,10.6492378771;4.rect,1.1,3.540,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;3.img,1.1,2.14,1.1,9.image/png,3.530,3.817;4.blob,1.1,252.iVBORw0KGgoAAAANSUhEUgAAAAoAAAATCAMAAACeNWzcAAAAQlBMVEUAAACsrKzIyMjk5OT///81NTU8PDy/v7/V1dWZmZnb29tdXV1/f39BQUFcXFwUFBQBAQGNjY3t7e35+fnX19ctLS3MRsFIAAAANElEQVQImWNgIA0wMmEymVnAAMRkZWPnYGNjw60WF5OTC87kZuHh5eMHMwUEhYRFRElyIABXxAEh9M6b4gAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492378968;4.copy,1.1,1.0,2.38,4.1200,3.779,2.14,1.1,1.0,1.0;4.copy,1.1,1.0,3.817,3.540,2.19,2.14,1.1,1.0,3.779;4.copy,1.1,3.550,3.817,3.650,2.19,2.14,1.1,3.550,3.779;4.rect,1.1,3.540,3.817,2.10,2.19;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,2.61,3.817,3.478,2.18;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;4.rect,1.1,1.0,3.817,2.10,2.19;5.cfill,2.14,1.1,3.255,3.255,3.255,3.255;4.rect,1.1,2.10,3.820,2.49,2.15;5.cfill,2.14,1.1,1.0,1.0,1.0,3.255;3.img,1.1,2.14,1.1,9.image/png,1.1,3.801;4.blob,1.1,944.iVBORw0KGgoAAAANSUhEUgAAADoAAAAPCAMAAACC0iwEAAABTVBMVEVoaGj////o6OgAAAAYGBg8PDykpKSsrKzIyMiIiIg3NzfBwcH39/fp6emTk5MMDAxERETS0tL5+flgYGCYmJjc3Nw0NDRAQEDk5OQnJyf29va4uLhISEhiYmLu7u61tbUiIiL4+PjAwMBJSUnm5uY1NTW/v7/V1dWqqqra2toEBARHR0dBQUGVlZXs7OwKCgpNTU309PSEhITr6+uMjIzJycmlpaU4ODgJCQlsbGzR0dGgoKDi4uKQkJD19fWNjY2UlJTh4eGtra1MTEx6enpQUFCZmZnb29vt7e0oKCgpKSm3t7dfX18hISG9vb0qKir8/PyhoaFpaWldXV1/f39cXFwUFBQ6OjrExMSXl5cODg5DQ0PT09N2dnZSUlLY2NjOzs5XV1cBAQHX19ctLS3+/v4XFxc9PT1ubm5CQkJvb2/Pz8/d3d2FhYUICAgI7xTJAAABMElEQVQokaXSZ0/DMBAGYDuHW0YoScoodEDY0DIDtMwyS4Cy9957/P+P+GLAQbKCgJPiWK/96GLFhFBKNfhLkRLGQr+l4VKP8qfs/7S8Qq+MVOHMMC0zSpk/q67hQy2tA4hRr/y0viGeSKYa+azJbm6JtiKVmaRtrL2DMeannV3dAGmaAejp7QPoRyozSRUfPDCIozMEMDzCJ1mkMguiOTqKr7FxgInJD+rLArtOiQ553jX02VVm0zMBdFacywCIODmAOaQym7f5+RcELSx6FK+Ey9gSwLK+ki66cR6u6muJYgypzNY3No0tTdBtupPZ3SNE/KUwT/YPdOfwCNeOTyzzlGa/ZWfn9sWloFd517q+IcrrgnvJ7Z1y7auU9F57eHxKFYKlmkLy2X55ffuBvgMfpi/6reHgmQAAAABJRU5ErkJggg==;3.end,1.1;4.sync,10.6492379463;4.sync,10.6492380463;4.sync,10.6492381463; \ No newline at end of file diff --git a/doc/licenses/README b/doc/licenses/README new file mode 100644 index 0000000..47ba19d --- /dev/null +++ b/doc/licenses/README @@ -0,0 +1,4 @@ +Apache Guacamole includes a number of subcomponents with separate copyright +notices and license terms. Your use of these subcomponents is subject to the +terms and conditions of their respective licenses, included within this +directory for reference. diff --git a/doc/licenses/angular-1.8.3/LICENSE b/doc/licenses/angular-1.8.3/LICENSE new file mode 100644 index 0000000..9a4ce43 --- /dev/null +++ b/doc/licenses/angular-1.8.3/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2020 Google LLC. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/doc/licenses/angular-1.8.3/README b/doc/licenses/angular-1.8.3/README new file mode 100644 index 0000000..33c781d --- /dev/null +++ b/doc/licenses/angular-1.8.3/README @@ -0,0 +1,8 @@ +AngularJS (https://angularjs.org/) +---------------------------------- + + Version: 1.8.3 + From: 'Google Inc.' (http://www.google.com/) + License(s): + MIT (bundled/angular-1.8.3/LICENSE) + diff --git a/doc/licenses/angular-1.8.3/dep-coordinates.txt b/doc/licenses/angular-1.8.3/dep-coordinates.txt new file mode 100644 index 0000000..479f6db --- /dev/null +++ b/doc/licenses/angular-1.8.3/dep-coordinates.txt @@ -0,0 +1,2 @@ +angular-route:1.8.3 +angular:1.8.3 diff --git a/doc/licenses/angular-translate-2.19.1/LICENSE b/doc/licenses/angular-translate-2.19.1/LICENSE new file mode 100644 index 0000000..85a3888 --- /dev/null +++ b/doc/licenses/angular-translate-2.19.1/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 The angular-translate team and Pascal Precht + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/doc/licenses/angular-translate-2.19.1/README b/doc/licenses/angular-translate-2.19.1/README new file mode 100644 index 0000000..20d161f --- /dev/null +++ b/doc/licenses/angular-translate-2.19.1/README @@ -0,0 +1,8 @@ +angular-translate (https://angular-translate.github.io/) +-------------------------------------------------------- + + Version: 2.19.1 + From: 'Pascal Precht' (https://github.com/PascalPrecht) + License(s): + MIT (bundled/angular-translate-2.19.1/LICENSE) + diff --git a/doc/licenses/angular-translate-2.19.1/dep-coordinates.txt b/doc/licenses/angular-translate-2.19.1/dep-coordinates.txt new file mode 100644 index 0000000..5626eeb --- /dev/null +++ b/doc/licenses/angular-translate-2.19.1/dep-coordinates.txt @@ -0,0 +1,3 @@ +angular-translate-interpolation-messageformat:2.19.1 +angular-translate-loader-static-files:2.19.1 +angular-translate:2.19.1 diff --git a/doc/licenses/antlr-2.7.7/LICENSE.txt b/doc/licenses/antlr-2.7.7/LICENSE.txt new file mode 100644 index 0000000..d62cc1a --- /dev/null +++ b/doc/licenses/antlr-2.7.7/LICENSE.txt @@ -0,0 +1,31 @@ + +SOFTWARE RIGHTS + +ANTLR 1989-2006 Developed by Terence Parr +Partially supported by University of San Francisco & jGuru.com + +We reserve no legal rights to the ANTLR--it is fully in the +public domain. An individual or company may do whatever +they wish with source code distributed with ANTLR or the +code generated by ANTLR, including the incorporation of +ANTLR, or its output, into commerical software. + +We encourage users to develop software with ANTLR. However, +we do ask that credit is given to us for developing +ANTLR. By "credit", we mean that if you use ANTLR or +incorporate any source code into one of your programs +(commercial product, research project, or otherwise) that +you acknowledge this fact somewhere in the documentation, +research report, etc... If you like ANTLR and have +developed a nice tool with the output, please mention that +you developed it using ANTLR. In addition, we ask that the +headers remain intact in our source code. As long as these +guidelines are kept, we expect to continue enhancing this +system and expect to make other tools available as they are +completed. + +The primary ANTLR guy: + +Terence Parr +parrt@cs.usfca.edu +parrt@antlr.org diff --git a/doc/licenses/antlr-2.7.7/README b/doc/licenses/antlr-2.7.7/README new file mode 100644 index 0000000..da13a82 --- /dev/null +++ b/doc/licenses/antlr-2.7.7/README @@ -0,0 +1,8 @@ +Antlr v2 (https://www.antlr2.org/) +---------------------------------- + + Version: 2.7.7 + From: 'Terence Parr' (https://github.com/parrt) + License(s): + Public Domain (bundled/antlr-2.7.7/LICENSE.txt) + diff --git a/doc/licenses/antlr-2.7.7/dep-coordinates.txt b/doc/licenses/antlr-2.7.7/dep-coordinates.txt new file mode 100644 index 0000000..774271f --- /dev/null +++ b/doc/licenses/antlr-2.7.7/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.servicemix.bundles:org.apache.servicemix.bundles.antlr:jar:2.7.7_5 diff --git a/doc/licenses/aopalliance-1.0/LICENSE b/doc/licenses/aopalliance-1.0/LICENSE new file mode 100644 index 0000000..8e0e378 --- /dev/null +++ b/doc/licenses/aopalliance-1.0/LICENSE @@ -0,0 +1,4 @@ +From http://aopalliance.sourceforge.net/: + + LICENCE: all the source code provided by AOP Alliance is Public Domain. + diff --git a/doc/licenses/aopalliance-1.0/README b/doc/licenses/aopalliance-1.0/README new file mode 100644 index 0000000..c201fa8 --- /dev/null +++ b/doc/licenses/aopalliance-1.0/README @@ -0,0 +1,8 @@ +AOP Alliance (http://aopalliance.sourceforge.net/) +-------------------------------------------------- + + Version: 1.0 + From: 'AOP Alliance' (http://aopalliance.sourceforge.net/members.html) + License(s): + Public Domain (bundled/aopalliance-1.0/LICENSE) + diff --git a/doc/licenses/aopalliance-1.0/dep-coordinates.txt b/doc/licenses/aopalliance-1.0/dep-coordinates.txt new file mode 100644 index 0000000..a71b4a4 --- /dev/null +++ b/doc/licenses/aopalliance-1.0/dep-coordinates.txt @@ -0,0 +1 @@ +aopalliance:aopalliance:jar:1.0 diff --git a/doc/licenses/apache-commons-1.16.0/NOTICE b/doc/licenses/apache-commons-1.16.0/NOTICE new file mode 100644 index 0000000..639cd1f --- /dev/null +++ b/doc/licenses/apache-commons-1.16.0/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Codec +Copyright 2002-2023 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/licenses/apache-commons-1.16.0/README b/doc/licenses/apache-commons-1.16.0/README new file mode 100644 index 0000000..3a59af7 --- /dev/null +++ b/doc/licenses/apache-commons-1.16.0/README @@ -0,0 +1,8 @@ +Apache Commons Codec (http://commons.apache.org/proper/commons-codec/) +----------------------------------------------------------------------- + + Version: 1.16.0 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-1.16.0/dep-coordinates.txt b/doc/licenses/apache-commons-1.16.0/dep-coordinates.txt new file mode 100644 index 0000000..9d5153d --- /dev/null +++ b/doc/licenses/apache-commons-1.16.0/dep-coordinates.txt @@ -0,0 +1 @@ +commons-codec:commons-codec:jar:1.16.0 diff --git a/doc/licenses/apache-commons-1.17.1/NOTICE b/doc/licenses/apache-commons-1.17.1/NOTICE new file mode 100644 index 0000000..e6d6ef3 --- /dev/null +++ b/doc/licenses/apache-commons-1.17.1/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Codec +Copyright 2002-2024 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/licenses/apache-commons-1.17.1/README b/doc/licenses/apache-commons-1.17.1/README new file mode 100644 index 0000000..7abb268 --- /dev/null +++ b/doc/licenses/apache-commons-1.17.1/README @@ -0,0 +1,7 @@ +Apache Commons Codec (http://commons.apache.org/proper/commons-codec/) +----------------------------------------------------------------------- + + Version: 1.17.1 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 diff --git a/doc/licenses/apache-commons-1.17.1/dep-coordinates.txt b/doc/licenses/apache-commons-1.17.1/dep-coordinates.txt new file mode 100644 index 0000000..4cffe47 --- /dev/null +++ b/doc/licenses/apache-commons-1.17.1/dep-coordinates.txt @@ -0,0 +1 @@ +commons-codec:commons-codec:jar:1.17.1 diff --git a/doc/licenses/apache-commons-beanutils-1.7.0/NOTICE b/doc/licenses/apache-commons-beanutils-1.7.0/NOTICE new file mode 100644 index 0000000..3f59805 --- /dev/null +++ b/doc/licenses/apache-commons-beanutils-1.7.0/NOTICE @@ -0,0 +1,2 @@ +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-beanutils-1.7.0/README b/doc/licenses/apache-commons-beanutils-1.7.0/README new file mode 100644 index 0000000..e539765 --- /dev/null +++ b/doc/licenses/apache-commons-beanutils-1.7.0/README @@ -0,0 +1,9 @@ +Apache Commons BeanUtils +(http://commons.apache.org/proper/commons-beanutils/) +----------------------------------------------------- + + Version: 1.7.0 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-beanutils-1.7.0/dep-coordinates.txt b/doc/licenses/apache-commons-beanutils-1.7.0/dep-coordinates.txt new file mode 100644 index 0000000..3a5903c --- /dev/null +++ b/doc/licenses/apache-commons-beanutils-1.7.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +commons-beanutils:commons-beanutils-core:jar:1.7.0 +commons-beanutils:commons-beanutils:jar:1.7.0 diff --git a/doc/licenses/apache-commons-chain-1.2/NOTICE b/doc/licenses/apache-commons-chain-1.2/NOTICE new file mode 100644 index 0000000..5f13f1e --- /dev/null +++ b/doc/licenses/apache-commons-chain-1.2/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Chain +Copyright 2003-2008 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-chain-1.2/README b/doc/licenses/apache-commons-chain-1.2/README new file mode 100644 index 0000000..50c81fc --- /dev/null +++ b/doc/licenses/apache-commons-chain-1.2/README @@ -0,0 +1,9 @@ +Apache Commons Chain +(http://commons.apache.org/proper/commons-chain/) +------------------------------------------------- + + Version: 1.2 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-chain-1.2/dep-coordinates.txt b/doc/licenses/apache-commons-chain-1.2/dep-coordinates.txt new file mode 100644 index 0000000..c3c7127 --- /dev/null +++ b/doc/licenses/apache-commons-chain-1.2/dep-coordinates.txt @@ -0,0 +1 @@ +commons-chain:commons-chain:jar:1.2 diff --git a/doc/licenses/apache-commons-codec-1.11/NOTICE b/doc/licenses/apache-commons-codec-1.11/NOTICE new file mode 100644 index 0000000..9899d21 --- /dev/null +++ b/doc/licenses/apache-commons-codec-1.11/NOTICE @@ -0,0 +1,17 @@ +Apache Commons Codec +Copyright 2002-2020 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). + +src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java +contains test data from http://aspell.net/test/orig/batch0.tab. +Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org) + +=============================================================================== + +The content of package org.apache.commons.codec.language.bm has been translated +from the original php source code available at http://stevemorse.org/phoneticinfo.htm +with permission from the original authors. +Original source copyright: +Copyright (c) 2008 Alexander Beider & Stephen P. Morse. diff --git a/doc/licenses/apache-commons-codec-1.11/README b/doc/licenses/apache-commons-codec-1.11/README new file mode 100644 index 0000000..1c9959a --- /dev/null +++ b/doc/licenses/apache-commons-codec-1.11/README @@ -0,0 +1,8 @@ +Apache Commons Codec (http://commons.apache.org/proper/commons-codec/) +----------------------------------------------------------------------- + + Version: 1.11 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-codec-1.11/dep-coordinates.txt b/doc/licenses/apache-commons-codec-1.11/dep-coordinates.txt new file mode 100644 index 0000000..6eaa2d0 --- /dev/null +++ b/doc/licenses/apache-commons-codec-1.11/dep-coordinates.txt @@ -0,0 +1 @@ +commons-codec:commons-codec:jar:1.11 \ No newline at end of file diff --git a/doc/licenses/apache-commons-collections-3.2.2/NOTICE b/doc/licenses/apache-commons-collections-3.2.2/NOTICE new file mode 100644 index 0000000..3f59805 --- /dev/null +++ b/doc/licenses/apache-commons-collections-3.2.2/NOTICE @@ -0,0 +1,2 @@ +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-collections-3.2.2/README b/doc/licenses/apache-commons-collections-3.2.2/README new file mode 100644 index 0000000..3274230 --- /dev/null +++ b/doc/licenses/apache-commons-collections-3.2.2/README @@ -0,0 +1,9 @@ +Apache Commons Collections +(http://commons.apache.org/proper/commons-collections/) +------------------------------------------------------- + + Version: 3.2.2 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-collections-3.2.2/dep-coordinates.txt b/doc/licenses/apache-commons-collections-3.2.2/dep-coordinates.txt new file mode 100644 index 0000000..2daf6e6 --- /dev/null +++ b/doc/licenses/apache-commons-collections-3.2.2/dep-coordinates.txt @@ -0,0 +1 @@ +commons-collections:commons-collections:jar:3.2.2 diff --git a/doc/licenses/apache-commons-collections-4.4/NOTICE b/doc/licenses/apache-commons-collections-4.4/NOTICE new file mode 100644 index 0000000..8b11c65 --- /dev/null +++ b/doc/licenses/apache-commons-collections-4.4/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Collections +Copyright 2001-2019 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-collections-4.4/README b/doc/licenses/apache-commons-collections-4.4/README new file mode 100644 index 0000000..929d3e3 --- /dev/null +++ b/doc/licenses/apache-commons-collections-4.4/README @@ -0,0 +1,9 @@ +Apache Commons Collections +(http://commons.apache.org/proper/commons-collections/) +------------------------------------------------------- + + Version: 4.4 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-collections-4.4/dep-coordinates.txt b/doc/licenses/apache-commons-collections-4.4/dep-coordinates.txt new file mode 100644 index 0000000..4e26938 --- /dev/null +++ b/doc/licenses/apache-commons-collections-4.4/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.commons:commons-collections4:jar:4.4 diff --git a/doc/licenses/apache-commons-configuration-1.5/NOTICE b/doc/licenses/apache-commons-configuration-1.5/NOTICE new file mode 100644 index 0000000..9a8ddbc --- /dev/null +++ b/doc/licenses/apache-commons-configuration-1.5/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Configuration +Copyright 2001-2007 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-configuration-1.5/README b/doc/licenses/apache-commons-configuration-1.5/README new file mode 100644 index 0000000..96f1af0 --- /dev/null +++ b/doc/licenses/apache-commons-configuration-1.5/README @@ -0,0 +1,9 @@ +Apache Commons Configuration +(http://commons.apache.org/proper/commons-configuration/) +--------------------------------------------------------- + + Version: 1.5 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-configuration-1.5/dep-coordinates.txt b/doc/licenses/apache-commons-configuration-1.5/dep-coordinates.txt new file mode 100644 index 0000000..711e046 --- /dev/null +++ b/doc/licenses/apache-commons-configuration-1.5/dep-coordinates.txt @@ -0,0 +1 @@ +commons-configuration:commons-configuration:jar:1.5 diff --git a/doc/licenses/apache-commons-digester-1.8/NOTICE b/doc/licenses/apache-commons-digester-1.8/NOTICE new file mode 100644 index 0000000..c558546 --- /dev/null +++ b/doc/licenses/apache-commons-digester-1.8/NOTICE @@ -0,0 +1,5 @@ +Apache Jakarta Commons Digester +Copyright 2001-2006 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-digester-1.8/README b/doc/licenses/apache-commons-digester-1.8/README new file mode 100644 index 0000000..9c5e0be --- /dev/null +++ b/doc/licenses/apache-commons-digester-1.8/README @@ -0,0 +1,9 @@ +Apache Commons Digester +(http://commons.apache.org/proper/commons-digester/) +---------------------------------------------------- + + Version: 1.8 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-digester-1.8/dep-coordinates.txt b/doc/licenses/apache-commons-digester-1.8/dep-coordinates.txt new file mode 100644 index 0000000..eed4216 --- /dev/null +++ b/doc/licenses/apache-commons-digester-1.8/dep-coordinates.txt @@ -0,0 +1 @@ +commons-digester:commons-digester:jar:1.8 diff --git a/doc/licenses/apache-commons-lang-2.3/NOTICE b/doc/licenses/apache-commons-lang-2.3/NOTICE new file mode 100644 index 0000000..c02268f --- /dev/null +++ b/doc/licenses/apache-commons-lang-2.3/NOTICE @@ -0,0 +1,5 @@ +Apache Jakarta Commons Lang +Copyright 2001-2007 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-commons-lang-2.3/README b/doc/licenses/apache-commons-lang-2.3/README new file mode 100644 index 0000000..98aca67 --- /dev/null +++ b/doc/licenses/apache-commons-lang-2.3/README @@ -0,0 +1,8 @@ +Apache Commons Lang (http://commons.apache.org/proper/commons-lang/) +-------------------------------------------------------------------- + + Version: 2.3 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-lang-2.3/dep-coordinates.txt b/doc/licenses/apache-commons-lang-2.3/dep-coordinates.txt new file mode 100644 index 0000000..0dd7a39 --- /dev/null +++ b/doc/licenses/apache-commons-lang-2.3/dep-coordinates.txt @@ -0,0 +1 @@ +commons-lang:commons-lang:jar:2.3 diff --git a/doc/licenses/apache-commons-lang-3.17.0/NOTICE b/doc/licenses/apache-commons-lang-3.17.0/NOTICE new file mode 100644 index 0000000..307ec45 --- /dev/null +++ b/doc/licenses/apache-commons-lang-3.17.0/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Lang +Copyright 2001-2023 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/licenses/apache-commons-lang-3.17.0/README b/doc/licenses/apache-commons-lang-3.17.0/README new file mode 100644 index 0000000..a76f1d9 --- /dev/null +++ b/doc/licenses/apache-commons-lang-3.17.0/README @@ -0,0 +1,7 @@ +Apache Commons Lang (http://commons.apache.org/proper/commons-lang/) +-------------------------------------------------------------------- + + Version: 3.17.0 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 diff --git a/doc/licenses/apache-commons-lang-3.17.0/dep-coordinates.txt b/doc/licenses/apache-commons-lang-3.17.0/dep-coordinates.txt new file mode 100644 index 0000000..7f6ac3b --- /dev/null +++ b/doc/licenses/apache-commons-lang-3.17.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.commons:commons-lang3:jar:3.17.0 diff --git a/doc/licenses/apache-commons-logging-1.2/NOTICE b/doc/licenses/apache-commons-logging-1.2/NOTICE new file mode 100644 index 0000000..556bd03 --- /dev/null +++ b/doc/licenses/apache-commons-logging-1.2/NOTICE @@ -0,0 +1,6 @@ +Apache Commons Logging +Copyright 2003-2014 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + diff --git a/doc/licenses/apache-commons-logging-1.2/README b/doc/licenses/apache-commons-logging-1.2/README new file mode 100644 index 0000000..de1c3c0 --- /dev/null +++ b/doc/licenses/apache-commons-logging-1.2/README @@ -0,0 +1,9 @@ +Apache Commons Logging +(http://commons.apache.org/proper/commons-logging/) +--------------------------------------------------- + + Version: 1.2 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-logging-1.2/dep-coordinates.txt b/doc/licenses/apache-commons-logging-1.2/dep-coordinates.txt new file mode 100644 index 0000000..d475f7c --- /dev/null +++ b/doc/licenses/apache-commons-logging-1.2/dep-coordinates.txt @@ -0,0 +1 @@ +commons-logging:commons-logging:jar:1.2 diff --git a/doc/licenses/apache-commons-pool-1.5.4/NOTICE b/doc/licenses/apache-commons-pool-1.5.4/NOTICE new file mode 100644 index 0000000..27a64ec --- /dev/null +++ b/doc/licenses/apache-commons-pool-1.5.4/NOTICE @@ -0,0 +1,12 @@ +Apache Commons Pool +Copyright 1999-2009 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + + APACHE COMMONS POOL DERIVATIVE WORKS: + + The LinkedBlockingDeque implementation is based on an implementation written by + Doug Lea with assistance from members of JCP JSR-166 Expert Group and released + to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain diff --git a/doc/licenses/apache-commons-pool-1.5.4/README b/doc/licenses/apache-commons-pool-1.5.4/README new file mode 100644 index 0000000..54d7fd7 --- /dev/null +++ b/doc/licenses/apache-commons-pool-1.5.4/README @@ -0,0 +1,8 @@ +Apache Commons Pool (http://commons.apache.org/proper/commons-pool/) +-------------------------------------------------------------------- + + Version: 1.5.4 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-pool-1.5.4/dep-coordinates.txt b/doc/licenses/apache-commons-pool-1.5.4/dep-coordinates.txt new file mode 100644 index 0000000..6b185bc --- /dev/null +++ b/doc/licenses/apache-commons-pool-1.5.4/dep-coordinates.txt @@ -0,0 +1 @@ +commons-pool:commons-pool:jar:1.5.4 diff --git a/doc/licenses/apache-commons-pool-2.12.0/NOTICE b/doc/licenses/apache-commons-pool-2.12.0/NOTICE new file mode 100644 index 0000000..2c90b43 --- /dev/null +++ b/doc/licenses/apache-commons-pool-2.12.0/NOTICE @@ -0,0 +1,5 @@ +Apache Commons Pool +Copyright 2001-2023 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/licenses/apache-commons-pool-2.12.0/README b/doc/licenses/apache-commons-pool-2.12.0/README new file mode 100644 index 0000000..18db98e --- /dev/null +++ b/doc/licenses/apache-commons-pool-2.12.0/README @@ -0,0 +1,8 @@ +Apache Commons Pool (http://commons.apache.org/proper/commons-pool/) +-------------------------------------------------------------------- + + Version: 2.12.0 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-commons-pool-2.12.0/dep-coordinates.txt b/doc/licenses/apache-commons-pool-2.12.0/dep-coordinates.txt new file mode 100644 index 0000000..07edda2 --- /dev/null +++ b/doc/licenses/apache-commons-pool-2.12.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.commons:commons-pool2:jar:2.12.0 diff --git a/doc/licenses/apache-commons-text-1.12.0/NOTICE.txt b/doc/licenses/apache-commons-text-1.12.0/NOTICE.txt new file mode 100644 index 0000000..a4c26c8 --- /dev/null +++ b/doc/licenses/apache-commons-text-1.12.0/NOTICE.txt @@ -0,0 +1,5 @@ +Apache Commons Text +Copyright 2014-2023 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/licenses/apache-commons-text-1.12.0/README b/doc/licenses/apache-commons-text-1.12.0/README new file mode 100644 index 0000000..1353cfb --- /dev/null +++ b/doc/licenses/apache-commons-text-1.12.0/README @@ -0,0 +1,7 @@ +Apache Commons Text (https://commons.apache.org/proper/commons-text/) +--------------------------------------------------------------------- + + Version: 1.12.0 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 diff --git a/doc/licenses/apache-commons-text-1.12.0/dep-coordinates.txt b/doc/licenses/apache-commons-text-1.12.0/dep-coordinates.txt new file mode 100644 index 0000000..94c23bc --- /dev/null +++ b/doc/licenses/apache-commons-text-1.12.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.commons:commons-text:jar:1.12.0 diff --git a/doc/licenses/apache-mina-2.2.4/NOTICE b/doc/licenses/apache-mina-2.2.4/NOTICE new file mode 100644 index 0000000..8bbb455 --- /dev/null +++ b/doc/licenses/apache-mina-2.2.4/NOTICE @@ -0,0 +1,5 @@ +Apache MINA +Copyright 2007-2023 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/doc/licenses/apache-mina-2.2.4/README b/doc/licenses/apache-mina-2.2.4/README new file mode 100644 index 0000000..5c2d8b3 --- /dev/null +++ b/doc/licenses/apache-mina-2.2.4/README @@ -0,0 +1,8 @@ +Apache Mina (https://mina.apache.org/) +-------------------------------------- + + Version: 2.2.4 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/apache-mina-2.2.4/dep-coordinates.txt b/doc/licenses/apache-mina-2.2.4/dep-coordinates.txt new file mode 100644 index 0000000..f61bc9a --- /dev/null +++ b/doc/licenses/apache-mina-2.2.4/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.mina:mina-core:jar:2.2.4 diff --git a/doc/licenses/apache-santuario-2.2.6/NOTICE b/doc/licenses/apache-santuario-2.2.6/NOTICE new file mode 100644 index 0000000..2635c16 --- /dev/null +++ b/doc/licenses/apache-santuario-2.2.6/NOTICE @@ -0,0 +1,14 @@ +Apache Santuario - XML Security for Java +Copyright 1999-2022 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +It was originally based on software copyright (c) 2001, Institute for +Data Communications Systems, . + +The development of this software was partly funded by the European +Commission in the project in the ISIS Programme. + +This product contains software that is +copyright (c) 2021, Oracle and/or its affiliates. diff --git a/doc/licenses/apache-santuario-2.2.6/README b/doc/licenses/apache-santuario-2.2.6/README new file mode 100644 index 0000000..8ccae43 --- /dev/null +++ b/doc/licenses/apache-santuario-2.2.6/README @@ -0,0 +1,7 @@ +Apache Santuario (https://santuario.apache.org/) +------------------------------------------------- + + Version: 2.2.6 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 diff --git a/doc/licenses/apache-santuario-2.2.6/dep-coordinates.txt b/doc/licenses/apache-santuario-2.2.6/dep-coordinates.txt new file mode 100644 index 0000000..0a6929d --- /dev/null +++ b/doc/licenses/apache-santuario-2.2.6/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.santuario:xmlsec:jar:2.2.6 diff --git a/doc/licenses/assert-1.5.0/LICENSE b/doc/licenses/assert-1.5.0/LICENSE new file mode 100644 index 0000000..e3d4e69 --- /dev/null +++ b/doc/licenses/assert-1.5.0/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/doc/licenses/assert-1.5.0/README b/doc/licenses/assert-1.5.0/README new file mode 100644 index 0000000..9b986ae --- /dev/null +++ b/doc/licenses/assert-1.5.0/README @@ -0,0 +1,8 @@ +assert (https://github.com/browserify/commonjs-assert/) +------------------------------------------------------- + + Version: 1.5.0 + From: 'Joyent, Inc. and other Node contributors' + License(s): + MIT (bundled/assert-1.5.0/LICENSE) + diff --git a/doc/licenses/assert-1.5.0/dep-coordinates.txt b/doc/licenses/assert-1.5.0/dep-coordinates.txt new file mode 100644 index 0000000..d0bf923 --- /dev/null +++ b/doc/licenses/assert-1.5.0/dep-coordinates.txt @@ -0,0 +1 @@ +assert:1.5.0 diff --git a/doc/licenses/base64-js-1.5.1/LICENSE b/doc/licenses/base64-js-1.5.1/LICENSE new file mode 100644 index 0000000..9143d4c --- /dev/null +++ b/doc/licenses/base64-js-1.5.1/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014 Jameson Little + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +Footer diff --git a/doc/licenses/base64-js-1.5.1/README b/doc/licenses/base64-js-1.5.1/README new file mode 100644 index 0000000..6cacd8f --- /dev/null +++ b/doc/licenses/base64-js-1.5.1/README @@ -0,0 +1,8 @@ +base64-js (https://github.com/beatgammit/base64-js) +--------------------------------------------- + + Version: 1.5.1 + From: 'Jameson Little' (https://github.com/beatgammit/) + License(s): + MIT (bundled/base640-js-1.5.1/LICENSE) + diff --git a/doc/licenses/base64-js-1.5.1/dep-coordinates.txt b/doc/licenses/base64-js-1.5.1/dep-coordinates.txt new file mode 100644 index 0000000..1d66ee8 --- /dev/null +++ b/doc/licenses/base64-js-1.5.1/dep-coordinates.txt @@ -0,0 +1 @@ +base64-js:1.5.1 diff --git a/doc/licenses/blob-polyfill-9.0.20240710/LICENSE.md b/doc/licenses/blob-polyfill-9.0.20240710/LICENSE.md new file mode 100644 index 0000000..daae0b0 --- /dev/null +++ b/doc/licenses/blob-polyfill-9.0.20240710/LICENSE.md @@ -0,0 +1,25 @@ +Copyright © 2014 [Eli Grey][1]. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + + [1]: http://eligrey.com diff --git a/doc/licenses/blob-polyfill-9.0.20240710/README b/doc/licenses/blob-polyfill-9.0.20240710/README new file mode 100644 index 0000000..e2f565e --- /dev/null +++ b/doc/licenses/blob-polyfill-9.0.20240710/README @@ -0,0 +1,7 @@ +Blob.js (https://github.com/eligrey/Blob.js/) +--------------------------------------------- + + Version: 9.0.20240710 + From: 'Eli Grey' (https://github.com/eligrey) + License(s): + MIT (bundled/blob-polyfill-9.0.20240710/LICENSE.md) diff --git a/doc/licenses/blob-polyfill-9.0.20240710/dep-coordinates.txt b/doc/licenses/blob-polyfill-9.0.20240710/dep-coordinates.txt new file mode 100644 index 0000000..c4a3b1b --- /dev/null +++ b/doc/licenses/blob-polyfill-9.0.20240710/dep-coordinates.txt @@ -0,0 +1 @@ +blob-polyfill:9.0.20240710 diff --git a/doc/licenses/bouncycastle-1.44/LICENSE b/doc/licenses/bouncycastle-1.44/LICENSE new file mode 100644 index 0000000..15c29d9 --- /dev/null +++ b/doc/licenses/bouncycastle-1.44/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2000 - 2016 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/bouncycastle-1.44/README b/doc/licenses/bouncycastle-1.44/README new file mode 100644 index 0000000..277ab21 --- /dev/null +++ b/doc/licenses/bouncycastle-1.44/README @@ -0,0 +1,8 @@ +BouncyCastle Crypto (https://www.bouncycastle.org/java.html) +------------------------------------------------------------ + + Version: 1.44 + From: 'The Legion of Bouncy Castle' (https://www.bouncycastle.org) + License(s): + MIT (bundled/bouncycastle-1.44/LICENSE + diff --git a/doc/licenses/bouncycastle-1.44/dep-coordinates.txt b/doc/licenses/bouncycastle-1.44/dep-coordinates.txt new file mode 100644 index 0000000..707d6d9 --- /dev/null +++ b/doc/licenses/bouncycastle-1.44/dep-coordinates.txt @@ -0,0 +1 @@ +org.bouncycastle:bcprov-jdk15:jar:1.44 diff --git a/doc/licenses/bouncycastle-1.80/LICENSE b/doc/licenses/bouncycastle-1.80/LICENSE new file mode 100644 index 0000000..fe843e9 --- /dev/null +++ b/doc/licenses/bouncycastle-1.80/LICENSE @@ -0,0 +1,18 @@ +Copyright (c) 2000-2024 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sub license, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright +notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/bouncycastle-1.80/README b/doc/licenses/bouncycastle-1.80/README new file mode 100644 index 0000000..6e9a57a --- /dev/null +++ b/doc/licenses/bouncycastle-1.80/README @@ -0,0 +1,7 @@ +BouncyCastle Crypto (https://www.bouncycastle.org/java.html) +------------------------------------------------------------ + + Version: 1.80 + From: 'The Legion of Bouncy Castle' (https://www.bouncycastle.org) + License(s): + MIT (bundled/bouncycastle-1.80/LICENSE) diff --git a/doc/licenses/bouncycastle-1.80/dep-coordinates.txt b/doc/licenses/bouncycastle-1.80/dep-coordinates.txt new file mode 100644 index 0000000..9c1d76e --- /dev/null +++ b/doc/licenses/bouncycastle-1.80/dep-coordinates.txt @@ -0,0 +1,3 @@ +org.bouncycastle:bcpkix-jdk15to18:jar:1.80 +org.bouncycastle:bcprov-jdk15to18:jar:1.80 +org.bouncycastle:bcutil-jdk15to18:jar:1.80 diff --git a/doc/licenses/bouncycastle-fips-2.1.0/LICENSE b/doc/licenses/bouncycastle-fips-2.1.0/LICENSE new file mode 100644 index 0000000..6130142 --- /dev/null +++ b/doc/licenses/bouncycastle-fips-2.1.0/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2000 - 2023 The Legion of the Bouncy Castle Inc. +(https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/bouncycastle-fips-2.1.0/README b/doc/licenses/bouncycastle-fips-2.1.0/README new file mode 100644 index 0000000..0067750 --- /dev/null +++ b/doc/licenses/bouncycastle-fips-2.1.0/README @@ -0,0 +1,7 @@ +BouncyCastle FIPS Distribution (https://www.bouncycastle.org/fips-java) +----------------------------------------------------------------------- + + Version: 2.1.0 + From: 'The Legion of Bouncy Castle' (https://www.bouncycastle.org) + License(s): + MIT (bundled/bouncycastle-fips-2.1.0/LICENSE) diff --git a/doc/licenses/bouncycastle-fips-2.1.0/dep-coordinates.txt b/doc/licenses/bouncycastle-fips-2.1.0/dep-coordinates.txt new file mode 100644 index 0000000..4481ae6 --- /dev/null +++ b/doc/licenses/bouncycastle-fips-2.1.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.bouncycastle:bc-fips:jar:2.1.0 diff --git a/doc/licenses/bouncycastle-pkix-fips-2.1.9/LICENSE b/doc/licenses/bouncycastle-pkix-fips-2.1.9/LICENSE new file mode 100644 index 0000000..a02bc17 --- /dev/null +++ b/doc/licenses/bouncycastle-pkix-fips-2.1.9/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2000 - 2021 The Legion of the Bouncy Castle Inc. +(https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/bouncycastle-pkix-fips-2.1.9/README b/doc/licenses/bouncycastle-pkix-fips-2.1.9/README new file mode 100644 index 0000000..aec5036 --- /dev/null +++ b/doc/licenses/bouncycastle-pkix-fips-2.1.9/README @@ -0,0 +1,7 @@ +BouncyCastle PKIX APIs, FIPS Distribution (https://www.bouncycastle.org/fips-java) +----------------------------------------------------------------------- + + Version: 2.1.9 + From: 'The Legion of Bouncy Castle' (https://www.bouncycastle.org) + License(s): + MIT (bundled/bouncycastle-pkix-fips-2.1.9/LICENSE) diff --git a/doc/licenses/bouncycastle-pkix-fips-2.1.9/dep-coordinates.txt b/doc/licenses/bouncycastle-pkix-fips-2.1.9/dep-coordinates.txt new file mode 100644 index 0000000..1dcbd9d --- /dev/null +++ b/doc/licenses/bouncycastle-pkix-fips-2.1.9/dep-coordinates.txt @@ -0,0 +1 @@ +org.bouncycastle:bcpkix-fips:jar:2.1.9 diff --git a/doc/licenses/bouncycastle-util-fips-2.1.4/LICENSE b/doc/licenses/bouncycastle-util-fips-2.1.4/LICENSE new file mode 100644 index 0000000..6130142 --- /dev/null +++ b/doc/licenses/bouncycastle-util-fips-2.1.4/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2000 - 2023 The Legion of the Bouncy Castle Inc. +(https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/bouncycastle-util-fips-2.1.4/README b/doc/licenses/bouncycastle-util-fips-2.1.4/README new file mode 100644 index 0000000..a4ed209 --- /dev/null +++ b/doc/licenses/bouncycastle-util-fips-2.1.4/README @@ -0,0 +1,7 @@ +Bouncy Castle ASN.1 Extension and Utility APIs (https://www.bouncycastle.org/fips-java) +----------------------------------------------------------------------- + + Version: 2.1.4 + From: 'The Legion of Bouncy Castle' (https://www.bouncycastle.org) + License(s): + MIT (bundled/bouncycastle-fips-2.1.4/LICENSE) diff --git a/doc/licenses/bouncycastle-util-fips-2.1.4/dep-coordinates.txt b/doc/licenses/bouncycastle-util-fips-2.1.4/dep-coordinates.txt new file mode 100644 index 0000000..a7704c1 --- /dev/null +++ b/doc/licenses/bouncycastle-util-fips-2.1.4/dep-coordinates.txt @@ -0,0 +1 @@ +org.bouncycastle:bcutil-fips:jar:2.1.4 diff --git a/doc/licenses/buffer-4.9.2/LICENSE b/doc/licenses/buffer-4.9.2/LICENSE new file mode 100644 index 0000000..d6bf75d --- /dev/null +++ b/doc/licenses/buffer-4.9.2/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh, and other contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/doc/licenses/buffer-4.9.2/README b/doc/licenses/buffer-4.9.2/README new file mode 100644 index 0000000..7caad56 --- /dev/null +++ b/doc/licenses/buffer-4.9.2/README @@ -0,0 +1,7 @@ +buffer (https://github.com/feross/buffer) +--------------------------------------------- + + Version: 4.9.2 + From: 'Feross Aboukhadijeh' (https://github.com/feross) + License(s): + MIT (bundled/buffer-4.9.2/LICENSE) diff --git a/doc/licenses/buffer-4.9.2/dep-coordinates.txt b/doc/licenses/buffer-4.9.2/dep-coordinates.txt new file mode 100644 index 0000000..30f193d --- /dev/null +++ b/doc/licenses/buffer-4.9.2/dep-coordinates.txt @@ -0,0 +1 @@ +buffer:4.9.2 diff --git a/doc/licenses/byte-buddy-1.15.4/NOTICE b/doc/licenses/byte-buddy-1.15.4/NOTICE new file mode 100644 index 0000000..929cbc6 --- /dev/null +++ b/doc/licenses/byte-buddy-1.15.4/NOTICE @@ -0,0 +1,13 @@ +Copyright 2014 - Present Rafael Winterhalter + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/doc/licenses/byte-buddy-1.15.4/README b/doc/licenses/byte-buddy-1.15.4/README new file mode 100644 index 0000000..dd349a4 --- /dev/null +++ b/doc/licenses/byte-buddy-1.15.4/README @@ -0,0 +1,8 @@ +Byte Buddy (https://bytebuddy.net/) +----------------------------------- + + Version: 1.15.4 + From: 'Rafael Winterhalter' (https://github.com/raphw) + License(s): + Apache v2.0 + diff --git a/doc/licenses/byte-buddy-1.15.4/dep-coordinates.txt b/doc/licenses/byte-buddy-1.15.4/dep-coordinates.txt new file mode 100644 index 0000000..968d744 --- /dev/null +++ b/doc/licenses/byte-buddy-1.15.4/dep-coordinates.txt @@ -0,0 +1 @@ +net.bytebuddy:byte-buddy:jar:1.15.4 diff --git a/doc/licenses/caffeine-2.9.3/README b/doc/licenses/caffeine-2.9.3/README new file mode 100644 index 0000000..5336c72 --- /dev/null +++ b/doc/licenses/caffeine-2.9.3/README @@ -0,0 +1,7 @@ +Caffeine (https://github.com/ben-manes/caffeine) +------------------------------------------------ + + Version: 2.9.3 + From: 'Ben Manes' (https://github.com/ben-manes) + License(s): + Apache v2.0 diff --git a/doc/licenses/caffeine-2.9.3/dep-coordinates.txt b/doc/licenses/caffeine-2.9.3/dep-coordinates.txt new file mode 100644 index 0000000..feda8aa --- /dev/null +++ b/doc/licenses/caffeine-2.9.3/dep-coordinates.txt @@ -0,0 +1 @@ +com.github.ben-manes.caffeine:caffeine:jar:2.9.3 diff --git a/doc/licenses/cas-client-3.6.4/NOTICE b/doc/licenses/cas-client-3.6.4/NOTICE new file mode 100644 index 0000000..a699597 --- /dev/null +++ b/doc/licenses/cas-client-3.6.4/NOTICE @@ -0,0 +1,2 @@ +This project includes: + Jasig CAS Client for Java - Core under Apache License Version 2.0 diff --git a/doc/licenses/cas-client-3.6.4/README b/doc/licenses/cas-client-3.6.4/README new file mode 100644 index 0000000..d89fe50 --- /dev/null +++ b/doc/licenses/cas-client-3.6.4/README @@ -0,0 +1,8 @@ +Java Apereo CAS Client (https://www.apereo.org/projects/cas) +------------------------------------------------------------ + + Version: 3.6.4 + From: 'Apereo Foundation' (https://www.apereo.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/cas-client-3.6.4/dep-coordinates.txt b/doc/licenses/cas-client-3.6.4/dep-coordinates.txt new file mode 100644 index 0000000..24e2e6d --- /dev/null +++ b/doc/licenses/cas-client-3.6.4/dep-coordinates.txt @@ -0,0 +1 @@ +org.jasig.cas.client:cas-client-core:jar:3.6.4 diff --git a/doc/licenses/checker-qual-3.19.0/LICENSE.txt b/doc/licenses/checker-qual-3.19.0/LICENSE.txt new file mode 100644 index 0000000..9837c6b --- /dev/null +++ b/doc/licenses/checker-qual-3.19.0/LICENSE.txt @@ -0,0 +1,22 @@ +Checker Framework qualifiers +Copyright 2004-present by the Checker Framework developers + +MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/doc/licenses/checker-qual-3.19.0/README b/doc/licenses/checker-qual-3.19.0/README new file mode 100644 index 0000000..4a00db7 --- /dev/null +++ b/doc/licenses/checker-qual-3.19.0/README @@ -0,0 +1,8 @@ +Checker Framework qualifiers (https://checkerframework.org/) +------------------------------------------------------------ + + Version: 3.19.0 + From: 'Checker Framework developers' (https://checkerframework.org/) + License(s): + MIT (bundled/checker-qual-3.19.0/LICENSE.txt) + diff --git a/doc/licenses/checker-qual-3.19.0/dep-coordinates.txt b/doc/licenses/checker-qual-3.19.0/dep-coordinates.txt new file mode 100644 index 0000000..322f395 --- /dev/null +++ b/doc/licenses/checker-qual-3.19.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.checkerframework:checker-qual:jar:3.19.0 diff --git a/doc/licenses/checker-qual-3.37.0/LICENSE.txt b/doc/licenses/checker-qual-3.37.0/LICENSE.txt new file mode 100644 index 0000000..9837c6b --- /dev/null +++ b/doc/licenses/checker-qual-3.37.0/LICENSE.txt @@ -0,0 +1,22 @@ +Checker Framework qualifiers +Copyright 2004-present by the Checker Framework developers + +MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/doc/licenses/checker-qual-3.37.0/README b/doc/licenses/checker-qual-3.37.0/README new file mode 100644 index 0000000..1b4bd80 --- /dev/null +++ b/doc/licenses/checker-qual-3.37.0/README @@ -0,0 +1,8 @@ +Checker Framework qualifiers (https://checkerframework.org/) +------------------------------------------------------------ + + Version: 3.37.0 + From: 'Checker Framework developers' (https://checkerframework.org/) + License(s): + MIT (bundled/checker-qual-3.37.0/LICENSE.txt) + diff --git a/doc/licenses/checker-qual-3.37.0/dep-coordinates.txt b/doc/licenses/checker-qual-3.37.0/dep-coordinates.txt new file mode 100644 index 0000000..e6b1b4e --- /dev/null +++ b/doc/licenses/checker-qual-3.37.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.checkerframework:checker-qual:jar:3.37.0 diff --git a/doc/licenses/core-util-is-1.0.3/LICENSE b/doc/licenses/core-util-is-1.0.3/LICENSE new file mode 100644 index 0000000..d8d7f94 --- /dev/null +++ b/doc/licenses/core-util-is-1.0.3/LICENSE @@ -0,0 +1,19 @@ +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/doc/licenses/core-util-is-1.0.3/README b/doc/licenses/core-util-is-1.0.3/README new file mode 100644 index 0000000..7db6591 --- /dev/null +++ b/doc/licenses/core-util-is-1.0.3/README @@ -0,0 +1,7 @@ +core-util-is (https://github.com/isaacs/core-util-is) +--------------------------------------------- + + Version: 1.0.3 + From: 'Node.js contributors' + License(s): + MIT (bundled/core-util-is-1.0.3/LICENSE) diff --git a/doc/licenses/core-util-is-1.0.3/dep-coordinates.txt b/doc/licenses/core-util-is-1.0.3/dep-coordinates.txt new file mode 100644 index 0000000..f4b1c7a --- /dev/null +++ b/doc/licenses/core-util-is-1.0.3/dep-coordinates.txt @@ -0,0 +1 @@ +core-util-is:1.0.3 diff --git a/doc/licenses/css-loader-5.2.7/LICENSE b/doc/licenses/css-loader-5.2.7/LICENSE new file mode 100644 index 0000000..8c11fc7 --- /dev/null +++ b/doc/licenses/css-loader-5.2.7/LICENSE @@ -0,0 +1,20 @@ +Copyright JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/css-loader-5.2.7/README b/doc/licenses/css-loader-5.2.7/README new file mode 100644 index 0000000..bcbec19 --- /dev/null +++ b/doc/licenses/css-loader-5.2.7/README @@ -0,0 +1,8 @@ +css-loader (https://github.com/webpack-contrib/css-loader) +---------------------------------------------------------- + + Version: 5.2.7 + From: 'JS Foundation and other contributors' + License(s): + MIT (bundled/css-loader-5.2.7/LICENSE) + diff --git a/doc/licenses/css-loader-5.2.7/dep-coordinates.txt b/doc/licenses/css-loader-5.2.7/dep-coordinates.txt new file mode 100644 index 0000000..73a6894 --- /dev/null +++ b/doc/licenses/css-loader-5.2.7/dep-coordinates.txt @@ -0,0 +1 @@ +css-loader:5.2.7 diff --git a/doc/licenses/csv-6.3.9/LICENSE b/doc/licenses/csv-6.3.9/LICENSE new file mode 100644 index 0000000..918eaf0 --- /dev/null +++ b/doc/licenses/csv-6.3.9/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010 Adaltas + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/csv-6.3.9/README b/doc/licenses/csv-6.3.9/README new file mode 100644 index 0000000..691f87f --- /dev/null +++ b/doc/licenses/csv-6.3.9/README @@ -0,0 +1,7 @@ +node-csv (https://github.com/adaltas/node-csv) +--------------------------------------------- + + Version: 6.3.9 + From: 'Adaltas' (https://github.com/adaltas) + License(s): + MIT (bundled/csv-6.3.9/LICENSE) diff --git a/doc/licenses/csv-6.3.9/dep-coordinates.txt b/doc/licenses/csv-6.3.9/dep-coordinates.txt new file mode 100644 index 0000000..53c4367 --- /dev/null +++ b/doc/licenses/csv-6.3.9/dep-coordinates.txt @@ -0,0 +1,2 @@ +csv:6.3.9 +csv-parse:5.5.6 diff --git a/doc/licenses/d3-path-3.1.0/LICENSE b/doc/licenses/d3-path-3.1.0/LICENSE new file mode 100644 index 0000000..ed25746 --- /dev/null +++ b/doc/licenses/d3-path-3.1.0/LICENSE @@ -0,0 +1,13 @@ +Copyright 2015-2022 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/doc/licenses/d3-path-3.1.0/README b/doc/licenses/d3-path-3.1.0/README new file mode 100644 index 0000000..5bbf02a --- /dev/null +++ b/doc/licenses/d3-path-3.1.0/README @@ -0,0 +1,8 @@ +d3-path (https://github.com/d3/d3-path) +---------------------------------------------------------- + + Version: 3.1.0 + From: 'Mike Bostock' + License(s): + BSD 0-clause (bundled/d3-path-3.1.0/LICENSE) + diff --git a/doc/licenses/d3-path-3.1.0/dep-coordinates.txt b/doc/licenses/d3-path-3.1.0/dep-coordinates.txt new file mode 100644 index 0000000..5159b4e --- /dev/null +++ b/doc/licenses/d3-path-3.1.0/dep-coordinates.txt @@ -0,0 +1 @@ +d3-path:3.1.0 diff --git a/doc/licenses/d3-shape-3.2.0/LICENSE b/doc/licenses/d3-shape-3.2.0/LICENSE new file mode 100644 index 0000000..fbe44bd --- /dev/null +++ b/doc/licenses/d3-shape-3.2.0/LICENSE @@ -0,0 +1,13 @@ +Copyright 2010-2022 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/doc/licenses/d3-shape-3.2.0/README b/doc/licenses/d3-shape-3.2.0/README new file mode 100644 index 0000000..f0adda5 --- /dev/null +++ b/doc/licenses/d3-shape-3.2.0/README @@ -0,0 +1,8 @@ +d3-path (https://github.com/d3/d3-shape) +---------------------------------------------------------- + + Version: 3.2.0 + From: 'Mike Bostock' + License(s): + BSD 0-clause (bundled/d3-shape-3.2.0/LICENSE) + diff --git a/doc/licenses/d3-shape-3.2.0/dep-coordinates.txt b/doc/licenses/d3-shape-3.2.0/dep-coordinates.txt new file mode 100644 index 0000000..10973f4 --- /dev/null +++ b/doc/licenses/d3-shape-3.2.0/dep-coordinates.txt @@ -0,0 +1 @@ +d3-shape:3.2.0 diff --git a/doc/licenses/datalist-polyfill-1.25.1/LICENSE b/doc/licenses/datalist-polyfill-1.25.1/LICENSE new file mode 100644 index 0000000..8864d4a --- /dev/null +++ b/doc/licenses/datalist-polyfill-1.25.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/datalist-polyfill-1.25.1/README b/doc/licenses/datalist-polyfill-1.25.1/README new file mode 100644 index 0000000..c26d45d --- /dev/null +++ b/doc/licenses/datalist-polyfill-1.25.1/README @@ -0,0 +1,8 @@ +datalist-polyfill (https://github.com/mfranzke/datalist-polyfill) +----------------------------------------------------------------- + + Version: 1.25.1 + From: 'Maximilian Franzke' (https://github.com/mfranzke) + License(s): + MIT (bundled/datalist-polyfill-1.25.1/LICENSE) + diff --git a/doc/licenses/datalist-polyfill-1.25.1/dep-coordinates.txt b/doc/licenses/datalist-polyfill-1.25.1/dep-coordinates.txt new file mode 100644 index 0000000..40b1114 --- /dev/null +++ b/doc/licenses/datalist-polyfill-1.25.1/dep-coordinates.txt @@ -0,0 +1 @@ +datalist-polyfill:1.25.1 diff --git a/doc/licenses/directory-api-2.1.7/NOTICE b/doc/licenses/directory-api-2.1.7/NOTICE new file mode 100644 index 0000000..676a182 --- /dev/null +++ b/doc/licenses/directory-api-2.1.7/NOTICE @@ -0,0 +1,5 @@ +Apache Directory LDAP API +Copyright 2003-2023 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). diff --git a/doc/licenses/directory-api-2.1.7/README b/doc/licenses/directory-api-2.1.7/README new file mode 100644 index 0000000..172f0bf --- /dev/null +++ b/doc/licenses/directory-api-2.1.7/README @@ -0,0 +1,7 @@ +Apache Directory LDAP API (http://directory.apache.org) +------------------------------------------------------- + + Version: 2.1.6 + From: 'Apache Software Foundation' (https://www.apache.org/) + License(s): + Apache v2.0 diff --git a/doc/licenses/directory-api-2.1.7/dep-coordinates.txt b/doc/licenses/directory-api-2.1.7/dep-coordinates.txt new file mode 100644 index 0000000..170ac1f --- /dev/null +++ b/doc/licenses/directory-api-2.1.7/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.directory.api:api-all:jar:2.1.7 diff --git a/doc/licenses/dom4j-2.1.4/LICENSE b/doc/licenses/dom4j-2.1.4/LICENSE new file mode 100644 index 0000000..1a02acb --- /dev/null +++ b/doc/licenses/dom4j-2.1.4/LICENSE @@ -0,0 +1,39 @@ +Copyright 2001-2023 © MetaStuff, Ltd. and DOM4J contributors. All Rights Reserved. + +Redistribution and use of this software and associated documentation +("Software"), with or without modification, are permitted provided +that the following conditions are met: + +1. Redistributions of source code must retain copyright + statements and notices. Redistributions must also contain a + copy of this document. + +2. Redistributions in binary form must reproduce the + above copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. The name "DOM4J" must not be used to endorse or promote + products derived from this Software without prior written + permission of MetaStuff, Ltd. For written permission, + please contact dom4j-info@metastuff.com. + +4. Products derived from this Software may not be called "DOM4J" + nor may "DOM4J" appear in their names without prior written + permission of MetaStuff, Ltd. DOM4J is a registered + trademark of MetaStuff, Ltd. + +5. Due credit should be given to the DOM4J Project - https://dom4j.github.io/ + +THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/dom4j-2.1.4/README b/doc/licenses/dom4j-2.1.4/README new file mode 100644 index 0000000..15651d0 --- /dev/null +++ b/doc/licenses/dom4j-2.1.4/README @@ -0,0 +1,8 @@ +DOM4J (https://dom4j.github.io/) +-------------------------------- + + Version: 2.1.4 + From: 'MetaStuff, Ltd. and DOM4J contributors' + License(s): + DOM4J License (bundled/dom4j-2.1.4/LICENSE) + diff --git a/doc/licenses/dom4j-2.1.4/dep-coordinates.txt b/doc/licenses/dom4j-2.1.4/dep-coordinates.txt new file mode 100644 index 0000000..100eff3 --- /dev/null +++ b/doc/licenses/dom4j-2.1.4/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.servicemix.bundles:org.apache.servicemix.bundles.dom4j:jar:2.1.4_1 diff --git a/doc/licenses/duo-universal-sdk-1.2.0/LICENSE b/doc/licenses/duo-universal-sdk-1.2.0/LICENSE new file mode 100644 index 0000000..369fbf8 --- /dev/null +++ b/doc/licenses/duo-universal-sdk-1.2.0/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2022 Cisco Systems, Inc. and/or its affiliates +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/doc/licenses/duo-universal-sdk-1.2.0/README b/doc/licenses/duo-universal-sdk-1.2.0/README new file mode 100644 index 0000000..6cdc784 --- /dev/null +++ b/doc/licenses/duo-universal-sdk-1.2.0/README @@ -0,0 +1,8 @@ +Duo Universal SDK for Java (https://duo.com/docs/duoweb) +-------------------------------------------------------- + + Version: 1.2.0 + From: 'Cisco Systems' + License(s): + Duo License (bundled/duo-universal-sdk-1.2.0/LICENSE) + diff --git a/doc/licenses/duo-universal-sdk-1.2.0/dep-coordinates.txt b/doc/licenses/duo-universal-sdk-1.2.0/dep-coordinates.txt new file mode 100644 index 0000000..70795a7 --- /dev/null +++ b/doc/licenses/duo-universal-sdk-1.2.0/dep-coordinates.txt @@ -0,0 +1 @@ +com.duosecurity:duo-universal-sdk:jar:1.2.0 diff --git a/doc/licenses/ehcache-2.4.0/README b/doc/licenses/ehcache-2.4.0/README new file mode 100644 index 0000000..fe82e17 --- /dev/null +++ b/doc/licenses/ehcache-2.4.0/README @@ -0,0 +1,8 @@ +Ehcache (https://www.ehcache.org/) +---------------------------------- + + Version: 2.4.0 + From: 'Terracotta, Inc.' (https://www.terracotta.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/ehcache-2.4.0/dep-coordinates.txt b/doc/licenses/ehcache-2.4.0/dep-coordinates.txt new file mode 100644 index 0000000..2807940 --- /dev/null +++ b/doc/licenses/ehcache-2.4.0/dep-coordinates.txt @@ -0,0 +1 @@ +net.sf.ehcache:ehcache-core:jar:2.4.0 diff --git a/doc/licenses/error-prone-2.10.0/README b/doc/licenses/error-prone-2.10.0/README new file mode 100644 index 0000000..f286aed --- /dev/null +++ b/doc/licenses/error-prone-2.10.0/README @@ -0,0 +1,8 @@ +Error Prone (https://errorprone.info/) +-------------------------------------- + + Version: 2.10.0 + From: 'Google Inc.' (http://www.google.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/error-prone-2.10.0/dep-coordinates.txt b/doc/licenses/error-prone-2.10.0/dep-coordinates.txt new file mode 100644 index 0000000..9473dfc --- /dev/null +++ b/doc/licenses/error-prone-2.10.0/dep-coordinates.txt @@ -0,0 +1 @@ +com.google.errorprone:error_prone_annotations:jar:2.10.0 diff --git a/doc/licenses/error-prone-2.21.1/README b/doc/licenses/error-prone-2.21.1/README new file mode 100644 index 0000000..8e1df59 --- /dev/null +++ b/doc/licenses/error-prone-2.21.1/README @@ -0,0 +1,8 @@ +Error Prone (https://errorprone.info/) +-------------------------------------- + + Version: 2.21.1 + From: 'Google Inc.' (http://www.google.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/error-prone-2.21.1/dep-coordinates.txt b/doc/licenses/error-prone-2.21.1/dep-coordinates.txt new file mode 100644 index 0000000..d1e82c9 --- /dev/null +++ b/doc/licenses/error-prone-2.21.1/dep-coordinates.txt @@ -0,0 +1 @@ +com.google.errorprone:error_prone_annotations:jar:2.21.1 diff --git a/doc/licenses/events-3.3.0/LICENSE b/doc/licenses/events-3.3.0/LICENSE new file mode 100644 index 0000000..52ed3b0 --- /dev/null +++ b/doc/licenses/events-3.3.0/LICENSE @@ -0,0 +1,22 @@ +MIT + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/events-3.3.0/README b/doc/licenses/events-3.3.0/README new file mode 100644 index 0000000..b53924d --- /dev/null +++ b/doc/licenses/events-3.3.0/README @@ -0,0 +1,7 @@ +events (https://github.com/browserify/events) +--------------------------------------------- + + Version: 3.3.0 + From: 'Node.js contributors, Joyent, Inc., and other Node contributors' + License(s): + MIT (bundled/events-3.3.0/LICENSE) diff --git a/doc/licenses/events-3.3.0/dep-coordinates.txt b/doc/licenses/events-3.3.0/dep-coordinates.txt new file mode 100644 index 0000000..f644fcc --- /dev/null +++ b/doc/licenses/events-3.3.0/dep-coordinates.txt @@ -0,0 +1 @@ +events:3.3.0 diff --git a/doc/licenses/file-saver-2.0.5/LICENSE.md b/doc/licenses/file-saver-2.0.5/LICENSE.md new file mode 100644 index 0000000..32ef3ca --- /dev/null +++ b/doc/licenses/file-saver-2.0.5/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License + +Copyright © 2016 [Eli Grey][1]. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + [1]: http://eligrey.com diff --git a/doc/licenses/file-saver-2.0.5/README b/doc/licenses/file-saver-2.0.5/README new file mode 100644 index 0000000..0d93345 --- /dev/null +++ b/doc/licenses/file-saver-2.0.5/README @@ -0,0 +1,8 @@ +FileSaver.js (https://github.com/eligrey/FileSaver.js) +------------------------------------------------------ + + Version: 2.0.5 + From: 'Eli Grey' (https://github.com/eligrey) + License(s): + MIT (bundled/file-saver-2.0.5/LICENSE.md) + diff --git a/doc/licenses/file-saver-2.0.5/dep-coordinates.txt b/doc/licenses/file-saver-2.0.5/dep-coordinates.txt new file mode 100644 index 0000000..c0c2b2f --- /dev/null +++ b/doc/licenses/file-saver-2.0.5/dep-coordinates.txt @@ -0,0 +1 @@ +file-saver:2.0.5 diff --git a/doc/licenses/findbugs-jsr305-3.0.2/LICENSE b/doc/licenses/findbugs-jsr305-3.0.2/LICENSE new file mode 100644 index 0000000..6736681 --- /dev/null +++ b/doc/licenses/findbugs-jsr305-3.0.2/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2007-2009, JSR305 expert group +All rights reserved. + +http://www.opensource.org/licenses/bsd-license.php + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the JSR305 expert group nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/findbugs-jsr305-3.0.2/README b/doc/licenses/findbugs-jsr305-3.0.2/README new file mode 100644 index 0000000..d9e2f0a --- /dev/null +++ b/doc/licenses/findbugs-jsr305-3.0.2/README @@ -0,0 +1,8 @@ +JSR-305 Reference Implementation (http://code.google.com/p/jsr-305/) +-------------------------------------------------------------------- + + Version: 3.0.2 (originally 0.1-SNAPSHOT, redistributed by FindBugs 3.0.2) + From: 'JSR305 expert group' (https://code.google.com/archive/p/jsr-305/) + License(s): + BSD 3-clause (bundled/findbugs-jsr305-3.0.2/LICENSE) + diff --git a/doc/licenses/findbugs-jsr305-3.0.2/dep-coordinates.txt b/doc/licenses/findbugs-jsr305-3.0.2/dep-coordinates.txt new file mode 100644 index 0000000..2b53583 --- /dev/null +++ b/doc/licenses/findbugs-jsr305-3.0.2/dep-coordinates.txt @@ -0,0 +1 @@ +com.google.code.findbugs:jsr305:jar:3.0.2 diff --git a/doc/licenses/fuzzysort-3.0.2/LICENSE b/doc/licenses/fuzzysort-3.0.2/LICENSE new file mode 100644 index 0000000..a3b9d9d --- /dev/null +++ b/doc/licenses/fuzzysort-3.0.2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Stephen Kamenar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/fuzzysort-3.0.2/README b/doc/licenses/fuzzysort-3.0.2/README new file mode 100644 index 0000000..d1f8f28 --- /dev/null +++ b/doc/licenses/fuzzysort-3.0.2/README @@ -0,0 +1,7 @@ +fuzzysort (https://github.com/farzher/fuzzysort/tree/master) +--------------------------------------------- + + Version: 3.0.2 + From: 'Stephen Kamenar' (https://github.com/farzher) + License(s): + MIT (bundled/fuzzysort-3.0.2/LICENSE) diff --git a/doc/licenses/fuzzysort-3.0.2/dep-coordinates.txt b/doc/licenses/fuzzysort-3.0.2/dep-coordinates.txt new file mode 100644 index 0000000..0a8c3a0 --- /dev/null +++ b/doc/licenses/fuzzysort-3.0.2/dep-coordinates.txt @@ -0,0 +1 @@ +fuzzysort:3.0.2 diff --git a/doc/licenses/generate-license-files.sh b/doc/licenses/generate-license-files.sh new file mode 100755 index 0000000..76f8296 --- /dev/null +++ b/doc/licenses/generate-license-files.sh @@ -0,0 +1,383 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# NOTE: Parts of this file (Makefile.am) are automatically transcluded verbatim +# into Makefile.in. Though the build system (GNU Autotools) automatically adds +# its own license boilerplate to the generated Makefile.in, that boilerplate +# does not apply to the transcluded portions of Makefile.am which are licensed +# to you by the ASF under the Apache License, Version 2.0, as described above. +# + +# +# generate-license-files.sh +# ------------------------- +# +# Automatically iterates through the provided runtime dependencies of the +# project in the current directory, creating new LICENSE and NOTICE files which +# contain all the license information of bundled dependencies, as well as any +# required notices. +# +# This script is expected to be invoked as part of the build process of the +# various guacamole-client subprojects. +# +# USAGE: +# +# path/to/generate-license-files.sh DEPENDENCY_LIST OUTPUT_DIRECTORY +# +# where DEPENDENCY_LIST is the list of dependencies to consider when generating +# LICENSE and NOTICE (as produced by "mvn dependency:list" or our +# DependencyListPlugin for Webpack) and OUTPUT_DIRECTORY is the directory in +# which the LICENSE and NOTICE files should be written. +# +# If DEPENDENCY_LIST is a directory, all normal files within the directory will +# be concatenated to produce the list. +# +# Ignoring license errors +# ----------------------- +# +# By default, this script will exit with a non-zero exit code if any license +# errors are encountered, failing the build. If this is undesirable (dependency +# changes are being tested, a full list of all license errors across all +# projects is needed, etc.), set the IGNORE_LICENSE_ERRORS environment variable +# to "true". +# +# Structure of license information +# -------------------------------- +# +# The LICENSE and NOTICE files of the guacamole-client project are used as the +# basis for the generated LICENSE and NOTICE files. It is expected that the +# guacamole-client LICENSE will may contain license information for +# subcomponents that had to be copied verbatim into the source tree, with that +# information following a human-readable preamble that begins with a solid line +# of "=" characters. This line of "=" characters MUST BE INCLUDED when such +# dependencies are present, as it is specifically searched for by this script +# when determining what parts of the main LICENSE file should be copied over. +# +# License information for the bundled runtime dependencies of all subprojects +# is included in the subdirectories of the "doc/licenses/" directory of the +# main guacamole-client source tree. Each subdirectory is associated with a +# single, logical dependency, with the coordinates of that dependency listed in +# the "dep-coordinates.txt" file within that subdirectory. There may be +# multiple coordinates associated with a dependency, in which case each +# relevant set of coordinates should be listed on its own line. +# +# For dependencies that are not associated with coordinates that can be +# automatically deteremined, the licenses of those dependencies should instead +# be documented within subdirectories of the "src/licenses/bundled/" directory +# of the relevant subproject. +# +# Regardless of whether a dependency is documented within the top-level +# guacamole-client project or within the relevant subproject, the subdirectory +# for each dependency must contain a "README" file describing the dependency, +# the version used, the copyright holder(s), and the license. Examples of the +# formatting expected for these README files can be found within the existing +# dependency license directories. +# +# Files that contain the word "notice", regardless of case, are considered by +# this script to be the notice file mentioned within the Apache License, and +# will be copied verbatim into the generated NOTICE file. +# +# Files that that are not recognized as any other type of file are considered +# by this script to be the license and will be included verbatim within the +# generated LICENSE if they are less than 50 lines. +# + +## +## The filename of the file containing whether any errors have been logged. The +## contents of this file will be set to "1" if at least one error occurred. A +## file is used here instead of a simple environment variable to allow error() +## to be called from within pipelines and still be detectable. +## +HAS_ERRORS="`mktemp`" +trap 'rm -f "$HAS_ERRORS"' EXIT + +## +## The maximum size of a license that may be included verbatim within the +## generated LICENSE file. Larger licenses will only be included separately. +## +LICENSE_COPY_LIMIT=50 + +## +## The directory containing this script and all license information. This +## should be "doc/licenses/" within the guacamole-client source tree. +## +LICENSES_DIR="`dirname "$0"`" + +## +## The base directory of the guacamole-client source tree. +## +BASEDIR="$LICENSES_DIR/../.." + +## +## The file containing all relevant runtime dependencies, as generated by +## "mvn dependency:list". +## +DEPENDENCY_LIST="$1" + +## +## The output directory in which the generated LICENSE, NOTICE, etc. files +## should be placed. +## +OUTPUT_DIR="$2" + +## +## Lists the license information directories (subdirectories of the +## "doc/licenses/" directory in the main guacamole-client source tree) that +## apply to the list of runtime dependencies provided via STDIN. If any runtime +## dependencies are not described by license information included in the +## guacamole-client source tree, a error is printed to STDERR. +## +## The license information directories for dependencies that are not pulled in +## automatically (subdirectories of the "src/licenses/bundled/" directory +## within the current project) will also be included, if any. +## +list_dependency_license_info() { + + # List the license directories of all runtime dependencies, as dictated by + # the "dep-coordinates.txt" files included within those directories + sed 's/^[[:space:]]\+//' | grep -o '^[^: ]\+\(:[^: ]*\)\{1,3\}' | while read DEPENDENCY; do + + if ! grep -l "$DEPENDENCY[[:space:]]*$" "$LICENSES_DIR"/*/dep-coordinates.txt; then + error "License information missing for $DEPENDENCY" + fi + + done | sort -u | while read LICENSE_INFO_COORDS_FILE; do + dirname "$LICENSE_INFO_COORDS_FILE" + done + + # Include license directories for all dependencies not pulled in automatically + if [ -d ./src/licenses/bundled/ ]; then + find src/licenses/bundled/ -mindepth 1 -maxdepth 1 -type d + fi + +} + +## +## Sorts the given list of license information directories by the name of the +## dependency, as determined by the header line within that dependency's +## README. The list of directories is read from STDIN, and the sorted result is +## written to STDOUT. Each directory must be on its own line. +## +sort_dependency_license_info() { + while read LICENSE_INFO; do + + if [ ! -e "$LICENSE_INFO/README" ]; then + error "Missing license README in $LICENSE_INFO" + continue + fi + + NAME="`grep . < "$LICENSE_INFO/README" | head -n1`" + printf "%s\t%s\n" "$NAME" "$LICENSE_INFO" + + done | sort -f | cut -f2 +} + +## +## Prints the given informational message to STDERR. +## +## @param ... +## The message to print. +## +info() { + echo "$@" >&2 +} + +## +## Prints the given error message to STDERR, updating HAS_ERRORS +## appropriately. +## +## @param ... +## The message to print. +## +error() { + echo "ERROR: $@" >&2 + echo "1" > "$HAS_ERRORS" +} + +## +## Prints the first line from STDIN. If more than one line is provided, +## those lines are omitted, and an error exit code is returned. +## +## @return +## Zero (success) if no more than one line was provided on STDIN, +## non-zero (failure) otherwise. +## +single_result() { + read RESULT && echo "$RESULT" + ! read DUMMY +} + +## +## Searches the given directory for a license file, prints the path to the +## license file found. If multiple files are found, only the first file is +## printed, and an error is logged to STDERR. +## +## @param DIR +## The directory to search. +## +license_file() { + DIR="$1" + find "$DIR" -mindepth 1 \ + -a \! -iname "*notice*" \ + -a \! -name "dep-coordinates.txt" \ + -a \! -name "README" \ + | if ! single_result; then + error "Multiple license files found within $DIR" + fi +} + +## +## Searches the given directory for a notice file, prints the path to the +## notice file found. If multiple files are found, only the first file is +## printed, and a error is logged to STDERR. +## +## @param DIR +## The directory to search. +## +notice_file() { + DIR="$1" + find "$DIR" -iname "*notice*" \ + | if ! single_result; then + error "Multiple notice files found within $DIR" + fi +} + +## +## Prints the contents of the given file, excluding any blank lines at the +## beginning and end of the file. +## +## @param FILENAME +## The file to print. +## +trim_file() { + + FILENAME="$1" + + # Find line number of first and last non-blank lines + FIRST_LINE="`awk '/[^\t ]/ {print NR; exit}' "$FILENAME"`" + LAST_LINE="`awk '/[^\t ]/ {last=NR} END {print last}' "$FILENAME"`" + + # Print the contents of the file between those lines, inclusive + awk "NR==$FIRST_LINE,NR==$LAST_LINE" "$FILENAME" + +} + +# Verify that an output directory was provided +if [ -z "$DEPENDENCY_LIST" -o -z "$OUTPUT_DIR" ]; then + error "USAGE: $0 DEPENDENCY_LIST OUTPUT_DIRECTORY" + exit 1 +fi + +# Verify input file actually exists +if [ ! -r "$DEPENDENCY_LIST" ]; then + error "$DEPENDENCY_LIST cannot be read." + exit 1 +fi + +# +# Autogenerate base LICENSE and NOTICE +# + +info "Processing runtime dependencies to produce LICENSE and NOTICE. Output will be within \"$OUTPUT_DIR\"." +mkdir -p "$OUTPUT_DIR" + +# Copy overall license up to but not including its subcomponent preamble (the +# section that starts after a line made up entirely of "=" characters) +awk 'NR==1 {flag=1}; /^[=]{10,}$/ {flag=0}; flag;' "$BASEDIR/LICENSE" > "$OUTPUT_DIR/LICENSE" + +# Copy base NOTICE verbatim +cp "$BASEDIR/NOTICE" "$OUTPUT_DIR/" + +# +# Autogenerate LICENSE and NOTICE information from dependencies +# + +PREAMBLE_ADDED=0 +find "$DEPENDENCY_LIST" -type f -exec cat '{}' + | \ + list_dependency_license_info | sort_dependency_license_info | \ + while read LICENSE_INFO_DIR; do + + # Add subcomponent license preamble if not already added + if [ "$PREAMBLE_ADDED" = 0 ]; then + cat >> "$OUTPUT_DIR/LICENSE" <> "$OUTPUT_DIR/LICENSE" + trim_file "$LICENSE_INFO_DIR/README" >> "$OUTPUT_DIR/LICENSE" + + # Append verbatim copy of license if small enough + if [ -n "$LICENSE_FILE" ]; then + if [ "`wc -l < "$LICENSE_FILE"`" -le "$LICENSE_COPY_LIMIT" ]; then + echo >> "$OUTPUT_DIR/LICENSE" + trim_file "$LICENSE_FILE" >> "$OUTPUT_DIR/LICENSE" + fi + fi + + # Copy NOTICE, if provided + if [ -n "$NOTICE_FILE" ]; then + printf '\n======== NOTICE for "%s" ========\n\n' "$COMPONENT_NAME" >> "$OUTPUT_DIR/NOTICE" + trim_file "$NOTICE_FILE" >> "$OUTPUT_DIR/NOTICE" + fi + + # Include verbatim copy of license information + mkdir -p "$OUTPUT_DIR/bundled/" + cp -Lr "$LICENSE_INFO_DIR" "$OUTPUT_DIR/bundled/" + + # Add README describing nature of the "bundled/" directory + cat > "$OUTPUT_DIR/bundled/README" < + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands + you use may be called something other than `show w' and `show c'; they + could even be mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (which makes passes at compilers) written by + James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + + This 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 Library + General Public License instead of this License. + +--- + +## CLASSPATH EXCEPTION + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License version 2 cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from or + based on this library. If you modify this library, you may extend this + exception to your version of the library, but you are not obligated to + do so. If you do not wish to do so, delete this exception statement + from your version. diff --git a/doc/licenses/glassfish-hk2-2.6.1/README b/doc/licenses/glassfish-hk2-2.6.1/README new file mode 100644 index 0000000..00b42cb --- /dev/null +++ b/doc/licenses/glassfish-hk2-2.6.1/README @@ -0,0 +1,8 @@ +GlassFish HK2 (https://eclipse-ee4j.github.io/glassfish-hk2/) +------------------------------------------------------------- + + Version: 2.6.1 + From: 'Eclipse Foundation' (https://www.eclipse.org/) + License(s): + EPL v2.0 (bundled/glassfish-hk2-2.6.1/LICENSE.md) + diff --git a/doc/licenses/glassfish-hk2-2.6.1/dep-coordinates.txt b/doc/licenses/glassfish-hk2-2.6.1/dep-coordinates.txt new file mode 100644 index 0000000..8558a57 --- /dev/null +++ b/doc/licenses/glassfish-hk2-2.6.1/dep-coordinates.txt @@ -0,0 +1,6 @@ +org.glassfish.hk2.external:aopalliance-repackaged:jar:2.6.1 +org.glassfish.hk2.external:jakarta.inject:jar:2.6.1 +org.glassfish.hk2:guice-bridge:jar:2.6.1 +org.glassfish.hk2:hk2-api:jar:2.6.1 +org.glassfish.hk2:hk2-locator:jar:2.6.1 +org.glassfish.hk2:hk2-utils:jar:2.6.1 diff --git a/doc/licenses/guava-32.1.3-jre/README b/doc/licenses/guava-32.1.3-jre/README new file mode 100644 index 0000000..a7ee36e --- /dev/null +++ b/doc/licenses/guava-32.1.3-jre/README @@ -0,0 +1,8 @@ +Guava: Google Core Libraries for Java (https://github.com/google/guava) +----------------------------------------------------------------------- + + Version: 32.1.3-jre + From: 'Google Inc.' (http://www.google.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/guava-32.1.3-jre/dep-coordinates.txt b/doc/licenses/guava-32.1.3-jre/dep-coordinates.txt new file mode 100644 index 0000000..a89f87a --- /dev/null +++ b/doc/licenses/guava-32.1.3-jre/dep-coordinates.txt @@ -0,0 +1,3 @@ +com.google.guava:failureaccess:jar:1.0.1 +com.google.guava:guava:jar:32.1.3-jre +com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava diff --git a/doc/licenses/guice-5.1.0/README b/doc/licenses/guice-5.1.0/README new file mode 100644 index 0000000..6ba456c --- /dev/null +++ b/doc/licenses/guice-5.1.0/README @@ -0,0 +1,8 @@ +Google Guice (https://github.com/google/guice) +---------------------------------------------- + + Version: 5.1.0 + From: 'Google Inc.' (http://www.google.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/guice-5.1.0/dep-coordinates.txt b/doc/licenses/guice-5.1.0/dep-coordinates.txt new file mode 100644 index 0000000..f338d37 --- /dev/null +++ b/doc/licenses/guice-5.1.0/dep-coordinates.txt @@ -0,0 +1,3 @@ +com.google.inject:guice:jar:5.1.0 +com.google.inject.extensions:guice-assistedinject:jar:5.1.0 +com.google.inject.extensions:guice-servlet:jar:5.1.0 diff --git a/doc/licenses/ieee754-1.2.1/LICENSE b/doc/licenses/ieee754-1.2.1/LICENSE new file mode 100644 index 0000000..5aac82c --- /dev/null +++ b/doc/licenses/ieee754-1.2.1/LICENSE @@ -0,0 +1,11 @@ +Copyright 2008 Fair Oaks Labs, Inc. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/ieee754-1.2.1/README b/doc/licenses/ieee754-1.2.1/README new file mode 100644 index 0000000..f15f632 --- /dev/null +++ b/doc/licenses/ieee754-1.2.1/README @@ -0,0 +1,7 @@ +ieee754 (https://github.com/feross/ieee754) +--------------------------------------------- + + Version: 1.2.1 + From: 'Fair Oaks Labs, Inc' + License(s): + MIT (bundled/ieee754-1.2.1/LICENSE) diff --git a/doc/licenses/ieee754-1.2.1/dep-coordinates.txt b/doc/licenses/ieee754-1.2.1/dep-coordinates.txt new file mode 100644 index 0000000..4fb7d77 --- /dev/null +++ b/doc/licenses/ieee754-1.2.1/dep-coordinates.txt @@ -0,0 +1 @@ +ieee754:1.2.1 diff --git a/doc/licenses/inherits-2.0.3/LICENSE b/doc/licenses/inherits-2.0.3/LICENSE new file mode 100644 index 0000000..052085c --- /dev/null +++ b/doc/licenses/inherits-2.0.3/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/doc/licenses/inherits-2.0.3/README b/doc/licenses/inherits-2.0.3/README new file mode 100644 index 0000000..e2afbf5 --- /dev/null +++ b/doc/licenses/inherits-2.0.3/README @@ -0,0 +1,8 @@ +inherits (https://github.com/isaacs/inherits) +--------------------------------------------- + + Version: 2.0.3 + From: 'Isaac Z. Schlueter' (https://github.com/isaacs) + License(s): + ISC (bundled/inherits-2.0.3/LICENSE) + diff --git a/doc/licenses/inherits-2.0.3/dep-coordinates.txt b/doc/licenses/inherits-2.0.3/dep-coordinates.txt new file mode 100644 index 0000000..e03ab47 --- /dev/null +++ b/doc/licenses/inherits-2.0.3/dep-coordinates.txt @@ -0,0 +1 @@ +inherits:2.0.3 diff --git a/doc/licenses/inherits-2.0.4/LICENSE b/doc/licenses/inherits-2.0.4/LICENSE new file mode 100644 index 0000000..052085c --- /dev/null +++ b/doc/licenses/inherits-2.0.4/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/doc/licenses/inherits-2.0.4/README b/doc/licenses/inherits-2.0.4/README new file mode 100644 index 0000000..9d0b401 --- /dev/null +++ b/doc/licenses/inherits-2.0.4/README @@ -0,0 +1,8 @@ +inherits (https://github.com/isaacs/inherits) +--------------------------------------------- + + Version: 2.0.4 + From: 'Isaac Z. Schlueter' (https://github.com/isaacs) + License(s): + ISC (bundled/inherits-2.0.4/LICENSE) + diff --git a/doc/licenses/inherits-2.0.4/dep-coordinates.txt b/doc/licenses/inherits-2.0.4/dep-coordinates.txt new file mode 100644 index 0000000..4a17c13 --- /dev/null +++ b/doc/licenses/inherits-2.0.4/dep-coordinates.txt @@ -0,0 +1 @@ +inherits:2.0.4 diff --git a/doc/licenses/ipaddress-5.5.1/README b/doc/licenses/ipaddress-5.5.1/README new file mode 100644 index 0000000..cf40738 --- /dev/null +++ b/doc/licenses/ipaddress-5.5.1/README @@ -0,0 +1,8 @@ +IPAddress (https://seancfoley.github.io/IPAddress/) +--------------------------------------------------- + + Version: 5.5.1 + From: 'Sean C Foley' (https://seancfoley.github.io/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/ipaddress-5.5.1/dep-coordinates.txt b/doc/licenses/ipaddress-5.5.1/dep-coordinates.txt new file mode 100644 index 0000000..3ddc5be --- /dev/null +++ b/doc/licenses/ipaddress-5.5.1/dep-coordinates.txt @@ -0,0 +1 @@ +com.github.seancfoley:ipaddress:jar:5.5.1 diff --git a/doc/licenses/isarray-1.0.0/LICENSE b/doc/licenses/isarray-1.0.0/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/doc/licenses/isarray-1.0.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/isarray-1.0.0/README b/doc/licenses/isarray-1.0.0/README new file mode 100644 index 0000000..3fde38c --- /dev/null +++ b/doc/licenses/isarray-1.0.0/README @@ -0,0 +1,8 @@ +isarray (https://github.com/juliangruber/isarray) +--------------------------------------------- + + Version: 1.0.0 + From: 'Julian Gruber' (https://github.com/juliangruber) + License(s): + MIT (bundled/isarray-1.0.0/LICENSE) + diff --git a/doc/licenses/isarray-1.0.0/dep-coordinates.txt b/doc/licenses/isarray-1.0.0/dep-coordinates.txt new file mode 100644 index 0000000..d444bdb --- /dev/null +++ b/doc/licenses/isarray-1.0.0/dep-coordinates.txt @@ -0,0 +1 @@ +isarray:1.0.0 diff --git a/doc/licenses/j2objc-annotations-2.8/README b/doc/licenses/j2objc-annotations-2.8/README new file mode 100644 index 0000000..4df8c7a --- /dev/null +++ b/doc/licenses/j2objc-annotations-2.8/README @@ -0,0 +1,8 @@ +Java to Objective-C Annotations (https://github.com/google/j2objc) +------------------------------------------------------------------ + + Version: 2.8 + From: 'Google Inc.' (http://www.google.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/j2objc-annotations-2.8/dep-coordinates.txt b/doc/licenses/j2objc-annotations-2.8/dep-coordinates.txt new file mode 100644 index 0000000..9e961e7 --- /dev/null +++ b/doc/licenses/j2objc-annotations-2.8/dep-coordinates.txt @@ -0,0 +1 @@ +com.google.j2objc:j2objc-annotations:jar:2.8 diff --git a/doc/licenses/jackson-2.18.3/NOTICE b/doc/licenses/jackson-2.18.3/NOTICE new file mode 100644 index 0000000..e0b3fa0 --- /dev/null +++ b/doc/licenses/jackson-2.18.3/NOTICE @@ -0,0 +1,4 @@ +Jackson is a high-performance, Free/Open Source JSON processing library. +It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has +been in development since 2007. +It is currently developed by a community of developers. diff --git a/doc/licenses/jackson-2.18.3/README b/doc/licenses/jackson-2.18.3/README new file mode 100644 index 0000000..d9a72f4 --- /dev/null +++ b/doc/licenses/jackson-2.18.3/README @@ -0,0 +1,8 @@ +Jackson (https://github.com/FasterXML/jackson) +---------------------------------------------- + + Version: 2.18.2 + From: 'FasterXML, LLC' (https://github.com/FasterXML) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jackson-2.18.3/dep-coordinates.txt b/doc/licenses/jackson-2.18.3/dep-coordinates.txt new file mode 100644 index 0000000..61aece5 --- /dev/null +++ b/doc/licenses/jackson-2.18.3/dep-coordinates.txt @@ -0,0 +1,4 @@ +com.fasterxml.jackson.core:jackson-core:jar:2.18.3 +com.fasterxml.jackson.core:jackson-annotations:jar:2.18.3 +com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.18.3 +com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.18.3 diff --git a/doc/licenses/jackson-databind-2.18.3/NOTICE b/doc/licenses/jackson-databind-2.18.3/NOTICE new file mode 100644 index 0000000..e0b3fa0 --- /dev/null +++ b/doc/licenses/jackson-databind-2.18.3/NOTICE @@ -0,0 +1,4 @@ +Jackson is a high-performance, Free/Open Source JSON processing library. +It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has +been in development since 2007. +It is currently developed by a community of developers. diff --git a/doc/licenses/jackson-databind-2.18.3/README b/doc/licenses/jackson-databind-2.18.3/README new file mode 100644 index 0000000..59e4aa9 --- /dev/null +++ b/doc/licenses/jackson-databind-2.18.3/README @@ -0,0 +1,8 @@ +Jackson-databind (https://github.com/FasterXML/jackson-databind) +---------------------------------------------- + + Version: 2.18.3 + From: 'FasterXML, LLC' (https://github.com/FasterXML) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jackson-databind-2.18.3/dep-coordinates.txt b/doc/licenses/jackson-databind-2.18.3/dep-coordinates.txt new file mode 100644 index 0000000..0eec594 --- /dev/null +++ b/doc/licenses/jackson-databind-2.18.3/dep-coordinates.txt @@ -0,0 +1 @@ +com.fasterxml.jackson.core:jackson-databind:jar:2.18.3 diff --git a/doc/licenses/jai-imageio-core-1.4.0/LICENSE.txt b/doc/licenses/jai-imageio-core-1.4.0/LICENSE.txt new file mode 100644 index 0000000..88e09e0 --- /dev/null +++ b/doc/licenses/jai-imageio-core-1.4.0/LICENSE.txt @@ -0,0 +1,39 @@ +Copyright (c) 2005 Sun Microsystems, Inc. +Copyright © 2010-2014 University of Manchester +Copyright © 2010-2015 Stian Soiland-Reyes +Copyright © 2015 Peter Hull +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistribution of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistribution in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +Neither the name of Sun Microsystems, Inc. or the names of +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +This software is provided "AS IS," without a warranty of any +kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND +WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY +EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL +NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF +USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS +DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR +ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, +CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND +REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR +INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +You acknowledge that this software is not designed or intended for +use in the design, construction, operation or maintenance of any +nuclear facility. diff --git a/doc/licenses/jai-imageio-core-1.4.0/README b/doc/licenses/jai-imageio-core-1.4.0/README new file mode 100644 index 0000000..6b0c701 --- /dev/null +++ b/doc/licenses/jai-imageio-core-1.4.0/README @@ -0,0 +1,12 @@ +Java Advanced Imaging Image I/O (https://github.com/jai-imageio/jai-imageio-core) +--------------------------------------------------------------------------------- + + Version: 1.4.0 + From: + 'Sun Microsystems, Inc.' (https://www.oracle.com/) + 'University of Manchester' (https://www.manchester.ac.uk/) + 'Stian Soiland-Reyes' (https://github.com/stain) + 'Peter Hull' + License(s): + BSD 3-clause (bundled/jai-imageio-core-1.4.0/LICENSE.txt) + diff --git a/doc/licenses/jai-imageio-core-1.4.0/dep-coordinates.txt b/doc/licenses/jai-imageio-core-1.4.0/dep-coordinates.txt new file mode 100644 index 0000000..b62dccd --- /dev/null +++ b/doc/licenses/jai-imageio-core-1.4.0/dep-coordinates.txt @@ -0,0 +1 @@ +com.github.jai-imageio:jai-imageio-core:jar:1.4.0 diff --git a/doc/licenses/jakarta-activation-1.2.1/LICENSE.md b/doc/licenses/jakarta-activation-1.2.1/LICENSE.md new file mode 100644 index 0000000..e0358f9 --- /dev/null +++ b/doc/licenses/jakarta-activation-1.2.1/LICENSE.md @@ -0,0 +1,29 @@ + + Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Eclipse Foundation, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/jakarta-activation-1.2.1/README b/doc/licenses/jakarta-activation-1.2.1/README new file mode 100644 index 0000000..5541989 --- /dev/null +++ b/doc/licenses/jakarta-activation-1.2.1/README @@ -0,0 +1,8 @@ +Jakarta Activation (https://eclipse-ee4j.github.io/jaf/) +-------------------------------------------------------- + + Version: 1.2.1 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + BSD 3-clause (bundled/jakarta-activation-1.2.1/LICENSE.md) + diff --git a/doc/licenses/jakarta-activation-1.2.1/dep-coordinates.txt b/doc/licenses/jakarta-activation-1.2.1/dep-coordinates.txt new file mode 100644 index 0000000..7eff799 --- /dev/null +++ b/doc/licenses/jakarta-activation-1.2.1/dep-coordinates.txt @@ -0,0 +1 @@ +jakarta.activation:jakarta.activation-api:jar:1.2.1 diff --git a/doc/licenses/jakarta-activation-1.2.2/LICENSE.md b/doc/licenses/jakarta-activation-1.2.2/LICENSE.md new file mode 100644 index 0000000..e0358f9 --- /dev/null +++ b/doc/licenses/jakarta-activation-1.2.2/LICENSE.md @@ -0,0 +1,29 @@ + + Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Eclipse Foundation, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/jakarta-activation-1.2.2/README b/doc/licenses/jakarta-activation-1.2.2/README new file mode 100644 index 0000000..0320bc7 --- /dev/null +++ b/doc/licenses/jakarta-activation-1.2.2/README @@ -0,0 +1,8 @@ +Jakarta Activation (https://eclipse-ee4j.github.io/jaf/) +-------------------------------------------------------- + + Version: 1.2.2 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + BSD 3-clause (bundled/jakarta-activation-1.2.2/LICENSE.md) + diff --git a/doc/licenses/jakarta-activation-1.2.2/dep-coordinates.txt b/doc/licenses/jakarta-activation-1.2.2/dep-coordinates.txt new file mode 100644 index 0000000..aabbe33 --- /dev/null +++ b/doc/licenses/jakarta-activation-1.2.2/dep-coordinates.txt @@ -0,0 +1 @@ +jakarta.activation:jakarta.activation-api:jar:1.2.2 diff --git a/doc/licenses/jakarta-annotation-api-1.3.5/LICENSE.md b/doc/licenses/jakarta-annotation-api-1.3.5/LICENSE.md new file mode 100644 index 0000000..5de3d1b --- /dev/null +++ b/doc/licenses/jakarta-annotation-api-1.3.5/LICENSE.md @@ -0,0 +1,637 @@ +# Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + + 1. DEFINITIONS + + "Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + + "Contributor" means any person or entity that Distributes the Program. + + "Licensed Patents" mean patent claims licensable by a Contributor which + are necessarily infringed by the use or sale of its Contribution alone + or when combined with the Program. + + "Program" means the Contributions Distributed in accordance with this + Agreement. + + "Recipient" means anyone who receives the Program under this Agreement + or any Secondary License (as applicable), including Contributors. + + "Derivative Works" shall mean any work, whether in Source Code or other + form, that is based on (or derived from) the Program and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. + + "Modified Works" shall mean any work in Source Code or other form that + results from an addition to, deletion from, or modification of the + contents of the Program, including, for purposes of clarity any new file + in Source Code form that contains any contents of the Program. Modified + Works shall not include works that contain only declarations, + interfaces, types, classes, structures, or files of the Program solely + in each case in order to link to, bind by name, or subclass the Program + or Modified Works thereof. + + "Distribute" means the acts of a) distributing or b) making available + in any manner that enables the transfer of a copy. + + "Source Code" means the form of a Program preferred for making + modifications, including but not limited to software source code, + documentation source, and configuration files. + + "Secondary License" means either the GNU General Public License, + Version 2.0, or any later versions of that license, including any + exceptions or additional permissions as identified by the initial + Contributor. + + 2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + + 3. REQUIREMENTS + + 3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + + 3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + + 3.3 Contributors may not remove or alter any copyright, patent, + trademark, attribution notices, disclaimers of warranty, or limitations + of liability ("notices") contained within the Program from any copy of + the Program which they Distribute, provided that Contributors may add + their own appropriate notices. + + 4. COMMERCIAL DISTRIBUTION + + Commercial distributors of software may accept certain responsibilities + with respect to end users, business partners and the like. While this + license is intended to facilitate the commercial use of the Program, + the Contributor who includes the Program in a commercial product + offering should do so in a manner which does not create potential + liability for other Contributors. Therefore, if a Contributor includes + the Program in a commercial product offering, such Contributor + ("Commercial Contributor") hereby agrees to defend and indemnify every + other Contributor ("Indemnified Contributor") against any losses, + damages and costs (collectively "Losses") arising from claims, lawsuits + and other legal actions brought by a third party against the Indemnified + Contributor to the extent caused by the acts or omissions of such + Commercial Contributor in connection with its distribution of the Program + in a commercial product offering. The obligations in this section do not + apply to any claims or Losses relating to any actual or alleged + intellectual property infringement. In order to qualify, an Indemnified + Contributor must: a) promptly notify the Commercial Contributor in + writing of such claim, and b) allow the Commercial Contributor to control, + and cooperate with the Commercial Contributor in, the defense and any + related settlement negotiations. The Indemnified Contributor may + participate in any such claim at its own expense. + + For example, a Contributor might include the Program in a commercial + product offering, Product X. That Contributor is then a Commercial + Contributor. If that Commercial Contributor then makes performance + claims, or offers warranties related to Product X, those performance + claims and warranties are such Commercial Contributor's responsibility + alone. Under this section, the Commercial Contributor would have to + defend claims against the other Contributors related to those performance + claims and warranties, and if a court requires any other Contributor to + pay any damages as a result, the Commercial Contributor must pay + those damages. + + 5. NO WARRANTY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR + IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF + TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR + PURPOSE. Each Recipient is solely responsible for determining the + appropriateness of using and distributing the Program and assumes all + risks associated with its exercise of rights under this Agreement, + including but not limited to the risks and costs of program errors, + compliance with applicable laws, damage to or loss of data, programs + or equipment, and unavailability or interruption of operations. + + 6. DISCLAIMER OF LIABILITY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS + SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST + PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE + EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + 7. GENERAL + + If any provision of this Agreement is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this Agreement, and without further + action by the parties hereto, such provision shall be reformed to the + minimum extent necessary to make such provision valid and enforceable. + + If Recipient institutes patent litigation against any entity + (including a cross-claim or counterclaim in a lawsuit) alleging that the + Program itself (excluding combinations of the Program with other software + or hardware) infringes such Recipient's patent(s), then such Recipient's + rights granted under Section 2(b) shall terminate as of the date such + litigation is filed. + + All Recipient's rights under this Agreement shall terminate if it + fails to comply with any of the material terms or conditions of this + Agreement and does not cure such failure in a reasonable period of + time after becoming aware of such noncompliance. If all Recipient's + rights under this Agreement terminate, Recipient agrees to cease use + and distribution of the Program as soon as reasonably practicable. + However, Recipient's obligations under this Agreement and any licenses + granted by Recipient relating to the Program shall continue and survive. + + Everyone is permitted to copy and distribute copies of this Agreement, + but in order to avoid inconsistency the Agreement is copyrighted and + may only be modified in the following manner. The Agreement Steward + reserves the right to publish new versions (including revisions) of + this Agreement from time to time. No one other than the Agreement + Steward has the right to modify this Agreement. The Eclipse Foundation + is the initial Agreement Steward. The Eclipse Foundation may assign the + responsibility to serve as the Agreement Steward to a suitable separate + entity. Each new version of the Agreement will be given a distinguishing + version number. The Program (including Contributions) may always be + Distributed subject to the version of the Agreement under which it was + received. In addition, after a new version of the Agreement is published, + Contributor may elect to Distribute the Program (including its + Contributions) under the new version. + + Except as expressly stated in Sections 2(a) and 2(b) above, Recipient + receives no rights or licenses to the intellectual property of any + Contributor under this Agreement, whether expressly, by implication, + estoppel or otherwise. All rights in the Program not expressly granted + under this Agreement are reserved. Nothing in this Agreement is intended + to be enforceable by any entity that is not a Contributor or Recipient. + No third-party beneficiary rights are created under this Agreement. + + Exhibit A - Form of Secondary Licenses Notice + + "This Source Code may also be made available under the following + Secondary Licenses when the conditions for such availability set forth + in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), + version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + +--- + +## The GNU General Public License (GPL) Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor + Boston, MA 02110-1335 + USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your freedom to + share and change it. By contrast, the GNU General Public License is + intended to guarantee your freedom to share and change free software--to + make sure the software is free for all its users. This General Public + License applies to most of the Free Software Foundation's software and + to any other program whose authors commit to using it. (Some other Free + Software Foundation software is covered by the GNU Library General + Public License instead.) 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 this + service 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 make restrictions that forbid anyone + to deny you these rights or to ask you to surrender the rights. These + restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether gratis + or for a fee, you must give the recipients all the rights that you have. + 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. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software patents. + We wish to avoid the danger that redistributors of a free program will + individually obtain patent licenses, in effect making the program + proprietary. To prevent this, we have made it clear that any patent must + be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed under + the terms of this General Public License. The "Program", below, refers + to any such program or work, and a "work based on the Program" means + either the Program or any derivative work under copyright law: that is + to say, a work containing the Program or a portion of it, either + verbatim or with modifications and/or translated into another language. + (Hereinafter, translation is included without limitation in the term + "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running + the Program is not restricted, and the output from the Program is + covered only if its contents constitute a work based on the Program + (independent of having been made by running the Program). Whether that + is true depends on what the Program does. + + 1. You may copy and distribute 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 + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion of + it, thus forming a work based on the Program, and copy and distribute + such modifications or work under the terms of Section 1 above, provided + that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any part + thereof, to be licensed as a whole at no charge to all third parties + under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this License. + (Exception: if the Program itself is interactive but does not + normally print such an announcement, your work based on the Program + is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, and + can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based on + the Program, the distribution of the whole must be on the terms of this + License, whose permissions for other licensees extend to the entire + whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed + only for noncommercial distribution and only if you received the + program in object code or executable form with such an offer, in + accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source code + means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to control + compilation and installation of the executable. However, as a special + exception, the source code distributed need not include anything that is + normally distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies the + executable. + + If distribution of executable or object code is made by offering access + to copy from a designated place, then offering equivalent access to copy + the source code from the same place counts as distribution of the source + code, even though third parties are not compelled to copy the source + along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt otherwise + to copy, modify, sublicense or distribute the Program is void, and will + automatically terminate your rights under this License. However, parties + who have received copies, or rights, from you under this License will + not have their licenses terminated so long as such parties remain in + full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and all + its terms and conditions for copying, distributing or modifying the + Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further restrictions + on the recipients' exercise of the rights granted herein. You are not + responsible for enforcing compliance by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + 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 distribute + so as to satisfy simultaneously your obligations under this License and + any other pertinent obligations, then as a consequence you may not + distribute the Program at all. For example, if a patent license would + not permit royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only way you + could satisfy both it and this License would be to refrain entirely from + distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is implemented + by public license practices. Many people have made generous + contributions to the wide range of software distributed through that + system in reliance on consistent application of that system; it is up to + the author/donor to decide if he or she is willing to distribute + software through any other system and a licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be + a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License may + add an explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among countries + not thus excluded. In such case, this License incorporates the + limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the 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 a version number of this License which applies to it and "any + later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Program does not specify a version + number of this License, you may choose any version ever published by the + Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted by the + Free Software Foundation, write to the Free Software Foundation; we + sometimes make exceptions for this. Our decision will be guided by the + two goals of preserving the free status of all derivatives of our free + software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE 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. + + 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 convey + 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) + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands + you use may be called something other than `show w' and `show c'; they + could even be mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (which makes passes at compilers) written by + James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + + This 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 Library + General Public License instead of this License. + +--- + +## CLASSPATH EXCEPTION + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License version 2 cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from or + based on this library. If you modify this library, you may extend this + exception to your version of the library, but you are not obligated to + do so. If you do not wish to do so, delete this exception statement + from your version. diff --git a/doc/licenses/jakarta-annotation-api-1.3.5/README b/doc/licenses/jakarta-annotation-api-1.3.5/README new file mode 100644 index 0000000..0f83cf6 --- /dev/null +++ b/doc/licenses/jakarta-annotation-api-1.3.5/README @@ -0,0 +1,8 @@ +Jakarta Annotations (https://eclipse-ee4j.github.io/common-annotations-api/) +---------------------------------------------------------------------------- + + Version: 1.3.5 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + EPL v2.0 (bundled/jakarta-annotation-api-1.3.5/LICENSE.md) + diff --git a/doc/licenses/jakarta-annotation-api-1.3.5/dep-coordinates.txt b/doc/licenses/jakarta-annotation-api-1.3.5/dep-coordinates.txt new file mode 100644 index 0000000..7e5e0d3 --- /dev/null +++ b/doc/licenses/jakarta-annotation-api-1.3.5/dep-coordinates.txt @@ -0,0 +1 @@ +jakarta.annotation:jakarta.annotation-api:jar:1.3.5 diff --git a/doc/licenses/jakarta-jaxb-2.3.2/LICENSE.md b/doc/licenses/jakarta-jaxb-2.3.2/LICENSE.md new file mode 100644 index 0000000..da1c1ce --- /dev/null +++ b/doc/licenses/jakarta-jaxb-2.3.2/LICENSE.md @@ -0,0 +1,28 @@ +Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Eclipse Foundation, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/doc/licenses/jakarta-jaxb-2.3.2/README b/doc/licenses/jakarta-jaxb-2.3.2/README new file mode 100644 index 0000000..8208511 --- /dev/null +++ b/doc/licenses/jakarta-jaxb-2.3.2/README @@ -0,0 +1,8 @@ +Jakarta XML Binding (https://eclipse-ee4j.github.io/jaxb-ri/) +------------------------------------------------------------- + + Version: 2.3.2 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + BSD 3-clause (bundled/jakarta-jaxb-2.3.2/LICENSE.md) + diff --git a/doc/licenses/jakarta-jaxb-2.3.2/dep-coordinates.txt b/doc/licenses/jakarta-jaxb-2.3.2/dep-coordinates.txt new file mode 100644 index 0000000..e129ed3 --- /dev/null +++ b/doc/licenses/jakarta-jaxb-2.3.2/dep-coordinates.txt @@ -0,0 +1,3 @@ +jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2 +org.glassfish.jaxb:jaxb-runtime:jar:2.3.2 +org.glassfish.jaxb:txw2:jar:2.3.2 diff --git a/doc/licenses/jakarta-jaxb-2.3.3/LICENSE.md b/doc/licenses/jakarta-jaxb-2.3.3/LICENSE.md new file mode 100644 index 0000000..da1c1ce --- /dev/null +++ b/doc/licenses/jakarta-jaxb-2.3.3/LICENSE.md @@ -0,0 +1,28 @@ +Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Eclipse Foundation, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/doc/licenses/jakarta-jaxb-2.3.3/README b/doc/licenses/jakarta-jaxb-2.3.3/README new file mode 100644 index 0000000..b0d753d --- /dev/null +++ b/doc/licenses/jakarta-jaxb-2.3.3/README @@ -0,0 +1,8 @@ +Jakarta XML Binding (https://eclipse-ee4j.github.io/jaxb-ri/) +------------------------------------------------------------- + + Version: 2.3.3 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + BSD 3-clause (bundled/jakarta-jaxb-2.3.3/LICENSE.md) + diff --git a/doc/licenses/jakarta-jaxb-2.3.3/dep-coordinates.txt b/doc/licenses/jakarta-jaxb-2.3.3/dep-coordinates.txt new file mode 100644 index 0000000..4880a45 --- /dev/null +++ b/doc/licenses/jakarta-jaxb-2.3.3/dep-coordinates.txt @@ -0,0 +1,3 @@ +jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3 +org.glassfish.jaxb:jaxb-runtime:jar:2.3.3 +org.glassfish.jaxb:txw2:jar:2.3.3 diff --git a/doc/licenses/jakarta-validation-api-2.0.2/NOTICE b/doc/licenses/jakarta-validation-api-2.0.2/NOTICE new file mode 100644 index 0000000..2046822 --- /dev/null +++ b/doc/licenses/jakarta-validation-api-2.0.2/NOTICE @@ -0,0 +1,11 @@ +# Notices for Eclipse Jakarta Bean Validation + +This content is produced and maintained by the Eclipse Jakarta Bean Validation +project. + +* Project home: https://projects.eclipse.org/projects/ee4j.bean-validation + +## Trademarks + + Jakarta Bean Validation is a trademark of the Eclipse Foundation. + diff --git a/doc/licenses/jakarta-validation-api-2.0.2/README b/doc/licenses/jakarta-validation-api-2.0.2/README new file mode 100644 index 0000000..51bf9fd --- /dev/null +++ b/doc/licenses/jakarta-validation-api-2.0.2/README @@ -0,0 +1,8 @@ +Jakarta Bean Validation API (https://beanvalidation.org/) +--------------------------------------------------------- + + Version: 2.0.2 + From: 'Red Hat Inc.' (https://www.redhat.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jakarta-validation-api-2.0.2/dep-coordinates.txt b/doc/licenses/jakarta-validation-api-2.0.2/dep-coordinates.txt new file mode 100644 index 0000000..f615ecf --- /dev/null +++ b/doc/licenses/jakarta-validation-api-2.0.2/dep-coordinates.txt @@ -0,0 +1 @@ +jakarta.validation:jakarta.validation-api:jar:2.0.2 diff --git a/doc/licenses/jakarta-validation-api-2.1.3/NOTICE b/doc/licenses/jakarta-validation-api-2.1.3/NOTICE new file mode 100644 index 0000000..2046822 --- /dev/null +++ b/doc/licenses/jakarta-validation-api-2.1.3/NOTICE @@ -0,0 +1,11 @@ +# Notices for Eclipse Jakarta Bean Validation + +This content is produced and maintained by the Eclipse Jakarta Bean Validation +project. + +* Project home: https://projects.eclipse.org/projects/ee4j.bean-validation + +## Trademarks + + Jakarta Bean Validation is a trademark of the Eclipse Foundation. + diff --git a/doc/licenses/jakarta-validation-api-2.1.3/README b/doc/licenses/jakarta-validation-api-2.1.3/README new file mode 100644 index 0000000..ed6d5b9 --- /dev/null +++ b/doc/licenses/jakarta-validation-api-2.1.3/README @@ -0,0 +1,8 @@ +Jakarta Bean Validation API (https://beanvalidation.org/) +--------------------------------------------------------- + + Version: 2.1.3 + From: 'Red Hat Inc.' (https://www.redhat.com/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jakarta-validation-api-2.1.3/dep-coordinates.txt b/doc/licenses/jakarta-validation-api-2.1.3/dep-coordinates.txt new file mode 100644 index 0000000..b112b9d --- /dev/null +++ b/doc/licenses/jakarta-validation-api-2.1.3/dep-coordinates.txt @@ -0,0 +1 @@ +jakarta.validation:jakarta.validation-api:jar:2.1.3 diff --git a/doc/licenses/jakarta-ws-rs-api-2.1.6/LICENSE.md b/doc/licenses/jakarta-ws-rs-api-2.1.6/LICENSE.md new file mode 100644 index 0000000..5de3d1b --- /dev/null +++ b/doc/licenses/jakarta-ws-rs-api-2.1.6/LICENSE.md @@ -0,0 +1,637 @@ +# Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + + 1. DEFINITIONS + + "Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + + "Contributor" means any person or entity that Distributes the Program. + + "Licensed Patents" mean patent claims licensable by a Contributor which + are necessarily infringed by the use or sale of its Contribution alone + or when combined with the Program. + + "Program" means the Contributions Distributed in accordance with this + Agreement. + + "Recipient" means anyone who receives the Program under this Agreement + or any Secondary License (as applicable), including Contributors. + + "Derivative Works" shall mean any work, whether in Source Code or other + form, that is based on (or derived from) the Program and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. + + "Modified Works" shall mean any work in Source Code or other form that + results from an addition to, deletion from, or modification of the + contents of the Program, including, for purposes of clarity any new file + in Source Code form that contains any contents of the Program. Modified + Works shall not include works that contain only declarations, + interfaces, types, classes, structures, or files of the Program solely + in each case in order to link to, bind by name, or subclass the Program + or Modified Works thereof. + + "Distribute" means the acts of a) distributing or b) making available + in any manner that enables the transfer of a copy. + + "Source Code" means the form of a Program preferred for making + modifications, including but not limited to software source code, + documentation source, and configuration files. + + "Secondary License" means either the GNU General Public License, + Version 2.0, or any later versions of that license, including any + exceptions or additional permissions as identified by the initial + Contributor. + + 2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + + 3. REQUIREMENTS + + 3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + + 3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + + 3.3 Contributors may not remove or alter any copyright, patent, + trademark, attribution notices, disclaimers of warranty, or limitations + of liability ("notices") contained within the Program from any copy of + the Program which they Distribute, provided that Contributors may add + their own appropriate notices. + + 4. COMMERCIAL DISTRIBUTION + + Commercial distributors of software may accept certain responsibilities + with respect to end users, business partners and the like. While this + license is intended to facilitate the commercial use of the Program, + the Contributor who includes the Program in a commercial product + offering should do so in a manner which does not create potential + liability for other Contributors. Therefore, if a Contributor includes + the Program in a commercial product offering, such Contributor + ("Commercial Contributor") hereby agrees to defend and indemnify every + other Contributor ("Indemnified Contributor") against any losses, + damages and costs (collectively "Losses") arising from claims, lawsuits + and other legal actions brought by a third party against the Indemnified + Contributor to the extent caused by the acts or omissions of such + Commercial Contributor in connection with its distribution of the Program + in a commercial product offering. The obligations in this section do not + apply to any claims or Losses relating to any actual or alleged + intellectual property infringement. In order to qualify, an Indemnified + Contributor must: a) promptly notify the Commercial Contributor in + writing of such claim, and b) allow the Commercial Contributor to control, + and cooperate with the Commercial Contributor in, the defense and any + related settlement negotiations. The Indemnified Contributor may + participate in any such claim at its own expense. + + For example, a Contributor might include the Program in a commercial + product offering, Product X. That Contributor is then a Commercial + Contributor. If that Commercial Contributor then makes performance + claims, or offers warranties related to Product X, those performance + claims and warranties are such Commercial Contributor's responsibility + alone. Under this section, the Commercial Contributor would have to + defend claims against the other Contributors related to those performance + claims and warranties, and if a court requires any other Contributor to + pay any damages as a result, the Commercial Contributor must pay + those damages. + + 5. NO WARRANTY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR + IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF + TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR + PURPOSE. Each Recipient is solely responsible for determining the + appropriateness of using and distributing the Program and assumes all + risks associated with its exercise of rights under this Agreement, + including but not limited to the risks and costs of program errors, + compliance with applicable laws, damage to or loss of data, programs + or equipment, and unavailability or interruption of operations. + + 6. DISCLAIMER OF LIABILITY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS + SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST + PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE + EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + 7. GENERAL + + If any provision of this Agreement is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this Agreement, and without further + action by the parties hereto, such provision shall be reformed to the + minimum extent necessary to make such provision valid and enforceable. + + If Recipient institutes patent litigation against any entity + (including a cross-claim or counterclaim in a lawsuit) alleging that the + Program itself (excluding combinations of the Program with other software + or hardware) infringes such Recipient's patent(s), then such Recipient's + rights granted under Section 2(b) shall terminate as of the date such + litigation is filed. + + All Recipient's rights under this Agreement shall terminate if it + fails to comply with any of the material terms or conditions of this + Agreement and does not cure such failure in a reasonable period of + time after becoming aware of such noncompliance. If all Recipient's + rights under this Agreement terminate, Recipient agrees to cease use + and distribution of the Program as soon as reasonably practicable. + However, Recipient's obligations under this Agreement and any licenses + granted by Recipient relating to the Program shall continue and survive. + + Everyone is permitted to copy and distribute copies of this Agreement, + but in order to avoid inconsistency the Agreement is copyrighted and + may only be modified in the following manner. The Agreement Steward + reserves the right to publish new versions (including revisions) of + this Agreement from time to time. No one other than the Agreement + Steward has the right to modify this Agreement. The Eclipse Foundation + is the initial Agreement Steward. The Eclipse Foundation may assign the + responsibility to serve as the Agreement Steward to a suitable separate + entity. Each new version of the Agreement will be given a distinguishing + version number. The Program (including Contributions) may always be + Distributed subject to the version of the Agreement under which it was + received. In addition, after a new version of the Agreement is published, + Contributor may elect to Distribute the Program (including its + Contributions) under the new version. + + Except as expressly stated in Sections 2(a) and 2(b) above, Recipient + receives no rights or licenses to the intellectual property of any + Contributor under this Agreement, whether expressly, by implication, + estoppel or otherwise. All rights in the Program not expressly granted + under this Agreement are reserved. Nothing in this Agreement is intended + to be enforceable by any entity that is not a Contributor or Recipient. + No third-party beneficiary rights are created under this Agreement. + + Exhibit A - Form of Secondary Licenses Notice + + "This Source Code may also be made available under the following + Secondary Licenses when the conditions for such availability set forth + in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), + version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + +--- + +## The GNU General Public License (GPL) Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor + Boston, MA 02110-1335 + USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your freedom to + share and change it. By contrast, the GNU General Public License is + intended to guarantee your freedom to share and change free software--to + make sure the software is free for all its users. This General Public + License applies to most of the Free Software Foundation's software and + to any other program whose authors commit to using it. (Some other Free + Software Foundation software is covered by the GNU Library General + Public License instead.) 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 this + service 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 make restrictions that forbid anyone + to deny you these rights or to ask you to surrender the rights. These + restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether gratis + or for a fee, you must give the recipients all the rights that you have. + 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. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software patents. + We wish to avoid the danger that redistributors of a free program will + individually obtain patent licenses, in effect making the program + proprietary. To prevent this, we have made it clear that any patent must + be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed under + the terms of this General Public License. The "Program", below, refers + to any such program or work, and a "work based on the Program" means + either the Program or any derivative work under copyright law: that is + to say, a work containing the Program or a portion of it, either + verbatim or with modifications and/or translated into another language. + (Hereinafter, translation is included without limitation in the term + "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running + the Program is not restricted, and the output from the Program is + covered only if its contents constitute a work based on the Program + (independent of having been made by running the Program). Whether that + is true depends on what the Program does. + + 1. You may copy and distribute 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 + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion of + it, thus forming a work based on the Program, and copy and distribute + such modifications or work under the terms of Section 1 above, provided + that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any part + thereof, to be licensed as a whole at no charge to all third parties + under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this License. + (Exception: if the Program itself is interactive but does not + normally print such an announcement, your work based on the Program + is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, and + can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based on + the Program, the distribution of the whole must be on the terms of this + License, whose permissions for other licensees extend to the entire + whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed + only for noncommercial distribution and only if you received the + program in object code or executable form with such an offer, in + accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source code + means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to control + compilation and installation of the executable. However, as a special + exception, the source code distributed need not include anything that is + normally distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies the + executable. + + If distribution of executable or object code is made by offering access + to copy from a designated place, then offering equivalent access to copy + the source code from the same place counts as distribution of the source + code, even though third parties are not compelled to copy the source + along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt otherwise + to copy, modify, sublicense or distribute the Program is void, and will + automatically terminate your rights under this License. However, parties + who have received copies, or rights, from you under this License will + not have their licenses terminated so long as such parties remain in + full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and all + its terms and conditions for copying, distributing or modifying the + Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further restrictions + on the recipients' exercise of the rights granted herein. You are not + responsible for enforcing compliance by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + 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 distribute + so as to satisfy simultaneously your obligations under this License and + any other pertinent obligations, then as a consequence you may not + distribute the Program at all. For example, if a patent license would + not permit royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only way you + could satisfy both it and this License would be to refrain entirely from + distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is implemented + by public license practices. Many people have made generous + contributions to the wide range of software distributed through that + system in reliance on consistent application of that system; it is up to + the author/donor to decide if he or she is willing to distribute + software through any other system and a licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be + a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License may + add an explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among countries + not thus excluded. In such case, this License incorporates the + limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the 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 a version number of this License which applies to it and "any + later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Program does not specify a version + number of this License, you may choose any version ever published by the + Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted by the + Free Software Foundation, write to the Free Software Foundation; we + sometimes make exceptions for this. Our decision will be guided by the + two goals of preserving the free status of all derivatives of our free + software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE 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. + + 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 convey + 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) + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands + you use may be called something other than `show w' and `show c'; they + could even be mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (which makes passes at compilers) written by + James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + + This 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 Library + General Public License instead of this License. + +--- + +## CLASSPATH EXCEPTION + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License version 2 cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from or + based on this library. If you modify this library, you may extend this + exception to your version of the library, but you are not obligated to + do so. If you do not wish to do so, delete this exception statement + from your version. diff --git a/doc/licenses/jakarta-ws-rs-api-2.1.6/README b/doc/licenses/jakarta-ws-rs-api-2.1.6/README new file mode 100644 index 0000000..6abf8c4 --- /dev/null +++ b/doc/licenses/jakarta-ws-rs-api-2.1.6/README @@ -0,0 +1,8 @@ +Jakarta RESTful Web Services (https://github.com/eclipse-ee4j/jaxrs-api/) +------------------------------------------------------------------------- + + Version: 2.1.6 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + EPL v2.0 (bundled/jakarta-ws-rs-api-2.1.6/LICENSE.md) + diff --git a/doc/licenses/jakarta-ws-rs-api-2.1.6/dep-coordinates.txt b/doc/licenses/jakarta-ws-rs-api-2.1.6/dep-coordinates.txt new file mode 100644 index 0000000..595b485 --- /dev/null +++ b/doc/licenses/jakarta-ws-rs-api-2.1.6/dep-coordinates.txt @@ -0,0 +1 @@ +jakarta.ws.rs:jakarta.ws.rs-api:jar:2.1.6 diff --git a/doc/licenses/java-jwt-4.0.0/LICENSE b/doc/licenses/java-jwt-4.0.0/LICENSE new file mode 100644 index 0000000..4a7a13a --- /dev/null +++ b/doc/licenses/java-jwt-4.0.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/doc/licenses/java-jwt-4.0.0/README b/doc/licenses/java-jwt-4.0.0/README new file mode 100644 index 0000000..4e76b4b --- /dev/null +++ b/doc/licenses/java-jwt-4.0.0/README @@ -0,0 +1,8 @@ +Java JWT (https://github.com/auth0/java-jwt) +-------------------------------------------- + + Version: 4.0.0 + From: 'Auth0 by Okta' (https://www.auth0.com) + License(s): + MIT (bundled/java-jwt-4.0.0/LICENSE) + diff --git a/doc/licenses/java-jwt-4.0.0/dep-coordinates.txt b/doc/licenses/java-jwt-4.0.0/dep-coordinates.txt new file mode 100644 index 0000000..9f6f9c1 --- /dev/null +++ b/doc/licenses/java-jwt-4.0.0/dep-coordinates.txt @@ -0,0 +1 @@ +com.auth0:java-jwt:jar:4.0.0 diff --git a/doc/licenses/java-saml-2.9.0/LICENSE b/doc/licenses/java-saml-2.9.0/LICENSE new file mode 100644 index 0000000..578413f --- /dev/null +++ b/doc/licenses/java-saml-2.9.0/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2010-2016 OneLogin, Inc. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/java-saml-2.9.0/README b/doc/licenses/java-saml-2.9.0/README new file mode 100644 index 0000000..bd815ac --- /dev/null +++ b/doc/licenses/java-saml-2.9.0/README @@ -0,0 +1,8 @@ +Onelogin Java SAML Client (https://github.com/onelogin/java-saml) +------------------------------------------------------------------------ + + Version: 2.9.0 + From: 'OneLogin' (https://www.onelogin.com) + License(s): + MIT License (bundled/java-saml-2.9.0/LICENSE) + diff --git a/doc/licenses/java-saml-2.9.0/dep-coordinates.txt b/doc/licenses/java-saml-2.9.0/dep-coordinates.txt new file mode 100644 index 0000000..2442587 --- /dev/null +++ b/doc/licenses/java-saml-2.9.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.onelogin:java-saml-core:jar:2.9.0 +com.onelogin:java-saml:jar:2.9.0 diff --git a/doc/licenses/javaee-activation-1.2.0/LICENSE.txt b/doc/licenses/javaee-activation-1.2.0/LICENSE.txt new file mode 100644 index 0000000..5ad62c4 --- /dev/null +++ b/doc/licenses/javaee-activation-1.2.0/LICENSE.txt @@ -0,0 +1,759 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1 + +1. Definitions. + + 1.1. "Contributor" means each individual or entity that creates or + contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Software, prior Modifications used by a Contributor (if any), and + the Modifications made by that particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or (b) + Modifications, or (c) the combination of files containing Original + Software with files containing Modifications, in each case including + portions thereof. + + 1.4. "Executable" means the Covered Software in any form other than + Source Code. + + 1.5. "Initial Developer" means the individual or entity that first + makes Original Software available under this License. + + 1.6. "Larger Work" means a work which combines Covered Software or + portions thereof with code not governed by the terms of this License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means the Source Code and Executable form of + any of the following: + + A. Any file that results from an addition to, deletion from or + modification of the contents of a file containing Original Software + or previous Modifications; + + B. Any new file that contains any part of the Original Software or + previous Modification; or + + C. Any new file that is contributed or otherwise made available + under the terms of this License. + + 1.10. "Original Software" means the Source Code and Executable form + of computer software code that is originally released under this + License. + + 1.11. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.12. "Source Code" means (a) the common form of computer software + code in which modifications are made and (b) associated + documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, + this License. For legal entities, "You" includes any entity which + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject + to third party intellectual property claims, the Initial Developer + hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer, to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Software (or portions thereof), with or without Modifications, + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of + Original Software, to make, have made, use, practice, sell, and + offer for sale, and/or otherwise dispose of the Original Software + (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on + the date Initial Developer first distributes or otherwise makes the + Original Software available to a third party under the terms of this + License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: (1) for code that You delete from the Original Software, or + (2) for infringements caused by: (i) the modification of the + Original Software, or (ii) the combination of the Original Software + with other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject + to third party intellectual property claims, each Contributor hereby + grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof), either on an + unmodified basis, with other Modifications, as Covered Software + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling + of Modifications made by that Contributor either alone and/or in + combination with its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, have made, and/or + otherwise dispose of: (1) Modifications made by that Contributor (or + portions thereof); and (2) the combination of Modifications made by + that Contributor with its Contributor Version (or portions of such + combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective + on the date Contributor first distributes or otherwise makes the + Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: (1) for any code that Contributor has deleted from the + Contributor Version; (2) for infringements caused by: (i) third + party modifications of Contributor Version, or (ii) the combination + of Modifications made by that Contributor with other software + (except as part of the Contributor Version) or other devices; or (3) + under Patent Claims infringed by Covered Software in the absence of + Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make available + in Executable form must also be made available in Source Code form + and that Source Code form must be distributed only under the terms + of this License. You must include a copy of this License with every + copy of the Source Code form of the Covered Software You distribute + or otherwise make available. You must inform recipients of any such + Covered Software in Executable form as to how they can obtain such + Covered Software in Source Code form in a reasonable manner on or + through a medium customarily used for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are + governed by the terms of this License. You represent that You + believe Your Modifications are Your original creation(s) and/or You + have sufficient rights to grant the rights conveyed by this License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that + identifies You as the Contributor of the Modification. You may not + remove or alter any copyright, patent or trademark notices contained + within the Covered Software, or any notices of licensing or any + descriptive text giving attribution to any Contributor or the + Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in + Source Code form that alters or restricts the applicable version of + this License or the recipients' rights hereunder. You may choose to + offer, and to charge a fee for, warranty, support, indemnity or + liability obligations to one or more recipients of Covered Software. + However, you may do so only on Your own behalf, and not on behalf of + the Initial Developer or any Contributor. You must make it + absolutely clear that any such warranty, support, indemnity or + liability obligation is offered by You alone, and You hereby agree + to indemnify the Initial Developer and every Contributor for any + liability incurred by the Initial Developer or such Contributor as a + result of warranty, support, indemnity or liability terms You offer. + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software under + the terms of this License or under the terms of a license of Your + choice, which may contain terms different from this License, + provided that You are in compliance with the terms of this License + and that the license for the Executable form does not attempt to + limit or alter the recipient's rights in the Source Code form from + the rights set forth in this License. If You distribute the Covered + Software in Executable form under a different license, You must make + it absolutely clear that any terms which differ from this License + are offered by You alone, not by the Initial Developer or + Contributor. You hereby agree to indemnify the Initial Developer and + every Contributor for any liability incurred by the Initial + Developer or such Contributor as a result of any such terms You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with + other code not governed by the terms of this License and distribute + the Larger Work as a single product. In such a case, You must make + sure the requirements of this License are fulfilled for the Covered + Software. + +4. Versions of the License. + + 4.1. New Versions. + + Oracle is the initial license steward and may publish revised and/or + new versions of this License from time to time. Each version will be + given a distinguishing version number. Except as provided in Section + 4.3, no one other than the license steward has the right to modify + this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the + Covered Software available under the terms of the version of the + License under which You originally received the Covered Software. If + the Initial Developer includes a notice in the Original Software + prohibiting it from being distributed or otherwise made available + under any subsequent version of the License, You must distribute and + make the Covered Software available under the terms of the version + of the License under which You originally received the Covered + Software. Otherwise, You may also choose to use, distribute or + otherwise make the Covered Software available under the terms of any + subsequent version of the License published by the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new + license for Your Original Software, You may create and use a + modified version of this License if You: (a) rename the license and + remove any references to the name of the license steward (except to + note that the license differs from this License); and (b) otherwise + make it clear that the license contains terms which differ from this + License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE + IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR + NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF + THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE + DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY + OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, + REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN + ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS + AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to + cure such breach within 30 days of becoming aware of the breach. + Provisions which, by their nature, must remain in effect beyond the + termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding + declaratory judgment actions) against Initial Developer or a + Contributor (the Initial Developer or Contributor against whom You + assert such claim is referred to as "Participant") alleging that the + Participant Software (meaning the Contributor Version where the + Participant is a Contributor or the Original Software where the + Participant is the Initial Developer) directly or indirectly + infringes any patent, then any and all rights granted directly or + indirectly to You by such Participant, the Initial Developer (if the + Initial Developer is not the Participant) and all Contributors under + Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice + from Participant terminate prospectively and automatically at the + expiration of such 60 day notice period, unless if within such 60 + day period You withdraw Your claim with respect to the Participant + Software against such Participant either unilaterally or pursuant to + a written agreement with Participant. + + 6.3. If You assert a patent infringement claim against Participant + alleging that the Participant Software directly or indirectly + infringes any patent where such claim is resolved (such as by + license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 6.4. In the event of termination under Sections 6.1 or 6.2 above, + all end user licenses that have been validly granted by You or any + distributor hereunder prior to termination (excluding licenses + granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE + INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF + COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE + TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER + FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR + LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE + POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT + APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH + PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH + LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR + LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION + AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is defined + in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" (as that term is defined at 48 C.F.R. + 252.227-7014(a)(1)) and "commercial computer software documentation" + as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent + with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 + (June 1995), all U.S. Government End Users acquire Covered Software + with only those rights set forth herein. This U.S. Government Rights + clause is in lieu of, and supersedes, any other FAR, DFAR, or other + clause or provision that addresses Government rights in computer + software under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + the law of the jurisdiction specified in a notice contained within + the Original Software (except to the extent applicable law, if any, + provides otherwise), excluding such jurisdiction's conflict-of-law + provisions. Any litigation relating to this License shall be subject + to the jurisdiction of the courts located in the jurisdiction and + venue specified in a notice contained within the Original Software, + with the losing party responsible for costs, including, without + limitation, court costs and reasonable attorneys' fees and expenses. + The application of the United Nations Convention on Contracts for + the International Sale of Goods is expressly excluded. Any law or + regulation which provides that the language of a contract shall be + construed against the drafter shall not apply to this License. You + agree that You alone are responsible for compliance with the United + States export administration regulations (and the export control + laws and regulation of any other countries) when You use, distribute + or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +------------------------------------------------------------------------ + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION +LICENSE (CDDL) + +The code released under the CDDL shall be governed by the laws of the +State of California (excluding conflict-of-law provisions). Any +litigation relating to this License shall be subject to the jurisdiction +of the Federal Courts of the Northern District of California and the +state courts of the State of California, with venue lying in Santa Clara +County, California. + + + + The GNU General Public License (GPL) Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor +Boston, MA 02110-1335 +USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. This General Public +License applies to most of the Free Software Foundation's software and +to any other program whose authors commit to using it. (Some other Free +Software Foundation software is covered by the GNU Library General +Public License instead.) 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 this +service 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 make restrictions that forbid anyone +to deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis +or for a fee, you must give the recipients all the rights that you have. +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. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a +notice placed by the copyright holder saying it may be distributed under +the terms of this General Public License. The "Program", below, refers +to any such program or work, and a "work based on the Program" means +either the Program or any derivative work under copyright law: that is +to say, a work containing the Program or a portion of it, either +verbatim or with modifications and/or translated into another language. +(Hereinafter, translation is included without limitation in the term +"modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of running +the Program is not restricted, and the output from the Program is +covered only if its contents constitute a work based on the Program +(independent of having been made by running the Program). Whether that +is true depends on what the Program does. + +1. You may copy and distribute 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 +and disclaimer of warranty; keep intact all the notices that refer to +this License and to the absence of any warranty; and give any other +recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of +it, thus forming a work based on the Program, and copy and distribute +such modifications or work under the terms of Section 1 above, provided +that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any part + thereof, to be licensed as a whole at no charge to all third parties + under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this License. + (Exception: if the Program itself is interactive but does not + normally print such an announcement, your work based on the Program + is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, and +can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based on +the Program, the distribution of the whole must be on the terms of this +License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a +storage or distribution medium does not bring the other work under the +scope of this License. + +3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed + only for noncommercial distribution and only if you received the + program in object code or executable form with such an offer, in + accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source code +means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to control +compilation and installation of the executable. However, as a special +exception, the source code distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies the +executable. + +If distribution of executable or object code is made by offering access +to copy from a designated place, then offering equivalent access to copy +the source code from the same place counts as distribution of the source +code, even though third parties are not compelled to copy the source +along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt otherwise +to copy, modify, sublicense or distribute the Program is void, and will +automatically terminate your rights under this License. However, parties +who have received copies, or rights, from you under this License will +not have their licenses terminated so long as such parties remain in +full compliance. + +5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all +its terms and conditions for copying, distributing or modifying the +Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions +on the recipients' exercise of the rights granted herein. You are not +responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 distribute +so as to satisfy simultaneously your obligations under this License and +any other pertinent obligations, then as a consequence you may not +distribute the Program at all. For example, if a patent license would +not permit royalty-free redistribution of the Program by all those who +receive copies directly or indirectly through you, then the only way you +could satisfy both it and this License would be to refrain entirely from +distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is implemented +by public license practices. Many people have made generous +contributions to the wide range of software distributed through that +system in reliance on consistent application of that system; it is up to +the author/donor to decide if he or she is willing to distribute +software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be +a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License may +add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among countries +not thus excluded. In such case, this License incorporates the +limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new +versions of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a version +number of this License, you may choose any version ever published by the +Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the +author to ask for permission. For software which is copyrighted by the +Free Software Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be guided by the +two goals of preserving the free status of all derivatives of our free +software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE 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. + +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 convey +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) + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands +you use may be called something other than `show w' and `show c'; they +could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (which makes passes at compilers) written by + James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + +This 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 Library +General Public License instead of this License. + +# + +Certain source files distributed by Oracle America, Inc. and/or its +affiliates are subject to the following clarification and special +exception to the GPLv2, based on the GNU Project exception for its +Classpath libraries, known as the GNU Classpath Exception, but only +where Oracle has expressly included in the particular source file's +header the words "Oracle designates this particular file as subject to +the "Classpath" exception as provided by Oracle in the LICENSE file +that accompanied this code." + +You should also note that Oracle includes multiple, independent +programs in this software package. Some of those programs are provided +under licenses deemed incompatible with the GPLv2 by the Free Software +Foundation and others. For example, the package includes programs +licensed under the Apache License, Version 2.0. Such programs are +licensed to you under their original licenses. + +Oracle facilitates your further distribution of this package by adding +the Classpath Exception to the necessary parts of its GPLv2 code, which +permits you to use that code in combination with other independent +modules not licensed under the GPLv2. However, note that this would +not permit you to commingle code under an incompatible license with +Oracle's GPLv2 licensed code by, for example, cutting and pasting such +code into a file also containing Oracle's GPLv2 licensed code and then +distributing the result. Additionally, if you were to remove the +Classpath Exception from any of the files to which it applies and +distribute the result, you would likely be required to license some or +all of the other code in that distribution under the GPLv2 as well, and +since the GPLv2 is incompatible with the license terms of some items +included in the distribution by Oracle, removing the Classpath +Exception could therefore effectively compromise your ability to +further distribute the package. + +Proceed with caution and we recommend that you obtain the advice of a +lawyer skilled in open source matters before removing the Classpath +Exception or making modifications to this package which may +subsequently be redistributed and/or involve the use of third party +software. + +CLASSPATH EXCEPTION +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License version 2 cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from or +based on this library. If you modify this library, you may extend this +exception to your version of the library, but you are not obligated to +do so. If you do not wish to do so, delete this exception statement +from your version. diff --git a/doc/licenses/javaee-activation-1.2.0/README b/doc/licenses/javaee-activation-1.2.0/README new file mode 100644 index 0000000..996821f --- /dev/null +++ b/doc/licenses/javaee-activation-1.2.0/README @@ -0,0 +1,8 @@ +JavaBeans Activation Framework (https://github.com/javaee/activation) +------------------------------u-------------------------------------- + + Version: 1.2.0 + From: 'Oracle and/or its affiliates' + License(s): + CDDL v1.1 (bundled/javaee-activation-1.2.0/LICENSE.txt) + diff --git a/doc/licenses/javaee-activation-1.2.0/dep-coordinates.txt b/doc/licenses/javaee-activation-1.2.0/dep-coordinates.txt new file mode 100644 index 0000000..fc9dd22 --- /dev/null +++ b/doc/licenses/javaee-activation-1.2.0/dep-coordinates.txt @@ -0,0 +1 @@ +javax.activation:javax.activation-api:jar:1.2.0 diff --git a/doc/licenses/javassist-3.30.2-ga/README b/doc/licenses/javassist-3.30.2-ga/README new file mode 100644 index 0000000..ace93d9 --- /dev/null +++ b/doc/licenses/javassist-3.30.2-ga/README @@ -0,0 +1,8 @@ +Javassist (https://www.javassist.org/) +-------------------------------------- + + Version: 3.30.2-GA + From: 'Shigeru Chiba' (https://github.com/chibash) + License(s): + Apache v2.0 + diff --git a/doc/licenses/javassist-3.30.2-ga/dep-coordinates.txt b/doc/licenses/javassist-3.30.2-ga/dep-coordinates.txt new file mode 100644 index 0000000..eaeede2 --- /dev/null +++ b/doc/licenses/javassist-3.30.2-ga/dep-coordinates.txt @@ -0,0 +1 @@ +org.javassist:javassist:jar:3.30.2-GA diff --git a/doc/licenses/javax.inject-1/README b/doc/licenses/javax.inject-1/README new file mode 100644 index 0000000..716a58e --- /dev/null +++ b/doc/licenses/javax.inject-1/README @@ -0,0 +1,8 @@ +JSR-330 / Dependency Injection for Java (http://code.google.com/p/atinject/) +---------------------------------------------------------------------------- + + Version: 1 + From: 'JSR-330 Expert Group' (https://jcp.org/en/jsr/detail?id=330) + License(s): + Apache v2.0 + diff --git a/doc/licenses/javax.inject-1/dep-coordinates.txt b/doc/licenses/javax.inject-1/dep-coordinates.txt new file mode 100644 index 0000000..e99938e --- /dev/null +++ b/doc/licenses/javax.inject-1/dep-coordinates.txt @@ -0,0 +1 @@ +javax.inject:javax.inject:jar:1 diff --git a/doc/licenses/jaxb-api-2.2.12/LICENSE.txt b/doc/licenses/jaxb-api-2.2.12/LICENSE.txt new file mode 100644 index 0000000..833a843 --- /dev/null +++ b/doc/licenses/jaxb-api-2.2.12/LICENSE.txt @@ -0,0 +1,274 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1 + +1. Definitions. + + 1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + + 1.4. "Executable" means the Covered Software in any form other than Source Code. + + 1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License. + + 1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means the Source Code and Executable form of any of the following: + + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + + B. Any new file that contains any part of the Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made available under the terms of this License. + + 1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License. + + 1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + + Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + + 6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +---------- +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. + + + + +The GNU General Public License (GPL) Version 2, June 1991 + + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. + +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 convey 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) + + 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General Public License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL VERSION 2 + +Certain source files distributed by Oracle are subject to the following clarification and special exception to the GPL Version 2, but only where Oracle has expressly included in the particular source file's header the words "Oracle designates this particular file as subject to the "Classpath" exception as provided by Oracle in the License file that accompanied this code." + +Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination. + +As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. diff --git a/doc/licenses/jaxb-api-2.2.12/README b/doc/licenses/jaxb-api-2.2.12/README new file mode 100644 index 0000000..3344842 --- /dev/null +++ b/doc/licenses/jaxb-api-2.2.12/README @@ -0,0 +1,8 @@ +JAXB API / XML Processing (https://github.com/javaee/jaxb-spec) +--------------------------------------------------------------- + + Version: 2.2.12 + From: 'Oracle' (http://www.oracle.com) + License(s): + CDDL v1.1 (bundled/jaxb-api-2.2.12/LICENSE.txt) + diff --git a/doc/licenses/jaxb-api-2.2.12/dep-coordinates.txt b/doc/licenses/jaxb-api-2.2.12/dep-coordinates.txt new file mode 100644 index 0000000..0abdb03 --- /dev/null +++ b/doc/licenses/jaxb-api-2.2.12/dep-coordinates.txt @@ -0,0 +1 @@ +javax.xml.bind:jaxb-api:jar:2.2.12 diff --git a/doc/licenses/jaxb-api-2.3.1/LICENSE.txt b/doc/licenses/jaxb-api-2.3.1/LICENSE.txt new file mode 100644 index 0000000..833a843 --- /dev/null +++ b/doc/licenses/jaxb-api-2.3.1/LICENSE.txt @@ -0,0 +1,274 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1 + +1. Definitions. + + 1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + + 1.4. "Executable" means the Covered Software in any form other than Source Code. + + 1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License. + + 1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means the Source Code and Executable form of any of the following: + + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + + B. Any new file that contains any part of the Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made available under the terms of this License. + + 1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License. + + 1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + + Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + + 6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +---------- +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. + + + + +The GNU General Public License (GPL) Version 2, June 1991 + + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. + +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 convey 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) + + 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General Public License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL VERSION 2 + +Certain source files distributed by Oracle are subject to the following clarification and special exception to the GPL Version 2, but only where Oracle has expressly included in the particular source file's header the words "Oracle designates this particular file as subject to the "Classpath" exception as provided by Oracle in the License file that accompanied this code." + +Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination. + +As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. diff --git a/doc/licenses/jaxb-api-2.3.1/README b/doc/licenses/jaxb-api-2.3.1/README new file mode 100644 index 0000000..2836aa8 --- /dev/null +++ b/doc/licenses/jaxb-api-2.3.1/README @@ -0,0 +1,8 @@ +JAXB API / XML Processing (https://github.com/javaee/jaxb-spec) +--------------------------------------------------------------- + + Version: 2.3.1 + From: 'Oracle' (http://www.oracle.com) + License(s): + CDDL v1.1 (bundled/jaxb-api-2.3.1/LICENSE.txt) + diff --git a/doc/licenses/jaxb-api-2.3.1/dep-coordinates.txt b/doc/licenses/jaxb-api-2.3.1/dep-coordinates.txt new file mode 100644 index 0000000..2c23cad --- /dev/null +++ b/doc/licenses/jaxb-api-2.3.1/dep-coordinates.txt @@ -0,0 +1 @@ +javax.xml.bind:jaxb-api:jar:2.3.1 diff --git a/doc/licenses/jcommander-1.82/NOTICE b/doc/licenses/jcommander-1.82/NOTICE new file mode 100644 index 0000000..c4d1f51 --- /dev/null +++ b/doc/licenses/jcommander-1.82/NOTICE @@ -0,0 +1 @@ +Copyright 2010 Cedric Beust diff --git a/doc/licenses/jcommander-1.82/README b/doc/licenses/jcommander-1.82/README new file mode 100644 index 0000000..ca37529 --- /dev/null +++ b/doc/licenses/jcommander-1.82/README @@ -0,0 +1,8 @@ +JCommander (https://jcommander.org/) +------------------------------------ + + Version: 1.82 + From: 'Cédric Beust' (https://github.com/cbeust) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jcommander-1.82/dep-coordinates.txt b/doc/licenses/jcommander-1.82/dep-coordinates.txt new file mode 100644 index 0000000..c10c9b7 --- /dev/null +++ b/doc/licenses/jcommander-1.82/dep-coordinates.txt @@ -0,0 +1 @@ +com.beust:jcommander:jar:1.82 diff --git a/doc/licenses/jersey-2.46/LICENSE.md b/doc/licenses/jersey-2.46/LICENSE.md new file mode 100644 index 0000000..345fc37 --- /dev/null +++ b/doc/licenses/jersey-2.46/LICENSE.md @@ -0,0 +1,637 @@ +# Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + + 1. DEFINITIONS + + "Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + + "Contributor" means any person or entity that Distributes the Program. + + "Licensed Patents" mean patent claims licensable by a Contributor which + are necessarily infringed by the use or sale of its Contribution alone + or when combined with the Program. + + "Program" means the Contributions Distributed in accordance with this + Agreement. + + "Recipient" means anyone who receives the Program under this Agreement + or any Secondary License (as applicable), including Contributors. + + "Derivative Works" shall mean any work, whether in Source Code or other + form, that is based on (or derived from) the Program and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. + + "Modified Works" shall mean any work in Source Code or other form that + results from an addition to, deletion from, or modification of the + contents of the Program, including, for purposes of clarity any new file + in Source Code form that contains any contents of the Program. Modified + Works shall not include works that contain only declarations, + interfaces, types, classes, structures, or files of the Program solely + in each case in order to link to, bind by name, or subclass the Program + or Modified Works thereof. + + "Distribute" means the acts of a) distributing or b) making available + in any manner that enables the transfer of a copy. + + "Source Code" means the form of a Program preferred for making + modifications, including but not limited to software source code, + documentation source, and configuration files. + + "Secondary License" means either the GNU General Public License, + Version 2.0, or any later versions of that license, including any + exceptions or additional permissions as identified by the initial + Contributor. + + 2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + + 3. REQUIREMENTS + + 3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + + 3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + + 3.3 Contributors may not remove or alter any copyright, patent, + trademark, attribution notices, disclaimers of warranty, or limitations + of liability ("notices") contained within the Program from any copy of + the Program which they Distribute, provided that Contributors may add + their own appropriate notices. + + 4. COMMERCIAL DISTRIBUTION + + Commercial distributors of software may accept certain responsibilities + with respect to end users, business partners and the like. While this + license is intended to facilitate the commercial use of the Program, + the Contributor who includes the Program in a commercial product + offering should do so in a manner which does not create potential + liability for other Contributors. Therefore, if a Contributor includes + the Program in a commercial product offering, such Contributor + ("Commercial Contributor") hereby agrees to defend and indemnify every + other Contributor ("Indemnified Contributor") against any losses, + damages and costs (collectively "Losses") arising from claims, lawsuits + and other legal actions brought by a third party against the Indemnified + Contributor to the extent caused by the acts or omissions of such + Commercial Contributor in connection with its distribution of the Program + in a commercial product offering. The obligations in this section do not + apply to any claims or Losses relating to any actual or alleged + intellectual property infringement. In order to qualify, an Indemnified + Contributor must: a) promptly notify the Commercial Contributor in + writing of such claim, and b) allow the Commercial Contributor to control, + and cooperate with the Commercial Contributor in, the defense and any + related settlement negotiations. The Indemnified Contributor may + participate in any such claim at its own expense. + + For example, a Contributor might include the Program in a commercial + product offering, Product X. That Contributor is then a Commercial + Contributor. If that Commercial Contributor then makes performance + claims, or offers warranties related to Product X, those performance + claims and warranties are such Commercial Contributor's responsibility + alone. Under this section, the Commercial Contributor would have to + defend claims against the other Contributors related to those performance + claims and warranties, and if a court requires any other Contributor to + pay any damages as a result, the Commercial Contributor must pay + those damages. + + 5. NO WARRANTY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR + IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF + TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR + PURPOSE. Each Recipient is solely responsible for determining the + appropriateness of using and distributing the Program and assumes all + risks associated with its exercise of rights under this Agreement, + including but not limited to the risks and costs of program errors, + compliance with applicable laws, damage to or loss of data, programs + or equipment, and unavailability or interruption of operations. + + 6. DISCLAIMER OF LIABILITY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS + SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST + PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE + EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + 7. GENERAL + + If any provision of this Agreement is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this Agreement, and without further + action by the parties hereto, such provision shall be reformed to the + minimum extent necessary to make such provision valid and enforceable. + + If Recipient institutes patent litigation against any entity + (including a cross-claim or counterclaim in a lawsuit) alleging that the + Program itself (excluding combinations of the Program with other software + or hardware) infringes such Recipient's patent(s), then such Recipient's + rights granted under Section 2(b) shall terminate as of the date such + litigation is filed. + + All Recipient's rights under this Agreement shall terminate if it + fails to comply with any of the material terms or conditions of this + Agreement and does not cure such failure in a reasonable period of + time after becoming aware of such noncompliance. If all Recipient's + rights under this Agreement terminate, Recipient agrees to cease use + and distribution of the Program as soon as reasonably practicable. + However, Recipient's obligations under this Agreement and any licenses + granted by Recipient relating to the Program shall continue and survive. + + Everyone is permitted to copy and distribute copies of this Agreement, + but in order to avoid inconsistency the Agreement is copyrighted and + may only be modified in the following manner. The Agreement Steward + reserves the right to publish new versions (including revisions) of + this Agreement from time to time. No one other than the Agreement + Steward has the right to modify this Agreement. The Eclipse Foundation + is the initial Agreement Steward. The Eclipse Foundation may assign the + responsibility to serve as the Agreement Steward to a suitable separate + entity. Each new version of the Agreement will be given a distinguishing + version number. The Program (including Contributions) may always be + Distributed subject to the version of the Agreement under which it was + received. In addition, after a new version of the Agreement is published, + Contributor may elect to Distribute the Program (including its + Contributions) under the new version. + + Except as expressly stated in Sections 2(a) and 2(b) above, Recipient + receives no rights or licenses to the intellectual property of any + Contributor under this Agreement, whether expressly, by implication, + estoppel or otherwise. All rights in the Program not expressly granted + under this Agreement are reserved. Nothing in this Agreement is intended + to be enforceable by any entity that is not a Contributor or Recipient. + No third-party beneficiary rights are created under this Agreement. + + Exhibit A - Form of Secondary Licenses Notice + + "This Source Code may also be made available under the following + Secondary Licenses when the conditions for such availability set forth + in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), + version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + +--- + +## The GNU General Public License (GPL) Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor + Boston, MA 02110-1335 + USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your freedom to + share and change it. By contrast, the GNU General Public License is + intended to guarantee your freedom to share and change free software--to + make sure the software is free for all its users. This General Public + License applies to most of the Free Software Foundation's software and + to any other program whose authors commit to using it. (Some other Free + Software Foundation software is covered by the GNU Library General + Public License instead.) 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 this + service 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 make restrictions that forbid anyone + to deny you these rights or to ask you to surrender the rights. These + restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether gratis + or for a fee, you must give the recipients all the rights that you have. + 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. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software patents. + We wish to avoid the danger that redistributors of a free program will + individually obtain patent licenses, in effect making the program + proprietary. To prevent this, we have made it clear that any patent must + be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed under + the terms of this General Public License. The "Program", below, refers + to any such program or work, and a "work based on the Program" means + either the Program or any derivative work under copyright law: that is + to say, a work containing the Program or a portion of it, either + verbatim or with modifications and/or translated into another language. + (Hereinafter, translation is included without limitation in the term + "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running + the Program is not restricted, and the output from the Program is + covered only if its contents constitute a work based on the Program + (independent of having been made by running the Program). Whether that + is true depends on what the Program does. + + 1. You may copy and distribute 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 + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion of + it, thus forming a work based on the Program, and copy and distribute + such modifications or work under the terms of Section 1 above, provided + that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any part + thereof, to be licensed as a whole at no charge to all third parties + under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this License. + (Exception: if the Program itself is interactive but does not + normally print such an announcement, your work based on the Program + is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, and + can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based on + the Program, the distribution of the whole must be on the terms of this + License, whose permissions for other licensees extend to the entire + whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed + only for noncommercial distribution and only if you received the + program in object code or executable form with such an offer, in + accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source code + means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to control + compilation and installation of the executable. However, as a special + exception, the source code distributed need not include anything that is + normally distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies the + executable. + + If distribution of executable or object code is made by offering access + to copy from a designated place, then offering equivalent access to copy + the source code from the same place counts as distribution of the source + code, even though third parties are not compelled to copy the source + along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt otherwise + to copy, modify, sublicense or distribute the Program is void, and will + automatically terminate your rights under this License. However, parties + who have received copies, or rights, from you under this License will + not have their licenses terminated so long as such parties remain in + full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and all + its terms and conditions for copying, distributing or modifying the + Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further restrictions + on the recipients' exercise of the rights granted herein. You are not + responsible for enforcing compliance by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + 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 distribute + so as to satisfy simultaneously your obligations under this License and + any other pertinent obligations, then as a consequence you may not + distribute the Program at all. For example, if a patent license would + not permit royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only way you + could satisfy both it and this License would be to refrain entirely from + distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is implemented + by public license practices. Many people have made generous + contributions to the wide range of software distributed through that + system in reliance on consistent application of that system; it is up to + the author/donor to decide if he or she is willing to distribute + software through any other system and a licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be + a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License may + add an explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among countries + not thus excluded. In such case, this License incorporates the + limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the 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 a version number of this License which applies to it and "any + later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Program does not specify a version + number of this License, you may choose any version ever published by the + Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted by the + Free Software Foundation, write to the Free Software Foundation; we + sometimes make exceptions for this. Our decision will be guided by the + two goals of preserving the free status of all derivatives of our free + software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE 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. + + 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 convey + 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) + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands + you use may be called something other than `show w' and `show c'; they + could even be mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (which makes passes at compilers) written by + James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + + This 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 Library + General Public License instead of this License. + +--- + +## CLASSPATH EXCEPTION + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License version 2 cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from or + based on this library. If you modify this library, you may extend this + exception to your version of the library, but you are not obligated to + do so. If you do not wish to do so, delete this exception statement + from your version. diff --git a/doc/licenses/jersey-2.46/README b/doc/licenses/jersey-2.46/README new file mode 100644 index 0000000..b42a5db --- /dev/null +++ b/doc/licenses/jersey-2.46/README @@ -0,0 +1,8 @@ +Jersey (https://jersey.java.net/) +--------------------------------- + + Version: 2.46 + From: 'Eclipse Foundation' (https://www.eclipse.org/) + License(s): + EPL v2.0 (bundled/jersey-2.46/LICENSE.md) + diff --git a/doc/licenses/jersey-2.46/dep-coordinates.txt b/doc/licenses/jersey-2.46/dep-coordinates.txt new file mode 100644 index 0000000..67aecd0 --- /dev/null +++ b/doc/licenses/jersey-2.46/dep-coordinates.txt @@ -0,0 +1,7 @@ +org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.46 +org.glassfish.jersey.core:jersey-common:jar:2.46 +org.glassfish.jersey.core:jersey-server:jar:2.46 +org.glassfish.jersey.core:jersey-client:jar:2.46 +org.glassfish.jersey.inject:jersey-hk2:jar:2.46 +org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.46 +org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.46 diff --git a/doc/licenses/jetbrains-annotations-13.0/README b/doc/licenses/jetbrains-annotations-13.0/README new file mode 100644 index 0000000..e09618c --- /dev/null +++ b/doc/licenses/jetbrains-annotations-13.0/README @@ -0,0 +1,9 @@ +Annotations for JVM-based languages +(https://github.com/JetBrains/java-annotations) +----------------------------------------------- + + Version: 13.0 + From: 'JetBrains s.r.o.' (http://www.jetbrains.com) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jetbrains-annotations-13.0/dep-coordinates.txt b/doc/licenses/jetbrains-annotations-13.0/dep-coordinates.txt new file mode 100644 index 0000000..bb558cd --- /dev/null +++ b/doc/licenses/jetbrains-annotations-13.0/dep-coordinates.txt @@ -0,0 +1 @@ +org.jetbrains:annotations:jar:13.0 diff --git a/doc/licenses/joda-time-2.10.6/NOTICE b/doc/licenses/joda-time-2.10.6/NOTICE new file mode 100644 index 0000000..b8f54d7 --- /dev/null +++ b/doc/licenses/joda-time-2.10.6/NOTICE @@ -0,0 +1,2 @@ +This product includes software developed by +Joda.org (https://www.joda.org/). diff --git a/doc/licenses/joda-time-2.10.6/README b/doc/licenses/joda-time-2.10.6/README new file mode 100644 index 0000000..a10eaf6 --- /dev/null +++ b/doc/licenses/joda-time-2.10.6/README @@ -0,0 +1,8 @@ +Joda-Time (https://www.joda.org/joda-time/) +---------------------------------------------- + + Version: 2.10.6 + From: 'Joda.org' (https://www.joda.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/joda-time-2.10.6/dep-coordinates.txt b/doc/licenses/joda-time-2.10.6/dep-coordinates.txt new file mode 100644 index 0000000..a210c5c --- /dev/null +++ b/doc/licenses/joda-time-2.10.6/dep-coordinates.txt @@ -0,0 +1 @@ +joda-time:joda-time:jar:2.10.6 diff --git a/doc/licenses/jose4j-0.9.6/NOTICE b/doc/licenses/jose4j-0.9.6/NOTICE new file mode 100644 index 0000000..57e9303 --- /dev/null +++ b/doc/licenses/jose4j-0.9.6/NOTICE @@ -0,0 +1,14 @@ +jose4j +Copyright 2012-2024 Brian Campbell + +EcdsaUsingShaAlgorithm contains code for converting the concatenated +R & S values of the signature to and from DER, which was originally +derived from the Apache Santuario XML Security library's SignatureECDSA +implementation. http://santuario.apache.org/ + +The Base64 implementation in this software was derived from the +Apache Commons Codec project. http://commons.apache.org/proper/commons-codec/ + +JSON processing in this software was derived from the JSON.simple toolkit. +https://code.google.com/p/json-simple/ + diff --git a/doc/licenses/jose4j-0.9.6/README b/doc/licenses/jose4j-0.9.6/README new file mode 100644 index 0000000..d3e549c --- /dev/null +++ b/doc/licenses/jose4j-0.9.6/README @@ -0,0 +1,8 @@ +jose.4.j (https://bitbucket.org/b_c/jose4j/) +-------------------------------------------- + + Version: 0.9.6 + From: 'Brian Campbell' (https://bitbucket.org/b_c/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/jose4j-0.9.6/dep-coordinates.txt b/doc/licenses/jose4j-0.9.6/dep-coordinates.txt new file mode 100644 index 0000000..eca1c8a --- /dev/null +++ b/doc/licenses/jose4j-0.9.6/dep-coordinates.txt @@ -0,0 +1 @@ +org.bitbucket.b_c:jose4j:jar:0.9.6 diff --git a/doc/licenses/jquery-3.7.1/LICENSE.txt b/doc/licenses/jquery-3.7.1/LICENSE.txt new file mode 100644 index 0000000..f642c3f --- /dev/null +++ b/doc/licenses/jquery-3.7.1/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/jquery-3.7.1/README b/doc/licenses/jquery-3.7.1/README new file mode 100644 index 0000000..5e5cec4 --- /dev/null +++ b/doc/licenses/jquery-3.7.1/README @@ -0,0 +1,8 @@ +jQuery (http://jquery.com/) +--------------------------- + + Version: 3.7.1 + From: 'OpenJS Foundation' (https://openjsf.org/) + License(s): + MIT (bundled/jquery-3.7.1/LICENSE.txt) + diff --git a/doc/licenses/jquery-3.7.1/dep-coordinates.txt b/doc/licenses/jquery-3.7.1/dep-coordinates.txt new file mode 100644 index 0000000..12b56f7 --- /dev/null +++ b/doc/licenses/jquery-3.7.1/dep-coordinates.txt @@ -0,0 +1 @@ +jquery:3.7.1 diff --git a/doc/licenses/jradius-1.1.5/LICENSE b/doc/licenses/jradius-1.1.5/LICENSE new file mode 100644 index 0000000..ff1be90 --- /dev/null +++ b/doc/licenses/jradius-1.1.5/LICENSE @@ -0,0 +1,545 @@ +========================================================================== + +Coova JRadius License: + +The Coova JRadius core libraries are licensed under the The GNU +Library or "Lesser" General Public License (LGPL), while stand-alone +applications within in the JRadius project, listed below, are released +under the standard The GNU General Public License (GPL). For details, +visit http://www.coova.org/JRadius. See source files for details +regarding stand-alone applications contained herein which are +released under the GPL. + +Copyright 2006-2010 Coova Technologies, LLC. All rights reserved. + +See doc/GPL-LICENSE, doc/LGPL-LICENSE, and source files for details. + +========================================================================== + +Original JRadius License: + +The JRadius core library is licensed under the The GNU Library or "Lesser" +General Public License (LGPL), while stand-alone applications within in the +JRadius project, listed below, are released under the standard The GNU +General Public License (GPL). For details, visit http://jradius.net/ + +This software is OSI Certified Open Source Software. OSI Certified is a +certification mark of the Open Source Initiative. + +Stand-alone JRadius Applications: + + * JRadiusSimulator + * JRadiusWiFiClient + * RadClient + * RadBench + * RadiusDictionary + +Copyright 2004-2006 PicoPoint, B.V. +Copyright 2006-2008 David Bird + +See doc/GPL-LICENSE, doc/LGPL-LICENSE, and source files for details. + +========================================================================== + +GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/doc/licenses/jradius-1.1.5/README b/doc/licenses/jradius-1.1.5/README new file mode 100644 index 0000000..4d52096 --- /dev/null +++ b/doc/licenses/jradius-1.1.5/README @@ -0,0 +1,8 @@ +JRadius (https://github.com/coova/jradius) +------------------------------------------ + + Version: 1.1.5 + From: 'Coova Technologies, LLC' (https://coova.github.io) + License(s): + LGPL-2.1 (bundled/jradius-1.1.5/LICENSE) + diff --git a/doc/licenses/jradius-1.1.5/dep-coordinates.txt b/doc/licenses/jradius-1.1.5/dep-coordinates.txt new file mode 100644 index 0000000..8beebb1 --- /dev/null +++ b/doc/licenses/jradius-1.1.5/dep-coordinates.txt @@ -0,0 +1,3 @@ +net.jradius:jradius-core:jar:1.1.5 +net.jradius:jradius-dictionary:jar:1.1.5 +net.jradius:jradius-extended:jar:1.1.5 diff --git a/doc/licenses/jsr250-api-1.0/CDDLv1.0.txt b/doc/licenses/jsr250-api-1.0/CDDLv1.0.txt new file mode 100644 index 0000000..5f3844e --- /dev/null +++ b/doc/licenses/jsr250-api-1.0/CDDLv1.0.txt @@ -0,0 +1,119 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +1. Definitions. + +1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. + +1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + +1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + +1.4. Executable means the Covered Software in any form other than Source Code. + +1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. + +1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + +1.7. License means this document. + +1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.9. Modifications means the Source Code and Executable form of any of the following: + +A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + +B. Any new file that contains any part of the Original Software or previous Modification; or + +C. Any new file that is contributed or otherwise made available under the terms of this License. + +1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. + +1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + +1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a)the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b)ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + +2.1. The Initial Developer Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: +(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and +(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). +(c) The licenses granted in Sections2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. +(d) Notwithstanding Section2.1(b) above, no patent license is granted: (1)for code that You delete from the Original Software, or (2)for infringements caused by: (i)the modification of the Original Software, or (ii)the combination of the Original Software with other software or devices. + +2.2. Contributor Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: +(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and +(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1)Modifications made by that Contributor (or portions thereof); and (2)the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). +(c) The licenses granted in Sections2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. +(d) Notwithstanding Section2.2(b) above, no patent license is granted: (1)for any code that Contributor has deleted from the Contributor Version; (2)for infringements caused by: (i)third party modifications of Contributor Version, or (ii)the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3)under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Availability of Source Code. + +Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + +3.2. Modifications. + +The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + +3.3. Required Notices. +You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + +3.4. Application of Additional Terms. +You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.5. Distribution of Executable Versions. +You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipients rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.6. Larger Works. +You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + +4.1. New Versions. +Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + +4.2. Effect of New Versions. + +You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. +4.3. Modified Versions. + +When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a)rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b)otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. + +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + +6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + +6.3. In the event of termination under Sections6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + +The Covered Software is a commercial item, as that term is defined in 48C.F.R.2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R. 252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48C.F.R.12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +The GlassFish code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. + + + diff --git a/doc/licenses/jsr250-api-1.0/README b/doc/licenses/jsr250-api-1.0/README new file mode 100644 index 0000000..a939af5 --- /dev/null +++ b/doc/licenses/jsr250-api-1.0/README @@ -0,0 +1,9 @@ +JSR-250 Reference Implementation +(https://jcp.org/aboutJava/communityprocess/final/jsr250/index.html) +-------------------------------------------------------------------- + + Version: 1.0 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + CDDL v1.0 (bundled/jsr250-api-1.0/CDDLv1.0.txt) + diff --git a/doc/licenses/jsr250-api-1.0/dep-coordinates.txt b/doc/licenses/jsr250-api-1.0/dep-coordinates.txt new file mode 100644 index 0000000..0fce8f9 --- /dev/null +++ b/doc/licenses/jsr250-api-1.0/dep-coordinates.txt @@ -0,0 +1 @@ +javax.annotation:jsr250-api:jar:1.0 diff --git a/doc/licenses/jstz-2.1.1/LICENSE b/doc/licenses/jstz-2.1.1/LICENSE new file mode 100644 index 0000000..c48af16 --- /dev/null +++ b/doc/licenses/jstz-2.1.1/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2012 Jon Nylander, project maintained at +https://bitbucket.org/pellepim/jstimezonedetect + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to +do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/doc/licenses/jstz-2.1.1/README b/doc/licenses/jstz-2.1.1/README new file mode 100644 index 0000000..09acbde --- /dev/null +++ b/doc/licenses/jstz-2.1.1/README @@ -0,0 +1,8 @@ +JSTZ (https://github.com/iansinnott/jstz) +----------------------------------------- + + Version: 2.1.1 + From: 'Jon Nylander' (https://github.com/pellepim) + License(s): + MIT (bundled/jstz-2.1.1/LICENSE) + diff --git a/doc/licenses/jstz-2.1.1/dep-coordinates.txt b/doc/licenses/jstz-2.1.1/dep-coordinates.txt new file mode 100644 index 0000000..2770176 --- /dev/null +++ b/doc/licenses/jstz-2.1.1/dep-coordinates.txt @@ -0,0 +1 @@ +jstz:2.1.1 diff --git a/doc/licenses/kotlin-1.4.10/NOTICE.txt b/doc/licenses/kotlin-1.4.10/NOTICE.txt new file mode 100644 index 0000000..0f3e7c2 --- /dev/null +++ b/doc/licenses/kotlin-1.4.10/NOTICE.txt @@ -0,0 +1,2 @@ +Kotlin Compiler +Copyright 2010-2023 JetBrains s.r.o and respective authors and developers diff --git a/doc/licenses/kotlin-1.4.10/README b/doc/licenses/kotlin-1.4.10/README new file mode 100644 index 0000000..a89a5ce --- /dev/null +++ b/doc/licenses/kotlin-1.4.10/README @@ -0,0 +1,8 @@ +Kotlin (https://kotlinlang.org/) +-------------------------------- + + Version: 1.4.10 + From: 'JetBrains s.r.o and respective authors and developers' + License(s): + Apache v2.0 + diff --git a/doc/licenses/kotlin-1.4.10/dep-coordinates.txt b/doc/licenses/kotlin-1.4.10/dep-coordinates.txt new file mode 100644 index 0000000..9eedc33 --- /dev/null +++ b/doc/licenses/kotlin-1.4.10/dep-coordinates.txt @@ -0,0 +1,5 @@ +org.jetbrains.kotlin:kotlin-reflect:jar:1.4.10 +org.jetbrains.kotlin:kotlin-stdlib:jar:1.4.10 +org.jetbrains.kotlin:kotlin-stdlib-common:jar:1.4.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:1.4.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:1.4.10 diff --git a/doc/licenses/kotlin-1.9.25/NOTICE.txt b/doc/licenses/kotlin-1.9.25/NOTICE.txt new file mode 100644 index 0000000..0f3e7c2 --- /dev/null +++ b/doc/licenses/kotlin-1.9.25/NOTICE.txt @@ -0,0 +1,2 @@ +Kotlin Compiler +Copyright 2010-2023 JetBrains s.r.o and respective authors and developers diff --git a/doc/licenses/kotlin-1.9.25/README b/doc/licenses/kotlin-1.9.25/README new file mode 100644 index 0000000..53a448a --- /dev/null +++ b/doc/licenses/kotlin-1.9.25/README @@ -0,0 +1,8 @@ +Kotlin (https://kotlinlang.org/) +-------------------------------- + + Version: 1.9.25 + From: 'JetBrains s.r.o and respective authors and developers' + License(s): + Apache v2.0 + diff --git a/doc/licenses/kotlin-1.9.25/dep-coordinates.txt b/doc/licenses/kotlin-1.9.25/dep-coordinates.txt new file mode 100644 index 0000000..d8221f9 --- /dev/null +++ b/doc/licenses/kotlin-1.9.25/dep-coordinates.txt @@ -0,0 +1,5 @@ +org.jetbrains.kotlin:kotlin-reflect:jar:1.9.25 +org.jetbrains.kotlin:kotlin-stdlib:jar:1.9.25 +org.jetbrains.kotlin:kotlin-stdlib-common:jar:1.9.25 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:1.9.25 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:1.9.25 diff --git a/doc/licenses/kotlinx-serialization-1.7.2/NOTICE.txt b/doc/licenses/kotlinx-serialization-1.7.2/NOTICE.txt new file mode 100644 index 0000000..4560ea0 --- /dev/null +++ b/doc/licenses/kotlinx-serialization-1.7.2/NOTICE.txt @@ -0,0 +1,2 @@ +kotlinx.serialization library. +Copyright 2017-2023 JetBrains s.r.o and respective authors and developers diff --git a/doc/licenses/kotlinx-serialization-1.7.2/README b/doc/licenses/kotlinx-serialization-1.7.2/README new file mode 100644 index 0000000..31687c5 --- /dev/null +++ b/doc/licenses/kotlinx-serialization-1.7.2/README @@ -0,0 +1,8 @@ +Kotlin Serialization (https://github.com/Kotlin/kotlinx.serialization) +---------------------------------------------------------------------- + + Version: 1.7.2 + From: 'JetBrains s.r.o and respective authors and developers' + License(s): + Apache v2.0 + diff --git a/doc/licenses/kotlinx-serialization-1.7.2/dep-coordinates.txt b/doc/licenses/kotlinx-serialization-1.7.2/dep-coordinates.txt new file mode 100644 index 0000000..e5f1528 --- /dev/null +++ b/doc/licenses/kotlinx-serialization-1.7.2/dep-coordinates.txt @@ -0,0 +1,2 @@ +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:1.7.2 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:1.7.2 diff --git a/doc/licenses/ksm-sdk-17.0.0/LICENSE b/doc/licenses/ksm-sdk-17.0.0/LICENSE new file mode 100644 index 0000000..b63322a --- /dev/null +++ b/doc/licenses/ksm-sdk-17.0.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Keeper Security + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/ksm-sdk-17.0.0/README b/doc/licenses/ksm-sdk-17.0.0/README new file mode 100644 index 0000000..e84f099 --- /dev/null +++ b/doc/licenses/ksm-sdk-17.0.0/README @@ -0,0 +1,9 @@ +Keeper Secrets Manager Java SDK +(https://github.com/Keeper-Security/secrets-manager) +---------------------------------------------------- + + Version: 17.0.0 + From: 'Keeper Security' (https://www.keepersecurity.com/) + License(s): + MIT (bundled/ksm-sdk-17.0.0/LICENSE) + diff --git a/doc/licenses/ksm-sdk-17.0.0/dep-coordinates.txt b/doc/licenses/ksm-sdk-17.0.0/dep-coordinates.txt new file mode 100644 index 0000000..bf11a8f --- /dev/null +++ b/doc/licenses/ksm-sdk-17.0.0/dep-coordinates.txt @@ -0,0 +1 @@ +com.keepersecurity.secrets-manager:core:jar:17.0.0 diff --git a/doc/licenses/lodash-4.17.21/LICENSE b/doc/licenses/lodash-4.17.21/LICENSE new file mode 100644 index 0000000..77c42f1 --- /dev/null +++ b/doc/licenses/lodash-4.17.21/LICENSE @@ -0,0 +1,47 @@ +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. diff --git a/doc/licenses/lodash-4.17.21/README b/doc/licenses/lodash-4.17.21/README new file mode 100644 index 0000000..b377725 --- /dev/null +++ b/doc/licenses/lodash-4.17.21/README @@ -0,0 +1,8 @@ +Lodash (https://lodash.com/) +---------------------------- + + Version: 4.17.21 + From: 'OpenJS Foundation' (https://openjsf.org/) + License(s): + MIT (bundled/lodash-4.17.21/LICENSE) + diff --git a/doc/licenses/lodash-4.17.21/dep-coordinates.txt b/doc/licenses/lodash-4.17.21/dep-coordinates.txt new file mode 100644 index 0000000..4f91880 --- /dev/null +++ b/doc/licenses/lodash-4.17.21/dep-coordinates.txt @@ -0,0 +1 @@ +lodash:4.17.21 diff --git a/doc/licenses/logback-1.3.15/LICENSE.txt b/doc/licenses/logback-1.3.15/LICENSE.txt new file mode 100644 index 0000000..ae6eeac --- /dev/null +++ b/doc/licenses/logback-1.3.15/LICENSE.txt @@ -0,0 +1,17 @@ +Logback LICENSE +--------------- + +Logback: the reliable, generic, fast and flexible logging framework. +Copyright (C) 1999-2015, QOS.ch. All rights reserved. + +This program and the accompanying materials are dual-licensed under +either the terms of the Eclipse Public License v1.0 as published by +the Eclipse Foundation + + or (per the licensee's choosing) + +under the terms of the GNU Lesser General Public License version 2.1 +as published by the Free Software Foundation. + +** ECLIPSE PUBLIC LICENSE v1.0 CHOSEN. ** + diff --git a/doc/licenses/logback-1.3.15/README b/doc/licenses/logback-1.3.15/README new file mode 100644 index 0000000..15c2463 --- /dev/null +++ b/doc/licenses/logback-1.3.15/README @@ -0,0 +1,8 @@ +Logback (http://logback.qos.ch/) +-------------------------------- + + Version: 1.3.15 + From: 'QOS.ch Sàrl' (http://qos.ch/) + License(s): + EPL v1.0 (bundled/logback-1.3.15/LICENSE.txt) + diff --git a/doc/licenses/logback-1.3.15/dep-coordinates.txt b/doc/licenses/logback-1.3.15/dep-coordinates.txt new file mode 100644 index 0000000..6afe7bd --- /dev/null +++ b/doc/licenses/logback-1.3.15/dep-coordinates.txt @@ -0,0 +1,2 @@ +ch.qos.logback:logback-classic:jar:1.3.15 +ch.qos.logback:logback-core:jar:1.3.15 diff --git a/doc/licenses/logging-interceptor-4.9.1/NOTICE b/doc/licenses/logging-interceptor-4.9.1/NOTICE new file mode 100644 index 0000000..d8bff2e --- /dev/null +++ b/doc/licenses/logging-interceptor-4.9.1/NOTICE @@ -0,0 +1,13 @@ +Copyright 2019 Square, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/doc/licenses/logging-interceptor-4.9.1/README b/doc/licenses/logging-interceptor-4.9.1/README new file mode 100644 index 0000000..e6c30ce --- /dev/null +++ b/doc/licenses/logging-interceptor-4.9.1/README @@ -0,0 +1,8 @@ +OkHttp Logging Interceptor (https://square.github.io/okhttp/) +------------------------------------------------------------- + + Version: 4.9.1 + From: 'Square Inc' + License(s): + Apache v2.0 + diff --git a/doc/licenses/logging-interceptor-4.9.1/dep-coordinates.txt b/doc/licenses/logging-interceptor-4.9.1/dep-coordinates.txt new file mode 100644 index 0000000..aeab282 --- /dev/null +++ b/doc/licenses/logging-interceptor-4.9.1/dep-coordinates.txt @@ -0,0 +1 @@ +com.squareup.okhttp3:logging-interceptor:jar:4.9.1 \ No newline at end of file diff --git a/doc/licenses/make-plural-3.0.6/LICENSE b/doc/licenses/make-plural-3.0.6/LICENSE new file mode 100644 index 0000000..aca3d36 --- /dev/null +++ b/doc/licenses/make-plural-3.0.6/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2014-2016 by Eemeli Aro + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/doc/licenses/make-plural-3.0.6/README b/doc/licenses/make-plural-3.0.6/README new file mode 100644 index 0000000..a4ddda5 --- /dev/null +++ b/doc/licenses/make-plural-3.0.6/README @@ -0,0 +1,8 @@ +make-plural (https://github.com/eemeli/make-plural) +--------------------------------------------------- + + Version: 3.0.6 + From: 'Eemeli Aro' (https://github.com/eemeli) + License(s): + ISC (bundled/make-plural-3.0.6/LICENSE) + diff --git a/doc/licenses/make-plural-3.0.6/dep-coordinates.txt b/doc/licenses/make-plural-3.0.6/dep-coordinates.txt new file mode 100644 index 0000000..6005650 --- /dev/null +++ b/doc/licenses/make-plural-3.0.6/dep-coordinates.txt @@ -0,0 +1 @@ +make-plural:3.0.6 diff --git a/doc/licenses/messageformat-1.0.2/LICENSE b/doc/licenses/messageformat-1.0.2/LICENSE new file mode 100644 index 0000000..6b9ea5b --- /dev/null +++ b/doc/licenses/messageformat-1.0.2/LICENSE @@ -0,0 +1,20 @@ +Copyright 2012-2016 Alex Sexton, Eemeli Aro, and Contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/messageformat-1.0.2/README b/doc/licenses/messageformat-1.0.2/README new file mode 100644 index 0000000..9a9653f --- /dev/null +++ b/doc/licenses/messageformat-1.0.2/README @@ -0,0 +1,8 @@ +messageformat ( (https://messageformat.github.io/) +-------------------------------------------------- + + Version: 1.0.2 + From: 'Alex Sexton, Eemeli Aro, and Contributors' + License(s): + MIT (bundled/messageformat-1.0.2/LICENSE) + diff --git a/doc/licenses/messageformat-1.0.2/dep-coordinates.txt b/doc/licenses/messageformat-1.0.2/dep-coordinates.txt new file mode 100644 index 0000000..09367ea --- /dev/null +++ b/doc/licenses/messageformat-1.0.2/dep-coordinates.txt @@ -0,0 +1 @@ +messageformat:1.0.2 diff --git a/doc/licenses/messageformat-parser-1.1.0/LICENSE b/doc/licenses/messageformat-parser-1.1.0/LICENSE new file mode 100644 index 0000000..6b9ea5b --- /dev/null +++ b/doc/licenses/messageformat-parser-1.1.0/LICENSE @@ -0,0 +1,20 @@ +Copyright 2012-2016 Alex Sexton, Eemeli Aro, and Contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/messageformat-parser-1.1.0/README b/doc/licenses/messageformat-parser-1.1.0/README new file mode 100644 index 0000000..bc9d129 --- /dev/null +++ b/doc/licenses/messageformat-parser-1.1.0/README @@ -0,0 +1,8 @@ +messageformat-parser (https://messageformat.github.io/) +------------------------------------------------------- + + Version: 1.1.0 + From: 'Alex Sexton, Eemeli Aro, and Contributors' + License(s): + MIT (bundled/messageformat-parser-1.1.0/LICENSE) + diff --git a/doc/licenses/messageformat-parser-1.1.0/dep-coordinates.txt b/doc/licenses/messageformat-parser-1.1.0/dep-coordinates.txt new file mode 100644 index 0000000..c323029 --- /dev/null +++ b/doc/licenses/messageformat-parser-1.1.0/dep-coordinates.txt @@ -0,0 +1 @@ +messageformat-parser:1.1.0 diff --git a/doc/licenses/mybatis-3.5.19/NOTICE b/doc/licenses/mybatis-3.5.19/NOTICE new file mode 100644 index 0000000..35d17fd --- /dev/null +++ b/doc/licenses/mybatis-3.5.19/NOTICE @@ -0,0 +1,45 @@ +iBATIS + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + Copyright 2010 The Apache Software Foundation + +OGNL +//-------------------------------------------------------------------------- +// Copyright (c) 2004, Drew Davidson and Luke Blanshard +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// Neither the name of the Drew Davidson nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +//-------------------------------------------------------------------------- + +Refactored SqlBuilder class (SQL, AbstractSQL) + + This product includes software developed by + Adam Gent (https://gist.github.com/3650165) + + Copyright 2010 Adam Gent + diff --git a/doc/licenses/mybatis-3.5.19/README b/doc/licenses/mybatis-3.5.19/README new file mode 100644 index 0000000..e40f1f3 --- /dev/null +++ b/doc/licenses/mybatis-3.5.19/README @@ -0,0 +1,8 @@ +MyBatis (http://www.mybatis.org/mybatis-3/) +------------------------------------------- + + Version: 3.5.19 + From: 'MyBatis' (http://www.mybatis.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/mybatis-3.5.19/dep-coordinates.txt b/doc/licenses/mybatis-3.5.19/dep-coordinates.txt new file mode 100644 index 0000000..9606604 --- /dev/null +++ b/doc/licenses/mybatis-3.5.19/dep-coordinates.txt @@ -0,0 +1 @@ +org.mybatis:mybatis:jar:3.5.19 diff --git a/doc/licenses/mybatis-guice-3.18/NOTICE b/doc/licenses/mybatis-guice-3.18/NOTICE new file mode 100644 index 0000000..328bb03 --- /dev/null +++ b/doc/licenses/mybatis-guice-3.18/NOTICE @@ -0,0 +1,15 @@ +MyBatis-Guice +Copyright 2010-2013 + +This product includes software developed by +The MyBatis Team (http://www.mybatis.org/). + +iBATIS + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + Copyright 2010 The Apache Software Foundation + +Google Guice + Copyright 2010 The Apache Software Foundation + diff --git a/doc/licenses/mybatis-guice-3.18/README b/doc/licenses/mybatis-guice-3.18/README new file mode 100644 index 0000000..9cc0c0a --- /dev/null +++ b/doc/licenses/mybatis-guice-3.18/README @@ -0,0 +1,8 @@ +MyBatis-Guice (http://www.mybatis.org/guice/) +--------------------------------------------- + + Version: 3.18 + From: 'MyBatis' (http://www.mybatis.org/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/mybatis-guice-3.18/dep-coordinates.txt b/doc/licenses/mybatis-guice-3.18/dep-coordinates.txt new file mode 100644 index 0000000..dbe9193 --- /dev/null +++ b/doc/licenses/mybatis-guice-3.18/dep-coordinates.txt @@ -0,0 +1 @@ +org.mybatis:mybatis-guice:jar:3.18 diff --git a/doc/licenses/object-assign-4.1.1/LICENSE b/doc/licenses/object-assign-4.1.1/LICENSE new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/doc/licenses/object-assign-4.1.1/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/doc/licenses/object-assign-4.1.1/README b/doc/licenses/object-assign-4.1.1/README new file mode 100644 index 0000000..1ec09f6 --- /dev/null +++ b/doc/licenses/object-assign-4.1.1/README @@ -0,0 +1,8 @@ +object-assign (https://github.com/sindresorhus/object-assign/) +-------------------------------------------------------------- + + Version: 4.1.1 + From: 'Sindre Sorhus' (https://github.com/sindresorhus) + License(s): + MIT (bundled/open-assign-4.1.1/LICENSE) + diff --git a/doc/licenses/object-assign-4.1.1/dep-coordinates.txt b/doc/licenses/object-assign-4.1.1/dep-coordinates.txt new file mode 100644 index 0000000..4924590 --- /dev/null +++ b/doc/licenses/object-assign-4.1.1/dep-coordinates.txt @@ -0,0 +1 @@ +object-assign:4.1.1 diff --git a/doc/licenses/okhttp-4.12.0/NOTICE b/doc/licenses/okhttp-4.12.0/NOTICE new file mode 100644 index 0000000..7ab6fba --- /dev/null +++ b/doc/licenses/okhttp-4.12.0/NOTICE @@ -0,0 +1,13 @@ +Copyright 2021 Square, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/doc/licenses/okhttp-4.12.0/README b/doc/licenses/okhttp-4.12.0/README new file mode 100644 index 0000000..54aee25 --- /dev/null +++ b/doc/licenses/okhttp-4.12.0/README @@ -0,0 +1,8 @@ +OkHttp (https://square.github.io/okhttp/) +----------------------------------------- + + Version: 4.12.0 + From: 'Square Inc' + License(s): + Apache 2.0 + diff --git a/doc/licenses/okhttp-4.12.0/dep-coordinates.txt b/doc/licenses/okhttp-4.12.0/dep-coordinates.txt new file mode 100644 index 0000000..8aeb660 --- /dev/null +++ b/doc/licenses/okhttp-4.12.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.squareup.okhttp3:okhttp:jar:4.12.0 +com.squareup.okhttp3:logging-interceptor:jar:4.12.0 diff --git a/doc/licenses/okio-3.6.0/NOTICE b/doc/licenses/okio-3.6.0/NOTICE new file mode 100644 index 0000000..9004e5d --- /dev/null +++ b/doc/licenses/okio-3.6.0/NOTICE @@ -0,0 +1,13 @@ +Copyright 2020 Square, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/doc/licenses/okio-3.6.0/README b/doc/licenses/okio-3.6.0/README new file mode 100644 index 0000000..23b5197 --- /dev/null +++ b/doc/licenses/okio-3.6.0/README @@ -0,0 +1,8 @@ +Okio (https://square.github.io/okio/) +------------------------------------- + + Version: 3.6.0 + From: 'Square Inc' + License(s): + Apache 2.0 + diff --git a/doc/licenses/okio-3.6.0/dep-coordinates.txt b/doc/licenses/okio-3.6.0/dep-coordinates.txt new file mode 100644 index 0000000..b785b26 --- /dev/null +++ b/doc/licenses/okio-3.6.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.squareup.okio:okio:jar:3.6.0 +com.squareup.okio:okio-jvm:jar:3.6.0 diff --git a/doc/licenses/osgi-resource-locator-1.0.3/LICENSE.md b/doc/licenses/osgi-resource-locator-1.0.3/LICENSE.md new file mode 100644 index 0000000..4f38d09 --- /dev/null +++ b/doc/licenses/osgi-resource-locator-1.0.3/LICENSE.md @@ -0,0 +1,637 @@ +# Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + + 1. DEFINITIONS + + "Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + + "Contributor" means any person or entity that Distributes the Program. + + "Licensed Patents" mean patent claims licensable by a Contributor which + are necessarily infringed by the use or sale of its Contribution alone + or when combined with the Program. + + "Program" means the Contributions Distributed in accordance with this + Agreement. + + "Recipient" means anyone who receives the Program under this Agreement + or any Secondary License (as applicable), including Contributors. + + "Derivative Works" shall mean any work, whether in Source Code or other + form, that is based on (or derived from) the Program and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. + + "Modified Works" shall mean any work in Source Code or other form that + results from an addition to, deletion from, or modification of the + contents of the Program, including, for purposes of clarity any new file + in Source Code form that contains any contents of the Program. Modified + Works shall not include works that contain only declarations, + interfaces, types, classes, structures, or files of the Program solely + in each case in order to link to, bind by name, or subclass the Program + or Modified Works thereof. + + "Distribute" means the acts of a) distributing or b) making available + in any manner that enables the transfer of a copy. + + "Source Code" means the form of a Program preferred for making + modifications, including but not limited to software source code, + documentation source, and configuration files. + + "Secondary License" means either the GNU General Public License, + Version 2.0, or any later versions of that license, including any + exceptions or additional permissions as identified by the initial + Contributor. + + 2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + + 3. REQUIREMENTS + + 3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + + 3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + + 3.3 Contributors may not remove or alter any copyright, patent, + trademark, attribution notices, disclaimers of warranty, or limitations + of liability ("notices") contained within the Program from any copy of + the Program which they Distribute, provided that Contributors may add + their own appropriate notices. + + 4. COMMERCIAL DISTRIBUTION + + Commercial distributors of software may accept certain responsibilities + with respect to end users, business partners and the like. While this + license is intended to facilitate the commercial use of the Program, + the Contributor who includes the Program in a commercial product + offering should do so in a manner which does not create potential + liability for other Contributors. Therefore, if a Contributor includes + the Program in a commercial product offering, such Contributor + ("Commercial Contributor") hereby agrees to defend and indemnify every + other Contributor ("Indemnified Contributor") against any losses, + damages and costs (collectively "Losses") arising from claims, lawsuits + and other legal actions brought by a third party against the Indemnified + Contributor to the extent caused by the acts or omissions of such + Commercial Contributor in connection with its distribution of the Program + in a commercial product offering. The obligations in this section do not + apply to any claims or Losses relating to any actual or alleged + intellectual property infringement. In order to qualify, an Indemnified + Contributor must: a) promptly notify the Commercial Contributor in + writing of such claim, and b) allow the Commercial Contributor to control, + and cooperate with the Commercial Contributor in, the defense and any + related settlement negotiations. The Indemnified Contributor may + participate in any such claim at its own expense. + + For example, a Contributor might include the Program in a commercial + product offering, Product X. That Contributor is then a Commercial + Contributor. If that Commercial Contributor then makes performance + claims, or offers warranties related to Product X, those performance + claims and warranties are such Commercial Contributor's responsibility + alone. Under this section, the Commercial Contributor would have to + defend claims against the other Contributors related to those performance + claims and warranties, and if a court requires any other Contributor to + pay any damages as a result, the Commercial Contributor must pay + those damages. + + 5. NO WARRANTY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR + IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF + TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR + PURPOSE. Each Recipient is solely responsible for determining the + appropriateness of using and distributing the Program and assumes all + risks associated with its exercise of rights under this Agreement, + including but not limited to the risks and costs of program errors, + compliance with applicable laws, damage to or loss of data, programs + or equipment, and unavailability or interruption of operations. + + 6. DISCLAIMER OF LIABILITY + + EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT + PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS + SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST + PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE + EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + 7. GENERAL + + If any provision of this Agreement is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this Agreement, and without further + action by the parties hereto, such provision shall be reformed to the + minimum extent necessary to make such provision valid and enforceable. + + If Recipient institutes patent litigation against any entity + (including a cross-claim or counterclaim in a lawsuit) alleging that the + Program itself (excluding combinations of the Program with other software + or hardware) infringes such Recipient's patent(s), then such Recipient's + rights granted under Section 2(b) shall terminate as of the date such + litigation is filed. + + All Recipient's rights under this Agreement shall terminate if it + fails to comply with any of the material terms or conditions of this + Agreement and does not cure such failure in a reasonable period of + time after becoming aware of such noncompliance. If all Recipient's + rights under this Agreement terminate, Recipient agrees to cease use + and distribution of the Program as soon as reasonably practicable. + However, Recipient's obligations under this Agreement and any licenses + granted by Recipient relating to the Program shall continue and survive. + + Everyone is permitted to copy and distribute copies of this Agreement, + but in order to avoid inconsistency the Agreement is copyrighted and + may only be modified in the following manner. The Agreement Steward + reserves the right to publish new versions (including revisions) of + this Agreement from time to time. No one other than the Agreement + Steward has the right to modify this Agreement. The Eclipse Foundation + is the initial Agreement Steward. The Eclipse Foundation may assign the + responsibility to serve as the Agreement Steward to a suitable separate + entity. Each new version of the Agreement will be given a distinguishing + version number. The Program (including Contributions) may always be + Distributed subject to the version of the Agreement under which it was + received. In addition, after a new version of the Agreement is published, + Contributor may elect to Distribute the Program (including its + Contributions) under the new version. + + Except as expressly stated in Sections 2(a) and 2(b) above, Recipient + receives no rights or licenses to the intellectual property of any + Contributor under this Agreement, whether expressly, by implication, + estoppel or otherwise. All rights in the Program not expressly granted + under this Agreement are reserved. Nothing in this Agreement is intended + to be enforceable by any entity that is not a Contributor or Recipient. + No third-party beneficiary rights are created under this Agreement. + + Exhibit A - Form of Secondary Licenses Notice + + "This Source Code may also be made available under the following + Secondary Licenses when the conditions for such availability set forth + in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), + version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + +--- + +## The GNU General Public License (GPL) Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor + Boston, MA 02110-1335 + USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your freedom to + share and change it. By contrast, the GNU General Public License is + intended to guarantee your freedom to share and change free software--to + make sure the software is free for all its users. This General Public + License applies to most of the Free Software Foundation's software and + to any other program whose authors commit to using it. (Some other Free + Software Foundation software is covered by the GNU Library General + Public License instead.) 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 this + service 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 make restrictions that forbid anyone + to deny you these rights or to ask you to surrender the rights. These + restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether gratis + or for a fee, you must give the recipients all the rights that you have. + 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. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software patents. + We wish to avoid the danger that redistributors of a free program will + individually obtain patent licenses, in effect making the program + proprietary. To prevent this, we have made it clear that any patent must + be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed under + the terms of this General Public License. The "Program", below, refers + to any such program or work, and a "work based on the Program" means + either the Program or any derivative work under copyright law: that is + to say, a work containing the Program or a portion of it, either + verbatim or with modifications and/or translated into another language. + (Hereinafter, translation is included without limitation in the term + "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running + the Program is not restricted, and the output from the Program is + covered only if its contents constitute a work based on the Program + (independent of having been made by running the Program). Whether that + is true depends on what the Program does. + + 1. You may copy and distribute 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 + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion of + it, thus forming a work based on the Program, and copy and distribute + such modifications or work under the terms of Section 1 above, provided + that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any part + thereof, to be licensed as a whole at no charge to all third parties + under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this License. + (Exception: if the Program itself is interactive but does not + normally print such an announcement, your work based on the Program + is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, and + can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based on + the Program, the distribution of the whole must be on the terms of this + License, whose permissions for other licensees extend to the entire + whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed + only for noncommercial distribution and only if you received the + program in object code or executable form with such an offer, in + accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source code + means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to control + compilation and installation of the executable. However, as a special + exception, the source code distributed need not include anything that is + normally distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies the + executable. + + If distribution of executable or object code is made by offering access + to copy from a designated place, then offering equivalent access to copy + the source code from the same place counts as distribution of the source + code, even though third parties are not compelled to copy the source + along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt otherwise + to copy, modify, sublicense or distribute the Program is void, and will + automatically terminate your rights under this License. However, parties + who have received copies, or rights, from you under this License will + not have their licenses terminated so long as such parties remain in + full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and all + its terms and conditions for copying, distributing or modifying the + Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further restrictions + on the recipients' exercise of the rights granted herein. You are not + responsible for enforcing compliance by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + 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 distribute + so as to satisfy simultaneously your obligations under this License and + any other pertinent obligations, then as a consequence you may not + distribute the Program at all. For example, if a patent license would + not permit royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only way you + could satisfy both it and this License would be to refrain entirely from + distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is implemented + by public license practices. Many people have made generous + contributions to the wide range of software distributed through that + system in reliance on consistent application of that system; it is up to + the author/donor to decide if he or she is willing to distribute + software through any other system and a licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be + a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License may + add an explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among countries + not thus excluded. In such case, this License incorporates the + limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the 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 a version number of this License which applies to it and "any + later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Program does not specify a version + number of this License, you may choose any version ever published by the + Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted by the + Free Software Foundation, write to the Free Software Foundation; we + sometimes make exceptions for this. Our decision will be guided by the + two goals of preserving the free status of all derivatives of our free + software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE 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. + + 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 convey + 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) + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands + you use may be called something other than `show w' and `show c'; they + could even be mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (which makes passes at compilers) written by + James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + + This 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 Library + General Public License instead of this License. + +--- + +## CLASSPATH EXCEPTION + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License version 2 cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from or + based on this library. If you modify this library, you may extend this + exception to your version of the library, but you are not obligated to + do so. If you do not wish to do so, delete this exception statement + from your version. diff --git a/doc/licenses/osgi-resource-locator-1.0.3/README b/doc/licenses/osgi-resource-locator-1.0.3/README new file mode 100644 index 0000000..f4e2694 --- /dev/null +++ b/doc/licenses/osgi-resource-locator-1.0.3/README @@ -0,0 +1,8 @@ +HK2 OSGi resource locator (https://github.com/eclipse-ee4j/glassfish-hk2-extra) +------------------------------------------------------------------------------- + + Version: 1.0.3 + From: 'Oracle Corporation' (http://www.oracle.com/) + License(s): + EPL v2.0 (bundled/osgi-resource-locator-1.0.3/LICENSE.md) + diff --git a/doc/licenses/osgi-resource-locator-1.0.3/dep-coordinates.txt b/doc/licenses/osgi-resource-locator-1.0.3/dep-coordinates.txt new file mode 100644 index 0000000..b8a60a5 --- /dev/null +++ b/doc/licenses/osgi-resource-locator-1.0.3/dep-coordinates.txt @@ -0,0 +1 @@ +org.glassfish.hk2:osgi-resource-locator:jar:1.0.3 diff --git a/doc/licenses/pickr-1.8.2/LICENSE b/doc/licenses/pickr-1.8.2/LICENSE new file mode 100644 index 0000000..0f97438 --- /dev/null +++ b/doc/licenses/pickr-1.8.2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 - 2021 Simon Reinisch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doc/licenses/pickr-1.8.2/README b/doc/licenses/pickr-1.8.2/README new file mode 100644 index 0000000..009387d --- /dev/null +++ b/doc/licenses/pickr-1.8.2/README @@ -0,0 +1,8 @@ +Pickr (https://simonwep.github.io/pickr/) +----------------------------------------- + + Version: 1.8.2 + From: 'Simon Reinisch' (https://github.com/Simonwep/) + License(s): + MIT (bundled/pickr-1.8.2/LICENSE) + diff --git a/doc/licenses/pickr-1.8.2/dep-coordinates.txt b/doc/licenses/pickr-1.8.2/dep-coordinates.txt new file mode 100644 index 0000000..aea9a77 --- /dev/null +++ b/doc/licenses/pickr-1.8.2/dep-coordinates.txt @@ -0,0 +1 @@ +@simonwep/pickr:1.8.2 diff --git a/doc/licenses/process-0.11.10/LICENSE b/doc/licenses/process-0.11.10/LICENSE new file mode 100644 index 0000000..b8c1246 --- /dev/null +++ b/doc/licenses/process-0.11.10/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2013 Roman Shtylman + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/process-0.11.10/README b/doc/licenses/process-0.11.10/README new file mode 100644 index 0000000..450a924 --- /dev/null +++ b/doc/licenses/process-0.11.10/README @@ -0,0 +1,8 @@ +process (https://github.com/defunctzombie/node-process/) +-------------------------------------------------------- + + Version: 0.11.10 + From: 'Roman Shtylman' (https://github.com/defunctzombie) + License(s): + MIT (bundled/process-0.11.10/LICENSE) + diff --git a/doc/licenses/process-0.11.10/dep-coordinates.txt b/doc/licenses/process-0.11.10/dep-coordinates.txt new file mode 100644 index 0000000..0fff967 --- /dev/null +++ b/doc/licenses/process-0.11.10/dep-coordinates.txt @@ -0,0 +1 @@ +process:0.11.10 diff --git a/doc/licenses/process-nextick-args-2.0.1/README b/doc/licenses/process-nextick-args-2.0.1/README new file mode 100644 index 0000000..84417dc --- /dev/null +++ b/doc/licenses/process-nextick-args-2.0.1/README @@ -0,0 +1,8 @@ +process-nextick-args (https://github.com/calvinmetcalf/process-nextick-args) +--------------------------------------------- + + Version: 2.0.1 + From: 'Calvin Metcalf' (https://github.com/calvinmetcalf) + License(s): + MIT (bundled/process-nextick-args-2.0.1/license.md) + diff --git a/doc/licenses/process-nextick-args-2.0.1/dep-coordinates.txt b/doc/licenses/process-nextick-args-2.0.1/dep-coordinates.txt new file mode 100644 index 0000000..7c68c4b --- /dev/null +++ b/doc/licenses/process-nextick-args-2.0.1/dep-coordinates.txt @@ -0,0 +1 @@ +process-nextick-args:2.0.1 diff --git a/doc/licenses/process-nextick-args-2.0.1/license.md b/doc/licenses/process-nextick-args-2.0.1/license.md new file mode 100644 index 0000000..c67e353 --- /dev/null +++ b/doc/licenses/process-nextick-args-2.0.1/license.md @@ -0,0 +1,19 @@ +# Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** diff --git a/doc/licenses/readable-stream-2.3.7/LICENSE b/doc/licenses/readable-stream-2.3.7/LICENSE new file mode 100644 index 0000000..2873b3b --- /dev/null +++ b/doc/licenses/readable-stream-2.3.7/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" diff --git a/doc/licenses/readable-stream-2.3.7/README b/doc/licenses/readable-stream-2.3.7/README new file mode 100644 index 0000000..6e09569 --- /dev/null +++ b/doc/licenses/readable-stream-2.3.7/README @@ -0,0 +1,8 @@ +readable-stream (https://github.com/nodejs/readable-stream) +--------------------------------------------- + + Version: 2.3.7 + From: 'Node.js contributors, Joyent, Inc., and other Node contributors' + License(s): + MIT (bundled/readable-stream-2.3.7/LICENSE) + diff --git a/doc/licenses/readable-stream-2.3.7/dep-coordinates.txt b/doc/licenses/readable-stream-2.3.7/dep-coordinates.txt new file mode 100644 index 0000000..f645a21 --- /dev/null +++ b/doc/licenses/readable-stream-2.3.7/dep-coordinates.txt @@ -0,0 +1 @@ +readable-stream:2.3.7 diff --git a/doc/licenses/reserved-words-0.1.2/LICENSE b/doc/licenses/reserved-words-0.1.2/LICENSE new file mode 100644 index 0000000..dcf4fc8 --- /dev/null +++ b/doc/licenses/reserved-words-0.1.2/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright 2015 Alexej Yaroshevich and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/reserved-words-0.1.2/README b/doc/licenses/reserved-words-0.1.2/README new file mode 100644 index 0000000..34eb13d --- /dev/null +++ b/doc/licenses/reserved-words-0.1.2/README @@ -0,0 +1,8 @@ +reserved-words (https://github.com/qfox/reserved-words/) +-------------------------------------------------------- + + Version: 0.1.2 + From: 'Alexej Yaroshevich and other contributors' + License(s): + MIT (bundled/reserved-words-0.1.2/LICENSE) + diff --git a/doc/licenses/reserved-words-0.1.2/dep-coordinates.txt b/doc/licenses/reserved-words-0.1.2/dep-coordinates.txt new file mode 100644 index 0000000..aa36d49 --- /dev/null +++ b/doc/licenses/reserved-words-0.1.2/dep-coordinates.txt @@ -0,0 +1 @@ +reserved-words:0.1.2 diff --git a/doc/licenses/retrofit-2.11.0/NOTICE b/doc/licenses/retrofit-2.11.0/NOTICE new file mode 100644 index 0000000..0bf6b9f --- /dev/null +++ b/doc/licenses/retrofit-2.11.0/NOTICE @@ -0,0 +1,13 @@ +Copyright 2013 Square, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/doc/licenses/retrofit-2.11.0/README b/doc/licenses/retrofit-2.11.0/README new file mode 100644 index 0000000..f677937 --- /dev/null +++ b/doc/licenses/retrofit-2.11.0/README @@ -0,0 +1,8 @@ +Retrofit (https://square.github.io/retrofit/) +--------------------------------------------- + + Version: 2.11.0 + From: 'Square Inc' + License(s): + Apache 2.0 + diff --git a/doc/licenses/retrofit-2.11.0/dep-coordinates.txt b/doc/licenses/retrofit-2.11.0/dep-coordinates.txt new file mode 100644 index 0000000..b638d74 --- /dev/null +++ b/doc/licenses/retrofit-2.11.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.squareup.retrofit2:retrofit:jar:2.11.0 +com.squareup.retrofit2:converter-jackson:jar:2.11.0 diff --git a/doc/licenses/safe-buffer-5.1.2/LICENSE b/doc/licenses/safe-buffer-5.1.2/LICENSE new file mode 100644 index 0000000..0c068ce --- /dev/null +++ b/doc/licenses/safe-buffer-5.1.2/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/doc/licenses/safe-buffer-5.1.2/README b/doc/licenses/safe-buffer-5.1.2/README new file mode 100644 index 0000000..26cf5dc --- /dev/null +++ b/doc/licenses/safe-buffer-5.1.2/README @@ -0,0 +1,8 @@ +safe-buffer (https://github.com/feross/safe-buffer) +--------------------------------------------- + + Version: 5.1.2 + From: 'Feross Aboukhadijeh' (https://github.com/feross) + License(s): + MIT (bundled/safe-buffer-5.1.2/LICENSE) + diff --git a/doc/licenses/safe-buffer-5.1.2/dep-coordinates.txt b/doc/licenses/safe-buffer-5.1.2/dep-coordinates.txt new file mode 100644 index 0000000..594ab08 --- /dev/null +++ b/doc/licenses/safe-buffer-5.1.2/dep-coordinates.txt @@ -0,0 +1 @@ +safe-buffer:5.1.2 diff --git a/doc/licenses/setimmediate-1.0.5/LICENSE.txt b/doc/licenses/setimmediate-1.0.5/LICENSE.txt new file mode 100644 index 0000000..32b20de --- /dev/null +++ b/doc/licenses/setimmediate-1.0.5/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/setimmediate-1.0.5/README b/doc/licenses/setimmediate-1.0.5/README new file mode 100644 index 0000000..8bd3389 --- /dev/null +++ b/doc/licenses/setimmediate-1.0.5/README @@ -0,0 +1,8 @@ +setImmediate.js (https://github.com/YuzuJS/setImmediate) +--------------------------------------------- + + Version: 1.0.5 + From: 'Yuzu (by Barnes & Noble Education)' (https://github.com/YuzuJS) + License(s): + MIT (bundled/setimmediate-1.0.5/LICENSE.txt) + diff --git a/doc/licenses/setimmediate-1.0.5/dep-coordinates.txt b/doc/licenses/setimmediate-1.0.5/dep-coordinates.txt new file mode 100644 index 0000000..d2111b4 --- /dev/null +++ b/doc/licenses/setimmediate-1.0.5/dep-coordinates.txt @@ -0,0 +1 @@ +setimmediate:1.0.5 diff --git a/doc/licenses/slf4j-api-2.0.17/LICENSE.txt b/doc/licenses/slf4j-api-2.0.17/LICENSE.txt new file mode 100644 index 0000000..a4b1bf9 --- /dev/null +++ b/doc/licenses/slf4j-api-2.0.17/LICENSE.txt @@ -0,0 +1,21 @@ +Copyright (c) 2004-2024 QOS.ch Sarl (Switzerland) +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/slf4j-api-2.0.17/README b/doc/licenses/slf4j-api-2.0.17/README new file mode 100644 index 0000000..db26059 --- /dev/null +++ b/doc/licenses/slf4j-api-2.0.17/README @@ -0,0 +1,8 @@ +Simple Logging Facade for Java (http://slf4j.org/) +-------------------------------------------------- + + Version: 2.0.17 + From: 'QOS.ch Sàrl' (http://qos.ch/) + License(s): + MIT (bundled/slf4j-api-2.0.17/LICENSE.txt) + diff --git a/doc/licenses/slf4j-api-2.0.17/dep-coordinates.txt b/doc/licenses/slf4j-api-2.0.17/dep-coordinates.txt new file mode 100644 index 0000000..cc3ad97 --- /dev/null +++ b/doc/licenses/slf4j-api-2.0.17/dep-coordinates.txt @@ -0,0 +1,2 @@ +org.slf4j:jul-to-slf4j:jar:2.0.17 +org.slf4j:slf4j-api:jar:2.0.17 diff --git a/doc/licenses/snakeyaml-2.3/README b/doc/licenses/snakeyaml-2.3/README new file mode 100644 index 0000000..9bd4a5c --- /dev/null +++ b/doc/licenses/snakeyaml-2.3/README @@ -0,0 +1,8 @@ +SnakeYAML (https://bitbucket.org/snakeyaml/snakeyaml/ +----------------------------------------------------- + + Version: 2.3 + From: 'Andrey Somov' (https://bitbucket.org/asomov/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/snakeyaml-2.3/dep-coordinates.txt b/doc/licenses/snakeyaml-2.3/dep-coordinates.txt new file mode 100644 index 0000000..8377e0b --- /dev/null +++ b/doc/licenses/snakeyaml-2.3/dep-coordinates.txt @@ -0,0 +1 @@ +org.yaml:snakeyaml:jar:2.3 diff --git a/doc/licenses/spring-framework-3.0.5/README b/doc/licenses/spring-framework-3.0.5/README new file mode 100644 index 0000000..a7c1847 --- /dev/null +++ b/doc/licenses/spring-framework-3.0.5/README @@ -0,0 +1,8 @@ +Spring Framework (https://spring.io/projects/spring-framework) +-------------------------------------------------------------- + + Version: 3.0.5 + From: 'Spring' (https://spring.io/) + License(s): + Apache v2.0 + diff --git a/doc/licenses/spring-framework-3.0.5/dep-coordinates.txt b/doc/licenses/spring-framework-3.0.5/dep-coordinates.txt new file mode 100644 index 0000000..51b29f1 --- /dev/null +++ b/doc/licenses/spring-framework-3.0.5/dep-coordinates.txt @@ -0,0 +1,6 @@ +org.springframework:spring-aop:jar:3.0.5.RELEASE +org.springframework:spring-asm:jar:3.0.5.RELEASE +org.springframework:spring-beans:jar:3.0.5.RELEASE +org.springframework:spring-context:jar:3.0.5.RELEASE +org.springframework:spring-core:jar:3.0.5.RELEASE +org.springframework:spring-expression:jar:3.0.5.RELEASE diff --git a/doc/licenses/stream-browserify-2.0.2/LICENSE b/doc/licenses/stream-browserify-2.0.2/LICENSE new file mode 100644 index 0000000..3e7d0c0 --- /dev/null +++ b/doc/licenses/stream-browserify-2.0.2/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/stream-browserify-2.0.2/README b/doc/licenses/stream-browserify-2.0.2/README new file mode 100644 index 0000000..4116876 --- /dev/null +++ b/doc/licenses/stream-browserify-2.0.2/README @@ -0,0 +1,8 @@ +stream-browserify (https://github.com/browserify/stream-browserify) +--------------------------------------------- + + Version: 2.0.2 + From: 'James Halliday' + License(s): + MIT (bundled/stream-browserify-2.0.2/LICENSE) + diff --git a/doc/licenses/stream-browserify-2.0.2/dep-coordinates.txt b/doc/licenses/stream-browserify-2.0.2/dep-coordinates.txt new file mode 100644 index 0000000..7bc88e9 --- /dev/null +++ b/doc/licenses/stream-browserify-2.0.2/dep-coordinates.txt @@ -0,0 +1 @@ +stream-browserify:2.0.2 diff --git a/doc/licenses/string_decoder-1.1.1/LICENSE b/doc/licenses/string_decoder-1.1.1/LICENSE new file mode 100644 index 0000000..2873b3b --- /dev/null +++ b/doc/licenses/string_decoder-1.1.1/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" diff --git a/doc/licenses/string_decoder-1.1.1/README b/doc/licenses/string_decoder-1.1.1/README new file mode 100644 index 0000000..48ee14c --- /dev/null +++ b/doc/licenses/string_decoder-1.1.1/README @@ -0,0 +1,8 @@ +string_decoder (https://github.com/nodejs/string_decoder) +--------------------------------------------- + + Version: 1.1.1 + From: 'Node.js contributors, Joyent, Inc., and other Node contributors' + License(s): + MIT (bundled/string_decoder-1.1.1/LICENSE) + diff --git a/doc/licenses/string_decoder-1.1.1/dep-coordinates.txt b/doc/licenses/string_decoder-1.1.1/dep-coordinates.txt new file mode 100644 index 0000000..bbdc75d --- /dev/null +++ b/doc/licenses/string_decoder-1.1.1/dep-coordinates.txt @@ -0,0 +1 @@ +string_decoder:1.1.1 diff --git a/doc/licenses/timers-browserify-2.0.12/LICENSE.md b/doc/licenses/timers-browserify-2.0.12/LICENSE.md new file mode 100644 index 0000000..f2bdf52 --- /dev/null +++ b/doc/licenses/timers-browserify-2.0.12/LICENSE.md @@ -0,0 +1,23 @@ +# timers-browserify + +This project uses the [MIT](http://jryans.mit-license.org/) license: + + Copyright © 2012 J. Ryan Stinnett + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the “Software”), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/timers-browserify-2.0.12/README b/doc/licenses/timers-browserify-2.0.12/README new file mode 100644 index 0000000..9ed3898 --- /dev/null +++ b/doc/licenses/timers-browserify-2.0.12/README @@ -0,0 +1,8 @@ +timers-browserify (https://github.com/browserify/timers-browserify) +--------------------------------------------- + + Version: 2.0.12 + From: 'J. Ryan Stinnett' (https://github.com/jryans) + License(s): + MIT (bundled/timers-browserify-2.0.12/LICENSE.md) + diff --git a/doc/licenses/timers-browserify-2.0.12/dep-coordinates.txt b/doc/licenses/timers-browserify-2.0.12/dep-coordinates.txt new file mode 100644 index 0000000..b1dfbee --- /dev/null +++ b/doc/licenses/timers-browserify-2.0.12/dep-coordinates.txt @@ -0,0 +1 @@ +timers-browserify:2.0.12 diff --git a/doc/licenses/util-0.11.1/LICENSE b/doc/licenses/util-0.11.1/LICENSE new file mode 100644 index 0000000..e3d4e69 --- /dev/null +++ b/doc/licenses/util-0.11.1/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/doc/licenses/util-0.11.1/README b/doc/licenses/util-0.11.1/README new file mode 100644 index 0000000..be82159 --- /dev/null +++ b/doc/licenses/util-0.11.1/README @@ -0,0 +1,8 @@ +util (https://github.com/browserify/node-util) +---------------------------------------------- + + Version: 0.11.1 + From: 'Joyent, Inc. and other Node contributors' + License(s): + MIT (bundled/util-0.11.1/LICENSE) + diff --git a/doc/licenses/util-0.11.1/dep-coordinates.txt b/doc/licenses/util-0.11.1/dep-coordinates.txt new file mode 100644 index 0000000..376908f --- /dev/null +++ b/doc/licenses/util-0.11.1/dep-coordinates.txt @@ -0,0 +1 @@ +util:0.11.1 diff --git a/doc/licenses/util-deprecate-1.0.2/LICENSE b/doc/licenses/util-deprecate-1.0.2/LICENSE new file mode 100644 index 0000000..6a60e8c --- /dev/null +++ b/doc/licenses/util-deprecate-1.0.2/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/util-deprecate-1.0.2/README b/doc/licenses/util-deprecate-1.0.2/README new file mode 100644 index 0000000..9384470 --- /dev/null +++ b/doc/licenses/util-deprecate-1.0.2/README @@ -0,0 +1,8 @@ +util-deprecate (https://github.com/TooTallNate/util-deprecate) +--------------------------------------------- + + Version: 1.0.2 + From: 'Nathan Rajlich' (https://github.com/TooTallNate) + License(s): + MIT (bundled/util-deprecate-1.0.2/LICENSE) + diff --git a/doc/licenses/util-deprecate-1.0.2/dep-coordinates.txt b/doc/licenses/util-deprecate-1.0.2/dep-coordinates.txt new file mode 100644 index 0000000..f8c3024 --- /dev/null +++ b/doc/licenses/util-deprecate-1.0.2/dep-coordinates.txt @@ -0,0 +1 @@ +util-deprecate:1.0.2 diff --git a/doc/licenses/webpack-4.47.0/LICENSE b/doc/licenses/webpack-4.47.0/LICENSE new file mode 100644 index 0000000..8c11fc7 --- /dev/null +++ b/doc/licenses/webpack-4.47.0/LICENSE @@ -0,0 +1,20 @@ +Copyright JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/licenses/webpack-4.47.0/README b/doc/licenses/webpack-4.47.0/README new file mode 100644 index 0000000..1420e33 --- /dev/null +++ b/doc/licenses/webpack-4.47.0/README @@ -0,0 +1,8 @@ +Webpack (https://webpack.js.org/) +--------------------------------- + + Version: 4.47.0 + From: 'JS Foundation and other contributors' + License(s): + MIT (bundled/webpack-4.47.0/LICENSE) + diff --git a/doc/licenses/webpack-4.47.0/dep-coordinates.txt b/doc/licenses/webpack-4.47.0/dep-coordinates.txt new file mode 100644 index 0000000..59c0515 --- /dev/null +++ b/doc/licenses/webpack-4.47.0/dep-coordinates.txt @@ -0,0 +1 @@ +webpack:4.47.0 diff --git a/doc/licenses/woodstox-core-5.4.0/README b/doc/licenses/woodstox-core-5.4.0/README new file mode 100644 index 0000000..ad07e98 --- /dev/null +++ b/doc/licenses/woodstox-core-5.4.0/README @@ -0,0 +1,7 @@ +Woodstox Core (https://github.com/FasterXML/woodstox) +------------------------------------------------------ + + Version: 5.4.0 + From: 'FasterXML, LLC' (http://fasterxml.com/) + License(s): + Apache v2.0 diff --git a/doc/licenses/woodstox-core-5.4.0/dep-coordinates.txt b/doc/licenses/woodstox-core-5.4.0/dep-coordinates.txt new file mode 100644 index 0000000..e879f95 --- /dev/null +++ b/doc/licenses/woodstox-core-5.4.0/dep-coordinates.txt @@ -0,0 +1 @@ +com.fasterxml.woodstox:woodstox-core:jar:5.4.0 diff --git a/doc/licenses/woodstox-stax2-api-4.2/LICENSE b/doc/licenses/woodstox-stax2-api-4.2/LICENSE new file mode 100644 index 0000000..c7a901a --- /dev/null +++ b/doc/licenses/woodstox-stax2-api-4.2/LICENSE @@ -0,0 +1,22 @@ +Copyright 2010 FasterXML, LLC + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/woodstox-stax2-api-4.2/README b/doc/licenses/woodstox-stax2-api-4.2/README new file mode 100644 index 0000000..b2936e3 --- /dev/null +++ b/doc/licenses/woodstox-stax2-api-4.2/README @@ -0,0 +1,7 @@ +Woodstox Stax2-API (https://github.com/FasterXML/stax2-api) +------------------------------------------------------------ + + Version: 4.2 + From: 'FasterXML, LLC' (http://fasterxml.com/) + License(s): + BSD Simplified (bundled/woodstox-stax2-api-4.2/LICENSE) diff --git a/doc/licenses/woodstox-stax2-api-4.2/dep-coordinates.txt b/doc/licenses/woodstox-stax2-api-4.2/dep-coordinates.txt new file mode 100644 index 0000000..c7bbc76 --- /dev/null +++ b/doc/licenses/woodstox-stax2-api-4.2/dep-coordinates.txt @@ -0,0 +1 @@ +org.codehaus.woodstox:stax2-api:jar:4.2 diff --git a/doc/licenses/xpp3-1.1.4c/LICENSE.txt b/doc/licenses/xpp3-1.1.4c/LICENSE.txt new file mode 100644 index 0000000..d84c14b --- /dev/null +++ b/doc/licenses/xpp3-1.1.4c/LICENSE.txt @@ -0,0 +1,46 @@ +Indiana University Extreme! Lab Software License + +Version 1.1.1 + +Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if any, + must include the following acknowledgment: + + "This product includes software developed by the Indiana University + Extreme! Lab (http://www.extreme.indiana.edu/)." + +Alternately, this acknowledgment may appear in the software itself, +if and wherever such third-party acknowledgments normally appear. + +4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab" +must not be used to endorse or promote products derived from this +software without prior written permission. For written permission, +please contact http://www.extreme.indiana.edu/. + +5. Products derived from this software may not use "Indiana Univeristy" +name nor may "Indiana Univeristy" appear in their name, without prior +written permission of the Indiana University. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/licenses/xpp3-1.1.4c/NOTICE b/doc/licenses/xpp3-1.1.4c/NOTICE new file mode 100644 index 0000000..467f8d9 --- /dev/null +++ b/doc/licenses/xpp3-1.1.4c/NOTICE @@ -0,0 +1,2 @@ +This product includes software developed by the Indiana University +Extreme! Lab (http://www.extreme.indiana.edu/). diff --git a/doc/licenses/xpp3-1.1.4c/README b/doc/licenses/xpp3-1.1.4c/README new file mode 100644 index 0000000..96b7725 --- /dev/null +++ b/doc/licenses/xpp3-1.1.4c/README @@ -0,0 +1,9 @@ +Xml Pull Parser 3rd Edition +(http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/index.html) +--------------------------------------------------------------- + + Version: 1.1.4c + From: 'Indiana University Extreme! Lab' (http://www.extreme.indiana.edu/) + License(s): + Indiana University Extreme! Lab License (bundled/xpp3-1.1.4c/LICENSE.txt) + diff --git a/doc/licenses/xpp3-1.1.4c/dep-coordinates.txt b/doc/licenses/xpp3-1.1.4c/dep-coordinates.txt new file mode 100644 index 0000000..8e1237c --- /dev/null +++ b/doc/licenses/xpp3-1.1.4c/dep-coordinates.txt @@ -0,0 +1 @@ +org.apache.servicemix.bundles:org.apache.servicemix.bundles.xpp3:jar:1.1.4c_7 diff --git a/doc/licenses/zxing-3.5.3/AUTHORS b/doc/licenses/zxing-3.5.3/AUTHORS new file mode 100644 index 0000000..85099eb --- /dev/null +++ b/doc/licenses/zxing-3.5.3/AUTHORS @@ -0,0 +1,135 @@ +This project consists of contributions from several people, recognized here for convenience, +in alphabetical order. + +Agustín Delgado (Servinform S.A.) +Aitor Almeida (University of Deusto) +Alasdair Mackintosh (Google) +Alex Dupre +Alexander Martin (Haase & Martin GmbH) +Alexander Schmidt +Anders Borg +Andreas Pillath +Andrew Walbran (Google) +Andrey Sitnik +Androida.hu / http://www.androida.hu/ +Antonio Manuel Benjumea (Servinform S.A.) +Asier Iturralde +Asmuri Anwar +atereshchuk +Betaminos +Brian Brown (Google) +Bruce Allen +Chang Hyun Park +Christian Brunschen (Google) +Christoph Schulz (creatale GmbH) +crowdin.net +Daisuke Makiuchi +Daniel Switkin (Google) +Dave MacLachlan (Google) +David Phillip Oster (Google) +David Albert (Bug Labs) +David Olivier +David Walker (Google) +Diego Pierotto +Dion Hardy +drejc83 +Eduardo Castillejo (University of Deusto) +Emanuele Aina +Eric Kobrin (Velocitude) +evansepdx +Erik Barbara +Facundo Farias +fakhri626 +fics.danmark +Francois B. (Google) +Frank Yellin +Fred Lin (Anobiit) +gcstang +Guenther Grau +Guillaume Cottenceau +Guillaume Le Biller +Hannes Erven +Hartmut Neubauer (Schweers Informationstechnologie GmbH) +hosigumayuugi +hypest (Barcorama project) +Ian W. Davis +Isaac Potoczny-Jones +Ivan Poliakov +Jacob Haynes (Google) +Jeff Breidenbach (Google) +jjYBdx4IL +Joan Montané (Softcatalà.cat) +John Connolly (Bug Labs) +Jonas Petersson (Prisjakt) +Joseph Wain (Google) +Juha Kuitunen +Juho Mikkonen +Jukka Nurmi +jwicks +Kamil Kaczmarczyk +Kazuki Nishiura +Kevin O'Sullivan (SITA) +Kevin Xue (NetDragon Websoft Inc., China) +Lachezar Dobrev +Loránt Gerencsér +Luiz Silva +Luka Finžgar +Łukasz Stefaniak +Malte Starostik +Manuel Kasten +Marcelo +Marcin Górny +Markus Helm +Mateusz Jędrasik +Matthew Schulkind (Google) +Matt York (LifeMarks) +MicheleMas +mike32767 +mikej06 / micjahn +Mike Kicinski +Mohamad Fairol +Morgan Courbet +Nikolaos Ftylitakis +Nikolaus Huber +Olexandr Nesterenko +Olli +Pablo Orduña (University of Deusto) +Paul Hackenberger +perennialmind +Radu Silaghi +Ralf Kistner +Randy Shen (Acer) +Rasmus Schrøder Sørensen +Richard Hřivňák +Romain Pechayre +Roman Nurik (Google) +Rustam Abdullaev +Ryan Alford +Sanford Squires +Satoshi Kametaya +Shachar Shemesh +Sean Owen (Google) +Shiyuan Guo / 郭世元 +ShumovichY +Simon Flannery (Ericsson) +slepmog +Stephen Furlani +Steven Parkes +stoty74 +Suraj Supekar +Sven Klinkhamer +taku0 +techinstantdx +tgibson11 +Thanapon Namjittrong +Thomas Gerbet +Thomas Weißschuh +Tim Gernat +v.anestis +Vince Francis (LifeMarks) +Wolfgang Jung +Yahoe001 +Yakov Okshtein (Google) +Yao Wei +Younes CHTIOUI +Yunhao Tian diff --git a/doc/licenses/zxing-3.5.3/NOTICE b/doc/licenses/zxing-3.5.3/NOTICE new file mode 100644 index 0000000..0a372e3 --- /dev/null +++ b/doc/licenses/zxing-3.5.3/NOTICE @@ -0,0 +1,7 @@ +Barcode4J +Copyright 2002-2010 Jeremias Märki +Copyright 2005-2006 Dietmar Bürkle + +Portions of this software were contributed under section 5 of the +Apache License. Contributors are listed under: +http://barcode4j.sourceforge.net/contributors.html diff --git a/doc/licenses/zxing-3.5.3/README b/doc/licenses/zxing-3.5.3/README new file mode 100644 index 0000000..87a0bbc --- /dev/null +++ b/doc/licenses/zxing-3.5.3/README @@ -0,0 +1,8 @@ +ZXing Barcode Scanning Library (https://github.com/zxing/zxing/) +---------------------------------------------------------------- + + Version: 3.5.3 + From: 'ZXing authors' (https://github.com/zxing/zxing/blob/zxing-3.5.2/AUTHORS) + License(s): + Apache v2.0 + diff --git a/doc/licenses/zxing-3.5.3/dep-coordinates.txt b/doc/licenses/zxing-3.5.3/dep-coordinates.txt new file mode 100644 index 0000000..48d52b1 --- /dev/null +++ b/doc/licenses/zxing-3.5.3/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.google.zxing:core:jar:3.5.3 +com.google.zxing:javase:jar:3.5.3 diff --git a/extensions/.ratignore b/extensions/.ratignore new file mode 100644 index 0000000..366f628 --- /dev/null +++ b/extensions/.ratignore @@ -0,0 +1 @@ +guacamole-auth-radius/**/* diff --git a/extensions/guacamole-auth-ban/.ratignore b/extensions/guacamole-auth-ban/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-ban/pom.xml b/extensions/guacamole-auth-ban/pom.xml new file mode 100644 index 0000000..a9e8dfe --- /dev/null +++ b/extensions/guacamole-auth-ban/pom.xml @@ -0,0 +1,81 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-ban + jar + 1.6.0 + guacamole-auth-ban + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + org.checkerframework + checker-qual + + + com.google.errorprone + error_prone_annotations + + + + + + + + com.github.ben-manes.caffeine + caffeine + 2.9.3 + + + + + diff --git a/extensions/guacamole-auth-ban/src/main/assembly/dist.xml b/extensions/guacamole-auth-ban/src/main/assembly/dist.xml new file mode 100644 index 0000000..d046ae6 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/assembly/dist.xml @@ -0,0 +1,54 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/BanningAuthenticationListener.java b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/BanningAuthenticationListener.java new file mode 100644 index 0000000..c1ba8a5 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/BanningAuthenticationListener.java @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ban; + +import org.apache.guacamole.auth.ban.status.AuthenticationFailureTracker; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ban.status.InMemoryAuthenticationFailureTracker; +import org.apache.guacamole.auth.ban.status.NullAuthenticationFailureTracker; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.event.AuthenticationFailureEvent; +import org.apache.guacamole.net.event.AuthenticationSuccessEvent; +import org.apache.guacamole.net.event.listener.Listener; +import org.apache.guacamole.net.event.AuthenticationRequestReceivedEvent; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.LongGuacamoleProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Listener implementation which automatically tracks authentication failures + * such that further authentication attempts may be automatically blocked if + * they match configured criteria. + */ +public class BanningAuthenticationListener implements Listener { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(BanningAuthenticationListener.class); + + /** + * The maximum number of failed authentication attempts allowed before an + * address is temporarily banned. + */ + private static final IntegerGuacamoleProperty MAX_ATTEMPTS = new IntegerGuacamoleProperty() { + + @Override + public String getName() { + return "ban-max-invalid-attempts"; + } + + }; + + /** + * The length of time that each address should be banned after reaching the + * maximum number of failed authentication attempts, in seconds. + */ + private static final IntegerGuacamoleProperty IP_BAN_DURATION = new IntegerGuacamoleProperty() { + + @Override + public String getName() { + return "ban-address-duration"; + } + + }; + + /** + * The maximum number of failed authentication attempts tracked at any + * given time. Once this number of addresses is exceeded, the oldest + * authentication attempts are rotated off on an LRU basis. + */ + private static final LongGuacamoleProperty MAX_ADDRESSES = new LongGuacamoleProperty() { + + @Override + public String getName() { + return "ban-max-addresses"; + } + + }; + + /** + * The default maximum number of failed authentication attempts allowed + * before an address is temporarily banned. + */ + private static final int DEFAULT_MAX_ATTEMPTS = 5; + + /** + * The default length of time that each address should be banned after + * reaching the maximum number of failed authentication attempts, in + * seconds. + */ + private static final int DEFAULT_IP_BAN_DURATION = 300; + + /** + * The maximum number of failed authentication attempts tracked at any + * given time. Once this number of addresses is exceeded, the oldest + * authentication attempts are rotated off on an LRU basis. + */ + private static final long DEFAULT_MAX_ADDRESSES = 10485760; + + /** + * Tracker of addresses that have repeatedly failed authentication. + */ + private final AuthenticationFailureTracker tracker; + + /** + * Creates a new BanningAuthenticationListener which automatically bans + * further authentication attempts from addresses that have repeatedly + * failed to authenticate. The ban duration and maximum number of failed + * attempts allowed before banning are configured within + * guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs parsing the configuration properties used by this + * extension. + */ + public BanningAuthenticationListener() throws GuacamoleException { + + Environment environment = LocalEnvironment.getInstance(); + int maxAttempts = environment.getProperty(MAX_ATTEMPTS, DEFAULT_MAX_ATTEMPTS); + int banDuration = environment.getProperty(IP_BAN_DURATION, DEFAULT_IP_BAN_DURATION); + long maxAddresses = environment.getProperty(MAX_ADDRESSES, DEFAULT_MAX_ADDRESSES); + + // Configure auth failure tracking behavior and inform administrator of + // ultimate result + if (maxAttempts <= 0) { + this.tracker = new NullAuthenticationFailureTracker(); + logger.info("Maximum failed authentication attempts has been set " + + "to {}. Automatic banning of brute-force authentication " + + "attempts will be disabled.", maxAttempts); + } + else if (banDuration <= 0) { + this.tracker = new NullAuthenticationFailureTracker(); + logger.info("Ban duration for addresses that repeatedly fail " + + "authentication has been set to {}. Automatic banning " + + "of brute-force authentication attempts will be " + + "disabled.", banDuration); + } + else if (maxAddresses <= 0) { + this.tracker = new NullAuthenticationFailureTracker(); + logger.info("Maximum number of tracked addresses has been set to " + + "{}. Automatic banning of brute-force authentication " + + "attempts will be disabled.", maxAddresses); + } + else { + this.tracker = new InMemoryAuthenticationFailureTracker(maxAttempts, banDuration, maxAddresses); + logger.info("Addresses will be automatically banned for {} " + + "seconds after {} failed authentication attempts. Up " + + "to {} unique addresses will be tracked/banned at any " + + "given time.", banDuration, maxAttempts, maxAddresses); + } + + } + + @Override + public void handleEvent(Object event) throws GuacamoleException { + + // Notify auth tracker of each request received BEFORE the request is + // processed ... + if (event instanceof AuthenticationRequestReceivedEvent) { + AuthenticationRequestReceivedEvent request = (AuthenticationRequestReceivedEvent) event; + tracker.notifyAuthenticationRequestReceived(request.getCredentials()); + } + + // ... as well as every explicit failure ... + else if (event instanceof AuthenticationFailureEvent) { + + AuthenticationFailureEvent failure = (AuthenticationFailureEvent) event; + + // Requests for additional credentials are not failures per se, + // but continuations of a multi-request authentication attempt that + // has not yet succeeded OR failed + if (failure.getFailure() instanceof GuacamoleInsufficientCredentialsException) { + tracker.notifyAuthenticationRequestReceived(failure.getCredentials()); + return; + } + + // Consider all other errors to be failed auth attempts + tracker.notifyAuthenticationFailed(failure.getCredentials()); + + } + + // ... and explicit success. + else if (event instanceof AuthenticationSuccessEvent) { + AuthenticationSuccessEvent success = (AuthenticationSuccessEvent) event; + tracker.notifyAuthenticationSuccess(success.getCredentials()); + } + + } + +} diff --git a/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/AuthenticationFailureStatus.java b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/AuthenticationFailureStatus.java new file mode 100644 index 0000000..3292d11 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/AuthenticationFailureStatus.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ban.status; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * The current status of an authentication failure, including the number of + * times the failure has occurred. + */ +public class AuthenticationFailureStatus { + + /** + * The timestamp of the last authentication failure, as returned by + * System.nanoTime(). + */ + private long lastFailure; + + /** + * The number of failures that have occurred. + */ + private final AtomicInteger failureCount; + + /** + * The maximum number of failures that may occur before the user/address + * causing the failures is blocked. + */ + private final int maxAttempts; + + /** + * The amount of time that a user/address must remain blocked after they + * have reached the maximum number of failures. Unlike the value provided + * at construction time, this value is maintained in nanoseconds. + */ + private final long duration; + + /** + * Creates an AuthenticationFailureStatus that is initialized to zero + * failures and is subject to the given restrictions. Additional failures + * may be flagged after creation with {@link #notifyFailed()}. + * + * @param maxAttempts + * The maximum number of failures that may occur before the + * user/address causing the failures is blocked. + * + * @param duration + * The amount of time, in seconds, that a user/address must remain + * blocked after they have reached the maximum number of failures. + */ + public AuthenticationFailureStatus(int maxAttempts, int duration) { + this.lastFailure = System.nanoTime(); + this.failureCount = new AtomicInteger(0); + this.maxAttempts = maxAttempts; + this.duration = TimeUnit.SECONDS.toNanos(duration); + } + + /** + * Updates this authentication failure, noting that the failure it + * represents has recurred. + */ + public void notifyFailed() { + lastFailure = System.nanoTime(); + failureCount.incrementAndGet(); + } + + /** + * Returns whether this authentication failure is recent enough that it + * should still be tracked. This function will return false for + * authentication failures that have not recurred for at least the duration + * provided at construction time. + * + * @return + * true if this authentication failure is recent enough that it should + * still be tracked, false otherwise. + */ + public boolean isValid() { + return System.nanoTime() - lastFailure <= duration; + } + + /** + * Returns whether the user/address causing this authentication failure + * should be blocked based on the restrictions provided at construction + * time. + * + * @return + * true if the user/address causing this failure should be blocked, + * false otherwise. + */ + public boolean isBlocked() { + return isValid() && failureCount.get() >= maxAttempts; + } + + /** + * Returns the total number of authentication failures that have been + * recorded through creating this object and invoking + * {@link #notifyFailed()}. + * + * @return + * The total number of failures that have occurred. + */ + public int getFailures() { + return failureCount.get(); + } + +} diff --git a/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/AuthenticationFailureTracker.java b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/AuthenticationFailureTracker.java new file mode 100644 index 0000000..9ea7f2c --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/AuthenticationFailureTracker.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ban.status; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Tracks past authentication results, automatically blocking the IP addresses + * of machines that repeatedly fail to authenticate. + */ +public interface AuthenticationFailureTracker { + + /** + * Reports that an authentication request has been received, but it is + * either not yet known whether the request has succeeded or failed. If the + * associated address is currently being blocked, an exception will be + * thrown. + * + * @param credentials + * The credentials associated with the authentication request. + * + * @throws GuacamoleException + * If the authentication request is being blocked due to brute force + * prevention rules. + */ + void notifyAuthenticationRequestReceived(Credentials credentials) + throws GuacamoleException; + + /** + * Reports that an authentication request has been received and has + * succeeded. If the associated address is currently being blocked, an + * exception will be thrown. + * + * @param credentials + * The credentials associated with the successful authentication + * request. + * + * @throws GuacamoleException + * If the authentication request is being blocked due to brute force + * prevention rules. + */ + void notifyAuthenticationSuccess(Credentials credentials) + throws GuacamoleException; + + /** + * Reports that an authentication request has been received and has + * failed. If the associated address is currently being blocked, an + * exception will be thrown. + * + * @param credentials + * The credentials associated with the failed authentication request. + * + * @throws GuacamoleException + * If the authentication request is being blocked due to brute force + * prevention rules. + */ + void notifyAuthenticationFailed(Credentials credentials) + throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/InMemoryAuthenticationFailureTracker.java b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/InMemoryAuthenticationFailureTracker.java new file mode 100644 index 0000000..58ed4e0 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/InMemoryAuthenticationFailureTracker.java @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ban.status; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.language.TranslatableGuacamoleClientTooManyException; +import org.apache.guacamole.net.auth.Credentials; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * AuthenticationFailureTracker implementation that tracks the failure status + * of each IP address in memory. The maximum amount of memory consumed is + * bounded by the configured maximum number of addresses tracked. + */ +public class InMemoryAuthenticationFailureTracker implements AuthenticationFailureTracker { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(InMemoryAuthenticationFailureTracker.class); + + /** + * All authentication failures currently being tracked, stored by the + * associated IP address. + */ + private final Cache failures; + + /** + * The maximum number of failed authentication attempts allowed before an + * address is temporarily banned. + */ + private final int maxAttempts; + + /** + * The length of time that each address should be banned after reaching the + * maximum number of failed authentication attempts, in seconds. + */ + private final int banDuration; + + /** + * Creates a new AuthenticationFailureTracker that automatically blocks + * authentication attempts based on the provided blocking criteria. + * + * @param maxAttempts + * The maximum number of failed authentication attempts allowed before + * an address is temporarily banned. + * + * @param banDuration + * The length of time that each address should be banned after reaching + * the maximum number of failed authentication attempts, in seconds. + * + * @param maxAddresses + * The maximum number of unique IP addresses that should be tracked + * before discarding older tracked failures. + */ + public InMemoryAuthenticationFailureTracker(int maxAttempts, int banDuration, + long maxAddresses) { + + this.maxAttempts = maxAttempts; + this.banDuration = banDuration; + + // Limit maximum number of tracked addresses to configured upper bound + this.failures = Caffeine.newBuilder() + .maximumSize(maxAddresses) + .build(); + + } + + /** + * Reports that the given address has just failed to authenticate and + * returns the AuthenticationFailureStatus that represents that failure. If + * the address isn't already being tracked, it will begin being tracked as + * of this call. If the address is already tracked, the returned + * AuthenticationFailureStatus will represent past authentication failures, + * as well. + * + * @param address + * The address that has failed to authenticate. + * + * @return + * An AuthenticationFailureStatus that represents this latest + * authentication failure for the given address, as well as any past + * failures. + */ + private AuthenticationFailureStatus getAuthenticationFailure(String address) { + + AuthenticationFailureStatus status = failures.get(address, + (addr) -> new AuthenticationFailureStatus(maxAttempts, banDuration)); + + status.notifyFailed(); + return status; + + } + + /** + * Reports that an authentication request has been received, as well as + * whether that request is known to have failed. If the associated address + * is currently being blocked, an exception will be thrown. + * + * @param credentials + * The credentials associated with the authentication request. + * + * @param failed + * Whether the request is known to have failed. If the status of the + * request is not yet known, this should be false. + * + * @throws GuacamoleException + * If the authentication request is being blocked due to brute force + * prevention rules. + */ + private void notifyAuthenticationStatus(Credentials credentials, + boolean failed) throws GuacamoleException { + + // Ignore requests that do not contain explicit parameters of any kind + if (credentials.isEmpty()) + return; + + // Determine originating address of the authentication request + String address = credentials.getRemoteAddress(); + if (address == null) + throw new GuacamoleServerException("Source address cannot be determined."); + + // Get current failure status for the address associated with the + // authentication request, adding/updating that status if the request + // was itself a failure + AuthenticationFailureStatus status; + if (failed) { + status = getAuthenticationFailure(address); + logger.info("Authentication has failed for address \"{}\" (current total failures: {}/{}).", + address, status.getFailures(), maxAttempts); + } + else + status = failures.getIfPresent(address); + + if (status != null) { + + // Explicitly block further processing of authentication/authorization + // if too many failures have occurred + if (status.isBlocked()) { + logger.warn("Blocking authentication attempt from address \"{}\" due to number of authentication failures.", address); + throw new TranslatableGuacamoleClientTooManyException("Too " + + "many failed authentication attempts.", + "LOGIN.ERROR_TOO_MANY_ATTEMPTS"); + } + + // Clean up tracking of failures if the address is no longer + // relevant (all failures are sufficiently old) + else if (!status.isValid()) { + logger.debug("Removing address \"{}\" from tracking as there are no recent authentication failures.", address); + failures.invalidate(address); + } + + } + + } + + @Override + public void notifyAuthenticationRequestReceived(Credentials credentials) + throws GuacamoleException { + notifyAuthenticationStatus(credentials, false); + } + + @Override + public void notifyAuthenticationSuccess(Credentials credentials) + throws GuacamoleException { + notifyAuthenticationStatus(credentials, false); + } + + @Override + public void notifyAuthenticationFailed(Credentials credentials) + throws GuacamoleException { + notifyAuthenticationStatus(credentials, true); + } + +} diff --git a/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/NullAuthenticationFailureTracker.java b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/NullAuthenticationFailureTracker.java new file mode 100644 index 0000000..9b50a30 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/java/org/apache/guacamole/auth/ban/status/NullAuthenticationFailureTracker.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ban.status; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Credentials; + +/** + * AuthenticationFailureTracker implementation that does nothing. All requests + * are ignored, regardless of status, and no tracking is performed. + */ +public class NullAuthenticationFailureTracker implements AuthenticationFailureTracker { + + @Override + public void notifyAuthenticationRequestReceived(Credentials credentials) + throws GuacamoleException { + // Do nothing + } + + @Override + public void notifyAuthenticationSuccess(Credentials credentials) + throws GuacamoleException { + // Do nothing + } + + @Override + public void notifyAuthenticationFailed(Credentials credentials) + throws GuacamoleException { + // Do nothing + } + +} diff --git a/extensions/guacamole-auth-ban/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-ban/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..46a54ba --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/resources/guac-manifest.json @@ -0,0 +1,17 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Brute-force Authentication Detection/Prevention", + "namespace" : "ban", + + "listeners" : [ + "org.apache.guacamole.auth.ban.BanningAuthenticationListener" + ], + + "translations" : [ + "translations/en.json", + "translations/pl.json" + ] + +} diff --git a/extensions/guacamole-auth-ban/src/main/resources/translations/en.json b/extensions/guacamole-auth-ban/src/main/resources/translations/en.json new file mode 100644 index 0000000..2ef8a37 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/resources/translations/en.json @@ -0,0 +1,5 @@ +{ + "LOGIN": { + "ERROR_TOO_MANY_ATTEMPTS" : "Too many failed authentication attempts. Please try again later." + } +} diff --git a/extensions/guacamole-auth-ban/src/main/resources/translations/pl.json b/extensions/guacamole-auth-ban/src/main/resources/translations/pl.json new file mode 100644 index 0000000..0ba1f80 --- /dev/null +++ b/extensions/guacamole-auth-ban/src/main/resources/translations/pl.json @@ -0,0 +1,5 @@ +{ + "LOGIN": { + "ERROR_TOO_MANY_ATTEMPTS" : "Zbyt wiele nieudanych prób logowania. Spróbuj ponownie później." + } +} diff --git a/extensions/guacamole-auth-duo/.gitignore b/extensions/guacamole-auth-duo/.gitignore new file mode 100644 index 0000000..1de9633 --- /dev/null +++ b/extensions/guacamole-auth-duo/.gitignore @@ -0,0 +1,3 @@ +src/main/resources/generated/ +target/ +*~ diff --git a/extensions/guacamole-auth-duo/.ratignore b/extensions/guacamole-auth-duo/.ratignore new file mode 100644 index 0000000..4cbee99 --- /dev/null +++ b/extensions/guacamole-auth-duo/.ratignore @@ -0,0 +1,2 @@ +src/main/resources/lib/DuoWeb/**/* +src/main/java/com/duosecurity/duoweb/**/* diff --git a/extensions/guacamole-auth-duo/pom.xml b/extensions/guacamole-auth-duo/pom.xml new file mode 100644 index 0000000..afbb564 --- /dev/null +++ b/extensions/guacamole-auth-duo/pom.xml @@ -0,0 +1,142 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-duo + jar + 1.6.0 + guacamole-auth-duo + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + UTF-8 + 4.12.0 + 1.9.25 + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.guava + guava + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + com.duosecurity + duo-universal-sdk + 1.2.0 + + + com.squareup.okhttp3 + okhttp + + + com.squareup.okhttp3 + logging-interceptor + + + + + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + org.jetbrains.kotlin + kotlin-stdlib-common + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + + + com.squareup.okhttp3 + logging-interceptor + ${okhttp.version} + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-common + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + + + com.github.seancfoley + ipaddress + provided + + + + + diff --git a/extensions/guacamole-auth-duo/src/main/assembly/dist.xml b/extensions/guacamole-auth-duo/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java new file mode 100644 index 0000000..580dbf9 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.duo; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * AuthenticationProvider implementation which uses Duo as an additional + * authentication factor for users which have already been authenticated by + * some other AuthenticationProvider. + */ +public class DuoAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * The unique identifier for this authentication provider. This is used in + * various parts of the Guacamole client to distinguish this provider from + * others, particularly when multiple authentication providers are used. + */ + public static String PROVIDER_IDENTIFER = "duo"; + + /** + * Service for verifying the identity of users that Guacamole has otherwise + * already authenticated. + */ + private final UserVerificationService verificationService; + + /** + * Session manager for storing/retrieving the state of a user's + * authentication attempt while they are redirected to the Duo service. + */ + private final DuoAuthenticationSessionManager sessionManager; + + /** + * Creates a new DuoAuthenticationProvider that verifies users + * using the Duo authentication service + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public DuoAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + Injector injector = Guice.createInjector( + new DuoAuthenticationProviderModule(this) + ); + + sessionManager = injector.getInstance(DuoAuthenticationSessionManager.class); + verificationService = injector.getInstance(UserVerificationService.class); + + } + + @Override + public String getIdentifier() { + return PROVIDER_IDENTIFER; + } + + @Override + public Credentials updateCredentials(Credentials credentials) + throws GuacamoleException { + + // Ignore requests with no corresponding authentication session ID, as + // there are no credentials to reconstitute if the user has not yet + // attempted to authenticate + String duoState = credentials.getParameter(UserVerificationService.DUO_STATE_PARAMETER_NAME); + if (duoState == null) + return credentials; + + // Ignore requests with invalid/expired authentication session IDs + DuoAuthenticationSession session = sessionManager.resume(duoState); + if (session == null) + return credentials; + + // Reconstitute the originally-provided credentials from the users + // authentication attempt prior to being redirected to Duo + Credentials previousCredentials = session.getCredentials(); + previousCredentials.setRequestDetails(credentials.getRequestDetails()); + return previousCredentials; + + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + // Verify user against Duo service + verificationService.verifyAuthenticatedUser(authenticatedUser); + + // User has been verified, and authentication should be allowed to + // continue + return null; + + } + + @Override + public void shutdown() { + sessionManager.shutdown(); + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProviderModule.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProviderModule.java new file mode 100644 index 0000000..372bbcc --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProviderModule.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.duo; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.duo.conf.ConfigurationService; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * Guice module which configures Duo-specific injections. + */ +public class DuoAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the DuoAuthenticationProvider on behalf of which this + * module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new Duo authentication provider module which configures + * injection for the DuoAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public DuoAuthenticationProviderModule(AuthenticationProvider authProvider) + throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Store associated auth provider + this.authProvider = authProvider; + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind Duo-specific services + bind(ConfigurationService.class); + bind(UserVerificationService.class); + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSession.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSession.java new file mode 100644 index 0000000..6876cad --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSession.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.duo; + +import org.apache.guacamole.net.auth.AuthenticationSession; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Representation of an in-progress Duo authentication attempt. + */ +public class DuoAuthenticationSession extends AuthenticationSession { + + /** + * The credentials that the user originally provided to Guacamole prior to + * being redirected to the Duo service. + */ + private final Credentials credentials; + + /** + * Creates a new AuthenticationSession representing an in-progress Duo + * authentication attempt. + * + * @param credentials + * The credentials that the user originally provided to Guacamole prior + * to being redirected to the Duo service. + * + * @param expires + * The number of milliseconds that may elapse before this session must + * be considered invalid. + */ + public DuoAuthenticationSession(Credentials credentials, long expires) { + super(expires); + this.credentials = credentials; + } + + /** + * Returns the credentials that the user originally provided to Guacamole + * prior to being redirected to the Duo service. + * + * @return + * The credentials that the user originally provided to Guacamole prior + * to being redirected to the Duo service. + */ + public Credentials getCredentials() { + return credentials; + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSessionManager.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSessionManager.java new file mode 100644 index 0000000..f2f39da --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSessionManager.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.duo; + +import com.google.inject.Singleton; +import org.apache.guacamole.net.auth.AuthenticationSessionManager; + +/** + * Manager service that temporarily stores authentication attempts while + * the Duo authentication flow is underway. + */ +@Singleton +public class DuoAuthenticationSessionManager + extends AuthenticationSessionManager { + + // Intentionally empty (the default functions inherited from the + // AuthenticationSessionManager base class are sufficient for our needs) + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java new file mode 100644 index 0000000..557427d --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java @@ -0,0 +1,276 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.duo; + +import com.duosecurity.Client; +import com.duosecurity.exception.DuoException; +import com.duosecurity.model.Token; +import com.google.inject.Inject; +import inet.ipaddr.IPAddress; +import inet.ipaddr.IPAddressString; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Collections; +import java.util.concurrent.TimeUnit; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.duo.conf.ConfigurationService; +import org.apache.guacamole.form.RedirectField; +import org.apache.guacamole.language.TranslatableGuacamoleInsufficientCredentialsException; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.properties.IPAddressListProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for verifying the identity of a user against Duo. + */ +public class UserVerificationService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserVerificationService.class); + + /** + * The name of the HTTP parameter that Duo will use to communicate the + * result of the user's attempt to authenticate with their service. This + * parameter is provided in the GET request received when Duo redirects the + * user back to Guacamole. + */ + public static final String DUO_CODE_PARAMETER_NAME = "duo_code"; + + /** + * The name of the HTTP parameter that we will be using to hold the opaque + * authentication session ID. This session ID is transmitted to Duo during + * the initial redirect and received back from Duo via this parameter in + * the GET request received when Duo redirects the user back to Guacamole. + * The session ID is ultimately used to reconstitute the original + * credentials received from the user by Guacamole such that parameter + * tokens like GUAC_USERNAME and GUAC_PASSWORD can continue to work as + * expected. + */ + public static final String DUO_STATE_PARAMETER_NAME = "state"; + + /** + * The value that will be returned in the token if Duo authentication + * was successful. + */ + private static final String DUO_TOKEN_SUCCESS_VALUE = "allow"; + + /** + * Session manager for storing/retrieving the state of a user's + * authentication attempt while they are redirected to the Duo service. + */ + @Inject + private DuoAuthenticationSessionManager sessionManager; + + /** + * Service for retrieving Duo configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Verifies the identity of the given user via the Duo multi-factor + * authentication service. If a signed response from Duo has not already + * been provided, a signed response from Duo is requested in the + * form of additional expected credentials. Any provided signed response + * is cryptographically verified. If no signed response is present, or the + * signed response is invalid, an exception is thrown. + * + * @param authenticatedUser + * The user whose identity should be verified against Duo. + * + * @throws GuacamoleException + * If required Duo-specific configuration options are missing or + * malformed, or if the user's identity cannot be verified. + */ + public void verifyAuthenticatedUser(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + // Pull the original HTTP request used to authenticate + Credentials credentials = authenticatedUser.getCredentials(); + IPAddress clientAddr = new IPAddressString(credentials.getRemoteAddress()).getAddress(); + + // Ignore anonymous users + String username = authenticatedUser.getIdentifier(); + if (username == null || username.equals(AuthenticatedUser.ANONYMOUS_IDENTIFIER)) + return; + + // Pull address lists to check from configuration. Note that the enforce + // list will override the bypass list, which means that, if the client + // address happens to be in both lists, Duo MFA will be enforced. + List bypassAddresses = confService.getBypassHosts(); + List enforceAddresses = confService.getEnforceHosts(); + + // Check if the bypass list contains the client address, and set the + // enforce flag to the opposite. + boolean enforceHost = !(IPAddressListProperty.addressListContains(bypassAddresses, clientAddr)); + + // Only continue processing if the list is not empty + if (!enforceAddresses.isEmpty()) { + + // If client address is not available or invalid, MFA will + // be enforced. + if (clientAddr == null || !clientAddr.isIPAddress()) + enforceHost = true; + + // Check the enforce list for the client address and set enforcement flag. + else + enforceHost = IPAddressListProperty.addressListContains(enforceAddresses, clientAddr); + } + + // If the enforce flag is not true, bypass Duo MFA. + if (!enforceHost) + return; + + // Obtain a Duo client for redirecting the user to the Duo service and + // verifying any received authentication code + Client duoClient; + try { + duoClient = new Client.Builder( + confService.getClientId(), + confService.getClientSecret(), + confService.getAPIHostname(), + confService.getRedirectUri().toString()) + .build(); + } + catch (DuoException e) { + throw new GuacamoleServerException("Client for communicating with " + + "the Duo authentication service could not be created.", e); + } + + // Verify that the Duo service is healthy and available + try { + duoClient.healthCheck(); + } + catch (DuoException e) { + throw new GuacamoleServerException("Duo authentication service is " + + "not currently available (failed health check).", e); + } + + // Retrieve signed Duo authentication code and session state from the + // request (these will be absent if this is an initial authentication + // attempt and not a redirect back from Duo) + String duoCode = credentials.getParameter(DUO_CODE_PARAMETER_NAME); + String duoState = credentials.getParameter(DUO_STATE_PARAMETER_NAME); + + // Redirect to Duo to obtain an authentication code if that redirect + // has not yet occurred + if (duoCode != null && duoState != null) { + + // Validate that the user has successfully verified their identify with + // the Duo service + try { + + // Note unexpected behavior (Duo is expected to always return + // a token) + Token token = duoClient.exchangeAuthorizationCodeFor2FAResult(duoCode, username); + if (token == null) { + logger.warn("Duo did not return an authentication result " + + "at all for the authentication attempt by user " + + "\"{}\". This is unexpected behavior and may be " + + "a bug in the Duo service or the Duo SDK. " + + "Guacamole will attempt to automatically work " + + "around the issue by making a fresh Duo " + + "authentication request.", username); + } + + // Warn if Duo explicitly denies authentication + else if (token.getAuth_result() == null || !DUO_TOKEN_SUCCESS_VALUE.equals(token.getAuth_result().getStatus())) { + logger.warn("Duo did not return an explicitly successful " + + "authentication result for the authentication " + + "attempt by user \"{}\". The user will now be " + + "redirected back to the Duo service to reattempt" + + "authentication.", username); + } + + // Allow user to continue authenticating with Guacamole only if + // Duo has validated their identity + else + return; + + } + catch (DuoException e) { + logger.debug("The Duo client failed internally while " + + "attempting to validate the identity of user " + + "\"{}\". This is commonly caused by stale query " + + "parameters from an older Duo request remaining " + + "present in the Guacamole URL. The user will now be " + + "redirected back to the Duo service to reattempt " + + "authentication.", e); + } + + } + + // Store received credentials for later retrieval leveraging Duo's + // opaque session state identifier (we need to maintain these + // credentials so that things like the GUAC_USERNAME and + // GUAC_PASSWORD tokens continue to work as expected despite the + // redirect to/from the external Duo service) + duoState = duoClient.generateState(); + long expiresAfter = TimeUnit.MINUTES.toMillis(confService.getAuthenticationTimeout()); + sessionManager.defer(new DuoAuthenticationSession(credentials, expiresAfter), duoState); + + // Obtain authentication URL from Duo client + String duoAuthUrlString; + try { + duoAuthUrlString = duoClient.createAuthUrl(username, duoState); + } + catch (DuoException e) { + throw new GuacamoleServerException("Duo client failed to " + + "generate the authentication URL necessary to " + + "redirect the authenticating user to the Duo " + + "service.", e); + } + + // Parse and validate URL obtained from Duo client + URI duoAuthUrl; + try { + duoAuthUrl = new URI(duoAuthUrlString); + } + catch (URISyntaxException e) { + throw new GuacamoleServerException("Authentication URL " + + "generated by the Duo client is not actually a " + + "valid URL and cannot be used to redirect the " + + "authenticating user to the Duo service.", e); + } + + // Request that user be redirected to the Duo service to obtain + // a Duo authentication code + throw new TranslatableGuacamoleInsufficientCredentialsException( + "Verification using Duo is required before authentication " + + "can continue.", "LOGIN.INFO_DUO_AUTH_REQUIRED", + new CredentialsInfo(Collections.singletonList( + new RedirectField( + DUO_CODE_PARAMETER_NAME, duoAuthUrl, + new TranslatableMessage("LOGIN.INFO_DUO_REDIRECT_PENDING") + ) + )) + ); + + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java new file mode 100644 index 0000000..43a2d98 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.duo.conf; + +import com.google.inject.Inject; +import inet.ipaddr.IPAddress; +import java.net.URI; +import java.util.Collections; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.IPAddressListProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.properties.URIGuacamoleProperty; + +/** + * Service for retrieving configuration information regarding the Duo + * authentication extension. + */ +public class ConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * The property within guacamole.properties which defines the hostname + * of the Duo API endpoint to be used to verify user identities. This will + * usually be in the form "api-XXXXXXXX.duosecurity.com", where "XXXXXXXX" + * is some arbitrary alphanumeric value assigned by Duo and specific to + * your organization. + */ + private static final StringGuacamoleProperty DUO_API_HOSTNAME = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "duo-api-hostname"; } + + }; + + /** + * The property within guacamole.properties which defines the client id + * received from Duo for verifying Guacamole users. This value MUST be + * exactly 20 characters. + */ + private static final StringGuacamoleProperty DUO_CLIENT_ID = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "duo-client-id"; } + + }; + + /** + * The property within guacamole.properties which defines the secret key + * received from Duo for verifying Guacamole users. This value MUST be + * exactly 40 characters. + */ + private static final StringGuacamoleProperty DUO_CLIENT_SECRET = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "duo-client-secret"; } + + }; + + /** + * The property within guacamole.properties which defines the redirect URI + * that Duo will call after the second factor has been completed. This + * should be the URI used to access Guacamole. + */ + private static final URIGuacamoleProperty DUO_REDIRECT_URI = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "duo-redirect-uri"; } + + }; + + /** + * The property that configures the timeout, in minutes, of in-progress + * Duo authentication attempts. Authentication attempts that take longer + * than this period of time will be invalidated. + */ + private static final IntegerGuacamoleProperty DUO_AUTH_TIMEOUT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "duo-auth-timeout"; } + + }; + + /** + * The optional property that contains a comma-separated list of IP addresses + * or CIDRs for which the MFA requirement should be bypassed. If the Duo + * extension is installed, any/all users authenticating from clients that + * match this list will be able to successfully log in without fulfilling + * the MFA requirement. If this option is omitted or is empty, and the + * Duo module is installed, all users from all hosts will have Duo MFA + * enforced. + */ + private static final IPAddressListProperty DUO_BYPASS_HOSTS = + new IPAddressListProperty() { + + @Override + public String getName() { return "duo-bypass-hosts"; } + + }; + + /** + * The optional property that contains a comma-separated list of IP addresses + * or CIDRs for which the MFA requirement should be explicitly enforced. If + * the Duo module is enabled and this property is specified, users that log + * in from hosts that match the items in this list will have Duo MFA required, + * and all users from hosts that do not match this list will be able to log + * in without the MFA requirement. If this option is missing or empty and + * the Duo module is installed, MFA will be enforced for all users. + */ + private static final IPAddressListProperty DUO_ENFORCE_HOSTS = + new IPAddressListProperty() { + + @Override + public String getName() { return "duo-enforce-hosts"; } + + }; + + /** + * Returns the hostname of the Duo API endpoint to be used to verify user + * identities, as defined in guacamole.properties by the "duo-api-hostname" + * property. This will usually be in the form + * "api-XXXXXXXX.duosecurity.com", where "XXXXXXXX" is some arbitrary + * alphanumeric value assigned by Duo and specific to your organization. + * + * @return + * The hostname of the Duo API endpoint to be used to verify user + * identities. + * + * @throws GuacamoleException + * If the associated property within guacamole.properties is missing. + */ + public String getAPIHostname() throws GuacamoleException { + return environment.getRequiredProperty(DUO_API_HOSTNAME); + } + + /** + * Returns the Duo client id received from Duo for verifying Guacamole + * users, as defined in guacamole.properties by the "duo-client-id" + * property. This value MUST be exactly 20 characters. + * + * @return + * The client id received from Duo for verifying Guacamole users. + * + * @throws GuacamoleException + * If the associated property within guacamole.properties is missing. + */ + public String getClientId() throws GuacamoleException { + return environment.getRequiredProperty(DUO_CLIENT_ID); + } + + /** + * Returns the client secret received from Duo for verifying Guacamole users, + * as defined in guacamole.properties by the "duo-client-secret" property. + * This value MUST be exactly 20 characters. + * + * @return + * The client secret received from Duo for verifying Guacamole users. + * + * @throws GuacamoleException + * If the associated property within guacamole.properties is missing. + */ + public String getClientSecret() throws GuacamoleException { + return environment.getRequiredProperty(DUO_CLIENT_SECRET); + } + + /** + * Return the callback URI that will be called by Duo after authentication + * with Duo has been completed. This should be the URI to return the user + * to the Guacamole interface, and will be a full URI. + * + * @return + * The URL for Duo to use to callback to the Guacamole interface after + * authentication has been completed. + * + * @throws GuacamoleException + * If guacamole.properties cannot be read, or if the property is not + * defined. + */ + public URI getRedirectUri() throws GuacamoleException { + return environment.getRequiredProperty(DUO_REDIRECT_URI); + } + + + /** + * Returns the maximum amount of time to allow for an in-progress Duo + * authentication attempt to be completed, in minutes. A user that takes + * longer than this amount of time to complete authentication with Duo + * will need to try again. + * + * @return + * The maximum amount of time to allow for an in-progress Duo + * authentication attempt to be completed, in minutes. + * + * @throws GuacamoleException + * If the authentication timeout cannot be parsed. + */ + public int getAuthenticationTimeout() throws GuacamoleException { + return environment.getProperty(DUO_AUTH_TIMEOUT, 5); + } + + /** + * Returns the list of IP addresses and subnets defined in guacamole.properties + * for which Duo MFA should _not_ be enforced. Users logging in from hosts + * contained in this list will be logged in without the MFA requirement. + * + * @return + * A list of IP addresses and subnets for which Duo MFA should not be + * enforced. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if an invalid IP address + * or subnet is specified. + */ + public List getBypassHosts() throws GuacamoleException { + return environment.getProperty(DUO_BYPASS_HOSTS, Collections.emptyList()); + } + + /** + * Returns the list of IP addresses and subnets defined in guacamole.properties + * for which Duo MFA should explicitly be enforced, while logins from all + * other hosts should not enforce MFA. Users logging in from hosts + * contained in this list will be required to complete the Duo MFA authentication, + * while users from all other hosts will be logged in without the MFA requirement. + * + * @return + * A list of IP addresses and subnets for which Duo MFA should be + * explicitly enforced. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if an invalid IP address + * or subnet is specified. + */ + public List getEnforceHosts() throws GuacamoleException { + return environment.getProperty(DUO_ENFORCE_HOSTS, Collections.emptyList()); + } + + + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-duo/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..5c305ed --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/guac-manifest.json @@ -0,0 +1,25 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Duo TFA Authentication Backend", + "namespace" : "duo", + + "authProviders" : [ + "org.apache.guacamole.auth.duo.DuoAuthenticationProvider" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/ca.json b/extensions/guacamole-auth-duo/src/main/resources/translations/ca.json new file mode 100644 index 0000000..c154ae6 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/ca.json @@ -0,0 +1,13 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "El codi de validació duo és incorrecte.", + "INFO_DUO_AUTH_REQUIRED" : "Si us plau, autentiqueu amb Duo per continuar." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/de.json b/extensions/guacamole-auth-duo/src/main/resources/translations/de.json new file mode 100644 index 0000000..9642f1a --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/de.json @@ -0,0 +1,13 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duo Validierungscode nicht korrekt.", + "INFO_DUO_AUTH_REQUIRED" : "Bitte melden Sie sich mit Duo an, um fortzufahren." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/en.json b/extensions/guacamole-auth-duo/src/main/resources/translations/en.json new file mode 100644 index 0000000..877f538 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/en.json @@ -0,0 +1,14 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duo validation code incorrect.", + "INFO_DUO_AUTH_REQUIRED" : "Please authenticate with Duo to continue.", + "INFO_DUO_REDIRECT_PENDING" : "Please wait, redirecting to Duo..." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/fr.json b/extensions/guacamole-auth-duo/src/main/resources/translations/fr.json new file mode 100644 index 0000000..b7dfcb7 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/fr.json @@ -0,0 +1,14 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Code de validation Duo incorrect.", + "INFO_DUO_AUTH_REQUIRED" : "Veuillez vous authentifier avec Duo pour continuer.", + "INFO_DUO_REDIRECT_PENDING" : "Veuillez patienter, redirection vers Duo..." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/it.json b/extensions/guacamole-auth-duo/src/main/resources/translations/it.json new file mode 100644 index 0000000..d7bb5a7 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/it.json @@ -0,0 +1,8 @@ +{ + + "LOGIN" : { + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Codice di convalida Duo errato.", + "INFO_DUO_AUTH_REQUIRED" : "Si prega di autenticarsi con Duo per continuare." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/ja.json b/extensions/guacamole-auth-duo/src/main/resources/translations/ja.json new file mode 100644 index 0000000..d3acef8 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/ja.json @@ -0,0 +1,9 @@ +{ + + "LOGIN" : { + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duoの認証コードが間違っています。", + "INFO_DUO_AUTH_REQUIRED" : "Duoで認証してください。", + "INFO_DUO_REDIRECT_PENDING" : "Duoへリダイレクトしています。" + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/ko.json b/extensions/guacamole-auth-duo/src/main/resources/translations/ko.json new file mode 100644 index 0000000..64cd2cd --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/ko.json @@ -0,0 +1,8 @@ +{ + + "LOGIN" : { + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duo 유효성 검사 코드가 잘못되었습니다.", + "INFO_DUO_AUTH_REQUIRED" : "계속하려면 Duo로 인증하세요." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/pl.json b/extensions/guacamole-auth-duo/src/main/resources/translations/pl.json new file mode 100644 index 0000000..dd4d3b8 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/pl.json @@ -0,0 +1,13 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Nieprawidłowy kod weryfikacyjny Duo.", + "INFO_DUO_AUTH_REQUIRED" : "Aby kontynuować uwierzytelnij się w Duo." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/pt.json b/extensions/guacamole-auth-duo/src/main/resources/translations/pt.json new file mode 100644 index 0000000..73de5c6 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/pt.json @@ -0,0 +1,13 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Código de validação Duo incorreto.", + "INFO_DUO_AUTH_REQUIRED" : "Por favor autentique com Duo para continuar." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/ru.json b/extensions/guacamole-auth-duo/src/main/resources/translations/ru.json new file mode 100644 index 0000000..5e7deb5 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/ru.json @@ -0,0 +1,12 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Бэкенд Duo TFA" + }, + + "LOGIN" : { + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Неверный код валидации Duo.", + "INFO_DUO_AUTH_REQUIRED" : "Пожалуйста, аутентифицируйтесь в Duo для продолжения." + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/resources/translations/zh.json b/extensions/guacamole-auth-duo/src/main/resources/translations/zh.json new file mode 100644 index 0000000..8bee1e2 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/resources/translations/zh.json @@ -0,0 +1,13 @@ +{ + + "DATA_SOURCE_DUO" : { + "NAME" : "Duo TFA后端" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "", + "INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duo验证码不正确。", + "INFO_DUO_AUTH_REQUIRED" : "请先使用Duo进行身份验证。" + } + +} diff --git a/extensions/guacamole-auth-header/.gitignore b/extensions/guacamole-auth-header/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-header/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-header/.ratignore b/extensions/guacamole-auth-header/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-header/pom.xml b/extensions/guacamole-auth-header/pom.xml new file mode 100644 index 0000000..017ea64 --- /dev/null +++ b/extensions/guacamole-auth-header/pom.xml @@ -0,0 +1,67 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-header + jar + 1.6.0 + guacamole-auth-header + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + + diff --git a/extensions/guacamole-auth-header/src/main/assembly/dist.xml b/extensions/guacamole-auth-header/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/AuthenticationProviderService.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/AuthenticationProviderService.java new file mode 100644 index 0000000..e3117d3 --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/AuthenticationProviderService.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.header; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.auth.header.user.AuthenticatedUser; + +/** + * Service providing convenience functions for the HTTP Header + * AuthenticationProvider implementation. + */ +public class AuthenticationProviderService { + + /** + * Service for retrieving header configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * Returns an AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * An AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @throws GuacamoleException + * If an error occurs while authenticating the user, or if access is + * denied. + */ + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Get the username from the header configured in guacamole.properties + String username = credentials.getHeader(confService.getHttpAuthHeader()); + if (username != null) { + + // Update credentials with username provided via header for sake of + // ${GUAC_USERNAME} token + credentials.setUsername(username); + + AuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(username, credentials); + return authenticatedUser; + + } + + // Authentication not provided via header, yet, so we request it. + throw new GuacamoleInvalidCredentialsException("Invalid login.", CredentialsInfo.USERNAME_PASSWORD); + + } + +} diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/ConfigurationService.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/ConfigurationService.java new file mode 100644 index 0000000..2ab1350 --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/ConfigurationService.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.header; + +import com.google.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; + +/** + * Service for retrieving configuration information for HTTP header-based + * authentication. + */ +public class ConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns the header of the HTTP server as configured with + * guacamole.properties used for HTTP authentication. + * By default, this will be "REMOTE_USER". + * + * @return + * The header used for HTTP authentication, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getHttpAuthHeader() throws GuacamoleException { + return environment.getProperty( + HTTPHeaderGuacamoleProperties.HTTP_AUTH_HEADER, + "REMOTE_USER" + ); + } + +} diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java new file mode 100644 index 0000000..5478ea5 --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.header; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Guacamole authentication backend which authenticates users using an + * arbitrary external HTTP header. No storage for connections is + * provided - only authentication. Storage must be provided by some other + * extension. + */ +public class HTTPHeaderAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * Injector which will manage the object graph of this authentication + * provider. + */ + private final Injector injector; + + /** + * Creates a new HTTPHeaderAuthenticationProvider that authenticates users + * using HTTP headers. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public HTTPHeaderAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + injector = Guice.createInjector( + new HTTPHeaderAuthenticationProviderModule(this) + ); + + } + + @Override + public String getIdentifier() { + return "header"; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Pass credentials to authentication service. + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.authenticateUser(credentials); + + } + +} diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProviderModule.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProviderModule.java new file mode 100644 index 0000000..a31d633 --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProviderModule.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.header; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * Guice module which configures HTTP header-specific injections. + */ +public class HTTPHeaderAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the HTTPHeaderAuthenticationProvider on behalf of which this + * module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new HTTP header authentication provider module which configures + * injection for the HTTPHeaderAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public HTTPHeaderAuthenticationProviderModule(AuthenticationProvider authProvider) + throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Store associated auth provider + this.authProvider = authProvider; + + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind HTTPHeader-specific classes + bind(ConfigurationService.class); + + } + +} diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderGuacamoleProperties.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderGuacamoleProperties.java new file mode 100644 index 0000000..bdc3dfd --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderGuacamoleProperties.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.header; + +import org.apache.guacamole.properties.StringGuacamoleProperty; + + +/** + * Provides properties required for use of the HTTP header + * authentication provider. These properties will be read from + * guacamole.properties when the HTTP authentication provider is used. + */ +public class HTTPHeaderGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private HTTPHeaderGuacamoleProperties() {} + + /** + * A property used to configure the header used for HTTP header authentication. + */ + public static final StringGuacamoleProperty HTTP_AUTH_HEADER = new StringGuacamoleProperty() { + + @Override + public String getName() { return "http-auth-header"; } + + }; + +} diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/user/AuthenticatedUser.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/user/AuthenticatedUser.java new file mode 100644 index 0000000..9686eac --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/user/AuthenticatedUser.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.header.user; + +import com.google.inject.Inject; +import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An HTTP header implementation of AuthenticatedUser, associating a + * username and particular set of credentials with the HTTP authentication + * provider. + */ +public class AuthenticatedUser extends AbstractAuthenticatedUser { + + /** + * Reference to the authentication provider associated with this + * authenticated user. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * The credentials provided when this user was authenticated. + */ + private Credentials credentials; + + /** + * Initializes this AuthenticatedUser using the given username and + * credentials. + * + * @param username + * The username of the user that was authenticated. + * + * @param credentials + * The credentials provided when this user was authenticated. + */ + public void init(String username, Credentials credentials) { + this.credentials = credentials; + setIdentifier(username.toLowerCase()); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + +} diff --git a/extensions/guacamole-auth-header/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-header/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..49015de --- /dev/null +++ b/extensions/guacamole-auth-header/src/main/resources/guac-manifest.json @@ -0,0 +1,12 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "HTTP Header Authentication Extension", + "namespace" : "header", + + "authProviders" : [ + "org.apache.guacamole.auth.header.HTTPHeaderAuthenticationProvider" + ] + +} diff --git a/extensions/guacamole-auth-jdbc/.ratignore b/extensions/guacamole-auth-jdbc/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/.gitignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/.ratignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/pom.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/pom.xml new file mode 100644 index 0000000..93dc928 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/pom.xml @@ -0,0 +1,105 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-jdbc-base + jar + guacamole-auth-jdbc-base + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-jdbc + 1.6.0 + ../../ + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + org.apache.guacamole + guacamole-ext + provided + + + + + org.mybatis + mybatis + 3.5.19 + + + + + org.mybatis + mybatis-guice + 3.18 + + + + + org.slf4j + jcl-over-slf4j + + + + + com.github.spotbugs + spotbugs-annotations + + + + + + + + com.google.inject + guice + + + + + com.google.guava + guava + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/AuthenticationProviderService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/AuthenticationProviderService.java new file mode 100644 index 0000000..5fedd23 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/AuthenticationProviderService.java @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Service which authenticates users based on credentials and provides for + * the creation of corresponding, new UserContext objects for authenticated + * users. + */ +public interface AuthenticationProviderService { + + /** + * Authenticates the user having the given credentials, returning a new + * AuthenticatedUser instance only if the credentials are valid. If the + * credentials are invalid or expired, an appropriate GuacamoleException + * will be thrown. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the user is being + * authenticated. + * + * @param credentials + * The credentials to use to produce the AuthenticatedUser. + * + * @return + * A new AuthenticatedUser instance for the user identified by the + * given credentials. + * + * @throws GuacamoleException + * If an error occurs during authentication, or if the given + * credentials are invalid or expired. + */ + public AuthenticatedUser authenticateUser(AuthenticationProvider authenticationProvider, + Credentials credentials) throws GuacamoleException; + + /** + * Returning a new UserContext instance for the given already-authenticated + * user. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the UserContext is + * being produced. + * + * @param authenticatedUser + * The credentials to use to produce the UserContext. + * + * @return + * A new UserContext instance for the user identified by the given + * credentials, or null if no such user exists within the database. + * + * @throws GuacamoleException + * If an error occurs during authentication, or if the given + * credentials are invalid or expired. + */ + public UserContext getUserContext(AuthenticationProvider authenticationProvider, + AuthenticatedUser authenticatedUser) throws GuacamoleException; + + /** + * Returns an updated UserContext instance for the given + * already-authenticated user. If no changes need be made to the + * UserContext, the original UserContext will be returned. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the UserContext is + * being updated. + * + * @param context + * The UserContext to update. + * + * @param authenticatedUser + * The AuthenticatedUser associated with the UserContext being updated. + * + * @param credentials + * The credentials most recently submitted by the user. These + * credentials are not guaranteed to be the same as the credentials + * already associated with the AuthenticatedUser. + * + * @return + * A new UserContext instance for the user identified by the given + * credentials. + * + * @throws GuacamoleException + * If an error occurs during authentication, or if the given + * credentials are invalid or expired. + */ + public UserContext updateUserContext(AuthenticationProvider authenticationProvider, + UserContext context, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException; + + /** + * Decorates a UserContext instance for the given already-authenticated user. + * If no decoration is required, the original UserContext will be returned. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the UserContext is + * being decorated. + * + * @param context + * The UserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser associated with the UserContext being decorated. + * + * @param credentials + * The credentials most recently submitted by the user. These + * credentials are not guaranteed to be the same as the credentials + * already associated with the AuthenticatedUser. + * + * @return + * A decorated UserContext instance for the user identified by the given + * credentials, or the original user context if no decoration is required. + * + * @throws GuacamoleException + * If the an error occurs during decoration of the UserContext. + */ + public UserContext decorateUserContext(AuthenticationProvider authenticationProvider, + UserContext context, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java new file mode 100644 index 0000000..4c8e3c0 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.google.inject.name.Named; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; +import org.apache.guacamole.GuacamoleException; +import org.apache.ibatis.datasource.pooled.PooledDataSource; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Pooled DataSource implementation which dynamically retrieves the database + * username and password from the Guacamole server environment each time a + * new database connection is created. + */ +@Singleton +public class DynamicallyAuthenticatedDataSource extends PooledDataSource { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(DynamicallyAuthenticatedDataSource.class); + + /** + * Creates a new DynamicallyAuthenticatedDataSource which dynamically + * retrieves database credentials from the given JDBCEnvironment each time + * a new database connection is needed. + * + * @param environment + * The JDBCEnvironment that should be used to retrieve database + * credentials. + * + * @param driverClassLoader + * @param driver + * @param url + */ + @Inject + public DynamicallyAuthenticatedDataSource(JDBCEnvironment environment, + @Named(value="JDBC.driverClassLoader") ClassLoader driverClassLoader, + @Named(value="JDBC.driver") String driver, + @Named(value="JDBC.url") String url) { + + // Wrap unpooled DataSource, overriding the connection process such + // that credentials are dynamically retrieved from the JDBCEnvironment + super(new UnpooledDataSource(driverClassLoader, driver, url, null, null) { + + @Override + public Connection getConnection() throws SQLException { + try { + logger.debug("Creating new database connection for pool."); + return super.getConnection(environment.getUsername(), environment.getPassword()); + } + catch (GuacamoleException e) { + throw new SQLException("Retrieval of database credentials failed.", e); + } + } + + }); + + // Force recalculation of expectedConnectionTypeCode. The + // PooledDataSource constructor accepting a single UnpooledDataSource + // will otherwise leave this value uninitialized, resulting in all + // connections failing to pass sanity checks and never being returned + // to the pool. + super.forceCloseAll(); + + } + + @Override + @Inject(optional=true) + public void setPoolPingConnectionsNotUsedFor( + @Named("mybatis.pooled.pingConnectionsNotUsedFor") int milliseconds) { + super.setPoolPingConnectionsNotUsedFor(milliseconds); + } + + @Override + @Inject(optional=true) + public void setPoolPingEnabled(@Named("mybatis.pooled.pingEnabled") boolean poolPingEnabled) { + super.setPoolPingEnabled(poolPingEnabled); + } + + @Override + @Inject(optional=true) + public void setPoolPingQuery(@Named("mybatis.pooled.pingQuery") String poolPingQuery) { + super.setPoolPingQuery(poolPingQuery); + } + + @Override + @Inject(optional=true) + public void setPoolTimeToWait(@Named("mybatis.pooled.timeToWait") int poolTimeToWait) { + super.setPoolTimeToWait(poolTimeToWait); + } + + @Override + @Inject(optional=true) + public void setPoolMaximumCheckoutTime( + @Named("mybatis.pooled.maximumCheckoutTime") int poolMaximumCheckoutTime) { + super.setPoolMaximumCheckoutTime(poolMaximumCheckoutTime); + } + + @Override + @Inject(optional=true) + public void setPoolMaximumIdleConnections( + @Named("mybatis.pooled.maximumIdleConnections") int poolMaximumIdleConnections) { + super.setPoolMaximumIdleConnections(poolMaximumIdleConnections); + } + + @Override + @Inject(optional=true) + public void setPoolMaximumActiveConnections( + @Named("mybatis.pooled.maximumActiveConnections") int poolMaximumActiveConnections) { + super.setPoolMaximumActiveConnections(poolMaximumActiveConnections); + } + + @Override + @Inject(optional=true) + public void setDriverProperties(@Named("JDBC.driverProperties") Properties driverProps) { + super.setDriverProperties(driverProps); + } + + @Override + @Inject(optional=true) + public void setDefaultAutoCommit(@Named("JDBC.autoCommit") boolean defaultAutoCommit) { + super.setDefaultAutoCommit(defaultAutoCommit); + } + + @Override + @Inject(optional=true) + public void setLoginTimeout(@Named("JDBC.loginTimeout") int loginTimeout) { + super.setLoginTimeout(loginTimeout); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingConnection.java new file mode 100644 index 0000000..87de9eb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingConnection.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import com.google.inject.Inject; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordModel; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnectionRecord; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.DelegatingConnection; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Connection implementation that creates a history record when the connection + * is established, and returns a HistoryTrackingTunnel to automatically set the + * end date when the connection is closed. + */ +public class HistoryTrackingConnection extends DelegatingConnection { + + /** + * The current Guacamole user. + */ + private final User currentUser; + + /** + * The remote host that the user connected from. + */ + private final String remoteHost; + + /** + * The connection record mapper to use when writing history entries for + * established connections. + */ + private final ConnectionRecordMapper connectionRecordMapper; + + /** + * The environment in which Guacamole is running. + */ + private final Environment environment = LocalEnvironment.getInstance(); + + /** + * Creates a new HistoryConnection that wraps the given connection, + * automatically creating a history record when the connection is + * established, and returning a HistoryTrackingTunnel to set the end + * date on the history entry when the connection is closed. + * + * @param currentUser + * The current Guacamole user. + * + * @param remoteHost + * The remote host that the user connected from. + * + * @param connection + * The connection to wrap. + * + * @param connectionRecordMapper + * The connection record mapper that will be used to write the connection history records. + */ + public HistoryTrackingConnection(User currentUser, String remoteHost, Connection connection, ConnectionRecordMapper connectionRecordMapper) { + super(connection); + + this.currentUser = currentUser; + this.remoteHost = remoteHost; + this.connectionRecordMapper = connectionRecordMapper; + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Create a connection record model, starting at the current date/time + ConnectionRecordModel connectionRecordModel = new ConnectionRecordModel(); + connectionRecordModel.setStartDate(new Date()); + + // Set the user information + connectionRecordModel.setUsername(this.currentUser.getIdentifier()); + connectionRecordModel.setRemoteHost(this.remoteHost); + + // Set the connection information + connectionRecordModel.setConnectionName(this.getDelegateConnection().getName()); + + // Insert the connection history record to mark the start of this connection + connectionRecordMapper.insert(connectionRecordModel, + environment.getCaseSensitivity()); + + // Include history record UUID as token + ModeledConnectionRecord modeledRecord = new ModeledConnectionRecord(connectionRecordModel); + Map updatedTokens = new HashMap<>(tokens); + updatedTokens.put("HISTORY_UUID", modeledRecord.getUUID().toString()); + + // Connect, and wrap the tunnel for return + GuacamoleTunnel tunnel = super.connect(info, updatedTokens); + return new HistoryTrackingTunnel( + tunnel, this.connectionRecordMapper, connectionRecordModel); + } + + /** + * Get the Connection wrapped by this HistoryTrackingConnection. + * + * @return + * The wrapped Connection. + */ + public Connection getWrappedConnection() { + return getDelegateConnection(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingConnectionDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingConnectionDirectory.java new file mode 100644 index 0000000..ddc3afb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingConnectionDirectory.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.DecoratingDirectory; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; + +/** + * A connection directory that returns HistoryTrackingConnection-wrapped connections + * when queried. + */ +public class HistoryTrackingConnectionDirectory extends DecoratingDirectory { + + /** + * The connection record mapper to use when writing history entries for + * established connections. + */ + private final ConnectionRecordMapper connectionRecordMapper; + + /** + * The user that directory operations are being performed for. + */ + private final User user; + + /** + * The remote host that the user connected from. + */ + private final String remoteHost; + + /** + * Create a new history tracking connection directory. Any connection retrieved from this + * directory will be wrapped in a HistoryTrackingConnection, enabling connection history + * records to be written with the provided connection record mapper. + * + * @param directory + * The connection directory to wrap. + * + * @param user + * The user associated with the connection directory. + * + * @param remoteHost + * The remote host that the user connected from. + * + * @param connectionRecordMapper + * The connection record mapper that will be used to write the connection history records. + */ + public HistoryTrackingConnectionDirectory(Directory directory, User user, String remoteHost, ConnectionRecordMapper connectionRecordMapper) { + super(directory); + + this.user = user; + this.remoteHost = remoteHost; + this.connectionRecordMapper = connectionRecordMapper; + } + + @Override + protected Connection decorate(Connection connection) throws GuacamoleException { + + // Wrap the connection in a history-tracking layer + return new HistoryTrackingConnection( + this.user, this.remoteHost, connection, this.connectionRecordMapper); + } + + @Override + protected Connection undecorate(Connection connection) throws GuacamoleException { + + // If the connection was wrapped, unwrap it + if (connection instanceof HistoryTrackingConnection) { + return ((HistoryTrackingConnection) connection).getWrappedConnection(); + } + + // Otherwise, return the unwrapped connection directly + return connection; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingTunnel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingTunnel.java new file mode 100644 index 0000000..aeccc3a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingTunnel.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import java.util.Date; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordModel; +import org.apache.guacamole.net.DelegatingGuacamoleTunnel; +import org.apache.guacamole.net.GuacamoleTunnel; + +/** + * Tunnel implementation which automatically writes an end date for the + * provided connection history record model using the provided connection + * history mapper, when the tunnel is closed. + */ +public class HistoryTrackingTunnel extends DelegatingGuacamoleTunnel { + + /** + * The connection for which this tunnel was established. + */ + private final ConnectionRecordMapper connectionRecordMapper; + + /** + * The user for which this tunnel was established. + */ + private final ConnectionRecordModel connectionRecordModel; + + /** + * Creates a new HistoryTrackingTunnel that wraps the given tunnel, + * automatically setting the end date for the provided connection history records, + * using the provided connection history record mapper. + * + * @param tunnel + * The tunnel to wrap. + * + * @param connectionRecordMapper + * The mapper to use when writing connection history records. + * + * @param connectionRecordModel + * The connection history record model representing the in-progress connection. + */ + public HistoryTrackingTunnel(GuacamoleTunnel tunnel, + ConnectionRecordMapper connectionRecordMapper, ConnectionRecordModel connectionRecordModel) { + + super(tunnel); + + // Store the connection record mapper and model for history tracking + this.connectionRecordMapper = connectionRecordMapper; + this.connectionRecordModel = connectionRecordModel; + } + + @Override + public void close() throws GuacamoleException { + + // Set the end date to complete the connection history record + this.connectionRecordModel.setEndDate(new Date()); + this.connectionRecordMapper.updateEndDate(this.connectionRecordModel); + + super.close(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingUserContext.java new file mode 100644 index 0000000..2c13a7e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/HistoryTrackingUserContext.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.DelegatingUserContext; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.UserContext; + +/** + * DelegatingUserContext implementation which writes connection history records + * when connections are established and closed. + */ +public class HistoryTrackingUserContext extends DelegatingUserContext { + + /** + * The remote host that the user associated with the user context + * connected from. + */ + private final String remoteHost; + + /** + * The connection record mapper to use when writing history entries for + * established connections. + */ + private final ConnectionRecordMapper connectionRecordMapper; + + /** + * Creates a new HistoryTrackingUserContext which wraps the given + * UserContext, allowing for tracking of connection history external to + * this authentication provider. + * + * @param userContext + * The UserContext to wrap. + * + * @param remoteHost + * The host that the user associated with the given user context connected from. + * + * @param connectionRecordMapper + * The mapper to use when writing connection history entries to the DB. + */ + public HistoryTrackingUserContext(UserContext userContext, String remoteHost, ConnectionRecordMapper connectionRecordMapper) { + super(userContext); + + this.remoteHost = remoteHost; + this.connectionRecordMapper = connectionRecordMapper; + } + + @Override + public Directory getConnectionDirectory() throws GuacamoleException { + return new HistoryTrackingConnectionDirectory( + super.getConnectionDirectory(), self(), + this.remoteHost, this.connectionRecordMapper); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java new file mode 100644 index 0000000..8ae2eea --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.AuthenticatedUser; + +/** + * Provides a base implementation of an AuthenticationProvider which delegates + * the various function calls to an underlying AuthenticationProviderService + * implementation. As such a service is injectable by Guice, this provides a + * means for Guice to (effectively) apply dependency injection to an + * AuthenticationProvider, even though it is the AuthenticationProvider that + * serves as the entry point. + */ +public abstract class InjectedAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * The AuthenticationProviderService to which all AuthenticationProvider + * calls will be delegated. + */ + private final AuthenticationProviderService authProviderService; + + /** + * Creates a new AuthenticationProvider that delegates all calls to an + * underlying AuthenticationProviderService. The behavior of the + * AuthenticationProvider is defined by the given + * AuthenticationProviderService implementation, which will be injected by + * the Guice Injector provided by the given JDBCInjectorProvider. + * + * @param injectorProvider + * A JDBCInjectorProvider instance which provides singleton instances + * of a Guice Injector, pre-configured to set up all injections and + * access to the underlying database via MyBatis. + * + * @param authProviderServiceClass + * The AuthenticationProviderService implementation which defines the + * behavior of this AuthenticationProvider. + * + * @throws GuacamoleException + * If the Injector cannot be created due to an error. + */ + public InjectedAuthenticationProvider(JDBCInjectorProvider injectorProvider, + Class authProviderServiceClass) + throws GuacamoleException { + + Injector injector = injectorProvider.get(); + authProviderService = injector.getInstance(authProviderServiceClass); + + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + return authProviderService.authenticateUser(this, credentials); + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + return authProviderService.getUserContext(this, authenticatedUser); + } + + @Override + public UserContext updateUserContext(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + return authProviderService.updateUserContext(this, context, + authenticatedUser, credentials); + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + return authProviderService.decorateUserContext(this, context, + authenticatedUser, credentials); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderModule.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderModule.java new file mode 100644 index 0000000..1b361e5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderModule.java @@ -0,0 +1,209 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import com.google.inject.Scopes; +import javax.sql.DataSource; +import org.apache.guacamole.auth.jdbc.user.ModeledUserContext; +import org.apache.guacamole.auth.jdbc.connectiongroup.RootConnectionGroup; +import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup; +import org.apache.guacamole.auth.jdbc.connectiongroup.ConnectionGroupDirectory; +import org.apache.guacamole.auth.jdbc.connection.ConnectionDirectory; +import org.apache.guacamole.auth.jdbc.connection.ModeledGuacamoleConfiguration; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.auth.jdbc.permission.SystemPermissionSet; +import org.apache.guacamole.auth.jdbc.user.ModeledUser; +import org.apache.guacamole.auth.jdbc.user.UserDirectory; +import org.apache.guacamole.auth.jdbc.connectiongroup.ConnectionGroupMapper; +import org.apache.guacamole.auth.jdbc.connection.ConnectionMapper; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.auth.jdbc.permission.SystemPermissionMapper; +import org.apache.guacamole.auth.jdbc.user.UserMapper; +import org.apache.guacamole.auth.jdbc.connectiongroup.ConnectionGroupService; +import org.apache.guacamole.auth.jdbc.connection.ConnectionService; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.auth.jdbc.security.PasswordEncryptionService; +import org.apache.guacamole.auth.jdbc.security.SHA256PasswordEncryptionService; +import org.apache.guacamole.auth.jdbc.security.SaltService; +import org.apache.guacamole.auth.jdbc.security.SecureRandomSaltService; +import org.apache.guacamole.auth.jdbc.permission.SystemPermissionService; +import org.apache.guacamole.auth.jdbc.user.UserService; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.apache.guacamole.auth.jdbc.permission.ConnectionGroupPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ConnectionGroupPermissionService; +import org.apache.guacamole.auth.jdbc.permission.ConnectionGroupPermissionSet; +import org.apache.guacamole.auth.jdbc.permission.ConnectionPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ConnectionPermissionService; +import org.apache.guacamole.auth.jdbc.permission.ConnectionPermissionSet; +import org.apache.guacamole.auth.jdbc.permission.UserPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.UserPermissionService; +import org.apache.guacamole.auth.jdbc.permission.UserPermissionSet; +import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionDirectory; +import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionPermissionService; +import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionPermissionSet; +import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionService; +import org.apache.guacamole.auth.jdbc.activeconnection.TrackedActiveConnection; +import org.apache.guacamole.auth.jdbc.base.EntityMapper; +import org.apache.guacamole.auth.jdbc.base.EntityService; +import org.apache.guacamole.auth.jdbc.connection.ConnectionParameterMapper; +import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionService; +import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionSet; +import org.apache.guacamole.auth.jdbc.permission.UserGroupPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.UserGroupPermissionService; +import org.apache.guacamole.auth.jdbc.permission.UserGroupPermissionSet; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicyService; +import org.apache.guacamole.auth.jdbc.sharing.ConnectionSharingService; +import org.apache.guacamole.auth.jdbc.sharing.HashSharedConnectionMap; +import org.apache.guacamole.auth.jdbc.sharing.SecureRandomShareKeyGenerator; +import org.apache.guacamole.auth.jdbc.sharing.ShareKeyGenerator; +import org.apache.guacamole.auth.jdbc.sharing.SharedConnectionMap; +import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileDirectory; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileMapper; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileParameterMapper; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileService; +import org.apache.guacamole.auth.jdbc.tunnel.RestrictedGuacamoleTunnelService; +import org.apache.guacamole.auth.jdbc.user.PasswordRecordMapper; +import org.apache.guacamole.auth.jdbc.user.UserRecordMapper; +import org.apache.guacamole.auth.jdbc.usergroup.ModeledUserGroup; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupDirectory; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupMapper; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupMemberUserGroupMapper; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupMemberUserMapper; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupParentUserGroupMapper; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupService; +import org.mybatis.guice.MyBatisModule; +import org.apache.guacamole.auth.jdbc.user.UserParentUserGroupMapper; + +/** + * Guice module which configures the injections used by the JDBC authentication + * provider base. This module MUST be included in the Guice injector, or + * authentication providers based on JDBC will not function. + */ +public class JDBCAuthenticationProviderModule extends MyBatisModule { + + /** + * The environment of the Guacamole server. + */ + private final JDBCEnvironment environment; + + /** + * Creates a new JDBC authentication provider module that configures the + * various injected base classes using the given environment, and provides + * connections using the given socket service. + * + * @param environment + * The environment to use to configure injected classes. + */ + public JDBCAuthenticationProviderModule(JDBCEnvironment environment) { + this.environment = environment; + } + + @Override + protected void initialize() { + + // Datasource + bind(DataSource.class).to(DynamicallyAuthenticatedDataSource.class); + + // Transaction factory + bindTransactionFactoryType(JdbcTransactionFactory.class); + + // Set the JDBC Auth provider to use batch execution if enabled + if (environment.shouldUseBatchExecutor()) + bindConfigurationSetting(configuration -> { + configuration.setDefaultExecutorType(ExecutorType.BATCH); + }); + + // Add MyBatis mappers + addMapperClass(ConnectionMapper.class); + addMapperClass(ConnectionGroupMapper.class); + addMapperClass(ConnectionGroupPermissionMapper.class); + addMapperClass(ConnectionPermissionMapper.class); + addMapperClass(ConnectionRecordMapper.class); + addMapperClass(ConnectionParameterMapper.class); + addMapperClass(EntityMapper.class); + addMapperClass(PasswordRecordMapper.class); + addMapperClass(SystemPermissionMapper.class); + addMapperClass(SharingProfileMapper.class); + addMapperClass(SharingProfileParameterMapper.class); + addMapperClass(SharingProfilePermissionMapper.class); + addMapperClass(UserGroupMapper.class); + addMapperClass(UserGroupMemberUserGroupMapper.class); + addMapperClass(UserGroupMemberUserMapper.class); + addMapperClass(UserGroupParentUserGroupMapper.class); + addMapperClass(UserGroupPermissionMapper.class); + addMapperClass(UserMapper.class); + addMapperClass(UserParentUserGroupMapper.class); + addMapperClass(UserPermissionMapper.class); + addMapperClass(UserRecordMapper.class); + + // Bind core implementations of guacamole-ext classes + bind(ActiveConnectionDirectory.class); + bind(ActiveConnectionPermissionSet.class); + bind(JDBCEnvironment.class).toInstance(environment); + bind(ConnectionDirectory.class); + bind(ConnectionGroupDirectory.class); + bind(ConnectionGroupPermissionSet.class); + bind(ConnectionPermissionSet.class); + bind(ModeledConnection.class); + bind(ModeledConnectionGroup.class); + bind(ModeledGuacamoleConfiguration.class); + bind(ModeledSharingProfile.class); + bind(ModeledUser.class); + bind(ModeledUserContext.class); + bind(ModeledUserGroup.class); + bind(RootConnectionGroup.class); + bind(SharingProfileDirectory.class); + bind(SharingProfilePermissionSet.class); + bind(SystemPermissionSet.class); + bind(TrackedActiveConnection.class); + bind(UserDirectory.class); + bind(UserGroupDirectory.class); + bind(UserGroupPermissionSet.class); + bind(UserPermissionSet.class); + + // Bind services + bind(ActiveConnectionService.class); + bind(ActiveConnectionPermissionService.class); + bind(ConnectionGroupPermissionService.class); + bind(ConnectionGroupService.class); + bind(ConnectionPermissionService.class); + bind(ConnectionSharingService.class); + bind(ConnectionService.class); + bind(EntityService.class); + bind(GuacamoleTunnelService.class).to(RestrictedGuacamoleTunnelService.class); + bind(PasswordEncryptionService.class).to(SHA256PasswordEncryptionService.class); + bind(PasswordPolicyService.class); + bind(SaltService.class).to(SecureRandomSaltService.class); + bind(SharedConnectionMap.class).to(HashSharedConnectionMap.class).in(Scopes.SINGLETON); + bind(ShareKeyGenerator.class).to(SecureRandomShareKeyGenerator.class).in(Scopes.SINGLETON); + bind(SharingProfilePermissionService.class); + bind(SharingProfileService.class); + bind(SystemPermissionService.class); + bind(UserGroupService.class); + bind(UserGroupPermissionService.class); + bind(UserPermissionService.class); + bind(UserService.class); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java new file mode 100644 index 0000000..2b130b6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicyService; +import org.apache.guacamole.auth.jdbc.sharing.user.SharedAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.user.ModeledUser; +import org.apache.guacamole.auth.jdbc.user.ModeledUserContext; +import org.apache.guacamole.auth.jdbc.user.PrivilegedModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.user.UserService; +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * AuthenticationProviderService implementation which authenticates users with + * a username/password pair, producing new UserContext objects which are backed + * by an underlying, arbitrary database. + */ +public class JDBCAuthenticationProviderService implements AuthenticationProviderService { + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Service for accessing users. + */ + @Inject + private UserService userService; + + /** + * Service for enforcing password complexity policies. + */ + @Inject + private PasswordPolicyService passwordPolicyService; + + /** + * Provider for retrieving UserContext instances. + */ + @Inject + private Provider userContextProvider; + + /** + * Mapper for writing connection history. + */ + @Inject + private ConnectionRecordMapper connectionRecordMapper; + + @Override + public AuthenticatedUser authenticateUser(AuthenticationProvider authenticationProvider, + Credentials credentials) throws GuacamoleException { + + // Authenticate user + AuthenticatedUser user = userService.retrieveAuthenticatedUser(authenticationProvider, credentials); + if (user != null) + return user; + + // Otherwise, unauthorized + throw new GuacamoleInvalidCredentialsException("Invalid login", CredentialsInfo.USERNAME_PASSWORD); + + } + + @Override + public ModeledUserContext getUserContext(AuthenticationProvider authenticationProvider, + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Always allow but provide no data for users authenticated via our own + // connection sharing links + if (authenticatedUser instanceof SharedAuthenticatedUser) + return null; + + // Set semantic flags based on context + boolean databaseCredentialsUsed = (authenticatedUser instanceof ModeledAuthenticatedUser); + boolean databaseRestrictionsApplicable = (databaseCredentialsUsed || environment.isUserRequired()); + + // Retrieve user account for already-authenticated user + ModeledUser user = userService.retrieveUser(authenticationProvider, authenticatedUser); + ModeledUserContext context = userContextProvider.get(); + if (user != null && !user.isDisabled()) { + + // Enforce applicable account restrictions + if (databaseRestrictionsApplicable) { + + // Verify user account is still valid as of today + if (!user.isAccountValid()) + throw new TranslatableGuacamoleClientException("User " + + "account is no longer valid.", + "LOGIN.ERROR_NOT_VALID"); + + // Verify user account is allowed to be used at the current time + if (!user.isAccountAccessible()) + throw new TranslatableGuacamoleClientException("User " + + "account may not be used at this time.", + "LOGIN.ERROR_NOT_ACCESSIBLE"); + + } + + // Update password if password is expired AND the password was + // actually involved in the authentication process + if (databaseCredentialsUsed) { + if (user.isExpired() || passwordPolicyService.isPasswordExpired(user)) + userService.resetExpiredPassword(user, authenticatedUser.getCredentials()); + } + + } + + // If no user account is found, and database-specific account + // restrictions do not apply, get a skeleton user. + else if (!databaseRestrictionsApplicable) { + user = userService.retrieveSkeletonUser(authenticationProvider, authenticatedUser); + + // If auto account creation is enabled, add user to DB. + if (environment.autoCreateAbsentAccounts()) { + ModeledUser createdUser = userService.createObject(new PrivilegedModeledAuthenticatedUser(user.getCurrentUser()), user); + user.setModel(createdUser.getModel()); + } + + } + + // Veto authentication result only if database-specific account + // restrictions apply in this situation + else + throw new GuacamoleInvalidCredentialsException("Invalid login", + CredentialsInfo.USERNAME_PASSWORD); + + // Initialize the UserContext with the user account and return it. + context.init(user.getCurrentUser()); + context.recordUserLogin(); + return context; + + } + + @Override + public UserContext updateUserContext(AuthenticationProvider authenticationProvider, + UserContext context, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // Refresh the user context + return getUserContext(authenticationProvider, authenticatedUser); + + } + + @Override + public UserContext decorateUserContext(AuthenticationProvider authenticationProvider, + UserContext context, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // Track connection history only for external connections, and only if enabled in the config + if (environment.trackExternalConnectionHistory() && context.getAuthenticationProvider() != authenticationProvider) { + return new HistoryTrackingUserContext(context, credentials.getRemoteHostname(), connectionRecordMapper); + } + + return context; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCEnvironment.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCEnvironment.java new file mode 100644 index 0000000..27f3d05 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCEnvironment.java @@ -0,0 +1,275 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.guacamole.environment.DelegatingEnvironment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.ibatis.session.SqlSession; + +/** + * A JDBC-specific implementation of Environment that defines generic properties + * intended for use within JDBC based authentication providers. + */ +public abstract class JDBCEnvironment extends DelegatingEnvironment { + + /** + * Constructs a new JDBCEnvironment using an underlying LocalEnviroment to + * read properties from the file system. + */ + public JDBCEnvironment() { + super(LocalEnvironment.getInstance()); + } + + /** + * Returns whether a database user account is required for authentication to + * succeed, even if another authentication provider has already + * authenticated the user. + * + * @return + * true if database user accounts are required for absolutely all + * authentication attempts, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract boolean isUserRequired() throws GuacamoleException; + + /** + * Returns the maximum number of concurrent connections to allow overall. + * As this limit applies globally (independent of which connection is in + * use or which user is using it), this setting cannot be overridden at the + * connection level. Zero denotes unlimited. + * + * @return + * The maximum allowable number of concurrent connections. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract int getAbsoluteMaxConnections() throws GuacamoleException; + + /** + * Returns the maximum number of identifiers/parameters to be + * included in a single batch when executing SQL statements. + * + * @return + * The maximum number of identifiers/parameters to be included + * in a single batch. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract int getBatchSize() throws GuacamoleException; + + /** + * Returns the default maximum number of concurrent connections to allow to + * any one connection, unless specified differently on an individual + * connection. Zero denotes unlimited. + * + * @return + * The default maximum allowable number of concurrent connections + * to any connection. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract int getDefaultMaxConnections() throws GuacamoleException; + + /** + * Returns the default maximum number of concurrent connections to allow to + * any one connection group, unless specified differently on an individual + * connection group. Zero denotes unlimited. + * + * @return + * The default maximum allowable number of concurrent connections + * to any connection group. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract int getDefaultMaxGroupConnections() + throws GuacamoleException; + + /** + * Returns the default maximum number of concurrent connections to allow to + * any one connection by an individual user, unless specified differently on + * an individual connection. Zero denotes unlimited. + * + * @return + * The default maximum allowable number of concurrent connections to + * any connection by an individual user. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract int getDefaultMaxConnectionsPerUser() + throws GuacamoleException; + + /** + * Returns the default maximum number of concurrent connections to allow to + * any one connection group by an individual user, unless specified + * differently on an individual connection group. Zero denotes unlimited. + * + * @return + * The default maximum allowable number of concurrent connections to + * any connection group by an individual user. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property. + */ + public abstract int getDefaultMaxGroupConnectionsPerUser() + throws GuacamoleException; + + /** + * Returns the policy which applies to newly-set passwords. Passwords which + * apply to Guacamole user accounts will be required to conform to this + * policy. + * + * @return + * The password policy which applies to Guacamole user accounts. + */ + public abstract PasswordPolicy getPasswordPolicy(); + + /** + * Returns whether the database supports recursive queries. Many database + * engines support recursive queries through CTEs. If recursive queries are + * not supported, queries that are intended to be recursive may need to be + * invoked multiple times to retrieve the same data. + * + * @param session + * The SqlSession provided by MyBatis for the current transaction. + * + * @return + * true if the database supports recursive queries, false otherwise. + */ + public abstract boolean isRecursiveQuerySupported(SqlSession session); + + /** + * Returns a boolean value representing whether or not the JDBC module + * should automatically create accounts within the database for users that + * are successfully authenticated via other extensions. Returns true if + * accounts should be auto-created, otherwise returns false. + * + * @return + * true if user accounts should be automatically created within the + * database when authentication succeeds from another extension; + * otherwise false. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public abstract boolean autoCreateAbsentAccounts() throws GuacamoleException; + + /** + * Returns the username that should be used when authenticating with the + * database containing the Guacamole authentication tables. + * + * @return + * The username for the database. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public abstract String getUsername() throws GuacamoleException; + + /** + * Returns the password that should be used authenticating with the + * database containing the Guacamole authentication tables. + * + * @return + * The password for the database. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public abstract String getPassword() throws GuacamoleException; + + /** + * Returns whether the given Java class is defined within the classpath. + * + * @param classname + * The name of the Java class to check. + * + * @return + * true if the given Java class is present within the classpath, false + * otherwise. + */ + public static boolean isClassDefined(String classname) { + try { + Class.forName(classname, false, JDBCEnvironment.class.getClassLoader()); + return true; + } + catch (ClassNotFoundException e) { + return false; + } + } + + /** + * Returns a boolean value representing whether or not the JDBC module + * should automatically track connection history for external connections, + * i.e. connections not originated from within the JDBC auth provider + * itself. + * + * @return + * true if connection history should be tracked for connections that + * do not originate from within this JDBC auth provider, false otherwise. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public abstract boolean trackExternalConnectionHistory() throws GuacamoleException; + + /** + * Returns a boolean value representing whether access time windows should + * be enforced for active connections - i.e. whether a currently-connected + * user should be disconnected upon the closure of an access window. + * + * @return + * true if a connected user should be disconnected upon an access time + * window closing, false otherwise. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public abstract boolean enforceAccessWindowsForActiveSessions() throws GuacamoleException; + + /** + * Returns true if the JDBC batch executor should be used by default, false + * otherwise. The batch executor allows repeated updates to be batched + * together for improved performance. + * See https://mybatis.org/mybatis-3/java-api.html#sqlSessions + * + * @return + * true if the batch executor should be used by default, false otherwise. + */ + public boolean shouldUseBatchExecutor() { + + // Unless otherwise overwritten due to implementation-specific problems, + // all JDBC extensions should use the batch executor if possible to + // ensure the best performance for repetitive queries + return true; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java new file mode 100644 index 0000000..ea005b3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc; + +import com.google.inject.Injector; +import java.util.concurrent.atomic.AtomicReference; +import org.apache.guacamole.GuacamoleException; + +/** + * A caching provider of singleton Guice Injector instances. The first call to + * get() will return a new instance of the Guice Injector, while all subsequent + * calls will return that same instance. It is up to implementations of this + * class to define how the Guice Injector will be created through defining the + * create() function. + * + * IMPORTANT: Because the Injector returned by get() is cached statically, only + * ONE implementation of this class may be used within any individual + * classloader. Within the context of the JDBC extension, as long as each built + * extension only provides one subclass of this class, things should work + * properly, as each extension is given its own classloader by Guacamole. + */ +public abstract class JDBCInjectorProvider { + + /** + * An AtomicReference wrapping the cached Guice Injector. If the Injector + * has not yet been created, null will be wrapped instead. + */ + private static final AtomicReference injector = new AtomicReference(null); + + /** + * Creates a new instance of the Guice Injector which should be used + * across the entire JDBC authentication extension. This function will + * generally only be called once, but multiple invocations are possible if + * get() is invoked several times concurrently prior to the Injector being + * cached. + * + * @return + * @throws GuacamoleException + */ + protected abstract Injector create() throws GuacamoleException; + + /** + * Returns a common, singleton instance of a Guice Injector, configured for + * the injections required by the JDBC authentication extension. The result + * of the first call to this function will be cached statically within this + * class, and will be returned for all subsequent calls. + * + * @return + * A singleton instance of the Guice Injector used across the entire + * JDBC authentication extension. + * + * @throws GuacamoleException + * If the Injector cannot be created due to an error. + */ + public Injector get() throws GuacamoleException { + + // Return existing Injector if already created + Injector value = injector.get(); + if (value != null) + return value; + + // Explicitly create and store new Injector only if necessary + injector.compareAndSet(null, create()); + + // Consistently return the same Injector, even if two create operations + // happen concurrently + return injector.get(); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionDirectory.java new file mode 100644 index 0000000..28510b7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionDirectory.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.activeconnection; + + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.JDBCDirectory; +import org.apache.guacamole.net.auth.ActiveConnection; + +/** + * Implementation of a Directory which contains all currently-active + * connections. + */ +public class ActiveConnectionDirectory extends JDBCDirectory { + + /** + * Service for retrieving and manipulating active connections. + */ + @Inject + private ActiveConnectionService activeConnectionService; + + @Override + public ActiveConnection get(String identifier) throws GuacamoleException { + return activeConnectionService.retrieveObject(getCurrentUser(), identifier); + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + Collection objects = activeConnectionService.retrieveObjects(getCurrentUser(), identifiers); + return Collections.unmodifiableCollection(objects); + } + + @Override + public Set getIdentifiers() throws GuacamoleException { + return activeConnectionService.getIdentifiers(getCurrentUser()); + } + + @Override + public void add(ActiveConnection object) throws GuacamoleException { + activeConnectionService.createObject(getCurrentUser(), object); + } + + @Override + public void update(ActiveConnection object) throws GuacamoleException { + TrackedActiveConnection connection = (TrackedActiveConnection) object; + activeConnectionService.updateObject(getCurrentUser(), connection); + } + + @Override + public void remove(String identifier) throws GuacamoleException { + activeConnectionService.deleteObject(getCurrentUser(), identifier); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java new file mode 100644 index 0000000..2a4cd9e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.activeconnection; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.auth.jdbc.permission.AbstractPermissionService; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionService; +import org.apache.guacamole.auth.jdbc.tunnel.ActiveConnectionRecord; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating active connections. + */ +public class ActiveConnectionPermissionService + extends AbstractPermissionService + implements ObjectPermissionService { + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * Provider for active connection permission sets. + */ + @Inject + private Provider activeConnectionPermissionSetProvider; + + @Override + public boolean hasPermission(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + ObjectPermission.Type type, String identifier, + Set effectiveGroups) throws GuacamoleException { + + // Retrieve permissions + Set permissions = retrievePermissions(user, + targetEntity, effectiveGroups); + + // Permission is granted if retrieved permissions contains the + // requested permission + ObjectPermission permission = new ObjectPermission(type, identifier); + return permissions.contains(permission); + + } + + @Override + public Set retrievePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Retrieve permissions only if allowed + if (canReadPermissions(user, targetEntity)) { + + // Privileged accounts (such as administrators or UserContexts + // returned by getPrivileged()) may always access active connections + boolean isPrivileged = targetEntity.isPrivileged(); + + // Get all active connections + Collection records = tunnelService.getActiveConnections(user); + + // We have READ, and possibly DELETE, on all active connections + Set permissions = new HashSet<>(); + for (ActiveConnectionRecord record : records) { + + // Add implicit READ + String identifier = record.getUUID().toString(); + permissions.add(new ObjectPermission(ObjectPermission.Type.READ, identifier)); + + // If the target user is privileged, or the connection belongs + // to the target user, then they can DELETE + if (isPrivileged || targetEntity.isUser(record.getUsername())) + permissions.add(new ObjectPermission(ObjectPermission.Type.DELETE, identifier)); + + } + + return permissions; + + } + + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public Collection retrieveAccessibleIdentifiers(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissionTypes, + Collection identifiers, Set effectiveGroups) + throws GuacamoleException { + + Set permissions = retrievePermissions(user, targetEntity, effectiveGroups); + Collection accessibleObjects = new ArrayList(permissions.size()); + + // For each identifier/permission combination + for (String identifier : identifiers) { + for (ObjectPermission.Type permissionType : permissionTypes) { + + // Add identifier if at least one requested permission is granted + ObjectPermission permission = new ObjectPermission(permissionType, identifier); + if (permissions.contains(permission)) { + accessibleObjects.add(identifier); + break; + } + + } + } + + return accessibleObjects; + + } + + @Override + public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + ActiveConnectionPermissionSet permissionSet = activeConnectionPermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + + @Override + public void createPermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException { + + // Creating active connection permissions is not implemented + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public void deletePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException { + + // Deleting active connection permissions is not implemented + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionSet.java new file mode 100644 index 0000000..5f5b9a4 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionSet.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.activeconnection; + +import com.google.inject.Inject; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionService; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionSet; + +/** + * An implementation of ObjectPermissionSet which uses an injected service to + * query and manipulate the permissions associated with active connections. + */ +public class ActiveConnectionPermissionSet extends ObjectPermissionSet { + + /** + * Service for querying and manipulating active connection permissions. + */ + @Inject + private ActiveConnectionPermissionService activeConnectionPermissionService; + + @Override + protected ObjectPermissionService getObjectPermissionService() { + return activeConnectionPermissionService; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java new file mode 100644 index 0000000..046cee1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java @@ -0,0 +1,219 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.activeconnection; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.base.DirectoryObjectService; +import org.apache.guacamole.auth.jdbc.tunnel.ActiveConnectionRecord; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating active connections. + */ +public class ActiveConnectionService + implements DirectoryObjectService { + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * Provider for active connections. + */ + @Inject + private Provider trackedActiveConnectionProvider; + + @Override + public TrackedActiveConnection retrieveObject(ModeledAuthenticatedUser user, + String identifier) throws GuacamoleException { + + // Pull objects having given identifier + Collection objects = retrieveObjects(user, Collections.singleton(identifier)); + + // If no such object, return null + if (objects.isEmpty()) + return null; + + // The object collection will have exactly one element unless the + // database has seriously lost integrity + assert(objects.size() == 1); + + // Return first and only object + return objects.iterator().next(); + + } + + @Override + public Collection retrieveObjects(ModeledAuthenticatedUser user, + Collection identifiers) throws GuacamoleException { + + String username = user.getIdentifier(); + boolean isPrivileged = user.isPrivileged(); + Set identifierSet = new HashSet(identifiers); + + // Retrieve all visible connections (permissions enforced by tunnel service) + Collection records = tunnelService.getActiveConnections(user); + + // Restrict to subset of records which match given identifiers + Collection activeConnections = new ArrayList(identifiers.size()); + for (ActiveConnectionRecord record : records) { + + // The current user should have access to sensitive information and + // be able to connect to (join) the active connection if they are + // the user that started the connection OR the user is an admin + boolean hasPrivilegedAccess = + isPrivileged || username.equals(record.getUsername()); + + // Add connection if within requested identifiers + if (identifierSet.contains(record.getUUID().toString())) { + TrackedActiveConnection activeConnection = trackedActiveConnectionProvider.get(); + activeConnection.init(user, record, hasPrivilegedAccess, hasPrivilegedAccess); + activeConnections.add(activeConnection); + } + + } + + return activeConnections; + + } + + @Override + public void deleteObject(ModeledAuthenticatedUser user, String identifier) + throws GuacamoleException { + + // Close connection, if it exists and we have permission + ActiveConnection activeConnection = retrieveObject(user, identifier); + if (activeConnection == null) + return; + + if (hasObjectPermissions(user, identifier, ObjectPermission.Type.DELETE)) { + + // Close connection if not already closed + GuacamoleTunnel tunnel = activeConnection.getTunnel(); + if (tunnel != null && tunnel.isOpen()) + tunnel.close(); + + } + else + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public Set getIdentifiers(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Retrieve all visible connections (permissions enforced by tunnel service) + Collection records = tunnelService.getActiveConnections(user); + + // Build list of identifiers + Set identifiers = new HashSet(records.size()); + for (ActiveConnectionRecord record : records) + identifiers.add(record.getUUID().toString()); + + return identifiers; + + } + + @Override + public TrackedActiveConnection createObject(ModeledAuthenticatedUser user, + ActiveConnection object) throws GuacamoleException { + + // Updating active connections is not implemented + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public void updateObject(ModeledAuthenticatedUser user, TrackedActiveConnection object) + throws GuacamoleException { + + // Updating active connections is not implemented + throw new GuacamoleSecurityException("Permission denied."); + + } + + /** + * Retrieve the permission set for the specified user that relates + * to access to active connections. + * + * @param user + * The user for which to retrieve the permission set. + * + * @return + * A permission set associated with the given user that specifies + * the permissions available for active connection objects. + * + * @throws GuacamoleException + * If permission to read permissions for the user is denied. + */ + private ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + return user.getUser().getActiveConnectionPermissions(); + } + + /** + * Return a boolean value representing whether or not a user has the given + * permission available to them on the active connection with the given + * identifier. + * + * @param user + * The user for which the permissions are being queried. + * + * @param identifier + * The identifier of the active connection we are wondering about. + * + * @param type + * The type of permission being requested. + * + * @return + * True if the user has the necessary permission; otherwise false. + * + * @throws GuacamoleException + * If the user does not have access to read permissions. + */ + private boolean hasObjectPermissions(ModeledAuthenticatedUser user, + String identifier, ObjectPermission.Type type) + throws GuacamoleException { + + ObjectPermissionSet permissionSet = getPermissionSet(user); + + return user.isPrivileged() + || permissionSet.hasPermission(type, identifier); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/TrackedActiveConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/TrackedActiveConnection.java new file mode 100644 index 0000000..cdbcc07 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/TrackedActiveConnection.java @@ -0,0 +1,284 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.activeconnection; + +import com.google.inject.Inject; +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.base.RestrictedObject; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.auth.jdbc.sharing.ConnectionSharingService; +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDefinition; +import org.apache.guacamole.auth.jdbc.tunnel.ActiveConnectionRecord; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.credentials.UserCredentials; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * An implementation of the ActiveConnection object which has an associated + * ActiveConnectionRecord. + */ +public class TrackedActiveConnection extends RestrictedObject implements ActiveConnection { + + /** + * Service for managing shared connections. + */ + @Inject + private ConnectionSharingService sharingService; + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * The identifier of this active connection. + */ + private String identifier; + + /** + * The actual connection record from which this ActiveConnection derives its + * data. + */ + private ActiveConnectionRecord connectionRecord; + + /** + * The connection being actively used or shared. + */ + private ModeledConnection connection; + + /** + * The identifier of the associated sharing profile. + */ + private String sharingProfileIdentifier; + + /** + * The date and time this active connection began. + */ + private Date startDate; + + /** + * The remote host that initiated this connection. + */ + private String remoteHost; + + /** + * The username of the user that initiated this connection. + */ + private String username; + + /** + * The underlying GuacamoleTunnel. + */ + private GuacamoleTunnel tunnel; + + /** + * Whether connections to this TrackedActiveConnection are allowed. + */ + private boolean connectable; + + /** + * Initializes this TrackedActiveConnection, copying the data associated + * with the given active connection record. At a minimum, the identifier + * of this active connection will be set, the start date, and the + * identifier of the associated connection will be copied. If requested, + * sensitive information like the associated username will be copied, as + * well. + * + * @param currentUser + * The user that created or retrieved this object. + * + * @param activeConnectionRecord + * The active connection record to copy. + * + * @param includeSensitiveInformation + * Whether sensitive data should be copied from the connection record + * as well. This includes the remote host, associated tunnel, and + * username. + * + * @param connectable + * Whether the user that retrieved this object should be allowed to + * join the active connection. + */ + public void init(ModeledAuthenticatedUser currentUser, + ActiveConnectionRecord activeConnectionRecord, + boolean includeSensitiveInformation, + boolean connectable) { + + super.init(currentUser); + this.connectionRecord = activeConnectionRecord; + this.connectable = connectable; + + // Copy all non-sensitive data from given record + this.connection = activeConnectionRecord.getConnection(); + this.sharingProfileIdentifier = activeConnectionRecord.getSharingProfileIdentifier(); + this.identifier = activeConnectionRecord.getUUID().toString(); + this.startDate = activeConnectionRecord.getStartDate(); + + // Include sensitive data, too, if requested + if (includeSensitiveInformation) { + this.remoteHost = activeConnectionRecord.getRemoteHost(); + this.tunnel = activeConnectionRecord.getTunnel(); + this.username = activeConnectionRecord.getUsername(); + } + + } + + @Override + public String getIdentifier() { + return identifier; + } + + @Override + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + /** + * Returns the connection being actively used. If this active connection is + * not the primary connection, this will be the connection being actively + * shared. + * + * @return + * The connection being actively used. + */ + public ModeledConnection getConnection() { + return connection; + } + + @Override + public String getConnectionIdentifier() { + return connection.getIdentifier(); + } + + @Override + public void setConnectionIdentifier(String connnectionIdentifier) { + throw new UnsupportedOperationException("The connection identifier of " + + "TrackedActiveConnection is inherited from the underlying " + + "connection."); + } + + @Override + public String getSharingProfileIdentifier() { + return sharingProfileIdentifier; + } + + @Override + public void setSharingProfileIdentifier(String sharingProfileIdentifier) { + this.sharingProfileIdentifier = sharingProfileIdentifier; + } + + /** + * Shares this active connection with the user that retrieved it, returning + * a SharedConnectionDefinition that can be used to establish a tunnel to + * the shared connection. If provided, access within the shared connection + * will be restricted by the sharing profile with the given identifier. + * + * @param identifier + * The identifier of the sharing profile that defines the restrictions + * applying to the shared connection, or null if no such restrictions + * apply. + * + * @return + * A new SharedConnectionDefinition which can be used to establish a + * tunnel to the shared connection. + * + * @throws GuacamoleException + * If permission to share this active connection is denied. + */ + private SharedConnectionDefinition share(String identifier) throws GuacamoleException { + return sharingService.shareConnection(getCurrentUser(), connectionRecord, identifier); + } + + @Override + public UserCredentials getSharingCredentials(String identifier) + throws GuacamoleException { + return sharingService.getSharingCredentials(share(identifier)); + } + + @Override + public Date getStartDate() { + return startDate; + } + + @Override + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + @Override + public String getRemoteHost() { + return remoteHost; + } + + @Override + public void setRemoteHost(String remoteHost) { + this.remoteHost = remoteHost; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public void setUsername(String username) { + this.username = username; + } + + @Override + public GuacamoleTunnel getTunnel() { + return tunnel; + } + + @Override + public void setTunnel(GuacamoleTunnel tunnel) { + this.tunnel = tunnel; + } + + @Override + public boolean isConnectable() { + return connectable; + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Establish connection only if connecting is allowed + if (isConnectable()) + return tunnelService.getGuacamoleTunnel(getCurrentUser(), share(null), info, tokens); + + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public int getActiveConnections() { + return 0; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/package-info.java new file mode 100644 index 0000000..098b34e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to currently-active connections. + */ +package org.apache.guacamole.auth.jdbc.activeconnection; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordMapper.java new file mode 100644 index 0000000..a860949 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordMapper.java @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; +import java.util.List; +import org.apache.guacamole.auth.jdbc.user.UserModel; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Common interface for mapping activity records. + * + * @param + * The type of model object representing the activity records mapped by + * this mapper. + */ +public interface ActivityRecordMapper { + + /** + * Inserts the given activity record. + * + * @param record + * The activity record to insert. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("record") ModelType record, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Updates the given activity record in the database, assigning an end + * date. No column of the existing activity record is updated except for + * the end date. If the record does not actually exist, this operation has + * no effect. + * + * @param record + * The activity record to update. + * + * @return + * The number of rows updated. + */ + int updateEndDate(@Param("record") ModelType record); + + /** + * Searches for up to limit activity records that contain + * the given terms, sorted by the given predicates, regardless of whether + * the data they are associated with is readable by any particular user. + * This should only be called on behalf of a system administrator. If + * records are needed by a non-administrative user who must have explicit + * read rights, use {@link searchReadable()} instead. + * + * @param identifier + * The optional identifier of the object whose history is being + * retrieved, or null if records related to any such object should be + * retrieved. + * + * @param recordIdentifier + * The identifier of the specific history record to retrieve, if not + * all matching records. Search terms, etc. will still be applied to + * the single record. + * + * @param terms + * The search terms that must match the returned records. + * + * @param sortPredicates + * A list of predicates to sort the returned records by, in order of + * priority. + * + * @param limit + * The maximum number of records that should be returned. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * The results of the search performed with the given parameters. + */ + List search(@Param("identifier") String identifier, + @Param("recordIdentifier") String recordIdentifier, + @Param("terms") Collection terms, + @Param("sortPredicates") List sortPredicates, + @Param("limit") int limit, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Searches for up to limit activity records that contain + * the given terms, sorted by the given predicates. Only records that are + * associated with data explicitly readable by the given user will be + * returned. If records are needed by a system administrator (who, by + * definition, does not need explicit read rights), use {@link search()} + * instead. + * + * @param identifier + * The optional identifier of the object whose history is being + * retrieved, or null if records related to any such object should be + * retrieved. + * + * @param user + * The user whose permissions should determine whether a record is + * returned. + * + * @param recordIdentifier + * The identifier of the specific history record to retrieve, if not + * all matching records. Search terms, etc. will still be applied to + * the single record. + * + * @param terms + * The search terms that must match the returned records. + * + * @param sortPredicates + * A list of predicates to sort the returned records by, in order of + * priority. + * + * @param limit + * The maximum number of records that should be returned. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * The results of the search performed with the given parameters. + */ + List searchReadable(@Param("identifier") String identifier, + @Param("user") UserModel user, + @Param("recordIdentifier") String recordIdentifier, + @Param("terms") Collection terms, + @Param("sortPredicates") List sortPredicates, + @Param("limit") int limit, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java new file mode 100644 index 0000000..fbf6209 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Date; + +/** + * A single activity record representing an arbitrary activity performed by a + * user. + */ +public class ActivityRecordModel { + + /** + * The ID of this object in the database, if any. + */ + private Integer recordID; + + /** + * The database ID of the user associated with this activity record. + */ + private Integer userID; + + /** + * The username of the user that performed the activity. + */ + private String username; + + /** + * The remote host associated with the user that performed the activity. + */ + private String remoteHost; + + /** + * The time the activity was initiated by the associated user. + */ + private Date startDate; + + /** + * The time the activity ended, or null if the end time is not known or + * the activity is still in progress. + */ + private Date endDate; + + /** + * Returns the ID of this record in the database, if it exists. + * + * @return + * The ID of this record in the database, or null if this record was + * not retrieved from the database. + */ + public Integer getRecordID() { + return recordID; + } + + /** + * Sets the database ID of this record to the given value. + * + * @param recordID + * The ID to assign to this object. + */ + public void setRecordID(Integer recordID) { + this.recordID = recordID; + } + + /** + * Returns the database ID of the user associated with this activity + * record. + * + * @return + * The database ID of the user associated with this activity record. + */ + public Integer getUserID() { + return userID; + } + + /** + * Sets the database ID of the user associated with this activity record. + * + * @param userID + * The database ID of the user to associate with this activity + * record. + */ + public void setUserID(Integer userID) { + this.userID = userID; + } + + /** + * Returns the username of the user that performed the activity associated + * with this record. + * + * @return + * The username of the user that performed the activity associated with + * this record. + */ + public String getUsername() { + return username; + } + + /** + * Sets the username of the user that performed the activity associated + * with this record. + * + * @param username + * The username of the user that performed the activity associated with + * this record. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Returns the remote host associated with the user that performed the + * activity. + * + * @return + * The remote host associated with the user that performed the activity. + */ + public String getRemoteHost() { + return remoteHost; + } + + /** + * Sets the remote host associated with the user that performed the + * activity. + * + * @param remoteHost + * The remote host associated with the user that performed the activity. + */ + public void setRemoteHost(String remoteHost) { + this.remoteHost = remoteHost; + } + + /** + * Returns the time the activity was initiated by the associated user. + * + * @return + * The time the activity was initiated by the associated user. + */ + public Date getStartDate() { + return startDate; + } + + /** + * Sets the time the activity was initiated by the associated user. + * + * @param startDate + * The time the activity was initiated by the associated user. + */ + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + /** + * Returns the time the activity ended, or null if the end time is not + * known or the activity is still in progress. + * + * @return + * The time the activity ended, or null if the end time is not known or + * the activity is still in progress. + */ + public Date getEndDate() { + return endDate; + } + + /** + * Sets the time the activity ended, if known. + * + * @param endDate + * The time the activity ended, or null if the end time is not known or + * the activity is still in progress. + */ + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordSearchTerm.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordSearchTerm.java new file mode 100644 index 0000000..54af1a6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordSearchTerm.java @@ -0,0 +1,291 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Calendar; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A search term for querying historical records of arbitrary activities. This + * will contain a the search term in string form and, if that string appears to + * be a date. a corresponding date range. + */ +public class ActivityRecordSearchTerm { + + /** + * A pattern that can match a year, year and month, or year and month and + * day. + */ + private static final Pattern DATE_PATTERN = + Pattern.compile("(\\d+)(?:-(\\d+)?(?:-(\\d+)?)?)?"); + + /** + * The index of the group within DATE_PATTERN containing the + * year number. + */ + private static final int YEAR_GROUP = 1; + + /** + * The index of the group within DATE_PATTERN containing the + * month number, if any. + */ + private static final int MONTH_GROUP = 2; + + /** + * The index of the group within DATE_PATTERN containing the + * day number, if any. + */ + private static final int DAY_GROUP = 3; + + /** + * The start of the date range for records that should be retrieved, if the + * provided search term appears to be a date. + */ + private final Date startDate; + + /** + * The end of the date range for records that should be retrieved, if the + * provided search term appears to be a date. + */ + private final Date endDate; + + /** + * The string that should be searched for. + */ + private final String term; + + /** + * Parse the given string as an integer, returning the provided default + * value if the string is null. + * + * @param str + * The string to parse as an integer. + * + * @param defaultValue + * The value to return if str is null. + * + * @return + * The parsed value, or the provided default value if str + * is null. + */ + private static int parseInt(String str, int defaultValue) { + + if (str == null) + return defaultValue; + + return Integer.parseInt(str); + + } + + /** + * Returns a new calendar representing the last millisecond of the same + * year as calendar. + * + * @param calendar + * The calendar defining the year whose end (last millisecond) is to be + * returned. + * + * @return + * A new calendar representing the last millisecond of the same year as + * calendar. + */ + private static Calendar getEndOfYear(Calendar calendar) { + + // Get first day of next year + Calendar endOfYear = Calendar.getInstance(); + endOfYear.clear(); + endOfYear.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1); + + // Transform into the last millisecond of the given year + endOfYear.add(Calendar.MILLISECOND, -1); + + return endOfYear; + + } + + /** + * Returns a new calendar representing the last millisecond of the same + * month and year as calendar. + * + * @param calendar + * The calendar defining the month and year whose end (last millisecond) + * is to be returned. + * + * @return + * A new calendar representing the last millisecond of the same month + * and year as calendar. + */ + private static Calendar getEndOfMonth(Calendar calendar) { + + // Copy given calender only up to given month + Calendar endOfMonth = Calendar.getInstance(); + endOfMonth.clear(); + endOfMonth.set(Calendar.YEAR, calendar.get(Calendar.YEAR)); + endOfMonth.set(Calendar.MONTH, calendar.get(Calendar.MONTH)); + + // Advance to the last millisecond of the given month + endOfMonth.add(Calendar.MONTH, 1); + endOfMonth.add(Calendar.MILLISECOND, -1); + + return endOfMonth; + + } + + /** + * Returns a new calendar representing the last millisecond of the same + * year, month, and day as calendar. + * + * @param calendar + * The calendar defining the year, month, and day whose end + * (last millisecond) is to be returned. + * + * @return + * A new calendar representing the last millisecond of the same year, + * month, and day as calendar. + */ + private static Calendar getEndOfDay(Calendar calendar) { + + // Copy given calender only up to given month + Calendar endOfMonth = Calendar.getInstance(); + endOfMonth.clear(); + endOfMonth.set(Calendar.YEAR, calendar.get(Calendar.YEAR)); + endOfMonth.set(Calendar.MONTH, calendar.get(Calendar.MONTH)); + endOfMonth.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)); + + // Advance to the last millisecond of the given day + endOfMonth.add(Calendar.DAY_OF_MONTH, 1); + endOfMonth.add(Calendar.MILLISECOND, -1); + + return endOfMonth; + + } + + /** + * Creates a new ActivityRecordSearchTerm representing the given string. + * If the given string appears to be a date, the start and end dates of the + * implied date range will be automatically determined and made available + * via getStartDate() and getEndDate() respectively. + * + * @param term + * The string that should be searched for. + */ + public ActivityRecordSearchTerm(String term) { + + // Search terms absolutely must not be null + if (term == null) + throw new NullPointerException("Search terms may not be null"); + + this.term = term; + + // Parse start/end of date range if term appears to be a date + Matcher matcher = DATE_PATTERN.matcher(term); + if (matcher.matches()) { + + // Retrieve date components from term + String year = matcher.group(YEAR_GROUP); + String month = matcher.group(MONTH_GROUP); + String day = matcher.group(DAY_GROUP); + + // Parse start date from term + Calendar startCalendar = Calendar.getInstance(); + startCalendar.clear(); + startCalendar.set( + Integer.parseInt(year), + parseInt(month, 1) - 1, + parseInt(day, 1) + ); + + Calendar endCalendar; + + // Derive end date from start date + if (month == null) { + endCalendar = getEndOfYear(startCalendar); + } + else if (day == null) { + endCalendar = getEndOfMonth(startCalendar); + } + else { + endCalendar = getEndOfDay(startCalendar); + } + + // Convert results back into dates + this.startDate = startCalendar.getTime(); + this.endDate = endCalendar.getTime(); + + } + + // The search term doesn't look like a date + else { + this.startDate = null; + this.endDate = null; + } + + } + + /** + * Returns the start of the date range for records that should be retrieved, + * if the provided search term appears to be a date. + * + * @return + * The start of the date range. + */ + public Date getStartDate() { + return startDate; + } + + /** + * Returns the end of the date range for records that should be retrieved, + * if the provided search term appears to be a date. + * + * @return + * The end of the date range. + */ + public Date getEndDate() { + return endDate; + } + + /** + * Returns the string that should be searched for. + * + * @return + * The search term. + */ + public String getTerm() { + return term; + } + + @Override + public int hashCode() { + return term.hashCode(); + } + + @Override + public boolean equals(Object obj) { + + if (obj == null || !(obj instanceof ActivityRecordSearchTerm)) + return false; + + return ((ActivityRecordSearchTerm) obj).getTerm().equals(getTerm()); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordSortPredicate.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordSortPredicate.java new file mode 100644 index 0000000..ab0d3ce --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordSortPredicate.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import org.apache.guacamole.net.auth.ActivityRecordSet; + +/** + * A sort predicate which species the property to use when sorting activity + * records, along with the sort order. + */ +public class ActivityRecordSortPredicate { + + /** + * The property to use when sorting ActivityRecords. + */ + private final ActivityRecordSet.SortableProperty property; + + /** + * Whether the sort order is descending (true) or ascending (false). + */ + private final boolean descending; + + /** + * Creates a new ActivityRecordSortPredicate with the given sort property + * and sort order. + * + * @param property + * The property to use when sorting ActivityRecords. + * + * @param descending + * Whether the sort order is descending (true) or ascending (false). + */ + public ActivityRecordSortPredicate(ActivityRecordSet.SortableProperty property, + boolean descending) { + this.property = property; + this.descending = descending; + } + + /** + * Returns the property that should be used when sorting ActivityRecords. + * + * @return + * The property that should be used when sorting ActivityRecords. + */ + public ActivityRecordSet.SortableProperty getProperty() { + return property; + } + + /** + * Returns whether the sort order is descending. + * + * @return + * true if the sort order is descending, false if the sort order is + * ascending. + */ + public boolean isDescending() { + return descending; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java new file mode 100644 index 0000000..219abe8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java @@ -0,0 +1,180 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.AbstractCollection; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * Map of arbitrary attribute name/value pairs which can alternatively be + * exposed as a collection of model objects. + */ +public class ArbitraryAttributeMap extends HashMap { + + /** + * Creates a new ArbitraryAttributeMap containing the name/value pairs + * within the given collection of model objects. + * + * @param models + * The model objects of all attributes which should be stored in the + * new map as name/value pairs. + * + * @return + * A new ArbitraryAttributeMap containing the name/value pairs within + * the given collection of model objects. + */ + public static ArbitraryAttributeMap fromModelCollection(Collection models) { + + // Add all name/value pairs from the given collection to the map + ArbitraryAttributeMap map = new ArbitraryAttributeMap(); + for (ArbitraryAttributeModel model : models) + map.put(model.getName(), model.getValue()); + + return map; + + } + + /** + * Returns a collection of model objects which mirrors the contents of this + * ArbitraryAttributeMap. Each name/value pair within the map is reflected + * by a corresponding model object within the returned collection. Removing + * a model object from the collection removes the corresponding name/value + * pair from the map. Adding a new model object to the collection adds a + * corresponding name/value pair to the map. Changes to a model object + * within the collection are NOT reflected on the map, however. + * + * @return + * A collection of model objects which mirrors the contents of this + * ArbitraryAttributeMap. + */ + public Collection toModelCollection() { + return new AbstractCollection() { + + @Override + public void clear() { + ArbitraryAttributeMap.this.clear(); + } + + @Override + public boolean remove(Object o) { + + // The Collection view of an ArbitraryAttributeMap can contain + // only ArbitraryAttributeModel objects + if (!(o instanceof ArbitraryAttributeModel)) + return false; + + // Remove only if key is actually present + ArbitraryAttributeModel model = (ArbitraryAttributeModel) o; + if (!ArbitraryAttributeMap.this.containsKey(model.getName())) + return false; + + // The attribute should be removed only if the value matches + String currentValue = ArbitraryAttributeMap.this.get(model.getName()); + if (currentValue == null) { + if (model.getValue() != null) + return false; + } + else if (!currentValue.equals(model.getValue())) + return false; + + ArbitraryAttributeMap.this.remove(model.getName()); + return true; + + } + + @Override + public boolean add(ArbitraryAttributeModel e) { + + String newValue = e.getValue(); + String oldValue = put(e.getName(), newValue); + + // If null value is being added, collection changed only if + // old value was non-null + if (newValue == null) + return oldValue != null; + + // Collection changed if value changed + return !newValue.equals(oldValue); + + } + + @Override + public boolean contains(Object o) { + + // The Collection view of an ArbitraryAttributeMap can contain + // only ArbitraryAttributeModel objects + if (!(o instanceof ArbitraryAttributeModel)) + return false; + + // No need to check the value of the attribute if the attribute + // is not even present + ArbitraryAttributeModel model = (ArbitraryAttributeModel) o; + String value = get(model.getName()); + if (value == null) + return false; + + // The name/value pair is present only if the value matches + return value.equals(model.getValue()); + + } + + @Override + public Iterator iterator() { + + // Get iterator over all string name/value entries + final Iterator> iterator = entrySet().iterator(); + + // Dynamically translate each string name/value entry into a + // corresponding attribute model object as iteration continues + return new Iterator() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public ArbitraryAttributeModel next() { + Map.Entry entry = iterator.next(); + return new ArbitraryAttributeModel(entry.getKey(), + entry.getValue()); + } + + @Override + public void remove() { + iterator.remove(); + } + + }; + + } + + @Override + public int size() { + return ArbitraryAttributeMap.this.size(); + } + + }; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeModel.java new file mode 100644 index 0000000..b064b54 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeModel.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +/** + * A single attribute name/value pair belonging to a object which implements + * the Attributes interface, such as a Connection or User. Attributes stored + * as raw name/value pairs are the attributes which are given to the database + * authentication extension for storage by other extensions. Attributes which + * are directly supported by the database authentication extension have defined + * columns and properties with proper types, constraints, etc. + */ +public class ArbitraryAttributeModel { + + /** + * The name of the attribute. + */ + private String name; + + /** + * The value the attribute is set to. + */ + private String value; + + /** + * Creates a new ArbitraryAttributeModel with its name and value both set + * to null. + */ + public ArbitraryAttributeModel() { + } + + /** + * Creates a new ArbitraryAttributeModel with its name and value + * initialized to the given values. + * + * @param name + * The name of the attribute. + * + * @param value + * The value the attribute is set to. + */ + public ArbitraryAttributeModel(String name, String value) { + this.name = name; + this.value = value; + } + + /** + * Returns the name of this attribute. + * + * @return + * The name of this attribute. + */ + public String getName() { + return name; + } + + /** + * Sets the name of this attribute. + * + * @param name + * The name of this attribute. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the value of this attribute. + * + * @return + * The value of this attribute. + */ + public String getValue() { + return value; + } + + /** + * Sets the value of this attribute. + * + * @param value + * The value of this attribute. + */ + public void setValue(String value) { + this.value = value; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ChildObjectModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ChildObjectModel.java new file mode 100644 index 0000000..1d18e59 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ChildObjectModel.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +/** + * Object representation of a Guacamole object which can be the child of another + * object, such as a connection or sharing profile, as represented in the + * database. + */ +public abstract class ChildObjectModel extends ObjectModel { + + /** + * The unique identifier which identifies the parent of this object. + */ + private String parentIdentifier; + + /** + * Creates a new, empty object. + */ + public ChildObjectModel() { + } + + /** + * Returns the identifier of the parent connection group, or null if the + * parent connection group is the root connection group. + * + * @return + * The identifier of the parent connection group, or null if the parent + * connection group is the root connection group. + */ + public String getParentIdentifier() { + return parentIdentifier; + } + + /** + * Sets the identifier of the parent connection group. + * + * @param parentIdentifier + * The identifier of the parent connection group, or null if the parent + * connection group is the root connection group. + */ + public void setParentIdentifier(String parentIdentifier) { + this.parentIdentifier = parentIdentifier; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java new file mode 100644 index 0000000..590e01e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating objects that have unique identifiers, such as the objects + * within directories. This service will automatically enforce the permissions + * of the current user. + * + * @param + * The specific internal implementation of the type of object this service + * provides access to. + * + * @param + * The external interface or implementation of the type of object this + * service provides access to, as defined by the guacamole-ext API. + */ +public interface DirectoryObjectService { + + /** + * Retrieves the single object that has the given identifier, if it exists + * and the user has permission to read it. + * + * @param user + * The user retrieving the object. + * + * @param identifier + * The identifier of the object to retrieve. + * + * @return + * The object having the given identifier, or null if no such object + * exists. + * + * @throws GuacamoleException + * If an error occurs while retrieving the requested object. + */ + InternalType retrieveObject(ModeledAuthenticatedUser user, String identifier) + throws GuacamoleException; + + /** + * Retrieves all objects that have the identifiers in the given collection. + * Only objects that the user has permission to read will be returned. + * + * @param user + * The user retrieving the objects. + * + * @param identifiers + * The identifiers of the objects to retrieve. + * + * @return + * The objects having the given identifiers. + * + * @throws GuacamoleException + * If an error occurs while retrieving the requested objects. + */ + Collection retrieveObjects(ModeledAuthenticatedUser user, + Collection identifiers) throws GuacamoleException; + + /** + * Creates the given object. If the object already exists, an error will be + * thrown. + * + * @param user + * The user creating the object. + * + * @param object + * The object to create. + * + * @return + * The newly-created object. + * + * @throws GuacamoleException + * If the user lacks permission to create the object, or an error + * occurs while creating the object. + */ + InternalType createObject(ModeledAuthenticatedUser user, ExternalType object) + throws GuacamoleException; + + /** + * Deletes the object having the given identifier. If no such object + * exists, this function has no effect. + * + * @param user + * The user deleting the object. + * + * @param identifier + * The identifier of the object to delete. + * + * @throws GuacamoleException + * If the user lacks permission to delete the object, or an error + * occurs while deleting the object. + */ + void deleteObject(ModeledAuthenticatedUser user, String identifier) + throws GuacamoleException; + + /** + * Updates the given object, applying any changes that have been made. If + * no such object exists, this function has no effect. + * + * @param user + * The user updating the object. + * + * @param object + * The object to update. + * + * @throws GuacamoleException + * If the user lacks permission to update the object, or an error + * occurs while updating the object. + */ + void updateObject(ModeledAuthenticatedUser user, InternalType object) + throws GuacamoleException; + + /** + * Returns the set of all identifiers for all objects that the user has + * read access to. + * + * @param user + * The user retrieving the identifiers. + * + * @return + * The set of all identifiers for all objects. + * + * @throws GuacamoleException + * If an error occurs while reading identifiers. + */ + Set getIdentifiers(ModeledAuthenticatedUser user) throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityMapper.java new file mode 100644 index 0000000..499171b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityMapper.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for entities. An entity is the base concept behind a user or user + * group, and serves as a common point for granting permissions and defining + * group membership. + */ +public interface EntityMapper { + + /** + * Inserts the given entity into the database. If the entity already + * exists, this will result in an error. + * + * @param entity + * The entity to insert. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("entity") EntityModel entity); + + /** + * Returns the set of all group identifiers of which the given entity is a + * member, taking into account the given collection of known group + * memberships which are not necessarily defined within the database. + * + * NOTE: This query is expected to handle recursion through the membership + * graph on its own. If the database engine does not support recursive + * queries (isRecursiveQuerySupported() of JDBCEnvironment returns false), + * then this query will only return one level of depth past the effective + * groups given and will need to be invoked multiple times. + * + * @param entity + * The entity whose effective groups should be returned. + * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * + * @param recursive + * Whether the query should leverage database engine features to return + * absolutely all effective groups, including those inherited through + * group membership. If false, this query will return only one level of + * depth and may need to be executed multiple times. If it is known + * that the database engine in question will always support (or always + * not support) recursive queries, this parameter may be ignored. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * The set of identifiers of all groups that the given entity is a + * member of, including those where membership is inherited through + * membership in other groups. + */ + Set selectEffectiveGroupIdentifiers(@Param("entity") EntityModel entity, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("recursive") boolean recursive, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityModel.java new file mode 100644 index 0000000..c42db16 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityModel.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +/** + * Base representation of a Guacamole object that can be granted permissions + * (an "entity"), such as a user or user group, as represented in the database. + * Each entity has three base properties: + * + * 1. The "entityID", which points to the common entry in the + * guacamole_entity table and is common to any type of entity. + * + * 2. The "objectID", which points to the type-specific entry for the object + * in question (ie: an entry in guacamole_user or guacamole_user_group). + * + * 3. The "identifier", which contains the unique "name" value defined for + * the entity within the guacamole_entity table. + */ +public abstract class EntityModel extends ObjectModel { + + /** + * The ID of the entity entry which corresponds to this object in the + * database, if any. Note that this is distinct from the objectID, + * inherited from ObjectModel, which is specific to the actual type of + * object represented by the entity. + */ + private Integer entityID; + + /** + * The type of object represented by the entity (user or user group). + */ + private EntityType type; + + /** + * Creates a new, empty entity. + */ + public EntityModel() { + } + + /** + * Creates a new entity of the given type which is otherwise empty. + * + * @param type + * The type to assign to the new entity. + */ + public EntityModel(EntityType type) { + this.type = type; + } + + /** + * Returns the ID of the entity entry which corresponds to this object in + * the database, if it exists. Note that this is distinct from the objectID, + * inherited from ObjectModel, which is specific to the actual type of + * object represented by the entity. + * + * @return + * The ID of this entity in the database, or null if this entity was + * not retrieved from the database. + */ + public Integer getEntityID() { + return entityID; + } + + /** + * Sets the ID of this entity to the given value. + * + * @param entityID + * The ID to assign to this entity. + */ + public void setEntityID(Integer entityID) { + this.entityID = entityID; + } + + /** + * Returns the type of object represented by the entity. Each entity may be + * either a user or a user group. + * + * @return + * The type of object represented by the entity. + */ + public EntityType getEntityType() { + return type; + } + + /** + * Sets the type of object represented by the entity. Each entity may be + * either a user or a user group. + * + * @param type + * The type of object represented by the entity. + */ + public void setEntityType(EntityType type) { + this.type = type; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityService.java new file mode 100644 index 0000000..2dcf54e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityService.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.session.SqlSession; +import org.mybatis.guice.transactional.Transactional; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating entities. + */ +public class EntityService { + + /** + * The Guacamole server environment. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Mapper for Entity model objects. + */ + @Inject + private EntityMapper entityMapper; + + /** + * The current SQL session used by MyBatis. + */ + @Inject + private SqlSession sqlSession; + + /** + * Returns the set of all group identifiers of which the given entity is a + * member, taking into account the given collection of known group + * memberships which are not necessarily defined within the database. + * + * Note that group visibility with respect to the queried entity is NOT + * taken into account. If the entity is a member of a group, the identifier + * of that group will be included in the returned set even if the current + * user lacks "READ" permission for that group. + * + * @param entity + * The entity whose effective groups should be returned. + * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * + * @return + * The set of identifiers of all groups that the given entity is a + * member of, including those where membership is inherited through + * membership in other groups. + */ + @Transactional + public Set retrieveEffectiveGroups(ModeledPermissions entity, + Collection effectiveGroups) { + + CaseSensitivity caseSensitivity = environment.getCaseSensitivity(); + + // Retrieve the effective user groups of the given entity, recursively if possible + boolean recursive = environment.isRecursiveQuerySupported(sqlSession); + Set identifiers = entityMapper.selectEffectiveGroupIdentifiers( + entity.getModel(), effectiveGroups, recursive, caseSensitivity); + + // If the set of user groups retrieved was not produced recursively, + // manually repeat the query to expand the set until all effective + // groups have been found + if (!recursive && !identifiers.isEmpty()) { + Set previousIdentifiers; + do { + previousIdentifiers = identifiers; + identifiers = entityMapper.selectEffectiveGroupIdentifiers( + entity.getModel(), previousIdentifiers, false, + caseSensitivity); + } while (identifiers.size() > previousIdentifiers.size()); + } + + return identifiers; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityType.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityType.java new file mode 100644 index 0000000..9b1f1ed --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/EntityType.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +/** + * The type of object represented by an entity. Each entity may represent + * either a user or a user group. + */ +public enum EntityType { + + /** + * An individual user. + */ + USER, + + /** + * A group of users and/or other groups. + */ + USER_GROUP + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/JDBCDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/JDBCDirectory.java new file mode 100644 index 0000000..3ed6d8a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/JDBCDirectory.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AtomicDirectoryOperation; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; +import org.mybatis.guice.transactional.Transactional; + +/** + * An implementation of Directory that uses database transactions to guarantee + * atomicity for any operations supplied to tryAtomically(). + */ +public abstract class JDBCDirectory + extends RestrictedObject implements Directory { + + @Override + @Transactional + public void tryAtomically(AtomicDirectoryOperation operation) + throws GuacamoleException { + + // Execute the operation atomically - the @Transactional annotation + // specifies that the entire operation will be performed in a transaction + operation.executeOperation(true, this); + + } +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledActivityRecord.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledActivityRecord.java new file mode 100644 index 0000000..5c2c328 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledActivityRecord.java @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.nio.ByteBuffer; +import java.util.Date; +import java.util.UUID; +import org.apache.guacamole.net.auth.ActivityRecord; + +/** + * An ActivityRecord which is backed by a database model. + */ +public class ModeledActivityRecord implements ActivityRecord { + + /** + * The model object backing this activity record. + */ + private final ActivityRecordModel model; + + /** + * The UUID namespace of the type 3 name UUID to generate for the record. + * This namespace should correspond to the source of IDs for the model such + * that the combination of this namespace with the numeric record ID will + * always be unique and deterministic across all activity records, + * regardless of record type. + */ + private final UUID namespace; + + /** + * Creates a new ModeledActivityRecord backed by the given model object. + * Changes to this record will affect the backing model object, and changes + * to the backing model object will affect this record. + * + * @param namespace + * The UUID namespace of the type 3 name UUID to generate for the + * record. This namespace should correspond to the source of IDs for + * the model such that the combination of this namespace with the + * numeric record ID will always be unique and deterministic across all + * activity records, regardless of record type. + * + * @param model + * The model object to use to back this activity record. + */ + public ModeledActivityRecord(UUID namespace, ActivityRecordModel model) { + this.model = model; + this.namespace = namespace; + } + + /** + * Returns the backing model object. Changes to this record will affect the + * backing model object, and changes to the backing model object will + * affect this record. + * + * @return + * The backing model object. + */ + public ActivityRecordModel getModel() { + return model; + } + + @Override + public Date getStartDate() { + return model.getStartDate(); + } + + @Override + public Date getEndDate() { + return model.getEndDate(); + } + + @Override + public String getRemoteHost() { + return model.getRemoteHost(); + } + + @Override + public String getUsername() { + return model.getUsername(); + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public String getIdentifier() { + + Integer id = model.getRecordID(); + if (id == null) + return null; + + return id.toString(); + + } + + @Override + public UUID getUUID() { + + Integer id = model.getRecordID(); + if (id == null) + return null; + + // Convert record ID to a name UUID in the given namespace + return UUID.nameUUIDFromBytes(ByteBuffer.allocate(24) + .putLong(namespace.getMostSignificantBits()) + .putLong(namespace.getLeastSignificantBits()) + .putLong(id) + .array()); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledActivityRecordSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledActivityRecordSet.java new file mode 100644 index 0000000..79346f5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledActivityRecordSet.java @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.ActivityRecordSet.SortableProperty; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A JDBC implementation of ActivityRecordSet. Calls to asCollection() will + * query history records using an implementation-specific mechanism. Which + * records are returned will be determined by the values passed in earlier. + * + * @param + * The type of ActivityRecord contained within this set. + */ +public abstract class ModeledActivityRecordSet + extends RestrictedObject implements ActivityRecordSet { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ModeledActivityRecordSet.class); + + /** + * The set of strings that each must occur somewhere within the returned + * records, whether within the associated username, an associated date, or + * other related data. If non-empty, any record not matching each of the + * strings within the collection will be excluded from the results. + */ + private final Set requiredContents = + new HashSet<>(); + + /** + * The maximum number of history records that should be returned by a call + * to asCollection(). + */ + private int limit = Integer.MAX_VALUE; + + /** + * A list of predicates to apply while sorting the resulting records, + * describing the properties involved and the sort order for those + * properties. + */ + private final List sortPredicates = + new ArrayList<>(); + + /** + * Retrieves the history records matching the given criteria. Retrieves up + * to limit history records matching the given terms and sorted + * by the given predicates. Only history records associated with data that + * the given user can read are returned. + * + * @param user + * The user retrieving the history. + * + * @param recordIdentifier + * The identifier of the specific history record to retrieve, if not + * all matching records. Search terms, etc. will still be applied to + * the single record. + * + * @param requiredContents + * The search terms that must be contained somewhere within each of the + * returned records. + * + * @param sortPredicates + * A list of predicates to sort the returned records by, in order of + * priority. + * + * @param limit + * The maximum number of records that should be returned. + * + * @return + * A collection of all history records matching the given criteria. + * + * @throws GuacamoleException + * If permission to read the history records is denied. + */ + protected abstract List retrieveHistory( + AuthenticatedUser user, String recordIdentifier, + Set requiredContents, + List sortPredicates, + int limit) throws GuacamoleException; + + @Override + public RecordType get(String identifier) throws GuacamoleException { + + List records = retrieveHistory(getCurrentUser(), + identifier, requiredContents, sortPredicates, limit); + + if (records.isEmpty()) + return null; + + if (records.size() == 1) + return records.get(0); + + logger.warn("Multiple history records match ID \"{}\"! This should " + + "not be possible and may indicate a bug or database " + + "corruption.", identifier); + return null; + + } + + @Override + public Collection asCollection() + throws GuacamoleException { + return retrieveHistory(getCurrentUser(), null, requiredContents, + sortPredicates, limit); + } + + @Override + public ModeledActivityRecordSet contains(String value) + throws GuacamoleException { + requiredContents.add(new ActivityRecordSearchTerm(value)); + return this; + } + + @Override + public ModeledActivityRecordSet limit(int limit) throws GuacamoleException { + this.limit = Math.min(this.limit, limit); + return this; + } + + @Override + public ModeledActivityRecordSet sort(SortableProperty property, boolean desc) + throws GuacamoleException { + + sortPredicates.add(new ActivityRecordSortPredicate( + property, + desc + )); + + return this; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledChildDirectoryObject.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledChildDirectoryObject.java new file mode 100644 index 0000000..124d45a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledChildDirectoryObject.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import org.apache.guacamole.auth.jdbc.connectiongroup.RootConnectionGroup; + +/** + * Common base class for objects that will ultimately be made available through + * the Directory class. All such objects will need the same base set of queries + * to fulfill the needs of the Directory class. + * + * @param + * The type of model object that corresponds to this object. + */ +public abstract class ModeledChildDirectoryObject + extends ModeledDirectoryObject { + + /** + * Returns the identifier of the parent connection group, which cannot be + * null. If the parent is the root connection group, this will be + * RootConnectionGroup.IDENTIFIER. + * + * @return + * The identifier of the parent connection group. + */ + public String getParentIdentifier() { + + // Translate null parent to proper identifier + String parentIdentifier = getModel().getParentIdentifier(); + if (parentIdentifier == null) + return RootConnectionGroup.IDENTIFIER; + + return parentIdentifier; + + } + + /** + * Sets the identifier of the associated parent connection group. If the + * parent is the root connection group, this should be + * RootConnectionGroup.IDENTIFIER. + * + * @param parentIdentifier + * The identifier of the connection group to associate as this object's + * parent. + */ + public void setParentIdentifier(String parentIdentifier) { + + // Translate root identifier back into null + if (parentIdentifier != null + && parentIdentifier.equals(RootConnectionGroup.IDENTIFIER)) + parentIdentifier = null; + + getModel().setParentIdentifier(parentIdentifier); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledChildDirectoryObjectService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledChildDirectoryObjectService.java new file mode 100644 index 0000000..7690313 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledChildDirectoryObjectService.java @@ -0,0 +1,209 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating objects that can be children of other objects. This service will + * automatically enforce the permissions of the current user. + * + * @param + * The specific internal implementation of the type of object this service + * provides access to. + * + * @param + * The external interface or implementation of the type of object this + * service provides access to, as defined by the guacamole-ext API. + * + * @param + * The underlying model object used to represent InternalType in the + * database. + */ +public abstract class ModeledChildDirectoryObjectService, + ExternalType extends Identifiable, ModelType extends ChildObjectModel> + extends ModeledDirectoryObjectService { + + /** + * Returns the permission set associated with the given user and related + * to the type of objects which can be parents of the child objects handled + * by this directory object service, taking into account permission + * inheritance via user groups. + * + * @param user + * The user whose permissions are being retrieved. + * + * @return + * A permission set which contains the permissions associated with the + * given user and related to the type of objects which can be parents + * of the child objects handled by this directory object service. + * + * @throws GuacamoleException + * If permission to read the user's permissions is denied. + */ + protected abstract ObjectPermissionSet getParentEffectivePermissionSet( + ModeledAuthenticatedUser user) throws GuacamoleException; + + /** + * Returns the set of parent objects that are modified by the given model + * object (by virtue of the object changing parents). If the model is not + * changing parents, the resulting collection will be empty. + * + * @param user + * The user making the given changes to the model. + * + * @param identifier + * The identifier of the object that has been modified, if it exists. + * If the object is being created, this will be null. + * + * @param model + * The model that has been modified, if any. If the object is being + * deleted, this will be null. + * + * @return + * A collection of the identifiers of all parents that will be affected + * (updated) by the change. + * + * @throws GuacamoleException + * If an error occurs while determining which parents are affected. + */ + protected Collection getModifiedParents(ModeledAuthenticatedUser user, + String identifier, ModelType model) throws GuacamoleException { + + // Get old parent identifier + String oldParentIdentifier = null; + if (identifier != null) { + ModelType current = retrieveObject(user, identifier).getModel(); + oldParentIdentifier = current.getParentIdentifier(); + } + + // Get new parent identifier + String parentIdentifier = null; + if (model != null) { + + parentIdentifier = model.getParentIdentifier(); + + // If both parents have the same identifier, nothing has changed + if (parentIdentifier != null && parentIdentifier.equals(oldParentIdentifier)) + return Collections.emptyList(); + + } + + // Return collection of all non-root parents involved + Collection parents = new ArrayList(2); + if (oldParentIdentifier != null) parents.add(oldParentIdentifier); + if (parentIdentifier != null) parents.add(parentIdentifier); + return parents; + + } + + /** + * Returns whether the given user has permission to modify the parents + * affected by the modifications made to the given model object. + * + * @param user + * The user who changed the model object. + * + * @param identifier + * The identifier of the object that has been modified, if it exists. + * If the object is being created, this will be null. + * + * @param model + * The model that has been modified, if any. If the object is being + * deleted, this will be null. + * + * @return + * true if the user has update permission for all modified parents, + * false otherwise. + * + * @throws GuacamoleException + * If an error occurs while determining which parents are affected. + */ + protected boolean canUpdateModifiedParents(ModeledAuthenticatedUser user, + String identifier, ModelType model) throws GuacamoleException { + + // If user is privileged, no need to check + if (user.isPrivileged()) + return true; + + // Verify that we have permission to modify any modified parents + Collection modifiedParents = getModifiedParents(user, identifier, model); + if (!modifiedParents.isEmpty()) { + + ObjectPermissionSet permissionSet = getParentEffectivePermissionSet(user); + Collection updateableParents = permissionSet.getAccessibleObjects( + Collections.singleton(ObjectPermission.Type.UPDATE), + modifiedParents + ); + + return updateableParents.size() == modifiedParents.size(); + + } + + return true; + + } + + @Override + protected void beforeCreate(ModeledAuthenticatedUser user, + ExternalType object, ModelType model) throws GuacamoleException { + + super.beforeCreate(user, object, model); + + // Validate that we can update all applicable parents + if (!canUpdateModifiedParents(user, null, model)) + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + protected void beforeUpdate(ModeledAuthenticatedUser user, + InternalType object, ModelType model) throws GuacamoleException { + + super.beforeUpdate(user, object, model); + + // Validate that we can update all applicable parents + if (!canUpdateModifiedParents(user, model.getIdentifier(), model)) + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + protected void beforeDelete(ModeledAuthenticatedUser user, + String identifier) throws GuacamoleException { + + super.beforeDelete(user, identifier); + + // Validate that we can update all applicable parents + if (!canUpdateModifiedParents(user, identifier, null)) + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObject.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObject.java new file mode 100644 index 0000000..ddeda92 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObject.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.net.auth.Attributes; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * Common base class for objects that will ultimately be made available through + * the Directory class and are persisted to an underlying database model. All + * such objects will need the same base set of queries to fulfill the needs of + * the Directory class. + * + * @param + * The type of model object that corresponds to this object. + */ +public abstract class ModeledDirectoryObject + extends ModeledObject implements Identifiable, Attributes { + + @Override + public String getIdentifier() { + return getModel().getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + getModel().setIdentifier(identifier); + } + + /** + * Returns the names of all attributes explicitly supported by this object. + * Attributes named here have associated mappings within the backing model + * object, and thus should not be included in the arbitrary attribute + * storage. Any attributes set which do not match these names, such as those + * set via other extensions, will be added to arbitrary attribute storage. + * + * @return + * A read-only Set of the names of all attributes explicitly supported + * (mapped to a property of the backing model) by this object. + */ + public Set getSupportedAttributeNames() { + return Collections.emptySet(); + } + + @Override + public Map getAttributes() { + return new HashMap(getModel().getArbitraryAttributeMap()); + } + + @Override + public void setAttributes(Map attributes) { + + ArbitraryAttributeMap arbitraryAttributes = getModel().getArbitraryAttributeMap(); + + // Get set of all supported attribute names + Set supportedAttributes = getSupportedAttributeNames(); + + // Store remaining attributes only if not directly mapped to model + for (Map.Entry attribute : attributes.entrySet()) { + + String name = attribute.getKey(); + String value = attribute.getValue(); + + // Handle null attributes as explicit removal of that attribute, + // as the underlying model cannot store null attribute values + if (!supportedAttributes.contains(name)) { + if (value == null) + arbitraryAttributes.remove(name); + else + arbitraryAttributes.put(name, value); + } + + } + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java new file mode 100644 index 0000000..971ae46 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java @@ -0,0 +1,190 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.UserModel; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Common interface for objects that will ultimately be made available through + * the Directory class. All such objects will need the same base set of queries + * to fulfill the needs of the Directory class. + * + * @param + * The type of object contained within the directory whose objects are + * mapped by this mapper. + */ +public interface ModeledDirectoryObjectMapper { + + /** + * Selects the identifiers of all objects, regardless of whether they + * are readable by any particular user. This should only be called on + * behalf of a system administrator. If identifiers are needed by a non- + * administrative user who must have explicit read rights, use + * selectReadableIdentifiers() instead. + * + * @return + * A Set containing all identifiers of all objects. + */ + Set selectIdentifiers(); + + /** + * Selects the identifiers of all objects that are explicitly readable by + * the given user. If identifiers are needed by a system administrator + * (who, by definition, does not need explicit read rights), use + * selectIdentifiers() instead. + * + * @param user + * The user whose permissions should determine whether an identifier + * is returned. + * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * A Set containing all identifiers of all readable objects. + */ + Set selectReadableIdentifiers(@Param("user") UserModel user, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Selects all objects which have the given identifiers. If an identifier + * has no corresponding object, it will be ignored. This should only be + * called on behalf of a system administrator. If objects are needed by a + * non-administrative user who must have explicit read rights, use + * selectReadable() instead. + * + * @param identifiers + * The identifiers of the objects to return. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * A Collection of all objects having the given identifiers. + */ + Collection select(@Param("identifiers") Collection identifiers, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Selects all objects which have the given identifiers and are explicitly + * readably by the given user. If an identifier has no corresponding + * object, or the corresponding object is unreadable, it will be ignored. + * If objects are needed by a system administrator (who, by definition, + * does not need explicit read rights), use select() instead. + * + * @param user + * The user whose permissions should determine whether an object + * is returned. + * + * @param identifiers + * The identifiers of the objects to return. + * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * A Collection of all objects having the given identifiers. + */ + Collection selectReadable(@Param("user") UserModel user, + @Param("identifiers") Collection identifiers, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Inserts the given object into the database. If the object already + * exists, this will result in an error. + * + * @param object + * The object to insert. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("object") ModelType object); + + /** + * Deletes the given object into the database. If the object does not + * exist, this operation has no effect. + * + * @param identifier + * The identifier of the object to delete. + * + * @param caseSensitivity + * The case sensitivity configuration that contains information on + * whether usernames and/or group names will be treated as case-sensitive. + * + * @return + * The number of rows deleted. + */ + int delete(@Param("identifier") String identifier, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Updates the given existing object in the database. If the object does + * not actually exist, this operation has no effect. + * + * @param object + * The object to update. + * + * @return + * The number of rows updated. + */ + int update(@Param("object") ModelType object); + + /** + * Deletes any arbitrary attributes currently associated with the given + * object in the database. + * + * @param object + * The object whose arbitrary attributes should be deleted. + * + * @return + * The number of rows deleted. + */ + int deleteAttributes(@Param("object") ModelType object); + + /** + * Inserts all arbitrary attributes associated with the given object. + * + * @param object + * The object whose arbitrary attributes should be inserted. + * + * @return + * The number of rows inserted. + */ + int insertAttributes(@Param("object") ModelType object); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java new file mode 100644 index 0000000..0adcfbe --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java @@ -0,0 +1,574 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import com.google.common.collect.Lists; +import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionModel; +import org.apache.guacamole.auth.jdbc.user.UserModel; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; +import org.mybatis.guice.transactional.Transactional; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating objects within directories. This service will automatically + * enforce the permissions of the current user. + * + * @param + * The specific internal implementation of the type of object this service + * provides access to. + * + * @param + * The external interface or implementation of the type of object this + * service provides access to, as defined by the guacamole-ext API. + * + * @param + * The underlying model object used to represent InternalType in the + * database. + */ +public abstract class ModeledDirectoryObjectService, + ExternalType extends Identifiable, ModelType extends ObjectModel> + implements DirectoryObjectService { + + /** + * All object permissions which are implicitly granted upon creation to the + * creator of the object. + */ + private static final ObjectPermission.Type[] IMPLICIT_OBJECT_PERMISSIONS = { + ObjectPermission.Type.READ, + ObjectPermission.Type.UPDATE, + ObjectPermission.Type.DELETE, + ObjectPermission.Type.ADMINISTER + }; + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Returns an instance of a mapper for the type of object used by this + * service. + * + * @return + * A mapper which provides access to the model objects associated with + * the objects used by this service. + */ + protected abstract ModeledDirectoryObjectMapper getObjectMapper(); + + /** + * Returns an instance of a mapper for the type of permissions that affect + * the type of object used by this service. + * + * @return + * A mapper which provides access to the model objects associated with + * the permissions that affect the objects used by this service. + */ + protected abstract ObjectPermissionMapper getPermissionMapper(); + + /** + * Returns an instance of an object which is backed by the given model + * object. + * + * @param currentUser + * The user for whom this object is being created. + * + * @param model + * The model object to use to back the returned object. + * + * @return + * An object which is backed by the given model object. + * + * @throws GuacamoleException + * If the object instance cannot be created. + */ + protected abstract InternalType getObjectInstance(ModeledAuthenticatedUser currentUser, + ModelType model) throws GuacamoleException; + + /** + * Returns the case sensitivity configuration for this service, which will + * be used to determine whether usernames and/or group names will be treated + * as case-sensitive. + * + * @return + * The case sensitivity configuration for this service. + * + * @throws GuacamoleException + * If an error occurs retrieving relevant configuration information. + */ + protected CaseSensitivity getCaseSensitivity() throws GuacamoleException { + + // Retrieve the Guacamole setting. + return environment.getCaseSensitivity(); + + } + + /** + * Returns an instance of a model object which is based on the given + * object. + * + * @param currentUser + * The user for whom this model object is being created. + * + * @param object + * The object to use to produce the returned model object. + * + * @return + * A model object which is based on the given object. + * + * @throws GuacamoleException + * If the model object instance cannot be created. + */ + protected abstract ModelType getModelInstance(ModeledAuthenticatedUser currentUser, + ExternalType object) throws GuacamoleException; + + /** + * Returns whether the given user has permission to create the type of + * objects that this directory object service manages, taking into account + * permission inheritance through user groups. + * + * @param user + * The user being checked. + * + * @return + * true if the user has object creation permission relevant to this + * directory object service, false otherwise. + * + * @throws GuacamoleException + * If permission to read the user's permissions is denied. + */ + protected abstract boolean hasCreatePermission(ModeledAuthenticatedUser user) + throws GuacamoleException; + + /** + * Returns whether the given user has permission to perform a certain + * action on a specific object managed by this directory object service, + * taking into account permission inheritance through user groups. + * + * @param user + * The user being checked. + * + * @param identifier + * The identifier of the object to check. + * + * @param type + * The type of action that will be performed. + * + * @return + * true if the user has object permission relevant described, false + * otherwise. + * + * @throws GuacamoleException + * If permission to read the user's permissions is denied. + */ + protected boolean hasObjectPermission(ModeledAuthenticatedUser user, + String identifier, ObjectPermission.Type type) + throws GuacamoleException { + + // Get object permissions + ObjectPermissionSet permissionSet = getEffectivePermissionSet(user); + + // Return whether permission is granted + return user.isPrivileged() + || permissionSet.hasPermission(type, identifier); + + } + + /** + * Returns the permission set associated with the given user and related + * to the type of objects handled by this directory object service, taking + * into account permission inheritance via user groups. + * + * @param user + * The user whose permissions are being retrieved. + * + * @return + * A permission set which contains the permissions associated with the + * given user and related to the type of objects handled by this + * directory object service. + * + * @throws GuacamoleException + * If permission to read the user's permissions is denied. + */ + protected abstract ObjectPermissionSet getEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException; + + /** + * Returns a collection of objects which are backed by the models in the + * given collection. + * + * @param currentUser + * The user for whom these objects are being created. + * + * @param models + * The model objects to use to back the objects within the returned + * collection. + * + * @return + * A collection of objects which are backed by the models in the given + * collection. + * + * @throws GuacamoleException + * If any of the object instances cannot be created. + */ + protected Collection getObjectInstances(ModeledAuthenticatedUser currentUser, + Collection models) throws GuacamoleException { + + // Create new collection of objects by manually converting each model + Collection objects = new ArrayList<>(models.size()); + for (ModelType model : models) + objects.add(getObjectInstance(currentUser, model)); + + return objects; + + } + + /** + * Called before any object is created through this directory object + * service. This function serves as a final point of validation before + * the create operation occurs. In its default implementation, + * beforeCreate() performs basic permissions checks. + * + * @param user + * The user creating the object. + * + * @param object + * The object being created. + * + * @param model + * The model of the object being created. + * + * @throws GuacamoleException + * If the object is invalid, or an error prevents validating the given + * object. + */ + protected void beforeCreate(ModeledAuthenticatedUser user, + ExternalType object, ModelType model) throws GuacamoleException { + + // Verify permission to create objects + if (!user.isPrivileged() && !hasCreatePermission(user)) + throw new GuacamoleSecurityException("Permission denied."); + + } + + /** + * Called before any object is updated through this directory object + * service. This function serves as a final point of validation before + * the update operation occurs. In its default implementation, + * beforeUpdate() performs basic permissions checks. + * + * @param user + * The user updating the existing object. + * + * @param object + * The object being updated. + * + * @param model + * The model of the object being updated. + * + * @throws GuacamoleException + * If the object is invalid, or an error prevents validating the given + * object. + */ + protected void beforeUpdate(ModeledAuthenticatedUser user, + InternalType object, ModelType model) throws GuacamoleException { + + // By default, do nothing. + if (!hasObjectPermission(user, model.getIdentifier(), ObjectPermission.Type.UPDATE)) + throw new GuacamoleSecurityException("Permission denied."); + + } + + /** + * Called before any object is deleted through this directory object + * service. This function serves as a final point of validation before + * the delete operation occurs. In its default implementation, + * beforeDelete() performs basic permissions checks. + * + * @param user + * The user deleting the existing object. + * + * @param identifier + * The identifier of the object being deleted. + * + * @throws GuacamoleException + * If the object is invalid, or an error prevents validating the given + * object. + */ + protected void beforeDelete(ModeledAuthenticatedUser user, + String identifier) throws GuacamoleException { + + // Verify permission to delete objects + if (!hasObjectPermission(user, identifier, ObjectPermission.Type.DELETE)) + throw new GuacamoleSecurityException("Permission denied."); + + } + + /** + * Returns whether the given string is a valid identifier within the JDBC + * authentication extension. Invalid identifiers may result in SQL errors + * from the underlying database when used in queries. + * + * @param identifier + * The string to check for validity. + * + * @return + * true if the given string is a valid identifier, false otherwise. + */ + protected boolean isValidIdentifier(String identifier) { + + // Empty identifiers are invalid + if (identifier.isEmpty()) + return false; + + // Identifier is invalid if any non-numeric characters are present + for (int i = 0; i < identifier.length(); i++) { + if (!Character.isDigit(identifier.charAt(i))) + return false; + } + + // Identifier is valid - contains only numeric characters + return true; + + } + + /** + * Filters the given collection of strings, returning a new collection + * containing only those strings which are valid identifiers. If no strings + * within the collection are valid identifiers, the returned collection will + * simply be empty. + * + * @param identifiers + * The collection of strings to filter. + * + * @return + * A new collection containing only the strings within the provided + * collection which are valid identifiers. + */ + protected List filterIdentifiers(Collection identifiers) { + + // Obtain enough space for a full copy of the given identifiers + List validIdentifiers = new ArrayList<>(identifiers.size()); + + // Add only valid identifiers to the copy + for (String identifier : identifiers) { + if (isValidIdentifier(identifier)) + validIdentifiers.add(identifier); + } + + return validIdentifiers; + + } + + @Override + public InternalType retrieveObject(ModeledAuthenticatedUser user, + String identifier) throws GuacamoleException { + + // Pull objects having given identifier + Collection objects = retrieveObjects(user, Collections.singleton(identifier)); + + // If no such object, return null + if (objects.isEmpty()) + return null; + + // The object collection will have exactly one element unless the + // database has seriously lost integrity + assert(objects.size() == 1); + + // Return first and only object + return objects.iterator().next(); + + } + + @Override + public Collection retrieveObjects(ModeledAuthenticatedUser user, + Collection identifiers) throws GuacamoleException { + + // Ignore invalid identifiers + List filteredIdentifiers = filterIdentifiers(identifiers); + + // Do not query if no identifiers given + if (filteredIdentifiers.isEmpty()) + return Collections.emptyList(); + + int batchSize = environment.getBatchSize(); + + boolean userIsPrivileged = user.isPrivileged(); + + CaseSensitivity caseSensitivity = getCaseSensitivity(); + + // Process the filteredIdentifiers in batches using Lists.partition() and flatMap + Collection allObjects = Lists.partition(filteredIdentifiers, batchSize).stream() + .flatMap(chunk -> { + Collection objects; + + // Bypass permission checks if the user is privileged + if (userIsPrivileged) + objects = getObjectMapper().select(chunk, caseSensitivity); + + // Otherwise only return explicitly readable identifiers + else + objects = getObjectMapper().selectReadable(user.getUser().getModel(), + chunk, user.getEffectiveUserGroups(), caseSensitivity); + + return objects.stream(); + }) + .collect(Collectors.toList()); + + // Return collection of requested objects + return getObjectInstances(user, allObjects); + } + + /** + * Returns an immutable collection of permissions that should be granted due + * to the creation of the given object. These permissions need not be + * granted solely to the user creating the object. + * + * @param user + * The user creating the object. + * + * @param model + * The object being created. + * + * @return + * The collection of implicit permissions that should be granted due to + * the creation of the given object. + */ + protected Collection getImplicitPermissions(ModeledAuthenticatedUser user, + ModelType model) { + + // Check to see if the user granting permissions is a skeleton user, + // thus lacking database backing. + if (user.getUser().isSkeleton()) + return Collections.emptyList(); + + // Build list of implicit permissions + Collection implicitPermissions = + new ArrayList<>(IMPLICIT_OBJECT_PERMISSIONS.length); + + + UserModel userModel = user.getUser().getModel(); + for (ObjectPermission.Type permission : IMPLICIT_OBJECT_PERMISSIONS) { + + // Create model which grants this permission to the current user + ObjectPermissionModel permissionModel = new ObjectPermissionModel(); + permissionModel.setEntityID(userModel.getEntityID()); + permissionModel.setType(permission); + permissionModel.setObjectIdentifier(model.getIdentifier()); + + // Add permission + implicitPermissions.add(permissionModel); + + } + + return Collections.unmodifiableCollection(implicitPermissions); + + } + + @Override + @Transactional + public InternalType createObject(ModeledAuthenticatedUser user, ExternalType object) + throws GuacamoleException { + + ModelType model = getModelInstance(user, object); + beforeCreate(user, object, model); + + // Create object + getObjectMapper().insert(model); + + // Set identifier on original object + object.setIdentifier(model.getIdentifier()); + + // Add implicit permissions + Collection implicitPermissions = getImplicitPermissions(user, model); + if (!implicitPermissions.isEmpty()) + getPermissionMapper().insert(implicitPermissions, getCaseSensitivity()); + + // Add any arbitrary attributes + if (model.hasArbitraryAttributes()) + getObjectMapper().insertAttributes(model); + + return getObjectInstance(user, model); + + } + + @Override + public void deleteObject(ModeledAuthenticatedUser user, String identifier) + throws GuacamoleException { + + beforeDelete(user, identifier); + + // Delete object + getObjectMapper().delete(identifier, getCaseSensitivity()); + + } + + @Override + @Transactional + public void updateObject(ModeledAuthenticatedUser user, InternalType object) + throws GuacamoleException { + + ModelType model = object.getModel(); + beforeUpdate(user, object, model); + + // Update object + getObjectMapper().update(model); + + // Replace any existing arbitrary attributes + getObjectMapper().deleteAttributes(model); + if (model.hasArbitraryAttributes()) + getObjectMapper().insertAttributes(model); + + } + + @Override + public Set getIdentifiers(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Bypass permission checks if the user is privileged + if (user.isPrivileged()) + return getObjectMapper().selectIdentifiers(); + + // Otherwise only return explicitly readable identifiers + else + return getObjectMapper().selectReadableIdentifiers( + user.getUser().getModel(), + user.getEffectiveUserGroups(), + getCaseSensitivity() + ); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledObject.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledObject.java new file mode 100644 index 0000000..fa43c73 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledObject.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; + +/** + * Common base class for objects have an underlying model. For the purposes of + * JDBC-driven authentication providers, all modeled objects are also + * restricted. + * + * @param + * The type of model object which corresponds to this object. + */ +public abstract class ModeledObject extends RestrictedObject { + + /** + * The internal model object containing the values which represent this + * object in the database. + */ + private ModelType model; + + /** + * Initializes this object, associating it with the current authenticated + * user and populating it with data from the given model object + * + * @param currentUser + * The user that created or retrieved this object. + * + * @param model + * The backing model object. + */ + public void init(ModeledAuthenticatedUser currentUser, ModelType model) { + super.init(currentUser); + setModel(model); + } + + /** + * Returns the backing model object. Changes to the model object will + * affect this object, and changes to this object will affect the model + * object. + * + * @return + * The backing model object. + */ + public ModelType getModel() { + return model; + } + + /** + * Sets the backing model object. This will effectively replace all data + * contained within this object. + * + * @param model + * The backing model object. + */ + public void setModel(ModelType model) { + this.model = model; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledPermissions.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledPermissions.java new file mode 100644 index 0000000..be5ac15 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledPermissions.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.permission.SystemPermissionService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionPermissionService; +import org.apache.guacamole.auth.jdbc.permission.ConnectionGroupPermissionService; +import org.apache.guacamole.auth.jdbc.permission.ConnectionPermissionService; +import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionService; +import org.apache.guacamole.auth.jdbc.permission.UserGroupPermissionService; +import org.apache.guacamole.auth.jdbc.permission.UserPermissionService; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * An implementation of the base Permissions interface which is common to both + * Users and UserGroups, backed by a database model. + * + * @param + * The type of model object that corresponds to this object. + */ +public abstract class ModeledPermissions + extends ModeledDirectoryObject implements Permissions { + + /** + * Service for retrieving entity details. + */ + @Inject + private EntityService entityService; + + /** + * Service for retrieving system permissions. + */ + @Inject + private SystemPermissionService systemPermissionService; + + /** + * Service for retrieving connection permissions. + */ + @Inject + private ConnectionPermissionService connectionPermissionService; + + /** + * Service for retrieving connection group permissions. + */ + @Inject + private ConnectionGroupPermissionService connectionGroupPermissionService; + + /** + * Service for retrieving sharing profile permissions. + */ + @Inject + private SharingProfilePermissionService sharingProfilePermissionService; + + /** + * Service for retrieving active connection permissions. + */ + @Inject + private ActiveConnectionPermissionService activeConnectionPermissionService; + + /** + * Service for retrieving user permissions. + */ + @Inject + private UserPermissionService userPermissionService; + + /** + * Service for retrieving user group permissions. + */ + @Inject + private UserGroupPermissionService userGroupPermissionService; + + /** + * Returns whether the underlying entity is a user. Entities may be either + * users or user groups. + * + * @return + * true if the underlying entity is a user, false otherwise. + */ + public boolean isUser() { + return getModel().getEntityType() == EntityType.USER; + } + + /** + * Returns whether the underlying entity represents a specific user having + * the given username. + * + * @param username + * The username of a user. + * + * @return + * true if the underlying entity is a user that has the given username, + * false otherwise. + */ + public boolean isUser(String username) { + return isUser() && getIdentifier().equals(username); + } + + /** + * Returns whether the underlying entity is a user group. Entities may be + * either users or user groups. + * + * @return + * true if the underlying entity is a user group, false otherwise. + */ + public boolean isUserGroup() { + return getModel().getEntityType() == EntityType.USER_GROUP; + } + + /** + * Returns whether this entity is effectively unrestricted by permissions, + * such as a system administrator or an internal user operating via a + * privileged UserContext. Permission inheritance via user groups is taken + * into account. + * + * @return + * true if this entity should be unrestricted by permissions, false + * otherwise. + * + * @throws GuacamoleException + * If an error occurs while determining whether permission restrictions + * apply to the entity. + */ + public boolean isPrivileged() throws GuacamoleException { + SystemPermissionSet systemPermissionSet = getEffective().getSystemPermissions(); + return systemPermissionSet.hasPermission(SystemPermission.Type.ADMINISTER); + } + + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + return systemPermissionService.getPermissionSet(getCurrentUser(), this, + Collections.emptySet()); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return connectionPermissionService.getPermissionSet(getCurrentUser(), + this, Collections.emptySet()); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return connectionGroupPermissionService.getPermissionSet( + getCurrentUser(), this, Collections.emptySet()); + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() + throws GuacamoleException { + return sharingProfilePermissionService.getPermissionSet( + getCurrentUser(), this, Collections.emptySet()); + } + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + return activeConnectionPermissionService.getPermissionSet( + getCurrentUser(), this, Collections.emptySet()); + } + + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + return userPermissionService.getPermissionSet(getCurrentUser(), this, + Collections.emptySet()); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() throws GuacamoleException { + return userGroupPermissionService.getPermissionSet(getCurrentUser(), + this, Collections.emptySet()); + } + + /** + * Returns the identifiers of all user groups defined within the database + * which apply to this user, including any groups inherited through + * membership in yet more groups. + * + * @return + * The identifiers of all user groups defined within the database which + * apply to this user. + */ + public Set getEffectiveUserGroups() { + return entityService.retrieveEffectiveGroups(this, + Collections.emptySet()); + } + + /** + * Returns a Permissions object which represents all permissions granted to + * this entity, including any permissions inherited through group + * membership. + * + * @return + * A Permissions object which represents all permissions granted to + * this entity. + */ + public Permissions getEffective() { + + final ModeledAuthenticatedUser authenticatedUser = getCurrentUser(); + final Set effectiveGroups; + + // If this user is the currently-authenticated user, include any + // additional effective groups declared by the authentication system + if (authenticatedUser.getIdentifier().equals(getIdentifier())) + effectiveGroups = entityService.retrieveEffectiveGroups(this, + authenticatedUser.getEffectiveUserGroups()); + + // Otherwise, just include effective groups from the database + else + effectiveGroups = getEffectiveUserGroups(); + + // Return a permissions object which describes all effective + // permissions, including any permissions inherited via user groups + return new Permissions() { + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + return activeConnectionPermissionService.getPermissionSet(authenticatedUser, ModeledPermissions.this, effectiveGroups); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return connectionGroupPermissionService.getPermissionSet(authenticatedUser, ModeledPermissions.this, effectiveGroups); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return connectionPermissionService.getPermissionSet(authenticatedUser, ModeledPermissions.this, effectiveGroups); + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() + throws GuacamoleException { + return sharingProfilePermissionService.getPermissionSet(authenticatedUser, ModeledPermissions.this, effectiveGroups); + } + + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + return systemPermissionService.getPermissionSet(authenticatedUser, ModeledPermissions.this, effectiveGroups); + } + + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + return userPermissionService.getPermissionSet(authenticatedUser, ModeledPermissions.this, effectiveGroups); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + return userGroupPermissionService.getPermissionSet(getCurrentUser(), ModeledPermissions.this, effectiveGroups); + } + + }; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java new file mode 100644 index 0000000..c3052b1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java @@ -0,0 +1,149 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; + +/** + * Object representation of a Guacamole object, such as a user or connection, + * as represented in the database. + */ +public abstract class ObjectModel { + + /** + * The ID of this object in the database, if any. + */ + private Integer objectID; + + /** + * The unique identifier which identifies this object. + */ + private String identifier; + + /** + * Map of all arbitrary attributes associated with this object but not + * directly mapped to a particular column. + */ + private ArbitraryAttributeMap arbitraryAttributes = + new ArbitraryAttributeMap(); + + /** + * Creates a new, empty object. + */ + public ObjectModel() { + } + + /** + * Returns the identifier that uniquely identifies this object. + * + * @return + * The identifier that uniquely identifies this object. + */ + public String getIdentifier() { + return identifier; + } + + /** + * Sets the identifier that uniquely identifies this object. + * + * @param identifier + * The identifier that uniquely identifies this object. + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + /** + * Returns the ID of this object in the database, if it exists. + * + * @return + * The ID of this object in the database, or null if this object was + * not retrieved from the database. + */ + public Integer getObjectID() { + return objectID; + } + + /** + * Sets the ID of this object to the given value. + * + * @param objectID + * The ID to assign to this object. + */ + public void setObjectID(Integer objectID) { + this.objectID = objectID; + } + + /** + * Returns a map of attribute name/value pairs for all attributes associated + * with this model which do not have explicit mappings to actual model + * properties. All other attributes (those which are explicitly supported + * by the model) should instead be mapped to properties with corresponding + * and properly-typed columns. + * + * @return + * A map of attribute name/value pairs for all attributes associated + * with this model which do not otherwise have explicit mappings to + * properties. + */ + public ArbitraryAttributeMap getArbitraryAttributeMap() { + return arbitraryAttributes; + } + + /** + * Returns whether at least one arbitrary attribute name/value pair has + * been associated with this object. + * + * @return + * true if this object has at least one arbitrary attribute set, false + * otherwise. + */ + public boolean hasArbitraryAttributes() { + return !arbitraryAttributes.isEmpty(); + } + + /** + * Returns a Collection view of the equivalent attribute model objects + * which make up the map of arbitrary attribute name/value pairs returned + * by getArbitraryAttributeMap(). Additions and removals on the returned + * Collection directly affect the attribute map. + * + * @return + * A Collection view of the map returned by + * getArbitraryAttributeMap(). + */ + public Collection getArbitraryAttributes() { + return arbitraryAttributes.toModelCollection(); + } + + /** + * Replaces all arbitrary attributes associated with this object with the + * attribute name/value pairs within the given collection of model objects. + * + * @param arbitraryAttributes + * The Collection of model objects containing the attribute name/value + * pairs which should replace all currently-stored arbitrary attributes, + * if any. + */ + public void setArbitraryAttributes(Collection arbitraryAttributes) { + this.arbitraryAttributes = ArbitraryAttributeMap.fromModelCollection(arbitraryAttributes); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectRelationMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectRelationMapper.java new file mode 100644 index 0000000..a155f25 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectRelationMapper.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.UserModel; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for the relations represented by a particular RelatedObjectSet + * implementation. + * + * @param + * The underlying database model of the object on the parent side of the + * one-to-many relationship represented by the RelatedObjectSet mapped by + * this ObjectRelationMapper. + */ +public interface ObjectRelationMapper { + + /** + * Inserts rows as necessary to establish the one-to-many relationship + * represented by the RelatedObjectSet between the given parent and + * children. If the relation for any parent/child pair is already present, + * no attempt is made to insert a new row for that relation. + * + * @param parent + * The model of the object on the parent side of the one-to-many + * relationship represented by the RelatedObjectSet. + * + * @param children + * The identifiers of the objects on the child side of the one-to-many + * relationship represented by the RelatedObjectSet. + * + * @param caseSensitivity + * The case sensitivity configuration, used to determine whether + * usernames and/or group names will be treated as case-sensitive. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("parent") ParentModelType parent, + @Param("children") Collection children, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Deletes rows as necessary to modify the one-to-many relationship + * represented by the RelatedObjectSet between the given parent and + * children. If the relation for any parent/child pair does not exist, + * that specific relation is ignored, and deletion proceeds with the + * remaining relations. + * + * @param parent + * The model of the object on the parent side of the one-to-many + * relationship represented by the RelatedObjectSet. + * + * @param children + * The identifiers of the objects on the child side of the one-to-many + * relationship represented by the RelatedObjectSet. + * + * @param caseSensitivity + * The case sensitivity configuration, used to determine whether + * usernames and/or group names will be treated as case-sensitive. + * + * @return + * The number of rows deleted. + */ + int delete(@Param("parent") ParentModelType parent, + @Param("children") Collection children, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Retrieves the identifiers of all objects on the child side of the + * one-to-many relationship represented by the RelatedObjectSet mapped by + * this ObjectRelationMapper. This should only be called on behalf of a + * system administrator. If identifiers are needed by a non-administrative + * user who must have explicit read rights, use + * selectReadableChildIdentifiers() instead. + * + * @param parent + * The model of the object on the parent side of the one-to-many + * relationship represented by the RelatedObjectSet. + * + * @return + * A Set containing the identifiers of all objects on the child side + * of the one-to-many relationship. + */ + Set selectChildIdentifiers(@Param("parent") ParentModelType parent); + + /** + * Retrieves the identifiers of all objects on the child side of the + * one-to-many relationship represented by the RelatedObjectSet mapped by + * this ObjectRelationMapper, including only those objects which are + * explicitly readable by the given user. If identifiers are needed by a + * system administrator (who, by definition, does not need explicit read + * rights), use selectChildIdentifiers() instead. + + * + * @param user + * The user whose permissions should determine whether an identifier + * is returned. + * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @param parent + * The model of the object on the parent side of the one-to-many + * relationship represented by the RelatedObjectSet. + * + * @return + * A Set containing the identifiers of all readable objects on the + * child side of the one-to-many relationship. + */ + Set selectReadableChildIdentifiers(@Param("user") UserModel user, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity, + @Param("parent") ParentModelType parent); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/RelatedObjectSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/RelatedObjectSet.java new file mode 100644 index 0000000..541afc7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/RelatedObjectSet.java @@ -0,0 +1,234 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * A database implementation of RelatedObjectSet which provides access to a + * parent object and corresponding set of objects related to the parent, subject + * to object-level permissions. Though the parent and child objects have + * specific types, only the parent object's type is enforced through type + * parameters, as child objects are represented by identifiers only. + * + * @param + * The type of object that represents the parent side of the relation. + * + * @param + * The underlying database model of the parent object. + */ +public abstract class RelatedObjectSet, ParentModelType extends ObjectModel> + extends RestrictedObject implements org.apache.guacamole.net.auth.RelatedObjectSet { + + /** + * The parent object which shares some arbitrary relation with the objects + * within this set. + */ + private ParentObjectType parent; + + /** + * Creates a new RelatedObjectSet. The resulting object set must still be + * initialized by a call to init(). + */ + public RelatedObjectSet() { + } + + /** + * Initializes this RelatedObjectSet with the current user and the single + * object on the parent side of the one-to-many relation represented by the + * set. + * + * @param currentUser + * The user who queried this RelatedObjectSet, and whose permissions + * dictate the access level of all operations performed on this set. + * + * @param parent + * The parent object which shares some arbitrary relation with the + * objects within this set. + */ + public void init(ModeledAuthenticatedUser currentUser, ParentObjectType parent) { + super.init(currentUser); + this.parent = parent; + } + + /** + * Return the current case sensitivity setting, which can be used to + * determine whether or not certain identifiers should be treated as + * case-sensitive. + * + * @return + * The current case sensitivity setting. + * + * @throws GuacamoleException + * If an error occurs retrieving configuration information on + * case sensitivity. + */ + protected CaseSensitivity getCaseSensitivity() throws GuacamoleException { + + // Identifiers are not case-sensitive by default. + return CaseSensitivity.DISABLED; + } + + /** + * Returns the mapper which provides low-level access to the database + * models which drive the relation represented by this RelatedObjectSet. + * + * @return + * The mapper which provides low-level access to the database + * models which drive the relation represented by this + * RelatedObjectSet. + */ + protected abstract ObjectRelationMapper getObjectRelationMapper(); + + /** + * Returns the permission set which exposes the effective permissions + * available to the current user regarding the objects on the parent side + * of the one-to-many relationship represented by this RelatedObjectSet. + * Permission inheritance through user groups is taken into account. + * + * @return + * The permission set which exposes the effective permissions + * available to the current user regarding the objects on the parent + * side of the one-to-many relationship represented by this + * RelatedObjectSet. + * + * @throws GuacamoleException + * If permission to query permission status is denied. + */ + protected abstract ObjectPermissionSet getParentObjectEffectivePermissionSet() + throws GuacamoleException; + + /** + * Returns the permission set which exposes the effective permissions + * available to the current user regarding the objects on the child side + * of the one-to-many relationship represented by this RelatedObjectSet. + * Permission inheritance through user groups is taken into account. + * + * @return + * The permission set which exposes the effective permissions + * available to the current user regarding the objects on the child + * side of the one-to-many relationship represented by this + * RelatedObjectSet. + * + * @throws GuacamoleException + * If permission to query permission status is denied. + */ + protected abstract ObjectPermissionSet getChildObjectEffectivePermissionSet() + throws GuacamoleException; + + /** + * Returns whether the current user has permission to alter the status of + * the relation between the parent object and the given child objects. + * + * @param identifiers + * The identifiers of all objects on the child side of the one-to-many + * relation being changed. + * + * @return + * true if the user has permission to make the described changes, + * false otherwise. + * + * @throws GuacamoleException + * If permission to query permission status is denied. + */ + private boolean canAlterRelation(Collection identifiers) + throws GuacamoleException { + + // Privileged users (such as system administrators) may alter any + // relations + if (getCurrentUser().isPrivileged()) + return true; + + // Non-admin users require UPDATE permission on the parent object ... + if (!getParentObjectEffectivePermissionSet().hasPermission( + ObjectPermission.Type.UPDATE, parent.getIdentifier())) + return false; + + // ... as well as UPDATE permission on all child objects being changed + Collection accessibleIdentifiers = + getChildObjectEffectivePermissionSet().getAccessibleObjects( + Collections.singleton(ObjectPermission.Type.UPDATE), + identifiers); + + return accessibleIdentifiers.size() == identifiers.size(); + + } + + @Override + public Set getObjects() throws GuacamoleException { + + // Bypass permission checks if the user is a privileged + ModeledAuthenticatedUser user = getCurrentUser(); + if (user.isPrivileged()) + return getObjectRelationMapper().selectChildIdentifiers(parent.getModel()); + + // Otherwise only return explicitly readable identifiers + return getObjectRelationMapper().selectReadableChildIdentifiers( + user.getUser().getModel(), user.getEffectiveUserGroups(), + getCaseSensitivity(), + parent.getModel()); + + } + + @Override + public void addObjects(Set identifiers) throws GuacamoleException { + + // Nothing to do if nothing provided + if (identifiers.isEmpty()) + return; + + // Create relations only if permission is granted + if (canAlterRelation(identifiers)) + getObjectRelationMapper().insert(parent.getModel(), identifiers, + getCaseSensitivity()); + + // User lacks permission to add user groups + else + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public void removeObjects(Set identifiers) throws GuacamoleException { + + // Nothing to do if nothing provided + if (identifiers.isEmpty()) + return; + + // Delete relations only if permission is granted + if (canAlterRelation(identifiers)) + getObjectRelationMapper().delete(parent.getModel(), identifiers, + getCaseSensitivity()); + + // User lacks permission to remove user groups + else + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/RestrictedObject.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/RestrictedObject.java new file mode 100644 index 0000000..66979d4 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/RestrictedObject.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.base; + +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; + +/** + * Common base class for objects that are associated with the users that + * obtain them. + */ +public abstract class RestrictedObject { + + /** + * The user this object belongs to. Access is based on his/her permission + * settings. + */ + private ModeledAuthenticatedUser currentUser; + + /** + * Initializes this object, associating it with the current authenticated + * user and populating it with data from the given model object + * + * @param currentUser + * The user that created or retrieved this object. + */ + public void init(ModeledAuthenticatedUser currentUser) { + setCurrentUser(currentUser); + } + + /** + * Returns the user that created or queried this object. This user's + * permissions dictate what operations can be performed on or through this + * object. + * + * @return + * The user that created or queried this object. + */ + public ModeledAuthenticatedUser getCurrentUser() { + return currentUser; + } + + /** + * Sets the user that created or queried this object. This user's + * permissions dictate what operations can be performed on or through this + * object. + * + * @param currentUser + * The user that created or queried this object. + */ + public void setCurrentUser(ModeledAuthenticatedUser currentUser) { + this.currentUser = currentUser; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/package-info.java new file mode 100644 index 0000000..40911f3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Base classes supporting JDBC-driven authentication providers and defining + * the relationships between the model and the implementations of guacamole-ext + * classes. + */ +package org.apache.guacamole.auth.jdbc.base; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java new file mode 100644 index 0000000..3e364f5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.JDBCDirectory; +import org.apache.guacamole.net.auth.Connection; +import org.mybatis.guice.transactional.Transactional; + +/** + * Implementation of the Connection Directory which is driven by an underlying, + * arbitrary database. + */ +public class ConnectionDirectory extends JDBCDirectory { + + /** + * Service for managing connection objects. + */ + @Inject + private ConnectionService connectionService; + + @Override + public Connection get(String identifier) throws GuacamoleException { + return connectionService.retrieveObject(getCurrentUser(), identifier); + } + + @Override + @Transactional + public Collection getAll(Collection identifiers) throws GuacamoleException { + Collection objects = connectionService.retrieveObjects(getCurrentUser(), identifiers); + return Collections.unmodifiableCollection(objects); + } + + @Override + @Transactional + public Set getIdentifiers() throws GuacamoleException { + return connectionService.getIdentifiers(getCurrentUser()); + } + + @Override + @Transactional + public void add(Connection object) throws GuacamoleException { + connectionService.createObject(getCurrentUser(), object); + } + + @Override + @Transactional + public void update(Connection object) throws GuacamoleException { + ModeledConnection connection = (ModeledConnection) object; + connectionService.updateObject(getCurrentUser(), connection); + } + + @Override + @Transactional + public void remove(String identifier) throws GuacamoleException { + connectionService.deleteObject(getCurrentUser(), identifier); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.java new file mode 100644 index 0000000..5f3db38 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.auth.jdbc.user.UserModel; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for connection objects. + */ +public interface ConnectionMapper extends ModeledDirectoryObjectMapper { + + /** + * Selects the identifiers of all connections within the given parent + * connection group, regardless of whether they are readable by any + * particular user. This should only be called on behalf of a system + * administrator. If identifiers are needed by a non-administrative user + * who must have explicit read rights, use + * selectReadableIdentifiersWithin() instead. + * + * @param parentIdentifier + * The identifier of the parent connection group, or null if the root + * connection group is to be queried. + * + * @return + * A Set containing all identifiers of all objects. + */ + Set selectIdentifiersWithin(@Param("parentIdentifier") String parentIdentifier); + + /** + * Selects the identifiers of all connections within the given parent + * connection group that are explicitly readable by the given user. If + * identifiers are needed by a system administrator (who, by definition, + * does not need explicit read rights), use selectIdentifiersWithin() + * instead. + * + * @param user + * The user whose permissions should determine whether an identifier + * is returned. + * + * @param parentIdentifier + * The identifier of the parent connection group, or null if the root + * connection group is to be queried. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * A Set containing all identifiers of all readable objects. + */ + Set selectReadableIdentifiersWithin(@Param("user") UserModel user, + @Param("parentIdentifier") String parentIdentifier, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Selects the connection within the given parent group and having the + * given name. If no such connection exists, null is returned. + * + * @param parentIdentifier + * The identifier of the parent group to search within. + * + * @param name + * The name of the connection to find. + * + * @return + * The connection having the given name within the given parent group, + * or null if no such connection exists. + */ + ConnectionModel selectOneByName(@Param("parentIdentifier") String parentIdentifier, + @Param("name") String name); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java new file mode 100644 index 0000000..da45402 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java @@ -0,0 +1,395 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import java.util.Date; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.base.ChildObjectModel; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration.EncryptionMethod; + +/** + * Object representation of a Guacamole connection, as represented in the + * database. + */ +public class ConnectionModel extends ChildObjectModel { + + /** + * The human-readable name associated with this connection. + */ + private String name; + + /** + * The name of the protocol to use when connecting to this connection. + */ + private String protocol; + + /** + * The maximum number of connections that can be established to this + * connection concurrently, zero if no restriction applies, or null if the + * default restrictions should be applied. + */ + private Integer maxConnections; + + /** + * The maximum number of connections that can be established to this + * connection concurrently by any one user, zero if no restriction applies, + * or null if the default restrictions should be applied. + */ + private Integer maxConnectionsPerUser; + + /** + * The weight of the connection for the purposes of calculating + * WLC algorithm. null indicates nothing has been set, and anything less + * than 1 eliminates the system from being used for connections. + */ + private Integer connectionWeight; + + /** + * Whether this connection should be reserved for failover. Failover-only + * connections within a balancing group are only used when all non-failover + * connections are unavailable. + */ + private boolean failoverOnly; + + /** + * The identifiers of all readable sharing profiles associated with this + * connection. + */ + private Set sharingProfileIdentifiers = new HashSet(); + + /** + * The hostname of the guacd instance to use, or null if the hostname of the + * default guacd instance should be used. + */ + private String proxyHostname; + + /** + * The port of the guacd instance to use, or null if the port of the default + * guacd instance should be used. + */ + private Integer proxyPort; + + /** + * The encryption method required by the desired guacd instance, or null if + * the encryption method of the default guacd instance should be used. + */ + private EncryptionMethod proxyEncryptionMethod; + + /** + * The date and time that this connection was last used, or null if this + * connection has never been used. + */ + private Date lastActive; + + /** + * Creates a new, empty connection. + */ + public ConnectionModel() { + } + + /** + * Returns the name associated with this connection. + * + * @return + * The name associated with this connection. + */ + public String getName() { + return name; + } + + /** + * Sets the name associated with this connection. + * + * @param name + * The name to associate with this connection. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the name of the protocol to use when connecting to this + * connection. + * + * @return + * The name of the protocol to use when connecting to this connection. + */ + public String getProtocol() { + return protocol; + } + + /** + * Sets the name of the protocol to use when connecting to this connection. + * + * @param protocol + * The name of the protocol to use when connecting to this connection. + */ + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + /** + * Returns the maximum number of connections that can be established to + * this connection concurrently. + * + * @return + * The maximum number of connections that can be established to this + * connection concurrently, zero if no restriction applies, or null if + * the default restrictions should be applied. + */ + public Integer getMaxConnections() { + return maxConnections; + } + + /** + * Sets the maximum number of connections that can be established to this + * connection concurrently. + * + * @param maxConnections + * The maximum number of connections that can be established to this + * connection concurrently, zero if no restriction applies, or null if + * the default restrictions should be applied. + */ + public void setMaxConnections(Integer maxConnections) { + this.maxConnections = maxConnections; + } + + /** + * Returns the maximum number of connections that can be established to + * this connection concurrently by any one user. + * + * @return + * The maximum number of connections that can be established to this + * connection concurrently by any one user, zero if no restriction + * applies, or null if the default restrictions should be applied. + */ + public Integer getMaxConnectionsPerUser() { + return maxConnectionsPerUser; + } + + /** + * Sets the connection weight for load balancing. + * + * @param connectionWeight + * The weight of the connection used in load balancing. + * The value is not required for the connection (null), and + * values less than 1 will prevent the connection from being + * used. + */ + public void setConnectionWeight(Integer connectionWeight) { + this.connectionWeight = connectionWeight; + } + + /** + * Returns the connection weight used in applying weighted + * load balancing algorithms. + * + * @return + * The connection weight used in applying weighted + * load balancing aglorithms. + */ + public Integer getConnectionWeight() { + return connectionWeight; + } + + /** + * Returns whether this connection should be reserved for failover. + * Failover-only connections within a balancing group are only used when + * all non-failover connections are unavailable. + * + * @return + * true if this connection should be reserved for failover, false + * otherwise. + */ + public boolean isFailoverOnly() { + return failoverOnly; + } + + /** + * Sets whether this connection should be reserved for failover. + * Failover-only connections within a balancing group are only used when + * all non-failover connections are unavailable. + * + * @param failoverOnly + * true if this connection should be reserved for failover, false + * otherwise. + */ + public void setFailoverOnly(boolean failoverOnly) { + this.failoverOnly = failoverOnly; + } + + /** + * Sets the maximum number of connections that can be established to this + * connection concurrently by any one user. + * + * @param maxConnectionsPerUser + * The maximum number of connections that can be established to this + * connection concurrently by any one user, zero if no restriction + * applies, or null if the default restrictions should be applied. + */ + public void setMaxConnectionsPerUser(Integer maxConnectionsPerUser) { + this.maxConnectionsPerUser = maxConnectionsPerUser; + } + + /** + * Returns the hostname of the guacd instance to use. If the hostname of the + * default guacd instance should be used instead, null is returned. + * + * @return + * The hostname of the guacd instance to use, or null if the hostname + * of the default guacd instance should be used. + */ + public String getProxyHostname() { + return proxyHostname; + } + + /** + * Sets the hostname of the guacd instance to use. + * + * @param proxyHostname + * The hostname of the guacd instance to use, or null if the hostname + * of the default guacd instance should be used. + */ + public void setProxyHostname(String proxyHostname) { + this.proxyHostname = proxyHostname; + } + + /** + * Returns the port of the guacd instance to use. If the port of the default + * guacd instance should be used instead, null is returned. + * + * @return + * The port of the guacd instance to use, or null if the port of the + * default guacd instance should be used. + */ + public Integer getProxyPort() { + return proxyPort; + } + + /** + * Sets the port of the guacd instance to use. + * + * @param proxyPort + * The port of the guacd instance to use, or null if the port of the + * default guacd instance should be used. + */ + public void setProxyPort(Integer proxyPort) { + this.proxyPort = proxyPort; + } + + /** + * Returns the type of encryption required by the desired guacd instance. + * If the encryption method of the default guacd instance should be used + * instead, null is returned. + * + * @return + * The type of encryption required by the desired guacd instance, or + * null if the encryption method of the default guacd instance should + * be used. + */ + public EncryptionMethod getProxyEncryptionMethod() { + return proxyEncryptionMethod; + } + + /** + * Sets the type of encryption which should be used when connecting to + * guacd, if any. + * + * @param proxyEncryptionMethod + * The type of encryption required by the desired guacd instance, or + * null if the encryption method of the default guacd instance should + * be used. + */ + public void setProxyEncryptionMethod(EncryptionMethod proxyEncryptionMethod) { + this.proxyEncryptionMethod = proxyEncryptionMethod; + } + + /** + * Returns the identifiers of all readable sharing profiles associated with + * this connection. This is set only when the connection is queried, and has + * no effect when a connection is inserted, updated, or deleted. + * + * @return + * The identifiers of all readable sharing profiles associated with + * this connection. + */ + public Set getSharingProfileIdentifiers() { + return sharingProfileIdentifiers; + } + + /** + * Sets the identifiers of all readable sharing profiles associated with + * this connection. This should be set only when the connection is queried, + * as it has no effect when a connection is inserted, updated, or deleted. + * + * @param sharingProfileIdentifiers + * The identifiers of all readable sharing profiles associated with + * this connection. + */ + public void setSharingProfileIdentifiers(Set sharingProfileIdentifiers) { + this.sharingProfileIdentifiers = sharingProfileIdentifiers; + } + + /** + * Returns the date and time that this connection was last used, or null if + * this connection has never been used. + * + * @return + * The date and time that this connection was last used, or null if this + * connection has never been used. + */ + public Date getLastActive() { + return lastActive; + } + + /** + * Sets the date and time that this connection was last used. This value is + * expected to be set automatically via queries, derived from connection + * history records. It does NOT correspond to an actual column, and values + * set manually through invoking this function will not persist. + * + * @param lastActive + * The date and time that this connection was last used, or null if this + * connection has never been used. + */ + public void setLastActive(Date lastActive) { + this.lastActive = lastActive; + } + + @Override + public String getIdentifier() { + + // If no associated ID, then no associated identifier + Integer id = getObjectID(); + if (id == null) + return null; + + // Otherwise, the identifier is the ID as a string + return id.toString(); + + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("Connection identifiers are derived from IDs. They cannot be set."); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.java new file mode 100644 index 0000000..75ef1cf --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import java.util.Collection; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for connection parameter objects. + */ +public interface ConnectionParameterMapper { + + /** + * Returns a collection of all parameters associated with the connection + * having the given identifier. + * + * @param identifier + * The identifier of the connection whose parameters are to be + * retrieved. + * + * @return + * A collection of all parameters associated with the connection + * having the given identifier. This collection will be empty if no + * such connection exists. + */ + Collection select(@Param("identifier") String identifier); + + /** + * Inserts each of the parameter model objects in the given collection as + * new connection parameters. + * + * @param parameters + * The connection parameters to insert. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("parameters") Collection parameters); + + /** + * Deletes all parameters associated with the connection having the given + * identifier. + * + * @param identifier + * The identifier of the connection whose parameters should be + * deleted. + * + * @return + * The number of rows deleted. + */ + int delete(@Param("identifier") String identifier); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterModel.java new file mode 100644 index 0000000..a09bae2 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterModel.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +/** + * A single parameter name/value pair belonging to a connection. + */ +public class ConnectionParameterModel { + + /** + * The identifier of the connection associated with this parameter. + */ + private String connectionIdentifier; + + /** + * The name of the parameter. + */ + private String name; + + /** + * The value the parameter is set to. + */ + private String value; + + /** + * Returns the identifier of the connection associated with this parameter. + * + * @return + * The identifier of the connection associated with this parameter. + */ + public String getConnectionIdentifier() { + return connectionIdentifier; + } + + /** + * Sets the identifier of the connection associated with this parameter. + * + * @param connectionIdentifier + * The identifier of the connection to associate with this parameter. + */ + public void setConnectionIdentifier(String connectionIdentifier) { + this.connectionIdentifier = connectionIdentifier; + } + + /** + * Returns the name of this parameter. + * + * @return + * The name of this parameter. + */ + public String getName() { + return name; + } + + /** + * Sets the name of this parameter. + * + * @param name + * The name of this parameter. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the value of this parameter. + * + * @return + * The value of this parameter. + */ + public String getValue() { + return value; + } + + /** + * Sets the value of this parameter. + * + * @param value + * The value of this parameter. + */ + public void setValue(String value) { + this.value = value; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java new file mode 100644 index 0000000..34c9cfb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import org.apache.guacamole.auth.jdbc.base.ActivityRecordMapper; + +/** + * Mapper for connection record objects. + */ +public interface ConnectionRecordMapper extends ActivityRecordMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordModel.java new file mode 100644 index 0000000..29c5556 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordModel.java @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import org.apache.guacamole.auth.jdbc.base.ActivityRecordModel; + +/** + * A single connection record representing a past usage of a particular + * connection. If the connection was being shared, the sharing profile used to + * join the connection is included in the record. + */ +public class ConnectionRecordModel extends ActivityRecordModel { + + /** + * The identifier of the connection associated with this connection record. + */ + private String connectionIdentifier; + + /** + * The name of the connection associated with this connection record. + */ + private String connectionName; + + /** + * The identifier of the sharing profile associated with this connection + * record. If no sharing profile was used, or the sharing profile that was + * used was deleted, this will be null. + */ + private String sharingProfileIdentifier; + + /** + * The name of the sharing profile associated with this connection record. + * If no sharing profile was used, this will be null. If the sharing profile + * that was used was deleted, this will still contain the name of the + * sharing profile at the time that the connection was used. + */ + private String sharingProfileName; + + /** + * Returns the identifier of the connection associated with this connection + * record. + * + * @return + * The identifier of the connection associated with this connection + * record. + */ + public String getConnectionIdentifier() { + return connectionIdentifier; + } + + /** + * Sets the identifier of the connection associated with this connection + * record. + * + * @param connectionIdentifier + * The identifier of the connection to associate with this connection + * record. + */ + public void setConnectionIdentifier(String connectionIdentifier) { + this.connectionIdentifier = connectionIdentifier; + } + + + /** + * Returns the name of the connection associated with this connection + * record. + * + * @return + * The name of the connection associated with this connection + * record. + */ + public String getConnectionName() { + return connectionName; + } + + + /** + * Sets the name of the connection associated with this connection + * record. + * + * @param connectionName + * The name of the connection to associate with this connection + * record. + */ + public void setConnectionName(String connectionName) { + this.connectionName = connectionName; + } + + /** + * Returns the identifier of the sharing profile associated with this + * connection record. If no sharing profile was used, or the sharing profile + * that was used was deleted, this will be null. + * + * @return + * The identifier of the sharing profile associated with this connection + * record, or null if no sharing profile was used or if the sharing + * profile that was used was deleted. + */ + public String getSharingProfileIdentifier() { + return sharingProfileIdentifier; + } + + /** + * Sets the identifier of the sharing profile associated with this + * connection record. If no sharing profile was used, this should be null. + * + * @param sharingProfileIdentifier + * The identifier of the sharing profile associated with this + * connection record, or null if no sharing profile was used. + */ + public void setSharingProfileIdentifier(String sharingProfileIdentifier) { + this.sharingProfileIdentifier = sharingProfileIdentifier; + } + + /** + * Returns the human-readable name of the sharing profile associated with this + * connection record. If no sharing profile was used, this will be null. + * + * @return + * The human-readable name of the sharing profile associated with this + * connection record, or null if no sharing profile was used. + */ + public String getSharingProfileName() { + return sharingProfileName; + } + + /** + * Sets the human-readable name of the sharing profile associated with this + * connection record. If no sharing profile was used, this should be null. + * + * @param sharingProfileName + * The human-readable name of the sharing profile associated with this + * connection record, or null if no sharing profile was used. + */ + public void setSharingProfileName(String sharingProfileName) { + this.sharingProfileName = sharingProfileName; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java new file mode 100644 index 0000000..b788cab --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import com.google.inject.Inject; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSearchTerm; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSortPredicate; +import org.apache.guacamole.auth.jdbc.base.ModeledActivityRecordSet; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.ConnectionRecord; + +/** + * A JDBC implementation of ActivityRecordSet for ConnectionRecords. Calls to + * asCollection() will query connection history records from the database. Which + * records are returned will be determined by the values passed in earlier. + */ +public class ConnectionRecordSet extends ModeledActivityRecordSet { + + /** + * The namespace for the type 3 UUIDs generated for connection history + * records. This UUID namespace is itself a type 3 UUID within the "ns:OID" + * namespace for the OID "1.3.6.1.4.1.18060.18.2.1.2", which has been + * specifically allocated for Apache Guacamole database connection + * history records. + */ + public static final UUID UUID_NAMESPACE = UUID.fromString("8b55f070-95f4-3d31-93ee-9c5845e7aa40"); + + /** + * Service for managing connection objects. + */ + @Inject + private ConnectionService connectionService; + + /** + * The identifier of the connection to which this record set should be + * limited, if any. If null, the set should contain all records readable + * by the user making the request. + */ + private String identifier = null; + + /** + * Initializes this object, associating it with the current authenticated + * user and connection identifier. + * + * @param currentUser + * The user that created or retrieved this object. + * + * @param identifier + * The connection identifier to which this record set should be limited, + * or null if the record set should contain all records readable by the + * currentUser. + */ + protected void init(ModeledAuthenticatedUser currentUser, String identifier) { + super.init(currentUser); + this.identifier = identifier; + } + + @Override + protected List retrieveHistory( + AuthenticatedUser user, String recordIdentifier, + Set requiredContents, + List sortPredicates, + int limit) throws GuacamoleException { + + // Retrieve history from database + return connectionService.retrieveHistory(identifier, getCurrentUser(), + recordIdentifier, requiredContents, sortPredicates, limit); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java new file mode 100644 index 0000000..3297d7f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java @@ -0,0 +1,550 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSearchTerm; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSortPredicate; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.base.ModeledChildDirectoryObjectService; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.auth.jdbc.permission.ConnectionPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.language.TranslatableGuacamoleClientOverrunException; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating connections. + */ +public class ConnectionService extends ModeledChildDirectoryObjectService { + + /** + * Mapper for accessing connections. + */ + @Inject + private ConnectionMapper connectionMapper; + + /** + * Mapper for manipulating connection permissions. + */ + @Inject + private ConnectionPermissionMapper connectionPermissionMapper; + + /** + * Mapper for accessing connection parameters. + */ + @Inject + private ConnectionParameterMapper parameterMapper; + + /** + * Mapper for accessing connection history. + */ + @Inject + private ConnectionRecordMapper connectionRecordMapper; + + /** + * Provider for creating connections. + */ + @Inject + private Provider connectionProvider; + + /** + * The server environment for retrieving configuration. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * Known limit for the size of the connection parameter values. + */ + private static final int CONNECTION_PARAMETER_VALUE_LIMIT = 4096; + + @Override + protected ModeledDirectoryObjectMapper getObjectMapper() { + return connectionMapper; + } + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return connectionPermissionMapper; + } + + @Override + protected ModeledConnection getObjectInstance(ModeledAuthenticatedUser currentUser, + ConnectionModel model) { + ModeledConnection connection = connectionProvider.get(); + connection.init(currentUser, model); + return connection; + } + + @Override + protected ConnectionModel getModelInstance(ModeledAuthenticatedUser currentUser, + final Connection object) { + + // Create new ModeledConnection backed by blank model + ConnectionModel model = new ConnectionModel(); + ModeledConnection connection = getObjectInstance(currentUser, model); + + // Set model contents through ModeledConnection, copying the provided connection + connection.setParentIdentifier(object.getParentIdentifier()); + connection.setName(object.getName()); + connection.setConfiguration(object.getConfiguration()); + connection.setAttributes(object.getAttributes()); + + return model; + + } + + @Override + protected boolean hasCreatePermission(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return whether user has explicit connection creation permission + SystemPermissionSet permissionSet = user.getUser().getEffectivePermissions().getSystemPermissions(); + return permissionSet.hasPermission(SystemPermission.Type.CREATE_CONNECTION); + + } + + @Override + protected ObjectPermissionSet getEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return permissions related to connections + return user.getUser().getEffectivePermissions().getConnectionPermissions(); + + } + + @Override + protected ObjectPermissionSet getParentEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Connections are contained by connection groups + return user.getUser().getEffectivePermissions().getConnectionGroupPermissions(); + + } + + /** + * Validates that all connection parameter values are within the expected size limit. + * + * @param parameters + * The map of connection parameter name/value pairs to validate. + * + * @throws GuacamoleClientException + * If any of the parameter values exceed the defined limit. + */ + private void validateParameters(Map parameters) throws GuacamoleClientException { + // Iterate through each parameter to validate its size + for (Map.Entry parameter : parameters.entrySet()) { + String value = parameter.getValue(); + + // Check if parameter value exceeds size limit + if (value != null && value.length() > CONNECTION_PARAMETER_VALUE_LIMIT) { + + Map vars = new HashMap<>(); + vars.put("MAX_SIZE", CONNECTION_PARAMETER_VALUE_LIMIT); + vars.put("PARAMETER_NAME", parameter.getKey()); + + // Create a translatable message with the error key and substitution variables + TranslatableMessage translatableMessage = new TranslatableMessage( + "CONNECTION_PARAMETERS.DATABASE_PARAMETER_VALUE_TOO_LONG", + vars + ); + + throw new TranslatableGuacamoleClientOverrunException( + "The value provided for connection parameter \"" + parameter.getKey() + + "\" exceeds the maximum allowed length.", + translatableMessage + ); + } + } + } + + @Override + protected void beforeCreate(ModeledAuthenticatedUser user, + Connection object, ConnectionModel model) + throws GuacamoleException { + + // Validate parameters before saving + validateParameters(object.getConfiguration().getParameters()); + + super.beforeCreate(user, object, model); + + // Name must not be blank + if (model.getName() == null || model.getName().trim().isEmpty()) + throw new GuacamoleClientException("Connection names must not be blank."); + + // Do not attempt to create duplicate connections + ConnectionModel existing = connectionMapper.selectOneByName(model.getParentIdentifier(), model.getName()); + if (existing != null) + throw new GuacamoleClientException("The connection \"" + model.getName() + "\" already exists."); + + } + + @Override + protected void beforeUpdate(ModeledAuthenticatedUser user, + ModeledConnection object, ConnectionModel model) + throws GuacamoleException { + + // Validate parameters before saving + validateParameters(object.getConfiguration().getParameters()); + + super.beforeUpdate(user, object, model); + + // Name must not be blank + if (model.getName() == null || model.getName().trim().isEmpty()) + throw new GuacamoleClientException("Connection names must not be blank."); + + // Check whether such a connection is already present + ConnectionModel existing = connectionMapper.selectOneByName(model.getParentIdentifier(), model.getName()); + if (existing != null) { + + // If the specified name matches a DIFFERENT existing connection, the update cannot continue + if (!existing.getObjectID().equals(model.getObjectID())) + throw new GuacamoleClientException("The connection \"" + model.getName() + "\" already exists."); + + } + + } + + /** + * Given an arbitrary Guacamole connection, produces a collection of + * parameter model objects containing the name/value pairs of that + * connection's parameters. + * + * @param connection + * The connection whose configuration should be used to produce the + * collection of parameter models. + * + * @return + * A collection of parameter models containing the name/value pairs + * of the given connection's parameters. + */ + private Collection getParameterModels(ModeledConnection connection) { + + Map parameters = connection.getConfiguration().getParameters(); + + // Convert parameters to model objects + Collection parameterModels = new ArrayList<>(parameters.size()); + for (Map.Entry parameterEntry : parameters.entrySet()) { + + // Get parameter name and value + String name = parameterEntry.getKey(); + String value = parameterEntry.getValue(); + + // There is no need to insert empty parameters + if (value == null || value.isEmpty()) + continue; + + // Produce model object from parameter + ConnectionParameterModel model = new ConnectionParameterModel(); + model.setConnectionIdentifier(connection.getIdentifier()); + model.setName(name); + model.setValue(value); + + // Add model to list + parameterModels.add(model); + + } + + return parameterModels; + + } + + @Override + public ModeledConnection createObject(ModeledAuthenticatedUser user, Connection object) + throws GuacamoleException { + + // Create connection + ModeledConnection connection = super.createObject(user, object); + connection.setConfiguration(object.getConfiguration()); + + // Insert new parameters, if any + Collection parameterModels = getParameterModels(connection); + if (!parameterModels.isEmpty()) + parameterMapper.insert(parameterModels); + + return connection; + + } + + @Override + public void updateObject(ModeledAuthenticatedUser user, ModeledConnection object) + throws GuacamoleException { + + // Update connection + super.updateObject(user, object); + + // Replace existing parameters with new parameters, if any + Collection parameterModels = getParameterModels(object); + parameterMapper.delete(object.getIdentifier()); + if (!parameterModels.isEmpty()) + parameterMapper.insert(parameterModels); + + } + + /** + * Returns the set of all identifiers for all connections within the + * connection group having the given identifier. Only connections that the + * user has read access to will be returned. + * + * Permission to read the connection group having the given identifier is + * NOT checked. + * + * @param user + * The user retrieving the identifiers. + * + * @param identifier + * The identifier of the parent connection group, or null to check the + * root connection group. + * + * @return + * The set of all identifiers for all connections in the connection + * group having the given identifier that the user has read access to. + * + * @throws GuacamoleException + * If an error occurs while reading identifiers. + */ + public Set getIdentifiersWithin(ModeledAuthenticatedUser user, + String identifier) + throws GuacamoleException { + + // Bypass permission checks if the user is privileged + if (user.isPrivileged()) + return connectionMapper.selectIdentifiersWithin(identifier); + + // Otherwise only return explicitly readable identifiers + else + return connectionMapper.selectReadableIdentifiersWithin( + user.getUser().getModel(), identifier, + user.getEffectiveUserGroups(), + getCaseSensitivity()); + + } + + /** + * Retrieves all parameters visible to the given user and associated with + * the connection having the given identifier. If the given user has no + * access to such parameters, or no such connection exists, the returned + * map will be empty. + * + * @param user + * The user retrieving connection parameters. + * + * @param identifier + * The identifier of the connection whose parameters are being + * retrieved. + * + * @return + * A new map of all parameter name/value pairs that the given user has + * access to. + */ + public Map retrieveParameters(ModeledAuthenticatedUser user, + String identifier) { + + Map parameterMap = new HashMap<>(); + + // Determine whether we have permission to read parameters + boolean canRetrieveParameters; + try { + canRetrieveParameters = hasObjectPermission(user, identifier, + ObjectPermission.Type.UPDATE); + } + + // Provide empty (but mutable) map if unable to check permissions + catch (GuacamoleException e) { + return parameterMap; + } + + // Populate parameter map if we have permission to do so + if (canRetrieveParameters) { + for (ConnectionParameterModel parameter : parameterMapper.select(identifier)) + parameterMap.put(parameter.getName(), parameter.getValue()); + } + + return parameterMap; + + } + + /** + * Returns a connection records object which is backed by the given model. + * + * @param model + * The model object to use to back the returned connection record + * object. + * + * @return + * A connection record object which is backed by the given model. + */ + protected ConnectionRecord getObjectInstance(ConnectionRecordModel model) { + return new ModeledConnectionRecord(model); + } + + /** + * Returns a list of connection records objects which are backed by the + * models in the given list. + * + * @param models + * The model objects to use to back the connection record objects + * within the returned list. + * + * @return + * A list of connection record objects which are backed by the models + * in the given list. + */ + protected List getObjectInstances(List models) { + + // Create new list of records by manually converting each model + List objects = new ArrayList<>(models.size()); + for (ConnectionRecordModel model : models) + objects.add(getObjectInstance(model)); + + return objects; + + } + + /** + * Retrieves the connection history records matching the given criteria. + * Retrieves up to limit connection history records matching + * the given terms and sorted by the given predicates. Only history records + * associated with data that the given user can read are returned. + * + * @param identifier + * The optional connection identifier for which history records should + * be retrieved, or null if all readable records should be retrieved. + * + * @param user + * The user retrieving the connection history. + * + * @param recordIdentifier + * The identifier of the specific history record to retrieve, if not + * all matching records. Search terms, etc. will still be applied to + * the single record. + * + * @param requiredContents + * The search terms that must be contained somewhere within each of the + * returned records. + * + * @param sortPredicates + * A list of predicates to sort the returned records by, in order of + * priority. + * + * @param limit + * The maximum number of records that should be returned. + * + * @return + * The connection history of the given connection, including any + * active connections. + * + * @throws GuacamoleException + * If permission to read the connection history is denied. + */ + public List retrieveHistory(String identifier, + ModeledAuthenticatedUser user, String recordIdentifier, + Collection requiredContents, + List sortPredicates, int limit) + throws GuacamoleException { + + List searchResults; + + // Bypass permission checks if the user is privileged or has System-level audit permissions + if (user.isPrivileged() || user.getUser().getEffectivePermissions().getSystemPermissions().hasPermission(SystemPermission.Type.AUDIT)) + searchResults = connectionRecordMapper.search(identifier, + recordIdentifier, requiredContents, sortPredicates, limit, + getCaseSensitivity()); + + // Otherwise only return explicitly readable history records + else + searchResults = connectionRecordMapper.searchReadable(identifier, + user.getUser().getModel(), recordIdentifier, + requiredContents, sortPredicates, limit, + user.getEffectiveUserGroups(), + getCaseSensitivity()); + + return getObjectInstances(searchResults); + + } + + /** + * Connects to the given connection as the given user, using the given + * client information. If the user does not have permission to read the + * connection, permission will be denied. + * + * @param user + * The user connecting to the connection. + * + * @param connection + * The connection being connected to. + * + * @param info + * Information associated with the connecting client. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @return + * A connected GuacamoleTunnel associated with a newly-established + * connection. + * + * @throws GuacamoleException + * If permission to connect to this connection is denied. + */ + public GuacamoleTunnel connect(ModeledAuthenticatedUser user, + ModeledConnection connection, GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Connect only if READ permission is granted + if (hasObjectPermission(user, connection.getIdentifier(), ObjectPermission.Type.READ)) + return tunnelService.getGuacamoleTunnel(user, connection, info, tokens); + + // The user does not have permission to connect + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java new file mode 100644 index 0000000..20861ba --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java @@ -0,0 +1,508 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ModeledChildDirectoryObject; +import org.apache.guacamole.form.BooleanField; +import org.apache.guacamole.form.EnumField; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.form.NumericField; +import org.apache.guacamole.form.TextField; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration.EncryptionMethod; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * An implementation of the Connection object which is backed by a database + * model. + */ +public class ModeledConnection extends ModeledChildDirectoryObject + implements Connection { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ModeledConnection.class); + + /** + * The name of the attribute which overrides the hostname used to connect + * to guacd for this connection. + */ + public static final String GUACD_HOSTNAME_NAME = "guacd-hostname"; + + /** + * The name of the attribute which overrides the port used to connect to + * guacd for this connection. + */ + public static final String GUACD_PORT_NAME = "guacd-port"; + + /** + * The name of the attribute which overrides the encryption method used to + * connect to guacd for this connection. + */ + public static final String GUACD_ENCRYPTION_NAME = "guacd-encryption"; + + /** + * The value specified for the "guacd-encryption" attribute if encryption + * should not be used to connect to guacd. + */ + public static final String GUACD_ENCRYPTION_VALUE_NONE = "none"; + + /** + * The value specified for the "guacd-encryption" attribute if SSL/TLS + * encryption should be used to connect to guacd. + */ + public static final String GUACD_ENCRYPTION_VALUE_SSL = "ssl"; + + /** + * All attributes which describe the configuration of the guacd instance + * which will be used to connect to the remote desktop described by this + * connection. + */ + public static final Form GUACD_PARAMETERS = new Form("guacd", Arrays.asList( + new TextField(GUACD_HOSTNAME_NAME), + new NumericField(GUACD_PORT_NAME), + new EnumField(GUACD_ENCRYPTION_NAME, Arrays.asList( + "", + GUACD_ENCRYPTION_VALUE_NONE, + GUACD_ENCRYPTION_VALUE_SSL + )) + )); + + /** + * The name of the attribute which controls the maximum number of + * concurrent connections. + */ + public static final String MAX_CONNECTIONS_NAME = "max-connections"; + + /** + * The name of the attribute which controls the maximum number of + * concurrent connections per user. + */ + public static final String MAX_CONNECTIONS_PER_USER_NAME = "max-connections-per-user"; + + /** + * The connection weight attribute used for weighted load balancing algorithms. + */ + public static final String CONNECTION_WEIGHT = "weight"; + + /** + * The name of the attribute which controls whether the connection should + * be used as a spare only (all other non-spare connections within the same + * balancing group should be preferred). + */ + public static final String FAILOVER_ONLY_NAME = "failover-only"; + + /** + * All attributes related to restricting user accounts, within a logical + * form. + */ + public static final Form CONCURRENCY_LIMITS = new Form("concurrency", Arrays.asList( + new NumericField(MAX_CONNECTIONS_NAME), + new NumericField(MAX_CONNECTIONS_PER_USER_NAME) + )); + + /** + * All attributes related to load balancing in a logical form. + */ + public static final Form LOAD_BALANCING = new Form("load-balancing", Arrays.asList( + new NumericField(CONNECTION_WEIGHT), + new BooleanField(FAILOVER_ONLY_NAME, "true") + )); + + /** + * All possible attributes of connection objects organized as individual, + * logical forms. + */ + public static final Collection
ATTRIBUTES = Collections.unmodifiableCollection(Arrays.asList( + CONCURRENCY_LIMITS, + LOAD_BALANCING, + GUACD_PARAMETERS + )); + + /** + * The names of all attributes which are explicitly supported by this + * extension's Connection objects. + */ + public static final Set ATTRIBUTE_NAMES = + Collections.unmodifiableSet(new HashSet(Arrays.asList( + GUACD_HOSTNAME_NAME, + GUACD_PORT_NAME, + GUACD_ENCRYPTION_NAME, + MAX_CONNECTIONS_NAME, + MAX_CONNECTIONS_PER_USER_NAME, + CONNECTION_WEIGHT, + FAILOVER_ONLY_NAME + ))); + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Service for managing connections. + */ + @Inject + private ConnectionService connectionService; + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * Provider for lazy-loaded, permission-controlled configurations. + */ + @Inject + private Provider configProvider; + + /** + * Provider for creating connection record sets. + */ + @Inject + private Provider connectionRecordSetProvider; + + /** + * The manually-set GuacamoleConfiguration, if any. + */ + private GuacamoleConfiguration config = null; + + /** + * Creates a new, empty ModeledConnection. + */ + public ModeledConnection() { + } + + @Override + public String getName() { + return getModel().getName(); + } + + @Override + public void setName(String name) { + getModel().setName(name); + } + + @Override + public GuacamoleConfiguration getConfiguration() { + + // If configuration has been manually set, return that + if (config != null) + return config; + + // Otherwise, return permission-controlled configuration + ModeledGuacamoleConfiguration restrictedConfig = configProvider.get(); + restrictedConfig.init(getCurrentUser(), getModel()); + return restrictedConfig; + + } + + @Override + public void setConfiguration(GuacamoleConfiguration config) { + + // Store manually-set configuration internally + this.config = config; + + // Update model + getModel().setProtocol(config.getProtocol()); + + } + + @Override + public Set getSharingProfileIdentifiers() + throws GuacamoleException { + return getModel().getSharingProfileIdentifiers(); + } + + @Override + public Date getLastActive() { + return getModel().getLastActive(); + } + + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + ConnectionRecordSet connectionRecordSet = connectionRecordSetProvider.get(); + connectionRecordSet.init(getCurrentUser(), this.getIdentifier()); + return connectionRecordSet; + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + return connectionService.connect(getCurrentUser(), this, info, tokens); + } + + @Override + public int getActiveConnections() { + return tunnelService.getActiveConnections(this).size(); + } + + @Override + public Set getSupportedAttributeNames() { + return ATTRIBUTE_NAMES; + } + + @Override + public Map getAttributes() { + + // Include any defined arbitrary attributes + Map attributes = super.getAttributes(); + + // Set connection limit attribute + attributes.put(MAX_CONNECTIONS_NAME, NumericField.format(getModel().getMaxConnections())); + + // Set per-user connection limit attribute + attributes.put(MAX_CONNECTIONS_PER_USER_NAME, NumericField.format(getModel().getMaxConnectionsPerUser())); + + // Set guacd (proxy) hostname and port + attributes.put(GUACD_HOSTNAME_NAME, getModel().getProxyHostname()); + attributes.put(GUACD_PORT_NAME, NumericField.format(getModel().getProxyPort())); + + // Set guacd (proxy) encryption method + EncryptionMethod encryptionMethod = getModel().getProxyEncryptionMethod(); + if (encryptionMethod == null) + attributes.put(GUACD_ENCRYPTION_NAME, null); + + else { + switch (encryptionMethod) { + + // Unencrypted + case NONE: + attributes.put(GUACD_ENCRYPTION_NAME, GUACD_ENCRYPTION_VALUE_NONE); + break; + + // SSL / TLS encryption + case SSL: + attributes.put(GUACD_ENCRYPTION_NAME, GUACD_ENCRYPTION_VALUE_SSL); + break; + + // Unimplemented / unspecified + default: + attributes.put(GUACD_ENCRYPTION_NAME, null); + + } + } + + // Set connection weight + attributes.put(CONNECTION_WEIGHT, NumericField.format(getModel().getConnectionWeight())); + + // Set whether connection is failover-only + attributes.put(FAILOVER_ONLY_NAME, getModel().isFailoverOnly() ? "true" : null); + + return attributes; + } + + @Override + public void setAttributes(Map attributes) { + + // Set arbitrary attributes + super.setAttributes(attributes); + + // Translate connection limit attribute + try { getModel().setMaxConnections(NumericField.parse(attributes.get(MAX_CONNECTIONS_NAME))); } + catch (NumberFormatException e) { + logger.warn("Not setting maximum connections: {}", e.getMessage()); + logger.debug("Unable to parse numeric attribute.", e); + } + + // Translate per-user connection limit attribute + try { getModel().setMaxConnectionsPerUser(NumericField.parse(attributes.get(MAX_CONNECTIONS_PER_USER_NAME))); } + catch (NumberFormatException e) { + logger.warn("Not setting maximum connections per user: {}", e.getMessage()); + logger.debug("Unable to parse numeric attribute.", e); + } + + // Translate guacd hostname + getModel().setProxyHostname(TextField.parse(attributes.get(GUACD_HOSTNAME_NAME))); + + // Translate guacd port + try { getModel().setProxyPort(NumericField.parse(attributes.get(GUACD_PORT_NAME))); } + catch (NumberFormatException e) { + logger.warn("Not setting guacd port: {}", e.getMessage()); + logger.debug("Unable to parse numeric attribute.", e); + } + + // Translate guacd encryption method + String encryptionMethod = attributes.get(GUACD_ENCRYPTION_NAME); + + // Unencrypted + if (GUACD_ENCRYPTION_VALUE_NONE.equals(encryptionMethod)) + getModel().setProxyEncryptionMethod(EncryptionMethod.NONE); + + // SSL / TLS + else if (GUACD_ENCRYPTION_VALUE_SSL.equals(encryptionMethod)) + getModel().setProxyEncryptionMethod(EncryptionMethod.SSL); + + // Unimplemented / unspecified + else + getModel().setProxyEncryptionMethod(null); + + // Translate connection weight attribute + try { getModel().setConnectionWeight(NumericField.parse(attributes.get(CONNECTION_WEIGHT))); } + catch (NumberFormatException e) { + logger.warn("Not setting the connection weight: {}", e.getMessage()); + logger.debug("Unable to parse numeric attribute.", e); + } + + // Translate failover-only attribute + getModel().setFailoverOnly("true".equals(attributes.get(FAILOVER_ONLY_NAME))); + + } + + /** + * Returns the maximum number of connections that should be allowed to this + * connection overall. If no limit applies, zero is returned. + * + * @return + * The maximum number of connections that should be allowed to this + * connection overall, or zero if no limit applies. + * + * @throws GuacamoleException + * If an error occurs while parsing the concurrency limit properties + * specified within guacamole.properties. + */ + public int getMaxConnections() throws GuacamoleException { + + // Pull default from environment if connection limit is unset + Integer value = getModel().getMaxConnections(); + if (value == null) + return environment.getDefaultMaxConnections(); + + // Otherwise use defined value + return value; + + } + + /** + * Returns the maximum number of connections that should be allowed to this + * connection for any individual user. If no limit applies, zero is + * returned. + * + * @return + * The maximum number of connections that should be allowed to this + * connection for any individual user, or zero if no limit applies. + * + * @throws GuacamoleException + * If an error occurs while parsing the concurrency limit properties + * specified within guacamole.properties. + */ + public int getMaxConnectionsPerUser() throws GuacamoleException { + + // Pull default from environment if per-user connection limit is unset + Integer value = getModel().getMaxConnectionsPerUser(); + if (value == null) + return environment.getDefaultMaxConnectionsPerUser(); + + // Otherwise use defined value + return value; + + } + + /** + * Returns the connection information which should be used to connect to + * guacd when establishing a connection to the remote desktop described by + * this connection. If no such information is defined for this specific + * remote desktop connection, the default guacd connection information will + * be used instead, as defined by JDBCEnvironment. + * + * @return + * The connection information which should be used to connect to guacd + * when establishing a connection to the remote desktop described by + * this connection. + * + * @throws GuacamoleException + * If the connection information for guacd cannot be parsed. + */ + public GuacamoleProxyConfiguration getGuacamoleProxyConfiguration() + throws GuacamoleException { + + // Retrieve default proxy configuration from environment + GuacamoleProxyConfiguration defaultConfig = environment.getDefaultGuacamoleProxyConfiguration(); + + // Retrieve proxy configuration overrides from model + String hostname = getModel().getProxyHostname(); + Integer port = getModel().getProxyPort(); + EncryptionMethod encryptionMethod = getModel().getProxyEncryptionMethod(); + + // Produce new proxy configuration from model, using defaults where unspecified + return new GuacamoleProxyConfiguration( + hostname != null ? hostname : defaultConfig.getHostname(), + port != null ? port : defaultConfig.getPort(), + encryptionMethod != null ? encryptionMethod : defaultConfig.getEncryptionMethod() + ); + } + + /** + * Returns the weight of the connection used in applying weighted + * load balancing algorithms, or a default of 1 if the + * attribute is undefined. + * + * @return + * The weight of the connection used in applying weighted + * load balancing algorithms. + */ + public int getConnectionWeight() { + + Integer connectionWeight = getModel().getConnectionWeight(); + if (connectionWeight == null) + return 1; + return connectionWeight; + + } + + /** + * Returns whether this connection should be reserved for failover. + * Failover-only connections within a balancing group are only used when + * all non-failover connections are unavailable. + * + * @return + * true if this connection should be reserved for failover, false + * otherwise. + */ + public boolean isFailoverOnly() { + return getModel().isFailoverOnly(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnectionRecord.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnectionRecord.java new file mode 100644 index 0000000..9daa8f3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnectionRecord.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + + +import org.apache.guacamole.auth.jdbc.base.ModeledActivityRecord; +import org.apache.guacamole.net.auth.ConnectionRecord; + +/** + * A ConnectionRecord which is backed by a database model. + */ +public class ModeledConnectionRecord extends ModeledActivityRecord + implements ConnectionRecord { + + /** + * The model object backing this connection record. + */ + private final ConnectionRecordModel model; + + /** + * Creates a new ModeledConnectionRecord backed by the given model object. + * Changes to this record will affect the backing model object, and changes + * to the backing model object will affect this record. + * + * @param model + * The model object to use to back this connection record. + */ + public ModeledConnectionRecord(ConnectionRecordModel model) { + super(ConnectionRecordSet.UUID_NAMESPACE, model); + this.model = model; + } + + @Override + public String getConnectionIdentifier() { + return model.getConnectionIdentifier(); + } + + @Override + public String getConnectionName() { + return model.getConnectionName(); + } + + @Override + public String getSharingProfileIdentifier() { + return model.getSharingProfileIdentifier(); + } + + @Override + public String getSharingProfileName() { + return model.getSharingProfileName(); + } + + @Override + public ConnectionRecordModel getModel() { + return model; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledGuacamoleConfiguration.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledGuacamoleConfiguration.java new file mode 100644 index 0000000..f079bc7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledGuacamoleConfiguration.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connection; + +import com.google.inject.Inject; +import java.util.Map; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Implementation of GuacamoleConfiguration which loads parameter values only + * if necessary, and only if allowed. + */ +public class ModeledGuacamoleConfiguration extends GuacamoleConfiguration { + + /** + * The user this configuration belongs to. Access is based on his/her + * permission settings. + */ + private ModeledAuthenticatedUser currentUser; + + /** + * The internal model object containing the values which represent the + * connection associated with this configuration. + */ + private ConnectionModel connectionModel; + + /** + * Service for managing connection parameters. + */ + @Inject + private ConnectionService connectionService; + + /** + * The manually-set parameter map, if any. + */ + private Map parameters = null; + + /** + * Creates a new, empty ModelGuacamoleConfiguration. + */ + public ModeledGuacamoleConfiguration() { + } + + /** + * Initializes this configuration, associating it with the current + * authenticated user and populating it with data from the given model + * object. + * + * @param currentUser + * The user that created or retrieved this configuration. + * + * @param connectionModel + * The model object backing this configuration. + */ + public void init(ModeledAuthenticatedUser currentUser, ConnectionModel connectionModel) { + this.currentUser = currentUser; + this.connectionModel = connectionModel; + } + + @Override + public String getProtocol() { + return connectionModel.getProtocol(); + } + + @Override + public void setProtocol(String protocol) { + super.setProtocol(protocol); + connectionModel.setProtocol(protocol); + } + + + @Override + public void setParameters(Map parameters) { + this.parameters = parameters; + super.setParameters(parameters); + } + + @Override + public Map getParameters() { + + // Retrieve visible parameters, if not overridden by setParameters() + if (parameters == null) { + + // Retrieve all visible parameters + Map visibleParameters = + connectionService.retrieveParameters(currentUser, connectionModel.getIdentifier()); + + // Use retrieved parameters to back future operations + super.setParameters(visibleParameters); + + } + + return super.getParameters(); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/package-info.java new file mode 100644 index 0000000..0c0cd3d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to connections and their parameters and history. + */ +package org.apache.guacamole.auth.jdbc.connection; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupDirectory.java new file mode 100644 index 0000000..2e21dc2 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupDirectory.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connectiongroup; + + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.JDBCDirectory; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.mybatis.guice.transactional.Transactional; + +/** + * Implementation of the ConnectionGroup Directory which is driven by an + * underlying, arbitrary database. + */ +public class ConnectionGroupDirectory extends JDBCDirectory { + + /** + * Service for managing connection group objects. + */ + @Inject + private ConnectionGroupService connectionGroupService; + + @Override + public ConnectionGroup get(String identifier) throws GuacamoleException { + return connectionGroupService.retrieveObject(getCurrentUser(), identifier); + } + + @Override + @Transactional + public Collection getAll(Collection identifiers) throws GuacamoleException { + Collection objects = connectionGroupService.retrieveObjects(getCurrentUser(), identifiers); + return Collections.unmodifiableCollection(objects); + } + + @Override + @Transactional + public Set getIdentifiers() throws GuacamoleException { + return connectionGroupService.getIdentifiers(getCurrentUser()); + } + + @Override + @Transactional + public void add(ConnectionGroup object) throws GuacamoleException { + connectionGroupService.createObject(getCurrentUser(), object); + } + + @Override + @Transactional + public void update(ConnectionGroup object) throws GuacamoleException { + ModeledConnectionGroup connectionGroup = (ModeledConnectionGroup) object; + connectionGroupService.updateObject(getCurrentUser(), connectionGroup); + } + + @Override + @Transactional + public void remove(String identifier) throws GuacamoleException { + connectionGroupService.deleteObject(getCurrentUser(), identifier); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.java new file mode 100644 index 0000000..440a85f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connectiongroup; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.auth.jdbc.user.UserModel; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for connection group objects. + */ +public interface ConnectionGroupMapper extends ModeledDirectoryObjectMapper { + + /** + * Selects the identifiers of all connection groups within the given parent + * connection group, regardless of whether they are readable by any + * particular user. This should only be called on behalf of a system + * administrator. If identifiers are needed by a non-administrative user + * who must have explicit read rights, use + * selectReadableIdentifiersWithin() instead. + * + * @param parentIdentifier + * The identifier of the parent connection group, or null if the root + * connection group is to be queried. + * + * @return + * A Set containing all identifiers of all objects. + */ + Set selectIdentifiersWithin(@Param("parentIdentifier") String parentIdentifier); + + /** + * Selects the identifiers of all connection groups within the given parent + * connection group that are explicitly readable by the given user. If + * identifiers are needed by a system administrator (who, by definition, + * does not need explicit read rights), use selectIdentifiersWithin() + * instead. + * + * @param user + * The user whose permissions should determine whether an identifier + * is returned. + * + * @param parentIdentifier + * The identifier of the parent connection group, or null if the root + * connection group is to be queried. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @return + * A Set containing all identifiers of all readable objects. + */ + Set selectReadableIdentifiersWithin(@Param("user") UserModel user, + @Param("parentIdentifier") String parentIdentifier, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Selects the connection group within the given parent group and having + * the given name. If no such connection group exists, null is returned. + * + * @param parentIdentifier + * The identifier of the parent group to search within. + * + * @param name + * The name of the connection group to find. + * + * @return + * The connection group having the given name within the given parent + * group, or null if no such connection group exists. + */ + ConnectionGroupModel selectOneByName(@Param("parentIdentifier") String parentIdentifier, + @Param("name") String name); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java new file mode 100644 index 0000000..d58cc9b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java @@ -0,0 +1,275 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connectiongroup; + +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.base.ChildObjectModel; +import org.apache.guacamole.net.auth.ConnectionGroup; + +/** + * Object representation of a Guacamole connection group, as represented in the + * database. + */ +public class ConnectionGroupModel extends ChildObjectModel { + + /** + * The human-readable name associated with this connection group. + */ + private String name; + + /** + * The type of this connection group, such as organizational or balancing. + */ + private ConnectionGroup.Type type; + + /** + * The maximum number of connections that can be established to this + * connection group concurrently, zero if no restriction applies, or + * null if the default restrictions should be applied. + */ + private Integer maxConnections; + + /** + * The maximum number of connections that can be established to this + * connection group concurrently by any one user, zero if no restriction + * applies, or null if the default restrictions should be applied. + */ + private Integer maxConnectionsPerUser; + + /** + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + private boolean sessionAffinityEnabled; + + /** + * The identifiers of all readable child connections within this connection + * group. + */ + private Set connectionIdentifiers = new HashSet(); + + /** + * The identifiers of all readable child connection groups within this + * connection group. + */ + private Set connectionGroupIdentifiers = new HashSet(); + + /** + * Creates a new, empty connection group. + */ + public ConnectionGroupModel() { + } + + /** + * Returns the name associated with this connection group. + * + * @return + * The name associated with this connection group. + */ + public String getName() { + return name; + } + + /** + * Sets the name associated with this connection group. + * + * @param name + * The name to associate with this connection group. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the type of this connection group, such as organizational or + * balancing. + * + * @return + * The type of this connection group. + */ + public ConnectionGroup.Type getType() { + return type; + } + + /** + * Sets the type of this connection group, such as organizational or + * balancing. + * + * @param type + * The type of this connection group. + */ + public void setType(ConnectionGroup.Type type) { + this.type = type; + } + + /** + * Returns the maximum number of connections that can be established to + * this connection group concurrently. + * + * @return + * The maximum number of connections that can be established to this + * connection group concurrently, zero if no restriction applies, or + * null if the default restrictions should be applied. + */ + public Integer getMaxConnections() { + return maxConnections; + } + + /** + * Sets the maximum number of connections that can be established to this + * connection group concurrently. + * + * @param maxConnections + * The maximum number of connections that can be established to this + * connection group concurrently, zero if no restriction applies, or + * null if the default restrictions should be applied. + */ + public void setMaxConnections(Integer maxConnections) { + this.maxConnections = maxConnections; + } + + /** + * Returns the maximum number of connections that can be established to + * this connection group concurrently by any one user. + * + * @return + * The maximum number of connections that can be established to this + * connection group concurrently by any one user, zero if no + * restriction applies, or null if the default restrictions should be + * applied. + */ + public Integer getMaxConnectionsPerUser() { + return maxConnectionsPerUser; + } + + /** + * Sets the maximum number of connections that can be established to this + * connection group concurrently by any one user. + * + * @param maxConnectionsPerUser + * The maximum number of connections that can be established to this + * connection group concurrently by any one user, zero if no + * restriction applies, or null if the default restrictions should be + * applied. + */ + public void setMaxConnectionsPerUser(Integer maxConnectionsPerUser) { + this.maxConnectionsPerUser = maxConnectionsPerUser; + } + + /** + * Returns whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + * + * @return + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + public boolean isSessionAffinityEnabled() { + return sessionAffinityEnabled; + } + + /** + * Sets whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + * + * @param sessionAffinityEnabled + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + public void setSessionAffinityEnabled(boolean sessionAffinityEnabled) { + this.sessionAffinityEnabled = sessionAffinityEnabled; + } + + /** + * Returns the identifiers of all readable child connections within this + * connection group. This is set only when the parent connection group is + * queried, and has no effect when a connection group is inserted, updated, + * or deleted. + * + * @return + * The identifiers of all readable child connections within this + * connection group. + */ + public Set getConnectionIdentifiers() { + return connectionIdentifiers; + } + + /** + * Sets the identifiers of all readable child connections within this + * connection group. This should be set only when the parent connection + * group is queried, as it has no effect when a connection group is + * inserted, updated, or deleted. + * + * @param connectionIdentifiers + * The identifiers of all readable child connections within this + * connection group. + */ + public void setConnectionIdentifiers(Set connectionIdentifiers) { + this.connectionIdentifiers = connectionIdentifiers; + } + + /** + * Returns the identifiers of all readable child connection groups within + * this connection group. This is set only when the parent connection group + * is queried, and has no effect when a connection group is inserted, + * updated, or deleted. + * + * @return + * The identifiers of all readable child connection groups within this + * connection group. + */ + public Set getConnectionGroupIdentifiers() { + return connectionGroupIdentifiers; + } + + /** + * Sets the identifiers of all readable child connection groups within this + * connection group. This should be set only when the parent connection + * group is queried, as it has no effect when a connection group is + * inserted, updated, or deleted. + * + * @param connectionGroupIdentifiers + * The identifiers of all readable child connection groups within this + * connection group. + */ + public void setConnectionGroupIdentifiers(Set connectionGroupIdentifiers) { + this.connectionGroupIdentifiers = connectionGroupIdentifiers; + } + + @Override + public String getIdentifier() { + + // If no associated ID, then no associated identifier + Integer id = getObjectID(); + if (id == null) + return null; + + // Otherwise, the identifier is the ID as a string + return id.toString(); + + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("Connection group identifiers are derived from IDs. They cannot be set."); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java new file mode 100644 index 0000000..0c106c2 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java @@ -0,0 +1,272 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connectiongroup; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.auth.jdbc.base.ModeledChildDirectoryObjectService; +import org.apache.guacamole.auth.jdbc.permission.ConnectionGroupPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating connection groups. + */ +public class ConnectionGroupService extends ModeledChildDirectoryObjectService { + + /** + * Mapper for accessing connection groups. + */ + @Inject + private ConnectionGroupMapper connectionGroupMapper; + + /** + * Mapper for manipulating connection group permissions. + */ + @Inject + private ConnectionGroupPermissionMapper connectionGroupPermissionMapper; + + /** + * Provider for creating connection groups. + */ + @Inject + private Provider connectionGroupProvider; + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + @Override + protected ModeledDirectoryObjectMapper getObjectMapper() { + return connectionGroupMapper; + } + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return connectionGroupPermissionMapper; + } + + @Override + protected ModeledConnectionGroup getObjectInstance(ModeledAuthenticatedUser currentUser, + ConnectionGroupModel model) { + ModeledConnectionGroup connectionGroup = connectionGroupProvider.get(); + connectionGroup.init(currentUser, model); + return connectionGroup; + } + + @Override + protected ConnectionGroupModel getModelInstance(ModeledAuthenticatedUser currentUser, + final ConnectionGroup object) { + + // Create new ModeledConnectionGroup backed by blank model + ConnectionGroupModel model = new ConnectionGroupModel(); + ModeledConnectionGroup connectionGroup = getObjectInstance(currentUser, model); + + // Set model contents through ModeledConnectionGroup, copying the provided connection group + connectionGroup.setParentIdentifier(object.getParentIdentifier()); + connectionGroup.setName(object.getName()); + connectionGroup.setType(object.getType()); + connectionGroup.setAttributes(object.getAttributes()); + + return model; + + } + + @Override + protected boolean hasCreatePermission(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return whether user has explicit connection group creation permission + SystemPermissionSet permissionSet = user.getUser().getEffectivePermissions().getSystemPermissions(); + return permissionSet.hasPermission(SystemPermission.Type.CREATE_CONNECTION_GROUP); + + } + + @Override + protected ObjectPermissionSet getEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return permissions related to connection groups + return user.getUser().getEffectivePermissions().getConnectionGroupPermissions(); + + } + + @Override + protected ObjectPermissionSet getParentEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Connection groups are contained by other connection groups + return user.getUser().getEffectivePermissions().getConnectionGroupPermissions(); + + } + + @Override + protected void beforeCreate(ModeledAuthenticatedUser user, + ConnectionGroup object, ConnectionGroupModel model) + throws GuacamoleException { + + super.beforeCreate(user, object, model); + + // Name must not be blank + if (model.getName() == null || model.getName().trim().isEmpty()) + throw new GuacamoleClientException("Connection group names must not be blank."); + + // Do not attempt to create duplicate connection groups + ConnectionGroupModel existing = connectionGroupMapper.selectOneByName(model.getParentIdentifier(), model.getName()); + if (existing != null) + throw new GuacamoleClientException("The connection group \"" + model.getName() + "\" already exists."); + + } + + @Override + protected void beforeUpdate(ModeledAuthenticatedUser user, + ModeledConnectionGroup object, ConnectionGroupModel model) + throws GuacamoleException { + + super.beforeUpdate(user, object, model); + + // Name must not be blank + if (model.getName() == null || model.getName().trim().isEmpty()) + throw new GuacamoleClientException("Connection group names must not be blank."); + + // Check whether such a connection group is already present + ConnectionGroupModel existing = connectionGroupMapper.selectOneByName(model.getParentIdentifier(), model.getName()); + if (existing != null) { + + // If the specified name matches a DIFFERENT existing connection group, the update cannot continue + if (!existing.getObjectID().equals(model.getObjectID())) + throw new GuacamoleClientException("The connection group \"" + model.getName() + "\" already exists."); + + } + + // Verify that this connection group's location does not create a cycle + String relativeParentIdentifier = model.getParentIdentifier(); + while (relativeParentIdentifier != null) { + + // Abort if cycle is detected + if (relativeParentIdentifier.equals(model.getIdentifier())) + throw new GuacamoleUnsupportedException("A connection group may not contain itself."); + + // Advance to next parent + ModeledConnectionGroup relativeParentGroup = retrieveObject(user, relativeParentIdentifier); + relativeParentIdentifier = relativeParentGroup.getModel().getParentIdentifier(); + + } + + } + + /** + * Returns the set of all identifiers for all connection groups within the + * connection group having the given identifier. Only connection groups + * that the user has read access to will be returned. + * + * Permission to read the connection group having the given identifier is + * NOT checked. + * + * @param user + * The user retrieving the identifiers. + * + * @param identifier + * The identifier of the parent connection group, or null to check the + * root connection group. + * + * @return + * The set of all identifiers for all connection groups in the + * connection group having the given identifier that the user has read + * access to. + * + * @throws GuacamoleException + * If an error occurs while reading identifiers. + */ + public Set getIdentifiersWithin(ModeledAuthenticatedUser user, + String identifier) + throws GuacamoleException { + + // Bypass permission checks if the user is privileged + if (user.isPrivileged()) + return connectionGroupMapper.selectIdentifiersWithin(identifier); + + // Otherwise only return explicitly readable identifiers + else + return connectionGroupMapper.selectReadableIdentifiersWithin( + user.getUser().getModel(), identifier, + user.getEffectiveUserGroups(), + getCaseSensitivity()); + + } + + /** + * Connects to the given connection group as the given user, using the + * given client information. If the user does not have permission to read + * the connection group, permission will be denied. + * + * @param user + * The user connecting to the connection group. + * + * @param connectionGroup + * The connectionGroup being connected to. + * + * @param info + * Information associated with the connecting client. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @return + * A connected GuacamoleTunnel associated with a newly-established + * connection. + * + * @throws GuacamoleException + * If permission to connect to this connection is denied. + */ + public GuacamoleTunnel connect(ModeledAuthenticatedUser user, + ModeledConnectionGroup connectionGroup, GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Connect only if READ permission is granted + if (hasObjectPermission(user, connectionGroup.getIdentifier(), ObjectPermission.Type.READ)) + return tunnelService.getGuacamoleTunnel(user, connectionGroup, info, tokens); + + // The user does not have permission to connect + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java new file mode 100644 index 0000000..bcf457a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java @@ -0,0 +1,282 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connectiongroup; + +import com.google.inject.Inject; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ModeledChildDirectoryObject; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.form.BooleanField; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.form.NumericField; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * An implementation of the ConnectionGroup object which is backed by a + * database model. + */ +public class ModeledConnectionGroup extends ModeledChildDirectoryObject + implements ConnectionGroup { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ModeledConnectionGroup.class); + + /** + * The name of the attribute which controls the maximum number of + * concurrent connections. + */ + public static final String MAX_CONNECTIONS_NAME = "max-connections"; + + /** + * The name of the attribute which controls the maximum number of + * concurrent connections per user. + */ + public static final String MAX_CONNECTIONS_PER_USER_NAME = "max-connections-per-user"; + + /** + * The name of the attribute which controls whether individual users will be + * consistently assigned the same connection within a balancing group until + * they log out. + */ + public static final String ENABLE_SESSION_AFFINITY = "enable-session-affinity"; + + /** + * All attributes related to restricting user accounts, within a logical + * form. + */ + public static final Form CONCURRENCY_LIMITS = new Form("concurrency", Arrays.asList( + new NumericField(MAX_CONNECTIONS_NAME), + new NumericField(MAX_CONNECTIONS_PER_USER_NAME), + new BooleanField(ENABLE_SESSION_AFFINITY, "true") + )); + + /** + * All possible attributes of connection group objects organized as + * individual, logical forms. + */ + public static final Collection ATTRIBUTES = Collections.unmodifiableCollection(Arrays.asList( + CONCURRENCY_LIMITS + )); + + /** + * The names of all attributes which are explicitly supported by this + * extension's ConnectionGroup objects. + */ + public static final Set ATTRIBUTE_NAMES = + Collections.unmodifiableSet(new HashSet(Arrays.asList( + MAX_CONNECTIONS_NAME, + MAX_CONNECTIONS_PER_USER_NAME, + ENABLE_SESSION_AFFINITY + ))); + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Service for managing connection groups. + */ + @Inject + private ConnectionGroupService connectionGroupService; + + /** + * Service for creating and tracking tunnels. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * Creates a new, empty ModeledConnectionGroup. + */ + public ModeledConnectionGroup() { + } + + @Override + public String getName() { + return getModel().getName(); + } + + @Override + public void setName(String name) { + getModel().setName(name); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + return connectionGroupService.connect(getCurrentUser(), this, info, tokens); + } + + @Override + public int getActiveConnections() { + return tunnelService.getActiveConnections(this).size(); + } + + @Override + public void setType(Type type) { + getModel().setType(type); + } + + @Override + public Type getType() { + return getModel().getType(); + } + + @Override + public Set getConnectionIdentifiers() + throws GuacamoleException { + return getModel().getConnectionIdentifiers(); + } + + @Override + public Set getConnectionGroupIdentifiers() + throws GuacamoleException { + return getModel().getConnectionGroupIdentifiers(); + } + + @Override + public Set getSupportedAttributeNames() { + return ATTRIBUTE_NAMES; + } + + @Override + public Map getAttributes() { + + // Include any defined arbitrary attributes + Map attributes = super.getAttributes(); + + // Set connection limit attribute + attributes.put(MAX_CONNECTIONS_NAME, NumericField.format(getModel().getMaxConnections())); + + // Set per-user connection limit attribute + attributes.put(MAX_CONNECTIONS_PER_USER_NAME, NumericField.format(getModel().getMaxConnectionsPerUser())); + + // Set session affinity attribute + attributes.put(ENABLE_SESSION_AFFINITY, + getModel().isSessionAffinityEnabled() ? "true" : ""); + + return attributes; + } + + @Override + public void setAttributes(Map attributes) { + + // Set arbitrary attributes + super.setAttributes(attributes); + + // Translate connection limit attribute + try { getModel().setMaxConnections(NumericField.parse(attributes.get(MAX_CONNECTIONS_NAME))); } + catch (NumberFormatException e) { + logger.warn("Not setting maximum connections: {}", e.getMessage()); + logger.debug("Unable to parse numeric attribute.", e); + } + + // Translate per-user connection limit attribute + try { getModel().setMaxConnectionsPerUser(NumericField.parse(attributes.get(MAX_CONNECTIONS_PER_USER_NAME))); } + catch (NumberFormatException e) { + logger.warn("Not setting maximum connections per user: {}", e.getMessage()); + logger.debug("Unable to parse numeric attribute.", e); + } + + // Translate session affinity attribute + getModel().setSessionAffinityEnabled( + "true".equals(attributes.get(ENABLE_SESSION_AFFINITY))); + + } + + /** + * Returns the maximum number of connections that should be allowed to this + * connection group overall. If no limit applies, zero is returned. + * + * @return + * The maximum number of connections that should be allowed to this + * connection group overall, or zero if no limit applies. + * + * @throws GuacamoleException + * If an error occurs while parsing the concurrency limit properties + * specified within guacamole.properties. + */ + public int getMaxConnections() throws GuacamoleException { + + // Pull default from environment if connection limit is unset + Integer value = getModel().getMaxConnections(); + if (value == null) + return environment.getDefaultMaxGroupConnections(); + + // Otherwise use defined value + return value; + + } + + /** + * Returns the maximum number of connections that should be allowed to this + * connection group for any individual user. If no limit applies, zero is + * returned. + * + * @return + * The maximum number of connections that should be allowed to this + * connection group for any individual user, or zero if no limit + * applies. + * + * @throws GuacamoleException + * If an error occurs while parsing the concurrency limit properties + * specified within guacamole.properties. + */ + public int getMaxConnectionsPerUser() throws GuacamoleException { + + // Pull default from environment if per-user connection limit is unset + Integer value = getModel().getMaxConnectionsPerUser(); + if (value == null) + return environment.getDefaultMaxGroupConnectionsPerUser(); + + // Otherwise use defined value + return value; + + } + + /** + * Returns whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + * + * @return + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + public boolean isSessionAffinityEnabled() { + return getModel().isSessionAffinityEnabled(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/RootConnectionGroup.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/RootConnectionGroup.java new file mode 100644 index 0000000..08b32fd --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/RootConnectionGroup.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.connectiongroup; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.connection.ConnectionService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.base.RestrictedObject; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * The root connection group, here represented as its own dedicated object as + * the database does not contain an actual root group. + */ +public class RootConnectionGroup extends RestrictedObject + implements ConnectionGroup { + + /** + * The identifier used to represent the root connection group. There is no + * corresponding entry in the database, thus a reserved identifier that + * cannot collide with database-generated identifiers is needed. + */ + public static final String IDENTIFIER = "ROOT"; + + /** + * The human-readable name of this connection group. The name of the root + * group is not normally visible, and may even be replaced by the web + * interface for the sake of translation. + */ + public static final String NAME = "ROOT"; + + /** + * Service for managing connection objects. + */ + @Inject + private ConnectionService connectionService; + + /** + * Service for managing connection group objects. + */ + @Inject + private ConnectionGroupService connectionGroupService; + + /** + * Creates a new, empty RootConnectionGroup. + */ + public RootConnectionGroup() { + } + + @Override + public String getName() { + return NAME; + } + + @Override + public void setName(String name) { + throw new UnsupportedOperationException("The root connection group cannot be modified."); + } + + @Override + public String getParentIdentifier() { + return null; + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + throw new UnsupportedOperationException("The root connection group cannot be modified."); + } + + @Override + public Type getType() { + return ConnectionGroup.Type.ORGANIZATIONAL; + } + + @Override + public void setType(Type type) { + throw new UnsupportedOperationException("The root connection group cannot be modified."); + } + + @Override + public Set getConnectionIdentifiers() throws GuacamoleException { + return connectionService.getIdentifiersWithin(getCurrentUser(), null); + } + + @Override + public Set getConnectionGroupIdentifiers() + throws GuacamoleException { + return connectionGroupService.getIdentifiersWithin(getCurrentUser(), null); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("The root connection group cannot be modified."); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public int getActiveConnections() { + return 0; + } + + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + throw new UnsupportedOperationException("The root connection group cannot be modified."); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/package-info.java new file mode 100644 index 0000000..8e37028 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to connection groups. + */ +package org.apache.guacamole.auth.jdbc.connectiongroup; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/package-info.java new file mode 100644 index 0000000..268d3d2 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/package-info.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The base JDBC authentication provider. This authentication provider serves + * as a basis for other JDBC authentication provider implementations which are + * driven by relatively-common schemas. The only difference between such + * implementations are maintained within database-specific MyBatis mappings. + */ +package org.apache.guacamole.auth.jdbc; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/AbstractPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/AbstractPermissionService.java new file mode 100644 index 0000000..eb320bd --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/AbstractPermissionService.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.auth.jdbc.user.ModeledUser; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.Permission; +import org.apache.guacamole.net.auth.permission.PermissionSet; + +/** + * Abstract PermissionService implementation which provides additional + * convenience methods for enforcing the permission model. + * + * @param + * The type of permission sets this service provides access to. + * + * @param + * The type of permission this service provides access to. + */ +public abstract class AbstractPermissionService, + PermissionType extends Permission> + implements PermissionService { + + /** + * Returns the ObjectPermissionSet related to the type of the given entity. + * If the given entity represents a user, then the ObjectPermissionSet + * containing user permissions is returned. If the given entity represents + * a user group, then the ObjectPermissionSet containing user group + * permissions is returned. + * + * @param user + * The user to retrieve the ObjectPermissionSet from. + * + * @param targetEntity + * The entity whose type dictates the ObjectPermissionSet returned. + * + * @return + * The ObjectPermissionSet related to the type of the given entity. + * + * @throws GuacamoleException + * If the relevant ObjectPermissionSet cannot be retrieved. + */ + protected ObjectPermissionSet getRelevantPermissionSet(ModeledUser user, + ModeledPermissions targetEntity) + throws GuacamoleException { + + if (targetEntity.isUser()) + return user.getUserPermissions(); + + if (targetEntity.isUserGroup()) + return user.getUserGroupPermissions(); + + // Entities should be only users or groups + throw new UnsupportedOperationException("Unexpected entity type."); + + } + + /** + * Determines whether the given user can read the permissions currently + * granted to the given target entity. If the reading user and the target + * entity are not the same, then explicit READ or SYSTEM_ADMINISTER access + * is required. Permission inheritance via user groups is taken into account. + * + * @param user + * The user attempting to read permissions. + * + * @param targetEntity + * The entity whose permissions are being read. + * + * @return + * true if permission is granted, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while checking permission status, or if + * permission is denied to read the current user's permissions. + */ + protected boolean canReadPermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity) + throws GuacamoleException { + + // A user can always read their own permissions + if (targetEntity.isUser(user.getUser().getIdentifier())) + return true; + + // Privileged users (such as system administrators) may do anything + if (user.isPrivileged()) + return true; + + // Can read permissions on target entity if explicit READ is granted + ObjectPermissionSet permissionSet = getRelevantPermissionSet(user.getUser(), targetEntity); + return permissionSet.hasPermission(ObjectPermission.Type.READ, targetEntity.getIdentifier()); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.java new file mode 100644 index 0000000..2843dd8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +/** + * Mapper for connection group permissions. + */ +public interface ConnectionGroupPermissionMapper extends ObjectPermissionMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionService.java new file mode 100644 index 0000000..d0f1f0b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionService.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting connection group permissions. This service will automatically + * enforce the permissions of the current user. + */ +public class ConnectionGroupPermissionService extends ModeledObjectPermissionService { + + /** + * Mapper for connection group permissions. + */ + @Inject + private ConnectionGroupPermissionMapper connectionGroupPermissionMapper; + + /** + * Provider for connection group permission sets. + */ + @Inject + private Provider connectionGroupPermissionSetProvider; + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return connectionGroupPermissionMapper; + } + + @Override + public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + ObjectPermissionSet permissionSet = connectionGroupPermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionSet.java new file mode 100644 index 0000000..1dac17d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionSet.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; + +/** + * A database implementation of ObjectPermissionSet which uses an injected + * service to query and manipulate the connection group permissions associated + * with a particular user. + */ +public class ConnectionGroupPermissionSet extends ObjectPermissionSet { + + /** + * Service for querying and manipulating connection group permissions. + */ + @Inject + private ConnectionGroupPermissionService connectionGroupPermissionService; + + @Override + protected ObjectPermissionService getObjectPermissionService() { + return connectionGroupPermissionService; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.java new file mode 100644 index 0000000..3cd8e72 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +/** + * Mapper for connection permissions. + */ +public interface ConnectionPermissionMapper extends ObjectPermissionMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java new file mode 100644 index 0000000..1dc70ad --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting connection permissions. This service will automatically enforce the + * permissions of the current user. + */ +public class ConnectionPermissionService extends ModeledObjectPermissionService { + + /** + * Mapper for connection permissions. + */ + @Inject + private ConnectionPermissionMapper connectionPermissionMapper; + + /** + * Provider for connection permission sets. + */ + @Inject + private Provider connectionPermissionSetProvider; + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return connectionPermissionMapper; + } + + @Override + public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + ObjectPermissionSet permissionSet = connectionPermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionSet.java new file mode 100644 index 0000000..e4e1836 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionSet.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; + +/** + * A database implementation of ObjectPermissionSet which uses an injected + * service to query and manipulate the connection permissions associated with + * a particular user. + */ +public class ConnectionPermissionSet extends ObjectPermissionSet { + + /** + * Service for querying and manipulating connection permissions. + */ + @Inject + private ConnectionPermissionService connectionPermissionService; + + @Override + protected ObjectPermissionService getObjectPermissionService() { + return connectionPermissionService; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java new file mode 100644 index 0000000..9f224c8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java @@ -0,0 +1,220 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting object permissions within a backend database model. This service + * will automatically enforce the permissions of the current user. + */ +public abstract class ModeledObjectPermissionService + extends ModeledPermissionService + implements ObjectPermissionService { + + @Override + protected abstract ObjectPermissionMapper getPermissionMapper(); + + @Override + protected ObjectPermission getPermissionInstance(ObjectPermissionModel model) { + return new ObjectPermission(model.getType(), model.getObjectIdentifier()); + } + + @Override + protected ObjectPermissionModel getModelInstance( + ModeledPermissions targetEntity, + ObjectPermission permission) { + + ObjectPermissionModel model = new ObjectPermissionModel(); + + // Populate model object with data from entity and permission + model.setEntityID(targetEntity.getModel().getEntityID()); + model.setType(permission.getType()); + model.setObjectIdentifier(permission.getObjectIdentifier()); + + return model; + + } + + /** + * Determines whether the current user has permission to update the given + * target entity, adding or removing the given permissions. Such permission + * depends on whether the current user is a system administrator, whether + * they have explicit UPDATE permission on the target entity, and whether + * they have explicit ADMINISTER permission on all affected objects. + * Permission inheritance via user groups is taken into account. + * + * @param user + * The user who is changing permissions. + * + * @param targetEntity + * The entity whose permissions are being changed. + * + * @param permissions + * The permissions that are being added or removed from the target + * entity. + * + * @return + * true if the user has permission to change the target entity's + * permissions as specified, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while checking permission status, or if + * permission is denied to read the current user's permissions. + */ + protected boolean canAlterPermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException { + + // Privileged users (such as system administrators) may do anything + if (user.isPrivileged()) + return true; + + // Verify user has update permission on the target entity + ObjectPermissionSet permissionSet = getRelevantPermissionSet(user.getUser(), targetEntity); + if (!permissionSet.hasPermission(ObjectPermission.Type.UPDATE, targetEntity.getIdentifier())) + return false; + + // Produce collection of affected identifiers + Collection affectedIdentifiers = new HashSet(permissions.size()); + for (ObjectPermission permission : permissions) + affectedIdentifiers.add(permission.getObjectIdentifier()); + + // Determine subset of affected identifiers that we have admin access to + ObjectPermissionSet affectedPermissionSet = getPermissionSet(user, user.getUser(), user.getEffectiveUserGroups()); + Collection allowedSubset = affectedPermissionSet.getAccessibleObjects( + Collections.singleton(ObjectPermission.Type.ADMINISTER), + affectedIdentifiers + ); + + // The permissions can be altered if and only if the set of objects we + // are allowed to administer is equal to the set of objects we will be + // affecting. + + return affectedIdentifiers.size() == allowedSubset.size(); + + } + + @Override + public void createPermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException { + + // Create permissions only if user has permission to do so + if (canAlterPermissions(user, targetEntity, permissions)) { + + CaseSensitivity caseSensitivity = getCaseSensitivity(); + + batchPermissionUpdates(permissions, permissionSubset -> { + Collection models = getModelInstances( + targetEntity, permissionSubset); + getPermissionMapper().insert(models, caseSensitivity); + }); + + return; + } + + // User lacks permission to create object permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public void deletePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException { + + // Delete permissions only if user has permission to do so + if (canAlterPermissions(user, targetEntity, permissions)) { + + CaseSensitivity caseSensitivity = getCaseSensitivity(); + + batchPermissionUpdates(permissions, permissionSubset -> { + Collection models = getModelInstances( + targetEntity, permissionSubset); + getPermissionMapper().delete(models, caseSensitivity); + }); + + return; + } + + // User lacks permission to delete object permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public boolean hasPermission(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + ObjectPermission.Type type, String identifier, + Set effectiveGroups) throws GuacamoleException { + + // Retrieve permissions only if allowed + if (canReadPermissions(user, targetEntity)) + return getPermissionMapper().selectOne(targetEntity.getModel(), + type, identifier, effectiveGroups, getCaseSensitivity()) != null; + + // User cannot read this entity's permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public Collection retrieveAccessibleIdentifiers(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions, + Collection identifiers, Set effectiveGroups) + throws GuacamoleException { + + // Nothing is always accessible + if (identifiers.isEmpty()) + return identifiers; + + // Privileged users (such as system administrators) may access everything + if (user.isPrivileged()) + return identifiers; + + // Otherwise, return explicitly-retrievable identifiers only if allowed + if (canReadPermissions(user, targetEntity)) + return getPermissionMapper().selectAccessibleIdentifiers( + targetEntity.getModel(), permissions, identifiers, + effectiveGroups, getCaseSensitivity()); + + // User cannot read this entity's permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java new file mode 100644 index 0000000..577b713 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; + +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.net.auth.permission.Permission; +import org.apache.guacamole.net.auth.permission.PermissionSet; + +import com.google.common.collect.Iterables; +import com.google.inject.Inject; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting permissions within a backend database model, and for obtaining the + * permission sets that contain these permissions. This service will + * automatically enforce the permissions of the current user. + * + * @param + * The type of permission sets this service provides access to. + * + * @param + * The type of permission this service provides access to. + * + * @param + * The underlying model object used to represent PermissionType in the + * database. + */ +public abstract class ModeledPermissionService, + PermissionType extends Permission, ModelType> + extends AbstractPermissionService { + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Returns an instance of a mapper for the type of permission used by this + * service. + * + * @return + * A mapper which provides access to the model objects associated with + * the permissions used by this service. + */ + protected abstract PermissionMapper getPermissionMapper(); + + /** + * Returns an instance of a permission which is based on the given model + * object. + * + * @param model + * The model object to use to produce the returned permission. + * + * @return + * A permission which is based on the given model object. + */ + protected abstract PermissionType getPermissionInstance(ModelType model); + + /** + * Returns a collection of permissions which are based on the models in + * the given collection. + * + * @param models + * The model objects to use to produce the permissions within the + * returned set. + * + * @return + * A set of permissions which are based on the models in the given + * collection. + */ + protected Set getPermissionInstances(Collection models) { + + // Create new collection of permissions by manually converting each model + Set permissions = new HashSet(models.size()); + for (ModelType model : models) + permissions.add(getPermissionInstance(model)); + + return permissions; + + } + + /** + * Returns an instance of a model object which is based on the given + * permission and target entity. + * + * @param targetEntity + * The entity to whom this permission is granted. + * + * @param permission + * The permission to use to produce the returned model object. + * + * @return + * A model object which is based on the given permission and target + * entity. + */ + protected abstract ModelType getModelInstance( + ModeledPermissions targetEntity, + PermissionType permission); + + /** + * Returns a collection of model objects which are based on the given + * permissions and target entity. + * + * @param targetEntity + * The entity to whom this permission is granted. + * + * @param permissions + * The permissions to use to produce the returned model objects. + * + * @return + * A collection of model objects which are based on the given + * permissions and target entity. + */ + protected Collection getModelInstances( + ModeledPermissions targetEntity, + Collection permissions) { + + // Create new collection of models by manually converting each permission + Collection models = new ArrayList(permissions.size()); + for (PermissionType permission : permissions) + models.add(getModelInstance(targetEntity, permission)); + + return models; + + } + + /** + * Runs the provided consumer function on subsets of the original collection + * of objects, with each subset being no larger than the maximum batch size + * configured for the JDBC environment. Any permission update that involves + * passing potentially-large lists of models to a mapper should use this + * method to perform the update to ensure that the maximum number of + * parameters for an individual query is not exceeded. + * + * @param + * The type of object stored in the provided objects list, and consumed + * by the provided consumer. + * + * @param objects + * A collection of objects to be partitioned. + * + * @param consumer + * A function that will consume subsets of the objects from the provided + * collection of objects, performing any update as needed. + * + * @throws GuacamoleException + * If the batch size cannot be determined for the JDBC environment. + */ + protected void batchPermissionUpdates( + Collection objects, Consumer> consumer) + throws GuacamoleException { + + // Split the original collection into views, each no larger than the + // configured batch size, and call the collector function with each + Iterables.partition(objects, environment.getBatchSize()) + .forEach(batch -> consumer.accept(batch)); + } + + @Override + public Set retrievePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Retrieve permissions only if allowed + if (canReadPermissions(user, targetEntity)) + return getPermissionInstances(getPermissionMapper().select( + targetEntity.getModel(), + effectiveGroups, + getCaseSensitivity())); + + // User cannot read this entity's permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java new file mode 100644 index 0000000..474990e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for object-related permissions. + */ +public interface ObjectPermissionMapper extends PermissionMapper { + + /** + * Retrieve the permission of the given type associated with the given + * entity and object, if it exists. If no such permission exists, null is + * returned. + * + * @param entity + * The entity to retrieve permissions for. + * + * @param type + * The type of permission to return. + * + * @param identifier + * The identifier of the object affected by the permission to return. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @param caseSensitivity + * The configuration of case sensitivity, used to determine whether + * usernames and/or group names will be treated as case-sensitive. + * + * @return + * The requested permission, or null if no such permission is granted + * to the given entity for the given object. + */ + ObjectPermissionModel selectOne(@Param("entity") EntityModel entity, + @Param("type") ObjectPermission.Type type, + @Param("identifier") String identifier, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Retrieves the subset of the given identifiers for which the given entity + * has at least one of the given permissions. + * + * @param entity + * The entity to check permissions of. + * + * @param permissions + * The permissions to check. An identifier will be included in the + * resulting collection if at least one of these permissions is granted + * for the associated object + * + * @param identifiers + * The identifiers of the objects affected by the permissions being + * checked. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @param caseSensitivity + * The configuration of case sensitivity, used to determine whether + * usernames and/or group names will be treated as case-sensitive. + * + * @return + * A collection containing the subset of identifiers for which at least + * one of the specified permissions is granted. + */ + Collection selectAccessibleIdentifiers(@Param("entity") EntityModel entity, + @Param("permissions") Collection permissions, + @Param("identifiers") Collection identifiers, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionModel.java new file mode 100644 index 0000000..3a75772 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionModel.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import org.apache.guacamole.net.auth.permission.ObjectPermission; + +/** + * Object representation of an object-related Guacamole permission, as + * represented in the database. + */ +public class ObjectPermissionModel extends PermissionModel { + + /** + * The unique identifier of the object affected by this permission. + */ + private String objectIdentifier; + + /** + * Creates a new, empty object permission. + */ + public ObjectPermissionModel() { + } + + /** + * Returns the unique identifier of the object affected by this permission. + * + * @return + * The unique identifier of the object affected by this permission. + */ + public String getObjectIdentifier() { + return objectIdentifier; + } + + /** + * Sets the unique identifier of the object affected by this permission. + * + * @param objectIdentifier + * The unique identifier of the object affected by this permission. + */ + public void setObjectIdentifier(String objectIdentifier) { + this.objectIdentifier = objectIdentifier; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java new file mode 100644 index 0000000..a841c96 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting object permissions. This service will automatically enforce the + * permissions of the current user. + */ +public interface ObjectPermissionService + extends PermissionService { + + /** + * Returns whether the permission of the given type and associated with the + * given object has been granted to the given entity. + * + * @param user + * The user retrieving the permission. + * + * @param targetEntity + * The entity associated with the permission to be retrieved. + * + * @param type + * The type of permission to retrieve. + * + * @param identifier + * The identifier of the object affected by the permission to return. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + * + * @return + * true if permission of the given type and associated with the given + * object has been granted to the given entity, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while retrieving the requested permission. + */ + boolean hasPermission(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + ObjectPermission.Type type, String identifier, + Set effectiveGroups) throws GuacamoleException; + + /** + * Retrieves the subset of the given identifiers for which the given entity + * has at least one of the given permissions. + * + * @param user + * The user checking the permissions. + * + * @param targetEntity + * The entity to check permissions of. + * + * @param permissions + * The permissions to check. An identifier will be included in the + * resulting collection if at least one of these permissions is granted + * for the associated object + * + * @param identifiers + * The identifiers of the objects affected by the permissions being + * checked. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + * + * @return + * A collection containing the subset of identifiers for which at least + * one of the specified permissions is granted. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions. + */ + Collection retrieveAccessibleIdentifiers(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions, + Collection identifiers, Set effectiveGroups) + throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java new file mode 100644 index 0000000..d179c68 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.auth.jdbc.base.RestrictedObject; +import org.apache.guacamole.net.auth.permission.ObjectPermission; + +/** + * A database implementation of ObjectPermissionSet which uses an injected + * service to query and manipulate the object-level permissions associated with + * a particular entity. + */ +public abstract class ObjectPermissionSet extends RestrictedObject + implements org.apache.guacamole.net.auth.permission.ObjectPermissionSet { + + /** + * The entity associated with this permission set. Each of the permissions + * in this permission set is granted to this entity. + */ + private ModeledPermissions entity; + + /** + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + */ + private Set effectiveGroups; + + /** + * Creates a new ObjectPermissionSet. The resulting permission set + * must still be initialized by a call to init(), or the information + * necessary to read and modify this set will be missing. + */ + public ObjectPermissionSet() { + } + + /** + * Initializes this permission set with the current user and the entity + * to whom the permissions in this set are granted. + * + * @param currentUser + * The user who queried this permission set, and whose permissions + * dictate the access level of all operations performed on this set. + * + * @param entity + * The entity to whom the permissions in this set are granted. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + */ + public void init(ModeledAuthenticatedUser currentUser, + ModeledPermissions entity, + Set effectiveGroups) { + super.init(currentUser); + this.entity = entity; + this.effectiveGroups = effectiveGroups; + } + + /** + * Returns an ObjectPermissionService implementation for manipulating the + * type of permissions contained within this permission set. + * + * @return + * An object permission service for manipulating the type of + * permissions contained within this permission set. + */ + protected abstract ObjectPermissionService getObjectPermissionService(); + + @Override + public Set getPermissions() throws GuacamoleException { + return getObjectPermissionService().retrievePermissions(getCurrentUser(), entity, effectiveGroups); + } + + @Override + public boolean hasPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + return getObjectPermissionService().hasPermission(getCurrentUser(), entity, permission, identifier, effectiveGroups); + } + + @Override + public void addPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + addPermissions(Collections.singleton(new ObjectPermission(permission, identifier))); + } + + @Override + public void removePermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + removePermissions(Collections.singleton(new ObjectPermission(permission, identifier))); + } + + @Override + public Collection getAccessibleObjects(Collection permissions, + Collection identifiers) throws GuacamoleException { + return getObjectPermissionService().retrieveAccessibleIdentifiers(getCurrentUser(), entity, permissions, identifiers, effectiveGroups); + } + + @Override + public void addPermissions(Set permissions) + throws GuacamoleException { + getObjectPermissionService().createPermissions(getCurrentUser(), entity, permissions); + } + + @Override + public void removePermissions(Set permissions) + throws GuacamoleException { + getObjectPermissionService().deletePermissions(getCurrentUser(), entity, permissions); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java new file mode 100644 index 0000000..9d9525b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Generic base for mappers which handle permissions. + * + * @param + * The type of permission model object handled by this mapper. + */ +public interface PermissionMapper { + + /** + * Retrieves all permissions associated with the given entity (user or user + * group). + * + * @param entity + * The entity to retrieve permissions for. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @param caseSensitivity + * The case sensitivity configuration for usernames and group names. + * + * @return + * All permissions associated with the given entity. + */ + Collection select(@Param("entity") EntityModel entity, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Inserts the given permissions into the database. If any permissions + * already exist, they will be ignored. + * + * @param permissions + * The permissions to insert. + * + * @param caseSensitivity + * The case sensitivity configuration for usernames and group names. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("permissions") Collection permissions, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Deletes the given permissions from the database. If any permissions do + * not exist, they will be ignored. + * + * @param permissions + * The permissions to delete. + * + * @param caseSensitivity + * The case sensitivity configuration for usernames and group names. + * + * @return + * The number of rows deleted. + */ + int delete(@Param("permissions") Collection permissions, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionModel.java new file mode 100644 index 0000000..da1ec2d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionModel.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +/** + * Generic base permission model which grants a permission of a particular type + * to a specific entity (user or user group). + * + * @param + * The type of permissions allowed within this model. + */ +public abstract class PermissionModel { + + /** + * The database ID of the entity to whom this permission is granted. + */ + private Integer entityID; + + /** + * The type of action granted by this permission. + */ + private PermissionType type; + + /** + * Returns the database ID of the entity to whom this permission is + * granted. + * + * @return + * The database ID of the entity to whom this permission is granted. + */ + public Integer getEntityID() { + return entityID; + } + + /** + * Sets the database ID of the entity to whom this permission is granted. + * + * @param entityID + * The database ID of the entity to whom this permission is granted. + */ + public void setEntityID(Integer entityID) { + this.entityID = entityID; + } + + /** + * Returns the type of action granted by this permission. + * + * @return + * The type of action granted by this permission. + */ + public PermissionType getType() { + return type; + } + + /** + * Sets the type of action granted by this permission. + * + * @param type + * The type of action granted by this permission. + */ + public void setType(PermissionType type) { + this.type = type; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java new file mode 100644 index 0000000..6791c26 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.net.auth.permission.Permission; +import org.apache.guacamole.net.auth.permission.PermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting permissions, and for obtaining the permission sets that contain + * these permissions. This service will automatically enforce the permissions + * of the current user. + * + * @param + * The type of permission sets this service provides access to. + * + * @param + * The type of permission this service provides access to. + */ +public interface PermissionService, + PermissionType extends Permission> { + + /** + * Return the current case sensitivity setting, allowing the system to + * determine if usernames and/or group names should be treated as case- + * sensitive. + * + * @return + * The current case sensitivity configuration. + * + * @throws GuacamoleException + * If an error occurs retrieving configuration information related to + * case sensitivity. + */ + default CaseSensitivity getCaseSensitivity() throws GuacamoleException { + + // By default identifiers are case-sensitive. + return CaseSensitivity.ENABLED; + } + + /** + * Returns a permission set that can be used to retrieve and manipulate the + * permissions of the given entity. + * + * @param user + * The user who will be retrieving or manipulating permissions through + * the returned permission set. + * + * @param targetEntity + * The entity to whom the permissions in the returned permission set are + * granted. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + * + * @return + * A permission set that contains all permissions associated with the + * given entity, and can be used to manipulate that entity's + * permissions. + * + * @throws GuacamoleException + * If an error occurs while retrieving the permissions of the given + * entity, or if permission to retrieve the permissions of the given + * entity is denied. + */ + PermissionSetType getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException; + + /** + * Retrieves all permissions associated with the given entity. + * + * @param user + * The user retrieving the permissions. + * + * @param targetEntity + * The entity associated with the permissions to be retrieved. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + * + * @return + * The permissions associated with the given entity. + * + * @throws GuacamoleException + * If an error occurs while retrieving the requested permissions. + */ + Set retrievePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException; + + /** + * Creates the given permissions within the database. If any permissions + * already exist, they will be ignored. + * + * @param user + * The user creating the permissions. + * + * @param targetEntity + * The entity associated with the permissions to be created. + * + * @param permissions + * The permissions to create. + * + * @throws GuacamoleException + * If the user lacks permission to create the permissions, or an error + * occurs while creating the permissions. + */ + void createPermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException; + + /** + * Deletes the given permissions. If any permissions do not exist, they + * will be ignored. + * + * @param user + * The user deleting the permissions. + * + * @param targetEntity + * The entity associated with the permissions to be deleted. + * + * @param permissions + * The permissions to delete. + * + * @throws GuacamoleException + * If the user lacks permission to delete the permissions, or an error + * occurs while deleting the permissions. + */ + void deletePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) + throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.java new file mode 100644 index 0000000..3b6f26d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +/** + * Mapper for sharing profile permissions. + */ +public interface SharingProfilePermissionMapper + extends ObjectPermissionMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java new file mode 100644 index 0000000..c30ff73 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting sharing profile permissions. This service will automatically enforce + * the permissions of the current user. + */ +public class SharingProfilePermissionService extends ModeledObjectPermissionService { + + /** + * Mapper for sharing profile permissions. + */ + @Inject + private SharingProfilePermissionMapper sharingProfilePermissionMapper; + + /** + * Provider for sharing profile permission sets. + */ + @Inject + private Provider sharingProfilePermissionSetProvider; + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return sharingProfilePermissionMapper; + } + + @Override + public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + ObjectPermissionSet permissionSet = sharingProfilePermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionSet.java new file mode 100644 index 0000000..13f6f30 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionSet.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; + +/** + * A database implementation of ObjectPermissionSet which uses an injected + * service to query and manipulate the sharing profile permissions associated + * with a particular user. + */ +public class SharingProfilePermissionSet extends ObjectPermissionSet { + + /** + * Service for querying and manipulating sharing profile permissions. + */ + @Inject + private SharingProfilePermissionService sharingProfilePermissionService; + + @Override + protected ObjectPermissionService getObjectPermissionService() { + return sharingProfilePermissionService; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java new file mode 100644 index 0000000..e80f548 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import java.util.Collection; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for system-level permissions. + */ +public interface SystemPermissionMapper extends PermissionMapper { + + /** + * Retrieve the permission of the given type associated with the given + * entity, if it exists. If no such permission exists, null is returned. + * + * @param entity + * The entity to retrieve permissions for. + * + * @param type + * The type of permission to return. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * + * @param caseSensitivity + * The case sensitivity configuration, used to determine whether usernames + * and/or group names will be treated as case-sensitive. + * + * @return + * The requested permission, or null if no such permission is granted + * to the given entity. + */ + SystemPermissionModel selectOne(@Param("entity") EntityModel entity, + @Param("type") SystemPermission.Type type, + @Param("effectiveGroups") Collection effectiveGroups, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionModel.java new file mode 100644 index 0000000..67e7298 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionModel.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import org.apache.guacamole.net.auth.permission.SystemPermission; + +/** + * Object representation of an system-level Guacamole permission, as + * represented in the database. + */ +public class SystemPermissionModel extends PermissionModel { + + /** + * Creates a new, empty System permission. + */ + public SystemPermissionModel() { + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java new file mode 100644 index 0000000..8a5bf07 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java @@ -0,0 +1,190 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting system permissions. This service will automatically enforce + * the permissions of the current user. + */ +public class SystemPermissionService + extends ModeledPermissionService { + + /** + * Mapper for system-level permissions. + */ + @Inject + private SystemPermissionMapper systemPermissionMapper; + + /** + * Provider for creating system permission sets. + */ + @Inject + private Provider systemPermissionSetProvider; + + @Override + protected SystemPermissionMapper getPermissionMapper() { + return systemPermissionMapper; + } + + @Override + protected SystemPermission getPermissionInstance(SystemPermissionModel model) { + return new SystemPermission(model.getType()); + } + + @Override + protected SystemPermissionModel getModelInstance( + final ModeledPermissions targetEntity, + final SystemPermission permission) { + + SystemPermissionModel model = new SystemPermissionModel(); + + // Populate model object with data from entity and permission + model.setEntityID(targetEntity.getModel().getEntityID()); + model.setType(permission.getType()); + + return model; + + } + + @Override + public SystemPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + SystemPermissionSet permissionSet = systemPermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + + @Override + public void createPermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) throws GuacamoleException { + + // Only privileged users (such as system administrators) can create + // system permissions + if (user.isPrivileged()) { + + // Pull identifier case sensitivity + CaseSensitivity caseSensitivity = getCaseSensitivity(); + + batchPermissionUpdates(permissions, permissionSubset -> { + Collection models = getModelInstances( + targetEntity, permissionSubset); + systemPermissionMapper.insert(models, caseSensitivity); + }); + + return; + } + + // User lacks permission to create system permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + + @Override + public void deletePermissions(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Collection permissions) throws GuacamoleException { + + // Only privileged users (such as system administrators) can delete + // system permissions + if (user.isPrivileged()) { + + // Do not allow users to remove their own admin powers + if (user.getUser().getIdentifier().equals(targetEntity.getIdentifier())) + throw new GuacamoleUnsupportedException("Removing your own administrative permissions is not allowed."); + + // Pull case sensitivity + CaseSensitivity caseSensitivity = getCaseSensitivity(); + + batchPermissionUpdates(permissions, permissionSubset -> { + Collection models = getModelInstances( + targetEntity, permissionSubset); + systemPermissionMapper.delete(models, caseSensitivity); + }); + + return; + } + + // User lacks permission to delete system permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + + /** + * Retrieves whether the permission of the given type has been granted to + * the given entity. Permission inheritance through group membership is + * taken into account. + * + * @param user + * The user retrieving the permission. + * + * @param targetEntity + * The entity associated with the permission to be retrieved. + * + * @param type + * The type of permission to retrieve. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + * + * @return + * true if permission of the given type has been granted to the given + * entity, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while retrieving the requested permission. + */ + public boolean hasPermission(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + SystemPermission.Type type, Set effectiveGroups) + throws GuacamoleException { + + // Retrieve permissions only if allowed + if (canReadPermissions(user, targetEntity)) + return getPermissionMapper().selectOne(targetEntity.getModel(), type, effectiveGroups, getCaseSensitivity()) != null; + + // User cannot read this entity's permissions + throw new GuacamoleSecurityException("Permission denied."); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java new file mode 100644 index 0000000..1948fac --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.auth.jdbc.base.RestrictedObject; +import org.apache.guacamole.net.auth.permission.SystemPermission; + +/** + * A database implementation of SystemPermissionSet which uses an injected + * service to query and manipulate the system permissions associated with a + * particular entity. + */ +public class SystemPermissionSet extends RestrictedObject + implements org.apache.guacamole.net.auth.permission.SystemPermissionSet { + + /** + * The entity associated with this permission set. Each of the permissions + * in this permission set is granted to this entity. + */ + private ModeledPermissions entity; + + /** + * The identifiers of all groups that should be taken into account when + * determining the permissions effectively granted to the entity. + */ + private Set effectiveGroups; + + /** + * Service for reading and manipulating system permissions. + */ + @Inject + private SystemPermissionService systemPermissionService; + + /** + * Creates a new SystemPermissionSet. The resulting permission set + * must still be initialized by a call to init(), or the information + * necessary to read and modify this set will be missing. + */ + public SystemPermissionSet() { + } + + /** + * Initializes this permission set with the current user and the entity + * to whom the permissions in this set are granted. + * + * @param currentUser + * The user who queried this permission set, and whose permissions + * dictate the access level of all operations performed on this set. + * + * @param entity + * The entity to whom the permissions in this set are granted. + * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the entity. + * If no groups are given, only permissions directly granted to the + * entity will be used. + */ + public void init(ModeledAuthenticatedUser currentUser, + ModeledPermissions entity, + Set effectiveGroups) { + super.init(currentUser); + this.entity = entity; + this.effectiveGroups = effectiveGroups; + } + + @Override + public Set getPermissions() throws GuacamoleException { + return systemPermissionService.retrievePermissions(getCurrentUser(), entity, effectiveGroups); + } + + @Override + public boolean hasPermission(SystemPermission.Type permission) + throws GuacamoleException { + return systemPermissionService.hasPermission(getCurrentUser(), entity, permission, effectiveGroups); + } + + @Override + public void addPermission(SystemPermission.Type permission) + throws GuacamoleException { + addPermissions(Collections.singleton(new SystemPermission(permission))); + } + + @Override + public void removePermission(SystemPermission.Type permission) + throws GuacamoleException { + removePermissions(Collections.singleton(new SystemPermission(permission))); + } + + @Override + public void addPermissions(Set permissions) + throws GuacamoleException { + systemPermissionService.createPermissions(getCurrentUser(), entity, permissions); + } + + @Override + public void removePermissions(Set permissions) + throws GuacamoleException { + systemPermissionService.deletePermissions(getCurrentUser(), entity, permissions); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.java new file mode 100644 index 0000000..d2a7494 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +/** + * Mapper for user group permissions. + */ +public interface UserGroupPermissionMapper extends ObjectPermissionMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionService.java new file mode 100644 index 0000000..852b9f0 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionService.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Set; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting user group permissions. This service will automatically enforce the + * permissions of the current user. + */ +public class UserGroupPermissionService extends ModeledObjectPermissionService { + + /** + * Mapper for user group permissions. + */ + @Inject + private UserGroupPermissionMapper userGroupPermissionMapper; + + /** + * Provider for user group permission sets. + */ + @Inject + private Provider userGroupPermissionSetProvider; + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return userGroupPermissionMapper; + } + + @Override + public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + ObjectPermissionSet permissionSet = userGroupPermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionSet.java new file mode 100644 index 0000000..a864144 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionSet.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; + +/** + * A database implementation of ObjectPermissionSet which uses an injected + * service to query and manipulate the user group permissions associated with a + * particular user. + */ +public class UserGroupPermissionSet extends ObjectPermissionSet { + + /** + * Service for querying and manipulating user group permissions. + */ + @Inject + private UserGroupPermissionService userGroupPermissionService; + + @Override + protected ObjectPermissionService getObjectPermissionService() { + return userGroupPermissionService; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.java new file mode 100644 index 0000000..b093bdb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +/** + * Mapper for user permissions. + */ +public interface UserPermissionMapper extends ObjectPermissionMapper {} \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java new file mode 100644 index 0000000..ae35ba3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * Service which provides convenience methods for creating, retrieving, and + * deleting user permissions. This service will automatically enforce the + * permissions of the current user. + */ +public class UserPermissionService extends ModeledObjectPermissionService { + + /** + * Mapper for user permissions. + */ + @Inject + private UserPermissionMapper userPermissionMapper; + + /** + * Provider for user permission sets. + */ + @Inject + private Provider userPermissionSetProvider; + + /** + * The server environment for retrieving configuration data. + */ + @Inject + private JDBCEnvironment environment; + + @Override + public CaseSensitivity getCaseSensitivity() throws GuacamoleException { + return environment.getCaseSensitivity(); + } + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return userPermissionMapper; + } + + @Override + public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, + ModeledPermissions targetEntity, + Set effectiveGroups) throws GuacamoleException { + + // Create permission set for requested entity + ObjectPermissionSet permissionSet = userPermissionSetProvider.get(); + permissionSet.init(user, targetEntity, effectiveGroups); + + return permissionSet; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionSet.java new file mode 100644 index 0000000..fbf1914 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionSet.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.permission; + +import com.google.inject.Inject; + +/** + * A database implementation of ObjectPermissionSet which uses an injected + * service to query and manipulate the user permissions associated with a + * particular user. + */ +public class UserPermissionSet extends ObjectPermissionSet { + + /** + * Service for querying and manipulating user permissions. + */ + @Inject + private UserPermissionService userPermissionService; + + @Override + protected ObjectPermissionService getObjectPermissionService() { + return userPermissionService; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/package-info.java new file mode 100644 index 0000000..82e5857 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to object- and system-level permissions. + */ +package org.apache.guacamole.auth.jdbc.permission; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordContainsUsernameException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordContainsUsernameException.java new file mode 100644 index 0000000..2273ada --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordContainsUsernameException.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +/** + * Thrown when an attempt is made to set a user's password to a string which + * contains their own username, in violation of the defined password policy. + */ +public class PasswordContainsUsernameException extends PasswordPolicyException { + + /** + * Creates a new PasswordContainsUsernameException with the given + * human-readable message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + */ + public PasswordContainsUsernameException(String message) { + super(message, "PASSWORD_POLICY.ERROR_CONTAINS_USERNAME"); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordEncryptionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordEncryptionService.java new file mode 100644 index 0000000..b381e84 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordEncryptionService.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +/** + * A service to perform password encryption and checking. + */ +public interface PasswordEncryptionService { + + /** + * Creates a password hash based on the provided username, password, and + * salt. If the provided salt is null, only the password itself is hashed. + * + * @param password + * The password to hash. + * + * @param salt + * The salt to use when hashing the password, if any. + * + * @return + * The generated password hash. + */ + public byte[] createPasswordHash(String password, byte[] salt); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordMinimumLengthException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordMinimumLengthException.java new file mode 100644 index 0000000..b01be56 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordMinimumLengthException.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import java.util.Collections; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * Thrown when an attempt is made to set a user's password to a string which is + * too short, in violation of the defined password policy. + */ +public class PasswordMinimumLengthException extends PasswordPolicyException { + + /** + * Creates a new PasswordMinimumLengthException with the given + * human-readable message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + * + * @param length + * The minimum length that passwords must have to avoid violating + * policy, in characters. + */ + public PasswordMinimumLengthException(String message, int length) { + super(message, new TranslatableMessage( + "PASSWORD_POLICY.ERROR_TOO_SHORT", + Collections.singletonMap("LENGTH", length) + )); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicy.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicy.java new file mode 100644 index 0000000..c86f7fd --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicy.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import org.apache.guacamole.GuacamoleException; + +/** + * A set of restrictions which define the level of complexity required for + * the passwords of Guacamole user accounts. + */ +public interface PasswordPolicy { + + /** + * Returns the minimum length of new passwords, in characters. Passwords + * which are shorter than this length cannot be used. + * + * @return + * The minimum number of characters required for new passwords. + * + * @throws GuacamoleException + * If the minimum password length cannot be parsed from + * guacamole.properties. + */ + int getMinimumLength() throws GuacamoleException; + + /** + * Returns the minimum number of days which must elapse before the user's + * password may be reset. If this restriction does not apply, this will be + * zero. + * + * @return + * The minimum number of days which must elapse before the user's + * password may be reset, or zero if this restriction does not apply. + * + * @throws GuacamoleException + * If the minimum password age cannot be parsed from + * guacamole.properties. + */ + int getMinimumAge() throws GuacamoleException; + + /** + * Returns the maximum number of days which may elapse before the user's + * password must be reset. If this restriction does not apply, this will be + * zero. + * + * @return + * The maximum number of days which may elapse before the user's + * password must be reset, or zero if this restriction does not apply. + * + * @throws GuacamoleException + * If the maximum password age cannot be parsed from + * guacamole.properties. + */ + int getMaximumAge() throws GuacamoleException; + + /** + * Returns the number of previous passwords remembered for each user. If + * greater than zero, users will be prohibited from reusing those passwords. + * + * + * @return + * The number of previous passwords remembered for each user. + * + * @throws GuacamoleException + * If the password history size cannot be parsed from + * guacamole.properties. + */ + int getHistorySize() throws GuacamoleException; + + /** + * Returns whether both uppercase and lowercase characters must be present + * in new passwords. If true, passwords which do not have at least one + * uppercase letter and one lowercase letter cannot be used. + * + * @return + * true if both uppercase and lowercase characters must be present in + * new passwords, false otherwise. + * + * @throws GuacamoleException + * If the multiple case requirement cannot be parsed from + * guacamole.properties. + */ + boolean isMultipleCaseRequired() throws GuacamoleException; + + /** + * Returns whether numeric characters (digits) must be present in new + * passwords. If true, passwords which do not have at least one numeric + * character cannot be used. + * + * @return + * true if numeric characters must be present in new passwords, + * false otherwise. + * + * @throws GuacamoleException + * If the numeric character requirement cannot be parsed from + * guacamole.properties. + */ + boolean isNumericRequired() throws GuacamoleException; + + /** + * Returns whether non-alphanumeric characters (symbols) must be present in + * new passwords. If true, passwords which do not have at least one + * non-alphanumeric character cannot be used. + * + * @return + * true if non-alphanumeric characters must be present in new passwords, + * false otherwise. + * + * @throws GuacamoleException + * If the non-alphanumeric character requirement cannot be parsed from + * guacamole.properties. + */ + boolean isNonAlphanumericRequired() throws GuacamoleException; + + /** + * Returns whether new passwords must not contain the user's own username. + * + * @return + * true if new passwords must not contain the user's own username, + * false otherwise. + * + * @throws GuacamoleException + * If the username password restriction cannot be parsed from + * guacamole.properties. + */ + boolean isUsernameProhibited() throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicyException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicyException.java new file mode 100644 index 0000000..a917d9e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicyException.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.language.Translatable; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * Thrown when an attempt to change a user's password fails due to a violation + * of password complexity policies. + */ +public class PasswordPolicyException extends GuacamoleClientException + implements Translatable { + + /** + * A translatable message which, after being passed through the translation + * system, describes the policy violation that occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new PasswordPolicyException with the given human-readable + * message (which will not be passed through the translation system) and + * translation string key(which WILL be passed through the translation + * system), both of which should describe the policy violation that + * occurred. + * + * @param message + * A human-readable message describing the policy violation that + * occurred. + * + * @param translationKey + * The key of a translation string known to the translation system + * which describes the policy violation that occurred. + */ + public PasswordPolicyException(String message, String translationKey) { + super(message); + this.translatableMessage = new TranslatableMessage(translationKey); + } + + /** + * Creates a new PasswordPolicyException with the given human-readable + * message (which will not be passed through the translation system) and + * translatable message (which WILL be passed through the translation + * system), both of which should describe the policy violation that + * occurred. + * + * @param message + * A human-readable message describing the policy violation that + * occurred. + * + * @param translatableMessage + * A translatable message which, after being passed through the + * translation system, describes the policy violation that occurred. + */ + public PasswordPolicyException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicyService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicyService.java new file mode 100644 index 0000000..3a0ccb3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordPolicyService.java @@ -0,0 +1,334 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import com.google.inject.Inject; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.user.ModeledUser; +import org.apache.guacamole.auth.jdbc.user.PasswordRecordMapper; +import org.apache.guacamole.auth.jdbc.user.PasswordRecordModel; + +/** + * Service which verifies compliance with the password policy configured via + * guacamole.properties. + */ +public class PasswordPolicyService { + + /** + * The Guacamole server environment. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Mapper for creating/retrieving previously-set passwords. + */ + @Inject + private PasswordRecordMapper passwordRecordMapper; + + /** + * Service for hashing passwords. + */ + @Inject + private PasswordEncryptionService encryptionService; + + /** + * Regular expression which matches only if the string contains at least one + * lowercase character. + */ + private final Pattern CONTAINS_LOWERCASE = Pattern.compile("\\p{javaLowerCase}"); + + /** + * Regular expression which matches only if the string contains at least one + * uppercase character. + */ + private final Pattern CONTAINS_UPPERCASE = Pattern.compile("\\p{javaUpperCase}"); + + /** + * Regular expression which matches only if the string contains at least one + * numeric character. + */ + private final Pattern CONTAINS_DIGIT = Pattern.compile("\\p{Digit}"); + + /** + * Regular expression which matches only if the string contains at least one + * non-alphanumeric character. + */ + private final Pattern CONTAINS_NON_ALPHANUMERIC = + Pattern.compile("[^\\p{javaLowerCase}\\p{javaUpperCase}\\p{Digit}]"); + + /** + * Returns whether the given string matches all of the provided regular + * expressions. + * + * @param str + * The string to test against all provided regular expressions. + * + * @param patterns + * The regular expressions to match against the given string. + * + * @return + * true if the given string matches all provided regular expressions, + * false otherwise. + */ + private boolean matches(String str, Pattern... patterns) { + + // Check given string against all provided patterns + for (Pattern pattern : patterns) { + + // Fail overall test if any pattern fails to match + Matcher matcher = pattern.matcher(str); + if (!matcher.find()) + return false; + + } + + // All provided patterns matched + return true; + + } + + /** + * Returns whether the given password matches any of the user's previous + * passwords. Regardless of the value specified here, the maximum number of + * passwords involved in this check depends on how many previous passwords + * were actually recorded, which depends on the password policy. + * + * @param password + * The password to check. + * + * @param username + * The username of the user whose history should be compared against + * the given password. + * + * @param historySize + * The maximum number of history records to compare the password + * against. + * + * @return + * true if the given password matches any of the user's previous + * passwords, up to the specified limit, false otherwise. + * + * @throws GuacamoleException + * If an error occurs accessing environment information used for + * retrieving configuration values. + */ + private boolean matchesPreviousPasswords(String password, String username, + int historySize) throws GuacamoleException { + + // No need to compare if no history is relevant + if (historySize <= 0) + return false; + + // Check password against all recorded hashes + List history = passwordRecordMapper.select(username, + historySize, environment.getCaseSensitivity()); + for (PasswordRecordModel record : history) { + + byte[] hash = encryptionService.createPasswordHash(password, record.getPasswordSalt()); + if (Arrays.equals(hash, record.getPasswordHash())) + return true; + + } + + // No passwords match + return false; + + } + + /** + * Verifies that the given new password complies with the password policy + * configured within guacamole.properties, throwing a GuacamoleException if + * the policy is violated in any way. + * + * @param username + * The username of the user whose password is being changed. + * + * @param password + * The proposed new password. + * + * @throws GuacamoleException + * If the password policy cannot be parsed, or if the proposed password + * violates the password policy. + */ + public void verifyPassword(String username, String password) + throws GuacamoleException { + + // Retrieve password policy from environment + PasswordPolicy policy = environment.getPasswordPolicy(); + + // Enforce minimum password length + if (password.length() < policy.getMinimumLength()) + throw new PasswordMinimumLengthException( + "Password does not meet minimum length requirements.", + policy.getMinimumLength()); + + // Disallow passwords containing the username + if (policy.isUsernameProhibited() && password.toLowerCase().contains(username.toLowerCase())) + throw new PasswordContainsUsernameException( + "Password must not contain username."); + + // Require both uppercase and lowercase characters + if (policy.isMultipleCaseRequired() && !matches(password, CONTAINS_LOWERCASE, CONTAINS_UPPERCASE)) + throw new PasswordRequiresMultipleCaseException( + "Password must contain both uppercase and lowercase."); + + // Require digits + if (policy.isNumericRequired() && !matches(password, CONTAINS_DIGIT)) + throw new PasswordRequiresDigitException( + "Passwords must contain at least one digit."); + + // Require non-alphanumeric symbols + if (policy.isNonAlphanumericRequired() && !matches(password, CONTAINS_NON_ALPHANUMERIC)) + throw new PasswordRequiresSymbolException( + "Passwords must contain at least one non-alphanumeric character."); + + // Prohibit password reuse + int historySize = policy.getHistorySize(); + if (matchesPreviousPasswords(password, username, historySize)) + throw new PasswordReusedException( + "Password matches a previously-used password.", historySize); + + // Password passes all defined restrictions + + } + + /** + * Returns the age of the given user's password, in days. The age of a + * user's password is the amount of time elapsed since the password was last + * changed or reset. + * + * @param user + * The user to calculate the password age of. + * + * @return + * The age of the given user's password, in days. + */ + private long getPasswordAge(ModeledUser user) { + + // If no password was set, then no time has elapsed + PasswordRecordModel passwordRecord = user.getPasswordRecord(); + if (passwordRecord == null) + return 0; + + // Pull both current time and the time the password was last reset + long currentTime = System.currentTimeMillis(); + long lastResetTime = passwordRecord.getPasswordDate().getTime(); + + // Calculate the number of days elapsed since the password was last reset + return TimeUnit.DAYS.convert(currentTime - lastResetTime, TimeUnit.MILLISECONDS); + + } + + /** + * Verifies that the given user can change their password without violating + * password aging policy. If changing the user's password would violate the + * aging policy, a GuacamoleException will be thrown. + * + * @param user + * The user whose password is changing. + * + * @throws GuacamoleException + * If the user's password cannot be changed due to the password aging + * policy, or of the password policy cannot be parsed from + * guacamole.properties. + */ + public void verifyPasswordAge(ModeledUser user) throws GuacamoleException { + + // Retrieve password policy from environment + PasswordPolicy policy = environment.getPasswordPolicy(); + + long minimumAge = policy.getMinimumAge(); + long passwordAge = getPasswordAge(user); + + // Require that sufficient time has elapsed before allowing the password + // to be changed + if (passwordAge < minimumAge) + throw new PasswordTooYoungException("Password was already recently changed.", + minimumAge - passwordAge); + + } + + /** + * Returns whether the given user's password is expired due to the password + * aging policy. + * + * @param user + * The user to check. + * + * @return + * true if the user needs to change their password to comply with the + * password aging policy, false otherwise. + * + * @throws GuacamoleException + * If the password policy cannot be parsed. + */ + public boolean isPasswordExpired(ModeledUser user) + throws GuacamoleException { + + // Retrieve password policy from environment + PasswordPolicy policy = environment.getPasswordPolicy(); + + // There is no maximum password age if 0 + int maxPasswordAge = policy.getMaximumAge(); + if (maxPasswordAge == 0) + return false; + + // Determine whether password is expired based on maximum age + return getPasswordAge(user) >= maxPasswordAge; + + } + + /** + * Records the password that was associated with the given user at the time + * the user was queried, such that future attempts to set that same password + * for that user will be denied. The number of passwords remembered for each + * user is limited by the password policy. + * + * @param user + * The user whose password should be recorded within the password + * history. + * + * @throws GuacamoleException + * If the password policy cannot be parsed. + */ + public void recordPassword(ModeledUser user) + throws GuacamoleException { + + // Retrieve password policy from environment + PasswordPolicy policy = environment.getPasswordPolicy(); + + // Nothing to do if history is not being recorded + int historySize = policy.getHistorySize(); + if (historySize <= 0) + return; + + // Store previous password in history + passwordRecordMapper.insert(user.getPasswordRecord(), historySize); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresDigitException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresDigitException.java new file mode 100644 index 0000000..54c2865 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresDigitException.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +/** + * Thrown when an attempt is made to set a user's password to a string which + * contains no numeric characters (digits), in violation of the defined password + * policy. + */ +public class PasswordRequiresDigitException extends PasswordPolicyException { + + /** + * Creates a new PasswordRequiresDigitException with the given + * human-readable message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + */ + public PasswordRequiresDigitException(String message) { + super(message, "PASSWORD_POLICY.ERROR_REQUIRES_DIGIT"); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresMultipleCaseException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresMultipleCaseException.java new file mode 100644 index 0000000..1d34000 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresMultipleCaseException.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +/** + * Thrown when an attempt is made to set a user's password to a string which + * does not contain both uppercase and lowercase characters, in violation of the + * defined password policy. + */ +public class PasswordRequiresMultipleCaseException extends PasswordPolicyException { + + /** + * Creates a new PasswordRequiresMultipleCaseException with the given + * human-readable message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + */ + public PasswordRequiresMultipleCaseException(String message) { + super(message, "PASSWORD_POLICY.ERROR_REQUIRES_MULTIPLE_CASE"); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresSymbolException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresSymbolException.java new file mode 100644 index 0000000..6076fe7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordRequiresSymbolException.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +/** + * Thrown when an attempt is made to set a user's password to a string which + * contains no non-alphanumeric characters (symbols), in violation of the + * defined password policy. + */ +public class PasswordRequiresSymbolException extends PasswordPolicyException { + + /** + * Creates a new PasswordRequiresSymbolException with the given + * human-readable message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + */ + public PasswordRequiresSymbolException(String message) { + super(message, "PASSWORD_POLICY.ERROR_REQUIRES_NON_ALNUM"); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordReusedException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordReusedException.java new file mode 100644 index 0000000..c90226d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordReusedException.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import java.util.Collections; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * Thrown when an attempt is made to reuse a previous password, in violation of + * the defined password policy. + */ +public class PasswordReusedException extends PasswordPolicyException { + + /** + * Creates a new PasswordReusedException with the given human-readable + * message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + * + * @param historySize + * The number of previous passwords which are remembered for each user, + * and must not be reused. + */ + public PasswordReusedException(String message, int historySize) { + super(message, new TranslatableMessage( + "PASSWORD_POLICY.ERROR_REUSED", + Collections.singletonMap("HISTORY_SIZE", historySize) + )); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordTooYoungException.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordTooYoungException.java new file mode 100644 index 0000000..2e9793b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/PasswordTooYoungException.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import java.util.Collections; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * Thrown when an attempt is made to set a user's password before sufficient + * time has elapsed since the password was last reset, in violation of the + * defined password policy. + */ +public class PasswordTooYoungException extends PasswordPolicyException { + + /** + * Creates a new PasswordTooYoungException with the given human-readable + * message. The translatable message is already defined. + * + * @param message + * A human-readable message describing the password policy violation + * that occurred. + * + * @param wait + * The number of days the user should wait before attempting to reset + * the password again. + */ + public PasswordTooYoungException(String message, long wait) { + super(message, new TranslatableMessage( + "PASSWORD_POLICY.ERROR_TOO_YOUNG", + Collections.singletonMap("WAIT", wait) + )); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SHA256PasswordEncryptionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SHA256PasswordEncryptionService.java new file mode 100644 index 0000000..83055d9 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SHA256PasswordEncryptionService.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +import com.google.common.io.BaseEncoding; +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Provides a SHA-256 based implementation of the password encryption + * functionality. + */ +public class SHA256PasswordEncryptionService implements PasswordEncryptionService { + + @Override + public byte[] createPasswordHash(String password, byte[] salt) { + + try { + + // Build salted password, if a salt was provided + StringBuilder builder = new StringBuilder(); + builder.append(password); + + if (salt != null) + builder.append(BaseEncoding.base16().encode(salt)); + + // Hash UTF-8 bytes of possibly-salted password + MessageDigest md = MessageDigest.getInstance("SHA-256"); + md.update(builder.toString().getBytes("UTF-8")); + return md.digest(); + + } + + // Throw hard errors if standard pieces of Java are missing + catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("Unexpected lack of UTF-8 support.", e); + } + catch (NoSuchAlgorithmException e) { + throw new UnsupportedOperationException("Unexpected lack of SHA-256 support.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SaltService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SaltService.java new file mode 100644 index 0000000..1ba0f67 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SaltService.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + +/** + * A service to generate password salts. + */ +public interface SaltService { + /** + * Generates a new String that can be used as a password salt. + * @return a new salt for password encryption. + */ + public byte[] generateSalt(); +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SecureRandomSaltService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SecureRandomSaltService.java new file mode 100644 index 0000000..67f292a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/SecureRandomSaltService.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.security; + + +import java.security.SecureRandom; + +/** + * Generates password salts via SecureRandom. + */ +public class SecureRandomSaltService implements SaltService { + + /** + * Instance of SecureRandom for generating the salt. + */ + private SecureRandom secureRandom = new SecureRandom(); + + @Override + public byte[] generateSalt() { + byte[] salt = new byte[32]; + secureRandom.nextBytes(salt); + return salt; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/package-info.java new file mode 100644 index 0000000..5df8b31 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/security/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to hashing or encryption. + */ +package org.apache.guacamole.auth.jdbc.security; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/ConnectionSharingService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/ConnectionSharingService.java new file mode 100644 index 0000000..2ed0a95 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/ConnectionSharingService.java @@ -0,0 +1,214 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDefinition; +import org.apache.guacamole.auth.jdbc.sharing.user.SharedAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileService; +import org.apache.guacamole.auth.jdbc.tunnel.ActiveConnectionRecord; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.UserCredentials; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Service which provides convenience methods for sharing active connections. + */ +public class ConnectionSharingService { + + /** + * The name of the query parameter that is used when authenticating obtain + * temporary access to a connection. + */ + public static final String SHARE_KEY_NAME = "key"; + + /** + * Generator for sharing keys. + */ + @Inject + private ShareKeyGenerator keyGenerator; + + /** + * Map of all currently-shared connections. + */ + @Inject + private SharedConnectionMap connectionMap; + + /** + * Service for retrieving and manipulating sharing profile objects. + */ + @Inject + private SharingProfileService sharingProfileService; + + /** + * The credentials expected when a user is authenticating using temporary + * credentials in order to obtain access to a single connection. + */ + public static final CredentialsInfo SHARE_KEY = + new CredentialsInfo(Collections.singletonList( + new Field(SHARE_KEY_NAME, Field.Type.QUERY_PARAMETER) + )); + + /** + * Creates a new SharedConnectionDefinition which can be used to connect to + * the given connection, optionally restricting access to the shared + * connection using the given sharing profile. If the user does not have + * permission to share the connection via the given sharing profile, + * permission will be denied. + * + * @see GuacamoleTunnelService#getGuacamoleTunnel(RemoteAuthenticatedUser, + * SharedConnectionDefinition, GuacamoleClientInformation, Map) + * + * @see #getSharingCredentials(SharedConnectionDefinition) + * + * @param user + * The user sharing the connection. + * + * @param activeConnection + * The active connection being shared. + * + * @param sharingProfileIdentifier + * The identifier of the sharing profile dictating the semantics or + * restrictions applying to the shared session, or null if no such + * restrictions should apply. + * + * @return + * A new SharedConnectionDefinition which can be used to connect to the + * given connection. + * + * @throws GuacamoleException + * If permission to share the given connection is denied. + */ + public SharedConnectionDefinition shareConnection(ModeledAuthenticatedUser user, + ActiveConnectionRecord activeConnection, + String sharingProfileIdentifier) throws GuacamoleException { + + // If a sharing profile is provided, verify that permission to use that + // profile to share the given connection is actually granted + ModeledSharingProfile sharingProfile = null; + if (sharingProfileIdentifier != null) { + + // Pull sharing profile (verifying access) + sharingProfile = sharingProfileService.retrieveObject(user, sharingProfileIdentifier); + + // Verify that this profile is indeed a sharing profile for the + // requested connection + String connectionIdentifier = activeConnection.getConnectionIdentifier(); + if (sharingProfile == null || !sharingProfile.getPrimaryConnectionIdentifier().equals(connectionIdentifier)) + throw new GuacamoleSecurityException("Permission denied."); + + } + + // Generate a share key for the requested connection + String key = keyGenerator.getShareKey(); + SharedConnectionDefinition definition = new SharedConnectionDefinition(activeConnection, sharingProfile, key); + connectionMap.add(definition); + + // Ensure the share key is properly invalidated when the original + // connection is closed + activeConnection.registerShareKey(key); + + return definition; + + } + + /** + * Generates a set of temporary credentials which can be used to connect to + * the given connection shared by the SharedConnectionDefinition. + * + * @param definition + * The SharedConnectionDefinition which defines the connection being + * shared and any applicable restrictions. + * + * @return + * A newly-generated set of temporary credentials which can be used to + * connect to the connection shared by the given + * SharedConnectionDefinition. + */ + public UserCredentials getSharingCredentials(SharedConnectionDefinition definition) { + + // Return credentials defining a single expected parameter + return new UserCredentials(SHARE_KEY, + Collections.singletonMap(SHARE_KEY_NAME, definition.getShareKey())); + + } + + /** + * Returns the share key contained within the given credentials. If there is + * no such share key, null is returned. + * + * @param credentials + * The credentials from which the share key should be retrieved. + * + * @return + * The share key contained within the given credentials, or null if + * the credentials do not contain a share key. + */ + public String getShareKey(Credentials credentials) { + + // Retrieve the share key from the request + return credentials.getParameter(SHARE_KEY_NAME); + + } + + /** + * Returns a SharedAuthenticatedUser if the given credentials contain a + * valid share key. The returned user will be associated with the single + * shared connection to which they have been granted temporary access. If + * the share key is invalid, or no share key is contained within the given + * credentials, null is returned. + * + * @param authProvider + * The AuthenticationProvider on behalf of which the user is being + * retrieved. + * + * @param credentials + * The credentials which are expected to contain the share key. + * + * @return + * A SharedAuthenticatedUser with access to a single shared connection, + * if the share key within the given credentials is valid, or null if + * the share key is invalid or absent. + */ + public SharedAuthenticatedUser retrieveSharedConnectionUser( + AuthenticationProvider authProvider, Credentials credentials) { + + // Validate the share key + String shareKey = getShareKey(credentials); + if (shareKey == null || connectionMap.get(shareKey) == null) + return null; + + // Return temporary in-memory user + return new SharedAuthenticatedUser(authProvider, credentials, shareKey); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/HashSharedConnectionMap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/HashSharedConnectionMap.java new file mode 100644 index 0000000..5b54b7b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/HashSharedConnectionMap.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDefinition; + +/** + * A HashMap-based implementation of the SharedConnectionMap. + */ +public class HashSharedConnectionMap implements SharedConnectionMap { + + /** + * Keeps track of the share key to SharedConnectionDefinition mapping. + */ + private final ConcurrentMap connectionMap = + new ConcurrentHashMap(); + + @Override + public SharedConnectionDefinition get(String key) { + + // There are no null share keys + if (key == null) + return null; + + // Update the last access time and return the SharedConnectionDefinition + return connectionMap.get(key); + + } + + @Override + public void add(SharedConnectionDefinition definition) { + + // Store definition by share key + String shareKey = definition.getShareKey(); + connectionMap.put(shareKey, definition); + + } + + @Override + public SharedConnectionDefinition remove(String key) { + + // There are no null share keys + if (key == null) + return null; + + // Attempt to retrieve only if non-null + SharedConnectionDefinition definition = connectionMap.remove(key); + if (definition == null) + return null; + + // Close all associated tunnels and disallow further sharing + definition.invalidate(); + return definition; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SecureRandomShareKeyGenerator.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SecureRandomShareKeyGenerator.java new file mode 100644 index 0000000..f4a0249 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SecureRandomShareKeyGenerator.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +import java.security.SecureRandom; + +/** + * An implementation of the ShareKeyGenerator which uses SecureRandom to + * generate cryptographically-secure random sharing keys. + */ +public class SecureRandomShareKeyGenerator extends SecureRandom + implements ShareKeyGenerator { + + /** + * The length of each generated share key, in base64-digits. + */ + private static final int KEY_LENGTH = 44; + + /** + * The character representations of each possible base64 digit. This class + * uses the URL-safe variant of base64 (also known as "base64url"), which + * uses '-' and '_' instead of '+' and '/' for digits 62 and 63 + * respectively. See RFC 4648, Section 5: "Base 64 Encoding with URL and + * Filename Safe Alphabet" (https://tools.ietf.org/html/rfc4648#section-5). + */ + private static final char[] URL_SAFE_BASE64_DIGITS = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' + }; + + @Override + public String getShareKey() { + + // Produce storage space for required share key length + char[] key = new char[KEY_LENGTH]; + + // Fill key with random digits + for (int i = 0; i < KEY_LENGTH; i++) + key[i] = URL_SAFE_BASE64_DIGITS[next(6)]; + + return new String(key); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/ShareKeyGenerator.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/ShareKeyGenerator.java new file mode 100644 index 0000000..edd3c75 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/ShareKeyGenerator.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +/** + * Produces unique keys that can be safely used for the automatically-generated + * "sharing credentials" associated with a shared connection. + */ +public interface ShareKeyGenerator { + + /** + * Returns a new share key, guaranteed to be unique from all previously- + * returned share keys. + * + * @return + * The new share key. + */ + public String getShareKey(); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java new file mode 100644 index 0000000..8cd6edc --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.AuthenticationProviderService; +import org.apache.guacamole.auth.jdbc.sharing.user.SharedAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.sharing.user.SharedUserContext; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * Service which authenticates users based on share keys and provides for the + * creation of corresponding UserContexts. The created UserContext objects are + * restricted to the connections associated with those share keys via a common + * ConnectionSharingService. + */ +public class SharedAuthenticationProviderService implements AuthenticationProviderService { + + /** + * Provider for retrieving SharedUserContext instances. + */ + @Inject + private Provider sharedUserContextProvider; + + /** + * Service for sharing active connections. + */ + @Inject + private ConnectionSharingService sharingService; + + @Override + public AuthenticatedUser authenticateUser(AuthenticationProvider authenticationProvider, + Credentials credentials) throws GuacamoleException { + + // Check whether user is authenticating with a valid sharing key + AuthenticatedUser user = sharingService.retrieveSharedConnectionUser(authenticationProvider, credentials); + if (user != null) + return user; + + // Otherwise, unauthorized + throw new GuacamoleInvalidCredentialsException("Invalid login", CredentialsInfo.USERNAME_PASSWORD); + + } + + @Override + public SharedUserContext getUserContext( + AuthenticationProvider authenticationProvider, + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Obtain a reference to a correct AuthenticatedUser which can be used + // for accessing shared connections + SharedAuthenticatedUser sharedAuthenticatedUser; + if (authenticatedUser instanceof SharedAuthenticatedUser) + sharedAuthenticatedUser = (SharedAuthenticatedUser) authenticatedUser; + else + sharedAuthenticatedUser = new SharedAuthenticatedUser(authenticatedUser); + + // Produce empty user context for known-authenticated user + SharedUserContext context = sharedUserContextProvider.get(); + context.init(authenticationProvider, sharedAuthenticatedUser); + + // Add the shared connection associated with the originally-provided + // share key (if any) + String shareKey = sharedAuthenticatedUser.getShareKey(); + if (shareKey != null) + context.registerShareKey(shareKey); + + return context; + + } + + @Override + public UserContext updateUserContext(AuthenticationProvider authenticationProvider, + UserContext context, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // Retrieve the share key from the request + String shareKey = sharingService.getShareKey(credentials); + + // Update the user context with the share key, if given + if (shareKey != null) + ((SharedUserContext) context).registerShareKey(shareKey); + + return context; + + } + + @Override + public UserContext decorateUserContext(AuthenticationProvider authenticationProvider, + UserContext context, AuthenticatedUser authenticatedUser, + Credentials credentials) { + + // There's no need to decorate the user context here + return context; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedConnectionMap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedConnectionMap.java new file mode 100644 index 0000000..c011e00 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedConnectionMap.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDefinition; + +/** + * Represents a mapping between share keys and the Guacamole connection being + * shared. + */ +public interface SharedConnectionMap { + + /** + * Stores the given SharedConnectionDefinition by its associated share key, + * allowing the connection it describes to be accessed by users having the + * share key. + * + * @param definition + * The SharedConnectionDefinition describing the connection being + * shared. + */ + public void add(SharedConnectionDefinition definition); + + /** + * Retrieves the connection definition associated with the given share key. + * If no such share key exists, null is returned. + * + * @param key + * The share key associated with the connection definition to be + * returned. + * + * @return + * The connection definition associated with the given share key, or + * null if no such share key exists. + */ + public SharedConnectionDefinition get(String key); + + /** + * Invalidates given share key, if it exists, returning the connection + * definition previously associated with that key. If no such share key + * exists, this function has no effect, and null is returned. + * + * @param key + * The share key associated with the connection definition to be + * removed. + * + * @return + * The connection definition previously associated with the given + * share key, or null if no such share key exists and no connection was + * removed. + */ + public SharedConnectionDefinition remove(String key); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedObjectManager.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedObjectManager.java new file mode 100644 index 0000000..c96373d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedObjectManager.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Provides thread-safe registration and cleanup of a growing set of objects. + * Each SharedObjectManager can track arbitrarily-many objects, each registered + * with the register() function. A SharedObjectManager tracks objects until it + * is invalidated, after which all registered objects are cleaned up. Attempts + * to register new objects after the SharedObjectManager has been invalidated + * will cause the provided object to be immediately cleaned up. + * + * @param + * The type of object managed by this SharedObjectManager. + */ +public abstract class SharedObjectManager { + + /** + * Whether this SharedObjectManager has been invalidated. + */ + private final AtomicBoolean invalidated = new AtomicBoolean(false); + + /** + * The collection of all objects being tracked by this SharedObjectManager. + */ + private final Queue objects = new ConcurrentLinkedQueue(); + + /** + * Cleans up the given object. This function is invoked exactly once on all + * tracked objects after invalidate() is called, and exactly once for any + * call to register() which occurs after invalidate() was called. + * + * @param object + * The object to cleanup. + */ + protected abstract void cleanup(T object); + + /** + * Invokes the cleanup() function on all tracked objects, removing each + * object from the underlying collection. It is guaranteed that cleanup() + * will be invoked only once for each object, even if multiple calls to + * cleanupAll() are running concurrently, and that the underlying collection + * will be empty after all calls to cleanupAll() complete. + */ + private void cleanupAll() { + + T current; + + // Remove all objects from underlying collection, cleaning up each + // object individually + while ((current = objects.poll()) != null) + cleanup(current); + + } + + /** + * Registers the given object with this SharedObjectManager such that it is + * cleaned up once the SharedObjectManager is invalidated. If the + * SharedObjectManager has already been invalidated, the object will be + * cleaned up immediately. + * + * @param object + * The object to register with this SharedObjectManager. + */ + public void register(T object) { + + // If already invalidated (or invalidation is in progress), avoid adding + // the object unnecessarily - just cleanup now + if (invalidated.get()) { + cleanup(object); + return; + } + + // Store provided object + objects.add(object); + + // If collection was invalidated while object was being added, recheck + // the underlying collection and cleanup + if (invalidated.get()) + cleanupAll(); + + } + + /** + * Invalidates this SharedObjectManager, cleaning up any registered objects + * and preventing future registration of objects. If attempts to register + * objects are made after this function is invoked, those objects will be + * immediately cleaned up. + */ + public void invalidate() { + + // Mark collection as invalidated, but do not bother cleaning up if + // already invalidated + if (!invalidated.compareAndSet(false, true)) + return; + + // Clean up all stored objects + cleanupAll(); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java new file mode 100644 index 0000000..48a0cbd --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.connection; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.sharing.connectiongroup.SharedRootConnectionGroup; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * A Connection which joins an active connection, limited by restrictions + * defined by a sharing profile. + */ +public class SharedConnection implements Connection { + + /** + * The name of the attribute which contains the username of the user that + * shared this connection. + */ + public static final String CONNECTION_OWNER = "jdbc-shared-by"; + + /** + * Service for establishing tunnels to Guacamole connections. + */ + @Inject + private GuacamoleTunnelService tunnelService; + + /** + * The user that successfully authenticated to obtain access to this + * SharedConnection. + */ + private RemoteAuthenticatedUser user; + + /** + * The SharedConnectionDefinition dictating the connection being shared and + * any associated restrictions. + */ + private SharedConnectionDefinition definition; + + /** + * Creates a new SharedConnection which can be used to join the connection + * described by the given SharedConnectionDefinition. + * + * @param user + * The user that successfully authenticated to obtain access to this + * SharedConnection. + * + * @param definition + * The SharedConnectionDefinition dictating the connection being shared + * and any associated restrictions. + */ + public void init(RemoteAuthenticatedUser user, SharedConnectionDefinition definition) { + this.user = user; + this.definition = definition; + } + + @Override + public String getIdentifier() { + return definition.getShareKey(); + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("Shared connections are immutable."); + } + + @Override + public String getName() { + return definition.getActiveConnection().getConnection().getName(); + } + + @Override + public void setName(String name) { + throw new UnsupportedOperationException("Shared connections are immutable."); + } + + @Override + public String getParentIdentifier() { + return SharedRootConnectionGroup.IDENTIFIER; + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + throw new UnsupportedOperationException("Shared connections are immutable."); + } + + @Override + public GuacamoleConfiguration getConfiguration() { + + // Pull the connection being shared + Connection primaryConnection = definition.getActiveConnection().getConnection(); + + // Construct a skeletal configuration that exposes only the protocol in use + GuacamoleConfiguration config = new GuacamoleConfiguration(); + config.setProtocol(primaryConnection.getConfiguration().getProtocol()); + return config; + + } + + @Override + public void setConfiguration(GuacamoleConfiguration config) { + throw new UnsupportedOperationException("Shared connections are immutable."); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + return tunnelService.getGuacamoleTunnel(user, definition, info, tokens); + } + + @Override + public Map getAttributes() { + String sharedBy = definition.getActiveConnection().getUser().getIdentifier(); + return Collections.singletonMap(CONNECTION_OWNER, sharedBy); + } + + @Override + public void setAttributes(Map attributes) { + // Do nothing - changing attributes not supported + } + + @Override + public Date getLastActive() { + return null; + } + + @Override + public Set getSharingProfileIdentifiers() + throws GuacamoleException { + return Collections.emptySet(); + } + + @Override + public int getActiveConnections() { + return 0; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnectionDefinition.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnectionDefinition.java new file mode 100644 index 0000000..4e7c3d5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnectionDefinition.java @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.connection; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.sharing.SharedObjectManager; +import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; +import org.apache.guacamole.auth.jdbc.tunnel.ActiveConnectionRecord; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Defines the semantics/restrictions of a shared connection by associating an + * active connection with an optional sharing profile. The sharing profile, if + * present, defines the access provided to users of the shared active + * connection through its connection parameters. If no sharing profile is + * present, the shared connection has the same level of access as the original + * connection. + */ +public class SharedConnectionDefinition { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(SharedConnectionDefinition.class); + + /** + * The active connection being shared. + */ + private final ActiveConnectionRecord activeConnection; + + /** + * The sharing profile which dictates the level of access provided to a user + * of the shared connection. + */ + private final ModeledSharingProfile sharingProfile; + + /** + * The unique key with which a user may access the shared connection. + */ + private final String shareKey; + + /** + * Manager which tracks all tunnels associated with this shared connection + * definition. All tunnels registered with this manager will be + * automatically closed once the manager is invalidated. + */ + private final SharedObjectManager tunnels = + new SharedObjectManager() { + + @Override + protected void cleanup(GuacamoleTunnel tunnel) { + + try { + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close tunnel of shared connection.", e); + } + + } + + }; + + /** + * Creates a new SharedConnectionDefinition which describes an active + * connection that can be joined, including the restrictions dictated by a + * given sharing profile. + * + * @param activeConnection + * The active connection being shared. + * + * @param sharingProfile + * A sharing profile whose associated parameters dictate the level of + * access provided to the shared connection, or null if the connection + * should be given full access. + * + * @param shareKey + * The unique key with which a user may access the shared connection. + */ + public SharedConnectionDefinition(ActiveConnectionRecord activeConnection, + ModeledSharingProfile sharingProfile, String shareKey) { + this.activeConnection = activeConnection; + this.sharingProfile = sharingProfile; + this.shareKey = shareKey; + } + + /** + * Returns the ActiveConnectionRecord of the actual in-progress connection + * being shared. + * + * @return + * The ActiveConnectionRecord being shared. + */ + public ActiveConnectionRecord getActiveConnection() { + return activeConnection; + } + + /** + * Returns the ModeledSharingProfile whose associated parameters dictate the + * level of access granted to users of the shared connection. + * + * @return + * A ModeledSharingProfile whose associated parameters dictate the + * level of access granted to users of the shared connection. + */ + public ModeledSharingProfile getSharingProfile() { + return sharingProfile; + } + + /** + * Returns the unique key with which a user may access the shared + * connection. + * + * @return + * The unique key with which a user may access the shared connection. + */ + public String getShareKey() { + return shareKey; + } + + /** + * Registers the given tunnel with this SharedConnectionDefinition, such + * that the tunnel is automatically closed when this + * SharedConnectionDefinition is invalidated. For shared connections to be + * properly closed when the associated share key ceases being valid, the + * tunnels resulting from the use of the share key MUST be registered to the + * SharedConnectionDefinition associated with that share key. + * + * @param tunnel + * The tunnel which should automatically be closed when this + * SharedConnectionDefinition is invalidated. + */ + public void registerTunnel(GuacamoleTunnel tunnel) { + tunnels.register(tunnel); + } + + /** + * Invalidates this SharedConnectionDefinition and closes all registered + * tunnels. If any additional tunnels are registered after this function is + * invoked, those tunnels will be immediately closed. This function MUST be + * invoked when the share key associated with this + * SharedConnectionDefinition will no longer be used. + */ + public void invalidate() { + tunnels.invalidate(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnectionDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnectionDirectory.java new file mode 100644 index 0000000..1fa86fa --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnectionDirectory.java @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.connection; + + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.jdbc.sharing.SharedConnectionMap; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Directory; + +/** + * A Directory implementation which exposes an explicitly-registered set of + * share keys as connections. Only explicitly-registered share keys are + * accessible a SharedConnectionDirectory. + */ +public class SharedConnectionDirectory implements Directory { + + /** + * Map of all currently-shared connections. + */ + @Inject + private SharedConnectionMap connectionMap; + + /** + * Provider for retrieving SharedConnection instances. + */ + @Inject + private Provider connectionProvider; + + /** + * The user associated with the UserContext that contains this directory. + */ + private RemoteAuthenticatedUser currentUser; + + /** + * The set of share keys that have been explicitly registered. In general, + * only valid share keys will be present here, but invalid keys are only + * removed after an attempt to retrieve those keys has been made. + */ + private final Set shareKeys = + Collections.newSetFromMap(new ConcurrentHashMap()); + + /** + * Creates a new SharedConnectionDirectory which exposes share keys as + * connections. Only explicitly-registered and valid share keys will be + * accessible. + * + * @param currentUser + * The user associated with the UserContext that will contain this + * directory. + */ + public void init(RemoteAuthenticatedUser currentUser) { + this.currentUser = currentUser; + } + + /** + * Registers a new share key such that the connection associated with that + * share key is accessible through this directory. The share key will be + * automatically de-registered when it is no longer valid. + * + * @param shareKey + * The share key to register. + */ + public void registerShareKey(String shareKey) { + shareKeys.add(shareKey); + } + + @Override + public Connection get(String identifier) throws GuacamoleException { + + // Allow access only to registered share keys + if (!shareKeys.contains(identifier)) + return null; + + // Retrieve the connection definition associated with that share key, + // cleaning up the internally-stored share key if it's no longer valid + SharedConnectionDefinition connectionDefinition = connectionMap.get(identifier); + if (connectionDefinition == null) { + shareKeys.remove(identifier); + return null; + } + + // Return a Connection which wraps that connection definition + SharedConnection connection = connectionProvider.get(); + connection.init(currentUser, connectionDefinition); + return connection; + + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + + // Create collection with enough backing space to contain one + // connection per identifier given + Collection matchingConnections = + new ArrayList(identifiers.size()); + + // Add all connnections which exist according to get() + for (String identifier : identifiers) { + Connection connection = get(identifier); + if (connection != null) + matchingConnections.add(connection); + } + + return Collections.unmodifiableCollection(matchingConnections); + + } + + @Override + public Set getIdentifiers() throws GuacamoleException { + return Collections.unmodifiableSet(shareKeys); + } + + @Override + public void add(Connection object) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void update(Connection object) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void remove(String identifier) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connectiongroup/SharedRootConnectionGroup.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connectiongroup/SharedRootConnectionGroup.java new file mode 100644 index 0000000..33d9ca7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connectiongroup/SharedRootConnectionGroup.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.connectiongroup; + +import org.apache.guacamole.auth.jdbc.sharing.user.SharedUserContext; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * A ConnectionGroup implementation which contains all connections accessible + * via a given SharedUserContext. The identifier of a SharedRootConnectionGroup + * is statically defined, and all Connections which are intended to be contained + * within an instance of SharedRootConnectionGroup MUST return that identifier + * via getParentIdentifier(). + */ +public class SharedRootConnectionGroup implements ConnectionGroup { + + /** + * The identifier of the root connection group. All Connections which are + * intended to be contained within an instance of SharedRootConnectionGroup + * MUST return this identifier via getParentIdentifier(). + */ + public static final String IDENTIFIER = "ROOT"; + + /** + * The SharedUserContext through which this connection group is accessible. + */ + private final SharedUserContext userContext; + + /** + * Creates a new SharedRootConnectionGroup which contains all connections + * accessible via the given SharedUserContext. The SharedRootConnectionGroup + * is backed by the SharedUserContext, and any changes to the connections + * within the SharedUserContext are immediately reflected in the + * SharedRootConnectionGroup. + * + * @param userContext + * The SharedUserContext which should back the new + * SharedRootConnectionGroup. + */ + public SharedRootConnectionGroup(SharedUserContext userContext) { + this.userContext = userContext; + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("The root group is immutable."); + } + + @Override + public String getName() { + return IDENTIFIER; + } + + @Override + public void setName(String name) { + throw new UnsupportedOperationException("The root group is immutable."); + } + + @Override + public String getParentIdentifier() { + return IDENTIFIER; + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + throw new UnsupportedOperationException("The root group is immutable."); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + // Do nothing - no attributes supported + } + + @Override + public int getActiveConnections() { + return 0; + } + + @Override + public void setType(Type type) { + throw new UnsupportedOperationException("The root group is immutable."); + } + + @Override + public Type getType() { + return Type.ORGANIZATIONAL; + } + + @Override + public Set getConnectionIdentifiers() throws GuacamoleException { + Directory connectionDirectory = userContext.getConnectionDirectory(); + return connectionDirectory.getIdentifiers(); + } + + @Override + public Set getConnectionGroupIdentifiers() throws GuacamoleException { + return Collections.emptySet(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/permission/SharedObjectPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/permission/SharedObjectPermissionSet.java new file mode 100644 index 0000000..c8bf0df --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/permission/SharedObjectPermissionSet.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.permission; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.simple.SimpleObjectPermissionSet; + +/** + * An immutable ObjectPermissionSet which defines only READ permissions for a + * fixed set of identifiers. + */ +public class SharedObjectPermissionSet extends SimpleObjectPermissionSet { + + /** + * Returns a new Set of ObjectPermissions defining READ access for each of + * the given identifiers. + * + * @param identifiers + * The identifiers of the objects for which READ permission should be + * granted. + * + * @return + * A new Set of ObjectPermissions granting READ access for each of the + * given identifiers. + */ + private static Set getPermissions(Collection identifiers) { + + // Include one READ permission for each of the given identifiers + Set permissions = new HashSet(); + for (String identifier : identifiers) + permissions.add(new ObjectPermission(ObjectPermission.Type.READ, identifier)); + + return permissions; + + } + + /** + * Creates a new SharedObjectPermissionSet which grants read-only access to + * the objects having the given identifiers. No other permissions are + * granted. + * + * @param identifiers + * The identifiers of the objects for which READ access should be + * granted. + */ + public SharedObjectPermissionSet(Collection identifiers) { + super(getPermissions(identifiers)); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedAuthenticatedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedAuthenticatedUser.java new file mode 100644 index 0000000..96c6a9e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedAuthenticatedUser.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.user; + +import java.util.Collections; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Associates a user with the credentials they used to authenticate, including + * any provided share key. + */ +public class SharedAuthenticatedUser extends RemoteAuthenticatedUser { + + /** + * The username of this user. + */ + private final String identifier; + + /** + * The share key which was provided by this user when they authenticated. If + * there is no such share key, this will be null. + */ + private final String shareKey; + + /** + * Creates a new SharedAuthenticatedUser which copies the details of the + * given AuthenticatedUser, including that user's identifier (username). + * The new SharedAuthenticatedUser will not have any associated share key. + * + * @param authenticatedUser + * The AuthenticatedUser to copy. + */ + public SharedAuthenticatedUser(AuthenticatedUser authenticatedUser) { + super(authenticatedUser.getAuthenticationProvider(), + authenticatedUser.getCredentials(), Collections.emptySet()); + this.shareKey = null; + this.identifier = authenticatedUser.getIdentifier(); + } + + /** + * Creates a new SharedAuthenticatedUser associating the given user with + * their corresponding credentials and share key. The identifier (username) + * of the user will be the standard identifier for anonymous users as + * defined by the Guacamole extension API. + * + * @param authenticationProvider + * The AuthenticationProvider that has authenticated the given user. + * + * @param credentials + * The credentials given by the user when they authenticated. + * + * @param shareKey + * The share key which was provided by this user when they + * authenticated, or null if no share key was provided. + */ + public SharedAuthenticatedUser(AuthenticationProvider authenticationProvider, + Credentials credentials, String shareKey) { + super(authenticationProvider, credentials, Collections.emptySet()); + this.shareKey = shareKey; + this.identifier = AuthenticatedUser.ANONYMOUS_IDENTIFIER; + } + + /** + * Returns the share key which was provided by this user when they + * authenticated. If there is no such share key, null is returned. + * + * @return + * The share key which was provided by this user when they + * authenticated, or null if no share key was provided. + */ + public String getShareKey() { + return shareKey; + } + + @Override + public String getIdentifier() { + return identifier; + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("Users authenticated via share keys are immutable."); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java new file mode 100644 index 0000000..80d2219 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.user; + +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.sharing.permission.SharedObjectPermissionSet; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.RelatedObjectSet; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * An immutable implementation of User which defines READ permission for each of + * the objects accessible through the various directories of a given + * SharedUserContext. + */ +public class SharedUser implements User { + + /** + * The AuthenticatedUser that this SharedUser represents. + */ + private final AuthenticatedUser user; + + /** + * The SharedUserContext which should be used to define which objects this + * SharedUser has READ permission for. + */ + private final SharedUserContext userContext; + + /** + * Creates a new SharedUser whose identity is defined by the given + * AuthenticatedUser, and who has strictly READ access to all objects + * accessible via the various directories of the given SharedUserContext. + * + * @param user + * The AuthenticatedUser that the SharedUser should represent. + * + * @param userContext + * The SharedUserContext which should be used to define which objects + * the SharedUser has READ permission for. + */ + public SharedUser(AuthenticatedUser user, SharedUserContext userContext) { + this.user = user; + this.userContext = userContext; + } + + @Override + public String getIdentifier() { + return user.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("Users authenticated via share keys are immutable."); + } + + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + // Do nothing - no attributes supported + } + + @Override + public Date getLastActive() { + + // History is not recorded for shared users + return null; + + } + + @Override + public String getPassword() { + return null; + } + + @Override + public void setPassword(String password) { + throw new UnsupportedOperationException("Users authenticated via share keys are immutable."); + } + + @Override + public SystemPermissionSet getSystemPermissions() throws GuacamoleException { + return SystemPermissionSet.EMPTY_SET; + } + + @Override + public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { + Directory connectionDirectory = userContext.getConnectionDirectory(); + return new SharedObjectPermissionSet(connectionDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { + Directory connectionGroupDirectory = userContext.getConnectionGroupDirectory(); + return new SharedObjectPermissionSet(connectionGroupDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getUserPermissions() throws GuacamoleException { + Directory userDirectory = userContext.getUserDirectory(); + return new SharedObjectPermissionSet(userDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + return RelatedObjectSet.EMPTY_SET; + } + + @Override + public Permissions getEffectivePermissions() throws GuacamoleException { + return this; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java new file mode 100644 index 0000000..3950007 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharing.user; + +import com.google.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDirectory; +import org.apache.guacamole.auth.jdbc.sharing.connectiongroup.SharedRootConnectionGroup; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.auth.AbstractUserContext; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; + +/** + * The user context of a SharedUser, providing access ONLY to the user + * themselves, the any SharedConnections associated with that user via share + * keys, and an internal root connection group containing only those + * connections. + */ +public class SharedUserContext extends AbstractUserContext { + + /** + * The AuthenticationProvider that created this SharedUserContext. + */ + private AuthenticationProvider authProvider; + + /** + * The user whose level of access is represented by this user context. + */ + private User self; + + /** + * A directory of all connections visible to the user for whom this user + * context was created. + */ + @Inject + private SharedConnectionDirectory connectionDirectory; + + /** + * The root connection group of the hierarchy containing all connections + * and connection groups visible to the user for whom this user context was + * created. + */ + private ConnectionGroup rootGroup; + + /** + * Creates a new SharedUserContext which provides access ONLY to the given + * user, the SharedConnections associated with the share keys used by that + * user, and an internal root connection group containing only those + * SharedConnections. + * + * @param authProvider + * The AuthenticationProvider that created this + * SharedUserContext; + * + * @param user + * The RemoteAuthenticatedUser for whom this SharedUserContext is being + * created. + */ + public void init(AuthenticationProvider authProvider, RemoteAuthenticatedUser user) { + + // Associate the originating authentication provider + this.authProvider = authProvider; + + // Provide access to all connections shared with the given user + this.connectionDirectory.init(user); + + // The connection group directory contains only the root group + this.rootGroup = new SharedRootConnectionGroup(this); + + // Create internal pseudo-account representing the authenticated user + this.self = new SharedUser(user, this); + + } + + /** + * Registers a new share key with this SharedUserContext such that the user + * will have access to the connection associated with that share key. The + * share key will be automatically de-registered when it is no longer valid. + * + * @param shareKey + * The share key to register. + */ + public void registerShareKey(String shareKey) { + connectionDirectory.registerShareKey(shareKey); + } + + @Override + public User self() { + return self; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return connectionDirectory; + } + + @Override + public ConnectionGroup getRootConnectionGroup() { + return rootGroup; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/ModeledSharingProfile.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/ModeledSharingProfile.java new file mode 100644 index 0000000..1acbd79 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/ModeledSharingProfile.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.auth.jdbc.base.ModeledChildDirectoryObject; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.SharingProfile; + +/** + * An implementation of the SharingProfile object which is backed by a database + * model. + */ +public class ModeledSharingProfile + extends ModeledChildDirectoryObject + implements SharingProfile { + + /** + * All possible attributes of sharing profile objects organized as + * individual, logical forms. Currently, there are no such attributes. + */ + public static final Collection ATTRIBUTES = Collections.emptyList(); + + /** + * The manually-set parameter map, if any. + */ + private Map parameters = null; + + /** + * Service for managing sharing profiles. + */ + @Inject + private SharingProfileService sharingProfileService; + + /** + * Creates a new, empty ModeledSharingProfile. + */ + public ModeledSharingProfile() { + } + + @Override + public String getName() { + return getModel().getName(); + } + + @Override + public void setName(String name) { + getModel().setName(name); + } + + @Override + public String getPrimaryConnectionIdentifier() { + return getModel().getParentIdentifier(); + } + + @Override + public void setPrimaryConnectionIdentifier(String identifier) { + getModel().setParentIdentifier(identifier); + } + + @Override + public Map getParameters() { + + // Retrieve visible parameters, if not overridden by setParameters() + if (parameters == null) + return sharingProfileService.retrieveParameters(getCurrentUser(), + getModel().getIdentifier()); + + return parameters; + + } + + @Override + public void setParameters(Map parameters) { + this.parameters = parameters; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileDirectory.java new file mode 100644 index 0000000..4035ff0 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileDirectory.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.JDBCDirectory; +import org.apache.guacamole.net.auth.SharingProfile; +import org.mybatis.guice.transactional.Transactional; + +/** + * Implementation of the SharingProfile Directory which is driven by an + * underlying, arbitrary database. + */ +public class SharingProfileDirectory extends JDBCDirectory { + + /** + * Service for managing sharing profile objects. + */ + @Inject + private SharingProfileService sharingProfileService; + + @Override + public SharingProfile get(String identifier) throws GuacamoleException { + return sharingProfileService.retrieveObject(getCurrentUser(), identifier); + } + + @Override + @Transactional + public Collection getAll(Collection identifiers) throws GuacamoleException { + return Collections.unmodifiableCollection( + sharingProfileService.retrieveObjects(getCurrentUser(), identifiers) + ); + } + + @Override + @Transactional + public Set getIdentifiers() throws GuacamoleException { + return sharingProfileService.getIdentifiers(getCurrentUser()); + } + + @Override + @Transactional + public void add(SharingProfile object) throws GuacamoleException { + sharingProfileService.createObject(getCurrentUser(), object); + } + + @Override + @Transactional + public void update(SharingProfile object) throws GuacamoleException { + ModeledSharingProfile sharingProfile = (ModeledSharingProfile) object; + sharingProfileService.updateObject(getCurrentUser(), sharingProfile); + } + + @Override + @Transactional + public void remove(String identifier) throws GuacamoleException { + sharingProfileService.deleteObject(getCurrentUser(), identifier); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.java new file mode 100644 index 0000000..11c9b8b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for sharing profile objects. + */ +public interface SharingProfileMapper + extends ModeledDirectoryObjectMapper { + + /** + * Selects the sharing profile associated with the given primary connection + * and having the given name. If no such sharing profile exists, null is + * returned. + * + * @param parentIdentifier + * The identifier of the primary connection to search against. + * + * @param name + * The name of the sharing profile to find. + * + * @return + * The sharing profile having the given name and associated with the + * given primary connection, or null if no such sharing profile exists. + */ + SharingProfileModel selectOneByName( + @Param("parentIdentifier") String parentIdentifier, + @Param("name") String name); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileModel.java new file mode 100644 index 0000000..375282d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileModel.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +import org.apache.guacamole.auth.jdbc.base.ChildObjectModel; + +/** + * Object representation of a Guacamole sharing profile, as represented in the + * database. + */ +public class SharingProfileModel extends ChildObjectModel { + + /** + * The human-readable name associated with this sharing profile. + */ + private String name; + + /** + * Creates a new, empty sharing profile. + */ + public SharingProfileModel() { + } + + /** + * Returns the name associated with this sharing profile. + * + * @return + * The name associated with this sharing profile. + */ + public String getName() { + return name; + } + + /** + * Sets the name associated with this sharing profile. + * + * @param name + * The name to associate with this sharing profile. + */ + public void setName(String name) { + this.name = name; + } + + @Override + public String getIdentifier() { + + // If no associated ID, then no associated identifier + Integer id = getObjectID(); + if (id == null) + return null; + + // Otherwise, the identifier is the ID as a string + return id.toString(); + + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("Sharing profile identifiers " + + "are derived from IDs. They cannot be set."); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.java new file mode 100644 index 0000000..e3501d6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +import java.util.Collection; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for sharing profile parameter objects. + */ +public interface SharingProfileParameterMapper { + + /** + * Returns a collection of all parameters associated with the sharing + * profile having the given identifier. + * + * @param identifier + * The identifier of the sharing profile whose parameters are to be + * retrieved. + * + * @return + * A collection of all parameters associated with the sharing profile + * having the given identifier. This collection will be empty if no + * such sharing profile exists. + */ + Collection select(@Param("identifier") String identifier); + + /** + * Inserts each of the parameter model objects in the given collection as + * new sharing profile parameters. + * + * @param parameters + * The sharing profile parameters to insert. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("parameters") Collection parameters); + + /** + * Deletes all parameters associated with the sharing profile having the + * given identifier. + * + * @param identifier + * The identifier of the sharing profile whose parameters should be + * deleted. + * + * @return + * The number of rows deleted. + */ + int delete(@Param("identifier") String identifier); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterModel.java new file mode 100644 index 0000000..88c70f0 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterModel.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +/** + * A single parameter name/value pair belonging to a sharing profile. + */ +public class SharingProfileParameterModel { + + /** + * The identifier of the sharing profile associated with this parameter. + */ + private String sharingProfileIdentifier; + + /** + * The name of the parameter. + */ + private String name; + + /** + * The value the parameter is set to. + */ + private String value; + + /** + * Returns the identifier of the sharing profile associated with this + * parameter. + * + * @return + * The identifier of the sharing profile associated with this + * parameter. + */ + public String getSharingProfileIdentifier() { + return sharingProfileIdentifier; + } + + /** + * Sets the identifier of the sharing profile associated with this + * parameter. + * + * @param sharingProfileIdentifier + * The identifier of the sharing profile to associate with this + * parameter. + */ + public void setSharingProfileIdentifier(String sharingProfileIdentifier) { + this.sharingProfileIdentifier = sharingProfileIdentifier; + } + + /** + * Returns the name of this parameter. + * + * @return + * The name of this parameter. + */ + public String getName() { + return name; + } + + /** + * Sets the name of this parameter. + * + * @param name + * The name of this parameter. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the value of this parameter. + * + * @return + * The value of this parameter. + */ + public String getValue() { + return value; + } + + /** + * Sets the value of this parameter. + * + * @param value + * The value of this parameter. + */ + public void setValue(String value) { + this.value = value; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileService.java new file mode 100644 index 0000000..4ca492c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileService.java @@ -0,0 +1,299 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.sharingprofile; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.ModeledChildDirectoryObjectService; +import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating sharing profiles. + */ +public class SharingProfileService + extends ModeledChildDirectoryObjectService { + + /** + * Mapper for accessing sharing profiles. + */ + @Inject + private SharingProfileMapper sharingProfileMapper; + + /** + * Mapper for manipulating sharing profile permissions. + */ + @Inject + private SharingProfilePermissionMapper sharingProfilePermissionMapper; + + /** + * Mapper for accessing sharing profile parameters. + */ + @Inject + private SharingProfileParameterMapper parameterMapper; + + /** + * Provider for creating sharing profiles. + */ + @Inject + private Provider sharingProfileProvider; + + @Override + protected ModeledDirectoryObjectMapper getObjectMapper() { + return sharingProfileMapper; + } + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return sharingProfilePermissionMapper; + } + + @Override + protected ModeledSharingProfile getObjectInstance(ModeledAuthenticatedUser currentUser, + SharingProfileModel model) { + ModeledSharingProfile sharingProfile = sharingProfileProvider.get(); + sharingProfile.init(currentUser, model); + return sharingProfile; + } + + @Override + protected SharingProfileModel getModelInstance(ModeledAuthenticatedUser currentUser, + final SharingProfile object) { + + // Create new ModeledSharingProfile backed by blank model + SharingProfileModel model = new SharingProfileModel(); + ModeledSharingProfile sharingProfile = getObjectInstance(currentUser, model); + + // Set model contents through ModeledSharingProfile, copying the + // provided sharing profile + sharingProfile.setPrimaryConnectionIdentifier(object.getPrimaryConnectionIdentifier()); + sharingProfile.setName(object.getName()); + sharingProfile.setParameters(object.getParameters()); + sharingProfile.setAttributes(object.getAttributes()); + + return model; + + } + + @Override + protected boolean hasCreatePermission(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return whether user has explicit sharing profile creation permission + SystemPermissionSet permissionSet = user.getUser().getEffectivePermissions().getSystemPermissions(); + return permissionSet.hasPermission(SystemPermission.Type.CREATE_SHARING_PROFILE); + + } + + @Override + protected ObjectPermissionSet getEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return permissions related to sharing profiles + return user.getUser().getEffectivePermissions().getSharingProfilePermissions(); + + } + + @Override + protected ObjectPermissionSet getParentEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Sharing profiles are children of connections + return user.getUser().getEffectivePermissions().getConnectionPermissions(); + + } + + @Override + protected void beforeCreate(ModeledAuthenticatedUser user, + SharingProfile object, SharingProfileModel model) + throws GuacamoleException { + + super.beforeCreate(user, object, model); + + // Name must not be blank + if (model.getName() == null || model.getName().trim().isEmpty()) + throw new GuacamoleClientException("Sharing profile names must not be blank."); + + // Do not attempt to create duplicate sharing profiles + SharingProfileModel existing = sharingProfileMapper.selectOneByName(model.getParentIdentifier(), model.getName()); + if (existing != null) + throw new GuacamoleClientException("The sharing profile \"" + model.getName() + "\" already exists."); + + } + + @Override + protected void beforeUpdate(ModeledAuthenticatedUser user, + ModeledSharingProfile object, SharingProfileModel model) + throws GuacamoleException { + + super.beforeUpdate(user, object, model); + + // Name must not be blank + if (model.getName() == null || model.getName().trim().isEmpty()) + throw new GuacamoleClientException("Sharing profile names must not be blank."); + + // Check whether such a sharing profile is already present + SharingProfileModel existing = sharingProfileMapper.selectOneByName(model.getParentIdentifier(), model.getName()); + if (existing != null) { + + // If the specified name matches a DIFFERENT existing sharing profile, the update cannot continue + if (!existing.getObjectID().equals(model.getObjectID())) + throw new GuacamoleClientException("The sharing profile \"" + model.getName() + "\" already exists."); + + } + + } + + /** + * Given an arbitrary Guacamole sharing profile, produces a collection of + * parameter model objects containing the name/value pairs of that + * sharing profile's parameters. + * + * @param sharingProfile + * The sharing profile whose configuration should be used to produce the + * collection of parameter models. + * + * @return + * A collection of parameter models containing the name/value pairs + * of the given sharing profile's parameters. + */ + private Collection getParameterModels(ModeledSharingProfile sharingProfile) { + + Map parameters = sharingProfile.getParameters(); + + // Convert parameters to model objects + Collection parameterModels = new ArrayList(parameters.size()); + for (Map.Entry parameterEntry : parameters.entrySet()) { + + // Get parameter name and value + String name = parameterEntry.getKey(); + String value = parameterEntry.getValue(); + + // There is no need to insert empty parameters + if (value == null || value.isEmpty()) + continue; + + // Produce model object from parameter + SharingProfileParameterModel model = new SharingProfileParameterModel(); + model.setSharingProfileIdentifier(sharingProfile.getIdentifier()); + model.setName(name); + model.setValue(value); + + // Add model to list + parameterModels.add(model); + + } + + return parameterModels; + + } + + @Override + public ModeledSharingProfile createObject(ModeledAuthenticatedUser user, SharingProfile object) + throws GuacamoleException { + + // Create sharing profile + ModeledSharingProfile sharingProfile = super.createObject(user, object); + sharingProfile.setParameters(object.getParameters()); + + // Insert new parameters, if any + Collection parameterModels = getParameterModels(sharingProfile); + if (!parameterModels.isEmpty()) + parameterMapper.insert(parameterModels); + + return sharingProfile; + + } + + @Override + public void updateObject(ModeledAuthenticatedUser user, ModeledSharingProfile object) + throws GuacamoleException { + + // Update sharing profile + super.updateObject(user, object); + + // Replace existing parameters with new parameters, if any + Collection parameterModels = getParameterModels(object); + parameterMapper.delete(object.getIdentifier()); + if (!parameterModels.isEmpty()) + parameterMapper.insert(parameterModels); + + } + + /** + * Retrieves all parameters visible to the given user and associated with + * the sharing profile having the given identifier. If the given user has no + * access to such parameters, or no such sharing profile exists, the + * returned map will be empty. + * + * @param user + * The user retrieving sharing profile parameters. + * + * @param identifier + * The identifier of the sharing profile whose parameters are being + * retrieved. + * + * @return + * A new map of all parameter name/value pairs that the given user has + * access to. + */ + public Map retrieveParameters(ModeledAuthenticatedUser user, + String identifier) { + + Map parameterMap = new HashMap(); + + // Determine whether we have permission to read parameters + boolean canRetrieveParameters; + try { + canRetrieveParameters = hasObjectPermission(user, identifier, + ObjectPermission.Type.UPDATE); + } + + // Provide empty (but mutable) map if unable to check permissions + catch (GuacamoleException e) { + return parameterMap; + } + + // Populate parameter map if we have permission to do so + if (canRetrieveParameters) { + for (SharingProfileParameterModel parameter : parameterMapper.select(identifier)) + parameterMap.put(parameter.getName(), parameter.getValue()); + } + + return parameterMap; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java new file mode 100644 index 0000000..2600689 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java @@ -0,0 +1,826 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordMapper; +import org.apache.guacamole.auth.jdbc.connection.ConnectionModel; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordModel; +import org.apache.guacamole.auth.jdbc.connection.ConnectionParameterModel; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceConflictException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleUpstreamException; +import org.apache.guacamole.auth.jdbc.connection.ConnectionMapper; +import org.apache.guacamole.net.GuacamoleSocket; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.ConfiguredGuacamoleSocket; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.token.TokenFilter; +import org.mybatis.guice.transactional.Transactional; +import org.apache.guacamole.auth.jdbc.connection.ConnectionParameterMapper; +import org.apache.guacamole.auth.jdbc.sharing.SharedConnectionMap; +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDefinition; +import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileParameterMapper; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileParameterModel; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.protocol.FailoverGuacamoleSocket; +import org.apache.guacamole.properties.CaseSensitivity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Base implementation of the GuacamoleTunnelService, handling retrieval of + * connection parameters, load balancing, and connection usage counts. The + * implementation of concurrency rules is up to policy-specific subclasses. + */ +public abstract class AbstractGuacamoleTunnelService implements GuacamoleTunnelService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(AbstractGuacamoleTunnelService.class); + + /** + * The prefix that will be used to generate JDBC tokens. + */ + private static final String JDBC_TOKEN_PREFIX = "JDBC_"; + + /** + * The token that contains the date the connection was started. + */ + private static final String JDBC_DATE_TOKEN = JDBC_TOKEN_PREFIX + "STARTDATE"; + + /** + * The format of the date in the date token. + */ + private static final String JDBC_DATE_TOKEN_FORMAT = "yyyyMMdd"; + + /** + * The token that contains the start time of the connection. + */ + private static final String JDBC_TIME_TOKEN = JDBC_TOKEN_PREFIX + "STARTTIME"; + + /** + * The format of the time in the time token. + */ + private static final String JDBC_TIME_TOKEN_FORMAT = "HHmmss"; + + /** + * The token that contains the connection name. + */ + private static final String JDBC_CONNECTION_NAME_TOKEN = JDBC_TOKEN_PREFIX + "CONNECTION_NAME"; + + /** + * The token that contains the connection identifier. + */ + private static final String JDBC_CONNECTION_ID_TOKEN = JDBC_TOKEN_PREFIX + "CONNECTION_ID"; + + /** + * The token that contains the hostname configured in the connection parameters. + */ + private static final String JDBC_CONNECTION_HOSTNAME_TOKEN = JDBC_TOKEN_PREFIX + "HOSTNAME"; + + /** + * The name of the parameter containing the hostname in the configuration. + */ + private static final String JDBC_CONNECTION_HOSTNAME_TOKEN_PARAMETER = "hostname"; + + /** + * The token containing the protocol configured in the connection. + */ + private static final String JDBC_CONNECTION_PROTOCOL_TOKEN = JDBC_TOKEN_PREFIX + "PROTOCOL"; + + /** + * Mapper for accessing connections. + */ + @Inject + private ConnectionMapper connectionMapper; + + /** + * Provider for creating connections. + */ + @Inject + private Provider connectionProvider; + + /** + * Mapper for accessing connection parameters. + */ + @Inject + private ConnectionParameterMapper connectionParameterMapper; + + /** + * Mapper for accessing sharing profile parameters. + */ + @Inject + private SharingProfileParameterMapper sharingProfileParameterMapper; + + /** + * Mapper for accessing connection history. + */ + @Inject + private ConnectionRecordMapper connectionRecordMapper; + + /** + * Map of all currently-shared connections. + */ + @Inject + private SharedConnectionMap connectionMap; + + /** + * The Guacamole server environment. + */ + @Inject + private JDBCEnvironment environment; + + /** + * All active connections through the tunnel having a given UUID. + */ + private final Map activeTunnels = + new ConcurrentHashMap<>(); + + /** + * All active connections to a connection having a given identifier. + */ + private final ActiveConnectionMultimap activeConnections = new ActiveConnectionMultimap(); + + /** + * All active connections to a connection group having a given identifier. + */ + private final ActiveConnectionMultimap activeConnectionGroups = new ActiveConnectionMultimap(); + + /** + * Acquires possibly-exclusive access to any one of the given connections + * on behalf of the given user. If access is denied for any reason, or if + * no connection is available, an exception is thrown. + * + * @param user + * The user acquiring access. + * + * @param connections + * The connections being accessed. + * + * @param includeFailoverOnly + * Whether connections which have been designated for use in failover + * situations only (hot spares) may be considered. + * + * @return + * The connection that has been acquired on behalf of the given user. + * + * @throws GuacamoleException + * If access is denied to the given user for any reason. + */ + protected abstract ModeledConnection acquire(RemoteAuthenticatedUser user, + List connections, boolean includeFailoverOnly) + throws GuacamoleException; + + /** + * Releases possibly-exclusive access to the given connection on behalf of + * the given user. If the given user did not already have access, the + * behavior of this function is undefined. + * + * @param user + * The user releasing access. + * + * @param connection + * The connection being released. + */ + protected abstract void release(RemoteAuthenticatedUser user, + ModeledConnection connection); + + /** + * Acquires possibly-exclusive access to the given connection group on + * behalf of the given user. If access is denied for any reason, an + * exception is thrown. + * + * @param user + * The user acquiring access. + * + * @param connectionGroup + * The connection group being accessed. + * + * @throws GuacamoleException + * If access is denied to the given user for any reason. + */ + protected abstract void acquire(RemoteAuthenticatedUser user, + ModeledConnectionGroup connectionGroup) throws GuacamoleException; + + /** + * Releases possibly-exclusive access to the given connection group on + * behalf of the given user. If the given user did not already have access, + * the behavior of this function is undefined. + * + * @param user + * The user releasing access. + * + * @param connectionGroup + * The connection group being released. + */ + protected abstract void release(RemoteAuthenticatedUser user, + ModeledConnectionGroup connectionGroup); + + /** + * Returns a GuacamoleConfiguration which connects to the given connection. + * If the ID of an active connection is provided, that active connection + * will be joined rather than establishing an entirely new connection. If + * a sharing profile is provided, the parameters associated with that + * sharing profile will be used to define the access provided to the user + * accessing the shared connection. + * + * @param connection + * The connection that the user is connecting to. + * + * @param connectionID + * The ID of the active connection being joined, as provided by guacd + * when the original connection was established, or null if a new + * connection should be established instead. + * + * @param sharingProfile + * The sharing profile whose associated parameters dictate the level + * of access granted to the user joining the connection, or null if the + * parameters associated with the connection should be used. + * + * @return + * A GuacamoleConfiguration defining the requested, possibly shared + * connection. + */ + private GuacamoleConfiguration getGuacamoleConfiguration( + ModeledConnection connection, String connectionID, + ModeledSharingProfile sharingProfile) { + + ConnectionModel model = connection.getModel(); + + // Generate configuration from available data + GuacamoleConfiguration config = new GuacamoleConfiguration(); + config.setProtocol(model.getProtocol()); + config.setConnectionID(connectionID); + + // Set parameters from associated data + if (sharingProfile != null) { + Collection parameters = sharingProfileParameterMapper.select(sharingProfile.getIdentifier()); + for (SharingProfileParameterModel parameter : parameters) + config.setParameter(parameter.getName(), parameter.getValue()); + } + else { + Collection parameters = connectionParameterMapper.select(connection.getIdentifier()); + for (ConnectionParameterModel parameter : parameters) + config.setParameter(parameter.getName(), parameter.getValue()); + } + + return config; + + } + + /** + * Returns an unconfigured GuacamoleSocket that is already connected to + * guacd as specified in guacamole.properties, using SSL if necessary. + * + * @param proxyConfig + * The configuration information to use when connecting to guacd. + * + * @param socketClosedCallback + * The callback which should be invoked whenever the returned socket + * closes. + * + * @return + * An unconfigured GuacamoleSocket, already connected to guacd. + * + * @throws GuacamoleException + * If an error occurs while connecting to guacd, or while parsing + * guacd-related properties. + */ + private GuacamoleSocket getUnconfiguredGuacamoleSocket( + GuacamoleProxyConfiguration proxyConfig, + Runnable socketClosedCallback) throws GuacamoleException { + + // Select socket type depending on desired encryption + switch (proxyConfig.getEncryptionMethod()) { + + // Use SSL if requested + case SSL: + return new ManagedSSLGuacamoleSocket( + proxyConfig.getHostname(), + proxyConfig.getPort(), + socketClosedCallback + ); + + // Use straight TCP if unencrypted + case NONE: + return new ManagedInetGuacamoleSocket( + proxyConfig.getHostname(), + proxyConfig.getPort(), + socketClosedCallback + ); + + } + + // Bail out if encryption method is unknown + throw new GuacamoleServerException("Unimplemented encryption method."); + + } + + /** + * Task which handles cleanup of a connection associated with some given + * ActiveConnectionRecord. + */ + private class ConnectionCleanupTask implements Runnable { + + /** + * Whether this task has run. + */ + private final AtomicBoolean hasRun = new AtomicBoolean(false); + + /** + * The ActiveConnectionRecord whose connection will be cleaned up once + * this task runs. + */ + private final ActiveConnectionRecord activeConnection; + + /** + * Creates a new task which automatically cleans up after the + * connection associated with the given ActiveConnectionRecord. The + * connection and parent group will be removed from the maps of active + * connections and groups, and exclusive access will be released. + * + * @param activeConnection + * The ActiveConnectionRecord whose associated connection should be + * cleaned up once this task runs. + */ + public ConnectionCleanupTask(ActiveConnectionRecord activeConnection) { + this.activeConnection = activeConnection; + } + + @Override + public void run() { + + // Only run once + if (!hasRun.compareAndSet(false, true)) + return; + + // Connection can no longer be shared + activeConnection.invalidate(); + + // Remove underlying tunnel from list of active tunnels + UUID uuid = activeConnection.getUUID(); // May be null if record not successfully inserted + if (uuid != null) + activeTunnels.remove(uuid.toString()); + + // Get original user + RemoteAuthenticatedUser user = activeConnection.getUser(); + + // Release the associated connection if this is the primary connection + if (activeConnection.isPrimaryConnection()) { + + // Get connection and associated identifiers + ModeledConnection connection = activeConnection.getConnection(); + String identifier = connection.getIdentifier(); + String parentIdentifier = connection.getParentIdentifier(); + + // Release connection + activeConnections.remove(identifier, activeConnection); + activeConnectionGroups.remove(parentIdentifier, activeConnection); + release(user, connection); + + } + + // Release any associated group + if (activeConnection.hasBalancingGroup()) + release(user, activeConnection.getBalancingGroup()); + + // Update history record with end date + ConnectionRecordModel recordModel = activeConnection.getModel(); + recordModel.setEndDate(new Date()); + connectionRecordMapper.updateEndDate(recordModel); + + } + + } + + /** + * Creates a tunnel for the given user which connects to the given + * connection, which MUST already be acquired via acquire(). The given + * client information will be passed to guacd when the connection is + * established. + * + * The connection will be automatically released when it closes, or if it + * fails to establish entirely. + * + * @param activeConnection + * The active connection record of the connection in use. + * + * @param info + * Information describing the Guacamole client connecting to the given + * connection. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @param interceptErrors + * Whether errors from the upstream remote desktop should be + * intercepted and rethrown as GuacamoleUpstreamExceptions. + * + * @return + * A new GuacamoleTunnel which is configured and connected to the given + * connection. + * + * @throws GuacamoleException + * If an error occurs while the connection is being established, or + * while connection configuration information is being retrieved. + */ + private GuacamoleTunnel assignGuacamoleTunnel(ActiveConnectionRecord activeConnection, + GuacamoleClientInformation info, Map tokens, + boolean interceptErrors) throws GuacamoleException { + + // Record new active connection + Runnable cleanupTask = new ConnectionCleanupTask(activeConnection); + try { + // This MUST happen before getUUID() is invoked, to ensure the ID driving the UUID exists + connectionRecordMapper.insert(activeConnection.getModel(), + environment.getCaseSensitivity()); + activeTunnels.put(activeConnection.getUUID().toString(), activeConnection); + } + + // Execute cleanup if connection history could not be updated + catch (RuntimeException | Error e) { + cleanupTask.run(); + throw e; + } + + try { + + GuacamoleConfiguration config; + + // Retrieve connection information associated with given connection record + ModeledConnection connection = activeConnection.getConnection(); + + // Pull configuration directly from the connection, additionally + // joining the existing active connection (without sharing profile + // restrictions) if such a connection exists + if (activeConnection.isPrimaryConnection()) { + activeConnections.put(connection.getIdentifier(), activeConnection); + activeConnectionGroups.put(connection.getParentIdentifier(), activeConnection); + config = getGuacamoleConfiguration(connection, activeConnection.getConnectionID(), null); + } + + // If we ARE joining an active connection under the restrictions of + // a sharing profile, generate a configuration which does so + else { + + // Verify that the connection ID is known + String connectionID = activeConnection.getConnectionID(); + if (connectionID == null) + throw new GuacamoleResourceNotFoundException("No existing connection to be joined."); + + // Build configuration from the sharing profile and the ID of + // the connection being joined + config = getGuacamoleConfiguration(connection, connectionID, activeConnection.getSharingProfile()); + + } + + // Make a copy of the tokens + tokens = new HashMap<>(tokens); + + // Set up JDBC-specific tokens + tokens.put(JDBC_DATE_TOKEN, + new SimpleDateFormat(JDBC_DATE_TOKEN_FORMAT) + .format(activeConnection.getStartDate())); + tokens.put(JDBC_TIME_TOKEN, + new SimpleDateFormat(JDBC_TIME_TOKEN_FORMAT) + .format(activeConnection.getStartDate())); + tokens.put(JDBC_CONNECTION_NAME_TOKEN, activeConnection.getConnectionName()); + tokens.put(JDBC_CONNECTION_ID_TOKEN, activeConnection.getConnectionIdentifier()); + tokens.put(JDBC_CONNECTION_HOSTNAME_TOKEN, + activeConnection.getConnection().getConfiguration().getParameter(JDBC_CONNECTION_HOSTNAME_TOKEN_PARAMETER)); + tokens.put(JDBC_CONNECTION_PROTOCOL_TOKEN, + activeConnection.getConnection().getConfiguration().getProtocol()); + + // Include history record UUID as token + tokens.put("HISTORY_UUID", activeConnection.getUUID().toString()); + + // Build token filter containing credential tokens + TokenFilter tokenFilter = new TokenFilter(); + tokenFilter.setTokens(tokens); + + // Filter the configuration + tokenFilter.filterValues(config.getParameters()); + + // Obtain socket which will automatically run the cleanup task + ConfiguredGuacamoleSocket socket = new ConfiguredGuacamoleSocket( + getUnconfiguredGuacamoleSocket(connection.getGuacamoleProxyConfiguration(), + cleanupTask), config, info); + + // Assign and return new tunnel + if (interceptErrors) + return activeConnection.assignGuacamoleTunnel(new FailoverGuacamoleSocket(socket), socket.getConnectionID()); + else + return activeConnection.assignGuacamoleTunnel(socket, socket.getConnectionID()); + + } + + // Execute cleanup if socket could not be created + catch (GuacamoleException e) { + cleanupTask.run(); + throw e; + } + + } + + /** + * Filters the given collection of connection identifiers, returning a new + * collection which contains only those identifiers which are preferred. If + * no connection identifiers within the given collection are preferred, the + * collection is left untouched. + * + * @param user + * The user whose preferred connections should be used to filter the + * given collection of connection identifiers. + * + * @param identifiers + * The collection of connection identifiers that should be filtered. + * + * @return + * A collection of connection identifiers containing only the subset of + * connection identifiers which are also preferred or, if none of the + * provided identifiers are preferred, the original collection of + * identifiers. + */ + private Collection getPreferredConnections(ModeledAuthenticatedUser user, + Collection identifiers) { + + // Search provided identifiers for any preferred connections + for (String identifier : identifiers) { + + // If at least one prefferred connection is found, assume it is the + // only preferred connection + if (user.isPreferredConnection(identifier)) + return Collections.singletonList(identifier); + + } + + // No preferred connections were found + return identifiers; + + } + + /** + * Returns a list of all balanced connections within a given connection + * group. If the connection group is not balancing, or it contains no + * connections, an empty list is returned. + * + * @param user + * The user on whose behalf the balanced connections within the given + * connection group are being retrieved. + * + * @param connectionGroup + * The connection group to retrieve the balanced connections of. + * + * @return + * A list containing all balanced connections within the given group, + * or an empty list if there are no such connections. + */ + private List getBalancedConnections(ModeledAuthenticatedUser user, + ModeledConnectionGroup connectionGroup) { + + // If not a balancing group, there are no balanced connections + if (connectionGroup.getType() != ConnectionGroup.Type.BALANCING) + return Collections.emptyList(); + + // If group has no children, there are no balanced connections + Collection identifiers = connectionMapper.selectIdentifiersWithin(connectionGroup.getIdentifier()); + if (identifiers.isEmpty()) + return Collections.emptyList(); + + // Restrict to preferred connections if session affinity is enabled + if (connectionGroup.isSessionAffinityEnabled()) + identifiers = getPreferredConnections(user, identifiers); + + // Retrieve all children + Collection models = connectionMapper.select(identifiers, environment.getCaseSensitivity()); + List connections = new ArrayList(models.size()); + + // Convert each retrieved model to a modeled connection + for (ConnectionModel model : models) { + ModeledConnection connection = connectionProvider.get(); + connection.init(user, model); + connections.add(connection); + } + + return connections; + + } + + @Override + public Collection getActiveConnections(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Privileged users (such as system administrators) can view all + // connections; no need to filter + Collection records = activeTunnels.values(); + if (user.isPrivileged()) + return records; + + // Build set of all connection identifiers associated with active tunnels + Set identifiers = new HashSet<>(records.size()); + for (ActiveConnectionRecord record : records) + identifiers.add(record.getConnection().getIdentifier()); + + // Simply return empty list if there are no active tunnels (note that + // this check cannot be performed prior to building the set of + // identifiers, as activeTunnels may be non-empty at the beginning of + // the call to getActiveConnections() yet become empty before the + // set of identifiers is built, resulting in an error within + // selectReadable() + if (identifiers.isEmpty()) + return Collections.emptyList(); + + // Produce collection of readable connection identifiers + Collection connections = + connectionMapper.selectReadable(user.getUser().getModel(), + identifiers, user.getEffectiveUserGroups(), + environment.getCaseSensitivity()); + + // Ensure set contains only identifiers of readable connections + identifiers.clear(); + for (ConnectionModel connection : connections) + identifiers.add(connection.getIdentifier()); + + // Produce readable subset of records + Collection visibleRecords = new ArrayList<>(records.size()); + for (ActiveConnectionRecord record : records) { + if (identifiers.contains(record.getConnection().getIdentifier())) + visibleRecords.add(record); + } + + return visibleRecords; + + } + + @Override + @Transactional + public GuacamoleTunnel getGuacamoleTunnel(final ModeledAuthenticatedUser user, + final ModeledConnection connection, GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Acquire access to single connection, ignoring the failover-only flag + acquire(user, Collections.singletonList(connection), true); + + // Connect only if the connection was successfully acquired + ActiveConnectionRecord connectionRecord = new ActiveConnectionRecord(connectionMap, user, connection); + return assignGuacamoleTunnel(connectionRecord, info, tokens, false); + + } + + @Override + public Collection getActiveConnections(Connection connection) { + return activeConnections.get(connection.getIdentifier()); + } + + @Override + @Transactional + public GuacamoleTunnel getGuacamoleTunnel(ModeledAuthenticatedUser user, + ModeledConnectionGroup connectionGroup, + GuacamoleClientInformation info, Map tokens) + throws GuacamoleException { + + // Track failures in upstream (remote desktop) connections + boolean upstreamHasFailed = false; + + // If group has no associated balanced connections, cannot connect + List connections = getBalancedConnections(user, connectionGroup); + if (connections.isEmpty()) + throw new GuacamoleSecurityException("Permission denied."); + + do { + + // Acquire group + acquire(user, connectionGroup); + + // Attempt to acquire to any child, including failover-only + // connections only if at least one upstream failure has occurred + ModeledConnection connection; + try { + connection = acquire(user, connections, upstreamHasFailed); + } + + // Ensure connection group is always released if child acquire fails + catch (GuacamoleException e) { + release(user, connectionGroup); + throw e; + } + + try { + + // Connect to acquired child + ActiveConnectionRecord connectionRecord = new ActiveConnectionRecord(connectionMap, user, connectionGroup, connection); + GuacamoleTunnel tunnel = assignGuacamoleTunnel(connectionRecord, + info, tokens, connections.size() > 1); + + // If session affinity is enabled, prefer this connection going forward + if (connectionGroup.isSessionAffinityEnabled()) + user.preferConnection(connection.getIdentifier()); + + // Warn if we are connecting to a failover-only connection + if (connection.isFailoverOnly()) + logger.warn("One or more normal connections within " + + "group \"{}\" have failed. Some connection " + + "attempts are being routed to designated " + + "failover-only connections.", + connectionGroup.getIdentifier()); + + return tunnel; + + } + + // If connection failed due to an upstream error, retry other + // connections + catch (GuacamoleUpstreamException e) { + logger.info("Upstream error intercepted for connection \"{}\". Failing over to next connection in group...", connection.getIdentifier()); + logger.debug("Upstream remote desktop reported an error during connection.", e); + connections.remove(connection); + upstreamHasFailed = true; + } + + } while (!connections.isEmpty()); + + // All connection possibilities have been exhausted + throw new GuacamoleResourceConflictException("Cannot connect. All upstream connections are unavailable."); + + } + + @Override + public Collection getActiveConnections(ConnectionGroup connectionGroup) { + + // If not a balancing group, assume no connections + if (connectionGroup.getType() != ConnectionGroup.Type.BALANCING) + return Collections.emptyList(); + + return activeConnectionGroups.get(connectionGroup.getIdentifier()); + + } + + @Override + @Transactional + public GuacamoleTunnel getGuacamoleTunnel(RemoteAuthenticatedUser user, + SharedConnectionDefinition definition, + GuacamoleClientInformation info, Map tokens) + throws GuacamoleException { + + // Create a connection record which describes the shared connection + ActiveConnectionRecord connectionRecord = new ActiveConnectionRecord(connectionMap, + user, definition.getActiveConnection(), definition.getSharingProfile()); + + // Connect to shared connection described by the created record + GuacamoleTunnel tunnel = assignGuacamoleTunnel(connectionRecord, info, tokens, false); + + // Register tunnel, such that it is closed when the + // SharedConnectionDefinition is invalidated + definition.registerTunnel(tunnel); + return tunnel; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ActiveConnectionMultimap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ActiveConnectionMultimap.java new file mode 100644 index 0000000..48e838a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ActiveConnectionMultimap.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +/** + * Mapping of object identifiers to lists of connection records. Records are + * added or removed individually, and the overall list of current records + * associated with a given object can be retrieved at any time. The public + * methods of this class are all threadsafe. + */ +public class ActiveConnectionMultimap { + + /** + * All active connections to a connection having a given identifier. + */ + private final Map> records = + new HashMap>(); + + /** + * Stores the given connection record in the list of active connections + * associated with the object having the given identifier. + * + * @param identifier + * The identifier of the object being connected to. + * + * @param record + * The record associated with the active connection. + */ + public void put(String identifier, ActiveConnectionRecord record) { + synchronized (records) { + + // Get set of active connection records, creating if necessary + Set connections = records.get(identifier); + if (connections == null) { + connections = Collections.synchronizedSet(Collections.newSetFromMap(new LinkedHashMap())); + records.put(identifier, connections); + } + + // Add active connection + connections.add(record); + + } + } + + /** + * Removes the given connection record from the list of active connections + * associated with the object having the given identifier. + * + * @param identifier + * The identifier of the object being disconnected from. + * + * @param record + * The record associated with the active connection. + */ + public void remove(String identifier, ActiveConnectionRecord record) { + synchronized (records) { + + // Get set of active connection records + Set connections = records.get(identifier); + assert(connections != null); + + // Remove old record + connections.remove(record); + + // If now empty, clean the tracking entry + if (connections.isEmpty()) + records.remove(identifier); + + } + } + + /** + * Returns a collection of active connection records associated with the + * object having the given identifier. The collection will be sorted in + * insertion order. If there are no such connections, an empty collection is + * returned. + * + * @param identifier + * The identifier of the object to check. + * + * @return + * An immutable collection of records associated with the object having + * the given identifier, or an empty collection if there are no such + * records. + */ + public Collection get(String identifier) { + synchronized (records) { + + // Get set of active connection records + Collection connections = records.get(identifier); + if (connections != null) + return Collections.unmodifiableCollection(connections); + + return Collections.emptyList(); + + } + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ActiveConnectionRecord.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ActiveConnectionRecord.java new file mode 100644 index 0000000..c3150ca --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ActiveConnectionRecord.java @@ -0,0 +1,450 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import java.util.Date; +import java.util.UUID; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordModel; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnectionRecord; +import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup; +import org.apache.guacamole.auth.jdbc.sharing.SharedConnectionMap; +import org.apache.guacamole.auth.jdbc.sharing.SharedObjectManager; +import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.AbstractGuacamoleTunnel; +import org.apache.guacamole.net.GuacamoleSocket; +import org.apache.guacamole.net.GuacamoleTunnel; + + +/** + * A connection record implementation that describes an active connection. As + * the associated connection has not yet ended, getEndDate() will always return + * null. The associated start date will be the time of this objects creation. + */ +public class ActiveConnectionRecord extends ModeledConnectionRecord { + + /** + * The user that connected to the connection associated with this connection + * record. + */ + private final RemoteAuthenticatedUser user; + + /** + * The balancing group from which the associated connection was chosen, if + * any. If no balancing group was used, this will be null. + */ + private final ModeledConnectionGroup balancingGroup; + + /** + * The connection associated with this connection record. + */ + private final ModeledConnection connection; + + /** + * The sharing profile that was used to access the connection associated + * with this connection record. If the connection was accessed directly + * (without involving a sharing profile), this will be null. + */ + private final ModeledSharingProfile sharingProfile; + + /** + * The connection ID of the connection as determined by guacd, not to be + * confused with the connection identifier determined by the database. This + * is the ID that must be supplied to guacd if joining this connection. + */ + private String connectionID; + + /** + * The GuacamoleTunnel used by the connection associated with this + * connection record. + */ + private GuacamoleTunnel tunnel; + + /** + * Map of all currently-shared connections. + */ + private final SharedConnectionMap connectionMap; + + /** + * Manager which tracks all share keys associated with this connection + * record. All share keys registered with this manager will automatically be + * removed from the common SharedConnectionMap once the manager is + * invalidated. + */ + private final SharedObjectManager shareKeyManager = + new SharedObjectManager() { + + @Override + protected void cleanup(String key) { + connectionMap.remove(key); + } + + }; + + /** + * Creates a new connection record model object, associating it with the + * given user, connection, and sharing profile. The given sharing profile + * MUST be the sharing profile that was used to share access to the given + * connection. The start date of this connection record will be the time of + * its creation. No end date will be assigned. + * + * @param user + * The user that connected to the connection associated with this + * connection record. + * + * @param connection + * The connection to associate with this connection record. + * + * @param sharingProfile + * The sharing profile that was used to share access to the given + * connection, or null if no sharing profile was used. + * + * @return + * A new connection record model object associated with the given user, + * connection, and sharing profile, and having the current date/time as + * its start date. + */ + private static ConnectionRecordModel createModel(RemoteAuthenticatedUser user, + ModeledConnection connection, + ModeledSharingProfile sharingProfile) { + + // Create model object representing an active connection that started + // at the current time ... + ConnectionRecordModel recordModel = new ConnectionRecordModel(); + recordModel.setStartDate(new Date()); + + // ... was established by the given user ... + recordModel.setUsername(user.getIdentifier()); + recordModel.setRemoteHost(user.getRemoteHost()); + + // ... to the given connection ... + recordModel.setConnectionIdentifier(connection.getIdentifier()); + recordModel.setConnectionName(connection.getName()); + + // ... using the given sharing profile (if any) + if (sharingProfile != null) { + recordModel.setSharingProfileIdentifier(sharingProfile.getIdentifier()); + recordModel.setSharingProfileName(sharingProfile.getName()); + } + + return recordModel; + + } + + /** + * Creates a new ActiveConnectionRecord associated with the given user, + * connection, balancing connection group, and sharing profile. The given + * balancing connection group MUST be the connection group from which the + * given connection was chosen, and the given sharing profile MUST be the + * sharing profile that was used to share access to the given connection. + * The start date of this connection record will be the time of its + * creation. + * + * @param connectionMap + * The SharedConnectionMap instance tracking all active shared + * connections. + * + * @param user + * The user that connected to the connection associated with this + * connection record. + * + * @param balancingGroup + * The balancing group from which the given connection was chosen, or + * null if no balancing group is being used. + * + * @param connection + * The connection to associate with this connection record. + * + * @param sharingProfile + * The sharing profile that was used to share access to the given + * connection, or null if no sharing profile was used. + */ + public ActiveConnectionRecord(SharedConnectionMap connectionMap, + RemoteAuthenticatedUser user, + ModeledConnectionGroup balancingGroup, + ModeledConnection connection, + ModeledSharingProfile sharingProfile) { + super(createModel(user, connection, sharingProfile)); + this.connectionMap = connectionMap; + this.user = user; + this.balancingGroup = balancingGroup; + this.connection = connection; + this.sharingProfile = sharingProfile; + } + + /** + * Creates a new ActiveConnectionRecord associated with the given user, + * connection, and balancing connection group. The given balancing + * connection group MUST be the connection group from which the given + * connection was chosen. The start date of this connection record will be + * the time of its creation. + * + * @param connectionMap + * The SharedConnectionMap instance tracking all active shared + * connections. + * + * @param user + * The user that connected to the connection associated with this + * connection record. + * + * @param balancingGroup + * The balancing group from which the given connection was chosen. + * + * @param connection + * The connection to associate with this connection record. + */ + public ActiveConnectionRecord(SharedConnectionMap connectionMap, + RemoteAuthenticatedUser user, + ModeledConnectionGroup balancingGroup, + ModeledConnection connection) { + this(connectionMap, user, balancingGroup, connection, null); + } + + /** + * Creates a new ActiveConnectionRecord associated with the given user, + * and connection. The start date of this connection record will be the time + * of its creation. + * + * @param connectionMap + * The SharedConnectionMap instance tracking all active shared + * connections. + * + * @param user + * The user that connected to the connection associated with this + * connection record. + * + * @param connection + * The connection to associate with this connection record. + */ + public ActiveConnectionRecord(SharedConnectionMap connectionMap, + RemoteAuthenticatedUser user, ModeledConnection connection) { + this(connectionMap, user, null, connection); + } + + /** + * Creates a new ActiveConnectionRecord associated with the given user, + * active connection, and sharing profile. The given sharing profile MUST be + * the sharing profile that was used to share access to the given + * connection. The start date of this connection record will be the time of + * its creation. + * + * @param connectionMap + * The SharedConnectionMap instance tracking all active shared + * connections. + * + * @param user + * The user that connected to the connection associated with this + * connection record. + * + * @param activeConnection + * The active connection which is being shared to the given user via + * the given sharing profile. + * + * @param sharingProfile + * The sharing profile that was used to share access to the given + * connection, or null if no sharing profile should be used (access to + * the connection is unrestricted). + */ + public ActiveConnectionRecord(SharedConnectionMap connectionMap, + RemoteAuthenticatedUser user, + ActiveConnectionRecord activeConnection, + ModeledSharingProfile sharingProfile) { + this(connectionMap, user, null, activeConnection.getConnection(), sharingProfile); + this.connectionID = activeConnection.getConnectionID(); + } + + /** + * Returns the user that connected to the connection associated with this + * connection record. + * + * @return + * The user that connected to the connection associated with this + * connection record. + */ + public RemoteAuthenticatedUser getUser() { + return user; + } + + /** + * Returns the balancing group from which the connection associated with + * this connection record was chosen. + * + * @return + * The balancing group from which the connection associated with this + * connection record was chosen. + */ + public ModeledConnectionGroup getBalancingGroup() { + return balancingGroup; + } + + /** + * Returns the connection associated with this connection record. + * + * @return + * The connection associated with this connection record. + */ + public ModeledConnection getConnection() { + return connection; + } + + /** + * Returns the sharing profile that was used to access the connection + * associated with this connection record. If the connection was accessed + * directly (without involving a sharing profile), this will be null. + * + * @return + * The sharing profile that was used to access the connection + * associated with this connection record, or null if the connection + * was accessed directly. + */ + public ModeledSharingProfile getSharingProfile() { + return sharingProfile; + } + + /** + * Returns whether the connection associated with this connection record + * was chosen from a balancing group. + * + * @return + * true if the connection associated with this connection record was + * chosen from a balancing group, false otherwise. + */ + public boolean hasBalancingGroup() { + return balancingGroup != null; + } + + /** + * Returns whether this connection record is associated with a connection + * being used directly, in the absence of a sharing profile. If a connection + * is shared, this will continue to return false for the connection being + * shared, but will return true for the connections which join that + * connection. + * + * @return + * true if the connection associated with this connection record is + * being used directly, false otherwise. + */ + public boolean isPrimaryConnection() { + return sharingProfile == null; + } + + @Override + public boolean isActive() { + return tunnel != null && tunnel.isOpen(); + } + + /** + * Returns the GuacamoleTunnel currently associated with the active + * connection represented by this connection record. + * + * @return + * The GuacamoleTunnel currently associated with the active connection + * represented by this connection record. + */ + public GuacamoleTunnel getTunnel() { + return tunnel; + } + + /** + * Associates a new GuacamoleTunnel with this connection record using the + * given socket. + * + * @param socket + * The GuacamoleSocket to use to create the tunnel associated with this + * connection record. + * + * @param connectionID + * The connection ID assigned to this connection by guacd. + * + * @return + * The newly-created tunnel associated with this connection record. + */ + public GuacamoleTunnel assignGuacamoleTunnel(final GuacamoleSocket socket, + String connectionID) { + + // Create tunnel with given socket + this.tunnel = new AbstractGuacamoleTunnel() { + + @Override + public GuacamoleSocket getSocket() { + return socket; + } + + @Override + public UUID getUUID() { + return ActiveConnectionRecord.this.getUUID(); + } + + }; + + // Store connection ID of the primary connection only + if (isPrimaryConnection()) + this.connectionID = connectionID; + + // Return newly-created tunnel + return this.tunnel; + + } + + /** + * Returns the connection ID of the in-progress connection as determined by + * guacd, not to be confused with the connection identifier determined by + * the database. This is the ID that must be supplied to guacd if joining + * this connection. If the in-progress connection is joining another + * connection, this will be the ID of the connection being joined, NOT the + * ID of the connection directly represented by this record. + * + * @return + * The ID of the in-progress connection, as determined by guacd. + */ + public String getConnectionID() { + return connectionID; + } + + /** + * Registers the given share key with this ActiveConnectionRecord, such that + * the key is automatically removed from the common SharedConnectionMap when + * the connection represented by this ActiveConnectionRecord is closed. For + * share keys to be properly invalidated when the connection being shared is + * closed, all such share keys MUST be registered with the + * ActiveConnectionRecord of the connection being shared. + * + * @param key + * The share key which should automatically be removed from the common + * SharedConnectionMap when the connection represented by this + * ActiveConnectionRecord is closed. + */ + public void registerShareKey(String key) { + shareKeyManager.register(key); + } + + /** + * Invalidates this ActiveConnectionRecord and all registered share keys. If + * any additional share keys are registered after this function is invoked, + * those keys will be immediately invalidated. This function MUST be invoked + * when the connection represented by this ActiveConnectionRecord is + * closing. + */ + public void invalidate() { + shareKeyManager.invalidate(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/GuacamoleTunnelService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/GuacamoleTunnelService.java new file mode 100644 index 0000000..bad5219 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/GuacamoleTunnelService.java @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import java.util.Collection; +import java.util.Map; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDefinition; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + + +/** + * Service which creates pre-configured GuacamoleSocket instances for + * connections and balancing groups, applying concurrent usage rules. + */ +public interface GuacamoleTunnelService { + + /** + * Returns a collection containing connection records representing all + * currently-active connections visible by the given user. + * + * @param user + * The user retrieving active connections. + * + * @return + * A collection containing connection records representing all + * currently-active connections. + * + * @throws GuacamoleException + * If an error occurs while retrieving all active connections, or if + * permission is denied. + */ + public Collection getActiveConnections(ModeledAuthenticatedUser user) + throws GuacamoleException; + + /** + * Creates a socket for the given user which connects to the given + * connection. The given client information will be passed to guacd when + * the connection is established. This function will apply any concurrent + * usage rules in effect, but will NOT test object- or system-level + * permissions. + * + * @param user + * The user for whom the connection is being established. + * + * @param connection + * The connection the user is connecting to. + * + * @param info + * Information describing the Guacamole client connecting to the given + * connection. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @return + * A new GuacamoleTunnel which is configured and connected to the given + * connection. + * + * @throws GuacamoleException + * If the connection cannot be established due to concurrent usage + * rules. + */ + GuacamoleTunnel getGuacamoleTunnel(ModeledAuthenticatedUser user, + ModeledConnection connection, GuacamoleClientInformation info, + Map tokens) throws GuacamoleException; + + /** + * Returns a collection containing connection records representing all + * currently-active connections using the given connection. These records + * will have usernames and start dates, but no end date, and will be + * sorted in ascending order by start date. + * + * @param connection + * The connection to check. + * + * @return + * A collection containing connection records representing all + * currently-active connections. + */ + public Collection getActiveConnections(Connection connection); + + /** + * Creates a socket for the given user which connects to the given + * connection group. The given client information will be passed to guacd + * when the connection is established. This function will apply any + * concurrent usage rules in effect, but will NOT test object- or + * system-level permissions. + * + * @param user + * The user for whom the connection is being established. + * + * @param connectionGroup + * The connection group the user is connecting to. + * + * @param info + * Information describing the Guacamole client connecting to the given + * connection group. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @return + * A new GuacamoleTunnel which is configured and connected to the given + * connection group. + * + * @throws GuacamoleException + * If the connection cannot be established due to concurrent usage + * rules, or if the connection group is not balancing. + */ + GuacamoleTunnel getGuacamoleTunnel(ModeledAuthenticatedUser user, + ModeledConnectionGroup connectionGroup, + GuacamoleClientInformation info, Map tokens) + throws GuacamoleException; + + /** + * Returns a collection containing connection records representing all + * currently-active connections using the given connection group. These + * records will have usernames and start dates, but no end date, and will + * be sorted in ascending order by start date. + * + * @param connectionGroup + * The connection group to check. + * + * @return + * A collection containing connection records representing all + * currently-active connections. + */ + public Collection getActiveConnections(ConnectionGroup connectionGroup); + + /** + * Creates a socket for the given user which joins the given active + * connection. The given client information will be passed to guacd when + * the connection is established. This function will apply any concurrent + * usage rules in effect, but will NOT test object- or system-level + * permissions. + * + * @param user + * The user for whom the connection is being established. + * + * @param definition + * The SharedConnectionDefinition dictating the connection being shared + * and any associated restrictions. + * + * @param info + * Information describing the Guacamole client connecting to the given + * connection. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @return + * A new GuacamoleTunnel which is configured and connected to the given + * active connection. + * + * @throws GuacamoleException + * If the connection cannot be established due to concurrent usage + * rules. + */ + GuacamoleTunnel getGuacamoleTunnel(RemoteAuthenticatedUser user, + SharedConnectionDefinition definition, + GuacamoleClientInformation info, Map tokens) + throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ManagedInetGuacamoleSocket.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ManagedInetGuacamoleSocket.java new file mode 100644 index 0000000..72cbffb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ManagedInetGuacamoleSocket.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.InetGuacamoleSocket; + +/** + * Implementation of GuacamoleSocket which connects via TCP to a given hostname + * and port. If the socket is closed for any reason, a given task is run. + */ +public class ManagedInetGuacamoleSocket extends InetGuacamoleSocket { + + /** + * The task to run when the socket is closed. + */ + private final Runnable socketClosedTask; + + /** + * Creates a new socket which connects via TCP to a given hostname and + * port. If the socket is closed for any reason, the given task is run. + * + * @param hostname + * The hostname of the Guacamole proxy server to connect to. + * + * @param port + * The port of the Guacamole proxy server to connect to. + * + * @param socketClosedTask + * The task to run when the socket is closed. This task will NOT be + * run if an exception occurs during connection, and this + * ManagedInetGuacamoleSocket instance is ultimately not created. + * + * @throws GuacamoleException + * If an error occurs while connecting to the Guacamole proxy server. + */ + public ManagedInetGuacamoleSocket(String hostname, int port, + Runnable socketClosedTask) throws GuacamoleException { + super(hostname, port); + this.socketClosedTask = socketClosedTask; + } + + @Override + public void close() throws GuacamoleException { + super.close(); + socketClosedTask.run(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ManagedSSLGuacamoleSocket.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ManagedSSLGuacamoleSocket.java new file mode 100644 index 0000000..8ce9e21 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/ManagedSSLGuacamoleSocket.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.SSLGuacamoleSocket; + +/** + * Implementation of GuacamoleSocket which connects via SSL to a given hostname + * and port. If the socket is closed for any reason, a given task is run. + */ +public class ManagedSSLGuacamoleSocket extends SSLGuacamoleSocket { + + /** + * The task to run when the socket is closed. + */ + private final Runnable socketClosedTask; + + /** + * Creates a new socket which connects via SSL to a given hostname and + * port. If the socket is closed for any reason, the given task is run. + * + * @param hostname + * The hostname of the Guacamole proxy server to connect to. + * + * @param port + * The port of the Guacamole proxy server to connect to. + * + * @param socketClosedTask + * The task to run when the socket is closed. This task will NOT be + * run if an exception occurs during connection, and this + * ManagedInetGuacamoleSocket instance is ultimately not created. + * + * @throws GuacamoleException + * If an error occurs while connecting to the Guacamole proxy server. + */ + public ManagedSSLGuacamoleSocket(String hostname, int port, + Runnable socketClosedTask) throws GuacamoleException { + super(hostname, port); + this.socketClosedTask = socketClosedTask; + } + + @Override + public void close() throws GuacamoleException { + super.close(); + socketClosedTask.run(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/RestrictedGuacamoleTunnelService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/RestrictedGuacamoleTunnelService.java new file mode 100644 index 0000000..a5d509b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/RestrictedGuacamoleTunnelService.java @@ -0,0 +1,308 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +import com.google.common.collect.ConcurrentHashMultiset; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import org.apache.guacamole.GuacamoleClientTooManyException; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceConflictException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup; +import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * GuacamoleTunnelService implementation which restricts concurrency for each + * connection and group according to a maximum number of connections and + * maximum number of connections per user. + */ +@Singleton +public class RestrictedGuacamoleTunnelService + extends AbstractGuacamoleTunnelService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(RestrictedGuacamoleTunnelService.class); + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Set of all currently-active user/connection pairs (seats). + */ + private final ConcurrentHashMultiset activeSeats = ConcurrentHashMultiset.create(); + + /** + * Set of all currently-active connections. + */ + private final ConcurrentHashMultiset activeConnections = ConcurrentHashMultiset.create(); + + /** + * Set of all currently-active user/connection group pairs (seats). + */ + private final ConcurrentHashMultiset activeGroupSeats = ConcurrentHashMultiset.create(); + + /** + * Set of all currently-active connection groups. + */ + private final ConcurrentHashMultiset activeGroups = ConcurrentHashMultiset.create(); + + /** + * The total number of active connections within this instance of + * Guacamole. + */ + private final AtomicInteger totalActiveConnections = new AtomicInteger(0); + + /** + * Attempts to add a single instance of the given value to the given + * multiset without exceeding the specified maximum number of values. If + * the value cannot be added without exceeding the maximum, false is + * returned. + * + * @param + * The type of values contained within the multiset. + * + * @param multiset + * The multiset to attempt to add a value to. + * + * @param value + * The value to attempt to add. + * + * @param max + * The maximum number of each distinct value that the given multiset + * should hold, or zero if no limit applies. + * + * @return + * true if the value was successfully added without exceeding the + * specified maximum, false if the value could not be added. + */ + private boolean tryAdd(ConcurrentHashMultiset multiset, T value, int max) { + + // Repeatedly attempt to add a new value to the given multiset until we + // explicitly succeed or explicitly fail + while (true) { + + // Get current number of values + int count = multiset.count(value); + + // Bail out if the maximum has already been reached + if (count >= max && max != 0) + return false; + + // Attempt to add one more value + if (multiset.setCount(value, count, count+1)) + return true; + + // Try again if unsuccessful + + } + + } + + /** + * Attempts to increment the given AtomicInteger without exceeding the + * specified maximum value. If the AtomicInteger cannot be incremented + * without exceeding the maximum, false is returned. + * + * @param counter + * The AtomicInteger to attempt to increment. + * + * @param max + * The maximum value that the given AtomicInteger should contain, or + * zero if no limit applies. + * + * @return + * true if the AtomicInteger was successfully incremented without + * exceeding the specified maximum, false if the AtomicInteger could + * not be incremented. + */ + private boolean tryIncrement(AtomicInteger counter, int max) { + + // Repeatedly attempt to increment the given AtomicInteger until we + // explicitly succeed or explicitly fail + while (true) { + + // Get current value + int count = counter.get(); + + // Bail out if the maximum has already been reached + if (count >= max && max != 0) + return false; + + // Attempt to increment + if (counter.compareAndSet(count, count+1)) + return true; + + // Try again if unsuccessful + + } + + } + + @Override + protected ModeledConnection acquire(RemoteAuthenticatedUser user, + List connections, boolean includeFailoverOnly) + throws GuacamoleException { + + // Do not acquire connection unless within overall limits + if (!tryIncrement(totalActiveConnections, environment.getAbsoluteMaxConnections())) + throw new GuacamoleResourceConflictException("Cannot connect. Overall maximum connections reached."); + + // Get username + String username = user.getIdentifier(); + + // Sort connections in ascending order of usage + ModeledConnection[] sortedConnections = connections.toArray(new ModeledConnection[connections.size()]); + Arrays.sort(sortedConnections, new Comparator() { + + @Override + public int compare(ModeledConnection a, ModeledConnection b) { + + // Active connections + int connA = getActiveConnections(a).size(); + int connB = getActiveConnections(b).size(); + + // Assigned weight + int weightA = a.getConnectionWeight(); + int weightB = b.getConnectionWeight(); + + // Calculated weight of connections + int calcWeightA = connA * weightB; + int calcWeightB = connB * weightA; + + // If calculated weights are equal, return difference in assigned weight + if (calcWeightA == calcWeightB) + return (weightA - weightB); + + // Return different in calculated weights + return (calcWeightA - calcWeightB); + + } + + }); + + // Track whether acquire fails due to user-specific limits + boolean userSpecificFailure = true; + + // Return the first unreserved connection + for (ModeledConnection connection : sortedConnections) { + + // If connection weight is less than 1 this host is disabled and should not be used. + if (connection.getConnectionWeight() < 1) { + logger.debug("Weight for {} is < 1, connection will be skipped.", connection.getName()); + continue; + } + + // Skip connections which are failover-only if they are excluded + // from this connection attempt + if (!includeFailoverOnly && connection.isFailoverOnly()) + continue; + + // Attempt to aquire connection according to per-user limits + Seat seat = new Seat(username, connection.getIdentifier()); + if (tryAdd(activeSeats, seat, + connection.getMaxConnectionsPerUser())) { + + // Attempt to aquire connection according to overall limits + if (tryAdd(activeConnections, connection.getIdentifier(), + connection.getMaxConnections())) + return connection; + + // Acquire failed - retry with next connection + activeSeats.remove(seat); + + // Failure to acquire is not user-specific + userSpecificFailure = false; + + } + + } + + // Acquire failed + totalActiveConnections.decrementAndGet(); + + // Too many connections by this user + if (userSpecificFailure) + throw new GuacamoleClientTooManyException("Cannot connect. Connection already in use by this user."); + + // Too many connections, but not necessarily due purely to this user + else + throw new GuacamoleResourceConflictException("Cannot connect. This connection is in use."); + + } + + @Override + protected void release(RemoteAuthenticatedUser user, ModeledConnection connection) { + activeSeats.remove(new Seat(user.getIdentifier(), connection.getIdentifier())); + activeConnections.remove(connection.getIdentifier()); + totalActiveConnections.decrementAndGet(); + } + + @Override + protected void acquire(RemoteAuthenticatedUser user, + ModeledConnectionGroup connectionGroup) throws GuacamoleException { + + // Get username + String username = user.getIdentifier(); + + // Attempt to aquire connection group according to per-user limits + Seat seat = new Seat(username, connectionGroup.getIdentifier()); + if (tryAdd(activeGroupSeats, seat, + connectionGroup.getMaxConnectionsPerUser())) { + + // Attempt to aquire connection group according to overall limits + if (tryAdd(activeGroups, connectionGroup.getIdentifier(), + connectionGroup.getMaxConnections())) + return; + + // Acquire failed + activeGroupSeats.remove(seat); + + // Failure to acquire is not user-specific + throw new GuacamoleResourceConflictException("Cannot connect. This connection group is in use."); + + } + + // Already in use by this user + throw new GuacamoleClientTooManyException("Cannot connect. Connection group already in use by this user."); + + } + + @Override + protected void release(RemoteAuthenticatedUser user, + ModeledConnectionGroup connectionGroup) { + activeGroupSeats.remove(new Seat(user.getIdentifier(), connectionGroup.getIdentifier())); + activeGroups.remove(connectionGroup.getIdentifier()); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/Seat.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/Seat.java new file mode 100644 index 0000000..e329a3b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/Seat.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.tunnel; + +/** + * A unique pairing of user and connection or connection group. + */ +public class Seat { + + /** + * The user using this seat. + */ + private final String username; + + /** + * The connection or connection group associated with this seat. + */ + private final String identifier; + + /** + * Creates a new seat which associated the given user with the given + * connection or connection group. + * + * @param username + * The username of the user using this seat. + * + * @param identifier + * The identifier of the connection or connection group associated with + * this seat. + */ + public Seat(String username, String identifier) { + this.username = username; + this.identifier = identifier; + } + + @Override + public int hashCode() { + + // The various properties will never be null + assert(username != null); + assert(identifier != null); + + // Derive hashcode from username and connection identifier + int hash = 5; + hash = 37 * hash + username.hashCode(); + hash = 37 * hash + identifier.hashCode(); + return hash; + + } + + @Override + public boolean equals(Object object) { + + // We are only comparing against other seats here + assert(object instanceof Seat); + Seat seat = (Seat) object; + + // The various properties will never be null + assert(seat.username != null); + assert(seat.identifier != null); + + return username.equals(seat.username) + && identifier.equals(seat.identifier); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/package-info.java new file mode 100644 index 0000000..c76751a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to obtaining/configuring Guacamole tunnels, and restricting + * access to those tunnels. + */ +package org.apache.guacamole.auth.jdbc.tunnel; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledAuthenticatedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledAuthenticatedUser.java new file mode 100644 index 0000000..5fd209a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledAuthenticatedUser.java @@ -0,0 +1,198 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import com.google.common.collect.Sets; +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Associates a user with the credentials they used to authenticate, their + * corresponding ModeledUser, and the AuthenticationProvider which produced + * that ModeledUser. + */ +public class ModeledAuthenticatedUser extends RemoteAuthenticatedUser { + + /** + * The ModeledUser object which is backed by the data associated with this + * user in the database. + */ + private final ModeledUser user; + + /** + * The AuthenticationProvider that is associated with this user's + * corresponding ModeledUser. + */ + private final AuthenticationProvider modelAuthenticationProvider; + + /** + * The connections which have been committed for use by this user in the + * context of a balancing connection group. Balancing connection groups + * will preferentially choose connections within this set, unless those + * connections are not children of the group in question. If a group DOES + * have at least one child connection within this set, no connections that + * are not in this set will be used. + */ + private final Set preferredConnections = + Collections.newSetFromMap(new ConcurrentHashMap()); + + /** + * Creates a copy of the given AuthenticatedUser which is associated with + * the data stored in the provided ModeledUser. The AuthenticatedUser need + * not have come from the same AuthenticationProvider which produced the + * given ModeledUser. + * + * @param authenticatedUser + * An existing AuthenticatedUser representing the user that + * authenticated. + * + * @param modelAuthenticationProvider + * The AuthenticationProvider that is associated with the given user's + * corresponding ModeledUser. + * + * @param user + * A ModeledUser object which is backed by the data associated with + * this user in the database. + */ + public ModeledAuthenticatedUser(AuthenticatedUser authenticatedUser, + AuthenticationProvider modelAuthenticationProvider, ModeledUser user) { + super(authenticatedUser.getAuthenticationProvider(), authenticatedUser.getCredentials(), authenticatedUser.getEffectiveUserGroups()); + this.modelAuthenticationProvider = modelAuthenticationProvider; + this.user = user; + } + + /** + * Creates a new AuthenticatedUser associating the given user with their + * corresponding credentials. + * + * @param authenticationProvider + * The AuthenticationProvider that has authenticated the given user + * and which produced the given ModeledUser. + * + * @param user + * A ModeledUser object which is backed by the data associated with + * this user in the database. + * + * @param credentials + * The credentials given by the user when they authenticated. + */ + public ModeledAuthenticatedUser(AuthenticationProvider authenticationProvider, + ModeledUser user, Credentials credentials) { + super(authenticationProvider, credentials, user.getEffectiveUserGroups()); + this.modelAuthenticationProvider = authenticationProvider; + this.user = user; + } + + /** + * Returns a ModeledUser object which is backed by the data associated with + * this user within the database. + * + * @return + * A ModeledUser object which is backed by the data associated with + * this user in the database. + */ + public ModeledUser getUser() { + return user; + } + + /** + * Returns the AuthenticationProvider which produced the ModeledUser + * retrievable via getUser(). This is not necessarily the same as the + * AuthenticationProvider which authenticated that user, which can be + * retrieved with getAuthenticationProvider(). + * + * @return + * The AuthenticationProvider which produced the ModeledUser + * retrievable via getUser(). + */ + public AuthenticationProvider getModelAuthenticationProvider() { + return modelAuthenticationProvider; + } + + /** + * Returns whether the connection having the given identifier has been + * marked as preferred for this user's current Guacamole session. A + * preferred connection is always chosen in favor of other connections when + * it is a child of a balancing connection group. + * + * @param identifier + * The identifier of the connection to test. + * + * @return + * true if the connection having the given identifier has been marked + * as preferred, false otherwise. + */ + public boolean isPreferredConnection(String identifier) { + return preferredConnections.contains(identifier); + } + + /** + * Marks the connection having the given identifier as preferred for this + * user's current Guacamole session. A preferred connection is always chosen + * in favor of other connections when it is a child of a balancing + * connection group. + * + * @param identifier + * The identifier of the connection to prefer. + */ + public void preferConnection(String identifier) { + preferredConnections.add(identifier); + } + + @Override + public String getIdentifier() { + return user.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + user.setIdentifier(identifier); + } + + @Override + public Set getEffectiveUserGroups() { + return Sets.union(user.getEffectiveUserGroups(), + super.getEffectiveUserGroups()); + } + + /** + * Returns whether this user is effectively unrestricted by permissions, + * such as a system administrator or an internal user operating via a + * privileged UserContext. Permission inheritance via user groups is taken + * into account. + * + * @return + * true if this user should be unrestricted by permissions, false + * otherwise. + * + * @throws GuacamoleException + * If an error occurs while determining whether permission restrictions + * apply to the user. + */ + public boolean isPrivileged() throws GuacamoleException { + return getUser().isPrivileged(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java new file mode 100644 index 0000000..8bf7acb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java @@ -0,0 +1,795 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.text.ParseException; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TimeZone; +import org.apache.guacamole.auth.jdbc.security.PasswordEncryptionService; +import org.apache.guacamole.auth.jdbc.security.SaltService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.form.BooleanField; +import org.apache.guacamole.form.DateField; +import org.apache.guacamole.form.EmailField; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.form.TextField; +import org.apache.guacamole.form.TimeField; +import org.apache.guacamole.form.TimeZoneField; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.RelatedObjectSet; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.properties.CaseSensitivity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * An implementation of the User object which is backed by a database model. + */ +public class ModeledUser extends ModeledPermissions implements User { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ModeledUser.class); + + /** + * The name of the attribute which controls whether a user's password is + * expired and must be reset upon login. + */ + public static final String EXPIRED_ATTRIBUTE_NAME = "expired"; + + /** + * The name of the attribute which controls the time of day after which a + * user may login. + */ + public static final String ACCESS_WINDOW_START_ATTRIBUTE_NAME = "access-window-start"; + + /** + * The name of the attribute which controls the time of day after which a + * user may NOT login. + */ + public static final String ACCESS_WINDOW_END_ATTRIBUTE_NAME = "access-window-end"; + + /** + * The name of the attribute which controls the date after which a user's + * account is valid. + */ + public static final String VALID_FROM_ATTRIBUTE_NAME = "valid-from"; + + /** + * The name of the attribute which controls the date after which a user's + * account is no longer valid. + */ + public static final String VALID_UNTIL_ATTRIBUTE_NAME = "valid-until"; + + /** + * The name of the attribute which defines the time zone used for all + * time and date attributes related to this user. + */ + public static final String TIMEZONE_ATTRIBUTE_NAME = "timezone"; + + /** + * All attributes related to user profile information, within a logical + * form. + */ + public static final Form PROFILE = new Form("profile", Arrays.asList( + new TextField(User.Attribute.FULL_NAME), + new EmailField(User.Attribute.EMAIL_ADDRESS), + new TextField(User.Attribute.ORGANIZATION), + new TextField(User.Attribute.ORGANIZATIONAL_ROLE) + )); + + /** + * All attributes related to restricting user accounts, within a logical + * form. + */ + public static final Form ACCOUNT_RESTRICTIONS = new Form("restrictions", Arrays.asList( + new BooleanField(EXPIRED_ATTRIBUTE_NAME, "true"), + new TimeField(ACCESS_WINDOW_START_ATTRIBUTE_NAME), + new TimeField(ACCESS_WINDOW_END_ATTRIBUTE_NAME), + new DateField(VALID_FROM_ATTRIBUTE_NAME), + new DateField(VALID_UNTIL_ATTRIBUTE_NAME), + new TimeZoneField(TIMEZONE_ATTRIBUTE_NAME) + )); + + /** + * All possible attributes of user objects organized as individual, + * logical forms. + */ + public static final Collection ATTRIBUTES = Collections.unmodifiableCollection(Arrays.asList( + PROFILE, + ACCOUNT_RESTRICTIONS + )); + + /** + * The names of all attributes which are explicitly supported by this + * extension's User objects. + */ + public static final Set ATTRIBUTE_NAMES = + Collections.unmodifiableSet(new HashSet(Arrays.asList( + User.Attribute.FULL_NAME, + User.Attribute.EMAIL_ADDRESS, + User.Attribute.ORGANIZATION, + User.Attribute.ORGANIZATIONAL_ROLE, + EXPIRED_ATTRIBUTE_NAME, + ACCESS_WINDOW_START_ATTRIBUTE_NAME, + ACCESS_WINDOW_END_ATTRIBUTE_NAME, + VALID_FROM_ATTRIBUTE_NAME, + VALID_UNTIL_ATTRIBUTE_NAME, + TIMEZONE_ATTRIBUTE_NAME + ))); + + /** + * Service for hashing passwords. + */ + @Inject + private PasswordEncryptionService encryptionService; + + /** + * Service for providing secure, random salts. + */ + @Inject + private SaltService saltService; + + /** + * Provider for RelatedObjectSets containing the user groups of which this + * user is a member. + */ + @Inject + private Provider parentUserGroupSetProvider; + + /** + * Provider for creating user record sets. + */ + @Inject + private Provider userRecordSetProvider; + + /** + * Whether attributes which control access restrictions should be exposed + * via getAttributes() or allowed to be set via setAttributes(). + */ + private boolean exposeRestrictedAttributes = false; + + /** + * Whether usernames should be considered case-sensitive. + */ + private boolean caseSensitive = true; + + /** + * Initializes this ModeledUser, associating it with the current + * authenticated user and populating it with data from the given user + * model. + * + * @param currentUser + * The user that created or retrieved this object. + * + * @param model + * The backing model object. + * + * @param exposeRestrictedAttributes + * Whether attributes which control access restrictions should be + * exposed via getAttributes() or allowed to be set via + * setAttributes(). + */ + public void init(ModeledAuthenticatedUser currentUser, UserModel model, + boolean exposeRestrictedAttributes, boolean caseSensitive) { + super.init(currentUser, model); + this.exposeRestrictedAttributes = exposeRestrictedAttributes; + this.caseSensitive = caseSensitive; + } + + /** + * The plaintext password previously set by a call to setPassword(), if + * any. The password of a user cannot be retrieved once saved into the + * database, so this serves to ensure getPassword() returns a reasonable + * value if setPassword() is called. If no password has been set, or the + * user was retrieved from the database, this will be null. + */ + private String password = null; + + /** + * The data associated with this user's password at the time this user was + * queried. If the user is new, this will be null. + */ + private PasswordRecordModel passwordRecord = null; + + /** + * Creates a new, empty ModeledUser. + */ + public ModeledUser() { + } + + @Override + public void setModel(UserModel model) { + + super.setModel(model); + + // Store previous password, if any + if (model.getPasswordHash() != null) + this.passwordRecord = new PasswordRecordModel(model); + + } + + @Override + public String getIdentifier() { + return CaseSensitivity.canonicalize(super.getIdentifier(), caseSensitive); + } + + @Override + public void setIdentifier(String identifier) { + super.setIdentifier(CaseSensitivity.canonicalize(identifier, caseSensitive)); + } + + @Override + public String getPassword() { + return password; + } + + @Override + public void setPassword(String password) { + + UserModel userModel = getModel(); + + // Store plaintext password internally + this.password = password; + + // If no password provided, set random password + if (password == null) { + userModel.setPasswordSalt(saltService.generateSalt()); + userModel.setPasswordHash(saltService.generateSalt()); + } + + // Otherwise generate new salt and hash given password using newly-generated salt + else { + byte[] salt = saltService.generateSalt(); + byte[] hash = encryptionService.createPasswordHash(password, salt); + + // Set stored salt and hash + userModel.setPasswordSalt(salt); + userModel.setPasswordHash(hash); + } + + userModel.setPasswordDate(new Timestamp(System.currentTimeMillis())); + + } + + @Override + public boolean isDisabled() { + return getModel().isDisabled(); + } + + @Override + public void setDisabled(boolean disabled) { + getModel().setDisabled(disabled); + } + + /** + * Returns the this user's current password record. If the user is new, this + * will be null. Note that this may represent a different password than what + * is returned by getPassword(): unlike the other password-related functions + * of ModeledUser, the data returned by this function is historical and is + * unaffected by calls to setPassword(). It will always return the values + * stored in the database at the time this user was queried. + * + * @return + * The historical data associated with this user's password, or null if + * the user is new. + */ + public PasswordRecordModel getPasswordRecord() { + return passwordRecord; + } + + /** + * Stores all restricted (privileged) attributes within the given Map, + * pulling the values of those attributes from the underlying user model. + * If no value is yet defined for an attribute, that attribute will be set + * to null. + * + * @param attributes + * The Map to store all restricted attributes within. + */ + private void putRestrictedAttributes(Map attributes) { + + // Set password expired attribute + attributes.put(EXPIRED_ATTRIBUTE_NAME, getModel().isExpired() ? "true" : null); + + // Set access window start time + attributes.put(ACCESS_WINDOW_START_ATTRIBUTE_NAME, TimeField.format(getModel().getAccessWindowStart())); + + // Set access window end time + attributes.put(ACCESS_WINDOW_END_ATTRIBUTE_NAME, TimeField.format(getModel().getAccessWindowEnd())); + + // Set account validity start date + attributes.put(VALID_FROM_ATTRIBUTE_NAME, DateField.format(getModel().getValidFrom())); + + // Set account validity end date + attributes.put(VALID_UNTIL_ATTRIBUTE_NAME, DateField.format(getModel().getValidUntil())); + + // Set timezone attribute + attributes.put(TIMEZONE_ATTRIBUTE_NAME, getModel().getTimeZone()); + + } + + /** + * Stores all unrestricted (unprivileged) attributes within the given Map, + * pulling the values of those attributes from the underlying user model. + * If no value is yet defined for an attribute, that attribute will be set + * to null. + * + * @param attributes + * The Map to store all unrestricted attributes within. + */ + private void putUnrestrictedAttributes(Map attributes) { + + // Set full name attribute + attributes.put(User.Attribute.FULL_NAME, getModel().getFullName()); + + // Set email address attribute + attributes.put(User.Attribute.EMAIL_ADDRESS, getModel().getEmailAddress()); + + // Set organization attribute + attributes.put(User.Attribute.ORGANIZATION, getModel().getOrganization()); + + // Set role attribute + attributes.put(User.Attribute.ORGANIZATIONAL_ROLE, getModel().getOrganizationalRole()); + + } + + /** + * Parses the given string into a corresponding date. The string must + * follow the standard format used by date attributes, as defined by + * DateField.FORMAT and as would be produced by DateField.format(). + * + * @param dateString + * The date string to parse, which may be null. + * + * @return + * The date corresponding to the given date string, or null if the + * provided date string was null or blank. + * + * @throws ParseException + * If the given date string does not conform to the standard format + * used by date attributes. + */ + private Date parseDate(String dateString) + throws ParseException { + + // Return null if no date provided + java.util.Date parsedDate = DateField.parse(dateString); + if (parsedDate == null) + return null; + + // Convert to SQL Date + return new Date(parsedDate.getTime()); + + } + + /** + * Parses the given string into a corresponding time. The string must + * follow the standard format used by time attributes, as defined by + * TimeField.FORMAT and as would be produced by TimeField.format(). + * + * @param timeString + * The time string to parse, which may be null. + * + * @return + * The time corresponding to the given time string, or null if the + * provided time string was null or blank. + * + * @throws ParseException + * If the given time string does not conform to the standard format + * used by time attributes. + */ + private Time parseTime(String timeString) + throws ParseException { + + // Return null if no time provided + java.util.Date parsedDate = TimeField.parse(timeString); + if (parsedDate == null) + return null; + + // Convert to SQL Time + return new Time(parsedDate.getTime()); + + } + + /** + * Stores all restricted (privileged) attributes within the underlying user + * model, pulling the values of those attributes from the given Map. + * + * @param attributes + * The Map to pull all restricted attributes from. + */ + private void setRestrictedAttributes(Map attributes) { + + // Translate password expired attribute + if (attributes.containsKey(EXPIRED_ATTRIBUTE_NAME)) + getModel().setExpired("true".equals(attributes.get(EXPIRED_ATTRIBUTE_NAME))); + + // Translate access window start time + if (attributes.containsKey(ACCESS_WINDOW_START_ATTRIBUTE_NAME)) { + try { getModel().setAccessWindowStart(parseTime(attributes.get(ACCESS_WINDOW_START_ATTRIBUTE_NAME))); } + catch (ParseException e) { + logger.warn("Not setting start time of user access window: {}", e.getMessage()); + logger.debug("Unable to parse time attribute.", e); + } + } + + // Translate access window end time + if (attributes.containsKey(ACCESS_WINDOW_END_ATTRIBUTE_NAME)) { + try { getModel().setAccessWindowEnd(parseTime(attributes.get(ACCESS_WINDOW_END_ATTRIBUTE_NAME))); } + catch (ParseException e) { + logger.warn("Not setting end time of user access window: {}", e.getMessage()); + logger.debug("Unable to parse time attribute.", e); + } + } + + // Translate account validity start date + if (attributes.containsKey(VALID_FROM_ATTRIBUTE_NAME)) { + try { getModel().setValidFrom(parseDate(attributes.get(VALID_FROM_ATTRIBUTE_NAME))); } + catch (ParseException e) { + logger.warn("Not setting user validity start date: {}", e.getMessage()); + logger.debug("Unable to parse date attribute.", e); + } + } + + // Translate account validity end date + if (attributes.containsKey(VALID_UNTIL_ATTRIBUTE_NAME)) { + try { getModel().setValidUntil(parseDate(attributes.get(VALID_UNTIL_ATTRIBUTE_NAME))); } + catch (ParseException e) { + logger.warn("Not setting user validity end date: {}", e.getMessage()); + logger.debug("Unable to parse date attribute.", e); + } + } + + // Translate timezone attribute + if (attributes.containsKey(TIMEZONE_ATTRIBUTE_NAME)) + getModel().setTimeZone(TimeZoneField.parse(attributes.get(TIMEZONE_ATTRIBUTE_NAME))); + + } + + /** + * Stores all unrestricted (unprivileged) attributes within the underlying + * user model, pulling the values of those attributes from the given Map. + * + * @param attributes + * The Map to pull all unrestricted attributes from. + */ + private void setUnrestrictedAttributes(Map attributes) { + + // Translate full name attribute + if (attributes.containsKey(User.Attribute.FULL_NAME)) + getModel().setFullName(TextField.parse(attributes.get(User.Attribute.FULL_NAME))); + + // Translate email address attribute + if (attributes.containsKey(User.Attribute.EMAIL_ADDRESS)) + getModel().setEmailAddress(TextField.parse(attributes.get(User.Attribute.EMAIL_ADDRESS))); + + // Translate organization attribute + if (attributes.containsKey(User.Attribute.ORGANIZATION)) + getModel().setOrganization(TextField.parse(attributes.get(User.Attribute.ORGANIZATION))); + + // Translate role attribute + if (attributes.containsKey(User.Attribute.ORGANIZATIONAL_ROLE)) + getModel().setOrganizationalRole(TextField.parse(attributes.get(User.Attribute.ORGANIZATIONAL_ROLE))); + + } + + @Override + public Set getSupportedAttributeNames() { + return ATTRIBUTE_NAMES; + } + + @Override + public Map getAttributes() { + + // Include any defined arbitrary attributes + Map attributes = super.getAttributes(); + + // Always include unrestricted attributes + putUnrestrictedAttributes(attributes); + + // Include restricted attributes only if they should be exposed + if (exposeRestrictedAttributes) + putRestrictedAttributes(attributes); + + return attributes; + } + + @Override + public void setAttributes(Map attributes) { + + // Set arbitrary attributes + super.setAttributes(attributes); + + // Always assign unrestricted attributes + setUnrestrictedAttributes(attributes); + + // Assign restricted attributes only if they are exposed + if (exposeRestrictedAttributes) + setRestrictedAttributes(attributes); + + } + + /** + * Returns the time zone associated with this user. This time zone must be + * used when interpreting all date/time restrictions related to this user. + * + * @return + * The time zone associated with this user. + */ + private TimeZone getTimeZone() { + + // If no time zone is set, use the default + String timeZone = getModel().getTimeZone(); + if (timeZone == null) + return TimeZone.getDefault(); + + // Otherwise parse and return time zone + return TimeZone.getTimeZone(timeZone); + + } + + /** + * Converts a SQL Time to a Calendar, independently of time zone, using the + * given Calendar as a base. The time components will be copied to the + * given Calendar verbatim, leaving the date and time zone components of + * the given Calendar otherwise intact. + * + * @param base + * The Calendar object to use as a base for the conversion. + * + * @param time + * The SQL Time object containing the time components to be applied to + * the given Calendar. + * + * @return + * The given Calendar, now modified to represent the given time. + */ + private Calendar asCalendar(Calendar base, Time time) { + + // Get calendar from given SQL time + Calendar timeCalendar = Calendar.getInstance(); + timeCalendar.setTime(time); + + // Apply given time to base calendar + base.set(Calendar.HOUR_OF_DAY, timeCalendar.get(Calendar.HOUR_OF_DAY)); + base.set(Calendar.MINUTE, timeCalendar.get(Calendar.MINUTE)); + base.set(Calendar.SECOND, timeCalendar.get(Calendar.SECOND)); + base.set(Calendar.MILLISECOND, timeCalendar.get(Calendar.MILLISECOND)); + + return base; + + } + + /** + * Returns the time during the current day when this user account can start + * being used. + * + * @return + * The time during the current day when this user account can start + * being used. + */ + private Calendar getAccessWindowStart() { + + // Get window start time + Time start = getModel().getAccessWindowStart(); + if (start == null) + return null; + + // Return within defined time zone, current day + return asCalendar(Calendar.getInstance(getTimeZone()), start); + + } + + /** + * Returns the time during the current day when this user account can no + * longer be used. + * + * @return + * The time during the current day when this user account can no longer + * be used. + */ + private Calendar getAccessWindowEnd() { + + // Get window end time + Time end = getModel().getAccessWindowEnd(); + if (end == null) + return null; + + // Return within defined time zone, current day + return asCalendar(Calendar.getInstance(getTimeZone()), end); + + } + + /** + * Returns the date after which this account becomes valid. The time + * components of the resulting Calendar object will be set to midnight of + * the date in question. + * + * @return + * The date after which this account becomes valid. + */ + private Calendar getValidFrom() { + + // Get valid from date + Date validFrom = getModel().getValidFrom(); + if (validFrom == null) + return null; + + // Convert to midnight within defined time zone + Calendar validFromCalendar = Calendar.getInstance(getTimeZone()); + validFromCalendar.setTime(validFrom); + validFromCalendar.set(Calendar.HOUR_OF_DAY, 0); + validFromCalendar.set(Calendar.MINUTE, 0); + validFromCalendar.set(Calendar.SECOND, 0); + validFromCalendar.set(Calendar.MILLISECOND, 0); + return validFromCalendar; + + } + + /** + * Returns the date after which this account becomes invalid. The time + * components of the resulting Calendar object will be set to the last + * millisecond of the day in question (23:59:59.999). + * + * @return + * The date after which this account becomes invalid. + */ + private Calendar getValidUntil() { + + // Get valid until date + Date validUntil = getModel().getValidUntil(); + if (validUntil == null) + return null; + + // Convert to end-of-day within defined time zone + Calendar validUntilCalendar = Calendar.getInstance(getTimeZone()); + validUntilCalendar.setTime(validUntil); + validUntilCalendar.set(Calendar.HOUR_OF_DAY, 23); + validUntilCalendar.set(Calendar.MINUTE, 59); + validUntilCalendar.set(Calendar.SECOND, 59); + validUntilCalendar.set(Calendar.MILLISECOND, 999); + return validUntilCalendar; + + } + + /** + * Given a time when a particular state changes from inactive to active, + * and a time when a particular state changes from active to inactive, + * determines whether that state is currently active. + * + * @param activeStart + * The time at which the state changes from inactive to active. + * + * @param inactiveStart + * The time at which the state changes from active to inactive. + * + * @return + * true if the state is currently active, false otherwise. + */ + private boolean isActive(Calendar activeStart, Calendar inactiveStart) { + + // If end occurs before start, convert to equivalent case where start + // start is before end + if (inactiveStart != null && activeStart != null && inactiveStart.before(activeStart)) + return !isActive(inactiveStart, activeStart); + + // Get current time + Calendar current = Calendar.getInstance(); + + // State is active iff the current time is between the start and end + return !(activeStart != null && current.before(activeStart)) + && !(inactiveStart != null && current.after(inactiveStart)); + + } + + /** + * Returns whether this user account is currently valid as of today. + * Account validity depends on optional date-driven restrictions which + * define when an account becomes valid, and when an account ceases being + * valid. + * + * @return + * true if the account is valid as of today, false otherwise. + */ + public boolean isAccountValid() { + return isActive(getValidFrom(), getValidUntil()); + } + + /** + * Returns whether the current time is within this user's allowed access + * window. If the login times for this user are not limited, this will + * return true. + * + * @return + * true if the current time is within this user's allowed access + * window, or if this user has no restrictions on login time, false + * otherwise. + */ + public boolean isAccountAccessible() { + return isActive(getAccessWindowStart(), getAccessWindowEnd()); + } + + /** + * Returns whether this user's password has expired. If a user's password + * is expired, it must be immediately changed upon login. A user account + * with an expired password cannot be used until the password has been + * changed. + * + * @return + * true if this user's password has expired, false otherwise. + */ + public boolean isExpired() { + return getModel().isExpired(); + } + + @Override + public Timestamp getLastActive() { + return getModel().getLastActive(); + } + + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + UserRecordSet userRecordSet = userRecordSetProvider.get(); + userRecordSet.init(getCurrentUser(), this.getIdentifier()); + return userRecordSet; + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + UserParentUserGroupSet parentUserGroupSet = parentUserGroupSetProvider.get(); + parentUserGroupSet.init(getCurrentUser(), this); + return parentUserGroupSet; + } + + @Override + public Permissions getEffectivePermissions() throws GuacamoleException { + return super.getEffective(); + } + + /** + * Returns true if this user is a skeleton user, lacking a database entity + * entry. + * + * @return + * True if this user is a skeleton user, otherwise false. + */ + public boolean isSkeleton() { + return (getModel().getEntityID() == null); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java new file mode 100644 index 0000000..6064dda --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java @@ -0,0 +1,344 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + + +import org.apache.guacamole.auth.jdbc.connectiongroup.RootConnectionGroup; +import org.apache.guacamole.auth.jdbc.connectiongroup.ConnectionGroupDirectory; +import org.apache.guacamole.auth.jdbc.connection.ConnectionDirectory; +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Collection; +import java.util.Date; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.RestrictedObject; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionDirectory; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordModel; +import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordSet; +import org.apache.guacamole.auth.jdbc.connection.ModeledConnection; +import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup; +import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; +import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileDirectory; +import org.apache.guacamole.auth.jdbc.usergroup.ModeledUserGroup; +import org.apache.guacamole.auth.jdbc.usergroup.UserGroupDirectory; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * UserContext implementation which is driven by an arbitrary, underlying + * database. + */ +public class ModeledUserContext extends RestrictedObject + implements org.apache.guacamole.net.auth.UserContext { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ModeledUserContext.class); + + /** + * User directory restricted by the permissions of the user associated + * with this context. + */ + @Inject + private UserDirectory userDirectory; + + /** + * User group directory restricted by the permissions of the user associated + * with this context. + */ + @Inject + private UserGroupDirectory userGroupDirectory; + + /** + * Connection directory restricted by the permissions of the user + * associated with this context. + */ + @Inject + private ConnectionDirectory connectionDirectory; + + /** + * Connection group directory restricted by the permissions of the user + * associated with this context. + */ + @Inject + private ConnectionGroupDirectory connectionGroupDirectory; + + /** + * Sharing profile directory restricted by the permissions of the user + * associated with this context. + */ + @Inject + private SharingProfileDirectory sharingProfileDirectory; + + /** + * ActiveConnection directory restricted by the permissions of the user + * associated with this context. + */ + @Inject + private ActiveConnectionDirectory activeConnectionDirectory; + + /** + * Provider for creating the root group. + */ + @Inject + private Provider rootGroupProvider; + + /** + * Provider for creating connection record sets. + */ + @Inject + private Provider connectionRecordSetProvider; + + /** + * Provider for creating user record sets. + */ + @Inject + private Provider userRecordSetProvider; + + /** + * Provider for retrieving UserContext instances. + */ + @Inject + private Provider userContextProvider; + + /** + * Mapper for user login records. + */ + @Inject + private UserRecordMapper userRecordMapper; + + /** + * The environment of the Guacamole server. + */ + @Inject + private JDBCEnvironment environment; + + /** + * The activity record associated with this user's Guacamole session. If + * this user's session will not have an associated activity record, such as + * a temporary privileged session created via getPrivileged(), this will be + * null. + */ + private ActivityRecordModel userRecord; + + @Override + public void init(ModeledAuthenticatedUser currentUser) { + + super.init(currentUser); + + // Init directories + userDirectory.init(currentUser); + userGroupDirectory.init(currentUser); + connectionDirectory.init(currentUser); + connectionGroupDirectory.init(currentUser); + sharingProfileDirectory.init(currentUser); + activeConnectionDirectory.init(currentUser); + + } + + /** + * Records that the user associated with this UserContext has logged in, + * creating a partial activity record. The resulting activity record will + * contain a start date only, with the end date being automatically + * populated when this UserContext is invalidated. If this function is + * invoked more than once for the same UserContext, only the first + * invocation has any effect. If this function is never invoked, no + * activity record will be recorded, including when this UserContext is + * invalidated. + * + * @throws GuacamoleException + * If an error occurs retrieving configuration information from the + * environment. + */ + public void recordUserLogin() throws GuacamoleException { + + // Do nothing if invoked multiple times + if (userRecord != null) + return; + + // Create login record for user + userRecord = new ActivityRecordModel(); + userRecord.setUsername(getCurrentUser().getIdentifier()); + userRecord.setStartDate(new Date()); + userRecord.setRemoteHost(getCurrentUser().getCredentials().getRemoteAddress()); + + // Insert record representing login + userRecordMapper.insert(userRecord, environment.getCaseSensitivity()); + + } + + @Override + public UserContext getPrivileged() { + ModeledUserContext context = userContextProvider.get(); + context.init(new PrivilegedModeledAuthenticatedUser(getCurrentUser())); + return context; + } + + @Override + public User self() { + return getCurrentUser().getUser(); + } + + @Override + public Object getResource() throws GuacamoleException { + return null; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return getCurrentUser().getModelAuthenticationProvider(); + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + return userDirectory; + } + + @Override + public Directory getUserGroupDirectory() throws GuacamoleException { + return userGroupDirectory; + } + + @Override + public Directory getConnectionDirectory() throws GuacamoleException { + return connectionDirectory; + } + + @Override + public Directory getConnectionGroupDirectory() throws GuacamoleException { + return connectionGroupDirectory; + } + + @Override + public Directory getSharingProfileDirectory() + throws GuacamoleException { + return sharingProfileDirectory; + } + + @Override + public Directory getActiveConnectionDirectory() + throws GuacamoleException { + return activeConnectionDirectory; + } + + @Override + public ConnectionRecordSet getConnectionHistory() + throws GuacamoleException { + ConnectionRecordSet connectionRecordSet = connectionRecordSetProvider.get(); + connectionRecordSet.init(getCurrentUser()); + return connectionRecordSet; + } + + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + UserRecordSet userRecordSet = userRecordSetProvider.get(); + userRecordSet.init(getCurrentUser()); + return userRecordSet; + } + + @Override + public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { + + // Build and return a root group for the current user + RootConnectionGroup rootGroup = rootGroupProvider.get(); + rootGroup.init(getCurrentUser()); + return rootGroup; + + } + + @Override + public Collection getUserAttributes() { + return ModeledUser.ATTRIBUTES; + } + + @Override + public Collection getUserGroupAttributes() { + return ModeledUserGroup.ATTRIBUTES; + } + + @Override + public Collection getConnectionAttributes() { + return ModeledConnection.ATTRIBUTES; + } + + @Override + public Collection getConnectionGroupAttributes() { + return ModeledConnectionGroup.ATTRIBUTES; + } + + @Override + public Collection getSharingProfileAttributes() { + return ModeledSharingProfile.ATTRIBUTES; + } + + @Override + public void invalidate() { + + // Record logout time only if login time was recorded + if (userRecord != null) { + userRecord.setEndDate(new Date()); + userRecordMapper.updateEndDate(userRecord); + } + + } + + @Override + public boolean isValid() { + + try { + // If access window enforcement is disabled for active sessions, + // skip validity checks entirely + if (!environment.enforceAccessWindowsForActiveSessions()) + return true; + } + + catch (GuacamoleException e) { + + logger.warn( + "Unable to determine if access window enforcement is" + + " enabled for active sessions; enforcing by default: {}" + , e.getMessage()); + logger.debug("Unable to determine access window enforcement policy.", e); + + } + + // A user context is valid if the associated user's account is valid + // for the current date, and the user is within an access time window + ModeledUser user = getCurrentUser().getUser(); + return user.isAccountValid() && user.isAccountAccessible(); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.java new file mode 100644 index 0000000..a44329c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import java.util.List; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for historical password records (users' prior passwords, along with + * the dates they were set). + */ +public interface PasswordRecordMapper extends ModeledDirectoryObjectMapper { + + /** + * Returns a collection of all password records associated with the user + * having the given username. + * + * @param username + * The username of the user whose password records are to be retrieved. + * + * @param maxHistorySize + * The maximum number of records to maintain for each user. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * A collection of all password records associated with the user having + * the given username. This collection will be empty if no such user + * exists. + */ + List select(@Param("username") String username, + @Param("maxHistorySize") int maxHistorySize, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + + /** + * Inserts the given password record. Old records exceeding the maximum + * history size will be automatically deleted. + * + * @param record + * The password record to insert. + * + * @param maxHistorySize + * The maximum number of records to maintain for each user. + * + * @return + * The number of rows inserted. + */ + int insert(@Param("record") PasswordRecordModel record, + @Param("maxHistorySize") int maxHistorySize); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PasswordRecordModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PasswordRecordModel.java new file mode 100644 index 0000000..cfaaad5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PasswordRecordModel.java @@ -0,0 +1,154 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import java.sql.Timestamp; + +/** + * A single password record representing a previous password of a particular + * user, along with the time/date that password was set. + */ +public class PasswordRecordModel { + + /** + * The database ID of the user associated with this password record. + */ + private Integer userID; + + /** + * The hash of the password and salt. + */ + private byte[] passwordHash; + + /** + * The random salt that was appended to the password prior to hashing. + */ + private byte[] passwordSalt; + + /** + * The date and time when this password was first set for the associated + * user. + */ + private Timestamp passwordDate; + + /** + * Creates a new, empty PasswordRecordModel. + */ + public PasswordRecordModel() { + } + + /** + * Creates a new PasswordRecordModel associated with the given user and + * populated with that user's password hash and salt. + * + * @param user + * The user to associate with this PasswordRecordModel. + */ + public PasswordRecordModel(UserModel user) { + this.userID = user.getObjectID(); + this.passwordHash = user.getPasswordHash(); + this.passwordSalt = user.getPasswordSalt(); + this.passwordDate = user.getPasswordDate(); + } + + /** + * Returns the database ID of the user associated with this password + * record. + * + * @return + * The database ID of the user associated with this password record. + */ + public Integer getUserID() { + return userID; + } + + /** + * Sets the database ID of the user associated with this password record. + * + * @param userID + * The database ID of the user to associate with this password + * record. + */ + public void setUserID(Integer userID) { + this.userID = userID; + } + + /** + * Returns the hash of the password and password salt. + * + * @return + * The hash of the password and password salt. + */ + public byte[] getPasswordHash() { + return passwordHash; + } + + /** + * Sets the hash of the password and password salt. + * + * @param passwordHash + * The hash of the password and password salt. + */ + public void setPasswordHash(byte[] passwordHash) { + this.passwordHash = passwordHash; + } + + /** + * Returns the random salt that was used when generating the password hash. + * + * @return + * The random salt that was used when generating the password hash. + */ + public byte[] getPasswordSalt() { + return passwordSalt; + } + + /** + * Sets the random salt that was used when generating the password hash. + * + * @param passwordSalt + * The random salt used when generating the password hash. + */ + public void setPasswordSalt(byte[] passwordSalt) { + this.passwordSalt = passwordSalt; + } + + /** + * Returns the date that this password was first set for the associated + * user. + * + * @return + * The date that this password was first set for the associated user. + */ + public Timestamp getPasswordDate() { + return passwordDate; + } + + /** + * Sets the date that this password was first set for the associated user. + * + * @param passwordDate + * The date that this password was first set for the associated user. + */ + public void setPasswordDate(Timestamp passwordDate) { + this.passwordDate = passwordDate; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PrivilegedModeledAuthenticatedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PrivilegedModeledAuthenticatedUser.java new file mode 100644 index 0000000..82fcf08 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/PrivilegedModeledAuthenticatedUser.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import org.apache.guacamole.GuacamoleException; + +/** + * A ModeledAuthenticatedUser which is always privileged, returning true for + * every call to isPrivileged(). + */ +public class PrivilegedModeledAuthenticatedUser extends ModeledAuthenticatedUser { + + /** + * Creates a new PrivilegedModeledAuthenticatedUser which shares the same + * user identity as the given ModeledAuthenticatedUser. Regardless of the + * privileges explicitly granted to the given user, the resulting + * PrivilegedModeledAuthenticatedUser will always assert that it is + * privileged. + * + * @param authenticatedUser + * The ModeledAuthenticatedUser that declares the identity of the user + * in question. + */ + public PrivilegedModeledAuthenticatedUser(ModeledAuthenticatedUser authenticatedUser){ + super(authenticatedUser, authenticatedUser.getModelAuthenticationProvider(), authenticatedUser.getUser()); + } + + @Override + public boolean isPrivileged() throws GuacamoleException { + return true; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/RemoteAuthenticatedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/RemoteAuthenticatedUser.java new file mode 100644 index 0000000..a936e4e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/RemoteAuthenticatedUser.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An AuthenticatedUser that has an associated remote host. + */ +public abstract class RemoteAuthenticatedUser implements AuthenticatedUser { + + /** + * The credentials given when this user authenticated. + */ + private final Credentials credentials; + + /** + * The AuthenticationProvider that authenticated this user. + */ + private final AuthenticationProvider authenticationProvider; + + /** + * The host from which this user authenticated. + */ + private final String remoteHost; + + /** + * The identifiers of any groups of which this user is a member, including + * groups inherited through membership in other groups. + */ + private final Set effectiveGroups; + + /** + * Creates a new RemoteAuthenticatedUser, deriving the associated remote + * host from the given credentials. + * + * @param authenticationProvider + * The AuthenticationProvider that has authenticated the given user. + * + * @param credentials + * The credentials given by the user when they authenticated. + * + * @param effectiveGroups + * The identifiers of any groups of which this user is a member, + * including groups inherited through membership in other groups. + */ + public RemoteAuthenticatedUser(AuthenticationProvider authenticationProvider, + Credentials credentials, Set effectiveGroups) { + this.authenticationProvider = authenticationProvider; + this.credentials = credentials; + this.remoteHost = credentials.getRemoteAddress(); + this.effectiveGroups = Collections.unmodifiableSet(effectiveGroups); + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + /** + * Returns the host from which this user authenticated. + * + * @return + * The host from which this user authenticated. + */ + public String getRemoteHost() { + return remoteHost; + } + + @Override + public Set getEffectiveUserGroups() { + return effectiveGroups; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authenticationProvider; + } + + @Override + public void invalidate() { + // Nothing to invalidate + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserDirectory.java new file mode 100644 index 0000000..72d5a4f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserDirectory.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.JDBCDirectory; +import org.apache.guacamole.net.auth.User; +import org.mybatis.guice.transactional.Transactional; + +/** + * Implementation of the User Directory which is driven by an underlying, + * arbitrary database. + */ +public class UserDirectory extends JDBCDirectory { + + /** + * Service for managing user objects. + */ + @Inject + private UserService userService; + + @Override + public User get(String identifier) throws GuacamoleException { + return userService.retrieveObject(getCurrentUser(), identifier); + } + + @Override + @Transactional + public Collection getAll(Collection identifiers) throws GuacamoleException { + Collection objects = userService.retrieveObjects(getCurrentUser(), identifiers); + return Collections.unmodifiableCollection(objects); + } + + @Override + @Transactional + public Set getIdentifiers() throws GuacamoleException { + return userService.getIdentifiers(getCurrentUser()); + } + + @Override + @Transactional + public void add(User object) throws GuacamoleException { + userService.createObject(getCurrentUser(), object); + } + + @Override + @Transactional + public void update(User object) throws GuacamoleException { + ModeledUser user = (ModeledUser) object; + userService.updateObject(getCurrentUser(), user); + } + + @Override + @Transactional + public void remove(String identifier) throws GuacamoleException { + userService.deleteObject(getCurrentUser(), identifier); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java new file mode 100644 index 0000000..8d7e5ad --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for user objects. + */ +public interface UserMapper extends ModeledDirectoryObjectMapper { + + /** + * Returns the user having the given username, if any. If no such user + * exists, null is returned. + * + * @param username + * The username of the user to return. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * The user having the given username, or null if no such user exists. + */ + UserModel selectOne(@Param("username") String username, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserModel.java new file mode 100644 index 0000000..3d441d6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserModel.java @@ -0,0 +1,513 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.EntityType; + +/** + * Object representation of a Guacamole user, as represented in the database. + */ +public class UserModel extends EntityModel { + + /** + * The SHA-256 hash of the password and salt. + */ + private byte[] passwordHash; + + /** + * The 32-byte random binary password salt that was appended to the + * password prior to hashing. + */ + private byte[] passwordSalt; + + /** + * The time this user's password was last reset. + */ + private Timestamp passwordDate; + + /** + * Whether the user account is disabled. Disabled accounts exist and can + * be modified, but cannot be used. + */ + private boolean disabled; + + /** + * Whether the user's password is expired. If a user's password is expired, + * it must be changed immediately upon login, and the account cannot be + * used until this occurs. + */ + private boolean expired; + + /** + * The time each day after which this user account may be used, stored in + * local time according to the value of timeZone. + */ + private Time accessWindowStart; + + /** + * The time each day after which this user account may NOT be used, stored + * in local time according to the value of timeZone. + */ + private Time accessWindowEnd; + + /** + * The day after which this account becomes valid and usable. Account + * validity begins at midnight of this day. Time information within the + * Date object is ignored. + */ + private Date validFrom; + + /** + * The day after which this account can no longer be used. Account validity + * ends at midnight of the day following this day. Time information within + * the Date object is ignored. + */ + private Date validUntil; + + /** + * The ID of the time zone used for all time comparisons for this user. + * Both accessWindowStart and accessWindowEnd values will use this time + * zone, as will checks for whether account validity dates have passed. If + * unset, the server's local time zone is used. + */ + private String timeZone; + + /** + * The user's full name, or null if this is not known. + */ + private String fullName; + + /** + * The email address of the user, or null if this is not known. + */ + private String emailAddress; + + /** + * The organization, company, group, etc. that the user belongs to, or null + * if this is not known. + */ + private String organization; + + /** + * The role that the user has at the organization, company, group, etc. + * they belong to, or null if this is not known. + */ + private String organizationalRole; + + /** + * The date and time that this user was last active, or null if this user + * has never logged in. + */ + private Timestamp lastActive; + + /** + * Creates a new, empty user. + */ + public UserModel() { + super(EntityType.USER); + } + + /** + * Creates a new user having the provided identifier. + * + * @param identifier + * The identifier of the new user. + */ + public UserModel(String identifier) { + super(EntityType.USER); + super.setIdentifier(identifier); + } + + /** + * Returns the hash of this user's password and password salt. This may be + * null if the user was not retrieved from the database, and setPassword() + * has not yet been called. + * + * @return + * The hash of this user's password and password salt. + */ + public byte[] getPasswordHash() { + return passwordHash; + } + + /** + * Sets the hash of this user's password and password salt. This is + * normally only set upon retrieval from the database, or through a call + * to the higher-level setPassword() function. + * + * @param passwordHash + * The hash of this user's password and password salt. + */ + public void setPasswordHash(byte[] passwordHash) { + this.passwordHash = passwordHash; + } + + /** + * Returns the random salt that was used when generating this user's + * password hash. This may be null if the user was not retrieved from the + * database, and setPassword() has not yet been called. + * + * @return + * The random salt that was used when generating this user's password + * hash. + */ + public byte[] getPasswordSalt() { + return passwordSalt; + } + + /** + * Sets the random salt that was used when generating this user's password + * hash. This is normally only set upon retrieval from the database, or + * through a call to the higher-level setPassword() function. + * + * @param passwordSalt + * The random salt used when generating this user's password hash. + */ + public void setPasswordSalt(byte[] passwordSalt) { + this.passwordSalt = passwordSalt; + } + + /** + * Returns the date that this user's password was last set/reset. This + * value is required to be manually updated whenever the user's password is + * changed; it will not be automatically updated by the database. + * + * @return + * The date that this user's password was last set/reset. + */ + public Timestamp getPasswordDate() { + return passwordDate; + } + + /** + * Sets the date that this user's password was last set/reset. This + * value is required to be manually updated whenever the user's password is + * changed; it will not be automatically updated by the database. + * + * @param passwordDate + * The date that this user's password was last set/reset. + */ + public void setPasswordDate(Timestamp passwordDate) { + this.passwordDate = passwordDate; + } + + /** + * Returns whether this user account has been disabled. The credentials of + * disabled user accounts are treated as invalid, effectively disabling + * that user's access to data for which they would otherwise have + * permission. + * + * @return + * true if this user account is disabled, false otherwise. + */ + public boolean isDisabled() { + return disabled; + } + + /** + * Sets whether this user account has been disabled. The credentials of + * disabled user accounts are treated as invalid, effectively disabling + * that user's access to data for which they would otherwise have + * permission. + * + * @param disabled + * true if this user account should be disabled, false otherwise. + */ + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + /** + * Returns whether this user's password has expired. If a user's password + * is expired, it must be immediately changed upon login. A user account + * with an expired password cannot be used until the password has been + * changed. + * + * @return + * true if this user's password has expired, false otherwise. + */ + public boolean isExpired() { + return expired; + } + + /** + * Sets whether this user's password is expired. If a user's password is + * expired, it must be immediately changed upon login. A user account with + * an expired password cannot be used until the password has been changed. + * + * @param expired + * true if this user's password has expired, false otherwise. + */ + public void setExpired(boolean expired) { + this.expired = expired; + } + + /** + * Returns the time each day after which this user account may be used. The + * time returned will be local time according to the time zone set with + * setTimeZone(). + * + * @return + * The time each day after which this user account may be used, or null + * if this restriction does not apply. + */ + public Time getAccessWindowStart() { + return accessWindowStart; + } + + /** + * Sets the time each day after which this user account may be used. The + * time given must be in local time according to the time zone set with + * setTimeZone(). + * + * @param accessWindowStart + * The time each day after which this user account may be used, or null + * if this restriction does not apply. + */ + public void setAccessWindowStart(Time accessWindowStart) { + this.accessWindowStart = accessWindowStart; + } + + /** + * Returns the time each day after which this user account may NOT be used. + * The time returned will be local time according to the time zone set with + * setTimeZone(). + * + * @return + * The time each day after which this user account may NOT be used, or + * null if this restriction does not apply. + */ + public Time getAccessWindowEnd() { + return accessWindowEnd; + } + + /** + * Sets the time each day after which this user account may NOT be used. + * The time given must be in local time according to the time zone set with + * setTimeZone(). + * + * @param accessWindowEnd + * The time each day after which this user account may NOT be used, or + * null if this restriction does not apply. + */ + public void setAccessWindowEnd(Time accessWindowEnd) { + this.accessWindowEnd = accessWindowEnd; + } + + /** + * Returns the day after which this account becomes valid and usable. + * Account validity begins at midnight of this day. Any time information + * within the returned Date object must be ignored. + * + * @return + * The day after which this account becomes valid and usable, or null + * if this restriction does not apply. + */ + public Date getValidFrom() { + return validFrom; + } + + /** + * Sets the day after which this account becomes valid and usable. Account + * validity begins at midnight of this day. Any time information within + * the provided Date object will be ignored. + * + * @param validFrom + * The day after which this account becomes valid and usable, or null + * if this restriction does not apply. + */ + public void setValidFrom(Date validFrom) { + this.validFrom = validFrom; + } + + /** + * Returns the day after which this account can no longer be used. Account + * validity ends at midnight of the day following this day. Any time + * information within the returned Date object must be ignored. + * + * @return + * The day after which this account can no longer be used, or null if + * this restriction does not apply. + */ + public Date getValidUntil() { + return validUntil; + } + + /** + * Sets the day after which this account can no longer be used. Account + * validity ends at midnight of the day following this day. Any time + * information within the provided Date object will be ignored. + * + * @param validUntil + * The day after which this account can no longer be used, or null if + * this restriction does not apply. + */ + public void setValidUntil(Date validUntil) { + this.validUntil = validUntil; + } + + /** + * Returns the Java ID of the time zone to be used for all time comparisons + * for this user. This ID should correspond to a value returned by + * TimeZone.getAvailableIDs(). If unset or invalid, the server's local time + * zone must be used. + * + * @return + * The ID of the time zone to be used for all time comparisons, which + * should correspond to a value returned by TimeZone.getAvailableIDs(). + */ + public String getTimeZone() { + return timeZone; + } + + /** + * Sets the Java ID of the time zone to be used for all time comparisons + * for this user. This ID should correspond to a value returned by + * TimeZone.getAvailableIDs(). If unset or invalid, the server's local time + * zone will be used. + * + * @param timeZone + * The ID of the time zone to be used for all time comparisons, which + * should correspond to a value returned by TimeZone.getAvailableIDs(). + */ + public void setTimeZone(String timeZone) { + this.timeZone = timeZone; + } + + /** + * Returns the user's full name, if known. If not available, null is + * returned. + * + * @return + * The user's full name, or null if this is not known. + */ + public String getFullName() { + return fullName; + } + + /** + * Sets the user's full name. + * + * @param fullName + * The user's full name, or null if this is not known. + */ + public void setFullName(String fullName) { + this.fullName = fullName; + } + + /** + * Returns the email address of the user, if known. If not available, null + * is returned. + * + * @return + * The email address of the user, or null if this is not known. + */ + public String getEmailAddress() { + return emailAddress; + } + + /** + * Sets the email address of the user. + * + * @param emailAddress + * The email address of the user, or null if this is not known. + */ + public void setEmailAddress(String emailAddress) { + this.emailAddress = emailAddress; + } + + /** + * Returns the organization, company, group, etc. that the user belongs to, + * if known. If not available, null is returned. + * + * @return + * The organization, company, group, etc. that the user belongs to, or + * null if this is not known. + */ + public String getOrganization() { + return organization; + } + + /** + * Sets the organization, company, group, etc. that the user belongs to. + * + * @param organization + * The organization, company, group, etc. that the user belongs to, or + * null if this is not known. + */ + public void setOrganization(String organization) { + this.organization = organization; + } + + /** + * Returns the role that the user has at the organization, company, group, + * etc. they belong to. If not available, null is returned. + * + * @return + * The role that the user has at the organization, company, group, etc. + * they belong to, or null if this is not known. + */ + public String getOrganizationalRole() { + return organizationalRole; + } + + /** + * Sets the role that the user has at the organization, company, group, + * etc. they belong to. + * + * @param organizationalRole + * The role that the user has at the organization, company, group, etc. + * they belong to, or null if this is not known. + */ + public void setOrganizationalRole(String organizationalRole) { + this.organizationalRole = organizationalRole; + } + + /** + * Returns the date and time that this user was last active, or null if + * this user has never logged in. + * + * @return + * The date and time that this user was last active, or null if this + * user has never logged in. + */ + public Timestamp getLastActive() { + return lastActive; + } + + /** + * Sets the date and time that this user was last active. This value is + * expected to be set automatically via queries, derived from user history + * records. It does NOT correspond to an actual column, and values set + * manually through invoking this function will not persist. + * + * @param lastActive + * The date and time that this user was last active, or null if this + * user has never logged in. + */ + public void setLastActive(Timestamp lastActive) { + this.lastActive = lastActive; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.java new file mode 100644 index 0000000..ee3d6a8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; + +/** + * Mapper for the one-to-many relationship between a user and the user groups + * of which it is a member. + */ +public interface UserParentUserGroupMapper extends ObjectRelationMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupSet.java new file mode 100644 index 0000000..f888729 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupSet.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import com.google.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; +import org.apache.guacamole.auth.jdbc.base.RelatedObjectSet; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * RelatedObjectSet implementation which represents the one-to-many + * relationship between a particular user and the user groups of which it is a + * member. + */ +public class UserParentUserGroupSet extends RelatedObjectSet { + + /** + * Mapper for the relations between users and the user groups of which they + * are members. + */ + @Inject + private UserParentUserGroupMapper userParentUserGroupMapper; + + @Override + protected ObjectRelationMapper getObjectRelationMapper() { + return userParentUserGroupMapper; + } + + @Override + protected ObjectPermissionSet + getParentObjectEffectivePermissionSet() throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserPermissions(); + } + + @Override + protected ObjectPermissionSet getChildObjectEffectivePermissionSet() + throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserGroupPermissions(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java new file mode 100644 index 0000000..155033d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import org.apache.guacamole.auth.jdbc.base.ActivityRecordMapper; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordModel; + +/** + * Mapper for user login activity records. + */ +public interface UserRecordMapper extends ActivityRecordMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordSet.java new file mode 100644 index 0000000..f1c2771 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordSet.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import com.google.inject.Inject; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSearchTerm; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSortPredicate; +import org.apache.guacamole.auth.jdbc.base.ModeledActivityRecordSet; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.AuthenticatedUser; + +/** + * A JDBC implementation of ActivityRecordSet for retrieving user login history. + * Calls to asCollection() will query user login records from the database. + * Which records are returned will be determined by the values passed in + * earlier. + */ +public class UserRecordSet extends ModeledActivityRecordSet { + + /** + * The namespace for the type 3 UUIDs generated for user history records. + * This UUID namespace is itself a type 3 UUID within the "ns:OID" + * namespace for the OID "1.3.6.1.4.1.18060.18.2.1.1", which has been + * specifically allocated for Apache Guacamole database user history + * records. + */ + public static final UUID UUID_NAMESPACE = UUID.fromString("e104741a-c949-3947-8d79-f3f2cdce7d6f"); + + /** + * Service for managing user objects. + */ + @Inject + private UserService userService; + + /** + * The identifier that indicates which user object these records should be + * limited to, if any. If null is specified (the default) then all records + * that are readable by the current user will be retrieved. + */ + private String identifier = null; + + /** + * Initialize this UserRecordSet with currentUser requesting the login + * records, and, optionally, the identifier of the user to which records + * should be limited. + * + * @param currentUser + * The user requesting login history. + * + * @param identifier + * The identifier of the user whose login history should be contained + * in this record set, or null if the record set should contain all + * records readable by the currentUser. + */ + protected void init(ModeledAuthenticatedUser currentUser, String identifier) { + super.init(currentUser); + this.identifier = identifier; + } + + @Override + protected List retrieveHistory( + AuthenticatedUser user, String recordIdentifier, + Set requiredContents, + List sortPredicates, int limit) + throws GuacamoleException { + + // Retrieve history from database + return userService.retrieveHistory(identifier, getCurrentUser(), + recordIdentifier, requiredContents, sortPredicates, limit); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java new file mode 100644 index 0000000..3f910c6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java @@ -0,0 +1,659 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.user; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectService; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordModel; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSearchTerm; +import org.apache.guacamole.auth.jdbc.base.ActivityRecordSortPredicate; +import org.apache.guacamole.auth.jdbc.base.EntityMapper; +import org.apache.guacamole.auth.jdbc.base.ModeledActivityRecord; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionModel; +import org.apache.guacamole.auth.jdbc.permission.UserPermissionMapper; +import org.apache.guacamole.auth.jdbc.security.PasswordEncryptionService; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicyService; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.PasswordField; +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.language.TranslatableGuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating users. + */ +public class UserService extends ModeledDirectoryObjectService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserService.class); + + /** + * All user permissions which are implicitly granted to the new user upon + * creation. + */ + private static final ObjectPermission.Type[] IMPLICIT_USER_PERMISSIONS = { + ObjectPermission.Type.READ + }; + + /** + * The name of the HTTP password parameter to expect if the user is + * changing their expired password upon login. + */ + private static final String NEW_PASSWORD_PARAMETER = "new-password"; + + /** + * The password field to provide the user when their password is expired + * and must be changed. + */ + private static final Field NEW_PASSWORD = new PasswordField(NEW_PASSWORD_PARAMETER); + + /** + * The name of the HTTP password confirmation parameter to expect if the + * user is changing their expired password upon login. + */ + private static final String CONFIRM_NEW_PASSWORD_PARAMETER = "confirm-new-password"; + + /** + * The password confirmation field to provide the user when their password + * is expired and must be changed. + */ + private static final Field CONFIRM_NEW_PASSWORD = new PasswordField(CONFIRM_NEW_PASSWORD_PARAMETER); + + /** + * Information describing the expected credentials if a user's password is + * expired. If a user's password is expired, it must be changed during the + * login process. + */ + private static final CredentialsInfo EXPIRED_PASSWORD = new CredentialsInfo(Arrays.asList( + CredentialsInfo.USERNAME, + CredentialsInfo.PASSWORD, + NEW_PASSWORD, + CONFIRM_NEW_PASSWORD + )); + + /** + * Mapper for creating/deleting entities. + */ + @Inject + private EntityMapper entityMapper; + + /** + * Mapper for accessing users. + */ + @Inject + private UserMapper userMapper; + + /** + * Mapper for manipulating user permissions. + */ + @Inject + private UserPermissionMapper userPermissionMapper; + + /** + * Mapper for accessing user login history. + */ + @Inject + private UserRecordMapper userRecordMapper; + + /** + * Provider for creating users. + */ + @Inject + private Provider userProvider; + + /** + * Service for hashing passwords. + */ + @Inject + private PasswordEncryptionService encryptionService; + + /** + * Service for enforcing password complexity policies. + */ + @Inject + private PasswordPolicyService passwordPolicyService; + + /** + * The server environment for retrieving configuration. + */ + @Inject + private JDBCEnvironment environment; + + @Override + protected ModeledDirectoryObjectMapper getObjectMapper() { + return userMapper; + } + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return userPermissionMapper; + } + + @Override + protected ModeledUser getObjectInstance(ModeledAuthenticatedUser currentUser, + UserModel model) throws GuacamoleException { + + boolean exposeRestrictedAttributes; + + // Expose restricted attributes if the user does not yet exist + if (model.getObjectID() == null) + exposeRestrictedAttributes = true; + + // Otherwise, if the user permissions are available, expose restricted + // attributes only if the user has ADMINISTER permission + else if (currentUser != null) + exposeRestrictedAttributes = hasObjectPermission(currentUser, + model.getIdentifier(), ObjectPermission.Type.ADMINISTER); + + // If user permissions are not available, do not expose anything + else + exposeRestrictedAttributes = false; + + // Produce ModeledUser exposing only those attributes for which the + // current user has permission + ModeledUser user = userProvider.get(); + user.init(currentUser, model, exposeRestrictedAttributes, + environment.getCaseSensitivity().caseSensitiveUsernames()); + return user; + + } + + @Override + protected UserModel getModelInstance(ModeledAuthenticatedUser currentUser, + final User object) throws GuacamoleException { + + // Create new ModeledUser backed by blank model + UserModel model = new UserModel(); + ModeledUser user = getObjectInstance(currentUser, model); + + // Set model contents through ModeledUser, copying the provided user + user.setIdentifier(object.getIdentifier()); + user.setPassword(object.getPassword()); + user.setAttributes(object.getAttributes()); + + return model; + + } + + @Override + protected CaseSensitivity getCaseSensitivity() throws GuacamoleException { + return environment.getCaseSensitivity(); + } + + @Override + protected boolean hasCreatePermission(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return whether user has explicit user creation permission + SystemPermissionSet permissionSet = user.getUser().getEffectivePermissions().getSystemPermissions(); + return permissionSet.hasPermission(SystemPermission.Type.CREATE_USER); + + } + + @Override + protected ObjectPermissionSet getEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return permissions related to users + return user.getUser().getEffectivePermissions().getUserPermissions(); + + } + + @Override + protected void beforeCreate(ModeledAuthenticatedUser user, User object, + UserModel model) throws GuacamoleException { + + super.beforeCreate(user, object, model); + + // Username must not be blank + if (model.getIdentifier() == null || model.getIdentifier().trim().isEmpty()) + throw new GuacamoleClientException("The username must not be blank."); + + // Do not create duplicate users + Collection existing = userMapper.select(Collections.singleton( + model.getIdentifier()), getCaseSensitivity()); + if (!existing.isEmpty()) + throw new GuacamoleClientException("User \"" + model.getIdentifier() + "\" already exists."); + + // Verify new password does not violate defined policies (if specified) + if (object.getPassword() != null) + passwordPolicyService.verifyPassword(object.getIdentifier(), object.getPassword()); + + // Create base entity object, implicitly populating underlying entity ID + entityMapper.insert(model); + + } + + @Override + protected void beforeUpdate(ModeledAuthenticatedUser user, + ModeledUser object, UserModel model) throws GuacamoleException { + + super.beforeUpdate(user, object, model); + + // Refuse to update if the user is a skeleton and does not actually + // exist in the database (this will happen if the user is authenticated + // via a non-database authentication provider) + if (object.isSkeleton()) { + logger.info("Data cannot be stored for user \"{}\" as they do not " + + "have an account within the database. If this is " + + "unexpected, consider allowing automatic creation of " + + "user accounts.", object.getIdentifier()); + throw new GuacamoleUnsupportedException("User does not exist " + + "within the database and cannot be updated."); + } + + // Username must not be blank + if (model.getIdentifier() == null || model.getIdentifier().trim().isEmpty()) + throw new GuacamoleClientException("The username must not be blank."); + + // Check whether such a user is already present + UserModel existing = userMapper.selectOne(model.getIdentifier(), + getCaseSensitivity()); + if (existing != null) { + + // Do not rename to existing user + if (!existing.getObjectID().equals(model.getObjectID())) + throw new GuacamoleClientException("User \"" + model.getIdentifier() + "\" already exists."); + + } + + // Verify new password does not violate defined policies (if specified) + if (object.getPassword() != null) { + + // Enforce password age only for non-privileged users + if (!user.isPrivileged()) + passwordPolicyService.verifyPasswordAge(object); + + // Always verify password complexity + passwordPolicyService.verifyPassword(object.getIdentifier(), object.getPassword()); + + // Store previous password in history + passwordPolicyService.recordPassword(object); + + } + + } + + @Override + protected Collection + getImplicitPermissions(ModeledAuthenticatedUser user, UserModel model) { + + // Get original set of implicit permissions and make a copy + Collection implicitPermissions = + new ArrayList<>(super.getImplicitPermissions(user, model)); + + // Grant implicit permissions to the new user + for (ObjectPermission.Type permissionType : IMPLICIT_USER_PERMISSIONS) { + + ObjectPermissionModel permissionModel = new ObjectPermissionModel(); + permissionModel.setEntityID(model.getEntityID()); + permissionModel.setType(permissionType); + permissionModel.setObjectIdentifier(model.getIdentifier()); + + // Add new permission to implicit permission set + implicitPermissions.add(permissionModel); + + } + + return Collections.unmodifiableCollection(implicitPermissions); + } + + @Override + protected void beforeDelete(ModeledAuthenticatedUser user, String identifier) throws GuacamoleException { + + super.beforeDelete(user, identifier); + + // Do not allow users to delete themselves + if (identifier.equals(user.getUser().getIdentifier())) + throw new GuacamoleUnsupportedException("Deleting your own user is not allowed."); + + } + + @Override + public void deleteObject(ModeledAuthenticatedUser user, String identifier) + throws GuacamoleException { + + beforeDelete(user, identifier); + + // Delete object + userMapper.delete(identifier, getCaseSensitivity()); + + } + + @Override + protected boolean isValidIdentifier(String identifier) { + + // All strings are valid user identifiers + return true; + + } + + /** + * Retrieves the user corresponding to the given credentials from the + * database. Note that this function will not enforce any additional + * account restrictions, including explicitly disabled accounts, + * scheduling, and password expiration. It is the responsibility of the + * caller to enforce such restrictions, if desired. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the user is being + * retrieved. + * + * @param credentials + * The credentials to use when locating the user. + * + * @return + * An AuthenticatedUser containing the existing ModeledUser object if + * the credentials given are valid, null otherwise. + * + * @throws GuacamoleException + * If the provided credentials to not conform to expectations. + */ + public ModeledAuthenticatedUser retrieveAuthenticatedUser(AuthenticationProvider authenticationProvider, + Credentials credentials) throws GuacamoleException { + + // Get username and password + String username = credentials.getUsername(); + String password = credentials.getPassword(); + + // Retrieve corresponding user model, if such a user exists + UserModel userModel = userMapper.selectOne(username, + getCaseSensitivity()); + if (userModel == null) + return null; + + // Verify provided password is correct + byte[] hash = encryptionService.createPasswordHash(password, userModel.getPasswordSalt()); + if (!Arrays.equals(hash, userModel.getPasswordHash())) + return null; + + // Create corresponding user object, set up cyclic reference + ModeledUser user = getObjectInstance(null, userModel); + user.setCurrentUser(new ModeledAuthenticatedUser(authenticationProvider, user, credentials)); + + // Return now-authenticated user + return user.getCurrentUser(); + + } + + /** + * Retrieves the user corresponding to the given AuthenticatedUser from the + * database. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the user is being + * retrieved. + * + * @param authenticatedUser + * The AuthenticatedUser to retrieve the corresponding ModeledUser of. + * + * @return + * The ModeledUser which corresponds to the given AuthenticatedUser, or + * null if no such user exists. + * + * @throws GuacamoleException + * If a ModeledUser object for the user corresponding to the given + * AuthenticatedUser cannot be created. + */ + public ModeledUser retrieveUser(AuthenticationProvider authenticationProvider, + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Retrieve corresponding user model, if such a user exists + UserModel userModel = userMapper.selectOne(authenticatedUser.getIdentifier(), + getCaseSensitivity()); + if (userModel == null) + return null; + + // Create corresponding user object, set up cyclic reference + ModeledUser user = getObjectInstance(null, userModel); + user.setCurrentUser(new ModeledAuthenticatedUser(authenticatedUser, + authenticationProvider, user)); + + // Return already-authenticated user + return user; + + } + + /** + * Generates an empty (skeleton) user corresponding to the given + * AuthenticatedUser. The user will not be stored in the database, and + * will only be available in-memory during the time the session is + * active. + * + * @param authenticationProvider + * The AuthenticationProvider on behalf of which the user is being + * retrieved. + * + * @param authenticatedUser + * The AuthenticatedUser to generate the skeleton account for. + * + * @return + * The empty ModeledUser which corresponds to the given + * AuthenticatedUser. + * + * @throws GuacamoleException + * If a ModeledUser object for the user corresponding to the given + * AuthenticatedUser cannot be created. + */ + public ModeledUser retrieveSkeletonUser(AuthenticationProvider authenticationProvider, + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Set up an empty user model + ModeledUser user = getObjectInstance(null, + new UserModel(authenticatedUser.getIdentifier())); + + // Create user object, and configure cyclic reference + user.setCurrentUser(new ModeledAuthenticatedUser(authenticatedUser, + authenticationProvider, user)); + + // Return the new user. + return user; + + } + + /** + * Resets the password of the given user to the new password specified via + * the "new-password" and "confirm-new-password" parameters from the + * provided credentials. If these parameters are missing or invalid, + * additional credentials will be requested. + * + * @param user + * The user whose password should be reset. + * + * @param credentials + * The credentials from which the parameters required for password + * reset should be retrieved. + * + * @throws GuacamoleException + * If the password reset parameters within the given credentials are + * invalid or missing. + */ + public void resetExpiredPassword(ModeledUser user, Credentials credentials) + throws GuacamoleException { + + UserModel userModel = user.getModel(); + + // Get username + String username = user.getIdentifier(); + + // Pull new password from HTTP request + String newPassword = credentials.getParameter(NEW_PASSWORD_PARAMETER); + String confirmNewPassword = credentials.getParameter(CONFIRM_NEW_PASSWORD_PARAMETER); + + // Require new password if account is expired + if (newPassword == null || confirmNewPassword == null) { + logger.info("The password of user \"{}\" has expired and must be reset.", username); + throw new TranslatableGuacamoleInsufficientCredentialsException("Password has expired", + "LOGIN.INFO_PASSWORD_EXPIRED", EXPIRED_PASSWORD); + } + + // New password must be different from old password + if (newPassword.equals(credentials.getPassword())) + throw new TranslatableGuacamoleClientException("New passwords may " + + "not be identical to the current password if password " + + "reset is required.", "LOGIN.ERROR_PASSWORD_SAME"); + + // New password must not be blank + if (newPassword.isEmpty()) + throw new TranslatableGuacamoleClientException("Passwords may not " + + "be blank.", "LOGIN.ERROR_PASSWORD_BLANK"); + + // Confirm that the password was entered correctly twice + if (!newPassword.equals(confirmNewPassword)) + throw new TranslatableGuacamoleClientException("New password does " + + "not match.", "LOGIN.ERROR_PASSWORD_MISMATCH"); + + // Verify new password does not violate defined policies + passwordPolicyService.verifyPassword(username, newPassword); + + // Change password and reset expiration flag + userModel.setExpired(false); + user.setPassword(newPassword); + userMapper.update(userModel); + logger.info("Expired password of user \"{}\" has been reset.", username); + + } + + /** + * Returns a ActivityRecord object which is backed by the given model. + * + * @param model + * The model object to use to back the returned connection record + * object. + * + * @return + * A connection record object which is backed by the given model. + */ + protected ActivityRecord getObjectInstance(ActivityRecordModel model) { + return new ModeledActivityRecord(UserRecordSet.UUID_NAMESPACE, model); + } + + /** + * Returns a list of ActivityRecord objects which are backed by the + * models in the given list. + * + * @param models + * The model objects to use to back the activity record objects + * within the returned list. + * + * @return + * A list of activity record objects which are backed by the models + * in the given list. + */ + protected List getObjectInstances(List models) { + + // Create new list of records by manually converting each model + List objects = new ArrayList(models.size()); + for (ActivityRecordModel model : models) + objects.add(getObjectInstance(model)); + + return objects; + + } + + /** + * Retrieves user login history records matching the given criteria. + * Retrieves up to limit user history records matching the + * given terms and sorted by the given predicates. Only history records + * associated with data that the given user can read are returned. + * + * @param username + * The optional username to which history records should be limited, or + * null if all readable records should be retrieved. + * + * @param user + * The user retrieving the login history. + * + * @param recordIdentifier + * The identifier of the specific history record to retrieve, if not + * all matching records. Search terms, etc. will still be applied to + * the single record. + * + * @param requiredContents + * The search terms that must be contained somewhere within each of the + * returned records. + * + * @param sortPredicates + * A list of predicates to sort the returned records by, in order of + * priority. + * + * @param limit + * The maximum number of records that should be returned. + * + * @return + * The login history of the given user, including any active sessions. + * + * @throws GuacamoleException + * If permission to read the user login history is denied. + */ + public List retrieveHistory(String username, + ModeledAuthenticatedUser user, String recordIdentifier, + Collection requiredContents, + List sortPredicates, int limit) + throws GuacamoleException { + + List searchResults; + + // Bypass permission checks if the user is privileged or has System-level audit permissions + if (user.isPrivileged() || user.getUser().getEffectivePermissions().getSystemPermissions().hasPermission(SystemPermission.Type.AUDIT)) + searchResults = userRecordMapper.search(username, recordIdentifier, + requiredContents, sortPredicates, limit, + getCaseSensitivity()); + + // Otherwise only return explicitly readable history records + else + searchResults = userRecordMapper.searchReadable(username, + user.getUser().getModel(), recordIdentifier, + requiredContents, sortPredicates, limit, + user.getEffectiveUserGroups(), + getCaseSensitivity()); + + return getObjectInstances(searchResults); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/package-info.java new file mode 100644 index 0000000..309721d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to Guacamole users. + */ +package org.apache.guacamole.auth.jdbc.user; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/ModeledUserGroup.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/ModeledUserGroup.java new file mode 100644 index 0000000..cf2c1db --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/ModeledUserGroup.java @@ -0,0 +1,208 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.ModeledPermissions; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.RelatedObjectSet; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * An implementation of the UserGroup object which is backed by a database model. + */ +public class ModeledUserGroup extends ModeledPermissions + implements UserGroup { + + /** + * All possible attributes of user groups organized as individual, + * logical forms. + */ + public static final Collection ATTRIBUTES = Collections.emptyList(); + + /** + * The names of all attributes which are explicitly supported by this + * extension's UserGroup objects. + */ + public static final Set ATTRIBUTE_NAMES = Collections.emptySet(); + + /** + * Provider for RelatedObjectSets containing the user groups of which this + * user group is a member. + */ + @Inject + private Provider parentUserGroupSetProvider; + + /** + * Provider for RelatedObjectSets containing the users that are members of + * this user group. + */ + @Inject + private Provider memberUserSetProvider; + + /** + * Provider for RelatedObjectSets containing the user groups that are + * members of this user group. + */ + @Inject + private Provider memberUserGroupSetProvider; + + /** + * Whether attributes which control access restrictions should be exposed + * via getAttributes() or allowed to be set via setAttributes(). + */ + private boolean exposeRestrictedAttributes = false; + + /** + * Whether group names should be considered case-sensitive. + */ + private boolean caseSensitive = true; + + /** + * Initializes this ModeledUserGroup, associating it with the current + * authenticated user and populating it with data from the given user group + * model. + * + * @param currentUser + * The user that created or retrieved this object. + * + * @param model + * The backing model object. + * + * @param exposeRestrictedAttributes + * Whether attributes which control access restrictions should be + * exposed via getAttributes() or allowed to be set via + * setAttributes(). + * + * @param caseSensitive + * true if group names should be considered case-sensitive, false + * otherwise. + */ + public void init(ModeledAuthenticatedUser currentUser, UserGroupModel model, + boolean exposeRestrictedAttributes, boolean caseSensitive) { + super.init(currentUser, model); + this.exposeRestrictedAttributes = exposeRestrictedAttributes; + this.caseSensitive = caseSensitive; + } + + @Override + public String getIdentifier() { + return CaseSensitivity.canonicalize(super.getIdentifier(), caseSensitive); + } + + @Override + public void setIdentifier(String identifier) { + super.setIdentifier(CaseSensitivity.canonicalize(identifier, caseSensitive)); + } + + @Override + public boolean isDisabled() { + return getModel().isDisabled(); + } + + @Override + public void setDisabled(boolean disabled) { + getModel().setDisabled(disabled); + } + + /** + * Stores all restricted (privileged) attributes within the given Map, + * pulling the values of those attributes from the underlying user group + * model. If no value is yet defined for an attribute, that attribute will + * be set to null. + * + * @param attributes + * The Map to store all restricted attributes within. + */ + private void putRestrictedAttributes(Map attributes) { + + } + + /** + * Stores all restricted (privileged) attributes within the underlying user + * group model, pulling the values of those attributes from the given Map. + * + * @param attributes + * The Map to pull all restricted attributes from. + */ + private void setRestrictedAttributes(Map attributes) { + + } + + @Override + public Set getSupportedAttributeNames() { + return ATTRIBUTE_NAMES; + } + + @Override + public Map getAttributes() { + + // Include any defined arbitrary attributes + Map attributes = super.getAttributes(); + + // Include restricted attributes only if they should be exposed + if (exposeRestrictedAttributes) + putRestrictedAttributes(attributes); + + return attributes; + } + + @Override + public void setAttributes(Map attributes) { + + // Set arbitrary attributes + super.setAttributes(attributes); + + // Assign restricted attributes only if they are exposed + if (exposeRestrictedAttributes) + setRestrictedAttributes(attributes); + + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + UserGroupParentUserGroupSet parentUserGroupSet = parentUserGroupSetProvider.get(); + parentUserGroupSet.init(getCurrentUser(), this); + return parentUserGroupSet; + } + + @Override + public RelatedObjectSet getMemberUsers() throws GuacamoleException { + UserGroupMemberUserSet memberUserSet = memberUserSetProvider.get(); + memberUserSet.init(getCurrentUser(), this); + return memberUserSet; + } + + @Override + public RelatedObjectSet getMemberUserGroups() throws GuacamoleException { + UserGroupMemberUserGroupSet memberUserGroupSet = memberUserGroupSetProvider.get(); + memberUserGroupSet.init(getCurrentUser(), this); + return memberUserGroupSet; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupDirectory.java new file mode 100644 index 0000000..c6bb895 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupDirectory.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.base.JDBCDirectory; +import org.apache.guacamole.net.auth.UserGroup; +import org.mybatis.guice.transactional.Transactional; + +/** + * Implementation of the UserGroup Directory which is driven by an underlying, + * arbitrary database. + */ +public class UserGroupDirectory extends JDBCDirectory { + + /** + * Service for managing user group objects. + */ + @Inject + private UserGroupService userGroupService; + + @Override + public UserGroup get(String identifier) throws GuacamoleException { + return userGroupService.retrieveObject(getCurrentUser(), identifier); + } + + @Override + @Transactional + public Collection getAll(Collection identifiers) throws GuacamoleException { + Collection objects = userGroupService.retrieveObjects(getCurrentUser(), identifiers); + return Collections.unmodifiableCollection(objects); + } + + @Override + @Transactional + public Set getIdentifiers() throws GuacamoleException { + return userGroupService.getIdentifiers(getCurrentUser()); + } + + @Override + @Transactional + public void add(UserGroup object) throws GuacamoleException { + userGroupService.createObject(getCurrentUser(), object); + } + + @Override + @Transactional + public void update(UserGroup object) throws GuacamoleException { + ModeledUserGroup group = (ModeledUserGroup) object; + userGroupService.updateObject(getCurrentUser(), group); + } + + @Override + @Transactional + public void remove(String identifier) throws GuacamoleException { + userGroupService.deleteObject(getCurrentUser(), identifier); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.java new file mode 100644 index 0000000..268bfcb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for user group objects. + */ +public interface UserGroupMapper extends ModeledDirectoryObjectMapper { + + /** + * Returns the group having the given name, if any. If no such group + * exists, null is returned. + * + * @param name + * The name of the group to return. + * + * @param caseSensitivity + * The object that contains current configuration for case sensitivity + * for usernames and group names. + * + * @return + * The group having the given name, or null if no such group exists. + */ + UserGroupModel selectOne(@Param("name") String name, + @Param("caseSensitivity") CaseSensitivity caseSensitivity); + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.java new file mode 100644 index 0000000..70baef7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; + +/** + * Mapper for the one-to-many relationship between a user group and its user + * group members. + */ +public interface UserGroupMemberUserGroupMapper extends ObjectRelationMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupSet.java new file mode 100644 index 0000000..299e323 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupSet.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import com.google.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; +import org.apache.guacamole.auth.jdbc.base.RelatedObjectSet; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * RelatedObjectSet implementation which represents the one-to-many + * relationship between a particular user group and its user group members. + */ +public class UserGroupMemberUserGroupSet extends RelatedObjectSet { + + /** + * Mapper for the relation between user groups and their user group members. + */ + @Inject + private UserGroupMemberUserGroupMapper userGroupMemberUserGroupMapper; + + /** + * The server environment for retrieving configuration. + */ + @Inject + private JDBCEnvironment environment; + + @Override + protected CaseSensitivity getCaseSensitivity() throws GuacamoleException { + return environment.getCaseSensitivity(); + } + + @Override + protected ObjectRelationMapper getObjectRelationMapper() { + return userGroupMemberUserGroupMapper; + } + + @Override + protected ObjectPermissionSet + getParentObjectEffectivePermissionSet() throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserGroupPermissions(); + } + + @Override + protected ObjectPermissionSet getChildObjectEffectivePermissionSet() + throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserGroupPermissions(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.java new file mode 100644 index 0000000..393a5be --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import java.util.Collection; +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper for the one-to-many relationship between a user group and its user + * members. + */ +public interface UserGroupMemberUserMapper extends ObjectRelationMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserSet.java new file mode 100644 index 0000000..3aa8079 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserSet.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import com.google.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; +import org.apache.guacamole.auth.jdbc.base.RelatedObjectSet; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * RelatedObjectSet implementation which represents the one-to-many + * relationship between a particular user group and its user members. + */ +public class UserGroupMemberUserSet extends RelatedObjectSet { + + /** + * The environment of the running server, used for retrieving server + * configuration information. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Mapper for the relation between user groups and their user members. + */ + @Inject + private UserGroupMemberUserMapper userGroupMemberUserMapper; + + @Override + protected CaseSensitivity getCaseSensitivity() throws GuacamoleException { + return environment.getCaseSensitivity(); + } + + @Override + protected ObjectRelationMapper getObjectRelationMapper() { + return userGroupMemberUserMapper; + } + + @Override + protected ObjectPermissionSet + getParentObjectEffectivePermissionSet() throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserGroupPermissions(); + } + + @Override + protected ObjectPermissionSet getChildObjectEffectivePermissionSet() + throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserPermissions(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupModel.java new file mode 100644 index 0000000..7fb9c8c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupModel.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import org.apache.guacamole.auth.jdbc.base.EntityModel; +import org.apache.guacamole.auth.jdbc.base.EntityType; + +/** + * Object representation of a Guacamole user group, as represented in the + * database. + */ +public class UserGroupModel extends EntityModel { + + /** + * Whether the user group is disabled. Disabled accounts exist and can + * be modified, but cannot be used. + */ + private boolean disabled; + + /** + * Creates a new, empty user group. + */ + public UserGroupModel() { + super(EntityType.USER_GROUP); + } + + /** + * Returns whether this user group has been disabled. Memberships of + * disabled user groups are treated as non-existent, effectively disabling + * membership in that group. + * + * @return + * true if this user group is disabled, false otherwise. + */ + public boolean isDisabled() { + return disabled; + } + + /** + * Sets whether this user group has been disabled. Memberships of disabled + * user groups are treated as non-existent, effectively disabling + * membership in that group. + * + * @param disabled + * true if this user group should be disabled, false otherwise. + */ + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.java new file mode 100644 index 0000000..37433cc --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; + +/** + * Mapper for the one-to-many relationship between a user group and its + * containing user groups. + */ +public interface UserGroupParentUserGroupMapper extends ObjectRelationMapper {} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupSet.java new file mode 100644 index 0000000..4ddd3b9 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupSet.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import com.google.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ObjectRelationMapper; +import org.apache.guacamole.auth.jdbc.base.RelatedObjectSet; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * RelatedObjectSet implementation which represents the one-to-many + * relationship between a particular user group and its containing user groups. + */ +public class UserGroupParentUserGroupSet extends RelatedObjectSet { + + /** + * Mapper for the relation between user groups and their containing user + * groups. + */ + @Inject + private UserGroupParentUserGroupMapper userGroupParentUserGroupMapper; + + /** + * The server environment for retrieving configuration. + */ + @Inject + private JDBCEnvironment environment; + + @Override + protected CaseSensitivity getCaseSensitivity() throws GuacamoleException { + return environment.getCaseSensitivity(); + } + + @Override + protected ObjectRelationMapper getObjectRelationMapper() { + return userGroupParentUserGroupMapper; + } + + @Override + protected ObjectPermissionSet + getParentObjectEffectivePermissionSet() throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserGroupPermissions(); + } + + @Override + protected ObjectPermissionSet getChildObjectEffectivePermissionSet() + throws GuacamoleException { + return getCurrentUser().getUser().getEffectivePermissions().getUserGroupPermissions(); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupService.java new file mode 100644 index 0000000..6e4b443 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/usergroup/UserGroupService.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.jdbc.usergroup; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; +import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectService; +import org.apache.guacamole.auth.jdbc.base.EntityMapper; +import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper; +import org.apache.guacamole.auth.jdbc.permission.UserGroupPermissionMapper; +import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * Service which provides convenience methods for creating, retrieving, and + * manipulating user groups. + */ +public class UserGroupService extends ModeledDirectoryObjectService { + + /** + * Mapper for creating/deleting entities. + */ + @Inject + private EntityMapper entityMapper; + + /** + * The Guacamole server configuration environment. + */ + @Inject + private JDBCEnvironment environment; + + /** + * Mapper for accessing user groups. + */ + @Inject + private UserGroupMapper userGroupMapper; + + /** + * Mapper for manipulating user group permissions. + */ + @Inject + private UserGroupPermissionMapper userGroupPermissionMapper; + + /** + * Provider for creating user groups. + */ + @Inject + private Provider userGroupProvider; + + @Override + protected ModeledDirectoryObjectMapper getObjectMapper() { + return userGroupMapper; + } + + @Override + protected ObjectPermissionMapper getPermissionMapper() { + return userGroupPermissionMapper; + } + + @Override + protected ModeledUserGroup getObjectInstance(ModeledAuthenticatedUser currentUser, + UserGroupModel model) throws GuacamoleException { + + boolean exposeRestrictedAttributes; + + // Expose restricted attributes if the user group does not yet exist + if (model.getObjectID() == null) + exposeRestrictedAttributes = true; + + // Otherwise, expose restricted attributes only if the user has + // ADMINISTER permission + else + exposeRestrictedAttributes = hasObjectPermission(currentUser, + model.getIdentifier(), ObjectPermission.Type.ADMINISTER); + + // Produce ModeledUserGroup exposing only those attributes for which the + // current user has permission + ModeledUserGroup group = userGroupProvider.get(); + group.init(currentUser, model, exposeRestrictedAttributes, + environment.getCaseSensitivity().caseSensitiveGroupNames()); + return group; + + } + + @Override + protected UserGroupModel getModelInstance(ModeledAuthenticatedUser currentUser, + final UserGroup object) throws GuacamoleException { + + // Create new ModeledUserGroup backed by blank model + UserGroupModel model = new UserGroupModel(); + ModeledUserGroup group = getObjectInstance(currentUser, model); + + // Set model contents through ModeledUser, copying the provided group + group.setIdentifier(object.getIdentifier()); + group.setAttributes(object.getAttributes()); + + return model; + + } + + @Override + protected boolean hasCreatePermission(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return whether user has explicit user group creation permission + SystemPermissionSet permissionSet = user.getUser().getEffectivePermissions().getSystemPermissions(); + return permissionSet.hasPermission(SystemPermission.Type.CREATE_USER_GROUP); + + } + + @Override + protected ObjectPermissionSet getEffectivePermissionSet(ModeledAuthenticatedUser user) + throws GuacamoleException { + + // Return permissions related to user groups + return user.getUser().getEffectivePermissions().getUserGroupPermissions(); + + } + + @Override + protected void beforeCreate(ModeledAuthenticatedUser user, UserGroup object, + UserGroupModel model) throws GuacamoleException { + + super.beforeCreate(user, object, model); + + // Group name must not be blank + if (model.getIdentifier() == null || model.getIdentifier().trim().isEmpty()) + throw new GuacamoleClientException("The group name must not be blank."); + + // Do not create duplicate user groups + UserGroupModel existing = userGroupMapper.selectOne(model.getIdentifier(), + environment.getCaseSensitivity()); + if (existing != null) + throw new GuacamoleClientException("Group \"" + model.getIdentifier() + "\" already exists."); + + // Create base entity object, implicitly populating underlying entity ID + entityMapper.insert(model); + + } + + @Override + protected void beforeUpdate(ModeledAuthenticatedUser user, + ModeledUserGroup object, UserGroupModel model) throws GuacamoleException { + + super.beforeUpdate(user, object, model); + + // Group names must not be blank + if (model.getIdentifier() == null || model.getIdentifier().trim().isEmpty()) + throw new GuacamoleClientException("The group name must not be blank."); + + // Do not allow groups to be renamed if the name collides with that of + // another, existing group + UserGroupModel existing = userGroupMapper.selectOne(model.getIdentifier(), + environment.getCaseSensitivity()); + if (existing != null && !existing.getObjectID().equals(model.getObjectID())) + throw new GuacamoleClientException("Group \"" + model.getIdentifier() + "\" already exists."); + + } + + @Override + protected boolean isValidIdentifier(String identifier) { + + // All strings are valid group identifiers + return true; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/html/shared-connection.html b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/html/shared-connection.html new file mode 100644 index 0000000..38db821 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/html/shared-connection.html @@ -0,0 +1,6 @@ + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/styles/jdbc.css b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/styles/jdbc.css new file mode 100644 index 0000000..23aa356 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/styles/jdbc.css @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* Label/tag denoting the user that shared a connection */ +.jdbc-share-tag { + + background: #0095ff; + padding: 0.25em; + + -moz-border-radius: 0.25em; + -webkit-border-radius: 0.25em; + -khtml-border-radius: 0.25em; + border-radius: 0.25em; + + color: white; + font-size: 0.75em; + font-weight: bold; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ca.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ca.json new file mode 100644 index 0000000..c908548 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ca.json @@ -0,0 +1,110 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "La nova contrasenya ha de ser diferent de la contrasenya caducada.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Aquest compte d'usuari actualment no és vàlid.", + "ERROR_NOT_ACCESSIBLE" : "L'accés a aquest compte actualment no està permès. Torneu-ho a provar més endavant.", + + "INFO_PASSWORD_EXPIRED" : "La vostra contrasenya ha caducat i s'ha de restablir. Introduïu una nova contrasenya per continuar.", + + "FIELD_HEADER_NEW_PASSWORD" : "Nova contrasenya", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Confirmar nova contrasenya" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Nombre màxim de connexions:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Nombre màxim de connexions per usuari:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Ús només per fer-ho desactivar:", + "FIELD_HEADER_WEIGHT" : "Pes de la connexió:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Xifrat:", + "FIELD_HEADER_GUACD_PORT" : "Port:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Cap (sense xifrar)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Límits de concurrència", + "SECTION_HEADER_LOAD_BALANCING" : "Equilibri de càrrega", + "SECTION_HEADER_GUACD" : "Paràmetres del proxy de Guacamole (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Activa l’afinitat de la sessió:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Nombre màxim de connexions:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Nombre màxim de connexions per usuari:", + + "SECTION_HEADER_CONCURRENCY" : "Límits de concurrència (grups d'equilibri)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Connexions compartides (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Connexions compartides (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Connexions compartides (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Compartit per {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Les contrasenyes poden no contenir el nom d'usuari.", + "ERROR_REQUIRES_DIGIT" : "Les contrasenyes han de contenir almenys un dígit.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Les contrasenyes han de contenir majúscules i minúscules.", + "ERROR_REQUIRES_NON_ALNUM" : "Les contrasenyes han de contenir almenys un símbol.", + "ERROR_REUSED" : "Aquesta contrasenya ja s'ha utilitzat. No reutilitzeu cap de l'anterior {HISTORY_SIZE} {HISTORY_SIZE, plural, one{password} other{passwords}}.", + "ERROR_TOO_SHORT" : "Les contrasenyes han de ser com a mínim {LENGTH} {LENGTH, plural, one{character} other{characters}} de llarg.", + "ERROR_TOO_YOUNG" : "La contrasenya d’aquest compte ja s’ha restablert. Espereu com a mínim {WAIT} more {WAIT, plural, one{day} other{days}} abans de canviar la contrasenya de nou." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Contrasenya caducada:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "No permetre l'accés després:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Permet l'accés després:", + "FIELD_HEADER_TIMEZONE" : "Zona horària de l'usuari:", + "FIELD_HEADER_VALID_FROM" : "Activa el compte després de", + "FIELD_HEADER_VALID_UNTIL" : "Desactiva el compte després de", + + "SECTION_HEADER_RESTRICTIONS" : "Restriccions del compte", + "SECTION_HEADER_PROFILE" : "Perfil" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Restriccions de grup" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/de.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/de.json new file mode 100644 index 0000000..20ffe09 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/de.json @@ -0,0 +1,109 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "Das neue Passwort muss sich vom abgelaufenen Passwort unterscheiden.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Dieser Account ist gegenwärtig nicht gültig", + "ERROR_NOT_ACCESSIBLE" : "Zugriff zu diesem Account ist gegenwärtig nicht erlaubt. Bitte versuchen Sie es später erneut.", + + "INFO_PASSWORD_EXPIRED" : "Ihr Passwort ist abgelaufen und muss erneuert werden. Bitte geben Sie ein neues Passwort ein um fortzufahren.", + + "FIELD_HEADER_NEW_PASSWORD" : "Neues Passwort", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Neues Passwort bestätigen" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Maximale Anzahl Verbindungen:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Maximale Anzahl Verbindungen pro Benutzer:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Nur Failover:", + "FIELD_HEADER_WEIGHT" : "Verbindungspriorität:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Hostname:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Verschlüsselung:", + "FIELD_HEADER_GUACD_PORT" : "Port:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Keine (unverschlüsselt)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Verbindungslimite", + "SECTION_HEADER_LOAD_BALANCING" : "Lastverteilung", + "SECTION_HEADER_GUACD" : "Guacamole Proxy Parameter (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Sessionzugehörigkeit aktivieren", + "FIELD_HEADER_MAX_CONNECTIONS" : "Maximale Anzahl Verbindungen:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Maximale Anzahl Verbindungen pro Benutzer:", + "SECTION_HEADER_CONCURRENCY" : "Verbindungslimit (Verteilungsgruppe)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Geteilte Verbindungen (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Geteilte Verbindungen (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Geteilte Verbindungen (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Geteilt mit {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Passwörter dürfen Ihren Benutzername nicht enthalten.", + "ERROR_REQUIRES_DIGIT" : "Passwörter müssen mindestens eine Ziffer enthalten.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Passwörter müssen Gross- und Kleinschreibung beinhalten.", + "ERROR_REQUIRES_NON_ALNUM" : "Passwörter müssen mindestens ein Sonderzeichen enthalten.", + "ERROR_REUSED" : "Dieses Passwort wurde früher bereits verwendet. Sie dürfen die letzen {HISTORY_SIZE} Passwörter nicht verwenden.", + "ERROR_TOO_SHORT" : "Passwörter müssen mindestens {LENGTH} Zeichen lang sein.", + "ERROR_TOO_YOUNG" : "Das Passwort für diesen Account wurde erst vor kurzem erneuert. Bitte warten Sie mindestens {WAIT} {WAIT, plural, one{Tag} other{Tage}} bevor Sie das Passwort erneut ändern." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Passwort abgelaufen:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Zugriff nach dieser Uhrzeit nicht mehr erlauben:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Zugriff erst nach dieser Uhrzeit erlauben:", + "FIELD_HEADER_TIMEZONE" : "Zeitzone:", + "FIELD_HEADER_VALID_FROM" : "Zugriff nach diesem Datum erlauben:", + "FIELD_HEADER_VALID_UNTIL" : "Account nach diesem Datum deaktivieren:", + + "SECTION_HEADER_RESTRICTIONS" : "Accounteinschränkungen", + "SECTION_HEADER_PROFILE" : "Profil" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Gruppeneinschränkung" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/en.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/en.json new file mode 100644 index 0000000..cc9f680 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/en.json @@ -0,0 +1,114 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "The new password must be different from the expired password.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "This user account is not currently valid.", + "ERROR_NOT_ACCESSIBLE" : "Access to this account is not currently allowed. Please try again later.", + + "INFO_PASSWORD_EXPIRED" : "Your password has expired and must be reset. Please enter a new password to continue.", + + "FIELD_HEADER_NEW_PASSWORD" : "New password", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Confirm new password" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Maximum number of connections:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Maximum number of connections per user:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Use for failover only:", + "FIELD_HEADER_WEIGHT" : "Connection weight:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Hostname:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Encryption:", + "FIELD_HEADER_GUACD_PORT" : "Port:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "None (unencrypted)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Concurrency Limits", + "SECTION_HEADER_LOAD_BALANCING" : "Load Balancing", + "SECTION_HEADER_GUACD" : "Guacamole Proxy Parameters (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Enable session affinity:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Maximum number of connections:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Maximum number of connections per user:", + + "SECTION_HEADER_CONCURRENCY" : "Concurrency Limits (Balancing Groups)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Shared Connections (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Shared Connections (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Shared Connections (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Shared by {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Passwords may not contain the username.", + "ERROR_REQUIRES_DIGIT" : "Passwords must contain at least one digit.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Passwords must contain both uppercase and lowercase characters.", + "ERROR_REQUIRES_NON_ALNUM" : "Passwords must contain at least one symbol.", + "ERROR_REUSED" : "This password has already been used. Please do not reuse any of the previous {HISTORY_SIZE} {HISTORY_SIZE, plural, one{password} other{passwords}}.", + "ERROR_TOO_SHORT" : "Passwords must be at least {LENGTH} {LENGTH, plural, one{character} other{characters}} long.", + "ERROR_TOO_YOUNG" : "The password for this account has already been reset. Please wait at least {WAIT} more {WAIT, plural, one{day} other{days}} before changing the password again." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Password expired:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Do not allow access after:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Allow access after:", + "FIELD_HEADER_TIMEZONE" : "User time zone:", + "FIELD_HEADER_VALID_FROM" : "Enable account after:", + "FIELD_HEADER_VALID_UNTIL" : "Disable account after:", + + "SECTION_HEADER_RESTRICTIONS" : "Account Restrictions", + "SECTION_HEADER_PROFILE" : "Profile" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Group Restrictions" + + }, + + "CONNECTION_PARAMETERS": { + "DATABASE_PARAMETER_VALUE_TOO_LONG": "The value provided for connection parameter {PARAMETER_NAME} exceeds the maximum allowed length of {MAX_SIZE} {MAX_SIZE, plural, one{character} other{characters}}." + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/es.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/es.json new file mode 100644 index 0000000..e3b1ef9 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/es.json @@ -0,0 +1,110 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "La nueva contraseña debe ser diferente a la que ha expirado.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Esta cuenta de usuario no es válida actualmente.", + "ERROR_NOT_ACCESSIBLE" : "Actualmente no se permite el acceso a esta cuenta. Por favor, inténtelo de nuevo mas tarde.", + + "INFO_PASSWORD_EXPIRED" : "Su contraseña ha expirado y debe renovarla. Por favor, introduzca una nueva contraseña para continuar.", + + "FIELD_HEADER_NEW_PASSWORD" : "Nueva contraseña", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Confirmar nuena contraseña" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Número máximo de conexiones:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Número máximo de conexiones por usuario:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Usar solo para failover:", + "FIELD_HEADER_WEIGHT" : "Peso de la conexión:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Nombre del Host:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Cifrado:", + "FIELD_HEADER_GUACD_PORT" : "Puerto:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Ninguno (sin cifrado)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Límites de concurrencia", + "SECTION_HEADER_LOAD_BALANCING" : "Balanceo de carga", + "SECTION_HEADER_GUACD" : "Parámetros del proxy de Guacamole (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Activar afinidad de sesión:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Número máximo de conexiones:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Número máximo de conexiones por usuario:", + + "SECTION_HEADER_CONCURRENCY" : "Límites de concurrencia (grupos de balanceo)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Conexiones compartidas (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Conexiones compartidas (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Conexiones compartidas (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Compartidas por {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Las contraseñas no pueden contener el nombre de usuario.", + "ERROR_REQUIRES_DIGIT" : "Las contraseñas deben contener al menos un número.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Las contraseñas deben contener caractéres en mayúscula y minúscula.", + "ERROR_REQUIRES_NON_ALNUM" : "Las contraseñas deben contener al menos un símbolo.", + "ERROR_REUSED" : "Esta contraseña ya se ha utilizado. Por favor, no vuelva a usar {HISTORY_SIZE, plural, one{la última contraseña} other{ninguna de las últimas {HISTORY_SIZE} contraseñas}}.", + "ERROR_TOO_SHORT" : "Las contraseñas deben ser como mínimo de {LENGTH} {LENGTH, plural, one{caracter} other{caracteres}} de largo.", + "ERROR_TOO_YOUNG" : "La contraseña de esta cuenta ya se ha cambiado. Espere como mínimo {WAIT} {WAIT, plural, one{dia} other{dias}} mas, antes de volver a cambiarla." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Contraseña expirada:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "No permitir acceso despues de:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Permitir acceso despues de:", + "FIELD_HEADER_TIMEZONE" : "Zona horaria del usuario:", + "FIELD_HEADER_VALID_FROM" : "Activar la cuenta despues de", + "FIELD_HEADER_VALID_UNTIL" : "Desactivar la cuenta despues de", + + "SECTION_HEADER_RESTRICTIONS" : "Restricciones de la cuenta", + "SECTION_HEADER_PROFILE" : "Perfil" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Restricciones de grupo" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/fr.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/fr.json new file mode 100644 index 0000000..ebdcf6f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/fr.json @@ -0,0 +1,114 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "le nouveau mot de passe doit être différent du mot de passe expiré.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Ce compte utilisateur n'est pas valide pour le moment.", + "ERROR_NOT_ACCESSIBLE" : "L'accès à ce compte n'est pas autorisé pour le moment. Veuillez réessayer plus tard.", + + "INFO_PASSWORD_EXPIRED" : "Votre mot de passe a expiré et doit être changé. Veuillez entrer un nouveau mot de passe pour continuer.", + + "FIELD_HEADER_NEW_PASSWORD" : "Nouveau mot de passe", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Confirmez le nouveau mot de passe" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Nombre maximum de connexions:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Nombre maximum de connexions par utilisateur:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Utilisé seulement en cas de bascule:", + "FIELD_HEADER_WEIGHT" : "Poids de la connexion:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Chiffrement:", + "FIELD_HEADER_GUACD_PORT" : "Port:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Aucun (non-chiffré)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Limites de concurrence", + "SECTION_HEADER_LOAD_BALANCING" : "Equilibrage de charge", + "SECTION_HEADER_GUACD" : "Paramètres du proxy Guacamole (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Activer l'affinité de session:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Nombre maximum de connexions:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Nombre maximum de connexions par utilisateur:", + + "SECTION_HEADER_CONCURRENCY" : "Limites de concurrence (Groupes de répartition)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Connexions partagées (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Connexions partagées (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Connexions partagées (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Partagé par {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Les mots de passe ne doivent pas contenir le nom d'utilisateur.", + "ERROR_REQUIRES_DIGIT" : "Les mots de passe doivent contenir au moins un chiffre.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Les mots de passe doivent contenir des caractères minuscules et majuscules.", + "ERROR_REQUIRES_NON_ALNUM" : "Les mots de passe doivent contenir au moins un symbole.", + "ERROR_REUSED" : "Ce mot de passe a déjà été utilisé. Veuillez ne pas réutiliser {HISTORY_SIZE} {HISTORY_SIZE, plural, one{le dernier mot de passe} other{un des derniers mots de passe}}.", + "ERROR_TOO_SHORT" : "Les mots de passe doivent être composé d'au moins {LENGTH} {LENGTH, plural, one{caractère} other{caractères}}.", + "ERROR_TOO_YOUNG" : "Le mot de passe pour ce compte a déjà été réinitialisé. Veuillez patienter au moins {WAIT} {WAIT, plural, one{jour} other{jours}} avant de changer à nouveau le mot de passe." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Mot de passe expiré:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Ne pas autoriser l'accès après:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Autoriser l'accès après:", + "FIELD_HEADER_TIMEZONE" : "Fuseau horaire utilisateur:", + "FIELD_HEADER_VALID_FROM" : "Activer le compte après:", + "FIELD_HEADER_VALID_UNTIL" : "Désactiver le compte après:", + + "SECTION_HEADER_RESTRICTIONS" : "Restrictions de compte", + "SECTION_HEADER_PROFILE" : "Profil" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Restrictions de groupe" + + }, + + "CONNECTION_PARAMETERS": { + "DATABASE_PARAMETER_VALUE_TOO_LONG": "La valeur fournie pour le paramètre de connexion {PARAMETER_NAME} dépasse la longueur maximale autorisée de {MAX_SIZE} {MAX_SIZE, plural, one{caractère} other{caractères}}." + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/it.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/it.json new file mode 100644 index 0000000..092e9cf --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/it.json @@ -0,0 +1,112 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_SAME" : "La nuova password deve essere diversa dalla password scaduta.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Questo account utente non è attualmente valido.", + "ERROR_NOT_ACCESSIBLE" : "L'accesso a questo account non è attualmente consentito. Per favore riprova più tardi.", + + "INFO_PASSWORD_EXPIRED" : "La tua password è scaduta e deve essere reimpostata. Inserisci una nuova password per continuare.", + + "FIELD_HEADER_NEW_PASSWORD" : "Nuova password", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Conferma la nuova password" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Numero massimo di connessioni:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Numero massimo di connessioni per utente:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Utilizzare solo per il failover:", + "FIELD_HEADER_WEIGHT" : "Peso della connessione:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Nome host:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Crittografia:", + "FIELD_HEADER_GUACD_PORT" : "Porta:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Nessuno (non crittografato)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Limiti di concorrenza", + "SECTION_HEADER_LOAD_BALANCING" : "Load Balancing", + "SECTION_HEADER_GUACD" : "Guacamole Proxy Parameters (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Abilita affinità di sessione:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Numero massimo di connessioni:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Numero massimo di connessioni per utente:", + + "SECTION_HEADER_CONCURRENCY" : "Limiti di concorrenza (gruppi di bilanciamento)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Connessioni condivise (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Connessioni condivise (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Connessioni condivise (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Condiviso da {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Le password non devono contenere il nome utente", + "ERROR_REQUIRES_DIGIT" : "Le password devono contenere almeno una cifra.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Le password devono contenere sia caratteri maiuscoli che minuscoli.", + "ERROR_REQUIRES_NON_ALNUM" : "Le password devono contenere almeno un simbolo.", + "ERROR_REUSED" : "Questa password è già stata utilizzata. Si prega di non riutilizzare nessuna delle precedenti {HISTORY_SIZE} {HISTORY_SIZE, plural, one{password} other{passwords}}.", + "ERROR_TOO_SHORT" : "Le password devono essere almeno {LENGTH} {LENGTH, plural, one{carattere} other{caratteri}} di lunghezza.", + "ERROR_TOO_YOUNG" : "La password per questo account è già stata reimpostata. Per favore aspetta almeno {WAIT} altri {WAIT, plural, one{giorno} other{giorni}} prima di modificare nuovamente la password." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_DISABLED" : "Accesso disabilitato:", + "FIELD_HEADER_EXPIRED" : "Password scaduta:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Non consentire l'accesso dopo:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Consenti l'accesso dopo:", + "FIELD_HEADER_TIMEZONE" : "Fuso orario utente:", + "FIELD_HEADER_VALID_FROM" : "Abilita account dopo:", + "FIELD_HEADER_VALID_UNTIL" : "Disattiva account dopo:", + + "SECTION_HEADER_RESTRICTIONS" : "Restrizioni dell'account", + "SECTION_HEADER_PROFILE" : "Profilo" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_DISABLED" : "Disabilitato:", + + "SECTION_HEADER_RESTRICTIONS" : "Restrizioni di gruppo" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ja.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ja.json new file mode 100644 index 0000000..18aaf59 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ja.json @@ -0,0 +1,97 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "新しいパスワードには、無効になったパスワードとは別の文字を使用してください。", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "このユーザアカウントは、現在有効ではありません。", + "ERROR_NOT_ACCESSIBLE" : "このユーザのアクセスは現在許可されていません。 しばらくしてから再度アクセスをしてください。", + + "INFO_PASSWORD_EXPIRED" : "あなたのパスワードは無効なため、リセットが必要です。 新しいパスワードを入力してください。", + + "FIELD_HEADER_NEW_PASSWORD" : "新しいパスワード", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "新しいパスワード(確認)" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "最大接続数:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "ユーザ毎の最大接続数:", + + "FIELD_HEADER_FAILOVER_ONLY" : "フェイルオーバ機能のみを使用:", + "FIELD_HEADER_WEIGHT" : "コネクションウェイト:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "暗号化:", + "FIELD_HEADER_GUACD_PORT" : "ポート:", + + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "なし (暗号化なし)", + + "SECTION_HEADER_CONCURRENCY" : "同時接続制限", + "SECTION_HEADER_LOAD_BALANCING" : "ロードバラシング", + "SECTION_HEADER_GUACD" : "Guacamoleプロキシパラメータ (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "セッションアフィニティの有効化:", + "FIELD_HEADER_MAX_CONNECTIONS" : "最大接続数:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "ユーザ毎の最大接続数:", + + "SECTION_HEADER_CONCURRENCY" : "同時接続制限(バランシンググループ)" + + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "共有接続 (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "共有接続 (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "共有接続 (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "{USERNAME}によって共有されています" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "ユーザ名にパスワードを含んでいます。", + "ERROR_REQUIRES_DIGIT" : "パスワードには数字を含めてください。", + "ERROR_REQUIRES_MULTIPLE_CASE" : "パスワードにはアルファベットの大文字・小文字を含めてください。", + "ERROR_REQUIRES_NON_ALNUM" : "パスワードには記号を含めてください。", + "ERROR_REUSED" : "このパスワードはすでに使用されています。過去に使用したことのある {HISTORY_SIZE}回前までのパスワードは再利用しないでください。", + "ERROR_TOO_SHORT" : "パスワードは {LENGTH} 文字以上の長さで設定してください。", + "ERROR_TOO_YOUNG" : "このアカウントのパスワードは最近更新されました。 パスワードの再設定は {WAIT} 日以上経ってから行ってください。" + + }, + + "USER_ATTRIBUTES" : { + + + "FIELD_HEADER_EXPIRED" : "パスワード変更の強制:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "指定した時刻からアクセスを禁止する:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "指定した時刻からアクセスを許可する:", + "FIELD_HEADER_TIMEZONE" : "ユーザのタイムゾーン:", + "FIELD_HEADER_VALID_FROM" : "指定した日からアカウントを有効化する:", + "FIELD_HEADER_VALID_UNTIL" : "指定した日からアカウントを無効化する:", + + "SECTION_HEADER_RESTRICTIONS" : "アカウント制限", + "SECTION_HEADER_PROFILE" : "プロフィール" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "グループ制限" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ko.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ko.json new file mode 100644 index 0000000..bfc124a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ko.json @@ -0,0 +1,109 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "새로운 비밀번호는 만료된 비밀번호와 달라야 합니다.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "이 사용자 계정은 현재 유효하지 않습니다.", + "ERROR_NOT_ACCESSIBLE" : "현재 이 계정에 대한 액세스가 허용되지 않습니다. 나중에 다시 시도하십시오.", + + "INFO_PASSWORD_EXPIRED" : "비밀번호가 만료되었으며 재설정해야 합니다. 계속하려면 새 비밀번호를 입력하십시오.", + + "FIELD_HEADER_NEW_PASSWORD" : "새 비밀번호", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "새 비밀번호 확인" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "최대 연결 수:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "사용자당 최대 연결 수:", + + "FIELD_HEADER_FAILOVER_ONLY" : "장애 조치에만 사용:", + "FIELD_HEADER_WEIGHT" : "연결 가중치:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "암호화:", + "FIELD_HEADER_GUACD_PORT" : "포트:", + + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "없음 (암호화되지 않음)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "동시성 제한", + "SECTION_HEADER_LOAD_BALANCING" : "부하 분산", + "SECTION_HEADER_GUACD" : "Guacamole 프록시 매개 변수 (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "세션 선호도 사용:", + "FIELD_HEADER_MAX_CONNECTIONS" : "최대 연결 수:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "사용자당 최대 연결 수:", + + "SECTION_HEADER_CONCURRENCY" : "동시성 제한 (Balancing Groups)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "공유된 연결 (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "공유된 연결 (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "공유된 연결 (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "공유자: {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "비밀번호에는 사용자 이름이 포함될 수 없습니다.", + "ERROR_REQUIRES_DIGIT" : "비밀번호에는 적어도 하나의 숫자가 포함되어야 합니다.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "비밀번호에는 대문자와 소문자가 모두 포함되어야 합니다.", + "ERROR_REQUIRES_NON_ALNUM" : "비밀번호에는 하나 이상의 기호가 포함되어야 합니다.", + "ERROR_REUSED" : "이 비밀번호는 이미 사용되었습니다. 이전 {HISTORY_SIZE} 패스워드를 재사용하지 마십시오.", + "ERROR_TOO_SHORT" : "비밀번호는 {LENGTH} 자 이상이어야 합니다.", + "ERROR_TOO_YOUNG" : "이 계정의 비밀번호가 이미 재설정되었습니다. 비밀번호를 다시 변경하기 전에 {WAIT} 일 이상 기다리십시오." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "비밀번호 만료됨:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "다음 이후에 액세스 허용 안함 :", + "FIELD_HEADER_ACCESS_WINDOW_START" : "다음 이후에 엑세스 허용:", + "FIELD_HEADER_TIMEZONE" : "사용자 시간대:", + "FIELD_HEADER_VALID_FROM" : "다음 이후 계정 활정화:", + "FIELD_HEADER_VALID_UNTIL" : "다음 이후 계정 비활성화:", + + "SECTION_HEADER_RESTRICTIONS" : "계정 제한", + "SECTION_HEADER_PROFILE" : "프로필" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "그룹 제한" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/pl.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/pl.json new file mode 100644 index 0000000..a5b5fc1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/pl.json @@ -0,0 +1,110 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "Nowe hasło musi być inne od tego, które wygasło.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "To konto użytkownika nie jest poprawne.", + "ERROR_NOT_ACCESSIBLE" : "Dostęp do tego konta jest obecnie zablokowany. Spróbuj ponownie później.", + + "INFO_PASSWORD_EXPIRED" : "Twoje hasło wygasło i należy je zresetować. Wprowadź nowe hasło, aby kontynuować.", + + "FIELD_HEADER_NEW_PASSWORD" : "Nowe hasło", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Potwierdź nowe hasło" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Maksymalna liczba połączeń:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Maksymalna liczba połączeń dla jednego użytkownika:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Używaj tylko do przełączania awaryjnego:", + "FIELD_HEADER_WEIGHT" : "Waga połączenia:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Szyfrowanie:", + "FIELD_HEADER_GUACD_PORT" : "Port:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Brak (nieszyfrowane)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Limity Jednoczesnych Połączeń", + "SECTION_HEADER_LOAD_BALANCING" : "Równoważenie Obciążenia", + "SECTION_HEADER_GUACD" : "Parametry Guacamole Proxy (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Włącz powiązanie sesji:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Maksymalna liczba połączeń:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Maksymalna liczba połączeń dla jednego użytkownika:", + + "SECTION_HEADER_CONCURRENCY" : "Limity Jednoczesnych Połączeń (Grupy Równoważenia Obciążenia)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Współdzielone połączenia (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Współdzielone połączenia (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Współdzielone połączenia (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Współdzielone przez {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Hasła nie mogą zawierać nazwy użytkownika.", + "ERROR_REQUIRES_DIGIT" : "Hasła muszą zawierać przynajmniej jedną cyfrę.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Hasła muszą zawierać zarówno wielkie, jak i małe litery.", + "ERROR_REQUIRES_NON_ALNUM" : "Hasła muszą zawierać co najmniej jeden znak specjalny.", + "ERROR_REUSED" : "To hasło zostało już użyte. Nie można ponownie użyć żadnego z poprzednich {HISTORY_SIZE} {HISTORY_SIZE, plural, one{hasła} other{haseł}}.", + "ERROR_TOO_SHORT" : "Hasło musi mieć co najmniej {LENGTH} {LENGTH, plural, one{znak} other{znaków}} długości.", + "ERROR_TOO_YOUNG" : "Hasło do tego konta zostało już zresetowane. Poczekać przynajmniej {WAIT} {WAIT, plural, one{dzień} other{dni}} dłużej przed ponowną zmianą hasła." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Hasło wygasło:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Nie zezwalaj na dostęp po:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Zezwalaj na dostęp od:", + "FIELD_HEADER_TIMEZONE" : "Strefa czasowa użytkownika:", + "FIELD_HEADER_VALID_FROM" : "Włącz konto od:", + "FIELD_HEADER_VALID_UNTIL" : "Wyłącz konto po:", + + "SECTION_HEADER_RESTRICTIONS" : "Ograniczenia Konta", + "SECTION_HEADER_PROFILE" : "Profil" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Ograniczenia Grupy" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/pt.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/pt.json new file mode 100644 index 0000000..aafd467 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/pt.json @@ -0,0 +1,111 @@ + +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "A nova senha deve ser diferente da senha expirada.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Esta conta não é atualmente válida.", + "ERROR_NOT_ACCESSIBLE" : "O Acesso para esta conta não é atualmente permitido. Por favor tente novamente mais tarde.", + + "INFO_PASSWORD_EXPIRED" : "Usa senha foi expirada e precisa ser alterada. Por favor, digite uma nova senha para continuar.", + + "FIELD_HEADER_NEW_PASSWORD" : "Nova senha", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Confirme a nova senha" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Número máximo de conexões:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Número máximo de conexões por usuário:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Uso apenas para failover:", + "FIELD_HEADER_WEIGHT" : "Carga de conexão:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Método de Cryptografia:", + "FIELD_HEADER_GUACD_PORT" : "Porta:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Nenhuma (não criptografado)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "Limites de simultaneidade", + "SECTION_HEADER_LOAD_BALANCING" : "Load Balancing", + "SECTION_HEADER_GUACD" : "Parâmetros do Guacamole Proxy (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Ativar afinidade de sessão:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Número máximo de conexões:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Número máximo de conexões por usuário:", + + "SECTION_HEADER_CONCURRENCY" : "Limites de simultaneidade (Balanceamento de Grupos)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Conexões compartilhadas (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Conexões compartilhadas (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Conexões compartilhadas (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Compartilhado por {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Senhas não podem conter o nome de usuário.", + "ERROR_REQUIRES_DIGIT" : "Senhas devem conter pelo menos um número.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Senhas devem conter ambos caracteres maiúsculos e minúsculos.", + "ERROR_REQUIRES_NON_ALNUM" : "Senhas devem conter pelo menos um sìmbolo.", + "ERROR_REUSED" : "Esta senha já foi usada. Por favor não reuse {HISTORY_SIZE} {HISTORY_SIZE, plural, one{senha} other{senhas}} anteriores.", + "ERROR_TOO_SHORT" : "Senhas devem ter pelo menos {LENGTH} {LENGTH, plural, one{caracter} other{caracteres}}.", + "ERROR_TOO_YOUNG" : "A senha para esta conta foi atualizada. Por favor aguarde pelo menos {WAIT} {WAIT, plural, one{dia} other{dias}} para mudar a senha novamente." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Senha expirada:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Não permitir acesso após:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Permitir acesso após:", + "FIELD_HEADER_TIMEZONE" : "Fuso horário do usuário:", + "FIELD_HEADER_VALID_FROM" : "Ativar conta após:", + "FIELD_HEADER_VALID_UNTIL" : "Desativar conta após:", + + "SECTION_HEADER_RESTRICTIONS" : "Restrições de Conta", + "SECTION_HEADER_PROFILE" : "Perfil" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Restrições de Grupo" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ru.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ru.json new file mode 100644 index 0000000..110a4bc --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/ru.json @@ -0,0 +1,109 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "Новый пароль должен отличаться от текущего просроченного.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "Этот аккаунт на данный момент недействителен.", + "ERROR_NOT_ACCESSIBLE" : "Доступ к этому аккаунту в данный момент запрещен. Попробуйте позже.", + + "INFO_PASSWORD_EXPIRED" : "Ваш пароль просрочен и требует смены. Пожалуйста, введите новый пароль для продолжения.", + + "FIELD_HEADER_NEW_PASSWORD" : "Новый пароль", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "Подтвердите новый пароль" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "Максимальное число соединений:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Максимальное число соединений на пользователя:", + + "FIELD_HEADER_FAILOVER_ONLY" : "Использовать только для отказоустойчивости:", + "FIELD_HEADER_WEIGHT" : "«Вес» соединения:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "Сервер:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "Шифрование:", + "FIELD_HEADER_GUACD_PORT" : "Порт:", + + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "Нет (не зашифровано)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL/TLS", + + "SECTION_HEADER_CONCURRENCY" : "Совместное использование", + "SECTION_HEADER_LOAD_BALANCING" : "Балансировка нагрузки", + "SECTION_HEADER_GUACD" : "Параметры сервера Guacamole (guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "Включить закрепление сеансов:", + "FIELD_HEADER_MAX_CONNECTIONS" : "Максимальное число соединений:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "Максимальное число соединений на пользователя:", + + "SECTION_HEADER_CONCURRENCY" : "Совместное использование (для балансирующей группы)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "Расшаренные подключения (MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "Расшаренные подключения (PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "Расшаренные подключения (SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "Расшарил пользователь {USERNAME}" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "Пароль не может содержать имя пользователя.", + "ERROR_REQUIRES_DIGIT" : "Пароль должен содержать хотя бы одну цифру.", + "ERROR_REQUIRES_MULTIPLE_CASE" : "Пароль должен содержать заглавные и строчные символы.", + "ERROR_REQUIRES_NON_ALNUM" : "Пароль должен содержать хотя бы один символ.", + "ERROR_REUSED" : "Этот парольуже был использован ранее. Пожалуйста, не используйте {HISTORY_SIZE} {HISTORY_SIZE, plural, one{предыдущий пароль} few{предыдущих пароля} many{предыдущих паролей} other{предыдущих пароля}}.", + "ERROR_TOO_SHORT" : "Длина пароля должна быть не менее {LENGTH} {LENGTH, plural, one{символа} many{символов} other{символов}}.", + "ERROR_TOO_YOUNG" : "Пароль для этого аккаунта недавно уже был сброшен. Пожалуйста, подождите как минимум {WAIT} {WAIT, plural, one{день} few{дня} many{дней} other{дня}} перед тем, как сменить пароль снова." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "Пароль просрочен:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "Запретить доступ после:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "Разрешить доступ после:", + "FIELD_HEADER_TIMEZONE" : "Временная зона пользователя:", + "FIELD_HEADER_VALID_FROM" : "Включить аккаунт после:", + "FIELD_HEADER_VALID_UNTIL" : "Отключить аккаунт после:", + + "SECTION_HEADER_RESTRICTIONS" : "Ограничения", + "SECTION_HEADER_PROFILE" : "Профиль" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "Ограничения" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/zh.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/zh.json new file mode 100644 index 0000000..ff91c7e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/resources/translations/zh.json @@ -0,0 +1,110 @@ +{ + + "LOGIN" : { + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_SAME" : "新密码必须与过期密码不同。", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + "ERROR_NOT_VALID" : "此用户帐户当前无效。", + "ERROR_NOT_ACCESSIBLE" : "当前不允许访问该帐户。请稍后再试。", + + "INFO_PASSWORD_EXPIRED" : "您的密码已过期,必须重新设置。请输入新密码以继续。", + + "FIELD_HEADER_NEW_PASSWORD" : "新密码", + "FIELD_HEADER_CONFIRM_NEW_PASSWORD" : "确认新密码" + + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_MAX_CONNECTIONS" : "最大连接数:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "每个用户的最大连接数:", + + "FIELD_HEADER_FAILOVER_ONLY" : "仅用于故障转移:", + "FIELD_HEADER_WEIGHT" : "连接权重:", + + "FIELD_HEADER_GUACD_HOSTNAME" : "主机名:", + "FIELD_HEADER_GUACD_ENCRYPTION" : "加密:", + "FIELD_HEADER_GUACD_PORT" : "端口:", + + "FIELD_OPTION_GUACD_ENCRYPTION_EMPTY" : "", + "FIELD_OPTION_GUACD_ENCRYPTION_NONE" : "没有 (未加密)", + "FIELD_OPTION_GUACD_ENCRYPTION_SSL" : "SSL / TLS", + + "SECTION_HEADER_CONCURRENCY" : "并发限制", + "SECTION_HEADER_LOAD_BALANCING" : "负载均衡", + "SECTION_HEADER_GUACD" : "Guacamole代理参数(guacd)" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_ENABLE_SESSION_AFFINITY" : "启用会话亲和:", + "FIELD_HEADER_MAX_CONNECTIONS" : "最大连接数:", + "FIELD_HEADER_MAX_CONNECTIONS_PER_USER" : "每个用户的最大连接数:", + + "SECTION_HEADER_CONCURRENCY" : "并发限制(组负载均衡)" + + }, + + "DATA_SOURCE_MYSQL" : { + "NAME" : "MySQL" + }, + + "DATA_SOURCE_MYSQL_SHARED" : { + "NAME" : "共享连接(MySQL)" + }, + + "DATA_SOURCE_POSTGRESQL" : { + "NAME" : "PostgreSQL" + }, + + "DATA_SOURCE_POSTGRESQL_SHARED" : { + "NAME" : "共享连接(PostgreSQL)" + }, + + "DATA_SOURCE_SQLSERVER" : { + "NAME" : "SQL Server" + }, + + "DATA_SOURCE_SQLSERVER_SHARED" : { + "NAME" : "共享连接(SQL Server)" + }, + + "HOME" : { + "INFO_SHARED_BY" : "由{USERNAME}共享" + }, + + "PASSWORD_POLICY" : { + + "ERROR_CONTAINS_USERNAME" : "密码可能不包含用户名。", + "ERROR_REQUIRES_DIGIT" : "密码必须至少包含一位数字。", + "ERROR_REQUIRES_MULTIPLE_CASE" : "密码必须同时包含大写和小写字符。", + "ERROR_REQUIRES_NON_ALNUM" : "密码必须包含至少一个符号。", + "ERROR_REUSED" : "此密码已被使用。请勿重复使用以前的密码。", + "ERROR_TOO_SHORT" : "密码必须至少{LENGTH}位长度。", + "ERROR_TOO_YOUNG" : "此帐户的密码已被重设。请至少再等待 {WAIT}天,然后再次更改密码。" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_EXPIRED" : "密码已过期:", + "FIELD_HEADER_ACCESS_WINDOW_END" : "之后不允许访问:", + "FIELD_HEADER_ACCESS_WINDOW_START" : "之后允许访问:", + "FIELD_HEADER_TIMEZONE" : "用户时区:", + "FIELD_HEADER_VALID_FROM" : "之后启用帐户:", + "FIELD_HEADER_VALID_UNTIL" : "之后禁用帐户:", + + "SECTION_HEADER_RESTRICTIONS" : "帐户限制", + "SECTION_HEADER_PROFILE" : "个人资料" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "SECTION_HEADER_RESTRICTIONS" : "组限制" + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/.ratignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/pom.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/pom.xml new file mode 100644 index 0000000..93a4e75 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/pom.xml @@ -0,0 +1,72 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-jdbc-dist + pom + guacamole-auth-jdbc-dist + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-jdbc + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-auth-jdbc-mysql + 1.6.0 + + + + + org.apache.guacamole + guacamole-auth-jdbc-postgresql + 1.6.0 + + + + + org.apache.guacamole + guacamole-auth-jdbc-sqlserver + 1.6.0 + + + + + + + + ${project.parent.artifactId}-${project.parent.version} + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/src/main/assembly/dist.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/src/main/assembly/dist.xml new file mode 100644 index 0000000..0e61612 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-dist/src/main/assembly/dist.xml @@ -0,0 +1,94 @@ + + + + + dist + ${project.parent.artifactId}-${project.parent.version} + + + + tar.gz + + + + + + + + mysql + false + + org.apache.guacamole:guacamole-auth-jdbc-mysql + + + + + + postgresql + false + + org.apache.guacamole:guacamole-auth-jdbc-postgresql + + + + + + sqlserver + false + + org.apache.guacamole:guacamole-auth-jdbc-sqlserver + + + + + + + + + + + + target/licenses + + + + + mysql/schema + ../guacamole-auth-jdbc-mysql/schema + + + + + postgresql/schema + ../guacamole-auth-jdbc-postgresql/schema + + + + + sqlserver/schema + ../guacamole-auth-jdbc-sqlserver/schema + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/.gitignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/.ratignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/pom.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/pom.xml new file mode 100644 index 0000000..0818ac3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/pom.xml @@ -0,0 +1,57 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-jdbc-mysql + jar + guacamole-auth-jdbc-mysql + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-jdbc + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + provided + + + + + org.apache.guacamole + guacamole-auth-jdbc-base + 1.6.0 + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/001-create-schema.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/001-create-schema.sql new file mode 100644 index 0000000..8241961 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/001-create-schema.sql @@ -0,0 +1,615 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Table of connection groups. Each connection group has a name. +-- + +CREATE TABLE `guacamole_connection_group` ( + + `connection_group_id` int(11) NOT NULL AUTO_INCREMENT, + `parent_id` int(11), + `connection_group_name` varchar(128) NOT NULL, + `type` enum('ORGANIZATIONAL', + 'BALANCING') NOT NULL DEFAULT 'ORGANIZATIONAL', + + -- Concurrency limits + `max_connections` int(11), + `max_connections_per_user` int(11), + `enable_session_affinity` boolean NOT NULL DEFAULT 0, + + PRIMARY KEY (`connection_group_id`), + UNIQUE KEY `connection_group_name_parent` (`connection_group_name`, `parent_id`), + + CONSTRAINT `guacamole_connection_group_ibfk_1` + FOREIGN KEY (`parent_id`) + REFERENCES `guacamole_connection_group` (`connection_group_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of connections. Each connection has a name, protocol, and +-- associated set of parameters. +-- A connection may belong to a connection group. +-- + +CREATE TABLE `guacamole_connection` ( + + `connection_id` int(11) NOT NULL AUTO_INCREMENT, + `connection_name` varchar(128) NOT NULL, + `parent_id` int(11), + `protocol` varchar(32) NOT NULL, + + -- Guacamole proxy (guacd) overrides + `proxy_port` integer, + `proxy_hostname` varchar(512), + `proxy_encryption_method` enum('NONE', 'SSL'), + + -- Concurrency limits + `max_connections` int(11), + `max_connections_per_user` int(11), + + -- Load-balancing behavior + `connection_weight` int(11), + `failover_only` boolean NOT NULL DEFAULT 0, + + PRIMARY KEY (`connection_id`), + UNIQUE KEY `connection_name_parent` (`connection_name`, `parent_id`), + + CONSTRAINT `guacamole_connection_ibfk_1` + FOREIGN KEY (`parent_id`) + REFERENCES `guacamole_connection_group` (`connection_group_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of base entities which may each be either a user or user group. Other +-- tables which represent qualities shared by both users and groups will point +-- to guacamole_entity, while tables which represent qualities specific to +-- users or groups will point to guacamole_user or guacamole_user_group. +-- + +CREATE TABLE `guacamole_entity` ( + + `entity_id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `type` enum('USER', + 'USER_GROUP') NOT NULL, + + PRIMARY KEY (`entity_id`), + UNIQUE KEY `guacamole_entity_name_scope` (`type`, `name`) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of users. Each user has a unique username and a hashed password +-- with corresponding salt. Although the authentication system will always set +-- salted passwords, other systems may set unsalted passwords by simply not +-- providing the salt. +-- + +CREATE TABLE `guacamole_user` ( + + `user_id` int(11) NOT NULL AUTO_INCREMENT, + `entity_id` int(11) NOT NULL, + + -- Optionally-salted password + `password_hash` binary(32) NOT NULL, + `password_salt` binary(32), + `password_date` datetime NOT NULL, + + -- Account disabled/expired status + `disabled` boolean NOT NULL DEFAULT 0, + `expired` boolean NOT NULL DEFAULT 0, + + -- Time-based access restriction + `access_window_start` TIME, + `access_window_end` TIME, + + -- Date-based access restriction + `valid_from` DATE, + `valid_until` DATE, + + -- Timezone used for all date/time comparisons and interpretation + `timezone` VARCHAR(64), + + -- Profile information + `full_name` VARCHAR(256), + `email_address` VARCHAR(256), + `organization` VARCHAR(256), + `organizational_role` VARCHAR(256), + + PRIMARY KEY (`user_id`), + + UNIQUE KEY `guacamole_user_single_entity` (`entity_id`), + + CONSTRAINT `guacamole_user_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) + ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of user groups. Each user group may have an arbitrary set of member +-- users and member groups, with those members inheriting the permissions +-- granted to that group. +-- + +CREATE TABLE `guacamole_user_group` ( + + `user_group_id` int(11) NOT NULL AUTO_INCREMENT, + `entity_id` int(11) NOT NULL, + + -- Group disabled status + `disabled` boolean NOT NULL DEFAULT 0, + + PRIMARY KEY (`user_group_id`), + + UNIQUE KEY `guacamole_user_group_single_entity` (`entity_id`), + + CONSTRAINT `guacamole_user_group_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) + ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of users which are members of given user groups. +-- + +CREATE TABLE `guacamole_user_group_member` ( + + `user_group_id` int(11) NOT NULL, + `member_entity_id` int(11) NOT NULL, + + PRIMARY KEY (`user_group_id`, `member_entity_id`), + + -- Parent must be a user group + CONSTRAINT `guacamole_user_group_member_parent_id` + FOREIGN KEY (`user_group_id`) + REFERENCES `guacamole_user_group` (`user_group_id`) ON DELETE CASCADE, + + -- Member may be either a user or a user group (any entity) + CONSTRAINT `guacamole_user_group_member_entity_id` + FOREIGN KEY (`member_entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of sharing profiles. Each sharing profile has a name, associated set +-- of parameters, and a primary connection. The primary connection is the +-- connection that the sharing profile shares, and the parameters dictate the +-- restrictions/features which apply to the user joining the connection via the +-- sharing profile. +-- + +CREATE TABLE guacamole_sharing_profile ( + + `sharing_profile_id` int(11) NOT NULL AUTO_INCREMENT, + `sharing_profile_name` varchar(128) NOT NULL, + `primary_connection_id` int(11) NOT NULL, + + PRIMARY KEY (`sharing_profile_id`), + UNIQUE KEY `sharing_profile_name_primary` (sharing_profile_name, primary_connection_id), + + CONSTRAINT `guacamole_sharing_profile_ibfk_1` + FOREIGN KEY (`primary_connection_id`) + REFERENCES `guacamole_connection` (`connection_id`) + ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of connection parameters. Each parameter is simply a name/value pair +-- associated with a connection. +-- + +CREATE TABLE `guacamole_connection_parameter` ( + + `connection_id` int(11) NOT NULL, + `parameter_name` varchar(128) NOT NULL, + `parameter_value` varchar(4096) NOT NULL, + + PRIMARY KEY (`connection_id`,`parameter_name`), + + CONSTRAINT `guacamole_connection_parameter_ibfk_1` + FOREIGN KEY (`connection_id`) + REFERENCES `guacamole_connection` (`connection_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of sharing profile parameters. Each parameter is simply +-- name/value pair associated with a sharing profile. These parameters dictate +-- the restrictions/features which apply to the user joining the associated +-- connection via the sharing profile. +-- + +CREATE TABLE guacamole_sharing_profile_parameter ( + + `sharing_profile_id` integer NOT NULL, + `parameter_name` varchar(128) NOT NULL, + `parameter_value` varchar(4096) NOT NULL, + + PRIMARY KEY (`sharing_profile_id`, `parameter_name`), + + CONSTRAINT `guacamole_sharing_profile_parameter_ibfk_1` + FOREIGN KEY (`sharing_profile_id`) + REFERENCES `guacamole_sharing_profile` (`sharing_profile_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary user attributes. Each attribute is simply a name/value +-- pair associated with a user. Arbitrary attributes are defined by other +-- extensions. Attributes defined by this extension will be mapped to +-- properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_attribute ( + + `user_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (user_id, attribute_name), + KEY `user_id` (`user_id`), + + CONSTRAINT guacamole_user_attribute_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary user group attributes. Each attribute is simply a +-- name/value pair associated with a user group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_group_attribute ( + + `user_group_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (`user_group_id`, `attribute_name`), + KEY `user_group_id` (`user_group_id`), + + CONSTRAINT `guacamole_user_group_attribute_ibfk_1` + FOREIGN KEY (`user_group_id`) + REFERENCES `guacamole_user_group` (`user_group_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary connection attributes. Each attribute is simply a +-- name/value pair associated with a connection. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_attribute ( + + `connection_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (connection_id, attribute_name), + KEY `connection_id` (`connection_id`), + + CONSTRAINT guacamole_connection_attribute_ibfk_1 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary connection group attributes. Each attribute is simply a +-- name/value pair associated with a connection group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_group_attribute ( + + `connection_group_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (connection_group_id, attribute_name), + KEY `connection_group_id` (`connection_group_id`), + + CONSTRAINT guacamole_connection_group_attribute_ibfk_1 + FOREIGN KEY (connection_group_id) + REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary sharing profile attributes. Each attribute is simply a +-- name/value pair associated with a sharing profile. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_sharing_profile_attribute ( + + `sharing_profile_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (sharing_profile_id, attribute_name), + KEY `sharing_profile_id` (`sharing_profile_id`), + + CONSTRAINT guacamole_sharing_profile_attribute_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of connection permissions. Each connection permission grants a user or +-- user group specific access to a connection. +-- + +CREATE TABLE `guacamole_connection_permission` ( + + `entity_id` int(11) NOT NULL, + `connection_id` int(11) NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`,`connection_id`,`permission`), + + CONSTRAINT `guacamole_connection_permission_ibfk_1` + FOREIGN KEY (`connection_id`) + REFERENCES `guacamole_connection` (`connection_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_connection_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of connection group permissions. Each group permission grants a user +-- or user group specific access to a connection group. +-- + +CREATE TABLE `guacamole_connection_group_permission` ( + + `entity_id` int(11) NOT NULL, + `connection_group_id` int(11) NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`,`connection_group_id`,`permission`), + + CONSTRAINT `guacamole_connection_group_permission_ibfk_1` + FOREIGN KEY (`connection_group_id`) + REFERENCES `guacamole_connection_group` (`connection_group_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_connection_group_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of sharing profile permissions. Each sharing profile permission grants +-- a user or user group specific access to a sharing profile. +-- + +CREATE TABLE guacamole_sharing_profile_permission ( + + `entity_id` integer NOT NULL, + `sharing_profile_id` integer NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`, `sharing_profile_id`, `permission`), + + CONSTRAINT `guacamole_sharing_profile_permission_ibfk_1` + FOREIGN KEY (`sharing_profile_id`) + REFERENCES `guacamole_sharing_profile` (`sharing_profile_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_sharing_profile_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of system permissions. Each system permission grants a user or user +-- group a system-level privilege of some kind. +-- + +CREATE TABLE `guacamole_system_permission` ( + + `entity_id` int(11) NOT NULL, + `permission` enum('CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'AUDIT', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`,`permission`), + + CONSTRAINT `guacamole_system_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of user permissions. Each user permission grants a user or user group +-- access to another user (the "affected" user) for a specific type of +-- operation. +-- + +CREATE TABLE `guacamole_user_permission` ( + + `entity_id` int(11) NOT NULL, + `affected_user_id` int(11) NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`,`affected_user_id`,`permission`), + + CONSTRAINT `guacamole_user_permission_ibfk_1` + FOREIGN KEY (`affected_user_id`) + REFERENCES `guacamole_user` (`user_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_user_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of user group permissions. Each user group permission grants a user +-- or user group access to a another user group (the "affected" user group) for +-- a specific type of operation. +-- + +CREATE TABLE `guacamole_user_group_permission` ( + + `entity_id` int(11) NOT NULL, + `affected_user_group_id` int(11) NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`, `affected_user_group_id`, `permission`), + + CONSTRAINT `guacamole_user_group_permission_affected_user_group` + FOREIGN KEY (`affected_user_group_id`) + REFERENCES `guacamole_user_group` (`user_group_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_user_group_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of connection history records. Each record defines a specific user's +-- session, including the connection used, the start time, and the end time +-- (if any). +-- + +CREATE TABLE `guacamole_connection_history` ( + + `history_id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) DEFAULT NULL, + `username` varchar(128) NOT NULL, + `remote_host` varchar(256) DEFAULT NULL, + `connection_id` int(11) DEFAULT NULL, + `connection_name` varchar(128) NOT NULL, + `sharing_profile_id` int(11) DEFAULT NULL, + `sharing_profile_name` varchar(128) DEFAULT NULL, + `start_date` datetime NOT NULL, + `end_date` datetime DEFAULT NULL, + + PRIMARY KEY (`history_id`), + KEY `user_id` (`user_id`), + KEY `connection_id` (`connection_id`), + KEY `sharing_profile_id` (`sharing_profile_id`), + KEY `start_date` (`start_date`), + KEY `end_date` (`end_date`), + KEY `connection_start_date` (`connection_id`, `start_date`), + + CONSTRAINT `guacamole_connection_history_ibfk_1` + FOREIGN KEY (`user_id`) + REFERENCES `guacamole_user` (`user_id`) ON DELETE SET NULL, + + CONSTRAINT `guacamole_connection_history_ibfk_2` + FOREIGN KEY (`connection_id`) + REFERENCES `guacamole_connection` (`connection_id`) ON DELETE SET NULL, + + CONSTRAINT `guacamole_connection_history_ibfk_3` + FOREIGN KEY (`sharing_profile_id`) + REFERENCES `guacamole_sharing_profile` (`sharing_profile_id`) ON DELETE SET NULL + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- User login/logout history +-- + +CREATE TABLE guacamole_user_history ( + + `history_id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) DEFAULT NULL, + `username` varchar(128) NOT NULL, + `remote_host` varchar(256) DEFAULT NULL, + `start_date` datetime NOT NULL, + `end_date` datetime DEFAULT NULL, + + PRIMARY KEY (history_id), + KEY `user_id` (`user_id`), + KEY `start_date` (`start_date`), + KEY `end_date` (`end_date`), + KEY `user_start_date` (`user_id`, `start_date`), + + CONSTRAINT guacamole_user_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- User password history +-- + +CREATE TABLE guacamole_user_password_history ( + + `password_history_id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + + -- Salted password + `password_hash` binary(32) NOT NULL, + `password_salt` binary(32), + `password_date` datetime NOT NULL, + + PRIMARY KEY (`password_history_id`), + KEY `user_id` (`user_id`), + + CONSTRAINT `guacamole_user_password_history_ibfk_1` + FOREIGN KEY (`user_id`) + REFERENCES `guacamole_user` (`user_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/002-create-admin-user.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/002-create-admin-user.sql new file mode 100644 index 0000000..2b7cc02 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/002-create-admin-user.sql @@ -0,0 +1,54 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- Create default user "guacadmin" with password "guacadmin" +INSERT INTO guacamole_entity (name, type) VALUES ('guacadmin', 'USER'); +INSERT INTO guacamole_user (entity_id, password_hash, password_salt, password_date) +SELECT + entity_id, + x'CA458A7D494E3BE824F5E1E175A1556C0F8EEF2C2D7DF3633BEC4A29C4411960', -- 'guacadmin' + x'FE24ADC5E11E2B25288D1704ABE67A79E342ECC26064CE69C5B3177795A82264', + NOW() +FROM guacamole_entity WHERE name = 'guacadmin'; + +-- Grant this user all system permissions +INSERT INTO guacamole_system_permission (entity_id, permission) +SELECT entity_id, permission +FROM ( + SELECT 'guacadmin' AS username, 'CREATE_CONNECTION' AS permission + UNION SELECT 'guacadmin' AS username, 'CREATE_CONNECTION_GROUP' AS permission + UNION SELECT 'guacadmin' AS username, 'CREATE_SHARING_PROFILE' AS permission + UNION SELECT 'guacadmin' AS username, 'CREATE_USER' AS permission + UNION SELECT 'guacadmin' AS username, 'CREATE_USER_GROUP' AS permission + UNION SELECT 'guacadmin' AS username, 'ADMINISTER' AS permission +) permissions +JOIN guacamole_entity ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER'; + +-- Grant admin permission to read/update/administer self +INSERT INTO guacamole_user_permission (entity_id, affected_user_id, permission) +SELECT guacamole_entity.entity_id, guacamole_user.user_id, permission +FROM ( + SELECT 'guacadmin' AS username, 'guacadmin' AS affected_username, 'READ' AS permission + UNION SELECT 'guacadmin' AS username, 'guacadmin' AS affected_username, 'UPDATE' AS permission + UNION SELECT 'guacadmin' AS username, 'guacadmin' AS affected_username, 'ADMINISTER' AS permission +) permissions +JOIN guacamole_entity ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER' +JOIN guacamole_entity affected ON permissions.affected_username = affected.name AND guacamole_entity.type = 'USER' +JOIN guacamole_user ON guacamole_user.entity_id = affected.entity_id; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.8.2.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.8.2.sql new file mode 100644 index 0000000..616b728 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.8.2.sql @@ -0,0 +1,86 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Table of connection groups. Each connection group has a name. +-- + +CREATE TABLE `guacamole_connection_group` ( + + `connection_group_id` int(11) NOT NULL AUTO_INCREMENT, + `parent_id` int(11), + `connection_group_name` varchar(128) NOT NULL, + `type` enum('ORGANIZATIONAL', + 'BALANCING') NOT NULL DEFAULT 'ORGANIZATIONAL', + + + PRIMARY KEY (`connection_group_id`), + UNIQUE KEY `connection_group_name_parent` (`connection_group_name`, `parent_id`), + + CONSTRAINT `guacamole_connection_group_ibfk_1` + FOREIGN KEY (`parent_id`) + REFERENCES `guacamole_connection_group` (`connection_group_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +-- +-- Changes to connection table to support grouping. +-- + +ALTER TABLE `guacamole_connection` ADD COLUMN `parent_id` int(11) AFTER `connection_name`; + +ALTER TABLE `guacamole_connection` DROP INDEX `connection_name`; +ALTER TABLE `guacamole_connection` ADD UNIQUE KEY `connection_name_parent` (`connection_name`, `parent_id`); + +ALTER TABLE `guacamole_connection` ADD CONSTRAINT `guacamole_connection_ibfk_1` + FOREIGN KEY (`parent_id`) + REFERENCES `guacamole_connection_group` (`connection_group_id`) ON DELETE CASCADE; + +-- +-- Table of connection group permissions. Each group permission grants a user +-- specific access to a connection group. +-- + +CREATE TABLE `guacamole_connection_group_permission` ( + + `user_id` int(11) NOT NULL, + `connection_group_id` int(11) NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`user_id`,`connection_group_id`,`permission`), + + CONSTRAINT `guacamole_connection_group_permission_ibfk_1` + FOREIGN KEY (`connection_group_id`) + REFERENCES `guacamole_connection_group` (`connection_group_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_connection_group_permission_ibfk_2` + FOREIGN KEY (`user_id`) + REFERENCES `guacamole_user` (`user_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `guacamole_system_permission` MODIFY `permission` + enum('CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_USER', + 'ADMINISTER') NOT NULL; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.10.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.10.sql new file mode 100644 index 0000000..4e60132 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.10.sql @@ -0,0 +1,184 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- User and connection IDs within history table can now be null +-- + +ALTER TABLE guacamole_connection_history + MODIFY COLUMN user_id INT(11) DEFAULT NULL; + +ALTER TABLE guacamole_connection_history + MODIFY COLUMN connection_id INT(11) DEFAULT NULL; + +-- +-- Add new username and connection_name columns to history table +-- + +ALTER TABLE guacamole_connection_history + ADD COLUMN username VARCHAR(128); + +ALTER TABLE guacamole_connection_history + ADD COLUMN connection_name VARCHAR(128); + +-- +-- Populate new name columns by joining corresponding tables +-- + +UPDATE guacamole_connection_history +JOIN guacamole_user + ON guacamole_user.user_id = guacamole_connection_history.user_id +SET guacamole_connection_history.username = guacamole_user.username; + +UPDATE guacamole_connection_history +JOIN guacamole_connection + ON guacamole_connection.connection_id = + guacamole_connection_history.connection_id +SET guacamole_connection_history.connection_name = + guacamole_connection.connection_name; + +-- +-- Set NOT NULL now that the column is fully populated +-- + +ALTER TABLE guacamole_connection_history + MODIFY username VARCHAR(128) NOT NULL; + +ALTER TABLE guacamole_connection_history + MODIFY connection_name VARCHAR(128) NOT NULL; + +-- +-- Remove old foreign key constraints with ON DELETE CASCADE +-- + +ALTER TABLE guacamole_connection_history + DROP FOREIGN KEY guacamole_connection_history_ibfk_1; + +ALTER TABLE guacamole_connection_history + DROP FOREIGN KEY guacamole_connection_history_ibfk_2; + +-- +-- Recreate foreign key constraints with ON DELETE SET NULL +-- + +ALTER TABLE guacamole_connection_history + ADD CONSTRAINT guacamole_connection_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL; + +ALTER TABLE guacamole_connection_history + ADD CONSTRAINT guacamole_connection_history_ibfk_2 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE SET NULL; + +-- +-- Add session affinity column +-- + +ALTER TABLE guacamole_connection_group + ADD COLUMN enable_session_affinity boolean NOT NULL DEFAULT 0; + +-- +-- Add new system-level permission +-- + +ALTER TABLE `guacamole_system_permission` + MODIFY `permission` enum('CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'ADMINISTER') NOT NULL; + +-- +-- Add sharing profile table +-- + +CREATE TABLE guacamole_sharing_profile ( + + `sharing_profile_id` int(11) NOT NULL AUTO_INCREMENT, + `sharing_profile_name` varchar(128) NOT NULL, + `primary_connection_id` int(11) NOT NULL, + + PRIMARY KEY (`sharing_profile_id`), + UNIQUE KEY `sharing_profile_name_primary` (sharing_profile_name, primary_connection_id), + + CONSTRAINT `guacamole_sharing_profile_ibfk_1` + FOREIGN KEY (`primary_connection_id`) + REFERENCES `guacamole_connection` (`connection_id`) + ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Add table of sharing profile parameters +-- + +CREATE TABLE guacamole_sharing_profile_parameter ( + + `sharing_profile_id` integer NOT NULL, + `parameter_name` varchar(128) NOT NULL, + `parameter_value` varchar(4096) NOT NULL, + + PRIMARY KEY (`sharing_profile_id`, `parameter_name`), + + CONSTRAINT `guacamole_sharing_profile_parameter_ibfk_1` + FOREIGN KEY (`sharing_profile_id`) + REFERENCES `guacamole_sharing_profile` (`sharing_profile_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Object-level permission table for sharing profiles +-- + +CREATE TABLE guacamole_sharing_profile_permission ( + + `user_id` integer NOT NULL, + `sharing_profile_id` integer NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`user_id`, `sharing_profile_id`, `permission`), + + CONSTRAINT `guacamole_sharing_profile_permission_ibfk_1` + FOREIGN KEY (`sharing_profile_id`) + REFERENCES `guacamole_sharing_profile` (`sharing_profile_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_sharing_profile_permission_ibfk_2` + FOREIGN KEY (`user_id`) + REFERENCES `guacamole_user` (`user_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Add new (optional) sharing profile ID and name columns to connection history +-- + +ALTER TABLE guacamole_connection_history + ADD COLUMN sharing_profile_id INT(11); + +ALTER TABLE guacamole_connection_history + ADD COLUMN sharing_profile_name VARCHAR(128); + +ALTER TABLE guacamole_connection_history + ADD CONSTRAINT guacamole_connection_history_ibfk_3 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE SET NULL; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.11.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.11.sql new file mode 100644 index 0000000..84576eb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.11.sql @@ -0,0 +1,53 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-user password set date +-- + +ALTER TABLE guacamole_user + ADD COLUMN password_date DATETIME; + +UPDATE guacamole_user SET password_date = NOW(); + +ALTER TABLE guacamole_user + MODIFY COLUMN password_date DATETIME NOT NULL; + +-- +-- User password history +-- + +CREATE TABLE guacamole_user_password_history ( + + `password_history_id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + + -- Salted password + `password_hash` binary(32) NOT NULL, + `password_salt` binary(32), + `password_date` datetime NOT NULL, + + PRIMARY KEY (`password_history_id`), + KEY `user_id` (`user_id`), + + CONSTRAINT `guacamole_user_password_history_ibfk_1` + FOREIGN KEY (`user_id`) + REFERENCES `guacamole_user` (`user_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.13.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.13.sql new file mode 100644 index 0000000..95bbc1c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.13.sql @@ -0,0 +1,40 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add guacd per-connection override columns +-- + +ALTER TABLE guacamole_connection ADD COLUMN proxy_port INT(11); +ALTER TABLE guacamole_connection ADD COLUMN proxy_hostname VARCHAR(512); + +ALTER TABLE guacamole_connection ADD COLUMN proxy_encryption_method ENUM( + 'NONE', + 'SSL' +); + +-- +-- Add new user profile columns +-- + +ALTER TABLE guacamole_user ADD COLUMN full_name VARCHAR(256); +ALTER TABLE guacamole_user ADD COLUMN email_address VARCHAR(256); +ALTER TABLE guacamole_user ADD COLUMN organization VARCHAR(256); +ALTER TABLE guacamole_user ADD COLUMN organizational_role VARCHAR(256); + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.14.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.14.sql new file mode 100644 index 0000000..ee586bf --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.14.sql @@ -0,0 +1,70 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-connection weight +-- + +ALTER TABLE guacamole_connection + ADD COLUMN connection_weight int(11); + +-- +-- Add failover-only flag +-- + +ALTER TABLE guacamole_connection + ADD COLUMN failover_only BOOLEAN NOT NULL DEFAULT 0; + +-- +-- Add remote_host to connection history +-- + +ALTER TABLE guacamole_connection_history + ADD COLUMN remote_host VARCHAR(256) DEFAULT NULL; + +-- +-- Add covering index for connection history connection and start date +-- + +ALTER TABLE guacamole_connection_history ADD KEY (connection_id, start_date); + +-- +-- User login/logout history +-- + +CREATE TABLE guacamole_user_history ( + + `history_id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) DEFAULT NULL, + `username` varchar(128) NOT NULL, + `remote_host` varchar(256) DEFAULT NULL, + `start_date` datetime NOT NULL, + `end_date` datetime DEFAULT NULL, + + PRIMARY KEY (history_id), + KEY `user_id` (`user_id`), + KEY `start_date` (`start_date`), + KEY `end_date` (`end_date`), + KEY `user_start_date` (`user_id`, `start_date`), + + CONSTRAINT guacamole_user_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.6.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.6.sql new file mode 100644 index 0000000..aeba2aa --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.6.sql @@ -0,0 +1,36 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Explicitly add permission for each user to READ him/herself +-- + +INSERT INTO guacamole_user_permission + (user_id, affected_user_id, permission) +SELECT user_id, user_id, 'READ' +FROM guacamole_user +WHERE + user_id NOT IN ( + SELECT user_id + FROM guacamole_user_permission + WHERE + user_id = affected_user_id + AND permission = 'READ' + ); + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.7.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.7.sql new file mode 100644 index 0000000..8d7ebfd --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.7.sql @@ -0,0 +1,31 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-user disable flag +-- + +ALTER TABLE guacamole_user ADD COLUMN disabled BOOLEAN NOT NULL DEFAULT 0; + +-- +-- Add per-user password expiration flag +-- + +ALTER TABLE guacamole_user ADD COLUMN expired BOOLEAN NOT NULL DEFAULT 0; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.8.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.8.sql new file mode 100644 index 0000000..f03d8e7 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.8.sql @@ -0,0 +1,52 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-user time-based access restrictions. +-- + +ALTER TABLE guacamole_user ADD COLUMN access_window_start TIME; +ALTER TABLE guacamole_user ADD COLUMN access_window_end TIME; + +-- +-- Add per-user date-based account validity restrictions. +-- + +ALTER TABLE guacamole_user ADD COLUMN valid_from DATE; +ALTER TABLE guacamole_user ADD COLUMN valid_until DATE; + +-- +-- Add per-user timezone for sake of time comparisons/interpretation. +-- + +ALTER TABLE guacamole_user ADD COLUMN timezone VARCHAR(64); + +-- +-- Add connection concurrency limits +-- + +ALTER TABLE guacamole_connection ADD COLUMN max_connections INT(11); +ALTER TABLE guacamole_connection ADD COLUMN max_connections_per_user INT(11); + +-- +-- Add connection group concurrency limits +-- + +ALTER TABLE guacamole_connection_group ADD COLUMN max_connections INT(11); +ALTER TABLE guacamole_connection_group ADD COLUMN max_connections_per_user INT(11); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.9.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.9.sql new file mode 100644 index 0000000..858ce94 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-0.9.9.sql @@ -0,0 +1,26 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Ensure history entry start/end dates are indexed. +-- + +ALTER TABLE guacamole_connection_history ADD KEY (start_date); +ALTER TABLE guacamole_connection_history ADD KEY (end_date); +ALTER TABLE guacamole_connection_history ADD KEY search_index (start_date, connection_id, user_id); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-1.0.0.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-1.0.0.sql new file mode 100644 index 0000000..0fccb61 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-1.0.0.sql @@ -0,0 +1,441 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new system-level permission +-- + +ALTER TABLE `guacamole_system_permission` + MODIFY `permission` enum('CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'ADMINISTER') NOT NULL; + +-- +-- Table of base entities which may each be either a user or user group. Other +-- tables which represent qualities shared by both users and groups will point +-- to guacamole_entity, while tables which represent qualities specific to +-- users or groups will point to guacamole_user or guacamole_user_group. +-- + +CREATE TABLE `guacamole_entity` ( + + `entity_id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `type` enum('USER', + 'USER_GROUP') NOT NULL, + + PRIMARY KEY (`entity_id`), + UNIQUE KEY `guacamole_entity_name_scope` (`type`, `name`) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of user groups. Each user group may have an arbitrary set of member +-- users and member groups, with those members inheriting the permissions +-- granted to that group. +-- + +CREATE TABLE `guacamole_user_group` ( + + `user_group_id` int(11) NOT NULL AUTO_INCREMENT, + `entity_id` int(11) NOT NULL, + + -- Group disabled status + `disabled` boolean NOT NULL DEFAULT 0, + + PRIMARY KEY (`user_group_id`), + + UNIQUE KEY `guacamole_user_group_single_entity` (`entity_id`), + + CONSTRAINT `guacamole_user_group_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) + ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of users which are members of given user groups. +-- + +CREATE TABLE `guacamole_user_group_member` ( + + `user_group_id` int(11) NOT NULL, + `member_entity_id` int(11) NOT NULL, + + PRIMARY KEY (`user_group_id`, `member_entity_id`), + + -- Parent must be a user group + CONSTRAINT `guacamole_user_group_member_parent_id` + FOREIGN KEY (`user_group_id`) + REFERENCES `guacamole_user_group` (`user_group_id`) ON DELETE CASCADE, + + -- Member may be either a user or a user group (any entity) + CONSTRAINT `guacamole_user_group_member_entity_id` + FOREIGN KEY (`member_entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of user group permissions. Each user group permission grants a user +-- or user group access to a another user group (the "affected" user group) for +-- a specific type of operation. +-- + +CREATE TABLE `guacamole_user_group_permission` ( + + `entity_id` int(11) NOT NULL, + `affected_user_group_id` int(11) NOT NULL, + `permission` enum('READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER') NOT NULL, + + PRIMARY KEY (`entity_id`, `affected_user_group_id`, `permission`), + + CONSTRAINT `guacamole_user_group_permission_affected_user_group` + FOREIGN KEY (`affected_user_group_id`) + REFERENCES `guacamole_user_group` (`user_group_id`) ON DELETE CASCADE, + + CONSTRAINT `guacamole_user_group_permission_entity` + FOREIGN KEY (`entity_id`) + REFERENCES `guacamole_entity` (`entity_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Modify guacamole_user table to use guacamole_entity as a base +-- + +-- Add new entity_id column +ALTER TABLE guacamole_user ADD COLUMN entity_id int(11); + +-- Create user entities for each guacamole_user entry +INSERT INTO guacamole_entity (name, type) +SELECT username, 'USER' FROM guacamole_user; + +-- Update guacamole_user to point to corresponding guacamole_entity +UPDATE guacamole_user SET entity_id = ( + SELECT entity_id FROM guacamole_entity + WHERE + username = guacamole_entity.name + AND type = 'USER' +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_user MODIFY entity_id int(11) NOT NULL; + +-- The entity_id column should now be unique for each user +ALTER TABLE guacamole_user + ADD CONSTRAINT guacamole_user_single_entity + UNIQUE (entity_id); + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_user + ADD CONSTRAINT guacamole_user_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- The username column can now safely be removed +ALTER TABLE guacamole_user DROP COLUMN username; + +-- +-- Modify guacamole_connection_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_connection_permission ADD COLUMN entity_id int(11); + +-- Update guacamole_connection_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_connection_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_connection_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_connection_permission MODIFY entity_id int(11) NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_connection_permission + ADD CONSTRAINT guacamole_connection_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- Remove user_id column +ALTER TABLE guacamole_connection_permission DROP FOREIGN KEY guacamole_connection_permission_ibfk_2; +ALTER TABLE guacamole_connection_permission DROP PRIMARY KEY; +ALTER TABLE guacamole_connection_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_connection_permission + ADD PRIMARY KEY (entity_id, connection_id, permission); + +-- +-- Modify guacamole_connection_group_permission to use guacamole_entity instead +-- of guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_connection_group_permission ADD COLUMN entity_id int(11); + +-- Update guacamole_connection_group_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_connection_group_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_connection_group_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_connection_group_permission MODIFY entity_id int(11) NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_connection_group_permission + ADD CONSTRAINT guacamole_connection_group_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- Remove user_id column +ALTER TABLE guacamole_connection_group_permission DROP FOREIGN KEY guacamole_connection_group_permission_ibfk_2; +ALTER TABLE guacamole_connection_group_permission DROP PRIMARY KEY; +ALTER TABLE guacamole_connection_group_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_connection_group_permission + ADD PRIMARY KEY (entity_id, connection_group_id, permission); + +-- +-- Modify guacamole_sharing_profile_permission to use guacamole_entity instead +-- of guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_sharing_profile_permission ADD COLUMN entity_id int(11); + +-- Update guacamole_sharing_profile_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_sharing_profile_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_sharing_profile_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_sharing_profile_permission MODIFY entity_id int(11) NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_sharing_profile_permission + ADD CONSTRAINT guacamole_sharing_profile_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- Remove user_id column +ALTER TABLE guacamole_sharing_profile_permission DROP FOREIGN KEY guacamole_sharing_profile_permission_ibfk_2; +ALTER TABLE guacamole_sharing_profile_permission DROP PRIMARY KEY; +ALTER TABLE guacamole_sharing_profile_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_sharing_profile_permission + ADD PRIMARY KEY (entity_id, sharing_profile_id, permission); + +-- +-- Modify guacamole_user_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_user_permission ADD COLUMN entity_id int(11); + +-- Update guacamole_user_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_user_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_user_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_user_permission MODIFY entity_id int(11) NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_user_permission + ADD CONSTRAINT guacamole_user_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- Remove user_id column +ALTER TABLE guacamole_user_permission DROP FOREIGN KEY guacamole_user_permission_ibfk_2; +ALTER TABLE guacamole_user_permission DROP PRIMARY KEY; +ALTER TABLE guacamole_user_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_user_permission + ADD PRIMARY KEY (entity_id, affected_user_id, permission); + +-- +-- Modify guacamole_system_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_system_permission ADD COLUMN entity_id int(11); + +-- Update guacamole_system_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_system_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_system_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_system_permission MODIFY entity_id int(11) NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_system_permission + ADD CONSTRAINT guacamole_system_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- Remove user_id column +ALTER TABLE guacamole_system_permission DROP FOREIGN KEY guacamole_system_permission_ibfk_1; +ALTER TABLE guacamole_system_permission DROP PRIMARY KEY; +ALTER TABLE guacamole_system_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_system_permission + ADD PRIMARY KEY (entity_id, permission); + +-- +-- Table of arbitrary user attributes. Each attribute is simply a name/value +-- pair associated with a user. Arbitrary attributes are defined by other +-- extensions. Attributes defined by this extension will be mapped to +-- properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_attribute ( + + `user_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (user_id, attribute_name), + KEY `user_id` (`user_id`), + + CONSTRAINT guacamole_user_attribute_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary user group attributes. Each attribute is simply a +-- name/value pair associated with a user group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_group_attribute ( + + `user_group_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (`user_group_id`, `attribute_name`), + KEY `user_group_id` (`user_group_id`), + + CONSTRAINT `guacamole_user_group_attribute_ibfk_1` + FOREIGN KEY (`user_group_id`) + REFERENCES `guacamole_user_group` (`user_group_id`) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary connection attributes. Each attribute is simply a +-- name/value pair associated with a connection. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_attribute ( + + `connection_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (connection_id, attribute_name), + KEY `connection_id` (`connection_id`), + + CONSTRAINT guacamole_connection_attribute_ibfk_1 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary connection group attributes. Each attribute is simply a +-- name/value pair associated with a connection group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_group_attribute ( + + `connection_group_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (connection_group_id, attribute_name), + KEY `connection_group_id` (`connection_group_id`), + + CONSTRAINT guacamole_connection_group_attribute_ibfk_1 + FOREIGN KEY (connection_group_id) + REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table of arbitrary sharing profile attributes. Each attribute is simply a +-- name/value pair associated with a sharing profile. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_sharing_profile_attribute ( + + `sharing_profile_id` int(11) NOT NULL, + `attribute_name` varchar(128) NOT NULL, + `attribute_value` varchar(4096) NOT NULL, + + PRIMARY KEY (sharing_profile_id, attribute_name), + KEY `sharing_profile_id` (`sharing_profile_id`), + + CONSTRAINT guacamole_sharing_profile_attribute_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-1.6.0.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-1.6.0.sql new file mode 100644 index 0000000..3533e48 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/upgrade/upgrade-pre-1.6.0.sql @@ -0,0 +1,32 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new system-level permission +-- + +ALTER TABLE `guacamole_system_permission` + MODIFY `permission` enum('CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'AUDIT', + 'ADMINISTER') NOT NULL; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java new file mode 100644 index 0000000..1614cf3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderService; + +/** + * Provides a MySQL based implementation of the AuthenticationProvider + * functionality. + */ +public class MySQLAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new MySQLAuthenticationProvider that reads and writes + * authentication data to a MySQL database defined by properties in + * guacamole.properties. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public MySQLAuthenticationProvider() throws GuacamoleException { + super(new MySQLInjectorProvider(), JDBCAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "mysql"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProviderModule.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProviderModule.java new file mode 100644 index 0000000..0498380 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProviderModule.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql; + +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.name.Names; +import java.io.File; +import java.util.Properties; +import java.util.TimeZone; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.mysql.conf.MySQLDriver; +import org.apache.guacamole.auth.mysql.conf.MySQLEnvironment; +import org.apache.guacamole.auth.mysql.conf.MySQLSSLMode; +import org.apache.guacamole.properties.CaseSensitivity; +import org.mybatis.guice.datasource.helper.JdbcHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Guice module which configures MySQL-specific injections. + */ +public class MySQLAuthenticationProviderModule implements Module { + + /** + * Logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(MySQLAuthenticationProviderModule.class); + + /** + * MyBatis-specific configuration properties. + */ + private final Properties myBatisProperties = new Properties(); + + /** + * MySQL-specific driver configuration properties. + */ + private final Properties driverProperties = new Properties(); + + /** + * The MySQL-compatible driver that should be used to talk to the database + * server. + */ + private MySQLDriver mysqlDriver; + + /** + * Creates a new MySQL authentication provider module that configures + * driver and MyBatis properties using the given environment. + * + * @param environment + * The environment to use when configuring MyBatis and the underlying + * JDBC driver. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public MySQLAuthenticationProviderModule(MySQLEnvironment environment) + throws GuacamoleException { + + // Set the MySQL-specific properties for MyBatis. + myBatisProperties.setProperty("mybatis.environment.id", "guacamole"); + myBatisProperties.setProperty("JDBC.host", environment.getMySQLHostname()); + myBatisProperties.setProperty("JDBC.port", String.valueOf(environment.getMySQLPort())); + myBatisProperties.setProperty("JDBC.schema", environment.getMySQLDatabase()); + myBatisProperties.setProperty("JDBC.autoCommit", "false"); + myBatisProperties.setProperty("mybatis.pooled.pingEnabled", "true"); + myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1"); + + // Set whether public key retrieval from the server is allowed + driverProperties.setProperty("allowPublicKeyRetrieval", + environment.getMYSQLAllowPublicKeyRetrieval() ? "true" : "false"); + + // Use UTF-8 in database + driverProperties.setProperty("characterEncoding", "UTF-8"); + + // Allow use of multiple statements within a single query + driverProperties.setProperty("allowMultiQueries", "true"); + + // Set the SSL mode to use when conncting + MySQLSSLMode sslMode = environment.getMySQLSSLMode(); + driverProperties.setProperty("sslMode", sslMode.getDriverValue()); + + // For compatibility, set legacy useSSL property when SSL is disabled. + if (sslMode == MySQLSSLMode.DISABLED) + driverProperties.setProperty("useSSL", "false"); + // For compatibility, set legacy useSSL property when SSL is eisabled.(Required for mariadb connector/j) + else + driverProperties.setProperty("useSSL", "true"); + + // Check other SSL settings and set as required + File trustStore = environment.getMySQLSSLTrustStore(); + if (trustStore != null) + driverProperties.setProperty("trustCertificateKeyStoreUrl", + trustStore.toURI().toString()); + + String trustPassword = environment.getMySQLSSLTrustPassword(); + if (trustPassword != null) + driverProperties.setProperty("trustCertificateKeyStorePassword", + trustPassword); + + File clientStore = environment.getMySQLSSLClientStore(); + if (clientStore != null) + driverProperties.setProperty("clientCertificateKeyStoreUrl", + clientStore.toURI().toString()); + + String clientPassword = environment.getMYSQLSSLClientPassword(); + if (clientPassword != null) + driverProperties.setProperty("clientCertificateKeyStorePassword", + clientPassword); + + // Get the MySQL-compatible driver to use. + mysqlDriver = environment.getMySQLDriver(); + + // Set the path to the server public key, if any + // Note that the property name casing is slightly different for MySQL + // and MariaDB drivers. See + // https://dev.mysql.com/doc/connector-j/en/connector-j-connp-props-security.html#cj-conn-prop_serverRSAPublicKeyFile + // and https://mariadb.com/kb/en/about-mariadb-connector-j/#infrequently-used-parameters + String publicKeyFile = environment.getMYSQLServerRSAPublicKeyFile(); + if (publicKeyFile != null) + driverProperties.setProperty( + mysqlDriver == MySQLDriver.MYSQL + ? "serverRSAPublicKeyFile" : "serverRsaPublicKeyFile", + publicKeyFile); + + // If timezone is present, set it. + TimeZone serverTz = environment.getServerTimeZone(); + if (serverTz != null) + driverProperties.setProperty("serverTimezone", serverTz.getID()); + + // Check for case sensitivity and warn admin + if (environment.getCaseSensitivity() != CaseSensitivity.DISABLED) + LOGGER.warn("The MySQL module is currently configured to support " + + "case-sensitive username and/or group name comparisons, " + + "however, the default collations for MySQL databases do " + + "not support case-sensitive string comparisons. If you " + + "want identifiers within Guacamole to be treated as " + + "case-sensitive, further database configuration may be " + + "required."); + + } + + @Override + public void configure(Binder binder) { + + // Check which MySQL-compatible driver is in use + switch(mysqlDriver) { + + // Bind MySQL-specific properties + case MYSQL: + JdbcHelper.MySQL.configure(binder); + break; + + // Bind MariaDB-specific properties + case MARIADB: + JdbcHelper.MariaDB.configure(binder); + break; + + default: + throw new UnsupportedOperationException( + "A driver has been specified that is not supported by this module." + ); + } + + // Bind MyBatis properties + Names.bindProperties(binder, myBatisProperties); + + // Bind JDBC driver properties + binder.bind(Properties.class) + .annotatedWith(Names.named("JDBC.driverProperties")) + .toInstance(driverProperties); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java new file mode 100644 index 0000000..ec5fcc1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; +import org.apache.guacamole.auth.jdbc.JDBCInjectorProvider; +import org.apache.guacamole.auth.mysql.conf.MySQLEnvironment; + +/** + * JDBCInjectorProvider implementation which configures Guice injections for + * connecting to a MySQL database based on MySQL-specific options provided via + * guacamole.properties. + */ +public class MySQLInjectorProvider extends JDBCInjectorProvider { + + @Override + protected Injector create() throws GuacamoleException { + + // Get local environment + MySQLEnvironment environment = new MySQLEnvironment(); + + // Set up Guice injector + return Guice.createInjector( + new JDBCAuthenticationProviderModule(environment), + new MySQLAuthenticationProviderModule(environment) + ); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java new file mode 100644 index 0000000..11a6126 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.sharing.SharedAuthenticationProviderService; + +/** + * Provides a implementation of AuthenticationProvider which interacts with the + * MySQL AuthenticationProvider, accepting share keys as credentials and + * providing access to the shared connections. + */ +public class MySQLSharedAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new MySQLSharedAuthenticationProvider that provides access to + * shared connections exposed by the MySQLAuthenticationProvider. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public MySQLSharedAuthenticationProvider() throws GuacamoleException { + super(new MySQLInjectorProvider(), SharedAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "mysql-shared"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLDriver.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLDriver.java new file mode 100644 index 0000000..7ce915a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLDriver.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql.conf; + +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * The possible JDBC drivers to use when talking to a MySQL-compatible database + * server. + */ +public enum MySQLDriver { + + /** + * MySQL driver. + */ + @PropertyValue("mysql") + MYSQL("com.mysql.jdbc.Driver"), + + /** + * MariaDB driver. + */ + @PropertyValue("mariadb") + MARIADB("org.mariadb.jdbc.Driver"); + + /** + * The name of the JDBC driver class. + */ + private final String driverClass; + + /** + * Creates a new MySQLDriver that points to the given Java class as the + * entrypoint of the JDBC driver. + * + * @param classname + * The name of the JDBC driver class. + */ + private MySQLDriver(String classname) { + this.driverClass = classname; + } + + /** + * Returns whether this MySQL JDBC driver is installed and can be found + * within the Java classpath. + * + * @return + * true if this MySQL JDBC driver is installed, false otherwise. + */ + public boolean isInstalled() { + return JDBCEnvironment.isClassDefined(driverClass); + } + +} \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLEnvironment.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLEnvironment.java new file mode 100644 index 0000000..19abdbd --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLEnvironment.java @@ -0,0 +1,477 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql.conf; + +import java.io.File; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.util.TimeZone; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.session.SqlSession; + +/** + * A MySQL-specific implementation of JDBCEnvironment provides database + * properties specifically for MySQL. + */ +public class MySQLEnvironment extends JDBCEnvironment { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(MySQLEnvironment.class); + + /** + * The earliest version of MariaDB that supported recursive CTEs. + */ + private static final MySQLVersion MARIADB_SUPPORTS_CTE = new MySQLVersion(10, 2, 2, true); + + /** + * The earliest version of MySQL that supported recursive CTEs. + */ + private static final MySQLVersion MYSQL_SUPPORTS_CTE = new MySQLVersion(8, 0, 1, false); + + /** + * The default host to connect to, if MYSQL_HOSTNAME is not specified. + */ + private static final String DEFAULT_HOSTNAME = "localhost"; + + /** + * The default port to connect to, if MYSQL_PORT is not specified. + */ + private static final int DEFAULT_PORT = 3306; + + /** + * Whether a database user account is required by default for authentication + * to succeed. + */ + private static final boolean DEFAULT_USER_REQUIRED = false; + + /** + * The default value for the maximum number of connections to be + * allowed to the Guacamole server overall. + */ + private final int DEFAULT_ABSOLUTE_MAX_CONNECTIONS = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed per user to any one connection. + */ + private final int DEFAULT_MAX_CONNECTIONS_PER_USER = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed per user to any one connection group. + */ + private final int DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER = 1; + + /** + * The default value for the default maximum number of connections to be + * allowed to any one connection. + */ + private final int DEFAULT_MAX_CONNECTIONS = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed to any one connection group. + */ + private final int DEFAULT_MAX_GROUP_CONNECTIONS = 0; + + /** + * The default SSL mode for connecting to MySQL servers. + */ + private final MySQLSSLMode DEFAULT_SSL_MODE = MySQLSSLMode.PREFERRED; + + /** + * The default maximum number of identifiers/parameters to be included in a + * single batch when executing SQL statements for MySQL and MariaDB. + * + * MySQL and MariaDB impose a limit on the maximum size of a query, + * determined by the max_allowed_packet configuration variable. A value of + * 1000 is chosen to accommodate the max_allowed_packet limit without + * exceeding it. + * + * @see https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_allowed_packet + * @see https://mariadb.com/kb/en/server-system-variables/#max_allowed_packet + */ + private static final int DEFAULT_BATCH_SIZE = 1000; + + /** + * Constructs a new MySQLEnvironment, providing access to MySQL-specific + * configuration options. + * + * @throws GuacamoleException + * If an error occurs while setting up the underlying JDBCEnvironment + * or while parsing legacy MySQL configuration options. + */ + public MySQLEnvironment() throws GuacamoleException { + + // Init underlying JDBC environment + super(); + + } + + @Override + public boolean isUserRequired() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_USER_REQUIRED, + DEFAULT_USER_REQUIRED + ); + } + + @Override + public int getAbsoluteMaxConnections() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_ABSOLUTE_MAX_CONNECTIONS, + DEFAULT_ABSOLUTE_MAX_CONNECTIONS + ); + } + + @Override + public int getBatchSize() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_BATCH_SIZE, + DEFAULT_BATCH_SIZE + ); + } + + @Override + public int getDefaultMaxConnections() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_DEFAULT_MAX_CONNECTIONS, + DEFAULT_MAX_CONNECTIONS + ); + } + + @Override + public int getDefaultMaxGroupConnections() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_DEFAULT_MAX_GROUP_CONNECTIONS, + DEFAULT_MAX_GROUP_CONNECTIONS + ); + } + + @Override + public int getDefaultMaxConnectionsPerUser() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_DEFAULT_MAX_CONNECTIONS_PER_USER, + DEFAULT_MAX_CONNECTIONS_PER_USER + ); + } + + @Override + public int getDefaultMaxGroupConnectionsPerUser() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER, + DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER + ); + } + + @Override + public PasswordPolicy getPasswordPolicy() { + return new MySQLPasswordPolicy(this); + } + + /** + * Returns the MySQL driver that will be used to talk to the MySQL-compatible + * database server hosting the Guacamole database. If unspecified, the + * installed MySQL driver will be automatically detected by inspecting the + * classes available in the classpath. + * + * @return + * The MySQL driver that will be used to communicate with the MySQL- + * compatible server. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if no MySQL-compatible + * JDBC driver is present. + */ + public MySQLDriver getMySQLDriver() throws GuacamoleException { + + // Use any explicitly-specified driver + MySQLDriver driver = getProperty(MySQLGuacamoleProperties.MYSQL_DRIVER); + if (driver != null) + return driver; + + // Attempt autodetection based on presence of JDBC driver within + // classpath... + + if (MySQLDriver.MARIADB.isInstalled()) { + logger.info("Installed JDBC driver for MySQL/MariaDB detected as \"MariaDB Connector/J\"."); + return MySQLDriver.MARIADB; + } + + if (MySQLDriver.MYSQL.isInstalled()) { + logger.info("Installed JDBC driver for MySQL/MariaDB detected as \"MySQL Connector/J\"."); + return MySQLDriver.MYSQL; + } + + // No driver found at all + throw new GuacamoleServerException("No JDBC driver for MySQL/MariaDB is installed."); + + } + + /** + * Returns the hostname of the MySQL server hosting the Guacamole + * authentication tables. If unspecified, this will be "localhost". + * + * @return + * The URL of the MySQL server. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public String getMySQLHostname() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_HOSTNAME, + DEFAULT_HOSTNAME + ); + } + + /** + * Returns the port number of the MySQL server hosting the Guacamole + * authentication tables. If unspecified, this will be the default MySQL + * port of 3306. + * + * @return + * The port number of the MySQL server. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public int getMySQLPort() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_PORT, DEFAULT_PORT); + } + + /** + * Returns the name of the MySQL database containing the Guacamole + * authentication tables. + * + * @return + * The name of the MySQL database. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public String getMySQLDatabase() throws GuacamoleException { + return getRequiredProperty(MySQLGuacamoleProperties.MYSQL_DATABASE); + } + + @Override + public String getUsername() throws GuacamoleException { + return getRequiredProperty(MySQLGuacamoleProperties.MYSQL_USERNAME); + } + + @Override + public String getPassword() throws GuacamoleException { + return getRequiredProperty(MySQLGuacamoleProperties.MYSQL_PASSWORD); + } + + @Override + public boolean isRecursiveQuerySupported(SqlSession session) { + + // Retrieve database version string from JDBC connection + String versionString; + try { + Connection connection = session.getConnection(); + DatabaseMetaData metaData = connection.getMetaData(); + versionString = metaData.getDatabaseProductVersion(); + } + catch (SQLException e) { + throw new PersistenceException("Cannot determine whether " + + "MySQL / MariaDB supports recursive queries.", e); + } + + try { + + // Parse MySQL / MariaDB version from version string + MySQLVersion version = new MySQLVersion(versionString); + logger.debug("Database recognized as {}.", version); + + // Recursive queries are supported for MariaDB 10.2.2+ and + // MySQL 8.0.1+ + return version.isAtLeast(MARIADB_SUPPORTS_CTE) + || version.isAtLeast(MYSQL_SUPPORTS_CTE); + + } + catch (IllegalArgumentException e) { + logger.debug("Unrecognized MySQL / MariaDB version string: " + + "\"{}\". Assuming database engine does not support " + + "recursive queries.", session); + return false; + } + + } + + /** + * Return the MySQL SSL mode as configured in guacamole.properties, or the + * default value of PREFERRED if not configured. + * + * @return + * The SSL mode to use when connecting to the MySQL server. + * + * @throws GuacamoleException + * If an error occurs retrieving the property value. + */ + public MySQLSSLMode getMySQLSSLMode() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_SSL_MODE, + DEFAULT_SSL_MODE); + } + + /** + * Returns the File where the trusted certificate store is located as + * configured in guacamole.properties, or null if no value has been + * configured. The trusted certificate store is used to validate server + * certificates when making SSL connections to MySQL servers. + * + * @return + * The File where the trusted certificate store is located, or null + * if the value has not been configured. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public File getMySQLSSLTrustStore() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_SSL_TRUST_STORE); + } + + /** + * Returns the password used to access the trusted certificate store as + * configured in guacamole.properties, or null if no password has been + * specified. + * + * @return + * The password used to access the trusted certificate store. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getMySQLSSLTrustPassword() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_SSL_TRUST_PASSWORD); + } + + /** + * Returns the File used to store the client SSL certificate as configured + * in guacamole.properties, or null if no value has been specified. This + * file will be used to load the client certificate used for SSL connections + * to MySQL servers, if the SSL connection is so configured to require + * client certificate authentication. + * + * @return + * The File where the client SSL certificate is stored. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public File getMySQLSSLClientStore() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_SSL_CLIENT_STORE); + } + + /** + * Returns the password used to access the client certificate store as + * configured in guacamole.properties, or null if no value has been + * specified. + * + * @return + * The password used to access the client SSL certificate store. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getMYSQLSSLClientPassword() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_SSL_CLIENT_PASSWORD); + } + + @Override + public boolean autoCreateAbsentAccounts() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_AUTO_CREATE_ACCOUNTS, + false); + } + + /** + * Return the server timezone if configured in guacamole.properties, or + * null if the configuration option is not present. + * + * @return + * The server timezone as configured in guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs retrieving the configuration value. + */ + public TimeZone getServerTimeZone() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.SERVER_TIMEZONE); + } + + @Override + public boolean trackExternalConnectionHistory() throws GuacamoleException { + + // Track external connection history unless explicitly disabled + return getProperty(MySQLGuacamoleProperties.MYSQL_TRACK_EXTERNAL_CONNECTION_HISTORY, + true); + } + + @Override + public boolean enforceAccessWindowsForActiveSessions() throws GuacamoleException { + + // Enforce access window restrictions for active sessions unless explicitly disabled + return getProperty( + MySQLGuacamoleProperties.MYSQL_ENFORCE_ACCESS_WINDOWS_FOR_ACTIVE_SESSIONS, + true + ); + } + + /** + * Returns the absolute path to the public key for the server being connected to, + * if any, or null if the configuration property is unset. + * + * @return + * The absolute path to the public key for the server being connected to. + * + * @throws GuacamoleException + * If an error occurs retrieving the configuration value. + */ + public String getMYSQLServerRSAPublicKeyFile() throws GuacamoleException { + return getProperty(MySQLGuacamoleProperties.MYSQL_SERVER_RSA_PUBLIC_KEY_FILE); + } + + /** + * Returns true if the database server public key should be automatically + * retrieved from the MySQL server, or false otherwise. + * + * @return + * Whether the database server public key should be automatically + * retrieved from the MySQL server. + * + * @throws GuacamoleException + * If an error occurs retrieving the configuration value. + */ + public boolean getMYSQLAllowPublicKeyRetrieval() throws GuacamoleException { + return getProperty( + MySQLGuacamoleProperties.MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL, + false); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLGuacamoleProperties.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLGuacamoleProperties.java new file mode 100644 index 0000000..5f70bf1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLGuacamoleProperties.java @@ -0,0 +1,329 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql.conf; + +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.FileGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.properties.TimeZoneGuacamoleProperty; + +/** + * Properties used by the MySQL Authentication plugin. + */ +public class MySQLGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private MySQLGuacamoleProperties() {} + + /** + * The JDBC driver that should be used to talk to MySQL-compatible servers. + */ + public static final EnumGuacamoleProperty MYSQL_DRIVER = + new EnumGuacamoleProperty(MySQLDriver.class) { + + @Override + public String getName() { return "mysql-driver"; } + + }; + + /** + * The hostname of the MySQL server hosting the Guacamole authentication + * tables. + */ + public static final StringGuacamoleProperty MYSQL_HOSTNAME = new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-hostname"; } + + }; + + /** + * The port number of the MySQL server hosting the Guacamole authentication + * tables. + */ + public static final IntegerGuacamoleProperty MYSQL_PORT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-port"; } + + }; + + /** + * The name of the MySQL database containing the Guacamole authentication + * tables. + */ + public static final StringGuacamoleProperty MYSQL_DATABASE = new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-database"; } + + }; + + /** + * The username that should be used when authenticating with the MySQL + * database containing the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty MYSQL_USERNAME = new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-username"; } + + }; + + /** + * The password that should be used when authenticating with the MySQL + * database containing the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty MYSQL_PASSWORD = new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-password"; } + + }; + + /** + * Whether a user account within the database is required for authentication + * to succeed, even if the user has been authenticated via another + * authentication provider. + */ + public static final BooleanGuacamoleProperty MYSQL_USER_REQUIRED = new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-required"; } + + }; + + /** + * The maximum number of concurrent connections to allow overall. Zero + * denotes unlimited. + */ + public static final IntegerGuacamoleProperty + MYSQL_ABSOLUTE_MAX_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-absolute-max-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + MYSQL_DEFAULT_MAX_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-default-max-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection group. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + MYSQL_DEFAULT_MAX_GROUP_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-default-max-group-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection by an individual user. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + MYSQL_DEFAULT_MAX_CONNECTIONS_PER_USER = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-default-max-connections-per-user"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection group by an individual user. Zero denotes + * unlimited. + */ + public static final IntegerGuacamoleProperty + MYSQL_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-default-max-group-connections-per-user"; } + + }; + + /** + * The SSL mode used to connect to the MySQL Server. By default the driver + * will attempt SSL connections and fall back to plain-text if SSL fails. + */ + public static final EnumGuacamoleProperty MYSQL_SSL_MODE = + new EnumGuacamoleProperty(MySQLSSLMode.class) { + + @Override + public String getName() { return "mysql-ssl-mode" ; } + + }; + + /** + * The File where trusted SSL certificate authorities and server certificates + * are stored. By default no file is specified, and the default Java + * trusted certificate stores will be used. + */ + public static final FileGuacamoleProperty MYSQL_SSL_TRUST_STORE = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "mysql-ssl-trust-store"; } + + }; + + /** + * The password to use to access the mysql-ssl-trust-store, if required. By + * default no password will be used to attempt to access the store. + */ + public static final StringGuacamoleProperty MYSQL_SSL_TRUST_PASSWORD = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-ssl-trust-password"; } + + }; + + /** + * The File used to store the client certificate for configurations where + * a client certificate is required for authentication. By default no + * client certificate store will be specified. + */ + public static final FileGuacamoleProperty MYSQL_SSL_CLIENT_STORE = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "mysql-ssl-client-store"; } + + }; + + /** + * The password to use to access the mysql-ssl-client-store file. By + * default no password will be used to attempt to access the file. + */ + public static final StringGuacamoleProperty MYSQL_SSL_CLIENT_PASSWORD = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-ssl-client-password"; } + + }; + + /** + * Whether or not to automatically create accounts in the MySQL database for + * users who successfully authenticate through another extension. By default + * users will not be automatically created. + */ + public static final BooleanGuacamoleProperty MYSQL_AUTO_CREATE_ACCOUNTS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-auto-create-accounts"; } + }; + + /** + * The time zone of the MySQL database server. + */ + public static final TimeZoneGuacamoleProperty SERVER_TIMEZONE = + new TimeZoneGuacamoleProperty() { + + @Override + public String getName() { return "mysql-server-timezone"; } + + }; + + /** + * Whether or not to track connection history for connections that do not originate + * from within the MySQL database. By default, external connection history will be + * tracked. + */ + public static final BooleanGuacamoleProperty MYSQL_TRACK_EXTERNAL_CONNECTION_HISTORY = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-track-external-connection-history"; } + + }; + + /** + * Whether or not user-specific access time windows should be enforced for active sessions, + * i.e. whether users with active sessions should be logged out immediately when an access + * window closes. + */ + public static final BooleanGuacamoleProperty MYSQL_ENFORCE_ACCESS_WINDOWS_FOR_ACTIVE_SESSIONS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-enforce-access-windows-for-active-sessions"; } + + }; + + /** + * The maximum number of identifiers/parameters to be included in a single batch when + * executing SQL statements. + */ + public static final IntegerGuacamoleProperty MYSQL_BATCH_SIZE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-batch-size"; } + + }; + + /** + * The absolute path to the public key for the server being connected to, if any. + */ + public static final StringGuacamoleProperty MYSQL_SERVER_RSA_PUBLIC_KEY_FILE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "mysql-server-rsa-public-key-file"; } + + }; + + /** + * Whether or not the server public key should be automatically retreived from + * the MySQL server. + */ + public static final BooleanGuacamoleProperty MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-allow-public-key-retrieval"; } + + }; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLPasswordPolicy.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLPasswordPolicy.java new file mode 100644 index 0000000..69b4ec8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLPasswordPolicy.java @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql.conf; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; + +/** + * PasswordPolicy implementation which reads the details of the policy from + * MySQL-specific properties in guacamole.properties. + */ +public class MySQLPasswordPolicy implements PasswordPolicy { + + /** + * The property which specifies the minimum length required of all user + * passwords. By default, this will be zero. + */ + private static final IntegerGuacamoleProperty MIN_LENGTH = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-min-length"; } + + }; + + /** + * The property which specifies the minimum number of days which must + * elapse before a user may reset their password. If set to zero, the + * default, then this restriction does not apply. + */ + private static final IntegerGuacamoleProperty MIN_AGE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-min-age"; } + + }; + + /** + * The property which specifies the maximum number of days which may + * elapse before a user is required to reset their password. If set to zero, + * the default, then this restriction does not apply. + */ + private static final IntegerGuacamoleProperty MAX_AGE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-max-age"; } + + }; + + /** + * The property which specifies the number of previous passwords remembered + * for each user. If set to zero, the default, then this restriction does + * not apply. + */ + private static final IntegerGuacamoleProperty HISTORY_SIZE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-history-size"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one lowercase character and one uppercase character. By default, + * no such restriction is imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_MULTIPLE_CASE = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-require-multiple-case"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one numeric character (digit). By default, no such restriction is + * imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_DIGIT = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-require-digit"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one non-alphanumeric character (symbol). By default, no such + * restriction is imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_SYMBOL = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-require-symbol"; } + + }; + + /** + * The property which specifies whether users are prohibited from including + * their own username in their password. By default, no such restriction is + * imposed. + */ + private static final BooleanGuacamoleProperty PROHIBIT_USERNAME = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "mysql-user-password-prohibit-username"; } + + }; + + /** + * The Guacamole server environment. + */ + private final JDBCEnvironment environment; + + /** + * Creates a new MySQLPasswordPolicy which reads the details of the policy + * from the properties exposed by the given environment. + * + * @param environment + * The environment from which password policy properties should be + * read. + */ + public MySQLPasswordPolicy(JDBCEnvironment environment) { + this.environment = environment; + } + + @Override + public int getMinimumLength() throws GuacamoleException { + return environment.getProperty(MIN_LENGTH, 0); + } + + @Override + public int getMinimumAge() throws GuacamoleException { + return environment.getProperty(MIN_AGE, 0); + } + + @Override + public int getMaximumAge() throws GuacamoleException { + return environment.getProperty(MAX_AGE, 0); + } + + @Override + public int getHistorySize() throws GuacamoleException { + return environment.getProperty(HISTORY_SIZE, 0); + } + + @Override + public boolean isMultipleCaseRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_MULTIPLE_CASE, false); + } + + @Override + public boolean isNumericRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_DIGIT, false); + } + + @Override + public boolean isNonAlphanumericRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_SYMBOL, false); + } + + @Override + public boolean isUsernameProhibited() throws GuacamoleException { + return environment.getProperty(PROHIBIT_USERNAME, false); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLSSLMode.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLSSLMode.java new file mode 100644 index 0000000..72dcd31 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLSSLMode.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql.conf; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * Possible values for enabling SSL within the MySQL Driver. + */ +public enum MySQLSSLMode { + + /** + * Do not use SSL at all. + */ + @PropertyValue("disabled") + DISABLED("DISABLED"), + + /** + * Prefer SSL, but fall back to unencrypted. + */ + @PropertyValue("preferred") + PREFERRED("PREFERRED"), + + /** + * Require SSL, but perform no certificate validation. + */ + @PropertyValue("required") + REQUIRED("REQUIRED"), + + /** + * Require SSL, and validate server certificate issuer. + */ + @PropertyValue("verify-ca") + VERIFY_CA("VERIFY_CA"), + + /** + * Require SSL and validate both server certificate issuer and server + * identity. + */ + @PropertyValue("verify-identity") + VERIFY_IDENTITY("VERIFY_IDENTITY"); + + /** + * The value expected by and passed on to the JDBC driver for the given + * SSL operation mode. + */ + private final String driverValue; + + /** + * Create a new instance of this enum with the given driverValue as the + * value that will be used when configuring the JDBC driver. + * + * @param driverValue + * The value to use when configuring the JDBC driver. + */ + MySQLSSLMode(String driverValue) { + this.driverValue = driverValue; + } + + /** + * Returns the String value for a given Enum that properly configures the + * JDBC driver for the desired mode of SSL operation. + * + * @return + * The String value for the current Enum that configures the JDBC driver + * for the desired mode of SSL operation. + */ + public String getDriverValue() { + return driverValue; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLVersion.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLVersion.java new file mode 100644 index 0000000..2354d94 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/conf/MySQLVersion.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.mysql.conf; + +import com.google.common.collect.ComparisonChain; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * The specific version of a MySQL or MariaDB server. + */ +public class MySQLVersion { + + /** + * Pattern which matches the version string returned by a MariaDB server, + * extracting the major, minor, and patch numbers. + */ + private final Pattern MARIADB_VERSION = Pattern.compile("^.*-([0-9]+)\\.([0-9]+)\\.([0-9]+)-MariaDB$"); + + /** + * Pattern which matches the version string returned by a non-MariaDB + * server (including MySQL and Aurora), extracting the major, minor, and + * patch numbers. All non-MariaDB servers use normal MySQL version numbers. + */ + private final Pattern MYSQL_VERSION = Pattern.compile("^([0-9]+)\\.([0-9]+)\\.([0-9]+).*$"); + + /** + * Whether the associated server is a MariaDB server. All non-MariaDB + * servers use normal MySQL version numbers and are comparable against each + * other. + */ + private final boolean isMariaDB; + + /** + * The major component of the MAJOR.MINOR.PATCH version number. + */ + private final int major; + + /** + * The minor component of the MAJOR.MINOR.PATCH version number. + */ + private final int minor; + + /** + * The patch component of the MAJOR.MINOR.PATCH version number. + */ + private final int patch; + + /** + * Creates a new MySQLVersion having the specified major, minor, and patch + * components. + * + * @param major + * The major component of the MAJOR.MINOR.PATCH version number of the + * MariaDB / MySQL server. + * + * @param minor + * The minor component of the MAJOR.MINOR.PATCH version number of the + * MariaDB / MySQL server. + * + * @param patch + * The patch component of the MAJOR.MINOR.PATCH version number of the + * MariaDB / MySQL server. + * + * @param isMariaDB + * Whether the associated server is a MariaDB server. + */ + public MySQLVersion(int major, int minor, int patch, boolean isMariaDB) { + this.major = major; + this.minor = minor; + this.patch = patch; + this.isMariaDB = isMariaDB; + } + + public MySQLVersion(String version) throws IllegalArgumentException { + + // Extract MariaDB version number if version string appears to be + // a MariaDB version string + Matcher mariadb = MARIADB_VERSION.matcher(version); + if (mariadb.matches()) { + this.major = Integer.parseInt(mariadb.group(1)); + this.minor = Integer.parseInt(mariadb.group(2)); + this.patch = Integer.parseInt(mariadb.group(3)); + this.isMariaDB = true; + return; + } + + // If not MariaDB, assume version string is a MySQL version string + // and attempt to extract the version number + Matcher mysql = MYSQL_VERSION.matcher(version); + if (mysql.matches()) { + this.major = Integer.parseInt(mysql.group(1)); + this.minor = Integer.parseInt(mysql.group(2)); + this.patch = Integer.parseInt(mysql.group(3)); + this.isMariaDB = false; + return; + } + + throw new IllegalArgumentException("Unrecognized MySQL / MariaDB version string."); + + } + + /** + * Returns whether this version is at least as recent as the given version. + * + * @param version + * The version to compare against. + * + * @return + * true if the versions are associated with the same database server + * type (MariaDB vs. MySQL) and this version is at least as recent as + * the given version, false otherwise. + */ + public boolean isAtLeast(MySQLVersion version) { + + // If the databases use different version numbering schemes, the + // version numbers are not comparable + if (isMariaDB != version.isMariaDB) + return false; + + // Compare major, minor, and patch number in order of precedence + return ComparisonChain.start() + .compare(major, version.major) + .compare(minor, version.minor) + .compare(patch, version.patch) + .result() >= 0; + + } + + @Override + public String toString() { + return String.format("%s %d.%d.%d", isMariaDB ? "MariaDB" : "MySQL", + major, minor, patch); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/package-info.java new file mode 100644 index 0000000..e8fd5d6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The MySQL authentication provider. This package exists outside of + * org.apache for backwards-compatibility. + */ +package org.apache.guacamole.auth.mysql; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..1cd1ddf --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json @@ -0,0 +1,36 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "MySQL Authentication", + "namespace" : "mysql", + + "authProviders" : [ + "org.apache.guacamole.auth.mysql.MySQLAuthenticationProvider", + "org.apache.guacamole.auth.mysql.MySQLSharedAuthenticationProvider" + ], + + "css" : [ + "styles/jdbc.css" + ], + + "html" : [ + "html/shared-connection.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/es.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] + +} + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml new file mode 100644 index 0000000..2bffc27 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml @@ -0,0 +1,209 @@ + + + + + + + + + + ( + ${column} = ${entityID} + + OR ${column} IN ( + SELECT guacamole_entity.entity_id + FROM guacamole_entity + JOIN guacamole_user_group ON guacamole_user_group.entity_id = guacamole_entity.entity_id + WHERE + type = 'USER_GROUP' + AND + + + name IN + + #{effectiveGroup,jdbcType=VARCHAR} + + + + LOWER(name) IN + + LOWER(#{effectiveGroup,jdbcType=VARCHAR}) + + + + + AND disabled = false + ) + + ) + + + + + + + + + INSERT INTO guacamole_entity ( + name, + type + ) + VALUES ( + #{entity.identifier,jdbcType=VARCHAR}, + #{entity.entityType,jdbcType=VARCHAR} + ) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml new file mode 100644 index 0000000..ccbc19e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT connection_id + FROM guacamole_connection_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection + WHERE connection_id = #{identifier,jdbcType=VARCHAR} + + + + + + INSERT INTO guacamole_connection ( + connection_name, + parent_id, + protocol, + max_connections, + max_connections_per_user, + proxy_hostname, + proxy_port, + proxy_encryption_method, + connection_weight, + failover_only + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=VARCHAR}, + #{object.protocol,jdbcType=VARCHAR}, + #{object.maxConnections,jdbcType=INTEGER}, + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.proxyHostname,jdbcType=VARCHAR}, + #{object.proxyPort,jdbcType=INTEGER}, + #{object.proxyEncryptionMethod,jdbcType=VARCHAR}, + #{object.connectionWeight,jdbcType=INTEGER}, + #{object.failoverOnly,jdbcType=BOOLEAN} + ) + + + + + + UPDATE guacamole_connection + SET connection_name = #{object.name,jdbcType=VARCHAR}, + parent_id = #{object.parentIdentifier,jdbcType=VARCHAR}, + protocol = #{object.protocol,jdbcType=VARCHAR}, + max_connections = #{object.maxConnections,jdbcType=INTEGER}, + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + proxy_hostname = #{object.proxyHostname,jdbcType=VARCHAR}, + proxy_port = #{object.proxyPort,jdbcType=INTEGER}, + proxy_encryption_method = #{object.proxyEncryptionMethod,jdbcType=VARCHAR}, + connection_weight = #{object.connectionWeight,jdbcType=INTEGER}, + failover_only = #{object.failoverOnly,jdbcType=BOOLEAN} + WHERE connection_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM guacamole_connection_attribute + WHERE connection_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_connection_attribute ( + connection_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml new file mode 100644 index 0000000..ac128ff --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_parameter + WHERE connection_id = #{identifier,jdbcType=VARCHAR} + + + + + + INSERT INTO guacamole_connection_parameter ( + connection_id, + parameter_name, + parameter_value + ) + VALUES + + (#{parameter.connectionIdentifier,jdbcType=VARCHAR}, + #{parameter.name,jdbcType=VARCHAR}, + #{parameter.value,jdbcType=VARCHAR}) + + + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml new file mode 100644 index 0000000..c6e8784 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO guacamole_connection_history ( + connection_id, + connection_name, + remote_host, + sharing_profile_id, + sharing_profile_name, + user_id, + username, + start_date, + end_date + ) + VALUES ( + #{record.connectionIdentifier,jdbcType=VARCHAR}, + #{record.connectionName,jdbcType=VARCHAR}, + #{record.remoteHost,jdbcType=VARCHAR}, + #{record.sharingProfileIdentifier,jdbcType=VARCHAR}, + #{record.sharingProfileName,jdbcType=VARCHAR}, + (SELECT user_id FROM guacamole_user + JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id + WHERE + + + guacamole_entity.name = #{record.username,jdbcType=VARCHAR} + + + LOWER(guacamole_entity.name) = LOWER(#{record.username,jdbcType=VARCHAR}) + + + AND guacamole_entity.type = 'USER'), + #{record.username,jdbcType=VARCHAR}, + #{record.startDate,jdbcType=TIMESTAMP}, + #{record.endDate,jdbcType=TIMESTAMP} + ) + + + + + + UPDATE guacamole_connection_history + SET end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER} + + + + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml new file mode 100644 index 0000000..bf92810 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT connection_group_id + FROM guacamole_connection_group_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_group + WHERE connection_group_id = #{identifier,jdbcType=VARCHAR} + + + + + + INSERT INTO guacamole_connection_group ( + connection_group_name, + parent_id, + type, + max_connections, + max_connections_per_user, + enable_session_affinity + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=VARCHAR}, + #{object.type,jdbcType=VARCHAR}, + #{object.maxConnections,jdbcType=INTEGER}, + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} + ) + + + + + + UPDATE guacamole_connection_group + SET connection_group_name = #{object.name,jdbcType=VARCHAR}, + parent_id = #{object.parentIdentifier,jdbcType=VARCHAR}, + type = #{object.type,jdbcType=VARCHAR}, + max_connections = #{object.maxConnections,jdbcType=INTEGER}, + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + enable_session_affinity = #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} + WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM guacamole_connection_group_attribute + WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_connection_group_attribute ( + connection_group_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml new file mode 100644 index 0000000..b9ea640 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_group_permission + WHERE (entity_id, permission, connection_group_id) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + + + + + INSERT IGNORE INTO guacamole_connection_group_permission ( + entity_id, + permission, + connection_group_id + ) + VALUES + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml new file mode 100644 index 0000000..6066535 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_permission + WHERE (entity_id, permission, connection_id) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + + + + + INSERT IGNORE INTO guacamole_connection_permission ( + entity_id, + permission, + connection_id + ) + VALUES + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml new file mode 100644 index 0000000..e07b151 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_sharing_profile_permission + WHERE (entity_id, permission, sharing_profile_id) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + + + + + INSERT IGNORE INTO guacamole_sharing_profile_permission ( + entity_id, + permission, + sharing_profile_id + ) + VALUES + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml new file mode 100644 index 0000000..f34f95b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_system_permission + WHERE (entity_id, permission) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}) + + + + + + + + INSERT IGNORE INTO guacamole_system_permission ( + entity_id, + permission + ) + VALUES + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}) + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml new file mode 100644 index 0000000..fdc148b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_permission + USING guacamole_user_group_permission + JOIN guacamole_user_group affected_group ON guacamole_user_group_permission.affected_user_group_id = affected_group.user_group_id + JOIN guacamole_entity affected_entity ON affected_group.entity_id = affected_entity.entity_id + WHERE + affected_entity.type = 'USER_GROUP' + AND + + + (guacamole_user_group_permission.entity_id, permission, affected_entity.name) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + (guacamole_user_group_permission.entity_id, permission, LOWER(affected_entity.name)) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + LOWER(#{permission.objectIdentifier,jdbcType=VARCHAR})) + + + + + + + + + + INSERT IGNORE INTO guacamole_user_group_permission ( + entity_id, + permission, + affected_user_group_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + affected_group.user_group_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=VARCHAR} AS affected_name + + AS permissions + JOIN guacamole_entity affected_entity ON + affected_entity.type = 'USER_GROUP' + AND + + + affected_entity.name = permissions.affected_name + + + LOWER(affected_entity.name) = LOWER(permissions.affected_name) + + + JOIN guacamole_user_group affected_group ON affected_group.entity_id = affected_entity.entity_id + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml new file mode 100644 index 0000000..3dbc3b3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_permission + USING guacamole_user_permission + JOIN guacamole_user affected_user ON guacamole_user_permission.affected_user_id = affected_user.user_id + JOIN guacamole_entity affected_entity ON affected_user.entity_id = affected_entity.entity_id + WHERE + + + (guacamole_user_permission.entity_id, permission, affected_entity.name) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + (guacamole_user_permission.entity_id, permission, LOWER(affected_entity.name)) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}, + LOWER(#{permission.objectIdentifier,jdbcType=VARCHAR})) + + + + AND affected_entity.type = 'USER' + + + + + + + INSERT IGNORE INTO guacamole_user_permission ( + entity_id, + permission, + affected_user_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + affected_user.user_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=VARCHAR} AS affected_name + + AS permissions + JOIN guacamole_entity affected_entity ON + + + affected_entity.name = permissions.affected_name + + + LOWER(affected_entity.name) = LOWER(permissions.affected_name) + + + AND affected_entity.type = 'USER' + JOIN guacamole_user affected_user ON affected_user.entity_id = affected_entity.entity_id + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml new file mode 100644 index 0000000..4a9115c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT sharing_profile_id + FROM guacamole_sharing_profile_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM guacamole_sharing_profile + WHERE sharing_profile_id = #{identifier,jdbcType=VARCHAR} + + + + + + INSERT INTO guacamole_sharing_profile ( + sharing_profile_name, + primary_connection_id + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=VARCHAR} + ) + + + + + + UPDATE guacamole_sharing_profile + SET sharing_profile_name = #{object.name,jdbcType=VARCHAR}, + primary_connection_id = #{object.parentIdentifier,jdbcType=VARCHAR} + WHERE sharing_profile_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM guacamole_sharing_profile_attribute + WHERE sharing_profile_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_sharing_profile_attribute ( + sharing_profile_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml new file mode 100644 index 0000000..65c309f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_sharing_profile_parameter + WHERE sharing_profile_id = #{identifier,jdbcType=VARCHAR} + + + + + + INSERT INTO guacamole_sharing_profile_parameter ( + sharing_profile_id, + parameter_name, + parameter_value + ) + VALUES + + (#{parameter.sharingProfileIdentifier,jdbcType=VARCHAR}, + #{parameter.name,jdbcType=VARCHAR}, + #{parameter.value,jdbcType=VARCHAR}) + + + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml new file mode 100644 index 0000000..a475c7c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + INSERT INTO guacamole_user_password_history ( + user_id, + password_hash, + password_salt, + password_date + ) + VALUES ( + #{record.userID,jdbcType=INTEGER}, + #{record.passwordHash,jdbcType=BINARY}, + #{record.passwordSalt,jdbcType=BINARY}, + #{record.passwordDate,jdbcType=TIMESTAMP} + ); + + DELETE FROM guacamole_user_password_history + WHERE password_history_id <= ( + SELECT password_history_id + FROM ( + SELECT password_history_id + FROM guacamole_user_password_history + WHERE user_id = #{record.userID,jdbcType=INTEGER} + ORDER BY password_date DESC + LIMIT 1 OFFSET #{maxHistorySize} + ) old_password_record + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml new file mode 100644 index 0000000..07be80f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT guacamole_user_permission.affected_user_id + FROM guacamole_user_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM guacamole_entity + WHERE + + + name = #{identifier,jdbcType=VARCHAR} + + + LOWER(name) = LOWER(#{identifier,jdbcType=VARCHAR}) + + + AND type = 'USER' + + + + + + INSERT INTO guacamole_user ( + entity_id, + password_hash, + password_salt, + password_date, + disabled, + expired, + access_window_start, + access_window_end, + valid_from, + valid_until, + timezone, + full_name, + email_address, + organization, + organizational_role + ) + VALUES ( + #{object.entityID,jdbcType=VARCHAR}, + #{object.passwordHash,jdbcType=BINARY}, + #{object.passwordSalt,jdbcType=BINARY}, + #{object.passwordDate,jdbcType=TIMESTAMP}, + #{object.disabled,jdbcType=BOOLEAN}, + #{object.expired,jdbcType=BOOLEAN}, + #{object.accessWindowStart,jdbcType=TIME}, + #{object.accessWindowEnd,jdbcType=TIME}, + #{object.validFrom,jdbcType=DATE}, + #{object.validUntil,jdbcType=DATE}, + #{object.timeZone,jdbcType=VARCHAR}, + #{object.fullName,jdbcType=VARCHAR}, + #{object.emailAddress,jdbcType=VARCHAR}, + #{object.organization,jdbcType=VARCHAR}, + #{object.organizationalRole,jdbcType=VARCHAR} + ) + + + + + + UPDATE guacamole_user + SET password_hash = #{object.passwordHash,jdbcType=BINARY}, + password_salt = #{object.passwordSalt,jdbcType=BINARY}, + password_date = #{object.passwordDate,jdbcType=TIMESTAMP}, + disabled = #{object.disabled,jdbcType=BOOLEAN}, + expired = #{object.expired,jdbcType=BOOLEAN}, + access_window_start = #{object.accessWindowStart,jdbcType=TIME}, + access_window_end = #{object.accessWindowEnd,jdbcType=TIME}, + valid_from = #{object.validFrom,jdbcType=DATE}, + valid_until = #{object.validUntil,jdbcType=DATE}, + timezone = #{object.timeZone,jdbcType=VARCHAR}, + full_name = #{object.fullName,jdbcType=VARCHAR}, + email_address = #{object.emailAddress,jdbcType=VARCHAR}, + organization = #{object.organization,jdbcType=VARCHAR}, + organizational_role = #{object.organizationalRole,jdbcType=VARCHAR} + WHERE user_id = #{object.objectID,jdbcType=VARCHAR} + + + + + DELETE FROM guacamole_user_attribute + WHERE user_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_user_attribute ( + user_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml new file mode 100644 index 0000000..1624dfa --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_user_group_member + JOIN guacamole_user_group ON guacamole_user_group.user_group_id = guacamole_user_group_member.user_group_id + JOIN guacamole_entity ON guacamole_entity.entity_id = guacamole_user_group.entity_id + WHERE + member_entity_id = #{parent.entityID,jdbcType=INTEGER} + AND guacamole_entity.type = 'USER_GROUP' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + guacamole_user_group.user_group_id, + #{parent.entityID,jdbcType=INTEGER} + FROM guacamole_user_group + JOIN guacamole_entity ON guacamole_user_group.entity_id = guacamole_entity.entity_id + WHERE + guacamole_entity.type = 'USER_GROUP' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier} + + + LOWER(#{identifier}) + + + + AND guacamole_user_group.user_group_id NOT IN ( + SELECT guacamole_user_group_member.user_group_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.member_entity_id = #{parent.entityID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml new file mode 100644 index 0000000..a070a3a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + INSERT INTO guacamole_user_history ( + remote_host, + user_id, + username, + start_date, + end_date + ) + VALUES ( + #{record.remoteHost,jdbcType=VARCHAR}, + (SELECT user_id FROM guacamole_user + JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id + WHERE + + + guacamole_entity.name = #{record.username,jdbcType=VARCHAR} + + + LOWER(guacamole_entity.name) = LOWER(#{record.username,jdbcType=VARCHAR}) + + + AND guacamole_entity.type = 'USER'), + #{record.username,jdbcType=VARCHAR}, + #{record.startDate,jdbcType=TIMESTAMP}, + #{record.endDate,jdbcType=TIMESTAMP} + ) + + + + + + UPDATE guacamole_user_history + SET end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER} + + + + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml new file mode 100644 index 0000000..1c521e8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT guacamole_user_group_permission.affected_user_group_id + FROM guacamole_user_group_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM guacamole_entity + WHERE + type = 'USER_GROUP' + + + name = #{identifier,jdbcType=VARCHAR} + + + LOWER(name) = LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user_group ( + entity_id, + disabled + ) + VALUES ( + #{object.entityID,jdbcType=VARCHAR}, + #{object.disabled,jdbcType=BOOLEAN} + ) + + + + + + UPDATE guacamole_user_group + SET disabled = #{object.disabled,jdbcType=BOOLEAN} + WHERE user_group_id = #{object.objectID,jdbcType=VARCHAR} + + + + + DELETE FROM guacamole_user_group_attribute + WHERE user_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_user_group_attribute ( + user_group_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml new file mode 100644 index 0000000..e589a85 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_user_group_member + JOIN guacamole_entity ON guacamole_entity.entity_id = member_entity_id + WHERE + user_group_id = #{parent.objectID,jdbcType=INTEGER} + AND guacamole_entity.type = 'USER_GROUP' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + #{parent.objectID,jdbcType=INTEGER}, + guacamole_entity.entity_id + FROM guacamole_entity + WHERE + guacamole_entity.type = 'USER_GROUP' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier} + + + LOWER(#{identifier}) + + + + AND guacamole_entity.entity_id NOT IN ( + SELECT guacamole_user_group_member.member_entity_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.user_group_id = #{parent.objectID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml new file mode 100644 index 0000000..776059c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_user_group_member + JOIN guacamole_entity ON guacamole_entity.entity_id = member_entity_id + WHERE + user_group_id = #{parent.objectID,jdbcType=INTEGER} + AND guacamole_entity.type = 'USER' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + #{parent.objectID,jdbcType=INTEGER}, + guacamole_entity.entity_id + FROM guacamole_entity + WHERE + guacamole_entity.type = 'USER' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + AND guacamole_entity.entity_id NOT IN ( + SELECT guacamole_user_group_member.member_entity_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.user_group_id = #{parent.objectID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml new file mode 100644 index 0000000..531a4e5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_user_group_member + JOIN guacamole_user_group ON guacamole_user_group.user_group_id = guacamole_user_group_member.user_group_id + JOIN guacamole_entity ON guacamole_entity.entity_id = guacamole_user_group.entity_id + WHERE + member_entity_id = #{parent.entityID,jdbcType=INTEGER} + AND guacamole_entity.type = 'USER_GROUP' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + guacamole_user_group.user_group_id, + #{parent.entityID,jdbcType=INTEGER} + FROM guacamole_user_group + JOIN guacamole_entity ON guacamole_user_group.entity_id = guacamole_entity.entity_id + WHERE + guacamole_entity.type = 'USER_GROUP' + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + AND guacamole_user_group.user_group_id NOT IN ( + SELECT guacamole_user_group_member.user_group_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.member_entity_id = #{parent.entityID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/.gitignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/.ratignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/pom.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/pom.xml new file mode 100644 index 0000000..5d3129b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/pom.xml @@ -0,0 +1,57 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-jdbc-postgresql + jar + guacamole-auth-jdbc-postgresql + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-jdbc + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + provided + + + + + org.apache.guacamole + guacamole-auth-jdbc-base + 1.6.0 + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql new file mode 100644 index 0000000..134215d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql @@ -0,0 +1,737 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Connection group types +-- + +CREATE TYPE guacamole_connection_group_type AS ENUM( + 'ORGANIZATIONAL', + 'BALANCING' +); + +-- +-- Entity types +-- + +CREATE TYPE guacamole_entity_type AS ENUM( + 'USER', + 'USER_GROUP' +); + +-- +-- Object permission types +-- + +CREATE TYPE guacamole_object_permission_type AS ENUM( + 'READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER' +); + +-- +-- System permission types +-- + +CREATE TYPE guacamole_system_permission_type AS ENUM( + 'CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'AUDIT', + 'ADMINISTER' +); + +-- +-- Guacamole proxy (guacd) encryption methods +-- + +CREATE TYPE guacamole_proxy_encryption_method AS ENUM( + 'NONE', + 'SSL' +); + +-- +-- Table of connection groups. Each connection group has a name. +-- + +CREATE TABLE guacamole_connection_group ( + + connection_group_id serial NOT NULL, + parent_id integer, + connection_group_name varchar(128) NOT NULL, + type guacamole_connection_group_type + NOT NULL DEFAULT 'ORGANIZATIONAL', + + -- Concurrency limits + max_connections integer, + max_connections_per_user integer, + enable_session_affinity boolean NOT NULL DEFAULT FALSE, + + PRIMARY KEY (connection_group_id), + + CONSTRAINT connection_group_name_parent + UNIQUE (connection_group_name, parent_id), + + CONSTRAINT guacamole_connection_group_ibfk_1 + FOREIGN KEY (parent_id) + REFERENCES guacamole_connection_group (connection_group_id) + ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_group_parent_id + ON guacamole_connection_group(parent_id); + +-- +-- Table of connections. Each connection has a name, protocol, and +-- associated set of parameters. +-- A connection may belong to a connection group. +-- + +CREATE TABLE guacamole_connection ( + + connection_id serial NOT NULL, + connection_name varchar(128) NOT NULL, + parent_id integer, + protocol varchar(32) NOT NULL, + + -- Concurrency limits + max_connections integer, + max_connections_per_user integer, + + -- Connection Weight + connection_weight integer, + failover_only boolean NOT NULL DEFAULT FALSE, + + -- Guacamole proxy (guacd) overrides + proxy_port integer, + proxy_hostname varchar(512), + proxy_encryption_method guacamole_proxy_encryption_method, + + PRIMARY KEY (connection_id), + + CONSTRAINT connection_name_parent + UNIQUE (connection_name, parent_id), + + CONSTRAINT guacamole_connection_ibfk_1 + FOREIGN KEY (parent_id) + REFERENCES guacamole_connection_group (connection_group_id) + ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_parent_id + ON guacamole_connection(parent_id); + +-- +-- Table of base entities which may each be either a user or user group. Other +-- tables which represent qualities shared by both users and groups will point +-- to guacamole_entity, while tables which represent qualities specific to +-- users or groups will point to guacamole_user or guacamole_user_group. +-- + +CREATE TABLE guacamole_entity ( + + entity_id serial NOT NULL, + name varchar(128) NOT NULL, + type guacamole_entity_type NOT NULL, + + PRIMARY KEY (entity_id), + + CONSTRAINT guacamole_entity_name_scope + UNIQUE (type, name) + +); + +-- +-- Table of users. Each user has a unique username and a hashed password +-- with corresponding salt. Although the authentication system will always set +-- salted passwords, other systems may set unsalted passwords by simply not +-- providing the salt. +-- + +CREATE TABLE guacamole_user ( + + user_id serial NOT NULL, + entity_id integer NOT NULL, + + -- Optionally-salted password + password_hash bytea NOT NULL, + password_salt bytea, + password_date timestamptz NOT NULL, + + -- Account disabled/expired status + disabled boolean NOT NULL DEFAULT FALSE, + expired boolean NOT NULL DEFAULT FALSE, + + -- Time-based access restriction + access_window_start time, + access_window_end time, + + -- Date-based access restriction + valid_from date, + valid_until date, + + -- Timezone used for all date/time comparisons and interpretation + timezone varchar(64), + + -- Profile information + full_name varchar(256), + email_address varchar(256), + organization varchar(256), + organizational_role varchar(256), + + PRIMARY KEY (user_id), + + CONSTRAINT guacamole_user_single_entity + UNIQUE (entity_id), + + CONSTRAINT guacamole_user_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE + +); + +-- +-- Table of user groups. Each user group may have an arbitrary set of member +-- users and member groups, with those members inheriting the permissions +-- granted to that group. +-- + +CREATE TABLE guacamole_user_group ( + + user_group_id serial NOT NULL, + entity_id integer NOT NULL, + + -- Group disabled status + disabled boolean NOT NULL DEFAULT FALSE, + + PRIMARY KEY (user_group_id), + + CONSTRAINT guacamole_user_group_single_entity + UNIQUE (entity_id), + + CONSTRAINT guacamole_user_group_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE + +); + +-- +-- Table of users which are members of given user groups. +-- + +CREATE TABLE guacamole_user_group_member ( + + user_group_id integer NOT NULL, + member_entity_id integer NOT NULL, + + PRIMARY KEY (user_group_id, member_entity_id), + + -- Parent must be a user group + CONSTRAINT guacamole_user_group_member_parent + FOREIGN KEY (user_group_id) + REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE, + + -- Member may be either a user or a user group (any entity) + CONSTRAINT guacamole_user_group_member_entity + FOREIGN KEY (member_entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +-- +-- Table of sharing profiles. Each sharing profile has a name, associated set +-- of parameters, and a primary connection. The primary connection is the +-- connection that the sharing profile shares, and the parameters dictate the +-- restrictions/features which apply to the user joining the connection via the +-- sharing profile. +-- + +CREATE TABLE guacamole_sharing_profile ( + + sharing_profile_id serial NOT NULL, + sharing_profile_name varchar(128) NOT NULL, + primary_connection_id integer NOT NULL, + + PRIMARY KEY (sharing_profile_id), + + CONSTRAINT sharing_profile_name_primary + UNIQUE (sharing_profile_name, primary_connection_id), + + CONSTRAINT guacamole_sharing_profile_ibfk_1 + FOREIGN KEY (primary_connection_id) + REFERENCES guacamole_connection (connection_id) + ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_primary_connection_id + ON guacamole_sharing_profile(primary_connection_id); + +-- +-- Table of connection parameters. Each parameter is simply a name/value pair +-- associated with a connection. +-- + +CREATE TABLE guacamole_connection_parameter ( + + connection_id integer NOT NULL, + parameter_name varchar(128) NOT NULL, + parameter_value varchar(4096) NOT NULL, + + PRIMARY KEY (connection_id,parameter_name), + + CONSTRAINT guacamole_connection_parameter_ibfk_1 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_parameter_connection_id + ON guacamole_connection_parameter(connection_id); + +-- +-- Table of sharing profile parameters. Each parameter is simply +-- name/value pair associated with a sharing profile. These parameters dictate +-- the restrictions/features which apply to the user joining the associated +-- connection via the sharing profile. +-- + +CREATE TABLE guacamole_sharing_profile_parameter ( + + sharing_profile_id integer NOT NULL, + parameter_name varchar(128) NOT NULL, + parameter_value varchar(4096) NOT NULL, + + PRIMARY KEY (sharing_profile_id, parameter_name), + + CONSTRAINT guacamole_sharing_profile_parameter_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_parameter_sharing_profile_id + ON guacamole_sharing_profile_parameter(sharing_profile_id); + +-- +-- Table of arbitrary user attributes. Each attribute is simply a name/value +-- pair associated with a user. Arbitrary attributes are defined by other +-- extensions. Attributes defined by this extension will be mapped to +-- properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_attribute ( + + user_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (user_id, attribute_name), + + CONSTRAINT guacamole_user_attribute_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_attribute_user_id + ON guacamole_user_attribute(user_id); + +-- +-- Table of arbitrary user group attributes. Each attribute is simply a +-- name/value pair associated with a user group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_group_attribute ( + + user_group_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (user_group_id, attribute_name), + + CONSTRAINT guacamole_user_group_attribute_ibfk_1 + FOREIGN KEY (user_group_id) + REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_group_attribute_user_group_id + ON guacamole_user_group_attribute(user_group_id); + +-- +-- Table of arbitrary connection attributes. Each attribute is simply a +-- name/value pair associated with a connection. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_attribute ( + + connection_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (connection_id, attribute_name), + + CONSTRAINT guacamole_connection_attribute_ibfk_1 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_attribute_connection_id + ON guacamole_connection_attribute(connection_id); + +-- +-- Table of arbitrary connection group attributes. Each attribute is simply a +-- name/value pair associated with a connection group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_group_attribute ( + + connection_group_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (connection_group_id, attribute_name), + + CONSTRAINT guacamole_connection_group_attribute_ibfk_1 + FOREIGN KEY (connection_group_id) + REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_group_attribute_connection_group_id + ON guacamole_connection_group_attribute(connection_group_id); + +-- +-- Table of arbitrary sharing profile attributes. Each attribute is simply a +-- name/value pair associated with a sharing profile. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_sharing_profile_attribute ( + + sharing_profile_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (sharing_profile_id, attribute_name), + + CONSTRAINT guacamole_sharing_profile_attribute_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_attribute_sharing_profile_id + ON guacamole_sharing_profile_attribute(sharing_profile_id); + +-- +-- Table of connection permissions. Each connection permission grants a user or +-- user group specific access to a connection. +-- + +CREATE TABLE guacamole_connection_permission ( + + entity_id integer NOT NULL, + connection_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (entity_id, connection_id, permission), + + CONSTRAINT guacamole_connection_permission_ibfk_1 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_connection_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_permission_connection_id + ON guacamole_connection_permission(connection_id); + +CREATE INDEX guacamole_connection_permission_entity_id + ON guacamole_connection_permission(entity_id); + +-- +-- Table of connection group permissions. Each group permission grants a user +-- or user group specific access to a connection group. +-- + +CREATE TABLE guacamole_connection_group_permission ( + + entity_id integer NOT NULL, + connection_group_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (entity_id, connection_group_id, permission), + + CONSTRAINT guacamole_connection_group_permission_ibfk_1 + FOREIGN KEY (connection_group_id) + REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_connection_group_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_group_permission_connection_group_id + ON guacamole_connection_group_permission(connection_group_id); + +CREATE INDEX guacamole_connection_group_permission_entity_id + ON guacamole_connection_group_permission(entity_id); + +-- +-- Table of sharing profile permissions. Each sharing profile permission grants +-- a user or user group specific access to a sharing profile. +-- + +CREATE TABLE guacamole_sharing_profile_permission ( + + entity_id integer NOT NULL, + sharing_profile_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (entity_id, sharing_profile_id, permission), + + CONSTRAINT guacamole_sharing_profile_permission_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_sharing_profile_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_permission_sharing_profile_id + ON guacamole_sharing_profile_permission(sharing_profile_id); + +CREATE INDEX guacamole_sharing_profile_permission_entity_id + ON guacamole_sharing_profile_permission(entity_id); + +-- +-- Table of system permissions. Each system permission grants a user or user +-- group a system-level privilege of some kind. +-- + +CREATE TABLE guacamole_system_permission ( + + entity_id integer NOT NULL, + permission guacamole_system_permission_type NOT NULL, + + PRIMARY KEY (entity_id, permission), + + CONSTRAINT guacamole_system_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_system_permission_entity_id + ON guacamole_system_permission(entity_id); + +-- +-- Table of user permissions. Each user permission grants a user or user group +-- access to another user (the "affected" user) for a specific type of +-- operation. +-- + +CREATE TABLE guacamole_user_permission ( + + entity_id integer NOT NULL, + affected_user_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (entity_id, affected_user_id, permission), + + CONSTRAINT guacamole_user_permission_ibfk_1 + FOREIGN KEY (affected_user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_user_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_permission_affected_user_id + ON guacamole_user_permission(affected_user_id); + +CREATE INDEX guacamole_user_permission_entity_id + ON guacamole_user_permission(entity_id); + +-- +-- Table of user group permissions. Each user group permission grants a user +-- or user group access to a another user group (the "affected" user group) for +-- a specific type of operation. +-- + +CREATE TABLE guacamole_user_group_permission ( + + entity_id integer NOT NULL, + affected_user_group_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (entity_id, affected_user_group_id, permission), + + CONSTRAINT guacamole_user_group_permission_affected_user_group + FOREIGN KEY (affected_user_group_id) + REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_user_group_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_group_permission_affected_user_group_id + ON guacamole_user_group_permission(affected_user_group_id); + +CREATE INDEX guacamole_user_group_permission_entity_id + ON guacamole_user_group_permission(entity_id); + +-- +-- Table of connection history records. Each record defines a specific user's +-- session, including the connection used, the start time, and the end time +-- (if any). +-- + +CREATE TABLE guacamole_connection_history ( + + history_id serial NOT NULL, + user_id integer DEFAULT NULL, + username varchar(128) NOT NULL, + remote_host varchar(256) DEFAULT NULL, + connection_id integer DEFAULT NULL, + connection_name varchar(128) NOT NULL, + sharing_profile_id integer DEFAULT NULL, + sharing_profile_name varchar(128) DEFAULT NULL, + start_date timestamptz NOT NULL, + end_date timestamptz DEFAULT NULL, + + PRIMARY KEY (history_id), + + CONSTRAINT guacamole_connection_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL, + + CONSTRAINT guacamole_connection_history_ibfk_2 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE SET NULL, + + CONSTRAINT guacamole_connection_history_ibfk_3 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE SET NULL + +); + +CREATE INDEX guacamole_connection_history_user_id + ON guacamole_connection_history(user_id); + +CREATE INDEX guacamole_connection_history_connection_id + ON guacamole_connection_history(connection_id); + +CREATE INDEX guacamole_connection_history_sharing_profile_id + ON guacamole_connection_history(sharing_profile_id); + +CREATE INDEX guacamole_connection_history_start_date + ON guacamole_connection_history(start_date); + +CREATE INDEX guacamole_connection_history_end_date + ON guacamole_connection_history(end_date); + +CREATE INDEX guacamole_connection_history_connection_id_start_date + ON guacamole_connection_history(connection_id, start_date); + +-- +-- User login/logout history +-- + +CREATE TABLE guacamole_user_history ( + + history_id serial NOT NULL, + user_id integer DEFAULT NULL, + username varchar(128) NOT NULL, + remote_host varchar(256) DEFAULT NULL, + start_date timestamptz NOT NULL, + end_date timestamptz DEFAULT NULL, + + PRIMARY KEY (history_id), + + CONSTRAINT guacamole_user_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL + +); + +CREATE INDEX guacamole_user_history_user_id + ON guacamole_user_history(user_id); + +CREATE INDEX guacamole_user_history_start_date + ON guacamole_user_history(start_date); + +CREATE INDEX guacamole_user_history_end_date + ON guacamole_user_history(end_date); + +CREATE INDEX guacamole_user_history_user_id_start_date + ON guacamole_user_history(user_id, start_date); + +-- +-- User password history +-- + +CREATE TABLE guacamole_user_password_history ( + + password_history_id serial NOT NULL, + user_id integer NOT NULL, + + -- Salted password + password_hash bytea NOT NULL, + password_salt bytea, + password_date timestamptz NOT NULL, + + PRIMARY KEY (password_history_id), + + CONSTRAINT guacamole_user_password_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_password_history_user_id + ON guacamole_user_password_history(user_id); + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/002-create-admin-user.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/002-create-admin-user.sql new file mode 100644 index 0000000..3a58771 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/002-create-admin-user.sql @@ -0,0 +1,56 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- Create default user "guacadmin" with password "guacadmin" +INSERT INTO guacamole_entity (name, type) VALUES ('guacadmin', 'USER'); +INSERT INTO guacamole_user (entity_id, password_hash, password_salt, password_date) +SELECT + entity_id, + decode('CA458A7D494E3BE824F5E1E175A1556C0F8EEF2C2D7DF3633BEC4A29C4411960', 'hex'), -- 'guacadmin' + decode('FE24ADC5E11E2B25288D1704ABE67A79E342ECC26064CE69C5B3177795A82264', 'hex'), + CURRENT_TIMESTAMP +FROM guacamole_entity WHERE name = 'guacadmin' AND guacamole_entity.type = 'USER'; + +-- Grant this user all system permissions +INSERT INTO guacamole_system_permission (entity_id, permission) +SELECT entity_id, permission::guacamole_system_permission_type +FROM ( + VALUES + ('guacadmin', 'CREATE_CONNECTION'), + ('guacadmin', 'CREATE_CONNECTION_GROUP'), + ('guacadmin', 'CREATE_SHARING_PROFILE'), + ('guacadmin', 'CREATE_USER'), + ('guacadmin', 'CREATE_USER_GROUP'), + ('guacadmin', 'ADMINISTER') +) permissions (username, permission) +JOIN guacamole_entity ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER'; + +-- Grant admin permission to read/update/administer self +INSERT INTO guacamole_user_permission (entity_id, affected_user_id, permission) +SELECT guacamole_entity.entity_id, guacamole_user.user_id, permission::guacamole_object_permission_type +FROM ( + VALUES + ('guacadmin', 'guacadmin', 'READ'), + ('guacadmin', 'guacadmin', 'UPDATE'), + ('guacadmin', 'guacadmin', 'ADMINISTER') +) permissions (username, affected_username, permission) +JOIN guacamole_entity ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER' +JOIN guacamole_entity affected ON permissions.affected_username = affected.name AND guacamole_entity.type = 'USER' +JOIN guacamole_user ON guacamole_user.entity_id = affected.entity_id; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql new file mode 100644 index 0000000..9e41204 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql @@ -0,0 +1,196 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- User and connection IDs within history table can now be null +-- + +ALTER TABLE guacamole_connection_history + ALTER COLUMN user_id SET DEFAULT NULL, + ALTER COLUMN user_id DROP NOT NULL; + +ALTER TABLE guacamole_connection_history + ALTER COLUMN connection_id SET DEFAULT NULL, + ALTER COLUMN connection_id DROP NOT NULL; + +-- +-- Add new username and connection_name columns to history table +-- + +ALTER TABLE guacamole_connection_history + ADD COLUMN username varchar(128); + +ALTER TABLE guacamole_connection_history + ADD COLUMN connection_name varchar(128); + +-- +-- Populate new name columns by joining corresponding tables +-- + +UPDATE guacamole_connection_history + SET username = guacamole_user.username + FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_connection_history.user_id; + +UPDATE guacamole_connection_history + SET connection_name = guacamole_connection.connection_name + FROM guacamole_connection + WHERE guacamole_connection.connection_id = + guacamole_connection_history.connection_id; + +-- +-- Set NOT NULL now that the column is fully populated +-- + +ALTER TABLE guacamole_connection_history + ALTER COLUMN username SET NOT NULL; + +ALTER TABLE guacamole_connection_history + ALTER COLUMN connection_name SET NOT NULL; + +-- +-- Remove old foreign key constraints with ON DELETE CASCADE +-- + +ALTER TABLE guacamole_connection_history + DROP CONSTRAINT guacamole_connection_history_ibfk_1; + +ALTER TABLE guacamole_connection_history + DROP CONSTRAINT guacamole_connection_history_ibfk_2; + +-- +-- Recreate foreign key constraints with ON DELETE SET NULL +-- + +ALTER TABLE guacamole_connection_history + ADD CONSTRAINT guacamole_connection_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL; + +ALTER TABLE guacamole_connection_history + ADD CONSTRAINT guacamole_connection_history_ibfk_2 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE SET NULL; + +-- +-- Add session affinity column +-- + +ALTER TABLE guacamole_connection_group + ADD COLUMN enable_session_affinity boolean NOT NULL DEFAULT FALSE; + +-- +-- Add new system-level permission +-- + +ALTER TYPE guacamole_system_permission_type + ADD VALUE 'CREATE_SHARING_PROFILE' + AFTER 'CREATE_CONNECTION_GROUP'; + +-- +-- Add sharing profile table +-- + +CREATE TABLE guacamole_sharing_profile ( + + sharing_profile_id serial NOT NULL, + sharing_profile_name varchar(128) NOT NULL, + primary_connection_id integer NOT NULL, + + PRIMARY KEY (sharing_profile_id), + + CONSTRAINT sharing_profile_name_primary + UNIQUE (sharing_profile_name, primary_connection_id), + + CONSTRAINT guacamole_sharing_profile_ibfk_1 + FOREIGN KEY (primary_connection_id) + REFERENCES guacamole_connection (connection_id) + ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_primary_connection_id + ON guacamole_sharing_profile(primary_connection_id); + +-- +-- Add table of sharing profile parameters +-- + +CREATE TABLE guacamole_sharing_profile_parameter ( + + sharing_profile_id integer NOT NULL, + parameter_name varchar(128) NOT NULL, + parameter_value varchar(4096) NOT NULL, + + PRIMARY KEY (sharing_profile_id, parameter_name), + + CONSTRAINT guacamole_sharing_profile_parameter_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_parameter_sharing_profile_id + ON guacamole_sharing_profile_parameter(sharing_profile_id); + +-- +-- Object-level permission table for sharing profiles +-- + +CREATE TABLE guacamole_sharing_profile_permission ( + + user_id integer NOT NULL, + sharing_profile_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (user_id,sharing_profile_id,permission), + + CONSTRAINT guacamole_sharing_profile_permission_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_sharing_profile_permission_ibfk_2 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_permission_sharing_profile_id + ON guacamole_sharing_profile_permission(sharing_profile_id); + +CREATE INDEX guacamole_sharing_profile_permission_user_id + ON guacamole_sharing_profile_permission(user_id); + +-- +-- Add new (optional) sharing profile ID and name columns to connection history +-- + +ALTER TABLE guacamole_connection_history + ADD COLUMN sharing_profile_id integer; + +ALTER TABLE guacamole_connection_history + ADD COLUMN sharing_profile_name varchar(128); + +ALTER TABLE guacamole_connection_history + ADD CONSTRAINT guacamole_connection_history_ibfk_3 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE SET NULL; + +CREATE INDEX guacamole_connection_history_sharing_profile_id + ON guacamole_connection_history(sharing_profile_id); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.11.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.11.sql new file mode 100644 index 0000000..95d6372 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.11.sql @@ -0,0 +1,55 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-user password set date +-- + +ALTER TABLE guacamole_user + ADD COLUMN password_date timestamptz; + +UPDATE guacamole_user SET password_date = CURRENT_TIMESTAMP; + +ALTER TABLE guacamole_user + ALTER COLUMN password_date SET NOT NULL; + +-- +-- User password history +-- + +CREATE TABLE guacamole_user_password_history ( + + password_history_id serial NOT NULL, + user_id integer NOT NULL, + + -- Salted password + password_hash bytea NOT NULL, + password_salt bytea, + password_date timestamptz NOT NULL, + + PRIMARY KEY (password_history_id), + + CONSTRAINT guacamole_user_password_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_password_history_user_id + ON guacamole_user_password_history(user_id); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.13.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.13.sql new file mode 100644 index 0000000..0fac528 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.13.sql @@ -0,0 +1,45 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new guacd encryption method type +-- + +CREATE TYPE guacamole_proxy_encryption_method AS ENUM( + 'NONE', + 'SSL' +); + +-- +-- Add guacd per-connection override columns +-- + +ALTER TABLE guacamole_connection ADD COLUMN proxy_port integer; +ALTER TABLE guacamole_connection ADD COLUMN proxy_hostname varchar(512); +ALTER TABLE guacamole_connection ADD COLUMN proxy_encryption_method guacamole_proxy_encryption_method; + +-- +-- Add new user profile columns +-- + +ALTER TABLE guacamole_user ADD COLUMN full_name VARCHAR(256); +ALTER TABLE guacamole_user ADD COLUMN email_address VARCHAR(256); +ALTER TABLE guacamole_user ADD COLUMN organization VARCHAR(256); +ALTER TABLE guacamole_user ADD COLUMN organizational_role VARCHAR(256); + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.14.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.14.sql new file mode 100644 index 0000000..534d4dc --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.14.sql @@ -0,0 +1,79 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-connection weight +-- + +ALTER TABLE guacamole_connection + ADD COLUMN connection_weight int; + +-- +-- Add failover-only flag +-- + +ALTER TABLE guacamole_connection + ADD COLUMN failover_only BOOLEAN NOT NULL DEFAULT FALSE; + +-- +-- Add remote_host to connection history +-- + +ALTER TABLE guacamole_connection_history + ADD COLUMN remote_host VARCHAR(256) DEFAULT NULL; + +-- +-- Add covering index for connection history connection and start date +-- + +CREATE INDEX guacamole_connection_history_connection_id_start_date + ON guacamole_connection_history(connection_id, start_date); + +-- +-- User login/logout history +-- + +CREATE TABLE guacamole_user_history ( + + history_id serial NOT NULL, + user_id integer DEFAULT NULL, + username varchar(128) NOT NULL, + remote_host varchar(256) DEFAULT NULL, + start_date timestamptz NOT NULL, + end_date timestamptz DEFAULT NULL, + + PRIMARY KEY (history_id), + + CONSTRAINT guacamole_user_history_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL + +); + +CREATE INDEX guacamole_user_history_user_id + ON guacamole_user_history(user_id); + +CREATE INDEX guacamole_user_history_start_date + ON guacamole_user_history(start_date); + +CREATE INDEX guacamole_user_history_end_date + ON guacamole_user_history(end_date); + +CREATE INDEX guacamole_user_history_user_id_start_date + ON guacamole_user_history(user_id, start_date); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.7.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.7.sql new file mode 100644 index 0000000..37aacf4 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.7.sql @@ -0,0 +1,31 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-user disable flag +-- + +ALTER TABLE guacamole_user ADD COLUMN disabled boolean NOT NULL DEFAULT FALSE; + +-- +-- Add per-user password expiration flag +-- + +ALTER TABLE guacamole_user ADD COLUMN expired boolean NOT NULL DEFAULT FALSE; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.8.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.8.sql new file mode 100644 index 0000000..f6146dc --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.8.sql @@ -0,0 +1,52 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add per-user time-based access restrictions. +-- + +ALTER TABLE guacamole_user ADD COLUMN access_window_start time; +ALTER TABLE guacamole_user ADD COLUMN access_window_end time; + +-- +-- Add per-user date-based account validity restrictions. +-- + +ALTER TABLE guacamole_user ADD COLUMN valid_from date; +ALTER TABLE guacamole_user ADD COLUMN valid_until date; + +-- +-- Add per-user timezone for sake of time comparisons/interpretation. +-- + +ALTER TABLE guacamole_user ADD COLUMN timezone varchar(64); + +-- +-- Add connection concurrency limits +-- + +ALTER TABLE guacamole_connection ADD COLUMN max_connections integer; +ALTER TABLE guacamole_connection ADD COLUMN max_connections_per_user integer; + +-- +-- Add connection group concurrency limits +-- + +ALTER TABLE guacamole_connection_group ADD COLUMN max_connections integer; +ALTER TABLE guacamole_connection_group ADD COLUMN max_connections_per_user integer; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.9.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.9.sql new file mode 100644 index 0000000..eab419b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.9.sql @@ -0,0 +1,32 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Ensure history entry start/end dates are indexed. +-- + +CREATE INDEX guacamole_connection_history_start_date + ON guacamole_connection_history(start_date); + +CREATE INDEX guacamole_connection_history_end_date + ON guacamole_connection_history(end_date); + +CREATE INDEX guacamole_connection_history_search_index + ON guacamole_connection_history(start_date, connection_id, user_id); + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-1.0.0.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-1.0.0.sql new file mode 100644 index 0000000..83dfa86 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-1.0.0.sql @@ -0,0 +1,471 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new system-level permission +-- + +ALTER TYPE guacamole_system_permission_type + ADD VALUE 'CREATE_USER_GROUP' + AFTER 'CREATE_USER'; + +-- +-- Entity types +-- + +CREATE TYPE guacamole_entity_type AS ENUM( + 'USER', + 'USER_GROUP' +); + +-- +-- Table of base entities which may each be either a user or user group. Other +-- tables which represent qualities shared by both users and groups will point +-- to guacamole_entity, while tables which represent qualities specific to +-- users or groups will point to guacamole_user or guacamole_user_group. +-- + +CREATE TABLE guacamole_entity ( + + entity_id serial NOT NULL, + name varchar(128) NOT NULL, + type guacamole_entity_type NOT NULL, + + PRIMARY KEY (entity_id), + + CONSTRAINT guacamole_entity_name_scope + UNIQUE (type, name) + +); + +-- +-- Table of user groups. Each user group may have an arbitrary set of member +-- users and member groups, with those members inheriting the permissions +-- granted to that group. +-- + +CREATE TABLE guacamole_user_group ( + + user_group_id serial NOT NULL, + entity_id integer NOT NULL, + + -- Group disabled status + disabled boolean NOT NULL DEFAULT FALSE, + + PRIMARY KEY (user_group_id), + + CONSTRAINT guacamole_user_group_single_entity + UNIQUE (entity_id), + + CONSTRAINT guacamole_user_group_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE + +); + +-- +-- Table of users which are members of given user groups. +-- + +CREATE TABLE guacamole_user_group_member ( + + user_group_id integer NOT NULL, + member_entity_id integer NOT NULL, + + PRIMARY KEY (user_group_id, member_entity_id), + + -- Parent must be a user group + CONSTRAINT guacamole_user_group_member_parent + FOREIGN KEY (user_group_id) + REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE, + + -- Member may be either a user or a user group (any entity) + CONSTRAINT guacamole_user_group_member_entity + FOREIGN KEY (member_entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +-- +-- Table of user group permissions. Each user group permission grants a user +-- access to a particular user group for a specific type of operation. +-- + +CREATE TABLE guacamole_user_group_permission ( + + entity_id integer NOT NULL, + affected_user_group_id integer NOT NULL, + permission guacamole_object_permission_type NOT NULL, + + PRIMARY KEY (entity_id, affected_user_group_id, permission), + + CONSTRAINT guacamole_user_group_permission_affected_user_group + FOREIGN KEY (affected_user_group_id) + REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE, + + CONSTRAINT guacamole_user_group_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_group_permission_affected_user_group_id + ON guacamole_user_group_permission(affected_user_group_id); + +CREATE INDEX guacamole_user_group_permission_entity_id + ON guacamole_user_group_permission(entity_id); + +-- +-- Modify guacamole_user table to use guacamole_entity as a base +-- + +-- Add new entity_id column +ALTER TABLE guacamole_user ADD COLUMN entity_id integer; + +-- Create user entities for each guacamole_user entry +INSERT INTO guacamole_entity (name, type) +SELECT username, 'USER' FROM guacamole_user; + +-- Update guacamole_user to point to corresponding guacamole_entity +UPDATE guacamole_user SET entity_id = ( + SELECT entity_id FROM guacamole_entity + WHERE + username = guacamole_entity.name + AND type = 'USER' +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_user + ALTER COLUMN entity_id SET NOT NULL; + +-- The entity_id column should now be unique for each user +ALTER TABLE guacamole_user + ADD CONSTRAINT guacamole_user_single_entity + UNIQUE (entity_id); + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_user + ADD CONSTRAINT guacamole_user_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +-- The username column can now safely be removed +ALTER TABLE guacamole_user DROP COLUMN username; + +-- +-- Modify guacamole_connection_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_connection_permission ADD COLUMN entity_id integer; + +-- Update guacamole_connection_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_connection_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_connection_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_connection_permission + ALTER COLUMN entity_id SET NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_connection_permission + ADD CONSTRAINT guacamole_connection_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +CREATE INDEX guacamole_connection_permission_entity_id + ON guacamole_connection_permission(entity_id); + +-- Remove user_id column (implicitly drops associated contraints/keys) +ALTER TABLE guacamole_connection_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_connection_permission + ADD PRIMARY KEY (entity_id, connection_id, permission); + +-- +-- Modify guacamole_connection_group_permission to use guacamole_entity instead +-- of guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_connection_group_permission ADD COLUMN entity_id integer; + +-- Update guacamole_connection_group_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_connection_group_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_connection_group_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_connection_group_permission + ALTER COLUMN entity_id SET NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_connection_group_permission + ADD CONSTRAINT guacamole_connection_group_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +CREATE INDEX guacamole_connection_group_permission_entity_id + ON guacamole_connection_group_permission(entity_id); + +-- Remove user_id column (implicitly drops associated contraints/keys) +ALTER TABLE guacamole_connection_group_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_connection_group_permission + ADD PRIMARY KEY (entity_id, connection_group_id, permission); + +-- +-- Modify guacamole_sharing_profile_permission to use guacamole_entity instead +-- of guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_sharing_profile_permission ADD COLUMN entity_id integer; + +-- Update guacamole_sharing_profile_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_sharing_profile_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_sharing_profile_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_sharing_profile_permission + ALTER COLUMN entity_id SET NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_sharing_profile_permission + ADD CONSTRAINT guacamole_sharing_profile_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +CREATE INDEX guacamole_sharing_profile_permission_entity_id + ON guacamole_sharing_profile_permission(entity_id); + +-- Remove user_id column (implicitly drops associated contraints/keys) +ALTER TABLE guacamole_sharing_profile_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_sharing_profile_permission + ADD PRIMARY KEY (entity_id, sharing_profile_id, permission); + +-- +-- Modify guacamole_user_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_user_permission ADD COLUMN entity_id integer; + +-- Update guacamole_user_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_user_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_user_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_user_permission + ALTER COLUMN entity_id SET NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_user_permission + ADD CONSTRAINT guacamole_user_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +CREATE INDEX guacamole_user_permission_entity_id + ON guacamole_user_permission(entity_id); + +-- Remove user_id column (implicitly drops associated contraints/keys) +ALTER TABLE guacamole_user_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_user_permission + ADD PRIMARY KEY (entity_id, affected_user_id, permission); + +-- +-- Modify guacamole_system_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE guacamole_system_permission ADD COLUMN entity_id integer; + +-- Update guacamole_system_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_system_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_system_permission.user_id +); + +-- The entity_id column should now be safely non-NULL +ALTER TABLE guacamole_system_permission + ALTER COLUMN entity_id SET NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE guacamole_system_permission + ADD CONSTRAINT guacamole_system_permission_entity + FOREIGN KEY (entity_id) + REFERENCES guacamole_entity (entity_id) + ON DELETE CASCADE; + +CREATE INDEX guacamole_system_permission_entity_id + ON guacamole_system_permission(entity_id); + +-- Remove user_id column (implicitly drops associated contraints/keys) +ALTER TABLE guacamole_system_permission DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE guacamole_system_permission + ADD PRIMARY KEY (entity_id, permission); + +-- +-- Table of arbitrary user attributes. Each attribute is simply a name/value +-- pair associated with a user. Arbitrary attributes are defined by other +-- extensions. Attributes defined by this extension will be mapped to +-- properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_attribute ( + + user_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (user_id, attribute_name), + + CONSTRAINT guacamole_user_attribute_ibfk_1 + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_attribute_user_id + ON guacamole_user_attribute(user_id); + +-- +-- Table of arbitrary user group attributes. Each attribute is simply a +-- name/value pair associated with a user group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_user_group_attribute ( + + user_group_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (user_group_id, attribute_name), + + CONSTRAINT guacamole_user_group_attribute_ibfk_1 + FOREIGN KEY (user_group_id) + REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_user_group_attribute_user_group_id + ON guacamole_user_group_attribute(user_group_id); + +-- +-- Table of arbitrary connection attributes. Each attribute is simply a +-- name/value pair associated with a connection. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_attribute ( + + connection_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (connection_id, attribute_name), + + CONSTRAINT guacamole_connection_attribute_ibfk_1 + FOREIGN KEY (connection_id) + REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_attribute_connection_id + ON guacamole_connection_attribute(connection_id); + +-- +-- Table of arbitrary connection group attributes. Each attribute is simply a +-- name/value pair associated with a connection group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_connection_group_attribute ( + + connection_group_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (connection_group_id, attribute_name), + + CONSTRAINT guacamole_connection_group_attribute_ibfk_1 + FOREIGN KEY (connection_group_id) + REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_connection_group_attribute_connection_group_id + ON guacamole_connection_group_attribute(connection_group_id); + +-- +-- Table of arbitrary sharing profile attributes. Each attribute is simply a +-- name/value pair associated with a sharing profile. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE guacamole_sharing_profile_attribute ( + + sharing_profile_id integer NOT NULL, + attribute_name varchar(128) NOT NULL, + attribute_value varchar(4096) NOT NULL, + + PRIMARY KEY (sharing_profile_id, attribute_name), + + CONSTRAINT guacamole_sharing_profile_attribute_ibfk_1 + FOREIGN KEY (sharing_profile_id) + REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE + +); + +CREATE INDEX guacamole_sharing_profile_attribute_sharing_profile_id + ON guacamole_sharing_profile_attribute(sharing_profile_id); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-1.6.0.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-1.6.0.sql new file mode 100644 index 0000000..9a4536e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-1.6.0.sql @@ -0,0 +1,27 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new system-level audit permission +-- + +ALTER TYPE guacamole_system_permission_type + ADD VALUE 'AUDIT' + BEFORE 'ADMINISTER'; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java new file mode 100644 index 0000000..e91ab24 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderService; + +/** + * Provides a PostgreSQL-based implementation of the AuthenticationProvider + * functionality. + */ +public class PostgreSQLAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new PostgreSQLAuthenticationProvider that reads and writes + * authentication data to a PostgreSQL database defined by properties in + * guacamole.properties. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public PostgreSQLAuthenticationProvider() throws GuacamoleException { + super(new PostgreSQLInjectorProvider(), JDBCAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "postgresql"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProviderModule.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProviderModule.java new file mode 100644 index 0000000..cdb0b8a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProviderModule.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql; + +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.name.Names; +import java.io.File; +import java.util.Properties; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.postgresql.conf.PostgreSQLEnvironment; +import org.apache.guacamole.auth.postgresql.conf.PostgreSQLSSLMode; +import org.mybatis.guice.datasource.helper.JdbcHelper; + +/** + * Guice module which configures PostgreSQL-specific injections. + */ +public class PostgreSQLAuthenticationProviderModule implements Module { + + /** + * MyBatis-specific configuration properties. + */ + private final Properties myBatisProperties = new Properties(); + + /** + * PostgreSQL-specific driver configuration properties. + */ + private final Properties driverProperties = new Properties(); + + /** + * Creates a new PostgreSQL authentication provider module that configures + * driver and MyBatis properties using the given environment. + * + * @param environment + * The environment to use when configuring MyBatis and the underlying + * JDBC driver. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public PostgreSQLAuthenticationProviderModule(PostgreSQLEnvironment environment) + throws GuacamoleException { + + // Set the PostgreSQL-specific properties for MyBatis. + myBatisProperties.setProperty("mybatis.environment.id", "guacamole"); + myBatisProperties.setProperty("JDBC.host", environment.getPostgreSQLHostname()); + myBatisProperties.setProperty("JDBC.port", String.valueOf(environment.getPostgreSQLPort())); + myBatisProperties.setProperty("JDBC.schema", environment.getPostgreSQLDatabase()); + myBatisProperties.setProperty("JDBC.autoCommit", "false"); + myBatisProperties.setProperty("mybatis.pooled.pingEnabled", "true"); + myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1"); + + // Only set if > 0. Underlying backend does not take 0 as not-set. + int defaultStatementTimeout = environment.getPostgreSQLDefaultStatementTimeout(); + if (defaultStatementTimeout > 0) { + myBatisProperties.setProperty( + "mybatis.configuration.defaultStatementTimeout", + String.valueOf(defaultStatementTimeout) + ); + } + + // Use UTF-8 in database + driverProperties.setProperty("characterEncoding", "UTF-8"); + + // Check the SSL mode and set if configured. + PostgreSQLSSLMode sslMode = environment.getPostgreSQLSSLMode(); + + /** + * Older versions of the PostgreSQL JDBC driver do not support directly + * setting the "prefer" mode; however, the behavior defined by this + * mode is the default if nothing is set, so if that mode is requested + * in guacamole.properties we just don't set sslmode in the driver. + */ + if (sslMode != PostgreSQLSSLMode.PREFER) + driverProperties.setProperty("sslmode", sslMode.getDriverValue()); + + // If SSL is requested disabled, also set the legacy property. + if (sslMode == PostgreSQLSSLMode.DISABLE) + driverProperties.setProperty("ssl", "false"); + + // If SSL is enabled, check for and set other SSL properties. + else { + + File sslClientCert = environment.getPostgreSQLSSLClientCertFile(); + if (sslClientCert != null) + driverProperties.setProperty("sslcert", sslClientCert.getAbsolutePath()); + + File sslClientKey = environment.getPostgreSQLSSLClientKeyFile(); + if (sslClientKey != null) + driverProperties.setProperty("sslkey", sslClientKey.getAbsolutePath()); + + File sslRootCert = environment.getPostgreSQLSSLClientRootCertFile(); + if (sslRootCert != null) + driverProperties.setProperty("sslrootcert", sslRootCert.getAbsolutePath()); + + String sslClientKeyPassword = environment.getPostgreSQLSSLClientKeyPassword(); + if (sslClientKeyPassword != null) + driverProperties.setProperty("sslpassword", sslClientKeyPassword); + + } + + // Handle case where TCP connection to database is silently dropped + driverProperties.setProperty( + "socketTimeout", + String.valueOf(environment.getPostgreSQLSocketTimeout()) + ); + + } + + @Override + public void configure(Binder binder) { + + // Bind PostgreSQL-specific properties + JdbcHelper.PostgreSQL.configure(binder); + + // Bind MyBatis properties + Names.bindProperties(binder, myBatisProperties); + + // Bind JDBC driver properties + binder.bind(Properties.class) + .annotatedWith(Names.named("JDBC.driverProperties")) + .toInstance(driverProperties); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java new file mode 100644 index 0000000..f04ff74 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; +import org.apache.guacamole.auth.jdbc.JDBCInjectorProvider; +import org.apache.guacamole.auth.postgresql.conf.PostgreSQLEnvironment; + +/** + * JDBCInjectorProvider implementation which configures Guice injections for + * connecting to a PostgreSQL database based on PostgreSQL-specific options + * provided via guacamole.properties. + */ +public class PostgreSQLInjectorProvider extends JDBCInjectorProvider { + + @Override + protected Injector create() throws GuacamoleException { + + // Get local environment + PostgreSQLEnvironment environment = new PostgreSQLEnvironment(); + + // Set up Guice injector + return Guice.createInjector( + new JDBCAuthenticationProviderModule(environment), + new PostgreSQLAuthenticationProviderModule(environment) + ); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java new file mode 100644 index 0000000..430eb7a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.sharing.SharedAuthenticationProviderService; + +/** + * Provides a implementation of AuthenticationProvider which interacts with the + * PostgreSQL AuthenticationProvider, accepting share keys as credentials and + * providing access to the shared connections. + */ +public class PostgreSQLSharedAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new PostgreSQLSharedAuthenticationProvider that provides access + * to shared connections exposed by the PostgreSQLAuthenticationProvider. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public PostgreSQLSharedAuthenticationProvider() throws GuacamoleException { + super(new PostgreSQLInjectorProvider(), SharedAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "postgresql-shared"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLEnvironment.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLEnvironment.java new file mode 100644 index 0000000..8e79168 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLEnvironment.java @@ -0,0 +1,395 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql.conf; + +import java.io.File; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.ibatis.session.SqlSession; + +/** + * A PostgreSQL-specific implementation of JDBCEnvironment provides database + * properties specifically for PostgreSQL. + */ +public class PostgreSQLEnvironment extends JDBCEnvironment { + + /** + * The default host to connect to, if POSTGRESQL_HOSTNAME is not specified. + */ + private static final String DEFAULT_HOSTNAME = "localhost"; + + /** + * The default port to connect to, if POSTGRESQL_PORT is not specified. + */ + private static final int DEFAULT_PORT = 5432; + + /** + * The default number of seconds the driver will wait for a response from + * the database, before aborting the query. + * A value of 0 (the default) means the timeout is disabled. + */ + private static final int DEFAULT_STATEMENT_TIMEOUT = 0; + + /** + * The default number of seconds to wait for socket read operations. + * A value of 0 (the default) means the timeout is disabled. + */ + private static final int DEFAULT_SOCKET_TIMEOUT = 0; + + /** + * Whether a database user account is required by default for authentication + * to succeed. + */ + private static final boolean DEFAULT_USER_REQUIRED = false; + + /** + * The default value for the maximum number of connections to be + * allowed to the Guacamole server overall. + */ + private final int DEFAULT_ABSOLUTE_MAX_CONNECTIONS = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed per user to any one connection. Note that, as long as the + * legacy "disallow duplicate" and "disallow simultaneous" properties are + * still supported, these cannot be constants, as the legacy properties + * dictate the values that should be used in the absence of the correct + * properties. + */ + private final int DEFAULT_MAX_CONNECTIONS_PER_USER = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed per user to any one connection group. Note that, as long as the + * legacy "disallow duplicate" and "disallow simultaneous" properties are + * still supported, these cannot be constants, as the legacy properties + * dictate the values that should be used in the absence of the correct + * properties. + */ + private final int DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER = 1; + + /** + * The default value for the default maximum number of connections to be + * allowed to any one connection. Note that, as long as the legacy + * "disallow duplicate" and "disallow simultaneous" properties are still + * supported, these cannot be constants, as the legacy properties dictate + * the values that should be used in the absence of the correct properties. + */ + private final int DEFAULT_MAX_CONNECTIONS = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed to any one connection group. Note that, as long as the legacy + * "disallow duplicate" and "disallow simultaneous" properties are still + * supported, these cannot be constants, as the legacy properties dictate + * the values that should be used in the absence of the correct properties. + */ + private final int DEFAULT_MAX_GROUP_CONNECTIONS = 0; + + /** + * The default value to use for SSL mode if none is explicitly configured. + */ + private final PostgreSQLSSLMode DEFAULT_SSL_MODE = PostgreSQLSSLMode.PREFER; + + /** + * The default maximum number of identifiers/parameters to be included in a + * single batch when executing SQL statements for PostgreSQL. + * + * PostgreSQL has a maximum limit of 65535 parameters per prepared statement. + * A value of 5000 is chosen to avoid potential performance issues or query + * execution errors while staying well below the maximum limit. + * + * @see https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAX-PREPARED-STATEMENT-ARGS + */ + private static final int DEFAULT_BATCH_SIZE = 5000; + + /** + * Constructs a new PostgreSQLEnvironment, providing access to PostgreSQL-specific + * configuration options. + * + * @throws GuacamoleException + * If an error occurs while setting up the underlying JDBCEnvironment + * or while parsing legacy PostgreSQL configuration options. + */ + public PostgreSQLEnvironment() throws GuacamoleException { + + // Init underlying JDBC environment + super(); + + } + + @Override + public boolean isUserRequired() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_USER_REQUIRED, + DEFAULT_USER_REQUIRED + ); + } + + @Override + public int getAbsoluteMaxConnections() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_ABSOLUTE_MAX_CONNECTIONS, + DEFAULT_ABSOLUTE_MAX_CONNECTIONS + ); + } + + @Override + public int getBatchSize() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_BATCH_SIZE, + DEFAULT_BATCH_SIZE + ); + } + + @Override + public int getDefaultMaxConnections() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_DEFAULT_MAX_CONNECTIONS, + DEFAULT_MAX_CONNECTIONS + ); + } + + @Override + public int getDefaultMaxGroupConnections() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_DEFAULT_MAX_GROUP_CONNECTIONS, + DEFAULT_MAX_GROUP_CONNECTIONS + ); + } + + @Override + public int getDefaultMaxConnectionsPerUser() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_DEFAULT_MAX_CONNECTIONS_PER_USER, + DEFAULT_MAX_CONNECTIONS_PER_USER + ); + } + + @Override + public int getDefaultMaxGroupConnectionsPerUser() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER, + DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER + ); + } + + @Override + public PasswordPolicy getPasswordPolicy() { + return new PostgreSQLPasswordPolicy(this); + } + + /** + * Returns the hostname of the PostgreSQL server hosting the Guacamole + * authentication tables. If unspecified, this will be "localhost". + * + * @return + * The URL of the PostgreSQL server. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public String getPostgreSQLHostname() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_HOSTNAME, + DEFAULT_HOSTNAME + ); + } + + /** + * Returns the port number of the PostgreSQL server hosting the Guacamole + * authentication tables. If unspecified, this will be the default + * PostgreSQL port of 5432. + * + * @return + * The port number of the PostgreSQL server. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public int getPostgreSQLPort() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_PORT, + DEFAULT_PORT + ); + } + + /** + * Returns the name of the PostgreSQL database containing the Guacamole + * authentication tables. + * + * @return + * The name of the PostgreSQL database. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public String getPostgreSQLDatabase() throws GuacamoleException { + return getRequiredProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_DATABASE); + } + + @Override + public String getUsername() throws GuacamoleException { + return getRequiredProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_USERNAME); + } + + @Override + public String getPassword() throws GuacamoleException { + return getRequiredProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_PASSWORD); + } + + /** + * Returns the defaultStatementTimeout set for PostgreSQL connections. + * If unspecified, this will default to 0, + * and should not be passed through to the backend. + * + * @return + * The statement timeout (in seconds) + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public int getPostgreSQLDefaultStatementTimeout() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_DEFAULT_STATEMENT_TIMEOUT, + DEFAULT_STATEMENT_TIMEOUT + ); + } + + /** + * Returns the socketTimeout property to set on PostgreSQL connections. + * If unspecified, this will default to 0 (no timeout) + * + * @return + * The socketTimeout to use when waiting on read operations (in seconds) + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public int getPostgreSQLSocketTimeout() throws GuacamoleException { + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_SOCKET_TIMEOUT, + DEFAULT_SOCKET_TIMEOUT + ); + } + + @Override + public boolean isRecursiveQuerySupported(SqlSession session) { + return true; // All versions of PostgreSQL support recursive queries through CTEs + } + + /** + * Get the SSL mode to use to make the JDBC connection to the PostgreSQL + * server. If unspecified this will default to PREFER, attempting SSL + * and falling back to plain-text if SSL fails. + * + * @return + * The enum value of the SSL mode to use to make the JDBC connection + * to the server. + * + * @throws GuacamoleException + * If an error occurs retrieving the value from guacamole.properties. + */ + public PostgreSQLSSLMode getPostgreSQLSSLMode() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_SSL_MODE, + DEFAULT_SSL_MODE); + } + + /** + * Return the SSL client certificate file to use to make the connection + * to the PostgreSQL server. + * + * @return + * The SSL client certificate file to use for the PostgreSQL connection. + * + * @throws GuacamoleException + * If an error occurs retrieving the value from guacamole.properties. + */ + public File getPostgreSQLSSLClientCertFile() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_SSL_CERT_FILE); + } + + /** + * Return the SSL client private key file to use to make the connection to the + * PostgreSQL server. + * + * @return + * The SSL client private key file to use for the PostgreSQL connection. + * @throws GuacamoleException + * If an error occurs retrieving the value from guacamole.properties. + */ + public File getPostgreSQLSSLClientKeyFile() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_SSL_KEY_FILE); + } + + /** + * Return the SSL client root certificate file to use to make the connection + * to the PostgreSQL server. + * + * @return + * The SSL client root certificate file to use to make the connection + * to the PostgreSQL server. + * + * @throws GuacamoleException + * If an error occurs retrieving the value from guacamole.properties. + */ + public File getPostgreSQLSSLClientRootCertFile() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_SSL_ROOT_CERT_FILE); + } + + /** + * Return the password to use to decrypt the private SSL key file when making + * the connection to the PostgreSQL server. + * + * @return + * The password to use to decrypt the private SSL key file when making + * the connection to the PostgreSQL server. + * + * @throws GuacamoleException + * If an error occurs retrieving the value from guacamole.properties. + */ + public String getPostgreSQLSSLClientKeyPassword() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_SSL_KEY_PASSWORD); + } + + @Override + public boolean autoCreateAbsentAccounts() throws GuacamoleException { + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_AUTO_CREATE_ACCOUNTS, + false); + } + + @Override + public boolean trackExternalConnectionHistory() throws GuacamoleException { + + // Track external connection history unless explicitly disabled + return getProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_TRACK_EXTERNAL_CONNECTION_HISTORY, + true); + } + + @Override + public boolean enforceAccessWindowsForActiveSessions() throws GuacamoleException { + + // Enforce access window restrictions for active sessions unless explicitly disabled + return getProperty( + PostgreSQLGuacamoleProperties.POSTGRESQL_ENFORCE_ACCESS_WINDOWS_FOR_ACTIVE_SESSIONS, + true); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLGuacamoleProperties.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLGuacamoleProperties.java new file mode 100644 index 0000000..74db342 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLGuacamoleProperties.java @@ -0,0 +1,330 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql.conf; + +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.FileGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; + +/** + * Properties used by the PostgreSQL Authentication plugin. + */ +public class PostgreSQLGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private PostgreSQLGuacamoleProperties() {} + + /** + * The URL of the PostgreSQL server hosting the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty POSTGRESQL_HOSTNAME = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-hostname"; } + + }; + + /** + * The port of the PostgreSQL server hosting the Guacamole authentication + * tables. + */ + public static final IntegerGuacamoleProperty POSTGRESQL_PORT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-port"; } + + }; + + /** + * The name of the PostgreSQL database containing the Guacamole + * authentication tables. + */ + public static final StringGuacamoleProperty POSTGRESQL_DATABASE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-database"; } + + }; + + /** + * The username used to authenticate to the PostgreSQL database containing + * the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty POSTGRESQL_USERNAME = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-username"; } + + }; + + /** + * The password used to authenticate to the PostgreSQL database containing + * the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty POSTGRESQL_PASSWORD = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-password"; } + + }; + + /** + * The number of seconds the driver will wait for a response from + * the database, before aborting the query. + * A value of 0 (the default) means the timeout is disabled. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_DEFAULT_STATEMENT_TIMEOUT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-default-statement-timeout"; } + + }; + + /** + * The number of seconds to wait for socket read operations. + * If reading from the server takes longer than this value, the + * connection will be closed. This can be used to handle network problems + * such as a dropped connection to the database. Similar to + * postgresql-default-statement-timeout, it will have the effect of + * aborting queries that take too long. + * A value of 0 (the default) means the timeout is disabled. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_SOCKET_TIMEOUT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-socket-timeout"; } + + }; + + /** + * Whether a user account within the database is required for authentication + * to succeed, even if the user has been authenticated via another + * authentication provider. + */ + public static final BooleanGuacamoleProperty + POSTGRESQL_USER_REQUIRED = new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-required"; } + + }; + + /** + * The maximum number of concurrent connections to allow overall. Zero + * denotes unlimited. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_ABSOLUTE_MAX_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-absolute-max-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_DEFAULT_MAX_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-default-max-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection group. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_DEFAULT_MAX_GROUP_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-default-max-group-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection by an individual user. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_DEFAULT_MAX_CONNECTIONS_PER_USER = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-default-max-connections-per-user"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection group by an individual user. Zero denotes + * unlimited. + */ + public static final IntegerGuacamoleProperty + POSTGRESQL_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-default-max-group-connections-per-user"; } + + }; + + /** + * The SSL mode that should be used by the JDBC driver when making + * connections to the remote server. By default SSL will be attempted but + * plain-text will be allowed if SSL fails. + */ + public static final EnumGuacamoleProperty POSTGRESQL_SSL_MODE = + new EnumGuacamoleProperty(PostgreSQLSSLMode.class) { + + @Override + public String getName() { return "postgresql-ssl-mode"; } + + }; + + /** + * The client SSL certificate file used by the JDBC driver to make the + * SSL connection. + */ + public static final FileGuacamoleProperty POSTGRESQL_SSL_CERT_FILE = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-ssl-cert-file"; } + + }; + + /** + * The client SSL private key file used by the JDBC driver to make the + * SSL connection. + */ + public static final FileGuacamoleProperty POSTGRESQL_SSL_KEY_FILE = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-ssl-key-file"; } + + }; + + /** + * The client SSL root certificate file used by the JDBC driver to validate + * certificates when making the SSL connection. + */ + public static final FileGuacamoleProperty POSTGRESQL_SSL_ROOT_CERT_FILE = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-ssl-root-cert-file"; } + + }; + + /** + * The password of the SSL private key used by the JDBC driver to make + * the SSL connection to the PostgreSQL server. + */ + public static final StringGuacamoleProperty POSTGRESQL_SSL_KEY_PASSWORD = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-ssl-key-password"; } + + }; + + /** + * Whether or not to automatically create accounts in the PostgreSQL + * database for users who successfully authenticate through another + * extension. By default users will not be automatically created. + */ + public static final BooleanGuacamoleProperty POSTGRESQL_AUTO_CREATE_ACCOUNTS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-auto-create-accounts"; } + + }; + + /** + * Whether or not to track connection history for connections that do not originate + * from within the Postgres database. By default, external connection history will be + * tracked. + */ + public static final BooleanGuacamoleProperty POSTGRESQL_TRACK_EXTERNAL_CONNECTION_HISTORY = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-track-external-connection-history"; } + + }; + + /** + * Whether or not user-specific access time windows should be enforced for active sessions, + * i.e. whether users with active sessions should be logged out immediately when an access + * window closes. + */ + public static final BooleanGuacamoleProperty POSTGRESQL_ENFORCE_ACCESS_WINDOWS_FOR_ACTIVE_SESSIONS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-enforce-access-windows-for-active-sessions"; } + + }; + + /** + * The maximum number of identifiers/parameters to be included in a single batch when + * executing SQL statements. + */ + public static final IntegerGuacamoleProperty POSTGRESQL_BATCH_SIZE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-batch-size"; } + + }; + + /** + * A property used to configure whether or not usernames within the Postgres + * JDBC module should be treated as case-sensitive. + */ + public static final BooleanGuacamoleProperty POSTGRESQL_CASE_SENSITIVE_USERNAMES = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-case-sensitive-usernames"; } + + }; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLPasswordPolicy.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLPasswordPolicy.java new file mode 100644 index 0000000..7f2a36a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLPasswordPolicy.java @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql.conf; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; + +/** + * PasswordPolicy implementation which reads the details of the policy from + * PostgreSQL-specific properties in guacamole.properties. + */ +public class PostgreSQLPasswordPolicy implements PasswordPolicy { + + /** + * The property which specifies the minimum length required of all user + * passwords. By default, this will be zero. + */ + private static final IntegerGuacamoleProperty MIN_LENGTH = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-min-length"; } + + }; + + /** + * The property which specifies the minimum number of days which must + * elapse before a user may reset their password. If set to zero, the + * default, then this restriction does not apply. + */ + private static final IntegerGuacamoleProperty MIN_AGE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-min-age"; } + + }; + + /** + * The property which specifies the maximum number of days which may + * elapse before a user is required to reset their password. If set to zero, + * the default, then this restriction does not apply. + */ + private static final IntegerGuacamoleProperty MAX_AGE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-max-age"; } + + }; + + /** + * The property which specifies the number of previous passwords remembered + * for each user. If set to zero, the default, then this restriction does + * not apply. + */ + private static final IntegerGuacamoleProperty HISTORY_SIZE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-history-size"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one lowercase character and one uppercase character. By default, + * no such restriction is imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_MULTIPLE_CASE = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-require-multiple-case"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one numeric character (digit). By default, no such restriction is + * imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_DIGIT = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-require-digit"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one non-alphanumeric character (symbol). By default, no such + * restriction is imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_SYMBOL = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-require-symbol"; } + + }; + + /** + * The property which specifies whether users are prohibited from including + * their own username in their password. By default, no such restriction is + * imposed. + */ + private static final BooleanGuacamoleProperty PROHIBIT_USERNAME = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "postgresql-user-password-prohibit-username"; } + + }; + + /** + * The Guacamole server environment. + */ + private final JDBCEnvironment environment; + + /** + * Creates a new PostgreSQLPasswordPolicy which reads the details of the + * policy from the properties exposed by the given environment. + * + * @param environment + * The environment from which password policy properties should be + * read. + */ + public PostgreSQLPasswordPolicy(JDBCEnvironment environment) { + this.environment = environment; + } + + @Override + public int getMinimumLength() throws GuacamoleException { + return environment.getProperty(MIN_LENGTH, 0); + } + + @Override + public int getMinimumAge() throws GuacamoleException { + return environment.getProperty(MIN_AGE, 0); + } + + @Override + public int getMaximumAge() throws GuacamoleException { + return environment.getProperty(MAX_AGE, 0); + } + + @Override + public int getHistorySize() throws GuacamoleException { + return environment.getProperty(HISTORY_SIZE, 0); + } + + @Override + public boolean isMultipleCaseRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_MULTIPLE_CASE, false); + } + + @Override + public boolean isNumericRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_DIGIT, false); + } + + @Override + public boolean isNonAlphanumericRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_SYMBOL, false); + } + + @Override + public boolean isUsernameProhibited() throws GuacamoleException { + return environment.getProperty(PROHIBIT_USERNAME, false); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLSSLMode.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLSSLMode.java new file mode 100644 index 0000000..7a467f4 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/conf/PostgreSQLSSLMode.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.postgresql.conf; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * Possible values for PostgreSQL SSL connectivity. + */ +public enum PostgreSQLSSLMode { + + /** + * Do not use SSL to connect to server. + */ + @PropertyValue("disable") + DISABLE("disable"), + + /** + * Allow SSL connections, but try non-SSL, first. + */ + @PropertyValue("allow") + ALLOW("allow"), + + /** + * Prefer SSL connections, falling back to non-SSL if that fails. + */ + @PropertyValue("prefer") + PREFER("prefer"), + + /** + * Require SSL connections, do not connect if SSL fails. + */ + @PropertyValue("require") + REQUIRE("require"), + + /** + * Require SSL connections and validate the CA certificate. + */ + @PropertyValue("verify-ca") + VERIFY_CA("verify-ca"), + + /** + * Require SSL connections and validate both the CA and server certificates. + */ + @PropertyValue("verify-full") + VERIFY_FULL("verify-full"); + + /** + * The value expected by and passed on to the JDBC driver for the given + * SSL operation mode. + */ + private final String driverValue; + + /** + * Create a new instance of this enum with the given driverValue as the + * value that will be used when configuring the JDBC driver. + * + * @param driverValue + * The value to use when configuring the JDBC driver. + */ + PostgreSQLSSLMode(String driverValue) { + this.driverValue = driverValue; + } + + /** + * Returns the String value for a given Enum that properly configures the + * JDBC driver for the desired mode of SSL operation. + * + * @return + * The String value for the current Enum that configures the JDBC driver + * for the desired mode of SSL operation. + */ + public String getDriverValue() { + return driverValue; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/package-info.java new file mode 100644 index 0000000..0423f24 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The PostgreSQL authentication provider. + */ +package org.apache.guacamole.auth.postgresql; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..0f7d160 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json @@ -0,0 +1,36 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "PostgreSQL Authentication", + "namespace" : "postgresql", + + "authProviders" : [ + "org.apache.guacamole.auth.postgresql.PostgreSQLAuthenticationProvider", + "org.apache.guacamole.auth.postgresql.PostgreSQLSharedAuthenticationProvider" + ], + + "css" : [ + "styles/jdbc.css" + ], + + "html" : [ + "html/shared-connection.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/es.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] + +} + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml new file mode 100644 index 0000000..37b6b43 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + ( + ${column} = ${entityID} + + OR ${column} IN ( + SELECT guacamole_entity.entity_id + FROM guacamole_entity + JOIN guacamole_user_group ON guacamole_user_group.entity_id = guacamole_entity.entity_id + WHERE + type = 'USER_GROUP'::guacamole_entity_type + AND + + + name IN + + #{effectiveGroup,jdbcType=VARCHAR} + + + + LOWER(name) IN + + LOWER(#{effectiveGroup,jdbcType=VARCHAR}) + + + + AND disabled = false + ) + + ) + + + + + + + + + INSERT INTO guacamole_entity ( + name, + type + ) + VALUES ( + #{entity.identifier,jdbcType=VARCHAR}, + #{entity.entityType,jdbcType=VARCHAR}::guacamole_entity_type + ) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml new file mode 100644 index 0000000..32f325d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT connection_id + FROM guacamole_connection_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection + WHERE connection_id = #{identifier,jdbcType=INTEGER}::integer + + + + + + INSERT INTO guacamole_connection ( + connection_name, + parent_id, + protocol, + max_connections, + max_connections_per_user, + proxy_hostname, + proxy_port, + proxy_encryption_method, + connection_weight, + failover_only + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=INTEGER}::integer, + #{object.protocol,jdbcType=VARCHAR}, + #{object.maxConnections,jdbcType=INTEGER}, + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.proxyHostname,jdbcType=VARCHAR}, + #{object.proxyPort,jdbcType=INTEGER}, + #{object.proxyEncryptionMethod,jdbcType=VARCHAR}::guacamole_proxy_encryption_method, + #{object.connectionWeight,jdbcType=INTEGER}, + #{object.failoverOnly,jdbcType=BOOLEAN} + ) + + + + + + UPDATE guacamole_connection + SET connection_name = #{object.name,jdbcType=VARCHAR}, + parent_id = #{object.parentIdentifier,jdbcType=INTEGER}::integer, + protocol = #{object.protocol,jdbcType=VARCHAR}, + max_connections = #{object.maxConnections,jdbcType=INTEGER}, + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + proxy_hostname = #{object.proxyHostname,jdbcType=VARCHAR}, + proxy_port = #{object.proxyPort,jdbcType=INTEGER}, + proxy_encryption_method = #{object.proxyEncryptionMethod,jdbcType=VARCHAR}::guacamole_proxy_encryption_method, + connection_weight = #{object.connectionWeight,jdbcType=INTEGER}, + failover_only = #{object.failoverOnly,jdbcType=BOOLEAN} + WHERE connection_id = #{object.objectID,jdbcType=INTEGER}::integer + + + + + DELETE FROM guacamole_connection_attribute + WHERE connection_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_connection_attribute ( + connection_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml new file mode 100644 index 0000000..3f3af75 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_parameter + WHERE connection_id = #{identifier,jdbcType=INTEGER}::integer + + + + + + INSERT INTO guacamole_connection_parameter ( + connection_id, + parameter_name, + parameter_value + ) + VALUES + + (#{parameter.connectionIdentifier,jdbcType=INTEGER}::integer, + #{parameter.name,jdbcType=VARCHAR}, + #{parameter.value,jdbcType=VARCHAR}) + + + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml new file mode 100644 index 0000000..09a21d1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO guacamole_connection_history ( + connection_id, + connection_name, + remote_host, + sharing_profile_id, + sharing_profile_name, + user_id, + username, + start_date, + end_date + ) + VALUES ( + #{record.connectionIdentifier,jdbcType=INTEGER}::integer, + #{record.connectionName,jdbcType=VARCHAR}, + #{record.remoteHost,jdbcType=VARCHAR}, + #{record.sharingProfileIdentifier,jdbcType=INTEGER}::integer, + #{record.sharingProfileName,jdbcType=VARCHAR}, + (SELECT user_id FROM guacamole_user + JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id + WHERE + + + guacamole_entity.name = #{record.username,jdbcType=VARCHAR} + + + LOWER(guacamole_entity.name) = LOWER(#{record.username,jdbcType=VARCHAR}) + + + AND guacamole_entity.type = 'USER'::guacamole_entity_type), + #{record.username,jdbcType=VARCHAR}, + #{record.startDate,jdbcType=TIMESTAMP}, + #{record.endDate,jdbcType=TIMESTAMP} + ) + + + + + + UPDATE guacamole_connection_history + SET end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER}::integer + + + + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml new file mode 100644 index 0000000..a26c80b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT connection_group_id + FROM guacamole_connection_group_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_group + WHERE connection_group_id = #{identifier,jdbcType=INTEGER}::integer + + + + + + INSERT INTO guacamole_connection_group ( + connection_group_name, + parent_id, + type, + max_connections, + max_connections_per_user, + enable_session_affinity + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=INTEGER}::integer, + #{object.type,jdbcType=VARCHAR}::guacamole_connection_group_type, + #{object.maxConnections,jdbcType=INTEGER}, + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} + ) + + + + + + UPDATE guacamole_connection_group + SET connection_group_name = #{object.name,jdbcType=VARCHAR}, + parent_id = #{object.parentIdentifier,jdbcType=INTEGER}::integer, + type = #{object.type,jdbcType=VARCHAR}::guacamole_connection_group_type, + max_connections = #{object.maxConnections,jdbcType=INTEGER}, + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + enable_session_affinity = #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} + WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER}::integer + + + + + DELETE FROM guacamole_connection_group_attribute + WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_connection_group_attribute ( + connection_group_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml new file mode 100644 index 0000000..c0e0cfb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_group_permission + WHERE (entity_id, permission, connection_group_id) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type, + #{permission.objectIdentifier,jdbcType=INTEGER}::integer) + + + + + + + + INSERT INTO guacamole_connection_group_permission ( + entity_id, + permission, + connection_group_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + permissions.connection_group_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER}::integer AS connection_group_id + + AS permissions + WHERE (entity_id, permission, connection_group_id) NOT IN ( + SELECT + guacamole_connection_group_permission.entity_id, + guacamole_connection_group_permission.permission, + guacamole_connection_group_permission.connection_group_id + FROM guacamole_connection_group_permission + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml new file mode 100644 index 0000000..e5af041 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_connection_permission + WHERE (entity_id, permission, connection_id) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type, + #{permission.objectIdentifier,jdbcType=INTEGER}::integer) + + + + + + + + INSERT INTO guacamole_connection_permission ( + entity_id, + permission, + connection_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + permissions.connection_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER}::integer AS connection_id + + AS permissions + WHERE (entity_id, permission, connection_id) NOT IN ( + SELECT + guacamole_connection_permission.entity_id, + guacamole_connection_permission.permission, + guacamole_connection_permission.connection_id + FROM guacamole_connection_permission + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml new file mode 100644 index 0000000..c1b51a2 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_sharing_profile_permission + WHERE (entity_id, permission, sharing_profile_id) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type, + #{permission.objectIdentifier,jdbcType=INTEGER}::integer) + + + + + + + + INSERT INTO guacamole_sharing_profile_permission ( + entity_id, + permission, + sharing_profile_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + permissions.sharing_profile_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER}::integer AS sharing_profile_id + + AS permissions + WHERE (entity_id, permission, sharing_profile_id) NOT IN ( + SELECT + guacamole_sharing_profile_permission.entity_id, + guacamole_sharing_profile_permission.permission, + guacamole_sharing_profile_permission.sharing_profile_id + FROM guacamole_sharing_profile_permission + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml new file mode 100644 index 0000000..25e7262 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_system_permission + WHERE (entity_id, permission) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_system_permission_type) + + + + + + + + INSERT INTO guacamole_system_permission ( + entity_id, + permission + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR}::guacamole_system_permission_type AS permission + + AS permissions + WHERE (entity_id, permission) NOT IN ( + SELECT + guacamole_system_permission.entity_id, + guacamole_system_permission.permission + FROM guacamole_system_permission + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml new file mode 100644 index 0000000..8251901 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_permission + USING guacamole_user_group affected_group, guacamole_entity affected_entity + WHERE + guacamole_user_group_permission.affected_user_group_id = affected_group.user_group_id + AND affected_group.entity_id = affected_entity.entity_id + AND + + + (guacamole_user_group_permission.entity_id, permission, affected_entity.name) + + + (guacamole_user_group_permission.entity_id, permission, LOWER(affected_entity.name)) + + + IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type, + + + #{permission.objectIdentifier,jdbcType=INTEGER} + + + LOWER(#{permission.objectIdentifier,jdbcType=INTEGER}) + + + ) + + AND affected_entity.type = 'USER_GROUP'::guacamole_entity_type + + + + + + + INSERT INTO guacamole_user_group_permission ( + entity_id, + permission, + affected_user_group_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + affected_group.user_group_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type AS permission, + #{permission.objectIdentifier,jdbcType=VARCHAR}::text AS affected_name + + AS permissions + JOIN guacamole_entity affected_entity ON + + + affected_entity.name = permissions.affected_name + + + LOWER(affected_entity.name) = LOWER(permissions.affected_name) + + + AND affected_entity.type = 'USER_GROUP'::guacamole_entity_type + JOIN guacamole_user_group affected_group ON affected_group.entity_id = affected_entity.entity_id + WHERE (permissions.entity_id, permissions.permission, affected_group.user_group_id) NOT IN ( + SELECT + guacamole_user_group_permission.entity_id, + guacamole_user_group_permission.permission, + guacamole_user_group_permission.affected_user_group_id + FROM guacamole_user_group_permission + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml new file mode 100644 index 0000000..0ca81fb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_permission + USING guacamole_user affected_user, guacamole_entity affected_entity + WHERE + guacamole_user_permission.affected_user_id = affected_user.user_id + AND affected_user.entity_id = affected_entity.entity_id + AND affected_entity.type = 'USER'::guacamole_entity_type + AND + + + (guacamole_user_permission.entity_id, permission, affected_entity.name) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type, + #{permission.objectIdentifier,jdbcType=VARCHAR}) + + + + (guacamole_user_permission.entity_id, permission, LOWER(affected_entity.name)) IN + + (#{permission.entityID,jdbcType=INTEGER}, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type, + LOWER(#{permission.objectIdentifier,jdbcType=VARCHAR})) + + + + + + + + + + INSERT INTO guacamole_user_permission ( + entity_id, + permission, + affected_user_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + affected_user.user_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type AS permission, + #{permission.objectIdentifier,jdbcType=VARCHAR}::text AS affected_name + + AS permissions + JOIN guacamole_entity affected_entity ON + affected_entity.type = 'USER'::guacamole_entity_type + AND + + + affected_entity.name = permissions.affected_name + + + LOWER(affected_entity.name) = LOWER(permissions.affected_name) + + + JOIN guacamole_user affected_user ON affected_user.entity_id = affected_entity.entity_id + WHERE (permissions.entity_id, permissions.permission, affected_user.user_id) NOT IN ( + SELECT + guacamole_user_permission.entity_id, + guacamole_user_permission.permission, + guacamole_user_permission.affected_user_id + FROM guacamole_user_permission + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml new file mode 100644 index 0000000..e92d58f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT sharing_profile_id + FROM guacamole_sharing_profile_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM guacamole_sharing_profile + WHERE sharing_profile_id = #{identifier,jdbcType=INTEGER}::integer + + + + + + INSERT INTO guacamole_sharing_profile ( + sharing_profile_name, + primary_connection_id + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=INTEGER}::integer + ) + + + + + + UPDATE guacamole_sharing_profile + SET sharing_profile_name = #{object.name,jdbcType=VARCHAR}, + primary_connection_id = #{object.parentIdentifier,jdbcType=INTEGER}::integer + WHERE sharing_profile_id = #{object.objectID,jdbcType=INTEGER}::integer + + + + + DELETE FROM guacamole_sharing_profile_attribute + WHERE sharing_profile_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_sharing_profile_attribute ( + sharing_profile_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml new file mode 100644 index 0000000..dc7badc --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + DELETE FROM guacamole_sharing_profile_parameter + WHERE sharing_profile_id = #{identifier,jdbcType=INTEGER}::integer + + + + + + INSERT INTO guacamole_sharing_profile_parameter ( + sharing_profile_id, + parameter_name, + parameter_value + ) + VALUES + + (#{parameter.sharingProfileIdentifier,jdbcType=INTEGER}::integer, + #{parameter.name,jdbcType=VARCHAR}, + #{parameter.value,jdbcType=VARCHAR}) + + + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml new file mode 100644 index 0000000..a85a388 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + INSERT INTO guacamole_user_password_history ( + user_id, + password_hash, + password_salt, + password_date + ) + VALUES ( + #{record.userID,jdbcType=INTEGER}, + #{record.passwordHash,jdbcType=BINARY}, + #{record.passwordSalt,jdbcType=BINARY}, + #{record.passwordDate,jdbcType=TIMESTAMP} + ); + + DELETE FROM guacamole_user_password_history + WHERE password_history_id IN ( + SELECT password_history_id + FROM guacamole_user_password_history + WHERE user_id = #{record.userID,jdbcType=INTEGER} + ORDER BY password_date DESC + OFFSET #{maxHistorySize} + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml new file mode 100644 index 0000000..0e3ccf5 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT guacamole_user_permission.affected_user_id + FROM guacamole_user_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM guacamole_entity + WHERE type = 'USER'::guacamole_entity_type + AND + + + name = #{identifier,jdbcType=VARCHAR} + + + LOWER(name) = LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user ( + entity_id, + password_hash, + password_salt, + password_date, + disabled, + expired, + access_window_start, + access_window_end, + valid_from, + valid_until, + timezone, + full_name, + email_address, + organization, + organizational_role + ) + VALUES ( + #{object.entityID,jdbcType=VARCHAR}, + #{object.passwordHash,jdbcType=BINARY}, + #{object.passwordSalt,jdbcType=BINARY}, + #{object.passwordDate,jdbcType=TIMESTAMP}, + #{object.disabled,jdbcType=BOOLEAN}, + #{object.expired,jdbcType=BOOLEAN}, + #{object.accessWindowStart,jdbcType=TIME}, + #{object.accessWindowEnd,jdbcType=TIME}, + #{object.validFrom,jdbcType=DATE}, + #{object.validUntil,jdbcType=DATE}, + #{object.timeZone,jdbcType=VARCHAR}, + #{object.fullName,jdbcType=VARCHAR}, + #{object.emailAddress,jdbcType=VARCHAR}, + #{object.organization,jdbcType=VARCHAR}, + #{object.organizationalRole,jdbcType=VARCHAR} + ) + + + + + + UPDATE guacamole_user + SET password_hash = #{object.passwordHash,jdbcType=BINARY}, + password_salt = #{object.passwordSalt,jdbcType=BINARY}, + password_date = #{object.passwordDate,jdbcType=TIMESTAMP}, + disabled = #{object.disabled,jdbcType=BOOLEAN}, + expired = #{object.expired,jdbcType=BOOLEAN}, + access_window_start = #{object.accessWindowStart,jdbcType=TIME}, + access_window_end = #{object.accessWindowEnd,jdbcType=TIME}, + valid_from = #{object.validFrom,jdbcType=DATE}, + valid_until = #{object.validUntil,jdbcType=DATE}, + timezone = #{object.timeZone,jdbcType=VARCHAR}, + full_name = #{object.fullName,jdbcType=VARCHAR}, + email_address = #{object.emailAddress,jdbcType=VARCHAR}, + organization = #{object.organization,jdbcType=VARCHAR}, + organizational_role = #{object.organizationalRole,jdbcType=VARCHAR} + WHERE user_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM guacamole_user_attribute + WHERE user_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_user_attribute ( + user_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml new file mode 100644 index 0000000..b92b03c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_user_group, guacamole_entity + WHERE + member_entity_id = #{parent.entityID,jdbcType=INTEGER} + AND guacamole_user_group.user_group_id = guacamole_user_group_member.user_group_id + AND guacamole_entity.entity_id = guacamole_user_group.entity_id + AND guacamole_entity.type = 'USER_GROUP'::guacamole_entity_type + AND + + + guacamole_entity.name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER(guacamole_entity.name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + guacamole_user_group.user_group_id, + #{parent.entityID,jdbcType=INTEGER} + FROM guacamole_user_group + JOIN guacamole_entity ON guacamole_user_group.entity_id = guacamole_entity.entity_id + WHERE guacamole_entity.type = 'USER_GROUP'::guacamole_entity_type + AND + + + guacamole_entity.name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER(guacamole_entity.name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + AND guacamole_user_group.user_group_id NOT IN ( + SELECT guacamole_user_group_member.user_group_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.member_entity_id = #{parent.entityID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml new file mode 100644 index 0000000..5184fec --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + INSERT INTO guacamole_user_history ( + remote_host, + user_id, + username, + start_date, + end_date + ) + VALUES ( + #{record.remoteHost,jdbcType=VARCHAR}, + (SELECT user_id FROM guacamole_user + JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id + WHERE + + + guacamole_entity.name = #{record.username,jdbcType=VARCHAR} + + + LOWER(guacamole_entity.name) = LOWER(#{record.username,jdbcType=VARCHAR}) + + + AND guacamole_entity.type = 'USER'::guacamole_entity_type), + #{record.username,jdbcType=VARCHAR}, + #{record.startDate,jdbcType=TIMESTAMP}, + #{record.endDate,jdbcType=TIMESTAMP} + ) + + + + + + UPDATE guacamole_user_history + SET end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER}::integer + + + + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml new file mode 100644 index 0000000..fac9172 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT guacamole_user_group_permission.affected_user_group_id + FROM guacamole_user_group_permission + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM guacamole_entity + WHERE type = 'USER_GROUP'::guacamole_entity_type + AND + + + name = #{identifier,jdbcType=VARCHAR} + + + LOWER(name) = LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO guacamole_user_group ( + entity_id, + disabled + ) + VALUES ( + #{object.entityID,jdbcType=VARCHAR}, + #{object.disabled,jdbcType=BOOLEAN} + ) + + + + + + UPDATE guacamole_user_group + SET disabled = #{object.disabled,jdbcType=BOOLEAN} + WHERE user_group_id = #{object.objectID,jdbcType=VARCHAR} + + + + + DELETE FROM guacamole_user_group_attribute + WHERE user_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO guacamole_user_group_attribute ( + user_group_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml new file mode 100644 index 0000000..074322b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_entity + WHERE + user_group_id = #{parent.objectID,jdbcType=INTEGER} + AND guacamole_entity.entity_id = member_entity_id + AND guacamole_entity.type = 'USER_GROUP'::guacamole_entity_type + AND + + + guacamole_entity.name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER(guacamole_entity.name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + #{parent.objectID,jdbcType=INTEGER}, + guacamole_entity.entity_id + FROM guacamole_entity + WHERE guacamole_entity.type = 'USER_GROUP'::guacamole_entity_type + AND + + + guacamole_entity.name IN + + #{identifier} + + + + LOWER(guacamole_entity.name) IN + + LOWER(#{identifier}) + + + + AND guacamole_entity.entity_id NOT IN ( + SELECT guacamole_user_group_member.member_entity_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.user_group_id = #{parent.objectID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml new file mode 100644 index 0000000..9e500b8 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_entity + WHERE + user_group_id = #{parent.objectID,jdbcType=INTEGER} + AND guacamole_entity.entity_id = member_entity_id + AND guacamole_entity.type = 'USER'::guacamole_entity_type + AND + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + #{parent.objectID,jdbcType=INTEGER}, + guacamole_entity.entity_id + FROM guacamole_entity + WHERE + + + guacamole_entity.name + + + LOWER(guacamole_entity.name) + + + IN + + + + #{identifier} + + + LOWER(#{identifier}) + + + + AND guacamole_entity.type = 'USER'::guacamole_entity_type + AND guacamole_entity.entity_id NOT IN ( + SELECT guacamole_user_group_member.member_entity_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.user_group_id = #{parent.objectID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml new file mode 100644 index 0000000..14d317d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + DELETE FROM guacamole_user_group_member + USING guacamole_user_group, guacamole_entity + WHERE + member_entity_id = #{parent.entityID,jdbcType=INTEGER} + AND guacamole_user_group.user_group_id = guacamole_user_group_member.user_group_id + AND guacamole_entity.entity_id = guacamole_user_group.entity_id + AND guacamole_entity.type = 'USER_GROUP'::guacamole_entity_type + AND + + + guacamole_entity.name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER(guacamole_entity.name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO guacamole_user_group_member ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + guacamole_user_group.user_group_id, + #{parent.entityID,jdbcType=INTEGER} + FROM guacamole_user_group + JOIN guacamole_entity ON guacamole_user_group.entity_id = guacamole_entity.entity_id + WHERE guacamole_entity.type = 'USER_GROUP'::guacamole_entity_type + AND + + + guacamole_entity.name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER(guacamole_entity.name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + AND guacamole_user_group.user_group_id NOT IN ( + SELECT guacamole_user_group_member.user_group_id + FROM guacamole_user_group_member + WHERE guacamole_user_group_member.member_entity_id = #{parent.entityID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/.gitignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/.ratignore b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/pom.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/pom.xml new file mode 100644 index 0000000..8ceee87 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/pom.xml @@ -0,0 +1,57 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-jdbc-sqlserver + jar + guacamole-auth-jdbc-sqlserver + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-jdbc + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + provided + + + + + org.apache.guacamole + guacamole-auth-jdbc-base + 1.6.0 + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/001-create-schema.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/001-create-schema.sql new file mode 100644 index 0000000..4434653 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/001-create-schema.sql @@ -0,0 +1,973 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Connection group types +-- + +CREATE RULE [guacamole_connection_group_type_list] AS @list IN ( + 'ORGANIZATIONAL', + 'BALANCING' +); +GO + +CREATE TYPE [guacamole_connection_group_type] FROM [nvarchar](16); +EXEC sp_bindrule + 'guacamole_connection_group_type_list', + 'guacamole_connection_group_type'; +GO + +-- +-- Entity types +-- + +CREATE RULE [guacamole_entity_type_list] AS @list IN ( + 'USER', + 'USER_GROUP' +); +GO + +CREATE TYPE [guacamole_entity_type] FROM [nvarchar](16); +EXEC sp_bindrule + 'guacamole_entity_type_list', + 'guacamole_entity_type'; +GO + +-- +-- Object permission types +-- + +CREATE RULE [guacamole_object_permission_list] AS @list IN ( + 'READ', + 'UPDATE', + 'DELETE', + 'ADMINISTER' +); +GO + +CREATE TYPE [guacamole_object_permission] FROM [nvarchar](16); +EXEC sp_bindrule + 'guacamole_object_permission_list', + 'guacamole_object_permission'; +GO + +-- +-- System permission types +-- + +CREATE RULE [guacamole_system_permission_list] AS @list IN ( + 'CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'AUDIT', + 'ADMINISTER' +); +GO + +CREATE TYPE [guacamole_system_permission] FROM [nvarchar](32); +EXEC sp_bindrule + 'guacamole_system_permission_list', + 'guacamole_system_permission'; +GO + +-- +-- Guacamole proxy (guacd) encryption methods. +-- + +CREATE RULE [guacamole_proxy_encryption_method_list] AS @list IN ( + 'NONE', + 'SSL' +); +GO + +CREATE TYPE [guacamole_proxy_encryption_method] FROM [nvarchar](8); +EXEC sp_bindrule + 'guacamole_proxy_encryption_method_list', + 'guacamole_proxy_encryption_method'; +GO + +-- +-- Table of connection groups. Each connection group has a name, type, and +-- optional parent connection group. +-- + +CREATE TABLE [guacamole_connection_group] ( + + [connection_group_id] [int] IDENTITY(1,1) NOT NULL, + [parent_id] [int], + [connection_group_name] [nvarchar](128) NOT NULL, + [type] [guacamole_connection_group_type] + NOT NULL DEFAULT 'ORGANIZATIONAL', + + -- Concurrency limits + [max_connections] [int], + [max_connections_per_user] [int], + [enable_session_affinity] [bit] NOT NULL DEFAULT 0, + + CONSTRAINT [PK_guacamole_connection_group] + PRIMARY KEY CLUSTERED ([connection_group_id]), + + CONSTRAINT [AK_guacamole_connection_group_name_parent] + UNIQUE ([connection_group_name], [parent_id]), + + CONSTRAINT [FK_guacamole_connection_group_parent_id] + FOREIGN KEY ([parent_id]) + REFERENCES [guacamole_connection_group] ([connection_group_id]) + -- ON DELETE CASCADE handled by guacamole_delete_connection_group trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_group_parent_id] + ON [guacamole_connection_group] ([parent_id]); +GO + +-- +-- Table of connections. Each connection has a name, protocol, and +-- associated set of parameters. A connection may belong to a connection group. +-- + +CREATE TABLE [guacamole_connection] ( + + [connection_id] [int] IDENTITY(1,1) NOT NULL, + [connection_name] [nvarchar](128) NOT NULL, + [parent_id] [int], + [protocol] [nvarchar](32) NOT NULL, + + -- Concurrency limits + [max_connections] [int], + [max_connections_per_user] [int], + + -- Connection Weight + [connection_weight] [int], + [failover_only] [bit] NOT NULL DEFAULT 0, + + -- Guacamole proxy (guacd) overrides + [proxy_port] [int], + [proxy_hostname] [nvarchar](512), + [proxy_encryption_method] [guacamole_proxy_encryption_method], + + CONSTRAINT [PK_guacamole_connection] + PRIMARY KEY CLUSTERED ([connection_id]), + + CONSTRAINT [AK_guacamole_connection_name_parent] + UNIQUE ([connection_name], [parent_id]), + + CONSTRAINT [FK_guacamole_connection_parent_id] + FOREIGN KEY ([parent_id]) + REFERENCES [guacamole_connection_group] ([connection_group_id]) + -- ON DELETE CASCADE handled by guacamole_delete_connection_group trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_parent_id] + ON [guacamole_connection] ([parent_id]); +GO + +-- +-- Table of base entities which may each be either a user or user group. Other +-- tables which represent qualities shared by both users and groups will point +-- to guacamole_entity, while tables which represent qualities specific to +-- users or groups will point to guacamole_user or guacamole_user_group. +-- + +CREATE TABLE [guacamole_entity] ( + + [entity_id] [int] IDENTITY(1,1) NOT NULL, + [name] [nvarchar](128) NOT NULL, + [type] [guacamole_entity_type] NOT NULL, + + CONSTRAINT [PK_guacamole_entity] + PRIMARY KEY CLUSTERED ([entity_id]), + + CONSTRAINT [AK_guacamole_entity_name_scope] + UNIQUE ([type], [name]) + +); +GO + +-- +-- Table of users. Each user has a unique username and a hashed password +-- with corresponding salt. Although the authentication system will always set +-- salted passwords, other systems may set unsalted passwords by simply not +-- providing the salt. +-- + +CREATE TABLE [guacamole_user] ( + + [user_id] [int] IDENTITY(1,1) NOT NULL, + [entity_id] [int] NOT NULL, + + -- Optionally-salted password + [password_hash] [binary](32) NOT NULL, + [password_salt] [binary](32), + [password_date] [datetime] NOT NULL, + + -- Account disabled/expired status + [disabled] [bit] NOT NULL DEFAULT 0, + [expired] [bit] NOT NULL DEFAULT 0, + + -- Time-based access restriction + [access_window_start] [time](7), + [access_window_end] [time](7), + + -- Date-based access restriction + [valid_from] [date], + [valid_until] [date], + + -- Timezone used for all date/time comparisons and interpretation + [timezone] [nvarchar](64), + + -- Profile information + [full_name] [nvarchar](256), + [email_address] [nvarchar](256), + [organization] [nvarchar](256), + [organizational_role] [nvarchar](256), + + CONSTRAINT [PK_guacamole_user] + PRIMARY KEY CLUSTERED ([user_id]), + + CONSTRAINT [AK_guacamole_user_single_entity] + UNIQUE ([entity_id]), + + CONSTRAINT [FK_guacamole_user_entity] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); +GO + +-- +-- Table of user groups. Each user group may have an arbitrary set of member +-- users and member groups, with those members inheriting the permissions +-- granted to that group. +-- + +CREATE TABLE [guacamole_user_group] ( + + [user_group_id] [int] IDENTITY(1,1) NOT NULL, + [entity_id] [int] NOT NULL, + + -- Group disabled status + [disabled] [bit] NOT NULL DEFAULT 0, + + CONSTRAINT [PK_guacamole_user_group] + PRIMARY KEY CLUSTERED ([user_group_id]), + + CONSTRAINT [guacamole_user_group_single_entity] + UNIQUE ([entity_id]), + + CONSTRAINT [guacamole_user_group_entity] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); +GO + +-- +-- Table of users which are members of given user groups. +-- + +CREATE TABLE [guacamole_user_group_member] ( + + [user_group_id] [int] NOT NULL, + [member_entity_id] [int] NOT NULL, + + CONSTRAINT [PK_guacamole_user_group_member] + PRIMARY KEY CLUSTERED ([user_group_id], [member_entity_id]), + + -- Parent must be a user group + CONSTRAINT [guacamole_user_group_member_parent_id] + FOREIGN KEY ([user_group_id]) + REFERENCES [guacamole_user_group] ([user_group_id]) + ON DELETE CASCADE, + + -- Member may be either a user or a user group (any entity) + CONSTRAINT [guacamole_user_group_member_entity_id] + FOREIGN KEY ([member_entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + -- ON DELETE CASCADE handled by guacamole_delete_entity trigger + +); +GO + +-- +-- Table of sharing profiles. Each sharing profile has a name, associated set +-- of parameters, and a primary connection. The primary connection is the +-- connection that the sharing profile shares, and the parameters dictate the +-- restrictions/features which apply to the user joining the connection via the +-- sharing profile. +-- + +CREATE TABLE [guacamole_sharing_profile] ( + + [sharing_profile_id] [int] IDENTITY(1,1) NOT NULL, + [sharing_profile_name] [nvarchar](128) NOT NULL, + [primary_connection_id] [int] NOT NULL, + + CONSTRAINT [PK_guacamole_sharing_profile] + PRIMARY KEY CLUSTERED ([sharing_profile_id]), + + CONSTRAINT [AK_guacamole_sharing_profile_name_primary_connection] + UNIQUE ([sharing_profile_name], [primary_connection_id]), + + CONSTRAINT [FK_guacamole_sharing_profile_primary_connection_id] + FOREIGN KEY ([primary_connection_id]) + REFERENCES [guacamole_connection] ([connection_id]) + -- ON DELETE CASCADE handled by guacamole_delete_connection trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_primary_connection_id] + ON [guacamole_sharing_profile] ([primary_connection_id]); +GO + +-- +-- Table of arbitrary user attributes. Each attribute is simply a name/value +-- pair associated with a user. Arbitrary attributes are defined by other +-- extensions. Attributes defined by this extension will be mapped to +-- properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_user_attribute] ( + + [user_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + CONSTRAINT [PK_guacamole_user_attribute] + PRIMARY KEY CLUSTERED ([user_id], [attribute_name]), + + CONSTRAINT [FK_guacamole_user_attribute_user_id] + FOREIGN KEY ([user_id]) + REFERENCES [guacamole_user] ([user_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_attribute_user_id] + ON [guacamole_user_attribute] ([user_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary user group attributes. Each attribute is simply a +-- name/value pair associated with a user group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_user_group_attribute] ( + + [user_group_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + CONSTRAINT [PK_guacamole_user_group_attribute] + PRIMARY KEY CLUSTERED ([user_group_id], [attribute_name]), + + CONSTRAINT [FK_guacamole_user_attribute_user_group_id] + FOREIGN KEY ([user_group_id]) + REFERENCES [guacamole_user_group] ([user_group_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_group_attribute_user_id] + ON [guacamole_user_group_attribute] ([user_group_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary connection attributes. Each attribute is simply a +-- name/value pair associated with a connection. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_connection_attribute] ( + + [connection_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + PRIMARY KEY (connection_id, attribute_name), + + CONSTRAINT [FK_guacamole_connection_attribute_connection_id] + FOREIGN KEY ([connection_id]) + REFERENCES [guacamole_connection] ([connection_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_attribute_connection_id] + ON [guacamole_connection_attribute] ([connection_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary connection group attributes. Each attribute is simply a +-- name/value pair associated with a connection group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_connection_group_attribute] ( + + [connection_group_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + PRIMARY KEY (connection_group_id, attribute_name), + + CONSTRAINT [FK_guacamole_connection_group_attribute_connection_group_id] + FOREIGN KEY ([connection_group_id]) + REFERENCES [guacamole_connection_group] ([connection_group_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_group_attribute_connection_group_id] + ON [guacamole_connection_group_attribute] ([connection_group_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary sharing profile attributes. Each attribute is simply a +-- name/value pair associated with a sharing profile. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_sharing_profile_attribute] ( + + [sharing_profile_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + PRIMARY KEY (sharing_profile_id, attribute_name), + + CONSTRAINT [FK_guacamole_sharing_profile_attribute_sharing_profile_id] + FOREIGN KEY ([sharing_profile_id]) + REFERENCES [guacamole_sharing_profile] ([sharing_profile_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_attribute_sharing_profile_id] + ON [guacamole_sharing_profile_attribute] ([sharing_profile_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of connection parameters. Each parameter is simply a name/value pair +-- associated with a connection. +-- + +CREATE TABLE [guacamole_connection_parameter] ( + + [connection_id] [int] NOT NULL, + [parameter_name] [nvarchar](128) NOT NULL, + [parameter_value] [nvarchar](4000) NOT NULL, + + CONSTRAINT [PK_guacamole_connection_parameter] + PRIMARY KEY CLUSTERED ([connection_id], [parameter_name]), + + CONSTRAINT [FK_guacamole_connection_parameter_connection_id] + FOREIGN KEY ([connection_id]) + REFERENCES [guacamole_connection] ([connection_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_parameter_connection_id] + ON [guacamole_connection_parameter] ([connection_id]); +GO + +-- +-- Table of sharing profile parameters. Each parameter is simply +-- name/value pair associated with a sharing profile. These parameters dictate +-- the restrictions/features which apply to the user joining the associated +-- connection via the sharing profile. +-- + +CREATE TABLE [guacamole_sharing_profile_parameter] ( + + [sharing_profile_id] [int] NOT NULL, + [parameter_name] [nvarchar](128) NOT NULL, + [parameter_value] [nvarchar](4000) NOT NULL, + + CONSTRAINT [PK_guacamole_sharing_profile_parameter] + PRIMARY KEY CLUSTERED ([sharing_profile_id], [parameter_name]), + + CONSTRAINT [FK_guacamole_sharing_profile_parameter_connection_id] + FOREIGN KEY ([sharing_profile_id]) + REFERENCES [guacamole_sharing_profile] ([sharing_profile_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_parameter_sharing_profile_id] + ON [guacamole_sharing_profile_parameter] ([sharing_profile_id]); +GO + +-- +-- Table of connection permissions. Each connection permission grants a user or +-- user group specific access to a connection. +-- + +CREATE TABLE [guacamole_connection_permission] ( + + [entity_id] [int] NOT NULL, + [connection_id] [int] NOT NULL, + [permission] [guacamole_object_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_connection_permission] + PRIMARY KEY CLUSTERED ([entity_id], [connection_id], [permission]), + + CONSTRAINT [FK_guacamole_connection_permission_connection_id] + FOREIGN KEY ([connection_id]) + REFERENCES [guacamole_connection] ([connection_id]) + ON DELETE CASCADE, + + CONSTRAINT [FK_guacamole_connection_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_permission_connection_id] + ON [guacamole_connection_permission] ([connection_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_permission_entity_id] + ON [guacamole_connection_permission] ([entity_id]); +GO + +-- +-- Table of connection group permissions. Each group permission grants a user +-- or user group specific access to a connection group. +-- + +CREATE TABLE [guacamole_connection_group_permission] ( + + [entity_id] [int] NOT NULL, + [connection_group_id] [int] NOT NULL, + [permission] [guacamole_object_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_connection_group_permission] + PRIMARY KEY CLUSTERED ([entity_id], [connection_group_id], [permission]), + + CONSTRAINT [FK_guacamole_connection_group_permission_connection_group_id] + FOREIGN KEY ([connection_group_id]) + REFERENCES [guacamole_connection_group] ([connection_group_id]) + ON DELETE CASCADE, + + CONSTRAINT [FK_guacamole_connection_group_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_group_permission_connection_group_id] + ON [guacamole_connection_group_permission] ([connection_group_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_group_permission_entity_id] + ON [guacamole_connection_group_permission] ([entity_id]); +GO + +-- +-- Table of sharing profile permissions. Each sharing profile permission grants +-- a user or user group specific access to a sharing profile. +-- + +CREATE TABLE [guacamole_sharing_profile_permission] ( + + [entity_id] [int] NOT NULL, + [sharing_profile_id] [int] NOT NULL, + [permission] [guacamole_object_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_sharing_profile_permission] + PRIMARY KEY CLUSTERED ([entity_id], [sharing_profile_id], [permission]), + + CONSTRAINT [FK_guacamole_sharing_profile_permission_sharing_profile_id] + FOREIGN KEY ([sharing_profile_id]) + REFERENCES [guacamole_sharing_profile] ([sharing_profile_id]) + ON DELETE CASCADE, + + CONSTRAINT [FK_guacamole_sharing_profile_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_permission_sharing_profile_id] + ON [guacamole_sharing_profile_permission] ([sharing_profile_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_permission_entity_id] + ON [guacamole_sharing_profile_permission] ([entity_id]); +GO + +-- +-- Table of system permissions. Each system permission grants a user or user +-- group a system-level privilege of some kind. +-- + +CREATE TABLE [guacamole_system_permission] ( + + [entity_id] [int] NOT NULL, + [permission] [guacamole_system_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_system_permission] + PRIMARY KEY CLUSTERED ([entity_id], [permission]), + + CONSTRAINT [FK_guacamole_system_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_system_permission_entity_id] + ON [guacamole_system_permission] ([entity_id]); +GO + +-- +-- Table of user permissions. Each user permission grants a user or user group +-- access to another user (the "affected" user) for a specific type of +-- operation. +-- + +CREATE TABLE [guacamole_user_permission] ( + + [entity_id] [int] NOT NULL, + [affected_user_id] [int] NOT NULL, + [permission] [guacamole_object_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_user_permission] + PRIMARY KEY CLUSTERED ([entity_id], [affected_user_id], [permission]), + + CONSTRAINT [FK_guacamole_user_permission_affected_user_id] + FOREIGN KEY ([affected_user_id]) + REFERENCES [guacamole_user] ([user_id]) + ON DELETE CASCADE, + + CONSTRAINT [FK_guacamole_user_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + -- ON DELETE CASCADE handled by guacamole_delete_entity trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_permission_entity_id] + ON [guacamole_user_permission] ([entity_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_permission_affected_user_id] + ON [guacamole_user_permission] ([affected_user_id]); +GO + +-- +-- Table of user group permissions. Each user group permission grants a user +-- or user group access to a another user group (the "affected" user group) for +-- a specific type of operation. +-- + +CREATE TABLE [guacamole_user_group_permission] ( + + [entity_id] [int] NOT NULL, + [affected_user_group_id] [int] NOT NULL, + [permission] [guacamole_object_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_user_group_permission] + PRIMARY KEY CLUSTERED ([entity_id], [affected_user_group_id], [permission]), + + CONSTRAINT [FK_guacamole_user_group_permission_affected_user_group_id] + FOREIGN KEY ([affected_user_group_id]) + REFERENCES [guacamole_user_group] ([user_group_id]) + ON DELETE CASCADE, + + CONSTRAINT [FK_guacamole_user_group_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + -- ON DELETE CASCADE handled by guacamole_delete_entity trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_group_permission_entity_id] + ON [guacamole_user_group_permission] ([entity_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_group_permission_affected_user_group_id] + ON [guacamole_user_group_permission] ([affected_user_group_id]); +GO + +-- +-- Table of connection history records. Each record defines a specific user's +-- session, including the connection used, the start time, and the end time +-- (if any). +-- + +CREATE TABLE [guacamole_connection_history] ( + + [history_id] [int] IDENTITY(1,1) NOT NULL, + [user_id] [int], + [username] [nvarchar](128) NOT NULL, + [remote_host] [nvarchar](256), + [connection_id] [int], + [connection_name] [nvarchar](128) NOT NULL, + [sharing_profile_id] [int], + [sharing_profile_name] [nvarchar](128), + [start_date] [datetime] NOT NULL, + [end_date] [datetime], + + CONSTRAINT [PK_guacamole_connection_history] + PRIMARY KEY CLUSTERED ([history_id]), + + CONSTRAINT [FK_guacamole_connection_history_user_id] + FOREIGN KEY ([user_id]) + REFERENCES [guacamole_user] ([user_id]) + ON DELETE SET NULL, + + CONSTRAINT [FK_guacamole_connection_history_connection_id] + FOREIGN KEY ([connection_id]) + REFERENCES [guacamole_connection] ([connection_id]) + ON DELETE SET NULL, + + CONSTRAINT [FK_guacamole_connection_history_sharing_profile_id] + FOREIGN KEY ([sharing_profile_id]) + REFERENCES [guacamole_sharing_profile] ([sharing_profile_id]) + -- ON DELETE SET NULL handled by guacamole_delete_sharing profile trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_history_user_id] + ON [guacamole_connection_history] ([user_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_history_connection_id] + ON [guacamole_connection_history] ([connection_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_history_sharing_profile_id] + ON [guacamole_connection_history] ([sharing_profile_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_history_start_date] + ON [guacamole_connection_history] ([start_date]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_history_end_date] + ON [guacamole_connection_history] ([end_date]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_history_connection_id_start_date] + ON [guacamole_connection_history] ([connection_id], [start_date]); +GO + +-- +-- User login/logout history +-- + +CREATE TABLE [guacamole_user_history] ( + + [history_id] [int] IDENTITY(1,1) NOT NULL, + [user_id] [int] DEFAULT NULL, + [username] [nvarchar](128) NOT NULL, + [remote_host] [nvarchar](256) DEFAULT NULL, + [start_date] [datetime] NOT NULL, + [end_date] [datetime] DEFAULT NULL, + + PRIMARY KEY (history_id), + + CONSTRAINT FK_guacamole_user_history_user_id + FOREIGN KEY (user_id) + REFERENCES guacamole_user (user_id) ON DELETE SET NULL + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_history_user_id] + ON [guacamole_user_history] ([user_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_history_start_date] + ON [guacamole_user_history] ([start_date]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_history_end_date] + ON [guacamole_user_history] ([end_date]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_history_user_id_start_date] + ON [guacamole_user_history] ([user_id], [start_date]); +GO + +-- +-- The user_password_history table stores password history +-- for users, allowing for enforcing rules associated with +-- reuse of passwords. +-- + +CREATE TABLE [guacamole_user_password_history] ( + + [password_history_id] [int] IDENTITY(1,1) NOT NULL, + [user_id] [int] NOT NULL, + + -- Salted password + [password_hash] [binary](32) NOT NULL, + [password_salt] [binary](32), + [password_date] [datetime] NOT NULL, + + CONSTRAINT [PK_guacamole_user_password_history] + PRIMARY KEY CLUSTERED ([password_history_id]), + + CONSTRAINT [FK_guacamole_user_password_history_user_id] + FOREIGN KEY ([user_id]) + REFERENCES [guacamole_user] ([user_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_password_history_user_id] + ON [guacamole_user_password_history] ([user_id]); +GO + +-- +-- Handle cascading deletion/updates of records in response to deletion of +-- guacamole_entity records, where such deletion is not already covered by +-- ON DELETE CASCADE or ON DELETE SET NULL. +-- + +CREATE TRIGGER [guacamole_delete_entity] + ON [guacamole_entity] + INSTEAD OF DELETE +AS BEGIN + + -- Do not take trigger into account when producing row counts for the DELETE + SET NOCOUNT ON; + + -- Delete all associated permissions not covered by ON DELETE CASCADE + DELETE FROM [guacamole_user_permission] + WHERE [entity_id] IN (SELECT [entity_id] FROM DELETED); + + DELETE FROM [guacamole_user_group_permission] + WHERE [entity_id] IN (SELECT [entity_id] FROM DELETED); + + -- Delete all associated group memberships not covered by ON DELETE CASCADE + DELETE FROM [guacamole_user_group_member] + WHERE [member_entity_id] IN (SELECT [entity_id] FROM DELETED); + + -- Perform original deletion + DELETE FROM [guacamole_entity] + WHERE [entity_id] IN (SELECT [entity_id] FROM DELETED); + +END +GO + +-- +-- Handle cascading deletion/updates of records in response to deletion of +-- guacamole_connection records, where such deletion is not already covered by +-- ON DELETE CASCADE or ON DELETE SET NULL. +-- + +CREATE TRIGGER [guacamole_delete_connection] + ON [guacamole_connection] + INSTEAD OF DELETE +AS BEGIN + + -- Do not take trigger into account when producing row counts for the DELETE + SET NOCOUNT ON; + + -- Delete associated sharing profiles + DELETE FROM [guacamole_sharing_profile] + WHERE [primary_connection_id] IN (SELECT [connection_id] FROM DELETED); + + -- Perform original deletion + DELETE FROM [guacamole_connection] + WHERE [connection_id] IN (SELECT [connection_id] FROM DELETED); + +END +GO + +-- +-- Handle cascading deletion/updates of records in response to deletion of +-- guacamole_connection_group records, where such deletion is not already +-- covered by ON DELETE CASCADE or ON DELETE SET NULL. +-- + +CREATE TRIGGER [guacamole_delete_connection_group] + ON [guacamole_connection_group] + INSTEAD OF DELETE +AS BEGIN + + -- Do not take trigger into account when producing row counts for the DELETE + SET NOCOUNT ON; + + -- Delete all descendant connections + WITH [connection_groups] ([connection_group_id]) AS ( + SELECT [connection_group_id] FROM DELETED + UNION ALL + SELECT [guacamole_connection_group].[connection_group_id] + FROM [guacamole_connection_group] + JOIN [connection_groups] ON [connection_groups].[connection_group_id] = [guacamole_connection_group].[parent_id] + ) + DELETE FROM [guacamole_connection] + WHERE [parent_id] IN ( + SELECT [connection_group_id] + FROM [connection_groups] + ); + + -- Delete all requested connection groups, including descendants + WITH [connection_groups] ([connection_group_id]) AS ( + SELECT [connection_group_id] FROM DELETED + UNION ALL + SELECT [guacamole_connection_group].[connection_group_id] + FROM [guacamole_connection_group] + JOIN [connection_groups] ON [connection_groups].[connection_group_id] = [guacamole_connection_group].[parent_id] + ) + DELETE FROM [guacamole_connection_group] + WHERE [connection_group_id] IN ( + SELECT [connection_group_id] + FROM [connection_groups] + ); + +END +GO + +-- +-- Handle cascading deletion/updates of records in response to deletion of +-- guacamole_sharing_profile records, where such deletion is not already +-- covered by ON DELETE CASCADE or ON DELETE SET NULL. +-- + +CREATE TRIGGER [guacamole_delete_sharing_profile] + ON [guacamole_sharing_profile] + INSTEAD OF DELETE +AS BEGIN + + -- Do not take trigger into account when producing row counts for the DELETE + SET NOCOUNT ON; + + -- Delete all associated permissions not covered by ON DELETE CASCADE + UPDATE [guacamole_connection_history] + SET [sharing_profile_id] = NULL + WHERE [sharing_profile_id] IN (SELECT [sharing_profile_id] FROM DELETED); + + -- Perform original deletion + DELETE FROM [guacamole_sharing_profile] + WHERE [sharing_profile_id] IN (SELECT [sharing_profile_id] FROM DELETED); + +END +GO + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/002-create-admin-user.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/002-create-admin-user.sql new file mode 100644 index 0000000..70cf520 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/002-create-admin-user.sql @@ -0,0 +1,64 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- Create default user "guacadmin" with password "guacadmin" +INSERT INTO [guacamole_entity] ([name], [type]) VALUES ('guacadmin', 'USER'); +INSERT INTO [guacamole_user] ( + [entity_id], + [password_hash], + [password_salt], + [password_date] +) +SELECT + [entity_id], + 0xCA458A7D494E3BE824F5E1E175A1556C0F8EEF2C2D7DF3633BEC4A29C4411960, + 0xFE24ADC5E11E2B25288D1704ABE67A79E342ECC26064CE69C5B3177795A82264, + getdate() +FROM [guacamole_entity] WHERE [name] = 'guacadmin'; + +-- Grant this user all system permissions +INSERT INTO [guacamole_system_permission] +SELECT + [entity_id], + [permission] +FROM ( + SELECT 'guacadmin', 'CREATE_CONNECTION' + UNION SELECT 'guacadmin', 'CREATE_CONNECTION_GROUP' + UNION SELECT 'guacadmin', 'CREATE_SHARING_PROFILE' + UNION SELECT 'guacadmin', 'CREATE_USER' + UNION SELECT 'guacadmin', 'CREATE_USER_GROUP' + UNION SELECT 'guacadmin', 'ADMINISTER' +) [permissions] ([username], [permission]) +JOIN [guacamole_entity] ON [permissions].[username] = [guacamole_entity].[name] AND [guacamole_entity].[type] = 'USER'; + +INSERT INTO [guacamole_user_permission] +SELECT + [guacamole_entity].[entity_id], + [guacamole_user].[user_id], + [permission] +FROM ( + SELECT 'guacadmin', 'guacadmin', 'READ' + UNION SELECT 'guacadmin', 'guacadmin', 'UPDATE' + UNION SELECT 'guacadmin', 'guacadmin', 'ADMINISTER' +) [permissions] ([username], [affected_username], [permission]) +JOIN [guacamole_entity] ON [permissions].[username] = [guacamole_entity].[name] AND [guacamole_entity].[type] = 'USER' +JOIN [guacamole_entity] [affected] ON [permissions].[affected_username] = [affected].[name] AND [guacamole_entity].[type] = 'USER' +JOIN [guacamole_user] ON [guacamole_user].[entity_id] = [affected].[entity_id]; +GO + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/upgrade/upgrade-pre-1.0.0.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/upgrade/upgrade-pre-1.0.0.sql new file mode 100644 index 0000000..7b4fc88 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/upgrade/upgrade-pre-1.0.0.sql @@ -0,0 +1,659 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new system-level permission +-- + +EXEC sp_unbindrule 'guacamole_system_permission'; +DROP RULE [guacamole_system_permission_list]; +GO + +CREATE RULE [guacamole_system_permission_list] AS @list IN ( + 'CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'ADMINISTER' +); +GO + +EXEC sp_bindrule + 'guacamole_system_permission_list', + 'guacamole_system_permission'; +GO + +-- +-- Entity types +-- + +CREATE RULE [guacamole_entity_type_list] AS @list IN ( + 'USER', + 'USER_GROUP' +); +GO + +CREATE TYPE [guacamole_entity_type] FROM [nvarchar](16); +EXEC sp_bindrule + 'guacamole_entity_type_list', + 'guacamole_entity_type'; +GO + +-- +-- Table of base entities which may each be either a user or user group. Other +-- tables which represent qualities shared by both users and groups will point +-- to guacamole_entity, while tables which represent qualities specific to +-- users or groups will point to guacamole_user or guacamole_user_group. +-- + +CREATE TABLE [guacamole_entity] ( + + [entity_id] [int] IDENTITY(1,1) NOT NULL, + [name] [nvarchar](128) NOT NULL, + [type] [guacamole_entity_type] NOT NULL, + + CONSTRAINT [PK_guacamole_entity] + PRIMARY KEY CLUSTERED ([entity_id]), + + CONSTRAINT [AK_guacamole_entity_name_scope] + UNIQUE ([type], [name]) + +); +GO + +-- +-- Table of user groups. Each user group may have an arbitrary set of member +-- users and member groups, with those members inheriting the permissions +-- granted to that group. +-- + +CREATE TABLE [guacamole_user_group] ( + + [user_group_id] [int] IDENTITY(1,1) NOT NULL, + [entity_id] [int] NOT NULL, + + -- Group disabled status + [disabled] [bit] NOT NULL DEFAULT 0, + + CONSTRAINT [PK_guacamole_user_group] + PRIMARY KEY CLUSTERED ([user_group_id]), + + CONSTRAINT [guacamole_user_group_single_entity] + UNIQUE ([entity_id]), + + CONSTRAINT [guacamole_user_group_entity] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE + +); +GO + +-- +-- Table of users which are members of given user groups. +-- + +CREATE TABLE [guacamole_user_group_member] ( + + [user_group_id] [int] NOT NULL, + [member_entity_id] [int] NOT NULL, + + CONSTRAINT [PK_guacamole_user_group_member] + PRIMARY KEY CLUSTERED ([user_group_id], [member_entity_id]), + + -- Parent must be a user group + CONSTRAINT [guacamole_user_group_member_parent_id] + FOREIGN KEY ([user_group_id]) + REFERENCES [guacamole_user_group] ([user_group_id]) + ON DELETE CASCADE, + + -- Member may be either a user or a user group (any entity) + CONSTRAINT [guacamole_user_group_member_entity_id] + FOREIGN KEY ([member_entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + -- ON DELETE CASCADE handled by guacamole_delete_entity trigger + +); +GO + +-- +-- Table of user group permissions. Each user group permission grants a user +-- or user group access to a another user group (the "affected" user group) for +-- a specific type of operation. +-- + +CREATE TABLE [guacamole_user_group_permission] ( + + [entity_id] [int] NOT NULL, + [affected_user_group_id] [int] NOT NULL, + [permission] [guacamole_object_permission] NOT NULL, + + CONSTRAINT [PK_guacamole_user_group_permission] + PRIMARY KEY CLUSTERED ([entity_id], [affected_user_group_id], [permission]), + + CONSTRAINT [FK_guacamole_user_group_permission_affected_user_group_id] + FOREIGN KEY ([affected_user_group_id]) + REFERENCES [guacamole_user_group] ([user_group_id]) + ON DELETE CASCADE, + + CONSTRAINT [FK_guacamole_user_group_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + -- ON DELETE CASCADE handled by guacamole_delete_entity trigger + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_group_permission_entity_id] + ON [guacamole_user_group_permission] ([entity_id]); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_group_permission_affected_user_group_id] + ON [guacamole_user_group_permission] ([affected_user_group_id]); +GO + +-- +-- The guacamole_delete_entity trigger effectively replaces the +-- guacamole_delete_user trigger, which is no longer necessary and will cease +-- being correct after the columns of existing tables are updated. +-- + +DROP TRIGGER [guacamole_delete_user]; +GO + +-- +-- Modify guacamole_user table to use guacamole_entity as a base +-- + +-- Add new entity_id column +ALTER TABLE [guacamole_user] ADD [entity_id] [int]; +GO + +-- Create user entities for each guacamole_user entry +INSERT INTO [guacamole_entity] ([name], [type]) +SELECT [username], 'USER' FROM [guacamole_user]; +GO + +-- Update guacamole_user to point to corresponding guacamole_entity +UPDATE [guacamole_user] SET [entity_id] = ( + SELECT [entity_id] FROM [guacamole_entity] + WHERE + [username] = [guacamole_entity].[name] + AND type = 'USER' +); +GO + +-- The entity_id column should now be safely non-NULL +ALTER TABLE [guacamole_user] + ALTER COLUMN [entity_id] [int] NOT NULL; + +-- The entity_id column should now be unique for each user +ALTER TABLE [guacamole_user] + ADD CONSTRAINT [AK_guacamole_user_single_entity] + UNIQUE ([entity_id]); + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE [guacamole_user] + ADD CONSTRAINT [FK_guacamole_user_entity] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE; + +-- The username column can now safely be removed +ALTER TABLE [guacamole_user] DROP [AK_guacamole_user_username]; +ALTER TABLE [guacamole_user] DROP COLUMN [username]; +GO + +-- +-- Modify guacamole_connection_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE [guacamole_connection_permission] ADD [entity_id] [int]; +GO + +-- Update guacamole_connection_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE [guacamole_connection_permission] SET [entity_id] = ( + SELECT [entity_id] FROM [guacamole_user] + WHERE [guacamole_user].[user_id] = [guacamole_connection_permission].[user_id] +); +GO + +-- The entity_id column should now be safely non-NULL +ALTER TABLE [guacamole_connection_permission] + ALTER COLUMN [entity_id] [int] NOT NULL; + +-- Remove user_id column +DROP INDEX [IX_guacamole_connection_permission_user_id] ON [guacamole_connection_permission]; +ALTER TABLE [guacamole_connection_permission] DROP [PK_guacamole_connection_permission]; +ALTER TABLE [guacamole_connection_permission] DROP [FK_guacamole_connection_permission_user_id]; +ALTER TABLE [guacamole_connection_permission] DROP COLUMN [user_id]; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE [guacamole_connection_permission] + ADD CONSTRAINT [FK_guacamole_connection_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE; + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_permission_entity_id] + ON [guacamole_connection_permission] ([entity_id]); + +-- Add new primary key which uses entity_id +ALTER TABLE [guacamole_connection_permission] + ADD CONSTRAINT [PK_guacamole_connection_permission] + PRIMARY KEY CLUSTERED ([entity_id], [connection_id], [permission]); +GO + +-- +-- Modify guacamole_connection_group_permission to use guacamole_entity instead +-- of guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE [guacamole_connection_group_permission] ADD [entity_id] [int]; +GO + +-- Update guacamole_connection_group_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_connection_group_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_connection_group_permission.user_id +); +GO + +-- The entity_id column should now be safely non-NULL +ALTER TABLE [guacamole_connection_group_permission] + ALTER COLUMN [entity_id] [int] NOT NULL; + +-- Remove user_id column +DROP INDEX [IX_guacamole_connection_group_permission_user_id] ON [guacamole_connection_group_permission]; +ALTER TABLE [guacamole_connection_group_permission] DROP [PK_guacamole_connection_group_permission]; +ALTER TABLE [guacamole_connection_group_permission] DROP [FK_guacamole_connection_group_permission_user_id]; +ALTER TABLE [guacamole_connection_group_permission] DROP COLUMN user_id; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE [guacamole_connection_group_permission] + ADD CONSTRAINT [FK_guacamole_connection_group_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE; + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_group_permission_entity_id] + ON [guacamole_connection_group_permission] ([entity_id]); + +-- Add new primary key which uses entity_id +ALTER TABLE [guacamole_connection_group_permission] + ADD CONSTRAINT [PK_guacamole_connection_group_permission] + PRIMARY KEY CLUSTERED ([entity_id], [connection_group_id], [permission]); +GO + +-- +-- Modify guacamole_sharing_profile_permission to use guacamole_entity instead +-- of guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE [guacamole_sharing_profile_permission] ADD [entity_id] [int]; +GO + +-- Update guacamole_sharing_profile_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_sharing_profile_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_sharing_profile_permission.user_id +); +GO + +-- The entity_id column should now be safely non-NULL +ALTER TABLE [guacamole_sharing_profile_permission] + ALTER COLUMN [entity_id] [int] NOT NULL; + +-- Remove user_id column +DROP INDEX [IX_guacamole_sharing_profile_permission_user_id] ON [guacamole_sharing_profile_permission]; +ALTER TABLE [guacamole_sharing_profile_permission] DROP [PK_guacamole_sharing_profile_permission]; +ALTER TABLE [guacamole_sharing_profile_permission] DROP [FK_guacamole_sharing_profile_permission_user_id]; +ALTER TABLE [guacamole_sharing_profile_permission] DROP COLUMN user_id; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE [guacamole_sharing_profile_permission] + ADD CONSTRAINT [FK_guacamole_sharing_profile_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE; + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_permission_entity_id] + ON [guacamole_sharing_profile_permission] ([entity_id]); + +-- Add new primary key which uses entity_id +ALTER TABLE [guacamole_sharing_profile_permission] + ADD CONSTRAINT [PK_guacamole_sharing_profile_permission] + PRIMARY KEY CLUSTERED ([entity_id], [sharing_profile_id], [permission]); +GO + +-- +-- Modify guacamole_user_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE [guacamole_user_permission] ADD [entity_id] [int]; +GO + +-- Update guacamole_user_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE guacamole_user_permission SET entity_id = ( + SELECT entity_id FROM guacamole_user + WHERE guacamole_user.user_id = guacamole_user_permission.user_id +); +GO + +-- The entity_id column should now be safely non-NULL +ALTER TABLE [guacamole_user_permission] + ALTER COLUMN [entity_id] [int] NOT NULL; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE [guacamole_user_permission] + ADD CONSTRAINT [FK_guacamole_user_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]); + -- ON DELETE CASCADE handled by guacamole_delete_entity trigger + +-- The affected_user_id column now has ON DELETE CASCADE +ALTER TABLE [guacamole_user_permission] DROP [FK_guacamole_user_permission_affected_user_id]; +ALTER TABLE [guacamole_user_permission] + ADD CONSTRAINT [FK_guacamole_user_permission_affected_user_id] + FOREIGN KEY ([affected_user_id]) + REFERENCES [guacamole_user] ([user_id]) + ON DELETE CASCADE; + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_permission_entity_id] + ON [guacamole_user_permission] ([entity_id]); + +-- Remove user_id column +DROP INDEX [IX_guacamole_user_permission_user_id] ON [guacamole_user_permission]; +ALTER TABLE [guacamole_user_permission] DROP [PK_guacamole_user_permission]; +ALTER TABLE [guacamole_user_permission] DROP [FK_guacamole_user_permission_user_id]; +ALTER TABLE [guacamole_user_permission] DROP COLUMN user_id; + +-- Add new primary key which uses entity_id +ALTER TABLE [guacamole_user_permission] + ADD CONSTRAINT [PK_guacamole_user_permission] + PRIMARY KEY CLUSTERED ([entity_id], [affected_user_id], [permission]); +GO + +-- +-- Modify guacamole_system_permission to use guacamole_entity instead of +-- guacamole_user +-- + +-- Add new entity_id column +ALTER TABLE [guacamole_system_permission] ADD [entity_id] [int]; +GO + +-- Update guacamole_system_permission to point to the guacamole_entity +-- that has been granted the permission +UPDATE [guacamole_system_permission] SET [entity_id] = ( + SELECT [entity_id] FROM [guacamole_user] + WHERE [guacamole_user].[user_id] = [guacamole_system_permission].[user_id] +); +GO + +-- The entity_id column should now be safely non-NULL +ALTER TABLE [guacamole_system_permission] + ALTER COLUMN [entity_id] [int] NOT NULL; + +-- Remove user_id column +DROP INDEX [IX_guacamole_system_permission_user_id] ON [guacamole_system_permission]; +ALTER TABLE [guacamole_system_permission] DROP [PK_guacamole_system_permission]; +ALTER TABLE [guacamole_system_permission] DROP [FK_guacamole_system_permission_user_id]; +ALTER TABLE [guacamole_system_permission] DROP COLUMN [user_id]; + +-- The entity_id column should now safely point to guacamole_entity entries +ALTER TABLE [guacamole_system_permission] + ADD CONSTRAINT [FK_guacamole_system_permission_entity_id] + FOREIGN KEY ([entity_id]) + REFERENCES [guacamole_entity] ([entity_id]) + ON DELETE CASCADE; + +CREATE NONCLUSTERED INDEX [IX_guacamole_system_permission_entity_id] + ON [guacamole_system_permission] ([entity_id]); + +-- Add new primary key which uses entity_id +ALTER TABLE [guacamole_system_permission] + ADD CONSTRAINT [PK_guacamole_system_permission] + PRIMARY KEY CLUSTERED ([entity_id], [permission]); +GO + +-- +-- Handle cascading deletion/updates of records in response to deletion of +-- guacamole_entity records, where such deletion is not already covered by +-- ON DELETE CASCADE or ON DELETE SET NULL. +-- + +CREATE TRIGGER [guacamole_delete_entity] + ON [guacamole_entity] + INSTEAD OF DELETE +AS BEGIN + + -- Do not take trigger into account when producing row counts for the DELETE + SET NOCOUNT ON; + + -- Delete all associated permissions not covered by ON DELETE CASCADE + DELETE FROM [guacamole_user_permission] + WHERE [entity_id] IN (SELECT [entity_id] FROM DELETED); + + DELETE FROM [guacamole_user_group_permission] + WHERE [entity_id] IN (SELECT [entity_id] FROM DELETED); + + -- Delete all associated group memberships not covered by ON DELETE CASCADE + DELETE FROM [guacamole_user_group_member] + WHERE [member_entity_id] IN (SELECT [entity_id] FROM DELETED); + + -- Perform original deletion + DELETE FROM [guacamole_entity] + WHERE [entity_id] IN (SELECT [entity_id] FROM DELETED); + +END +GO + +-- +-- Update guacamole_delete_connection_group trigger to remove descendant +-- connections first. +-- + +DROP TRIGGER [guacamole_delete_connection_group]; +GO + +CREATE TRIGGER [guacamole_delete_connection_group] + ON [guacamole_connection_group] + INSTEAD OF DELETE +AS BEGIN + + -- Do not take trigger into account when producing row counts for the DELETE + SET NOCOUNT ON; + + -- Delete all descendant connections + WITH [connection_groups] ([connection_group_id]) AS ( + SELECT [connection_group_id] FROM DELETED + UNION ALL + SELECT [guacamole_connection_group].[connection_group_id] + FROM [guacamole_connection_group] + JOIN [connection_groups] ON [connection_groups].[connection_group_id] = [guacamole_connection_group].[parent_id] + ) + DELETE FROM [guacamole_connection] + WHERE [parent_id] IN ( + SELECT [connection_group_id] + FROM [connection_groups] + ); + + -- Delete all requested connection groups, including descendants + WITH [connection_groups] ([connection_group_id]) AS ( + SELECT [connection_group_id] FROM DELETED + UNION ALL + SELECT [guacamole_connection_group].[connection_group_id] + FROM [guacamole_connection_group] + JOIN [connection_groups] ON [connection_groups].[connection_group_id] = [guacamole_connection_group].[parent_id] + ) + DELETE FROM [guacamole_connection_group] + WHERE [connection_group_id] IN ( + SELECT [connection_group_id] + FROM [connection_groups] + ); + +END +GO + +-- +-- Table of arbitrary user attributes. Each attribute is simply a name/value +-- pair associated with a user. Arbitrary attributes are defined by other +-- extensions. Attributes defined by this extension will be mapped to +-- properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_user_attribute] ( + + [user_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + CONSTRAINT [PK_guacamole_user_attribute] + PRIMARY KEY CLUSTERED ([user_id], [attribute_name]), + + CONSTRAINT [FK_guacamole_user_attribute_user_id] + FOREIGN KEY ([user_id]) + REFERENCES [guacamole_user] ([user_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_attribute_user_id] + ON [guacamole_user_attribute] ([user_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary user group attributes. Each attribute is simply a +-- name/value pair associated with a user group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_user_group_attribute] ( + + [user_group_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + CONSTRAINT [PK_guacamole_user_group_attribute] + PRIMARY KEY CLUSTERED ([user_group_id], [attribute_name]), + + CONSTRAINT [FK_guacamole_user_attribute_user_group_id] + FOREIGN KEY ([user_group_id]) + REFERENCES [guacamole_user_group] ([user_group_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_user_group_attribute_user_id] + ON [guacamole_user_group_attribute] ([user_group_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary connection attributes. Each attribute is simply a +-- name/value pair associated with a connection. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_connection_attribute] ( + + [connection_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + PRIMARY KEY (connection_id, attribute_name), + + CONSTRAINT [FK_guacamole_connection_attribute_connection_id] + FOREIGN KEY ([connection_id]) + REFERENCES [guacamole_connection] ([connection_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_attribute_connection_id] + ON [guacamole_connection_attribute] ([connection_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary connection group attributes. Each attribute is simply a +-- name/value pair associated with a connection group. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_connection_group_attribute] ( + + [connection_group_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + PRIMARY KEY (connection_group_id, attribute_name), + + CONSTRAINT [FK_guacamole_connection_group_attribute_connection_group_id] + FOREIGN KEY ([connection_group_id]) + REFERENCES [guacamole_connection_group] ([connection_group_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_connection_group_attribute_connection_group_id] + ON [guacamole_connection_group_attribute] ([connection_group_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO + +-- +-- Table of arbitrary sharing profile attributes. Each attribute is simply a +-- name/value pair associated with a sharing profile. Arbitrary attributes are +-- defined by other extensions. Attributes defined by this extension will be +-- mapped to properly-typed columns of a specific table. +-- + +CREATE TABLE [guacamole_sharing_profile_attribute] ( + + [sharing_profile_id] [int] NOT NULL, + [attribute_name] [nvarchar](128) NOT NULL, + [attribute_value] [nvarchar](4000) NOT NULL, + + PRIMARY KEY (sharing_profile_id, attribute_name), + + CONSTRAINT [FK_guacamole_sharing_profile_attribute_sharing_profile_id] + FOREIGN KEY ([sharing_profile_id]) + REFERENCES [guacamole_sharing_profile] ([sharing_profile_id]) + ON DELETE CASCADE + +); + +CREATE NONCLUSTERED INDEX [IX_guacamole_sharing_profile_attribute_sharing_profile_id] + ON [guacamole_sharing_profile_attribute] ([sharing_profile_id]) + INCLUDE ([attribute_name], [attribute_value]); +GO diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/upgrade/upgrade-pre-1.6.0.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/upgrade/upgrade-pre-1.6.0.sql new file mode 100644 index 0000000..e56f7ee --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/schema/upgrade/upgrade-pre-1.6.0.sql @@ -0,0 +1,43 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +-- +-- Add new system-level audit permission +-- + +EXEC sp_unbindrule 'guacamole_system_permission'; +DROP RULE [guacamole_system_permission_list]; +GO + +CREATE RULE [guacamole_system_permission_list] AS @list IN ( + 'CREATE_CONNECTION', + 'CREATE_CONNECTION_GROUP', + 'CREATE_SHARING_PROFILE', + 'CREATE_USER', + 'CREATE_USER_GROUP', + 'AUDIT', + 'ADMINISTER' +); +GO + +EXEC sp_bindrule + 'guacamole_system_permission_list', + 'guacamole_system_permission'; +GO + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerAuthenticationProvider.java new file mode 100644 index 0000000..ef5d61d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerAuthenticationProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderService; + +/** + * Provides a SQLServer-based implementation of the AuthenticationProvider + * functionality. + */ +public class SQLServerAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new SQLServerAuthenticationProvider that reads and writes + * authentication data to a SQLServer database defined by properties in + * guacamole.properties. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public SQLServerAuthenticationProvider() throws GuacamoleException { + super(new SQLServerInjectorProvider(), JDBCAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "sqlserver"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerAuthenticationProviderModule.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerAuthenticationProviderModule.java new file mode 100644 index 0000000..8d9c164 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerAuthenticationProviderModule.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver; + +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.name.Names; +import java.lang.UnsupportedOperationException; +import java.util.Properties; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.sqlserver.conf.SQLServerDriver; +import org.apache.guacamole.auth.sqlserver.conf.SQLServerEnvironment; +import org.apache.guacamole.properties.CaseSensitivity; +import org.mybatis.guice.datasource.helper.JdbcHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Guice module which configures SQLServer-specific injections. + */ +public class SQLServerAuthenticationProviderModule implements Module { + + /** + * Logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(SQLServerAuthenticationProviderModule.class); + + /** + * MyBatis-specific configuration properties. + */ + private final Properties myBatisProperties = new Properties(); + + /** + * SQLServer-specific driver configuration properties. + */ + private final Properties driverProperties = new Properties(); + + /** + * Which SQL Server driver should be used. + */ + private final SQLServerDriver sqlServerDriver; + + /** + * Creates a new SQLServer authentication provider module that configures + * driver and MyBatis properties using the given environment. + * + * @param environment + * The environment to use when configuring MyBatis and the underlying + * JDBC driver. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public SQLServerAuthenticationProviderModule(SQLServerEnvironment environment) + throws GuacamoleException { + + // Set the SQLServer-specific properties for MyBatis. + myBatisProperties.setProperty("mybatis.environment.id", "guacamole"); + myBatisProperties.setProperty("JDBC.host", environment.getSQLServerHostname()); + myBatisProperties.setProperty("JDBC.port", String.valueOf(environment.getSQLServerPort())); + myBatisProperties.setProperty("JDBC.schema", environment.getSQLServerDatabase()); + + myBatisProperties.setProperty("JDBC.autoCommit", "false"); + myBatisProperties.setProperty("mybatis.pooled.pingEnabled", "true"); + myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1"); + + // Use UTF-8 in database + driverProperties.setProperty("characterEncoding", "UTF-8"); + + // Trust unknown server certificates if configured to do so + if (environment.trustAllServerCertificates()) + driverProperties.setProperty("trustServerCertificate", "true"); + + // Retrieve instance name and set it + String instance = environment.getSQLServerInstance(); + if (instance != null) + driverProperties.setProperty("JDBC.instanceName", instance); + + // Capture which driver to use for the connection. + this.sqlServerDriver = environment.getSQLServerDriver(); + + // Check for case sensitivity and warn admin. + if (environment.getCaseSensitivity() != CaseSensitivity.DISABLED) + LOGGER.warn("The SQL Server module is currently configured to support " + + "case-sensitive username comparisons, however, the default " + + "collations for SQL Server databases do not support " + + "case-sensitive string comparisons. If you want usernames " + + "within Guacamole to be treated as case-sensitive, further " + + "database configuration may be required."); + + } + + @Override + public void configure(Binder binder) { + + // Bind SQLServer-specific properties with the configured driver. + switch(sqlServerDriver) { + case JTDS: + JdbcHelper.SQL_Server_jTDS.configure(binder); + break; + + case DATA_DIRECT: + JdbcHelper.SQL_Server_DataDirect.configure(binder); + break; + + case MICROSOFT_LEGACY: + JdbcHelper.SQL_Server_MS_Driver.configure(binder); + break; + + case MICROSOFT_2005: + JdbcHelper.SQL_Server_2005_MS_Driver.configure(binder); + break; + + default: + throw new UnsupportedOperationException( + "A driver has been specified that is not supported by this module." + ); + } + + // Bind MyBatis properties + Names.bindProperties(binder, myBatisProperties); + + // Bind JDBC driver properties + binder.bind(Properties.class) + .annotatedWith(Names.named("JDBC.driverProperties")) + .toInstance(driverProperties); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerInjectorProvider.java new file mode 100644 index 0000000..667174e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerInjectorProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; +import org.apache.guacamole.auth.jdbc.JDBCInjectorProvider; +import org.apache.guacamole.auth.sqlserver.conf.SQLServerEnvironment; + +/** + * JDBCInjectorProvider implementation which configures Guice injections for + * connecting to a SQLServer database based on SQLServer-specific options + * provided via guacamole.properties. + */ +public class SQLServerInjectorProvider extends JDBCInjectorProvider { + + @Override + protected Injector create() throws GuacamoleException { + + // Get local environment + SQLServerEnvironment environment = new SQLServerEnvironment(); + + // Set up Guice injector + return Guice.createInjector( + new JDBCAuthenticationProviderModule(environment), + new SQLServerAuthenticationProviderModule(environment) + ); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerSharedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerSharedAuthenticationProvider.java new file mode 100644 index 0000000..0a3c8d3 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/SQLServerSharedAuthenticationProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.sharing.SharedAuthenticationProviderService; + +/** + * Provides a implementation of AuthenticationProvider which interacts with the + * SQLServer AuthenticationProvider, accepting share keys as credentials and + * providing access to the shared connections. + */ +public class SQLServerSharedAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new SQLServerSharedAuthenticationProvider that provides access + * to shared connections exposed by the SQLServerAuthenticationProvider. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public SQLServerSharedAuthenticationProvider() throws GuacamoleException { + super(new SQLServerInjectorProvider(), SharedAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "sqlserver-shared"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerDriver.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerDriver.java new file mode 100644 index 0000000..4a4321e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerDriver.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver.conf; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * The possible SQL Server drivers to use when using a TDS-compatible database. + */ +public enum SQLServerDriver { + + /** + * The open source jTDS driver. + */ + @PropertyValue("jtds") + JTDS, + + /** + * The Progress DataDirect driver. + */ + @PropertyValue("datadirect") + DATA_DIRECT, + + /** + * The Microsoft Legacy SQL Server driver. + */ + @PropertyValue("microsoft") + MICROSOFT_LEGACY, + + /** + * The Microsoft 2005 SQL Server driver. + */ + @PropertyValue("microsoft2005") + MICROSOFT_2005; +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerEnvironment.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerEnvironment.java new file mode 100644 index 0000000..498479d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerEnvironment.java @@ -0,0 +1,332 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver.conf; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.ibatis.session.SqlSession; + +/** + * A SQLServer-specific implementation of JDBCEnvironment provides database + * properties specifically for SQLServer. + */ +public class SQLServerEnvironment extends JDBCEnvironment { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(SQLServerEnvironment.class); + + /** + * The default host to connect to, if SQLSERVER_HOSTNAME is not specified. + */ + private static final String DEFAULT_HOSTNAME = "localhost"; + + /** + * The default port to connect to, if SQLSERVER_PORT is not specified. + */ + private static final int DEFAULT_PORT = 1433; + + /** + * Whether a database user account is required by default for authentication + * to succeed. + */ + private static final boolean DEFAULT_USER_REQUIRED = false; + + /** + * The default value for the maximum number of connections to be + * allowed to the Guacamole server overall. + */ + private static final int DEFAULT_ABSOLUTE_MAX_CONNECTIONS = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed per user to any one connection. + */ + private static final int DEFAULT_MAX_CONNECTIONS_PER_USER = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed per user to any one connection group. + */ + private static final int DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER = 1; + + /** + * The default value for the default maximum number of connections to be + * allowed to any one connection. + */ + private static final int DEFAULT_MAX_CONNECTIONS = 0; + + /** + * The default value for the default maximum number of connections to be + * allowed to any one connection group. + */ + private static final int DEFAULT_MAX_GROUP_CONNECTIONS = 0; + + /** + * The default SQLServer driver to use. + */ + public static final SQLServerDriver SQLSERVER_DEFAULT_DRIVER = SQLServerDriver.MICROSOFT_2005; + + /** + * The default maximum number of identifiers/parameters to be included in a + * single batch when executing SQL statements for SQL Server. + * + * SQL Server supports a maximum of 2100 parameters per query. A value of + * 500 is chosen to stay within this limit and avoid query execution errors, + * as some queries involve multiple parameters per item - namely retrieval + * of connections. + * + * @see https://docs.microsoft.com/en-us/sql/sql-server/maximum-capacity-specifications-for-sql-server + */ + private static final int DEFAULT_BATCH_SIZE = 500; + + /** + * Constructs a new SQLServerEnvironment, providing access to SQLServer-specific + * configuration options. + * + * @throws GuacamoleException + * If an error occurs while setting up the underlying JDBCEnvironment + * or while parsing legacy SQLServer configuration options. + */ + public SQLServerEnvironment() throws GuacamoleException { + + // Init underlying JDBC environment + super(); + + } + + @Override + public boolean isUserRequired() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_USER_REQUIRED, + DEFAULT_USER_REQUIRED + ); + } + + @Override + public int getAbsoluteMaxConnections() throws GuacamoleException { + return getProperty(SQLServerGuacamoleProperties.SQLSERVER_ABSOLUTE_MAX_CONNECTIONS, + DEFAULT_ABSOLUTE_MAX_CONNECTIONS + ); + } + + @Override + public int getBatchSize() throws GuacamoleException { + return getProperty(SQLServerGuacamoleProperties.SQLSERVER_BATCH_SIZE, + DEFAULT_BATCH_SIZE + ); + } + + @Override + public int getDefaultMaxConnections() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_DEFAULT_MAX_CONNECTIONS, + DEFAULT_MAX_CONNECTIONS + ); + } + + @Override + public int getDefaultMaxGroupConnections() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_DEFAULT_MAX_GROUP_CONNECTIONS, + DEFAULT_MAX_GROUP_CONNECTIONS + ); + } + + @Override + public int getDefaultMaxConnectionsPerUser() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_DEFAULT_MAX_CONNECTIONS_PER_USER, + DEFAULT_MAX_CONNECTIONS_PER_USER + ); + } + + @Override + public int getDefaultMaxGroupConnectionsPerUser() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER, + DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER + ); + } + + @Override + public PasswordPolicy getPasswordPolicy() { + return new SQLServerPasswordPolicy(this); + } + + /** + * Returns the hostname of the SQLServer server hosting the Guacamole + * authentication tables. If unspecified, this will be "localhost". + * + * @return + * The URL of the SQLServer server. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public String getSQLServerHostname() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_HOSTNAME, + DEFAULT_HOSTNAME + ); + } + + /** + * Returns the instance name of the SQL Server installation hosting the + * Guacamole database, if any. If unspecified it will be null. + * + * @return + * The instance name of the SQL Server install hosting the Guacamole + * database, or null if undefined. + * + * @throws GuacamoleException + * If an error occurs reading guacamole.properties. + */ + public String getSQLServerInstance() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_INSTANCE + ); + } + + /** + * Returns the port number of the SQLServer server hosting the Guacamole + * authentication tables. If unspecified, this will be the default + * SQLServer port of 5432. + * + * @return + * The port number of the SQLServer server. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value. + */ + public int getSQLServerPort() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_PORT, + DEFAULT_PORT + ); + } + + /** + * Returns the name of the SQLServer database containing the Guacamole + * authentication tables. + * + * @return + * The name of the SQLServer database. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public String getSQLServerDatabase() throws GuacamoleException { + return getRequiredProperty(SQLServerGuacamoleProperties.SQLSERVER_DATABASE); + } + + @Override + public String getUsername() throws GuacamoleException { + return getRequiredProperty(SQLServerGuacamoleProperties.SQLSERVER_USERNAME); + } + + @Override + public String getPassword() throws GuacamoleException { + return getRequiredProperty(SQLServerGuacamoleProperties.SQLSERVER_PASSWORD); + } + + /** + * Returns which JDBC driver should be used to make the SQLServer/TDS connection. + * + * @return + * Which TDS-compatible JDBC driver should be used. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public SQLServerDriver getSQLServerDriver() throws GuacamoleException { + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_DRIVER, + SQLSERVER_DEFAULT_DRIVER + ); + } + + @Override + public boolean isRecursiveQuerySupported(SqlSession session) { + return true; // All versions of SQL Server support recursive queries through CTEs + } + + @Override + public boolean autoCreateAbsentAccounts() throws GuacamoleException { + return getProperty(SQLServerGuacamoleProperties.SQLSERVER_AUTO_CREATE_ACCOUNTS, + false); + } + + @Override + public boolean trackExternalConnectionHistory() throws GuacamoleException { + + // Track external connection history unless explicitly disabled + return getProperty(SQLServerGuacamoleProperties.SQLSERVER_TRACK_EXTERNAL_CONNECTION_HISTORY, + true); + } + + @Override + public boolean enforceAccessWindowsForActiveSessions() throws GuacamoleException { + + // Enforce access window restrictions for active sessions unless explicitly disabled + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_ENFORCE_ACCESS_WINDOWS_FOR_ACTIVE_SESSIONS, + true); + } + + @Override + public boolean shouldUseBatchExecutor() { + + // The SQL Server driver does not work when batch execution is enabled. + // Specifically, inserts fail with com.microsoft.sqlserver.jdbc.SQLServerException: + // The statement must be executed before any results can be obtained. + // See https://github.com/microsoft/mssql-jdbc/issues/358 for more. + logger.warn( + "JDBC batch executor is disabled for SQL Server Connections. " + + "Large batched updates may run slower." + ); + return false; + + } + + /** + * Returns true if all server certificates should be trusted, including + * those signed by an unknown certificate authority, such as self-signed + * certificates, or false otherwise. + * + * @throws GuacamoleException + * If an error occurs while retrieving the property value, or if the + * value was not set, as this property is required. + */ + public boolean trustAllServerCertificates() throws GuacamoleException { + + // Do not trust unknown certificates unless explicitly enabled + return getProperty( + SQLServerGuacamoleProperties.SQLSERVER_TRUST_ALL_SERVER_CERTIFICATES, + false); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerGuacamoleProperties.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerGuacamoleProperties.java new file mode 100644 index 0000000..c4df813 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerGuacamoleProperties.java @@ -0,0 +1,261 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver.conf; + +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; + +/** + * Properties used by the SQLServer Authentication plugin. + */ +public class SQLServerGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private SQLServerGuacamoleProperties() {} + + /** + * The URL of the SQLServer server hosting the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty SQLSERVER_HOSTNAME = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-hostname"; } + + }; + + /** + * The instance name of the SQL Server where the Guacamole database is running. + */ + public static final StringGuacamoleProperty SQLSERVER_INSTANCE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-instance"; } + + }; + + /** + * The port of the SQLServer server hosting the Guacamole authentication + * tables. + */ + public static final IntegerGuacamoleProperty SQLSERVER_PORT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-port"; } + + }; + + /** + * The name of the SQLServer database containing the Guacamole + * authentication tables. + */ + public static final StringGuacamoleProperty SQLSERVER_DATABASE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-database"; } + + }; + + /** + * The username used to authenticate to the SQLServer database containing + * the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty SQLSERVER_USERNAME = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-username"; } + + }; + + /** + * The password used to authenticate to the SQLServer database containing + * the Guacamole authentication tables. + */ + public static final StringGuacamoleProperty SQLSERVER_PASSWORD = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-password"; } + + }; + + /** + * Whether a user account within the database is required for authentication + * to succeed, even if the user has been authenticated via another + * authentication provider. + */ + public static final BooleanGuacamoleProperty + SQLSERVER_USER_REQUIRED = new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-required"; } + + }; + + /** + * The maximum number of concurrent connections to allow overall. Zero + * denotes unlimited. + */ + public static final IntegerGuacamoleProperty + SQLSERVER_ABSOLUTE_MAX_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-absolute-max-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + SQLSERVER_DEFAULT_MAX_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-default-max-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection group. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + SQLSERVER_DEFAULT_MAX_GROUP_CONNECTIONS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-default-max-group-connections"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection by an individual user. Zero denotes unlimited. + */ + public static final IntegerGuacamoleProperty + SQLSERVER_DEFAULT_MAX_CONNECTIONS_PER_USER = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-default-max-connections-per-user"; } + + }; + + /** + * The maximum number of concurrent connections to allow to any one + * connection group by an individual user. Zero denotes + * unlimited. + */ + public static final IntegerGuacamoleProperty + SQLSERVER_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-default-max-group-connections-per-user"; } + + }; + + /** + * Which TDS-compatible JDBC driver should be used for the connection. + */ + public static final EnumGuacamoleProperty + SQLSERVER_DRIVER = new EnumGuacamoleProperty(SQLServerDriver.class) { + + @Override + public String getName() { return "sqlserver-driver"; } + + }; + + /** + * Whether or not to automatically create accounts in the SQL Server + * database for users who successfully authenticate through another + * extension. By default users will not be automatically created. + */ + public static final BooleanGuacamoleProperty SQLSERVER_AUTO_CREATE_ACCOUNTS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-auto-create-accounts"; } + + }; + + /** + * Whether or not to track connection history for connections that do not originate + * from within the SQL Server database. By default, external connection history will be + * tracked. + */ + public static final BooleanGuacamoleProperty SQLSERVER_TRACK_EXTERNAL_CONNECTION_HISTORY = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-track-external-connection-history"; } + + }; + + /** + * Whether or not user-specific access time windows should be enforced for active sessions, + * i.e. whether users with active sessions should be logged out immediately when an access + * window closes. + */ + public static final BooleanGuacamoleProperty SQLSERVER_ENFORCE_ACCESS_WINDOWS_FOR_ACTIVE_SESSIONS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-enforce-access-windows-for-active-sessions"; } + + }; + + /** + * The maximum number of identifiers/parameters to be included in a single batch when + * executing SQL statements. + */ + public static final IntegerGuacamoleProperty SQLSERVER_BATCH_SIZE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-batch-size"; } + + }; + + /** + * Whether or not all server certificates should be trusted, including those + * signed by an unknown certificate authority, such as self-signed + * certificates. + */ + public static final BooleanGuacamoleProperty SQLSERVER_TRUST_ALL_SERVER_CERTIFICATES = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-trust-all-server-certificates"; } + + }; + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerPasswordPolicy.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerPasswordPolicy.java new file mode 100644 index 0000000..e18649b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/conf/SQLServerPasswordPolicy.java @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sqlserver.conf; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCEnvironment; +import org.apache.guacamole.auth.jdbc.security.PasswordPolicy; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; + +/** + * PasswordPolicy implementation which reads the details of the policy from + * SQLServer-specific properties in guacamole.properties. + */ +public class SQLServerPasswordPolicy implements PasswordPolicy { + + /** + * The property which specifies the minimum length required of all user + * passwords. By default, this will be zero. + */ + private static final IntegerGuacamoleProperty MIN_LENGTH = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-min-length"; } + + }; + + /** + * The property which specifies the minimum number of days which must + * elapse before a user may reset their password. If set to zero, the + * default, then this restriction does not apply. + */ + private static final IntegerGuacamoleProperty MIN_AGE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-min-age"; } + + }; + + /** + * The property which specifies the maximum number of days which may + * elapse before a user is required to reset their password. If set to zero, + * the default, then this restriction does not apply. + */ + private static final IntegerGuacamoleProperty MAX_AGE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-max-age"; } + + }; + + /** + * The property which specifies the number of previous passwords remembered + * for each user. If set to zero, the default, then this restriction does + * not apply. + */ + private static final IntegerGuacamoleProperty HISTORY_SIZE = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-history-size"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one lowercase character and one uppercase character. By default, + * no such restriction is imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_MULTIPLE_CASE = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-require-multiple-case"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one numeric character (digit). By default, no such restriction is + * imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_DIGIT = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-require-digit"; } + + }; + + /** + * The property which specifies whether all user passwords must have at + * least one non-alphanumeric character (symbol). By default, no such + * restriction is imposed. + */ + private static final BooleanGuacamoleProperty REQUIRE_SYMBOL = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-require-symbol"; } + + }; + + /** + * The property which specifies whether users are prohibited from including + * their own username in their password. By default, no such restriction is + * imposed. + */ + private static final BooleanGuacamoleProperty PROHIBIT_USERNAME = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "sqlserver-user-password-prohibit-username"; } + + }; + + /** + * The Guacamole server environment. + */ + private final JDBCEnvironment environment; + + /** + * Creates a new SQLServerPasswordPolicy which reads the details of the + * policy from the properties exposed by the given environment. + * + * @param environment + * The environment from which password policy properties should be + * read. + */ + public SQLServerPasswordPolicy(JDBCEnvironment environment) { + this.environment = environment; + } + + @Override + public int getMinimumLength() throws GuacamoleException { + return environment.getProperty(MIN_LENGTH, 0); + } + + @Override + public int getMinimumAge() throws GuacamoleException { + return environment.getProperty(MIN_AGE, 0); + } + + @Override + public int getMaximumAge() throws GuacamoleException { + return environment.getProperty(MAX_AGE, 0); + } + + @Override + public int getHistorySize() throws GuacamoleException { + return environment.getProperty(HISTORY_SIZE, 0); + } + + @Override + public boolean isMultipleCaseRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_MULTIPLE_CASE, false); + } + + @Override + public boolean isNumericRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_DIGIT, false); + } + + @Override + public boolean isNonAlphanumericRequired() throws GuacamoleException { + return environment.getProperty(REQUIRE_SYMBOL, false); + } + + @Override + public boolean isUsernameProhibited() throws GuacamoleException { + return environment.getProperty(PROHIBIT_USERNAME, false); + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/package-info.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/package-info.java new file mode 100644 index 0000000..7bbe1b2 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/java/org/apache/guacamole/auth/sqlserver/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The SQLServer authentication provider. + */ +package org.apache.guacamole.auth.sqlserver; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..8ee7ac1 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/guac-manifest.json @@ -0,0 +1,36 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "SQLServer Authentication", + "namespace" : "sqlserver", + + "authProviders" : [ + "org.apache.guacamole.auth.sqlserver.SQLServerAuthenticationProvider", + "org.apache.guacamole.auth.sqlserver.SQLServerSharedAuthenticationProvider" + ], + + "css" : [ + "styles/jdbc.css" + ], + + "html" : [ + "html/shared-connection.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/es.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] + +} + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml new file mode 100644 index 0000000..b58938d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml @@ -0,0 +1,151 @@ + + + + + + + + + + ( + ${column} = ${entityID} + + OR ${column} IN ( + SELECT [guacamole_entity].entity_id + FROM [guacamole_entity] + JOIN [guacamole_user_group] ON [guacamole_user_group].entity_id = [guacamole_entity].entity_id + WHERE + type = 'USER_GROUP' + AND + + + name IN + + #{effectiveGroup,jdbcType=VARCHAR} + + + + LOWER(name) IN + + LOWER(#{effectiveGroup,jdbcType=VARCHAR}) + + + + AND disabled = 0 + ) + + ) + + + + + + + + + INSERT INTO [guacamole_entity] ( + name, + type + ) + VALUES ( + #{entity.identifier,jdbcType=VARCHAR}, + #{entity.entityType,jdbcType=VARCHAR} + ) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml new file mode 100644 index 0000000..d811139 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT connection_id + FROM [guacamole_connection_permission] + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_connection] + WHERE connection_id = #{identifier,jdbcType=INTEGER} + + + + + + INSERT INTO [guacamole_connection] ( + connection_name, + parent_id, + protocol, + max_connections, + max_connections_per_user, + proxy_hostname, + proxy_port, + proxy_encryption_method, + connection_weight, + failover_only + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=INTEGER}, + #{object.protocol,jdbcType=VARCHAR}, + #{object.maxConnections,jdbcType=INTEGER}, + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.proxyHostname,jdbcType=VARCHAR}, + #{object.proxyPort,jdbcType=INTEGER}, + #{object.proxyEncryptionMethod,jdbcType=VARCHAR}, + #{object.connectionWeight,jdbcType=INTEGER}, + #{object.failoverOnly,jdbcType=INTEGER} + ) + + + + + + UPDATE [guacamole_connection] + SET connection_name = #{object.name,jdbcType=VARCHAR}, + parent_id = #{object.parentIdentifier,jdbcType=INTEGER}, + protocol = #{object.protocol,jdbcType=VARCHAR}, + max_connections = #{object.maxConnections,jdbcType=INTEGER}, + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + proxy_hostname = #{object.proxyHostname,jdbcType=VARCHAR}, + proxy_port = #{object.proxyPort,jdbcType=INTEGER}, + proxy_encryption_method = #{object.proxyEncryptionMethod,jdbcType=VARCHAR}, + connection_weight = #{object.connectionWeight,jdbcType=INTEGER}, + failover_only = #{object.failoverOnly,jdbcType=INTEGER} + WHERE connection_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM [guacamole_connection_attribute] + WHERE connection_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO [guacamole_connection_attribute] ( + connection_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml new file mode 100644 index 0000000..08b337e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionParameterMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_connection_parameter] + WHERE connection_id = #{identifier,jdbcType=INTEGER} + + + + + + INSERT INTO [guacamole_connection_parameter] ( + connection_id, + parameter_name, + parameter_value + ) + VALUES + + (#{parameter.connectionIdentifier,jdbcType=INTEGER}, + #{parameter.name,jdbcType=VARCHAR}, + #{parameter.value,jdbcType=VARCHAR}) + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml new file mode 100644 index 0000000..7bbfe21 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + UPDATE [guacamole_connection_history] + SET end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER} + + + + + + INSERT INTO [guacamole_connection_history] ( + connection_id, + connection_name, + remote_host, + sharing_profile_id, + sharing_profile_name, + user_id, + username, + start_date, + end_date + ) + VALUES ( + #{record.connectionIdentifier,jdbcType=INTEGER}, + #{record.connectionName,jdbcType=VARCHAR}, + #{record.remoteHost,jdbcType=VARCHAR}, + #{record.sharingProfileIdentifier,jdbcType=INTEGER}, + #{record.sharingProfileName,jdbcType=VARCHAR}, + (SELECT user_id FROM [guacamole_user] + JOIN [guacamole_entity] ON [guacamole_user].entity_id = [guacamole_entity].entity_id + WHERE + + + [guacamole_entity].name = #{record.username,jdbcType=VARCHAR} + + + LOWER([guacamole_entity].name) = LOWER(#{record.username,jdbcType=VARCHAR}) + + + AND [guacamole_entity].type = 'USER'), + #{record.username,jdbcType=VARCHAR}, + #{record.startDate,jdbcType=TIMESTAMP}, + #{record.endDate,jdbcType=TIMESTAMP} + ) + + + + + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml new file mode 100644 index 0000000..e0d3368 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT connection_group_id + FROM [guacamole_connection_group_permission] + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_connection_group] + WHERE connection_group_id = #{identifier,jdbcType=INTEGER} + + + + + + INSERT INTO [guacamole_connection_group] ( + connection_group_name, + parent_id, + type, + max_connections, + max_connections_per_user, + enable_session_affinity + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=INTEGER}, + #{object.type,jdbcType=VARCHAR}, + #{object.maxConnections,jdbcType=INTEGER}, + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.sessionAffinityEnabled,jdbcType=INTEGER} + ) + + + + + + UPDATE [guacamole_connection_group] + SET connection_group_name = #{object.name,jdbcType=VARCHAR}, + parent_id = #{object.parentIdentifier,jdbcType=INTEGER}, + type = #{object.type,jdbcType=VARCHAR}, + max_connections = #{object.maxConnections,jdbcType=INTEGER}, + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + enable_session_affinity = #{object.sessionAffinityEnabled,jdbcType=INTEGER} + WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM [guacamole_connection_group_attribute] + WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO [guacamole_connection_group_attribute] ( + connection_group_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml new file mode 100644 index 0000000..6ed0a46 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_connection_group_permission] + WHERE + + (entity_id = #{permission.entityID,jdbcType=INTEGER} AND + permission = #{permission.type,jdbcType=VARCHAR} AND + connection_group_id = #{permission.objectIdentifier,jdbcType=INTEGER}) + + + + + + + + INSERT INTO [guacamole_connection_group_permission] ( + entity_id, + permission, + connection_group_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + permissions.connection_group_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER} AS connection_group_id + + AS permissions + WHERE NOT EXISTS (SELECT 1 FROM [guacamole_connection_group_permission] + WHERE [guacamole_connection_group_permission].entity_id = permissions.entity_id AND + [guacamole_connection_group_permission].permission = permissions.permission AND + [guacamole_connection_group_permission].connection_group_id = permissions.connection_group_id + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml new file mode 100644 index 0000000..018f22e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_connection_permission] + WHERE + + (entity_id = #{permission.entityID,jdbcType=INTEGER} AND + permission = #{permission.type,jdbcType=VARCHAR} AND + connection_id = #{permission.objectIdentifier,jdbcType=INTEGER}) + + + + + + + + INSERT INTO [guacamole_connection_permission] ( + entity_id, + permission, + connection_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + permissions.connection_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER} AS connection_id + + AS permissions + WHERE NOT EXISTS ( SELECT 1 FROM [guacamole_connection_permission] + WHERE [guacamole_connection_permission].entity_id = permissions.entity_id AND + [guacamole_connection_permission].permission = permissions.permission AND + [guacamole_connection_permission].connection_id = permissions.connection_id + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml new file mode 100644 index 0000000..8a2702d --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_sharing_profile_permission] + WHERE + + (entity_id = #{permission.entityID,jdbcType=INTEGER} AND + permission = #{permission.type,jdbcType=VARCHAR} AND + sharing_profile_id = #{permission.objectIdentifier,jdbcType=INTEGER}) + + + + + + + + INSERT INTO [guacamole_sharing_profile_permission] ( + entity_id, + permission, + sharing_profile_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + permissions.sharing_profile_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER} AS sharing_profile_id + + AS permissions + WHERE NOT EXISTS (SELECT 1 FROM [guacamole_sharing_profile_permission] + WHERE [guacamole_sharing_profile_permission].entity_id = permissions.entity_id + AND [guacamole_sharing_profile_permission].permission = permissions.permission + AND [guacamole_sharing_profile_permission].sharing_profile_id = permissions.sharing_profile_id + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml new file mode 100644 index 0000000..d12e19b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_system_permission] + WHERE + + (entity_id = #{permission.entityID,jdbcType=INTEGER} + AND permission = #{permission.type,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO [guacamole_system_permission] ( + entity_id, + permission + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission + + AS permissions + WHERE NOT EXISTS (SELECT 1 FROM [guacamole_system_permission] + WHERE [guacamole_system_permission].entity_id = permissions.entity_id + AND [guacamole_system_permission].permission = permissions.permission + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml new file mode 100644 index 0000000..2a7be87 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserGroupPermissionMapper.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE [guacamole_user_group_permission] + FROM [guacamole_user_group_permission] + JOIN [guacamole_user_group] affected_group ON [guacamole_user_group_permission].affected_user_group_id = affected_group.user_group_id + JOIN [guacamole_entity] affected_entity ON affected_group.entity_id = affected_entity.entity_id + WHERE + + ([guacamole_user_group_permission].entity_id = #{permission.entityID,jdbcType=INTEGER} AND + permission = #{permission.type,jdbcType=VARCHAR} AND + affected_entity.type = 'USER_GROUP' + + + affected_entity.name = #{permission.objectIdentifier,jdbcType=VARCHAR} + + + LOWER(affected_entity.name) = LOWER(#{permission.objectIdentifier,jdbcType=VARCHAR}) + + + ) + + + + + + + + INSERT INTO [guacamole_user_group_permission] ( + entity_id, + permission, + affected_user_group_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + affected_group.user_group_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=VARCHAR} AS affected_name + + AS permissions + JOIN [guacamole_entity] affected_entity ON + affected_entity.type = 'USER_GROUP' + AND + + + affected_entity.name = permissions.affected_name + + + LOWER(affected_entity.name) = LOWER(permissions.affected_name) + + + JOIN [guacamole_user_group] affected_group ON affected_group.entity_id = affected_entity.entity_id + WHERE NOT EXISTS (SELECT 1 FROM [guacamole_user_group_permission] + WHERE [guacamole_user_group_permission].entity_id = permissions.entity_id + AND [guacamole_user_group_permission].permission = permissions.permission + AND [guacamole_user_group_permission].affected_user_group_id = affected_group.user_group_id + ); + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml new file mode 100644 index 0000000..279d351 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE [guacamole_user_permission] + FROM [guacamole_user_permission] + JOIN [guacamole_user] affected_user ON [guacamole_user_permission].affected_user_id = affected_user.user_id + JOIN [guacamole_entity] affected_entity ON affected_user.entity_id = affected_entity.entity_id + WHERE + + ([guacamole_user_permission].entity_id = #{permission.entityID,jdbcType=INTEGER} AND + permission = #{permission.type,jdbcType=VARCHAR} AND + + + affected_entity.name = #{permission.objectIdentifier,jdbcType=VARCHAR} + + + LOWER(affected_entity.name = LOWER(#{permission.objectIdentifier,jdbcType=VARCHAR}) + + + AND + affected_entity.type = 'USER') + + + + + + + + INSERT INTO [guacamole_user_permission] ( + entity_id, + permission, + affected_user_id + ) + SELECT DISTINCT + permissions.entity_id, + permissions.permission, + affected_user.user_id + FROM + + SELECT #{permission.entityID,jdbcType=INTEGER} AS entity_id, + #{permission.type,jdbcType=VARCHAR} AS permission, + #{permission.objectIdentifier,jdbcType=INTEGER} AS affected_name + + AS permissions + JOIN [guacamole_entity] affected_entity ON + affected_entity.type = 'USER' + AND + + + affected_entity.name = permissions.affected_name + + + LOWER(affected_entity.name) = LOWER(permissions.affected_name) + + + JOIN [guacamole_user] affected_user ON affected_user.entity_id = affected_entity.entity_id + WHERE NOT EXISTS (SELECT 1 FROM [guacamole_user_permission] + WHERE [guacamole_user_permission].entity_id = permissions.entity_id + AND [guacamole_user_permission].permission = permissions.permission + AND [guacamole_user_permission].affected_user_id = affected_user.user_id + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml new file mode 100644 index 0000000..222c737 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT sharing_profile_id + FROM [guacamole_sharing_profile_permission] + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_sharing_profile] + WHERE sharing_profile_id = #{identifier,jdbcType=INTEGER} + + + + + + INSERT INTO [guacamole_sharing_profile] ( + sharing_profile_name, + primary_connection_id + ) + VALUES ( + #{object.name,jdbcType=VARCHAR}, + #{object.parentIdentifier,jdbcType=INTEGER} + ) + + + + + + UPDATE [guacamole_sharing_profile] + SET sharing_profile_name = #{object.name,jdbcType=VARCHAR}, + primary_connection_id = #{object.parentIdentifier,jdbcType=INTEGER} + WHERE sharing_profile_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM [guacamole_sharing_profile_attribute] + WHERE sharing_profile_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO [guacamole_sharing_profile_attribute] ( + sharing_profile_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + \ No newline at end of file diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml new file mode 100644 index 0000000..a4327b4 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileParameterMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_sharing_profile_parameter] + WHERE sharing_profile_id = #{identifier,jdbcType=INTEGER} + + + + + + INSERT INTO [guacamole_sharing_profile_parameter] ( + sharing_profile_id, + parameter_name, + parameter_value + ) + VALUES + + (#{parameter.sharingProfileIdentifier,jdbcType=INTEGER}, + #{parameter.name,jdbcType=VARCHAR}, + #{parameter.value,jdbcType=VARCHAR}) + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml new file mode 100644 index 0000000..4aad5d6 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/PasswordRecordMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + INSERT INTO [guacamole_user_password_history] ( + user_id, + password_hash, + password_salt, + password_date + ) + VALUES ( + #{record.userID,jdbcType=INTEGER}, + #{record.passwordHash,jdbcType=BINARY}, + #{record.passwordSalt,jdbcType=BINARY}, + #{record.passwordDate,jdbcType=TIMESTAMP} + ); + + DELETE FROM [guacamole_user_password_history] + WHERE user_id = #{record.userID,jdbcType=INTEGER} + AND password_history_id NOT IN ( + SELECT TOP(#{maxHistorySize}) password_history_id + FROM [guacamole_user_password_history] + WHERE user_id = #{record.userID,jdbcType=INTEGER} + ORDER BY password_date DESC + ); + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml new file mode 100644 index 0000000..2b7e01e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT [guacamole_user_permission].affected_user_id + FROM [guacamole_user_permission] + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_entity] + WHERE + type = 'USER' + AND + + + name = #{identifier,jdbcType=VARCHAR} + + + LOWER(name) = LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO [guacamole_user] ( + entity_id, + password_hash, + password_salt, + password_date, + disabled, + expired, + access_window_start, + access_window_end, + valid_from, + valid_until, + timezone, + full_name, + email_address, + organization, + organizational_role + ) + VALUES ( + #{object.entityID,jdbcType=VARCHAR}, + #{object.passwordHash,jdbcType=BINARY}, + #{object.passwordSalt,jdbcType=BINARY}, + #{object.passwordDate,jdbcType=TIMESTAMP}, + #{object.disabled,jdbcType=INTEGER}, + #{object.expired,jdbcType=INTEGER}, + #{object.accessWindowStart,jdbcType=TIME}, + #{object.accessWindowEnd,jdbcType=TIME}, + #{object.validFrom,jdbcType=DATE}, + #{object.validUntil,jdbcType=DATE}, + #{object.timeZone,jdbcType=VARCHAR}, + #{object.fullName,jdbcType=VARCHAR}, + #{object.emailAddress,jdbcType=VARCHAR}, + #{object.organization,jdbcType=VARCHAR}, + #{object.organizationalRole,jdbcType=VARCHAR} + ) + + + + + + UPDATE [guacamole_user] + SET password_hash = #{object.passwordHash,jdbcType=BINARY}, + password_salt = #{object.passwordSalt,jdbcType=BINARY}, + password_date = #{object.passwordDate,jdbcType=TIMESTAMP}, + disabled = #{object.disabled,jdbcType=INTEGER}, + expired = #{object.expired,jdbcType=INTEGER}, + access_window_start = #{object.accessWindowStart,jdbcType=TIME}, + access_window_end = #{object.accessWindowEnd,jdbcType=TIME}, + valid_from = #{object.validFrom,jdbcType=DATE}, + valid_until = #{object.validUntil,jdbcType=DATE}, + timezone = #{object.timeZone,jdbcType=VARCHAR}, + full_name = #{object.fullName,jdbcType=VARCHAR}, + email_address = #{object.emailAddress,jdbcType=VARCHAR}, + organization = #{object.organization,jdbcType=VARCHAR}, + organizational_role = #{object.organizationalRole,jdbcType=VARCHAR} + WHERE user_id = #{object.objectID,jdbcType=INTEGER} + + + + + DELETE FROM [guacamole_user_attribute] + WHERE user_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO [guacamole_user_attribute] ( + user_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml new file mode 100644 index 0000000..c914994 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + DELETE [guacamole_user_group_member] + FROM [guacamole_user_group_member] + JOIN [guacamole_user_group] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id + JOIN [guacamole_entity] ON [guacamole_entity].entity_id = [guacamole_user_group].entity_id + WHERE + member_entity_id = #{parent.entityID,jdbcType=INTEGER} + AND [guacamole_entity].type = 'USER_GROUP' + AND + + + [guacamole_entity].name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER([guacamole_entity].name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO [guacamole_user_group_member] ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + [guacamole_user_group].user_group_id, + #{parent.entityID,jdbcType=INTEGER} + FROM [guacamole_user_group] + JOIN [guacamole_entity] ON [guacamole_user_group].entity_id = [guacamole_entity].entity_id + WHERE + [guacamole_entity].type = 'USER_GROUP' + AND + + + [guacamole_entity].name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER([guacamole_entity].name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + AND [guacamole_user_group].user_group_id NOT IN ( + SELECT [guacamole_user_group_member].user_group_id + FROM [guacamole_user_group_member] + WHERE [guacamole_user_group_member].member_entity_id = #{parent.entityID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml new file mode 100644 index 0000000..d104c90 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + INSERT INTO [guacamole_user_history] ( + remote_host, + user_id, + username, + start_date, + end_date + ) + VALUES ( + #{record.remoteHost,jdbcType=VARCHAR}, + (SELECT user_id FROM [guacamole_user] + JOIN [guacamole_entity] ON [guacamole_user].entity_id = [guacamole_entity].entity_id + WHERE + + + [guacamole_entity].name = #{record.username,jdbcType=VARCHAR} + + + LOWER([guacamole_entity].name) = LOWER(#{record.username,jdbcType=VARCHAR}) + + + AND [guacamole_entity].type = 'USER'), + #{record.username,jdbcType=VARCHAR}, + #{record.startDate,jdbcType=TIMESTAMP}, + #{record.endDate,jdbcType=TIMESTAMP} + ) + + + + + + UPDATE [guacamole_user_history] + SET end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER} + + + + + + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml new file mode 100644 index 0000000..ccbec3e --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT [guacamole_user_group_permission].affected_user_group_id + FROM [guacamole_user_group_permission] + WHERE + + + + + + + AND permission = 'READ' + + + + + + + + + + + + + + + + + DELETE FROM [guacamole_entity] + WHERE + name = #{identifier,jdbcType=VARCHAR} + AND type = 'USER_GROUP' + + + + + + INSERT INTO [guacamole_user_group] ( + entity_id, + disabled + ) + VALUES ( + #{object.entityID,jdbcType=VARCHAR}, + #{object.disabled,jdbcType=BOOLEAN} + ) + + + + + + UPDATE [guacamole_user_group] + SET disabled = #{object.disabled,jdbcType=BOOLEAN} + WHERE user_group_id = #{object.objectID,jdbcType=VARCHAR} + + + + + DELETE FROM [guacamole_user_group_attribute] + WHERE user_group_id = #{object.objectID,jdbcType=INTEGER} + + + + + INSERT INTO [guacamole_user_group_attribute] ( + user_group_id, + attribute_name, + attribute_value + ) + VALUES + + (#{object.objectID,jdbcType=INTEGER}, + #{attribute.name,jdbcType=VARCHAR}, + #{attribute.value,jdbcType=VARCHAR}) + + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml new file mode 100644 index 0000000..a457191 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + DELETE [guacamole_user_group_member] + FROM [guacamole_user_group_member] + JOIN [guacamole_entity] ON [guacamole_entity].entity_id = member_entity_id + WHERE + user_group_id = #{parent.objectID,jdbcType=INTEGER} + AND [guacamole_entity].type = 'USER_GROUP' + AND + + + [guacamole_entity].name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER([guacamole_entity].name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO [guacamole_user_group_member] ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + #{parent.objectID,jdbcType=INTEGER}, + [guacamole_entity].entity_id + FROM [guacamole_entity] + WHERE [guacamole_entity].type = 'USER_GROUP' + AND + + + [guacamole_entity].name IN + + #{identifier} + + + + LOWER([guacamole_entity].name) IN + + LOWER(#{identifier}) + + + + + AND [guacamole_entity].entity_id NOT IN ( + SELECT [guacamole_user_group_member].member_entity_id + FROM [guacamole_user_group_member] + WHERE [guacamole_user_group_member].user_group_id = #{parent.objectID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml new file mode 100644 index 0000000..6073c15 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + DELETE [guacamole_user_group_member] + FROM [guacamole_user_group_member] + JOIN [guacamole_entity] ON [guacamole_entity].entity_id = member_entity_id + WHERE + user_group_id = #{parent.objectID,jdbcType=INTEGER} + AND [guacamole_entity].type = 'USER' + AND + + + [guacamole_entity].name + + + LOWER([guacamole_entity].name) + + + IN + + + + #{identifier,jdbcType=VARCHAR} + + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + INSERT INTO [guacamole_user_group_member] ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + #{parent.objectID,jdbcType=INTEGER}, + [guacamole_entity].entity_id + FROM [guacamole_entity] + WHERE [guacamole_entity].type = 'USER' + AND + + + [guacamole_entity].name + + + LOWER([guacamole_entity].name) + + + IN + + + + #{identifier} + + + LOWER(#{identifier}) + + + + AND [guacamole_entity].entity_id NOT IN ( + SELECT [guacamole_user_group_member].member_entity_id + FROM [guacamole_user_group_member] + WHERE [guacamole_user_group_member].user_group_id = #{parent.objectID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml new file mode 100644 index 0000000..e791ffa --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + DELETE [guacamole_user_group_member] + FROM [guacamole_user_group_member] + JOIN [guacamole_user_group] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id + JOIN [guacamole_entity] ON [guacamole_entity].entity_id = [guacamole_user_group].entity_id + WHERE + member_entity_id = #{parent.entityID,jdbcType=INTEGER} + AND [guacamole_entity].type = 'USER_GROUP' + AND + + + [guacamole_entity].name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER([guacamole_entity].name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + + + + + + INSERT INTO [guacamole_user_group_member] ( + user_group_id, + member_entity_id + ) + SELECT DISTINCT + [guacamole_user_group].user_group_id, + #{parent.entityID,jdbcType=INTEGER} + FROM [guacamole_user_group] + JOIN [guacamole_entity] ON [guacamole_user_group].entity_id = [guacamole_entity].entity_id + WHERE [guacamole_entity].type = 'USER_GROUP' + AND + + + [guacamole_entity].name IN + + #{identifier,jdbcType=VARCHAR} + + + + LOWER([guacamole_entity].name) IN + + LOWER(#{identifier,jdbcType=VARCHAR}) + + + + AND [guacamole_user_group].user_group_id NOT IN ( + SELECT [guacamole_user_group_member].user_group_id + FROM [guacamole_user_group_member] + WHERE [guacamole_user_group_member].member_entity_id = #{parent.entityID,jdbcType=INTEGER} + ) + + + diff --git a/extensions/guacamole-auth-jdbc/pom.xml b/extensions/guacamole-auth-jdbc/pom.xml new file mode 100644 index 0000000..e9ac71f --- /dev/null +++ b/extensions/guacamole-auth-jdbc/pom.xml @@ -0,0 +1,69 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-jdbc + pom + 1.6.0 + guacamole-auth-jdbc + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + modules/guacamole-auth-jdbc-dist + + + modules/guacamole-auth-jdbc-base + + + modules/guacamole-auth-jdbc-mysql + modules/guacamole-auth-jdbc-postgresql + modules/guacamole-auth-jdbc-sqlserver + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + + diff --git a/extensions/guacamole-auth-json/.gitignore b/extensions/guacamole-auth-json/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-json/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-json/.ratignore b/extensions/guacamole-auth-json/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-json/doc/README.md b/extensions/guacamole-auth-json/doc/README.md new file mode 100644 index 0000000..8366a46 --- /dev/null +++ b/extensions/guacamole-auth-json/doc/README.md @@ -0,0 +1,200 @@ +guacamole-auth-json +=================== + +guacamole-auth-json is an authentication extension for [Apache +Guacamole](http://guacamole.apache.org/) which authenticates users using JSON +which has been signed using **HMAC/SHA-256** and encrypted with **128-bit AES +in CBC mode**. This JSON contains all information describing the user being +authenticated, as well as any connections they have access to. + +Configuring Guacamole to accept encrypted JSON +---------------------------------------------- + +To verify and decrypt the received signed and encrypted JSON, a secret key must +be generated which will be shared by both the Guacamole server and systems that +will generate the JSON data. As guacamole-auth-json uses 128-bit AES, this key +must be 128 bits. + +An easy way of generating such a key is to echo a passphrase through the +"md5sum" utility. This is the technique OpenSSL itself uses to generate 128-bit +keys from passphrases. For example: + + $ echo -n "ThisIsATest" | md5sum + 4c0b569e4c96df157eee1b65dd0e4d41 - + +The generated key must then be saved within `guacamole.properties` as the full +32-digit hex value using the `json-secret-key` property: + + json-secret-key: 4c0b569e4c96df157eee1b65dd0e4d41 + +JSON format +----------- + +The general format of the JSON (prior to being encrypted, signed, and sent to +Guacamole), is as follows: + + { + + "username" : "arbitraryUsername", + "expires" : TIMESTAMP, + "connections" : { + + "Connection Name" : { + "protocol" : "PROTOCOL", + "parameters" : { + "name1" : "value1", + "name2" : "value2", + ... + } + }, + + ... + + } + + } + +where `TIMESTAMP` is a standard UNIX epoch timestamp with millisecond +resolution (the number of milliseconds since midnight of January 1, 1970 UTC) +and `PROTOCOL` is the internal name of any of Guacamole's supported protocols, +such as `vnc`, `rdp`, or `ssh`. + +The JSON will cease to be accepted as valid after the server time passes the +timestamp. If no timestamp is specified, the data will not expire. + +The top-level JSON object which must be submitted to Guacamole has the +following properties: + +Property name | Type | Description +--------------|----------|------------ +`username` | `string` | The unique username of the user authenticated by the JSON. If the user is anonymous, this should be the empty string (`""`). +`expires` | `number` | The absolute time after which the JSON should no longer be accepted, even if the signature is valid, as a standard UNIX epoch timestamp with millisecond resolution (the number of milliseconds since midnight of January 1, 1970 UTC). +`connections` | `object` | The set of connections which should be exposed to the user by their corresponding, unique names. If no connections will be exposed to the user, this can simply be an empty object (`{}`). + +Each normal connection defined within each submitted JSON object has the +following properties: + +Property name | Type | Description +--------------|----------|------------ +`id` | `string` | An optional opaque value which uniquely identifies this connection across all other connections which may be active at any given time. This property is only required if you wish to allow the connection to be shared or shadowed. +`protocol` | `string` | The internal name of a supported protocol, such as `vnc`, `rdp`, or `ssh`. +`parameters` | `object` | An object representing the connection parameter name/value pairs to apply to the connection, as documented in the [Guacamole manual](https://guacamole.apache.org/doc/gug/configuring-guacamole.html#connection-configuration). + +Connections which share or shadow other connections use a `join` property +instead of a `protocol` property, where `join` contains the value of the `id` +property of the connection being joined: + +Property name | Type | Description +--------------|----------|------------ +`id` | `string` | An optional opaque value which uniquely identifies this connection across all other connections which may be active at any given time. This property is only required if you wish to allow the connection to be shared or shadowed. (Yes, a connection which shadows another connection may itself be shadowed.) +`join` | `string` | The opaque ID given within the `id` property of the connection being joined (shared / shadowed). +`parameters` | `object` | An object representing the connection parameter name/value pairs to apply to the connection, as documented in the [Guacamole manual](https://guacamole.apache.org/doc/gug/configuring-guacamole.html#connection-configuration). Most of the connection configuration is inherited from the connection being joined. In general, the only property relevant to joining connections is `read-only`. + +If a connection is configured to join another connection, that connection will +only be usable if the connection being joined is currently active. If two +connections are established having the same `id` value, only the last +connection will be joinable using the given `id`. + +Generating encrypted JSON +------------------------- + +To authenticate a user with the above JSON format, the JSON must be both signed +and encrypted using the same 128-bit secret key specified with the +`json-secret-key` within `guacamole.properties`: + +1. Generate JSON in the format described above +2. Sign the JSON using the secret key (the same 128-bit key stored within + `guacamole.properties` with the `json-secret-key` property) with + **HMAC/SHA-256**. Prepend the binary result of the signing process to the + plaintext JSON that was signed. +3. Encrypt the result of (2) above using **AES in CBC mode**, with the initial + vector (IV) set to all zero bytes. +4. Encode the encrypted result using base64. +5. POST the encrypted result to the `/api/tokens` REST endpoint as the value of + an HTTP parameter named `data` (or include it in the URL of any Guacamole + page as a query parameter named `data`). + + For example, if Guacamole is running on localhost at `/guacamole`, and + `BASE64_RESULT` is the result of the above process, the equivalent run of + the "curl" utility would be: + + $ curl --data-urlencode "data=BASE64_RESULT" http://localhost:8080/guacamole/api/tokens + + **NOTE:** Be sure to URL-encode the base64-encoded result prior to POSTing + it to `/api/tokens` or including it in the URL. Base64 can contain both "+" + and "=" characters, which have special meaning within URLs. + +If the data is invalid in any way, if the signature does not match, if +decryption or signature verification fails, or if the submitted data has +expired, the REST service will return an invalid credentials error and fail +without user-visible explanation. Details describing the error that occurred +will be in the Tomcat logs, however. + +Reference implementation +------------------------ + +The included shell script, `doc/encrypt-json.sh`, uses the OpenSSL command-line +utility to encrypt and sign JSON in the manner that guacamole-auth-json +requires. It is thoroughly commented and should work well as a reference +implementation, for testing, and as a point of comparison for development. The +script is run as: + + $ ./encrypt-json.sh HEX_ENCRYPTION_KEY file-to-sign-and-encrypt.json + +For example, if you have a file called `auth.json` containing the following: + + { + "username" : "test", + "expires" : "1446323765000", + "connections" : { + "My Connection" : { + "protocol" : "rdp", + "parameters" : { + "hostname" : "10.10.209.63", + "port" : "3389", + "ignore-cert": "true", + "recording-path": "/recordings", + "recording-name": "My-Connection-${GUAC_USERNAME}-${GUAC_DATE}-${GUAC_TIME}" + } + }, + "My OTHER Connection" : { + "protocol" : "rdp", + "parameters" : { + "hostname" : "10.10.209.64", + "port" : "3389", + "ignore-cert": "true", + "recording-path": "/recordings", + "recording-name": "My-OTHER-Connection-${GUAC_USERNAME}-${GUAC_DATE}-${GUAC_TIME}" + } + } + } + } + +and you run: + + $ ./encrypt-json.sh 4C0B569E4C96DF157EEE1B65DD0E4D41 auth.json + +You will receive the following output: + + A2Pf5Kpmm97I2DT1PifIrfU6q3yzoGcIbNXEd60WNangT8DAVjAl6luaqwhBJnCK + uqcf9ZZlRo3uDxTHvUM3eq1YvdghL0GbosOn8Mn38j2ydOMk+Cd15a8ggb4/ddt/ + yIBK4DxrN7MNbouZ091KYtXC6m20E6sGzLy676BlMSg1cmsENRIihOynsSLSCvo0 + diif6H7T+ZuIqF7B5SW+adGfMaHlfknlIvSpLGHhrIP4aMYE/ZU2vYNg8ez27sCS + wDBWu5lERtfCYFyU4ysjRU5Hyov+yKa+O7jcRYpw3N+fHbCg7/dxVNW07qNOKssv + pzUciGvDPUCPpa02WmPJNEBowwQireO1952/MNAI77cW2UepbljD/bwOiZl2THJz + LrENo7K5acimBa+EjWEesgn7lx/WTCF3zxR6TH1CWrQM8Et1aUK1Nf8K11xEQbTy + klyaNtCmTfyahRZ/fUPxDNrdJVpPOSELkf7RJO5tOdK/FFIFIbze3ZUyXgRq+pHY + owpgOmudDBTBlxhXiONdutRI/RZbFM/7GBMdmI8AR/401OCV3nsI4jLhukjMXH3V + f3pQg+xKMhi/QExHhDk8VTNYk7GurK4vgehn7HQ0oSGh8pGcmxB6W43cz+hyn6VQ + On6i90cSnIhRO8SysZt332LwJCDm7I+lBLaI8NVHU6bnAY1Axx5oH3YTKc4qzHls + HEAFYLkD6aHMvHkF3b798CMravjxiJV3m7hsXDbaFN6AFhn8GIkMRRrjuevfZ+q9 + enWN14s24vt5OVg69DljzALobUNKUXFx69SR8EpSBvUcKq8s/OgbDpFvKbwsDY57 + HGT4T0CuRIA0TGUI075uerKBNApVhuBA1BmWJIrI4JXw5MuX6pdBe+MYccO3vfo+ + /frazj8rHdkDa/IbueMbvq+1ozV2+UuxrbaTrV2i4jSRgd74U0QzOh9e8Q0i7vOi + l3hnIfOfg+v1oULmZmJSeiAYWxeGvPptp+n7rNFqHGM= + +The resulting base64 data above, if submitted using the `data` parameter to +Guacamole, will authenticate a user and grant them access to the connections +described in the JSON (at least until the expires timestamp is reached, at +which point the JSON will no longer be accepted). + diff --git a/extensions/guacamole-auth-json/doc/encrypt-json.sh b/extensions/guacamole-auth-json/doc/encrypt-json.sh new file mode 100755 index 0000000..8e78499 --- /dev/null +++ b/extensions/guacamole-auth-json/doc/encrypt-json.sh @@ -0,0 +1,116 @@ +#!/bin/bash -e +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn encrypt-json.sh +## +## Encrypts and signs JSON using the provided key, returning base64-encoded +## data ready to be submitted to Guacamole and used by the guacamole-auth-json +## authentication provider. Beware that this base64-encoded must still be +## URL-encoded prior to submission to /api/tokens via POST. Base64 encoding may +## contain + and = characters, which have special meaning in URLs. +## +## To submit the resulting data easily via curl, the following will work: +## +## curl --data-urlencode "data=$( + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-json + jar + 1.6.0 + guacamole-auth-json + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.inject + guice + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.google.guava + guava + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + com.github.seancfoley + ipaddress + provided + + + + + junit + junit + test + + + + + diff --git a/extensions/guacamole-auth-json/src/main/assembly/dist.xml b/extensions/guacamole-auth-json/src/main/assembly/dist.xml new file mode 100644 index 0000000..89c7d93 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/assembly/dist.xml @@ -0,0 +1,60 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + doc + doc + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/AuthenticationProviderService.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/AuthenticationProviderService.java new file mode 100644 index 0000000..49ccd7f --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/AuthenticationProviderService.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.json.user.AuthenticatedUser; +import org.apache.guacamole.auth.json.user.UserContext; +import org.apache.guacamole.auth.json.user.UserData; +import org.apache.guacamole.auth.json.user.UserDataService; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * Service providing convenience functions for the JSONAuthenticationProvider. + */ +public class AuthenticationProviderService { + + /** + * Service for deriving Guacamole extension API data from UserData objects. + */ + @Inject + private UserDataService userDataService; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * Provider for UserContext objects. + */ + @Inject + private Provider userContextProvider; + + /** + * Returns an AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * An AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @throws GuacamoleException + * If an error occurs while authenticating the user, or if access is + * denied. + */ + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Pull UserData from credentials, if possible + UserData userData = userDataService.fromCredentials(credentials); + if (userData == null) + throw new GuacamoleInvalidCredentialsException("Permission denied.", CredentialsInfo.EMPTY); + + // Update credentials with username provided via JSON for sake of + // ${GUAC_USERNAME} token + credentials.setUsername(userData.getUsername()); + + // Produce AuthenticatedUser associated with derived UserData + AuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(credentials, userData); + return authenticatedUser; + + } + + /** + * Returns a UserContext object initialized with data accessible to the + * given AuthenticatedUser. + * + * @param authenticatedUser + * The AuthenticatedUser to retrieve data for. + * + * @return + * A UserContext object initialized with data accessible to the given + * AuthenticatedUser. + * + * @throws GuacamoleException + * If the UserContext cannot be created due to an error. + */ + public UserContext getUserContext(org.apache.guacamole.net.auth.AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + // The JSONAuthenticationProvider only provides data for users it has + // authenticated itself + if (!(authenticatedUser instanceof AuthenticatedUser)) + return null; + + // Return UserContext containing data from the authenticated user's + // associated UserData object + UserContext userContext = userContextProvider.get(); + userContext.init(((AuthenticatedUser) authenticatedUser).getUserData()); + return userContext; + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/ConfigurationService.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/ConfigurationService.java new file mode 100644 index 0000000..fd4d5d7 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/ConfigurationService.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.ByteArrayProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; + +/** + * Service for retrieving configuration information regarding the JSON + * authentication provider. + */ +public class ConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * The encryption key to use for all decryption and signature verification. + */ + private static final ByteArrayProperty JSON_SECRET_KEY = new ByteArrayProperty() { + + @Override + public String getName() { + return "json-secret-key"; + } + + }; + + /** + * A comma-separated list of all IP addresses or CIDR subnets which should + * be allowed to perform authentication. If not specified, ALL address will + * be allowed. + */ + private static final StringGuacamoleProperty JSON_TRUSTED_NETWORKS = new StringGuacamoleProperty() { + + @Override + public String getName() { + return "json-trusted-networks"; + } + + }; + + /** + * Returns the symmetric key which will be used to encrypt and sign all + * JSON data and should be used to decrypt and verify any received JSON + * data. This is dictated by the "json-secret-key" property specified + * within guacamole.properties. + * + * @return + * The key which should be used to decrypt received JSON data. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the + * "json-secret-key" property is missing. + */ + public byte[] getSecretKey() throws GuacamoleException { + return environment.getRequiredProperty(JSON_SECRET_KEY); + } + + /** + * Returns a collection of all IP address or CIDR subnets which should be + * allowed to submit authentication requests. If empty, authentication + * attempts will be allowed through without restriction. + * + * @return + * A collection of all IP address or CIDR subnets which should be + * allowed to submit authentication requests. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public Collection getTrustedNetworks() throws GuacamoleException { + return environment.getPropertyCollection(JSON_TRUSTED_NETWORKS, Collections.emptyList()); + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/CryptoService.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/CryptoService.java new file mode 100644 index 0000000..28a1154 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/CryptoService.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * Service for handling cryptography-related operations, such as decrypting + * encrypted data. + */ +public class CryptoService { + + /** + * The length of all signatures, in bytes. + */ + public static final int SIGNATURE_LENGTH = 32; + + /** + * The name of the key generation algorithm used for decryption. + */ + private static final String DECRYPTION_KEY_GENERATION_ALGORITHM_NAME = "AES"; + + /** + * The name of the cipher transformation that should be used to decrypt any + * String provided to decrypt(). + */ + private static final String DECRYPTION_CIPHER_NAME = "AES/CBC/PKCS5Padding"; + + /** + * The name of the key generation algorithm used for verifying signatures. + */ + private static final String SIGNATURE_KEY_GENERATION_ALGORITHM_NAME = "HmacSHA256"; + + /** + * The name of the MAC algorithm used for verifying signatures. + */ + private static final String SIGNATURE_MAC_ALGORITHM_NAME = "HmacSHA256"; + + /** + * IV which is all null bytes (all binary zeroes). Usually, using a null IV + * is a horrible idea. As our plaintext will always be prepended with the + * HMAC signature of the rest of the message, we are effectively using the + * HMAC signature itself as the IV. For our purposes, where the encrypted + * value becomes an authentication token, this is OK. + */ + private static final IvParameterSpec NULL_IV = new IvParameterSpec(new byte[] { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }); + + /** + * Creates a new key suitable for decryption using the provided raw key + * bytes. The algorithm used to generate this key is dictated by + * DECRYPTION_KEY_GENERATION_ALGORITHM_NAME and must match the algorithm + * used by decrypt(). + * + * @param keyBytes + * The raw bytes from which the encryption/decryption key should be + * generated. + * + * @return + * A new key suitable for encryption or decryption, generated from the + * given bytes. + */ + public SecretKey createEncryptionKey(byte[] keyBytes) { + return new SecretKeySpec(keyBytes, DECRYPTION_KEY_GENERATION_ALGORITHM_NAME); + } + + /** + * Creates a new key suitable for signature verification using the provided + * raw key bytes. The algorithm used to generate this key is dictated by + * SIGNATURE_KEY_GENERATION_ALGORITHM_NAME and must match the algorithm + * used by sign(). + * + * @param keyBytes + * The raw bytes from which the signature verification key should be + * generated. + * + * @return + * A new key suitable for signature verification, generated from the + * given bytes. + */ + public SecretKey createSignatureKey(byte[] keyBytes) { + return new SecretKeySpec(keyBytes, SIGNATURE_KEY_GENERATION_ALGORITHM_NAME); + } + + /** + * Decrypts the given ciphertext using the provided key, returning the + * resulting plaintext. If any error occurs during decryption at all, a + * GuacamoleException is thrown. The IV used for the decryption process is + * a null IV (all binary zeroes). + * + * @param key + * The key to use to decrypt the provided ciphertext. + * + * @param cipherText + * The ciphertext to decrypt. + * + * @return + * The plaintext which results from decrypting the ciphertext with the + * provided key. + * + * @throws GuacamoleException + * If any error at all occurs during decryption. + */ + public byte[] decrypt(Key key, byte[] cipherText) throws GuacamoleException { + + try { + + // Init cipher for descryption using secret key + Cipher cipher = Cipher.getInstance(DECRYPTION_CIPHER_NAME); + cipher.init(Cipher.DECRYPT_MODE, key, NULL_IV); + + // Perform decryption + return cipher.doFinal(cipherText); + + } + + // Rethrow all decryption failures identically + catch (InvalidAlgorithmParameterException + | NoSuchAlgorithmException + | NoSuchPaddingException + | InvalidKeyException + | IllegalBlockSizeException + | BadPaddingException e) { + throw new GuacamoleServerException(e); + } + + } + + /** + * Signs the given arbitrary data using the provided key, returning the + * resulting signature. If any error occurs during signing at all, a + * GuacamoleException is thrown. + * + * @param key + * The key to use to sign the provided data. + * + * @param data + * The arbitrary data to sign. + * + * @return + * The signature which results from signing the arbitrary data with the + * provided key. + * + * @throws GuacamoleException + * If any error at all occurs during signing. + */ + public byte[] sign(Key key, byte[] data) throws GuacamoleException { + + try { + + // Init MAC for signing using secret key + Mac mac = Mac.getInstance(SIGNATURE_MAC_ALGORITHM_NAME); + mac.init(key); + + // Sign provided data + return mac.doFinal(data); + + } + + // Rethrow all signature failures identically + catch (NoSuchAlgorithmException | InvalidKeyException | IllegalStateException e) { + throw new GuacamoleServerException(e); + } + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/JSONAuthenticationProvider.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/JSONAuthenticationProvider.java new file mode 100644 index 0000000..d1b54fd --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/JSONAuthenticationProvider.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Allows users to be authenticated using encrypted blobs of JSON data. The + * username of the user, all available connections, and the parameters + * associated with those connections are all determined by the contents of the + * provided JSON. The JSON itself is authorized by virtue of being properly + * encrypted with a shared key. + */ +public class JSONAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * Injector which will manage the object graph of this authentication + * provider. + */ + private final Injector injector; + + /** + * Creates a new JSON AuthenticationProvider that authenticates users + * using encrypted blobs of JSON data. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public JSONAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + injector = Guice.createInjector(new JSONAuthenticationProviderModule(this)); + + } + + @Override + public String getIdentifier() { + return "json"; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { + + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.authenticateUser(credentials); + + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.getUserContext(authenticatedUser); + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/JSONAuthenticationProviderModule.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/JSONAuthenticationProviderModule.java new file mode 100644 index 0000000..325b31e --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/JSONAuthenticationProviderModule.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.json.connection.ConnectionService; +import org.apache.guacamole.auth.json.user.UserDataService; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * Guice module which configures injections specific to the JSON authentication + * provider. + */ +public class JSONAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the JSONAuthenticationProvider on behalf of which this + * module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new JSON authentication provider module which configures + * injection for the JSONAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public JSONAuthenticationProviderModule(AuthenticationProvider authProvider) + throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Store associated auth provider + this.authProvider = authProvider; + + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind JSON-specific services + bind(ConfigurationService.class); + bind(ConnectionService.class); + bind(CryptoService.class); + bind(RequestValidationService.class); + bind(UserDataService.class); + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/RequestValidationService.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/RequestValidationService.java new file mode 100644 index 0000000..12cd1c6 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/RequestValidationService.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import com.google.inject.Inject; +import inet.ipaddr.IPAddressString; +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Credentials; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for testing the validity of received HTTP requests. + */ +public class RequestValidationService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(RequestValidationService.class); + + /** + * Service for retrieving configuration information regarding the + * JSONAuthenticationProvider. + */ + private ConfigurationService confService; + + /** + * Create a new instance of the request validation service, with the + * provided ConfigurationService object used to retrieve configuration + * properties for this extension. + * + * @param confService + * The instance of ConfigurationService for retrieving configuration + * properties for this extension. + */ + @Inject + public RequestValidationService(ConfigurationService confService) { + this.confService = confService; + } + + /** + * Returns whether the given credentials can be used for authentication, + * taking into account restrictions specified within guacamole.properties. + * + * @param credentials + * The credentials of the authentication request to test. + * + * @return + * true if the given credentials come from a trusted source and can be + * used for authentication, false otherwise. + */ + public boolean isAuthenticationAllowed(Credentials credentials) { + + // Pull list of all trusted networks + Collection trustedNetworks; + try { + trustedNetworks = confService.getTrustedNetworks(); + } + + // Deny all requests if restrictions cannot be parsed + catch (GuacamoleException e) { + logger.warn("Authentication request from \"{}\" is DENIED due to parse error: {}", credentials.getRemoteAddress(), e.getMessage()); + logger.debug("Error parsing authentication request restrictions from guacamole.properties.", e); + return false; + } + + // All requests are allowed if no restrictions are defined + if (trustedNetworks.isEmpty()) { + logger.debug("Authentication request from \"{}\" is ALLOWED (no restrictions).", credentials.getRemoteAddress()); + return true; + } + + // Otherwise ensure that the remote address is part of a trusted network + for (String network : trustedNetworks) { + + // Request is allowed if any subnet matches + if (new IPAddressString(network).contains(new IPAddressString(credentials.getRemoteAddress()))) { + logger.debug("Authentication request from \"{}\" is ALLOWED (matched subnet).", credentials.getRemoteAddress()); + return true; + } + + } + + // Otherwise request is denied - no subnets matched + logger.debug("Authentication request from \"{}\" is DENIED (did not match subnet).", credentials.getRemoteAddress()); + return false; + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/connection/ConnectionService.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/connection/ConnectionService.java new file mode 100644 index 0000000..0cf4e25 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/connection/ConnectionService.java @@ -0,0 +1,307 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +package org.apache.guacamole.auth.json.connection; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.json.user.UserData; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleSocket; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.InetGuacamoleSocket; +import org.apache.guacamole.net.SSLGuacamoleSocket; +import org.apache.guacamole.net.SimpleGuacamoleTunnel; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.protocol.ConfiguredGuacamoleSocket; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.token.TokenFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service which provides a centralized means of establishing connections, + * tracking/joining active connections, and retrieving associated data. + */ +@Singleton +public class ConnectionService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ConnectionService.class); + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Mapping of the unique IDs of active connections (as specified within the + * UserData.Connection object) to the underlying connection ID (as returned + * via the Guacamole protocol handshake). Only connections with defined IDs + * are tracked here. + */ + private final ConcurrentHashMap activeConnections = + new ConcurrentHashMap<>(); + + /** + * Mapping of the connection IDs of joinable connections (as returned via + * the Guacamole protocol handshake) to the Collection of tunnels shadowing + * those connections. + */ + private final ConcurrentHashMap> shadowers = + new ConcurrentHashMap<>(); + + /** + * Generates a new GuacamoleConfiguration from the associated protocol and + * parameters of the given UserData.Connection. If the configuration cannot + * be generated (because a connection is being joined by that connection is + * not actually active), null is returned. + * + * @param connection + * The UserData.Connection whose protocol and parameters should be used + * to construct the new GuacamoleConfiguration. + * + * @return + * A new GuacamoleConfiguration generated from the associated protocol + * and parameters of the given UserData.Connection, or null if the + * configuration cannot be generated. + */ + public GuacamoleConfiguration getConfiguration(UserData.Connection connection) { + + GuacamoleConfiguration config = new GuacamoleConfiguration(); + + // Set connection ID if joining an active connection + String primaryConnection = connection.getPrimaryConnection(); + if (primaryConnection != null) { + + // Verify that the connection being joined actually exists + String id = activeConnections.get(primaryConnection); + if (id == null) + return null; + + config.setConnectionID(id); + + } + + // Otherwise, require protocol + else + config.setProtocol(connection.getProtocol()); + + // Add all parameter name/value pairs + Map parameters = connection.getParameters(); + if (parameters != null) + config.setParameters(parameters); + + return config; + + } + + /** + * Closes all tunnels within the given connection. If a GuacamoleException + * is thrown by any tunnel during closure, that exception is ignored. + * + * @param tunnels + * The Collection of tunnels to close. + */ + private void closeAll(Collection tunnels) { + + for (GuacamoleTunnel tunnel : tunnels) { + try { + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Failure to close tunnel masked by closeAll().", e); + } + } + + } + + /** + * Establishes a connection to guacd using the information associated with + * the given connection object. The resulting connection will be provided + * the given client information during the Guacamole protocol handshake. + * + * @param connection + * The connection object describing the nature of the connection to be + * established. + * + * @param info + * Information associated with the connecting client. + * + * @return + * A fully-established GuacamoleTunnel. + * + * @throws GuacamoleException + * If an error occurs while connecting to guacd, or if permission to + * connect is denied. + */ + public GuacamoleTunnel connect(UserData.Connection connection, + GuacamoleClientInformation info, Map tokens) throws GuacamoleException { + + // Retrieve proxy configuration from environment + GuacamoleProxyConfiguration proxyConfig = environment.getDefaultGuacamoleProxyConfiguration(); + + // Get guacd connection parameters + String hostname = proxyConfig.getHostname(); + int port = proxyConfig.getPort(); + + // Generate and verify connection configuration + GuacamoleConfiguration filteredConfig = getConfiguration(connection); + if (filteredConfig == null) { + logger.debug("Configuration for connection could not be " + + "generated. Perhaps the connection being joined is not " + + "active?"); + throw new GuacamoleResourceNotFoundException("No such connection"); + } + + // Apply tokens to config parameters + new TokenFilter(tokens).filterValues(filteredConfig.getParameters()); + + // Determine socket type based on required encryption method + final ConfiguredGuacamoleSocket socket; + switch (proxyConfig.getEncryptionMethod()) { + + // If guacd requires SSL, use it + case SSL: + socket = new ConfiguredGuacamoleSocket( + new SSLGuacamoleSocket(hostname, port), + filteredConfig, info + ); + break; + + // Connect directly via TCP if encryption is not enabled + case NONE: + socket = new ConfiguredGuacamoleSocket( + new InetGuacamoleSocket(hostname, port), + filteredConfig, info + ); + break; + + // Abort if encryption method is unknown + default: + throw new GuacamoleServerException("Unimplemented encryption method."); + + } + + final GuacamoleTunnel tunnel; + + // If the current connection is not being tracked (no ID) just use a + // normal, non-tracking tunnel + final String id = connection.getId(); + if (id == null) + tunnel = new SimpleGuacamoleTunnel(socket); + + // Otherwise, create a tunnel with proper tracking which can be joined + else { + + // Allow connection to be joined + final String connectionID = socket.getConnectionID(); + final Collection existingTunnels = shadowers.putIfAbsent(connectionID, + Collections.synchronizedList(new ArrayList<>())); + + // Duplicate connection IDs cannot exist + assert(existingTunnels == null); + + // If the current connection is intended to be tracked (an ID was + // provided), but a connection is already in progress with that ID, + // log a warning that the original connection will no longer be tracked + String activeConnection = activeConnections.put(id, connectionID); + if (activeConnection != null) + logger.warn("A connection with ID \"{}\" is already in progress, " + + "but another attempt to use this ID has been made. The " + + "original connection will no longer be joinable.", id); + + // Return a tunnel which automatically tracks the active connection + tunnel = new SimpleGuacamoleTunnel(new GuacamoleSocket() { + + @Override + public GuacamoleReader getReader() { + return socket.getReader(); + } + + @Override + public GuacamoleWriter getWriter() { + return socket.getWriter(); + } + + @Override + public void close() throws GuacamoleException { + + // Stop connection from being joined further + activeConnections.remove(id, connectionID); + + // Close all connections sharing the closed connection + Collection tunnels = shadowers.remove(connectionID); + if (tunnels != null) + closeAll(tunnels); + + socket.close(); + + } + + @Override + public boolean isOpen() { + return socket.isOpen(); + } + + }); + + } + + // Track tunnels which join connections, such that they can be + // automatically closed when the joined connection closes + String joinedConnection = filteredConfig.getConnectionID(); + if (joinedConnection != null) { + + // Track shadower of joined connection if possible + Collection tunnels = shadowers.get(joinedConnection); + if (tunnels != null) + tunnels.add(tunnel); + + // Close this tunnel in ALL CASES if the joined connection has + // closed. Note that it is insufficient to simply check whether the + // retrieved Collection is null here, as it may have been removed + // after retrieval. We must ensure that the tunnel is closed in any + // case where it will not automatically be closed due to the + // closure of the shadowed connection. + if (!shadowers.containsKey(joinedConnection)) + tunnel.close(); + + } + + return tunnel; + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/AuthenticatedUser.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/AuthenticatedUser.java new file mode 100644 index 0000000..82d81c4 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/AuthenticatedUser.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json.user; + +import com.google.inject.Inject; +import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * An implementation of AuthenticatedUser specific to the + * JSONAuthenticationProvider, providing access to the decrypted contents of + * the JSON provided during authentication. + */ +public class AuthenticatedUser extends AbstractAuthenticatedUser { + + /** + * Logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(AuthenticatedUser.class); + + /** + * Reference to the authentication provider associated with this + * authenticated user. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * The credentials provided when this user was authenticated. + */ + private Credentials credentials; + + /** + * The UserData object derived from the data submitted when this user was + * authenticated. + */ + private UserData userData; + + /** + * Initializes this AuthenticatedUser using the given credentials and + * UserData object. The provided UserData object MUST have been derived + * from the data submitted when the user authenticated. + * + * @param credentials + * The credentials provided when this user was authenticated. + * + * @param userData + * The UserData object derived from the data submitted when this user + * was authenticated. + */ + public void init(Credentials credentials, UserData userData) { + this.credentials = credentials; + this.userData = userData; + setIdentifier(userData.getUsername()); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + /** + * Returns the UserData object derived from the data submitted when this + * user was authenticated. + * + * @return + * The UserData object derived from the data submitted when this user + * was authenticated. + */ + public UserData getUserData() { + return userData; + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserContext.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserContext.java new file mode 100644 index 0000000..46d1425 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserContext.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json.user; + +import com.google.inject.Inject; +import org.apache.guacamole.net.auth.AbstractUserContext; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; + +/** + * An implementation of UserContext specific to the JSONAuthenticationProvider + * which obtains all data from the encrypted JSON provided during + * authentication. + */ +public class UserContext extends AbstractUserContext { + + /** + * The identifier reserved for the root connection group. + */ + public static final String ROOT_CONNECTION_GROUP = DEFAULT_ROOT_CONNECTION_GROUP; + + /** + * Reference to the AuthenticationProvider associated with this + * UserContext. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * Service for deriving Guacamole extension API data from UserData objects. + */ + @Inject + private UserDataService userDataService; + + /** + * The UserData object associated with the user to whom this UserContext + * belongs. + */ + private UserData userData; + + /** + * Initializes this UserContext using the data associated with the provided + * UserData object. + * + * @param userData + * The UserData object derived from the JSON data received when the + * user authenticated. + */ + public void init(UserData userData) { + this.userData = userData; + } + + @Override + public User self() { + return userDataService.getUser(userData); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Directory getConnectionDirectory() { + return userDataService.getConnectionDirectory(userData); + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserData.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserData.java new file mode 100644 index 0000000..2e3048f --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserData.java @@ -0,0 +1,386 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json.user; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * All data associated with a particular user, as parsed from the JSON supplied + * within the encrypted blob provided during authentication. + */ +public class UserData { + + /** + * The username of the user associated with this data. + */ + private String username; + + /** + * The time after which this data is no longer valid and must not be used. + * This is a UNIX-style epoch timestamp, stored as the number of + * milliseconds since midnight of January 1, 1970 UTC. + */ + private Long expires; + + /** + * Whether this data can only be used once. If set to true, reuse of the + * associated signed data will not be allowed. This is only valid if the + * expiration timestamp has been set. + */ + private boolean singleUse = false; + + /** + * All connections accessible by this user. The key of each entry is both + * the connection identifier and the connection name. + */ + private ConcurrentMap connections; + + /** + * The data associated with a Guacamole connection stored within a UserData + * object. + */ + public static class Connection { + + /** + * An arbitrary, opaque, unique ID for this connection. If specified + * via the "join" (primaryConnection) property of another connection, + * that connection may be used to join this connection. + */ + private String id; + + /** + * The protocol that this connection should use, such as "vnc" or "rdp". + */ + private String protocol; + + /** + * The opaque ID of the connection being joined (shared), as given with + * the "id" property. If specified, the provided protocol is ignored. + * This value is exposed via the "join" property within JSON. + */ + private String primaryConnection; + + /** + * Map of all connection parameter values, where each key is the parameter + * name. Legal parameter names are dictated by the specified protocol and + * are documented within the Guacamole manual: + * + * http://guac-dev.org/doc/gug/configuring-guacamole.html#connection-configuration + */ + private Map parameters; + + /** + * Whether this connection can only be used once. If set to true, the + * connection will be removed from the connections directory + * immediately upon use. + */ + private boolean singleUse = false; + + /** + * Returns an arbitrary, opaque, unique ID for this connection. If + * defined, this ID may be used via the "join" (primaryConnection) + * property of another connection to join (share) this connection while + * it is in progress. + * + * @return + * An arbitrary, opaque, unique ID for this connection. + */ + public String getId() { + return id; + } + + /** + * Sets an arbitrary, opaque ID which uniquely identifies this + * connection. This ID may be used via the "join" (primaryConnection) + * property of another connection to join (share) this connection while + * it is in progress. + * + * @param id + * An arbitrary, opaque, unique ID for this connection. + */ + public void setId(String id) { + this.id = id; + } + + /** + * Returns the protocol that this connection should use, such as "vnc" + * or "rdp". + * + * @return + * The name of the protocol to use, such as "vnc" or "rdp". + */ + public String getProtocol() { + return protocol; + } + + /** + * Sets the protocol that this connection should use, such as "vnc" + * or "rdp". + * + * @param protocol + * The name of the protocol to use, such as "vnc" or "rdp". + */ + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + /** + * Returns the opaque ID of the connection being joined (shared), if + * any. If specified, any provided protocol is ignored. This value is + * exposed via the "join" property within JSON. + * + * @return + * The opaque ID of the connection being joined (shared), if any. + */ + @JsonProperty("join") + public String getPrimaryConnection() { + return primaryConnection; + } + + /** + * Sets the opaque ID of the connection being joined (shared). If + * specified, any provided protocol is ignored. This is exposed via the + * "join" property within JSON. + * + * @param primaryConnection + * The opaque ID of the connection being joined (shared). + */ + @JsonProperty("join") + public void setPrimaryConnection(String primaryConnection) { + this.primaryConnection = primaryConnection; + } + + /** + * Returns a map of all parameter name/value pairs, where the key of + * each entry in the map is the corresponding parameter name. Changes + * to this map directly affect the parameters associated with this + * connection. + * + * @return + * A map of all parameter name/value pairs associated with this + * connection. + */ + public Map getParameters() { + return parameters; + } + + /** + * Replaces all parameters associated with this connection with the + * name/value pairs in the provided map, where the key of each entry + * in the map is the corresponding parameter name. Changes to this map + * directly affect the parameters associated with this connection. + * + * @param parameters + * The map of all parameter name/value pairs to associate with this + * connection. + */ + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + /** + * Returns whether this connection is intended for single-use only. A + * single-use connection cannot be used more than once. + * + * After a single-use connection is used, it should be automatically + * and atomically removed from any underlying data (such as with + * UserData.removeConnection()). + * + * @return + * true if this connection is intended for single-use only, false + * otherwise. + */ + public boolean isSingleUse() { + return singleUse; + } + + /** + * Sets whether this connection is intended for single-use only. A + * single-use connection cannot be used more than once. By default, + * connections are NOT single-use. + * + * After a single-use connection is used, it should be automatically + * and atomically removed from any underlying data (such as with + * UserData.removeConnection()). + * + * @param singleUse + * true if this connection is intended for single-use only, false + * otherwise. + */ + public void setSingleUse(boolean singleUse) { + this.singleUse = singleUse; + } + + } + + /** + * Returns the username of the user associated with the data stored in this + * object. + * + * @return + * The username of the user associated with the data stored in this + * object. + */ + public String getUsername() { + return username; + } + + /** + * Sets the username of the user associated with the data stored in this + * object. + * + * @param username + * The username of the user to associate with the data stored in this + * object. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Returns the time after which the data stored in this object is invalid + * and must not be used. The time returned is a UNIX-style epoch timestamp + * whose value is the number of milliseconds since midnight of January 1, + * 1970 UTC. If this object does not expire, null is returned. + * + * @return + * The time after which the data stored in this object is invalid and + * must not be used, or null if this object does not expire. + */ + public Long getExpires() { + return expires; + } + + /** + * Sets the time after which the data stored in this object is invalid + * and must not be used. The time provided MUST be a UNIX-style epoch + * timestamp whose value is the number of milliseconds since midnight of + * January 1, 1970 UTC. If this object should not expire, the value + * provided should be null. + * + * @param expires + * The time after which the data stored in this object is invalid and + * must not be used, or null if this object does not expire. + */ + public void setExpires(Long expires) { + this.expires = expires; + } + + /** + * Returns whether this user data is intended for single-use only. + * Single-use data cannot be used more than once. This flag only has + * meaning if the data also has an expires timestamp. + * + * @return + * true if this data is intended for single-use only, false + * otherwise. + */ + public boolean isSingleUse() { + return singleUse; + } + + /** + * Sets whether this user data is intended for single-use only. Single-use + * data cannot be used more than once. This flag only has meaning if the + * data also has an expires timestamp. By default, user data is NOT + * single-use. + * + * @param singleUse + * true if this data is intended for single-use only, false + * otherwise. + */ + public void setSingleUse(boolean singleUse) { + this.singleUse = singleUse; + } + + /** + * Returns all connections stored within this UserData object as an + * unmodifiable map. Each of these connections is accessible by the user + * specified by getUsername(). The key of each entry within the map is the + * identifier and human-readable name of the corresponding connection. + * + * @return + * An unmodifiable map of all connections stored within this + * UserData object, where the key of each entry is the identifier of + * the corresponding connection. + */ + public Map getConnections() { + return connections == null ? null : Collections.unmodifiableMap(connections); + } + + /** + * Replaces all connections stored within this UserData object with the + * given connections. Each of these connections will be accessible by the + * user specified by getUsername(). The key of each entry within the map is + * the identifier and human-readable name of the corresponding connection. + * + * @param connections + * A map of all connections to be stored within this UserData object, + * where the key of each entry is the identifier of the corresponding + * connection. + */ + public void setConnections(Map connections) { + this.connections = new ConcurrentHashMap<>(connections); + } + + /** + * Removes the connection having the given identifier from the overall map + * of connections, such that it cannot be used further. This operation is + * atomic. + * + * @param identifier + * The identifier of the connection to remove. + * + * @return + * The connection that was removed, or null if no such connection + * exists. + */ + public Connection removeConnection(String identifier) { + return connections.remove(identifier); + } + + /** + * Returns whether the data within this UserData object is expired, and + * thus must not be used, according to the timestamp returned by + * getExpires(). + * + * @return + * true if the data within this UserData object is expired and must not + * be used, false otherwise. + */ + @JsonIgnore + public boolean isExpired() { + + // Do not bother comparing if this UserData object does not expire + Long expirationTimestamp = getExpires(); + if (expirationTimestamp == null) + return false; + + // Otherwise, compare expiration timestamp against system time + return System.currentTimeMillis() > expirationTimestamp; + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataConnection.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataConnection.java new file mode 100644 index 0000000..48a9de1 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataConnection.java @@ -0,0 +1,187 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json.user; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.auth.json.connection.ConnectionService; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Connection implementation which automatically manages related UserData if + * the connection is used. Connections which are marked as single-use will + * be removed from the given UserData such that only the first connection + * attempt can succeed. + */ +public class UserDataConnection implements Connection { + + /** + * Service for establishing and managing connections. + */ + @Inject + private ConnectionService connectionService; + + /** + * A human-readable value which both uniquely identifies this connection + * and serves as the connection display name. + */ + private String identifier; + + /** + * The UserData associated with this connection. This UserData will be + * automatically updated as this connection is used. + */ + private UserData data; + + /** + * The connection entry for this connection within the associated UserData. + */ + private UserData.Connection connection; + + /** + * Initializes this UserDataConnection with the given data, unique + * identifier, and connection information. This function MUST be invoked + * before any particular UserDataConnection is actually used. + * + * @param data + * The UserData that this connection should manage. + * + * @param identifier + * The identifier associated with this connection within the given + * UserData. + * + * @param connection + * The connection data associated with this connection within the given + * UserData. + * + * @return + * A reference to this UserDataConnection. + */ + public UserDataConnection init(UserData data, String identifier, + UserData.Connection connection) { + + this.identifier = identifier; + this.data = data; + this.connection = connection; + + return this; + + } + + @Override + public String getIdentifier() { + return identifier; + } + + @Override + public void setIdentifier(String identifier) { + throw new UnsupportedOperationException("UserDataConnection is immutable."); + } + + @Override + public String getName() { + return identifier; + } + + @Override + public void setName(String name) { + throw new UnsupportedOperationException("UserDataConnection is immutable."); + } + + @Override + public String getParentIdentifier() { + return UserContext.ROOT_CONNECTION_GROUP; + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + throw new UnsupportedOperationException("UserDataConnection is immutable."); + } + + @Override + public GuacamoleConfiguration getConfiguration() { + + // Generate configuration, using a skeleton configuration if generation + // fails + GuacamoleConfiguration config = connectionService.getConfiguration(connection); + if (config == null) + config = new GuacamoleConfiguration(); + + return config; + + } + + @Override + public void setConfiguration(GuacamoleConfiguration config) { + throw new UnsupportedOperationException("UserDataConnection is immutable."); + } + + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + throw new UnsupportedOperationException("UserDataConnection is immutable."); + } + + @Override + public Date getLastActive() { + return null; + } + + @Override + public Set getSharingProfileIdentifiers() throws GuacamoleException { + return Collections.emptySet(); + } + + @Override + public int getActiveConnections() { + return 0; + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Prevent future use immediately upon connect + if (connection.isSingleUse()) { + + // Deny access if another user already used the connection + if (data.removeConnection(getIdentifier()) == null) + throw new GuacamoleSecurityException("Permission denied"); + + } + + // Perform connection operation + return connectionService.connect(connection, info, tokens); + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataDenylist.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataDenylist.java new file mode 100644 index 0000000..07357d1 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataDenylist.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json.user; + +import com.google.common.io.BaseEncoding; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Atomic denylist of UserData objects, stored by their associated + * cryptographic signatures. UserData objects stored within this denylist MUST + * have an associated expiration timestamp, and will automatically be removed + * from the denylist once they have expired. + */ +public class UserDataDenylist { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserDataDenylist.class); + + /** + * All denylisted UserData objects, stored by their associated + * cryptographic signatures. NOTE: Each key into this map is the hex + * string produced by encoding the binary signature using DatatypeConverter. + * A byte[] cannot be used directly. + */ + private final ConcurrentMap denylist = new ConcurrentHashMap<>(); + + /** + * Removes all expired UserData objects from the denylist. This will + * automatically be invoked whenever new UserData is added to the denylist. + */ + public void removeExpired() { + + // Remove expired data from denylist + Iterator> current = denylist.entrySet().iterator(); + while (current.hasNext()) { + + // Remove entry from map if its associated with expired data + Map.Entry entry = current.next(); + if (entry.getValue().isExpired()) + current.remove(); + + } + + } + + /** + * Adds the given UserData to the denylist, storing it according to the + * provided cryptographic signature. The UserData MUST have an associated + * expiration timestamp. If any UserData objects already within the + * denylist have expired, they will automatically be removed when this + * function is invoked. + * + * @param data + * The UserData to store within the denylist. + * + * @param signature + * The cryptographic signature associated with the UserData. + * + * @return + * true if the UserData was not already denylisted and has + * successfully been added, false otherwise. + */ + public boolean add(UserData data, byte[] signature) { + + // Expiration timestamps must be provided + if (data.getExpires() == null) { + logger.warn("An expiration timestamp MUST be provided for " + + "single-use data."); + return false; + } + + // Remove any expired entries + removeExpired(); + + // Expired user data is implicitly denylisted + if (data.isExpired()) + return false; + + // Add to denylist only if not already present + String signatureHex = BaseEncoding.base16().encode(signature); + return denylist.putIfAbsent(signatureHex, data) == null; + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataService.java b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataService.java new file mode 100644 index 0000000..33b5beb --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/java/org/apache/guacamole/auth/json/user/UserDataService.java @@ -0,0 +1,367 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json.user; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.io.BaseEncoding; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.json.ConfigurationService; +import org.apache.guacamole.auth.json.CryptoService; +import org.apache.guacamole.auth.json.RequestValidationService; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleDirectory; +import org.apache.guacamole.net.auth.simple.SimpleObjectPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for deriving Guacamole extension API data from UserData objects. + */ +@Singleton +public class UserDataService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserDataService.class); + + /** + * ObjectMapper for deserializing UserData objects. + */ + private static final ObjectMapper mapper = new ObjectMapper(); + + /** + * Denylist of single-use user data objects which have already been used. + */ + private final UserDataDenylist denylist = new UserDataDenylist(); + + /** + * Service for retrieving configuration information regarding the + * JSONAuthenticationProvider. + */ + @Inject + private ConfigurationService confService; + + /** + * Service for testing the validity of HTTP requests. + */ + @Inject + private RequestValidationService requestService; + + /** + * Service for handling cryptography-related operations. + */ + @Inject + private CryptoService cryptoService; + + /** + * Provider for UserDataConnection instances. + */ + @Inject + private Provider userDataConnectionProvider; + + /** + * The name of the HTTP parameter from which base64-encoded, encrypted JSON + * data should be read. The value of this parameter, when decoded and + * decrypted, must be valid JSON prepended with the 32-byte raw binary + * signature generated through signing the JSON with the secret key using + * HMAC/SHA-256. + */ + public static final String ENCRYPTED_DATA_PARAMETER = "data"; + + /** + * Derives a new UserData object from the data contained within the given + * Credentials. If no such data is present, or the data present is invalid, + * null is returned. + * + * @param credentials + * The Credentials from which the new UserData object should be + * derived. + * + * @return + * A new UserData object derived from the data contained within the + * given Credentials, or null if no such data is present or if the data + * present is invalid. + */ + public UserData fromCredentials(Credentials credentials) { + + String json; + byte[] correctSignature; + + // Abort if the request itself is not allowed + if (!requestService.isAuthenticationAllowed(credentials)) + return null; + + // Pull base64-encoded, encrypted JSON data from HTTP request, if any + // such data is present + String base64 = credentials.getParameter(ENCRYPTED_DATA_PARAMETER); + if (base64 == null) + return null; + + // Decrypt base64-encoded parameter + try { + + // Decrypt using defined encryption key + byte[] decrypted = cryptoService.decrypt( + cryptoService.createEncryptionKey(confService.getSecretKey()), + BaseEncoding.base64().decode(base64) + ); + + // Abort if decrypted value cannot possibly have a signature AND data + if (decrypted.length <= CryptoService.SIGNATURE_LENGTH) { + logger.warn("Submitted data is too small to contain both a signature and JSON."); + return null; + } + + // Split data into signature and JSON portions + byte[] receivedSignature = Arrays.copyOf(decrypted, CryptoService.SIGNATURE_LENGTH); + byte[] receivedJSON = Arrays.copyOfRange(decrypted, CryptoService.SIGNATURE_LENGTH, decrypted.length); + + // Produce signature for decrypted data + correctSignature = cryptoService.sign( + cryptoService.createSignatureKey(confService.getSecretKey()), + receivedJSON + ); + + // Verify signatures + if (!Arrays.equals(receivedSignature, correctSignature)) { + logger.warn("Signature of submitted data is incorrect."); + return null; + } + + // Convert from UTF-8 + json = new String(receivedJSON, "UTF-8"); + + } + + // Fail if base64 data is not valid + catch (IllegalArgumentException e) { + logger.warn("Submitted data is not proper base64."); + logger.debug("Invalid base64 data.", e); + return null; + } + + // Handle lack of standard UTF-8 support (should never happen) + catch (UnsupportedEncodingException e) { + logger.error("Unexpected lack of support for UTF-8: {}", e.getMessage()); + logger.debug("Unable to decode base64 data as UTF-8.", e); + return null; + } + + // Fail if decryption or key retrieval fails for any reason + catch (GuacamoleException e) { + logger.error("Decryption of received data failed: {}", e.getMessage()); + logger.debug("Unable to decrypt received data.", e); + return null; + } + + // Deserialize UserData from submitted JSON data + try { + + // Deserialize UserData, but reject if expired + UserData userData = mapper.readValue(json, UserData.class); + if (userData.isExpired()) + return null; + + // Reject if data is single-use and already present in the denylist + if (userData.isSingleUse() && !denylist.add(userData, correctSignature)) + return null; + + return userData; + + } + + // Fail UserData creation if JSON is invalid/unreadable + catch (IOException e) { + logger.error("Received JSON is invalid: {}", e.getMessage()); + logger.debug("Error parsing UserData JSON.", e); + return null; + } + + } + + /** + * Returns the identifiers of all users readable by the user whose data is + * given by the provided UserData object. As users of the + * JSONAuthenticationProvider can only see themselves, this will always + * simply be a set of the user's own username. + * + * @param userData + * All data associated with the user whose accessible user identifiers + * are being retrieved. + * + * @return + * A set containing the identifiers of all users readable by the user + * whose data is given by the provided UserData object. + */ + public Set getUserIdentifiers(UserData userData) { + + // Each user can only see themselves + return Collections.singleton(userData.getUsername()); + + } + + /** + * Returns the user object of the user to whom the given UserData object + * belongs. + * + * @param userData + * All data associated with the user whose own user object is being + * retrieved. + * + * @return + * The user object of the user to whom the given UserData object + * belongs. + */ + public User getUser(UserData userData) { + + // Build user object with READ access to all available data + return new SimpleUser(userData.getUsername()) { + + @Override + public ObjectPermissionSet getUserPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(getUserIdentifiers(userData)); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(getConnectionIdentifiers(userData)); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(getConnectionGroupIdentifiers(userData)); + } + + }; + + } + + /** + * Returns the identifiers of all connections readable by the user whose + * data is given by the provided UserData object. If the provided UserData + * is not expired, this will be the set of all connection identifiers + * within the UserData. If the UserData is expired, this will be an empty + * set. + * + * @param userData + * All data associated with the user whose accessible connection + * identifiers are being retrieved. + * + * @return + * A set containing the identifiers of all connections readable by the + * user whose data is given by the provided UserData object. + */ + public Set getConnectionIdentifiers(UserData userData) { + + // Do not return any connections if empty or expired + Map connections = userData.getConnections(); + if (connections == null || userData.isExpired()) + return Collections.emptySet(); + + // Return all available connection identifiers + return connections.keySet(); + + } + + /** + * Returns a Directory containing all connections accessible by the user + * whose data is given by the provided UserData object. If the given + * UserData object is not expired, this Directory will contain absolutely + * all connections defined within the given UserData. If the given UserData + * object is expired, this Directory will be empty. + * + * @param userData + * All data associated with the user whose connection directory is + * being retrieved. + * + * @return + * A Directory containing all connections accessible by the user whose + * data is given by the provided UserData object. + */ + public Directory getConnectionDirectory(UserData userData) { + + // Do not return any connections if empty or expired + Map connections = userData.getConnections(); + if (connections == null || userData.isExpired()) + return new SimpleDirectory<>(); + + // Convert UserData.Connection objects to normal Connections + Map directoryContents = new HashMap<>(); + for (Map.Entry entry : connections.entrySet()) { + + // Pull connection and associated identifier + String identifier = entry.getKey(); + UserData.Connection connection = entry.getValue(); + + // Create Guacamole connection containing the defined identifier + // and parameters + Connection guacConnection = userDataConnectionProvider.get().init( + userData, + identifier, + connection + ); + + // Add corresponding Connection to directory + directoryContents.put(identifier, guacConnection); + + } + + return new SimpleDirectory<>(directoryContents); + + } + + /** + * Returns the identifiers of all connection groups readable by the user + * whose data is given by the provided UserData object. This will always be + * a set containing only the root connection group identifier. The + * JSONAuthenticationProvider does not define any other connection groups. + * + * @param userData + * All data associated with the user whose accessible connection group + * identifiers are being retrieved. + * + * @return + * A set containing the identifiers of all connection groups readable + * by the user whose data is given by the provided UserData object. + */ + public Set getConnectionGroupIdentifiers(UserData userData) { + + // The only connection group available is the root group + return Collections.singleton(UserContext.ROOT_CONNECTION_GROUP); + + } + +} diff --git a/extensions/guacamole-auth-json/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-json/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..7d8efd5 --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/resources/guac-manifest.json @@ -0,0 +1,16 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Encrypted JSON Authentication", + "namespace" : "json", + + "authProviders" : [ + "org.apache.guacamole.auth.json.JSONAuthenticationProvider" + ], + + "translations" : [ + "translations/en.json" + ] + +} diff --git a/extensions/guacamole-auth-json/src/main/resources/translations/en.json b/extensions/guacamole-auth-json/src/main/resources/translations/en.json new file mode 100644 index 0000000..bd4deba --- /dev/null +++ b/extensions/guacamole-auth-json/src/main/resources/translations/en.json @@ -0,0 +1,7 @@ +{ + + "DATA_SOURCE_JSON" : { + "NAME" : "JSON" + } + +} diff --git a/extensions/guacamole-auth-json/src/test/java/org/apache/guacamole/auth/json/RequestValidationServiceTest.java b/extensions/guacamole-auth-json/src/test/java/org/apache/guacamole/auth/json/RequestValidationServiceTest.java new file mode 100644 index 0000000..733b02d --- /dev/null +++ b/extensions/guacamole-auth-json/src/test/java/org/apache/guacamole/auth/json/RequestValidationServiceTest.java @@ -0,0 +1,453 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.json; + +import java.io.BufferedReader; +import java.security.Principal; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Pattern; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.servlet.ServletInputStream; +import javax.servlet.RequestDispatcher; +import org.apache.guacamole.net.auth.Credentials; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * Unit test for RequestValidationService. Verifies that only requests + * from trusted hosts are allowed to authenticate. + */ +public class RequestValidationServiceTest { + + /** + * This class is used to mock ConfigurationService. + */ + private class MockConfigurationService extends ConfigurationService { + + /** + * List of networks to be trusted + */ + private Collection trustedNetworks; + + /** + * Constructor that enables passing of a comma-separated list of + * trusted networks. + * + * @param trustedNetworks + * The comma-separated list of trusted networks + */ + private MockConfigurationService(String trustedNetworks) { + if (trustedNetworks == null || trustedNetworks.isEmpty()) + this.trustedNetworks = Collections.emptyList(); + else + this.trustedNetworks = Arrays.asList(Pattern.compile(",\\s*").split(trustedNetworks)); + } + + @Override + public Collection getTrustedNetworks() { + return trustedNetworks; + } + + } + + /** + * The instance of RequestValidationService to be tested. + */ + private RequestValidationService requestService; + + /** + * Method that returns a (mock) HttpServletRequest with the provided + * remote address. + * + * @param remoteAddr + * The remote address of the request + */ + private static HttpServletRequest mockHttpServletRequest(String remoteAddr) { + + return new HttpServletRequest() { + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public int getContentLength() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public String getContextPath() { + return null; + } + + @Override + public Cookie[] getCookies() { + return null; + } + + @Override + public long getDateHeader(String name) { + return 0; + } + + @Override + public String getHeader(String name) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public Enumeration getHeaders(String name) { + return null; + } + + @Override + public ServletInputStream getInputStream() { + return null; + } + + @Override + public int getIntHeader(String name) { + return 0; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public String getMethod() { + return null; + } + + @Override + public String getParameter(String name) { + return null; + } + + @Override + public Map getParameterMap() { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String name) { + return null; + } + + @Override + public String getPathInfo() { + return null; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getProtocol() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public BufferedReader getReader() { + return null; + } + + @Override + @Deprecated + public String getRealPath(String path) { + return null; + } + + @Override + public String getRemoteAddr() { + return remoteAddr; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getScheme() { + return null; + } + + @Override + public String getServerName() { + return null; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public String getServletPath() { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public HttpSession getSession(boolean create) { + return null; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + @Deprecated + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } + + @Override + public void removeAttribute(String name) { + return; + } + + @Override + public void setAttribute(String name, Object o) { + return; + } + + @Override + public void setCharacterEncoding(String env) { + return; + } + + }; + + }; + + /** + * Verifies that all hosts are allowed to authenticate when no + * trusted networks are specified. + */ + @Test + public void testNoTrustedNetwork() { + + requestService = new RequestValidationService(new MockConfigurationService(null)); + + try { + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("1.1.1.1")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("10.10.10.10")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("100.100.100.100")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("1:1:1:1:1:1:1:1")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("10:10:10:10:10:10:10:10")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("100:100:100:100:100:100:100:100")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("1000:1000:1000:1000:1000:1000:1000:1000")))); + } + catch (AssertionError e) { + fail("A network was denied to authenticate even though no trusted networks were specified."); + } + + } + + /** + * Verifies that hosts from trusted networks are allowed to + * authenticate: + */ + @Test + public void testTrustedNetwork() { + + requestService = new RequestValidationService(new MockConfigurationService("10.0.0.0/8,127.0.0.0/8,172.16.0.0/12,192.168.0.0/16,1.2.3.4/32,::1/128,fc00::/7")); + + try { + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("10.0.0.0")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("10.255.255.255")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("127.0.0.0")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("127.255.255.255")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("172.16.0.0")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("172.31.255.255")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("192.168.0.0")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("192.168.255.255")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("1.2.3.4")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("::1")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("fc00::")))); + assertTrue(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")))); + } + catch (AssertionError e) { + fail("A trusted network was denied to authenticate."); + } + + } + + /** + * Verifies that hosts outside trusted networks are not allowed to + * authenticate. + */ + @Test + public void testUntrustedNetwork() { + + requestService = new RequestValidationService(new MockConfigurationService("10.0.0.0/8,127.0.0.0/8,172.16.0.0/12,192.168.0.0/16,1.2.3.4/32,::1/128,fc00::/7")); + + try { + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("9.255.255.255")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("11.0.0.0")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("126.255.255.255")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("128.0.0.0")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("172.15.255.255")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("172.32.0.0")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("192.167.255.255")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("192.169.0.0")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("1.2.3.3")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("1.2.3.5")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("::0")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("::2")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("fbff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")))); + assertFalse(requestService.isAuthenticationAllowed(new Credentials(null, null, mockHttpServletRequest("fe00::")))); + } + catch (AssertionError e) { + fail("An untrusted network was allowed to authenticate."); + } + + } + +} diff --git a/extensions/guacamole-auth-ldap/.gitignore b/extensions/guacamole-auth-ldap/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-ldap/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-ldap/.ratignore b/extensions/guacamole-auth-ldap/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-ldap/doc/examples/exampleConfigGroup.ldif b/extensions/guacamole-auth-ldap/doc/examples/exampleConfigGroup.ldif new file mode 100644 index 0000000..f84940e --- /dev/null +++ b/extensions/guacamole-auth-ldap/doc/examples/exampleConfigGroup.ldif @@ -0,0 +1,30 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +dn: cn=Example Config,dc=guac-dev,dc=org +objectClass: guacConfigGroup +objectClass: groupOfNames +cn: Example Config +guacConfigProtocol: vnc +guacConfigParameter: hostname=localhost +guacConfigParameter: port=5900 +guacConfigParameter: password=secret +member: cn=user1,dc=example,dc=com +member: cn=user2,dc=example,dc=com +seeAlso: cn=admins,ou=groups,dc=example,dc=com diff --git a/extensions/guacamole-auth-ldap/pom.xml b/extensions/guacamole-auth-ldap/pom.xml new file mode 100644 index 0000000..b7ef05e --- /dev/null +++ b/extensions/guacamole-auth-ldap/pom.xml @@ -0,0 +1,111 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-ldap + jar + 1.6.0 + guacamole-auth-ldap + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + org.apache.directory.api + api-all + 2.1.7 + + + + + org.apache.mina + mina-core + + + + + org.apache.commons + commons-lang3 + + + + + + + + com.google.inject + guice + + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + + + org.apache.commons + commons-lang3 + 3.17.0 + + + + + org.apache.mina + mina-core + 2.2.4 + + + + + diff --git a/extensions/guacamole-auth-ldap/schema/guacConfigGroup.ldif b/extensions/guacamole-auth-ldap/schema/guacConfigGroup.ldif new file mode 100644 index 0000000..f445bc8 --- /dev/null +++ b/extensions/guacamole-auth-ldap/schema/guacConfigGroup.ldif @@ -0,0 +1,44 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +dn: cn=guacConfigGroup,cn=schema,cn=config +objectClass: olcSchemaConfig +cn: guacConfigGroup + +olcAttributeTypes: ( 1.3.6.1.4.1.38971.1.1.1 NAME 'guacConfigProtocol' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: ( 1.3.6.1.4.1.38971.1.1.2 NAME 'guacConfigParameter' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: ( 1.3.6.1.4.1.38971.1.1.3 NAME 'guacConfigProxyHostname' + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: ( 1.3.6.1.4.1.38971.1.1.4 NAME 'guacConfigProxyPort' + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) +olcAttributeTypes: ( 1.3.6.1.4.1.38971.1.1.5 NAME 'guacConfigProxyEncryption' + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcObjectClasses: ( 1.3.6.1.4.1.38971.1.2.1 NAME 'guacConfigGroup' + DESC 'Guacamole configuration group' + SUP groupOfNames + MUST guacConfigProtocol + MAY ( guacConfigParameter $ + guacConfigProxyHostname $ + guacConfigProxyPort $ + guacConfigProxyEncryption ) ) diff --git a/extensions/guacamole-auth-ldap/schema/guacConfigGroup.schema b/extensions/guacamole-auth-ldap/schema/guacConfigGroup.schema new file mode 100644 index 0000000..d54d90a --- /dev/null +++ b/extensions/guacamole-auth-ldap/schema/guacConfigGroup.schema @@ -0,0 +1,46 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +attributetype ( 1.3.6.1.4.1.38971.1.1.1 NAME 'guacConfigProtocol' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) + +attributetype ( 1.3.6.1.4.1.38971.1.1.2 NAME 'guacConfigParameter' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) + +attributetype ( 1.3.6.1.4.1.38971.1.1.3 NAME 'guacConfigProxyHostname' + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) + +attributetype ( 1.3.6.1.4.1.38971.1.1.4 NAME 'guacConfigProxyPort' + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) + +attributetype ( 1.3.6.1.4.1.38971.1.1.5 NAME 'guacConfigProxyEncryption' + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) + +objectClass ( 1.3.6.1.4.1.38971.1.2.1 NAME 'guacConfigGroup' + DESC 'Guacamole configuration group' + SUP groupOfNames + MUST guacConfigProtocol + MAY ( guacConfigParameter $ + guacConfigProxyHostname $ + guacConfigProxyPort $ + guacConfigProxyEncryption ) ) + diff --git a/extensions/guacamole-auth-ldap/src/main/assembly/dist.xml b/extensions/guacamole-auth-ldap/src/main/assembly/dist.xml new file mode 100644 index 0000000..3b03b22 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/assembly/dist.xml @@ -0,0 +1,64 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + doc + + + + + schema + schema + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/AuthenticationProviderService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/AuthenticationProviderService.java new file mode 100644 index 0000000..33b811e --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/AuthenticationProviderService.java @@ -0,0 +1,486 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap; + +import org.apache.guacamole.auth.ldap.user.UserLDAPConfiguration; +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.directory.api.ldap.model.entry.Attribute; +import org.apache.directory.api.ldap.model.entry.Entry; +import org.apache.directory.api.ldap.model.exception.LdapException; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.ldap.client.api.LdapNetworkConnection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.ldap.conf.ConfigurationService; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; +import org.apache.guacamole.auth.ldap.group.UserGroupService; +import org.apache.guacamole.auth.ldap.user.LDAPAuthenticatedUser; +import org.apache.guacamole.auth.ldap.user.LDAPUserContext; +import org.apache.guacamole.auth.ldap.user.UserService; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.token.TokenName; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service providing convenience functions for the LDAP AuthenticationProvider + * implementation. + */ +public class AuthenticationProviderService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(AuthenticationProviderService.class); + + /** + * The prefix that will be used when generating tokens. + */ + public static final String LDAP_TOKEN_PREFIX = "LDAP_"; + + /** + * Regular expression that extracts the Windows / Active Directory domain + * from a username in either of the following formats: down-level logon + * ("DOMAIN\\username") or UPN ("username@domain"). If the username is in + * "DOMAIN\\username" format, the domain will be stored in the first + * capturing group. If the username is in UPN format, the domain will be + * stored in the second capturing group. + */ + private static final Pattern LDAP_USERNAME_DOMAIN = Pattern.compile("^(.+)\\\\.*$|^.*@(.+)$"); + + /** + * The index of the capturing group in {@link #LDAP_USERNAME_DOMAIN} that + * captures the domain of a username in down-level logon format + * ("DOMAIN\\username"). + */ + private static final int LDAP_USERNAME_DOMAIN_DOWN_LEVEL_GROUP = 1; + + /** + * The index of the capturing group in {@link #LDAP_USERNAME_DOMAIN} that + * captures the domain of a username in UPN format ("username@domain"). + */ + private static final int LDAP_USERNAME_DOMAIN_UPN_GROUP = 2; + + /** + * The name of parameter token that will contain the domain extracted from + * the LDAP user's username, if applicable. + */ + public static final String LDAP_DOMAIN_TOKEN = LDAP_TOKEN_PREFIX + "DOMAIN"; + + /** + * Service for creating and managing connections to LDAP servers. + */ + @Inject + private LDAPConnectionService ldapService; + + /** + * Service for retrieving LDAP server configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Service for retrieving users and their corresponding LDAP DNs. + */ + @Inject + private UserService userService; + + /** + * Service for retrieving user groups. + */ + @Inject + private UserGroupService userGroupService; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * Provider for UserContext objects. + */ + @Inject + private Provider userContextProvider; + + /** + * Determines the DN which corresponds to the user having the given + * username. The DN will either be derived directly from the user base DN, + * or queried from the LDAP server, depending on how LDAP authentication + * has been configured. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param username + * The username of the user whose corresponding DN should be returned. + * + * @return + * The DN which corresponds to the user having the given username. + * + * @throws GuacamoleException + * If required properties are missing, and thus the user DN cannot be + * determined. + */ + private Dn getUserBindDN(LDAPConfiguration config, String username) + throws GuacamoleException { + + // If a search DN is provided, search the LDAP directory for the DN + // corresponding to the given username + String searchBindLogon = config.getSearchBindDN(); + if (searchBindLogon != null) { + + // Create an LDAP connection using the search account + LdapNetworkConnection searchConnection = ldapService.bindAs(config, + searchBindLogon, config.getSearchBindPassword()); + + // Warn of failure to find + if (searchConnection == null) { + logger.error("Unable to bind using search DN \"{}\"", + searchBindLogon); + return null; + } + + try { + + // Retrieve all DNs associated with the given username + List userDNs = userService.getUserDNs(config, searchConnection, username); + if (userDNs.isEmpty()) + return null; + + // Warn if multiple DNs exist for the same user + if (userDNs.size() != 1) { + logger.warn("Multiple DNs possible for user \"{}\": {}", username, userDNs); + return null; + } + + // Return the single possible DN + return userDNs.get(0); + + } + + // Always disconnect + finally { + searchConnection.close(); + } + + } + + // Otherwise, derive user DN from base DN + return userService.deriveUserDN(config, username); + + } + + /** + * Returns a new UserLDAPConfiguration that is connected to an LDAP server + * associated with the Guacamole user having the given username and bound + * using the provided password. All LDAP servers associated with the given + * user are tried until the connection and authentication attempt succeeds. + * If no LDAP servers are available, or no LDAP servers are associated with + * the given user, null is returned. The Guacamole username will be + * internally translated to a fully-qualified LDAP DN according to the + * configuration of the LDAP server that is ultimately chosen. + * + * @param username + * The username of the Guacamole user to bind as. + * + * @param password + * The password of the user to bind as. + * + * @return + * A new UserLDAPConfiguration which is bound to an LDAP server using + * the provided credentials, or null if no LDAP servers are available + * for the given user or connecting/authenticating has failed. + * + * @throws GuacamoleException + * If configuration information for the user's LDAP server(s) cannot + * be retrieved. + */ + private UserLDAPConfiguration getLDAPConfiguration(String username, + String password) throws GuacamoleException { + + // Get all LDAP server configurations + Collection configs = confService.getLDAPConfigurations(); + if (configs.isEmpty()) { + logger.info("Skipping LDAP authentication as no LDAP servers are configured."); + return null; + } + + // Try each possible LDAP configuration until the TCP connection and + // authentication are successful + for (LDAPConfiguration config : configs) { + + // Attempt connection only if username matches + String translatedUsername = config.appliesTo(username); + if (translatedUsername == null) { + logger.debug("LDAP server \"{}\" does not match username \"{}\".", config.getServerHostname(), username); + continue; + } + + logger.debug("LDAP server \"{}\" matched username \"{}\" as \"{}\".", + config.getServerHostname(), username, translatedUsername); + + // Derive DN of user within this LDAP server + Dn bindDn = getUserBindDN(config, translatedUsername); + if (bindDn == null || bindDn.isEmpty()) { + logger.info("Unable to determine DN of user \"{}\" using LDAP " + + "server \"{}\". Proceeding with next server...", + username, config.getServerHostname()); + continue; + } + + // Attempt bind (authentication) + LdapNetworkConnection ldapConnection = ldapService.bindAs(config, bindDn.getName(), password); + if (ldapConnection == null) { + logger.info("Unable to bind as user \"{}\" against LDAP " + + "server \"{}\". Proceeding with next server...", + username, config.getServerHostname()); + continue; + } + + // Connection and bind were successful + logger.info("User \"{}\" was successfully authenticated by LDAP server \"{}\".", username, config.getServerHostname()); + return new UserLDAPConfiguration(config, translatedUsername, bindDn, ldapConnection); + + } + + // No LDAP connection/authentication attempt succeeded + logger.info("User \"{}\" did not successfully authenticate against any LDAP server.", username); + return null; + + } + + /** + * Returns an AuthenticatedUser representing the user authenticated by the + * given credentials. Also adds custom LDAP attributes to the + * AuthenticatedUser. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * An AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @throws GuacamoleException + * If an error occurs while authenticating the user, or if access is + * denied. + */ + public LDAPAuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + String username = credentials.getUsername(); + String password = credentials.getPassword(); + + // Username and password are required + if (username == null + || username.isEmpty() + || password == null + || password.isEmpty()) { + throw new GuacamoleInvalidCredentialsException( + "Anonymous bind is not currently allowed by the LDAP" + + " authentication provider.", CredentialsInfo.USERNAME_PASSWORD); + } + + UserLDAPConfiguration config = getLDAPConfiguration(username, password); + if (config == null) + throw new GuacamoleInvalidCredentialsException("Invalid login.", + CredentialsInfo.USERNAME_PASSWORD); + + try { + + // Retrieve group membership of the user that just authenticated + Set effectiveGroups = + userGroupService.getParentUserGroupIdentifiers(config, config.getBindDN()); + + // Return AuthenticatedUser if bind succeeds + LDAPAuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + + authenticatedUser.init(config, credentials, + getUserTokens(config, credentials), effectiveGroups); + + return authenticatedUser; + } + + catch (GuacamoleException | RuntimeException | Error e) { + config.close(); + throw e; + } + + } + + /** + * Returns the Windows / Active Directory domain included in the username + * of the provided user credentials. If the username does not contain a + * domain, null is returned. + * + * @param credentials + * The credentials used for authentication. + * + * @return + * The domain name within the username of the provided credentials, or + * null if no domain is present. + */ + private String getUserDomain(Credentials credentials) { + + // Extract domain from username (not necessarily present) + String username = credentials.getUsername(); + Matcher matcher = LDAP_USERNAME_DOMAIN.matcher(username); + if (!matcher.find()) + return null; + + String dlDomain = matcher.group(LDAP_USERNAME_DOMAIN_DOWN_LEVEL_GROUP); + String upnDomain = matcher.group(LDAP_USERNAME_DOMAIN_UPN_GROUP); + + // The two domain formats are mutually exclusive. If any format is + // present, the other must be absent unless there is a bug in the + // way the domains are parsed + assert(dlDomain == null || upnDomain == null); + + // Use whichever domain format is present + return dlDomain != null ? dlDomain : upnDomain; + + } + + /** + * Returns parameter tokens generated based on details specific to the user + * currently bound under the given LDAP connection. Both LDAP attributes on + * the user's associated LDAP object and the credentials submitted by the user + * to Guacamole are considered. If any tokens are to be derived from LDAP + * attributes, those attributes must be explicitly listed in + * guacamole.properties. If no tokens are applicable, an empty map is returned. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * A map of parameter tokens. These tokens are generated based on + * the attributes of the user currently bound under the given LDAP connection + * and the user's credentials. The map's keys are the canonicalized attribute + * names with an "LDAP_" prefix, and the values are the corresponding attribute + * values. If the domain name is extracted from the user's credentials, it is added + * to the map with the key "LDAP_DOMAIN". If no applicable tokens are found, + * the method returns an empty map. + * + * @throws GuacamoleException + * If an error occurs retrieving the user DN or the attributes. + */ + private Map getUserTokens(ConnectedLDAPConfiguration config, Credentials credentials) + throws GuacamoleException { + + // Get attributes from configuration information + Collection attrList = config.getAttributes(); + + // If there are no attributes there is no reason to search LDAP + if (attrList.isEmpty()) + return Collections.emptyMap(); + + // Build LDAP query parameters + String[] attrArray = attrList.toArray(new String[attrList.size()]); + + Map tokens = new HashMap<>(); + try { + + // Get LDAP attributes by querying LDAP + Entry userEntry = config.getLDAPConnection().lookup(config.getBindDN(), attrArray); + if (userEntry == null) + return Collections.emptyMap(); + + Collection attributes = userEntry.getAttributes(); + if (attributes == null) + return Collections.emptyMap(); + + // Convert each retrieved attribute into a corresponding token + for (Attribute attr : attributes) { + tokens.put(TokenName.canonicalize(attr.getId(), + LDAP_TOKEN_PREFIX), attr.getString()); + } + } + catch (LdapException e) { + throw new GuacamoleServerException("Could not query LDAP user attributes.", e); + } + + // Extract the domain (ie: Windows / Active Directory domain) from the + // user's credentials + String domainName = getUserDomain(credentials); + if (domainName != null) + tokens.put(LDAP_DOMAIN_TOKEN, domainName); + + return tokens; + + } + + /** + * Returns a UserContext object initialized with data accessible to the + * given AuthenticatedUser. + * + * @param authenticatedUser + * The AuthenticatedUser to retrieve data for. + * + * @return + * A UserContext object initialized with data accessible to the given + * AuthenticatedUser. + * + * @throws GuacamoleException + * If the UserContext cannot be created due to an error. + */ + public LDAPUserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + if (authenticatedUser instanceof LDAPAuthenticatedUser) { + + LDAPAuthenticatedUser ldapAuthenticatedUser = (LDAPAuthenticatedUser) authenticatedUser; + ConnectedLDAPConfiguration config = ldapAuthenticatedUser.getLDAPConfiguration(); + + try { + + // Build user context by querying LDAP + LDAPUserContext userContext = userContextProvider.get(); + userContext.init(ldapAuthenticatedUser); + return userContext; + + } + + // Always disconnect + finally { + config.close(); + } + } + + return null; + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/ConnectedLDAPConfiguration.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/ConnectedLDAPConfiguration.java new file mode 100644 index 0000000..c41114c --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/ConnectedLDAPConfiguration.java @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap; + +import java.util.Collection; +import java.util.List; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.message.AliasDerefMode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.ldap.client.api.LdapNetworkConnection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ldap.conf.EncryptionMethod; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; +import org.apache.guacamole.auth.ldap.conf.LDAPSSLProtocol; +import org.apache.guacamole.auth.ldap.conf.MemberAttributeType; + +/** + * LDAPConfiguration implementation that is associated with an + * LdapNetworkConnection to the configured LDAP server. + */ +public class ConnectedLDAPConfiguration implements LDAPConfiguration, AutoCloseable { + + /** + * The wrapped LDAPConfiguration. + */ + private final LDAPConfiguration config; + + /** + * The connection to the LDAP server represented by this configuration. + */ + private final LdapNetworkConnection connection; + + /** + * The LDAP DN that was used to bind with the LDAP server to produce + * {@link #connection}. + */ + private final Dn bindDn; + + /** + * Creates a new ConnectedLDAPConfiguration that associates the given + * LdapNetworkConnection with the given LDAPConfiguration. All functions + * inherited from the LDAPConfiguration interface are delegated to the + * given LDAPConfiguration. It is the responsibility of the caller to + * ensure the provided LdapNetworkConnection is closed after it is no + * longer needed. + * + * @param config + * The LDAPConfiguration to wrap. + * + * @param bindDn + * The LDAP DN that was used to bind with the LDAP server to produce + * the given LdapNetworkConnection. + * + * @param connection + * The connection to the LDAP server represented by the given + * configuration. + */ + public ConnectedLDAPConfiguration(LDAPConfiguration config, Dn bindDn, LdapNetworkConnection connection) { + this.config = config; + this.bindDn = bindDn; + this.connection = connection; + } + + /** + * Returns the LdapNetworkConnection for the connection to the LDAP server + * represented by this configuration. The lifecycle of this connection is + * managed externally. The connection is not guaranteed to still be + * connected. + * + * @return + * The LdapNetworkConnection for the connection to the LDAP server + * represented by this configuration. + */ + public LdapNetworkConnection getLDAPConnection() { + return connection; + } + + /** + * Returns the LDAP DN that was used to bind with the LDAP server to + * produce the LdapNetworkConnection associated with this + * ConnectedLDAPConfiguration. + * + * @return + * The LDAP DN that was used to bind with the LDAP server. + */ + public Dn getBindDN() { + return bindDn; + } + + @Override + public void close() { + connection.close(); + } + + @Override + public String appliesTo(String username) throws GuacamoleException { + return config.appliesTo(username); + } + + @Override + public String getServerHostname() throws GuacamoleException { + return config.getServerHostname(); + } + + @Override + public int getServerPort() throws GuacamoleException { + return config.getServerPort(); + } + + @Override + public Collection getUsernameAttributes() throws GuacamoleException { + return config.getUsernameAttributes(); + } + + @Override + public Dn getUserBaseDN() throws GuacamoleException { + return config.getUserBaseDN(); + } + + @Override + public Dn getConfigurationBaseDN() throws GuacamoleException { + return config.getConfigurationBaseDN(); + } + + @Override + public Collection getGroupNameAttributes() throws GuacamoleException { + return config.getGroupNameAttributes(); + } + + @Override + public Dn getGroupBaseDN() throws GuacamoleException { + return config.getGroupBaseDN(); + } + + @Override + public String getSearchBindDN() throws GuacamoleException { + return config.getSearchBindDN(); + } + + @Override + public String getSearchBindPassword() throws GuacamoleException { + return config.getSearchBindPassword(); + } + + @Override + public EncryptionMethod getEncryptionMethod() throws GuacamoleException { + return config.getEncryptionMethod(); + } + + @Override + public LDAPSSLProtocol getSslProtocol() throws GuacamoleException { + return config.getSslProtocol(); + } + + @Override + public int getMaxResults() throws GuacamoleException { + return config.getMaxResults(); + } + + @Override + public AliasDerefMode getDereferenceAliases() throws GuacamoleException { + return config.getDereferenceAliases(); + } + + @Override + public boolean getFollowReferrals() throws GuacamoleException { + return config.getFollowReferrals(); + } + + @Override + public int getMaxReferralHops() throws GuacamoleException { + return config.getMaxReferralHops(); + } + + @Override + public ExprNode getUserSearchFilter() throws GuacamoleException { + return config.getUserSearchFilter(); + } + + @Override + public ExprNode getGroupSearchFilter() throws GuacamoleException { + return config.getGroupSearchFilter(); + } + + @Override + public int getOperationTimeout() throws GuacamoleException { + return config.getOperationTimeout(); + } + + @Override + public int getNetworkTimeout() throws GuacamoleException { + return config.getNetworkTimeout(); + } + + @Override + public Collection getAttributes() throws GuacamoleException { + return config.getAttributes(); + } + + @Override + public String getMemberAttribute() throws GuacamoleException { + return config.getMemberAttribute(); + } + + @Override + public MemberAttributeType getMemberAttributeType() throws GuacamoleException { + return config.getMemberAttributeType(); + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java new file mode 100644 index 0000000..48e275c --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap; + + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ldap.user.LDAPAuthenticatedUser; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.TokenInjectingUserContext; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Allows users to be authenticated against an LDAP server. Each user may have + * any number of authorized configurations. Authorized configurations may be + * shared. + */ +public class LDAPAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * The identifier reserved for the root connection group. + */ + public static final String ROOT_CONNECTION_GROUP = "ROOT"; + + /** + * Injector which will manage the object graph of this authentication + * provider. + */ + private final Injector injector; + + /** + * Creates a new LDAPAuthenticationProvider that authenticates users + * against an LDAP directory. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public LDAPAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + injector = Guice.createInjector( + new LDAPAuthenticationProviderModule(this) + ); + + } + + @Override + public String getIdentifier() { + return "ldap"; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { + + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.authenticateUser(credentials); + + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.getUserContext(authenticatedUser); + + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + + // Only decorate if the user authenticated against LDAP + if (!(authenticatedUser instanceof LDAPAuthenticatedUser)) + return context; + + // Apply LDAP-specific tokens to all connections / connection groups + return new TokenInjectingUserContext(context, + ((LDAPAuthenticatedUser) authenticatedUser).getTokens()); + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProviderModule.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProviderModule.java new file mode 100644 index 0000000..fb6f915 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProviderModule.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.auth.ldap.conf.ConfigurationService; +import org.apache.guacamole.auth.ldap.connection.ConnectionService; +import org.apache.guacamole.auth.ldap.user.UserService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ldap.group.UserGroupService; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * Guice module which configures LDAP-specific injections. + */ +public class LDAPAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the LDAPAuthenticationProvider on behalf of which this + * module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new LDAP authentication provider module which configures + * injection for the LDAPAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public LDAPAuthenticationProviderModule(AuthenticationProvider authProvider) + throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Store associated auth provider + this.authProvider = authProvider; + + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind LDAP-specific services + bind(ConfigurationService.class); + bind(ConnectionService.class); + bind(LDAPConnectionService.class); + bind(ObjectQueryService.class); + bind(UserGroupService.class); + bind(UserService.class); + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPConnectionService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPConnectionService.java new file mode 100644 index 0000000..06f83b5 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPConnectionService.java @@ -0,0 +1,478 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap; + +import org.apache.directory.api.ldap.model.exception.LdapAuthenticationException; +import org.apache.directory.api.ldap.model.exception.LdapException; +import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.message.SearchRequest; +import org.apache.directory.api.ldap.model.message.SearchRequestImpl; +import org.apache.directory.api.ldap.model.message.SearchScope; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.api.ldap.model.url.LdapUrl; +import org.apache.directory.ldap.client.api.LdapConnectionConfig; +import org.apache.directory.ldap.client.api.LdapNetworkConnection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.auth.ldap.conf.EncryptionMethod; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; +import org.apache.guacamole.auth.ldap.conf.LDAPSSLProtocol; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for creating and managing connections to LDAP servers. + */ +public class LDAPConnectionService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(LDAPConnectionService.class); + + /** + * Creates a new instance of LdapNetworkConnection, configured as required + * to use the given encryption method to communicate with the LDAP server + * at the given hostname and port, with the specified encryption method, + * SSL protocol version, and timeout. The returned LdapNetworkConnection is + * configured for use but is not yet connected nor bound to the LDAP + * server. It will not be bound until a bind operation is explicitly + * requested, and will not be connected until it is used in an LDAP + * operation (such as a bind). + * + * @param host + * The hostname or IP address of the LDAP server. + * + * @param port + * The TCP port that the LDAP server is listening on. + * + * @param encryptionMethod + * The encryption method that should be used to communicate with the + * LDAP server. + * + * @param sslProtocol + * The SSL protocol version to use to make a secure LDAP configuration, + * if SSL or STARTTLS is used. + * + * @param timeout + * The maximum number of milliseconds to wait for a response from the + * LDAP server. + * + * @return + * A new instance of LdapNetworkConnection which uses the given + * encryption method to communicate with the LDAP server at the given + * hostname and port. + * + * @throws GuacamoleException + * If the requested encryption method is actually not implemented (a + * bug). + */ + private LdapNetworkConnection createLDAPConnection(String host, int port, + EncryptionMethod encryptionMethod, LDAPSSLProtocol sslProtocol, + int timeout) + throws GuacamoleException { + + LdapConnectionConfig config = new LdapConnectionConfig(); + config.setLdapHost(host); + config.setLdapPort(port); + config.setTimeout(timeout); + + // Map encryption method to proper connection and socket factory + switch (encryptionMethod) { + + // Unencrypted LDAP connection + case NONE: + logger.debug("Connection to LDAP server without encryption."); + break; + + // LDAP over SSL (LDAPS) + case SSL: + logger.debug("Connecting to LDAP server using SSL/TLS."); + config.setUseSsl(true); + config.setSslProtocol(sslProtocol.toString()); + break; + + // LDAP + STARTTLS + case STARTTLS: + logger.debug("Connecting to LDAP server using STARTTLS."); + config.setUseTls(true); + config.setSslProtocol(sslProtocol.toString()); + break; + + // The encryption method, though known, is not actually + // implemented. If encountered, this would be a bug. + default: + throw new GuacamoleUnsupportedException("Unimplemented encryption method: " + encryptionMethod); + + } + + return new LdapNetworkConnection(config); + + } + + /** + * Creates a new instance of LdapNetworkConnection, configured as required + * to use the given encryption method to communicate with the LDAP server + * at the given hostname and port with the encryption method and timeout + * specified, as well. The returned LdapNetworkConnection is configured + * for use but is not yet connected nor bound to the LDAP server. It will + * not be bound until a bind operation is explicitly requested, and will + * not be connected until it is used in an LDAP operation (such as a bind). + * + * @param host + * The hostname or IP address of the LDAP server. + * + * @param port + * The TCP port that the LDAP server is listening on. + * + * @param encryptionMethod + * The encryption method that should be used to communicate with the + * LDAP server. + * + * @param timeout + * The maximum number of milliseconds to wait for a response from the + * LDAP server. + * + * @return + * A new instance of LdapNetworkConnection which uses the given + * encryption method to communicate with the LDAP server at the given + * hostname and port. + * + * @throws GuacamoleException + * If the requested encryption method is actually not implemented (a + * bug). + */ + private LdapNetworkConnection createLDAPConnection(String host, int port, + EncryptionMethod encryptionMethod, int timeout) + throws GuacamoleException { + return createLDAPConnection(host, port, encryptionMethod, + LDAPSSLProtocol.TLSv1_3, timeout); + } + + /** + * Creates a new instance of LdapNetworkConnection, configured as required + * to use whichever encryption method, hostname, and port are requested + * within guacamole.properties. The returned LdapNetworkConnection is + * configured for use but is not yet connected nor bound to the LDAP + * server. It will not be bound until a bind operation is explicitly + * requested, and will not be connected until it is used in an LDAP + * operation (such as a bind). + * + * @param config + * The configuration of the LDAP server being queried. + * + * @return + * A new LdapNetworkConnection instance which has already been + * configured to use the encryption method, hostname, and port + * requested within guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs while parsing guacamole.properties, or if the + * requested encryption method is actually not implemented (a bug). + */ + private LdapNetworkConnection createLDAPConnection(LDAPConfiguration config) + throws GuacamoleException { + return createLDAPConnection( + config.getServerHostname(), + config.getServerPort(), + config.getEncryptionMethod(), + config.getSslProtocol(), + config.getNetworkTimeout()); + } + + /** + * Creates a new instance of LdapNetworkConnection, configured as required + * to use whichever encryption method, hostname, and port are specified + * within the given LDAP URL. The returned LdapNetworkConnection is + * configured for use but is not yet connected nor bound to the LDAP + * server. It will not be bound until a bind operation is explicitly + * requested, and will not be connected until it is used in an LDAP + * operation (such as a bind). + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param url + * The LDAP URL containing the details which should be used to connect + * to the LDAP server. + * + * @return + * A new LdapNetworkConnection instance which has already been + * configured to use the encryption method, hostname, and port + * specified within the given LDAP URL. + * + * @throws GuacamoleException + * If the given URL is not a valid LDAP URL, or if the encryption + * method indicated by the URL is known but not actually implemented (a + * bug). + */ + private LdapNetworkConnection createLDAPConnection(LDAPConfiguration config, + String url) throws GuacamoleException { + + // Parse provided LDAP URL + LdapUrl ldapUrl; + try { + ldapUrl = new LdapUrl(url); + } + catch (LdapException e) { + logger.debug("Cannot connect to LDAP URL \"{}\": URL is invalid.", url, e); + throw new GuacamoleServerException("Invalid LDAP URL.", e); + } + + // Retrieve hostname from URL, bailing out if no hostname is present + String host = ldapUrl.getHost(); + if (host == null || host.isEmpty()) { + logger.debug("Cannot connect to LDAP URL \"{}\": no hostname is present.", url); + throw new GuacamoleServerException("LDAP URL contains no hostname."); + } + + // Parse encryption method from URL scheme + EncryptionMethod encryptionMethod = EncryptionMethod.NONE; + if (LdapUrl.LDAPS_SCHEME.equals(ldapUrl.getScheme())) + encryptionMethod = EncryptionMethod.SSL; + + // Use STARTTLS for otherwise unencrypted ldap:// URLs if the main + // LDAP connection requires STARTTLS + else if (config.getEncryptionMethod() == EncryptionMethod.STARTTLS) { + logger.debug("Using STARTTLS for LDAP URL \"{}\" as the main LDAP " + + "connection described in guacamole.properties is " + + "configured to use STARTTLS.", url); + encryptionMethod = EncryptionMethod.STARTTLS; + } + + // If no post is specified within the URL, use the default port + // dictated by the encryption method + int port = ldapUrl.getPort(); + if (port < 1) + port = encryptionMethod.DEFAULT_PORT; + + return createLDAPConnection(host, port, encryptionMethod, + config.getSslProtocol(), config.getNetworkTimeout()); + + } + + /** + * Binds to the LDAP server indicated by the given LdapNetworkConnection + * using the given credentials. If the LdapNetworkConnection is not yet + * connected, an LDAP connection is first established. The provided + * credentials will be stored within the LdapConnectionConfig of the given + * LdapNetworkConnection. If the bind operation fails, the given + * LdapNetworkConnection is automatically closed. + * + * @param ldapConnection + * The LdapNetworkConnection describing the connection to the LDAP + * server. This LdapNetworkConnection is modified as a result of this + * call and will be automatically closed if this call fails. + * + * @param userDN + * The DN of the user to bind as, or null to bind anonymously. + * + * @param password + * The password to use when binding as the specified user, or null to + * attempt to bind without a password. + * + * @return + * A bound LDAP connection, or null if the connection could not be + * bound. + */ + private LdapNetworkConnection bindAs(LdapNetworkConnection ldapConnection, + String bindUser, String password) { + + // Add credentials to existing config + LdapConnectionConfig config = ldapConnection.getConfig(); + config.setName(bindUser); + config.setCredentials(password); + + try { + // Connect and bind using provided credentials + ldapConnection.bind(); + } + + // Disconnect if an authentication error occurs, but log that failure + // only at the debug level (such failures are expected) + catch (LdapAuthenticationException e) { + ldapConnection.close(); + logger.debug("Bind attempt with LDAP server as user \"{}\" failed.", + bindUser, e); + return null; + } + + // Disconnect for all other bind failures, as well, logging those at + // the error level + catch (LdapException e) { + ldapConnection.close(); + logger.error("Binding with the LDAP server at \"{}\" as user " + + "\"{}\" failed: {}", config.getLdapHost(), bindUser, + e.getMessage()); + logger.debug("Unable to bind to LDAP server.", e); + return null; + } + + return ldapConnection; + + } + + /** + * Binds to the LDAP server indicated by a given LdapNetworkConnection + * using the credentials that were used to bind another + * LdapNetworkConnection. If the LdapNetworkConnection about to be bound is + * not yet connected, an LDAP connection is first established. The + * credentials from the other LdapNetworkConnection will be stored within + * the LdapConnectionConfig of the given LdapNetworkConnection. If the bind + * operation fails, the given LdapNetworkConnection is automatically + * closed. + * + * @param ldapConnection + * The LdapNetworkConnection describing the connection to the LDAP + * server. This LdapNetworkConnection is modified as a result of this + * call and will be automatically closed if this call fails. + * + * @param useCredentialsFrom + * A bound LdapNetworkConnection whose bind credentials should be + * copied for use within this bind operation. + * + * @return + * A bound LDAP connection, or null if the connection could not be + * bound. + */ + private LdapNetworkConnection bindAs(LdapNetworkConnection ldapConnection, + LdapNetworkConnection useCredentialsFrom) { + + // Copy bind username and password from original config + LdapConnectionConfig ldapConfig = useCredentialsFrom.getConfig(); + String username = ldapConfig.getName(); + String password = ldapConfig.getCredentials(); + + // Parse bind username as an LDAP DN + Dn userDN; + try { + userDN = new Dn(username); + } + catch (LdapInvalidDnException e) { + logger.error("Credentials of existing connection cannot be used. " + + "The username used (\"{}\") is not a valid DN.", username); + logger.debug("Cannot bind using invalid DN.", e); + ldapConnection.close(); + return null; + } + + // Bind using username/password from existing connection + return bindAs(ldapConnection, userDN.getName(), password); + + } + + /** + * Binds to the LDAP server using the provided user DN and password. The + * hostname, port, and encryption method of the LDAP server are determined + * from guacamole.properties. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param bindUser + * The DN or UPN of the user to bind as, or null to bind anonymously. + * + * @param password + * The password to use when binding as the specified user, or null to + * attempt to bind without a password. + * + * @return + * A bound LDAP connection, or null if the connection could not be + * bound. + * + * @throws GuacamoleException + * If an error occurs while parsing guacamole.properties, or if the + * configured encryption method is actually not implemented (a bug). + */ + public LdapNetworkConnection bindAs(LDAPConfiguration config, + String bindUser, String password) throws GuacamoleException { + return bindAs(createLDAPConnection(config), bindUser, password); + } + + /** + * Binds to the LDAP server indicated by the given LDAP URL using the + * credentials that were used to bind an existing LdapNetworkConnection. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param url + * The LDAP URL containing the details which should be used to connect + * to the LDAP server. + * + * @param useCredentialsFrom + * A bound LdapNetworkConnection whose bind credentials should be + * copied for use within this bind operation. + * + * @return + * A bound LDAP connection, or null if the connection could not be + * bound. + * + * @throws GuacamoleException + * If the given URL is not a valid LDAP URL, or if the encryption + * method indicated by the URL is known but not actually implemented (a + * bug). + */ + public LdapNetworkConnection bindAs(LDAPConfiguration config, String url, + LdapNetworkConnection useCredentialsFrom) + throws GuacamoleException { + return bindAs(createLDAPConnection(config, url), useCredentialsFrom); + } + + /** + * Generate a SearchRequest object using the given Base DN and filter + * and retrieving other properties from the LDAP configuration service. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param baseDn + * The LDAP Base DN at which to search the search. + * + * @param filter + * A string representation of a LDAP filter to use for the search. + * + * @return + * The properly-configured SearchRequest object. + * + * @throws GuacamoleException + * If an error occurs retrieving any of the configuration values. + */ + public SearchRequest getSearchRequest(LDAPConfiguration config, Dn baseDn, + ExprNode filter) throws GuacamoleException { + + SearchRequest searchRequest = new SearchRequestImpl(); + searchRequest.setBase(baseDn); + searchRequest.setDerefAliases(config.getDereferenceAliases()); + searchRequest.setScope(SearchScope.SUBTREE); + searchRequest.setFilter(filter); + searchRequest.setSizeLimit(config.getMaxResults()); + searchRequest.setTimeLimit(config.getOperationTimeout()); + searchRequest.setTypesOnly(false); + + if (config.getFollowReferrals()) + searchRequest.followReferrals(); + + return searchRequest; + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/ObjectQueryService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/ObjectQueryService.java new file mode 100644 index 0000000..02814ac --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/ObjectQueryService.java @@ -0,0 +1,397 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap; + +import com.google.inject.Inject; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import org.apache.directory.api.ldap.model.cursor.CursorException; +import org.apache.directory.api.ldap.model.cursor.SearchCursor; +import org.apache.directory.api.ldap.model.entry.Attribute; +import org.apache.directory.api.ldap.model.entry.Entry; +import org.apache.directory.api.ldap.model.exception.LdapException; +import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException; +import org.apache.directory.api.ldap.model.filter.AndNode; +import org.apache.directory.api.ldap.model.filter.EqualityNode; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.filter.OrNode; +import org.apache.directory.api.ldap.model.filter.PresenceNode; +import org.apache.directory.api.ldap.model.message.SearchRequest; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.ldap.client.api.LdapNetworkConnection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; +import org.apache.guacamole.auth.ldap.conf.LDAPGuacamoleProperties; +import org.apache.guacamole.net.auth.Identifiable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for executing queries against an LDAP directory intended to retrieve + * Guacamole-related objects. Referrals are automatically handled. Convenience + * functions are provided for generating the LDAP queries typically required + * for retrieving Guacamole objects, as well as for converting the results of a + * query into a {@link Map} of Guacamole objects. + */ +public class ObjectQueryService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ObjectQueryService.class); + + /** + * Service for connecting to LDAP directory. + */ + @Inject + private LDAPConnectionService ldapService; + + /** + * Returns the identifier of the object represented by the given LDAP + * entry. Multiple attributes may be declared as containing the identifier + * of the object when present on an LDAP entry. If multiple such attributes + * are present on the same LDAP entry, the value of the attribute with + * highest priority is used. If multiple copies of the same attribute are + * present on the same LDAPentry, the first value of that attribute is + * used. + * + * @param entry + * The entry representing the Guacamole object whose unique identifier + * should be determined. + * + * @param attributes + * A collection of all attributes which may be used to specify the + * unique identifier of the Guacamole object represented by an LDAP + * entry, in order of decreasing priority. + * + * @return + * The identifier of the object represented by the given LDAP entry, or + * null if no attributes declared as containing the identifier of the + * object are present on the entry. + * + * @throws LdapInvalidAttributeValueException + * If an error occurs retrieving the value of the identifier attribute. + */ + public String getIdentifier(Entry entry, Collection attributes) + throws LdapInvalidAttributeValueException { + + // Retrieve the first value of the highest priority identifier attribute + for (String identifierAttribute : attributes) { + Attribute identifier = entry.get(identifierAttribute); + if (identifier != null) + return identifier.getString(); + } + + // No identifier attribute is present on the entry + return null; + + } + + /** + * Generates a properly-escaped LDAP query which finds all objects which + * match the given LDAP filter and which have at least one of the given + * attributes set to the specified value. + * + * @param filter + * The LDAP filter to apply to reduce the results of the query in + * addition to testing the values of the given attributes. + * + * @param attributes + * A collection of all attributes to test for equivalence to the given + * value, in order of decreasing priority. + * + * @param attributeValue + * The value that the resulting LDAP query should search for within the + * attributes of objects within the LDAP directory. If null, the + * resulting LDAP query will search for the presence of at least one of + * the given attributes on each object, regardless of the value of + * those attributes. + * + * @return + * An LDAP query which will search for arbitrary LDAP objects having at + * least one of the given attributes set to the specified value. + */ + public ExprNode generateQuery(ExprNode filter, + Collection attributes, String attributeValue) { + + // Build LDAP query for objects having at least one attribute and with + // the given search filter + AndNode searchFilter = new AndNode(); + searchFilter.addNode(filter); + + // If no attributes provided, we're done. + if (attributes.size() < 1) + return searchFilter; + + // Include all attributes within OR clause + OrNode attributeFilter = new OrNode(); + + // If value is defined, check each attribute for that value. + if (attributeValue != null) { + attributes.forEach(attribute -> + attributeFilter.addNode(new EqualityNode(attribute, + attributeValue)) + ); + } + + // If no value is defined, just check for presence of attribute. + else { + attributes.forEach(attribute -> + attributeFilter.addNode(new PresenceNode(attribute)) + ); + } + + searchFilter.addNode(attributeFilter); + + logger.trace("Sending LDAP filter: \"{}\"", searchFilter.toString()); + + return searchFilter; + + } + + /** + * Executes an arbitrary LDAP query using the given connection, returning a + * list of all results. Only objects beneath the given base DN are + * included in the search. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param ldapConnection + * The current connection to the LDAP server, associated with the + * current user. + * + * @param baseDN + * The base DN to search using the given LDAP query. + * + * @param query + * The LDAP query to execute. + * + * @param searchHop + * The current level of referral depth for this search, used for + * limiting the maximum depth to which referrals can go. + * + * @param attributes + * A collection of the names of attributes that should be retrieved + * from LDAP entries returned by the search, or null if all available + * attributes should be returned. + * + * @return + * A list of all results accessible to the user currently bound under + * the given LDAP connection. + * + * @throws GuacamoleException + * If an error occurs executing the query, or if configuration + * information required to execute the query cannot be read from + * guacamole.properties. + */ + public List search(LDAPConfiguration config, + LdapNetworkConnection ldapConnection, Dn baseDN, ExprNode query, + int searchHop, Collection attributes) + throws GuacamoleException { + + // Refuse to follow referrals if limit has been reached + int maxHops = config.getMaxReferralHops(); + if (searchHop >= maxHops) { + logger.debug("Refusing to follow further referrals as the maximum " + + "number of referral hops ({}) has been reached. LDAP " + + "search results may be incomplete. If further referrals " + + "should be followed, consider setting the \"{}\" " + + "property to a larger value.", maxHops, LDAPGuacamoleProperties.LDAP_MAX_REFERRAL_HOPS.getName()); + return Collections.emptyList(); + } + + logger.debug("Searching \"{}\" for objects matching \"{}\".", baseDN, query); + + // Search within subtree of given base DN + SearchRequest request = ldapService.getSearchRequest(config, baseDN, query); + if (attributes != null) + request.addAttributes(attributes.toArray(new String[0])); + + // Produce list of all entries in the search result, automatically + // following referrals if configured to do so + List entries = new ArrayList<>(); + try (SearchCursor results = ldapConnection.search(request)) { + + while (results.next()) { + + // Add entry directly if no referral is involved + if (results.isEntry()) + entries.add(results.getEntry()); + + // If a referral must be followed to obtain further results, + // retrieval of those results depends on whether such referral + // following is enabled + else if (results.isReferral()) { + + // Follow received referrals only if configured to do so + if (request.isFollowReferrals()) { + for (String url : results.getReferral().getLdapUrls()) { + + // Connect to referred LDAP server to retrieve further results, ensuring the network + // connection is always closed when it will no longer be used + try (LdapNetworkConnection referralConnection = ldapService.bindAs(config, url, ldapConnection)) { + if (referralConnection != null) { + logger.debug("Following referral to \"{}\"...", url); + entries.addAll(search(config, referralConnection, baseDN, query, searchHop + 1, attributes)); + } + else + logger.debug("Could not bind with LDAP " + + "server indicated by referral " + + "URL \"{}\".", url); + } + catch (GuacamoleException e) { + logger.warn("Referral to \"{}\" could not be followed: {}", url, e.getMessage()); + logger.debug("Failed to follow LDAP referral.", e); + } + + } + } + + // Log if referrals may be applicable but they aren't being + // followed + else + logger.debug("Referrals to one or more other LDAP " + + "servers were received but are being " + + "ignored because following of referrals is " + + "not enabled. If referrals must be " + + "followed, consider setting the \"{}\" " + + "property to \"true\".", LDAPGuacamoleProperties.LDAP_FOLLOW_REFERRALS.getName()); + + } + + } + + return entries; + + } + catch (CursorException | IOException | LdapException e) { + throw new GuacamoleServerException("Unable to query list of " + + "objects from LDAP directory: " + e.getMessage(), e); + } + + } + + /** + * Executes the query which would be returned by generateQuery() using the + * given connection, returning a list of all results. Only objects beneath + * the given base DN are included in the search. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param ldapConnection + * The current connection to the LDAP server, associated with the + * current user. + * + * @param baseDN + * The base DN to search using the given LDAP query. + * + * @param filter + * The LDAP filter to apply to reduce the results of the query in + * addition to testing the values of the given attributes. + * + * @param filterAttributes + * A collection of all attributes to test for equivalence to the given + * value, in order of decreasing priority. + * + * @param filterValue + * The value that should be searched search for within the attributes + * of objects within the LDAP directory. If null, the search will test + * only for the presence of at least one of the given attributes on + * each object, regardless of the value of those attributes. + * + * @param attributes + * A collection of the names of attributes that should be retrieved + * from LDAP entries returned by the search, or null if all available + * attributes should be returned. + * + * @return + * A list of all results accessible to the user currently bound under + * the given LDAP connection. + * + * @throws GuacamoleException + * If an error occurs executing the query, or if configuration + * information required to execute the query cannot be read from + * guacamole.properties. + */ + public List search(LDAPConfiguration config, + LdapNetworkConnection ldapConnection, Dn baseDN, ExprNode filter, + Collection filterAttributes, String filterValue, + Collection attributes) throws GuacamoleException { + ExprNode query = generateQuery(filter, filterAttributes, filterValue); + return search(config, ldapConnection, baseDN, query, 0, attributes); + } + + /** + * Converts a given list of LDAP entries to a {@link Map} of Guacamole + * objects stored by their identifiers. + * + * @param + * The type of object to store within the {@link Map}. + * + * @param entries + * A list of LDAP entries to convert to Guacamole objects. + * + * @param mapper + * A mapping function which converts a given LDAP entry to its + * corresponding Guacamole object. If the LDAP entry cannot be + * converted, null should be returned. + * + * @return + * A new {@link Map} containing Guacamole object versions of each of + * the given LDAP entries, where each object is stored within the + * {@link Map} under its corresponding identifier. + */ + public Map + asMap(List entries, Function mapper) { + + // Convert each entry to the corresponding Guacamole API object + Map objects = new HashMap<>(entries.size()); + for (Entry entry : entries) { + + ObjectType object = mapper.apply(entry); + if (object == null) { + logger.debug("Ignoring object \"{}\".", entry.getDn().toString()); + continue; + } + + // Attempt to add object to map, warning if the object appears + // to be a duplicate + String identifier = object.getIdentifier(); + if (objects.putIfAbsent(identifier, object) != null) + logger.warn("Multiple objects ambiguously map to the " + + "same identifier (\"{}\"). Ignoring \"{}\" as " + + "a duplicate.", identifier, entry.getDn().toString()); + + } + + return objects; + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/CaseInsensitivePatternDeserializer.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/CaseInsensitivePatternDeserializer.java new file mode 100644 index 0000000..0525b1d --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/CaseInsensitivePatternDeserializer.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; +import com.fasterxml.jackson.databind.type.LogicalType; +import java.io.IOException; +import java.io.Serializable; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +/** + * Custom JSON (or YAML) deserializer for Jackson that deserializes string + * values as Patterns with the case insensitive flag set by default. Jackson + * will actually handle deserialization of Patterns automatically, but does not + * provide for setting the default flags. + */ +public class CaseInsensitivePatternDeserializer extends StdScalarDeserializer { + + /** + * Unique version identifier of this {@link Serializable} class. + */ + private static final long serialVersionUID = 1L; + + /** + * Creates a new CaseInsensitivePatternDeserializer which deserializes + * string values to Pattern objects with the case insensitive flag set. + */ + public CaseInsensitivePatternDeserializer() { + super(Pattern.class); + } + + @Override + public LogicalType logicalType() { + return LogicalType.Textual; + } + + @Override + public boolean isCachable() { + return true; + } + + @Override + public Pattern deserialize(JsonParser parser, DeserializationContext context) + throws IOException, JsonProcessingException { + + if (!parser.hasToken(JsonToken.VALUE_STRING)) + throw new JsonParseException(parser, "Regular expressions may only be represented as strings."); + + try { + return Pattern.compile(parser.getText(), Pattern.CASE_INSENSITIVE); + } + catch (PatternSyntaxException e) { + throw new JsonParseException(parser, "Invalid regular expression.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/ConfigurationService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/ConfigurationService.java new file mode 100644 index 0000000..15bd002 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/ConfigurationService.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicLong; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for retrieving configuration information regarding LDAP servers. + */ +@Singleton +public class ConfigurationService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ConfigurationService.class); + + /** + * ObjectMapper for deserializing YAML. + */ + private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()) + .registerModule(new SimpleModule().addDeserializer(Pattern.class, new CaseInsensitivePatternDeserializer())); + + /** + * The name of the file within GUACAMOLE_HOME that defines each available + * LDAP server (if not using guacamole.properties). + */ + private static final String LDAP_SERVERS_YML = "ldap-servers.yml"; + + /** + * The timestamp that the {@link #LDAP_SERVERS_YML} was last modified when + * it was read, as would be returned by {@link File#lastModified()}. + */ + private final AtomicLong lastModified = new AtomicLong(0); + + /** + * The cached copy of the configuration read from {@link #LDAP_SERVERS_YML}. + * If the current set of LDAP servers has not yet been read from the YAML + * configuration file, or if guacamole.properties is being used instead, + * this will be null. + */ + private Collection cachedConfigurations = null; + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns the configuration information for all configured LDAP servers. + * If multiple servers are returned, each should be tried in order until a + * successful LDAP connection is established. + * + * @return + * The configurations of all LDAP servers. + * + * @throws GuacamoleException + * If the configuration information of the LDAP servers cannot be + * retrieved due to an error. + */ + public Collection getLDAPConfigurations() throws GuacamoleException { + + // Read/refresh configuration from YAML, if available + File ldapServers = new File(environment.getGuacamoleHome(), LDAP_SERVERS_YML); + if (ldapServers.exists()) { + + long oldLastModified = lastModified.get(); + long currentLastModified = ldapServers.lastModified(); + + // Update cached copy of YAML if things have changed, ensuring only + // one concurrent request updates the cache at any given time + if (currentLastModified > oldLastModified && lastModified.compareAndSet(oldLastModified, currentLastModified)) { + try { + + logger.debug("Reading updated LDAP configuration from \"{}\"...", ldapServers); + Collection configs = mapper.readValue(ldapServers, new TypeReference>() {}); + + if (configs != null) { + logger.debug("Reading LDAP configuration defaults from guacamole.properties..."); + LDAPConfiguration defaultConfig = new EnvironmentLDAPConfiguration(environment); + configs.forEach((config) -> config.setDefaults(defaultConfig)); + } + else + logger.debug("Using only guacamole.properties for " + + "LDAP server definitions as \"{}\" is " + + "empty.", ldapServers); + + cachedConfigurations = configs; + + } + catch (IOException e) { + logger.error("\"{}\" could not be read/parsed: {}", ldapServers, e.getMessage()); + } + } + else + logger.debug("Using cached LDAP configuration from \"{}\".", ldapServers); + + } + + // Clear cached YAML if it no longer exists + else if (cachedConfigurations != null) { + long oldLastModified = lastModified.get(); + if (lastModified.compareAndSet(oldLastModified, 0)) { + logger.debug("Clearing cached LDAP configuration from \"{}\" (file no longer exists).", ldapServers); + cachedConfigurations = null; + } + } + + // Use guacamole.properties if not using YAML + if (cachedConfigurations == null) { + logger.debug("Reading LDAP configuration from guacamole.properties..."); + return Collections.singletonList(new EnvironmentLDAPConfiguration(environment)); + } + + return cachedConfigurations; + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/DefaultLDAPConfiguration.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/DefaultLDAPConfiguration.java new file mode 100644 index 0000000..2179643 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/DefaultLDAPConfiguration.java @@ -0,0 +1,154 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import java.util.Collections; +import java.util.List; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.filter.PresenceNode; +import org.apache.directory.api.ldap.model.message.AliasDerefMode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * LDAPConfiguration implementation that returns the default values for all + * configuration parameters. For any configuration parameters that are + * required (such as {@link #getUserBaseDN()}), an exception is thrown. + */ +public class DefaultLDAPConfiguration implements LDAPConfiguration { + + @Override + public String appliesTo(String username) { + return null; + } + + @Override + public String getServerHostname() { + return "localhost"; + } + + @Override + public int getServerPort() { + return getEncryptionMethod().DEFAULT_PORT; + } + + @Override + public List getUsernameAttributes() { + return Collections.singletonList("uid"); + } + + @Override + public Dn getUserBaseDN() throws GuacamoleException { + throw new GuacamoleServerException("All LDAP servers must have a defined user base DN."); + } + + @Override + public Dn getConfigurationBaseDN() { + return null; + } + + @Override + public List getGroupNameAttributes() { + return Collections.singletonList("cn"); + } + + @Override + public Dn getGroupBaseDN() { + return null; + } + + @Override + public String getSearchBindDN() { + return null; + } + + @Override + public String getSearchBindPassword() { + return null; + } + + @Override + public EncryptionMethod getEncryptionMethod() { + return EncryptionMethod.NONE; + } + + @Override + public LDAPSSLProtocol getSslProtocol() { + return LDAPSSLProtocol.TLSv1_3; + } + + @Override + public int getMaxResults() { + return 1000; + } + + @Override + public AliasDerefMode getDereferenceAliases() { + return AliasDerefMode.NEVER_DEREF_ALIASES; + } + + @Override + public boolean getFollowReferrals() { + return false; + } + + @Override + public int getMaxReferralHops() { + return 5; + } + + @Override + public ExprNode getUserSearchFilter() { + return new PresenceNode("objectClass"); + } + + @Override + public ExprNode getGroupSearchFilter() { + return new PresenceNode("objectClass"); + } + + @Override + public int getOperationTimeout() { + return 30; + } + + @Override + public int getNetworkTimeout() { + return 30000; + } + + @Override + public List getAttributes() { + return Collections.emptyList(); + } + + @Override + public String getMemberAttribute() { + return "member"; + } + + @Override + public MemberAttributeType getMemberAttributeType() + throws GuacamoleException { + return MemberAttributeType.DN; + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/EncryptionMethod.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/EncryptionMethod.java new file mode 100644 index 0000000..9d1e937 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/EncryptionMethod.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * All possible encryption methods which may be used when connecting to an LDAP + * server. + */ +public enum EncryptionMethod { + + /** + * No encryption will be used. All data will be sent to the LDAP server in + * plaintext. Unencrypted LDAP connections use port 389 by default. + */ + @PropertyValue("none") + NONE(389), + + /** + * The connection to the LDAP server will be encrypted with SSL. LDAP over + * SSL (LDAPS) will use port 636 by default. + */ + @PropertyValue("ssl") + SSL(636), + + /** + * The connection to the LDAP server will be encrypted using STARTTLS. TLS + * connections are negotiated over the standard LDAP port of 389 - the same + * port used for unencrypted traffic. + */ + @PropertyValue("starttls") + STARTTLS(389); + + /** + * The default port of this specific encryption method. As with most + * protocols, the default port for LDAP varies by whether SSL is used. + */ + public final int DEFAULT_PORT; + + /** + * Initializes this encryption method such that it is associated with the + * given default port. + * + * @param defaultPort + * The default port to associate with this encryption method. + */ + private EncryptionMethod(int defaultPort) { + this.DEFAULT_PORT = defaultPort; + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/EnvironmentLDAPConfiguration.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/EnvironmentLDAPConfiguration.java new file mode 100644 index 0000000..5ffeb20 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/EnvironmentLDAPConfiguration.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import java.util.Collection; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.message.AliasDerefMode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; + +/** + * LDAPConfiguration implementation that reads its configuration details from + * guacamole.properties. + */ +public class EnvironmentLDAPConfiguration implements LDAPConfiguration { + + /** + * The Guacamole server environment. + */ + private final Environment environment; + + /** + * The default configuration options for all parameters. + */ + private static final LDAPConfiguration DEFAULT = new DefaultLDAPConfiguration(); + + /** + * Creates a new EnvironmentLDAPConfiguration that reads its configuration + * details from guacamole.properties, as exposed by the given Environment. + * + * @param environment + * The Guacamole server environment. + */ + public EnvironmentLDAPConfiguration(Environment environment) { + this.environment = environment; + } + + @Override + public String appliesTo(String username) throws GuacamoleException { + return username; + } + + @Override + public String getServerHostname() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_HOSTNAME, + DEFAULT.getServerHostname() + ); + } + + @Override + public int getServerPort() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_PORT, + getEncryptionMethod().DEFAULT_PORT + ); + } + + @Override + public Collection getUsernameAttributes() throws GuacamoleException { + return environment.getPropertyCollection( + LDAPGuacamoleProperties.LDAP_USERNAME_ATTRIBUTE, + DEFAULT.getUsernameAttributes() + ); + } + + @Override + public Dn getUserBaseDN() throws GuacamoleException { + return environment.getRequiredProperty( + LDAPGuacamoleProperties.LDAP_USER_BASE_DN + ); + } + + @Override + public Dn getConfigurationBaseDN() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_CONFIG_BASE_DN, + DEFAULT.getConfigurationBaseDN() + ); + } + + @Override + public Collection getGroupNameAttributes() throws GuacamoleException { + return environment.getPropertyCollection( + LDAPGuacamoleProperties.LDAP_GROUP_NAME_ATTRIBUTE, + DEFAULT.getGroupNameAttributes() + ); + } + + @Override + public Dn getGroupBaseDN() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_GROUP_BASE_DN, + DEFAULT.getGroupBaseDN() + ); + } + + @Override + public String getSearchBindDN() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_SEARCH_BIND_DN, + DEFAULT.getSearchBindDN() + ); + } + + @Override + public String getSearchBindPassword() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_SEARCH_BIND_PASSWORD, + DEFAULT.getSearchBindPassword() + ); + } + + @Override + public EncryptionMethod getEncryptionMethod() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_ENCRYPTION_METHOD, + DEFAULT.getEncryptionMethod() + ); + } + + @Override + public LDAPSSLProtocol getSslProtocol() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_SSL_PROTOCOL, + DEFAULT.getSslProtocol() + ); + } + + @Override + public int getMaxResults() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_MAX_SEARCH_RESULTS, + DEFAULT.getMaxResults() + ); + } + + @Override + public AliasDerefMode getDereferenceAliases() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_DEREFERENCE_ALIASES, + DEFAULT.getDereferenceAliases() + ); + } + + @Override + public boolean getFollowReferrals() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_FOLLOW_REFERRALS, + DEFAULT.getFollowReferrals() + ); + } + + @Override + public int getMaxReferralHops() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_MAX_REFERRAL_HOPS, + DEFAULT.getMaxReferralHops() + ); + } + + @Override + public ExprNode getUserSearchFilter() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_USER_SEARCH_FILTER, + DEFAULT.getUserSearchFilter() + ); + } + + @Override + public ExprNode getGroupSearchFilter() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_GROUP_SEARCH_FILTER, + DEFAULT.getGroupSearchFilter() + ); + } + + @Override + public int getOperationTimeout() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_OPERATION_TIMEOUT, + DEFAULT.getOperationTimeout() + ); + } + + @Override + public int getNetworkTimeout() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_NETWORK_TIMEOUT, + DEFAULT.getNetworkTimeout() + ); + } + + @Override + public Collection getAttributes() throws GuacamoleException { + return environment.getPropertyCollection( + LDAPGuacamoleProperties.LDAP_USER_ATTRIBUTES, + DEFAULT.getAttributes() + ); + } + + @Override + public String getMemberAttribute() throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_MEMBER_ATTRIBUTE, + DEFAULT.getMemberAttribute() + ); + } + + @Override + public MemberAttributeType getMemberAttributeType() + throws GuacamoleException { + return environment.getProperty( + LDAPGuacamoleProperties.LDAP_MEMBER_ATTRIBUTE_TYPE, + DEFAULT.getMemberAttributeType() + ); + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/JacksonLDAPConfiguration.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/JacksonLDAPConfiguration.java new file mode 100644 index 0000000..bddccd8 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/JacksonLDAPConfiguration.java @@ -0,0 +1,443 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import com.fasterxml.jackson.annotation.JsonFormat; +import static com.fasterxml.jackson.annotation.JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collection; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.message.AliasDerefMode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.properties.GuacamoleProperty; + +/** + * LDAPConfiguration implementation that is annotated for deserialization by + * Jackson. + */ +public class JacksonLDAPConfiguration implements LDAPConfiguration { + + /** + * The regular expressions that match all users that should be routed to + * the LDAP server represented by this configuration. + */ + @JsonProperty("match-usernames") + @JsonFormat(with = ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List matchUsernames; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_HOSTNAME}. If + * not set within the YAML, this will be null. + */ + @JsonProperty("hostname") + private String hostname; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_PORT}. If not + * set within the YAML, this will be null. + */ + @JsonProperty("port") + private Integer port; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_USERNAME_ATTRIBUTES}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("username-attribute") + @JsonFormat(with = ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List usernameAttributes; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_USER_BASE_DN}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("user-base-dn") + private String userBaseDn; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_CONFIG_BASE_DN}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("config-base-dn") + private String configBaseDn; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_GROUP_BASE_DN}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("group-base-dn") + private String groupBaseDn; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_GROUP_NAME_ATTRIBUTES}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("group-name-attribute") + @JsonFormat(with = ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List groupNameAttributes; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_SEARCH_BIND_DN}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("search-bind-dn") + private String searchBindDn; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_SEARCH_BIND_PASSWORD}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("search-bind-password") + private String searchBindPassword; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_ENCRYPTION_METHOD}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("encryption-method") + private String encryptionMethod; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_SSL_PROTOCOL}. If + * not set within the YAML, this will be null, and will default to the value + * specified by the LDAP API library. + */ + @JsonProperty("ssl-protocol") + private String sslProtocol; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_MAX_SEARCH_RESULTS}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("max-search-results") + private Integer maxSearchResults; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_DEREFERENCE_ALIASES}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("dereference-aliases") + private String dereferenceAliases; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_FOLLOW_REFERRALS}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("follow-referrals") + private Boolean followReferrals; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_MAX_REFERRAL_HOPS}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("max-referral-hops") + private Integer maxReferralHops; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_USER_SEARCH_FILTER}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("user-search-filter") + private String userSearchFilter; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_GROUP_SEARCH_FILTER}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("group-search-filter") + private String groupSearchFilter; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_OPERATION_TIMEOUT}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("operation-timeout") + private Integer operationTimeout; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_NETWORK_TIMEOUT}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("network-timeout") + private Integer networkTimeout; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_USER_ATTRIBUTES}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("user-attributes") + @JsonFormat(with = ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List userAttributes; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_MEMBER_ATTRIBUTE}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("member-attribute") + private String memberAttribute; + + /** + * The raw YAML value of {@link LDAPGuacamoleProperties#LDAP_MEMBER_ATTRIBUTE_TYPE}. + * If not set within the YAML, this will be null. + */ + @JsonProperty("member-attribute-type") + private String memberAttributeType; + + /** + * The default configuration options for all parameters. + */ + private LDAPConfiguration defaultConfig = new DefaultLDAPConfiguration(); + + /** + * Supplier of default values for LDAP configurations. Unlike + * {@link java.util.function.Supplier}, the {@link #get()} function of + * DefaultSupplier may throw a {@link GuacamoleException}. + * + * @param + * The type of value returned by this DefaultSupplier. + */ + @FunctionalInterface + private interface DefaultSupplier { + + /** + * Returns the value supplied by this DefaultSupplier. The value + * returned is not cached and may be non-deterministic. + * + * @return + * The value supplied by this DefaultSupplier. + * + * @throws GuacamoleException + * If an error occurs while producing/retrieving the value. + */ + T get() throws GuacamoleException; + + } + + /** + * Returns the given value, if non-null. If null, the given default value + * is returned. + * + * @param + * The type of value accepted and returned. + * + * @param value + * The possibly null value to return if non-null. + * + * @param defaultValue + * A function which supplies the value to return if the provided value + * is null. + * + * @return + * The provided value, if non-null, otherwise the provided default + * value. + * + * @throws GuacamoleException + * If an error occurs while producing/retrieving the default value. + */ + private T withDefault(T value, DefaultSupplier defaultValue) + throws GuacamoleException { + return value != null ? value : defaultValue.get(); + } + + /** + * Parses and returns the given value, if non-null. If null, the given + * default value is returned. + * + * @param + * The type of value accepted and returned. + * + * @param property + * The GuacamoleProperty implementation to use to parse the provided + * String value. + * + * @param value + * The possibly null value to return if non-null. + * + * @param defaultValue + * A function which supplies the value to return if the provided value + * is null. + * + * @return + * The provided value, if non-null, otherwise the provided default + * value. + * + * @throws GuacamoleException + * If an error occurs while producing/retrieving the default value. + */ + private T withDefault(GuacamoleProperty property, String value, + DefaultSupplier defaultValue) + throws GuacamoleException { + return withDefault(property.parseValue(value), defaultValue); + } + + /** + * Sets the LDAPConfiguration that should be used for the default values of + * any configuration options omitted from the YAML. If not set, an instance + * of {@link DefaultLDAPConfiguration} will be used. + * + * @param defaultConfig + * The LDAPConfiguration to use for the default values of any omitted + * configuration options. + */ + public void setDefaults(LDAPConfiguration defaultConfig) { + this.defaultConfig = defaultConfig; + } + + @Override + public String appliesTo(String username) throws GuacamoleException { + + // Match any user by default + if (matchUsernames == null || matchUsernames.isEmpty()) + return username; + + for (Pattern pattern : matchUsernames) { + Matcher matcher = pattern.matcher(username); + if (matcher.matches()) + return matcher.groupCount() >= 1 ? matcher.group(1) : username; + } + + return null; + + } + + @Override + public String getServerHostname() throws GuacamoleException { + return withDefault(hostname, defaultConfig::getServerHostname); + } + + @Override + public int getServerPort() throws GuacamoleException { + return withDefault(port, () -> getEncryptionMethod().DEFAULT_PORT); + } + + @Override + public Collection getUsernameAttributes() throws GuacamoleException { + return withDefault(usernameAttributes, defaultConfig::getUsernameAttributes); + } + + @Override + public Dn getUserBaseDN() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_USER_BASE_DN, + userBaseDn, defaultConfig::getUserBaseDN); + } + + @Override + public Dn getConfigurationBaseDN() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_CONFIG_BASE_DN, + configBaseDn, defaultConfig::getConfigurationBaseDN); + } + + @Override + public Collection getGroupNameAttributes() throws GuacamoleException { + return withDefault(groupNameAttributes, defaultConfig::getGroupNameAttributes); + } + + @Override + public Dn getGroupBaseDN() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_GROUP_BASE_DN, + groupBaseDn, defaultConfig::getGroupBaseDN); + } + + @Override + public String getSearchBindDN() throws GuacamoleException { + return withDefault(searchBindDn, defaultConfig::getSearchBindDN); + } + + @Override + public String getSearchBindPassword() throws GuacamoleException { + return withDefault(searchBindPassword, defaultConfig::getSearchBindPassword); + } + + @Override + public EncryptionMethod getEncryptionMethod() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_ENCRYPTION_METHOD, + encryptionMethod, defaultConfig::getEncryptionMethod); + } + + @Override + public LDAPSSLProtocol getSslProtocol() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_SSL_PROTOCOL, + sslProtocol, defaultConfig::getSslProtocol); + } + + @Override + public int getMaxResults() throws GuacamoleException { + return withDefault(maxSearchResults, defaultConfig::getMaxResults); + } + + @Override + public AliasDerefMode getDereferenceAliases() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_DEREFERENCE_ALIASES, + dereferenceAliases, defaultConfig::getDereferenceAliases); + } + + @Override + public boolean getFollowReferrals() throws GuacamoleException { + return withDefault(followReferrals, defaultConfig::getFollowReferrals); + } + + @Override + public int getMaxReferralHops() throws GuacamoleException { + return withDefault(maxReferralHops, defaultConfig::getMaxReferralHops); + } + + @Override + public ExprNode getUserSearchFilter() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_USER_SEARCH_FILTER, + userSearchFilter, defaultConfig::getUserSearchFilter); + } + + @Override + public ExprNode getGroupSearchFilter() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_GROUP_SEARCH_FILTER, + groupSearchFilter, defaultConfig::getGroupSearchFilter); + } + + @Override + public int getOperationTimeout() throws GuacamoleException { + return withDefault(operationTimeout, defaultConfig::getOperationTimeout); + } + + @Override + public int getNetworkTimeout() throws GuacamoleException { + return withDefault(networkTimeout, defaultConfig::getNetworkTimeout); + } + + @Override + public Collection getAttributes() throws GuacamoleException { + return withDefault(userAttributes, defaultConfig::getAttributes); + } + + @Override + public String getMemberAttribute() throws GuacamoleException { + return withDefault(memberAttribute, defaultConfig::getMemberAttribute); + } + + @Override + public MemberAttributeType getMemberAttributeType() throws GuacamoleException { + return withDefault(LDAPGuacamoleProperties.LDAP_MEMBER_ATTRIBUTE_TYPE, + memberAttributeType, defaultConfig::getMemberAttributeType); + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPConfiguration.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPConfiguration.java new file mode 100644 index 0000000..abbf910 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPConfiguration.java @@ -0,0 +1,337 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import java.util.Collection; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.message.AliasDerefMode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.GuacamoleException; + +/** + * Configuration information defining how a particular LDAP server should be + * queried. + */ +public interface LDAPConfiguration { + + /** + * Tests whether this LDAPConfiguration applies to the user having the + * given username. If the configuration applies, the username that should + * be used to derive the user's DN is returned. + * + * @param username + * The username to test. + * + * @return + * The username that should be used to derive this user's DN, or null + * if the configuration does not apply. + * + * @throws GuacamoleException + * If an error prevents testing against this configuration. + */ + String appliesTo(String username) throws GuacamoleException; + + /** + * Returns the hostname or IP address of the LDAP server. + * + * @return + * The hostname or IP address of the LDAP server. + * + * @throws GuacamoleException + * If the hostname or IP address of the LDAP server cannot be + * retrieved. + */ + String getServerHostname() throws GuacamoleException; + + /** + * Returns the port of the LDAP server. The default value depends on which + * encryption method is being used. For unencrypted LDAP and STARTTLS, this + * will be 389. For LDAPS (LDAP over SSL) this will be 636. + * + * @return + * The port of the LDAP server. + * + * @throws GuacamoleException + * If the port of the LDAP server cannot be retrieved. + */ + int getServerPort() throws GuacamoleException; + + /** + * Returns all username attributes which should be used to query and bind + * users using the LDAP directory. + * + * @return + * The username attributes which should be used to query and bind users + * using the LDAP directory. + * + * @throws GuacamoleException + * If the username attributes cannot be retrieved. + */ + Collection getUsernameAttributes() throws GuacamoleException; + + /** + * Returns the base DN under which all Guacamole users will be stored + * within the LDAP directory. + * + * @return + * The base DN under which all Guacamole users will be stored within + * the LDAP directory. + * + * @throws GuacamoleException + * If the user base DN cannot be retrieved. + */ + Dn getUserBaseDN() throws GuacamoleException; + + /** + * Returns the base DN under which all Guacamole configurations + * (connections) will be stored within the LDAP directory. If Guacamole + * configurations will not be stored within LDAP, null is returned. + * + * @return + * The base DN under which all Guacamole configurations will be stored + * within the LDAP directory, or null if no Guacamole configurations + * will be stored within the LDAP directory. + * + * @throws GuacamoleException + * If the configuration base DN cannot be retrieved. + */ + Dn getConfigurationBaseDN() throws GuacamoleException; + + /** + * Returns all attributes which should be used to determine the unique + * identifier of each user group. + * + * @return + * The attributes which should be used to determine the unique + * identifier of each group. + * + * @throws GuacamoleException + * If the group name attributes cannot be retrieved. + */ + Collection getGroupNameAttributes() throws GuacamoleException; + + /** + * Returns the base DN under which all Guacamole role based access control + * (RBAC) groups will be stored within the LDAP directory. If RBAC will not + * be used, null is returned. + * + * @return + * The base DN under which all Guacamole RBAC groups will be stored + * within the LDAP directory, or null if RBAC will not be used. + * + * @throws GuacamoleException + * If the group base DN cannot be retrieved. + */ + Dn getGroupBaseDN() throws GuacamoleException; + + /** + * Returns the login that should be used when searching for the DNs of users + * attempting to authenticate. If no such search should be performed, null + * is returned. + * + * @return + * The DN that should be used when searching for the DNs of users + * attempting to authenticate, or null if no such search should be + * performed. + * + * @throws GuacamoleException + * If the search bind DN cannot be retrieved. + */ + String getSearchBindDN() throws GuacamoleException; + + /** + * Returns the password that should be used when binding to the LDAP server + * using the DN returned by getSearchBindDN(). If no password should be + * used, null is returned. + * + * @return + * The password that should be used when binding to the LDAP server + * using the DN returned by getSearchBindDN(), or null if no password + * should be used. + * + * @throws GuacamoleException + * If the search bind password cannot be retrieved. + */ + String getSearchBindPassword() throws GuacamoleException; + + /** + * Returns the encryption method that should be used when connecting to the + * LDAP server. + * + * @return + * The encryption method that should be used when connecting to the + * LDAP server. + * + * @throws GuacamoleException + * If the encryption method cannot be retrieved. + */ + EncryptionMethod getEncryptionMethod() throws GuacamoleException; + + /** + * Returns the SSL protocol that should be used when making a secure + * connection to the LDAP server. By default the latest available TLS + * version will be used. + * + * @return + * The SSL protocol that should be used when making a secure connection + * to the LDAP server. + * + * @throws GuacamoleException + * If the SSL protocol cannot be retrieved. + */ + LDAPSSLProtocol getSslProtocol() throws GuacamoleException; + + /** + * Returns maximum number of results a LDAP query can return. + * + * @return + * The maximum number of results a LDAP query can return. + * + * @throws GuacamoleException + * If the maximum number of results cannot be retrieved. + */ + int getMaxResults() throws GuacamoleException; + + /** + * Returns whether or not LDAP aliases will be dereferenced. + * + * @return + * The LDAP alias dereferencing mode. + * + * @throws GuacamoleException + * If the LDAP alias dereferencing mode cannot be retrieved. + */ + AliasDerefMode getDereferenceAliases() throws GuacamoleException; + + /** + * Returns whether referrals should be automatically followed. + * + * @return + * Whether referrals should be followed. + * + * @throws GuacamoleException + * If the configuration information determining whether LDAP referrals + * should be followed cannot be retrieved. + */ + boolean getFollowReferrals() throws GuacamoleException; + + /** + * Returns the maximum number of referral hops to follow. + * + * @return + * The maximum number of referral hops to follow. + * + * @throws GuacamoleException + * If the maximum number of referral hops cannot be retrieved. + */ + int getMaxReferralHops() throws GuacamoleException; + + /** + * Returns the search filter that should be used when querying the + * LDAP server for Guacamole users. + * + * @return + * The search filter that should be used when querying the + * LDAP server for users that are valid in Guacamole. + * + * @throws GuacamoleException + * If the user search filter cannot be retrieved. + */ + ExprNode getUserSearchFilter() throws GuacamoleException; + + /** + * Returns the search filter that should be used when querying the + * LDAP server for Guacamole groups. + * + * @return + * The search filter that should be used when querying the + * LDAP server for groups that are valid in Guacamole. + * + * @throws GuacamoleException + * If the group search filter cannot be retrieved. + */ + ExprNode getGroupSearchFilter() throws GuacamoleException; + + /** + * Returns the maximum number of milliseconds to wait for a response when + * communicating with the LDAP server. + * + * @return + * The maximum number of milliseconds to wait for responses from the + * LDAP server. + * + * @throws GuacamoleException + * If the LDAP network timeout cannot be retrieved. + */ + int getNetworkTimeout() throws GuacamoleException; + + /** + * Returns the maximum number of seconds to wait for LDAP operations. + * + * @return + * The maximum number of seconds to wait for LDAP operations. + * + * @throws GuacamoleException + * If the LDAP operation timeout cannot be retrieved. + */ + int getOperationTimeout() throws GuacamoleException; + + /** + * Returns names of any LDAP user attributes that should be made available + * as parameter tokens. + * + * @return + * A list of all LDAP user attributes that should be made available as + * parameter tokens. + * + * @throws GuacamoleException + * If the names of the LDAP user attributes to be exposed as parameter + * tokens cannot be retrieved. + */ + Collection getAttributes() throws GuacamoleException; + + /** + * Returns the name of the LDAP attribute used to enumerate members in a + * group. + * + * @return + * The name of the LDAP attribute to use to enumerate + * members in a group. + * + * @throws GuacamoleException + * If the group member attribute cannot be retrieved. + */ + String getMemberAttribute() throws GuacamoleException; + + /** + * Returns whether the LDAP attribute used to enumerate members in a group + * specifies a UID or DN. + * + * @return + * The type of data contained in the LDAP attribute used to enumerate + * members in a group. + * + * @throws GuacamoleException + * If the type of attribute used to enumerate group members cannot be + * retrieved. + */ + MemberAttributeType getMemberAttributeType() throws GuacamoleException; + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPGuacamoleProperties.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPGuacamoleProperties.java new file mode 100644 index 0000000..7349356 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPGuacamoleProperties.java @@ -0,0 +1,310 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import org.apache.directory.api.ldap.model.message.AliasDerefMode; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; + + +/** + * Provides properties required for use of the LDAP authentication provider. + * These properties will be read from guacamole.properties when the LDAP + * authentication provider is used. + */ +public class LDAPGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private LDAPGuacamoleProperties() {} + + /** + * The base DN to search for Guacamole configurations. + */ + public static final LdapDnGuacamoleProperty LDAP_CONFIG_BASE_DN = + new LdapDnGuacamoleProperty() { + + @Override + public String getName() { return "ldap-config-base-dn"; } + + }; + + /** + * The base DN of users. All users must be contained somewhere within the + * subtree of this DN. If the LDAP authentication will not be given its own + * credentials for querying other LDAP users, all users must be direct + * children of this base DN, varying only by LDAP_USERNAME_ATTRIBUTE. + */ + public static final LdapDnGuacamoleProperty LDAP_USER_BASE_DN = + new LdapDnGuacamoleProperty() { + + @Override + public String getName() { return "ldap-user-base-dn"; } + + }; + + /** + * The base DN of role based access control (RBAC) groups. All groups which + * will be used for RBAC must be contained somewhere within the subtree of + * this DN. + */ + public static final LdapDnGuacamoleProperty LDAP_GROUP_BASE_DN = + new LdapDnGuacamoleProperty() { + + @Override + public String getName() { return "ldap-group-base-dn"; } + + }; + + /** + * The attribute or attributes which identify users. One of these + * attributes must be present within each Guacamole user's record in the + * LDAP directory. If the LDAP authentication will not be given its own + * credentials for querying other LDAP users, this list may contain only + * one attribute, and the concatenation of that attribute and the value of + * LDAP_USER_BASE_DN must equal the user's full DN. + */ + public static final StringGuacamoleProperty LDAP_USERNAME_ATTRIBUTE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-username-attribute"; } + + }; + + /** + * The attribute or attributes which identify user groups. One of these + * attributes must be present within each Guacamole user group's record in + * the LDAP directory for that group to be visible. + */ + public static final StringGuacamoleProperty LDAP_GROUP_NAME_ATTRIBUTE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-group-name-attribute"; } + + }; + + /** + * The port on the LDAP server to connect to when authenticating users. + */ + public static final IntegerGuacamoleProperty LDAP_PORT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ldap-port"; } + + }; + + /** + * The hostname of the LDAP server to connect to when authenticating users. + */ + public static final StringGuacamoleProperty LDAP_HOSTNAME = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-hostname"; } + + }; + + /** + * The user that the LDAP extension should bind as when searching for the + * accounts of users attempting to log in. The format of this parameter + * will vary based on the LDAP server implementation - often it is expected + * to be in full LDAP DN format; however various LDAP server implementations + * allow this to be in other formats (e.g. Active Directory allows + * User Principal Name, or UPN, format). For this reason the configuration + * allows this to be any string. + */ + public static final StringGuacamoleProperty LDAP_SEARCH_BIND_DN = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-search-bind-dn"; } + + }; + + /** + * The password to provide to the LDAP server when binding as + * LDAP_SEARCH_BIND_DN. If LDAP_SEARCH_BIND_DN is not specified, this + * property has no effect. If this property is not specified, no password + * will be provided when attempting to bind as LDAP_SEARCH_BIND_DN. + */ + public static final StringGuacamoleProperty LDAP_SEARCH_BIND_PASSWORD = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-search-bind-password"; } + + }; + + /** + * The encryption method to use when connecting to the LDAP server, if any. + * The chosen method will also dictate the default port if not already + * explicitly specified via LDAP_PORT. + */ + public static final EnumGuacamoleProperty LDAP_ENCRYPTION_METHOD = + new EnumGuacamoleProperty(EncryptionMethod.class) { + + @Override + public String getName() { return "ldap-encryption-method"; } + + }; + + public static final EnumGuacamoleProperty LDAP_SSL_PROTOCOL = + new EnumGuacamoleProperty(LDAPSSLProtocol.class) { + + @Override + public String getName() { return "ldap-ssl-protocol"; } + + }; + + /** + * The maximum number of results a LDAP query can return. + */ + public static final IntegerGuacamoleProperty LDAP_MAX_SEARCH_RESULTS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ldap-max-search-results"; } + + }; + + /** + * Property that controls whether or not the LDAP connection follows + * (dereferences) aliases as it searches the tree. + */ + public static final EnumGuacamoleProperty LDAP_DEREFERENCE_ALIASES = + new EnumGuacamoleProperty( + "never", AliasDerefMode.NEVER_DEREF_ALIASES, + "searching", AliasDerefMode.DEREF_IN_SEARCHING, + "finding", AliasDerefMode.DEREF_FINDING_BASE_OBJ, + "always", AliasDerefMode.DEREF_ALWAYS + ) { + + @Override + public String getName() { return "ldap-dereference-aliases"; } + + }; + + /** + * A search filter to apply to user LDAP queries. + */ + public static final LdapFilterGuacamoleProperty LDAP_USER_SEARCH_FILTER = + new LdapFilterGuacamoleProperty() { + + @Override + public String getName() { return "ldap-user-search-filter"; } + + }; + + /** + * A search filter to apply to group LDAP queries. + */ + public static final LdapFilterGuacamoleProperty LDAP_GROUP_SEARCH_FILTER = + new LdapFilterGuacamoleProperty() { + + @Override + public String getName() { return "ldap-group-search-filter"; } + + }; + + /** + * Whether or not we should follow referrals. + */ + public static final BooleanGuacamoleProperty LDAP_FOLLOW_REFERRALS = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "ldap-follow-referrals"; } + + }; + + /** + * Maximum number of referral hops to follow. + */ + public static final IntegerGuacamoleProperty LDAP_MAX_REFERRAL_HOPS = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ldap-max-referral-hops"; } + + }; + + /** + * Number of seconds to wait for LDAP operations to complete. + */ + public static final IntegerGuacamoleProperty LDAP_OPERATION_TIMEOUT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ldap-operation-timeout"; } + + }; + + /** + * Number of milliseconds to wait for responses from the LDAP server. + */ + public static final IntegerGuacamoleProperty LDAP_NETWORK_TIMEOUT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ldap-network-timeout"; } + + }; + + /** + * Custom attribute or attributes to query from Guacamole user's record in + * the LDAP directory. + */ + public static final StringGuacamoleProperty LDAP_USER_ATTRIBUTES = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-user-attributes"; } + + }; + + /** + * LDAP attribute used to enumerate members of a group in the LDAP directory. + */ + public static final StringGuacamoleProperty LDAP_MEMBER_ATTRIBUTE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ldap-member-attribute"; } + + }; + + /** + * Specify the type of data contained in 'ldap-member-attribute'. + */ + public static final EnumGuacamoleProperty LDAP_MEMBER_ATTRIBUTE_TYPE = + new EnumGuacamoleProperty(MemberAttributeType.class) { + + @Override + public String getName() { return "ldap-member-attribute-type"; } + + }; + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPSSLProtocol.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPSSLProtocol.java new file mode 100644 index 0000000..c5b1ca8 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LDAPSSLProtocol.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * All possible SSL protocols which may be used for secure LDAP connections. + */ +public enum LDAPSSLProtocol { + + /** + * Use SSLv3 for secure LDAP connection. + */ + @PropertyValue("SSLv3") + SSLv3("SSLv3"), + + /** + * Use original TLS for secure LDAP connection. + */ + @PropertyValue("TLS") + TLS("TLS"), + + /** + * Use TLSv1 for secure LDAP connection. + */ + @PropertyValue("TLSv1") + TLSv1("TLSv1"), + + /** + * Use TLSv1.1 for secure LDAP connection. + */ + @PropertyValue("TLSv1.1") + TLSv1_1("TLSv1.1"), + + /** + * Use TLSv1.2 for secure LDAP connection. + */ + @PropertyValue("TLSv1.2") + TLSv1_2("TLSv1.2"), + + /** + * Use TLSv1.3 for secure LDAP connection. + */ + @PropertyValue("TLSv1.3") + TLSv1_3("TLSv1.3"); + + /** + * The string value of the option to use which is ultimately what the LDAP + * API consumes to set the SSL protocol. + */ + public final String STRING_VALUE; + + /** + * Initializes this SSL protocol such that it is associated with the + * given string value. + * + * @param value + * The string value that will be associated with the enum value. + */ + private LDAPSSLProtocol(String value) { + this.STRING_VALUE = value; + } + + @Override + public String toString() { + return STRING_VALUE; + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LdapDnGuacamoleProperty.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LdapDnGuacamoleProperty.java new file mode 100644 index 0000000..c782c97 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LdapDnGuacamoleProperty.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.properties.GuacamoleProperty; + +/** + * A GuacamoleProperty that converts a string to a Dn that can be used + * in LDAP connections. An exception is thrown if the provided DN is invalid + * and cannot be parsed. + */ +public abstract class LdapDnGuacamoleProperty implements GuacamoleProperty { + + @Override + public Dn parseValue(String value) throws GuacamoleException { + + if (value == null) + return null; + + try { + return new Dn(value); + } + catch (LdapInvalidDnException e) { + throw new GuacamoleServerException("The DN \"" + value + "\" is invalid.", e); + } + + } + +} \ No newline at end of file diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LdapFilterGuacamoleProperty.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LdapFilterGuacamoleProperty.java new file mode 100644 index 0000000..01b41c9 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/LdapFilterGuacamoleProperty.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import java.text.ParseException; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.filter.FilterParser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.properties.GuacamoleProperty; + +/** + * A GuacamoleProperty with a value of an ExprNode query filter. The string + * provided is passed through the FilterParser returning the ExprNode object, + * or an exception is thrown if the filter is invalid and cannot be correctly + * parsed. + */ +public abstract class LdapFilterGuacamoleProperty implements GuacamoleProperty { + + @Override + public ExprNode parseValue(String value) throws GuacamoleException { + + // No value provided, so return null. + if (value == null) + return null; + + try { + return FilterParser.parse(value); + } + catch (ParseException e) { + throw new GuacamoleServerException("\"" + value + "\" is not a valid LDAP filter.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/MemberAttributeType.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/MemberAttributeType.java new file mode 100644 index 0000000..02cd7aa --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/conf/MemberAttributeType.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.conf; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * All possible means of describing membership within LDAP group directory + * records. + */ +public enum MemberAttributeType { + + /** + * Group membership is specified by DN. + */ + @PropertyValue("dn") + DN, + + /** + * Group membership is specified by usercode. + */ + @PropertyValue("uid") + UID; + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/connection/ConnectionService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/connection/ConnectionService.java new file mode 100644 index 0000000..50626ca --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/connection/ConnectionService.java @@ -0,0 +1,403 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.connection; + +import com.google.inject.Inject; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import org.apache.directory.api.ldap.model.entry.Attribute; +import org.apache.directory.api.ldap.model.entry.Entry; +import org.apache.directory.api.ldap.model.exception.LdapException; +import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException; +import org.apache.directory.api.ldap.model.filter.AndNode; +import org.apache.directory.api.ldap.model.filter.EqualityNode; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.filter.OrNode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.auth.ldap.LDAPAuthenticationProvider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.ldap.ConnectedLDAPConfiguration; +import org.apache.guacamole.auth.ldap.ObjectQueryService; +import org.apache.guacamole.auth.ldap.group.UserGroupService; +import org.apache.guacamole.auth.ldap.user.LDAPAuthenticatedUser; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration.EncryptionMethod; +import org.apache.guacamole.net.auth.TokenInjectingConnection; +import org.apache.guacamole.net.auth.simple.SimpleConnection; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for querying the connections available to a particular Guacamole + * user according to an LDAP directory. + */ +public class ConnectionService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ConnectionService.class); + + /** + * The name of the LDAP attribute that stores connection configuration + * parameters for Guacamole. + */ + public static final String LDAP_ATTRIBUTE_PARAMETER = "guacConfigParameter"; + + /** + * The name of the LDAP attribute that stores the protocol for a Guacamole + * connection. + */ + public static final String LDAP_ATTRIBUTE_PROTOCOL = "guacConfigProtocol"; + + /** + * The name of the LDAP attribute that stores guacd proxy hostname. + */ + public static final String LDAP_ATTRIBUTE_PROXY_HOSTNAME = "guacConfigProxyHostname"; + + /** + * The name of the LDAP attribute that stores guacd proxy port. + */ + public static final String LDAP_ATTRIBUTE_PROXY_PORT = "guacConfigProxyPort"; + + /** + * The name of the LDAP attribute that stores guacd proxy encryption method. + */ + public static final String LDAP_ATTRIBUTE_PROXY_ENCRYPTION = "guacConfigProxyEncryption"; + + /** + * Service for executing LDAP queries. + */ + @Inject + private ObjectQueryService queryService; + + /** + * Service for retrieving user groups. + */ + @Inject + private UserGroupService userGroupService; + + /** + * The objectClass that is present on any Guacamole connections stored + * in LDAP. + */ + public static final String CONNECTION_LDAP_OBJECT_CLASS = "guacConfigGroup"; + + /** + * The attribute name that uniquely identifies a Guacamole connection object + * in LDAP. + */ + public static final String LDAP_ATTRIBUTE_NAME_ID = "cn"; + + /** + * The LDAP attribute name where the Guacamole connection protocol is stored. + */ + public static final String LDAP_ATTRIBUTE_NAME_PROTOCOL = "guacConfigProtocol"; + + /** + * The LDAP attribute name that contains any connection parameters. + */ + public static final String LDAP_ATTRIBUTE_NAME_PARAMETER = "guacConfigParameter"; + + /** + * The LDAP attribute name that provides group-based access control for + * Guacamole connection objects. + */ + public static final String LDAP_ATTRIBUTE_NAME_GROUPS = "seeAlso"; + + /** + * A list of all attribute names that could be associated with a Guacamole + * connection object in LDAP. + */ + public static final Collection GUAC_CONFIG_LDAP_ATTRIBUTES = + Collections.unmodifiableSet(new HashSet(Arrays.asList( + LDAP_ATTRIBUTE_NAME_ID, + LDAP_ATTRIBUTE_NAME_PROTOCOL, + LDAP_ATTRIBUTE_NAME_PARAMETER, + LDAP_ATTRIBUTE_NAME_GROUPS + ))); + + + + /** + * Returns all Guacamole connections accessible to the given user. + * + * @param user + * The AuthenticatedUser object associated with the user who is + * currently authenticated with Guacamole. + * + * @return + * All connections accessible to the user currently bound under the + * given LDAP connection, as a map of connection identifier to + * corresponding connection object. + * + * @throws GuacamoleException + * If an error occurs preventing retrieval of connections. + */ + public Map getConnections(LDAPAuthenticatedUser user) + throws GuacamoleException { + + ConnectedLDAPConfiguration ldapConfig = user.getLDAPConfiguration(); + + // Do not return any connections if base DN is not specified + Dn configurationBaseDN = ldapConfig.getConfigurationBaseDN(); + if (configurationBaseDN == null) + return Collections.emptyMap(); + + try { + + // Get the search filter for finding connections accessible by the + // current user + ExprNode connectionSearchFilter = getConnectionSearchFilter(user); + + // Find all Guacamole connections for the given user by + // looking for direct membership in the guacConfigGroup + // and possibly any groups the user is a member of that are + // referred to in the seeAlso attribute of the guacConfigGroup. + List results = queryService.search(ldapConfig, ldapConfig.getLDAPConnection(), + configurationBaseDN, connectionSearchFilter, 0, GUAC_CONFIG_LDAP_ATTRIBUTES); + + // Return a map of all readable connections + return queryService.asMap(results, (entry) -> { + + // Get common name (CN) + Attribute cn = entry.get(LDAP_ATTRIBUTE_NAME_ID); + + if (cn == null) { + logger.warn("{} is missing a {}.", + CONNECTION_LDAP_OBJECT_CLASS, LDAP_ATTRIBUTE_NAME_ID); + return null; + } + + String cnName; + + try { + cnName = cn.getString(); + } + catch (LdapInvalidAttributeValueException e) { + logger.error("Invalid value for {} attribute: {}", + LDAP_ATTRIBUTE_NAME_ID, e.getMessage()); + logger.debug("LDAP exception while getting CN attribute.", e); + return null; + } + + // Get associated protocol + Attribute protocol = entry.get(LDAP_ATTRIBUTE_NAME_PROTOCOL); + if (protocol == null) { + logger.warn("{} \"{}\" is missing the " + + "required \"{}\" attribute.", + CONNECTION_LDAP_OBJECT_CLASS, + cnName, LDAP_ATTRIBUTE_NAME_PROTOCOL); + return null; + } + + // Set protocol + GuacamoleConfiguration config = new GuacamoleConfiguration(); + try { + config.setProtocol(protocol.getString()); + } + catch (LdapInvalidAttributeValueException e) { + logger.error("Invalid value of the protocol entry: {}", e.getMessage()); + logger.debug("LDAP exception when getting protocol value.", e); + return null; + } + + // Get proxy configuration, if any + GuacamoleProxyConfiguration proxyConfig; + try { + proxyConfig = getProxyConfiguration(entry); + } + catch (GuacamoleException e) { + logger.error("Failed to retrieve proxy configuration.", e.getMessage()); + logger.debug("Guacamole Exception when retrieving proxy configuration.", e); + return null; + } + + // Get parameters, if any + Attribute parameterAttribute = entry.get(LDAP_ATTRIBUTE_NAME_PARAMETER); + if (parameterAttribute != null) { + + // For each parameter + while (parameterAttribute.size() > 0) { + String parameter; + try { + parameter = parameterAttribute.getString(); + } + catch (LdapInvalidAttributeValueException e) { + logger.warn("Parameter value not valid for {}: {}", cnName, e.getMessage()); + logger.debug("LDAP exception when getting parameter value.", e); + return null; + } + parameterAttribute.remove(parameter); + + // Parse parameter + int equals = parameter.indexOf('='); + if (equals != -1) { + + // Parse name + String name = parameter.substring(0, equals); + String value = parameter.substring(equals+1); + + config.setParameter(name, value); + + } + + } + + } + + // Store connection using cn for both identifier and name + Connection connection = new SimpleConnection(cnName, cnName, proxyConfig, config, true); + connection.setParentIdentifier(LDAPAuthenticationProvider.ROOT_CONNECTION_GROUP); + + // Inject LDAP-specific tokens only if LDAP handled user + // authentication + if (user instanceof LDAPAuthenticatedUser) + connection = new TokenInjectingConnection(connection, user.getTokens()); + + return connection; + + }); + + } + catch (LdapException e) { + throw new GuacamoleServerException("Error while querying for connections.", e); + } + + } + + /** + * Returns an LDAP search filter which queries all connections accessible + * by the given user. + * + * @param user + * The AuthenticatedUser object associated with the user who is + * currently authenticated with Guacamole. + * + * @return + * An LDAP search filter which queries all guacConfigGroup objects + * accessible by the user having the given DN. + * + * @throws LdapException + * If an error occurs preventing retrieval of user groups. + * + * @throws GuacamoleException + * If an error occurs retrieving the group base DN. + */ + private ExprNode getConnectionSearchFilter(LDAPAuthenticatedUser user) + throws LdapException, GuacamoleException { + + ConnectedLDAPConfiguration config = user.getLDAPConfiguration(); + Dn userDN = config.getBindDN(); + + AndNode searchFilter = new AndNode(); + + // Add the prefix to the search filter, prefix filter searches for guacConfigGroups with the userDN as the member attribute value + searchFilter.addNode(new EqualityNode("objectClass", CONNECTION_LDAP_OBJECT_CLASS)); + + // Apply group filters + OrNode groupFilter = new OrNode(); + groupFilter.addNode(new EqualityNode(config.getMemberAttribute(), + userDN.toString())); + + // Additionally filter by group membership if the current user is a + // member of any user groups + List userGroups = userGroupService.getParentUserGroupEntries(config, userDN); + if (!userGroups.isEmpty()) { + userGroups.forEach(entry -> + groupFilter.addNode(new EqualityNode(LDAP_ATTRIBUTE_NAME_GROUPS,entry.getDn().toString())) + ); + } + + // Complete the search filter. + searchFilter.addNode(groupFilter); + + return searchFilter; + } + + /** + * Given an LDAP entry that stores a GuacamoleConfiguration, generate a + * GuacamoleProxyConfiguration that tells the client how to connect to guacd. + * If the proxy configuration values are not found in the LDAP entry the + * defaults from the environment are used. If errors occur while trying to + * ready or parse values from the LDAP entry a GuacamoleException is thrown. + * + * @param connectionEntry + * The LDAP entry that should be checked for proxy configuration values. + * + * @return + * The GuacamoleProxyConfiguration that contains information on how + * to contact guacd for the given Guacamole connection configuration. + * + * @throws GuacamoleException + * If errors occur trying to parse LDAP values from the entry. + */ + private GuacamoleProxyConfiguration getProxyConfiguration(Entry connectionEntry) + throws GuacamoleException { + + try { + + // Get default proxy configuration values + GuacamoleProxyConfiguration proxyConfig = LocalEnvironment.getInstance().getDefaultGuacamoleProxyConfiguration(); + String proxyHostname = proxyConfig.getHostname(); + int proxyPort = proxyConfig.getPort(); + EncryptionMethod proxyEncryption = proxyConfig.getEncryptionMethod(); + + // Get the proxy hostname + Attribute proxyHostAttr = connectionEntry.get(LDAP_ATTRIBUTE_PROXY_HOSTNAME); + if (proxyHostAttr != null && proxyHostAttr.size() > 0) + proxyHostname = proxyHostAttr.getString(); + + // Get the proxy port + Attribute proxyPortAttr = connectionEntry.get(LDAP_ATTRIBUTE_PROXY_PORT); + if (proxyPortAttr != null && proxyPortAttr.size() > 0) + proxyPort = Integer.parseInt(proxyPortAttr.getString()); + + // Get the proxy encryption method + Attribute proxyEncryptionAttr = connectionEntry.get(LDAP_ATTRIBUTE_PROXY_ENCRYPTION); + if (proxyEncryptionAttr != null && proxyEncryptionAttr.size() > 0) { + try { + proxyEncryption = EncryptionMethod.valueOf(proxyEncryptionAttr.getString()); + } + catch (IllegalArgumentException e) { + throw new GuacamoleServerException("Unknown encryption method specified, value must be either \"NONE\" or \"SSL\".", e); + } + } + + // Return a new proxy configuration + return new GuacamoleProxyConfiguration(proxyHostname, proxyPort, proxyEncryption); + } + catch (LdapInvalidAttributeValueException e) { + logger.error("Invalid value in proxy configuration: {}", e.getMessage()); + logger.debug("LDAP exception fetching proxy attribute value.", e); + throw new GuacamoleServerException("Invalid LDAP value in proxy configuration.", e); + } + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/group/UserGroupService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/group/UserGroupService.java new file mode 100644 index 0000000..b38fc91 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/group/UserGroupService.java @@ -0,0 +1,293 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.group; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.directory.api.ldap.model.entry.Entry; +import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException; +import org.apache.directory.api.ldap.model.filter.AndNode; +import org.apache.directory.api.ldap.model.filter.EqualityNode; +import org.apache.directory.api.ldap.model.filter.ExprNode; +import org.apache.directory.api.ldap.model.filter.NotNode; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.auth.ldap.conf.MemberAttributeType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ldap.ConnectedLDAPConfiguration; +import org.apache.guacamole.auth.ldap.ObjectQueryService; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; +import org.apache.guacamole.auth.ldap.user.LDAPAuthenticatedUser; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.simple.SimpleUserGroup; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for querying user group membership and retrieving user groups + * visible to a particular Guacamole user. + */ +public class UserGroupService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserGroupService.class); + + /** + * Service for executing LDAP queries. + */ + @Inject + private ObjectQueryService queryService; + + /** + * Returns the base search filter which should be used to retrieve user + * groups which do not represent Guacamole connections. As excluding the + * guacConfigGroup object class may not work as expected if it is not + * defined (may always return zero results), it should only be explicitly + * excluded if it is expected to have been defined. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @return + * The base search filter which should be used to retrieve user groups. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private ExprNode getGroupSearchFilter(LDAPConfiguration config) throws GuacamoleException { + + // Use filter defined by "ldap-group-search-filter" as basis for all + // retrieval of user groups + ExprNode groupFilter = config.getGroupSearchFilter(); + + // Explicitly exclude guacConfigGroup object class only if it should + // be assumed to be defined (query may fail due to no such object + // class existing otherwise) + if (config.getConfigurationBaseDN() != null) { + groupFilter = new AndNode( + groupFilter, + new NotNode(new EqualityNode("objectClass", "guacConfigGroup")) + ); + } + + return groupFilter; + + } + + /** + * Returns all Guacamole user groups accessible to the given user. + * + * @param user + * The AuthenticatedUser object associated with the user who is + * currently authenticated with Guacamole. + * + * @return + * All user groups accessible to the user currently bound under the + * given LDAP connection, as a map of user group identifier to + * corresponding UserGroup object. + * + * @throws GuacamoleException + * If an error occurs preventing retrieval of user groups. + */ + public Map getUserGroups(LDAPAuthenticatedUser user) + throws GuacamoleException { + + ConnectedLDAPConfiguration config = user.getLDAPConfiguration(); + + // Do not return any user groups if base DN is not specified + Dn groupBaseDN = config.getGroupBaseDN(); + if (groupBaseDN == null) + return Collections.emptyMap(); + + // Gather all attributes relevant for a group + String memberAttribute = config.getMemberAttribute(); + Collection groupAttributes = new HashSet<>(config.getGroupNameAttributes()); + groupAttributes.add(memberAttribute); + + // Retrieve all visible user groups which are not guacConfigGroups + Collection attributes = config.getGroupNameAttributes(); + List results = queryService.search( + config, + config.getLDAPConnection(), + groupBaseDN, + getGroupSearchFilter(config), + attributes, + null, + groupAttributes + ); + + // Convert retrieved user groups to map of identifier to Guacamole + // user group object + return queryService.asMap(results, entry -> { + + // Translate entry into UserGroup object having proper identifier + try { + String name = queryService.getIdentifier(entry, attributes); + if (name != null) + return new SimpleUserGroup(name); + } + catch (LdapInvalidAttributeValueException e) { + return null; + } + + // Ignore user groups which lack a name attribute + logger.debug("User group \"{}\" is missing a name attribute " + + "and will be ignored.", entry.getDn().toString()); + return null; + + }); + + } + + /** + * Returns the LDAP entries representing all user groups that the given + * user is a member of. Only user groups which are readable by the current + * user will be retrieved. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param userDN + * The DN of the user whose group membership should be retrieved. + * + * @return + * The LDAP entries representing all readable parent user groups of the + * user having the given DN. + * + * @throws GuacamoleException + * If an error occurs preventing retrieval of user groups. + */ + public List getParentUserGroupEntries(ConnectedLDAPConfiguration config, Dn userDN) + throws GuacamoleException { + + // Do not return any user groups if base DN is not specified + Dn groupBaseDN = config.getGroupBaseDN(); + if (groupBaseDN == null) + return Collections.emptyList(); + + // memberAttribute specified in properties could contain DN or username + MemberAttributeType memberAttributeType = config.getMemberAttributeType(); + String userIDorDN = userDN.toString(); + Collection userAttributes = config.getUsernameAttributes(); + if (memberAttributeType == MemberAttributeType.UID) { + // Retrieve user objects with userDN + List userEntries = queryService.search( + config, + config.getLDAPConnection(), + userDN, + config.getUserSearchFilter(), + 0, + userAttributes); + // ... there can surely only be one + if (userEntries.size() != 1) + logger.warn("user DN \"{}\" does not return unique value " + + "and will be ignored", userDN.toString()); + else { + // determine unique identifier for user + Entry userEntry = userEntries.get(0); + try { + userIDorDN = queryService.getIdentifier(userEntry, + userAttributes); + } + catch (LdapInvalidAttributeValueException e) { + logger.error("User group missing identifier: {}", + e.getMessage()); + logger.debug("LDAP exception while getting " + + "group identifier.", e); + } + } + } + + // Gather all attributes relevant for a group + String memberAttribute = config.getMemberAttribute(); + Collection groupAttributes = new HashSet<>(config.getGroupNameAttributes()); + groupAttributes.add(memberAttribute); + + // Get all groups the user is a member of starting at the groupBaseDN, + // excluding guacConfigGroups + return queryService.search( + config, + config.getLDAPConnection(), + groupBaseDN, + getGroupSearchFilter(config), + Collections.singleton(memberAttribute), + userIDorDN, + groupAttributes + ); + + } + + /** + * Returns the identifiers of all user groups that the given user is a + * member of. Only identifiers of user groups which are readable by the + * current user will be retrieved. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param userDN + * The DN of the user whose group membership should be retrieved. + * + * @return + * The identifiers of all readable parent user groups of the user + * having the given DN. + * + * @throws GuacamoleException + * If an error occurs preventing retrieval of user groups. + */ + public Set getParentUserGroupIdentifiers(ConnectedLDAPConfiguration config, Dn userDN) + throws GuacamoleException { + + Collection attributes = config.getGroupNameAttributes(); + List userGroups = getParentUserGroupEntries(config, userDN); + + Set identifiers = new HashSet<>(userGroups.size()); + userGroups.forEach(entry -> { + + // Determine unique identifier for user group + try { + String name = queryService.getIdentifier(entry, attributes); + if (name != null) + identifiers.add(name); + + // Ignore user groups which lack a name attribute + else + logger.debug("User group \"{}\" is missing a name attribute " + + "and will be ignored.", entry.getDn().toString()); + } + catch (LdapInvalidAttributeValueException e) { + logger.error("User group missing identifier: {}", + e.getMessage()); + logger.debug("LDAP exception while getting group identifier.", e); + } + + }); + + return identifiers; + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/LDAPAuthenticatedUser.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/LDAPAuthenticatedUser.java new file mode 100644 index 0000000..24438f0 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/LDAPAuthenticatedUser.java @@ -0,0 +1,159 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.user; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ldap.ConnectedLDAPConfiguration; +import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An LDAP-specific implementation of AuthenticatedUser, associating a + * particular set of credentials with the LDAP authentication provider. + */ +public class LDAPAuthenticatedUser extends AbstractAuthenticatedUser { + + /** + * Reference to the authentication provider associated with this + * authenticated user. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * The credentials provided when this user was authenticated. + */ + private Credentials credentials; + + /** + * Name/value pairs to be applied as parameter tokens when connections + * are established using this AuthenticatedUser. + */ + private Map tokens; + + /** + * The unique identifiers of all user groups which affect the permissions + * available to this user. + */ + private Set effectiveGroups; + + /** + * The LDAP DN used to bind this user. + */ + private Dn bindDn; + + /** + * The configuration of the LDAP server that should be used for all queries + * related to this AuthenticatedUser. + */ + private ConnectedLDAPConfiguration config; + + /** + * Initializes this AuthenticatedUser with the given credentials, + * connection parameter tokens, and set of effective user groups. + * + * @param config + * The configuration of the LDAP server that should be used for all + * queries related to this AuthenticatedUser. + * + * @param credentials + * The credentials provided when this user was authenticated. + * + * @param tokens + * A Map of all name/value pairs that should be applied as parameter + * tokens when connections are established using the AuthenticatedUser. + * + * @param effectiveGroups + * The unique identifiers of all user groups which affect the + * permissions available to this user. + */ + public void init(UserLDAPConfiguration config, Credentials credentials, + Map tokens, Set effectiveGroups) { + this.config = config; + this.credentials = credentials; + this.tokens = Collections.unmodifiableMap(tokens); + this.effectiveGroups = effectiveGroups; + this.bindDn = config.getBindDN(); + setIdentifier(config.getGuacamoleUsername()); + } + + /** + * Returns a Map of all name/value pairs that should be applied as + * parameter tokens when connections are established using this + * AuthenticatedUser. + * + * @return + * A Map of all name/value pairs that should be applied as parameter + * tokens when connections are established using this + * AuthenticatedUser. + */ + public Map getTokens() { + return tokens; + } + + /** + * Returns the LDAP DN used to bind this user. + * + * @return + * The LDAP DN used to bind this user. + */ + public Dn getBindDn() { + return bindDn; + } + + /** + * Returns the configuration of the LDAP server that should be used for all + * queries related to this AuthenticatedUser. + * + * @return + * The configuration of the LDAP server related to this + * AuthenticatedUser. + */ + public ConnectedLDAPConfiguration getLDAPConfiguration() { + return config; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public Set getEffectiveUserGroups() { + return effectiveGroups; + } + + @Override + public void invalidate() { + config.close(); + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/LDAPUserContext.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/LDAPUserContext.java new file mode 100644 index 0000000..79b1af7 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/LDAPUserContext.java @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.user; + +import com.google.inject.Inject; +import java.util.Collections; +import org.apache.guacamole.auth.ldap.connection.ConnectionService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.ldap.LDAPAuthenticationProvider; +import org.apache.guacamole.auth.ldap.group.UserGroupService; +import org.apache.guacamole.net.auth.AbstractUserContext; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleConnectionGroup; +import org.apache.guacamole.net.auth.simple.SimpleDirectory; +import org.apache.guacamole.net.auth.simple.SimpleObjectPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleUser; + +/** + * An LDAP-specific implementation of UserContext which queries all Guacamole + * connections and users from the LDAP directory. + */ +public class LDAPUserContext extends AbstractUserContext { + + /** + * Service for retrieving Guacamole connections from the LDAP server. + */ + @Inject + private ConnectionService connectionService; + + /** + * Service for retrieving Guacamole users from the LDAP server. + */ + @Inject + private UserService userService; + + /** + * Service for retrieving user groups. + */ + @Inject + private UserGroupService userGroupService; + + /** + * Reference to the AuthenticationProvider associated with this + * UserContext. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * Reference to a User object representing the user whose access level + * dictates the users and connections visible through this UserContext. + */ + private User self; + + /** + * Directory containing all User objects accessible to the user associated + * with this UserContext. + */ + private Directory userDirectory; + + /** + * Directory containing all UserGroup objects accessible to the user + * associated with this UserContext. + */ + private Directory userGroupDirectory; + + /** + * Directory containing all Connection objects accessible to the user + * associated with this UserContext. + */ + private Directory connectionDirectory; + + /** + * Reference to the root connection group. + */ + private ConnectionGroup rootGroup; + + /** + * Initializes this UserContext using the provided AuthenticatedUser. + * + * @param user + * The AuthenticatedUser representing the user that authenticated. This + * user will always have been authenticated via LDAP, as LDAP data is + * not provided to non-LDAP users. + * + * @throws GuacamoleException + * If associated data stored within the LDAP directory cannot be + * queried due to an error. + */ + public void init(LDAPAuthenticatedUser user) throws GuacamoleException { + + // Query all accessible users + userDirectory = new SimpleDirectory<>( + userService.getUsers(user) + ); + + // Query all accessible user groups + userGroupDirectory = new SimpleDirectory<>( + userGroupService.getUserGroups(user) + ); + + // Query all accessible connections + connectionDirectory = new SimpleDirectory<>( + connectionService.getConnections(user) + ); + + // Root group contains only connections + rootGroup = new SimpleConnectionGroup( + LDAPAuthenticationProvider.ROOT_CONNECTION_GROUP, + LDAPAuthenticationProvider.ROOT_CONNECTION_GROUP, + connectionDirectory.getIdentifiers(), + Collections.emptyList() + ); + + // Init self with basic permissions + self = new SimpleUser(user.getIdentifier()) { + + @Override + public ObjectPermissionSet getUserPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(userDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(userGroupDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(connectionDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(Collections.singleton(LDAPAuthenticationProvider.ROOT_CONNECTION_GROUP)); + } + + }; + + } + + @Override + public User self() { + return self; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + return userDirectory; + } + + @Override + public Directory getUserGroupDirectory() throws GuacamoleException { + return userGroupDirectory; + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return connectionDirectory; + } + + @Override + public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { + return rootGroup; + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserLDAPConfiguration.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserLDAPConfiguration.java new file mode 100644 index 0000000..3d2cd82 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserLDAPConfiguration.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.user; + +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.ldap.client.api.LdapNetworkConnection; +import org.apache.guacamole.auth.ldap.ConnectedLDAPConfiguration; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; + +/** + * LDAPConfiguration implementation that represents the configuration and + * network connection of an LDAP that has been bound on behalf of a Guacamole + * user. + */ +public class UserLDAPConfiguration extends ConnectedLDAPConfiguration { + + /** + * The username of the associated Guacamole user. + */ + private final String username; + + /** + * Creates a new UserLDAPConfiguration that associates the given + * LDAPConfiguration of an LDAP server with the active network connection to + * that server, as well as the username of the Guacamole user on behalf of + * whom that connection was established. All functions inherited from the + * LDAPConfiguration interface are delegated to the given LDAPConfiguration. + * It is the responsibility of the caller to ensure the provided + * LdapNetworkConnection is closed after it is no longer needed. + * + * @param config + * The LDAPConfiguration to wrap. + * + * @param username + * The username of the associated Guacamole user. + * + * @param bindDn + * The LDAP DN that was used to bind with the LDAP server to produce + * the given LdapNetworkConnection. + * + * @param connection + * The connection to the LDAP server represented by the given + * configuration. + */ + public UserLDAPConfiguration(LDAPConfiguration config, + String username, Dn bindDn, LdapNetworkConnection connection) { + super(config, bindDn, connection); + this.username = username; + } + + /** + * Returns the username of the Guacamole user on behalf of whom the + * associated LDAP network connection was established. + * + * @return + * The username of the associated Guacamole user. + */ + public String getGuacamoleUsername() { + return username; + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserService.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserService.java new file mode 100644 index 0000000..38fa33e --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserService.java @@ -0,0 +1,209 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ldap.user; + +import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import org.apache.directory.api.ldap.model.entry.Entry; +import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException; +import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.api.ldap.model.name.Rdn; +import org.apache.directory.ldap.client.api.LdapNetworkConnection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.ldap.ConnectedLDAPConfiguration; +import org.apache.guacamole.auth.ldap.conf.LDAPGuacamoleProperties; +import org.apache.guacamole.auth.ldap.ObjectQueryService; +import org.apache.guacamole.auth.ldap.conf.LDAPConfiguration; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.simple.SimpleUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for queries the users visible to a particular Guacamole user + * according to an LDAP directory. + */ +public class UserService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserService.class); + + /** + * Service for executing LDAP queries. + */ + @Inject + private ObjectQueryService queryService; + + /** + * Returns all Guacamole users accessible to the given user. + * + * @param user + * The AuthenticatedUser object associated with the user who is + * currently authenticated with Guacamole. + * + * @return + * All users accessible to the user currently bound under the given + * LDAP connection, as a map of connection identifier to corresponding + * user object. + * + * @throws GuacamoleException + * If an error occurs preventing retrieval of users. + */ + public Map getUsers(LDAPAuthenticatedUser user) + throws GuacamoleException { + + ConnectedLDAPConfiguration config = user.getLDAPConfiguration(); + + // Retrieve all visible user objects + Collection usernameAttrs = config.getUsernameAttributes(); + Collection attributes = new HashSet<>(usernameAttrs); + attributes.addAll(config.getAttributes()); + List results = queryService.search( + config, + config.getLDAPConnection(), + config.getUserBaseDN(), + config.getUserSearchFilter(), + usernameAttrs, + null, + attributes + ); + + // Convert retrieved users to map of identifier to Guacamole user object + return queryService.asMap(results, entry -> { + + // Get username from record + try { + String username = queryService.getIdentifier(entry, attributes); + if (username == null) { + logger.warn("User \"{}\" is missing a username attribute " + + "and will be ignored.", entry.getDn().toString()); + return null; + } + + return new SimpleUser(username); + } + catch (LdapInvalidAttributeValueException e) { + + return null; + } + + }); + + } + + /** + * Returns a list of all DNs corresponding to the users having the given + * username. If multiple username attributes are defined, or if uniqueness + * is not enforced across the username attribute, it is possible that this + * will return multiple DNs. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param ldapConnection + * The connection to the LDAP server to use when querying user DNs. + * + * @param username + * The username of the user whose corresponding user account DNs are + * to be retrieved. + * + * @return + * A list of all DNs corresponding to the users having the given + * username. If no such DNs exist, this list will be empty. + * + * @throws GuacamoleException + * If an error occurs while querying the user DNs, or if the username + * attribute property cannot be parsed within guacamole.properties. + */ + public List getUserDNs(LDAPConfiguration config, LdapNetworkConnection ldapConnection, + String username) throws GuacamoleException { + + // Retrieve user objects having a matching username + List results = queryService.search(config, ldapConnection, + config.getUserBaseDN(), + config.getUserSearchFilter(), + config.getUsernameAttributes(), + username, + Collections.singletonList("dn")); + + // Build list of all DNs for retrieved users + List userDNs = new ArrayList<>(results.size()); + results.forEach(entry -> userDNs.add(entry.getDn())); + + return userDNs; + + } + + /** + * Determines the DN which corresponds to the user having the given + * username. The DN will either be derived directly from the user base DN, + * or queried from the LDAP server, depending on how LDAP authentication + * has been configured. + * + * @param config + * The configuration of the LDAP server being queried. + * + * @param username + * The username of the user whose corresponding DN should be returned. + * + * @return + * The DN which corresponds to the user having the given username. + * + * @throws GuacamoleException + * If required properties are missing, and thus the user DN cannot be + * determined. + */ + public Dn deriveUserDN(LDAPConfiguration config, String username) + throws GuacamoleException { + + // Pull username attributes from properties + List usernameAttributes = new ArrayList<>(config.getUsernameAttributes()); + + // We need exactly one base DN to derive the user DN + if (usernameAttributes.size() != 1) { + logger.warn(String.format("Cannot directly derive user DN when " + + "multiple username attributes are specified. Please " + + "define an LDAP search DN using the \"%s\" property " + + "in your \"guacamole.properties\".", + LDAPGuacamoleProperties.LDAP_SEARCH_BIND_DN.getName())); + return null; + } + + // Derive user DN from base DN + try { + return new Dn(new Rdn(usernameAttributes.get(0), username), + config.getUserBaseDN()); + } + catch (LdapInvalidAttributeValueException | LdapInvalidDnException e) { + throw new GuacamoleServerException("Error trying to derive user DN.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-ldap/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..dc812d3 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/resources/guac-manifest.json @@ -0,0 +1,18 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "LDAP Authentication", + "namespace" : "ldap", + + "authProviders" : [ + "org.apache.guacamole.auth.ldap.LDAPAuthenticationProvider" + ], + + "translations" : [ + "translations/de.json", + "translations/en.json", + "translations/zh.json" + ] + +} diff --git a/extensions/guacamole-auth-ldap/src/main/resources/translations/en.json b/extensions/guacamole-auth-ldap/src/main/resources/translations/en.json new file mode 100644 index 0000000..a1d6ae9 --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/resources/translations/en.json @@ -0,0 +1,7 @@ +{ + + "DATA_SOURCE_LDAP" : { + "NAME" : "LDAP" + } + +} diff --git a/extensions/guacamole-auth-ldap/src/main/resources/translations/zh.json b/extensions/guacamole-auth-ldap/src/main/resources/translations/zh.json new file mode 100644 index 0000000..e842ecb --- /dev/null +++ b/extensions/guacamole-auth-ldap/src/main/resources/translations/zh.json @@ -0,0 +1,7 @@ +{ + + "DATA_SOURCE_LDAP" : { + "NAME" : "轻型目录访问协议" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/.ratignore b/extensions/guacamole-auth-quickconnect/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-quickconnect/pom.xml b/extensions/guacamole-auth-quickconnect/pom.xml new file mode 100644 index 0000000..28e6231 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/pom.xml @@ -0,0 +1,128 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-quickconnect + jar + 1.6.0 + guacamole-auth-quickconnect + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + quickconnect.css + + + **/*.css + + + / + / + quickconnect.js + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.inject + guice + + + + + javax.ws.rs + jsr311-api + 1.1.1 + provided + + + + + junit + junit + test + + + + + diff --git a/extensions/guacamole-auth-quickconnect/src/main/assembly/dist.xml b/extensions/guacamole-auth-quickconnect/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectAuthenticationProvider.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectAuthenticationProvider.java new file mode 100644 index 0000000..41346cc --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectAuthenticationProvider.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.UserContext; + +/** + * This class provides the necessary hooks into the Guacamole Client authentication + * process so that the QuickConnect functionality can be initialized and used + * throughout the web client. + */ +public class QuickConnectAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * Injector which will manage the object graph of this authentication + * provider. + */ + private final Injector injector; + + public QuickConnectAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + injector = Guice.createInjector( + new QuickConnectAuthenticationProviderModule(this) + ); + } + + @Override + public String getIdentifier() { + return "quickconnect"; + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + QuickConnectUserContext userContext = + injector.getInstance(QuickConnectUserContext.class); + + userContext.init(authenticatedUser.getIdentifier()); + + return userContext; + + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectAuthenticationProviderModule.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectAuthenticationProviderModule.java new file mode 100644 index 0000000..5243e53 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectAuthenticationProviderModule.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.auth.quickconnect.conf.ConfigurationService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * Guice module which configures QuickConnect-specific injections. + */ +public class QuickConnectAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the QuickConnectAuthenticationProvider on behalf of which + * this module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new QuickConnect authentication provider module which + * configures injection for the QuickConnectAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public QuickConnectAuthenticationProviderModule( + AuthenticationProvider authProvider) throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Store associated auth provider + this.authProvider = authProvider; + + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind QuickConnect-specific services + bind(ConfigurationService.class); + bind(QuickConnectUserContext.class); + bind(QuickConnectDirectory.class); + + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectDirectory.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectDirectory.java new file mode 100644 index 0000000..b677fb1 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectDirectory.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect; + +import com.google.inject.Inject; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.quickconnect.utility.QCParser; +import org.apache.guacamole.auth.quickconnect.conf.ConfigurationService; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.simple.SimpleConnection; +import org.apache.guacamole.net.auth.simple.SimpleDirectory; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Implementation of a directory to store Connection objects + * completely in memory. + */ +public class QuickConnectDirectory extends SimpleDirectory { + + /** + * The configuration service for the QuickConnect module. + */ + @Inject + private ConfigurationService confService; + + /** + * The connections to store. + */ + private final Map connections = + new ConcurrentHashMap<>(); + + /** + * The root connection group for this directory. + */ + private QuickConnectionGroup rootGroup; + + /** + * The internal counter for connection IDs. + */ + private AtomicInteger connectionId; + + /** + * Initialize the QuickConnectDirectory with the default empty Map for + * Connection objects, and the specified ConnectionGroup at the root of + * the directory. + * + * @param rootGroup + * A group that should be at the root of this directory. + */ + public void init(ConnectionGroup rootGroup) { + this.rootGroup = (QuickConnectionGroup)rootGroup; + this.connectionId = new AtomicInteger(); + super.setObjects(this.connections); + + } + + /** + * Returns the current connection identifier counter and then increments it. + * + * @return + * An int representing the next available connection + * identifier to be used when adding connections. + */ + private int getNextConnectionID() { + return connectionId.getAndIncrement(); + } + + @Override + public void add(Connection connection) throws GuacamoleException { + connections.put(connection.getIdentifier(), connection); + } + + /** + * Taking a URI, parse the URI into a GuacamoleConfiguration object and + * then use the configuration to create a SimpleConnection object, obtain + * an identifier, and place it on the tree, returning the identifier value + * of the new connection. + * + * @param uri + * The URI to parse into a GuacamoleConfiguration, which will then be + * used to generate the SimpleConnection. + * + * @return + * The identifier of the connection created in the directory. + * + * @throws GuacamoleException + * If an error occurs adding the object to the tree. + */ + public String create(String uri) throws GuacamoleException { + + // Get the next available connection identifier. + String newConnectionId = Integer.toString(getNextConnectionID()); + + // Get a new QCParser + QCParser parser = new QCParser(confService.getAllowedParameters(), + confService.getDeniedParameters()); + + // Parse the URI into a configuration + GuacamoleConfiguration config = parser.getConfiguration(uri); + + // Generate a name for the configuration. + String name = parser.getName(config); + + // Create a new connection and set the parent identifier. + Connection connection = new SimpleConnection(name, newConnectionId, config, true); + connection.setParentIdentifier(QuickConnectUserContext.ROOT_IDENTIFIER); + + // Place the object in this directory. + add(connection); + + // Add connection to the tree. + rootGroup.addConnectionIdentifier(newConnectionId); + + return newConnectionId; + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectUserContext.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectUserContext.java new file mode 100644 index 0000000..21b2d48 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectUserContext.java @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect; + +import com.google.inject.Inject; +import java.util.Collections; +import org.apache.guacamole.auth.quickconnect.rest.QuickConnectREST; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractUserContext; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleObjectPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleUser; + +/** + * A simple implementation of UserContext to support this + * extension, used for storing connections the user has created + * with the QuickConnect bar in the webapp. + */ +public class QuickConnectUserContext extends AbstractUserContext { + + /** + * The unique identifier of the root connection group. + */ + public static final String ROOT_IDENTIFIER = DEFAULT_ROOT_CONNECTION_GROUP; + + /** + * The AuthenticationProvider that created this UserContext. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * Reference to the user whose permissions dictate the configurations + * accessible within this UserContext. + */ + private User self; + + /** + * The Directory with access to all connections within the root group + * associated with this UserContext. + */ + @Inject + private QuickConnectDirectory connectionDirectory; + + /** + * The root connection group. + */ + private ConnectionGroup rootGroup; + + /** + * Initialize a QuickConnectUserContext using the provided username. + * + * @param username + * The name of the user logging in that will be associated + * with this UserContext. + * + * @throws GuacamoleException + * If errors occur initializing the ConnectionGroup, + * ConnectionDirectory, or User. + */ + public void init(String username) throws GuacamoleException { + + // Initialize the rootGroup to a QuickConnectionGroup with a + // single root identifier. + this.rootGroup = new QuickConnectionGroup( + ROOT_IDENTIFIER, + ROOT_IDENTIFIER + ); + + // Initialize the connection directory + this.connectionDirectory.init(this.rootGroup); + + // Initialize the user to a SimpleUser with the provided username, + // no connections, and the single root group. + this.self = new SimpleUser(username) { + + @Override + public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(connectionDirectory.getIdentifiers()); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(Collections.singleton(ROOT_IDENTIFIER)); + } + + }; + + } + + @Override + public QuickConnectDirectory getConnectionDirectory() { + return connectionDirectory; + } + + @Override + public User self() { + return self; + } + + @Override + public Object getResource() throws GuacamoleException { + return new QuickConnectREST(connectionDirectory); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { + return rootGroup; + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectionGroup.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectionGroup.java new file mode 100644 index 0000000..dbb6934 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/QuickConnectionGroup.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.AbstractConnectionGroup; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Provides a simple, single-level connection group used for + * temporarily storing the Connection objects created by users. + */ +public class QuickConnectionGroup extends AbstractConnectionGroup { + + /** + * A set that will store the Connection identifiers for this group. + */ + private final Set connectionIdentifiers = + new HashSet(Collections.emptyList()); + + /** + * Set up a QuickConnectionGroup with the provided name and + * identifier. + * + * @param name + * The name of the QuickConnectionGroup. + * + * @param identifier + * The identifier of the QuickConnectionGroup. + */ + public QuickConnectionGroup(String name, String identifier) { + + super(); + super.setName(name); + super.setIdentifier(identifier); + super.setType(ConnectionGroup.Type.ORGANIZATIONAL); + + } + + /** + * Add a connection identifier to this connection group, and + * return the identifier if the add succeeds, otherwise + * return null. + * + * @param identifier + * The identifier of the connection to add to the group. + * + * @return + * The String identifier of the connection if the add + * operation was successful; otherwise null. + */ + public String addConnectionIdentifier(String identifier) { + if (connectionIdentifiers.add(identifier)) + return identifier; + return null; + } + + @Override + public int getActiveConnections() { + // This group does not track active connections. + return 0; + } + + @Override + public Set getConnectionIdentifiers() { + return connectionIdentifiers; + } + + @Override + public Set getConnectionGroupIdentifiers() { + // This group contains only connections, not other groups. + return Collections.emptySet(); + } + + @Override + public Map getAttributes() { + // There are no attributes associated with this group. + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + // Do nothing - there are no attributes + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + // This group does not support connections + throw new GuacamoleSecurityException("Permission denied."); + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/conf/ConfigurationService.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/conf/ConfigurationService.java new file mode 100644 index 0000000..e8e8fd3 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/conf/ConfigurationService.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect.conf; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.StringGuacamoleProperty; + +/** + * Configuration options to control the QuickConnect module. + */ +public class ConfigurationService { + + /** + * The environment of the Guacamole Server. + */ + @Inject + private Environment environment; + + /** + * A list of parameters that, if set, will limit the parameters allowed to + * be defined by connections created using the QuickConnect module to only + * the parameters defined in this list. Defaults to null (all parameters + * are allowed). + */ + public static final StringGuacamoleProperty QUICKCONNECT_ALLOWED_PARAMETERS = new StringGuacamoleProperty() { + + @Override + public String getName() { return "quickconnect-allowed-parameters"; } + + }; + + /** + * A list of parameters that, if set, will limit the parameters allowed to + * be defined by connections created using the QuickConnect module to any + * except the ones defined in this list. Defaults to null (all parameters + * are allowed). + */ + public static final StringGuacamoleProperty QUICKCONNECT_DENIED_PARAMETERS = new StringGuacamoleProperty() { + + @Override + public String getName() { return "quickconnect-denied-parameters"; } + + }; + + /** + * Return the list of allowed parameters to be set by connections created + * using the QuickConnect module, or null if none are defined (thereby + * allowing all parameters to be set). + * + * @return + * The list of allowed parameters to be set by connections crated using + * the QuickConnect module. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public Collection getAllowedParameters() throws GuacamoleException { + return environment.getPropertyCollection(QUICKCONNECT_ALLOWED_PARAMETERS); + } + + /** + * Return the list of denied parameters for connections created using the + * QuickConnect module, or null if none are defined (thereby allowing all + * parameters to be set). + * + * @return + * The list of parameters that cannot be set by connections created + * using the QuickConnect module. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public Collection getDeniedParameters() throws GuacamoleException { + return environment.getPropertyCollection(QUICKCONNECT_DENIED_PARAMETERS); + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/rest/QuickConnectREST.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/rest/QuickConnectREST.java new file mode 100644 index 0000000..eec1c64 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/rest/QuickConnectREST.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect.rest; + +import java.util.Collections; +import java.util.Map; +import javax.ws.rs.FormParam; +import javax.ws.rs.Path; +import javax.ws.rs.POST; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.quickconnect.QuickConnectDirectory; +import org.apache.guacamole.auth.quickconnect.utility.QCParser; + +/** + * A class that implements REST endpoints for the QuickConnect + * extension. + */ +@Produces(MediaType.APPLICATION_JSON) +public class QuickConnectREST { + + /** + * The connection directory for this REST endpoint. + */ + private final QuickConnectDirectory directory; + + /** + * Construct a new QuickConnectREST class, taking in a + * QuickConnectDirectory for use with this class. + * + * @param directory + * The QuickConnectDirectory object to associate with this + * REST endpoint class. + */ + public QuickConnectREST(QuickConnectDirectory directory) { + this.directory = directory; + } + + /** + * Parse the URI read from the POST input, add the connection + * to the directory, and return a Map containing a single key, + * identifier, and the identifier of the new connection. + * + * @param uri + * The URI to parse into a connection. + * + * @return + * A Map containing a single key, identifier, and the + * identifier of the new connection. + * + * @throws GuacamoleException + * If an error is encountered parsing the URI. + */ + @POST + @Path("create") + public Map create(@FormParam("uri") String uri) + throws GuacamoleException { + + return Collections.singletonMap("identifier", directory.create(uri)); + + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java new file mode 100644 index 0000000..e71988e --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java @@ -0,0 +1,331 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect.utility; + +import java.io.UnsupportedEncodingException; +import java.lang.StringBuilder; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLDecoder; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * A utility class to parse out a URI into the settings necessary + * to generate a GuacamoleConfiguration object. + */ +public class QCParser { + + /** + * The regex to use to split username and password. + */ + private static final Pattern userinfoPattern = Pattern.compile("(^[^:]+):?(.*)"); + + /** + * The regex group of the username. + */ + private static final int USERNAME_GROUP = 1; + + /** + * THe regex group of the password. + */ + private static final int PASSWORD_GROUP = 2; + + /** + * The list of parameters that are allowed to be placed into a configuration + * by this parser. If not defined, all parameters will be allowed unless + * explicitly denied. + */ + private final Collection allowedParams; + + /** + * The list of parameters that are explicitly denied from being placed into + * a configuration by this parser. + */ + private final Collection deniedParams; + + /** + * Create a new instance of the QCParser class, with the provided allowed + * and denied parameter lists, if any. + * + * @param allowedParams + * A list of parameters that are allowed to be parsed and placed into + * a connection configuration, or null or empty if all parameters are + * allowed. + * + * @param deniedParams + * A list of parameters, if any, that should be explicitly denied from + * being placed into a connection configuration. + */ + public QCParser(Collection allowedParams, Collection deniedParams) { + this.allowedParams = allowedParams; + this.deniedParams = deniedParams; + } + + /** + * Create a new instance of the QCParser class, initializing the allowed + * and denied parameter lists to empty lists, which means all parameters + * will be allowed and none will be denied. + */ + public QCParser() { + this.allowedParams = Collections.emptyList(); + this.deniedParams = Collections.emptyList(); + } + + /** + * Parse out a URI string and get a GuacamoleConfiguration + * from that string, or an exception if the parsing fails. + * + * @param uri + * The string form of the URI to be parsed. + * + * @return + * A GuacamoleConfiguration generated using the information + * provided by the user in the URI. + * + * @throws GuacamoleException + * If an error occurs parsing the URI. + */ + public GuacamoleConfiguration getConfiguration(String uri) + throws GuacamoleException { + + // Parse the provided String into a URI object. + URI qcUri; + try { + qcUri = new URI(uri); + if (!qcUri.isAbsolute()) + throw new TranslatableGuacamoleClientException("URI must be absolute.", + "QUICKCONNECT.ERROR_NOT_ABSOLUTE_URI"); + } + catch (URISyntaxException e) { + throw new TranslatableGuacamoleClientException("Invalid URI Syntax", + "QUICKCONNECT.ERROR_INVALID_URI"); + } + + // Break out individual components of the URI. + String protocol = qcUri.getScheme(); + String host = qcUri.getHost(); + int port = qcUri.getPort(); + String userInfo = qcUri.getUserInfo(); + String query = qcUri.getQuery(); + + // Generate a new GuacamoleConfiguration + GuacamoleConfiguration qcConfig = new GuacamoleConfiguration(); + + // Check for protocol and set it, or throw an error if not present + if (protocol != null && !protocol.isEmpty()) + qcConfig.setProtocol(protocol); + else + throw new TranslatableGuacamoleClientException("No protocol specified.", + "QUICKCONNECT.ERROR_NO_PROTOCOL"); + + // Check for provided port number + if (port > 0 && paramIsAllowed("port")) + qcConfig.setParameter("port", Integer.toString(port)); + + // Check for provided host, or throw an error if not present + if (host != null && !host.isEmpty() && paramIsAllowed("hostname")) + qcConfig.setParameter("hostname", host); + else + throw new TranslatableGuacamoleClientException("No host specified.", + "QUICKCONNECT.ERROR_NO_HOST"); + + // Look for extra query parameters and parse them out. + if (query != null && !query.isEmpty()) + parseQueryString(query, qcConfig); + + // Look for the username and password and parse them out. + if (userInfo != null && !userInfo.isEmpty()) + parseUserInfo(userInfo, qcConfig); + + return qcConfig; + + } + + /** + * Parse the given string for parameter key/value pairs and update the + * provided GuacamoleConfiguration object with the parsed values, checking + * to make sure that the parser is allowed to provide the requested + * parameters. + * + * @param queryStr + * The query string to parse for key/value pairs. + * + * @param config + * The GuacamoleConfiguration object that should be updated with the + * parsed parameters. + * + * @throws GuacamoleException + * If Java unexpectedly lacks UTF-8 support. + */ + private void parseQueryString(String queryStr, GuacamoleConfiguration config) + throws GuacamoleException { + + // Split the query string into the pairs + List paramList = Arrays.asList(queryStr.split("&")); + + // Loop through key/value pairs and put them in the Map. + for (String param : paramList) { + String[] paramArray = param.split("=", 2); + try { + String paramName = URLDecoder.decode(paramArray[0], "UTF-8"); + String paramValue = URLDecoder.decode(paramArray[1], "UTF-8"); + if (paramIsAllowed(paramName)) + config.setParameter(paramName, paramValue); + } + catch (UnsupportedEncodingException e) { + throw new GuacamoleServerException("Unexpected lack of UTF-8 encoding support.", e); + } + } + } + + /** + * Parse the given string for username and password values, and, if values + * are present and allowed by the configuration, decode them and set them in + * the provided GuacamoleConfiguration object. + * + * @param userInfo + * The string to parse for username/password values. + * + * @param config + * The GuacamoleConfiguration object to store the username + * and password in. + * + * @throws GuacamoleException + * If Java unexpectedly lacks UTF-8 support. + */ + private void parseUserInfo(String userInfo, + GuacamoleConfiguration config) + throws GuacamoleException { + + Matcher userinfoMatcher = userinfoPattern.matcher(userInfo); + + if (userinfoMatcher.matches()) { + String username = userinfoMatcher.group(USERNAME_GROUP); + String password = userinfoMatcher.group(PASSWORD_GROUP); + + if (username != null && !username.isEmpty() && paramIsAllowed("username")) { + try { + config.setParameter("username", + URLDecoder.decode(username, "UTF-8")); + } + catch (UnsupportedEncodingException e) { + throw new GuacamoleServerException("Unexpected lack of UTF-8 encoding support.", e); + } + } + + if (password != null && !password.isEmpty() && paramIsAllowed("password")) { + try { + config.setParameter("password", + URLDecoder.decode(password, "UTF-8")); + } + catch (UnsupportedEncodingException e) { + throw new GuacamoleServerException("Unexpected lack of UTF-8 encoding support.", e); + } + } + } + + } + + /** + * Given a GuacamoleConfiguration object, generate a name + * for the configuration based on the protocol, host, user + * and port in the configuration, and return the string value. + * + * @param config + * The GuacamoleConfiguration object to use to generate + * the name. + * + * @return + * The String value of the name that is generated. + * + * @throws GuacamoleException + * If an error occurs getting items in the configuration. + */ + public String getName(GuacamoleConfiguration config) + throws GuacamoleException { + + if (config == null) + return null; + + String protocol = config.getProtocol(); + String host = config.getParameter("hostname"); + String port = config.getParameter("port"); + String user = config.getParameter("username"); + + StringBuilder name = new StringBuilder(); + + if (protocol != null && !protocol.isEmpty()) + name.append(protocol).append("://"); + + if (user != null && !user.isEmpty()) + name.append(user).append("@"); + + if (host != null && !host.isEmpty()) + name.append(host); + + if (port != null && !port.isEmpty()) + name.append(":").append(port); + + name.append("/"); + + return name.toString(); + } + + /** + * For a given parameter, check to make sure the parameter is allowed to be + * used in the connection configuration, first by checking to see if + * allowed parameters are defined and the given parameter is present, then + * by checking for explicitly denied parameters. Returns false if the + * configuration prevents the parameter from being used, otherwise true. + * + * @param param + * The name of the parameter to check. + * + * @return + * False if the configuration prevents the parameter from being used, + * otherwise true. + */ + private boolean paramIsAllowed(String param) { + + // If allowed parameters are defined and not empty, + // check to see if this parameter is allowed. + if (allowedParams != null && !allowedParams.isEmpty() && !allowedParams.contains(param)) + return false; + + // If denied parameters are defined and not empty, + // check to see if this parameter is denied. + if (deniedParams != null && !deniedParams.isEmpty() && deniedParams.contains(param)) + return false; + + // By default, the parameter is allowed. + return true; + + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/controllers/quickconnectController.js b/extensions/guacamole-auth-quickconnect/src/main/resources/controllers/quickconnectController.js new file mode 100644 index 0000000..34c6780 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/controllers/quickconnectController.js @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for making ad-hoc (quick) connections + */ +angular.module('guacQuickConnect').controller('quickconnectController', ['$scope', '$injector', + function manageConnectionController($scope, $injector) { + + // Required types + var ClientIdentifier = $injector.get('ClientIdentifier'); + + // Required services + var $location = $injector.get('$location'); + var guacNotification = $injector.get('guacNotification'); + var quickConnectService = $injector.get('quickConnectService'); + + /** + * The URI that will be passed in to the extension to create + * the connection. + */ + $scope.uri = null; + + /** + * Saves the connection, creating a new connection or updating the existing + * connection. + */ + $scope.quickConnect = function quickConnect() { + + quickConnectService.createConnection($scope.uri) + .then(function createdConnection(connectionId) { + $location.url('/client/' + ClientIdentifier.toString({ + dataSource : 'quickconnect', + type : ClientIdentifier.Types.CONNECTION, + id : connectionId + })); + }, guacNotification.SHOW_REQUEST_ERROR); + + return; + + }; + +}]); diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-quickconnect/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..2225adb --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/guac-manifest.json @@ -0,0 +1,40 @@ +{ + "guacamoleVersion" : "1.6.0", + + "name" : "Adhoc Guacamole Connections", + "namespace" : "quickconnect", + + "authProviders" : [ + "org.apache.guacamole.auth.quickconnect.QuickConnectAuthenticationProvider" + ], + + "js" : [ + "quickconnect.min.js" + ], + + "css" : [ + "quickconnect.min.css" + ], + + "html" : [ + "templates/quickconnectField.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ], + + "resources" : { + "templates/quickconnectField.html" : "text/html" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/quickconnectModule.js b/extensions/guacamole-auth-quickconnect/src/main/resources/quickconnectModule.js new file mode 100644 index 0000000..ed397a6 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/quickconnectModule.js @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module which provides QuickConnect capability + */ +angular.module('guacQuickConnect', [ + 'form' +]); + +// Ensure the guacQuickConnect module is loaded along with the rest of the app +angular.module('index').requires.push('guacQuickConnect'); diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/services/quickConnectService.js b/extensions/guacamole-auth-quickconnect/src/main/resources/services/quickConnectService.js new file mode 100644 index 0000000..0da2980 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/services/quickConnectService.js @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for managing quickConnect extension. + */ +angular.module('guacQuickConnect').factory('quickConnectService', ['$injector', + function quickConnectService($injector) { + + // Required services + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + var requestService = $injector.get('requestService'); + + var service = {}; + + /** + * Makes a request to the REST API to create a connection, returning a + * promise that can be used for processing the results of the call. + * + * @param {uri} The URI of the connection to create. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * save operation is successful. + */ + service.createConnection = function createConnection(uri) { + + // Build HTTP parameters set + var httpParameters = { + token : authenticationService.getCurrentToken() + }; + + return requestService({ + method : 'POST', + url : 'api/session/ext/quickconnect/create', + params : httpParameters, + data : $.param({uri: uri}), + headers : {'Content-Type': 'application/x-www-form-urlencoded'} + }) + .then(function connectionCreated(connectionId) { + // Clear connections and users from cache. + cacheService.connections.removeAll(); + cacheService.users.removeAll(); + + // Pass on the connection identifier + return connectionId.identifier; + }); + + }; + + return service; +}]); diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/styles/quickconnect.css b/extensions/guacamole-auth-quickconnect/src/main/resources/styles/quickconnect.css new file mode 100644 index 0000000..2f11262 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/styles/quickconnect.css @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +.quickconnect-container { + margin: 0.25em 0; + width: 100%; + margin-left: 0.50em; +} + +.quickconnect-container .quickconnect-field { + background-image: url('images/protocol-icons/guac-text.png'); + background-repeat: no-repeat; + background-size: 1.50em; + background-position: 0.25em center; + background-color: transparent; + padding: 0.25em; + padding-left: 2.50em; + width: 100%; + max-width: none; + border: 0; + box-sizing: border-box; +} + +.quickconnect-button { + clear: both; + float: right; + margin-right: 0.75em; + font-size: 0.75em; + padding: 0.25em; +} + +.quickconnect-list-item { + vertical-align: middle; + align-content: center; + display: flex +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/templates/quickconnectField.html b/extensions/guacamole-auth-quickconnect/src/main/resources/templates/quickconnectField.html new file mode 100644 index 0000000..9762a99 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/templates/quickconnectField.html @@ -0,0 +1,11 @@ + +
+
+ + + +
+
+ +
+
diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ca.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ca.json new file mode 100644 index 0000000..8a55ac9 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ca.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Connecta’t", + + "ERROR_INVALID_URI" : "Especificació URI no vàlida", + "ERROR_NO_HOST" : "No s'ha especificat l'amfitrió", + "ERROR_NO_PROTOCOL" : "No s'ha especificat protocol", + "ERROR_NOT_ABSOLUTE_URI" : "L'URI no és absolut", + + "FIELD_PLACEHOLDER_URI" : "Introduïu l'URI de connexió" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/de.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/de.json new file mode 100644 index 0000000..48c9125 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/de.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Verbinden", + + "ERROR_INVALID_URI" : "Ungültige URI angegeben", + "ERROR_NO_HOST" : "Keinen Host angegeben", + "ERROR_NO_PROTOCOL" : "Kein Protokoll angegeben", + "ERROR_NOT_ABSOLUTE_URI" : "URI ist nicht absolut", + + "FIELD_PLACEHOLDER_URI" : "URI der Verbindung eingeben" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/en.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/en.json new file mode 100644 index 0000000..50ffb2d --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/en.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Connect", + + "ERROR_INVALID_URI" : "Invalid URI Specified", + "ERROR_NO_HOST" : "No host specified", + "ERROR_NO_PROTOCOL" : "No protocol specified", + "ERROR_NOT_ABSOLUTE_URI" : "URI is not absolute", + + "FIELD_PLACEHOLDER_URI" : "Enter Connection URI" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/fr.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/fr.json new file mode 100644 index 0000000..7bfe51b --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/fr.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Connecter", + + "ERROR_INVALID_URI" : "L'URI spécifiée est invalide", + "ERROR_NO_HOST" : "Pas d'hôte spécifié", + "ERROR_NO_PROTOCOL" : "Pas de protocole spécifié", + "ERROR_NOT_ABSOLUTE_URI" : "L'URI n'est pas absolue", + + "FIELD_PLACEHOLDER_URI" : "Entrez l'URI de connexion" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/it.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/it.json new file mode 100644 index 0000000..bb99a77 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/it.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Collegare", + + "ERROR_INVALID_URI" : "URI specificato non valido", + "ERROR_NO_HOST" : "Nessun host specificato", + "ERROR_NO_PROTOCOL" : "Nessun protocollo specificato", + "ERROR_NOT_ABSOLUTE_URI" : "L'URI non è assoluto", + + "FIELD_PLACEHOLDER_URI" : "Immettere l'URI di connessione" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ja.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ja.json new file mode 100644 index 0000000..4d44d4b --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ja.json @@ -0,0 +1,14 @@ +{ + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "接続", + + "ERROR_INVALID_URI" : "URIが無効です", + "ERROR_NO_HOST" : "ホストが指定されていません", + "ERROR_NO_PROTOCOL" : "プロトコルが指定されていません", + "ERROR_NOT_ABSOLUTE_URI" : "絶対URIで指定してください", + + "FIELD_PLACEHOLDER_URI" : "接続するURIを入力" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ko.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ko.json new file mode 100644 index 0000000..2763402 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ko.json @@ -0,0 +1,13 @@ +{ + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "연결", + + "ERROR_INVALID_URI" : "잘못된 URI 지정", + "ERROR_NO_HOST" : "지정된 호스트 없음", + "ERROR_NO_PROTOCOL" : "지정된 프로토콜 없음", + "ERROR_NOT_ABSOLUTE_URI" : "URL이 절대 경로가 아님", + + "FIELD_PLACEHOLDER_URI" : "연결 URI 입력" + } +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/pl.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/pl.json new file mode 100644 index 0000000..e213f94 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/pl.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Połącz", + + "ERROR_INVALID_URI" : "Podano nieprawidłowy URI", + "ERROR_NO_HOST" : "Nie podano hosta", + "ERROR_NO_PROTOCOL" : "Nie podano protokołu", + "ERROR_NOT_ABSOLUTE_URI" : "Adres URI nie jest absolutny", + + "FIELD_PLACEHOLDER_URI" : "Podaj URI Połączenia" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/pt.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/pt.json new file mode 100644 index 0000000..76610b4 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/pt.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Conectar", + + "ERROR_INVALID_URI" : "URI especificada é inválida", + "ERROR_NO_HOST" : "Nenhum host especificado", + "ERROR_NO_PROTOCOL" : "Nenhum protocol especificado", + "ERROR_NOT_ABSOLUTE_URI" : "URI não é absoluta", + + "FIELD_PLACEHOLDER_URI" : "Digite a conexão URI" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ru.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ru.json new file mode 100644 index 0000000..91aa843 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/ru.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "QuickConnect" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "Подключиться", + + "ERROR_INVALID_URI" : "Указан неверный адрес URI", + "ERROR_NO_HOST" : "Не указан сервер", + "ERROR_NO_PROTOCOL" : "Не указан протокол", + "ERROR_NOT_ABSOLUTE_URI" : "Адрес URI не является абсолютным", + + "FIELD_PLACEHOLDER_URI" : "Введите адрес URI для подключения" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/main/resources/translations/zh.json b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/zh.json new file mode 100644 index 0000000..c214de0 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/main/resources/translations/zh.json @@ -0,0 +1,18 @@ +{ + + "DATA_SOURCE_QUICKCONNECT" : { + "NAME" : "快速连接" + }, + + "QUICKCONNECT" : { + "ACTION_CONNECT" : "连接", + + "ERROR_INVALID_URI" : "指定的URI无效", + "ERROR_NO_HOST" : "未指定主机", + "ERROR_NO_PROTOCOL" : "未指定协议", + "ERROR_NOT_ABSOLUTE_URI" : "不是绝对URI地址", + + "FIELD_PLACEHOLDER_URI" : "输入连接URI" + } + +} diff --git a/extensions/guacamole-auth-quickconnect/src/test/java/org/apache/guacamole/auth/quickconnect/utility/QCParserTest.java b/extensions/guacamole-auth-quickconnect/src/test/java/org/apache/guacamole/auth/quickconnect/utility/QCParserTest.java new file mode 100644 index 0000000..2b7bf78 --- /dev/null +++ b/extensions/guacamole-auth-quickconnect/src/test/java/org/apache/guacamole/auth/quickconnect/utility/QCParserTest.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.quickconnect.utility; + +import java.util.Arrays; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +/** + * Class to test methods in the QCParser utility class. + */ +public class QCParserTest { + + /** + * Verify that the getConfiguration() method returns the expected + * GuacamoleConfiguration object. + * + * @throws GuacamoleException + * If the configuration cannot be parsed from the given URI or Java + * unexpectedly lacks UTF-8 support. + */ + @Test + public void testGetConfiguration() throws GuacamoleException { + + // Initialize the parser, first with no lists so all parameters are allowed + QCParser parser = new QCParser(); + + // Create some empty objects to test + GuacamoleConfiguration guacConfig; + String uri; + + // Test a standard SSH URI, with username and password, and parameters and values + uri = "ssh://guacuser:guacpassword@hostname1.domain.local/?param1=value1¶m2=value2"; + guacConfig = parser.getConfiguration(uri); + assertEquals("ssh", guacConfig.getProtocol()); + assertEquals("hostname1.domain.local", guacConfig.getParameter("hostname")); + assertEquals("guacuser", guacConfig.getParameter("username")); + assertEquals("guacpassword", guacConfig.getParameter("password")); + assertEquals("value1", guacConfig.getParameter("param1")); + assertEquals("value2", guacConfig.getParameter("param2")); + + // Test a standard RDP URI, with username/password and a parameter/value pair. + uri = "rdp://domain%5cguacuser:adPassword123@windows1.domain.tld/?enable-sftp=true"; + guacConfig = parser.getConfiguration(uri); + assertEquals("rdp", guacConfig.getProtocol()); + assertEquals("windows1.domain.tld", guacConfig.getParameter("hostname")); + assertEquals("domain\\guacuser", guacConfig.getParameter("username")); + assertEquals("adPassword123", guacConfig.getParameter("password")); + assertEquals("true", guacConfig.getParameter("enable-sftp")); + + // Test a VNC URI with no parameters/values + uri = "vnc://mirror1.example.com:5910/"; + guacConfig = parser.getConfiguration(uri); + assertEquals("vnc", guacConfig.getProtocol()); + assertEquals("mirror1.example.com", guacConfig.getParameter("hostname")); + assertEquals("5910", guacConfig.getParameter("port")); + + // Test a telnet URI with no parameters/values + uri = "telnet://old1.example.com:23/"; + guacConfig = parser.getConfiguration(uri); + assertEquals("telnet", guacConfig.getProtocol()); + assertEquals("old1.example.com", guacConfig.getParameter("hostname")); + assertEquals("23", guacConfig.getParameter("port")); + + // Re-initialize parser with only allowed parameters, and test + parser = new QCParser(Arrays.asList("hostname", "username", "password", "port"), Collections.emptyList()); + uri = "rdp://domain%5cguacuser:adPassword123@windows1.domain.tld/?enable-sftp=true"; + guacConfig = parser.getConfiguration(uri); + assertEquals("rdp", guacConfig.getProtocol()); + assertEquals("windows1.domain.tld", guacConfig.getParameter("hostname")); + assertEquals("domain\\guacuser", guacConfig.getParameter("username")); + assertEquals("adPassword123", guacConfig.getParameter("password")); + assertNull(guacConfig.getParameter("enable-sftp")); + + // Re-initialize parser with denied parameters, and test + parser = new QCParser(Collections.emptyList(), Arrays.asList("password")); + uri = "rdp://domain%5cguacuser:adPassword123@windows1.domain.tld/?enable-sftp=true"; + guacConfig = parser.getConfiguration(uri); + assertEquals("rdp", guacConfig.getProtocol()); + assertEquals("windows1.domain.tld", guacConfig.getParameter("hostname")); + assertEquals("domain\\guacuser", guacConfig.getParameter("username")); + assertNull(guacConfig.getParameter("password")); + assertEquals("true", guacConfig.getParameter("enable-sftp")); + + // Re-initialize parser with both allowed and denied parameters, and test + parser = new QCParser(Arrays.asList("hostname", "username", "password", "port"), Arrays.asList("password")); + uri = "rdp://domain%5cguacuser:adPassword123@windows1.domain.tld/?enable-sftp=true"; + guacConfig = parser.getConfiguration(uri); + assertEquals("rdp", guacConfig.getProtocol()); + assertEquals("windows1.domain.tld", guacConfig.getParameter("hostname")); + assertEquals("domain\\guacuser", guacConfig.getParameter("username")); + assertNull(guacConfig.getParameter("password")); + assertNull(guacConfig.getParameter("enable-sftp")); + + } + +} diff --git a/extensions/guacamole-auth-radius/.gitignore b/extensions/guacamole-auth-radius/.gitignore new file mode 100644 index 0000000..1de9633 --- /dev/null +++ b/extensions/guacamole-auth-radius/.gitignore @@ -0,0 +1,3 @@ +src/main/resources/generated/ +target/ +*~ diff --git a/extensions/guacamole-auth-radius/.ratignore b/extensions/guacamole-auth-radius/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-radius/pom.xml b/extensions/guacamole-auth-radius/pom.xml new file mode 100644 index 0000000..b518981 --- /dev/null +++ b/extensions/guacamole-auth-radius/pom.xml @@ -0,0 +1,201 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-radius + jar + 1.6.0 + guacamole-auth-radius + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + + com.keithbranton.mojo + angular-maven-plugin + 0.3.4 + + + generate-resources + + html2js + + + + + ${basedir}/src/main/resources + **/*.html + ${basedir}/src/main/resources/generated/templates-main/templates.js + app/ext/radius + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + radius.js + + + license.txt + + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.guava + guava + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + net.jradius + jradius-core + 1.1.5 + + + + + commons-logging + commons-logging + + + commons-collections + commons-collections + + + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + + + + + + net.jradius + jradius-dictionary + 1.1.5 + + + + + net.jradius + jradius-extended + 1.1.5 + + + + + commons-logging + commons-logging + 1.2 + + + commons-collections + commons-collections + 3.2.2 + + + + + diff --git a/extensions/guacamole-auth-radius/src/main/assembly/dist.xml b/extensions/guacamole-auth-radius/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/AuthenticationProviderService.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/AuthenticationProviderService.java new file mode 100644 index 0000000..8568ced --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/AuthenticationProviderService.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius; + +import com.google.common.io.BaseEncoding; +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Arrays; +import org.apache.guacamole.auth.radius.user.AuthenticatedUser; +import org.apache.guacamole.auth.radius.form.GuacamoleRadiusChallenge; +import org.apache.guacamole.auth.radius.form.RadiusStateField; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import net.jradius.dictionary.Attr_State; +import net.jradius.dictionary.Attr_ReplyMessage; +import net.jradius.packet.RadiusPacket; +import net.jradius.packet.AccessAccept; +import net.jradius.packet.AccessChallenge; +import net.jradius.packet.AccessReject; +import net.jradius.packet.attribute.RadiusAttribute; +import org.apache.guacamole.form.PasswordField; + +/** + * Service providing convenience functions for the RADIUS AuthenticationProvider + * implementation. + */ +public class AuthenticationProviderService { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(AuthenticationProviderService.class); + + /** + * The name of the password field where the user will enter a response to + * the RADIUS challenge. + */ + private static final String CHALLENGE_RESPONSE_PARAM = "radiusChallenge"; + + /** + * Service for creating and managing connections to RADIUS servers. + */ + @Inject + private RadiusConnectionService radiusService; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * Returns an object containing the challenge message and the expected + * credentials from a RADIUS challenge, or null if either state or reply + * attributes are missing from the challenge. + * + * @param challengePacket + * The AccessChallenge RadiusPacket received from the RADIUS + * server. + * + * @return + * A GuacamoleRadiusChallenge object that contains the challenge message + * sent by the RADIUS server and the expected credentials that should + * be requested of the user in order to continue authentication. One + * of the expected credentials *must* be the RADIUS state. If either + * state or the reply are missing from the challenge this method will + * return null. + */ + private GuacamoleRadiusChallenge getRadiusChallenge(RadiusPacket challengePacket) { + + // Try to get the state attribute - if it's not there, we have a problem + RadiusAttribute stateAttr = challengePacket.findAttribute(Attr_State.TYPE); + if (stateAttr == null) { + logger.error("Something went wrong, state attribute not present."); + logger.debug("State Attribute turned up null, which shouldn't happen in AccessChallenge."); + return null; + } + + // We need to get the reply message so we know what to ask the user + RadiusAttribute replyAttr = challengePacket.findAttribute(Attr_ReplyMessage.TYPE); + if (replyAttr == null) { + logger.error("No reply message received from the server."); + logger.debug("Expecting a Attr_ReplyMessage attribute on this packet, and did not get one."); + return null; + } + + // We have the required attributes - convert to strings and then generate the additional login box/field + String replyMsg = replyAttr.getValue().toString(); + String radiusState = BaseEncoding.base16().encode(stateAttr.getValue().getBytes()); + Field radiusResponseField = new PasswordField(CHALLENGE_RESPONSE_PARAM); + Field radiusStateField = new RadiusStateField(radiusState); + + // Return the GuacamoleRadiusChallenge object that has the state + // and the expected response. + return new GuacamoleRadiusChallenge(replyMsg, + new CredentialsInfo(Arrays.asList(radiusResponseField, + radiusStateField))); + } + + /** + * Returns an AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * An AuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @throws GuacamoleException + * If an error occurs while authenticating the user, or if access is + * denied. + */ + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Ignore anonymous users + if (credentials.getUsername() == null || credentials.getUsername().isEmpty()) + return null; + + // Password is required + if (credentials.getPassword() == null || credentials.getPassword().isEmpty()) + return null; + + // Grab HTTP request object and a response to a challenge. + String challengeResponse = credentials.getParameter(CHALLENGE_RESPONSE_PARAM); + + // RadiusPacket object to store response from server. + RadiusPacket radPack; + + // No challenge response, proceed with username/password authentication. + if (challengeResponse == null) { + + try { + radPack = radiusService.authenticate(credentials.getUsername(), + credentials.getPassword(), + credentials.getRemoteAddress(), + null); + } + catch (GuacamoleException e) { + logger.error("Cannot configure RADIUS server: {}", e.getMessage()); + logger.debug("Error configuring RADIUS server.", e); + throw new GuacamoleInvalidCredentialsException("Authentication error.", CredentialsInfo.USERNAME_PASSWORD); + } + } + + // This is a response to a previous challenge, authenticate with that. + else { + try { + String stateString = credentials.getParameter(RadiusStateField.PARAMETER_NAME); + if (stateString == null) { + logger.warn("Expected state parameter was not present in challenge/response."); + throw new GuacamoleInvalidCredentialsException("Authentication error.", CredentialsInfo.USERNAME_PASSWORD); + } + + byte[] stateBytes = BaseEncoding.base16().decode(stateString); + radPack = radiusService.sendChallengeResponse(credentials.getUsername(), + challengeResponse, + credentials.getRemoteAddress(), + stateBytes); + } + catch (IllegalArgumentException e) { + logger.warn("Illegal hexadecimal value while parsing RADIUS state string: {}", e.getMessage()); + logger.debug("Encountered exception while attempting to parse the hexidecimal state value.", e); + throw new GuacamoleInvalidCredentialsException("Authentication error.", CredentialsInfo.USERNAME_PASSWORD); + } + catch (GuacamoleException e) { + logger.error("Cannot configure RADIUS server: {}", e.getMessage()); + logger.debug("Error configuring RADIUS server.", e); + throw new GuacamoleInvalidCredentialsException("Authentication error.", CredentialsInfo.USERNAME_PASSWORD); + } + } + + // No RadiusPacket is returned, we've encountered an error. + if (radPack == null) { + logger.debug("Nothing in the RADIUS packet."); + throw new GuacamoleInvalidCredentialsException("Authentication error.", CredentialsInfo.USERNAME_PASSWORD); + } + + // Received AccessReject packet, login is denied. + else if (radPack instanceof AccessReject) { + logger.debug("Login has been rejected by RADIUS server."); + throw new GuacamoleInvalidCredentialsException("Authentication failed.", CredentialsInfo.USERNAME_PASSWORD); + } + + // Received AccessAccept, authentication has succeeded + else if (radPack instanceof AccessAccept) { + AuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(credentials); + return authenticatedUser; + } + + // Received AccessChallenge packet, more credentials required to complete authentication + else if (radPack instanceof AccessChallenge) { + GuacamoleRadiusChallenge challenge = getRadiusChallenge(radPack); + + if (challenge == null) + throw new GuacamoleInvalidCredentialsException("Authentication error.", CredentialsInfo.USERNAME_PASSWORD); + + throw new GuacamoleInsufficientCredentialsException( + challenge.getChallengeText(), + challenge.getExpectedCredentials()); + } + + // Something unanticipated happened, so panic and go back to login. + else { + logger.error("Unexpected failure authenticating with RADIUS server."); + throw new GuacamoleInvalidCredentialsException("Unknown error trying to authenticate.", CredentialsInfo.USERNAME_PASSWORD); + } + + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java new file mode 100644 index 0000000..49d84bb --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius; + + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Allows users to be authenticated against an RADIUS server. Each user may have + * any number of authorized configurations. Authorized configurations may be + * shared. + */ +public class RadiusAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * Injector which will manage the object graph of this authentication + * provider. + */ + private final Injector injector; + + /** + * Creates a new RadiusAuthenticationProvider that authenticates users + * against an RADIUS service. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public RadiusAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + injector = Guice.createInjector( + new RadiusAuthenticationProviderModule(this) + ); + + } + + @Override + public String getIdentifier() { + return "radius"; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { + + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.authenticateUser(credentials); + + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProviderModule.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProviderModule.java new file mode 100644 index 0000000..82b9c40 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProviderModule.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius; + +import com.google.inject.AbstractModule; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.Security; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.radius.conf.ConfigurationService; +import org.apache.guacamole.auth.radius.conf.RadiusAuthenticationProtocol; +import org.apache.guacamole.auth.radius.conf.RadiusGuacamoleProperties; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +/** + * Guice module which configures RADIUS-specific injections. + */ +public class RadiusAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the RadiusAuthenticationProvider on behalf of which this + * module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new RADIUS authentication provider module which configures + * injection for the RadiusAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public RadiusAuthenticationProviderModule(AuthenticationProvider authProvider) + throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Check for MD4 requirement + RadiusAuthenticationProtocol authProtocol = environment.getProperty(RadiusGuacamoleProperties.RADIUS_AUTH_PROTOCOL); + RadiusAuthenticationProtocol innerProtocol = environment.getProperty(RadiusGuacamoleProperties.RADIUS_EAP_TTLS_INNER_PROTOCOL); + if (authProtocol == RadiusAuthenticationProtocol.MSCHAP_V1 + || authProtocol == RadiusAuthenticationProtocol.MSCHAP_V2 + || innerProtocol == RadiusAuthenticationProtocol.MSCHAP_V1 + || innerProtocol == RadiusAuthenticationProtocol.MSCHAP_V2) { + + try { + MessageDigest.getInstance("MD4"); + } + catch (NoSuchAlgorithmException e) { + Security.addProvider(new BouncyCastleProvider()); + } + + } + + // Store associated auth provider + this.authProvider = authProvider; + + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind RADIUS-specific services + bind(ConfigurationService.class); + bind(RadiusConnectionService.class); + + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusConnectionService.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusConnectionService.java new file mode 100644 index 0000000..800e451 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusConnectionService.java @@ -0,0 +1,315 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius; + +import com.google.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.security.NoSuchAlgorithmException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.radius.conf.ConfigurationService; +import org.apache.guacamole.auth.radius.conf.RadiusAuthenticationProtocol; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import net.jradius.client.RadiusClient; +import net.jradius.dictionary.Attr_CleartextPassword; +import net.jradius.dictionary.Attr_ClientIPAddress; +import net.jradius.dictionary.Attr_NASIPAddress; +import net.jradius.dictionary.Attr_NASPortType; +import net.jradius.dictionary.Attr_ReplyMessage; +import net.jradius.dictionary.Attr_State; +import net.jradius.dictionary.Attr_UserName; +import net.jradius.dictionary.Attr_UserPassword; +import net.jradius.exception.RadiusException; +import net.jradius.packet.RadiusPacket; +import net.jradius.packet.AccessRequest; +import net.jradius.packet.attribute.AttributeList; +import net.jradius.client.auth.EAPTLSAuthenticator; +import net.jradius.client.auth.EAPTTLSAuthenticator; +import net.jradius.client.auth.RadiusAuthenticator; +import net.jradius.packet.attribute.AttributeFactory; +import net.jradius.packet.AccessChallenge; +import net.jradius.packet.RadiusResponse; + +/** + * Service for creating and managing connections to RADIUS servers. + */ +public class RadiusConnectionService { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(RadiusConnectionService.class); + + /** + * Service for retrieving RADIUS server configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Creates a new instance of RadiusClient, configured with parameters + * from guacamole.properties. + * + * @return + * A RadiusClient instance, configured with server, shared secret, + * ports, and timeout, as configured in guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs while parsing guacamole.properties, or if the + * configuration of RadiusClient fails. + */ + private RadiusClient createRadiusConnection() throws GuacamoleException { + + // Create the RADIUS client with the configuration parameters + try { + return new RadiusClient(InetAddress.getByName(confService.getRadiusServer()), + confService.getRadiusSharedSecret(), + confService.getRadiusAuthPort(), + confService.getRadiusAcctPort(), + confService.getRadiusTimeout()); + } + catch (UnknownHostException e) { + logger.debug("Failed to resolve host.", e); + throw new GuacamoleServerException("Unable to resolve RADIUS server host.", e); + } + catch (IOException e) { + logger.debug("Failed to communicate with host.", e); + throw new GuacamoleServerException("Failed to communicate with RADIUS server.", e); + } + + } + + /** + * Creates a new instance of RadiusAuthenticator, configured with + * parameters specified within guacamole.properties. + * + * @return + * A new RadiusAuthenticator instance which has been configured + * with parameters from guacamole.properties. + * + * @throws GuacamoleException + * If the configuration cannot be read or the inner protocol is + * not configured when the client is set up for a tunneled + * RADIUS connection. + */ + private RadiusAuthenticator getRadiusAuthenticator() throws GuacamoleException { + + RadiusAuthenticator radAuth = confService.getRadiusAuthProtocol().getAuthenticator(); + + // If we're using any of the TLS protocols, we need to configure them + if (radAuth instanceof EAPTLSAuthenticator) { + + EAPTLSAuthenticator tlsAuth = (EAPTLSAuthenticator) radAuth; + + // If provided, use the configured certificate authority for + // validating the connection to the RADIUS server + File caFile = confService.getRadiusCAFile(); + if (caFile != null) { + tlsAuth.setCaFile(caFile.toString()); + tlsAuth.setCaFileType(confService.getRadiusCAType()); + String caPassword = confService.getRadiusCAPassword(); + if (caPassword != null) + tlsAuth.setCaPassword(caPassword); + } + + // Use configured password for unlocking the RADIUS private key, + // if specified + String keyPassword = confService.getRadiusKeyPassword(); + if (keyPassword != null) + tlsAuth.setKeyPassword(keyPassword); + + // Use configured RADIUS certificate and private key (always + // required for TLS-based protocols) + File keyFile = confService.getRadiusKeyFile(); + tlsAuth.setKeyFile(keyFile.toString()); + tlsAuth.setKeyFileType(confService.getRadiusKeyType()); + tlsAuth.setTrustAll(confService.getRadiusTrustAll()); + + } + + // If we're using EAP-TTLS, we need to define tunneled protocol + if (radAuth instanceof EAPTTLSAuthenticator) { + RadiusAuthenticationProtocol innerProtocol = confService.getRadiusEAPTTLSInnerProtocol(); + ((EAPTTLSAuthenticator)radAuth).setInnerProtocol(innerProtocol.JRADIUS_PROTOCOL_NAME); + } + + return radAuth; + + } + + /** + * Authenticate to the RADIUS server using existing state and a response + * + * @param username + * The username for the authentication + * + * @param secret + * The secret, usually a password or challenge response, to send + * to authenticate to the RADIUS server. + * + * @param clientAddress + * The IP address of the client, if known, which will be set in as + * the RADIUS client address. + * + * @param state + * The previous state of the RADIUS connection + * + * @return + * A RadiusPacket with the response of the server. + * + * @throws GuacamoleException + * If an error occurs while talking to the server. + */ + public RadiusPacket authenticate(String username, String secret, + String clientAddress, byte[] state) + throws GuacamoleException { + + // If a username wasn't passed, we quit + if (username == null || username.isEmpty()) { + logger.warn("Anonymous access not allowed with RADIUS client."); + return null; + } + + // If secret wasn't passed, we quit + if (secret == null || secret.isEmpty()) { + logger.warn("Password/secret required for RADIUS authentication."); + return null; + } + + // Create the RADIUS connection and set up the dictionary + RadiusClient radiusClient = createRadiusConnection(); + AttributeFactory.loadAttributeDictionary("net.jradius.dictionary.AttributeDictionaryImpl"); + + // Set up the RadiusAuthenticator + RadiusAuthenticator radAuth = getRadiusAuthenticator(); + + // Add attributes to the connection and send the packet + try { + AttributeList radAttrs = new AttributeList(); + radAttrs.add(new Attr_UserName(username)); + radAttrs.add(new Attr_ClientIPAddress(InetAddress.getByName(clientAddress))); + radAttrs.add(new Attr_NASIPAddress(confService.getRadiusNasIp())); + radAttrs.add(new Attr_NASPortType(Attr_NASPortType.Virtual)); + if (state != null && state.length > 0) + radAttrs.add(new Attr_State(state)); + radAttrs.add(new Attr_UserPassword(secret)); + radAttrs.add(new Attr_CleartextPassword(secret)); + + AccessRequest radAcc = new AccessRequest(radiusClient); + + // EAP-TTLS tunnels protected attributes inside the TLS layer + if (radAuth instanceof EAPTTLSAuthenticator) { + radAuth.setUsername(new Attr_UserName(username)); + ((EAPTTLSAuthenticator)radAuth).setTunneledAttributes(radAttrs); + } + else + radAcc.addAttributes(radAttrs); + + radAuth.setupRequest(radiusClient, radAcc); + radAuth.processRequest(radAcc); + RadiusResponse reply = radiusClient.sendReceive(radAcc, + confService.getRadiusMaxRetries()); + + // We receive a Challenge not asking for user input, so silently process the challenge + while((reply instanceof AccessChallenge) + && (reply.findAttribute(Attr_ReplyMessage.TYPE) == null)) { + + radAuth.processChallenge(radAcc, reply); + reply = radiusClient.sendReceive(radAcc, + confService.getRadiusMaxRetries()); + + } + + return reply; + + } + catch (RadiusException e) { + logger.error("Unable to complete authentication.", e.getMessage()); + logger.debug("Authentication with RADIUS failed.", e); + return null; + } + catch (NoSuchAlgorithmException e) { + logger.error("No such RADIUS algorithm: {}", e.getMessage()); + logger.debug("Unknown RADIUS algorithm.", e); + return null; + } + catch (UnknownHostException e) { + logger.error("Could not resolve address: {}", e.getMessage()); + logger.debug("Exception resolving host address.", e); + return null; + } + finally { + radiusClient.close(); + } + } + + /** + * Send a challenge response to the RADIUS server by validating the input and + * then sending it along to the authenticate method. + * + * @param username + * The username to send to the RADIUS server for authentication. + * + * @param response + * The response phrase to send to the RADIUS server in response to the + * challenge previously provided. + * + * @param clientAddress + * The IP address of the client, if known, which will be set in as + * the RADIUS client address. + * + * @param state + * The state data provided by the RADIUS server in order to continue + * the RADIUS conversation. + * + * @return + * A RadiusPacket containing the server's response to the authentication + * attempt. + * + * @throws GuacamoleException + * If an error is encountered trying to talk to the RADIUS server. + */ + public RadiusPacket sendChallengeResponse(String username, String response, + String clientAddress, byte[] state) throws GuacamoleException { + + if (username == null || username.isEmpty()) { + logger.error("Challenge/response to RADIUS requires a username."); + return null; + } + + if (state == null || state.length == 0) { + logger.error("Challenge/response to RADIUS requires a prior state."); + return null; + } + + if (response == null || response.isEmpty()) { + logger.error("Challenge/response to RADIUS requires a response."); + return null; + } + + return authenticate(username, response, clientAddress, state); + + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/ConfigurationService.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/ConfigurationService.java new file mode 100644 index 0000000..78738ed --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/ConfigurationService.java @@ -0,0 +1,366 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius.conf; + +import com.google.inject.Inject; +import java.io.File; +import java.net.InetAddress; +import java.net.UnknownHostException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; + +/** + * Service for retrieving configuration information regarding the RADIUS server. + */ +public class ConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns the hostname of the RADIUS server as configured with + * guacamole.properties. By default, this will be "localhost". + * + * @return + * The hostname of the RADIUS server, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getRadiusServer() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_HOSTNAME, + "localhost" + ); + } + + /** + * Returns the UDP port that will be used to communicate authentication + * and authorization information to the RADIUS server, as configured in + * guacamole.properties. By default this will be 1812. + * + * @return + * The authentication port of the RADIUS server, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getRadiusAuthPort() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_AUTH_PORT, + 1812 + ); + } + + /** + * Returns the UDP port that will be used to communicate accounting + * information to the RADIUS server, as configured in + * guacamole.properties. The default is 1813. + * + * @return + * The accouting port of the RADIUS server, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getRadiusAcctPort() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_ACCT_PORT, + 1813 + ); + } + + /** + * Returns the shared secret used to communicate with the RADIUS server, + * as configured in guacamole.properties. This must match the value + * in the RADIUS server configuration. + * + * @return + * The shared secret of the RADIUS server, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getRadiusSharedSecret() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_SHARED_SECRET + ); + } + + /** + * Returns the authentication protocol Guacamole should use when + * communicating with the RADIUS server, as configured in + * guacamole.properties. This must match the configuration + * of the RADIUS server, so that the RADIUS server and Guacamole + * client are "speaking the same language." + * + * @return + * The authentication protocol of the RADIUS server, + * from guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public RadiusAuthenticationProtocol getRadiusAuthProtocol() + throws GuacamoleException { + return environment.getRequiredProperty( + RadiusGuacamoleProperties.RADIUS_AUTH_PROTOCOL + ); + } + + /** + * Returns the maximum number of retries for connecting to the RADIUS server + * from guacamole.properties. The default number of retries is 5. + * + * @return + * The number of retries for connection to the RADIUS server, + * from guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getRadiusMaxRetries() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_MAX_RETRIES, + 5 + ); + } + + /** + * Returns the timeout, in seconds, for connecting to the RADIUS server + * from guacamole.properties. The default timeout is 60 seconds. + * + * @return + * The timeout, in seconds, for connection to the RADIUS server, + * from guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getRadiusTimeout() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_TIMEOUT, + 60 + ); + } + + /** + * Returns the CA file for validating certificates for encrypted + * connections to the RADIUS server, as configured in + * guacamole.properties. + * + * @return + * The file name for the CA file for validating + * RADIUS server certificates + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public File getRadiusCAFile() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_CA_FILE, + new File(environment.getGuacamoleHome(), "ca.crt") + ); + } + + /** + * Returns the key file for the client for creating encrypted + * connections to RADIUS servers as specified in + * guacamole.properties. By default a file called radius.pem + * is used. + * + * @return + * The file name for the client certificate/key pair + * for making encrypted RADIUS connections. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public File getRadiusKeyFile() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_KEY_FILE, + new File(environment.getGuacamoleHome(), "radius.key") + ); + } + + /** + * Returns the password for the CA file, if it is + * password-protected, as configured in guacamole.properties. + * + * @return + * The password for the CA file + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getRadiusCAPassword() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_CA_PASSWORD + ); + } + + /** + * Returns the type of store that the CA file represents + * so that it can be correctly processed by the RADIUS + * library, as configured in guacamole.properties. By + * default the pem type is used. + * + * @return + * The type of store that the CA file is encoded + * as, as configured in guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getRadiusCAType() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_CA_TYPE, + "pem" + ); + } + + /** + * Returns the password for the key file, if it is + * password-protected, as configured in guacamole.properties. + * + * @return + * The password for the key file + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getRadiusKeyPassword() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_KEY_PASSWORD + ); + } + + /** + * Returns the type of store that the key file represents + * so that it can be correctly processed by the RADIUS + * library, as configured in guacamole.properties. By + * default the pem type is used. + * + * @return + * The type of store that the key file is encoded + * as, as configured in guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getRadiusKeyType() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_KEY_TYPE, + "pem" + ); + } + + /** + * Returns the boolean value of whether or not the + * RADIUS library should trust all server certificates + * or should validate them against known CA certificates, + * as configured in guacamole.properties. By default + * this is false, indicating that server certificates + * must be validated against a known good CA. + * + * @return + * True if the RADIUS client should trust all + * server certificates; false if it should + * validate against known good CA certificates. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public Boolean getRadiusTrustAll() throws GuacamoleException { + return environment.getProperty( + RadiusGuacamoleProperties.RADIUS_TRUST_ALL, + false + ); + } + + /** + * Returns the tunneled protocol that RADIUS should use + * when the authentication protocol is set to EAP-TTLS, as + * configured in the guacamole.properties file. + * + * @return + * The tunneled protocol that should be used inside + * an EAP-TTLS RADIUS connection. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if EAP-TTLS is specified + * as the inner protocol. + */ + public RadiusAuthenticationProtocol getRadiusEAPTTLSInnerProtocol() + throws GuacamoleException { + + RadiusAuthenticationProtocol authProtocol = environment.getRequiredProperty( + RadiusGuacamoleProperties.RADIUS_EAP_TTLS_INNER_PROTOCOL + ); + + if (authProtocol == RadiusAuthenticationProtocol.EAP_TTLS) + throw new GuacamoleServerException("Invalid inner protocol specified for EAP-TTLS."); + + return authProtocol; + + } + + /** + * Returns the InetAddress containing the NAS IP address that should be + * used to identify this RADIUS client when communicating with the RADIUS + * server. If no explicit configuration of this property is defined + * in guacamole.properties, it falls back to attempting to determine the + * IP address using Java's built-in mechanisms for querying local addresses. + * + * @return + * The InetAddress corresponding to the NAS IP address specified in + * guacamole.properties, or the IP determined by querying the address + * of the server on which Guacamole is running. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the InetAddress + * for the NAS IP cannot be read or determined from the system. + */ + public InetAddress getRadiusNasIp() throws GuacamoleException { + try { + String nasIpStr = environment.getProperty(RadiusGuacamoleProperties.RADIUS_NAS_IP); + + // If property is specified and non-empty, attempt to return converted address. + if (nasIpStr != null && !nasIpStr.isEmpty()) + return InetAddress.getByName(nasIpStr); + + // By default, return the address of the server. + return InetAddress.getLocalHost(); + + } + catch (UnknownHostException e) { + throw new GuacamoleServerException("Unknown host specified for NAS IP.", e); + } + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/RadiusAuthenticationProtocol.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/RadiusAuthenticationProtocol.java new file mode 100644 index 0000000..4db2959 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/RadiusAuthenticationProtocol.java @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius.conf; + +import net.jradius.client.RadiusClient; +import net.jradius.client.auth.CHAPAuthenticator; +import net.jradius.client.auth.EAPMD5Authenticator; +import net.jradius.client.auth.EAPTLSAuthenticator; +import net.jradius.client.auth.EAPTTLSAuthenticator; +import net.jradius.client.auth.MSCHAPv1Authenticator; +import net.jradius.client.auth.MSCHAPv2Authenticator; +import net.jradius.client.auth.PAPAuthenticator; +import net.jradius.client.auth.RadiusAuthenticator; +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * This enum represents supported RADIUS authentication protocols for + * the guacamole-auth-radius extension. + */ +public enum RadiusAuthenticationProtocol { + + /** + * Password Authentication Protocol (PAP). + */ + @PropertyValue("pap") + PAP(PAPAuthenticator.NAME), + + /** + * Challenge-Handshake Authentication Protocol (CHAP). + */ + @PropertyValue("chap") + CHAP(CHAPAuthenticator.NAME), + + /** + * Microsoft implementation of CHAP, Version 1 (MS-CHAPv1). + */ + @PropertyValue("mschapv1") + MSCHAP_V1(MSCHAPv1Authenticator.NAME), + + /** + * Microsoft implementation of CHAP, Version 2 (MS-CHAPv2). + */ + @PropertyValue("mschapv2") + MSCHAP_V2(MSCHAPv2Authenticator.NAME), + + /** + * Extensible Authentication Protocol (EAP) with MD5 Hashing (EAP-MD5). + */ + @PropertyValue("eap-md5") + EAP_MD5(EAPMD5Authenticator.NAME), + + /** + * Extensible Authentication Protocol (EAP) with TLS encryption (EAP-TLS). + */ + @PropertyValue("eap-tls") + EAP_TLS(EAPTLSAuthenticator.NAME), + + /** + * Extensible Authentication Protocol (EAP) with Tunneled TLS (EAP-TTLS). + */ + @PropertyValue("eap-ttls") + EAP_TTLS(EAPTTLSAuthenticator.NAME); + + /** + * The unique name of the JRadius {@link RadiusAuthenticator} that + * implements this protocol. + */ + public final String JRADIUS_PROTOCOL_NAME; + + /** + * Creates a new RadiusAuthenticationProtocol associated with the given + * JRadius protocol name. + * + * @param protocolName + * The unique name of the JRadius {@link RadiusAuthenticator} that + * implements this protocol. + */ + RadiusAuthenticationProtocol(String protocolName) { + this.JRADIUS_PROTOCOL_NAME = protocolName; + } + + /** + * Returns a new instance of the JRadius {@link RadiusAuthenticator} that + * implements this protocol. This function will never return null. + * + * @return + * A new instance of the JRadius {@link RadiusAuthenticator} that + * implements this protocol. + * + * @throws IllegalStateException + * If a bug within the JRadius library prevents retrieval of the + * authenticator for a protocol that is known to be supported. + */ + public RadiusAuthenticator getAuthenticator() throws IllegalStateException { + + // As we are using JRadius' own NAME constants for retrieving + // authenticator instances, the retrieval operation should always + // succeed except in the case of a bug within the JRadius library + RadiusAuthenticator authenticator = RadiusClient.getAuthProtocol(JRADIUS_PROTOCOL_NAME); + if (authenticator == null) + throw new IllegalStateException(String.format("JRadius failed " + +"to locate its own support for protocol \"%s\". This is " + + "likely a bug in the JRadius library.", + JRADIUS_PROTOCOL_NAME)); + + return authenticator; + + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/RadiusGuacamoleProperties.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/RadiusGuacamoleProperties.java new file mode 100644 index 0000000..19200e1 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/conf/RadiusGuacamoleProperties.java @@ -0,0 +1,208 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius.conf; + +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.FileGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; + + +/** + * Provides properties required for use of the RADIUS authentication provider. + * These properties will be read from guacamole.properties when the RADIUS + * authentication provider is used. + */ +public class RadiusGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private RadiusGuacamoleProperties() {} + + /** + * The port on the RADIUS server to connect to when authenticating users. + */ + public static final IntegerGuacamoleProperty RADIUS_AUTH_PORT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "radius-auth-port"; } + + }; + + /** + * The port on the server to connect to when performing RADIUS accounting. + */ + public static final IntegerGuacamoleProperty RADIUS_ACCT_PORT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "radius-acct-port"; } + + }; + + + /** + * The hostname or IP address of the RADIUS server to connect to when authenticating users. + */ + public static final StringGuacamoleProperty RADIUS_HOSTNAME = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-hostname"; } + + }; + + /** + * The shared secret to use when connecting to the RADIUS server. + */ + public static final StringGuacamoleProperty RADIUS_SHARED_SECRET = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-shared-secret"; } + + }; + + /** + * The authentication protocol of the RADIUS server to connect to when authenticating users. + */ + public static final EnumGuacamoleProperty RADIUS_AUTH_PROTOCOL = + new EnumGuacamoleProperty(RadiusAuthenticationProtocol.class) { + + @Override + public String getName() { return "radius-auth-protocol"; } + + }; + + /** + * The maximum number of retries when attempting a RADIUS packet transaction. + */ + public static final IntegerGuacamoleProperty RADIUS_MAX_RETRIES = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "radius-max-retries"; } + + }; + + /** + * The network timeout, in seconds, when attempting a RADIUS packet transaction. + */ + public static final IntegerGuacamoleProperty RADIUS_TIMEOUT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "radius-timeout"; } + + }; + + /** + * The CA file to use to validate RADIUS server certificates. + */ + public static final FileGuacamoleProperty RADIUS_CA_FILE = new FileGuacamoleProperty() { + + @Override + public String getName() { return "radius-ca-file"; } + + }; + + /** + * The type of file the RADIUS CA file is (PEM, PKCS12, DER). + */ + public static final StringGuacamoleProperty RADIUS_CA_TYPE = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-ca-type"; } + + }; + + /** + * The password for the CA file. + */ + public static final StringGuacamoleProperty RADIUS_CA_PASSWORD = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-ca-password"; } + + }; + + /** + * The file that stores the key/certificate pair to use for the RADIUS client connection. + */ + public static final FileGuacamoleProperty RADIUS_KEY_FILE = new FileGuacamoleProperty() { + + @Override + public String getName() { return "radius-key-file"; } + + }; + + /** + * The type of file the RADIUS key file is (PEM, PKCS12, DER). + */ + public static final StringGuacamoleProperty RADIUS_KEY_TYPE = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-key-type"; } + + }; + + /** + * The password for the key file. + */ + public static final StringGuacamoleProperty RADIUS_KEY_PASSWORD = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-key-password"; } + + }; + + /** + * Whether or not to trust all RADIUS server certificates. + */ + public static final BooleanGuacamoleProperty RADIUS_TRUST_ALL = new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "radius-trust-all"; } + + }; + + /** + * The tunneled protocol to use inside a RADIUS EAP-TTLS connection. + */ + public static final EnumGuacamoleProperty RADIUS_EAP_TTLS_INNER_PROTOCOL = + new EnumGuacamoleProperty(RadiusAuthenticationProtocol.class) { + + @Override + public String getName() { return "radius-eap-ttls-inner-protocol"; } + + }; + + /** + * Manually configure the NAS IP address that the RADIUS client will pass + * to the server when requesting authentication. Normally this is automatically + * determined by gathering the IP address of the system on which Guacamole + * is running; however, there are certain scenarios (as in running in a + * Docker container) where specifying this manually may be useful. + */ + public static final StringGuacamoleProperty RADIUS_NAS_IP = new StringGuacamoleProperty() { + + @Override + public String getName() { return "radius-nas-ip"; } + + }; + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/form/GuacamoleRadiusChallenge.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/form/GuacamoleRadiusChallenge.java new file mode 100644 index 0000000..4589794 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/form/GuacamoleRadiusChallenge.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius.form; + +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; + +/** + * Stores the RADIUS challenge message and expected credentials in a single + * object. + */ +public class GuacamoleRadiusChallenge { + + /** + * The challenge text sent by the RADIUS server. + */ + private final String challengeText; + + /** + * The expected credentials that need to be provided to satisfy the + * RADIUS authentication challenge. + */ + private final CredentialsInfo expectedCredentials; + + /** + * Creates a new GuacamoleRadiusChallenge object with the provided + * challenge message and expected credentials. + * + * @param challengeText + * The challenge message sent by the RADIUS server. + * + * @param expectedCredentials + * The credentials required to complete the challenge. + */ + public GuacamoleRadiusChallenge(String challengeText, + CredentialsInfo expectedCredentials) { + this.challengeText = challengeText; + this.expectedCredentials = expectedCredentials; + } + + /** + * Returns the challenge message provided by the RADIUS server. + * + * @return + * The challenge message provided by the RADIUS server. + */ + public String getChallengeText() { + return challengeText; + } + + /** + * Returns the credentials required to satisfy the RADIUS challenge. + * + * @return + * The credentials required to satisfy the RADIUS challenge. + */ + public CredentialsInfo getExpectedCredentials() { + return expectedCredentials; + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/form/RadiusStateField.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/form/RadiusStateField.java new file mode 100644 index 0000000..201df2c --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/form/RadiusStateField.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius.form; + +import org.apache.guacamole.form.Field; + +/** + * The invisible field that stores the state of the RADIUS + * connection. The state is simply a placeholder that helps + * the client and server pick back up the conversation + * at the correct spot during challenge/response. + */ +public class RadiusStateField extends Field { + + /** + * The parameter returned by the RADIUS state. + */ + public static final String PARAMETER_NAME = "guac-radius-state"; + + /** + * The type of field to initialize for the state. + */ + private static final String RADIUS_FIELD_TYPE = "GUAC_RADIUS_STATE"; + + /** + * The state of the connection passed by the previous RADIUS attempt. + */ + private final String radiusState; + + /** + * Initialize the field with the state returned by the RADIUS server. + * + * @param radiusState + * The state returned by the RADIUS server. + */ + public RadiusStateField(String radiusState) { + super(PARAMETER_NAME, RADIUS_FIELD_TYPE); + this.radiusState = radiusState; + + } + + /** + * Get the state provided by the RADIUS server. + * + * @return + * The state provided by the RADIUS server. + */ + public String getRadiusState() { + return radiusState; + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/user/AuthenticatedUser.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/user/AuthenticatedUser.java new file mode 100644 index 0000000..0a7a2e0 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/user/AuthenticatedUser.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.radius.user; + +import com.google.inject.Inject; +import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An RADIUS-specific implementation of AuthenticatedUser, associating a + * particular set of credentials with the RADIUS authentication provider. + */ +public class AuthenticatedUser extends AbstractAuthenticatedUser { + + /** + * Reference to the authentication provider associated with this + * authenticated user. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * The credentials provided when this user was authenticated. + */ + private Credentials credentials; + + /** + * Initializes this AuthenticatedUser using the given credentials. + * + * @param credentials + * The credentials provided when this user was authenticated. + */ + public void init(Credentials credentials) { + this.credentials = credentials; + setIdentifier(credentials.getUsername()); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/config/radiusConfig.js b/extensions/guacamole-auth-radius/src/main/resources/config/radiusConfig.js new file mode 100644 index 0000000..a3d72bf --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/config/radiusConfig.js @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Config block which registers Radius-specific field types. + */ +angular.module('guacRadius').config(['formServiceProvider', + function guacRadiusConfig(formServiceProvider) { + + // Define the hidden field for the RADIUS state + formServiceProvider.registerFieldType('GUAC_RADIUS_STATE', { + module : 'guacRadius', + controller : 'radiusStateController', + templateUrl : 'app/ext/radius/templates/radiusStateField.html' + }); + +}]); diff --git a/extensions/guacamole-auth-radius/src/main/resources/controllers/radiusStateController.js b/extensions/guacamole-auth-radius/src/main/resources/controllers/radiusStateController.js new file mode 100644 index 0000000..fb956ab --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/controllers/radiusStateController.js @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Controller for the "GUAC_RADIUS_STATE" field which is used to pass + * the RADIUS server state to maintain the session with the RADIUS + * server. + */ +angular.module('guacRadius').controller('radiusStateController', ['$scope', '$injector', + function radiusStateController($scope, $injector) { + + // Populate the hidden field for the connection state + $scope.model = $scope.field.radiusState; + +}]); diff --git a/extensions/guacamole-auth-radius/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-radius/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..0f70eb0 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/guac-manifest.json @@ -0,0 +1,29 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "RADIUS Authentication Backend", + "namespace" : "radius", + + "authProviders" : [ + "org.apache.guacamole.auth.radius.RadiusAuthenticationProvider" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/ja.json", + "translations/ru.json", + "translations/zh.json" + ], + + "js" : [ + "radius.min.js" + ], + + "resources" : { + "templates/radiusStateField.html" : "text/html" + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/license.txt b/extensions/guacamole-auth-radius/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-radius/src/main/resources/radiusModule.js b/extensions/guacamole-auth-radius/src/main/resources/radiusModule.js new file mode 100644 index 0000000..7d6c0f3 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/radiusModule.js @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module which provides handling for RADIUS challenge-response + * authentication. + */ +angular.module('guacRadius', [ + 'form' +]); + +// Ensure the guacRadius module is loaded along with the rest of the app +angular.module('index').requires.push('guacRadius'); diff --git a/extensions/guacamole-auth-radius/src/main/resources/templates/radiusStateField.html b/extensions/guacamole-auth-radius/src/main/resources/templates/radiusStateField.html new file mode 100644 index 0000000..e72924c --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/templates/radiusStateField.html @@ -0,0 +1 @@ + diff --git a/extensions/guacamole-auth-radius/src/main/resources/translations/ca.json b/extensions/guacamole-auth-radius/src/main/resources/translations/ca.json new file mode 100644 index 0000000..1ba2623 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/translations/ca.json @@ -0,0 +1,12 @@ +{ + + "DATA_SOURCE_RADIUS" : { + "NAME" : "RADIUS Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_RADIUS_STATE" : "", + "FIELD_HEADER_RADIUSCHALLENGE" : "" + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/translations/de.json b/extensions/guacamole-auth-radius/src/main/resources/translations/de.json new file mode 100644 index 0000000..0950f66 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/translations/de.json @@ -0,0 +1,13 @@ +{ + + "DATA_SOURCE_RADIUS" : { + "NAME" : "RADIUS Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_RADIUS_CHALLENGE_RESPONSE" : "", + "FIELD_HEADER_GUAC_RADIUS_STATE" : "", + "INFO_RADIUS_ADDL_REQUIRED" : "Bitte zusätzliche Logindaten eingeben." + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/translations/en.json b/extensions/guacamole-auth-radius/src/main/resources/translations/en.json new file mode 100644 index 0000000..1ba2623 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/translations/en.json @@ -0,0 +1,12 @@ +{ + + "DATA_SOURCE_RADIUS" : { + "NAME" : "RADIUS Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_RADIUS_STATE" : "", + "FIELD_HEADER_RADIUSCHALLENGE" : "" + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/translations/ja.json b/extensions/guacamole-auth-radius/src/main/resources/translations/ja.json new file mode 100644 index 0000000..584f31b --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/translations/ja.json @@ -0,0 +1,7 @@ +{ + + "LOGIN" : { + "INFO_RADIUS_ADDL_REQUIRED" : "追加の認証情報を入力してください" + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/translations/ru.json b/extensions/guacamole-auth-radius/src/main/resources/translations/ru.json new file mode 100644 index 0000000..8c922d8 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/translations/ru.json @@ -0,0 +1,7 @@ +{ + + "DATA_SOURCE_RADIUS" : { + "NAME" : "Бэкенд RADIUS" + } + +} diff --git a/extensions/guacamole-auth-radius/src/main/resources/translations/zh.json b/extensions/guacamole-auth-radius/src/main/resources/translations/zh.json new file mode 100644 index 0000000..6f697b8 --- /dev/null +++ b/extensions/guacamole-auth-radius/src/main/resources/translations/zh.json @@ -0,0 +1,12 @@ +{ + + "DATA_SOURCE_RADIUS" : { + "NAME" : "RADIUS后端" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_RADIUS_STATE" : "", + "FIELD_HEADER_RADIUSCHALLENGE" : "" + } + +} diff --git a/extensions/guacamole-auth-restrict/.gitignore b/extensions/guacamole-auth-restrict/.gitignore new file mode 100644 index 0000000..1de9633 --- /dev/null +++ b/extensions/guacamole-auth-restrict/.gitignore @@ -0,0 +1,3 @@ +src/main/resources/generated/ +target/ +*~ diff --git a/extensions/guacamole-auth-restrict/.ratignore b/extensions/guacamole-auth-restrict/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-restrict/pom.xml b/extensions/guacamole-auth-restrict/pom.xml new file mode 100644 index 0000000..0fcf35e --- /dev/null +++ b/extensions/guacamole-auth-restrict/pom.xml @@ -0,0 +1,178 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-restrict + jar + 1.6.0 + guacamole-auth-restrict + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + + com.keithbranton.mojo + angular-maven-plugin + 0.3.4 + + + generate-resources + + html2js + + + + + ${basedir}/src/main/resources + **/*.html + ${basedir}/src/main/resources/generated/templates-main/templates.js + app/ext/restrict + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + restrict.css + + + license.txt + + + + **/*.css + + + / + / + restrict.js + + + license.txt + + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.guava + guava + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + junit + junit + test + + + + + javax.ws.rs + javax.ws.rs-api + 2.0 + provided + + + + + com.github.seancfoley + ipaddress + provided + + + + + diff --git a/extensions/guacamole-auth-restrict/src/main/assembly/dist.xml b/extensions/guacamole-auth-restrict/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/Restrictable.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/Restrictable.java new file mode 100644 index 0000000..5feb214 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/Restrictable.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.auth.restrict; + +import org.apache.guacamole.calendar.RestrictionType; +import org.apache.guacamole.net.auth.Attributes; + +/** + * An interface which defines methods that apply to items that can have + * restrictions applied to them. + */ +public interface Restrictable extends Attributes { + + /** + * The name of the attribute that contains the absolute date and time after + * which this restrictable object may be used. If this attribute is present + * access to to this object will be denied at any time prior to the parsed + * value of this attribute, regardless of what other restrictions may be + * present to allow access to the object at certain days/times of the week + * or from certain hosts. + */ + public static final String RESTRICT_TIME_AFTER_ATTRIBUTE_NAME = "guac-restrict-time-after"; + + /** + * The name of the attribute that contains a list of weekdays and times (UTC) + * that this restrictable object can be used. The presence of values within + * this attribute will automatically restrict use of the object at any times + * that are not specified. + */ + public static final String RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME = "guac-restrict-time-allowed"; + + /** + * The name of the attribute that contains the absolute date and time before + * which use of this restrictable object may be used. If this attribute is + * present use of the object will be denied at any time after the parsed + * value of this attribute, regardless of the presence of other restrictions + * that may allow access at certain days/times of the week or from certain + * hosts. + */ + public static final String RESTRICT_TIME_BEFORE_ATTRIBUTE_NAME = "guac-restrict-time-before"; + + /** + * The name of the attribute that contains a list of weekdays and times (UTC) + * that this restrictable object cannot be used. Denied times will always take + * precedence over allowed times. The presence of this attribute without + * guac-restrict-time-allowed will deny access only during the times listed + * in this attribute, allowing access at all other times. The presence of + * this attribute along with the guac-restrict-time-allowed attribute will + * deny access at any times that overlap with the allowed times. + */ + public static final String RESTRICT_TIME_DENIED_ATTRIBUTE_NAME = "guac-restrict-time-denied"; + + /** + * The name of the attribute that contains a list of hosts from which this + * restrictable object may be used. The presence of this attribute will + * restrict use to only users accessing Guacamole from the list of hosts + * contained in the attribute, subject to further restriction by the + * guac-restrict-hosts-denied attribute. + */ + public static final String RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME = "guac-restrict-hosts-allowed"; + + /** + * The name of the attribute that contains a list of hosts from which this + * restrictable object may not be used. The presence of this attribute, + * absent the guac-restrict-hosts-allowed attribute, will allow use from + * all hosts except the ones listed in this attribute. The presence of this + * attribute coupled with the guac-restrict-hosts-allowed attribute will + * block access from any IPs in this list, overriding any that may be + * allowed. + */ + public static final String RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME = "guac-restrict-hosts-denied"; + + /** + * Return the restriction state for this restrictable object at the + * current date and time. By default returns an implicit denial. + * + * @return + * The restriction status for the current date and time. + */ + default public RestrictionType getCurrentTimeRestriction() { + return RestrictionType.IMPLICIT_DENY; + } + + /** + * Return the restriction state for this restrictable object for the host + * from which the current user is logged in. By default returns an implicit + * denial. + * + * @return + * The restriction status for the host from which the current user is + * logged in. + */ + default public RestrictionType getCurrentHostRestriction() { + return RestrictionType.IMPLICIT_DENY; + } + + /** + * Returns true if the current item is available based on the restrictions + * for the given implementation of this interface, or false if the item is + * not currently available. The default implementation checks current time + * and host restrictions, allowing if both those restrictions allow access. + * + * @return + * true if the item is available, otherwise false. + */ + default public boolean isAvailable() { + return (getCurrentTimeRestriction().isAllowed() && getCurrentHostRestriction().isAllowed()); + } + +} \ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/RestrictionAuthenticationProvider.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/RestrictionAuthenticationProvider.java new file mode 100644 index 0000000..ec62364 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/RestrictionAuthenticationProvider.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.restrict.user.RestrictedUserContext; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * AuthenticationProvider implementation which provides additional restrictions + * for users, groups of users, connections, and connection groups, allowing + * administrators to further control access to Guacamole resources. + */ +public class RestrictionAuthenticationProvider extends AbstractAuthenticationProvider { + + @Override + public String getIdentifier() { + return "restrict"; + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + + String remoteAddress = credentials.getRemoteAddress(); + + // Verify identity of user + RestrictionVerificationService.verifyLoginRestrictions(context, + authenticatedUser.getEffectiveUserGroups(), remoteAddress); + + // User has been verified, and authentication should be allowed to + // continue + return new RestrictedUserContext(context, remoteAddress, + authenticatedUser.getEffectiveUserGroups()); + + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/RestrictionVerificationService.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/RestrictionVerificationService.java new file mode 100644 index 0000000..ae20936 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/RestrictionVerificationService.java @@ -0,0 +1,617 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict; + +import inet.ipaddr.HostName; +import inet.ipaddr.HostNameException; +import inet.ipaddr.IPAddress; +import java.net.UnknownHostException; +import java.text.ParseException; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.restrict.form.DateTimeRestrictionField; +import org.apache.guacamole.calendar.DailyRestriction; +import org.apache.guacamole.calendar.RestrictionType; +import org.apache.guacamole.calendar.TimeRestrictionParser; +import org.apache.guacamole.host.HostRestrictionParser; +import org.apache.guacamole.language.TranslatableGuacamoleSecurityException; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for verifying additional user login restrictions against a given + * login attempt. + */ +public class RestrictionVerificationService { + + /** + * Logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(RestrictionVerificationService.class); + + /** + * Given the provided strings of an absolute date after which an action is + * valid and before which an action is valid, parse the strings into Date + * objects and determine if the current date and time falls within the + * provided window, returning the appropriate restriction type. + * + * @param afterTimeString + * The string that has the date and time value after which the activity + * is allowed. + * + * @param beforeTimeString + * The string that has the date and time value before which the activity + * is allowed. + * + * @return + * The RestrictionType that represents the allowed or denied state of + * the activity. + */ + private static RestrictionType allowedByDateTimeRestrictions( + String afterTimeString, String beforeTimeString) { + + // Set a default restriction. + RestrictionType dateTimeRestriction = RestrictionType.IMPLICIT_ALLOW; + + // Check the after string and make sure that now is after that date. + if (afterTimeString != null && !afterTimeString.isEmpty()) { + Date now = new Date(); + try { + Date afterTime = DateTimeRestrictionField.parse(afterTimeString); + if (now.before(afterTime)) + return RestrictionType.EXPLICIT_DENY; + } + catch (ParseException e) { + LOGGER.warn("Failed to parse date and time string: {}:", e.getMessage()); + LOGGER.debug("Parse exception while parsing date and time string.", e); + return RestrictionType.IMPLICIT_DENY; + } + dateTimeRestriction = RestrictionType.EXPLICIT_ALLOW; + } + + // Check the before string and make sure that now is prior to that date. + if (beforeTimeString != null && !beforeTimeString.isEmpty()) { + Date now = new Date(); + try { + Date beforeTime = DateTimeRestrictionField.parse(beforeTimeString); + if (now.after(beforeTime)) + return RestrictionType.EXPLICIT_DENY; + } + catch (ParseException e) { + LOGGER.warn("Failed to parse date and time string: {}:", e.getMessage()); + LOGGER.debug("Parse exception while parsing date and time string.", e); + return RestrictionType.IMPLICIT_DENY; + } + dateTimeRestriction = RestrictionType.EXPLICIT_ALLOW; + + } + + // Return the determined RestrictionType for the given date/time strings. + return dateTimeRestriction; + } + + /** + * Parse out the provided strings of allowed and denied times, verifying + * whether or not a login or connection should be allowed at the current + * day and time, and returning the appropriate restriction type. + * + * @param allowedTimeString + * The string containing the times that should be parsed to determine if + * the login or connection should be allowed at the current time, or + * null or an empty string if there are no specific allowed times defined. + * + * @param deniedTimeString + * The string containing the times that should be parsed to determine if + * the login or connection should be denied at the current time, or null + * or an empty string if there are no specific times during which a + * action should be denied. + * + * @return + * A RestrictionType based on the provided allowed and denied strings. + */ + public static RestrictionType allowedByTimeRestrictions(String allowedTimeString, + String deniedTimeString) { + + // Check for denied entries, first, returning the explicit deny if the + // login or connection should not be allowed. + if (deniedTimeString != null && !deniedTimeString.isEmpty()) { + List deniedTimes = + TimeRestrictionParser.parseString(deniedTimeString); + + for (DailyRestriction restriction : deniedTimes) { + if (restriction.appliesNow()) + return RestrictionType.EXPLICIT_DENY; + } + } + + // If no allowed entries are present, return the implicit allow, allowing + // the login or connection to continue. + if (allowedTimeString == null || allowedTimeString.isEmpty()) + return RestrictionType.IMPLICIT_ALLOW; + + // Pull the list of allowed times. + List allowedTimes = + TimeRestrictionParser.parseString(allowedTimeString); + + // Allowed entries are present, loop through them and check for a valid time. + for (DailyRestriction restriction : allowedTimes) { + // If this time allows the login or connection return the explicit allow. + if (restriction.appliesNow()) + return RestrictionType.EXPLICIT_ALLOW; + } + + // We have allowed entries, but login hasn't matched, so implicitly deny it. + return RestrictionType.IMPLICIT_DENY; + + } + + /** + * Given the strings of allowed and denied hosts, verify that the login or + * connection should be allowed from the given remote address, returning + * the RestrictionType that matches the provided allowed and denied strings. + * + * @param allowedHostsString + * The string containing a semicolon-separated list of hosts from + * which the login or connection should be allowed, or null or an empty + * string if no specific set of allowed hosts is defined. + * + * @param deniedHostsString + * The string containing a semicolon-separated list of hosts from + * which the login or connection should be denied, or null or an empty + * string if no specific set of denied hosts is defined. + * + * @param remoteAddress + * The IP address from which the user is logging in or has logged in + * and is attempting to connect from, if it is known. If it is unknown + * and restrictions are defined, the login or connection will be denied. + * + * @return + * A RestrictionType that matches the provided allow and deny strings. + */ + public static RestrictionType allowedByHostRestrictions(String allowedHostsString, + String deniedHostsString, String remoteAddress) { + + // If attributes do not exist or are empty then the action is allowed. + if ((allowedHostsString == null || allowedHostsString.isEmpty()) + && (deniedHostsString == null || deniedHostsString.isEmpty())) + return RestrictionType.IMPLICIT_ALLOW; + + // If the remote address cannot be determined, and restrictions are + // in effect, log an error and deny the action. + if (remoteAddress == null || remoteAddress.isEmpty()) { + LOGGER.warn("Host-based restrictions are present, but the remote " + + "address is invalid or could not be resolved. " + + "The action will not be allowed."); + return RestrictionType.IMPLICIT_DENY; + } + + // Convert the string to a HostName + HostName remoteHostName = new HostName(remoteAddress); + + // Split denied hosts attribute and process each entry, checking them + // against the current remote address, and returning a deny restriction + // if a match is found, or if an error occurs in processing a host in + // the list. + List deniedHosts = HostRestrictionParser.parseHostList(deniedHostsString); + for (HostName hostName : deniedHosts) { + + try { + if (hostName.isAddress() + && hostName.toAddress().contains(remoteHostName.asAddress())) { + return RestrictionType.EXPLICIT_DENY; + } + + else { + for (IPAddress currAddr : hostName.toAllAddresses()) + if (currAddr.matches(remoteHostName.asAddressString())) + return RestrictionType.EXPLICIT_DENY; + } + } + catch (UnknownHostException | HostNameException e) { + LOGGER.warn("Unknown or invalid host in denied hosts list: \"{}\"", hostName); + LOGGER.debug("Exception while trying to resolve host: \"{}\"", hostName, e); + return RestrictionType.IMPLICIT_DENY; + } + } + + // If denied hosts have been checked and allowed hosts are empty, we're + // good, and can allow the action. + if (allowedHostsString == null || allowedHostsString.isEmpty()) + return RestrictionType.IMPLICIT_ALLOW; + + // Run through allowed hosts, if there are any, and return, allowing the + // action if there are any matches. + List allowedHosts = HostRestrictionParser.parseHostList(allowedHostsString); + for (HostName hostName : allowedHosts) { + try { + // If the entry is an IP or Subnet, check the remote address against it directly + if (hostName.isAddress() && hostName.toAddress().contains(remoteHostName.asAddress())) + return RestrictionType.EXPLICIT_ALLOW; + + // Entry is a hostname, so resolve to IPs and check each one + for (IPAddress currAddr : hostName.toAllAddresses()) + if (currAddr.matches(remoteHostName.asAddressString())) + return RestrictionType.EXPLICIT_ALLOW; + + } + // If an entry cannot be resolved we will log a warning. + catch (UnknownHostException | HostNameException e) { + LOGGER.warn("Unknown host encountered in allowed host string: {}", hostName); + LOGGER.debug("Exception received trying to resolve host: {}", hostName, e); + } + } + + // If we've made it here, the allowed hosts do not contain the remote + // address, and the action should not be allowed; + return RestrictionType.IMPLICIT_DENY; + + } + + /** + * Verify the host restrictions for the user associated with the given + * UserContext, throwing an exception if any of the restrictions result + * in the user not being allowed to be logged in to Guacamole from this + * host. + * + * @param context + * The UserContext associated with the user who is being verified. + * + * @param effectiveUserGroups + * The set of identifiers of groups of which the user who is being + * verified is a member. + * + * @param remoteAddress + * The remote address of the client from which the current user is + * logged in. + * + * @throws GuacamoleException + * If the restrictions on the user should prevent the user from + * logging in from the current client, or if an error occurs attempting + * to retrieve permissions. + */ + public static void verifyHostRestrictions(UserContext context, + Set effectiveUserGroups, String remoteAddress) + throws GuacamoleException { + + // Get the current user + User currentUser = context.self(); + + // Admins always have access. + if (currentUser.getEffectivePermissions().getSystemPermissions().hasPermission(SystemPermission.Type.ADMINISTER)) { + LOGGER.warn("User \"{}\" has System Administration permissions; additional restrictions will be bypassed.", + currentUser.getIdentifier()); + return; + } + + // Get user's attributes + Map userAttributes = currentUser.getAttributes(); + + // Verify host-based restrictions specific to the user + String allowedHostString = userAttributes.get(Restrictable.RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME); + String deniedHostString = userAttributes.get(Restrictable.RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME); + RestrictionType hostRestrictionResult = allowedByHostRestrictions(allowedHostString, deniedHostString, remoteAddress); + + switch (hostRestrictionResult) { + // User-level explicit deny overrides everything + case EXPLICIT_DENY: + throw new TranslatableInvalidHostLoginException("User \"" + + currentUser.getIdentifier() + +"\" is not allowed to log in from \"" + + remoteAddress + "\"", + "RESTRICT.ERROR_USER_LOGIN_NOT_ALLOWED_FROM_HOST" + ); + + // User-level explicit allow means the user is allowed. + case EXPLICIT_ALLOW: + return; + + } + + // Gather user's effective groups. + Collection userGroups = context + .getPrivileged() + .getUserGroupDirectory() + .getAll(effectiveUserGroups); + + // Loop user's effective groups and verify restrictions + for (UserGroup userGroup : userGroups) { + + // Get group's attributes + Map grpAttributes = userGroup.getAttributes(); + + // Pull host-based restrictions for this group and verify + String grpAllowedHostString = grpAttributes.get(Restrictable.RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME); + String grpDeniedHostString = grpAttributes.get(Restrictable.RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME); + RestrictionType grpRestrictionResult = allowedByHostRestrictions(grpAllowedHostString, grpDeniedHostString, remoteAddress); + + // Any explicit denials are thrown immediately + if (grpRestrictionResult == RestrictionType.EXPLICIT_DENY) + throw new TranslatableInvalidHostLoginException("User \"" + + currentUser.getIdentifier() + + "\" is not allowed to log in from host \"" + + remoteAddress + + "\" due to restrictions on group \"" + + userGroup.getIdentifier() + "\".", + "RESTRICT.ERROR_USER_LOGIN_NOT_ALLOWED_FROM_HOST" + ); + + // Compare the two, returning the highest-priority restriction so far. + hostRestrictionResult = RestrictionType.getHigherPriority(hostRestrictionResult, grpRestrictionResult); + + } + + // Check the result and log allowed + switch (hostRestrictionResult) { + // Explicit allow was the highest result, so we log it and return, allowing the user to be logged in. + case EXPLICIT_ALLOW: + return; + + // Implicit allow was the highest result, so we log it and return, allowing the user to be logged in. + case IMPLICIT_ALLOW: + return; + } + + // If we reach, here, we've reached an implict deny, so we throw an exception. + throw new TranslatableInvalidHostLoginException("User \"" + + currentUser.getIdentifier() + + "\" is implicitly denied at this time.", + "RESTRICT.ERROR_USER_LOGIN_NOT_ALLOWED_FROM_HOST" + ); + + } + + /** + * Verify the host-based restrictions of the Connection, throwing an + * exception if the Connection should be allowed from the host from which + * the user is logged in. + * + * @param restrictable + * The Restrictable object that should be verified against host restrictions. + * + * @param remoteAddress + * The remote address of the client from which the current user is + * logged in. + * + * @throws GuacamoleException + * If the connection should not be allowed from the remote host from + * which the user is logged in. + */ + public static void verifyHostRestrictions(Restrictable restrictable, + String remoteAddress) throws GuacamoleException { + + // Verify time-based restrictions specific to this connection. + String allowedHostsString = restrictable.getAttributes().get(Restrictable.RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME); + String deniedHostsString = restrictable.getAttributes().get(Restrictable.RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME); + RestrictionType hostRestrictionResult = allowedByHostRestrictions(allowedHostsString, deniedHostsString, remoteAddress); + + // If the host is not allowed + if (!hostRestrictionResult.isAllowed()) + throw new TranslatableGuacamoleSecurityException( + "Use of this connection is not allowed from this remote host: \"" + remoteAddress + "\".", + "RESTRICT.ERROR_CONNECTION_NOT_ALLOWED_NOW" + ); + + } + + /** + * Verifies the time restrictions for this extension and whether or not the + * account should be allowed to be logged in to Guacamole at the current + * day and time, throwing an exception if any of the restrictions result + * in a violation of the time constraints of the account. + * + * @param context + * The UserContext of the user whose access to Guacamole is being + * checked. + * + * @param effectiveUserGroups + * The set of identifiers of groups of which the user who is being + * verified is a member. + * + * @throws GuacamoleException + * If any of the time constraints configured for the user result in the + * user not being allowed to be logged in to Guacamole, or if errors + * occur trying to retrieve permissions or attributes. + */ + public static void verifyTimeRestrictions(UserContext context, + Set effectiveUserGroups) throws GuacamoleException { + + // Retrieve the current User object associated with the UserContext + User currentUser = context.self(); + + // Admins always have access. + if (currentUser.getEffectivePermissions().getSystemPermissions().hasPermission(SystemPermission.Type.ADMINISTER)) { + LOGGER.warn("User \"{}\" has System Administration permissions; additional restrictions will be bypassed.", + currentUser.getIdentifier()); + return; + } + + // Get user's attributes + Map userAttributes = currentUser.getAttributes(); + + // Verify time-based restrictions specific to the user + String allowedTimeString = userAttributes.get(Restrictable.RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME); + String deniedTimeString = userAttributes.get(Restrictable.RESTRICT_TIME_DENIED_ATTRIBUTE_NAME); + RestrictionType timeRestrictionResult = allowedByTimeRestrictions(allowedTimeString, deniedTimeString); + + // Check the time restriction for explicit results. + switch (timeRestrictionResult) { + // User-level explicit deny overrides everything + case EXPLICIT_DENY: + throw new TranslatableInvalidTimeLoginException("User \"" + + currentUser.getIdentifier() + + "\" is not allowed to log in at this time.", + "RESTRICT.ERROR_USER_LOGIN_NOT_ALLOWED_NOW" + ); + + // User-level explicit allow means the user is allowed. + case EXPLICIT_ALLOW: + return; + + } + + // Gather user's effective groups. + Collection userGroups = context + .getPrivileged() + .getUserGroupDirectory() + .getAll(effectiveUserGroups); + + // Loop user's effective groups and verify restrictions + for (UserGroup userGroup : userGroups) { + + // Get group's attributes + Map grpAttributes = userGroup.getAttributes(); + + // Pull time-based restrictions for this group and verify + String grpAllowedTimeString = grpAttributes.get(Restrictable.RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME); + String grpDeniedTimeString = grpAttributes.get(Restrictable.RESTRICT_TIME_DENIED_ATTRIBUTE_NAME); + RestrictionType grpRestrictionResult = allowedByTimeRestrictions(grpAllowedTimeString, grpDeniedTimeString); + + // An explicit deny results in immediate denial of the login. + if (grpRestrictionResult == RestrictionType.EXPLICIT_DENY) + throw new TranslatableInvalidTimeLoginException("User \"" + + currentUser.getIdentifier() + +"\" is not allowed to log in at this time due to restrictions on group \"" + + userGroup + "\".", + "RESTRICT.ERROR_USER_LOGIN_NOT_ALLOWED_NOW" + ); + + // Compare the two, returning the highest-priority restriction so far. + timeRestrictionResult = RestrictionType.getHigherPriority(timeRestrictionResult, grpRestrictionResult); + + } + + switch (timeRestrictionResult) { + // Explicit allow was the highest result, so we log it and return, allowing the user to be logged in. + case EXPLICIT_ALLOW: + return; + + // Implicit allow was the highest result, so we log it and return, allowing the user to be logged in. + case IMPLICIT_ALLOW: + return; + } + + // If we reach, here, we've reached an implict deny, so we throw an exception. + throw new TranslatableInvalidTimeLoginException("User \"" + + currentUser.getIdentifier() + + "\" is implicitly denied at this time.", + "RESTRICT.ERROR_USER_LOGIN_NOT_ALLOWED_NOW" + ); + + } + + public static void verifyDateTimeRestrictions(Restrictable restrictable) throws GuacamoleException { + + String afterTimeString = restrictable.getAttributes().get(Restrictable.RESTRICT_TIME_AFTER_ATTRIBUTE_NAME); + String beforeTimeString = restrictable.getAttributes().get(Restrictable.RESTRICT_TIME_BEFORE_ATTRIBUTE_NAME); + RestrictionType dateRestriction = allowedByDateTimeRestrictions(afterTimeString, beforeTimeString); + if (!dateRestriction.isAllowed()) + throw new TranslatableGuacamoleSecurityException( + "Use of this connection or connection group is not allowed at this time.", + "RESTRICT.ERROR_CONNECTION_NOT_ALLOWED_NOW" + ); + } + + /** + * Verify the time restrictions for the given Connection object, throwing + * an exception if the connection should not be allowed, or silently + * returning if the connection should be allowed. + * + * @param restrictable + * The item that supports restrictions that is to be verified against + * the current time. + * + * @throws GuacamoleException + * If the connection should not be allowed at the current time. + */ + public static void verifyTimeRestrictions(Restrictable restrictable) throws GuacamoleException { + + // Verify time-based restrictions specific to this connection. + String allowedTimeString = restrictable.getAttributes().get(Restrictable.RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME); + String deniedTimeString = restrictable.getAttributes().get(Restrictable.RESTRICT_TIME_DENIED_ATTRIBUTE_NAME); + RestrictionType timeRestriction = allowedByTimeRestrictions(allowedTimeString, deniedTimeString); + if (!timeRestriction.isAllowed()) + throw new TranslatableGuacamoleSecurityException( + "Use of this connection or connection group is not allowed at this time.", + "RESTRICT.ERROR_CONNECTION_NOT_ALLOWED_NOW" + ); + + } + + /** + * Verifies the login restrictions supported by this extension for the user + * who is attempting to log in, throwing an exception if any of the + * restrictions result in the user not being allowed to log in. + * + * @param context + * The context of the user who is attempting to log in. + * + * @param effectiveUserGroups + * The identifiers of the UserGroups of which the user who is logging + * in is a member. + * + * @param remoteAddress + * The remote address of the client from which the current user is + * logged in. + * + * @throws GuacamoleException + * If any of the restrictions should prevent the user from logging in. + */ + public static void verifyLoginRestrictions(UserContext context, + Set effectiveUserGroups, String remoteAddress) + throws GuacamoleException { + + verifyTimeRestrictions(context, effectiveUserGroups); + verifyHostRestrictions(context, effectiveUserGroups, remoteAddress); + + } + + /** + * Verifies the connection restrictions supported by this extension for the + * connection the user is attempting to access, throwing an exception if + * any of the restrictions result in the connection being unavailable. + * + * @param restrictable + * The object that supports restrictions that is to be verified to be + * usable within the current restrictions. + * + * @param remoteAddress + * The remote address of the client from which the current user is + * logged in. + * + * @throws GuacamoleException + * If any of the restrictions should prevent the connection from being + * used by the user at the current time. + */ + public static void verifyConnectionRestrictions(Restrictable restrictable, + String remoteAddress) throws GuacamoleException { + verifyDateTimeRestrictions(restrictable); + verifyTimeRestrictions(restrictable); + verifyHostRestrictions(restrictable, remoteAddress); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidHostConnectionException.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidHostConnectionException.java new file mode 100644 index 0000000..285e769 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidHostConnectionException.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict; + +import org.apache.guacamole.language.TranslatableGuacamoleSecurityException; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * An exception that represents an invalid login or connection due to + * restrictions based on the host from which the action should be allowed. + */ +public class TranslatableInvalidHostConnectionException + extends TranslatableGuacamoleSecurityException { + + /** + * The serial version ID of this class. + */ + private static final long serialVersionUID = 1L; + + /** + * Create a new host-based connection exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableInvalidHostConnectionException(String message, + TranslatableMessage translatableMessage) { + super(message, translatableMessage); + } + + /** + * Create a new host-based connection exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translationKey + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableInvalidHostConnectionException(String message, + String translationKey) { + super(message, new TranslatableMessage(translationKey)); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidHostLoginException.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidHostLoginException.java new file mode 100644 index 0000000..2277109 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidHostLoginException.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict; + +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * An exception that represents an invalid login or connection due to + * restrictions based on the host from which the action should be allowed. + */ +public class TranslatableInvalidHostLoginException + extends TranslatableGuacamoleClientException { + + /** + * The serial version ID of this class. + */ + private static final long serialVersionUID = 1L; + + /** + * Create a new host-based login exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableInvalidHostLoginException(String message, + TranslatableMessage translatableMessage) { + super(message, translatableMessage); + } + + /** + * Create a new host-based login exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translationKey + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableInvalidHostLoginException(String message, String translationKey) { + super(message, new TranslatableMessage(translationKey)); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidTimeConnectionException.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidTimeConnectionException.java new file mode 100644 index 0000000..f9158b8 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidTimeConnectionException.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict; + +import org.apache.guacamole.language.TranslatableGuacamoleSecurityException; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * An exception that represents an invalid login due to restrictions based + * on the time of day and day of week the user is allowed to log in. + */ +public class TranslatableInvalidTimeConnectionException + extends TranslatableGuacamoleSecurityException { + + /** + * The serial version ID of this class. + */ + private static final long serialVersionUID = 1L; + + /** + * Create a new time-based login exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableInvalidTimeConnectionException(String message, + TranslatableMessage translatableMessage) { + super(message, translatableMessage); + } + + /** + * Create a new time-based login exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translationKey + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableInvalidTimeConnectionException(String message, + String translationKey) { + super(message, new TranslatableMessage(translationKey)); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidTimeLoginException.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidTimeLoginException.java new file mode 100644 index 0000000..7533a85 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/TranslatableInvalidTimeLoginException.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict; + +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * An exception that represents an invalid login due to restrictions based + * on the time of day and day of week the user is allowed to log in. + */ +public class TranslatableInvalidTimeLoginException + extends TranslatableGuacamoleClientException { + + /** + * The serial version ID of this class. + */ + private static final long serialVersionUID = 1L; + + /** + * Create a new time-based login exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableInvalidTimeLoginException(String message, + TranslatableMessage translatableMessage) { + super(message, translatableMessage); + } + + /** + * Create a new time-based login exception with the given message and + * translation string that can be processed by Guacamole's translation + * service. + * + * @param message + * The non-translatable, human-readable message containing details + * of the exception. + * + * @param translationKey + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableInvalidTimeLoginException(String message, + String translationKey) { + super(message, new TranslatableMessage(translationKey)); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/connection/RestrictedConnection.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/connection/RestrictedConnection.java new file mode 100644 index 0000000..08adee5 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/connection/RestrictedConnection.java @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.connection; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.restrict.Restrictable; +import org.apache.guacamole.auth.restrict.RestrictionVerificationService; +import org.apache.guacamole.auth.restrict.form.DateTimeRestrictionField; +import org.apache.guacamole.auth.restrict.form.HostRestrictionField; +import org.apache.guacamole.auth.restrict.form.TimeRestrictionField; +import org.apache.guacamole.calendar.RestrictionType; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.DelegatingConnection; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * A Connection implementation that wraps another connection, providing additional + * ability to control access to the connection. + */ +public class RestrictedConnection extends DelegatingConnection implements Restrictable { + + /** + * The remote address of the client from which the user logged in. + */ + private final String remoteAddress; + + /** + * The list of all connection attributes provided by this Connection implementation. + */ + public static final List RESTRICT_CONNECTION_ATTRIBUTES = Arrays.asList( + RESTRICT_TIME_AFTER_ATTRIBUTE_NAME, + RESTRICT_TIME_BEFORE_ATTRIBUTE_NAME, + RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_TIME_DENIED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME + ); + + /** + * The form containing the list of fields for the attributes provided + * by this module. + */ + public static final Form RESTRICT_CONNECTION_FORM = new Form("restrict-login-form", + Arrays.asList( + new DateTimeRestrictionField(RESTRICT_TIME_AFTER_ATTRIBUTE_NAME), + new DateTimeRestrictionField(RESTRICT_TIME_BEFORE_ATTRIBUTE_NAME), + new TimeRestrictionField(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME), + new TimeRestrictionField(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME) + ) + ); + + /** + * Wraps the given Connection object, providing capability of further + * restricting connection access beyond the default access control provided + * by other modules. + * + * @param connection + * The Connection object to wrap. + * + * @param remoteAddress + * The remote address of the client from which the current user logged + * in. + */ + public RestrictedConnection(Connection connection, String remoteAddress) { + super(connection); + this.remoteAddress = remoteAddress; + } + + /** + * Returns the original Connection object wrapped by this RestrictConnection. + * + * @return + * The wrapped Connection object. + */ + public Connection getUndecorated() { + return getDelegateConnection(); + } + + @Override + public Map getAttributes() { + + // Create independent, mutable copy of attributes + Map attributes = new HashMap<>(super.getAttributes()); + + // Loop through extension-specific attributes and add them where no + // values exist, so that they show up in the web UI. + for (String attribute : RESTRICT_CONNECTION_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value == null || value.isEmpty()) + attributes.put(attribute, null); + } + + return attributes; + + } + + @Override + public void setAttributes(Map attributes) { + + // Create independent, mutable copy of attributes + attributes = new HashMap<>(attributes); + + // Loop through extension-specific attributes, only sending ones + // that are non-null and non-empty to the underlying storage mechanism. + for (String attribute : RESTRICT_CONNECTION_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value != null && value.isEmpty()) + attributes.put(attribute, null); + } + + super.setAttributes(attributes); + + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Verify the restrictions for this connection. + RestrictionVerificationService.verifyConnectionRestrictions(this, remoteAddress); + + // Connect + return super.connect(info, tokens); + + } + + @Override + public RestrictionType getCurrentTimeRestriction() { + String allowedTimeString = getAttributes().get(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME); + String deniedTimeString = getAttributes().get(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME); + return RestrictionVerificationService.allowedByTimeRestrictions(allowedTimeString, deniedTimeString); + } + + @Override + public RestrictionType getCurrentHostRestriction() { + String allowedHostString = getAttributes().get(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME); + String deniedHostString = getAttributes().get(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME); + return RestrictionVerificationService.allowedByHostRestrictions(allowedHostString, deniedHostString, remoteAddress); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/connectiongroup/RestrictedConnectionGroup.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/connectiongroup/RestrictedConnectionGroup.java new file mode 100644 index 0000000..1f61a26 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/connectiongroup/RestrictedConnectionGroup.java @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.connectiongroup; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.restrict.Restrictable; +import org.apache.guacamole.auth.restrict.RestrictionVerificationService; +import org.apache.guacamole.auth.restrict.form.DateTimeRestrictionField; +import org.apache.guacamole.auth.restrict.form.HostRestrictionField; +import org.apache.guacamole.auth.restrict.form.TimeRestrictionField; +import org.apache.guacamole.calendar.RestrictionType; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.DelegatingConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * A ConnectionGroup implementation that wraps an existing ConnectionGroup, + * providing additional ability to control access to the ConnectionGroup. + */ +public class RestrictedConnectionGroup extends DelegatingConnectionGroup implements Restrictable { + + /** + * The remote address of the client from which the current user logged in. + */ + private final String remoteAddress; + + /** + * The list of all connection group attributes provided by this + * ConnectionGroup implementation. + */ + public static final List RESTRICT_CONNECTIONGROUP_ATTRIBUTES = Arrays.asList( + RESTRICT_TIME_AFTER_ATTRIBUTE_NAME, + RESTRICT_TIME_BEFORE_ATTRIBUTE_NAME, + RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_TIME_DENIED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME + ); + + /** + * The form containing the list of fields for the attributes provided + * by this ConnectionGroup implementation. + */ + public static final Form RESTRICT_CONNECTIONGROUP_FORM = new Form("restrict-login-form", + Arrays.asList( + new DateTimeRestrictionField(RESTRICT_TIME_AFTER_ATTRIBUTE_NAME), + new DateTimeRestrictionField(RESTRICT_TIME_BEFORE_ATTRIBUTE_NAME), + new TimeRestrictionField(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME), + new TimeRestrictionField(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME) + ) + ); + + /** + * Wraps the given ConnectionGroup object, providing capability of further + * restricting connection group access beyond the default access control + * provided by other modules. + * + * @param connectionGroup + * The ConnectionGroup object to wrap. + * + * @param remoteAddress + * The remote address of the client from which the current user logged + * in. + */ + public RestrictedConnectionGroup(ConnectionGroup connectionGroup, String remoteAddress) { + super(connectionGroup); + this.remoteAddress = remoteAddress; + } + + /** + * Returns the original ConnectionGroup object wrapped by this + * RestrictConnectionGroup. + * + * @return + * The wrapped ConnectionGroup object. + */ + public ConnectionGroup getUndecorated() { + return getDelegateConnectionGroup(); + } + + @Override + public Map getAttributes() { + + // Create independent, mutable copy of attributes + Map attributes = new HashMap<>(super.getAttributes()); + + // Loop through extension-specific attributes and add them where no + // values exist, so that they show up in the web UI. + for (String attribute : RESTRICT_CONNECTIONGROUP_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value == null || value.isEmpty()) + attributes.put(attribute, null); + } + + return attributes; + + } + + @Override + public void setAttributes(Map attributes) { + + // Create independent, mutable copy of attributes + attributes = new HashMap<>(attributes); + + // Loop through extension-specific attributes, only sending ones + // that are non-null and non-empty to the underlying storage mechanism. + for (String attribute : RESTRICT_CONNECTIONGROUP_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value != null && value.isEmpty()) + attributes.put(attribute, null); + } + + super.setAttributes(attributes); + + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Verify restrictions for this connection group. + RestrictionVerificationService.verifyConnectionRestrictions(this, remoteAddress); + + // Connect + return super.connect(info, tokens); + + } + + @Override + public RestrictionType getCurrentTimeRestriction() { + String allowedTimeString = getAttributes().get(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME); + String deniedTimeString = getAttributes().get(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME); + return RestrictionVerificationService.allowedByTimeRestrictions(allowedTimeString, deniedTimeString); + } + + @Override + public RestrictionType getCurrentHostRestriction() { + String allowedHostString = getAttributes().get(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME); + String deniedHostString = getAttributes().get(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME); + return RestrictionVerificationService.allowedByHostRestrictions(allowedHostString, deniedHostString, remoteAddress); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/DateTimeRestrictionField.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/DateTimeRestrictionField.java new file mode 100644 index 0000000..91ba572 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/DateTimeRestrictionField.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.form; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.apache.guacamole.form.Field; + +/** + * A field that parses a string containing an absolute date and time value. + */ +public class DateTimeRestrictionField extends Field { + + /** + * The field type. + */ + public static final String FIELD_TYPE = "GUAC_DATETIME_RESTRICTION"; + + /** + * The format of the data for this field as it will be stored in the + * underlying storage mechanism. + */ + public static final String FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; + + /** + * Create a new field that tracks time restrictions. + * + * @param name + * The name of the parameter that will be used to pass this field + * between the REST API and the web front-end. + * + */ + public DateTimeRestrictionField(String name) { + super(name, FIELD_TYPE); + } + + /** + * Converts the given date into a string which follows the format used by + * date fields. + * + * @param date + * The date value to format, which may be null. + * + * @return + * The formatted date, or null if the provided time was null. + */ + public static String format(Date date) { + DateFormat dateFormat = new SimpleDateFormat(DateTimeRestrictionField.FORMAT); + return date == null ? null : dateFormat.format(date); + } + + /** + * Parses the given string into a corresponding date. The string must + * follow the standard format used by date fields, as defined by FORMAT + * and as would be produced by format(). + * + * @param dateString + * The date string to parse, which may be null. + * + * @return + * The date corresponding to the given date string, or null if the + * provided date string was null or blank. + * + * @throws ParseException + * If the given date string does not conform to the standard format + * used by date fields. + */ + public static Date parse(String dateString) + throws ParseException { + + // Return null if no date provided + if (dateString == null || dateString.isEmpty()) + return null; + + // Parse date according to format + DateFormat dateFormat = new SimpleDateFormat(DateTimeRestrictionField.FORMAT); + return dateFormat.parse(dateString); + + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/HostRestrictionField.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/HostRestrictionField.java new file mode 100644 index 0000000..f89c82d --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/HostRestrictionField.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.form; + +import org.apache.guacamole.form.Field; + +/** + * A field that parses out a string of semi-colon separated hosts into + * individual entries that can be managed more easily in a web interface. + */ +public class HostRestrictionField extends Field { + + /** + * The field type. + */ + public static final String FIELD_TYPE = "GUAC_HOST_RESTRICTION"; + + /** + * Create a new field that tracks host restrictions. + * + * @param name + * The name of the parameter that will be used to pass this field + * between the REST API and the web front-end. + * + */ + public HostRestrictionField(String name) { + super(name, FIELD_TYPE); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/TimeRestrictionField.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/TimeRestrictionField.java new file mode 100644 index 0000000..e023953 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/form/TimeRestrictionField.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.form; + +import org.apache.guacamole.form.Field; + +/** + * A field that parses a string containing time restrictions into its individual + * components for user-friendly display on the web interface. + */ +public class TimeRestrictionField extends Field { + + /** + * The field type. + */ + public static final String FIELD_TYPE = "GUAC_TIME_RESTRICTION"; + + /** + * Create a new field that tracks time restrictions. + * + * @param name + * The name of the parameter that will be used to pass this field + * between the REST API and the web front-end. + * + */ + public TimeRestrictionField(String name) { + super(name, FIELD_TYPE); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/user/RestrictedUser.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/user/RestrictedUser.java new file mode 100644 index 0000000..c66032e --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/user/RestrictedUser.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.user; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.auth.restrict.Restrictable; +import org.apache.guacamole.auth.restrict.RestrictionVerificationService; +import org.apache.guacamole.auth.restrict.form.HostRestrictionField; +import org.apache.guacamole.auth.restrict.form.TimeRestrictionField; +import org.apache.guacamole.calendar.RestrictionType; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.DelegatingUser; +import org.apache.guacamole.net.auth.User; + +/** + * User implementation which wraps a User from another extension and enforces + * additional restrictions. + */ +public class RestrictedUser extends DelegatingUser implements Restrictable { + + /** + * The remote address of the client from which the current user is logged in. + */ + private final String remoteAddress; + + /** + * true if the user logged in to Guacamole has administrative privileges + * for this user object, otherwise false. + */ + private final boolean hasAdmin; + + /** + * The name of the attribute that contains a list of weekdays and times (UTC) + * that a user is allowed to log in. The presence of this attribute will + * restrict the user to logins only during the times that are contained + * within the attribute, subject to further restriction by the + * guac-restrict-time-denied attribute. + */ + public static final String RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME = "guac-restrict-time-allowed"; + + /** + * The name of the attribute that contains a list of weekdays and times (UTC) + * that a user is not allowed to log in. Denied times will always take + * precedence over allowed times. The presence of this attribute without + * guac-restrict-time-allowed will deny logins only during the times listed + * in this attribute, allowing logins at all other times. The presence of + * this attribute along with the guac-restrict-time-allowed attribute will + * deny logins at any times that overlap with the allowed times. + */ + public static final String RESTRICT_TIME_DENIED_ATTRIBUTE_NAME = "guac-restrict-time-denied"; + + /** + * The name of the attribute that contains a list of IP addresses from which + * a user is allowed to log in. The presence of this attribute will restrict + * users to only the list of IP addresses contained in the attribute, subject + * to further restriction by the guac-restrict-hosts-denied attribute. + */ + public static final String RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME = "guac-restrict-hosts-allowed"; + + /** + * The name of the attribute that contains a list of IP addresses from which + * a user is not allowed to log in. The presence of this attribute, absent + * the guac-restrict-hosts-allowed attribute, will allow logins from all + * hosts except the ones listed in this attribute. The presence of this + * attribute coupled with the guac-restrict-hosts-allowed attribute will + * block access from any IPs in this list, overriding any that may be + * allowed. + */ + public static final String RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME = "guac-restrict-hosts-denied"; + + /** + * The list of all user attributes provided by this User implementation. + */ + public static final List RESTRICT_USER_ATTRIBUTES = Arrays.asList( + RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_TIME_DENIED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME + ); + + /** + * The form containing the list of fields for the attributes provided + * by this module. + */ + public static final Form RESTRICT_LOGIN_FORM = new Form("restrict-login-form", + Arrays.asList( + new TimeRestrictionField(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME), + new TimeRestrictionField(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME) + ) + ); + + /** + * Wraps the given User object, providing capability of further restricting + * logins beyond the default restrictions provided by default modules. + * + * @param user + * The User object to wrap. + * + * @param remoteAddress + * The remote address of the client from which the current user is logged + * in. + */ + public RestrictedUser(User user, String remoteAddress, boolean hasAdmin) { + super(user); + this.remoteAddress = remoteAddress; + this.hasAdmin = hasAdmin; + } + + /** + * Returns the User object wrapped by this RestrictUser. + * + * @return + * The wrapped User object. + */ + public User getUndecorated() { + return getDelegateUser(); + } + + @Override + public Map getAttributes() { + + // Create independent, mutable copy of attributes + Map attributes = new HashMap<>(super.getAttributes()); + + // Loop through extension-specific attributes, adding ones that are + // empty so that they are displayed in the web UI. + for (String attribute : RESTRICT_USER_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value == null || value.isEmpty()) + attributes.put(attribute, null); + } + + return attributes; + + } + + @Override + public void setAttributes(Map attributes) { + + // Create independent, mutable copy of attributes + attributes = new HashMap<>(attributes); + + // Loop through extension-specific attributes, only sending ones + // that are non-null and non-empty to the underlying storage mechanism. + for (String attribute : RESTRICT_USER_ATTRIBUTES) { + + /* If the user lacks admin access, don't set restriction attributes. */ + if (!hasAdmin) { + attributes.remove(attribute); + continue; + } + + /* Replace empty values with null values. */ + String value = attributes.get(attribute); + if (value != null && value.isEmpty()) + attributes.put(attribute, null); + } + + super.setAttributes(attributes); + + } + + @Override + public RestrictionType getCurrentTimeRestriction() { + String allowedTimeString = getAttributes().get(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME); + String deniedTimeString = getAttributes().get(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME); + return RestrictionVerificationService.allowedByTimeRestrictions(allowedTimeString, deniedTimeString); + } + + @Override + public RestrictionType getCurrentHostRestriction() { + String allowedHostString = getAttributes().get(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME); + String deniedHostString = getAttributes().get(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME); + return RestrictionVerificationService.allowedByHostRestrictions(allowedHostString, deniedHostString, remoteAddress); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/user/RestrictedUserContext.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/user/RestrictedUserContext.java new file mode 100644 index 0000000..3aeed57 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/user/RestrictedUserContext.java @@ -0,0 +1,214 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.user; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.restrict.RestrictionVerificationService; +import org.apache.guacamole.auth.restrict.connection.RestrictedConnection; +import org.apache.guacamole.auth.restrict.connectiongroup.RestrictedConnectionGroup; +import org.apache.guacamole.auth.restrict.usergroup.RestrictedUserGroup; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.DecoratingDirectory; +import org.apache.guacamole.net.auth.DelegatingUserContext; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A UserContext implementation for additional login and connection restrictions + * which wraps the UserContext of some other extension. + */ +public class RestrictedUserContext extends DelegatingUserContext { + + /** + * The logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(RestrictedUserContext.class); + + /** + * The remote address from which this user logged in. + */ + private final String remoteAddress; + + /** + * The identifiers effective groups of the user associated with this context. + */ + private final Set effectiveUserGroups; + + /** + * Creates a new RestrictedUserContext which wraps the given UserContext, + * providing additional control for user logins and connections. + * + * @param userContext + * The UserContext to wrap. + * + * @param remoteAddress + * The address the user is logging in from, if known. + * + * @param effectiveUserGroups + * The identifiers of the groups this user is associated with. + */ + public RestrictedUserContext(UserContext userContext, String remoteAddress, + Set effectiveUserGroups) { + super(userContext); + this.remoteAddress = remoteAddress; + this.effectiveUserGroups = effectiveUserGroups; + } + + @Override + public Directory getConnectionDirectory() throws GuacamoleException { + return new DecoratingDirectory(super.getConnectionDirectory()) { + + @Override + protected Connection decorate(Connection object) throws GuacamoleException { + return new RestrictedConnection(object, remoteAddress); + } + + @Override + protected Connection undecorate(Connection object) { + assert(object instanceof RestrictedConnection); + return ((RestrictedConnection) object).getUndecorated(); + } + + }; + } + + @Override + public Collection
getConnectionAttributes() { + Collection connectionAttrs = new HashSet<>(super.getConnectionAttributes()); + connectionAttrs.add(RestrictedConnection.RESTRICT_CONNECTION_FORM); + return Collections.unmodifiableCollection(connectionAttrs); + } + + @Override + public Directory getConnectionGroupDirectory() throws GuacamoleException { + return new DecoratingDirectory(super.getConnectionGroupDirectory()) { + + @Override + protected ConnectionGroup decorate(ConnectionGroup object) throws GuacamoleException { + return new RestrictedConnectionGroup(object, remoteAddress); + } + + @Override + protected ConnectionGroup undecorate(ConnectionGroup object) { + assert(object instanceof RestrictedConnectionGroup); + return ((RestrictedConnectionGroup) object).getUndecorated(); + } + + }; + } + + @Override + public Collection getConnectionGroupAttributes() { + Collection connectionGroupAttrs = new HashSet<>(super.getConnectionGroupAttributes()); + connectionGroupAttrs.add(RestrictedConnectionGroup.RESTRICT_CONNECTIONGROUP_FORM); + return Collections.unmodifiableCollection(connectionGroupAttrs); + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + + // Pull permissions of the current logged-in user. + Permissions currentPermissions = self().getEffectivePermissions(); + boolean isAdmin = currentPermissions.getSystemPermissions().hasPermission( + SystemPermission.Type.ADMINISTER + ); + Collection adminIdentifiers = + currentPermissions.getUserPermissions().getAccessibleObjects( + Collections.singletonList(ObjectPermission.Type.ADMINISTER), super.getUserDirectory().getIdentifiers()); + + return new DecoratingDirectory(super.getUserDirectory()) { + + @Override + protected User decorate(User object) throws GuacamoleException { + + // Check and see if the logged in user has admin privileges - + // either system-level or for that particular object. + boolean hasAdmin = isAdmin || adminIdentifiers.contains(object.getIdentifier()); + return new RestrictedUser(object, remoteAddress, hasAdmin); + } + + @Override + protected User undecorate(User object) { + assert(object instanceof RestrictedUser); + return ((RestrictedUser) object).getUndecorated(); + } + + }; + } + + @Override + public Collection getUserAttributes() { + Collection userAttrs = new HashSet<>(super.getUserAttributes()); + userAttrs.add(RestrictedUser.RESTRICT_LOGIN_FORM); + return Collections.unmodifiableCollection(userAttrs); + } + + @Override + public Directory getUserGroupDirectory() throws GuacamoleException { + return new DecoratingDirectory(super.getUserGroupDirectory()) { + + @Override + protected UserGroup decorate(UserGroup object) { + return new RestrictedUserGroup(object); + } + + @Override + protected UserGroup undecorate(UserGroup object) { + assert(object instanceof RestrictedUserGroup); + return ((RestrictedUserGroup) object).getUndecorated(); + } + + }; + } + + @Override + public Collection getUserGroupAttributes() { + Collection userGroupAttrs = new HashSet<>(super.getUserGroupAttributes()); + userGroupAttrs.add(RestrictedUserGroup.RESTRICT_LOGIN_FORM); + return Collections.unmodifiableCollection(userGroupAttrs); + } + + @Override + public boolean isValid() { + try { + // Verify whether or not time restrictions still apply. + RestrictionVerificationService.verifyTimeRestrictions(this, effectiveUserGroups); + return true; + } + catch (GuacamoleException e) { + LOGGER.debug("User account is now restricted and is no longer valid", e); + return false; + } + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/usergroup/RestrictedUserGroup.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/usergroup/RestrictedUserGroup.java new file mode 100644 index 0000000..6d2d6c5 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/auth/restrict/usergroup/RestrictedUserGroup.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.restrict.usergroup; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.auth.restrict.Restrictable; +import org.apache.guacamole.auth.restrict.form.HostRestrictionField; +import org.apache.guacamole.auth.restrict.form.TimeRestrictionField; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.DelegatingUserGroup; +import org.apache.guacamole.net.auth.UserGroup; + +/** + * UserGroup implementation which wraps a UserGroup from another extension and + * enforces additional restrictions for members of that group. + */ +public class RestrictedUserGroup extends DelegatingUserGroup implements Restrictable { + + /** + * The list of all user attributes provided by this UserGroup implementation. + */ + public static final List RESTRICT_USERGROUP_ATTRIBUTES = Arrays.asList( + RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_TIME_DENIED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME, + RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME + ); + + /** + * The form containing the list of fields for the attributes provided + * by this module. + */ + public static final Form RESTRICT_LOGIN_FORM = new Form("restrict-login-form", + Arrays.asList( + new TimeRestrictionField(RESTRICT_TIME_ALLOWED_ATTRIBUTE_NAME), + new TimeRestrictionField(RESTRICT_TIME_DENIED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_ALLOWED_ATTRIBUTE_NAME), + new HostRestrictionField(RESTRICT_HOSTS_DENIED_ATTRIBUTE_NAME) + ) + ); + + + /** + * Wraps the given UserGroup object, providing capability of further restricting + * logins beyond the default restrictions provided by default modules. + * + * @param userGroup + * The UserGroup object to wrap. + */ + public RestrictedUserGroup(UserGroup userGroup) { + super(userGroup); + } + + /** + * Returns the UserGroup object wrapped by this RestrictUserGroup. + * + * @return + * The wrapped UserGroup object. + */ + public UserGroup getUndecorated() { + return getDelegateUserGroupGroup(); + } + + @Override + public Map getAttributes() { + + // Create independent, mutable copy of attributes + Map attributes = new HashMap<>(super.getAttributes()); + + // Loop through extension-specific attributes, adding ones that are + // empty so that they are displayed in the web UI. + for (String attribute : RESTRICT_USERGROUP_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value == null || value.isEmpty()) + attributes.put(attribute, null); + } + + return attributes; + + } + + @Override + public void setAttributes(Map attributes) { + + // Create independent, mutable copy of attributes + attributes = new HashMap<>(attributes); + + // Loop through extension-specific attributes, only sending ones + // that are non-null and non-empty to the underlying storage mechanism. + for (String attribute : RESTRICT_USERGROUP_ATTRIBUTES) { + String value = attributes.get(attribute); + if (value != null && value.isEmpty()) + attributes.put(attribute, null); + } + + super.setAttributes(attributes); + + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/DailyRestriction.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/DailyRestriction.java new file mode 100644 index 0000000..0169141 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/DailyRestriction.java @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.calendar; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.Collections; +import java.util.List; + +/** + * A class that stores a daily time restriction that can be used to determine + * whether or not a user can log in on a certain day of the week and during + * a certain time window. + */ +public class DailyRestriction { + + /** + * The days of the week that this restriction applies to. + */ + private final List weekDays; + + /** + * The time that the restriction starts. + */ + private final LocalTime startTime; + + /** + * The time that the restriction ends. + */ + private final LocalTime endTime; + + /** + * Create a new daily restriction with the specified day of the week, start + * time, and end time. + * + * @param weekDay + * The day of the week that this restriction should apply to. + * + * @param startTime + * The start time of the restriction. + * + * @param endTime + * The end time of the restriction. + */ + public DailyRestriction(DayOfWeek weekDay, + LocalTime startTime, LocalTime endTime) { + this.weekDays = Collections.singletonList(weekDay); + this.startTime = startTime; + this.endTime = endTime; + } + + /** + * Create a new daily restriction with the specified days of the week, start + * time, and end time. + * + * @param weekDays + * The days of the week that this restriction should apply to. + * + * @param startTime + * The start time of the restriction. + * + * @param endTime + * The end time of the restriction. + */ + public DailyRestriction(List weekDays, + LocalTime startTime, LocalTime endTime) { + this.weekDays = weekDays; + this.startTime = startTime; + this.endTime = endTime; + } + + /** + * Create a new daily restriction for an entire day, settings the start + * time at midnight and the end time at the end of the day (235959). + * + * @param weekDay + * The day of the week that this restriction should apply to. + */ + public DailyRestriction(DayOfWeek weekDay) { + this.weekDays = Collections.singletonList(weekDay); + this.startTime = LocalTime.of(0, 0, 0); + this.endTime = LocalTime.of(23, 59, 59); + } + + /** + * Create a new daily restriction for entire days, settings the start + * time at midnight and the end time at the end of the day (235959). + * + * @param weekDays + * The days of the week that this restriction should apply to. + */ + public DailyRestriction(List weekDays) { + this.weekDays = weekDays; + this.startTime = LocalTime.of(0, 0, 0); + this.endTime = LocalTime.of(23, 59, 59); + } + + /** + * Returns true if this restriction applies now, otherwise false. + * + * @return + * true if the current time of day falls within this restriction, + * otherwise false. + */ + public boolean appliesNow() { + DayOfWeek currentDay = LocalDate.now(ZoneId.of("UTC")).getDayOfWeek(); + LocalTime currentTime = LocalTime.now(ZoneId.of("UTC")); + + // If end time is less than the start time, we check the remainder of this + // day and the beginning of the next day. + if (endTime.isBefore(startTime)) { + if (weekDays.contains(currentDay) && currentTime.isAfter(startTime) && currentTime.isBefore(LocalTime.MAX)) + return true; + return (weekDays.contains(currentDay.plus(1)) && currentTime.isAfter(LocalTime.MIDNIGHT) && currentTime.isBefore(endTime)); + } + + // Check that we are in the specified time restriction + return (weekDays.contains(currentDay) && currentTime.isAfter(startTime) && currentTime.isBefore(endTime)); + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/RestrictionType.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/RestrictionType.java new file mode 100644 index 0000000..bc62eb9 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/RestrictionType.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.calendar; + +/** + * A data type that represents various values of what type of restriction applies + * at a given time. + */ +public enum RestrictionType { + + /** + * Access is explicitly allowed. + */ + EXPLICIT_ALLOW(1, true), + + /** + * Access is explicitly denied. + */ + EXPLICIT_DENY(0, false), + + /** + * Access has not been explicitly allowed or denied, therefore it is + * implicitly allowed. + */ + IMPLICIT_ALLOW(3, true), + + /** + * Access has not been explicitly allowed or denied, therefore it is + * implicitly denied. + */ + IMPLICIT_DENY(2, false); + + /** + * The overall priority of the restriction, with zero being the highest + * priority and the priority decreasing as numbers increase from zero. + */ + final private int priority; + + /** + * true if the restriction allows access, otherwise false. + */ + final private boolean allowed; + + /** + * Create the new instance of this RestrictionType, with the given + * priority value for the instance. + * + * @param priority + * The priority of the restriction type, where zero is the highest + * priority. + * + * @param allowed + * true if the restriction allows access, otherwise false. + */ + RestrictionType(int priority, boolean allowed) { + this.priority = priority; + this.allowed = allowed; + } + + /** + * Evaluates two restrictions, returning the higher priority of the two. + * + * @param restriction1 + * The first restriction to compare. + * + * @param restriction2 + * The second restriction to compare. + * + * @return + * Return which of the two restrictions is the higher-priority. + */ + public static RestrictionType getHigherPriority(RestrictionType restriction1, RestrictionType restriction2) { + + // If the second is higher than the first, return the second. + if (restriction1.priority > restriction2.priority) + return restriction2; + + // Return the first. + return restriction1; + + } + + /** + * Returns true if this restriction allows access, otherwise false. + * + * @return + * true if this restriction allows access, otherwise false. + */ + public boolean isAllowed() { + return this.allowed; + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/TimeRestrictionParser.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/TimeRestrictionParser.java new file mode 100644 index 0000000..91b1954 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/calendar/TimeRestrictionParser.java @@ -0,0 +1,157 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.calendar; + +import java.time.DayOfWeek; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A class for parsing time-based restrictions stored in a String into other + * formats that can be used by Guacamole. + */ +public class TimeRestrictionParser { + + /** + * The compiled regular expression that matches one or more instances of + * a restriction string, which specifies at least one day and time range + * that the restriction applies to. + * + *

Examples of valid restrictions are as follows: + *

    + *
  • 1:0700-1700 - Monday from 07:00 to 17:00 + *
  • 7:0000-2359 - Sunday, all day (00:00 to 23:59) + *
  • *:0900-1700 - Every day, 09:00 to 17:00 + *
  • 6:0900-1600;7:1200-1300 - Saturday, 09:00 to 16:00, and Sunday, + * 12:00 - 13:00 + *
+ */ + private static final Pattern RESTRICTION_REGEX = + Pattern.compile("(?:^|;)+([0-7*])(?::((?:[01][0-9]|2[0-3])[0-5][0-9])\\-((?:[01][0-9]|2[0-3])[0-5][0-9]))+"); + + /** + * The RegEx group that contains the start day-of-week of the restriction. + */ + private static final int RESTRICTION_DAY_GROUP = 1; + + /** + * The RegEx group that contains the start time of the restriction. + */ + private static final int RESTRICTION_TIME_START_GROUP = 2; + + /** + * The RegEx group that contains the end time of the restriction. + */ + private static final int RESTRICTION_TIME_END_GROUP = 3; + + /** + * A list of DayOfWeek items that make up all days of the week. + */ + private static final List RESTRICTION_ALL_DAYS = Arrays.asList( + DayOfWeek.MONDAY, + DayOfWeek.TUESDAY, + DayOfWeek.WEDNESDAY, + DayOfWeek.THURSDAY, + DayOfWeek.FRIDAY, + DayOfWeek.SATURDAY, + DayOfWeek.SUNDAY + ); + + /** + * Parse the provided string containing one or more restrictions into + * a list of objects. + * + * @param restrictionString + * The string that should contain one or more semicolon-separated + * restriction periods. + * + * @return + * A list of objects parsed from the string. + */ + public static List parseString(String restrictionString) { + + List restrictions = new ArrayList<>(); + Matcher restrictionMatcher = RESTRICTION_REGEX.matcher(restrictionString); + + // Loop through RegEx matches + while (restrictionMatcher.find()) { + + // Pull the day string, start time, and end time + String dayString = restrictionMatcher.group(RESTRICTION_DAY_GROUP); + String startTimeString = restrictionMatcher.group(RESTRICTION_TIME_START_GROUP); + String endTimeString = restrictionMatcher.group(RESTRICTION_TIME_END_GROUP); + LocalTime startTime, endTime; + + // We must always have a value for the day. + if (dayString == null || dayString.isEmpty()) + continue; + + // Convert the start and end time strings to LocalTime values. + DateTimeFormatter hourFormat = DateTimeFormatter.ofPattern("HHmm"); + + // If start time is empty, assume the start of the day. + if (startTimeString == null || startTimeString.isEmpty()) + startTime = LocalTime.of(0, 0, 0); + + // Otherwise, parse out the start time. + else + startTime = LocalTime.parse(startTimeString, hourFormat); + + // If end time is empty, assume the end of the day. + if (endTimeString == null || endTimeString.isEmpty()) + endTime = LocalTime.of(23, 59, 59); + + // Otherwise, parse out the end time. + else + endTime = LocalTime.parse(endTimeString, hourFormat); + + // Based on value of day string, add the appropriate entry. + switch(dayString) { + // All days of the week. + case "*": + restrictions.add(new DailyRestriction(RESTRICTION_ALL_DAYS, startTime, endTime)); + break; + + // A specific day of the week. + default: + int dayInt = Integer.parseInt(dayString); + + // While JavaScript sees Sunday as "0" and "7", DayOfWeek + // does not, so we'll convert it to "7" in order to process it. + if (dayInt == 0) + dayInt = 7; + + restrictions.add(new DailyRestriction(DayOfWeek.of(dayInt), startTime, endTime)); + + } + + } + + // Return the list of restrictions + return restrictions; + + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/host/HostRestrictionParser.java b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/host/HostRestrictionParser.java new file mode 100644 index 0000000..d368c80 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/java/org/apache/guacamole/host/HostRestrictionParser.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.host; + +import inet.ipaddr.HostName; +import inet.ipaddr.HostNameException; +import java.util.ArrayList; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A utility class that parses a string for a set of IPv4 or IPv6 addresses, + * or hostnames, splitting the string into a list of components. + */ +public class HostRestrictionParser { + + /** + * The logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(HostRestrictionParser.class); + + /** + * Parse the provided string into a List of HostName objects, validating + * that each item is an IP address, subnet, and/or DNS name. + * + * @param hostString + * The string that contains a semi-colon-separated list of items to + * parse. + * + * @return + * A List of HostName objects parsed from the provided string. + */ + public static List parseHostList(String hostString) { + + List addressList = new ArrayList<>(); + + if (hostString == null || hostString.isEmpty()) + return addressList; + + // First split the string by semicolons and process each entry + for (String host : hostString.split(";")) { + + HostName hostName = new HostName(host); + try { + hostName.validate(); + addressList.add(hostName); + } + catch (HostNameException e) { + LOGGER.warn("Invalid host name or IP: {}", host); + LOGGER.debug("HostNameException.", e.getMessage()); + } + + } + + return addressList; + + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/resources/config/restrictConfig.js b/extensions/guacamole-auth-restrict/src/main/resources/config/restrictConfig.js new file mode 100644 index 0000000..953b9b9 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/config/restrictConfig.js @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Config block which registers restrict-specific field types. + */ +angular.module('guacRestrict').config(['formServiceProvider', + function guacRestrictConfig(formServiceProvider) { + + // Define the time restriction field + formServiceProvider.registerFieldType('GUAC_TIME_RESTRICTION', { + module : 'guacRestrict', + controller : 'timeRestrictionFieldController', + templateUrl : 'app/ext/restrict/templates/timeRestrictionField.html' + }); + + // Define the host restriction field + formServiceProvider.registerFieldType('GUAC_HOST_RESTRICTION', { + module : 'guacRestrict', + controller : 'hostRestrictionFieldController', + templateUrl : 'app/ext/restrict/templates/hostRestrictionField.html' + }); + + // Define the date and time restriction field + formServiceProvider.registerFieldType('GUAC_DATETIME_RESTRICTION', { + module : 'guacRestrict', + controller : 'dateTimeRestrictionFieldController', + templateUrl : 'app/ext/restrict/templates/dateTimeRestrictionField.html' + }); + +}]); diff --git a/extensions/guacamole-auth-restrict/src/main/resources/controllers/dateTimeRestrictionFieldController.js b/extensions/guacamole-auth-restrict/src/main/resources/controllers/dateTimeRestrictionFieldController.js new file mode 100644 index 0000000..6fd2054 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/controllers/dateTimeRestrictionFieldController.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for date+time restriction fields. + */ +angular.module('form').controller('dateTimeRestrictionFieldController', + ['$scope', '$injector', + function dateTimeRestrictionFieldController($scope, $injector) { + + // Required services + var $filter = $injector.get('$filter'); + + /** + * Options which dictate the behavior of the input field model, as defined + * by https://docs.angularjs.org/api/ng/directive/ngModelOptions + * + * @type Object. + */ + $scope.modelOptions = { + + /** + * Space-delimited list of events on which the model will be updated. + * + * @type String + */ + updateOn : 'blur', + + /** + * The time zone to use when reading/writing the Date object of the + * model. + * + * @type String + */ + timezone : 'UTC' + + }; + + /** + * Parses the date and time components of the given string into a Date in + * the UTC timezone. The input string must be in the format + * YYYY-MM-DDTHH:mm:ss (zero-padded). + * + * @param {String} str + * The date+time string to parse. + * + * @returns {Date} + * A Date object, in the UTC timezone, or null if parsing the provided + * string fails. + */ + var parseDate = function parseDate(str) { + + // Parse date, return null if parsing fails + var parsedDate = new Date(str); + if (isNaN(parsedDate.getTime())) + return null; + + return parsedDate; + + }; + + // Update typed value when model is changed + $scope.$watch('model', function modelChanged(model) { + $scope.typedValue = (model ? parseDate(model) : null); + }); + + // Update string value in model when typed value is changed + $scope.$watch('typedValue', function typedValueChanged(typedValue) { + $scope.model = (typedValue ? $filter('date')(typedValue, 'yyyy-MM-ddTHH:mm:ssZ', 'UTC') : ''); + }); + +}]); diff --git a/extensions/guacamole-auth-restrict/src/main/resources/controllers/hostRestrictionFieldController.js b/extensions/guacamole-auth-restrict/src/main/resources/controllers/hostRestrictionFieldController.js new file mode 100644 index 0000000..94bb392 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/controllers/hostRestrictionFieldController.js @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for host restriction fields, which are used to configure a + * hostname, IP address, or CIDR range, that this restriction applies to. + */ +angular.module('guacRestrict').controller('hostRestrictionFieldController', ['$scope', '$injector', + function hostRestrictionFieldController($scope, $injector) { + + // Required types + const HostRestrictionEntry = $injector.get('HostRestrictionEntry'); + + /** + * Options which dictate the behavior of the input field model, as defined + * by https://docs.angularjs.org/api/ng/directive/ngModelOptions + * + * @type Object. + */ + $scope.modelOptions = { + + /** + * Space-delimited list of events on which the model will be updated. + * + * @type String + */ + updateOn : 'blur', + + /** + * The time zone to use when reading/writing the Date object of the + * model. + * + * @type String + */ + timezone : 'UTC' + + }; + + /** + * The restrictions, as objects, that are used by the HTML template to + * present the restrictions to the user via the web interface. + * + * @type HostRestrictionEntry[] + */ + $scope.restrictions = []; + + /** + * Remove the current entry from the list. + * + * @param {HostRestrictionEntry} entry + * A restriction entry. + */ + $scope.removeEntry = function removeEntry(entry) { + if (entry === null || entry.$$hashKey === '') { + return; + } + for (let i = 0; i < $scope.restrictions.length; i++) { + if ($scope.restrictions[i].$$hashKey === entry.$$hashKey) { + $scope.restrictions.splice(i,1); + return; + } + } + }; + + /** + * Add an empty entry to the restriction list. + */ + $scope.addEntry = function addEntry() { + $scope.restrictions.push(new HostRestrictionEntry()); + }; + + /** + * Parse the provided string into an array containing the objects that + * represent each of entries that can then be displayed as a more + * user-friendly field. + * + * @param {String} restrString + * The string that contains the restrictions, un-parsed and as stored + * in the underlying field. + * + * @returns {HostRestrictionEntry[]} + * An array of objects that represents each of the entries as parsed + * out of the string field, and which can be interpreted by the + * AngularJS field for display. + */ + const parseRestrictions = function parseRestrictions(restrString) { + + var restrictions = []; + + // If the string is null or empty, just return an empty array + if (restrString === null || restrString === "") + return restrictions; + + // Set up the RegEx and split the string using the separator. + var restrArray = restrString.split(";"); + + // Loop through split string and process each item + for (let i = 0; i < restrArray.length; i++) { + var entry = new HostRestrictionEntry(); + entry.host = restrArray[i]; + restrictions.push(entry); + } + + return restrictions; + + }; + + /** + * Parse the restrictions in the field into a string that can be stored + * in an underlying module. + * + * @param {HostRestrictionEntry[]} restrictions + * The array of restrictions that will be converted to a string. + * + * @returns {String} + * The string containing the restriction data that can be stored in e.g. + * a database. + */ + const storeRestrictions = function storeRestrictions(restrictions) { + // If there are no members of the array, just return an empty string. + if (restrictions === null || restrictions.length < 1) + return ''; + + var restrString = ''; + for (let i = 0; i < restrictions.length; i++) { + // If any of the properties are not defined, skip this one. + if (!Object.hasOwn(restrictions[i], 'host') + || restrictions[i].host === null) + continue; + + // If this is not the first item, then add a semi-colon separator + if (restrString.length > 0) + restrString += ';'; + + // Add the current host to the list + restrString += restrictions[i].host; + } + + return restrString; + + }; + + // Update the field when the model changes. + $scope.$watch('model', function modelChanged(model) { + $scope.restrictions = parseRestrictions(model); + }); + + // Update string value in model when web form is changed + $scope.$watch('restrictions', function restrictionsChanged(restrictions) { + $scope.model = storeRestrictions(restrictions); + }, true); + +}]); \ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/resources/controllers/timeRestrictionFieldController.js b/extensions/guacamole-auth-restrict/src/main/resources/controllers/timeRestrictionFieldController.js new file mode 100644 index 0000000..de83b6a --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/controllers/timeRestrictionFieldController.js @@ -0,0 +1,317 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for time restriction fields, which are used to select weekday and + * time restrictions that apply to user logins and connections. + */ +angular.module('guacRestrict').controller('timeRestrictionFieldController', ['$scope', '$injector', + function timeRestrictionFieldController($scope, $injector) { + + // Required types + const TimeRestrictionEntry = $injector.get('TimeRestrictionEntry'); + + /** + * Options which dictate the behavior of the input field model, as defined + * by https://docs.angularjs.org/api/ng/directive/ngModelOptions + * + * @type Object. + */ + $scope.modelOptions = { + + /** + * Space-delimited list of events on which the model will be updated. + * + * @type String + */ + updateOn : 'blur' + + }; + + /** + * The restrictions, as objects, that are used by the HTML template to + * present the restrictions to the user via the web interface. + * + * @type TimeRestrictionEntry[] + */ + $scope.restrictions = []; + + /** + * Map of weekday identifier to display name. Note that Sunday occurs + * twice - once for the 0-index and once for the 7 index. + */ + $scope.weekDays = [ + { id : '1', day : 'Monday' }, + { id : '2', day : 'Tuesday' }, + { id : '3', day : 'Wednesday' }, + { id : '4', day : 'Thursday' }, + { id : '5', day : 'Friday' }, + { id : '6', day : 'Saturday' }, + { id : '7', day : 'Sunday' }, + { id : '*', day : 'All days' } + ]; + + /** + * Remove the current entry from the list. + * + * @param {TimeRestrictionEntry} entry + * A restriction entry. + */ + $scope.removeEntry = function removeEntry(entry) { + if (entry === null || entry.$$hashKey === '') { + return; + } + for (let i = 0; i < $scope.restrictions.length; i++) { + if ($scope.restrictions[i].$$hashKey === entry.$$hashKey) { + $scope.restrictions.splice(i,1); + return; + } + } + }; + + /** + * Add an empty entry to the restriction list. + */ + $scope.addEntry = function addEntry() { + $scope.restrictions.push(new TimeRestrictionEntry()); + }; + + + /** + * Parse the provided string into an array containing the objects that + * represent each of entries that can then be displayed as a more + * user-friendly field. + * + * @param {String} restrString + * The string that contains the restrictions, un-parsed and as stored + * in the underlying field. + * + * @returns {TimeRestrictionEntry[]} + * An array of objects that represents each of the entries as parsed + * out of the string field, and which can be interpreted by the + * AngularJS field for display. + */ + const parseRestrictions = function parseRestrictions(restrString) { + + // Array to store the restrictions + var restrictions = []; + + // Grab the current date so that we can accurately parse DST later + var templateDate = new Date(); + + // If the string is null or empty, just return an empty array + if (restrString === null || restrString === "") + return restrictions; + + // Set up the RegEx and split the string using the separator. + const restrictionRegex = new RegExp('^([0-7*])(?::((?:[01][0-9]|2[0-3])[0-5][0-9])\-((?:[01][0-9]|2[0-3])[0-5][0-9]))$'); + var restrArray = restrString.split(";"); + + // Loop through split string and process each item + for (let i = 0; i < restrArray.length; i++) { + + // Test if our regex matches + if (restrictionRegex.test(restrArray[i])) { + var currArray = restrArray[i].match(restrictionRegex); + let entry = new TimeRestrictionEntry(); + entry.startTime = new Date(Date.UTC(templateDate.getFullYear(), + templateDate.getMonth(), + templateDate.getDate(), + parseInt(currArray[2].slice(0,2)), + parseInt(currArray[2].slice(2)))); + entry.endTime = new Date(Date.UTC(templateDate.getFullYear(), + templateDate.getMonth(), + templateDate.getDate(), + parseInt(currArray[3].slice(0,2)), + parseInt(currArray[3].slice(2)))); + var origDay = currArray[1]; + + if (currArray[1] === '*') + entry.weekDay = '' + currArray[1]; + + else { + // If UTC day is greater than local day, we subtract a day, + // wrapping as required. + if (entry.startTime.getDay() < entry.startTime.getUTCDay()) { + if (origDay <= 0) + entry.weekDay = '' + 6; + else + entry.weekDay = '' + (--origDay); + + } + + // If UTC day is less than local day, we add a day, + // wrapping as required. + else if (entry.startTime.getDay() > entry.startTime.getUTCDay()) { + if (origDay >= 6) + entry.weekDay = '' + 0; + else + entry.weekDay = '' + (++origDay); + } + + // Local day and UTC day are the same, adjust the display day + else + entry.weekDay = '' + origDay; + + } + + restrictions.push(entry); + } + } + + return restrictions; + + }; + + /** + * Since new Time fields in HTML get a default year of 1970, we need to + * merge the hours and minutes from the time field into the current Date, + * primarily so that Daylight Savings Time offsets are correct. + * + * @param {Date} justTime + * The Date object produced by an HTML field that contains the hours + * and minutes we need. + * + * @returns {Date} + * The Date object that merges the current calendar date with the + * hours and minutes from the HTML field. + */ + const timeToCurrentDate = function timeToCurrentDate(justTime) { + let dateAndTime = new Date(); + dateAndTime.setHours(justTime.getHours()); + dateAndTime.setMinutes(justTime.getMinutes()); + + return dateAndTime; + }; + + /** + * Parse the restrictions in the field into a string that can be stored + * in an underlying module. + * + * @param {TimeRestrictionEntry[]} restrictions + * The array of restrictions that will be converted to a string. + * + * @returns {String} + * The string containing the restriction data that can be stored in e.g. + * a database. + */ + const storeRestrictions = function storeRestrictions(restrictions) { + + // If there are no members of the array, just return an empty string. + if (restrictions === null || restrictions.length < 1) + return ''; + + let restrString = ''; + for (let i = 0; i < restrictions.length; i++) { + // If any of the properties are not defined, skip this one. + if (!Object.hasOwn(restrictions[i], 'weekDay') + || restrictions[i].weekDay === null + || restrictions[i].weekDay === '' + || !Object.hasOwn(restrictions[i], 'startTime') + || restrictions[i].startTime === null + || !(restrictions[i].startTime instanceof Date) + || !Object.hasOwn(restrictions[i], 'endTime') + || restrictions[i].endTime === null + || !(restrictions[i].endTime instanceof Date)) + continue; + + // If this is not the first item, then add a semi-colon separator + if (restrString.length > 0) + restrString += ';'; + + // When these fields first gets a value, the default year is 1970 + // In order to avoid issues with Daylight Savings Time, we have to + // work around this. + if (restrictions[i].startTime instanceof Date && restrictions[i].startTime.getFullYear() === 1970) + restrictions[i].startTime = timeToCurrentDate(restrictions[i].startTime); + + if (restrictions[i].endTime instanceof Date && restrictions[i].endTime.getFullYear() === 1970) + restrictions[i].endTime = timeToCurrentDate(restrictions[i].endTime); + + // Process the start day, factoring in wrapping for local time to + // UTC adjustments. + let weekDay = restrictions[i].weekDay; + const startDay = restrictions[i].startTime.getDay(); + const utcStartDay = restrictions[i].startTime.getUTCDay(); + + // Local day is less than UTC day, so we add a day for storing, + // wrapping around as required. + if (weekDay !== '*' && startDay < utcStartDay) { + if (weekDay >= 6) + weekDay = 0; + else + weekDay++; + } + + else if (weekDay !== '*' && startDay > utcStartDay) { + if (weekDay <= 0) + weekDay = 6; + else + weekDay--; + } + + let currString = '' + weekDay.toString(); + currString += ':'; + + // Retrieve startTime hours component and add it, adding leading zero if required. + let startHours = restrictions[i].startTime.getUTCHours(); + if (startHours !== null && startHours < 10) + currString += '0'; + currString += startHours.toString(); + + // Retrieve startTime minutes component and add it, adding leading zero if required. + let startMins = restrictions[i].startTime.getUTCMinutes(); + if (startMins !== null && startMins < 10) + currString += '0'; + currString += startMins.toString(); + + currString += '-'; + + // Retrieve endTime hours component and add it, adding leading zero if required. + let endHours = restrictions[i].endTime.getUTCHours(); + if (endHours !== null && endHours < 10) + currString += '0'; + currString += endHours.toString(); + + // Retrieve endTime minutes component and add it, adding leading zero if required. + let endMins = restrictions[i].endTime.getUTCMinutes(); + if (endMins !== null && endMins < 10) + currString += '0'; + currString += endMins.toString(); + + // Add the newly-created string to the overall restriction string. + restrString += currString; + } + + return restrString; + + }; + + // Update the field when the model changes. + $scope.$watch('model', function modelChanged(model) { + $scope.restrictions = parseRestrictions(model); + }); + + // Update string value in model when web form is changed + $scope.$watch('restrictions', function restrictionsChanged(restrictions) { + $scope.model = storeRestrictions(restrictions); + }, true); + +}]); \ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-restrict/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..7391e23 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/guac-manifest.json @@ -0,0 +1,30 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Restriction Authentication Backend", + "namespace" : "restrict", + + "authProviders" : [ + "org.apache.guacamole.auth.restrict.RestrictionAuthenticationProvider" + ], + + "translations" : [ + "translations/en.json" + ], + + "js" : [ + "restrict.min.js" + ], + + "css" : [ + "restrict.min.css" + ], + + "resources" : { + "templates/dateTimeRestrictionField.html" : "text/html", + "templates/hostRestrictionField.html" : "text/html", + "templates/timeRestrictionField.html" : "text/html" + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/resources/license.txt b/extensions/guacamole-auth-restrict/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-restrict/src/main/resources/restrictModule.js b/extensions/guacamole-auth-restrict/src/main/resources/restrictModule.js new file mode 100644 index 0000000..7d50818 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/restrictModule.js @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module which provides handling for additional login and connection + * restrictions. + */ +angular.module('guacRestrict', [ + 'form' +]); + +// Ensure the guacRestrict module is loaded along with the rest of the app +angular.module('index').requires.push('guacRestrict'); diff --git a/extensions/guacamole-auth-restrict/src/main/resources/styles/restrict.css b/extensions/guacamole-auth-restrict/src/main/resources/styles/restrict.css new file mode 100644 index 0000000..b6a91eb --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/styles/restrict.css @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.restrictionList { + border: 0; +} + +button.restrictionListButton { + font-size: 0.75em; +} + +img.restrictionListHeader { + width: 0.75em; + height: 0.75em; +} + +img.restrictionListItem { + width: 1em; + height: 1em; +} \ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/resources/templates/dateTimeRestrictionField.html b/extensions/guacamole-auth-restrict/src/main/resources/templates/dateTimeRestrictionField.html new file mode 100644 index 0000000..8630761 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/templates/dateTimeRestrictionField.html @@ -0,0 +1,12 @@ +
+ +
\ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/resources/templates/hostRestrictionField.html b/extensions/guacamole-auth-restrict/src/main/resources/templates/hostRestrictionField.html new file mode 100644 index 0000000..3febbf0 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/templates/hostRestrictionField.html @@ -0,0 +1,23 @@ +
+ + + + + + + + + +
{{ 'RESTRICT.TABLE_HEADER_HOST' | translate }} 
+ + + Remove entry +
+ +
\ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/resources/templates/timeRestrictionField.html b/extensions/guacamole-auth-restrict/src/main/resources/templates/timeRestrictionField.html new file mode 100644 index 0000000..dfc95ee --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/templates/timeRestrictionField.html @@ -0,0 +1,38 @@ +
+ + + + + + + + + + + + + +
{{ 'RESTRICT.TABLE_HEADER_DAY' | translate }}{{ 'RESTRICT.TABLE_HEADER_START_TIME' | translate }}{{ 'RESTRICT.TABLE_HEADER_END_TIME' | translate }} 
+ + + + + + + Remove entry +
+ +
\ No newline at end of file diff --git a/extensions/guacamole-auth-restrict/src/main/resources/translations/en.json b/extensions/guacamole-auth-restrict/src/main/resources/translations/en.json new file mode 100644 index 0000000..2f52d40 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/translations/en.json @@ -0,0 +1,73 @@ +{ + + "DATA_SOURCE_LOGIN_RESTRICTIONS" : { + "NAME" : "Additional Restrictions" + }, + + "CONNECTION_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_ALLOWED" : "Hosts from which connection may be accessed:", + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_DENIED" : "Hosts from which connection may not be accessed:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_AFTER" : "Date and time after which this connection may be used:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_ALLOWED" : "Times connection is allowed to be used:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_BEFORE" : "Date and time before which this connection may be used:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_DENIED" : "Times connection may not be used:", + + "SECTION_HEADER_RESTRICT_LOGIN_FORM" : "Additional Connection Restrictions" + + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_ALLOWED" : "Hosts from which connection group may be accessed:", + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_DENIED" : "Hosts from which connection group may not be accessed:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_AFTER" : "Date and time after which this connection group may be used:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_ALLOWED" : "Times connection group is allowed to be used:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_BEFORE" : "Date and time before which this connection group may be used:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_DENIED" : "Times connection group may not be used:", + + "SECTION_HEADER_RESTRICT_LOGIN_FORM" : "Additional Connection Restrictions" + + }, + + "RESTRICT" : { + + "ACTION_ADD_ENTRY" : "Add Entry", + + "ERROR_CONNECTION_NOT_ALLOWED_NOW" : "The connection is not available at this time.", + "ERROR_CONNECTION_NOT_ALLOWED_FROM_HOST" : "The connection is not allowed from this host.", + "ERROR_USER_LOGIN_NOT_ALLOWED_NOW" : "The login for this user is not allowed at this time.", + "ERROR_USER_LOGIN_NOT_ALLOWED_FROM_HOST" : "The login for this user is not allowed from this host.", + + "FIELD_PLACEHOLDER_DATE_TIME_RESTRICTION" : "YYYY-MM-DD HH:MM:SS", + + "TABLE_HEADER_DAY" : "Day", + "TABLE_HEADER_END_TIME" : "End Time", + "TABLE_HEADER_HOST" : "Host", + "TABLE_HEADER_START_TIME" : "Start Time" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_ALLOWED" : "Hosts from which user can log in:", + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_DENIED" : "Hosts from which user may not log in:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_ALLOWED" : "Times user is allowed to log in:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_DENIED" : "Times user is denied from log in:", + + "SECTION_HEADER_RESTRICT_LOGIN_FORM" : "Additional Login Restrictions" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_ALLOWED" : "Hosts from which members may log in:", + "FIELD_HEADER_GUAC_RESTRICT_HOSTS_DENIED" : "Hosts from which members may not log in:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_ALLOWED" : "Times members are allowed to log in:", + "FIELD_HEADER_GUAC_RESTRICT_TIME_DENIED" : "Times members are denied from log in:", + + "SECTION_HEADER_RESTRICT_LOGIN_FORM" : "Additional Login Restrictions" + + } + +} diff --git a/extensions/guacamole-auth-restrict/src/main/resources/types/HostRestrictionEntry.js b/extensions/guacamole-auth-restrict/src/main/resources/types/HostRestrictionEntry.js new file mode 100644 index 0000000..e4246f5 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/types/HostRestrictionEntry.js @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the HostRestrictionEntry class definition. + */ +angular.module('guacRestrict').factory('HostRestrictionEntry', [ + function defineHostRestrictionEntry() { + + /** + * Creates a new HostRestrictionEntry, initializing the properties of that + * HostRestrictionEntry with the corresponding properties of the given + * template. + * + * @constructor + * @param {HostRestrictionEntry|Object} [template={}] + * The object whose properties should be copied within the new + * HostRestrictionEntry. + */ + var HostRestrictionEntry = function HostRestrictionEntry(template) { + + // Use empty object by default + template = template || {}; + + /** + * The IP address, CIDR notation range, or DNS hostname of the host(s) + * specified by this restriction. + * + * @type String + */ + this.host = template.host || ''; + + }; + + return HostRestrictionEntry; + +}]); diff --git a/extensions/guacamole-auth-restrict/src/main/resources/types/TimeRestrictionEntry.js b/extensions/guacamole-auth-restrict/src/main/resources/types/TimeRestrictionEntry.js new file mode 100644 index 0000000..00debb2 --- /dev/null +++ b/extensions/guacamole-auth-restrict/src/main/resources/types/TimeRestrictionEntry.js @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the TimeRestrictionEntry class definition. + */ +angular.module('guacRestrict').factory('TimeRestrictionEntry', [ + function defineTimeRestrictionEntry() { + + /** + * Creates a new TimeRestrictionEntry, initializing the properties of that + * TimeRestrictionEntry with the corresponding properties of the given + * template. + * + * @constructor + * @param {TimeRestrictionEntry|Object} [template={}] + * The object whose properties should be copied within the new + * TimeRestrictionEntry. + */ + var TimeRestrictionEntry = function TimeRestrictionEntry(template) { + + // Use empty object by default + template = template || {}; + + /** + * The numerical representation of the day of the week this restriction + * applies to. + * + * @type {string} + */ + this.weekDay = template.weekDay || ''; + + /** + * The hour and minute that this restriction starts, in 24-hour time, + * and with no separator between the hour and minute. + * + * @type Date + */ + this.startTime = template.startTime; + + /** + * The hour and minute that this restriction ends, in 24-hour time, and + * with no separator between the hour and minute. + * + * @type Date + */ + this.endTime = template.endTime; + + }; + + return TimeRestrictionEntry; + +}]); diff --git a/extensions/guacamole-auth-sso/.ratignore b/extensions/guacamole-auth-sso/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/.gitignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/.ratignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/pom.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/pom.xml new file mode 100644 index 0000000..1cfb181 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/pom.xml @@ -0,0 +1,61 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso-base + jar + guacamole-auth-sso-base + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-sso + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + + + + + com.google.inject + guice + + + + + javax.ws.rs + jsr311-api + + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/NonceService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/NonceService.java new file mode 100644 index 0000000..d43a004 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/NonceService.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sso; + +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.guacamole.net.auth.IdentifierGenerator; + +/** + * Service for generating and validating single-use random tokens (nonces). + * Each generated nonce is at least 128 bits and case-insensitive. + */ +public class NonceService { + + /** + * Map of all generated nonces to their corresponding expiration timestamps. + * This Map must be periodically swept of expired nonces to avoid growing + * without bound. + */ + private final Map nonces = new ConcurrentHashMap<>(); + + /** + * The timestamp of the last expired nonce sweep. + */ + private long lastSweep = System.currentTimeMillis(); + + /** + * The minimum number of bits of entropy to include in each nonce. + */ + private static final int NONCE_BITS = 128; + + /** + * The minimum amount of time to wait between sweeping expired nonces from + * the Map. + */ + private static final long SWEEP_INTERVAL = 60000; + + /** + * Iterates through the entire Map of generated nonces, removing any nonce + * that has exceeded its expiration timestamp. If insufficient time has + * elapsed since the last sweep, as dictated by SWEEP_INTERVAL, this + * function has no effect. + */ + private void sweepExpiredNonces() { + + // Do not sweep until enough time has elapsed since the last sweep + long currentTime = System.currentTimeMillis(); + if (currentTime - lastSweep < SWEEP_INTERVAL) + return; + + // Record time of sweep + lastSweep = currentTime; + + // For each stored nonce + Iterator> entries = nonces.entrySet().iterator(); + while (entries.hasNext()) { + + // Remove all entries which have expired + Map.Entry current = entries.next(); + if (current.getValue() <= System.currentTimeMillis()) + entries.remove(); + + } + + } + + /** + * Generates a cryptographically-secure nonce value. The nonce is intended + * to be used to prevent replay attacks. + * + * @param maxAge + * The maximum amount of time that the generated nonce should remain + * valid, in milliseconds. + * + * @return + * A cryptographically-secure nonce value. Generated nonces are at + * least 128-bit and are case-insensitive. + */ + public String generate(long maxAge) { + + // Sweep expired nonces if enough time has passed + sweepExpiredNonces(); + + // Generate and store nonce, along with expiration timestamp + String nonce = IdentifierGenerator.generateIdentifier(NONCE_BITS, false); + nonces.put(nonce, System.currentTimeMillis() + maxAge); + return nonce; + + } + + /** + * Returns whether the give nonce value is valid. A nonce is valid if and + * only if it was generated by this instance of the NonceService. Testing + * nonce validity through this function immediately and permanently + * invalidates that nonce. + * + * @param nonce + * The nonce value to test. This value may be null, which will be + * considered an invalid nonce. Comparisons are case-insensitive. + * + * @return + * true if the provided nonce is valid, false otherwise. + */ + public boolean isValid(String nonce) { + + // All null nonces are invalid. + if (nonce == null) + return false; + + // Remove nonce, verifying whether it was present at all + Long expires = nonces.remove(nonce.toLowerCase(Locale.US)); + if (expires == null) + return false; + + // Nonce is only valid if it hasn't expired + return expires > System.currentTimeMillis(); + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationEventListener.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationEventListener.java new file mode 100644 index 0000000..46df4fd --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationEventListener.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sso; + +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.event.AuthenticationFailureEvent; +import org.apache.guacamole.net.event.AuthenticationRequestReceivedEvent; +import org.apache.guacamole.net.event.CredentialEvent; +import org.apache.guacamole.net.event.listener.Listener; + +/** + * A Listener that will reactivate or invalidate SSO auth sessions depending on + * overall auth success or failure. + */ +public abstract class SSOAuthenticationEventListener implements Listener { + + @Override + public void handleEvent(Object event) throws GuacamoleException { + + // If the authentication attempt is incomplete or credentials cannot be + // extracted, there's nothing to do + if (event instanceof AuthenticationRequestReceivedEvent + || !(event instanceof CredentialEvent)) + return; + + // Look for a session identifier associated with these credentials + String sessionIdentifier = getSessionIdentifier( + ((CredentialEvent) event).getCredentials()); + + // If no session is associated with these credentials, there's + // nothing to do + if (sessionIdentifier == null) + return; + + // If the SSO auth succeeded, but other auth providers failed to + // authenticate the user associated with the credentials in this + // failure event, they may wish to make another login attempt. To + // avoid an infinite login attempt loop, re-enable the session + // associated with these credentials, allowing the auth attempt to be + // resumed without requiring another round trip to the SSO service. + if (event instanceof AuthenticationFailureEvent) { + Throwable failure = ((AuthenticationFailureEvent) event).getFailure(); + + // If and only if the failure was associated with missing or + // credentials, or a non-security related request issue, + // reactivate the session + if (failure instanceof GuacamoleInsufficientCredentialsException + || ((failure instanceof GuacamoleClientException) + && !(failure instanceof GuacamoleSecurityException))) { + + reactivateSession(sessionIdentifier); + return; + + } + + } + + // Invalidate the session in all other cases + invalidateSession(sessionIdentifier); + + } + + /** + * Get the session identifier associated with the provided credentials, + * if any. If no session is associated with the credentials, null will + * be returned. + * + * @param credentials + * The credentials assoociated with the deferred SSO authentication + * session to reactivate. + * + * @return + * The session identifier associated with the provided credentials, + * or null if no session is found. + */ + protected abstract String getSessionIdentifier(Credentials credentials); + + /** + * Reactivate the session identified by the provided identifier, if any. + * + * @param sessionIdentifier + * The identifier of the session to reactivate. + */ + protected abstract void reactivateSession(String sessionIdentifier); + + /** + * Invalidate the session identified by the provided identifier, if any. + * + * @param sessionIdentifier + * The identifier of the session to invalidate. + */ + protected abstract void invalidateSession(String sessionIdentifier); + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationProvider.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationProvider.java new file mode 100644 index 0000000..3a00192 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationProvider.java @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sso; + +import com.google.common.collect.Iterables; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import com.google.inject.binder.LinkedBindingBuilder; +import java.util.Arrays; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.TokenInjectingUserContext; +import org.apache.guacamole.net.auth.UserContext; + +/** + * An AuthenticationProvider which authenticates users against an arbitrary + * SSO system. Guice dependency injection is automatically configured via + * modules provided by the implementation. Implementations will typically + * provide no storage for connections, instead relying on other installed + * extensions. + */ +public abstract class SSOAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * The Guice injector. + */ + private final Injector injector; + + /** + * Creates a new SSOAuthenticationProvider that authenticates users against + * an arbitrary SSO system. Guice dependency injection is automatically + * configured, with the resulting injector available to implementations via + * {@link #getInjector()}. Core authentication functions are provided by + * the given SSOAuthenticationProviderService implementation, and + * additional implementation-specific services, providers, etc. may be + * bound by specifying additional Guice modules. + * + * @param authService + * The SSOAuthenticationProviderService implementation that should be + * used for core authentication functions. + * + * @param ssoResource + * The SSOResource that should be used to manually redirect the user to + * the IdP, as well as to provide any implementation-specific REST + * endpoints. + * + * @param modules + * Any additional modules that should be used when creating the Guice + * injector. + */ + public SSOAuthenticationProvider( + Class authService, + Class ssoResource, + Module... modules) { + this(authService, ssoResource, Arrays.asList(modules)); + } + + /** + * Creates a new SSOAuthenticationProvider that authenticates users against + * an arbitrary SSO system. Guice dependency injection is automatically + * configured, with the resulting injector available to implementations via + * {@link #getInjector()}. Core authentication functions are provided by + * the given SSOAuthenticationProviderService implementation, and + * additional may be provided by specifying additional Guice modules. + * + * @param authService + * The SSOAuthenticationProviderService implementation that should be + * used for core authentication functions. + * + * @param ssoResource + * The SSOResource that should be used to manually redirect the user to + * the IdP, as well as to provide any implementation-specific REST + * endpoints. + * + * @param modules + * Any additional modules that should be used when creating the Guice + * injector. + */ + public SSOAuthenticationProvider( + Class authService, + Class ssoResource, + Iterable modules) { + injector = Guice.createInjector(Iterables.concat(Collections.singletonList(new AbstractModule() { + + @Override + protected void configure() { + + bind(AuthenticationProvider.class).toInstance(SSOAuthenticationProvider.this); + bind(SSOAuthenticationProviderService.class).to(authService); + + // Bind custom SSOResource implementation if different from + // core implementation (explicitly binding SSOResource as + // SSOResource results in a runtime error from Guice otherwise) + LinkedBindingBuilder resourceBinding = bind(SSOResource.class); + if (ssoResource != SSOResource.class) + resourceBinding.to(ssoResource); + + } + + }), modules)); + } + + /** + * Returns the Guice injector available for use by this implementation of + * SSOAuthenticationProvider. The returned injector has already been + * configured with all modules supplied at the time this + * SSOAuthenticationProvider was created. + * + * @return + * The Guice injector available for use by this implementation of + * SSOAuthenticationProvider. + */ + protected final Injector getInjector() { + return injector; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Attempt to authenticate user with given credentials + SSOAuthenticationProviderService authProviderService = + injector.getInstance(SSOAuthenticationProviderService.class); + + return authProviderService.authenticateUser(credentials); + + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + + // Only inject tokens for users authenticated by this extension + if (authenticatedUser.getAuthenticationProvider() != this) + return context; + + return new TokenInjectingUserContext(context, + ((SSOAuthenticatedUser) authenticatedUser).getTokens()); + + } + + @Override + public SSOResource getResource() { + return getInjector().getInstance(SSOResource.class); + } + + @Override + public void shutdown() { + injector.getInstance(SSOAuthenticationProviderService.class).shutdown(); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationProviderService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationProviderService.java new file mode 100644 index 0000000..d35c07d --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOAuthenticationProviderService.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sso; + +import java.net.URI; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Service that authenticates Guacamole users by leveraging an arbitrary SSO + * service. + */ +public interface SSOAuthenticationProviderService { + + /** + * Returns an SSOAuthenticatedUser representing the user authenticated by + * the given credentials. Tokens associated with the returned + * SSOAuthenticatedUser will automatically be injected into any connections + * used by that user during their session. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * An SSOAuthenticatedUser representing the user authenticated by the + * given credentials. + * + * @throws GuacamoleException + * If an error occurs while authenticating the user, or if access is + * denied. + */ + SSOAuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException; + + /** + * Returns the full URI of the login endpoint to which a user must be + * redirected in order to authenticate with the SSO identity provider. + * + * @return + * The full URI of the SSO login endpoint. + * + * @throws GuacamoleException + * If configuration information required for generating the login URI + * cannot be read. + */ + URI getLoginURI() throws GuacamoleException; + + /** + * Frees all resources associated with the relevant + * SSOAuthenticationProvider implementation. This function is automatically + * invoked when an implementation of SSOAuthenticationProvider is shut + * down. + */ + void shutdown(); + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOResource.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOResource.java new file mode 100644 index 0000000..91bd39b --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/SSOResource.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.auth.sso; + +import com.google.inject.Inject; +import javax.ws.rs.core.Response; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import org.apache.guacamole.GuacamoleException; + +/** + * REST API resource that provides allows the user to be manually redirected to + * the applicable identity provider. Implementations may also provide + * additional resources and endpoints beneath this resource as needed. + */ +public class SSOResource { + + /** + * Service for authenticating users using CAS. + */ + @Inject + private SSOAuthenticationProviderService authService; + + /** + * Redirects the user to the relevant identity provider. If the SSO + * extension defining this resource is not the primary extension, and thus + * the user will not be automatically redirected to the IdP, this endpoint + * allows that redirect to occur manually upon a link/button click. + * + * @return + * An HTTP Response that will redirect the user to the IdP. + * + * @throws GuacamoleException + * If an error occurs preventing the redirect from being created. + */ + @GET + @Path("login") + public Response redirectToIdentityProvider() throws GuacamoleException { + return Response.seeOther(authService.getLoginURI()).build(); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/user/SSOAuthenticatedUser.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/user/SSOAuthenticatedUser.java new file mode 100644 index 0000000..4b40895 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/java/org/apache/guacamole/auth/sso/user/SSOAuthenticatedUser.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.sso.user; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An AuthenticatedUser whose identity has been supplied by an arbitrary SSO + * service. An SSOAuthenticatedUser may additionally be associated with a set + * of user-specific parameter tokens to be injected into any connections used + * by that user. + */ +public class SSOAuthenticatedUser extends AbstractAuthenticatedUser { + + /** + * Reference to the authentication provider associated with this + * authenticated user. + */ + @Inject + private AuthenticationProvider authProvider; + + /** + * The credentials provided when this user was authenticated. + */ + private Credentials credentials; + + /** + * The groups that this user belongs to. + */ + private Set effectiveGroups; + + /** + * Parameter tokens to be automatically injected for any connections used + * by this user. + */ + private Map tokens; + + /** + * Initializes this SSOAuthenticatedUser, associating it with the given + * username, credentials, groups, and parameter tokens. The contents of the + * given credentials are automatically updated to match the provided + * username. This function must be invoked for every SSOAuthenticatedUser + * created. + * + * @param username + * The username of the user that was authenticated. + * + * @param credentials + * The credentials provided when this user was authenticated. These + * credentials will be updated to match the provided username. + * + * @param effectiveGroups + * The groups that the authenticated user belongs to. + * + * @param tokens + * A map of all the name/value pairs that should be available + * as tokens when connections are established by this user. + */ + public void init(String username, Credentials credentials, + Set effectiveGroups, Map tokens) { + + this.credentials = credentials; + this.effectiveGroups = Collections.unmodifiableSet(effectiveGroups); + this.tokens = Collections.unmodifiableMap(tokens); + setIdentifier(username); + + // Update credentials with username provided via SSO for sake of + // ${GUAC_USERNAME} token + credentials.setUsername(username); + + } + + /** + * Returns a Map of the parameter tokens that should be automatically + * injected into connections used by this user during their session. If + * there are no parameter tokens applicable to the SSO implementation, this + * may simply be an empty map. + * + * @return + * A map of the parameter token name/value pairs that should be + * automatically injected into connections used by this user. + */ + public Map getTokens() { + return tokens; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public Set getEffectiveUserGroups() { + return effectiveGroups; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/html/sso-providers.html b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/html/sso-providers.html new file mode 100644 index 0000000..309d1bb --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/html/sso-providers.html @@ -0,0 +1,5 @@ + +
+ {{ 'LOGIN.SECTION_HEADER_SSO_OPTIONS' | translate }} +
    +
    diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/styles/sso-providers.css b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/styles/sso-providers.css new file mode 100644 index 0000000..5f8b49a --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/styles/sso-providers.css @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.login-ui .sso-providers { + + padding: 0.25em 0.5em; + position: absolute; + bottom: 0; + left: 0; + +} + +.sso-providers ul { + list-style: none; +} + +.sso-providers ul, .sso-providers li { + display: inline-block; + margin: 0; + padding: 0; +} + +.sso-providers li::before { + content: ' / '; +} + +.sso-providers li:first-child::before { + display: none; +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ca.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ca.json new file mode 100644 index 0000000..b2d3c38 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ca.json @@ -0,0 +1,15 @@ +{ + + "DATA_SOURCE_CAS" : { + "NAME" : "Backend d'inici de sessió unificat (SSO) CAS" + }, + + "DATA_SOURCE_SAML" : { + "NAME" : "Extensión de autenticación SAML" + }, + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "Espereu, redirigint al proveïdor d'identitat ..." + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/de.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/de.json new file mode 100644 index 0000000..cc391fc --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/de.json @@ -0,0 +1,7 @@ +{ + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "Bitte warten, Sie werden zum Identitätsprovider weitergeleitet..." + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/en.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/en.json new file mode 100644 index 0000000..085414b --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/en.json @@ -0,0 +1,32 @@ +{ + + "DATA_SOURCE_CAS" : { + "NAME" : "CAS SSO Backend" + }, + + "DATA_SOURCE_OPENID" : { + "NAME" : "OpenID SSO Backend" + }, + + "DATA_SOURCE_SAML" : { + "NAME" : "SAML SSO Backend" + }, + + "DATA_SOURCE_SSL" : { + "NAME" : "SSL/TLS SSO Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_ID_TOKEN" : "", + "FIELD_HEADER_STATE" : "", + "FIELD_HEADER_TICKET" : "", + "INFO_IDP_REDIRECT_PENDING" : "Please wait, redirecting to identity provider...", + "INFO_REDIRECT_PENDING" : "Please wait while you are redirected...", + "NAME_IDP_CAS" : "CAS", + "NAME_IDP_OPENID" : "OpenID", + "NAME_IDP_SAML" : "SAML", + "NAME_IDP_SSL" : "Certificate / Smart Card", + "SECTION_HEADER_SSO_OPTIONS" : "Sign in with:" + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/fr.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/fr.json new file mode 100644 index 0000000..fc9faa2 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/fr.json @@ -0,0 +1,29 @@ +{ + + "DATA_SOURCE_CAS" : { + "NAME" : "Backend CAS SSO" + }, + + "DATA_SOURCE_OPENID" : { + "NAME" : "Backend OpenID SSO" + }, + + "DATA_SOURCE_SAML" : { + "NAME" : "Backend SAML SSO" + }, + + "DATA_SOURCE_SSL" : { + "NAME" : "Backend SSL/TLS SSO" + }, + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "Veuillez patienter, redirection vers le fournisseur d'identité...", + "INFO_REDIRECT_PENDING" : "Veuillez patienter pendant que vous êtes redirigé...", + "NAME_IDP_CAS" : "CAS", + "NAME_IDP_OPENID" : "OpenID", + "NAME_IDP_SAML" : "SAML", + "NAME_IDP_SSL" : "Certificat / Carte à puce", + "SECTION_HEADER_SSO_OPTIONS" : "Connectez-vous avec:" + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/it.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/it.json new file mode 100644 index 0000000..bafa8c3 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/it.json @@ -0,0 +1,11 @@ +{ + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "Attendi, reindirizzamento al provider di identità...", + "NAME_IDP_CAS" : "CAS", + "NAME_IDP_OPENID" : "OpenID", + "NAME_IDP_SAML" : "SAML", + "SECTION_HEADER_SSO_OPTIONS" : "Accedi con:" + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ja.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ja.json new file mode 100644 index 0000000..fde74e5 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ja.json @@ -0,0 +1,7 @@ +{ + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "IDプロバイダへリダイレクトしています。" + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ko.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ko.json new file mode 100644 index 0000000..a0a3eb9 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ko.json @@ -0,0 +1,11 @@ +{ + + "DATA_SOURCE_SAML" : { + "NAME" : "SAML 인증 확장 프로그램" + }, + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "잠시만 기다려주십시오. ID 제공자로 리디렉션 중..." + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/pl.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/pl.json new file mode 100644 index 0000000..9e391ec --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/pl.json @@ -0,0 +1,26 @@ +{ + + "DATA_SOURCE_CAS" : { + "NAME" : "CAS SSO Backend" + }, + + "DATA_SOURCE_OPENID" : { + "NAME" : "OpenID SSO Backend" + }, + + "DATA_SOURCE_SAML" : { + "NAME" : "SAML SSO Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_ID_TOKEN" : "", + "FIELD_HEADER_STATE" : "", + "FIELD_HEADER_TICKET" : "", + "INFO_IDP_REDIRECT_PENDING" : "Proszę czekać, przekierowanie do dostawcy tożsamości...", + "NAME_IDP_CAS" : "CAS", + "NAME_IDP_OPENID" : "OpenID", + "NAME_IDP_SAML" : "SAML", + "SECTION_HEADER_SSO_OPTIONS" : "Zaloguj z:" + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/pt.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/pt.json new file mode 100644 index 0000000..2bba972 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/pt.json @@ -0,0 +1,7 @@ +{ + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "Por favor aguarde, redirecionando ao provedor de indentidade..." + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ru.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ru.json new file mode 100644 index 0000000..9469e6f --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/ru.json @@ -0,0 +1,15 @@ +{ + + "DATA_SOURCE_CAS" : { + "NAME" : "Бэкенд CAS SSO" + }, + + "DATA_SOURCE_OPENID" : { + "NAME" : "Бэкенд OpenID SSO" + }, + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "Пожалуйста, подождите. Переадресую на страницу аутентификации..." + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/zh.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/zh.json new file mode 100644 index 0000000..9d02684 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-base/src/main/resources/translations/zh.json @@ -0,0 +1,15 @@ +{ + + "DATA_SOURCE_CAS" : { + "NAME" : "CAS SSO后端" + }, + + "DATA_SOURCE_OPENID" : { + "NAME" : "OpenID SSO后端" + }, + + "LOGIN" : { + "INFO_IDP_REDIRECT_PENDING" : "请稍候,正在重定向到身份提供者..." + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/.gitignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/.gitignore new file mode 100644 index 0000000..30eb487 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/.gitignore @@ -0,0 +1,3 @@ +*~ +target/ +src/main/resources/generated/ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/.ratignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/pom.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/pom.xml new file mode 100644 index 0000000..93f677e --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/pom.xml @@ -0,0 +1,160 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso-cas + jar + 1.6.0 + guacamole-auth-sso-cas + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-sso + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + + + + + org.apache.guacamole + guacamole-auth-sso-base + + + + + org.jasig.cas.client + cas-client-core + 3.6.4 + + + + + org.glassfish.jaxb + jaxb-core + + + + + commons-codec + commons-codec + + + + + org.bouncycastle + bcpkix-jdk15on + + + + + + + + org.bouncycastle + bcpkix-jdk15to18 + 1.80 + + + + + com.google.guava + guava + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + + + + + javax.ws.rs + jsr311-api + + + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + + + javax.xml.bind + jaxb-api + 2.3.1 + + + + + commons-codec + commons-codec + 1.17.1 + + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/AuthenticationProviderService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/AuthenticationProviderService.java new file mode 100644 index 0000000..0980667 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/AuthenticationProviderService.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.net.URI; +import java.util.Arrays; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.auth.cas.conf.ConfigurationService; +import org.apache.guacamole.auth.cas.ticket.TicketValidationService; +import org.apache.guacamole.auth.sso.SSOAuthenticationProviderService; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.form.RedirectField; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * Service that authenticates Guacamole users by processing CAS tickets. + */ +@Singleton +public class AuthenticationProviderService implements SSOAuthenticationProviderService { + + /** + * The parameter that will be present upon successful CAS authentication. + */ + public static final String TICKET_PARAMETER_NAME = "ticket"; + + /** + * The standard URI name for the CAS login resource. + */ + private static final String CAS_LOGIN_URI = "login"; + + /** + * Service for retrieving CAS configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Service for validating received ID tickets. + */ + @Inject + private TicketValidationService ticketService; + + @Override + public SSOAuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Pull CAS ticket from request if present + String ticket = credentials.getParameter(TICKET_PARAMETER_NAME); + if (ticket != null) { + return ticketService.validateTicket(ticket, credentials); + } + + // Request CAS ticket (will automatically redirect the user to the + // CAS authorization page via JavaScript) + throw new GuacamoleInvalidCredentialsException("Invalid login.", + new CredentialsInfo(Arrays.asList(new Field[] { + new RedirectField(TICKET_PARAMETER_NAME, getLoginURI(), + new TranslatableMessage("LOGIN.INFO_IDP_REDIRECT_PENDING")) + + })) + ); + + } + + @Override + public URI getLoginURI() throws GuacamoleException { + return UriBuilder.fromUri(confService.getAuthorizationEndpoint()) + .path(CAS_LOGIN_URI) + .queryParam("service", confService.getRedirectURI()) + .build(); + } + + @Override + public void shutdown() { + // Nothing to clean up + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java new file mode 100644 index 0000000..2b542fc --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas; + +import org.apache.guacamole.auth.sso.SSOAuthenticationProvider; +import org.apache.guacamole.auth.sso.SSOResource; + +/** + * Guacamole authentication backend which authenticates users using an + * arbitrary external system implementing CAS. No storage for connections is + * provided - only authentication. Storage must be provided by some other + * extension. + */ +public class CASAuthenticationProvider extends SSOAuthenticationProvider { + + /** + * Creates a new CASAuthenticationProvider that authenticates users + * against an CAS service + */ + public CASAuthenticationProvider() { + super(AuthenticationProviderService.class, + SSOResource.class, new CASAuthenticationProviderModule()); + } + + @Override + public String getIdentifier() { + return "cas"; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProviderModule.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProviderModule.java new file mode 100644 index 0000000..a9568b6 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProviderModule.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.auth.cas.conf.CASEnvironment; +import org.apache.guacamole.auth.cas.conf.ConfigurationService; +import org.apache.guacamole.auth.cas.ticket.TicketValidationService; +import org.apache.guacamole.environment.Environment; + +/** + * Guice module which configures CAS-specific injections. + */ +public class CASAuthenticationProviderModule extends AbstractModule { + + /** + * The configuration environment for this server and extension. + */ + private final Environment environment = new CASEnvironment(); + + @Override + protected void configure() { + bind(ConfigurationService.class); + bind(TicketValidationService.class); + + bind(Environment.class).toInstance(environment); + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/CASEnvironment.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/CASEnvironment.java new file mode 100644 index 0000000..1c76d85 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/CASEnvironment.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.conf; + +import org.apache.guacamole.environment.DelegatingEnvironment; +import org.apache.guacamole.environment.LocalEnvironment; + +/** + * An environment for retrieving CAS-related properties from the Guacamole + * configuration. + */ +public class CASEnvironment extends DelegatingEnvironment { + + /** + * Create a new instance of the configuration environment for the + * CAS SSO module, pulling the default instance of the LocalEnvironment. + */ + public CASEnvironment() { + super(LocalEnvironment.getInstance()); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/CASGuacamoleProperties.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/CASGuacamoleProperties.java new file mode 100644 index 0000000..7bb363f --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/CASGuacamoleProperties.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.conf; + +import org.apache.guacamole.auth.cas.group.GroupFormat; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.URIGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; + +/** + * Provides properties required for use of the CAS authentication provider. + * These properties will be read from guacamole.properties when the CAS + * authentication provider is used. + */ +public class CASGuacamoleProperties { + + /** + * This class should not be instantiated. + */ + private CASGuacamoleProperties() {} + + /** + * The authorization endpoint (URI) of the CAS service. + */ + public static final URIGuacamoleProperty CAS_AUTHORIZATION_ENDPOINT = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "cas-authorization-endpoint"; } + + }; + + /** + * The URI that the CAS service should redirect to after the + * authentication process is complete. This must be the full URL that a + * user would enter into their browser to access Guacamole. + */ + public static final URIGuacamoleProperty CAS_REDIRECT_URI = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "cas-redirect-uri"; } + + }; + + /** + * The location of the private key file used to retrieve the + * password if CAS is configured to support ClearPass. + */ + public static final PrivateKeyGuacamoleProperty CAS_CLEARPASS_KEY = + new PrivateKeyGuacamoleProperty() { + + @Override + public String getName() { return "cas-clearpass-key"; } + + }; + + /** + * The name of the CAS attribute used for group membership, such as + * "memberOf". This attribute is case sensitive. + */ + public static final StringGuacamoleProperty CAS_GROUP_ATTRIBUTE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "cas-group-attribute"; } + + }; + + /** + * The format used by CAS to represent group names. Possible formats are + * "plain" (simple text names) or "ldap" (fully-qualified LDAP DNs). + */ + public static final EnumGuacamoleProperty CAS_GROUP_FORMAT = + new EnumGuacamoleProperty(GroupFormat.class) { + + @Override + public String getName() { return "cas-group-format"; } + + }; + + /** + * The LDAP base DN to require for all CAS groups. + */ + public static final LdapNameGuacamoleProperty CAS_GROUP_LDAP_BASE_DN = + new LdapNameGuacamoleProperty() { + + @Override + public String getName() { return "cas-group-ldap-base-dn"; } + + }; + + /** + * The LDAP attribute to require for the names of CAS groups. + */ + public static final StringGuacamoleProperty CAS_GROUP_LDAP_ATTRIBUTE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "cas-group-ldap-attribute"; } + + }; + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/ConfigurationService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/ConfigurationService.java new file mode 100644 index 0000000..ce5edd8 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/ConfigurationService.java @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.conf; + +import com.google.inject.Inject; +import java.net.URI; +import java.security.PrivateKey; +import javax.naming.ldap.LdapName; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.cas.group.GroupFormat; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.auth.cas.group.GroupParser; +import org.apache.guacamole.auth.cas.group.LDAPGroupParser; +import org.apache.guacamole.auth.cas.group.PlainGroupParser; + +/** + * Service for retrieving configuration information regarding the CAS service. + */ +public class ConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns the authorization endpoint (URI) of the CAS service as + * configured with guacamole.properties. + * + * @return + * The authorization endpoint of the CAS service, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the authorization + * endpoint property is missing. + */ + public URI getAuthorizationEndpoint() throws GuacamoleException { + return environment.getRequiredProperty(CASGuacamoleProperties.CAS_AUTHORIZATION_ENDPOINT); + } + + /** + * Returns the URI that the CAS service should redirect to after + * the authentication process is complete, as configured with + * guacamole.properties. This must be the full URL that a user would enter + * into their browser to access Guacamole. + * + * @return + * The URI to redirect the client back to after authentication + * is completed, as configured in guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the redirect URI + * property is missing. + */ + public URI getRedirectURI() throws GuacamoleException { + return environment.getRequiredProperty(CASGuacamoleProperties.CAS_REDIRECT_URI); + } + + /** + * Returns the PrivateKey used to decrypt the credential object + * sent encrypted by CAS, or null if no key is defined. + * + * @return + * The PrivateKey used to decrypt the ClearPass + * credential returned by CAS. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public PrivateKey getClearpassKey() throws GuacamoleException { + return environment.getProperty(CASGuacamoleProperties.CAS_CLEARPASS_KEY); + } + + /** + * Returns the CAS attribute that should be used to determine group + * memberships in CAS, such as "memberOf". If no attribute has been + * specified, null is returned. + * + * @return + * The attribute name used to determine group memberships in CAS, + * null if not defined. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getGroupAttribute() throws GuacamoleException { + return environment.getProperty(CASGuacamoleProperties.CAS_GROUP_ATTRIBUTE); + } + + /** + * Returns the format that CAS is expected to use for its group names, such + * as {@link GroupFormat#PLAIN} (simple plain-text names) or + * {@link GroupFormat#LDAP} (fully-qualified LDAP DNs). If not specified, + * PLAIN is used by default. + * + * @return + * The format that CAS is expected to use for its group names. + * + * @throws GuacamoleException + * If the format specified within guacamole.properties is not valid. + */ + public GroupFormat getGroupFormat() throws GuacamoleException { + return environment.getProperty(CASGuacamoleProperties.CAS_GROUP_FORMAT, GroupFormat.PLAIN); + } + + /** + * Returns the base DN that all LDAP-formatted CAS groups must reside + * beneath. Any groups that are not beneath this base DN should be ignored. + * If no such base DN is provided, the tree structure of the ancestors of + * LDAP-formatted CAS groups should not be considered. + * + * @return + * The base DN that all LDAP-formatted CAS groups must reside beneath, + * or null if the tree structure of the ancestors of LDAP-formatted + * CAS groups should not be considered. + * + * @throws GuacamoleException + * If the provided base DN is not a valid LDAP DN. + */ + public LdapName getGroupLDAPBaseDN() throws GuacamoleException { + return environment.getProperty(CASGuacamoleProperties.CAS_GROUP_LDAP_BASE_DN); + } + + /** + * Returns the LDAP attribute that should be required for all LDAP-formatted + * CAS groups. Any groups that do not use this attribute as the last + * (leftmost) attribute of their DN should be ignored. If no such LDAP + * attribute is provided, the last (leftmost) attribute should still be + * used to determine the group name, but the specific attribute involved + * should not be considered. + * + * @return + * The LDAP attribute that should be required for all LDAP-formatted + * CAS groups, or null if any attribute should be allowed. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getGroupLDAPAttribute() throws GuacamoleException { + return environment.getProperty(CASGuacamoleProperties.CAS_GROUP_LDAP_ATTRIBUTE); + } + + /** + * Returns a GroupParser instance that can be used to parse CAS group + * names. The parser returned will take into account the configured CAS + * group format, as well as any configured LDAP-specific restrictions. + * + * @return + * A GroupParser instance that can be used to parse CAS group names as + * configured in guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public GroupParser getGroupParser() throws GuacamoleException { + switch (getGroupFormat()) { + + // Simple, plain-text groups + case PLAIN: + return new PlainGroupParser(); + + // LDAP DNs + case LDAP: + return new LDAPGroupParser(getGroupLDAPAttribute(), getGroupLDAPBaseDN()); + + default: + throw new GuacamoleServerException("Unsupported CAS group format: " + getGroupFormat()); + + } + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/LdapNameGuacamoleProperty.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/LdapNameGuacamoleProperty.java new file mode 100644 index 0000000..5469376 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/LdapNameGuacamoleProperty.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.conf; + +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is an LDAP DN. + */ +public abstract class LdapNameGuacamoleProperty implements GuacamoleProperty { + + @Override + public LdapName parseValue(String value) throws GuacamoleServerException { + + // Consider null/empty values to be empty + if (value == null || value.isEmpty()) + return null; + + // Parse provided value as an LDAP DN + try { + return new LdapName(value); + } + catch (InvalidNameException e) { + throw new GuacamoleServerException("Invalid LDAP distinguished name.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/PrivateKeyGuacamoleProperty.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/PrivateKeyGuacamoleProperty.java new file mode 100644 index 0000000..d1c1685 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/conf/PrivateKeyGuacamoleProperty.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.conf; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.security.spec.PKCS8EncodedKeySpec; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is derived from a private key file. + */ +public abstract class PrivateKeyGuacamoleProperty implements GuacamoleProperty { + + @Override + public PrivateKey parseValue(String value) throws GuacamoleServerException { + + if (value == null || value.isEmpty()) + return null; + + FileInputStream keyStreamIn = null; + + try { + try { + + // Open and read the file specified in the configuration. + File keyFile = new File(value); + keyStreamIn = new FileInputStream(keyFile); + ByteArrayOutputStream keyStreamOut = new ByteArrayOutputStream(); + byte[] keyBuffer = new byte[1024]; + + for (int readBytes; (readBytes = keyStreamIn.read(keyBuffer)) != -1;) + keyStreamOut.write(keyBuffer, 0, readBytes); + + final byte[] keyBytes = keyStreamOut.toByteArray(); + + // Set up decryption infrastructure + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + KeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + return keyFactory.generatePrivate(keySpec); + + } + catch (FileNotFoundException e) { + throw new GuacamoleServerException("Could not find the specified key file.", e); + } + catch (NoSuchAlgorithmException e) { + throw new GuacamoleServerException("RSA algorithm is not available.", e); + } + catch (InvalidKeySpecException e) { + throw new GuacamoleServerException("Key is not in expected PKCS8 encoding.", e); + } + finally { + if (keyStreamIn != null) + keyStreamIn.close(); + } + } + catch (IOException e) { + throw new GuacamoleServerException("Could not read in the specified key file.", e); + } + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/GroupFormat.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/GroupFormat.java new file mode 100644 index 0000000..4e315da --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/GroupFormat.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.group; + +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * Possible formats of group names received from CAS. + */ +public enum GroupFormat { + + /** + * Simple, plain-text group names. + */ + @PropertyValue("plain") + PLAIN, + + /** + * Group names formatted as LDAP DNs. + */ + @PropertyValue("ldap") + LDAP + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/GroupParser.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/GroupParser.java new file mode 100644 index 0000000..5c31d5d --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/GroupParser.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.group; + +/** + * Parser which converts the group names returned by CAS into names usable by + * Guacamole. The format of a CAS group name may vary by the underlying + * authentication backend. For example, a CAS deployment backed by LDAP may + * provide group names as LDAP DNs, which must be transformed into normal group + * names to be usable within Guacamole. + * + * @see LDAPGroupParser + */ +public interface GroupParser { + + /** + * Parses the given CAS group name into a group name usable by Guacamole. + * + * @param casGroup + * The group name retrieved from CAS. + * + * @return + * A group name usable by Guacamole, or null if the group is not valid. + */ + String parse(String casGroup); + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/LDAPGroupParser.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/LDAPGroupParser.java new file mode 100644 index 0000000..9a33ef7 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/LDAPGroupParser.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.group; + +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import javax.naming.ldap.Rdn; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * GroupParser that converts group names from LDAP DNs into normal group names, + * using the last (leftmost) attribute of the DN as the name. Groups may + * optionally be restricted to only those beneath a specific base DN, or only + * those using a specific attribute as their last (leftmost) attribute. + */ +public class LDAPGroupParser implements GroupParser { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(LDAPGroupParser.class); + + /** + * The LDAP attribute to require for all accepted group names. If null, any + * LDAP attribute will be allowed. + */ + private final String nameAttribute; + + /** + * The base DN to require for all accepted group names. If null, ancestor + * tree structure will not be considered in accepting/rejecting a group. + */ + private final LdapName baseDn; + + /** + * Creates a new LDAPGroupParser which applies the given restrictions on + * any provided group names. + * + * @param nameAttribute + * The LDAP attribute to require for all accepted group names. This + * restriction applies to the last (leftmost) attribute only, which is + * always used to determine the name of the group. If null, any LDAP + * attribute will be allowed in the last (leftmost) position. + * + * @param baseDn + * The base DN to require for all accepted group names. If null, + * ancestor tree structure will not be considered in + * accepting/rejecting a group. + */ + public LDAPGroupParser(String nameAttribute, LdapName baseDn) { + this.nameAttribute = nameAttribute; + this.baseDn = baseDn; + } + + @Override + public String parse(String casGroup) { + + // Reject null/empty group names + if (casGroup == null || casGroup.isEmpty()) + return null; + + // Parse group as an LDAP DN + LdapName group; + try { + group = new LdapName(casGroup); + } + catch (InvalidNameException e) { + logger.debug("CAS group \"{}\" has been rejected as it is not a " + + "valid LDAP DN.", casGroup, e); + return null; + } + + // Reject any group that is not beneath the base DN + if (baseDn != null && !group.startsWith(baseDn)) + return null; + + // If a specific name attribute is defined, restrict to groups that + // use that attribute to distinguish themselves + Rdn last = group.getRdn(group.size() - 1); + if (nameAttribute != null && !nameAttribute.equalsIgnoreCase(last.getType())) + return null; + + // The group name is the string value of the final attribute in the DN + return last.getValue().toString(); + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/PlainGroupParser.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/PlainGroupParser.java new file mode 100644 index 0000000..04c6c05 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/group/PlainGroupParser.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.group; + +/** + * GroupParser which simply passes through all CAS group names untouched. + */ +public class PlainGroupParser implements GroupParser { + + @Override + public String parse(String casGroup) { + return casGroup; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/ticket/TicketValidationService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/ticket/TicketValidationService.java new file mode 100644 index 0000000..4e8f46c --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/java/org/apache/guacamole/auth/cas/ticket/TicketValidationService.java @@ -0,0 +1,270 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.ticket; + +import com.google.common.io.BaseEncoding; +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.net.URI; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import java.nio.charset.Charset; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.cas.conf.ConfigurationService; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.token.TokenName; +import org.jasig.cas.client.authentication.AttributePrincipal; +import org.jasig.cas.client.validation.Assertion; +import org.jasig.cas.client.validation.Cas20ProxyTicketValidator; +import org.jasig.cas.client.validation.TicketValidationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for validating ID tickets forwarded to us by the client, verifying + * that they did indeed come from the CAS service. + */ +public class TicketValidationService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(TicketValidationService.class); + + /** + * The prefix to use when generating token names. + */ + public static final String CAS_ATTRIBUTE_TOKEN_PREFIX = "CAS_"; + + /** + * Service for retrieving CAS configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * Converts the given CAS attribute value object (whose type is variable) + * to a Set of String values. If the value is already a Collection of some + * kind, its values are converted to Strings and returned as the members of + * the Set. If the value is not already a Collection, it is assumed to be a + * single value, converted to a String, and used as the sole member of the + * set. + * + * @param obj + * The CAS attribute value to convert to a Set of Strings. + * + * @return + * A Set of all String values contained within the given CAS attribute + * value. + */ + private Set toStringSet(Object obj) { + + // Consider null to represent no provided values + if (obj == null) + return Collections.emptySet(); + + // If the provided object is already a Collection, produce a Collection + // where we know for certain that all values are Strings + if (obj instanceof Collection) { + return ((Collection) obj).stream() + .map(Object::toString) + .collect(Collectors.toSet()); + } + + // Otherwise, assume we have only a single value + return Collections.singleton(obj.toString()); + + } + + /** + * Validates and parses the given ID ticket, returning a map of all + * available tokens for the given user based on attributes provided by the + * CAS server. If the ticket is invalid an exception is thrown. + * + * @param ticket + * The ID ticket to validate and parse. + * + * @param credentials + * The Credentials object to store retrieved username and + * password values in. + * + * @return + * A CASAuthenticatedUser instance containing the ticket data returned by the CAS server. + * + * @throws GuacamoleException + * If the ID ticket is not valid or guacamole.properties could + * not be parsed. + */ + public SSOAuthenticatedUser validateTicket(String ticket, + Credentials credentials) throws GuacamoleException { + + // Create a ticket validator that uses the configured CAS URL + URI casServerUrl = confService.getAuthorizationEndpoint(); + Cas20ProxyTicketValidator validator = new Cas20ProxyTicketValidator(casServerUrl.toString()); + validator.setAcceptAnyProxy(true); + validator.setEncoding("UTF-8"); + + // Attempt to validate the supplied ticket + Assertion assertion; + try { + URI confRedirectURI = confService.getRedirectURI(); + assertion = validator.validate(ticket, confRedirectURI.toString()); + } + catch (TicketValidationException e) { + throw new GuacamoleException("Ticket validation failed.", e); + } + + // Pull user principal and associated attributes + AttributePrincipal principal = assertion.getPrincipal(); + Map ticketAttrs = new HashMap<>(principal.getAttributes()); + + // Retrieve user identity from principal + String username = principal.getName(); + if (username == null) + throw new GuacamoleSecurityException("No username provided by CAS."); + + // Canonicalize username as lowercase + username = username.toLowerCase(); + + // Retrieve password, attempt decryption, and set credentials. + Object credObj = ticketAttrs.remove("credential"); + if (credObj != null) { + String clearPass = decryptPassword(credObj.toString()); + if (clearPass != null && !clearPass.isEmpty()) + credentials.setPassword(clearPass); + } + + Set effectiveGroups; + + // Parse effective groups from principal attributes if a specific + // group attribute has been configured + String groupAttribute = confService.getGroupAttribute(); + if (groupAttribute != null) { + effectiveGroups = toStringSet(ticketAttrs.get(groupAttribute)).stream() + .map(confService.getGroupParser()::parse) + .collect(Collectors.toSet()); + } + + // Otherwise, assume no effective groups + else + effectiveGroups = Collections.emptySet(); + + // Convert remaining attributes that have values to Strings + Map tokens = new HashMap<>(ticketAttrs.size()); + ticketAttrs.forEach((key, value) -> { + if (value != null) { + String tokenName = TokenName.canonicalize(key, CAS_ATTRIBUTE_TOKEN_PREFIX); + tokens.put(tokenName, value.toString()); + } + }); + + SSOAuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(username, credentials, effectiveGroups, tokens); + return authenticatedUser; + + } + + /** + * Takes an encrypted string representing a password provided by + * the CAS ClearPass service and decrypts it using the private + * key configured for this extension. Returns null if it is + * unable to decrypt the password. + * + * @param encryptedPassword + * A string with the encrypted password provided by the + * CAS service. + * + * @return + * The decrypted password, or null if it is unable to + * decrypt the password. + * + * @throws GuacamoleException + * If unable to get Guacamole configuration data + */ + private final String decryptPassword(String encryptedPassword) + throws GuacamoleException { + + // If we get nothing, we return nothing. + if (encryptedPassword == null || encryptedPassword.isEmpty()) { + logger.warn("No or empty encrypted password, no password will be available."); + return null; + } + + final PrivateKey clearpassKey = confService.getClearpassKey(); + if (clearpassKey == null) { + logger.debug("No private key available to decrypt password."); + return null; + } + + try { + + final Cipher cipher = Cipher.getInstance(clearpassKey.getAlgorithm()); + + if (cipher == null) + throw new GuacamoleServerException("Failed to initialize cipher object with private key."); + + // Initialize the Cipher in decrypt mode. + cipher.init(Cipher.DECRYPT_MODE, clearpassKey); + + // Decode and decrypt, and return a new string. + final byte[] pass64 = BaseEncoding.base64().decode(encryptedPassword); + final byte[] cipherData = cipher.doFinal(pass64); + return new String(cipherData, Charset.forName("UTF-8")); + + } + catch (BadPaddingException e) { + throw new GuacamoleServerException("Bad padding when decrypting cipher data.", e); + } + catch (IllegalBlockSizeException e) { + throw new GuacamoleServerException("Illegal block size while opening private key.", e); + } + catch (InvalidKeyException e) { + throw new GuacamoleServerException("Specified private key for ClearPass decryption is invalid.", e); + } + catch (NoSuchAlgorithmException e) { + throw new GuacamoleServerException("Unexpected algorithm for the private key.", e); + } + catch (NoSuchPaddingException e) { + throw new GuacamoleServerException("No such padding trying to initialize cipher with private key.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..ed21da1 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/guac-manifest.json @@ -0,0 +1,33 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "CAS Authentication Extension", + "namespace" : "cas", + + "authProviders" : [ + "org.apache.guacamole.auth.cas.CASAuthenticationProvider" + ], + + "css" : [ + "styles/sso-providers.css" + ], + + "html" : [ + "html/sso-providers.html", + "html/sso-provider-cas.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/html/sso-provider-cas.html b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/html/sso-provider-cas.html new file mode 100644 index 0000000..6fcf14e --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/html/sso-provider-cas.html @@ -0,0 +1,4 @@ + +
  • {{ + 'LOGIN.NAME_IDP_CAS' | translate +}}
  • diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/license.txt b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/test/java/org/apache/guacamole/auth/cas/group/LDAPGroupParserTest.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/test/java/org/apache/guacamole/auth/cas/group/LDAPGroupParserTest.java new file mode 100644 index 0000000..ffff0a7 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-cas/src/test/java/org/apache/guacamole/auth/cas/group/LDAPGroupParserTest.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.cas.group; + +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +/** + * Test which confirms that the LDAPGroupParser implementation of GroupParser + * parses CAS groups correctly. + */ +public class LDAPGroupParserTest { + + /** + * LdapName instance representing the LDAP DN: "dc=example,dc=net". + */ + private final LdapName exampleBaseDn; + + /** + * Creates a new LDAPGroupParserTest that verifies the functionality of + * LDAPGroupParser. + * + * @throws InvalidNameException + * If the static string LDAP DN of any test instance of LdapName is + * unexpectedly invalid. + */ + public LDAPGroupParserTest() throws InvalidNameException { + exampleBaseDn = new LdapName("dc=example,dc=net"); + } + + /** + * Verifies that LDAPGroupParser correctly parses LDAP-based CAS groups + * when no restrictions are enforced on LDAP attributes or the base DN. + */ + @Test + public void testParseRestrictNothing() { + + GroupParser parser = new LDAPGroupParser(null, null); + + // null input should be rejected as null + assertNull(parser.parse(null)); + + // Invalid DNs should be rejected as null + assertNull(parser.parse("")); + assertNull(parser.parse("foo")); + + // Valid DNs should be accepted + assertEquals("bar", parser.parse("foo=bar")); + assertEquals("baz", parser.parse("CN=baz,dc=example,dc=com")); + assertEquals("baz", parser.parse("ou=baz,dc=example,dc=net")); + assertEquals("foo", parser.parse("ou=foo,cn=baz,dc=example,dc=net")); + assertEquals("foo", parser.parse("cn=foo,DC=example,dc=net")); + assertEquals("bar", parser.parse("CN=bar,OU=groups,dc=example,Dc=net")); + + } + + /** + * Verifies that LDAPGroupParser correctly parses LDAP-based CAS groups + * when restrictions are enforced on LDAP attributes only. + */ + @Test + public void testParseRestrictAttribute() { + + GroupParser parser = new LDAPGroupParser("cn", null); + + // null input should be rejected as null + assertNull(parser.parse(null)); + + // Invalid DNs should be rejected as null + assertNull(parser.parse("")); + assertNull(parser.parse("foo")); + + // Valid DNs not using the correct attribute should be rejected as null + assertNull(parser.parse("foo=bar")); + assertNull(parser.parse("ou=baz,dc=example,dc=com")); + assertNull(parser.parse("ou=foo,cn=baz,dc=example,dc=com")); + + // Valid DNs using the correct attribute should be accepted + assertEquals("foo", parser.parse("cn=foo,DC=example,dc=net")); + assertEquals("bar", parser.parse("CN=bar,OU=groups,dc=example,Dc=net")); + assertEquals("baz", parser.parse("CN=baz,dc=example,dc=com")); + + } + + /** + * Verifies that LDAPGroupParser correctly parses LDAP-based CAS groups + * when restrictions are enforced on the LDAP base DN only. + */ + @Test + public void testParseRestrictBaseDN() { + + GroupParser parser = new LDAPGroupParser(null, exampleBaseDn); + + // null input should be rejected as null + assertNull(parser.parse(null)); + + // Invalid DNs should be rejected as null + assertNull(parser.parse("")); + assertNull(parser.parse("foo")); + + // Valid DNs outside the base DN should be rejected as null + assertNull(parser.parse("foo=bar")); + assertNull(parser.parse("CN=baz,dc=example,dc=com")); + + // Valid DNs beneath the base DN should be accepted + assertEquals("foo", parser.parse("cn=foo,DC=example,dc=net")); + assertEquals("bar", parser.parse("CN=bar,OU=groups,dc=example,Dc=net")); + assertEquals("baz", parser.parse("ou=baz,dc=example,dc=net")); + assertEquals("foo", parser.parse("ou=foo,cn=baz,dc=example,dc=net")); + + } + + /** + * Verifies that LDAPGroupParser correctly parses LDAP-based CAS groups + * when restrictions are enforced on both LDAP attributes and the base DN. + */ + @Test + public void testParseRestrictAll() { + + GroupParser parser = new LDAPGroupParser("cn", exampleBaseDn); + + // null input should be rejected as null + assertNull(parser.parse(null)); + + // Invalid DNs should be rejected as null + assertNull(parser.parse("")); + assertNull(parser.parse("foo")); + + // Valid DNs outside the base DN should be rejected as null + assertNull(parser.parse("foo=bar")); + assertNull(parser.parse("CN=baz,dc=example,dc=com")); + + // Valid DNs beneath the base DN but not using the correct attribute + // should be rejected as null + assertNull(parser.parse("ou=baz,dc=example,dc=net")); + assertNull(parser.parse("ou=foo,cn=baz,dc=example,dc=net")); + + // Valid DNs beneath the base DN and using the correct attribute should + // be accepted + assertEquals("foo", parser.parse("cn=foo,DC=example,dc=net")); + assertEquals("bar", parser.parse("CN=bar,OU=groups,dc=example,Dc=net")); + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/.ratignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/pom.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/pom.xml new file mode 100644 index 0000000..2c59c56 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/pom.xml @@ -0,0 +1,79 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso-dist + pom + guacamole-auth-sso-dist + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-sso + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-auth-sso-cas + 1.6.0 + + + + + org.apache.guacamole + guacamole-auth-sso-openid + 1.6.0 + + + + + org.apache.guacamole + guacamole-auth-sso-saml + 1.6.0 + + + + + org.apache.guacamole + guacamole-auth-sso-ssl + 1.6.0 + + + + + + + + ${project.parent.artifactId}-${project.parent.version} + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/src/main/assembly/dist.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/src/main/assembly/dist.xml new file mode 100644 index 0000000..066da29 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-dist/src/main/assembly/dist.xml @@ -0,0 +1,82 @@ + + + + + dist + ${project.parent.artifactId}-${project.parent.version} + + + + tar.gz + + + + + + + + cas + false + + org.apache.guacamole:guacamole-auth-sso-cas + + + + + + openid + false + + org.apache.guacamole:guacamole-auth-sso-openid + + + + + + saml + false + + org.apache.guacamole:guacamole-auth-sso-saml + + + + + + ssl + false + + org.apache.guacamole:guacamole-auth-sso-ssl + + + + + + + + + + target/licenses + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/.gitignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/.gitignore new file mode 100644 index 0000000..30eb487 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/.gitignore @@ -0,0 +1,3 @@ +*~ +target/ +src/main/resources/generated/ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/.ratignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/pom.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/pom.xml new file mode 100644 index 0000000..e531434 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/pom.xml @@ -0,0 +1,132 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso-openid + jar + 1.6.0 + guacamole-auth-sso-openid + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-sso + 1.6.0 + ../../ + + + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + openid.js + + + license.txt + + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + + + + + org.apache.guacamole + guacamole-ext + + + + + org.apache.guacamole + guacamole-auth-sso-base + + + + + org.bitbucket.b_c + jose4j + 0.9.6 + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + + + + + javax.ws.rs + jsr311-api + + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/AuthenticationProviderService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/AuthenticationProviderService.java new file mode 100644 index 0000000..ca1be9e --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/AuthenticationProviderService.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.openid; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import java.net.URI; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.auth.openid.conf.ConfigurationService; +import org.apache.guacamole.auth.openid.token.TokenValidationService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.sso.NonceService; +import org.apache.guacamole.auth.sso.SSOAuthenticationProviderService; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.RedirectField; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.jose4j.jwt.JwtClaims; + +/** + * Service that authenticates Guacamole users by processing OpenID tokens. + */ +@Singleton +public class AuthenticationProviderService implements SSOAuthenticationProviderService { + + /** + * The standard HTTP parameter which will be included within the URL by all + * OpenID services upon successful authentication and redirect. + */ + public static final String TOKEN_PARAMETER_NAME = "id_token"; + + /** + * Service for retrieving OpenID configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Service for validating and generating unique nonce values. + */ + @Inject + private NonceService nonceService; + + /** + * Service for validating received ID tokens. + */ + @Inject + private TokenValidationService tokenService; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + @Override + public SSOAuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + String username = null; + Set groups = null; + Map tokens = Collections.emptyMap(); + + // Validate OpenID token in request, if present, and derive username + String token = credentials.getParameter(TOKEN_PARAMETER_NAME); + if (token != null) { + JwtClaims claims = tokenService.validateToken(token); + if (claims != null) { + username = tokenService.processUsername(claims); + groups = tokenService.processGroups(claims); + tokens = tokenService.processAttributes(claims); + } + } + + // If the username was successfully retrieved from the token, produce + // authenticated user + if (username != null) { + + // Create corresponding authenticated user + SSOAuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(username, credentials, groups, tokens); + return authenticatedUser; + + } + + // Request OpenID token (will automatically redirect the user to the + // OpenID authorization page via JavaScript) + throw new GuacamoleInvalidCredentialsException("Invalid login.", + new CredentialsInfo(Arrays.asList(new Field[] { + new RedirectField(TOKEN_PARAMETER_NAME, getLoginURI(), + new TranslatableMessage("LOGIN.INFO_IDP_REDIRECT_PENDING")) + })) + ); + + } + + @Override + public URI getLoginURI() throws GuacamoleException { + return UriBuilder.fromUri(confService.getAuthorizationEndpoint()) + .queryParam("scope", confService.getScope()) + .queryParam("response_type", "id_token") + .queryParam("client_id", confService.getClientID()) + .queryParam("redirect_uri", confService.getRedirectURI()) + .queryParam("nonce", nonceService.generate(confService.getMaxNonceValidity() * 60000L)) + .build(); + } + + @Override + public void shutdown() { + // Nothing to clean up + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java new file mode 100644 index 0000000..a760854 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.openid; + +import org.apache.guacamole.auth.sso.SSOAuthenticationProvider; +import org.apache.guacamole.auth.sso.SSOResource; + +/** + * Guacamole authentication backend which authenticates users using an + * arbitrary external system implementing OpenID. No storage for connections is + * provided - only authentication. Storage must be provided by some other + * extension. + */ +public class OpenIDAuthenticationProvider extends SSOAuthenticationProvider { + + /** + * Creates a new OpenIDAuthenticationProvider that authenticates users + * against an OpenID service. + */ + public OpenIDAuthenticationProvider() { + super(AuthenticationProviderService.class, SSOResource.class, + new OpenIDAuthenticationProviderModule()); + } + + @Override + public String getIdentifier() { + return "openid"; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProviderModule.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProviderModule.java new file mode 100644 index 0000000..6dc45f7 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProviderModule.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.openid; + +import com.google.inject.AbstractModule; +import com.google.inject.Scopes; +import org.apache.guacamole.auth.openid.conf.ConfigurationService; +import org.apache.guacamole.auth.openid.conf.OpenIDEnvironment; +import org.apache.guacamole.auth.sso.NonceService; +import org.apache.guacamole.auth.openid.token.TokenValidationService; +import org.apache.guacamole.environment.Environment; + +/** + * Guice module which configures OpenID-specific injections. + */ +public class OpenIDAuthenticationProviderModule extends AbstractModule { + + /** + * The configuration environment for this server and extension. + */ + private final Environment environment = new OpenIDEnvironment(); + + @Override + protected void configure() { + bind(ConfigurationService.class); + bind(NonceService.class).in(Scopes.SINGLETON); + bind(TokenValidationService.class); + + bind(Environment.class).toInstance(environment); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/conf/ConfigurationService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/conf/ConfigurationService.java new file mode 100644 index 0000000..96c6426 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/conf/ConfigurationService.java @@ -0,0 +1,432 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.openid.conf; + +import com.google.inject.Inject; +import java.net.URI; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.properties.URIGuacamoleProperty; + +/** + * Service for retrieving configuration information regarding the OpenID + * service. + */ +public class ConfigurationService { + + /** + * The default claim type to use to retrieve an authenticated user's + * username. + */ + private static final String DEFAULT_USERNAME_CLAIM_TYPE = "email"; + + /** + * The default claim type to use to retrieve an authenticated user's + * groups. + */ + private static final String DEFAULT_GROUPS_CLAIM_TYPE = "groups"; + + /** + * The default JWT claims list to map to tokens. + */ + private static final List DEFAULT_ATTRIBUTES_CLAIM_TYPE = Collections.emptyList(); + + /** + * The default space-separated list of OpenID scopes to request. + */ + private static final String DEFAULT_SCOPE = "openid email profile"; + + /** + * The default amount of clock skew tolerated for timestamp comparisons + * between the Guacamole server and OpenID service clocks, in seconds. + */ + private static final int DEFAULT_ALLOWED_CLOCK_SKEW = 30; + + /** + * The default maximum amount of time that an OpenID token should remain + * valid, in minutes. + */ + private static final int DEFAULT_MAX_TOKEN_VALIDITY = 300; + + /** + * The default maximum amount of time that a nonce generated by the + * Guacamole server should remain valid, in minutes. + */ + private static final int DEFAULT_MAX_NONCE_VALIDITY = 10; + + /** + * The authorization endpoint (URI) of the OpenID service. + */ + private static final URIGuacamoleProperty OPENID_AUTHORIZATION_ENDPOINT = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "openid-authorization-endpoint"; } + + }; + + /** + * The endpoint (URI) of the JWKS service which defines how received ID + * tokens (JWTs) shall be validated. + */ + private static final URIGuacamoleProperty OPENID_JWKS_ENDPOINT = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "openid-jwks-endpoint"; } + + }; + + /** + * The issuer to expect for all received ID tokens. + */ + private static final StringGuacamoleProperty OPENID_ISSUER = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "openid-issuer"; } + + }; + + /** + * The claim type which contains the authenticated user's username within + * any valid JWT. + */ + private static final StringGuacamoleProperty OPENID_USERNAME_CLAIM_TYPE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "openid-username-claim-type"; } + + }; + + /** + * The claim type which contains the authenticated user's groups within + * any valid JWT. + */ + private static final StringGuacamoleProperty OPENID_GROUPS_CLAIM_TYPE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "openid-groups-claim-type"; } + + }; + + /** + * The claims within any valid JWT that should be mapped to + * the authenticated user's tokens, as configured with guacamole.properties. + */ + private static final StringGuacamoleProperty OPENID_ATTRIBUTES_CLAIM_TYPE = + new StringGuacamoleProperty() { + @Override + public String getName() { return "openid-attributes-claim-type"; } + }; + + /** + * The space-separated list of OpenID scopes to request. + */ + private static final StringGuacamoleProperty OPENID_SCOPE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "openid-scope"; } + + }; + + /** + * The amount of clock skew tolerated for timestamp comparisons between the + * Guacamole server and OpenID service clocks, in seconds. + */ + private static final IntegerGuacamoleProperty OPENID_ALLOWED_CLOCK_SKEW = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "openid-allowed-clock-skew"; } + + }; + + /** + * The maximum amount of time that an OpenID token should remain valid, in + * minutes. + */ + private static final IntegerGuacamoleProperty OPENID_MAX_TOKEN_VALIDITY = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "openid-max-token-validity"; } + + }; + + /** + * The maximum amount of time that a nonce generated by the Guacamole server + * should remain valid, in minutes. As each OpenID request has a unique + * nonce value, this imposes an upper limit on the amount of time any + * particular OpenID request can result in successful authentication within + * Guacamole. + */ + private static final IntegerGuacamoleProperty OPENID_MAX_NONCE_VALIDITY = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "openid-max-nonce-validity"; } + + }; + + /** + * OpenID client ID which should be submitted to the OpenID service when + * necessary. This value is typically provided by the OpenID service when + * OpenID credentials are generated for your application. + */ + private static final StringGuacamoleProperty OPENID_CLIENT_ID = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "openid-client-id"; } + + }; + + /** + * The URI that the OpenID service should redirect to after the + * authentication process is complete. This must be the full URL that a + * user would enter into their browser to access Guacamole. + */ + private static final URIGuacamoleProperty OPENID_REDIRECT_URI = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "openid-redirect-uri"; } + + }; + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns the authorization endpoint (URI) of the OpenID service as + * configured with guacamole.properties. + * + * @return + * The authorization endpoint of the OpenID service, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the authorization + * endpoint property is missing. + */ + public URI getAuthorizationEndpoint() throws GuacamoleException { + return environment.getRequiredProperty(OPENID_AUTHORIZATION_ENDPOINT); + } + + /** + * Returns the OpenID client ID which should be submitted to the OpenID + * service when necessary, as configured with guacamole.properties. This + * value is typically provided by the OpenID service when OpenID credentials + * are generated for your application. + * + * @return + * The client ID to use when communicating with the OpenID service, + * as configured with guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the client ID + * property is missing. + */ + public String getClientID() throws GuacamoleException { + return environment.getRequiredProperty(OPENID_CLIENT_ID); + } + + /** + * Returns the URI that the OpenID service should redirect to after + * the authentication process is complete, as configured with + * guacamole.properties. This must be the full URL that a user would enter + * into their browser to access Guacamole. + * + * @return + * The client secret to use when communicating with the OpenID service, + * as configured with guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the redirect URI + * property is missing. + */ + public URI getRedirectURI() throws GuacamoleException { + return environment.getRequiredProperty(OPENID_REDIRECT_URI); + } + + /** + * Returns the issuer to expect for all received ID tokens, as configured + * with guacamole.properties. + * + * @return + * The issuer to expect for all received ID tokens, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the issuer property + * is missing. + */ + public String getIssuer() throws GuacamoleException { + return environment.getRequiredProperty(OPENID_ISSUER); + } + + /** + * Returns the endpoint (URI) of the JWKS service which defines how + * received ID tokens (JWTs) shall be validated, as configured with + * guacamole.properties. + * + * @return + * The endpoint (URI) of the JWKS service which defines how received ID + * tokens (JWTs) shall be validated, as configured with + * guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the JWKS endpoint + * property is missing. + */ + public URI getJWKSEndpoint() throws GuacamoleException { + return environment.getRequiredProperty(OPENID_JWKS_ENDPOINT); + } + + /** + * Returns the claim type which contains the authenticated user's username + * within any valid JWT, as configured with guacamole.properties. By + * default, this will be "email". + * + * @return + * The claim type which contains the authenticated user's username + * within any valid JWT, as configured with guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getUsernameClaimType() throws GuacamoleException { + return environment.getProperty(OPENID_USERNAME_CLAIM_TYPE, DEFAULT_USERNAME_CLAIM_TYPE); + } + + /** + * Returns the claim type which contains the authenticated user's groups + * within any valid JWT, as configured with guacamole.properties. By + * default, this will be "groups". + * + * @return + * The claim type which contains the authenticated user's groups + * within any valid JWT, as configured with guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getGroupsClaimType() throws GuacamoleException { + return environment.getProperty(OPENID_GROUPS_CLAIM_TYPE, DEFAULT_GROUPS_CLAIM_TYPE); + } + + /** + * Returns the claims list within any valid JWT that should be mapped to + * the authenticated user's tokens, as configured with guacamole.properties. + * Empty by default. + * + * @return + * The claims list within any valid JWT that should be mapped to + * the authenticated user's tokens, as configured with guacamole.properties. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public Collection getAttributesClaimType() throws GuacamoleException { + return environment.getPropertyCollection(OPENID_ATTRIBUTES_CLAIM_TYPE, DEFAULT_ATTRIBUTES_CLAIM_TYPE); + } + + /** + * Returns the space-separated list of OpenID scopes to request. By default, + * this will be "openid email profile". The OpenID scopes determine the + * information returned within the OpenID token, and thus affect what + * values can be used as an authenticated user's username. + * + * @return + * The space-separated list of OpenID scopes to request when identifying + * a user. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getScope() throws GuacamoleException { + return environment.getProperty(OPENID_SCOPE, DEFAULT_SCOPE); + } + + /** + * Returns the amount of clock skew tolerated for timestamp comparisons + * between the Guacamole server and OpenID service clocks, in seconds. Too + * much clock skew will affect token expiration calculations, possibly + * allowing old tokens to be used. By default, this will be 30. + * + * @return + * The amount of clock skew tolerated for timestamp comparisons, in + * seconds. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getAllowedClockSkew() throws GuacamoleException { + return environment.getProperty(OPENID_ALLOWED_CLOCK_SKEW, DEFAULT_ALLOWED_CLOCK_SKEW); + } + + /** + * Returns the maximum amount of time that an OpenID token should remain + * valid, in minutes. A token received from an OpenID service which is + * older than this amount of time will be rejected, even if it is otherwise + * valid. By default, this will be 300 (5 hours). + * + * @return + * The maximum amount of time that an OpenID token should remain valid, + * in minutes. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getMaxTokenValidity() throws GuacamoleException { + return environment.getProperty(OPENID_MAX_TOKEN_VALIDITY, DEFAULT_MAX_TOKEN_VALIDITY); + } + + /** + * Returns the maximum amount of time that a nonce generated by the + * Guacamole server should remain valid, in minutes. As each OpenID request + * has a unique nonce value, this imposes an upper limit on the amount of + * time any particular OpenID request can result in successful + * authentication within Guacamole. By default, this will be 10. + * + * @return + * The maximum amount of time that a nonce generated by the Guacamole + * server should remain valid, in minutes. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getMaxNonceValidity() throws GuacamoleException { + return environment.getProperty(OPENID_MAX_NONCE_VALIDITY, DEFAULT_MAX_NONCE_VALIDITY); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/conf/OpenIDEnvironment.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/conf/OpenIDEnvironment.java new file mode 100644 index 0000000..4404630 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/conf/OpenIDEnvironment.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.openid.conf; + +import org.apache.guacamole.environment.DelegatingEnvironment; +import org.apache.guacamole.environment.LocalEnvironment; + +/** + * An environment for retrieving OpenID-related properties from the Guacamole + * configuration. + */ +public class OpenIDEnvironment extends DelegatingEnvironment { + + /** + * Create a new instance of the configuration environment for the + * OpenID SSO module, pulling the default instance of the LocalEnvironment. + */ + public OpenIDEnvironment() { + super(LocalEnvironment.getInstance()); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/token/TokenValidationService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/token/TokenValidationService.java new file mode 100644 index 0000000..139ab20 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/java/org/apache/guacamole/auth/openid/token/TokenValidationService.java @@ -0,0 +1,274 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.openid.token; + +import com.google.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.openid.conf.ConfigurationService; +import org.apache.guacamole.auth.sso.NonceService; +import org.apache.guacamole.token.TokenName; +import org.jose4j.jwk.HttpsJwks; +import org.jose4j.jwt.JwtClaims; +import org.jose4j.jwt.MalformedClaimException; +import org.jose4j.jwt.consumer.InvalidJwtException; +import org.jose4j.jwt.consumer.JwtConsumer; +import org.jose4j.jwt.consumer.JwtConsumerBuilder; +import org.jose4j.keys.resolvers.HttpsJwksVerificationKeyResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for validating ID tokens forwarded to us by the client, verifying + * that they did indeed come from the OpenID service. + */ +public class TokenValidationService { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(TokenValidationService.class); + + /** + * The prefix to use when generating token names. + */ + public static final String OIDC_ATTRIBUTE_TOKEN_PREFIX = "OIDC_"; + + /** + * Service for retrieving OpenID configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Service for validating and generating unique nonce values. + */ + @Inject + private NonceService nonceService; + + /** + * Validates the given ID token, returning the JwtClaims contained therein. + * If the ID token is invalid, null is returned. + * + * @param token + * The ID token to validate. + * + * @return + * The JWT claims contained within the given ID token if it passes tests, + * or null if the token is not valid. + * + * @throws GuacamoleException + * If guacamole.properties could not be parsed. + */ + public JwtClaims validateToken(String token) throws GuacamoleException { + // Validating the token requires a JWKS key resolver + HttpsJwks jwks = new HttpsJwks(confService.getJWKSEndpoint().toString()); + HttpsJwksVerificationKeyResolver resolver = new HttpsJwksVerificationKeyResolver(jwks); + + // Create JWT consumer for validating received token + JwtConsumer jwtConsumer = new JwtConsumerBuilder() + .setRequireExpirationTime() + .setMaxFutureValidityInMinutes(confService.getMaxTokenValidity()) + .setAllowedClockSkewInSeconds(confService.getAllowedClockSkew()) + .setRequireSubject() + .setExpectedIssuer(confService.getIssuer()) + .setExpectedAudience(confService.getClientID()) + .setVerificationKeyResolver(resolver) + .build(); + + try { + // Validate JWT + JwtClaims claims = jwtConsumer.processToClaims(token); + + // Verify a nonce is present + String nonce = claims.getStringClaimValue("nonce"); + if (nonce != null) { + // Verify that we actually generated the nonce, and that it has not + // already been used + if (nonceService.isValid(nonce)) { + // nonce is valid, consider claims valid + return claims; + } + else { + logger.info("Rejected OpenID token with invalid/old nonce."); + } + } + else { + logger.info("Rejected OpenID token without nonce."); + } + } + // Log any failures to validate/parse the JWT + catch (MalformedClaimException e) { + logger.info("Rejected OpenID token with malformed claim: {}", e.getMessage()); + logger.debug("Malformed claim within received JWT.", e); + } + catch (InvalidJwtException e) { + logger.info("Rejected invalid OpenID token: {}", e.getMessage()); + logger.debug("Invalid JWT received.", e); + } + + return null; + } + + /** + * Parses the given JwtClaims, returning the username contained + * therein, as defined by the username claim type given in + * guacamole.properties. If the username claim type is missing or + * is invalid, null is returned. + * + * @param claims + * A valid JwtClaims to extract the username from. + * + * @return + * The username contained within the given JwtClaims, or null if the + * claim is not valid or the username claim type is missing, + * + * @throws GuacamoleException + * If guacamole.properties could not be parsed. + */ + public String processUsername(JwtClaims claims) throws GuacamoleException { + String usernameClaim = confService.getUsernameClaimType(); + + if (claims != null) { + try { + // Pull username from claims + String username = claims.getStringClaimValue(usernameClaim); + if (username != null) + return username; + } + catch (MalformedClaimException e) { + logger.info("Rejected OpenID token with malformed claim: {}", e.getMessage()); + logger.debug("Malformed claim within received JWT.", e); + } + + // Warn if username was not present in token, as it likely means + // the system is not set up correctly + logger.warn("Username claim \"{}\" missing from token. Perhaps the " + + "OpenID scope and/or username claim type are " + + "misconfigured?", usernameClaim); + } + + // Could not retrieve username from JWT + return null; + } + + /** + * Parses the given JwtClaims, returning the groups contained + * therein, as defined by the groups claim type given in + * guacamole.properties. If the groups claim type is missing or + * is invalid, an empty set is returned. + * + * @param claims + * A valid JwtClaims to extract groups from. + * + * @return + * A Set of String representing the groups the user is member of + * from the OpenID provider point of view, or an empty Set if + * claim is not valid or the groups claim type is missing, + * + * @throws GuacamoleException + * If guacamole.properties could not be parsed. + */ + public Set processGroups(JwtClaims claims) throws GuacamoleException { + String groupsClaim = confService.getGroupsClaimType(); + + if (claims != null) { + try { + // Pull groups from claims + List oidcGroups = claims.getStringListClaimValue(groupsClaim); + if (oidcGroups != null && !oidcGroups.isEmpty()) + return Collections.unmodifiableSet(new HashSet<>(oidcGroups)); + } + catch (MalformedClaimException e) { + logger.info("Rejected OpenID token with malformed claim: {}", e.getMessage()); + logger.debug("Malformed claim within received JWT.", e); + } + } + + // Could not retrieve groups from JWT + return Collections.emptySet(); + } + + /** + * Parses the given JwtClaims, returning the attributes contained + * therein, as defined by the attributes claim type given in + * guacamole.properties. If the attributes claim type is missing or + * is invalid, an empty set is returned. + * + * @param claims + * A valid JwtClaims to extract attributes from. + * + * @return + * A Map of String,String representing the attributes and values + * from the OpenID provider point of view, or an empty Map if + * claim is not valid or the attributes claim type is missing. + * + * @throws GuacamoleException + * If guacamole.properties could not be parsed. + */ + public Map processAttributes(JwtClaims claims) throws GuacamoleException { + Collection attributesClaim = confService.getAttributesClaimType(); + + if (claims != null && !attributesClaim.isEmpty()) { + try { + logger.debug("Iterating over attributes claim list : {}", attributesClaim); + + // We suppose all claims are resolved, so the hashmap is initialised to + // the size of the configuration list + Map tokens = new HashMap(attributesClaim.size()); + + // We iterate over the configured attributes + for (String key: attributesClaim) { + // Retrieve the corresponding claim + String oidcAttr = claims.getStringClaimValue(key); + + // We do have a matching claim and it is not empty + if (oidcAttr != null && !oidcAttr.isEmpty()) { + // append the prefixed claim value to the token map with its value + String tokenName = TokenName.canonicalize(key, OIDC_ATTRIBUTE_TOKEN_PREFIX); + tokens.put(tokenName, oidcAttr); + logger.debug("Claim {} found and set to {}", key, tokenName); + } + else { + // wanted attribute is not found in the claim + logger.debug("Claim {} not found in JWT.", key); + } + } + + // We did process all the expected claims + return Collections.unmodifiableMap(tokens); + } + catch (MalformedClaimException e) { + logger.info("Rejected OpenID token with malformed claim: {}", e.getMessage()); + logger.debug("Malformed claim within received JWT.", e); + } + } + + // Could not retrieve attributes from JWT + logger.debug("Attributes claim not defined. Returning empty map."); + return Collections.emptyMap(); + } +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..2bd7e29 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/guac-manifest.json @@ -0,0 +1,38 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "OpenID Authentication Extension", + "namespace" : "openid", + + "authProviders" : [ + "org.apache.guacamole.auth.openid.OpenIDAuthenticationProvider" + ], + + "css" : [ + "styles/sso-providers.css" + ], + + "html" : [ + "html/sso-providers.html", + "html/sso-provider-openid.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ], + + "js" : [ + "openid.min.js" + ] + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/html/sso-provider-openid.html b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/html/sso-provider-openid.html new file mode 100644 index 0000000..5325e63 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/html/sso-provider-openid.html @@ -0,0 +1,4 @@ + +
  • {{ + 'LOGIN.NAME_IDP_OPENID' | translate +}}
  • diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/license.txt b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/transformToken.js b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/transformToken.js new file mode 100644 index 0000000..b0c0887 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-openid/src/main/resources/transformToken.js @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Before AngularJS routing takes effect, reformat the URL fragment + * from the format used by OpenID Connect ("#param1=value1¶m2=value2&...") + * to the format used by AngularJS ("#/?param1=value1¶m2=value2&...") such + * that the client side of Guacamole's authentication system will automatically + * forward the "id_token" value for server-side validation. + * + * Note that not all OpenID identity providers will include the "id_token" + * parameter in the first position; it may occur after several other parameters + * within the fragment. + */ + +(function guacOpenIDTransformToken() { + if (/^#(?![?\/])(.*&)?id_token=/.test(location.hash)) + location.hash = '/?' + location.hash.substring(1); +})(); diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/.gitignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/.gitignore new file mode 100644 index 0000000..30eb487 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/.gitignore @@ -0,0 +1,3 @@ +*~ +target/ +src/main/resources/generated/ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/.ratignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/pom.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/pom.xml new file mode 100644 index 0000000..e4a7a73 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/pom.xml @@ -0,0 +1,165 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso-saml + jar + 1.6.0 + guacamole-auth-sso-saml + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-sso + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + + + + + org.apache.guacamole + guacamole-auth-sso-base + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + + + + + javax.ws.rs + jsr311-api + + + + + com.onelogin + java-saml + 2.9.0 + + + + + com.fasterxml.woodstox + woodstox-core + + + + + org.apache.santuario + xmlsec + + + + + org.apache.commons + commons-lang3 + + + + + commons-codec + commons-codec + + + + + + + + com.fasterxml.woodstox + woodstox-core + 5.4.0 + + + + + org.apache.santuario + xmlsec + 2.2.6 + + + + + commons-codec + commons-codec + + + + + + + + org.apache.commons + commons-lang3 + 3.17.0 + + + + + commons-codec + commons-codec + 1.17.1 + + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/AuthenticationProviderService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/AuthenticationProviderService.java new file mode 100644 index 0000000..ace19d5 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/AuthenticationProviderService.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import java.net.URI; +import java.util.Arrays; +import org.apache.guacamole.auth.saml.user.SAMLAuthenticatedUser; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.saml.acs.AssertedIdentity; +import org.apache.guacamole.auth.saml.acs.SAMLAuthenticationSessionManager; +import org.apache.guacamole.auth.saml.acs.SAMLService; +import org.apache.guacamole.auth.sso.SSOAuthenticationProviderService; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.RedirectField; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * Service that authenticates Guacamole users by processing the responses of + * SAML identity providers. + */ +@Singleton +public class AuthenticationProviderService implements SSOAuthenticationProviderService { + + /** + * The name of the query parameter that identifies an active authentication + * session (in-progress SAML authentication attempt). + */ + public static final String AUTH_SESSION_QUERY_PARAM = "state"; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * Manager of active SAML authentication attempts. + */ + @Inject + private SAMLAuthenticationSessionManager sessionManager; + + /** + * Service for processing SAML requests/responses. + */ + @Inject + private SAMLService saml; + + /** + * Return the value of the session identifier associated with the given + * credentials, or null if no session identifier is found in the + * credentials. + * + * @param credentials + * The credentials from which to extract the session identifier. + * + * @return + * The session identifier associated with the given credentials, or + * null if no identifier is found. + */ + public static String getSessionIdentifier(Credentials credentials) { + + // Return the session identifier from the request params, if set, or + // null otherwise + return credentials != null ? credentials.getParameter(AUTH_SESSION_QUERY_PARAM) : null; + } + + @Override + public SAMLAuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Use established SAML identity if already provided by the SAML IdP + AssertedIdentity identity = sessionManager.getIdentity( + getSessionIdentifier(credentials)); + + if (identity != null) { + SAMLAuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(identity, credentials); + return authenticatedUser; + } + + // Redirect to SAML IdP if no SAML identity is associated with the + // Guacamole authentication request + throw new GuacamoleInvalidCredentialsException("Redirecting to SAML IdP.", + new CredentialsInfo(Arrays.asList(new Field[] { + new RedirectField(AUTH_SESSION_QUERY_PARAM, getLoginURI(), + new TranslatableMessage("LOGIN.INFO_IDP_REDIRECT_PENDING")) + })) + ); + + } + + @Override + public URI getLoginURI() throws GuacamoleException { + return saml.createRequest(); + } + + @Override + public void shutdown() { + sessionManager.shutdown(); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationEventListener.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationEventListener.java new file mode 100644 index 0000000..f6bb3b0 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationEventListener.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml; + +import org.apache.guacamole.auth.saml.acs.SAMLAuthenticationSessionManager; +import org.apache.guacamole.auth.sso.SSOAuthenticationEventListener; +import org.apache.guacamole.net.auth.Credentials; + +import com.google.inject.Inject; + +/** + * A Listener that will reactivate or invalidate SAML auth sessions depending on + * overall auth success or failure. + */ +public class SAMLAuthenticationEventListener extends SSOAuthenticationEventListener { + + /** + * Session manager for generating and maintaining unique tokens to + * represent the authentication flow of a user who has only partially + * authenticated. + * + * Requires static injection due to the fact that the webapp just calls the + * constructor directly when creating new Listeners. The instances will not + * be constructed by guice. + * + * Note that is possible to instead inject an AuthenticationSessionManager + * instance directly into the base class, but this results in different + * instances of the session manager injected here and in the rest of the + * extension, regardless of singleton configuration for the service. + */ + @Inject + protected static SAMLAuthenticationSessionManager sessionManager; + + @Override + protected String getSessionIdentifier(Credentials credentials) { + return AuthenticationProviderService.getSessionIdentifier(credentials); + } + + @Override + protected void reactivateSession(String sessionIdentifier) { + sessionManager.reactivateSession(sessionIdentifier); + } + + @Override + protected void invalidateSession(String sessionIdentifier) { + sessionManager.invalidateSession(sessionIdentifier); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationProvider.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationProvider.java new file mode 100644 index 0000000..e356b36 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationProvider.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml; + +import org.apache.guacamole.auth.saml.acs.AssertionConsumerServiceResource; +import org.apache.guacamole.auth.sso.SSOAuthenticationProvider; + +/** + * AuthenticationProvider implementation that authenticates Guacamole users + * against a SAML SSO Identity Provider (IdP). This module does not provide any + * storage for connection information, and must be layered with other modules + * for authenticated users to have access to Guacamole connections. + */ +public class SAMLAuthenticationProvider extends SSOAuthenticationProvider { + + /** + * Creates a new SAMLAuthenticationProvider that authenticates users + * against a SAML IdP. + */ + public SAMLAuthenticationProvider() { + super(AuthenticationProviderService.class, + AssertionConsumerServiceResource.class, + new SAMLAuthenticationProviderModule()); + } + + @Override + public String getIdentifier() { + return "saml"; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationProviderModule.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationProviderModule.java new file mode 100644 index 0000000..a223392 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/SAMLAuthenticationProviderModule.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.auth.saml.conf.ConfigurationService; +import org.apache.guacamole.auth.saml.acs.AssertionConsumerServiceResource; +import org.apache.guacamole.auth.saml.acs.SAMLAuthenticationSessionManager; +import org.apache.guacamole.auth.saml.acs.SAMLService; +import org.apache.guacamole.auth.saml.conf.SAMLEnvironment; +import org.apache.guacamole.environment.Environment; + +/** + * Guice module which configures SAML-specific injections. + */ +public class SAMLAuthenticationProviderModule extends AbstractModule { + + /** + * The environment for this server and extension. + */ + private final Environment environment = new SAMLEnvironment(); + + @Override + protected void configure() { + bind(AssertionConsumerServiceResource.class); + bind(ConfigurationService.class); + bind(SAMLAuthenticationSessionManager.class); + bind(SAMLService.class); + + bind(Environment.class).toInstance(environment); + + requestStaticInjection(SAMLAuthenticationEventListener.class); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/AssertedIdentity.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/AssertedIdentity.java new file mode 100644 index 0000000..6fcaa58 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/AssertedIdentity.java @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.acs; + +import com.onelogin.saml2.authn.SamlResponse; +import com.onelogin.saml2.exception.ValidationError; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import javax.xml.xpath.XPathExpressionException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; + +/** + * Representation of a user's identity as asserted by a SAML IdP. + */ +public class AssertedIdentity { + + /** + * The original SAML response received from the SAML IdP that asserted + * the user's identity. + */ + private final SamlResponse response; + + /** + * The user's Guacamole username. + */ + private final String username; + + /** + * All attributes included in the original SAML response. Attributes may + * possibly be associated with multiple values. + */ + private final Map> attributes; + + /** + * Creates a new AssertedIdentity representing the identity asserted by the + * SAML IdP in the given response. + * + * @param response + * The response received from the SAML IdP. + * + * @throws GuacamoleException + * If the given SAML response cannot be parsed or is missing required + * information. + */ + public AssertedIdentity(SamlResponse response) throws GuacamoleException { + + // Parse user identity from SAML response + String nameId; + try { + nameId = response.getNameId(); + if (nameId == null) + throw new GuacamoleSecurityException("SAML response did not " + + "include the relevant user's identity (no name ID)."); + } + + // Unfortunately, getNameId() is declared as "throws Exception", so + // this error handling has to be pretty generic + catch (Exception e) { + throw new GuacamoleSecurityException("User identity (name ID) " + + "could not be retrieved from the SAML response: " + e.getMessage(), e); + } + + // Retrieve any provided attributes + Map> responseAttributes; + try { + responseAttributes = Collections.unmodifiableMap(response.getAttributes()); + } + catch (XPathExpressionException | ValidationError e) { + throw new GuacamoleSecurityException("SAML attributes could not " + + "be parsed from the SAML response: " + e.getMessage(), e); + } + + this.response = response; + this.username = nameId.toLowerCase(); // Canonicalize username as lowercase + this.attributes = responseAttributes; + + } + + /** + * Returns the username of the Guacamole user whose identity was asserted + * by the SAML IdP. + * + * @return + * The username of the Guacamole user whose identity was asserted by + * the SAML IdP. + */ + public String getUsername() { + return username; + } + + /** + * Returns a Map containing all attributes included in the original SAML + * response that asserted this user's identity. Attributes may possibly be + * associated with multiple values. + * + * @return + * A Map of all attributes included in the original SAML response. + */ + public Map> getAttributes() { + return attributes; + } + + /** + * Returns whether the identity asserted by the original SAML response is + * still valid. An asserted identity may cease to be valid after creation + * if it has expired according to the timestamps included in the response. + * + * @return + * true if the original SAML response is still valid, false otherwise. + */ + public boolean isValid() { + return response.isValid(); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/AssertionConsumerServiceResource.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/AssertionConsumerServiceResource.java new file mode 100644 index 0000000..7aadc73 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/AssertionConsumerServiceResource.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.auth.saml.acs; + +import com.google.inject.Inject; +import java.net.URI; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Response; +import javax.ws.rs.FormParam; +import javax.ws.rs.Path; +import javax.ws.rs.POST; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.saml.AuthenticationProviderService; +import org.apache.guacamole.auth.saml.conf.ConfigurationService; +import org.apache.guacamole.auth.sso.SSOResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * REST API resource that provides a SAML assertion consumer service (ACS) + * endpoint. SAML identity providers will issue an HTTP POST to this endpoint + * asserting the user's identity when the user has successfully authenticated. + */ +public class AssertionConsumerServiceResource extends SSOResource { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(AssertionConsumerServiceResource.class); + + /** + * The configuration service for this module. + */ + @Inject + private ConfigurationService confService; + + /** + * Manager of active SAML authentication attempts. + */ + @Inject + private SAMLAuthenticationSessionManager sessionManager; + + /** + * Service for processing SAML requests/responses. + */ + @Inject + private SAMLService saml; + + /** + * Processes the SAML response submitted by the SAML IdP via an HTTP POST. + * If SSO has been successful, the user is redirected back to Guacamole to + * complete authentication. If SSO has failed, the user is redirected back + * to Guacamole to re-attempt authentication. + * + * @param relayState + * The "RelayState" value originally provided in the SAML request, + * which in our case is the transient the session identifier of the + * in-progress authentication attempt. The SAML standard requires that + * the identity provider include the "RelayState" value it received + * alongside its SAML response. + * + * @param samlResponse + * The encoded response returned by the SAML IdP. + * + * @param consumedRequest + * The HttpServletRequest associated with the SAML response. The + * parameters of this request may not be accessible, as the request may + * have been fully consumed by JAX-RS. + * + * @return + * An HTTP Response that will redirect the user back to Guacamole, + * with an internal state identifier included in the URL such that the + * the Guacamole side of authentication can complete. + * + * @throws GuacamoleException + * If configuration information required for processing SAML responses + * cannot be read. + */ + @POST + @Path("callback") + public Response processSamlResponse( + @FormParam("RelayState") String relayState, + @FormParam("SAMLResponse") String samlResponse, + @Context HttpServletRequest consumedRequest) + throws GuacamoleException { + + URI guacBase = confService.getCallbackUrl(); + + try { + + // Validate and parse identity asserted by SAML IdP + SAMLAuthenticationSession session = saml.processResponse( + consumedRequest.getRequestURL().toString(), + relayState, samlResponse); + + // Store asserted identity for future retrieval via redirect + String identifier = sessionManager.defer(session); + + // Redirect user such that Guacamole's authentication system can + // retrieve the relevant SAML identity (stored above) + return Response.seeOther(UriBuilder.fromUri(guacBase) + .queryParam(AuthenticationProviderService.AUTH_SESSION_QUERY_PARAM, identifier) + .build() + ).build(); + + } + + // If invalid, redirect back to main page to re-attempt authentication + catch (GuacamoleException e) { + logger.warn("Authentication attempted with an invalid SAML response: {}", e.getMessage()); + logger.debug("Received SAML response failed validation.", e); + return Response.seeOther(guacBase).build(); + } + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLAuthenticationSession.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLAuthenticationSession.java new file mode 100644 index 0000000..f89502d --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLAuthenticationSession.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.acs; + +import org.apache.guacamole.net.auth.AuthenticationSession; + +/** + * Representation of an in-progress SAML authentication attempt. + */ +public class SAMLAuthenticationSession extends AuthenticationSession { + + /** + * The request ID of the SAML request associated with the authentication + * attempt. + */ + private final String requestId; + + /** + * The identity asserted by the SAML IdP, or null if authentication has not + * yet completed successfully. + */ + private AssertedIdentity identity = null; + + /** + * Creates a new AuthenticationSession representing an in-progress SAML + * authentication attempt. + * + * @param requestId + * The request ID of the SAML request associated with the + * authentication attempt. + * + * @param expires + * The number of milliseconds that may elapse before this session must + * be considered invalid. + */ + public SAMLAuthenticationSession(String requestId, long expires) { + super(expires); + this.requestId = requestId; + } + + /** + * {@inheritDoc} + * + *

    If an identity has been asserted by the SAML IdP, this + * considers also whether the SAML response asserting that identity has + * expired. + */ + @Override + public boolean isValid() { + return super.isValid() && (identity == null || identity.isValid()); + } + + /** + * Returns the request ID of the SAML request associated with the + * authentication attempt. + * + * @return + * The request ID of the SAML request associated with the + * authentication attempt. + */ + public String getRequestID() { + return requestId; + } + + /** + * Marks this authentication attempt as completed and successful, with the + * user having been asserted as having the given identity by the SAML IdP. + * + * @param identity + * The identity asserted by the SAML IdP. + */ + public void setIdentity(AssertedIdentity identity) { + this.identity = identity; + } + + /** + * Returns the identity asserted by the SAML IdP. If authentication has not + * yet completed successfully, this will be null. + * + * @return + * The identity asserted by the SAML IdP, or null if authentication has + * not yet completed successfully. + */ + public AssertedIdentity getIdentity() { + return identity; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLAuthenticationSessionManager.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLAuthenticationSessionManager.java new file mode 100644 index 0000000..2371bb5 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLAuthenticationSessionManager.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.acs; + +import com.google.inject.Singleton; +import org.apache.guacamole.net.auth.AuthenticationSessionManager; + +/** + * Manager service that temporarily stores SAML authentication attempts while + * the authentication flow is underway. + */ +@Singleton +public class SAMLAuthenticationSessionManager + extends AuthenticationSessionManager { + + /** + * Returns the identity finally asserted by the SAML IdP at the end of the + * authentication process represented by the authentication session with + * the given identifier. If there is no such authentication session, or no + * valid identity has been asserted by the SAML IdP for that session, null + * is returned. + * + * @param identifier + * The unique string returned by the call to defer(). For convenience, + * this value may safely be null. + * + * @return + * The identity finally asserted by the SAML IdP at the end of the + * authentication process represented by the authentication session + * with the given identifier, or null if there is no such identity. + */ + public AssertedIdentity getIdentity(String identifier) { + + SAMLAuthenticationSession session = resume(identifier); + if (session != null) + return session.getIdentity(); + + return null; + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLService.java new file mode 100644 index 0000000..37d7fa9 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/acs/SAMLService.java @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.acs; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.onelogin.saml2.Auth; +import com.onelogin.saml2.authn.AuthnRequestParams; +import com.onelogin.saml2.authn.SamlResponse; +import com.onelogin.saml2.exception.SettingsException; +import com.onelogin.saml2.exception.ValidationError; +import com.onelogin.saml2.settings.Saml2Settings; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPathExpressionException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.saml.conf.ConfigurationService; +import org.apache.guacamole.net.auth.IdentifierGenerator; +import org.xml.sax.SAXException; + +/** + * Service which abstracts the internals of handling SAML requests and + * responses. + */ +@Singleton +public class SAMLService { + + /** + * Service for retrieving SAML configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Manager of active SAML authentication attempts. + */ + @Inject + private SAMLAuthenticationSessionManager sessionManager; + + /** + * Creates a new SAML request, beginning the overall authentication flow + * that will ultimately result in an asserted user identity if the user is + * successfully authenticated by the SAML IdP. The URI of the SSO endpoint + * of the SAML IdP that the user must be redirected to for the + * authentication process to continue is returned. + * + * @return + * The URI of the SSO endpoint of the SAML IdP that the user must be + * redirected to. + * + * @throws GuacamoleException + * If an error prevents the SAML request and redirect URI from being + * generated. + */ + public URI createRequest() throws GuacamoleException { + + Saml2Settings samlSettings = confService.getSamlSettings(); + + // Produce redirect for continuing the authentication process with + // the SAML IdP + try { + Auth auth = new Auth(samlSettings, null, null); + + // Generate a unique ID to use for the relay state + String identifier = IdentifierGenerator.generateIdentifier(); + + // Create the request URL for the SAML IdP + String requestUrl = auth.login( + identifier, + new AuthnRequestParams(false, false, true), + true); + + // Create a new authentication session to represent this attempt while + // it is in progress, using the request ID that was just issued + SAMLAuthenticationSession session = new SAMLAuthenticationSession( + auth.getLastRequestId(), + confService.getAuthenticationTimeout() * 60000L); + + // Save the session with the unique relay state ID + sessionManager.defer(session, identifier); + + return new URI(requestUrl); + } + catch (IOException e) { + throw new GuacamoleServerException("SAML authentication request " + + "could not be encoded: " + e.getMessage()); + } + catch (URISyntaxException e) { + throw new GuacamoleServerException("SAML IdP redirect could not " + + "be generated due to an error in the URI syntax: " + + e.getMessage()); + } + catch (SettingsException e) { + throw new GuacamoleServerException("Error while attempting to sign " + + "request using provided private key / certificate: " + + e.getMessage(), e); + } + + } + + /** + * Processes the given SAML response, as received by the SAML ACS endpoint + * at the given URL, producing an {@link SAMLAuthenticationSession} that now + * includes a valid assertion of the user's identity. If the SAML response + * is invalid in any way, an exception is thrown. + * + * @param url + * The URL of the ACS endpoint that received the SAML response. This + * should be the URL pointing to the single POST-handling endpoint of + * {@link AssertionConsumerServiceResource}. + * + * @param relayState + * The "RelayState" value originally provided in the SAML request, + * which in our case is the transient the session identifier of the + * in-progress authentication attempt. The SAML standard requires that + * the identity provider include the "RelayState" value it received + * alongside its SAML response. + * + * @param encodedResponse + * The response received from the SAML IdP via the ACS endpoint at the + * given URL. + * + * @return + * The {@link SAMLAuthenticationSession} associated with the in-progress + * authentication attempt, now associated with the {@link AssertedIdentity} + * representing the identity of the user asserted by the SAML IdP. + * + * @throws GuacamoleException + * If the given SAML response is not valid, or if the configuration + * information required to validate or decrypt the response cannot be + * read. + */ + public SAMLAuthenticationSession processResponse(String url, String relayState, + String encodedResponse) throws GuacamoleException { + + if (relayState == null) + throw new GuacamoleSecurityException("\"RelayState\" value " + + "is missing from SAML response."); + + SAMLAuthenticationSession session = sessionManager.resume(relayState); + if (session == null) + throw new GuacamoleSecurityException("\"RelayState\" value " + + "included with SAML response is not valid."); + + try { + + // Decode received SAML response + SamlResponse response = new SamlResponse(confService.getSamlSettings(), + url, encodedResponse); + + // Validate SAML response timestamp, signature, etc. + if (!response.isValid(session.getRequestID())) { + Exception validationException = response.getValidationException(); + throw new GuacamoleSecurityException("SAML response did not " + + "pass validation: " + validationException.getMessage(), + validationException); + } + + // Parse identity asserted by SAML IdP + session.setIdentity(new AssertedIdentity(response)); + return session; + + } + catch (ValidationError e) { + throw new GuacamoleSecurityException("SAML response did not pass " + + "validation: " + e.getMessage(), e); + } + catch (SettingsException e) { + throw new GuacamoleServerException("Current SAML settings are " + + "insufficient to decrypt/parse the received SAML " + + "response.", e); + } + catch (ParserConfigurationException | SAXException | XPathExpressionException e) { + throw new GuacamoleServerException("XML contents of SAML " + + "response could not be parsed.", e); + } + catch (IOException e) { + throw new GuacamoleServerException("Contents of SAML response " + + "could not be decrypted/read.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/conf/ConfigurationService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/conf/ConfigurationService.java new file mode 100644 index 0000000..47ead88 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/conf/ConfigurationService.java @@ -0,0 +1,507 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.conf; + +import com.google.inject.Inject; +import com.onelogin.saml2.settings.IdPMetadataParser; +import com.onelogin.saml2.settings.Saml2Settings; +import com.onelogin.saml2.settings.SettingsBuilder; +import com.onelogin.saml2.util.Constants; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.FileGuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.properties.URIGuacamoleProperty; + +/** + * Service for retrieving configuration information regarding the SAML + * authentication module. + */ +public class ConfigurationService { + + /** + * The URI of the file containing the XML Metadata associated with the + * SAML IdP. + */ + private static final URIGuacamoleProperty SAML_IDP_METADATA_URL = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "saml-idp-metadata-url"; } + + }; + + /** + * The URL of the SAML IdP. + */ + private static final URIGuacamoleProperty SAML_IDP_URL = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "saml-idp-url"; } + + }; + + /** + * The URL identifier for this SAML client. + */ + private static final URIGuacamoleProperty SAML_ENTITY_ID = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "saml-entity-id"; } + + }; + + /** + * The callback URL to use for SAML IdP, normally the base + * of the Guacamole install. The SAML extensions callback + * endpoint will be appended to this value. + */ + private static final URIGuacamoleProperty SAML_CALLBACK_URL = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "saml-callback-url"; } + + }; + + /** + * Whether or not debugging should be enabled in the SAML library to help + * track down errors. + */ + private static final BooleanGuacamoleProperty SAML_DEBUG = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "saml-debug"; } + + }; + + /** + * Whether or not to enable compression for the SAML request. + */ + private static final BooleanGuacamoleProperty SAML_COMPRESS_REQUEST = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "saml-compress-request"; } + + }; + + /** + * Whether or not to enable compression for the SAML response. + */ + private static final BooleanGuacamoleProperty SAML_COMPRESS_RESPONSE = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "saml-compress-response"; } + + }; + + /** + * Whether or not to enforce strict SAML security during processing. + */ + private static final BooleanGuacamoleProperty SAML_STRICT = + new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "saml-strict"; } + + }; + + /** + * The property that defines what attribute the SAML provider will return + * that contains group membership for the authenticated user. + */ + private static final StringGuacamoleProperty SAML_GROUP_ATTRIBUTE = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "saml-group-attribute"; } + + }; + + /** + * The maximum amount of time to allow for an in-progress SAML + * authentication attempt to be completed, in minutes. A user that takes + * longer than this amount of time to complete authentication with their + * identity provider will be redirected back to the identity provider to + * try again. + */ + private static final IntegerGuacamoleProperty SAML_AUTH_TIMEOUT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "saml-auth-timeout"; } + + }; + + /** + * The file containing the X.509 cert to use when signing or encrypting + * requests to the SAML IdP. + */ + private static final FileGuacamoleProperty SAML_X509_CERT_PATH = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "saml-x509-cert-path"; } + + }; + + /** + * The file containing the private key to use when signing or encrypting + * requests to the SAML IdP. + */ + private static final FileGuacamoleProperty SAML_PRIVATE_KEY_PATH = + new FileGuacamoleProperty() { + + @Override + public String getName() { return "saml-private-key-path"; } + + }; + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns the URL to be submitted as the client ID to the SAML IdP, as + * configured in guacamole.properties. + * + * @return + * The URL to send to the SAML IdP as the Client Identifier. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private URI getEntityId() throws GuacamoleException { + return environment.getProperty(SAML_ENTITY_ID); + } + + /** + * The URI that contains the metadata that the SAML client should + * use to communicate with the SAML IdP. This can either be a remote + * URL of a server that provides this, or can be a URI to a file on the + * local filesystem. The metadata file is usually generated by the SAML IdP + * and should be uploaded to the system where the Guacamole client is + * running. + * + * @return + * The URI of the file containing the metadata used by the SAML client + * when it communicates with the SAML IdP. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or if the client + * metadata is missing. + */ + private URI getIdpMetadata() throws GuacamoleException { + return environment.getProperty(SAML_IDP_METADATA_URL); + } + + /** + * Return the URL used to log in to the SAML IdP. + * + * @return + * The URL used to log in to the SAML IdP. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private URI getIdpUrl() throws GuacamoleException { + return environment.getProperty(SAML_IDP_URL); + } + + /** + * The callback URL used for the SAML IdP to POST a response + * to upon completion of authentication, normally the base + * of the Guacamole install. + * + * @return + * The callback URL to be sent to the SAML IdP that will + * be POSTed to upon completion of SAML authentication. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or the property + * is missing. + */ + public URI getCallbackUrl() throws GuacamoleException { + return environment.getRequiredProperty(SAML_CALLBACK_URL); + } + + /** + * Return the Boolean value that indicates whether SAML client debugging + * will be enabled, as configured in guacamole.properties. The default is + * false, and debug information will not be generated or logged. + * + * @return + * True if debugging should be enabled in the SAML library, otherwise + * false. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private boolean getDebug() throws GuacamoleException { + return environment.getProperty(SAML_DEBUG, false); + } + + /** + * Return the Boolean value that indicates whether or not compression of + * SAML requests to the IdP should be enabled or not, as configured in + * guacamole.properties. The default is to enable compression. + * + * @return + * True if compression should be enabled when sending the SAML request, + * otherwise false. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private boolean getCompressRequest() throws GuacamoleException { + return environment.getProperty(SAML_COMPRESS_REQUEST, true); + } + + /** + * Return a Boolean value that indicates whether or not the SAML login + * should enforce strict security controls, as configured in + * guacamole.properties. By default this is true, and should be set to + * true in any production environment. + * + * @return + * True if the SAML login should enforce strict security checks, + * otherwise false. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private boolean getStrict() throws GuacamoleException { + return environment.getProperty(SAML_STRICT, true); + } + + /** + * Return a Boolean value that indicates whether or not compression should + * be requested from the server when the SAML response is returned, as + * configured in guacamole.properties. The default is to request that the + * response be compressed. + * + * @return + * True if compression should be requested from the server for the SAML + * response. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + private boolean getCompressResponse() throws GuacamoleException { + return environment.getProperty(SAML_COMPRESS_RESPONSE, true); + } + + /** + * Return the name of the attribute that will be supplied by the identity + * provider that contains the groups of which this user is a member. + * + * @return + * The name of the attribute that contains the user groups. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public String getGroupAttribute() throws GuacamoleException { + return environment.getProperty(SAML_GROUP_ATTRIBUTE, "groups"); + } + + /** + * Returns the maximum amount of time to allow for an in-progress SAML + * authentication attempt to be completed, in minutes. A user that takes + * longer than this amount of time to complete authentication with their + * identity provider will be redirected back to the identity provider to + * try again. + * + * @return + * The maximum amount of time to allow for an in-progress SAML + * authentication attempt to be completed, in minutes. + * + * @throws GuacamoleException + * If the authentication timeout cannot be parsed. + */ + public int getAuthenticationTimeout() throws GuacamoleException { + return environment.getProperty(SAML_AUTH_TIMEOUT, 5); + } + + /** + * Returns the file containing the X.509 certificate to use when signing + * requests to the SAML IdP. If the property is not set, null will be + * returned. + * + * @return + * The file containing the X.509 certificate to use when signing + * requests to the SAML IdP, or null if not defined. + * + * @throws GuacamoleException + * If the X.509 certificate cannot be parsed. + */ + public File getCertificateFile() throws GuacamoleException { + return environment.getProperty(SAML_X509_CERT_PATH); + } + + /** + * Returns the file containing the private key to use when signing + * requests to the SAML IdP. If the property is not set, null will be + * returned. + * + * @return + * The file containing the private key to use when signing + * requests to the SAML IdP, or null if not defined. + * + * @throws GuacamoleException + * If the private key file cannot be parsed. + */ + public File getPrivateKeyFile() throws GuacamoleException { + return environment.getProperty(SAML_PRIVATE_KEY_PATH); + } + + /** + * Returns the contents of a small file, such as a private key or certificate into + * a String. If the file does not exist, or cannot be read for any reason, an exception + * will be thrown with the details of the failure. + * + * @param file + * The file to read into a string. + * + * @param name + * A human-readable name for the file, to be used when formatting log messages. + * + * @return + * The contents of the file having the given path. + * + * @throws GuacamoleException + * If the provided file does not exist, or cannot be read for any reason. + */ + private String readFileContentsIntoString(File file, String name) throws GuacamoleException { + + // Attempt to read the file directly into a String + try { + return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); + } + + // If the file cannot be read, log a warning and treat it as if it does not exist + catch (IOException e) { + throw new GuacamoleServerException( + name + " at \"" + file.getAbsolutePath() + "\" could not be read.", e); + } + + } + + /** + * Returns the collection of SAML settings used to initialize the client. + * + * @return + * The collection of SAML settings used to initialize the SAML client. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed or if required parameters + * are missing. + */ + public Saml2Settings getSamlSettings() throws GuacamoleException { + + // Try to get the XML file, first. + URI idpMetadata = getIdpMetadata(); + Map samlMap; + if (idpMetadata != null) { + try { + samlMap = IdPMetadataParser.parseRemoteXML(idpMetadata.toURL()); + } + catch (Exception e) { + throw new GuacamoleServerException( + "Could not parse SAML IdP Metadata file.", e); + } + } + + // If no XML metadata is provided, fall-back to individual values. + else { + samlMap = new HashMap<>(); + samlMap.put(SettingsBuilder.IDP_ENTITYID_PROPERTY_KEY, + getIdpUrl().toString()); + samlMap.put(SettingsBuilder.IDP_SINGLE_SIGN_ON_SERVICE_URL_PROPERTY_KEY, + getIdpUrl().toString()); + samlMap.put(SettingsBuilder.IDP_SINGLE_SIGN_ON_SERVICE_BINDING_PROPERTY_KEY, + Constants.BINDING_HTTP_REDIRECT); + } + + // Read entity ID from properties if not provided within metadata XML + if (!samlMap.containsKey(SettingsBuilder.SP_ENTITYID_PROPERTY_KEY)) { + URI entityId = getEntityId(); + if (entityId == null) + throw new GuacamoleServerException("SAML Entity ID was not found" + + " in either the metadata XML file or guacamole.properties"); + samlMap.put(SettingsBuilder.SP_ENTITYID_PROPERTY_KEY, entityId.toString()); + } + + // Derive ACS URL from properties if not provided within metadata XML + if (!samlMap.containsKey(SettingsBuilder.SP_ASSERTION_CONSUMER_SERVICE_URL_PROPERTY_KEY)) { + samlMap.put(SettingsBuilder.SP_ASSERTION_CONSUMER_SERVICE_URL_PROPERTY_KEY, + UriBuilder.fromUri(getCallbackUrl()).path("api/ext/saml/callback").build().toString()); + } + + // If a private key file is set, load the value into the builder now + File privateKeyFile = getPrivateKeyFile(); + if (privateKeyFile != null) + samlMap.put(SettingsBuilder.SP_PRIVATEKEY_PROPERTY_KEY, + readFileContentsIntoString(privateKeyFile, "Private Key")); + + // If a certificate file is set, load the value into the builder now + File certificateFile = getCertificateFile(); + if (certificateFile != null) + samlMap.put(SettingsBuilder.SP_X509CERT_PROPERTY_KEY, + readFileContentsIntoString(certificateFile, "X.509 Certificate")); + + SettingsBuilder samlBuilder = new SettingsBuilder(); + Saml2Settings samlSettings = samlBuilder.fromValues(samlMap).build(); + samlSettings.setStrict(getStrict()); + samlSettings.setDebug(getDebug()); + samlSettings.setCompressRequest(getCompressRequest()); + samlSettings.setCompressResponse(getCompressResponse()); + + // Request that the SAML library sign everything that it can, if + // both private key and certificate are specified + if (privateKeyFile != null && certificateFile != null) { + samlSettings.setAuthnRequestsSigned(true); + samlSettings.setLogoutRequestSigned(true); + samlSettings.setLogoutResponseSigned(true); + } + + return samlSettings; + } + + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/conf/SAMLEnvironment.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/conf/SAMLEnvironment.java new file mode 100644 index 0000000..8704069 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/conf/SAMLEnvironment.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.conf; + +import org.apache.guacamole.environment.DelegatingEnvironment; +import org.apache.guacamole.environment.LocalEnvironment; + +/** + * An environment for retrieving SAML-related properties from the Guacamole + * configuration. + */ +public class SAMLEnvironment extends DelegatingEnvironment { + + /** + * Create a new instance of the configuration environment for the + * SAML SSO module, pulling the default instance of the LocalEnvironment. + */ + public SAMLEnvironment() { + super(LocalEnvironment.getInstance()); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/user/SAMLAuthenticatedUser.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/user/SAMLAuthenticatedUser.java new file mode 100644 index 0000000..88adee6 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/java/org/apache/guacamole/auth/saml/user/SAMLAuthenticatedUser.java @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.saml.user; + +import com.google.inject.Inject; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.saml.acs.AssertedIdentity; +import org.apache.guacamole.auth.saml.conf.ConfigurationService; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.token.TokenName; + +/** + * A SAML-specific implementation of AuthenticatedUser, associating a SAML + * identity and particular set of credentials with the SAML authentication + * provider. + */ +public class SAMLAuthenticatedUser extends SSOAuthenticatedUser { + + /** + * The prefix that should be prepended to all parameter tokens generated + * from SAML attributes. + */ + private static final String SAML_ATTRIBUTE_TOKEN_PREFIX = "SAML_"; + + /** + * Service for retrieving SAML configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Returns a Map of all parameter tokens that should be made available for + * substitution based on the given {@link AssertedIdentity}. The resulting + * Map will contain one parameter token for each SAML attribute in the + * SAML response that originally asserted the user's identity. Attributes + * that have multiple values will be reduced to a single value, taking the + * first available value and discarding the remaining values. + * + * @param identity + * The {@link AssertedIdentity} representing the user identity + * asserted by the SAML IdP. + * + * @return + * A Map of key and single value pairs that should be made available + * for substitution as parameter tokens. + */ + private Map getTokens(AssertedIdentity identity) { + return Collections.unmodifiableMap(identity.getAttributes().entrySet() + .stream() + .filter((entry) -> !entry.getValue().isEmpty()) + .collect(Collectors.toMap( + (entry) -> TokenName.canonicalize(entry.getKey(), SAML_ATTRIBUTE_TOKEN_PREFIX), + (entry) -> entry.getValue().get(0) + ))); + } + + /** + * Returns a set of all group memberships asserted by the SAML IdP. + * + * @param identity + * The {@link AssertedIdentity} representing the user identity + * asserted by the SAML IdP. + * + * @return + * A set of all groups that the SAML IdP asserts this user is a + * member of. + * + * @throws GuacamoleException + * If the configuration information necessary to retrieve group + * memberships from a SAML response cannot be read. + */ + private Set getGroups(AssertedIdentity identity) + throws GuacamoleException { + + List samlGroups = identity.getAttributes().get(confService.getGroupAttribute()); + if (samlGroups == null || samlGroups.isEmpty()) + return Collections.emptySet(); + + return Collections.unmodifiableSet(new HashSet<>(samlGroups)); + + } + + /** + * Initializes this AuthenticatedUser using the given + * {@link AssertedIdentity} and credentials. + * + * @param identity + * The {@link AssertedIdentity} representing the user identity + * asserted by the SAML IdP. + * + * @param credentials + * The credentials provided when this user was authenticated. + * + * @throws GuacamoleException + * If configuration information required for processing the user's + * identity and group memberships cannot be read. + */ + public void init(AssertedIdentity identity, Credentials credentials) + throws GuacamoleException { + super.init(identity.getUsername(), credentials, getGroups(identity), getTokens(identity)); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..593fd44 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/guac-manifest.json @@ -0,0 +1,38 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "SAML Authentication Extension", + "namespace" : "saml", + + "authProviders" : [ + "org.apache.guacamole.auth.saml.SAMLAuthenticationProvider" + ], + + "listeners" : [ + "org.apache.guacamole.auth.saml.SAMLAuthenticationEventListener" + ], + + "css" : [ + "styles/sso-providers.css" + ], + + "html" : [ + "html/sso-providers.html", + "html/sso-provider-saml.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/html/sso-provider-saml.html b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/html/sso-provider-saml.html new file mode 100644 index 0000000..734f7f4 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/html/sso-provider-saml.html @@ -0,0 +1,4 @@ + +

  • {{ + 'LOGIN.NAME_IDP_SAML' | translate +}}
  • diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/license.txt b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-saml/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/.gitignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/.gitignore new file mode 100644 index 0000000..30eb487 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/.gitignore @@ -0,0 +1,3 @@ +*~ +target/ +src/main/resources/generated/ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/.ratignore b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/pom.xml b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/pom.xml new file mode 100644 index 0000000..c4e46aa --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/pom.xml @@ -0,0 +1,172 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso-ssl + jar + 1.6.0 + guacamole-auth-sso-ssl + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-auth-sso + 1.6.0 + ../../ + + + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + ssl.js + + + license.txt + + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + + + + org.apache.guacamole + guacamole-ext + + + + + org.apache.guacamole + guacamole-auth-sso-base + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + + + + + javax.ws.rs + jsr311-api + + + + + org.bouncycastle + bcpkix-fips + 2.1.9 + + + + + + org.bouncycastle + bc-fips + + + + + org.bouncycastle + bcutil-fips + + + + + + + + org.bouncycastle + bc-fips + 2.1.0 + + + + + org.bouncycastle + bcutil-fips + 2.1.4 + + + + + diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/AuthenticationProviderService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/AuthenticationProviderService.java new file mode 100644 index 0000000..8b8328f --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/AuthenticationProviderService.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import java.net.URI; +import java.util.Arrays; +import java.util.Collections; +import org.apache.guacamole.auth.ssl.conf.ConfigurationService; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.auth.sso.SSOAuthenticationProviderService; +import org.apache.guacamole.auth.sso.user.SSOAuthenticatedUser; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.RedirectField; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * Service that authenticates Guacamole users using SSL/TLS authentication + * provided by an external SSL termination service. + */ +@Singleton +public class AuthenticationProviderService implements SSOAuthenticationProviderService { + + /** + * Service for retrieving configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Session manager for generating and maintaining unique tokens to + * represent the authentication flow of a user who has only partially + * authenticated. Here, these tokens represent a user that has been + * validated by SSL termination and allow the Guacamole instance that + * doesn't require SSL/TLS authentication to retrieve the user's identity + * and complete the authentication process. + */ + @Inject + private SSLAuthenticationSessionManager sessionManager; + + /** + * Provider for AuthenticatedUser objects. + */ + @Inject + private Provider authenticatedUserProvider; + + /** + * The name of the query parameter containing the temporary session token + * representing the current state of an in-progress authentication attempt. + */ + private static final String AUTH_SESSION_PARAMETER_NAME = "state"; + + /** + * Return the value of the session identifier associated with the given + * credentials, or null if no session identifier is found in the credentials. + * + * @param credentials + * The credentials from which to extract the session identifier. + * + * @return + * The session identifier associated with the given credentials, or + * null if no identifier is found. + */ + public static String getSessionIdentifier(Credentials credentials) { + + // Return the session identifier from the request params, if set, or + // null otherwise + return credentials != null ? credentials.getParameter(AUTH_SESSION_PARAMETER_NAME) : null; + } + + /** + * Processes the given credentials, returning the identity represented by + * the auth session token present in that request associated with the + * credentials. If no such token is present, or the token does not represent + * a valid identity, null is returned. + * + * @param credentials + * The credentials to extract the auth session token from. + * + * @return + * The identity represented by the auth session token in the request, + * or null if there is no such token or the token does not represent a + * valid identity. + */ + private SSOAuthenticatedUser processIdentity(Credentials credentials) { + + String state = getSessionIdentifier(credentials); + String username = sessionManager.getIdentity(state); + if (username == null) + return null; + + SSOAuthenticatedUser authenticatedUser = authenticatedUserProvider.get(); + authenticatedUser.init(username, credentials, + Collections.emptySet(), Collections.emptyMap()); + return authenticatedUser; + + } + + @Override + public SSOAuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // + // Overall flow: + // + // 1) An unauthenticated user makes a GET request to + // ".../api/ext/ssl/identity". After a series of redirects + // intended to prevent that identity from being inadvertently + // cached and inherited by future authentication attempts on the + // same client machine, an external SSL termination service requests + // and validates the user's certificate, those details are passed + // back to Guacamole via HTTP headers, and Guacamole produces a JSON + // response containing an opaque state value. + // + // 2) The user (still unauthenticated) resubmits the opaque state + // value from the received JSON as the "state" parameter of a + // standard Guacamole authentication request (".../api/tokens"). + // + // 3) If the certificate received was valid, the user is authenticated + // according to the identity asserted by that certificate. If not, + // authentication is refused. + // + // NOTE: All SSL termination endpoints in front of Guacamole MUST + // be configured to drop these headers from any inbound requests + // or users may be able to assert arbitrary identities, since this + // extension does not validate anything but the certificate timestamps. + // It relies purely on SSL termination to validate that the certificate + // was signed by the expected CA. + // + + // We MUST have the domain associated with the request to ensure we + // always get fresh SSL sessions when validating client certificates + String host = credentials.getHeader("Host"); + if (host == null) + return null; + + // + // Handle only auth session tokens at the primary URI, using the + // pre-verified information from those tokens to determine user + // identity. + // + + if (confService.isPrimaryHostname(host)) + return processIdentity(credentials); + + // All other requests are not allowed - redirect to proper hostname + throw new GuacamoleInvalidCredentialsException("Authentication is " + + "only allowed against the primary URL of this Guacamole " + + "instance.", + new CredentialsInfo(Arrays.asList(new Field[] { + new RedirectField("primaryURI", confService.getPrimaryURI(), + new TranslatableMessage("LOGIN.INFO_REDIRECT_PENDING")) + })) + ); + + } + + @Override + public URI getLoginURI() throws GuacamoleException { + throw new GuacamoleResourceNotFoundException("No such resource."); + } + + @Override + public void shutdown() { + sessionManager.shutdown(); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/OpaqueAuthenticationResult.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/OpaqueAuthenticationResult.java new file mode 100644 index 0000000..66020f2 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/OpaqueAuthenticationResult.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.auth.ssl; + +/** + * REST API response that reports the result of attempting to authenticate the + * user using SSL/TLS client authentication. The information within this + * result is intentionally opaque and must be resubmitted in a separate + * authentication request for authentication to finally succeed or fail. + */ +public class OpaqueAuthenticationResult { + + /** + * An arbitrary value representing the result of authenticating the + * current user. + */ + private final String state; + + /** + * Creates a new OpaqueAuthenticationResult containing the given opaque + * state value. Successful authentication results must be indistinguishable + * from unsuccessful results with respect to this value. Only using this + * value within ANOTHER authentication attempt can determine whether + * authentication is successful. + * + * @param state + * An arbitrary value representing the result of authenticating the + * current user. + */ + public OpaqueAuthenticationResult(String state) { + this.state = state; + } + + /** + * Returns an arbitrary value representing the result of authenticating the + * current user. This value may be resubmitted as the "state" parameter of + * an authentication request beneath the primary URI of the web application + * to finalize the authentication procedure and determine whether the + * operation has succeeded or failed. + * + * @return + * An arbitrary value representing the result of authenticating the + * current user. + */ + public String getState() { + return state; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationEventListener.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationEventListener.java new file mode 100644 index 0000000..2d353b5 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationEventListener.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl; + +import com.google.inject.Inject; +import org.apache.guacamole.auth.sso.SSOAuthenticationEventListener; +import org.apache.guacamole.net.auth.Credentials; + +/** + * A Listener that will reactivate or invalidate SSL auth sessions depending on + * overall auth success or failure. + */ +public class SSLAuthenticationEventListener extends SSOAuthenticationEventListener { + + /** + * Session manager for generating and maintaining unique tokens to + * represent the authentication flow of a user who has only partially + * authenticated. + * + * Requires static injection due to the fact that the webapp just calls the + * constructor directly when creating new Listeners. The instances will not + * be constructed by guice. + */ + @Inject + protected static SSLAuthenticationSessionManager sessionManager; + + @Override + protected String getSessionIdentifier(Credentials credentials) { + return AuthenticationProviderService.getSessionIdentifier(credentials); + } + + @Override + protected void reactivateSession(String sessionIdentifier) { + sessionManager.reactivateSession(sessionIdentifier); + } + + @Override + protected void invalidateSession(String sessionIdentifier) { + sessionManager.invalidateSession(sessionIdentifier); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationProvider.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationProvider.java new file mode 100644 index 0000000..2458c1a --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationProvider.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl; + +import org.apache.guacamole.auth.sso.SSOAuthenticationProvider; + +/** + * Guacamole authentication backend which authenticates users using SSL/TLS + * client authentication provided by some external SSL termination system. This + * SSL termination system must be configured to provide access to this same + * instance of Guacamole and must have both a wildcard certificate and wildcard + * DNS. No storage for connections is provided - only authentication. Storage + * must be provided by some other extension. + */ +public class SSLAuthenticationProvider extends SSOAuthenticationProvider { + + /** + * Creates a new SSLAuthenticationProvider that authenticates users against + * an external SSL termination system using SSL/TLS client authentication. + */ + public SSLAuthenticationProvider() { + super(AuthenticationProviderService.class, SSLClientAuthenticationResource.class, + new SSLAuthenticationProviderModule()); + } + + @Override + public String getIdentifier() { + return "ssl"; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationProviderModule.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationProviderModule.java new file mode 100644 index 0000000..bcf7368 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationProviderModule.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl; + +import com.google.inject.AbstractModule; +import com.google.inject.Scopes; +import org.apache.guacamole.auth.ssl.conf.ConfigurationService; +import org.apache.guacamole.auth.ssl.conf.SSLEnvironment; +import org.apache.guacamole.auth.sso.NonceService; +import org.apache.guacamole.environment.Environment; + +/** + * Guice module which configures injections specific to SSO using SSL/TLS + * client authentication. + */ +public class SSLAuthenticationProviderModule extends AbstractModule { + + /** + * The configuration environment of this server and extension. + */ + private final Environment environment = new SSLEnvironment(); + + @Override + protected void configure() { + bind(ConfigurationService.class); + bind(NonceService.class).in(Scopes.SINGLETON); + bind(SSLAuthenticationSessionManager.class); + + bind(Environment.class).toInstance(environment); + + requestStaticInjection(SSLAuthenticationEventListener.class); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationSession.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationSession.java new file mode 100644 index 0000000..41813a4 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationSession.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl; + +import org.apache.guacamole.net.auth.AuthenticationSession; + +/** + * Representation of an in-progress SSL/TLS authentication attempt. + */ +public class SSLAuthenticationSession extends AuthenticationSession { + + /** + * The identity asserted by the external SSL termination service. + */ + private final String identity; + + /** + * Creates a new AuthenticationSession representing an in-progress SSL/TLS + * authentication attempt. + * + * @param identity + * The identity asserted by the external SSL termination service. This + * MAY NOT be null. + * + * @param expires + * The number of milliseconds that may elapse before this session must + * be considered invalid. + */ + public SSLAuthenticationSession(String identity, long expires) { + super(expires); + this.identity = identity; + } + + /** + * Returns the identity asserted by the external SSL termination service. + * As authentication will have completed with respect to the SSL + * termination service by the time this session is created, this will + * always be non-null. + * + * @return + * The identity asserted by the external SSL termination service. + */ + public String getIdentity() { + return identity; + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationSessionManager.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationSessionManager.java new file mode 100644 index 0000000..252a2c9 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLAuthenticationSessionManager.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl; + +import com.google.inject.Singleton; +import org.apache.guacamole.net.auth.AuthenticationSessionManager; + +/** + * Manager service that temporarily stores SSL/TLS authentication attempts + * while the authentication flow is underway. + */ +@Singleton +public class SSLAuthenticationSessionManager + extends AuthenticationSessionManager { + + /** + * Returns the identity asserted by the external SSL termination service at + * the end of the authentication process represented by the authentication + * session with the given identifier. If there is no such authentication + * session, or no valid identity has been asserted for that session, null + * is returned. + * + * @param identifier + * The unique string returned by the call to defer(). For convenience, + * this value may safely be null. + * + * @return + * The identity asserted by the external SSL termination service at the + * end of the authentication process represented by the authentication + * session with the given identifier, or null if there is no such + * identity. + */ + public String getIdentity(String identifier) { + + SSLAuthenticationSession session = resume(identifier); + if (session != null) + return session.getIdentity(); + + return null; + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLClientAuthenticationResource.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLClientAuthenticationResource.java new file mode 100644 index 0000000..e9a7984 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/SSLClientAuthenticationResource.java @@ -0,0 +1,439 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.auth.ssl; + +import com.google.inject.Inject; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import javax.naming.ldap.Rdn; +import javax.ws.rs.GET; +import javax.ws.rs.core.Response; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.Path; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.auth.ssl.conf.ConfigurationService; +import org.apache.guacamole.auth.sso.NonceService; +import org.apache.guacamole.auth.sso.SSOResource; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x500.style.RFC4519Style; +import org.bouncycastle.cert.X509CertificateHolder; +import org.bouncycastle.openssl.PEMParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * REST API resource that allows the user to retrieve an opaque state value + * representing their identity as determined by SSL/TLS client authentication. + * The opaque value may represent a valid identity or an authentication + * failure, and must be resubmitted within a normal Guacamole authentication + * request to finalize the authentication process. + */ +public class SSLClientAuthenticationResource extends SSOResource { + + /** + * The string value that the SSL termination service uses for its client + * verification header to represent that the client certificate has been + * verified. + */ + private static final String CLIENT_VERIFIED_HEADER_SUCCESS_VALUE = "SUCCESS"; + + /** + * The string value that the SSL termination service uses for its client + * verification header to represent that the client certificate is absent. + */ + private static final String CLIENT_VERIFIED_HEADER_NONE_VALUE = "NONE"; + + /** + * The string prefix that the SSL termination service uses for its client + * verification header to represent that the client certificate has failed + * validation. The error message describing the nature of the failure is + * provided by the SSL termination service after this prefix. + */ + private static final String CLIENT_VERIFIED_HEADER_FAILED_PREFIX = "FAILED:"; + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(SSLClientAuthenticationResource.class); + + /** + * Service for retrieving configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Session manager for generating and maintaining unique tokens to + * represent the authentication flow of a user who has only partially + * authenticated. Here, these tokens represent a user that has been + * validated by SSL termination and allow the Guacamole instance that + * doesn't require SSL/TLS authentication to retrieve the user's identity + * and complete the authentication process. + */ + @Inject + private SSLAuthenticationSessionManager sessionManager; + + /** + * Service for validating and generating unique nonce values. Here, these + * nonces are used specifically for generating unique domains. + */ + @Inject + private NonceService subdomainNonceService; + + /** + * Retrieves a single value from the HTTP header having the given name. If + * there are multiple HTTP headers present with this name, the first + * matching header in the request is used. If there are no such headers in + * the request, null is returned. + * + * @param headers + * The HTTP headers present in the request. + * + * @param name + * The name of the header to retrieve. + * + * @return + * The first value of the HTTP header having the given name, or null if + * there is no such header. + */ + private String getHeader(HttpHeaders headers, String name) { + + List values = headers.getRequestHeader(name); + if (values == null || values.isEmpty()) + return null; + + return values.get(0); + + } + + /** + * Decodes the provided URL-encoded string as UTF-8, returning the result. + *

    + * NOTE: The escape() function of the Apache HTTPD server is known to not + * encode plus signs, which can appear in the base64-encoded certificates + * typically received here. To avoid mangling such certificates, this + * function specifically avoids decoding plus signs as spaces (as would + * otherwise happen if URLDecoder is used directly). + * + * @param value + * The URL-encoded string to decode. + * + * @return + * The decoded string. + * + * @throws GuacamoleException + * If the provided value is not a valid URL-encoded string. + */ + private byte[] decode(String value) throws GuacamoleException { + + // Ensure all plus signs are decoded literally rather than as spaces + // (the Apache HTTPD implementation of URL escaping that applies to + // request headers does not encode plus signs, whereas the Nginx + // implementation does) + value = value.replace("+", "%2B"); + + try { + return URLDecoder.decode(value, StandardCharsets.UTF_8.name()) + .getBytes(StandardCharsets.UTF_8); + } + catch (IllegalArgumentException e) { + throw new GuacamoleClientException("Invalid URL-encoded value.", e); + } + catch (UnsupportedEncodingException e) { + // This should never happen, as UTF-8 is a standard charset that + // the JVM is required to support + throw new UnsupportedOperationException("Unexpected lack of UTF-8 support.", e); + } + } + + /** + * Extracts a user's username from the X.509 subject name, which should be + * in LDAP DN format. If specific username attributes are configured, only + * those username attributes are used to determine the name. If a specific + * base DN is configured, only subject names that are formatted as LDAP DNs + * within that base DN will be accepted. + * + * @param name + * The subject name to extract the username from. + * + * @return + * The username of the user represented by the given subject name. + * + * @throws GuacamoleException + * If any configuration parameters related to retrieving certificates + * from HTTP request cannot be parsed, or if the provided subject name + * cannot be parsed or is not acceptable (wrong base DN or wrong + * username attribute). + */ + public String getUsername(String name) throws GuacamoleException { + + // Extract user's DN from their X.509 certificate + LdapName dn; + try { + dn = new LdapName(name); + } + catch (InvalidNameException e) { + throw new GuacamoleClientException("Subject \"" + name + "\" is " + + "not a valid DN: " + e.getMessage(), e); + } + + // Verify DN actually contains components + int numComponents = dn.size(); + if (numComponents < 1) + throw new GuacamoleClientException("Subject DN is empty."); + + // Verify DN is within configured base DN (if any) + LdapName baseDN = confService.getSubjectBaseDN(); + if (baseDN != null && !(numComponents > baseDN.size() && dn.startsWith(baseDN))) + throw new GuacamoleClientException("Subject DN \"" + dn + "\" is " + + "not within the configured base DN."); + + // Retrieve the least significant attribute from the parsed DN - this + // will be the username + Rdn nameRdn = dn.getRdn(numComponents - 1); + + // Verify that the username is specified with one of the allowed + // attributes + Collection usernameAttributes = confService.getSubjectUsernameAttributes(); + if (usernameAttributes != null && !usernameAttributes.stream().anyMatch(nameRdn.getType()::equalsIgnoreCase)) + throw new GuacamoleClientException("Subject DN \"" + dn + "\" " + + "does not contain an acceptable username attribute."); + + // The DN is valid - extract the username from the least significant + // component + String username = nameRdn.getValue().toString(); + logger.debug("Username \"{}\" extracted from subject DN \"{}\".", username, dn); + return username; + + } + + /** + * Authenticates a user using HTTP headers containing that user's verified + * X.509 certificate. It is assumed that this certificate is being passed + * to Guacamole from an SSL termination service that has already verified + * that this certificate is valid and authorized for access to that + * Guacamole instance. + * + * @param certificate + * The raw bytes of the X.509 certificate retrieved from the request. + * + * @return + * The username of the user asserted by the SSL termination service via + * that user's X.509 certificate. + * + * @throws GuacamoleException + * If any configuration parameters related to retrieving certificates + * from HTTP request cannot be parsed, or if the certificate is not + * valid/present. + */ + public String getUsername(byte[] certificate) throws GuacamoleException { + + // Parse and re-verify certificate is valid with respect to timestamps + X509CertificateHolder cert; + try (Reader reader = new StringReader(new String(certificate, StandardCharsets.UTF_8))) { + + PEMParser parser = new PEMParser(reader); + Object object = parser.readObject(); + + // Verify received data is indeed an X.509 certificate + if (object == null || !(object instanceof X509CertificateHolder)) + throw new GuacamoleClientException("Certificate did not " + + "contain an X.509 certificate."); + + // Verify sanity of received certificate (there should be only + // one object here) + if (parser.readObject() != null) + throw new GuacamoleClientException("Certificate contains " + + "more than a single X.509 certificate."); + + cert = (X509CertificateHolder) object; + + // Verify certificate is valid (it should be given pre-validation + // from SSL termination, but it's worth rechecking for sanity) + if (!cert.isValidOn(new Date())) + throw new GuacamoleClientException("Certificate has expired."); + + } + catch (IOException e) { + throw new GuacamoleServerException("Certificate could not be read: " + e.getMessage(), e); + } + + // Extract user's DN from their X.509 certificate in LDAP (RFC 4919) format + X500Name subject = X500Name.getInstance(RFC4519Style.INSTANCE, cert.getSubject()); + return getUsername(subject.toString()); + + } + + /** + * Processes the X.509 certificate in the given set of HTTP request + * headers, returning an authentication session token representing the + * identity in that certificate. If the certificate is invalid or not + * present, an invalid session token is returned. + * + * @param headers + * The headers of the HTTP request to process. + * + * @return + * An authentication session token representing the identity in the + * certificate in the given HTTP request, or an invalid session token + * if no valid identity was asserted. + */ + private String processCertificate(HttpHeaders headers) { + + // + // NOTE: A result with an associated state is ALWAYS returned by + // processCertificate(), even if the request does not actually contain + // a valid certificate. This is by design and ensures that the nature + // of a certificate (valid vs. invalid) cannot be determined except + // via Guacamole's authentication endpoint, thus allowing auth failure + // hooks to consider attempts to use invalid certificates as auth + // failures. + // + + try { + + // Verify that SSL termination has already verified the certificate + String verified = getHeader(headers, confService.getClientVerifiedHeader()); + if (verified != null && verified.startsWith(CLIENT_VERIFIED_HEADER_FAILED_PREFIX)) { + String message = verified.substring(CLIENT_VERIFIED_HEADER_FAILED_PREFIX.length()); + throw new GuacamoleClientException("Client certificate did " + + "not pass validation. SSL termination reports the " + + "following failure: \"" + message + "\""); + } + else if (CLIENT_VERIFIED_HEADER_NONE_VALUE.equals(verified)) { + throw new GuacamoleClientException("No client certificate was presented."); + } + else if (!CLIENT_VERIFIED_HEADER_SUCCESS_VALUE.equals(verified)) { + throw new GuacamoleClientException("Client certificate did not pass validation."); + } + + String certificate = getHeader(headers, confService.getClientCertificateHeader()); + if (certificate == null) + throw new GuacamoleClientException("Client certificate missing from request."); + + String username = getUsername(decode(certificate)); + long validityDuration = TimeUnit.MINUTES.toMillis(confService.getMaxTokenValidity()); + return sessionManager.defer(new SSLAuthenticationSession(username, validityDuration)); + + } + catch (GuacamoleClientException e) { + logger.warn("SSL/TLS client authentication attempt rejected: {}", e.getMessage()); + logger.debug("SSL/TLS client authentication failed.", e); + } + catch (GuacamoleException e) { + logger.error("SSL/TLS client authentication attempt could not be processed: {}", e.getMessage()); + logger.debug("SSL/TLS client authentication failed.", e); + } + catch (RuntimeException | Error e) { + logger.error("SSL/TLS client authentication attempt failed internally: {}", e.getMessage()); + logger.debug("Internal failure processing SSL/TLS client authentication attempt.", e); + } + + return sessionManager.generateInvalid(); + + } + + /** + * Attempts to authenticate the current user using SSL/TLS client + * authentication, returning an opaque value that represents their + * authenticated status. If necessary, the user is first redirected to a + * unique endpoint that supports SSL/TLS client authentication. + * + * @param headers + * All HTTP headers submitted in the user's authentication request. + * + * @param host + * The hostname that the user specified in their HTTP request. + * + * @return + * A Response containing an opaque value representing the user's + * authenticated status, or a Response redirecting the user to a + * unique endpoint that can provide this. + * + * @throws GuacamoleException + * If any required configuration information is missing or cannot be + * parsed, or if the request was not received at a valid subdomain. + */ + @GET + @Path("identity") + public Response authenticateClient(@Context HttpHeaders headers, + @HeaderParam("Host") String host) throws GuacamoleException { + + // Redirect any requests to the domain that does NOT require SSL/TLS + // client authentication to the same endpoint at a domain that does + // require SSL/TLS authentication + String subdomain = confService.getClientAuthenticationSubdomain(host); + if (subdomain == null) { + + long validityDuration = TimeUnit.MINUTES.toMillis(confService.getMaxDomainValidity()); + String uniqueSubdomain = subdomainNonceService.generate(validityDuration); + + URI clientAuthURI = UriBuilder.fromUri(confService.getClientAuthenticationURI(uniqueSubdomain)) + .path("api/ext/ssl/identity") + .build(); + + return Response.seeOther(clientAuthURI).build(); + + } + + // + // Process certificates only at valid single-use subdomains dedicated + // to client authentication, redirecting back to the main redirect URI + // for final authentication if that processing is successful. + // + // NOTE: This is CRITICAL. If unique subdomains are not generated and + // tied to strictly one authentication attempt, then those subdomains + // could be reused by a user on a shared machine to assume the cached + // credentials of another user that used that machine earlier. The + // browser and/or OS may cache the certificate so that it can be reused + // for future SSL sessions to that same domain. Here, we ensure each + // generated domain is unique and only valid for certificate processing + // ONCE. The domain may still be valid with DNS, but will no longer be + // usable for certificate authentication. + // + + if (subdomainNonceService.isValid(subdomain)) + return Response.ok(new OpaqueAuthenticationResult(processCertificate(headers))) + .header("Access-Control-Allow-Origin", confService.getPrimaryOrigin().toString()) + .type(MediaType.APPLICATION_JSON) + .build(); + + throw new GuacamoleResourceNotFoundException("No such resource."); + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/ConfigurationService.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/ConfigurationService.java new file mode 100644 index 0000000..6ca8c8e --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/ConfigurationService.java @@ -0,0 +1,481 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl.conf; + +import com.google.inject.Inject; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Collection; +import javax.naming.ldap.LdapName; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.properties.URIGuacamoleProperty; + +/** + * Service for retrieving configuration information regarding SSO using SSL/TLS + * authentication. + */ +public class ConfigurationService { + + /** + * The default name of the header to use to retrieve the URL-encoded client + * certificate from an HTTP request received from an SSL termination + * service providing SSL/TLS client authentication. + */ + private static String DEFAULT_CLIENT_CERTIFICATE_HEADER = "X-Client-Certificate"; + + /** + * The default name of the header to use to retrieve the verification + * status of the certificate an HTTP request received from an SSL + * termination service providing SSL/TLS client authentication. + */ + private static String DEFAULT_CLIENT_VERIFIED_HEADER = "X-Client-Verified"; + + /** + * The default amount of time that a temporary authentication token for + * SSL/TLS authentication may remain valid, in minutes. + */ + private static int DEFAULT_MAX_TOKEN_VALIDITY = 5; + + /** + * The default amount of time that the temporary, unique subdomain + * generated for SSL/TLS authentication may remain valid, in minutes. + */ + private static int DEFAULT_MAX_DOMAIN_VALIDITY = 5; + + /** + * The property representing the URI that should be used to authenticate + * users with SSL/TLS client authentication. This must be a URI that points + * to THIS instance of Guacamole, but behind SSL termination that requires + * SSL/TLS client authentication. + */ + private static final WildcardURIGuacamoleProperty SSL_AUTH_URI = + new WildcardURIGuacamoleProperty() { + + @Override + public String getName() { return "ssl-auth-uri"; } + + }; + + /** + * The property representing the URI of this instance without SSL/TLS + * client authentication required. This must be a URI that points + * to THIS instance of Guacamole, but behind SSL termination that DOES NOT + * require or request SSL/TLS client authentication. + */ + private static final URIGuacamoleProperty SSL_AUTH_PRIMARY_URI = + new URIGuacamoleProperty() { + + @Override + public String getName() { return "ssl-auth-primary-uri"; } + + }; + + /** + * The property representing the name of the header to use to retrieve the + * URL-encoded client certificate from an HTTP request received from an + * SSL termination service providing SSL/TLS client authentication. + */ + private static final StringGuacamoleProperty SSL_AUTH_CLIENT_CERTIFICATE_HEADER = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ssl-auth-client-certificate-header"; } + + }; + + /** + * The property representing the name of the header to use to retrieve the + * verification status of the certificate an HTTP request received from an + * SSL termination service providing SSL/TLS client authentication. This + * value of this header must be "SUCCESS" (all uppercase) if the + * certificate was successfully verified. + */ + private static final StringGuacamoleProperty SSL_AUTH_CLIENT_VERIFIED_HEADER = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "ssl-auth-client-verified-header"; } + + }; + + /** + * The property representing the amount of time that a temporary + * authentication token for SSL/TLS authentication may remain valid, in + * minutes. This token is used to represent the user's asserted identity + * after it has been verified by the SSL termination service. This interval + * must be long enough to allow for network delays in receiving the token, + * but short enough that unused tokens do not consume unnecessary server + * resources and cannot potentially be guessed while the token is still + * valid. These tokens are 256-bit secure random values. + */ + private static final IntegerGuacamoleProperty SSL_AUTH_MAX_TOKEN_VALIDITY = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ssl-auth-max-token-validity"; } + + }; + + /** + * The property defining the LDAP attribute or attributes that may be used + * to represent a username within the subject DN of a user's X.509 + * certificate. If the least-significant attribute of the subject DN is not + * one of these attributes, the certificate will be rejected. By default, + * any attribute is accepted. + */ + private static final StringGuacamoleProperty SSL_AUTH_SUBJECT_USERNAME_ATTRIBUTE = + new StringGuacamoleProperty () { + + @Override + public String getName() { return "ssl-auth-subject-username-attribute"; } + + }; + + /** + * The property defining the base DN containing all valid subject DNs. If + * specified, only certificates asserting subject DNs beneath this base DN + * will be accepted. By default, all DNs are accepted. + */ + private static final LdapNameGuacamoleProperty SSL_AUTH_SUBJECT_BASE_DN = + new LdapNameGuacamoleProperty () { + + @Override + public String getName() { return "ssl-auth-subject-base-dn"; } + + }; + + /** + * The property representing the amount of time that the temporary, unique + * subdomain generated for SSL/TLS authentication may remain valid, in + * minutes. This subdomain is used to ensure each SSL/TLS authentication + * attempt is fresh and does not potentially reuse a previous + * authentication attempt that was cached by the browser or OS. This + * interval must be long enough to allow for network delays in + * authenticating the user with the SSL termination service that enforces + * SSL/TLS client authentication, but short enough that an unused domain + * does not consume unnecessary server resources and cannot potentially be + * guessed while that subdomain is still valid. These subdomains are + * 128-bit secure random values. + */ + private static final IntegerGuacamoleProperty SSL_AUTH_MAX_DOMAIN_VALIDITY = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "ssl-auth-max-domain-validity"; } + + }; + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Returns whether the given hostname matches the hostname of the given + * URI. The provided hostname may be the value of an HTTP "Host" header, + * and may include a port number. If a port number is included in the + * hostname, it is ignored. + * + * @param hostname + * The hostname to check, which may alternatively be the value of an + * HTTP "Host" header, with or without port number. The port number is + * not considered when determining whether this hostname matches the + * hostname of the provided URI. + * + * @param offset + * The character offset within the provided hostname where checking + * should start. Any characters before this offset are ignored. This + * offset does not affect where checking starts within the hostname of + * the provided URI. + * + * @param uri + * The URI to check the given hostname against. + * + * @return + * true if the provided hostname from the given offset onward is + * identical to the hostname of the given URI, false otherwise. + */ + private boolean hostnameMatches(String hostname, int offset, URI uri) { + + // Locate end of actual hostname portion of "Host" header + int endOfHostname = hostname.indexOf(':'); + if (endOfHostname == -1) + endOfHostname = hostname.length(); + + // Before checking substring equivalence, we need to verify that the + // length actually matches what we expect (we'd otherwise consider the + // host to match if it starts with the expected hostname, ignoring any + // remaining characters) + String expectedHostname = uri.getHost(); + if (expectedHostname.length() != endOfHostname - offset) + return false; + + return hostname.regionMatches(true, offset, expectedHostname, 0, expectedHostname.length()); + + } + + /** + * Returns a URI that should be used to authenticate users with SSL/TLS + * client authentication. The returned URI will consist of the configured + * client authentication URI with the wildcard portion ("*.") replaced with + * the given subdomain. + * + * @param subdomain + * The subdomain that should replace the wildcard portion of the + * configured client authentication URI. + * + * @return + * A URI that should be used to authenticate users with SSL/TLS + * client authentication. + * + * @throws GuacamoleException + * If the required property for configuring the client authentication + * URI is missing or cannot be parsed. + */ + public URI getClientAuthenticationURI(String subdomain) throws GuacamoleException { + + URI authURI = environment.getRequiredProperty(SSL_AUTH_URI); + String baseHostname = authURI.getHost(); + + // Add provided subdomain to auth URI + return UriBuilder.fromUri(authURI) + .host(subdomain + "." + baseHostname) + .build(); + + } + + /** + * Given a hostname that was used by a user for SSL/TLS client + * authentication, returns the subdomain at the beginning of that hostname. + * If the hostname does not match the pattern of hosts represented by the + * configured client authentication URI, null is returned. + * + * @param hostname + * The hostname to extract the subdomain from. + * + * @return + * The subdomain at the beginning of the provided hostname, if that + * hostname matches the pattern of hosts represented by the + * configured client authentication URI, or null otherwise. + * + * @throws GuacamoleException + * If the required property for configuring the client authentication + * URI is missing or cannot be parsed. + */ + public String getClientAuthenticationSubdomain(String hostname) throws GuacamoleException { + + // Any hostname that matches the explicitly-specific primary URI is not + // a client auth subdomain + if (isPrimaryHostname(hostname)) + return null; + + // Verify the first domain component is at least one character in + // length + int firstPeriod = hostname.indexOf('.'); + if (firstPeriod <= 0) + return null; + + // Verify domain matches the configured auth URI except for the leading + // subdomain + URI authURI = environment.getRequiredProperty(SSL_AUTH_URI); + if (!hostnameMatches(hostname, firstPeriod + 1, authURI)) + return null; + + // Extract subdomain + return hostname.substring(0, firstPeriod); + + } + + /** + * Returns the URI of this instance without SSL/TLS client authentication + * required. + * + * @return + * The URI of this instance without SSL/TLS client authentication + * required. + * + * @throws GuacamoleException + * If the required property for configuring the primary URI is missing + * or cannot be parsed. + */ + public URI getPrimaryURI() throws GuacamoleException { + return environment.getRequiredProperty(SSL_AUTH_PRIMARY_URI); + } + + /** + * Returns the HTTP request origin for requests originating from this + * instance via the primary URI (as returned by {@link #getPrimaryURI()}. + * This value is essentially the same as the primary URI but with only the + * scheme, host, and port present. + * + * @return + * The HTTP request origin for requests originating from this instance + * via the primary URI. + * + * @throws GuacamoleException + * If the required property for configuring the primary URI is missing + * or cannot be parsed. + */ + public URI getPrimaryOrigin() throws GuacamoleException { + URI primaryURI = getPrimaryURI(); + try { + return new URI(primaryURI.getScheme(), null, primaryURI.getHost(), primaryURI.getPort(), null, null, null); + } + catch (URISyntaxException e) { + throw new GuacamoleServerException("Request origin could not be " + + "derived from the configured primary URI.", e); + } + } + + /** + * Returns whether the given hostname is the same as the hostname in the + * primary URI (as returned by {@link #getPrimaryURI()}. Hostnames are + * case-insensitive. + * + * @param hostname + * The hostname to test. + * + * @return + * true if the hostname is the same as the hostname in the primary URI, + * false otherwise. + * + * @throws GuacamoleException + * If the required property for configuring the primary URI is missing + * or cannot be parsed. + */ + public boolean isPrimaryHostname(String hostname) throws GuacamoleException { + URI primaryURI = getPrimaryURI(); + return hostnameMatches(hostname, 0, primaryURI); + } + + /** + * Returns the name of the header to use to retrieve the URL-encoded client + * certificate from an HTTP request received from an SSL termination + * service providing SSL/TLS client authentication. + * + * @return + * The name of the header to use to retrieve the URL-encoded client + * certificate from an HTTP request received from an SSL termination + * service providing SSL/TLS client authentication. + * + * @throws GuacamoleException + * If the property for configuring the client certificate header cannot + * be parsed. + */ + public String getClientCertificateHeader() throws GuacamoleException { + return environment.getProperty(SSL_AUTH_CLIENT_CERTIFICATE_HEADER, DEFAULT_CLIENT_CERTIFICATE_HEADER); + } + + /** + * Returns the name of the header to use to retrieve the verification + * status of the certificate an HTTP request received from an SSL + * termination service providing SSL/TLS client authentication. + * + * @return + * The name of the header to use to retrieve the verification + * status of the certificate an HTTP request received from an SSL + * termination service providing SSL/TLS client authentication. + * + * @throws GuacamoleException + * If the property for configuring the client verification header + * cannot be parsed. + */ + public String getClientVerifiedHeader() throws GuacamoleException { + return environment.getProperty(SSL_AUTH_CLIENT_VERIFIED_HEADER, DEFAULT_CLIENT_VERIFIED_HEADER); + } + + /** + * Returns the maximum amount of time that the token generated by the + * Guacamole server representing current SSL authentication state should + * remain valid, in minutes. This imposes an upper limit on the amount of + * time any particular authentication request can result in successful + * authentication within Guacamole when SSL/TLS client authentication is + * configured. By default, this will be 5. + * + * @return + * The maximum amount of time that an SSL authentication token + * generated by the Guacamole server should remain valid, in minutes. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getMaxTokenValidity() throws GuacamoleException { + return environment.getProperty(SSL_AUTH_MAX_TOKEN_VALIDITY, DEFAULT_MAX_TOKEN_VALIDITY); + } + + /** + * Returns the maximum amount of time that a unique client authentication + * subdomain generated by the Guacamole server should remain valid, in + * minutes. This imposes an upper limit on the amount of time any + * particular authentication request can result in successful + * authentication within Guacamole when SSL/TLS client authentication is + * configured. By default, this will be 5. + * + * @return + * The maximum amount of time that a unique client authentication + * subdomain generated by the Guacamole server should remain valid, in + * minutes. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed. + */ + public int getMaxDomainValidity() throws GuacamoleException { + return environment.getProperty(SSL_AUTH_MAX_DOMAIN_VALIDITY, DEFAULT_MAX_DOMAIN_VALIDITY); + } + + /** + * Returns the base DN that contains all valid subject DNs. If there is no + * such base DN (and all subject DNs are valid), null is returned. + * + * @return + * The base DN that contains all valid subject DNs, or null if all + * subject DNs are valid. + * + * @throws GuacamoleException + * If the configured base DN cannot be read or is not a valid LDAP DN. + */ + public LdapName getSubjectBaseDN() throws GuacamoleException { + return environment.getProperty(SSL_AUTH_SUBJECT_BASE_DN); + } + + /** + * Returns a list of all attributes that may be used to represent a user's + * username within their subject DN. If all attributes may be accepted, + * null is returned. + * + * @return + * A list of all attributes that may be used to represent a user's + * username within their subject DN, or null if any attribute may be + * used. + * + * @throws GuacamoleException + * If the configured set of username attributes cannot be read. + */ + public Collection getSubjectUsernameAttributes() throws GuacamoleException { + return environment.getPropertyCollection(SSL_AUTH_SUBJECT_USERNAME_ATTRIBUTE); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/LdapNameGuacamoleProperty.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/LdapNameGuacamoleProperty.java new file mode 100644 index 0000000..0299d01 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/LdapNameGuacamoleProperty.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl.conf; + +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.properties.GuacamoleProperty; + +/** + * A GuacamoleProperty whose value is an LDAP name, such as a distinguished + * name. + */ +public abstract class LdapNameGuacamoleProperty implements GuacamoleProperty { + + @Override + public LdapName parseValue(String value) throws GuacamoleException { + + if (value == null) + return null; + + try { + return new LdapName(value); + } + catch (InvalidNameException e) { + throw new GuacamoleServerException("Value \"" + value + + "\" is not a valid LDAP name.", e); + } + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/SSLEnvironment.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/SSLEnvironment.java new file mode 100644 index 0000000..29d5d80 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/SSLEnvironment.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl.conf; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.DelegatingEnvironment; +import org.apache.guacamole.environment.LocalEnvironment; + +/** + * An environment for retrieving SSL-related properties from the Guacamole + * configuration. + */ +public class SSLEnvironment extends DelegatingEnvironment { + + /** + * Create a new instance of the configuration environment for the + * SSL SSO module, pulling the default instance of the LocalEnvironment. + */ + public SSLEnvironment() { + super(LocalEnvironment.getInstance()); + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/WildcardURIGuacamoleProperty.java b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/WildcardURIGuacamoleProperty.java new file mode 100644 index 0000000..ab08ee3 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/java/org/apache/guacamole/auth/ssl/conf/WildcardURIGuacamoleProperty.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.ssl.conf; + +import java.net.URI; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.properties.URIGuacamoleProperty; + +/** + * A GuacamoleProperty whose value is a wildcard URI. The behavior of this + * property is identical to URIGuacamoleProperty except that it verifies a + * wildcard hostname prefix ("*.") is present and strips that prefix from the + * parsed URI. + */ +public abstract class WildcardURIGuacamoleProperty extends URIGuacamoleProperty { + + /** + * Regular expression that broadly matches URIs that contain wildcards in + * their hostname. This regular expression is NOT strict and will match + * invalid URIs. It is only strict enough to recognize a wildcard hostname + * prefix. + */ + private static final Pattern WILDCARD_URI_PATTERN = Pattern.compile("([^:]+://(?:[^@]+@)?)\\*\\.(.*)"); + + @Override + public URI parseValue(String value) throws GuacamoleException { + + if (value == null) + return null; + + // Verify wildcard prefix is present + Matcher matcher = WILDCARD_URI_PATTERN.matcher(value); + if (matcher.matches()) { + + // Strip wildcard prefix from URI and verify a valid hostname is + // still present + URI uri = super.parseValue(matcher.group(1) + matcher.group(2)); + if (uri.getHost() != null) + return uri; + + } + + // All other values are not valid wildcard URIs + throw new GuacamoleServerException("Value \"" + value + + "\" is not a valid wildcard URI."); + + } + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/directives/guacSslAuth.js b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/directives/guacSslAuth.js new file mode 100644 index 0000000..4934712 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/directives/guacSslAuth.js @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which automatically attempts to log the current user in using + * SSL/TLS client authentication when the associated element is clicked. + */ +angular.module('element').directive('guacSslAuth', ['$injector', function guacSslAuth($injector) { + + // Required services + var clientAuthService = $injector.get('clientAuthService'); + + var directive = { + restrict: 'A' + }; + + directive.link = function linkGuacSslAuth($scope, $element) { + + /** + * The element which will register the click. + * + * @type Element + */ + const element = $element[0]; + + // Attempt SSL/TLS client authentication upon click + element.addEventListener('click', function elementClicked() { + clientAuthService.authenticate(); + }); + + }; + + return directive; + +}]); diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..2e23e67 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/guac-manifest.json @@ -0,0 +1,39 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "SSL Authentication Extension", + "namespace" : "ssl", + + "authProviders" : [ + "org.apache.guacamole.auth.ssl.SSLAuthenticationProvider" + ], + + "listeners" : [ + "org.apache.guacamole.auth.ssl.SSLAuthenticationEventListener" + ], + + "css" : [ + "styles/sso-providers.css" + ], + + "js" : [ "ssl.min.js" ], + + "html" : [ + "html/sso-providers.html", + "html/sso-provider-ssl.html" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ] + +} diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/html/sso-provider-ssl.html b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/html/sso-provider-ssl.html new file mode 100644 index 0000000..d9a3db8 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/html/sso-provider-ssl.html @@ -0,0 +1,4 @@ + +

  • {{ + 'LOGIN.NAME_IDP_SSL' | translate +}}
  • diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/license.txt b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/services/clientAuthService.js b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/services/clientAuthService.js new file mode 100644 index 0000000..3bf9d9e --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/services/clientAuthService.js @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for authenticating a user using SSL/TLS client authentication. + */ +angular.module('guacSsoSsl').factory('clientAuthService', ['$injector', + function clientAuthServiceProvider($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + + var service = {}; + + /** + * Attempt to authenticate using a unique token obtained through SSL/TLS + * client authentication. + */ + service.authenticate = function authenticate() { + + // Transform SSL/TLS identity into an opaque "state" value and + // attempt authentication using that value + authenticationService.authenticate( + requestService({ + method: 'GET', + headers : { + 'Cache-Control' : undefined, // Avoid sending headers that would result in a pre-flight OPTIONS request for CORS + 'Pragma' : undefined + }, + url: 'api/ext/ssl/identity' + }) + .then(function identityRetrieved(data) { + return { 'state' : data.state || '' }; + }) + )['catch'](requestService.IGNORE); + + }; + + return service; + +}]); diff --git a/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/sslModule.js b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/sslModule.js new file mode 100644 index 0000000..2e3f844 --- /dev/null +++ b/extensions/guacamole-auth-sso/modules/guacamole-auth-sso-ssl/src/main/resources/sslModule.js @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code implementing SSO using SSL/TLS client authentication. + */ +angular.module('guacSsoSsl', [ + 'auth', + 'rest' +]); + +// Ensure the guacSsoSsl module is loaded along with the rest of the app +angular.module('index').requires.push('guacSsoSsl'); diff --git a/extensions/guacamole-auth-sso/pom.xml b/extensions/guacamole-auth-sso/pom.xml new file mode 100644 index 0000000..f95ecd6 --- /dev/null +++ b/extensions/guacamole-auth-sso/pom.xml @@ -0,0 +1,93 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-sso + pom + 1.6.0 + guacamole-auth-sso + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + modules/guacamole-auth-sso-dist + + + modules/guacamole-auth-sso-base + + + modules/guacamole-auth-sso-cas + modules/guacamole-auth-sso-openid + modules/guacamole-auth-sso-saml + modules/guacamole-auth-sso-ssl + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + org.apache.guacamole + guacamole-auth-sso-base + 1.6.0 + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + javax.ws.rs + jsr311-api + 1.1.1 + provided + + + + + + diff --git a/extensions/guacamole-auth-totp/.gitignore b/extensions/guacamole-auth-totp/.gitignore new file mode 100644 index 0000000..1de9633 --- /dev/null +++ b/extensions/guacamole-auth-totp/.gitignore @@ -0,0 +1,3 @@ +src/main/resources/generated/ +target/ +*~ diff --git a/extensions/guacamole-auth-totp/.ratignore b/extensions/guacamole-auth-totp/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-auth-totp/pom.xml b/extensions/guacamole-auth-totp/pom.xml new file mode 100644 index 0000000..b11570e --- /dev/null +++ b/extensions/guacamole-auth-totp/pom.xml @@ -0,0 +1,190 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-auth-totp + jar + 1.6.0 + guacamole-auth-totp + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + + com.keithbranton.mojo + angular-maven-plugin + 0.3.4 + + + generate-resources + + html2js + + + + + ${basedir}/src/main/resources + **/*.html + ${basedir}/src/main/resources/generated/templates-main/templates.js + app/ext/totp + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + totp.css + + + license.txt + + + + **/*.css + + + / + / + totp.js + + + license.txt + + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + com.google.guava + guava + + + + + com.google.inject + guice + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + junit + junit + test + + + + + com.google.zxing + javase + 3.5.3 + + + com.google.zxing + core + 3.5.3 + + + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + provided + + + + + com.github.seancfoley + ipaddress + provided + + + + + diff --git a/extensions/guacamole-auth-totp/src/licenses/bundled/README b/extensions/guacamole-auth-totp/src/licenses/bundled/README new file mode 100644 index 0000000..47ba19d --- /dev/null +++ b/extensions/guacamole-auth-totp/src/licenses/bundled/README @@ -0,0 +1,4 @@ +Apache Guacamole includes a number of subcomponents with separate copyright +notices and license terms. Your use of these subcomponents is subject to the +terms and conditions of their respective licenses, included within this +directory for reference. diff --git a/extensions/guacamole-auth-totp/src/licenses/bundled/totp-reference-impl-07/README b/extensions/guacamole-auth-totp/src/licenses/bundled/totp-reference-impl-07/README new file mode 100644 index 0000000..a59c777 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/licenses/bundled/totp-reference-impl-07/README @@ -0,0 +1,8 @@ +TOTP Reference Implementation (https://tools.ietf.org/id/draft-mraihi-totp-timebased-07.html#Section-Reference-Impl) +------------------------------------------------------------------------------- + + Verson: 07 + From: 'IETF Trust' (http://trustee.ietf.org/license-info) + License(s): + BSD 3-clause (bundled/totp-reference-impl-07/license.txt) + diff --git a/extensions/guacamole-auth-totp/src/licenses/bundled/totp-reference-impl-07/license.txt b/extensions/guacamole-auth-totp/src/licenses/bundled/totp-reference-impl-07/license.txt new file mode 100644 index 0000000..bb1afcd --- /dev/null +++ b/extensions/guacamole-auth-totp/src/licenses/bundled/totp-reference-impl-07/license.txt @@ -0,0 +1,28 @@ +Copyright (c) 2011 IETF Trust and the persons identified as authors +of the code. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of Internet Society, IETF or IETF Trust, nor the names + of specific contributors, may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/extensions/guacamole-auth-totp/src/main/assembly/dist.xml b/extensions/guacamole-auth-totp/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java new file mode 100644 index 0000000..0b91558 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp; + +import org.apache.guacamole.auth.totp.user.UserVerificationService; +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.totp.user.CodeUsageTrackingService; +import org.apache.guacamole.auth.totp.user.TOTPUserContext; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * AuthenticationProvider implementation which uses TOTP as an additional + * authentication factor for users which have already been authenticated by + * some other AuthenticationProvider. + */ +public class TOTPAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * Injector which will manage the object graph of this authentication + * provider. + */ + private final Injector injector; + + /** + * Creates a new TOTPAuthenticationProvider that verifies users using TOTP. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public TOTPAuthenticationProvider() throws GuacamoleException { + + // Set up Guice injector. + injector = Guice.createInjector( + new TOTPAuthenticationProviderModule(this) + ); + + } + + @Override + public String getIdentifier() { + return "totp"; + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + + UserVerificationService verificationService = + injector.getInstance(UserVerificationService.class); + + // Verify identity of user + verificationService.verifyIdentity(context, authenticatedUser); + + // User has been verified, and authentication should be allowed to + // continue + return new TOTPUserContext(context); + + } + + @Override + public UserContext redecorate(UserContext decorated, UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + return new TOTPUserContext(context); + } + + @Override + public void shutdown() { + injector.getInstance(CodeUsageTrackingService.class).shutdown(); + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProviderModule.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProviderModule.java new file mode 100644 index 0000000..51650d8 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProviderModule.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp; + +import org.apache.guacamole.auth.totp.user.UserVerificationService; +import com.google.inject.AbstractModule; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.totp.conf.ConfigurationService; +import org.apache.guacamole.auth.totp.user.CodeUsageTrackingService; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * Guice module which configures TOTP-specific injections. + */ +public class TOTPAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * A reference to the TOTPAuthenticationProvider on behalf of which this + * module has configured injection. + */ + private final AuthenticationProvider authProvider; + + /** + * Creates a new TOTP authentication provider module which configures + * injection for the TOTPAuthenticationProvider. + * + * @param authProvider + * The AuthenticationProvider for which injection is being configured. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public TOTPAuthenticationProviderModule(AuthenticationProvider authProvider) + throws GuacamoleException { + + // Get local environment + this.environment = LocalEnvironment.getInstance(); + + // Store associated auth provider + this.authProvider = authProvider; + + } + + @Override + protected void configure() { + + // Bind core implementations of guacamole-ext classes + bind(AuthenticationProvider.class).toInstance(authProvider); + bind(Environment.class).toInstance(environment); + + // Bind TOTP-specific services + bind(CodeUsageTrackingService.class); + bind(ConfigurationService.class); + bind(UserVerificationService.class); + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/conf/ConfigurationService.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/conf/ConfigurationService.java new file mode 100644 index 0000000..3112914 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/conf/ConfigurationService.java @@ -0,0 +1,230 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.conf; + +import com.google.inject.Inject; +import inet.ipaddr.IPAddress; +import java.util.Collections; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.IPAddressListProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.totp.TOTPGenerator; + +/** + * Service for retrieving configuration information regarding the TOTP + * authentication extension. + */ +public class ConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * The human-readable name of the entity issuing user accounts. By default, + * this will be "Apache Guacamole". + */ + private static final StringGuacamoleProperty TOTP_ISSUER = + new StringGuacamoleProperty() { + + @Override + public String getName() { return "totp-issuer"; } + + }; + + /** + * The number of digits which should be included in each generated TOTP + * code. By default, this will be 6. + */ + private static final IntegerGuacamoleProperty TOTP_DIGITS= + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "totp-digits"; } + + }; + + /** + * The duration that each generated code should remain valid, in seconds. + * By default, this will be 30. + */ + private static final IntegerGuacamoleProperty TOTP_PERIOD = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "totp-period"; } + + }; + + /** + * The hash algorithm that should be used to generate TOTP codes. By + * default, this will be "sha1". Legal values are "sha1", "sha256", and + * "sha512". + */ + private static final EnumGuacamoleProperty TOTP_MODE = + new EnumGuacamoleProperty(TOTPGenerator.Mode.class) { + + @Override + public String getName() { return "totp-mode"; } + + }; + + /** + * A property that contains a list of IP addresses and/or subnets for which + * MFA via the TOTP module should be bypassed. Users logging in from addresses + * contained in this list will not be prompted for a second authentication + * factor. If this property is empty or not defined, and the TOTP module + * is installed, all users will be prompted for MFA. + */ + private static final IPAddressListProperty TOTP_BYPASS_HOSTS = + new IPAddressListProperty() { + + @Override + public String getName() { return "totp-bypass-hosts"; } + + }; + + /** + * A property that contains a list of IP addresses and/or subnets for which + * MFA via the TOTP module should explicitly be enabled. If this property is defined, + * and the TOTP module is installed, users logging in from hosts contained + * in this list will be prompted for MFA, and users logging in from all + * other hosts will not be prompted for MFA. + */ + private static final IPAddressListProperty TOTP_ENFORCE_HOSTS = + new IPAddressListProperty() { + + @Override + public String getName() { return "totp-enforce-hosts"; } + + }; + + /** + * Returns the human-readable name of the entity issuing user accounts. If + * not specified, "Apache Guacamole" will be used by default. + * + * @return + * The human-readable name of the entity issuing user accounts. + * + * @throws GuacamoleException + * If the "totp-issuer" property cannot be read from + * guacamole.properties. + */ + public String getIssuer() throws GuacamoleException { + return environment.getProperty(TOTP_ISSUER, "Apache Guacamole"); + } + + /** + * Returns the number of digits which should be included in each generated + * TOTP code. If not specified, 6 will be used by default. + * + * @return + * The number of digits which should be included in each generated + * TOTP code. + * + * @throws GuacamoleException + * If the "totp-digits" property cannot be read from + * guacamole.properties. + */ + public int getDigits() throws GuacamoleException { + + // Validate legal number of digits + int digits = environment.getProperty(TOTP_DIGITS, 6); + if (digits < 6 || digits > 8) + throw new GuacamoleServerException("TOTP codes may have no fewer " + + "than 6 digits and no more than 8 digits."); + + return digits; + + } + + /** + * Returns the duration that each generated code should remain valid, in + * seconds. If not specified, 30 will be used by default. + * + * @return + * The duration that each generated code should remain valid, in + * seconds. + * + * @throws GuacamoleException + * If the "totp-period" property cannot be read from + * guacamole.properties. + */ + public int getPeriod() throws GuacamoleException { + return environment.getProperty(TOTP_PERIOD, 30); + } + + /** + * Returns the hash algorithm that should be used to generate TOTP codes. If + * not specified, SHA1 will be used by default. + * + * @return + * The hash algorithm that should be used to generate TOTP codes. + * + * @throws GuacamoleException + * If the "totp-mode" property cannot be read from + * guacamole.properties. + */ + public TOTPGenerator.Mode getMode() throws GuacamoleException { + return environment.getProperty(TOTP_MODE, TOTPGenerator.Mode.SHA1); + } + + /** + * Return the list of IP addresses and/or subnets for which MFA authentication via the + * TOTP module should be bypassed, allowing users from those addresses to log in + * without the MFA requirement. + * + * @return + * A list of IP addresses and/or subnets for which MFA authentication + * should be bypassed. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or an invalid IP address + * or subnet is specified. + */ + public List getBypassHosts() throws GuacamoleException { + return environment.getProperty(TOTP_BYPASS_HOSTS, Collections.emptyList()); + } + + /** + * Return the list of IP addresses and/or subnets for which MFA authentication via the TOTP + * module should be explicitly enabled, requiring users logging in from hosts specified in + * the list to complete MFA. + * + * @return + * A list of IP addresses and/or subnets for which MFA authentication + * should be explicitly enabled. + * + * @throws GuacamoleException + * If guacamole.properties cannot be parsed, or an invalid IP address + * or subnet is specified. + */ + public List getEnforceHosts() throws GuacamoleException { + return environment.getProperty(TOTP_ENFORCE_HOSTS, Collections.emptyList()); + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/form/AuthenticationCodeField.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/form/AuthenticationCodeField.java new file mode 100644 index 0000000..46661f7 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/form/AuthenticationCodeField.java @@ -0,0 +1,312 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.form; + +import com.google.common.io.BaseEncoding; +import com.google.inject.Inject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URI; +import javax.ws.rs.core.UriBuilder; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.totp.user.UserTOTPKey; +import org.apache.guacamole.auth.totp.conf.ConfigurationService; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.totp.TOTPGenerator; + +/** + * Field which prompts the user for an authentication code generated via TOTP. + */ +public class AuthenticationCodeField extends Field { + + /** + * The name of the HTTP parameter which will contain the TOTP code provided + * by the user to verify their identity. + */ + public static final String PARAMETER_NAME = "guac-totp"; + + /** + * The unique name associated with this field type. + */ + private static final String FIELD_TYPE_NAME = "GUAC_TOTP_CODE"; + + /** + * The width of QR codes to generate, in pixels. + */ + private static final int QR_CODE_WIDTH = 256; + + /** + * The height of QR codes to generate, in pixels. + */ + private static final int QR_CODE_HEIGHT = 256; + + /** + * BaseEncoding which encodes/decodes base32. + */ + private static final BaseEncoding BASE32 = BaseEncoding.base32(); + + /** + * Service for retrieving configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * The TOTP key to expose to the user for the sake of enrollment, if any. + * If no such key should be exposed to the user, this will be null. + */ + private UserTOTPKey key; + + /** + * Creates a new field which prompts the user for an authentication code + * generated via TOTP. The user's TOTP key is not exposed for enrollment. + */ + public AuthenticationCodeField() { + super(PARAMETER_NAME, FIELD_TYPE_NAME); + } + + /** + * Exposes the given key to facilitate enrollment. + * + * @param key + * The TOTP key to expose to the user for the sake of enrollment. + */ + public void exposeKey(UserTOTPKey key) { + this.key = key; + } + + /** + * Returns the username of the user associated with the key being used to + * generate TOTP codes. If the user's key is not being exposed to facilitate + * enrollment, this value will not be exposed either. + * + * @return + * The username of the user associated with the key being used to + * generate TOTP codes, or null if the user's key is not being exposed + * to facilitate enrollment. + */ + public String getUsername() { + + // Do not reveal TOTP mode unless enrollment is in progress + if (key == null) + return null; + + return key.getUsername(); + + } + + /** + * Returns the base32-encoded secret key that is being used to generate TOTP + * codes for the authenticating user. If the user's key is not being exposed + * to facilitate enrollment, this value will not be exposed either. + * + * @return + * The base32-encoded secret key that is being used to generate TOTP + * codes for the authenticating user, or null if the user's key is not + * being exposed to facilitate enrollment. + */ + public String getSecret() { + + // Do not reveal TOTP mode unless enrollment is in progress + if (key == null) + return null; + + return BASE32.encode(key.getSecret()); + + } + + /** + * Returns the number of digits used for each TOTP code. If the user's key + * is not being exposed to facilitate enrollment, this value will not be + * exposed either. + * + * @return + * The number of digits used for each TOTP code, or null if the user's + * key is not being exposed to facilitate enrollment. + * + * @throws GuacamoleException + * If the number of digits cannot be read from guacamole.properties. + */ + public Integer getDigits() throws GuacamoleException { + + // Do not reveal code size unless enrollment is in progress + if (key == null) + return null; + + return confService.getDigits(); + + } + + /** + * Returns the human-readable name of the entity issuing user accounts. If + * the user's key is not being exposed to facilitate enrollment, this value + * will not be exposed either. + * + * @return + * The human-readable name of the entity issuing user accounts, or null + * if the user's key is not being exposed to facilitate enrollment. + * + * @throws GuacamoleException + * If the issuer cannot be read from guacamole.properties. + */ + public String getIssuer() throws GuacamoleException { + + // Do not reveal code issuer unless enrollment is in progress + if (key == null) + return null; + + return confService.getIssuer(); + + } + + /** + * Returns the mode that TOTP code generation is operating in. This value + * will be one of "SHA1", "SHA256", or "SHA512". If the user's key is not + * being exposed to facilitate enrollment, this value will not be exposed + * either. + * + * @return + * The mode that TOTP code generation is operating in, such as "SHA1", + * "SHA256", or "SHA512", or null if the user's key is not being + * exposed to facilitate enrollment. + * + * @throws GuacamoleException + * If the TOTP mode cannot be read from guacamole.properties. + */ + public TOTPGenerator.Mode getMode() throws GuacamoleException { + + // Do not reveal TOTP mode unless enrollment is in progress + if (key == null) + return null; + + return confService.getMode(); + + } + + /** + * Returns the number of seconds that each TOTP code remains valid. If the + * user's key is not being exposed to facilitate enrollment, this value will + * not be exposed either. + * + * @return + * The number of seconds that each TOTP code remains valid, or null if + * the user's key is not being exposed to facilitate enrollment. + * + * @throws GuacamoleException + * If the period cannot be read from guacamole.properties. + */ + public Integer getPeriod() throws GuacamoleException { + + // Do not reveal code period unless enrollment is in progress + if (key == null) + return null; + + return confService.getPeriod(); + + } + + /** + * Returns the "otpauth" URI for the secret key used to generate TOTP codes + * for the current user. If the secret key is not being exposed to + * facilitate enrollment, null is returned. + * + * @return + * The "otpauth" URI for the secret key used to generate TOTP codes + * for the current user, or null is the secret ket is not being exposed + * to facilitate enrollment. + * + * @throws GuacamoleException + * If the configuration information required for generating the key URI + * cannot be read from guacamole.properties. + */ + public URI getKeyUri() throws GuacamoleException { + + // Do not generate a key URI if no key is being exposed + if (key == null) + return null; + + // Format "otpauth" URL (see https://github.com/google/google-authenticator/wiki/Key-Uri-Format) + String issuer = confService.getIssuer(); + return UriBuilder.fromUri("otpauth://totp/") + .path(issuer + ":" + key.getUsername()) + .queryParam("secret", BASE32.encode(key.getSecret())) + .queryParam("issuer", issuer) + .queryParam("algorithm", confService.getMode()) + .queryParam("digits", confService.getDigits()) + .queryParam("period", confService.getPeriod()) + .build(); + + } + + /** + * Returns the URL of a QR code describing the user's TOTP key and + * configuration. If the key is not being exposed for enrollment, null is + * returned. + * + * @return + * The URL of a QR code describing the user's TOTP key and + * configuration, or null if the key is not being exposed for + * enrollment. + * + * @throws GuacamoleException + * If the configuration information required for generating the QR code + * cannot be read from guacamole.properties. + */ + public String getQrCode() throws GuacamoleException { + + // Do not generate a QR code if no key is being exposed + URI keyURI = getKeyUri(); + if (keyURI == null) + return null; + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + + try { + + // Create QR code writer + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix matrix = writer.encode(keyURI.toString(), + BarcodeFormat.QR_CODE, QR_CODE_WIDTH, QR_CODE_HEIGHT); + + // Produce PNG image of TOTP key text + MatrixToImageWriter.writeToStream(matrix, "PNG", stream); + + } + catch (WriterException e) { + throw new IllegalArgumentException("QR code could not be " + + "generated for TOTP key.", e); + } + catch (IOException e) { + throw new IllegalStateException("Image stream of QR code could " + + "not be written.", e); + } + + // Return data URI for generated image + return "data:image/png;base64," + + BaseEncoding.base64().encode(stream.toByteArray()); + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/CodeUsageTrackingService.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/CodeUsageTrackingService.java new file mode 100644 index 0000000..c9a94b4 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/CodeUsageTrackingService.java @@ -0,0 +1,264 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.user; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.totp.conf.ConfigurationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for tracking past valid uses of TOTP codes. An internal thread + * periodically walks through records of past codes, removing records which + * should be invalid by their own nature (no longer matching codes generated by + * the secret key). + */ +@Singleton +public class CodeUsageTrackingService { + + /** + * The number of periods during which a previously-used code should remain + * unusable. Once this period has elapsed, the code can be reused again if + * it is otherwise valid. + */ + private static final int INVALID_INTERVAL = 2; + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(CodeUsageTrackingService.class); + + /** + * Executor service which runs the cleanup task. + */ + private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + + /** + * Service for retrieving configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Map of previously-used codes to the timestamp after which the code can + * be used again, providing the TOTP key legitimately generates that code. + */ + private final ConcurrentMap invalidCodes = + new ConcurrentHashMap(); + + /** + * Creates a new CodeUsageTrackingService which tracks past valid uses of + * TOTP codes on a per-user basis. + */ + public CodeUsageTrackingService() { + executor.scheduleAtFixedRate(new CodeEvictionTask(), 1, 1, TimeUnit.MINUTES); + } + + /** + * Task which iterates through all explicitly-invalidated codes, evicting + * those codes which are old enough that they would fail validation against + * the secret key anyway. + */ + private class CodeEvictionTask implements Runnable { + + @Override + public void run() { + + // Get start time of cleanup check + long checkStart = System.currentTimeMillis(); + + // For each code still being tracked, remove those which are old + // enough that they would fail validation against the secret key + Iterator> entries = invalidCodes.entrySet().iterator(); + while (entries.hasNext()) { + + Map.Entry entry = entries.next(); + long invalidUntil = entry.getValue(); + + // If code is sufficiently old, evict it and check the next one + if (checkStart >= invalidUntil) + entries.remove(); + + } + + // Log completion and duration + logger.debug("TOTP tracking cleanup check completed in {} ms.", + System.currentTimeMillis() - checkStart); + + } + + } + + /** + * A valid TOTP code which was previously used by a particular user. + */ + private class UsedCode { + + /** + * The username of the user which previously used this code. + */ + private final String username; + + /** + * The valid code given by the user. + */ + private final String code; + + /** + * Creates a new UsedCode which records the given code as having been + * used by the given user. + * + * @param username + * The username of the user which previously used the given code. + * + * @param code + * The valid code given by the user. + */ + public UsedCode(String username, String code) { + this.username = username; + this.code = code; + } + + /** + * Returns the username of the user which previously used the code + * associated with this UsedCode. + * + * @return + * The username of the user which previously used this code. + */ + public String getUsername() { + return username; + } + + /** + * Returns the valid code given by the user when this UsedCode was + * created. + * + * @return + * The valid code given by the user. + */ + public String getCode() { + return code; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 79 * hash + this.username.hashCode(); + hash = 79 * hash + this.code.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) + return true; + + if (obj == null) + return false; + + if (getClass() != obj.getClass()) + return false; + + final UsedCode other = (UsedCode) obj; + return username.equals(other.username) && code.equals(other.code); + + } + + } + + /** + * Attempts to mark the given code as used. The code MUST have already been + * validated against the user's secret key, as this function only verifies + * whether the code has been previously used, not whether it is actually + * valid. If the code has not previously been used, the code is stored as + * having been used by the given user at the current time. + * + * @param username + * The username of the user who has attempted to use the given valid + * code. + * + * @param code + * The otherwise-valid code given by the user. + * + * @return + * true if the code has not previously been used by the given user and + * has now been marked as previously used, false otherwise. + * + * @throws GuacamoleException + * If configuration information necessary to determine the length of + * time a code should be marked as invalid cannot be read from + * guacamole.properties. + */ + public boolean useCode(String username, String code) + throws GuacamoleException { + + // Repeatedly attempt to use the given code until an explicit success + // or failure has occurred + UsedCode usedCode = new UsedCode(username, code); + for (;;) { + + // Explicitly invalidate each used code for two periods after its + // first successful use + long current = System.currentTimeMillis(); + long invalidUntil = current + confService.getPeriod() * 1000 * INVALID_INTERVAL; + + // Try to use the given code, marking it as used within the map of + // now-invalidated codes + Long expires = invalidCodes.putIfAbsent(usedCode, invalidUntil); + if (expires == null) + return true; + + // If the code was already used, fail to use the code if + // insufficient time has elapsed since it was last used + // successfully + if (expires > current) + return false; + + + // Otherwise, the code is actually valid - remove the invalidated + // code only if it still has the expected expiration time, and + // retry using the code + invalidCodes.remove(usedCode, expires); + + } + + } + + /** + * Cleans up resources which may be in use by this service in the + * background, such as other threads. This function MUST be invoked during + * webapp shutdown to avoid leaking these resources. + */ + public void shutdown() { + executor.shutdownNow(); + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/TOTPUser.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/TOTPUser.java new file mode 100644 index 0000000..e84b754 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/TOTPUser.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.user; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.form.BooleanField; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.DelegatingUser; +import org.apache.guacamole.net.auth.User; + +/** + * TOTP-specific User implementation which wraps a User from another extension, + * hiding and blocking access to the core attributes used by TOTP. + */ +public class TOTPUser extends DelegatingUser { + + /** + * The name of the user attribute which disables the TOTP requirement + * for that specific user. + */ + public static final String TOTP_KEY_DISABLED_ATTRIBUTE_NAME = "guac-totp-disabled"; + + /** + * The name of the user attribute which stores the TOTP key. + */ + public static final String TOTP_KEY_SECRET_ATTRIBUTE_NAME = "guac-totp-key-secret"; + + /** + * The name of the user attribute defines whether the TOTP key has been + * confirmed by the user, and the user is thus fully enrolled. + */ + public static final String TOTP_KEY_CONFIRMED_ATTRIBUTE_NAME = "guac-totp-key-confirmed"; + + /** + * The name of the user attribute defines whether the TOTP key has been + * generated for the user, regardless of whether that key has been + * confirmed. This attribute is not stored, but is instead exposed + * dynamically in lieu of exposing the actual TOTP key. + */ + public static final String TOTP_KEY_SECRET_GENERATED_ATTRIBUTE_NAME = "guac-totp-key-generated"; + + /** + * The string value used by TOTP user attributes to represent the boolean + * value "true". + */ + public static final String TRUTH_VALUE = "true"; + + /** + * The form which contains all configurable properties for this user. + */ + public static final Form TOTP_ENROLLMENT_STATUS = new Form("totp-enrollment-status", + Arrays.asList( + new BooleanField(TOTP_KEY_DISABLED_ATTRIBUTE_NAME, TRUTH_VALUE), + new BooleanField(TOTP_KEY_SECRET_GENERATED_ATTRIBUTE_NAME, TRUTH_VALUE), + new BooleanField(TOTP_KEY_CONFIRMED_ATTRIBUTE_NAME, TRUTH_VALUE) + ) + ); + + + /** + * Wraps the given User object, hiding and blocking access to the core + * attributes used by TOTP. + * + * @param user + * The User object to wrap. + */ + public TOTPUser(User user) { + super(user); + } + + /** + * Returns the User object wrapped by this TOTPUser. + * + * @return + * The wrapped User object. + */ + public User getUndecorated() { + return getDelegateUser(); + } + + @Override + public Map getAttributes() { + + // Create independent, mutable copy of attributes + Map attributes = new HashMap<>(super.getAttributes()); + + if (!attributes.containsKey(TOTP_KEY_DISABLED_ATTRIBUTE_NAME)) + attributes.put(TOTP_KEY_DISABLED_ATTRIBUTE_NAME, null); + + // Replace secret key with simple boolean attribute representing + // whether a key has been generated at all + String secret = attributes.remove(TOTP_KEY_SECRET_ATTRIBUTE_NAME); + if (secret != null && !secret.isEmpty()) + attributes.put(TOTP_KEY_SECRET_GENERATED_ATTRIBUTE_NAME, TRUTH_VALUE); + + return attributes; + + } + + @Override + public void setAttributes(Map attributes) { + + // Create independent, mutable copy of attributes + attributes = new HashMap<>(attributes); + + // Do not allow TOTP secret to be directly manipulated + attributes.remove(TOTP_KEY_SECRET_ATTRIBUTE_NAME); + + // Reset TOTP status entirely if requested + String generated = attributes.remove(TOTP_KEY_SECRET_GENERATED_ATTRIBUTE_NAME); + if (generated != null && !generated.equals(TRUTH_VALUE)) { + attributes.put(TOTP_KEY_SECRET_ATTRIBUTE_NAME, null); + attributes.put(TOTP_KEY_CONFIRMED_ATTRIBUTE_NAME, null); + } + + super.setAttributes(attributes); + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/TOTPUserContext.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/TOTPUserContext.java new file mode 100644 index 0000000..d3269e7 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/TOTPUserContext.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.user; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.totp.usergroup.TOTPUserGroup; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.DecoratingDirectory; +import org.apache.guacamole.net.auth.DelegatingUserContext; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; + +/** + * TOTP-specific UserContext implementation which wraps the UserContext of + * some other extension, providing (or hiding) additional data. + */ +public class TOTPUserContext extends DelegatingUserContext { + + /** + * Creates a new TOTPUserContext which wraps the given UserContext, + * providing (or hiding) additional TOTP-specific data. + * + * @param userContext + * The UserContext to wrap. + */ + public TOTPUserContext(UserContext userContext) { + super(userContext); + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + return new DecoratingDirectory(super.getUserDirectory()) { + + @Override + protected User decorate(User object) { + return new TOTPUser(object); + } + + @Override + protected User undecorate(User object) { + assert(object instanceof TOTPUser); + return ((TOTPUser) object).getUndecorated(); + } + + }; + } + + @Override + public Directory getUserGroupDirectory() throws GuacamoleException { + return new DecoratingDirectory(super.getUserGroupDirectory()) { + + @Override + protected UserGroup decorate(UserGroup object) { + return new TOTPUserGroup(object); + } + + @Override + protected UserGroup undecorate(UserGroup object) { + assert(object instanceof TOTPUserGroup); + return ((TOTPUserGroup) object).getUndecorated(); + } + + }; + } + + @Override + public Collection getUserAttributes() { + Collection userAttrs = new HashSet<>(super.getUserAttributes()); + userAttrs.add(TOTPUser.TOTP_ENROLLMENT_STATUS); + return Collections.unmodifiableCollection(userAttrs); + } + + @Override + public Collection getUserGroupAttributes() { + Collection userGroupAttrs = new HashSet<>(super.getUserGroupAttributes()); + userGroupAttrs.add(TOTPUserGroup.TOTP_USER_GROUP_CONFIG); + return Collections.unmodifiableCollection(userGroupAttrs); + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/UserTOTPKey.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/UserTOTPKey.java new file mode 100644 index 0000000..d7bc903 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/UserTOTPKey.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.user; + +import java.security.SecureRandom; +import java.util.Random; + +/** + * The key used to generate TOTP codes for a particular user. + */ +public class UserTOTPKey { + + /** + * Secure source of random bytes. + */ + private static final Random RANDOM = new SecureRandom(); + + /** + * The username of the user associated with this key. + */ + private final String username; + + /** + * Whether the associated secret key has been confirmed by the user. A key + * is confirmed once the user has successfully entered a valid TOTP + * derived from that key. + */ + private boolean confirmed; + + /** + * The base32-encoded TOTP key associated with the user. + */ + private byte[] secret; + + /** + * Generates the given number of random bytes. + * + * @param length + * The number of random bytes to generate. + * + * @return + * A new array of exactly the given number of random bytes. + */ + private static byte[] generateBytes(int length) { + byte[] bytes = new byte[length]; + RANDOM.nextBytes(bytes); + return bytes; + } + + /** + * Creates a new, unconfirmed, randomly-generated TOTP key having the given + * length. + * + * @param username + * The username of the user associated with this key. + * + * @param length + * The length of the key to generate, in bytes. + */ + public UserTOTPKey(String username, int length) { + this(username, generateBytes(length), false); + } + + /** + * Creates a new UserTOTPKey containing the given key and having the given + * confirmed state. + * + * @param username + * The username of the user associated with this key. + * + * @param secret + * The raw binary secret key to be used to generate TOTP codes. + * + * @param confirmed + * true if the user associated with the key has confirmed that they can + * successfully generate the corresponding TOTP codes (the user has + * been "enrolled"), false otherwise. + */ + public UserTOTPKey(String username, byte[] secret, boolean confirmed) { + this.username = username; + this.confirmed = confirmed; + this.secret = secret; + } + + /** + * Returns the username of the user associated with this key. + * + * @return + * The username of the user associated with this key. + */ + public String getUsername() { + return username; + } + + /** + * Returns the raw binary secret key to be used to generate TOTP codes. + * + * @return + * The raw binary secret key to be used to generate TOTP codes. + */ + public byte[] getSecret() { + return secret; + } + + /** + * Returns whether the user associated with the key has confirmed that they + * can successfully generate the corresponding TOTP codes (the user has + * been "enrolled"). + * + * @return + * true if the user has confirmed that they can successfully generate + * the TOTP codes generated by this key, false otherwise. + */ + public boolean isConfirmed() { + return confirmed; + } + + /** + * Sets whether the user associated with the key has confirmed that they + * can successfully generate the corresponding TOTP codes (the user has + * been "enrolled"). + * + * @param confirmed + * true if the user has confirmed that they can successfully generate + * the TOTP codes generated by this key, false otherwise. + */ + public void setConfirmed(boolean confirmed) { + this.confirmed = confirmed; + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/UserVerificationService.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/UserVerificationService.java new file mode 100644 index 0000000..3ebd85b --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/user/UserVerificationService.java @@ -0,0 +1,435 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.totp.user; + +import com.google.common.io.BaseEncoding; +import com.google.inject.Inject; +import com.google.inject.Provider; +import inet.ipaddr.IPAddress; +import inet.ipaddr.IPAddressString; +import java.security.InvalidKeyException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.auth.totp.conf.ConfigurationService; +import org.apache.guacamole.auth.totp.form.AuthenticationCodeField; +import org.apache.guacamole.auth.totp.usergroup.TOTPUserGroup; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.language.TranslatableGuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.properties.IPAddressListProperty; +import org.apache.guacamole.totp.TOTPGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for verifying the identity of a user using TOTP. + */ +public class UserVerificationService { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(UserVerificationService.class); + + /** + * BaseEncoding instance which decoded/encodes base32. + */ + private static final BaseEncoding BASE32 = BaseEncoding.base32(); + + /** + * Service for retrieving configuration information. + */ + @Inject + private ConfigurationService confService; + + /** + * Service for tracking whether TOTP codes have been used. + */ + @Inject + private CodeUsageTrackingService codeService; + + /** + * Provider for AuthenticationCodeField instances. + */ + @Inject + private Provider codeFieldProvider; + + /** + * Retrieves and decodes the base32-encoded TOTP key associated with user + * having the given UserContext. If no TOTP key is associated with the user, + * a random key is generated and associated with the user. If the extension + * storing the user does not support storage of the TOTP key, null is + * returned. + * + * @param context + * The UserContext of the user whose TOTP key should be retrieved. + * + * @param username + * The username of the user associated with the given UserContext. + * + * @return + * The TOTP key associated with the user having the given UserContext, + * or null if the extension storing the user does not support storage + * of the TOTP key. + * + * @throws GuacamoleException + * If a new key is generated, but the extension storing the associated + * user fails while updating the user account. + */ + private UserTOTPKey getKey(UserContext context, + String username) throws GuacamoleException { + + // Retrieve attributes from current user + User self = context.self(); + Map attributes = context.self().getAttributes(); + + // If no key is defined, attempt to generate a new key + String secret = attributes.get(TOTPUser.TOTP_KEY_SECRET_ATTRIBUTE_NAME); + + if (secret == null || secret.isEmpty()) + return generateKey(context, username); + + // Parse retrieved base32 key value + byte[] key; + try { + key = BASE32.decode(secret); + } + + // If key is not valid base32, warn but otherwise pretend the key does + // not exist + catch (IllegalArgumentException e) { + logger.warn("TOTP key of user \"{}\" is not valid base32.", self.getIdentifier()); + logger.debug("TOTP key is not valid base32.", e); + return null; + } + + // Otherwise, parse value from attributes + boolean confirmed = "true".equals(attributes.get(TOTPUser.TOTP_KEY_CONFIRMED_ATTRIBUTE_NAME)); + return new UserTOTPKey(username, key, confirmed); + + } + + /** + * Generate and set a new key for the specified user and context, returning + * the key if the set successfully or null if it fails. + * + * @param context + * The UserContext of the user whose TOTP key should be generated and set. + * + * @param username + * The username of the user associated with the given UserContext. + * + * @return + * The generated and set key, or null if the operation failed. + * + * @throws GuacamoleException + * If a new key is generated, but the extension storing the associated + * user fails while updating the user account, or if the configuration + * cannot be retrieved. + */ + private UserTOTPKey generateKey(UserContext context, String username) + throws GuacamoleException { + + // Generate random key for user + TOTPGenerator.Mode mode = confService.getMode(); + UserTOTPKey generated = new UserTOTPKey(username,mode.getRecommendedKeyLength()); + if (setKey(context, generated)) + return generated; + + // Fail if key cannot be set + return null; + + } + + /** + * Attempts to store the given TOTP key within the user account of the user + * having the given UserContext. As not all extensions will support storage + * of arbitrary attributes, this operation may fail. + * + * @param context + * The UserContext associated with the user whose TOTP key is to be + * stored. + * + * @param key + * The TOTP key to store. + * + * @return + * true if the TOTP key was successfully stored, false if the extension + * handling storage does not support storage of the key. + * + * @throws GuacamoleException + * If the extension handling storage fails internally while attempting + * to update the user. + */ + private boolean setKey(UserContext context, UserTOTPKey key) + throws GuacamoleException { + + // Get mutable set of attributes + User self = context.self(); + Map attributes = new HashMap<>(); + + // Set/overwrite current TOTP key state + attributes.put(TOTPUser.TOTP_KEY_SECRET_ATTRIBUTE_NAME, BASE32.encode(key.getSecret())); + attributes.put(TOTPUser.TOTP_KEY_CONFIRMED_ATTRIBUTE_NAME, key.isConfirmed() ? "true" : "false"); + self.setAttributes(attributes); + + // Confirm that attributes have actually been set + Map setAttributes = self.getAttributes(); + if (!setAttributes.containsKey(TOTPUser.TOTP_KEY_SECRET_ATTRIBUTE_NAME) + || !setAttributes.containsKey(TOTPUser.TOTP_KEY_CONFIRMED_ATTRIBUTE_NAME)) + return false; + + // Update user object + try { + context.getPrivileged().getUserDirectory().update(self); + } + catch (GuacamoleSecurityException e) { + logger.info("User \"{}\" cannot store their TOTP key as they " + + "lack permission to update their own account and the " + + "TOTP extension was unable to obtain privileged access. " + + "TOTP will be disabled for this user.", + self.getIdentifier()); + logger.debug("Permission denied to set TOTP key of user " + + "account.", e); + return false; + } + catch (GuacamoleUnsupportedException e) { + logger.debug("Extension storage for user is explicitly read-only. " + + "Cannot update attributes to store TOTP key.", e); + return false; + } + + // TOTP key successfully stored/updated + return true; + + } + + /** + * Checks the user in question, via both UserContext and AuthenticatedUser, + * to see if TOTP has been disabled for this user, either directly or via + * membership in a group that has had TOTP marked as disabled. + * + * @param context + * The UserContext for the user being verified. + * + * @param authenticatedUser + * The AuthenticatedUser for the user being verified. + * + * @return + * True if TOTP access has been disabled for the user, otherwise + * false. + * + * @throws GuacamoleException + * If the extension handling storage fails internally while attempting + * to update the user. + */ + private boolean totpDisabled(UserContext context, + AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + // If TOTP is disabled for this user, return, allowing login to continue + Map myAttributes = context.self().getAttributes(); + if (myAttributes != null + && TOTPUser.TRUTH_VALUE.equals(myAttributes.get(TOTPUser.TOTP_KEY_DISABLED_ATTRIBUTE_NAME))) { + + logger.warn("TOTP validation has been disabled for user \"{}\"", + context.self().getIdentifier()); + return true; + + } + + // Check if any effective user groups have TOTP marked as disabled + Set userGroups = authenticatedUser.getEffectiveUserGroups(); + Directory directoryGroups = context.getPrivileged().getUserGroupDirectory(); + for (String userGroup : userGroups) { + UserGroup thisGroup = directoryGroups.get(userGroup); + if (thisGroup == null) + continue; + + Map grpAttributes = thisGroup.getAttributes(); + if (grpAttributes != null + && TOTPUserGroup.TRUTH_VALUE.equals(grpAttributes.get(TOTPUserGroup.TOTP_KEY_DISABLED_ATTRIBUTE_NAME))) { + + logger.warn("TOTP validation will be bypassed for user \"{}\"" + + " because it has been disabled for group \"{}\"", + context.self().getIdentifier(), userGroup); + return true; + + } + } + + // TOTP has not been disabled + return false; + + } + + /** + * Verifies the identity of the given user using TOTP. If a authentication + * code from the user's TOTP device has not already been provided, a code is + * requested in the form of additional expected credentials. Any provided + * code is cryptographically verified. If no code is present, or the + * received code is invalid, an exception is thrown. + * + * @param context + * The UserContext provided for the user by another authentication + * extension. + * + * @param authenticatedUser + * The user whose identity should be verified using TOTP. + * + * @throws GuacamoleException + * If required TOTP-specific configuration options are missing or + * malformed, or if the user's identity cannot be verified. + */ + public void verifyIdentity(UserContext context, + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Pull the original HTTP request used to authenticate + Credentials credentials = authenticatedUser.getCredentials(); + + // Get the current client address + IPAddress clientAddr = new IPAddressString(credentials.getRemoteAddress()).getAddress(); + + // Ignore anonymous users + if (authenticatedUser.getIdentifier().equals(AuthenticatedUser.ANONYMOUS_IDENTIFIER)) + return; + + // Pull address lists to check from configuration. Note that the enforce + // list will override the bypass list, which means that, if the client + // address happens to be in both lists, Duo MFA will be enforced. + List bypassAddresses = confService.getBypassHosts(); + List enforceAddresses = confService.getEnforceHosts(); + + // Check the bypass list for the client address, and set the enforce + // flag to the opposite. + boolean enforceHost = !(IPAddressListProperty.addressListContains(bypassAddresses, clientAddr)); + + // Only continue processing if the list is not empty + if (!enforceAddresses.isEmpty()) { + + // If client address is not available or invalid, MFA will + // be enforced. + if (clientAddr == null || !clientAddr.isIPAddress()) + enforceHost = true; + + // Check the enforce list and set the flag if the client address + // is found in the list. + else + enforceHost = IPAddressListProperty.addressListContains(enforceAddresses, clientAddr); + } + + // If the enforce flag is not true, bypass TOTP MFA. + if (!enforceHost) + return; + + // Ignore anonymous users + String username = authenticatedUser.getIdentifier(); + if (username.equals(AuthenticatedUser.ANONYMOUS_IDENTIFIER)) + return; + + // Check if TOTP has been disabled for this user + if (totpDisabled(context, authenticatedUser)) + return; + + // Ignore users which do not have an associated key + UserTOTPKey key = getKey(context, username); + if (key == null) + return; + + // Retrieve TOTP from request + String code = credentials.getParameter(AuthenticationCodeField.PARAMETER_NAME); + + // If no TOTP provided, request one + if (code == null) { + + AuthenticationCodeField field = codeFieldProvider.get(); + + // If the user hasn't completed enrollment, request that they do + if (!key.isConfirmed()) { + + // If the key has not yet been confirmed, generate a new one. + key = generateKey(context, username); + + field.exposeKey(key); + throw new TranslatableGuacamoleInsufficientCredentialsException( + "TOTP enrollment must be completed before " + + "authentication can continue", + "TOTP.INFO_ENROLL_REQUIRED", new CredentialsInfo( + Collections.singletonList(field) + )); + } + + // Otherwise simply request the user's authentication code + throw new TranslatableGuacamoleInsufficientCredentialsException( + "A TOTP authentication code is required before login can " + + "continue", "TOTP.INFO_CODE_REQUIRED", new CredentialsInfo( + Collections.singletonList(field) + )); + + } + + try { + + // Get generator based on user's key and provided configuration + TOTPGenerator totp = new TOTPGenerator(key.getSecret(), + confService.getMode(), confService.getDigits(), + TOTPGenerator.DEFAULT_START_TIME, confService.getPeriod()); + + // Verify provided TOTP against value produced by generator + if ((code.equals(totp.generate()) || code.equals(totp.previous())) + && codeService.useCode(username, code)) { + + // Record key as confirmed, if it hasn't already been so recorded + if (!key.isConfirmed()) { + key.setConfirmed(true); + setKey(context, key); + } + + // User has been verified + return; + + } + + } + catch (InvalidKeyException e) { + logger.warn("User \"{}\" is associated with an invalid TOTP key.", username); + logger.debug("TOTP key is not valid.", e); + } + + // Provided code is not valid + throw new TranslatableGuacamoleClientException("Provided TOTP code " + + "is not valid.", "TOTP.INFO_VERIFICATION_FAILED"); + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/usergroup/TOTPUserGroup.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/usergroup/TOTPUserGroup.java new file mode 100644 index 0000000..5b6921b --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/usergroup/TOTPUserGroup.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.auth.totp.usergroup; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.form.BooleanField; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.DelegatingUserGroup; +import org.apache.guacamole.net.auth.UserGroup; + +/** + * A UserGroup that wraps another UserGroup implementation, decorating it with + * attributes that control TOTP configuration for users that are members of that + * group. + */ +public class TOTPUserGroup extends DelegatingUserGroup { + + /** + * The attribute associated with a group that disables the TOTP requirement + * for any users that are a member of that group, or are members of any + * groups that are members of this group. + */ + public static final String TOTP_KEY_DISABLED_ATTRIBUTE_NAME = "guac-totp-disabled"; + + /** + * The string value used by TOTP user attributes to represent the boolean + * value "true". + */ + public static final String TRUTH_VALUE = "true"; + + /** + * The form that contains fields for configuring TOTP for members of this + * group. + */ + public static final Form TOTP_USER_GROUP_CONFIG = new Form("totp-user-group-config", + Arrays.asList( + new BooleanField(TOTP_KEY_DISABLED_ATTRIBUTE_NAME, TRUTH_VALUE) + ) + ); + + /** + * Create a new instance of this user group implementation, wrapping the + * provided UserGroup. + * + * @param userGroup + * The UserGroup to be wrapped. + */ + public TOTPUserGroup(UserGroup userGroup) { + super(userGroup); + } + + /** + * Return the original UserGroup that this implementation is wrapping. + * + * @return + * The original UserGroup that this implementation wraps. + */ + public UserGroup getUndecorated() { + return getDelegateUserGroupGroup(); + } + + /** + * Returns whether or not TOTP has been disabled for members of this group. + * + * @return + * True if TOTP has been disabled for members of this group, otherwise + * false. + */ + public boolean totpDisabled() { + return (TRUTH_VALUE.equals(getAttributes().get(TOTP_KEY_DISABLED_ATTRIBUTE_NAME))); + } + + @Override + public Map getAttributes() { + + // Create a mutable copy of the attributes + Map attributes = new HashMap<>(super.getAttributes()); + + if (!attributes.containsKey(TOTP_KEY_DISABLED_ATTRIBUTE_NAME)) + attributes.put(TOTP_KEY_DISABLED_ATTRIBUTE_NAME, null); + + return attributes; + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/totp/TOTPGenerator.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/totp/TOTPGenerator.java new file mode 100644 index 0000000..a35dde9 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/totp/TOTPGenerator.java @@ -0,0 +1,459 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.totp; + +import com.google.common.primitives.Longs; +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/* + * NOTE: This TOTP implementation is based on the TOTP reference implementation + * provided by the IETF Trust at: + * + * https://tools.ietf.org/id/draft-mraihi-totp-timebased-07.html#Section-Reference-Impl + */ + +/* + * Copyright (c) 2011 IETF Trust and the persons identified as authors + * of the code. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Internet Society, IETF or IETF Trust, nor the names + * of specific contributors, may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Generator which uses the TOTP algorithm to generate authentication codes. + */ +public class TOTPGenerator { + + /** + * The default time to use as the basis for comparison when transforming + * provided TOTP timestamps into counter values required for HOTP, in + * seconds since midnight, 1970-01-01, UTC (UNIX epoch). + */ + public static final long DEFAULT_START_TIME = 0; + + /** + * The default frequency at which new TOTP codes should be generated (and + * old codes invalidated), in seconds. + */ + public static final long DEFAULT_TIME_STEP = 30; + + /** + * The TOTP generation mode. The mode dictates the hash function which + * should be used to generate authentication codes, as well as the required + * key size. + */ + private final Mode mode; + + /** + * The shared key to use to generate authentication codes. The size + * required for this key depends on the generation mode. + */ + private final Key key; + + /** + * The length of codes to generate, in digits. + */ + private final int length; + + /** + * The base time against which the timestamp specified for each TOTP + * should be compared to produce the corresponding HOTP counter value, in + * seconds since midnight, 1970-01-01, UTC (UNIX epoch). This is the value + * value referred to as "T0" in the TOTP specification. + */ + private final long startTime; + + /** + * The frequency that new TOTP codes should be generated and invalidated, + * in seconds. This is the value referred to as "X" in the TOTP + * specification. + */ + private final long timeStep; + + /** + * The operating mode for TOTP, defining the hash algorithm to be used. + */ + public enum Mode { + + /** + * TOTP mode which generates hashes using SHA1. TOTP in SHA1 mode + * requires 160-bit keys. + */ + @PropertyValue("sha1") + SHA1("HmacSHA1", 20), + + /** + * TOTP mode which generates hashes using SHA256. TOTP in SHA256 mode + * requires 256-bit keys. + */ + @PropertyValue("sha256") + SHA256("HmacSHA256", 32), + + /** + * TOTP mode which generates hashes using SHA512. TOTP in SHA512 mode + * requires 512-bit keys. + */ + @PropertyValue("sha512") + SHA512("HmacSHA512", 64); + + /** + * The name of the HMAC algorithm which the TOTP implementation should + * use when operating in this mode, in the format required by + * Mac.getInstance(). + */ + private final String algorithmName; + + /** + * The recommended length of keys generated for TOTP in this mode, in + * bytes. Keys are recommended to be the same length as the hash + * involved. + */ + private final int recommendedKeyLength; + + /** + * Creates a new TOTP operating mode which is associated with the + * given HMAC algorithm. + * + * @param algorithmName + * The name of the HMAC algorithm which the TOTP implementation + * should use when operating in this mode, in the format required + * by Mac.getInstance(). + * + * @param recommendedKeyLength + * The recommended length of keys generated for TOTP in this mode, + * in bytes. + */ + private Mode(String algorithmName, int recommendedKeyLength) { + this.algorithmName = algorithmName; + this.recommendedKeyLength = recommendedKeyLength; + } + + /** + * Returns the name of the HMAC algorithm which the TOTP implementation + * should use when operating in this mode. The name returned will be + * in the format required by Mac.getInstance(). + * + * @return + * The name of the HMAC algorithm which the TOTP implementation + * should use. + */ + public String getAlgorithmName() { + return algorithmName; + } + + /** + * Returns the recommended length of keys generated for TOTP in this + * mode, in bytes. Keys are recommended to be the same length as the + * hash involved. + * + * @return + * The recommended length of keys generated for TOTP in this mode, + * in bytes. + */ + public int getRecommendedKeyLength() { + return recommendedKeyLength; + } + + } + + /** + * Creates a new TOTP generator which uses the given shared key to generate + * authentication codes. The provided generation mode dictates the size of + * the key required, while the given start time and time step dictate how + * timestamps provided for code generation are converted to the counter + * value used by HOTP (the algorithm which forms the basis of TOTP). + * + * @param key + * The shared key to use to generate authentication codes. + * + * @param mode + * The mode in which the TOTP algorithm should operate. + * + * @param length + * The length of the codes to generate, in digits. As required + * by the specification, this value MUST be at least 6 but no greater + * than 8. + * + * @param startTime + * The base time against which the timestamp specified for each TOTP + * should be compared to produce the corresponding HOTP counter value, + * in seconds since midnight, 1970-01-01, UTC (UNIX epoch). This is the + * value referred to as "T0" in the TOTP specification. + * + * @param timeStep + * The frequency that new TOTP codes should be generated and + * invalidated, in seconds. This is the value referred to as "X" in the + * TOTP specification. + * + * @throws InvalidKeyException + * If the provided key is invalid for the requested TOTP mode. + */ + public TOTPGenerator(byte[] key, Mode mode, int length, long startTime, + long timeStep) throws InvalidKeyException { + + // Validate length is within spec + if (length < 6 || length > 8) + throw new IllegalArgumentException("TOTP codes must be at least 6 " + + "digits and no more than 8 digits."); + + this.key = new SecretKeySpec(key, "RAW"); + this.mode = mode; + this.length = length; + this.startTime = startTime; + this.timeStep = timeStep; + + // Verify key validity + getMacInstance(this.mode, this.key); + + } + + /** + * Creates a new TOTP generator which uses the given shared key to generate + * authentication codes. The provided generation mode dictates the size of + * the key required. The start time and time step used to produce the + * counter value used by HOTP (the algorithm which forms the basis of TOTP) + * are set to the default values recommended by the TOTP specification (0 + * and 30 respectively). + * + * @param key + * The shared key to use to generate authentication codes. + * + * @param mode + * The mode in which the TOTP algorithm should operate. + * + * @param length + * The length of the codes to generate, in digits. As required + * by the specification, this value MUST be at least 6 but no greater + * than 8. + * + * @throws InvalidKeyException + * If the provided key is invalid for the requested TOTP mode. + */ + public TOTPGenerator(byte[] key, Mode mode, int length) + throws InvalidKeyException { + this(key, mode, length, DEFAULT_START_TIME, DEFAULT_TIME_STEP); + } + + /** + * Returns a new Mac instance which produces message authentication codes + * using the given secret key and the algorithm required by the given TOTP + * mode. + * + * @param mode + * The TOTP mode which dictates the HMAC algorithm to be used. + * + * @param key + * The secret key to use to produce message authentication codes. + * + * @return + * A new Mac instance which produces message authentication codes + * using the given secret key and the algorithm required by the given + * TOTP mode. + * + * @throws InvalidKeyException + * If the provided key is invalid for the requested TOTP mode. + */ + private static Mac getMacInstance(Mode mode, Key key) + throws InvalidKeyException { + + try { + Mac hmac = Mac.getInstance(mode.getAlgorithmName()); + hmac.init(key); + return hmac; + } + catch (NoSuchAlgorithmException e) { + throw new UnsupportedOperationException("Support for the HMAC " + + "algorithm required for TOTP in " + mode + " mode is " + + "missing.", e); + } + + } + + /** + * Calculates the HMAC for the given message using the key and algorithm + * provided when this TOTPGenerator was created. + * + * @param message + * The message to calculate the HMAC of. + * + * @return + * The HMAC of the given message. + */ + private byte[] getHMAC(byte[] message) { + + try { + return getMacInstance(mode, key).doFinal(message); + } + catch (InvalidKeyException e) { + + // As the key is verified during construction of the TOTPGenerator, + // this should never happen + throw new IllegalStateException("Provided key became invalid after " + + "passing validation.", e); + + } + + } + + /** + * Given an arbitrary integer value, returns a code containing the decimal + * representation of that value and exactly the given number of digits. If + * the given value has more than the desired number of digits, leading + * digits will be truncated to reduce the length. If the given value has + * fewer than the desired number of digits, leading zeroes will be added to + * increase the length. + * + * @param value + * The value to convert into a decimal code of the given length. + * + * @param length + * The number of digits to include in the code. + * + * @return + * A code containing the decimal value of the given integer, truncated + * or padded such that exactly the given number of digits are present. + */ + private String toCode(int value, int length) { + + // Convert value to simple integer string + String valueString = Integer.toString(value); + + // If the resulting string is too long, truncate to the last N digits + if (valueString.length() > length) + return valueString.substring(valueString.length() - length); + + // Otherwise, add zeroes until the desired length is reached + StringBuilder builder = new StringBuilder(length); + for (int i = valueString.length(); i < length; i++) + builder.append('0'); + + // Return the padded integer string + builder.append(valueString); + return builder.toString(); + + } + + /** + * Generates a TOTP code of the given length using the given absolute + * timestamp rather than the current system time. + * + * @param time + * The absolute timestamp to use to generate the TOTP code, in seconds + * since midnight, 1970-01-01, UTC (UNIX epoch). + * + * @return + * The TOTP code which corresponds to the given timestamp, having + * exactly the given length. + * + * @throws IllegalArgumentException + * If the given length is invalid as defined by the TOTP specification. + */ + public String generate(long time) { + + // Calculate HOTP counter value based on provided time + long counter = (time - startTime) / timeStep; + byte[] hash = getHMAC(Longs.toByteArray(counter)); + + // Calculate HOTP value as defined by section 5.2 of RFC 4226: + // https://tools.ietf.org/html/rfc4226#section-5.2 + int offset = hash[hash.length - 1] & 0xF; + int binary + = ((hash[offset] & 0x7F) << 24) + | ((hash[offset + 1] & 0xFF) << 16) + | ((hash[offset + 2] & 0xFF) << 8) + | (hash[offset + 3] & 0xFF); + + // Truncate or pad the value accordingly + return toCode(binary, length); + + } + + /** + * Generates a TOTP code of the given length using the current system time. + * + * @return + * The TOTP code which corresponds to the current system time, having + * exactly the given length. + * + * @throws IllegalArgumentException + * If the given length is invalid as defined by the TOTP specification. + */ + public String generate() { + return generate(System.currentTimeMillis() / 1000); + } + + /** + * Returns the TOTP code which would have been generated immediately prior + * to the code returned by invoking generate() with the given timestamp. + * + * @param time + * The absolute timestamp to use to generate the TOTP code, in seconds + * since midnight, 1970-01-01, UTC (UNIX epoch). + * + * @return + * The TOTP code which would have been generated immediately prior to + * the code returned by invoking generate() with the given timestamp. + */ + public String previous(long time) { + return generate(Math.max(startTime, time - timeStep)); + } + + /** + * Returns the TOTP code which would have been generated immediately prior + * to the code currently being returned by generate(). + * + * @return + * The TOTP code which would have been generated immediately prior to + * the code currently being returned by generate(). + */ + public String previous() { + return previous(System.currentTimeMillis() / 1000); + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/config/totpConfig.js b/extensions/guacamole-auth-totp/src/main/resources/config/totpConfig.js new file mode 100644 index 0000000..54bb56c --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/config/totpConfig.js @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Config block which registers TOTP-specific field types. + */ +angular.module('guacTOTP').config(['formServiceProvider', + function guacTOTPConfig(formServiceProvider) { + + // Define field for the TOTP code provided by the user + formServiceProvider.registerFieldType('GUAC_TOTP_CODE', { + module : 'guacTOTP', + controller : 'authenticationCodeFieldController', + templateUrl : 'app/ext/totp/templates/authenticationCodeField.html' + }); + +}]); diff --git a/extensions/guacamole-auth-totp/src/main/resources/controllers/authenticationCodeFieldController.js b/extensions/guacamole-auth-totp/src/main/resources/controllers/authenticationCodeFieldController.js new file mode 100644 index 0000000..8f19c9f --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/controllers/authenticationCodeFieldController.js @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Controller for the "GUAC_TOTP_CODE" field which prompts the user to enter + * the code generated by their authentication device. + */ +angular.module('guacTOTP').controller('authenticationCodeFieldController', ['$scope', '$window', + function authenticationCodeFieldController($scope, $window) { + + /** + * The secret key split into groups of at most four characters each, or + * null if the secret key is not exposed. + * + * @type String[] + */ + $scope.groupedSecret = $scope.field.secret && $scope.field.secret.match(/.{1,4}/g); + + /** + * Whether the raw details of the secret key and TOTP configuration should + * be shown. By default, such details are hidden. If the secret key is not + * exposed, this property has no effect. + */ + $scope.detailsShown = false; + + /** + * Shows the raw details of the secret key and TOTP configuration. If the + * secret key is not exposed, or the details are already shown, this + * function has no effect. + */ + $scope.showDetails = function showDetails() { + $scope.detailsShown = true; + }; + + /** + * Hides the raw details of the secret key and TOTP configuration. If the + * details are already hidden, this function has no effect. + */ + $scope.hideDetails = function hideDetails() { + $scope.detailsShown = false; + }; + + /** + * Attempts to open the "otpauth" URI containing the user's TOTP key, + * invoking whichever application may be installed locally for handling + * multi-factor authentication. + */ + $scope.openKeyURI = function openKeyURI() { + $window.open($scope.field.keyUri); + }; + +}]); diff --git a/extensions/guacamole-auth-totp/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-totp/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..8c145c4 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/guac-manifest.json @@ -0,0 +1,37 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "TOTP TFA Authentication Backend", + "namespace" : "totp", + + "authProviders" : [ + "org.apache.guacamole.auth.totp.TOTPAuthenticationProvider" + ], + + "translations" : [ + "translations/ca.json", + "translations/de.json", + "translations/en.json", + "translations/fr.json", + "translations/ja.json", + "translations/ko.json", + "translations/pl.json", + "translations/pt.json", + "translations/ru.json", + "translations/zh.json" + ], + + "js" : [ + "totp.min.js" + ], + + "css" : [ + "totp.min.css" + ], + + "resources" : { + "templates/authenticationCodeField.html" : "text/html" + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/license.txt b/extensions/guacamole-auth-totp/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-auth-totp/src/main/resources/styles/totp.css b/extensions/guacamole-auth-totp/src/main/resources/styles/totp.css new file mode 100644 index 0000000..c8a2505 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/styles/totp.css @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.totp-enroll p, .totp-details { + font-size: 0.8em; +} + +.totp-qr-code { + text-align: center; +} + +.totp-qr-code img { + margin: 1em; + border: 1px solid rgba(0,0,0,0.25); + box-shadow: 1px 1px 2px rgba(0,0,0,0.25); + cursor: pointer; +} + +h3.totp-details-header { + font-size: 0.8em; +} + +h3.totp-details-header::before { + content: '▸ '; +} + +.totp-details-visible h3.totp-details-header::before { + content: '▾ '; +} + +.totp-details, +.totp-hide-details { + display: none; +} + +.totp-details-visible .totp-details { + display: table; +} + +.totp-details-visible .totp-hide-details { + display: inline; +} + +.totp-details-visible .totp-show-details { + display: none; +} + +.totp-hide-details, .totp-show-details { + color: blue; + text-decoration: underline; + cursor: pointer; + margin: 0 0.25em; + font-weight: normal; +} + +.totp-details { + margin: 0 auto; +} + +.totp-details th { + padding-right: 0.25em; + text-align: left; +} + +.totp-details td { + font-family: monospace; +} + +.totp-detail { + display: inline-block; + margin: 0 0.25em; +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/templates/authenticationCodeField.html b/extensions/guacamole-auth-totp/src/main/resources/templates/authenticationCodeField.html new file mode 100644 index 0000000..7d9fc7a --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/templates/authenticationCodeField.html @@ -0,0 +1,48 @@ +
    + + +
    + +

    + + +
    +

    + {{'TOTP.SECTION_HEADER_DETAILS' | translate}} + {{'TOTP.ACTION_SHOW_DETAILS' | translate}} + {{'TOTP.ACTION_HIDE_DETAILS' | translate}} +

    + + + + + + + + + + + + + + + + + +
    {{'TOTP.FIELD_HEADER_SECRET_KEY' | translate}}{{ group }}
    {{'TOTP.FIELD_HEADER_DIGITS' | translate}}{{ field.digits }}
    {{'TOTP.FIELD_HEADER_ALGORITHM' | translate}}{{ field.mode }}
    {{'TOTP.FIELD_HEADER_INTERVAL' | translate}}{{ field.period }}
    + +

    + +
    + + +
    + +
    + +
    diff --git a/extensions/guacamole-auth-totp/src/main/resources/totpModule.js b/extensions/guacamole-auth-totp/src/main/resources/totpModule.js new file mode 100644 index 0000000..c6a0c7e --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/totpModule.js @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module which provides handling for TOTP multi-factor authentication. + */ +angular.module('guacTOTP', [ + 'form' +]); + +// Ensure the guacTOTP module is loaded along with the rest of the app +angular.module('index').requires.push('guacTOTP'); diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/ca.json b/extensions/guacamole-auth-totp/src/main/resources/translations/ca.json new file mode 100644 index 0000000..c9f4932 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/ca.json @@ -0,0 +1,34 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Amaga", + "ACTION_SHOW_DETAILS" : "Mostra", + + "FIELD_HEADER_ALGORITHM" : "Algoritme:", + "FIELD_HEADER_DIGITS" : "Digits:", + "FIELD_HEADER_INTERVAL" : "Interval:", + "FIELD_HEADER_SECRET_KEY" : "Clau secreta:", + + "FIELD_PLACEHOLDER_CODE" : "Codi d'autenticació", + + "INFO_CODE_REQUIRED" : "Introduïu el vostre codi d'autenticació per verificar la vostra identitat.", + "INFO_ENROLL_REQUIRED" : "S'ha activat l'autenticació multi-factor al vostre compte.", + "INFO_VERIFICATION_FAILED" : "Ha fallat la verificació. Torna-ho a provar.", + + "HELP_ENROLL_BARCODE" : "Per completar el procés d'inscripció, busqueu el codi de barres següent amb l'aplicació d'autenticació de dos factors al vostre telèfon o dispositiu.", + "HELP_ENROLL_VERIFY" : "Després d'escanejar el codi de barres, introduïu el codi d'autentificació de {DIGITS} que apareix per comprovar que la inscripció ha tingut èxit.", + + "SECTION_HEADER_DETAILS" : "Detalls:" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/de.json b/extensions/guacamole-auth-totp/src/main/resources/translations/de.json new file mode 100644 index 0000000..56536d7 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/de.json @@ -0,0 +1,52 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Details ausblenden", + "ACTION_SHOW_DETAILS" : "Details anzeigen", + + "FIELD_HEADER_ALGORITHM" : "Algorithmus:", + "FIELD_HEADER_DIGITS" : "Anzahl Zeichen:", + "FIELD_HEADER_INTERVAL" : "Intervall:", + "FIELD_HEADER_SECRET_KEY" : "Privater Schlüssel:", + + "FIELD_PLACEHOLDER_CODE" : "Authentifizierungs-Code", + + "INFO_CODE_REQUIRED" : "Bitte geben Sie Ihren Authentifizierungs-Code ein, um Ihre Identität zu bestätigen.", + "INFO_ENROLL_REQUIRED" : "Die Zweifaktor-Authentifizierung wurde für Ihren Account aktiviert.", + "INFO_VERIFICATION_FAILED" : "Verifikation fehlgeschlagen. Bitte nochmals versuchen.", + + "HELP_ENROLL_BARCODE" : "Bitte scannen Sie den Barcode mittels einer Zweifaktor-Authentifizierungs-App auf Ihrem Smartphone oder einem anderen Gerät, um den Prozess fortzusetzen.", + "HELP_ENROLL_VERIFY" : "Nach dem Scannen des Barcodes wird Ihnen ein {DIGITS}-stelliger Authentifizierungscode angezeigt. Bitte geben Sie diesen Code ein um die Aktivierung des Zweifaktor-Verfahrens abzuschliessen.", + + "SECTION_HEADER_DETAILS" : "Details:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "TOTP deaktivieren:", + "FIELD_HEADER_GUAC_TOTP_KEY_GENERATED" : "Geheimer Schlüssel erstellt:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "Authentifizierungs-Gerät bestätigt:", + + "SECTION_HEADER_TOTP_ENROLLMENT_STATUS" : "TOTP Ausroll-Status" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "TOTP deaktivieren:", + + "SECTION_HEADER_TOTP_USER_GROUP_CONFIG" : "TOTP Konfiguration" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/en.json b/extensions/guacamole-auth-totp/src/main/resources/translations/en.json new file mode 100644 index 0000000..e9f4b71 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/en.json @@ -0,0 +1,52 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Hide", + "ACTION_SHOW_DETAILS" : "Show", + + "FIELD_HEADER_ALGORITHM" : "Algorithm:", + "FIELD_HEADER_DIGITS" : "Digits:", + "FIELD_HEADER_INTERVAL" : "Interval:", + "FIELD_HEADER_SECRET_KEY" : "Secret Key:", + + "FIELD_PLACEHOLDER_CODE" : "Authentication Code", + + "INFO_CODE_REQUIRED" : "Please enter your authentication code to verify your identity.", + "INFO_ENROLL_REQUIRED" : "Multi-factor authentication has been enabled on your account.", + "INFO_VERIFICATION_FAILED" : "Verification failed. Please try again.", + + "HELP_ENROLL_BARCODE" : "To complete the enrollment process, scan the barcode below with the two-factor authentication app on your phone or device.", + "HELP_ENROLL_VERIFY" : "After scanning the barcode, enter the {DIGITS}-digit authentication code displayed to verify that enrollment was successful.", + + "SECTION_HEADER_DETAILS" : "Details:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "Disable TOTP:", + "FIELD_HEADER_GUAC_TOTP_KEY_GENERATED" : "Secret key generated:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "Authentication device confirmed:", + + "SECTION_HEADER_TOTP_ENROLLMENT_STATUS" : "TOTP Enrollment Status" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "Disable TOTP:", + + "SECTION_HEADER_TOTP_USER_GROUP_CONFIG" : "TOTP Configuration" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/fr.json b/extensions/guacamole-auth-totp/src/main/resources/translations/fr.json new file mode 100644 index 0000000..b4935ed --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/fr.json @@ -0,0 +1,52 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Masquer", + "ACTION_SHOW_DETAILS" : "Montrer", + + "FIELD_HEADER_ALGORITHM" : "Algorithme:", + "FIELD_HEADER_DIGITS" : "Chiffres:", + "FIELD_HEADER_INTERVAL" : "Intervalle:", + "FIELD_HEADER_SECRET_KEY" : "Clé secrète:", + + "FIELD_PLACEHOLDER_CODE" : "Code d'authentification", + + "INFO_CODE_REQUIRED" : "Veuillez entrer le code d'authentification pour vérifier votre identité.", + "INFO_ENROLL_REQUIRED" : "L'authentification multi-facteurs a été activée pour votre compte.", + "INFO_VERIFICATION_FAILED" : "La vérification a échoué. Veuillez réessayer.", + + "HELP_ENROLL_BARCODE" : "Pour terminer votre processus d'inscription, scannez le code-barre ci-dessous avec l'application deux-facteurs sur votre téléphone ou votre appareil", + "HELP_ENROLL_VERIFY" : "Après avoir scanné le code-barre, saisissez les {DIGITS} chiffres du code d'authentification affichés pour terminer votre inscription.", + + "SECTION_HEADER_DETAILS" : "Détails:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "Désactiver TOTP:", + "FIELD_HEADER_GUAC_TOTP_KEY_GENERATED" : "Clé secrète générée:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "Appareil d'authentification confirmé:", + + "SECTION_HEADER_TOTP_ENROLLMENT_STATUS" : "Statut d'inscription TOTP" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "Désactiver TOTP:", + + "SECTION_HEADER_TOTP_USER_GROUP_CONFIG" : "Configuration TOTP" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/it.json b/extensions/guacamole-auth-totp/src/main/resources/translations/it.json new file mode 100644 index 0000000..a2fa790 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/it.json @@ -0,0 +1,39 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Nascondere", + "ACTION_SHOW_DETAILS" : "Mostrare", + + "FIELD_HEADER_ALGORITHM" : "Algoritmo:", + "FIELD_HEADER_DIGITS" : "Cifre:", + "FIELD_HEADER_INTERVAL" : "Intervallo:", + "FIELD_HEADER_SECRET_KEY" : "Chiave segreta:", + + "FIELD_PLACEHOLDER_CODE" : "Codice di Autenticazione", + + "INFO_CODE_REQUIRED" : "Inserisci il tuo codice di autenticazione per verificare la tua identità.", + "INFO_ENROLL_REQUIRED" : "L'autenticazione a più fattori è stata abilitata sul tuo account.", + "INFO_VERIFICATION_FAILED" : "Verifica fallita. Per favore riprova.", + + "HELP_ENROLL_BARCODE" : "Per completare il processo di registrazione, scansiona il codice a barre qui sotto con l'app di autenticazione a due fattori sul tuo telefono o dispositivo.", + "HELP_ENROLL_VERIFY" : "Dopo aver scansionato il codice a barre, inserire il codice di autenticazione a {DIGITS}-cifre visualizzato per verificare che la registrazione sia andata a buon fine.", + + "SECTION_HEADER_DETAILS" : "Dettagli:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_KEY_GENERATED" : "Chiave segreta generata:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "Dispositivo di autenticazione confermato:", + + "SECTION_HEADER_TOTP_ENROLLMENT_STATUS" : "Stato di iscrizione TOTP" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/ja.json b/extensions/guacamole-auth-totp/src/main/resources/translations/ja.json new file mode 100644 index 0000000..a946ff4 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/ja.json @@ -0,0 +1,26 @@ +{ + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "非表示", + "ACTION_SHOW_DETAILS" : "表示", + + "FIELD_HEADER_ALGORITHM" : "アルゴリズム:", + "FIELD_HEADER_DIGITS" : "認証コード桁数:", + "FIELD_HEADER_INTERVAL" : "認証コード利用可能時間(秒):", + "FIELD_HEADER_SECRET_KEY" : "秘密鍵:", + + "FIELD_PLACEHOLDER_CODE" : "認証コード", + + "INFO_CODE_REQUIRED" : "認証コードを入力してください。", + "INFO_ENROLL_REQUIRED" : "二要素認証システムが有効になっています。", + "INFO_VERIFICATION_FAILED" : "認証に失敗しました。もう一度やり直してください。", + + "HELP_ENROLL_BARCODE" : "スマートフォンやタブレット等のデバイスの二要素認証アプリでQRコードを読み込んでください。", + "HELP_ENROLL_VERIFY" : "QRコードを読み込み、表示された {DIGITS}桁の認証コードを入力してください。", + + "SECTION_HEADER_DETAILS" : "詳細:" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/ko.json b/extensions/guacamole-auth-totp/src/main/resources/translations/ko.json new file mode 100644 index 0000000..ac6b1e4 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/ko.json @@ -0,0 +1,36 @@ +{ + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "숨기기", + "ACTION_SHOW_DETAILS" : "보이기", + + "FIELD_HEADER_ALGORITHM" : "알고리즘:", + "FIELD_HEADER_DIGITS" : "숫자:", + "FIELD_HEADER_INTERVAL" : "간격:", + "FIELD_HEADER_SECRET_KEY" : "비밀 키:", + + "FIELD_PLACEHOLDER_CODE" : "인증 코드", + + "INFO_CODE_REQUIRED" : "신원을 확인하려면 인증 코드를 입력하세요.", + "INFO_ENROLL_REQUIRED" : "계정에서 다단계 인증이 활성화되었습니다.", + "INFO_VERIFICATION_FAILED" : "확인에 실패했습니다. 다시 시도하십시오.", + + "HELP_ENROLL_BARCODE" : "등록 절차를 완료하려면 휴대 전화 또는 기기의 이중 인증 앱으로 아래 바코드를 스캔하세요.", + "HELP_ENROLL_VERIFY" : "바코드를 스캔한 후 표시되는 {DIGITS} 자리 인증 코드를 입력하여 성공적으로 등록되었는지 확인하십시오.", + + "SECTION_HEADER_DETAILS" : "세부 정보:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_RESET" : "TOTP 비밀 키 지우기:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "TOTP 키 확인 완료:", + + "SECTION_HEADER_TOTP_CONFIG_FORM" : "TOTP 구성" + + } + + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/pl.json b/extensions/guacamole-auth-totp/src/main/resources/translations/pl.json new file mode 100644 index 0000000..208a1e8 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/pl.json @@ -0,0 +1,43 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Ukryj", + "ACTION_SHOW_DETAILS" : "Pokaż", + + "FIELD_HEADER_ALGORITHM" : "Algorytm:", + "FIELD_HEADER_DIGITS" : "Cyfry:", + "FIELD_HEADER_INTERVAL" : "Interwał:", + "FIELD_HEADER_SECRET_KEY" : "Sekretny klucz:", + + "FIELD_PLACEHOLDER_CODE" : "Kod weryfikacyjny", + + "INFO_CODE_REQUIRED" : "Podaj kod weryfikacyjny, aby potwierdzić swoją tożsamość.", + "INFO_ENROLL_REQUIRED" : "Uwierzytelnianie wieloskładnikowe zostało włączone na Twoim koncie.", + "INFO_VERIFICATION_FAILED" : "Weryfikacja nie powiodła się. Spróbuj ponownie.", + + "HELP_ENROLL_BARCODE" : "Aby zakończyć proces rejestracji, zeskanuj poniższy kod kreskowy za pomocą aplikacji do uwierzytelniania dwuskładnikowego na swoim telefonie lub urządzeniu.", + "HELP_ENROLL_VERIFY" : "Po zeskanowaniu kodu kreskowego, wprowadź {DIGITS}-cyfrowy kod weryfikacyjny aby potwierdzić, że proces rejestracji przebiegł pomyślnie.", + + "SECTION_HEADER_DETAILS" : "Szczegóły:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_KEY_GENERATED" : "Wygenerowano klucz:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "Potwierdzono urządzenie uwierzytelniające:", + + "SECTION_HEADER_TOTP_ENROLLMENT_STATUS" : "Status Rejestracji TOTP" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/pt.json b/extensions/guacamole-auth-totp/src/main/resources/translations/pt.json new file mode 100644 index 0000000..fdef205 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/pt.json @@ -0,0 +1,34 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA Backend" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Esconder", + "ACTION_SHOW_DETAILS" : "Exibir", + + "FIELD_HEADER_ALGORITHM" : "Algoritmo:", + "FIELD_HEADER_DIGITS" : "Digitos:", + "FIELD_HEADER_INTERVAL" : "Intervalo:", + "FIELD_HEADER_SECRET_KEY" : "Chave Secreta:", + + "FIELD_PLACEHOLDER_CODE" : "Código de autenticação", + + "INFO_CODE_REQUIRED" : "Por favor digite seu código de autenticação para verificar sua identidade.", + "INFO_ENROLL_REQUIRED" : "Autenticação Multi-factor foi habilitada para sua conta.", + "INFO_VERIFICATION_FAILED" : "A verificação falhou. Por favor tente novamente.", + + "HELP_ENROLL_BARCODE" : "Para completar o processo de inscrição, faça o scan do código de barras abaixo com o app de autenticação de dois fatores no seu telefone ou dispositivo.", + "HELP_ENROLL_VERIFY" : "Após escanear o código de barras, digite os {DIGITS}-digitos do código de autenticação exibidos para verificar se sua inscrição foi recebida com sucesso.", + + "SECTION_HEADER_DETAILS" : "Detalhes:" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/ru.json b/extensions/guacamole-auth-totp/src/main/resources/translations/ru.json new file mode 100644 index 0000000..3a5d973 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/ru.json @@ -0,0 +1,30 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "Бэкенд TOTP TFA" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "Спрятать", + "ACTION_SHOW_DETAILS" : "Показать", + + "FIELD_HEADER_ALGORITHM" : "Алгоритм:", + "FIELD_HEADER_DIGITS" : "Количество цифр:", + "FIELD_HEADER_INTERVAL" : "Время действия:", + "FIELD_HEADER_SECRET_KEY" : "Секретный ключ:", + + "FIELD_PLACEHOLDER_CODE" : "Код доступа", + + "INFO_CODE_REQUIRED" : "Пожалуйста, введите код доступа для подтверждения подлинности.", + "INFO_ENROLL_REQUIRED" : "Для вашего аккаунта была включена многофакторная аутентификация.", + "INFO_VERIFICATION_FAILED" : "Проверка кода не пройдена. Пожалуйста, попробуйте снова.", + + "HELP_ENROLL_BARCODE" : "Для завершения создания учетной записи отсканируйте штрихкод вашей программой двухфакторной аутентификации на смартфоне или другом устройстве.", + "HELP_ENROLL_VERIFY" : "После сканирования штрихкода введите {DIGITS}-циферный код доступа, полученный на вашем устройстве, для проверки и завершения процедуры.", + + "SECTION_HEADER_DETAILS" : "Дополнительно:" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/main/resources/translations/zh.json b/extensions/guacamole-auth-totp/src/main/resources/translations/zh.json new file mode 100644 index 0000000..edb01e5 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/main/resources/translations/zh.json @@ -0,0 +1,52 @@ +{ + + "DATA_SOURCE_TOTP" : { + "NAME" : "TOTP TFA 后端" + }, + + "LOGIN" : { + "FIELD_HEADER_GUAC_TOTP" : "" + }, + + "TOTP" : { + + "ACTION_HIDE_DETAILS" : "隐藏", + "ACTION_SHOW_DETAILS" : "显示", + + "FIELD_HEADER_ALGORITHM" : "算法:", + "FIELD_HEADER_DIGITS" : "数字位数:", + "FIELD_HEADER_INTERVAL" : "时间间隔:", + "FIELD_HEADER_SECRET_KEY" : "密钥:", + + "FIELD_PLACEHOLDER_CODE" : "认证码", + + "INFO_CODE_REQUIRED" : "请输入您的认证码以验证您的身份。", + "INFO_ENROLL_REQUIRED" : "您的账户已启用多因素身份验证。", + "INFO_VERIFICATION_FAILED" : "验证失败,请重试。", + + "HELP_ENROLL_BARCODE" : "为了完成注册流程,请使用您的手机或设备上的双因素身份验证应用程序扫描下面的条形码。", + "HELP_ENROLL_VERIFY" : "扫描条形码后,输入显示的 {DIGITS} 位认证码以验证注册是否成功。", + + "SECTION_HEADER_DETAILS" : "详细信息:" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "禁用 TOTP:", + "FIELD_HEADER_GUAC_TOTP_KEY_GENERATED" : "已生成密钥:", + "FIELD_HEADER_GUAC_TOTP_KEY_CONFIRMED" : "已确认身份验证设备:", + + "SECTION_HEADER_TOTP_ENROLLMENT_STATUS" : "TOTP 注册状态" + + }, + + "USER_GROUP_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_TOTP_DISABLED" : "禁用 TOTP:", + + "SECTION_HEADER_TOTP_USER_GROUP_CONFIG" : "TOTP 配置" + + } + +} diff --git a/extensions/guacamole-auth-totp/src/test/java/org/apache/guacamole/totp/TOTPGeneratorTest.java b/extensions/guacamole-auth-totp/src/test/java/org/apache/guacamole/totp/TOTPGeneratorTest.java new file mode 100644 index 0000000..9266ad7 --- /dev/null +++ b/extensions/guacamole-auth-totp/src/test/java/org/apache/guacamole/totp/TOTPGeneratorTest.java @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.totp; + +import java.security.InvalidKeyException; +import org.junit.Test; +import static org.junit.Assert.*; + +/* + * NOTE: The tests for this TOTP implementation is based on the TOTP reference + * implementation provided by the IETF Trust at: + * + * https://tools.ietf.org/id/draft-mraihi-totp-timebased-07.html#Section-Reference-Impl + */ + +/* + * Copyright (c) 2011 IETF Trust and the persons identified as authors + * of the code. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Internet Society, IETF or IETF Trust, nor the names + * of specific contributors, may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Test which verifies the correctness of the TOTPGenerator class against the + * test inputs and results provided in the IETF reference implementation and + * spec for TOTP: + * + * https://tools.ietf.org/id/draft-mraihi-totp-timebased-07.html#Section-Test-Vectors + */ +public class TOTPGeneratorTest { + + /** + * Verifies the results of generating authentication codes using the TOTP + * algorithm in SHA1 mode. + */ + @Test + public void testGenerateSHA1() { + + // 160-bit key consisting of the bytes "12345678901234567890" repeated + // as necessary + final byte[] key = { + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' + }; + + try { + final TOTPGenerator totp = new TOTPGenerator(key, TOTPGenerator.Mode.SHA1, 8); + assertEquals("94287082", totp.generate(59)); + assertEquals("07081804", totp.generate(1111111109)); + assertEquals("14050471", totp.generate(1111111111)); + assertEquals("89005924", totp.generate(1234567890)); + assertEquals("69279037", totp.generate(2000000000)); + assertEquals("65353130", totp.generate(20000000000L)); + } + catch (InvalidKeyException e) { + fail("SHA1 test key is invalid."); + } + + + } + + /** + * Verifies the results of generating authentication codes using the TOTP + * algorithm in SHA256 mode. + */ + @Test + public void testGenerateSHA256() { + + // 256-bit key consisting of the bytes "12345678901234567890" repeated + // as necessary + final byte[] key = { + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2' + }; + + try { + final TOTPGenerator totp = new TOTPGenerator(key, TOTPGenerator.Mode.SHA256, 8); + assertEquals("46119246", totp.generate(59)); + assertEquals("68084774", totp.generate(1111111109)); + assertEquals("67062674", totp.generate(1111111111)); + assertEquals("91819424", totp.generate(1234567890)); + assertEquals("90698825", totp.generate(2000000000)); + assertEquals("77737706", totp.generate(20000000000L)); + } + catch (InvalidKeyException e) { + fail("SHA256 test key is invalid."); + } + + } + + /** + * Verifies the results of generating authentication codes using the TOTP + * algorithm in SHA512 mode. + */ + @Test + public void testGenerateSHA512() { + + // 512-bit key consisting of the bytes "12345678901234567890" repeated + // as necessary + final byte[] key = { + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '1', '2', '3', '4' + }; + + try { + final TOTPGenerator totp = new TOTPGenerator(key, TOTPGenerator.Mode.SHA512, 8); + assertEquals("90693936", totp.generate(59)); + assertEquals("25091201", totp.generate(1111111109)); + assertEquals("99943326", totp.generate(1111111111)); + assertEquals("93441116", totp.generate(1234567890)); + assertEquals("38618901", totp.generate(2000000000)); + assertEquals("47863826", totp.generate(20000000000L)); + } + catch (InvalidKeyException e) { + fail("SHA512 test key is invalid."); + } + + } + +} diff --git a/extensions/guacamole-display-statistics/.gitignore b/extensions/guacamole-display-statistics/.gitignore new file mode 100644 index 0000000..e55f47f --- /dev/null +++ b/extensions/guacamole-display-statistics/.gitignore @@ -0,0 +1 @@ +src/main/resources/generated/ diff --git a/extensions/guacamole-display-statistics/.ratignore b/extensions/guacamole-display-statistics/.ratignore new file mode 100644 index 0000000..da318d1 --- /dev/null +++ b/extensions/guacamole-display-statistics/.ratignore @@ -0,0 +1 @@ +src/main/resources/html/*.html diff --git a/extensions/guacamole-display-statistics/pom.xml b/extensions/guacamole-display-statistics/pom.xml new file mode 100644 index 0000000..de49952 --- /dev/null +++ b/extensions/guacamole-display-statistics/pom.xml @@ -0,0 +1,124 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-display-statistics + jar + 1.6.0 + guacamole-display-statistics + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + + com.keithbranton.mojo + angular-maven-plugin + 0.3.4 + + + generate-resources + + html2js + + + + + ${basedir}/src/main/resources + **/*.html + ${basedir}/src/main/resources/generated/templates-main/templates.js + app/ext/display-stats + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-cli + + UTF-8 + + ${basedir}/src/main/resources + ${project.build.directory}/classes + + / + / + display-stats.css + + + license.txt + + + + **/*.css + + + / + / + display-stats.js + + + license.txt + + + + **/*.js + + + + + **/*.test.js + + CLOSURE + + + + OFF + OFF + + + + + minify + + + + + + + + + diff --git a/extensions/guacamole-display-statistics/src/main/assembly/dist.xml b/extensions/guacamole-display-statistics/src/main/assembly/dist.xml new file mode 100644 index 0000000..0b16a71 --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-display-statistics/src/main/resources/directives/guacClientStatistics.js b/extensions/guacamole-display-statistics/src/main/resources/directives/guacClientStatistics.js new file mode 100644 index 0000000..de17b9a --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/directives/guacClientStatistics.js @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays frame rendering performance statistics for a + * Guacamole client. + */ +angular.module('client').directive('guacClientStatistics', [function guacClientStatistics() { + + const directive = { + restrict: 'E', + templateUrl: 'app/ext/display-stats/templates/guacClientStatistics.html', + }; + + directive.scope = { + + /** + * The Guacamole client to display frame rendering statistics for. + * + * @type ManagedClient + */ + client : '=' + + }; + + directive.controller = ['$scope', function guacClientStatisticsController($scope) { + + /** + * Updates the displayed frame rendering statistics to the values + * within the given statistics object. + * + * @param {!Guacamole.Display.Statistics} stats + * An object containing general rendering performance statistics for + * the remote desktop, Guacamole server, and Guacamole client. + */ + var updateStatistics = function updateStatistics(stats) { + $scope.$apply(function statisticsChanged() { + $scope.statistics = stats; + }); + }; + + /** + * Returns whether the given value is a defined value that should be + * rendered within the statistics toolbar. + * + * @param {number} value + * The value to test. + * + * @returns {!boolean} + * true if the given value should be rendered within the statistics + * toolbar, false otherwise. + */ + $scope.hasValue = function hasValue(value) { + return value || value === 0; + }; + + /** + * Rounds the given numeric value to the nearest hundredth (two decimal places). + * + * @param {!number} value + * The value to round. + * + * @param {!number} + * The given value, rounded to the nearest hundredth. + */ + $scope.round = function round(value) { + return Math.round(value * 100) / 100; + }; + + // Assign/remove onstatistics handlers to track the statistics of the + // current client + $scope.$watch('client', function clientChanged(client, oldClient) { + + if (oldClient) + oldClient.managedDisplay.display.onstatistics = null; + + client.managedDisplay.display.statisticWindow = 1000; + client.managedDisplay.display.onstatistics = updateStatistics; + + }); + + // Clear onstatistics handler when directive is being unloaded + $scope.$on('$destroy', function scopeDestroyed() { + if ($scope.client) + $scope.client.managedDisplay.display.onstatistics = null; + }); + + // Display statistics by default + $scope.isVisible = true; + + }]; + + return directive; + +}]); diff --git a/extensions/guacamole-display-statistics/src/main/resources/guac-manifest.json b/extensions/guacamole-display-statistics/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..ca398dc --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/guac-manifest.json @@ -0,0 +1,28 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Display Statistic Toolbar", + "namespace" : "display-stats", + + "translations" : [ + "translations/en.json" + ], + + "js" : [ + "display-stats.min.js" + ], + + "css" : [ + "display-stats.min.css" + ], + + "html" : [ + "html/add-statistics.html" + ], + + "resources" : { + "templates/guacClientStatistics.html" : "text/html" + } + +} diff --git a/extensions/guacamole-display-statistics/src/main/resources/html/add-statistics.html b/extensions/guacamole-display-statistics/src/main/resources/html/add-statistics.html new file mode 100644 index 0000000..5978f7f --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/html/add-statistics.html @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/guacamole-display-statistics/src/main/resources/license.txt b/extensions/guacamole-display-statistics/src/main/resources/license.txt new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/license.txt @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/extensions/guacamole-display-statistics/src/main/resources/styles/clientStatistics.css b/extensions/guacamole-display-statistics/src/main/resources/styles/clientStatistics.css new file mode 100644 index 0000000..2216d22 --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/styles/clientStatistics.css @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +guac-client-statistics { + font-size: 13px; + color: white; + background: #111; +} + +guac-client-statistics div.buttons-statistics { + content: ''; + cursor: pointer; + display: block; + background-repeat: no-repeat; + background-size: contain; + background-position: center center; + height: 15px; + position: absolute; +} + +guac-client-statistics div.hide-statistics { + background-image: url('images/x.svg'); + bottom: 10px; + right: 20px; + width: 15px; +} + +guac-client-statistics div.show-statistics { + background-color: #888; + background-image: url('images/arrows/up.svg'); + border: 1px solid rgba(0, 0, 0, 0.25); + bottom: 0; + left: 50%; + margin-left: -15px; + opacity: .5; + width: 30px; +} + +guac-client-statistics div.show-statistics:hover { + background-color: #FFF; +} + +guac-client-statistics dl.client-statistics { + display: table; + margin: 0; + padding: 0.25em; +} + +guac-client-statistics dl.client-statistics dt, +guac-client-statistics dl.client-statistics dd { + display: table-cell; + padding: 0.25em; +} + +guac-client-statistics dl.client-statistics dt { + padding-right: 0.5em; + padding-left: 1em; +} + +guac-client-statistics dl.client-statistics dt:first-child { + padding-left: 0.5em; +} + +guac-client-statistics dl.client-statistics dd { + min-width: 6em; + border: 1px solid rgba(255, 255, 255, 0.125); + border-radius: 3px; + background: black; +} + +guac-client-statistics dl.client-statistics dd.no-value::before { + color: #888; + content: '-'; +} diff --git a/extensions/guacamole-display-statistics/src/main/resources/templates/guacClientStatistics.html b/extensions/guacamole-display-statistics/src/main/resources/templates/guacClientStatistics.html new file mode 100644 index 0000000..0493d36 --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/templates/guacClientStatistics.html @@ -0,0 +1,44 @@ +
    + +
    + {{ 'CLIENT.FIELD_HEADER_DESKTOP_FRAMERATE' | translate }} +
    +
    + +
    + +
    + {{ 'CLIENT.FIELD_HEADER_SERVER_FRAMERATE' | translate }} +
    +
    + +
    + +
    + {{ 'CLIENT.FIELD_HEADER_CLIENT_FRAMERATE' | translate }} +
    +
    + +
    + +
    + {{ 'CLIENT.FIELD_HEADER_DROP_FRAMERATE' | translate }} +
    +
    + +
    + +
    + +
    +
    diff --git a/extensions/guacamole-display-statistics/src/main/resources/translations/en.json b/extensions/guacamole-display-statistics/src/main/resources/translations/en.json new file mode 100644 index 0000000..ef42908 --- /dev/null +++ b/extensions/guacamole-display-statistics/src/main/resources/translations/en.json @@ -0,0 +1,12 @@ +{ + "CLIENT" : { + + "FIELD_HEADER_CLIENT_FRAMERATE" : "Guacamole (Client):", + "FIELD_HEADER_DESKTOP_FRAMERATE" : "Remote Desktop:", + "FIELD_HEADER_DROP_FRAMERATE" : "Drop:", + "FIELD_HEADER_SERVER_FRAMERATE" : "Guacamole (Server):", + + "INFO_FRAMERATE" : "{VALUE} fps" + + } +} diff --git a/extensions/guacamole-history-recording-storage/.gitignore b/extensions/guacamole-history-recording-storage/.gitignore new file mode 100644 index 0000000..1de9633 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/.gitignore @@ -0,0 +1,3 @@ +src/main/resources/generated/ +target/ +*~ diff --git a/extensions/guacamole-history-recording-storage/.ratignore b/extensions/guacamole-history-recording-storage/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-history-recording-storage/pom.xml b/extensions/guacamole-history-recording-storage/pom.xml new file mode 100644 index 0000000..1d4fbf4 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/pom.xml @@ -0,0 +1,52 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-history-recording-storage + jar + 1.6.0 + guacamole-history-recording-storage + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + diff --git a/extensions/guacamole-history-recording-storage/src/main/assembly/dist.xml b/extensions/guacamole-history-recording-storage/src/main/assembly/dist.xml new file mode 100644 index 0000000..6ee3cd8 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/assembly/dist.xml @@ -0,0 +1,53 @@ + + + + + dist + ${project.artifactId}-${project.version} + + + + tar.gz + + + + + + + + + target/licenses + + + + + target + + + *.jar + + + + + + diff --git a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/HistoryAuthenticationProvider.java b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/HistoryAuthenticationProvider.java new file mode 100644 index 0000000..43f4424 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/HistoryAuthenticationProvider.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.history; + +import java.io.File; +import org.apache.guacamole.history.user.HistoryUserContext; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.properties.FileGuacamoleProperty; + +/** + * AuthenticationProvider implementation which automatically associates history + * entries with session recordings, typescripts, etc. History association is + * determined by matching the history entry UUID with the filenames of files + * located within a standardized/configurable directory. + */ +public class HistoryAuthenticationProvider extends AbstractAuthenticationProvider { + + /** + * The default directory to search for associated session recordings, if + * not overridden with the "recording-search-path" property. + */ + private static final File DEFAULT_RECORDING_SEARCH_PATH = new File("/var/lib/guacamole/recordings"); + + /** + * The directory to search for associated session recordings. By default, + * "/var/lib/guacamole/recordings" will be used. + */ + private static final FileGuacamoleProperty RECORDING_SEARCH_PATH = new FileGuacamoleProperty() { + + @Override + public String getName() { + return "recording-search-path"; + } + + }; + + /** + * Returns the directory that should be searched for session recordings + * associated with history entries. + * + * @return + * The directory that should be searched for session recordings + * associated with history entries. + * + * @throws GuacamoleException + * If the "recording-search-path" property cannot be parsed. + */ + public static File getRecordingSearchPath() throws GuacamoleException { + Environment environment = LocalEnvironment.getInstance(); + return environment.getProperty(RECORDING_SEARCH_PATH, + DEFAULT_RECORDING_SEARCH_PATH); + } + + @Override + public String getIdentifier() { + return "recording-storage"; + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + return new HistoryUserContext(context.self(), context); + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnection.java b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnection.java new file mode 100644 index 0000000..4f10674 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnection.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.history.connection; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.DelegatingConnection; +import org.apache.guacamole.net.auth.User; + +/** + * Connection implementation that automatically defines ActivityLogs for + * files that relate to history entries associated with the wrapped connection. + */ +public class HistoryConnection extends DelegatingConnection { + + /** + * The current Guacamole user. + */ + private final User currentUser; + + /** + * Creates a new HistoryConnection that wraps the given connection, + * automatically associating history entries with ActivityLogs based on + * related files (session recordings, typescripts, etc.). + * + * @param currentUser + * The current Guacamole user. + * + * @param connection + * The connection to wrap. + */ + public HistoryConnection(User currentUser, Connection connection) { + super(connection); + this.currentUser = currentUser; + } + + /** + * Returns the connection wrapped by this HistoryConnection. + * + * @return + * The connection wrapped by this HistoryConnection. + */ + public Connection getWrappedConnection() { + return getDelegateConnection(); + } + + @Override + public ActivityRecordSet getConnectionHistory() throws GuacamoleException { + return new RecordedConnectionActivityRecordSet(currentUser, super.getConnectionHistory()); + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java new file mode 100644 index 0000000..f1c53ff --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java @@ -0,0 +1,329 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.history.connection; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.MalformedURLException; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.history.HistoryAuthenticationProvider; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.ReaderGuacamoleReader; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.ActivityLog; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.DelegatingConnectionRecord; +import org.apache.guacamole.net.auth.FileActivityLog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ConnectionRecord implementation that automatically defines ActivityLogs for + * files that relate to the wrapped record. + */ +public class HistoryConnectionRecord extends DelegatingConnectionRecord { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(HistoryConnectionRecord.class); + + /** + * The namespace for URL UUIDs as defined by RFC 4122. + */ + private static final UUID UUID_NAMESPACE_URL = UUID.fromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8"); + + /** + * The filename suffix of typescript timing files. + */ + private static final String TIMING_FILE_SUFFIX = ".timing"; + + /** + * The recording file associated with the wrapped connection record. This + * may be a single file or a directory that may contain any number of + * relevant recordings. + */ + private final File recording; + + /** + * Returns the file or directory providing recording storage for the given + * history record. If no such file or directory exists, or the file cannot + * be read, null is returned. + * + * @param record + * The ConnectionRecord whose associated recording storage file + * or directory should be returned. + * + * @return + * A File pointing to the file or directory providing recording storage + * for the given history record, or null if no such file exists. + * + * @throws GuacamoleException + * If the configured path for stored recordings cannot be read. + */ + private static File getRecordingFile(ConnectionRecord record) throws GuacamoleException { + + UUID uuid = record.getUUID(); + if (uuid != null) { + File recordingFile = new File(HistoryAuthenticationProvider.getRecordingSearchPath(), uuid.toString()); + if (recordingFile.canRead()) + return recordingFile; + } + + return null; + + } + + /** + * Creates a new HistoryConnectionRecord that wraps the given + * ConnectionRecord, automatically associating ActivityLogs based on + * related files (session recordings, typescripts, etc.). + * + * @param record + * The ConnectionRecord to wrap. + * + * @throws GuacamoleException + * If the configured path for stored recordings cannot be read. + */ + public HistoryConnectionRecord(ConnectionRecord record) throws GuacamoleException { + super(record); + this.recording = getRecordingFile(record); + } + + /** + * Returns whether the given file appears to be a Guacamole session + * recording. As there is no standard extension for session recordings, + * this is determined by attempting to read a single Guacamole instruction + * from the file. + * + * @param file + * The file to test. + * + * @return + * true if the file appears to be a Guacamole session recording, false + * otherwise. + */ + private boolean isSessionRecording(File file) { + + Reader reader = null; + try { + reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); + + GuacamoleReader guacReader = new ReaderGuacamoleReader(reader); + if (guacReader.readInstruction() != null) + return true; + + } + catch (GuacamoleException e) { + logger.debug("File \"{}\" does not appear to be a session " + + "recording, as it could not be parsed as Guacamole " + + "protocol data.", file, e); + } + catch (IOException e) { + logger.warn("Possible session recording \"{}\" could not be " + + "identified as it cannot be read: {}", file, e.getMessage()); + logger.debug("Possible session recording \"{}\" could not be read.", file, e); + } + finally { + + // If the reader was successfully constructed, close it + if (reader != null) { + + try { + reader.close(); + } + + catch (IOException e) { + logger.warn("Unexpected error closing recording file \"{}\": {}", + file, e.getMessage()); + logger.debug("Session recording file \"{}\" could not be closed.", + file, e); + } + + } + } + + return false; + + } + + /** + * Returns whether the given file appears to be a typescript (text + * recording of a terminal session). As there is no standard extension for + * session recordings, this is determined by testing whether there is an + * associated timing file. Guacamole will always include a timing file for + * its typescripts. + * + * @param file + * The file to test. + * + * @return + * true if the file appears to be a typescript, false otherwise. + */ + private boolean isTypescript(File file) { + return new File(file.getAbsolutePath() + TIMING_FILE_SUFFIX).exists(); + } + + /** + * Returns whether the given file appears to be a typescript timing file. + * Typescript timing files have the standard extension ".timing". + * + * @param file + * The file to test. + * + * @return + * true if the file appears to be a typescript timing file, false + * otherwise. + */ + private boolean isTypescriptTiming(File file) { + return file.getName().endsWith(TIMING_FILE_SUFFIX); + } + + /** + * Returns the type of session recording or log contained within the given + * file by inspecting its name and contents. + * + * @param file + * The file to test. + * + * @return + * The type of session recording or log contained within the given + * file, or null if this cannot be determined. + */ + private ActivityLog.Type getType(File file) { + + if (isSessionRecording(file)) + return ActivityLog.Type.GUACAMOLE_SESSION_RECORDING; + + if (isTypescript(file)) + return ActivityLog.Type.TYPESCRIPT; + + if (isTypescriptTiming(file)) + return ActivityLog.Type.TYPESCRIPT_TIMING; + + return ActivityLog.Type.SERVER_LOG; + + } + + /** + * Returns a new ActivityLog instance representing the session recording or + * log contained within the given file. If the type of recording/log cannot + * be determined, or if the file is unreadable, null is returned. + * + * @param file + * The file to produce an ActivityLog instance for. + * + * @return + * A new ActivityLog instance representing the recording/log contained + * within the given file, or null if the file is unreadable or cannot + * be identified. + */ + private ActivityLog getActivityLog(File file) { + + // Verify file can actually be read + if (!file.canRead()) { + logger.warn("Ignoring file \"{}\" relevant to connection history " + + "record as it cannot be read.", file); + return null; + } + + // Determine type of recording/log by inspecting file + ActivityLog.Type logType = getType(file); + if (logType == null) { + logger.warn("Recording/log type of \"{}\" cannot be determined.", file); + return null; + } + + return new FileActivityLog( + logType, + new TranslatableMessage("RECORDING_STORAGE.INFO_" + logType.name()), + file + ); + + } + + /** + * Adds an ActivityLog instance representing the session recording or log + * contained within the given file to the given map of logs. If no + * ActivityLog can be produced for the given file (it is unreadable or + * cannot be identified), this function has no effect. + * + * @param logs + * The map of logs to add the ActivityLog to. + * + * @param file + * The file to produce an ActivityLog instance for. + */ + private void addActivityLog(Map logs, File file) { + + ActivityLog log = getActivityLog(file); + if (log == null) + return; + + // Convert file into deterministic name UUID within URL namespace + UUID fileUUID; + try { + byte[] urlBytes = file.toURI().toURL().toString().getBytes(StandardCharsets.UTF_8); + fileUUID = UUID.nameUUIDFromBytes(ByteBuffer.allocate(16 + urlBytes.length) + .putLong(UUID_NAMESPACE_URL.getMostSignificantBits()) + .putLong(UUID_NAMESPACE_URL.getLeastSignificantBits()) + .put(urlBytes) + .array()); + } + catch (MalformedURLException e) { + logger.warn("Ignoring file \"{}\" as a unique URL and UUID for that file could not be generated: {}", e.getMessage()); + logger.debug("URL for file \"{}\" could not be determined.", file, e); + return; + } + + logs.put(fileUUID.toString(), log); + + } + + @Override + public Map getLogs() { + + // Do nothing if there are no associated logs + if (recording == null) + return super.getLogs(); + + // Add associated log (or logs, if this is a directory) + Map logs = new HashMap<>(super.getLogs()); + if (recording.isDirectory()) { + Arrays.asList(recording.listFiles()).stream() + .forEach((file) -> addActivityLog(logs, file)); + } + else + addActivityLog(logs, recording); + + return logs; + + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/RecordedConnectionActivityRecordSet.java b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/RecordedConnectionActivityRecordSet.java new file mode 100644 index 0000000..5caffdf --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/RecordedConnectionActivityRecordSet.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.history.connection; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.DecoratingActivityRecordSet; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.SystemPermission; + +/** + * ActivityRecordSet implementation that automatically defines ActivityLogs for + * files that relate to history entries within the wrapped set. + */ +public class RecordedConnectionActivityRecordSet extends DecoratingActivityRecordSet { + + /** + * Whether the current user is an administrator. + */ + private final boolean isAdmin; + + /** + * The overall set of connection permissions defined for the current user. + */ + private final Set connectionPermissions; + + /** + * Creates a new RecordedConnectionActivityRecordSet that wraps the given + * ActivityRecordSet, automatically associating history entries with + * ActivityLogs based on related files (session recordings, typescripts, + * etc.). + * + * @param currentUser + * The current Guacamole user. + * + * @param activityRecordSet + * The ActivityRecordSet to wrap. + * + * @throws GuacamoleException + * If the permissions for the current user cannot be retrieved. + */ + public RecordedConnectionActivityRecordSet(User currentUser, + ActivityRecordSet activityRecordSet) + throws GuacamoleException { + super(activityRecordSet); + + // Determine whether current user is an administrator + Permissions perms = currentUser.getEffectivePermissions(); + isAdmin = perms.getSystemPermissions().hasPermission(SystemPermission.Type.ADMINISTER); + + // If not an admin, additionally pull specific connection permissions + if (isAdmin) + connectionPermissions = Collections.emptySet(); + else + connectionPermissions = perms.getConnectionPermissions().getPermissions(); + + } + + /** + * Returns whether the current user has permission to view the logs + * associated with the given history record. It is already given that the + * user has permission to view the history record itself. This extension + * considers a user to have permission to view history logs if they are + * an administrator or if they have permission to edit the associated + * connection. + * + * @param record + * The record to check. + * + * @return + * true if the current user has permission to view the logs associated + * with the given record, false otherwise. + */ + private boolean canViewLogs(ConnectionRecord record) { + + // Administrator can always view + if (isAdmin) + return true; + + // Non-administrator CANNOT view if permissions cannot be verified + String identifier = record.getConnectionIdentifier(); + if (identifier == null) + return false; + + // Non-administer can only view if they implicitly have permission to + // configure recordings (they have permission to edit) + ObjectPermission canUpdate = new ObjectPermission(ObjectPermission.Type.UPDATE, identifier); + return connectionPermissions.contains(canUpdate); + + } + + @Override + protected ConnectionRecord decorate(ConnectionRecord record) throws GuacamoleException { + + // Provide access to logs only if permission is granted + if (canViewLogs(record)) + return new HistoryConnectionRecord(record); + + return record; + + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/user/HistoryUserContext.java b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/user/HistoryUserContext.java new file mode 100644 index 0000000..a103a6e --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/user/HistoryUserContext.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.history.user; + +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.history.HistoryAuthenticationProvider; +import org.apache.guacamole.history.connection.HistoryConnection; +import org.apache.guacamole.history.connection.RecordedConnectionActivityRecordSet; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.DecoratingDirectory; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.TokenInjectingUserContext; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; + +/** + * UserContext implementation that automatically defines ActivityLogs for + * files that relate to history entries. + */ +public class HistoryUserContext extends TokenInjectingUserContext { + + /** + * The name of the parameter token that contains the automatically-searched + * history recording/log path. + */ + private static final String HISTORY_PATH_TOKEN_NAME = "HISTORY_PATH"; + + /** + * The current Guacamole user. + */ + private final User currentUser; + + /** + * Creates a new HistoryUserContext that wraps the given UserContext, + * automatically associating history entries with ActivityLogs based on + * related files (session recordings, typescripts, etc.). + * + * @param currentUser + * The current Guacamole user. + * + * @param context + * The UserContext to wrap. + */ + public HistoryUserContext(User currentUser, UserContext context) { + super(context); + this.currentUser = currentUser; + } + + /** + * Returns the tokens which should be added to an in-progress call to + * connect() for any Connectable object. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + * + * @throws GuacamoleException + * If the relevant tokens cannot be generated. + */ + private Map getTokens() throws GuacamoleException { + return Collections.singletonMap(HISTORY_PATH_TOKEN_NAME, + HistoryAuthenticationProvider.getRecordingSearchPath().getAbsolutePath()); + } + + @Override + protected Map getTokens(ConnectionGroup connectionGroup) + throws GuacamoleException { + return getTokens(); + } + + @Override + protected Map getTokens(Connection connection) + throws GuacamoleException { + return getTokens(); + } + + @Override + public Directory getConnectionDirectory() throws GuacamoleException { + return new DecoratingDirectory(super.getConnectionDirectory()) { + + @Override + protected Connection decorate(Connection object) { + return new HistoryConnection(currentUser, object); + } + + @Override + protected Connection undecorate(Connection object) throws GuacamoleException { + return ((HistoryConnection) object).getWrappedConnection(); + } + + }; + } + + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + return new RecordedConnectionActivityRecordSet(currentUser, super.getConnectionHistory()); + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/resources/guac-manifest.json b/extensions/guacamole-history-recording-storage/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..097b344 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/resources/guac-manifest.json @@ -0,0 +1,17 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Session Recording Storage", + "namespace" : "recording-storage", + + "authProviders" : [ + "org.apache.guacamole.history.HistoryAuthenticationProvider" + ], + + "translations" : [ + "translations/en.json", + "translations/pl.json" + ] + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/resources/translations/en.json b/extensions/guacamole-history-recording-storage/src/main/resources/translations/en.json new file mode 100644 index 0000000..13b7dba --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/resources/translations/en.json @@ -0,0 +1,14 @@ +{ + + "DATA_SOURCE_RECORDING_STORAGE" : { + "NAME" : "Session Recording Storage" + }, + + "RECORDING_STORAGE" : { + "INFO_GUACAMOLE_SESSION_RECORDING" : "Graphical recording of remote desktop session", + "INFO_SERVER_LOG" : "Server/system log", + "INFO_TYPESCRIPT" : "Text recording of terminal session", + "INFO_TYPESCRIPT_TIMING" : "Timing information for text recording of terminal session" + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/resources/translations/it.json b/extensions/guacamole-history-recording-storage/src/main/resources/translations/it.json new file mode 100644 index 0000000..bec1fc2 --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/resources/translations/it.json @@ -0,0 +1,14 @@ +{ + + "DATA_SOURCE_RECORDING_STORAGE" : { + "NAME" : "Archiviazione della registrazione della sessione" + }, + + "RECORDING_STORAGE" : { + "INFO_GUACAMOLE_SESSION_RECORDING" : "Registrazione grafica della sessione desktop remoto", + "INFO_SERVER_LOG" : "Server/system log", + "INFO_TYPESCRIPT" : "Registrazione del testo della sessione del terminale", + "INFO_TYPESCRIPT_TIMING" : "Informazioni sull'orario per la registrazione del testo della sessione del terminale" + } + +} diff --git a/extensions/guacamole-history-recording-storage/src/main/resources/translations/pl.json b/extensions/guacamole-history-recording-storage/src/main/resources/translations/pl.json new file mode 100644 index 0000000..fc8f63f --- /dev/null +++ b/extensions/guacamole-history-recording-storage/src/main/resources/translations/pl.json @@ -0,0 +1,14 @@ +{ + + "DATA_SOURCE_RECORDING_STORAGE" : { + "NAME" : "Session Recording Storage" + }, + + "RECORDING_STORAGE" : { + "INFO_GUACAMOLE_SESSION_RECORDING" : "Graficzne nagranie sesji zdalnego pulpitu", + "INFO_SERVER_LOG" : "Serwer/system log", + "INFO_TYPESCRIPT" : "Tesktowe nagranie sesji", + "INFO_TYPESCRIPT_TIMING" : "Informacje o czasie dla tesktowego nagrania sesji" + } + +} diff --git a/extensions/guacamole-vault/.ratignore b/extensions/guacamole-vault/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/.ratignore b/extensions/guacamole-vault/modules/guacamole-vault-base/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/pom.xml b/extensions/guacamole-vault/modules/guacamole-vault-base/pom.xml new file mode 100644 index 0000000..6928f57 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/pom.xml @@ -0,0 +1,81 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-vault-base + jar + guacamole-vault-base + http://guacamole.apache.org/ + + + UTF-8 + + + + org.apache.guacamole + guacamole-vault + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-ext + provided + + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + + + junit + junit + test + + + + + com.google.inject + guice + + + com.google.inject.extensions + guice-assistedinject + + + + + diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/VaultAuthenticationProvider.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/VaultAuthenticationProvider.java new file mode 100644 index 0000000..440ef95 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/VaultAuthenticationProvider.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.vault.conf.VaultConfigurationService; +import org.apache.guacamole.vault.user.VaultUserContextFactory; + +/** + * AuthenticationProvider implementation which automatically injects tokens + * containing the values of secrets retrieved from a vault. + */ +public abstract class VaultAuthenticationProvider + extends AbstractAuthenticationProvider { + + /** + * Factory for creating instances of the relevant vault-specific + * UserContext implementation. + */ + private final VaultUserContextFactory userContextFactory; + + /** + * Creates a new VaultAuthenticationProvider which uses the given module to + * configure dependency injection. + * + * @param module + * The module to use to configure dependency injection. + * + * @throws GuacamoleException + * If the properties file containing vault-mapped Guacamole + * configuration properties exists but cannot be read. + */ + protected VaultAuthenticationProvider(VaultAuthenticationProviderModule module) + throws GuacamoleException { + + Injector injector = Guice.createInjector(module); + this.userContextFactory = injector.getInstance(VaultUserContextFactory.class); + + // Automatically pull properties from vault + Environment environment = injector.getInstance(Environment.class); + VaultConfigurationService confService = injector.getInstance(VaultConfigurationService.class); + environment.addGuacamoleProperties(confService.getProperties()); + + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + return userContextFactory.create(context); + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/VaultAuthenticationProviderModule.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/VaultAuthenticationProviderModule.java new file mode 100644 index 0000000..a790d01 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/VaultAuthenticationProviderModule.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault; + +import com.google.inject.AbstractModule; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.vault.user.VaultUserContext; +import org.apache.guacamole.vault.user.VaultUserContextFactory; + +/** + * Guice module which configures injections specific to the base support for + * key vaults. When adding support for a key vault provider, a subclass + * specific to that vault implementation will need to be created. + * + * @see KsmAuthenticationProviderModule + */ +public abstract class VaultAuthenticationProviderModule extends AbstractModule { + + /** + * Guacamole server environment. + */ + private final Environment environment; + + /** + * Creates a new VaultAuthenticationProviderModule which configures + * dependency injection for the authentication provider of a vault + * implementation. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Guacamole server + * environment. + */ + public VaultAuthenticationProviderModule() throws GuacamoleException { + this.environment = LocalEnvironment.getInstance(); + } + + /** + * Configures injections for interfaces which are implementation-specific + * to the vault service in use. Subclasses MUST provide a version of this + * function which binds concrete implementations to the following + * interfaces: + * + * - VaultConfigurationService + * - VaultSecretService + * + * @see KsmAuthenticationProviderModule + */ + protected abstract void configureVault(); + + /** + * Returns the instance of the Guacamole server environment which will be + * exposed to other classes via dependency injection. + * + * @return + * The instance of the Guacamole server environment which will be + * exposed via dependency injection. + */ + protected Environment getEnvironment() { + return environment; + } + + @Override + protected void configure() { + + // Bind Guacamole server environment + bind(Environment.class).toInstance(environment); + + // Bind factory for creating UserContexts + install(new FactoryModuleBuilder() + .implement(UserContext.class, VaultUserContext.class) + .build(VaultUserContextFactory.class)); + + // Bind all other implementation-specific interfaces + configureVault(); + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/conf/VaultAttributeService.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/conf/VaultAttributeService.java new file mode 100644 index 0000000..bccf08e --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/conf/VaultAttributeService.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.conf; + +import java.util.Collection; + +import org.apache.guacamole.form.Form; + +/** + * A service that exposes attributes for the admin UI, specific to the vault + * implementation. Any vault implementation will need to expose the attributes + * necessary for that implementation. + */ +public interface VaultAttributeService { + + /** + * Return all custom connection attributes to be exposed through the + * admin UI for the current vault implementation. + * + * @return + * All custom connection attributes to be exposed through the + * admin UI for the current vault implementation. + */ + public Collection getConnectionAttributes(); + + /** + * Return all custom connection group attributes to be exposed through the + * admin UI for the current vault implementation. + * + * @return + * All custom connection group attributes to be exposed through the + * admin UI for the current vault implementation. + */ + public Collection getConnectionGroupAttributes(); + + /** + * Return all custom user attributes to be exposed through the admin UI for + * the current vault implementation. + * + * @return + * All custom user attributes to be exposed through the admin UI for + * the current vault implementation. + */ + public Collection getUserAttributes(); + + /** + * Return all user preference attributes to be exposed through the user + * preferences UI for the current vault implementation. + * + * @return + * All user preference attributes to be exposed through the user + * preferences UI for the current vault implementation. + */ + public Collection getUserPreferenceAttributes(); +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/conf/VaultConfigurationService.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/conf/VaultConfigurationService.java new file mode 100644 index 0000000..3a3189b --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/conf/VaultConfigurationService.java @@ -0,0 +1,226 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.conf; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.google.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ExecutionException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.FileGuacamoleProperties; +import org.apache.guacamole.properties.GuacamoleProperties; +import org.apache.guacamole.properties.PropertiesGuacamoleProperties; +import org.apache.guacamole.vault.VaultAuthenticationProviderModule; +import org.apache.guacamole.vault.secret.VaultSecretService; + +/** + * Base class for services which retrieve key vault configuration information. + * A concrete implementation of this class must be defined and bound for key + * vault support to work. + * + * @see VaultAuthenticationProviderModule + */ +public abstract class VaultConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + @Inject + private VaultSecretService secretService; + + /** + * ObjectMapper for deserializing YAML. + */ + private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + + /** + * The name of the file containing a YAML mapping of Guacamole parameter + * token to vault secret name. + */ + private final String tokenMappingFilename; + + /** + * The name of the properties file containing Guacamole configuration + * properties. Unlike guacamole.properties, the values of these properties + * are read from the vault. Each property is expected to contain a secret + * name instead of a property value. + */ + private final String propertiesFilename; + + /** + * Creates a new VaultConfigurationService which retrieves the token/secret + * mappings and Guacamole configuration properties from the files with the + * given names. + * + * @param tokenMappingFilename + * The name of the YAML file containing the token/secret mapping. + * + * @param propertiesFilename + * The name of the properties file containing Guacamole configuration + * properties whose values are the names of corresponding secrets. + */ + protected VaultConfigurationService(String tokenMappingFilename, + String propertiesFilename) { + this.tokenMappingFilename = tokenMappingFilename; + this.propertiesFilename = propertiesFilename; + } + + /** + * Returns a mapping dictating the name of the secret which maps to each + * parameter token. In the returned mapping, the value of each entry is the + * name of the secret to use to populate the value of the parameter token, + * and the key of each entry is the name of the parameter token which + * should receive the value of the secret. + * + * The name of the secret may contain its own tokens, which will be + * substituted using values from the given filter. See the definition of + * VaultUserContext for the names of these tokens and the contexts in which + * they can be applied to secret names. + * + * @return + * A mapping dictating the name of the secret which maps to each + * parameter token. + * + * @throws GuacamoleException + * If the YAML file defining the token/secret mapping cannot be read. + */ + public Map getTokenMapping() throws GuacamoleException { + + // Get configuration file from GUACAMOLE_HOME + File confFile = new File(environment.getGuacamoleHome(), tokenMappingFilename); + if (!confFile.exists()) + return Collections.emptyMap(); + + // Deserialize token mapping from YAML + try { + + Map mapping = mapper.readValue(confFile, new TypeReference>() {}); + if (mapping == null) + return Collections.emptyMap(); + + return mapping; + + } + + // Fail if YAML is invalid/unreadable + catch (IOException e) { + throw new GuacamoleServerException("Unable to read token mapping " + + "configuration file \"" + tokenMappingFilename + "\".", e); + } + + } + + /** + * Returns a GuacamoleProperties instance which automatically reads the + * values of requested properties from the vault. The name of the secret + * corresponding to a property stored in the vault is defined via the + * properties filename supplied at construction time. + * + * @return + * A GuacamoleProperties instance which automatically reads property + * values from the vault. + * + * @throws GuacamoleException + * If the properties file containing the property/secret mappings + * exists but cannot be read. + */ + public GuacamoleProperties getProperties() throws GuacamoleException { + + // Use empty properties if file cannot be found + File propFile = new File(environment.getGuacamoleHome(), propertiesFilename); + if (!propFile.exists()) + return new PropertiesGuacamoleProperties(new Properties()); + + // Automatically pull properties from vault + return new FileGuacamoleProperties(propFile) { + + @Override + public String getProperty(String name) throws GuacamoleException { + try { + + String secretName = super.getProperty(name); + if (secretName == null) + return null; + + return secretService.getValue(secretName).get(); + + } + catch (InterruptedException | ExecutionException e) { + + if (e.getCause() instanceof GuacamoleException) + throw (GuacamoleException) e; + + throw new GuacamoleServerException(String.format("Property " + + "\"%s\" could not be retrieved from the vault.", name), e); + } + } + + }; + + } + + /** + * Return whether Windows domains should be split out from usernames when + * fetched from the vault. + * + * For example: "DOMAIN\\user" or "user@DOMAIN" should both + * be split into seperate username and domain tokens if this configuration + * is true. If false, no domain token should be created and the above values + * should be stored directly in the username token. + * + * @return + * true if windows domains should be split out from usernames, false + * otherwise. + * + * @throws GuacamoleException + * If the value specified within guacamole.properties cannot be + * parsed. + */ + public abstract boolean getSplitWindowsUsernames() throws GuacamoleException; + + /** + * Return whether domains should be considered when matching user records + * that are fetched from the vault. + * + * If set to true, the username and domain must both match when matching + * records from the vault. If false, only the username will be considered. + * + * @return + * true if both the username and domain should be considered when + * matching user records from the vault. + * + * @throws GuacamoleException + * If the value specified within guacamole.properties cannot be + * parsed. + */ + public abstract boolean getMatchUserRecordsByDomain() throws GuacamoleException; + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/CachedVaultSecretService.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/CachedVaultSecretService.java new file mode 100644 index 0000000..b26fdba --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/CachedVaultSecretService.java @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.secret; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Caching implementation of VaultSecretService. Requests for the values of + * secrets will automatically be cached for a duration determined by the + * implementation. Subclasses must implement refreshCachedSecret() to provide + * a mechanism for CachedVaultSecretService to explicitly retrieve a value + * which is missing from the cache or has expired. + */ +public abstract class CachedVaultSecretService implements VaultSecretService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(CachedVaultSecretService.class); + + /** + * The cached value of a secret. + */ + protected class CachedSecret { + + /** + * A Future which contains or will contain the value of the secret at + * the time it was last retrieved. + */ + private final Future value; + + /** + * The time the value should be considered out-of-date, in milliseconds + * since midnight of January 1, 1970 UTC. + */ + private final long expires; + + /** + * Creates a new CachedSecret which represents a cached snapshot of the + * value of a secret. Each CachedSecret has a limited lifespan after + * which it should be considered out-of-date. + * + * @param value + * A Future which contains or will contain the current value of the + * secret. If no such secret exists, the given Future should + * complete with null. + * + * @param ttl + * The maximum number of milliseconds that this value should be + * cached. + */ + public CachedSecret(Future value, int ttl) { + this.value = value; + this.expires = System.currentTimeMillis() + ttl; + } + + /** + * Returns the value of the secret at the time it was last retrieved. + * The actual value of the secret may have changed. + * + * @return + * A Future which will eventually complete with the value of the + * secret at the time it was last retrieved. If no such secret + * exists, the Future will be completed with null. If an error + * occurs which prevents retrieval of the secret, that error will + * be exposed through an ExecutionException when an attempt is made + * to retrieve the value from the Future. + */ + public Future getValue() { + return value; + } + + /** + * Returns whether this specific cached value has expired. Expired + * values will be automatically refreshed by CachedVaultSecretService. + * + * @return + * true if this cached value has expired, false otherwise. + */ + public boolean isExpired() { + return System.currentTimeMillis() >= expires; + } + + } + + /** + * Cache of past requests to retrieve secrets. Expired secrets are lazily + * removed. + */ + private final ConcurrentHashMap> cache = new ConcurrentHashMap<>(); + + /** + * Explicitly retrieves the value of the secret having the given name, + * returning a result that can be cached. The length of time that this + * specific value will be cached is determined by the TTL value provided to + * the returned CachedSecret. This function will be automatically invoked + * in response to calls to getValue() when the requested secret is either + * not cached or has expired. Expired secrets are not removed from the + * cache until another request is made for that secret. + * + * @param name + * The name of the secret to retrieve. + * + * @return + * A CachedSecret which defines the current value of the secret and the + * point in time that value should be considered potentially + * out-of-date. + * + * @throws GuacamoleException + * If an error occurs while retrieving the secret from the vault. + */ + protected abstract CachedSecret refreshCachedSecret(String name) + throws GuacamoleException; + + @Override + public Future getValue(String name) throws GuacamoleException { + + CompletableFuture refreshEntry; + + try { + + // Attempt to use cached result of previous call + Future cachedEntry = cache.get(name); + if (cachedEntry != null) { + + // Use cached result if not yet expired + CachedSecret secret = cachedEntry.get(); + if (!secret.isExpired()) { + logger.debug("Using cached secret for \"{}\".", name); + return secret.getValue(); + } + + // Evict if expired + else { + logger.debug("Cached secret for \"{}\" is expired.", name); + cache.remove(name, cachedEntry); + } + + } + + // If no cached result, or result is too old, race with other + // threads to be the thread which refreshes the entry + refreshEntry = new CompletableFuture<>(); + cachedEntry = cache.putIfAbsent(name, refreshEntry); + + // If a refresh operation is already in progress, wait for that + // operation to complete and use its value + if (cachedEntry != null) + return cachedEntry.get().getValue(); + + } + catch (InterruptedException | ExecutionException e) { + throw new GuacamoleServerException("Attempt to retrieve secret " + + "failed.", e); + } + + // If we reach this far, the cache entry is stale or missing, and it's + // this thread's responsibility to refresh the entry + try { + CachedSecret secret = refreshCachedSecret(name); + refreshEntry.complete(secret); + logger.debug("Cached secret for \"{}\" will be refreshed.", name); + return secret.getValue(); + } + + // Abort the refresh operation if an error occurs + catch (Error | RuntimeException | GuacamoleException e) { + refreshEntry.completeExceptionally(e); + cache.remove(name, refreshEntry); + logger.debug("Cached secret for \"{}\" could not be refreshed.", name); + throw e; + } + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/VaultSecretService.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/VaultSecretService.java new file mode 100644 index 0000000..81204be --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/VaultSecretService.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.secret; + +import java.util.Map; +import java.util.concurrent.Future; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Connectable; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.token.TokenFilter; + +/** + * Generic service for retrieving the value of a secret stored in a vault. + */ +public interface VaultSecretService { + + /** + * Translates an arbitrary string, which may contain characters not allowed + * by the vault implementation, into a string which is valid within a + * secret name. The type of transformation performed on the string, if any, + * will depend on the specific requirements of the vault provider. + * + * NOTE: It is critical that this transformation is deterministic and + * reasonably predictable for users. If an implementation must apply a + * transformation to secret names, that transformation needs to be + * documented. + * + * @param nameComponent + * An arbitrary string intended for use within a secret name, but which + * may contain characters not allowed by the vault implementation. + * + * @return + * A string containing essentially the same content as the provided + * string, but transformed deterministically such that it is acceptable + * as a component of a secret name by the vault provider. + */ + String canonicalize(String nameComponent); + + /** + * Returns a Future which eventually completes with the value of the secret + * having the given name. If no such secret exists, the Future will be + * completed with null. The secrets retrieved from this method are independent + * of the context of the particular connection being established, or any + * associated user context. + * + * @param name + * The name of the secret to retrieve. + * + * @return + * A Future which completes with value of the secret having the given + * name. If no such secret exists, the Future will be completed with + * null. If an error occurs asynchronously which prevents retrieval of + * the secret, that error will be exposed through an ExecutionException + * when an attempt is made to retrieve the value from the Future. + * + * @throws GuacamoleException + * If the secret cannot be retrieved due to an error. + */ + Future getValue(String name) throws GuacamoleException; + + /** + * Returns a Future which eventually completes with the value of the secret + * having the given name. If no such secret exists, the Future will be + * completed with null. The connection or connection group, as well as the + * user context associated with the request are provided for additional context. + * + * @param userContext + * The user context associated with the connection or connection group for + * which the secret is being retrieved. + * + * @param connectable + * The connection or connection group for which the secret is being retrieved. + * + * @param name + * The name of the secret to retrieve. + * + * @return + * A Future which completes with value of the secret having the given + * name. If no such secret exists, the Future will be completed with + * null. If an error occurs asynchronously which prevents retrieval of + * the secret, that error will be exposed through an ExecutionException + * when an attempt is made to retrieve the value from the Future. + * + * @throws GuacamoleException + * If the secret cannot be retrieved due to an error. + */ + Future getValue(UserContext userContext, Connectable connectable, + String name) throws GuacamoleException; + + /** + * Returns a map of token names to corresponding Futures which eventually + * complete with the value of that token, where each token is dynamically + * defined based on connection parameters. If a vault implementation allows + * for predictable secrets based on the parameters of a connection, this + * function should be implemented to provide automatic tokens for those + * secrets and remove the need for manual mapping via YAML. + * + * @param userContext + * The user context from which the connectable originated. + * + * @param connectable + * The connection or connection group for which the tokens are being replaced. + * + * @param config + * The configuration of the Guacamole connection for which tokens are + * being generated. This configuration may be empty or partial, + * depending on the underlying implementation. + * + * @param filter + * A TokenFilter instance that applies any tokens already available to + * be applied to the configuration of the Guacamole connection. These + * tokens will consist of tokens already supplied to connect(). + * + * @return + * A map of token names to their corresponding future values, where + * each token and value may be dynamically determined based on the + * connection configuration. + * + * @throws GuacamoleException + * If an error occurs producing the tokens and values required for the + * given configuration. + */ + Map> getTokens(UserContext userContext, Connectable connectable, + GuacamoleConfiguration config, TokenFilter filter) throws GuacamoleException; + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/WindowsUsername.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/WindowsUsername.java new file mode 100644 index 0000000..36d8a1b --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/secret/WindowsUsername.java @@ -0,0 +1,157 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.secret; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.Nonnull; + +/** + * A class representing a Windows username, which may optionally also include + * a domain. This class can be used to parse the username and domain out of a + * username from a vault. + */ +public class WindowsUsername { + + /** + * A pattern for matching a down-level logon name containing a Windows + * domain and username - e.g. domain\\user. For more information, see + * https://docs.microsoft.com/en-us/windows/win32/secauthn/user-name-formats#down-level-logon-name + */ + private static final Pattern DOWN_LEVEL_LOGON_NAME_PATTERN = Pattern.compile( + "(?[^@\\\\]+)\\\\(?[^@\\\\]+)"); + + /** + * A pattern for matching a user principal name containing a Windows + * domain and username - e.g. user@domain. For more information, see + * https://docs.microsoft.com/en-us/windows/win32/secauthn/user-name-formats#user-principal-name + */ + private static final Pattern USER_PRINCIPAL_NAME_PATTERN = Pattern.compile( + "(?[^@\\\\]+)@(?[^@\\\\]+)"); + + /** + * The username associated with the potential Windows domain/username + * value. If no domain is found, the username field will contain the + * entire value as read from the vault. + */ + private final String username; + + /** + * The dinaun associated with the potential Windows domain/username + * value. If no domain is found, this will be null. + */ + private final String domain; + + /** + * Create a WindowsUsername record with no associated domain. + * + * @param username + * The username, which should be the entire value as extracted + * from the vault. + */ + private WindowsUsername(@Nonnull String username) { + this.username = username; + this.domain = null; + } + + /** + * Create a WindowsUsername record with a username and a domain. + * + * @param username + * The username portion of the field value from the vault. + * + * @param domain + * The domain portion of the field value from the vault. + */ + private WindowsUsername( + @Nonnull String username, @Nonnull String domain) { + this.username = username; + this.domain = domain; + } + + /** + * Return the value of the username as extracted from the vault field. + * If the domain is null, this will be the entire field value. + * + * @return + * The username value as extracted from the vault field. + */ + public String getUsername() { + return username; + } + + /** + * Return the value of the domain as extracted from the vault field. + * If this is null, it means that no domain was found in the vault field. + * + * @return + * The domain value as extracted from the vault field. + */ + public String getDomain() { + return domain; + } + + /** + * Return true if a domain was found in the vault field, false otherwise. + * + * @return + * true if a domain was found in the vault field, false otherwise. + */ + public boolean hasDomain() { + return this.domain != null; + } + + /** + * Strip off a Windows domain from the provided username, if one is + * present. For example: "DOMAIN\\user" or "user@DOMAIN" will both + * be stripped to just "user". Note: neither the '@' or '\\' characters + * are valid in Windows usernames. + * + * @param vaultField + * The raw field value as retrieved from the vault. This might contain + * a Windows domain. + * + * @return + * The provided username with the Windows domain stripped off, if one + * is present. + */ + public static WindowsUsername splitWindowsUsernameFromDomain(String vaultField) { + + // If it's the down-level logon format, return the extracted username and domain + Matcher downLevelLogonMatcher = DOWN_LEVEL_LOGON_NAME_PATTERN.matcher(vaultField); + if (downLevelLogonMatcher.matches()) + return new WindowsUsername( + downLevelLogonMatcher.group("username"), + downLevelLogonMatcher.group("domain")); + + // If it's the user principal format, return the extracted username and domain + Matcher userPrincipalMatcher = USER_PRINCIPAL_NAME_PATTERN.matcher(vaultField); + if (userPrincipalMatcher.matches()) + return new WindowsUsername( + userPrincipalMatcher.group("username"), + userPrincipalMatcher.group("domain")); + + // If none of the expected formats matched, return the username with do domain + return new WindowsUsername(vaultField); + + } + +} \ No newline at end of file diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultDirectoryService.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultDirectoryService.java new file mode 100644 index 0000000..700d9d3 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultDirectoryService.java @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.user; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserGroup; + +/** + * A service that allows a vault implementation to override the directory + * for any entity that a user context may return. + */ +public abstract class VaultDirectoryService { + + /** + * Given an existing User Directory, return a new Directory for + * this vault implementation. + * + * @return + * A new User Directory based on the provided Directory. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + public Directory getUserDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // By default, the provided directly will be returned unchanged + return underlyingDirectory; + } + + /** + * Given an existing UserGroup Directory, return a new Directory for + * this vault implementation. + * + * @return + * A new UserGroup Directory based on the provided Directory. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + public Directory getUserGroupDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // Unless overriden in the vault implementation, the underlying directory + // will be returned directly + return underlyingDirectory; + } + + /** + * Given an existing Connection Directory, return a new Directory for + * this vault implementation. + * + * @return + * A new Connection Directory based on the provided Directory. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + public Directory getConnectionDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // By default, the provided directly will be returned unchanged + return underlyingDirectory; + } + + /** + * Given an existing ConnectionGroup Directory, return a new Directory for + * this vault implementation. + * + * @return + * A new ConnectionGroup Directory based on the provided Directory. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + public Directory getConnectionGroupDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // By default, the provided directly will be returned unchanged + return underlyingDirectory; + } + + /** + * Given an existing ActiveConnection Directory, return a new Directory for + * this vault implementation. + * + * @return + * A new ActiveConnection Directory based on the provided Directory. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + public Directory getActiveConnectionDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // By default, the provided directly will be returned unchanged + return underlyingDirectory; + } + + /** + * Given an existing SharingProfile Directory, return a new Directory for + * this vault implementation. + * + * @return + * A new SharingProfile Directory based on the provided Directory. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + public Directory getSharingProfileDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // By default, the provided directly will be returned unchanged + return underlyingDirectory; + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultUserContext.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultUserContext.java new file mode 100644 index 0000000..eeddbe8 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultUserContext.java @@ -0,0 +1,528 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.user; + +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.Connectable; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.TokenInjectingUserContext; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.token.GuacamoleTokenUndefinedException; +import org.apache.guacamole.token.TokenFilter; +import org.apache.guacamole.vault.conf.VaultAttributeService; +import org.apache.guacamole.vault.conf.VaultConfigurationService; +import org.apache.guacamole.vault.secret.VaultSecretService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * UserContext implementation which automatically injects tokens containing the + * values of secrets retrieved from a vault. + */ +public class VaultUserContext extends TokenInjectingUserContext { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(VaultUserContext.class); + + /** + * The name of the token which will be replaced with the username of the + * current user if specified within the name of a secret. Unlike the + * standard GUAC_USERNAME token, the username stored with the object + * representing the user is used here, not necessarily the username + * provided during authentication. This token applies to both connections + * and connection groups. + */ + private static final String USERNAME_TOKEN = "USERNAME"; + + /** + * The name of the token which will be replaced with the name of the + * current connection group if specified within the name of a secret. This + * token only applies only to connection groups. + */ + private static final String CONNECTION_GROUP_NAME_TOKEN = "CONNECTION_GROUP_NAME"; + + /** + * The name of the token which will be replaced with the identifier of the + * current connection group if specified within the name of a secret. This + * token only applies only to connection groups. + */ + private static final String CONNECTION_GROUP_IDENTIFIER_TOKEN = "CONNECTION_GROUP_ID"; + + /** + * The name of the token which will be replaced with the \"hostname\" + * connection parameter of the current connection if specified within the + * name of a secret. If the \"hostname\" parameter cannot be retrieved, or + * if the parameter is blank, the token will not be replaced and any + * secrets involving that token will not be retrieved. This token only + * applies only to connections. + */ + private static final String CONNECTION_HOSTNAME_TOKEN = "CONNECTION_HOSTNAME"; + + /** + * The name of the token which will be replaced with the \"username\" + * connection parameter of the current connection if specified within the + * name of a secret. If the \"username\" parameter cannot be retrieved, or + * if the parameter is blank, the token will not be replaced and any + * secrets involving that token will not be retrieved. This token only + * applies only to connections. + */ + private static final String CONNECTION_USERNAME_TOKEN = "CONNECTION_USERNAME"; + + /** + * The name of the token which will be replaced with the name of the + * current connection if specified within the name of a secret. This token + * only applies only to connections. + */ + private static final String CONNECTION_NAME_TOKEN = "CONNECTION_NAME"; + + /** + * The name of the token which will be replaced with the identifier of the + * current connection if specified within the name of a secret. This token + * only applies only to connections. + */ + private static final String CONNECTION_IDENTIFIER_TOKEN = "CONNECTION_ID"; + + /** + * Service for retrieving configuration information. + */ + @Inject + private VaultConfigurationService confService; + + /** + * Service for retrieving the values of secrets stored in a vault. + */ + @Inject + private VaultSecretService secretService; + + /** + * Service for retrieving any custom attributes defined for the + * current vault implementation. + */ + @Inject + private VaultAttributeService attributeService; + + /** + * Service for modifying any underlying directories for the current + * vault implementation. + */ + @Inject + private VaultDirectoryService directoryService; + + /** + * Creates a new VaultUserContext which automatically injects tokens + * containing values of secrets retrieved from a vault. The given + * UserContext is decorated such that connections and connection groups + * will receive additional tokens during the connection process. + * + * Note that this class depends on concrete implementations of the + * following classes to be provided via dependency injection: + * + * - VaultConfigurationService + * - VaultSecretService + * + * Bindings providing these concrete implementations will need to be + * provided by subclasses of VaultAuthenticationProviderModule for each + * supported vault. + * + * @param userContext + * The UserContext instance to decorate. + */ + @AssistedInject + public VaultUserContext(@Assisted UserContext userContext) { + super(userContext); + } + + /** + * Creates a new TokenFilter instance with token values set for all tokens + * which are not specific to connections or connection groups. Currently, + * this is only the vault-specific username token ("USERNAME"). Each token + * stored within the returned TokenFilter via setToken() will be + * automatically canonicalized for use within secret names. + * + * @return + * A new TokenFilter instance with token values set for all tokens + * which are not specific to connections or connection groups. + */ + private TokenFilter createFilter() { + + // Create filter that automatically canonicalizes all token values + TokenFilter filter = new TokenFilter() { + + @Override + public void setToken(String name, String value) { + super.setToken(name, secretService.canonicalize(value)); + } + + @Override + public void setTokens(Map tokens) { + tokens.entrySet().forEach((entry) -> setToken(entry.getKey(), entry.getValue())); + } + + }; + + filter.setToken(USERNAME_TOKEN, self().getIdentifier()); + return filter; + } + + /** + * Initiates asynchronous retrieval of all applicable tokens and + * corresponding values from the vault, using the given TokenFilter to + * filter tokens within the secret names prior to retrieving those secrets. + * + * @param connectable + * The connection or connection group to which the connection is being + * established. + * + * @param tokenMapping + * The mapping dictating the name of the secret which maps to each + * parameter token, where the key is the name of the parameter token + * and the value is the name of the secret. The name of the secret + * may contain its own tokens, which will be substituted using values + * from the given filter. + * + * @param secretNameFilter + * The filter to use to substitute values for tokens in the names of + * secrets to be retrieved from the vault. + * + * @param config + * The GuacamoleConfiguration of the connection for which tokens are + * being retrieved, if available. This may be null. + * + * @param configFilter + * A TokenFilter instance that applies any tokens already available to + * be applied to the configuration of the Guacamole connection. These + * tokens will consist of tokens already supplied to connect(). + * + * @return + * A Map of token name to Future, where each Future represents the + * pending retrieval operation which will ultimately be completed with + * the value of all secrets mapped to that token. + * + * @throws GuacamoleException + * If the value for any applicable secret cannot be retrieved from the + * vault due to an error. + */ + private Map> getTokens( + Connectable connectable, Map tokenMapping, + TokenFilter secretNameFilter, GuacamoleConfiguration config, + TokenFilter configFilter) throws GuacamoleException { + + // Populate map with pending secret retrieval operations corresponding + // to each mapped token + Map> pendingTokens = new HashMap<>(tokenMapping.size()); + for (Map.Entry entry : tokenMapping.entrySet()) { + + // Translate secret pattern into secret name, ignoring any + // secrets which cannot be translated + String secretName; + try { + secretName = secretNameFilter.filterStrict(entry.getValue()); + } + catch (GuacamoleTokenUndefinedException e) { + logger.debug("Secret for token \"{}\" will not be retrieved. " + + "Token \"{}\" within mapped secret name has no " + + "defined value in the current context.", + entry.getKey(), e.getTokenName()); + continue; + } + + // Initiate asynchronous retrieval of the token value + String tokenName = entry.getKey(); + Future secret = secretService.getValue( + this, connectable, secretName); + pendingTokens.put(tokenName, secret); + + } + + // Additionally include any dynamic, parameter-based tokens + pendingTokens.putAll(secretService.getTokens( + this, connectable, config, configFilter)); + + return pendingTokens; + + } + + /** + * Waits for all pending secret retrieval operations to complete, + * transforming each Future within the given Map into its contained String + * value. + * + * @param pendingTokens + * A Map of token name to Future, where each Future represents the + * pending retrieval operation which will ultimately be completed with + * the value of all secrets mapped to that token. + * + * @return + * A Map of token name to the corresponding String value retrieved for + * that token from the vault. + * + * @throws GuacamoleException + * If the value for any applicable secret cannot be retrieved from the + * vault due to an error. + */ + private Map resolve(Map> pendingTokens) throws GuacamoleException { + + // Populate map with tokens containing the values of their + // corresponding secrets + Map tokens = new HashMap<>(pendingTokens.size()); + for (Map.Entry> entry : pendingTokens.entrySet()) { + + // Complete secret retrieval operation, blocking if necessary + String secretValue; + try { + secretValue = entry.getValue().get(); + } + catch (InterruptedException | ExecutionException e) { + throw new GuacamoleServerException("Retrieval of secret value " + + "failed.", e); + } + + // If a value is defined for the secret in question, store that + // value under the mapped token + String tokenName = entry.getKey(); + if (secretValue != null) { + tokens.put(tokenName, secretValue); + logger.debug("Token \"{}\" populated with value from " + + "secret.", tokenName); + } + else + logger.debug("Token \"{}\" not populated. Mapped " + + "secret has no value.", tokenName); + + } + + return tokens; + + } + + @Override + protected void addTokens(ConnectionGroup connectionGroup, + Map tokens) throws GuacamoleException { + + String name = connectionGroup.getName(); + String identifier = connectionGroup.getIdentifier(); + logger.debug("Injecting tokens from vault for connection group " + + "\"{}\" (\"{}\").", identifier, name); + + // Add general and connection-group-specific tokens + TokenFilter filter = createFilter(); + filter.setToken(CONNECTION_GROUP_NAME_TOKEN, name); + filter.setToken(CONNECTION_GROUP_IDENTIFIER_TOKEN, identifier); + + // Substitute tokens producing secret names, retrieving and storing + // those secrets as parameter tokens + tokens.putAll(resolve(getTokens( + connectionGroup, confService.getTokenMapping(), filter, + null, new TokenFilter(tokens)))); + + } + + /** + * Retrieves the GuacamoleConfiguration of the given Connection. If + * possible, privileged access to the configuration is obtained first. Note + * that the underlying extension is not required to allow privileged + * access, nor is it required to expose the underlying configuration at + * all. + * + * @param connection + * The connection to retrieve the configuration from. + * + * @return + * The GuacamoleConfiguration associated with the given connection, + * which may be partial or empty. + * + * @throws GuacamoleException + * If an error prevents privileged retrieval of the configuration. + */ + private GuacamoleConfiguration getConnectionConfiguration(Connection connection) + throws GuacamoleException { + + String identifier = connection.getIdentifier(); + + // Obtain privileged access to parameters if possible (note that the + // UserContext returned by getPrivileged() is not guaranteed to + // actually be privileged) + Connection privilegedConnection = getPrivileged().getConnectionDirectory().get(identifier); + if (privilegedConnection != null) + return privilegedConnection.getConfiguration(); + + // Fall back to unprivileged access if not implemented/allowed by + // extension + return connection.getConfiguration(); + + } + + @Override + protected void addTokens(Connection connection, Map tokens) + throws GuacamoleException { + + String name = connection.getName(); + String identifier = connection.getIdentifier(); + logger.debug("Injecting tokens from vault for connection \"{}\" " + + "(\"{}\").", identifier, name); + + // Add general and connection-specific tokens + TokenFilter filter = createFilter(); + filter.setToken(CONNECTION_NAME_TOKEN, connection.getName()); + filter.setToken(CONNECTION_IDENTIFIER_TOKEN, identifier); + // Add hostname and username tokens if available (implementations are + // not required to expose connection configuration details) + + GuacamoleConfiguration config = getConnectionConfiguration(connection); + Map parameters = config.getParameters(); + + String hostname = parameters.get("hostname"); + if (hostname != null && !hostname.isEmpty()) + filter.setToken(CONNECTION_HOSTNAME_TOKEN, hostname); + else + logger.debug("Hostname for connection \"{}\" (\"{}\") not " + + "available. \"{}\" token will not be populated in " + + "secret names.", identifier, name, + CONNECTION_HOSTNAME_TOKEN); + + String username = parameters.get("username"); + if (username != null && !username.isEmpty()) + filter.setToken(CONNECTION_USERNAME_TOKEN, username); + else + logger.debug("Username for connection \"{}\" (\"{}\") not " + + "available. \"{}\" token will not be populated in " + + "secret names.", identifier, name, + CONNECTION_USERNAME_TOKEN); + + // Substitute tokens producing secret names, retrieving and storing + // those secrets as parameter tokens + tokens.putAll(resolve(getTokens(connection, confService.getTokenMapping(), + filter, config, new TokenFilter(tokens)))); + + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + + // Defer to the vault-specific directory service + return directoryService.getUserDirectory(super.getUserDirectory()); + } + + @Override + public Directory getUserGroupDirectory() throws GuacamoleException { + + // Defer to the vault-specific directory service + return directoryService.getUserGroupDirectory(super.getUserGroupDirectory()); + } + + @Override + public Directory getConnectionDirectory() throws GuacamoleException { + + // Defer to the vault-specific directory service + return directoryService.getConnectionDirectory(super.getConnectionDirectory()); + } + + @Override + public Directory getConnectionGroupDirectory() throws GuacamoleException { + + // Defer to the vault-specific directory service + return directoryService.getConnectionGroupDirectory(super.getConnectionGroupDirectory()); + } + + @Override + public Directory getActiveConnectionDirectory() throws GuacamoleException { + + // Defer to the vault-specific directory service + return directoryService.getActiveConnectionDirectory(super.getActiveConnectionDirectory()); + } + + @Override + public Directory getSharingProfileDirectory() throws GuacamoleException { + + // Defer to the vault-specific directory service + return directoryService.getSharingProfileDirectory(super.getSharingProfileDirectory()); + + } + + @Override + public Collection getUserAttributes() { + + // Add any custom attributes to any previously defined attributes + return Collections.unmodifiableCollection(Stream.concat( + super.getUserAttributes().stream(), + attributeService.getUserAttributes().stream() + ).collect(Collectors.toList())); + + } + + @Override + public Collection getUserPreferenceAttributes() { + + // Add any custom preference attributes to any previously defined attributes + return Collections.unmodifiableCollection(Stream.concat( + super.getUserPreferenceAttributes().stream(), + attributeService.getUserPreferenceAttributes().stream() + ).collect(Collectors.toList())); + + } + + @Override + public Collection getConnectionAttributes() { + + // Add any custom attributes to any previously defined attributes + return Collections.unmodifiableCollection(Stream.concat( + super.getConnectionAttributes().stream(), + attributeService.getConnectionAttributes().stream() + ).collect(Collectors.toList())); + + } + + @Override + public Collection getConnectionGroupAttributes() { + + // Add any custom attributes to any previously defined attributes + return Collections.unmodifiableCollection(Stream.concat( + super.getConnectionGroupAttributes().stream(), + attributeService.getConnectionGroupAttributes().stream() + ).collect(Collectors.toList())); + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultUserContextFactory.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultUserContextFactory.java new file mode 100644 index 0000000..03e6c3a --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/java/org/apache/guacamole/vault/user/VaultUserContextFactory.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.user; + +import org.apache.guacamole.net.auth.UserContext; + +/** + * Factory for creating UserContext instances which automatically inject tokens + * containing the values of secrets retrieved from a vault. + */ +public interface VaultUserContextFactory { + + /** + * Returns a new instance of a UserContext implementation which + * automatically injects tokens containing values of secrets retrieved from + * a vault. The given UserContext is decorated such that connections and + * connection groups will receive additional tokens during the connection + * process. + * + * @param userContext + * The UserContext instance to decorate. + * + * @return + * A new UserContext instance which automatically injects tokens + * containing values of secrets retrieved from a vault. + */ + UserContext create(UserContext userContext); + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/resources/translations/en.json b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/resources/translations/en.json new file mode 100644 index 0000000..c96ec28 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/main/resources/translations/en.json @@ -0,0 +1,7 @@ +{ + + "DATA_SOURCE_AZURE_KEYVAULT" : { + "NAME" : "Azure Key Vault" + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-base/src/test/java/org/apache/guacamole/vault/secret/WindowsUsernameTest.java b/extensions/guacamole-vault/modules/guacamole-vault-base/src/test/java/org/apache/guacamole/vault/secret/WindowsUsernameTest.java new file mode 100644 index 0000000..61f4546 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-base/src/test/java/org/apache/guacamole/vault/secret/WindowsUsernameTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.secret; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.List; + +/** + * Class to test the parsing functionality of the WindowsUsername class. + */ +public class WindowsUsernameTest { + + /** + * Verify that the splitWindowsUsernameFromDomain() method correctly strips Windows + * domains from provided usernames that include them, and does not modify + * usernames that do not have Windows domains. + */ + @Test + public void testSplitWindowsUsernameFromDomain() { + + WindowsUsername usernameAndDomain; + + // If no Windows domain is present in the provided field, the username should + // contain the entire field, and no domain should be returned + usernameAndDomain = WindowsUsername.splitWindowsUsernameFromDomain("bob"); + assertEquals(usernameAndDomain.getUsername(), "bob"); + assertFalse(usernameAndDomain.hasDomain()); + + // It should parse down-level logon name style domains + usernameAndDomain = WindowsUsername.splitWindowsUsernameFromDomain("localhost\\bob"); + assertEquals("bob", usernameAndDomain.getUsername(), "bob"); + assertTrue(usernameAndDomain.hasDomain()); + assertEquals("localhost", usernameAndDomain.getDomain()); + + // It should parse user principal name style domains + usernameAndDomain = WindowsUsername.splitWindowsUsernameFromDomain("bob@localhost"); + assertEquals("bob", usernameAndDomain.getUsername(), "bob"); + assertTrue(usernameAndDomain.hasDomain()); + assertEquals("localhost", usernameAndDomain.getDomain()); + + // It should not match if there are an invalid number of separators + List invalidSeparators = Arrays.asList( + "bob@local@host", "local\\host\\bob", + "bob\\local@host", "local@host\\bob"); + invalidSeparators.stream().forEach( + invalidSeparator -> { + + // An invalid number of separators means that the parse failed - + // there should be no detected domain, and the entire field value + // should be returned as the username + WindowsUsername parseOutput = + WindowsUsername.splitWindowsUsernameFromDomain(invalidSeparator); + assertFalse(parseOutput.hasDomain()); + assertEquals(invalidSeparator, parseOutput.getUsername()); + + }); + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-dist/.ratignore b/extensions/guacamole-vault/modules/guacamole-vault-dist/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-vault/modules/guacamole-vault-dist/pom.xml b/extensions/guacamole-vault/modules/guacamole-vault-dist/pom.xml new file mode 100644 index 0000000..4c4a518 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-dist/pom.xml @@ -0,0 +1,62 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-vault-dist + pom + guacamole-vault-dist + http://guacamole.apache.org/ + + + UTF-8 + + + + org.apache.guacamole + guacamole-vault + 1.6.0 + ../../ + + + + + + + org.apache.guacamole + guacamole-vault-ksm + 1.6.0 + + + + + + + + ${project.parent.artifactId}-${project.parent.version} + + + + diff --git a/extensions/guacamole-vault/modules/guacamole-vault-dist/src/main/assembly/dist.xml b/extensions/guacamole-vault/modules/guacamole-vault-dist/src/main/assembly/dist.xml new file mode 100644 index 0000000..6f41e52 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-dist/src/main/assembly/dist.xml @@ -0,0 +1,54 @@ + + + + + dist + ${project.parent.artifactId}-${project.parent.version} + + + + tar.gz + + + + + + + + ksm + + org.apache.guacamole:guacamole-vault-ksm + + + + + + + + + + target/licenses + + + + diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/.ratignore b/extensions/guacamole-vault/modules/guacamole-vault-ksm/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/pom.xml b/extensions/guacamole-vault/modules/guacamole-vault-ksm/pom.xml new file mode 100644 index 0000000..1eb1fd6 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/pom.xml @@ -0,0 +1,114 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-vault-ksm + jar + 1.6.0 + guacamole-vault-ksm + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-vault + 1.6.0 + ../../ + + + + 1.9.25 + + + + + + + org.apache.guacamole + guacamole-ext + provided + + + + + org.apache.guacamole + guacamole-vault-base + 1.6.0 + + + + com.keepersecurity.secrets-manager + core + 17.0.0 + + + + + org.jetbrains.kotlin + kotlin-reflect + + + org.jetbrains.kotlin + kotlin-stdlib + + + org.jetbrains.kotlin + kotlin-stdlib-common + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + + + + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + + + org.bouncycastle + bc-fips + 2.1.0 + + + + + diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/GuacamoleExceptionSupplier.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/GuacamoleExceptionSupplier.java new file mode 100644 index 0000000..c996137 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/GuacamoleExceptionSupplier.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm; + +import org.apache.guacamole.GuacamoleException; + +/** + * A class that is basically equivalent to the standard Supplier class in + * Java, except that the get() function can throw GuacamoleException, which + * is impossible with any of the standard Java lambda type classes, since + * none of them can handle checked exceptions + * + * @param + * The type of object which will be returned as a result of calling + * get(). + */ +public interface GuacamoleExceptionSupplier { + + /** + * Returns a value of the declared type. + * + * @return + * A value of the declared type. + * + * @throws GuacamoleException + * If an error occurs while attemping to calculate the return value. + */ + public T get() throws GuacamoleException; + +} \ No newline at end of file diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/KsmAuthenticationProvider.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/KsmAuthenticationProvider.java new file mode 100644 index 0000000..a24dfc8 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/KsmAuthenticationProvider.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.vault.VaultAuthenticationProvider; + +/** + * VaultAuthenticationProvider implementation which reads secrets from Keeper + * Secrets Manager + */ +public class KsmAuthenticationProvider extends VaultAuthenticationProvider { + + /** + * Creates a new KsmKeyVaultAuthenticationProvider which reads secrets + * from a configured Keeper Secrets Manager. + * + * @throws GuacamoleException + * If configuration details cannot be read from guacamole.properties. + */ + public KsmAuthenticationProvider() throws GuacamoleException { + super(new KsmAuthenticationProviderModule()); + } + + @Override + public String getIdentifier() { + return "keeper-secrets-manager"; + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/KsmAuthenticationProviderModule.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/KsmAuthenticationProviderModule.java new file mode 100644 index 0000000..caf8cd5 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/KsmAuthenticationProviderModule.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm; + +import java.security.Security; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.vault.VaultAuthenticationProviderModule; +import org.apache.guacamole.vault.ksm.conf.KsmAttributeService; +import org.apache.guacamole.vault.ksm.conf.KsmConfigurationService; +import org.apache.guacamole.vault.ksm.secret.KsmSecretService; +import org.apache.guacamole.vault.ksm.user.KsmConnectionGroup; +import org.apache.guacamole.vault.ksm.user.KsmDirectoryService; +import org.apache.guacamole.vault.ksm.user.KsmUserFactory; +import org.apache.guacamole.vault.ksm.user.KsmUser; +import org.apache.guacamole.vault.conf.VaultAttributeService; +import org.apache.guacamole.vault.conf.VaultConfigurationService; +import org.apache.guacamole.vault.ksm.secret.KsmClient; +import org.apache.guacamole.vault.ksm.secret.KsmClientFactory; +import org.apache.guacamole.vault.ksm.secret.KsmRecordService; +import org.apache.guacamole.vault.secret.VaultSecretService; +import org.apache.guacamole.vault.user.VaultDirectoryService; + +import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider; + +import com.google.inject.assistedinject.FactoryModuleBuilder; + +/** + * Guice module which configures injections specific to Keeper Secrets + * Manager support. + */ +public class KsmAuthenticationProviderModule + extends VaultAuthenticationProviderModule { + + /** + * Creates a new KsmAuthenticationProviderModule which + * configures dependency injection for the Keeper Secrets Manager + * authentication provider and related services. + * + * @throws GuacamoleException + * If configuration details in guacamole.properties cannot be parsed. + */ + public KsmAuthenticationProviderModule() throws GuacamoleException { + // KSM recommends using BouncyCastleFipsProvider to avoid potential + // issues (for example with FIPS enabled RHEL). + // https://docs.keeper.io/en/secrets-manager/secrets-manager/developer-sdk-library/java-sdk + // The addProvider method checks for duplications internally, + // so it is safe to add the same provider multiple times. + Security.addProvider(new BouncyCastleFipsProvider()); + } + + @Override + protected void configureVault() { + + // Bind services specific to Keeper Secrets Manager + bind(KsmRecordService.class); + bind(KsmAttributeService.class); + bind(VaultAttributeService.class).to(KsmAttributeService.class); + bind(VaultConfigurationService.class).to(KsmConfigurationService.class); + bind(VaultSecretService.class).to(KsmSecretService.class); + bind(VaultDirectoryService.class).to(KsmDirectoryService.class); + + // Bind factory for creating KSM Clients + install(new FactoryModuleBuilder() + .implement(KsmClient.class, KsmClient.class) + .build(KsmClientFactory.class)); + + // Bind factory for creating KsmUsers + install(new FactoryModuleBuilder() + .implement(KsmUser.class, KsmUser.class) + .build(KsmUserFactory.class)); + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmAttributeService.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmAttributeService.java new file mode 100644 index 0000000..8b3c5d9 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmAttributeService.java @@ -0,0 +1,356 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.conf; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.BooleanField; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.form.TextField; +import org.apache.guacamole.language.TranslatableGuacamoleClientException; +import org.apache.guacamole.vault.conf.VaultAttributeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.keepersecurity.secretsManager.core.InMemoryStorage; +import com.keepersecurity.secretsManager.core.SecretsManager; +import com.keepersecurity.secretsManager.core.SecretsManagerOptions; + +/** + * A service that exposes KSM-specific attributes, allowing setting KSM + * configuration through the admin interface. + */ +@Singleton +public class KsmAttributeService implements VaultAttributeService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(KsmAttributeService.class); + + /** + * Service for retrieving KSM configuration details. + */ + @Inject + private KsmConfigurationService configurationService; + + /** + * A singleton ObjectMapper for converting a Map to a JSON string when + * generating a base64-encoded JSON KSM config blob. + */ + private static final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * All expected fields in the KSM configuration JSON blob. + */ + private static final List EXPECTED_KSM_FIELDS = ( + Collections.unmodifiableList(Arrays.asList( + SecretsManager.KEY_HOSTNAME, + SecretsManager.KEY_CLIENT_ID, + SecretsManager.KEY_PRIVATE_KEY, + SecretsManager.KEY_CLIENT_KEY, + SecretsManager.KEY_APP_KEY, + SecretsManager.KEY_OWNER_PUBLIC_KEY, + SecretsManager.KEY_SERVER_PUBIC_KEY_ID + ))); + + /** + * The name of the attribute which can contain a KSM configuration blob + * associated with either a connection group or user. + */ + public static final String KSM_CONFIGURATION_ATTRIBUTE = "ksm-config"; + + /** + * The KSM configuration attribute contains sensitive information, so it + * should not be exposed through the directory. Instead, if a value is + * set on the attributes of an object, the following value will be exposed + * in its place, and correspondingly the underlying value will not be + * changed if this value is provided to an update call. + */ + public static final String KSM_ATTRIBUTE_PLACEHOLDER_VALUE = "**********"; + + /** + * All attributes related to configuring the KSM vault on a + * per-connection-group or per-user basis. + */ + public static final Form KSM_CONFIGURATION_FORM = new Form("ksm-config", + Arrays.asList(new TextField(KSM_CONFIGURATION_ATTRIBUTE))); + + /** + * All KSM-specific attributes for users, connections, or connection groups, organized by form. + */ + public static final Collection KSM_ATTRIBUTES = + Collections.unmodifiableCollection(Arrays.asList(KSM_CONFIGURATION_FORM)); + + /** + * The name of the attribute which can controls whether a KSM user configuration + * is enabled on a connection-by-connection basis. + */ + public static final String KSM_USER_CONFIG_ENABLED_ATTRIBUTE = "ksm-user-config-enabled"; + + /** + * The string value used by KSM attributes to represent the boolean value "true". + */ + public static final String TRUTH_VALUE = "true"; + + /** + * All attributes related to configuring the KSM vault on a per-connection basis. + */ + public static final Form KSM_CONNECTION_FORM = new Form("ksm-config", + Arrays.asList(new BooleanField(KSM_USER_CONFIG_ENABLED_ATTRIBUTE, TRUTH_VALUE))); + + /** + * All KSM-specific attributes for connections, organized by form. + */ + public static final Collection KSM_CONNECTION_ATTRIBUTES = + Collections.unmodifiableCollection(Arrays.asList(KSM_CONNECTION_FORM)); + + @Override + public Collection getConnectionAttributes() { + return KSM_CONNECTION_ATTRIBUTES; + } + + @Override + public Collection getConnectionGroupAttributes() { + return KSM_ATTRIBUTES; + } + + @Override + public Collection getUserAttributes() { + + try { + + // Expose the user attributes IFF user-level KSM configuration is enabled + return configurationService.getAllowUserConfig() ? KSM_ATTRIBUTES : Collections.emptyList(); + + } + + catch (GuacamoleException e) { + + logger.warn( + "Unable to determine if KSM user attributes " + + "should be exposed due to config parsing error: {}.", e.getMessage()); + logger.debug( + "Config parsing error prevented checking user attribute configuration", + e); + + // If the configuration can't be parsed, default to not exposing the attributes + return Collections.emptyList(); + } + + } + + @Override + public Collection getUserPreferenceAttributes() { + + // KSM-specific user preference attributes have the same semantics as + // user attributes + return getUserAttributes(); + } + + /** + * Sanitize the value of the provided KSM config attribute. If the provided + * config value is non-empty, it will be replaced with the placeholder + * value to avoid leaking sensitive information. If the value is empty, it + * will be replaced by `null`. + * + * @param ksmAttributeValue + * The KSM configuration attribute value to sanitize. + * + * @return + * The sanitized KSM configuration attribute value, stripped of any + * sensitive information. + */ + public static String sanitizeKsmAttributeValue(String ksmAttributeValue) { + + // Any non-empty values may contain sensitive information, and should + // be replaced by the safe placeholder value + if (ksmAttributeValue != null && !ksmAttributeValue.trim().isEmpty()) + return KSM_ATTRIBUTE_PLACEHOLDER_VALUE; + + // If the configuration value is empty, expose a null value + else + return null; + + } + + /** + * Return true if the provided input is a valid base64-encoded string, + * false otherwise. + * + * @param input + * The string to check if base-64 encoded. + * + * @return + * true if the provided input is a valid base64-encoded string, + * false otherwise. + */ + private static boolean isBase64(String input) { + + try { + Base64.getDecoder().decode(input); + return true; + } catch (IllegalArgumentException e) { + return false; + } + } + + /** + * Given a map of attribute values, check for the presence of the + * KSM_CONFIGURATION_ATTRIBUTE attribute. If it's set, check if it's a valid + * KSM one-time token. If so, attempt to translate it to a base-64-encoded + * json KSM config blob. If it's already a KSM config blob, validate it as + * config blob. If either validation fails, a GuacamoleException will be thrown. + * The processed attribute values will be returned. + * + * @param attributes + * The attributes for which the KSM configuration attribute + * parsing/validation should be performed. + * + * @throws GuacamoleException + * If the KSM_CONFIGURATION_ATTRIBUTE is set, but fails to validate as + * either a KSM one-time-token, or a KSM base64-encoded JSON config blob. + */ + public Map processAttributes( + Map attributes) throws GuacamoleException { + + // Get the value of the KSM config attribute in the provided map + String ksmConfigValue = attributes.get( + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE); + + // If the placeholder value was provided, do not update the attribute + if (KsmAttributeService.KSM_ATTRIBUTE_PLACEHOLDER_VALUE.equals(ksmConfigValue)) { + + // Remove the attribute from the map so it won't be updated + attributes = new HashMap<>(attributes); + attributes.remove(KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE); + + } + + // Check if the attribute is set to a non-empty value + else if (ksmConfigValue != null && !ksmConfigValue.trim().isEmpty()) { + + // If it's already base64-encoded, it's a KSM configuration blob, + // so validate it immediately + if (isBase64(ksmConfigValue)) { + + // Attempt to validate the config as a base64-econded KSM config blob + try { + KsmConfig.parseKsmConfig(ksmConfigValue); + + // If it validates, the entity can be left alone - it's already valid + return attributes; + } + + catch (GuacamoleException exception) { + + // If the parsing attempt fails, throw a translatable error for display + // on the frontend + throw new TranslatableGuacamoleClientException( + "Invalid base64-encoded JSON KSM config provided for " + + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE + " attribute", + "CONNECTION_GROUP_ATTRIBUTES.ERROR_INVALID_KSM_CONFIG_BLOB", + exception); + } + } + + // It wasn't a valid base64-encoded string, it should be a one-time token, so + // attempt to validat it as such, and if valid, update the attribute to the + // base64 config blob generated by the token + try { + + // Create an initially empty storage to be populated using the one-time token + InMemoryStorage storage = new InMemoryStorage(); + + // Populate the in-memory storage using the one-time-token + SecretsManager.initializeStorage(storage, ksmConfigValue, null); + + // Create an options object using the values we extracted from the one-time token + SecretsManagerOptions options = new SecretsManagerOptions( + storage, null, + configurationService.getAllowUnverifiedCertificate()); + + // Attempt to fetch secrets using the options we created. This will both validate + // that the configuration works, and potentially populate missing fields that the + // initializeStorage() call did not set. + SecretsManager.getSecrets(options); + + // Create a map to store the extracted values from the KSM storage + Map configMap = new HashMap<>(); + + // Go through all the expected fields, extract from the KSM storage, + // and write to the newly created map + EXPECTED_KSM_FIELDS.forEach(configKey -> { + + // Only write the value into the new map if non-null + String value = storage.getString(configKey); + if (value != null) + configMap.put(configKey, value); + + }); + + // JSON-encode the value, and then base64 encode that to get the format + // that KSM would expect + String jsonString = objectMapper.writeValueAsString(configMap); + String base64EncodedJson = Base64.getEncoder().encodeToString( + jsonString.getBytes(StandardCharsets.UTF_8)); + + // Finally, try to parse the newly generated token as a KSM config. If this + // works, the config should be fully functional + KsmConfig.parseKsmConfig(base64EncodedJson); + + // Make a copy of the existing attributes, modifying just the value for + // KSM_CONFIGURATION_ATTRIBUTE + attributes = new HashMap<>(attributes); + attributes.put( + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE, base64EncodedJson); + + } + + // The KSM SDK only throws raw Exceptions, so we can't be more specific + catch (Exception exception) { + + // If the parsing attempt fails, throw a translatable error for display + // on the frontend + throw new TranslatableGuacamoleClientException( + "Invalid one-time KSM token provided for " + + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE + " attribute", + "CONNECTION_GROUP_ATTRIBUTES.ERROR_INVALID_KSM_ONE_TIME_TOKEN", + exception); + } + } + + return attributes; + + } + + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmConfig.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmConfig.java new file mode 100644 index 0000000..54aaec7 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmConfig.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.conf; + +import com.keepersecurity.secretsManager.core.InMemoryStorage; +import com.keepersecurity.secretsManager.core.KeyValueStorage; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A utility for parsing base64-encoded JSON, as output by the Keeper Commander + * CLI tool via the "sm client add" command into a Keeper Secrets Manager + * {@link KeyValueStorage} object. + */ +public class KsmConfig { + + /** + * Given a base64-encoded JSON KSM configuration, parse and return a + * KeyValueStorage object. + * + * @param value + * The base64-encoded JSON KSM configuration to parse. + * + * @return + * The KeyValueStorage that is a result of the parsing operation + * + * @throws GuacamoleException + * If the provided value is not valid base-64 encoded JSON KSM configuration. + */ + public static KeyValueStorage parseKsmConfig(String value) throws GuacamoleException { + + // Parse base64 value as KSM config storage + try { + return new InMemoryStorage(value); + } + catch (IllegalArgumentException e) { + throw new GuacamoleServerException("Invalid base64 configuration " + + "for Keeper Secrets Manager.", e); + } + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmConfigurationService.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmConfigurationService.java new file mode 100644 index 0000000..197b979 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/conf/KsmConfigurationService.java @@ -0,0 +1,275 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.conf; + +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import javax.annotation.Nonnull; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.LongGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.vault.conf.VaultConfigurationService; + +import com.keepersecurity.secretsManager.core.InMemoryStorage; +import com.keepersecurity.secretsManager.core.KeyValueStorage; +import com.keepersecurity.secretsManager.core.SecretsManagerOptions; + +/** + * Service for retrieving configuration information regarding the Keeper + * Secrets Manager authentication extension. + */ +@Singleton +public class KsmConfigurationService extends VaultConfigurationService { + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * The name of the file which contains the YAML mapping of connection + * parameter token to secrets within Keeper Secrets Manager. + */ + private static final String TOKEN_MAPPING_FILENAME = "ksm-token-mapping.yml"; + + /** + * The name of the properties file containing Guacamole configuration + * properties whose values are the names of corresponding secrets within + * Keeper Secrets Manager. + */ + private static final String PROPERTIES_FILENAME = "guacamole.properties.ksm"; + + /** + * The base64-encoded configuration information generated by the Keeper + * Commander CLI tool. + */ + private static final StringGuacamoleProperty KSM_CONFIG = new StringGuacamoleProperty() { + + @Override + public String getName() { + return "ksm-config"; + } + }; + + /** + * Whether unverified server certificates should be accepted. + */ + private static final BooleanGuacamoleProperty ALLOW_UNVERIFIED_CERT = new BooleanGuacamoleProperty() { + + @Override + public String getName() { + return "ksm-allow-unverified-cert"; + } + }; + + /** + * Whether users should be able to supply their own KSM configurations. + */ + private static final BooleanGuacamoleProperty ALLOW_USER_CONFIG = new BooleanGuacamoleProperty() { + + @Override + public String getName() { + return "ksm-allow-user-config"; + } + }; + + /** + * Whether windows domains should be stripped off from usernames that are + * read from the KSM vault. + */ + private static final BooleanGuacamoleProperty STRIP_WINDOWS_DOMAINS = new BooleanGuacamoleProperty() { + + @Override + public String getName() { + return "ksm-strip-windows-domains"; + } + }; + + /** + * Whether domains should be considered when matching login records in the KSM vault. + * If true, both the domain and username must match for a record to match when using + * tokens like "KEEPER_USER_*". If false, only the username must match. + */ + private static final BooleanGuacamoleProperty MATCH_USER_DOMAINS = new BooleanGuacamoleProperty() { + + @Override + public String getName() { + return "ksm-match-domains-for-users"; + } + }; + + /** + * The minimum number of milliseconds between KSM API calls. + */ + private static final LongGuacamoleProperty KSM_API_CALL_INTERVAL = new LongGuacamoleProperty() { + + @Override + public String getName() { + return "ksm-api-call-interval"; + } + }; + + /** + * Creates a new KsmConfigurationService which reads the configuration + * from "ksm-token-mapping.yml" and properties from + * "guacamole.properties.ksm". The token mapping is a YAML file which lists + * each connection parameter token and the name of the secret from which + * the value for that token should be read, while the properties file is an + * alternative to guacamole.properties where each property value is the + * name of a secret containing the actual value. + */ + public KsmConfigurationService() { + super(TOKEN_MAPPING_FILENAME, PROPERTIES_FILENAME); + } + + /** + * Return whether unverified server certificates should be accepted when + * communicating with Keeper Secrets Manager. + * + * @return + * true if unverified server certificates should be accepted, false + * otherwise. + * + * @throws GuacamoleException + * If the value specified within guacamole.properties cannot be + * parsed. + */ + public boolean getAllowUnverifiedCertificate() throws GuacamoleException { + return environment.getProperty(ALLOW_UNVERIFIED_CERT, false); + } + + /** + * Return whether user-level KSM configs should be enabled. If this + * flag is set to true, users can edit their own KSM configs, as can + * admins. If set to false, no existing user-specific KSM configuration + * will be exposed through the UI or used when looking up secrets. + * + * @return + * true if user-specific KSM configuration is enabled, false otherwise. + * + * @throws GuacamoleException + * If the value specified within guacamole.properties cannot be + * parsed. + */ + public boolean getAllowUserConfig() throws GuacamoleException { + return environment.getProperty(ALLOW_USER_CONFIG, false); + } + + @Override + public boolean getSplitWindowsUsernames() throws GuacamoleException { + return environment.getProperty(STRIP_WINDOWS_DOMAINS, false); + } + + @Override + public boolean getMatchUserRecordsByDomain() throws GuacamoleException { + return environment.getProperty(MATCH_USER_DOMAINS, false); + } + + /** + * Return the minimum number of milliseconds between KSM API calls. If not + * otherwise configured, this value will be 10 seconds. + * + * @return + * The minimum number of milliseconds between KSM API calls. + * + * @throws GuacamoleException + * If the value specified within guacamole.properties cannot be + * parsed or does not exist. + */ + public long getKsmApiInterval() throws GuacamoleException { + return environment.getProperty(KSM_API_CALL_INTERVAL, 10000L); + } + + /** + * Return the globally-defined base-64-encoded JSON KSM configuration blob + * as a string. + * + * @return + * The globally-defined base-64-encoded JSON KSM configuration blob + * as a string. + * + * @throws GuacamoleException + * If the value specified within guacamole.properties cannot be + * parsed or does not exist. + */ + @Nonnull + @SuppressWarnings("null") + public String getKsmConfig() throws GuacamoleException { + + // This will always return a non-null value; an exception would be + // thrown if the required value is not set + return environment.getRequiredProperty(KSM_CONFIG); + } + + /** + * Given a base64-encoded JSON KSM configuration, parse and return a + * KeyValueStorage object. + * + * @param value + * The base64-encoded JSON KSM configuration to parse. + * + * @return + * The KeyValueStorage that is a result of the parsing operation + * + * @throws GuacamoleException + * If the provided value is not valid base-64 encoded JSON KSM configuration. + */ + private static KeyValueStorage parseKsmConfig(String value) throws GuacamoleException { + + // Parse base64 value as KSM config storage + try { + return new InMemoryStorage(value); + } + catch (IllegalArgumentException e) { + throw new GuacamoleServerException("Invalid base64 configuration " + + "for Keeper Secrets Manager.", e); + } + + } + + /** + * Returns the options required to authenticate with Keeper Secrets Manager + * when retrieving secrets. These options are read from the contents of + * base64-encoded JSON configuration data generated by the Keeper Commander + * CLI tool. This configuration data must be passed directly as an argument. + * + * @param ksmConfig + * The KSM configuration blob to parse. + * + * @return + * The options that should be used when connecting to Keeper Secrets + * Manager when retrieving secrets. + * + * @throws GuacamoleException + * If an invalid ksmConfig parameter is provided. + */ + @Nonnull + public SecretsManagerOptions getSecretsManagerOptions(@Nonnull String ksmConfig) throws GuacamoleException { + + return new SecretsManagerOptions( + parseKsmConfig(ksmConfig), null, getAllowUnverifiedCertificate()); + } +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmClient.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmClient.java new file mode 100644 index 0000000..c9a74e5 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmClient.java @@ -0,0 +1,675 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.secret; + +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import com.keepersecurity.secretsManager.core.Hosts; +import com.keepersecurity.secretsManager.core.KeeperRecord; +import com.keepersecurity.secretsManager.core.KeeperSecrets; +import com.keepersecurity.secretsManager.core.Login; +import com.keepersecurity.secretsManager.core.Notation; +import com.keepersecurity.secretsManager.core.SecretsManager; +import com.keepersecurity.secretsManager.core.SecretsManagerOptions; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.Nullable; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.vault.ksm.conf.KsmConfigurationService; +import org.apache.guacamole.vault.secret.WindowsUsername; +import org.apache.guacamole.vault.ksm.GuacamoleExceptionSupplier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Client which retrieves records from Keeper Secrets Manager, allowing + * content-based record retrieval. Note that because KSM is zero-knowledge, + * searching or indexing based on content can only be accomplished by + * retrieving and indexing everything. Except for record UIDs (which contain no + * information), it's not possible for the server to perform a search of + * content on the client's behalf. The client has to perform its own search. + */ +public class KsmClient { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(KsmClient.class); + + /** + * Service for retrieving configuration information. + */ + @Inject + private KsmConfigurationService confService; + + /** + * Service for retrieving data from records. + */ + @Inject + private KsmRecordService recordService; + + /** + * The publicly-accessible URL for Keeper's documentation covering Keeper + * notation. + */ + private static final String KEEPER_NOTATION_DOC_URL = + "https://docs.keeper.io/secrets-manager/secrets-manager/about/keeper-notation"; + + /** + * The regular expression that Keeper notation must match to be related to + * file retrieval. As the Keeper SDK provides mutually-exclusive for + * retrieving secret values and files via notation, the notation must first + * be tested to determine whether it refers to a file. + */ + private static final Pattern KEEPER_FILE_NOTATION = Pattern.compile("^(keeper://)?[^/]*/file/.+"); + + /** + * The KSM configuration associated with this client instance. + */ + private final SecretsManagerOptions ksmConfig; + + /** + * Read/write lock which guards access to all cached data, including the + * timestamp recording the last time the cache was refreshed. Readers of + * the cache must first acquire (and eventually release) the read lock, and + * writers of the cache must first acquire (and eventually release) the + * write lock. + */ + private final ReadWriteLock cacheLock = new ReentrantReadWriteLock(); + + /** + * The maximum amount of time that an entry will be stored in the cache + * before being refreshed, in milliseconds. This is also the shortest + * possible interval between API calls to KSM. + */ + private final long cacheInterval; + + /** + * The timestamp that the cache was last refreshed, in milliseconds, as + * returned by System.currentTimeMillis(). This value is automatically + * updated if {@link #validateCache()} refreshes the cache. This value must + * not be accessed without {@link #cacheLock} acquired appropriately. + */ + private volatile long cacheTimestamp = 0; + + /** + * The full cached set of secrets last retrieved from Keeper Secrets + * Manager. This value is automatically updated if {@link #validateCache()} + * refreshes the cache. This value must not be accessed without + * {@link #cacheLock} acquired appropriately. + */ + private KeeperSecrets cachedSecrets = null; + + /** + * All records retrieved from Keeper Secrets Manager, where each key is the + * UID of the corresponding record. The contents of this Map are + * automatically updated if {@link #validateCache()} refreshes the cache. + * This Map must not be accessed without {@link #cacheLock} acquired + * appropriately. + */ + private final Map cachedRecordsByUid = new HashMap<>(); + + /** + * All records retrieved from Keeper Secrets Manager, where each key is the + * hostname or IP address of the corresponding record. The hostname or IP + * address of a record is determined by {@link Hosts} fields, thus a record + * may be associated with multiple hosts. If a record is associated with + * multiple hosts, there will be multiple references to that record within + * this Map. The contents of this Map are automatically updated if + * {@link #validateCache()} refreshes the cache. This Map must not be + * accessed without {@link #cacheLock} acquired appropriately. Before using + * a value from this Map, {@link #cachedAmbiguousHosts} must first be + * checked to verify that there is indeed only one record associated with + * that host. + */ + private final Map cachedRecordsByHost = new HashMap<>(); + + /** + * The set of all hostnames or IP addresses that are associated with + * multiple records, and thus cannot uniquely identify a record. The + * contents of this Set are automatically updated if + * {@link #validateCache()} refreshes the cache. This Set must not be + * accessed without {@link #cacheLock} acquired appropriately.This Set + * must be checked before using a value retrieved from + * {@link #cachedRecordsByHost}. + */ + private final Set cachedAmbiguousHosts = new HashSet<>(); + + /** + * All records retrieved from Keeper Secrets Manager, where each key is the + * username/domain of the corresponding record. The username of a record is + * determined by {@link Login} and "domain" fields, thus a record may be + * associated with multiple users. If a record is associated with multiple + * users, there will be multiple references to that record within this Map. + * The contents of this Map are automatically updated if + * {@link #validateCache()} refreshes the cache. This Map must not be accessed + * without {@link #cacheLock} acquired appropriately. Before using a value from + * this Map, {@link #cachedAmbiguousUsers} must first be checked to + * verify that there is indeed only one record associated with that user. + */ + private final Map cachedRecordsByUser = new HashMap<>(); + + /** + * The set of all username/domain combos that are associated with multiple + * records, and thus cannot uniquely identify a record. The contents of + * this Set are automatically updated if {@link #validateCache()} refreshes + * the cache. This Set must not be accessed without {@link #cacheLock} + * acquired appropriately. This Set must be checked before using a value + * retrieved from {@link #cachedRecordsByUser}. + */ + private final Set cachedAmbiguousUsers = new HashSet<>(); + + /** + * All records retrieved from Keeper Secrets Manager, where each key is the + * domain of the corresponding record. The domain of a record is + * determined by {@link Login} fields, thus a record may be associated with + * multiple domains. If a record is associated with multiple domains, there + * will be multiple references to that record within this Map. The contents + * of this Map are automatically updated if {@link #validateCache()} + * refreshes the cache. This Map must not be accessed without + * {@link #cacheLock} acquired appropriately. Before using a value from + * this Map, {@link #cachedAmbiguousDomains} must first be checked to + * verify that there is indeed only one record associated with that domain. + */ + private final Map cachedRecordsByDomain = new HashMap<>(); + + /** + * The set of all domains that are associated with multiple records, and + * thus cannot uniquely identify a record. The contents of this Set are + * automatically updated if {@link #validateCache()} refreshes the cache. + * This Set must not be accessed without {@link #cacheLock} acquired + * appropriately. This Set must be checked before using a value retrieved + * from {@link #cachedRecordsByDomain}. + */ + private final Set cachedAmbiguousDomains = new HashSet<>(); + + /** + * Create a new KSM client based around the provided KSM configuration and + * API timeout setting. + * + * @param ksmConfig + * The KSM configuration to use when retrieving properties from KSM. + * + * @param apiInterval + * The minimum number of milliseconds that must elapse between KSM API + * calls. + */ + @AssistedInject + public KsmClient( + @Assisted SecretsManagerOptions ksmConfig, + @Assisted long apiInterval) { + this.ksmConfig = ksmConfig; + this.cacheInterval = apiInterval; + } + + /** + * Validates that all cached data is current with respect to + * {@link #cacheInterval}, refreshing data from the server as needed. + * + * @throws GuacamoleException + * If an error occurs preventing the cached data from being refreshed. + */ + private void validateCache() throws GuacamoleException { + + long currentTime = System.currentTimeMillis(); + + // Perform a read-only check that the cache has actually expired before + // continuing + cacheLock.readLock().lock(); + try { + if (currentTime - cacheTimestamp < cacheInterval) + return; + } + finally { + cacheLock.readLock().unlock(); + } + + cacheLock.writeLock().lock(); + try { + + // Cache may have been updated since the read-only check. Re-verify + // that the cache has expired before continuing with a full refresh + if (currentTime - cacheTimestamp < cacheInterval) + return; + + // Attempt to pull all records first, allowing that operation to + // succeed/fail BEFORE we clear out the last cached success + KeeperSecrets secrets = SecretsManager.getSecrets(ksmConfig); + List records = secrets.getRecords(); + + // Store all secrets within cache + cachedSecrets = secrets; + + // Clear unambiguous cache of all records by UID + cachedRecordsByUid.clear(); + + // Clear cache of host-based records + cachedAmbiguousHosts.clear(); + cachedRecordsByHost.clear(); + + // Clear cache of login-based records + cachedAmbiguousUsers.clear(); + cachedRecordsByUser.clear(); + + // Clear cache of domain-based records + cachedAmbiguousDomains.clear(); + cachedRecordsByDomain.clear(); + + // Parse configuration + final boolean shouldSplitUsernames = confService.getSplitWindowsUsernames(); + final boolean shouldMatchByDomain = confService.getMatchUserRecordsByDomain(); + + // Store all records, sorting each into host-based, login-based, + // and domain-based buckets + records.forEach(record -> { + + // Store based on UID ... + cachedRecordsByUid.put(record.getRecordUid(), record); + + // ... and hostname/address + String hostname = recordService.getHostname(record); + addRecordForHost(record, hostname); + + // ... and domain + String domain = recordService.getDomain(record); + addRecordForDomain(record, domain); + + // Get the username off of the record + String username = recordService.getUsername(record); + + // If we have a username, and there isn't already a domain explicitly defined + if (username != null && domain == null && shouldSplitUsernames) { + + // Attempt to split out the domain of the username + WindowsUsername usernameAndDomain = ( + WindowsUsername.splitWindowsUsernameFromDomain(username)); + + // Use the username-split domain if available + if (usernameAndDomain.hasDomain()) { + domain = usernameAndDomain.getDomain(); + username = usernameAndDomain.getUsername(); + addRecordForDomain(record, domain); + } + + } + + // If domain matching is not enabled for user records, + // explicitly set all domains to null to allow matching + // on username only + if (!shouldMatchByDomain) + domain = null; + + // Store based on login ONLY if no hostname (will otherwise + // result in ambiguous entries for servers tied to identical + // accounts) + if (hostname == null) + addRecordForLogin(record, username, domain); + + }); + + // Cache has been refreshed + this.cacheTimestamp = System.currentTimeMillis(); + + } + finally { + cacheLock.writeLock().unlock(); + } + + } + + /** + * Associates the given record with the given domain. The domain may be + * null. Both {@link #cachedRecordsByDomain} and {@link #cachedAmbiguousDomains} + * are updated appropriately. The write lock of {@link #cacheLock} must + * already be acquired before invoking this function. + * + * @param record + * The record to associate with the domains in the given field. + * + * @param domain + * The domain that the given record should be associated with. + * This may be null. + */ + private void addRecordForDomain(KeeperRecord record, String domain) { + + if (domain == null) + return; + + KeeperRecord existing = cachedRecordsByDomain.putIfAbsent(domain, record); + if (existing != null && record != existing) + cachedAmbiguousDomains.add(domain); + + } + + /** + * Associates the given record with the given hostname. The hostname may be + * null. Both {@link #cachedRecordsByHost} and {@link #cachedAmbiguousHosts} + * are updated appropriately. The write lock of {@link #cacheLock} must + * already be acquired before invoking this function. + * + * @param record + * The record to associate with the hosts in the given field. + * + * @param hostname + * The hostname/address that the given record should be associated + * with. This may be null. + */ + private void addRecordForHost(KeeperRecord record, String hostname) { + + if (hostname == null) + return; + + KeeperRecord existing = cachedRecordsByHost.putIfAbsent(hostname, record); + if (existing != null && record != existing) + cachedAmbiguousHosts.add(hostname); + + } + + /** + * Associates the given record with the given user, and optional domain. + * The given username or domain may be null. Both {@link #cachedRecordsByUser} + * and {@link #cachedAmbiguousUsers} are updated appropriately. The write + * lock of {@link #cacheLock} must already be acquired before invoking this + * function. + * + * @param record + * The record to associate with the given user. + * + * @param username + * The username that the given record should be associated with. This + * may be null. + * + * @param domain + * The domain that the given record should be associated with. This + * may be null. + */ + private void addRecordForLogin( + KeeperRecord record, String username, String domain) { + + if (username == null) + return; + + UserLogin userDomain = new UserLogin(username, domain); + KeeperRecord existing = cachedRecordsByUser.putIfAbsent( + userDomain, record); + if (existing != null && record != existing) + cachedAmbiguousUsers.add(userDomain); + + } + + /** + * Returns all records accessible via Keeper Secrets Manager. The records + * returned are arbitrarily ordered. + * + * @return + * An unmodifiable Collection of all records accessible via Keeper + * Secrets Manager, in no particular order. + * + * @throws GuacamoleException + * If an error occurs that prevents records from being retrieved. + */ + public Collection getRecords() throws GuacamoleException { + validateCache(); + cacheLock.readLock().lock(); + try { + return Collections.unmodifiableCollection(cachedRecordsByUid.values()); + } + finally { + cacheLock.readLock().unlock(); + } + } + + /** + * Returns the record having the given UID. If no such record exists, null + * is returned. + * + * @param uid + * The UID of the record to return. + * + * @return + * The record having the given UID, or null if there is no such record. + * + * @throws GuacamoleException + * If an error occurs that prevents the record from being retrieved. + */ + public KeeperRecord getRecord(String uid) throws GuacamoleException { + validateCache(); + cacheLock.readLock().lock(); + try { + return cachedRecordsByUid.get(uid); + } + finally { + cacheLock.readLock().unlock(); + } + } + + /** + * Returns the record associated with the given hostname or IP address. If + * no such record exists, or there are multiple such records, null is + * returned. + * + * @param hostname + * The hostname of the record to return. + * + * @return + * The record associated with the given hostname, or null if there is + * no such record or multiple such records. + * + * @throws GuacamoleException + * If an error occurs that prevents the record from being retrieved. + */ + public KeeperRecord getRecordByHost(String hostname) throws GuacamoleException { + validateCache(); + cacheLock.readLock().lock(); + try { + + if (cachedAmbiguousHosts.contains(hostname)) { + logger.debug("The hostname/address \"{}\" is referenced by " + + "multiple Keeper records and cannot be used to " + + "locate individual secrets.", hostname); + return null; + } + + return cachedRecordsByHost.get(hostname); + + } + finally { + cacheLock.readLock().unlock(); + } + } + + /** + * Returns the record associated with the given username and domain. If no + * such record exists, or there are multiple such records, null is returned. + * + * @param username + * The username of the record to return. + * + * @param domain + * The domain of the record to return, or null if no domain exists. + * + * @return + * The record associated with the given username and domain, or null + * if there is no such record or multiple such records. + * + * @throws GuacamoleException + * If an error occurs that prevents the record from being retrieved. + */ + public KeeperRecord getRecordByLogin( + String username, String domain) throws GuacamoleException { + + validateCache(); + cacheLock.readLock().lock(); + + UserLogin userDomain = new UserLogin(username, domain); + + try { + + if (cachedAmbiguousUsers.contains(userDomain)) { + logger.debug("The username \"{}\" with domain \"{}\" is " + + "referenced by multiple Keeper records and " + + "cannot be used to locate individual secrets.", + username, domain); + return null; + } + + return cachedRecordsByUser.get(userDomain); + + } + finally { + cacheLock.readLock().unlock(); + } + } + + /** + * Returns the record associated with the given domain. If no such record + * exists, or there are multiple such records, null is returned. + * + * @param domain + * The domain of the record to return. + * + * @return + * The record associated with the given domain, or null if there is + * no such record or multiple such records. + * + * @throws GuacamoleException + * If an error occurs that prevents the record from being retrieved. + */ + public KeeperRecord getRecordByDomain(String domain) throws GuacamoleException { + validateCache(); + cacheLock.readLock().lock(); + try { + + if (cachedAmbiguousDomains.contains(domain)) { + logger.debug("The domain \"{}\" is referenced by multiple " + + "Keeper records and cannot be used to locate " + + "individual secrets.", domain); + return null; + } + + return cachedRecordsByDomain.get(domain); + + } + finally { + cacheLock.readLock().unlock(); + } + } + + /** + * Returns the value of the secret stored within Keeper Secrets Manager and + * represented by the given Keeper notation. Keeper notation locates the + * value of a specific field, custom field, or file associated with a + * specific record. See: https://docs.keeper.io/secrets-manager/secrets-manager/about/keeper-notation + * + * @param notation + * The Keeper notation of the secret to retrieve. + * + * @return + * A Future which completes with the value of the secret represented by + * the given Keeper notation, or null if there is no such secret. + * + * @throws GuacamoleException + * If the requested secret cannot be retrieved or the Keeper notation + * is invalid. + */ + public Future getSecret(String notation) throws GuacamoleException { + return getSecret(notation, null); + } + + /** + * Returns the value of the secret stored within Keeper Secrets Manager and + * represented by the given Keeper notation. Keeper notation locates the + * value of a specific field, custom field, or file associated with a + * specific record. See: https://docs.keeper.io/secrets-manager/secrets-manager/about/keeper-notation + * If a fallbackFunction is provided, it will be invoked to generate + * a return value in the case where no secret is found with the given + * keeper notation. + * + * @param notation + * The Keeper notation of the secret to retrieve. + * + * @param fallbackFunction + * A function to invoke in order to produce a Future for return, + * if the requested secret is not found. If the provided Function + * is null, it will not be run. + * + * @return + * A Future which completes with the value of the secret represented by + * the given Keeper notation, or null if there is no such secret. + * + * @throws GuacamoleException + * If the requested secret cannot be retrieved or the Keeper notation + * is invalid. + */ + public Future getSecret( + String notation, + @Nullable GuacamoleExceptionSupplier> fallbackFunction) + throws GuacamoleException { + validateCache(); + cacheLock.readLock().lock(); + try { + + // Retrieve any relevant file asynchronously + Matcher fileNotationMatcher = KEEPER_FILE_NOTATION.matcher(notation); + if (fileNotationMatcher.matches()) + return recordService.download(Notation.getFile(cachedSecrets, notation)); + + // Retrieve string values synchronously + return CompletableFuture.completedFuture(Notation.getValue(cachedSecrets, notation)); + + } + + // Unfortunately, the notation parser within the Keeper SDK + // only throws plain Errors and Exceptions. + // There is no way to differentiate if an error is caused by + // a non-existing record or a pure parse failure. + catch (Error | Exception e) { + logger.warn("Keeper notation \"{}\" could not be resolved " + + "to a record: {}", notation, e.getMessage()); + logger.debug("Retrieval of record by Keeper notation failed.", e); + + // If the secret is not found, invoke the fallback function + if (fallbackFunction != null) + return fallbackFunction.get(); + + return CompletableFuture.completedFuture(null); + } + finally { + cacheLock.readLock().unlock(); + } + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmClientFactory.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmClientFactory.java new file mode 100644 index 0000000..d977118 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmClientFactory.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.secret; + +import javax.annotation.Nonnull; + +import com.keepersecurity.secretsManager.core.SecretsManagerOptions; + +/** + * Factory for creating KsmClient instances. + */ +public interface KsmClientFactory { + + /** + * Returns a new instance of a KsmClient instance associated with + * the provided KSM configuration options and API interval. + * + * @param ksmConfigOptions + * The KSM config options to use when constructing the KsmClient + * object. + * + * @param apiInterval + * The minimum number of milliseconds that must elapse between KSM API + * calls. + * + * @return + * A new KsmClient instance associated with the provided KSM config + * options. + */ + KsmClient create( + @Nonnull SecretsManagerOptions ksmConfigOptions, long apiInterval); + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmRecordService.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmRecordService.java new file mode 100644 index 0000000..d22f703 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmRecordService.java @@ -0,0 +1,645 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.secret; + +import com.google.inject.Singleton; +import com.keepersecurity.secretsManager.core.HiddenField; +import com.keepersecurity.secretsManager.core.Host; +import com.keepersecurity.secretsManager.core.Hosts; +import com.keepersecurity.secretsManager.core.KeeperFile; +import com.keepersecurity.secretsManager.core.KeeperRecord; +import com.keepersecurity.secretsManager.core.KeeperRecordData; +import com.keepersecurity.secretsManager.core.KeeperRecordField; +import com.keepersecurity.secretsManager.core.KeyPair; +import com.keepersecurity.secretsManager.core.KeyPairs; +import com.keepersecurity.secretsManager.core.Login; +import com.keepersecurity.secretsManager.core.PamHostnames; +import com.keepersecurity.secretsManager.core.Password; +import com.keepersecurity.secretsManager.core.SecretsManager; +import com.keepersecurity.secretsManager.core.Text; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +/** + * Service for automatically parsing out secrets and data from Keeper records. + */ +@Singleton +public class KsmRecordService { + + /** + * Regular expression which matches the labels of custom fields containing + * domains. + */ + private static final Pattern DOMAIN_LABEL_PATTERN = + Pattern.compile("domain", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the labels of custom fields containing + * hostnames/addresses. + */ + private static final Pattern HOSTNAME_LABEL_PATTERN = + Pattern.compile("hostname|(ip\\s*)?address", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the labels of custom fields containing + * usernames. + */ + private static final Pattern USERNAME_LABEL_PATTERN = + Pattern.compile("username", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the labels of custom fields containing + * passwords. + */ + private static final Pattern PASSWORD_LABEL_PATTERN = + Pattern.compile("password", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the labels of custom fields containing + * passphrases for private keys. + */ + private static final Pattern PASSPHRASE_LABEL_PATTERN = + Pattern.compile("passphrase", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the labels of custom fields containing + * private keys. + */ + private static final Pattern PRIVATE_KEY_CUSTOM_LABEL_PATTERN = + Pattern.compile("private\\s*key", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the labels of standard fields containing + * private keys. + */ + private static final Pattern PRIVATE_KEY_STANDARD_LABEL_PATTERN = + Pattern.compile("private\\s*pem\\s*key", Pattern.CASE_INSENSITIVE); + + /** + * Regular expression which matches the filenames of private keys attached + * to Keeper records. + */ + private static final Pattern PRIVATE_KEY_FILENAME_PATTERN = + Pattern.compile(".*\\.pem", Pattern.CASE_INSENSITIVE); + + /** + * Returns the single value stored in the given list. If the list is empty + * or contains multiple values, null is returned. Note that null will also + * be returned if the single value stored in the list is itself null. + * + * @param + * The type of object stored in the list. + * + * @param values + * The list to retrieve a single value from. + * + * @return + * The single value stored in the given list, or null if the list is + * empty or contains multiple values. + */ + private T getSingleValue(List values) { + + if (values == null || values.size() != 1) + return null; + + return values.get(0); + + } + + /** + * Returns the single value stored in the given list of strings. If the + * list is empty, contains multiple values, or contains only a single empty + * string, null is returned. Note that null will also be returned if the + * single value stored in the list is itself null. + * + * @param values + * The list to retrieve a single value from. + * + * @return + * The single value stored in the given list, or null if the list is + * empty, contains multiple values, or contains only a single empty + * string. + */ + private String getSingleStringValue(List values) { + + String value = getSingleValue(values); + if (value != null && !value.isEmpty()) + return value; + + return null; + + } + + /** + * Returns the single value stored in the given list, additionally + * performing a mapping transformation on the single value. If the list is + * empty or contains multiple values, null is returned. Note that null will + * also be returned if the mapping transformation returns null for the + * single value stored in the list. + * + * @param + * The type of object stored in the list. + * + * @param + * The type of object to return. + * + * @param values + * The list to retrieve a single value from. + * + * @param mapper + * The function to use to map the single object of type T to type R. + * + * @return + * The single value stored in the given list, transformed using the + * provided mapping function, or null if the list is empty or contains + * multiple values. + */ + private R getSingleValue(List values, Function mapper) { + + T value = getSingleValue(values); + if (value == null) + return null; + + return mapper.apply(value); + + } + + /** + * Returns the single value stored in the given list of strings, + * additionally performing a mapping transformation on the single value. If + * the list is empty, contains multiple values, or contains only a single + * empty string, null is returned. Note that null will also be returned if + * the mapping transformation returns null for the single value stored in + * the list. + * + * @param + * The type of object stored in the list. + * + * @param values + * The list to retrieve a single value from. + * + * @param mapper + * The function to use to map the single object of type T to type R. + * + * @return + * The single value stored in the given list, transformed using the + * provided mapping function, or null if the list is empty, contains + * multiple values, or contains only a single empty string. + */ + private String getSingleStringValue(List values, Function mapper) { + + String value = getSingleValue(values, mapper); + if (value != null && !value.isEmpty()) + return value; + + return null; + + } + + /** + * Returns the instance of the only field that has the given type and + * matches the given label pattern. If there are no such fields, or + * multiple such fields, null is returned. + * + * @param + * The type of field to return. + * + * @param fields + * The list of fields to retrieve the field from. For convenience, this + * may be null. A null list will be considered equivalent to an empty + * list. + * + * @param fieldClass + * The class representing the type of field to return. + * + * @param labelPattern + * The pattern to match against the desired field's label, or null if + * no label pattern match should be performed. + * + * @return + * The field having the given type and matching the given label + * pattern, or null if there is not exactly one such field. + */ + @SuppressWarnings("unchecked") // Manually verified with isAssignableFrom() + private T getField(List fields, + Class fieldClass, Pattern labelPattern) { + + // There are no fields if no List was provided at all + if (fields == null) + return null; + + T foundField = null; + for (KeeperRecordField field : fields) { + + // Ignore fields of wrong class + if (!fieldClass.isAssignableFrom(field.getClass())) + continue; + + // Match against provided pattern, if any + if (labelPattern != null) { + + // Ignore fields without labels if a label match is requested + String label = field.getLabel(); + if (label == null) + continue; + + // Ignore fields whose labels do not match + Matcher labelMatcher = labelPattern.matcher(label); + if (!labelMatcher.matches()) + continue; + + } + + // Ignore ambiguous fields + if (foundField != null) + return null; + + // Tentative match found - we can use this as long as no other + // field matches the criteria + foundField = (T) field; + + } + + return foundField; + + } + + /** + * Returns the instance of the only field that has the given type and + * matches the given label pattern. If there are no such fields, or + * multiple such fields, null is returned. Both standard and custom fields + * are searched. As standard fields do not have labels, any given label + * pattern is ignored for standard fields. + * + * @param + * The type of field to return. + * + * @param record + * The Keeper record to retrieve the field from. + * + * @param fieldClass + * The class representing the type of field to return. + * + * @param labelPattern + * The pattern to match against the labels of custom fields, or null if + * no label pattern match should be performed. + * + * @return + * The field having the given type and matching the given label + * pattern, or null if there is not exactly one such field. + */ + private T getField(KeeperRecord record, + Class fieldClass, Pattern labelPattern) { + + KeeperRecordData data = record.getData(); + + // Attempt to find standard field first, ignoring custom fields if a + // standard field exists (NOTE: standard fields do not have labels) + T field = getField(data.getFields(), fieldClass, null); + if (field != null) + return field; + + // Fall back on custom fields + return getField(data.getCustom(), fieldClass, labelPattern); + + } + + /** + * Returns the file attached to the give Keeper record whose filename + * matches the given pattern. If there are no such files, or multiple such + * files, null is returned. + * + * @param record + * The record to retrieve the file from. + * + * @param filenamePattern + * The pattern to match filenames against. + * + * @return + * The single matching file attached to the given Keeper record, or + * null if there is not exactly one matching file. + */ + private KeeperFile getFile(KeeperRecord record, Pattern filenamePattern) { + + List files = record.getFiles(); + if (files == null) + return null; + + KeeperFile foundFile = null; + for (KeeperFile file : files) { + + // Ignore files whose filenames do not match + Matcher filenameMatcher = filenamePattern.matcher(file.getData().getName()); + if (!filenameMatcher.matches()) + continue; + + // Ignore ambiguous fields + if (foundFile != null) + return null; + + foundFile = file; + + } + + return foundFile; + + } + + /** + * Downloads the given file from the Keeper vault asynchronously. All files + * are read as UTF-8. + * + * @param file + * The file to download, which may be null. + * + * @return + * A Future which resolves with the contents of the file once + * downloaded. If no file was provided (file was null), this Future + * resolves with null. + */ + public Future download(final KeeperFile file) { + + if (file == null) + return CompletableFuture.completedFuture(null); + + return CompletableFuture.supplyAsync(() -> { + return new String(SecretsManager.downloadFile(file), StandardCharsets.UTF_8); + }); + + } + + /** + * Returns the single hostname (or address) associated with the given + * record. If the record has no associated hostname, or multiple hostnames, + * null is returned. Hostnames are retrieved from "Hosts" or "PamHostnames" + * fields, as well as "Text" and "Hidden" fields that have the label + * "hostname", "address", or "ip address" (case-insensitive, space optional). + * These field types are checked in the above order, and the first matching + * field is returned. + * + * @param record + * The record to retrieve the hostname from. + * + * @return + * The hostname associated with the given record, or null if the record + * has no associated hostname or multiple hostnames. + */ + public String getHostname(KeeperRecord record) { + + // Prefer standard login field + Hosts hostsField = getField(record, Hosts.class, null); + if (hostsField != null) + return getSingleStringValue(hostsField.getValue(), Host::getHostName); + + // Next, try a PAM hostname + PamHostnames pamHostsField = getField(record, PamHostnames.class, null); + if (pamHostsField != null) + return getSingleStringValue(pamHostsField.getValue(), Host::getHostName); + + KeeperRecordData data = record.getData(); + List custom = data.getCustom(); + + // Use text "hostname" custom field as fallback ... + Text textField = getField(custom, Text.class, HOSTNAME_LABEL_PATTERN); + if (textField != null) + return getSingleStringValue(textField.getValue()); + + // ... or hidden "hostname" custom field + HiddenField hiddenField = getField(custom, HiddenField.class, HOSTNAME_LABEL_PATTERN); + if (hiddenField != null) + return getSingleStringValue(hiddenField.getValue()); + + return null; + + } + + /** + * Returns the single username associated with the given record. If the + * record has no associated username, or multiple usernames, null is + * returned. Usernames are retrieved from "Login" fields, as well as + * "Text" and "Hidden" fields that have the label "username" + * (case-insensitive). + * + * @param record + * The record to retrieve the username from. + * + * @return + * The username associated with the given record, or null if the record + * has no associated username or multiple usernames. + */ + public String getUsername(KeeperRecord record) { + + // Prefer standard login field + Login loginField = getField(record, Login.class, null); + if (loginField != null) + return getSingleStringValue(loginField.getValue()); + + KeeperRecordData data = record.getData(); + List custom = data.getCustom(); + + // Use text "username" custom field as fallback ... + Text textField = getField(custom, Text.class, USERNAME_LABEL_PATTERN); + if (textField != null) + return getSingleStringValue(textField.getValue()); + + // ... or hidden "username" custom field + HiddenField hiddenField = getField(custom, HiddenField.class, USERNAME_LABEL_PATTERN); + if (hiddenField != null) + return getSingleStringValue(hiddenField.getValue()); + + return null; + + } + + /** + * Returns the single domain associated with the given record. If the + * record has no associated domain, or multiple domains, null is + * returned. Domains are retrieved from "Text" and "Hidden" fields + * that have the label "domain" (case-insensitive). + * + * @param record + * The record to retrieve the domain from. + * + * @return + * The domain associated with the given record, or null if the record + * has no associated domain or multiple domains. + */ + public String getDomain(KeeperRecord record) { + + KeeperRecordData data = record.getData(); + List custom = data.getCustom(); + + // First check text "domain" custom field ... + Text textField = getField(custom, Text.class, DOMAIN_LABEL_PATTERN); + if (textField != null) + return getSingleStringValue(textField.getValue()); + + // ... or hidden "domain" custom field if that's not found + HiddenField hiddenField = getField(custom, HiddenField.class, DOMAIN_LABEL_PATTERN); + if (hiddenField != null) + return getSingleStringValue(hiddenField.getValue()); + + return null; + + } + + /** + * Returns the password associated with the given record. Both standard and + * custom fields are searched. Only "Password" and "Hidden" field types are + * considered. Custom fields must additionally have the label "password" + * (case-insensitive). + * + * @param record + * The record to retrieve the password from. + * + * @return + * The password associated with the given record, or null if the record + * has no associated password. + */ + public String getPassword(KeeperRecord record) { + + Password passwordField = getField(record, Password.class, PASSWORD_LABEL_PATTERN); + if (passwordField != null) + return getSingleStringValue(passwordField.getValue()); + + HiddenField hiddenField = getField(record, HiddenField.class, PASSWORD_LABEL_PATTERN); + if (hiddenField != null) + return getSingleStringValue(hiddenField.getValue()); + + return null; + + } + + /** + * Returns the private key associated with the given record. If the record + * has no associated private key, or multiple private keys, null is + * returned. Private keys are retrieved from "KeyPairs" fields. + * Alternatively, private keys are retrieved from PEM-type attachments or + * standard "Hidden" fields with the label "private pem key", or custom + * fields with the label "private key" if they are "KeyPairs", "Password", + * or "Hidden" fields. All label matching is case-insensitive, with spaces + * between words being optional. If file downloads are required, they will + * be performed asynchronously. + * + * @param record + * The record to retrieve the private key from. + * + * @return + * A Future which resolves with the private key associated with the + * given record. If the record has no associated private key or + * multiple private keys, the returned Future will resolve to null. + */ + public Future getPrivateKey(KeeperRecord record) { + + // Attempt to find single matching keypair field + KeyPairs keyPairsField = getField( + record, KeyPairs.class, PRIVATE_KEY_CUSTOM_LABEL_PATTERN); + if (keyPairsField != null) { + String privateKey = getSingleStringValue(keyPairsField.getValue(), KeyPair::getPrivateKey); + if (privateKey != null && !privateKey.isEmpty()) + return CompletableFuture.completedFuture(privateKey); + } + + // Lacking a typed keypair field, prefer a PEM-type attachment + KeeperFile keyFile = getFile(record, PRIVATE_KEY_FILENAME_PATTERN); + if (keyFile != null) + return download(keyFile); + + KeeperRecordData data = record.getData(); + List custom = data.getCustom(); + + // Use a hidden "private pem key" standard field as fallback ... + HiddenField hiddenField = getField( + data.getFields(), HiddenField.class, PRIVATE_KEY_STANDARD_LABEL_PATTERN); + if (hiddenField != null) + return CompletableFuture.completedFuture(getSingleStringValue(hiddenField.getValue())); + + // ... or password "private key" custom field ... + Password passwordField = getField( + custom, Password.class, PRIVATE_KEY_CUSTOM_LABEL_PATTERN); + if (passwordField != null) + return CompletableFuture.completedFuture(getSingleStringValue(passwordField.getValue())); + + // ... or hidden "private key" custom field + hiddenField = getField( + custom, HiddenField.class, PRIVATE_KEY_CUSTOM_LABEL_PATTERN); + if (hiddenField != null) + return CompletableFuture.completedFuture(getSingleStringValue(hiddenField.getValue())); + + return CompletableFuture.completedFuture(null); + + } + + /** + * Returns the passphrase for the private key associated with the given + * record. Both standard and custom fields are searched. Only "Password" + * and "Hidden" field types are considered. Custom fields must additionally + * have the label "passphrase" (case-insensitive). Note that there is no + * specific association between private keys and passphrases in the + * "KeyPairs" field type. + * + * @param record + * The record to retrieve the passphrase from. + * + * @return + * The passphrase for the private key associated with the given record, + * or null if there is no such passphrase associated with the record. + */ + public String getPassphrase(KeeperRecord record) { + + KeeperRecordData data = record.getData(); + List fields = data.getFields(); + List custom = data.getCustom(); + + // For records with a standard keypair field, the passphrase is the + // standard password field + if (getField(fields, KeyPairs.class, null) != null) { + Password passwordField = getField(fields, Password.class, null); + if (passwordField != null) + return getSingleStringValue(passwordField.getValue()); + } + + // For records WITHOUT a standard keypair field, the passphrase can + // only reasonably be a custom field (consider a "Login" record with + // a pair of custom hidden fields for the private key and passphrase: + // the standard password field of the "Login" record refers to the + // user's own password, if any, not the passphrase of their key) + + // Use password "private key" custom field as fallback ... + Password passwordField = getField(custom, Password.class, PASSPHRASE_LABEL_PATTERN); + if (passwordField != null) + return getSingleStringValue(passwordField.getValue()); + + // ... or hidden "private key" custom field + HiddenField hiddenField = getField(custom, HiddenField.class, PASSPHRASE_LABEL_PATTERN); + if (hiddenField != null) + return getSingleStringValue(hiddenField.getValue()); + + return null; + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmSecretService.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmSecretService.java new file mode 100644 index 0000000..717a125 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/KsmSecretService.java @@ -0,0 +1,530 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.secret; + +import com.google.common.base.Objects; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.keepersecurity.secretsManager.core.KeeperRecord; +import com.keepersecurity.secretsManager.core.SecretsManagerOptions; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.Future; + +import javax.annotation.Nonnull; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Attributes; +import org.apache.guacamole.net.auth.Connectable; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.token.TokenFilter; +import org.apache.guacamole.vault.ksm.GuacamoleExceptionSupplier; +import org.apache.guacamole.vault.ksm.conf.KsmAttributeService; +import org.apache.guacamole.vault.ksm.conf.KsmConfigurationService; +import org.apache.guacamole.vault.ksm.user.KsmDirectory; +import org.apache.guacamole.vault.secret.VaultSecretService; +import org.apache.guacamole.vault.secret.WindowsUsername; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service which retrieves secrets from Keeper Secrets Manager. + * The configuration used to connect to KSM can be set at a global + * level using guacamole.properties, or using a connection group + * attribute. + */ +@Singleton +public class KsmSecretService implements VaultSecretService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(VaultSecretService.class); + + /** + * Service for retrieving data from records. + */ + @Inject + private KsmRecordService recordService; + + /** + * Service for retrieving configuration information. + */ + @Inject + private KsmConfigurationService confService; + + /** + * Factory for creating KSM client instances. + */ + @Inject + private KsmClientFactory ksmClientFactory; + + /** + * A map of base-64 encoded JSON KSM config blobs to associated KSM client instances. + * A distinct KSM client will exist for every KSM config. + */ + private final ConcurrentMap ksmClientMap = new ConcurrentHashMap<>(); + + /** + * Create and return a KSM client for the provided KSM config if not already + * present in the client map, otherwise return the existing client entry. + * + * @param ksmConfig + * The base-64 encoded JSON KSM config blob associated with the client entry. + * If an associated entry does not already exist, it will be created using + * this configuration. + * + * @return + * A KSM client for the provided KSM config if not already present in the + * client map, otherwise the existing client entry. + * + * @throws GuacamoleException + * If an error occurs while creating the KSM client. + */ + private KsmClient getClient(@Nonnull String ksmConfig) + throws GuacamoleException { + + // If a client already exists for the provided config, use it + KsmClient ksmClient = ksmClientMap.get(ksmConfig); + if (ksmClient != null) + return ksmClient; + + // Create and store a new KSM client instance for the provided KSM config blob + SecretsManagerOptions options = confService.getSecretsManagerOptions(ksmConfig); + ksmClient = ksmClientFactory.create(options, confService.getKsmApiInterval()); + KsmClient prevClient = ksmClientMap.putIfAbsent(ksmConfig, ksmClient); + + // If the client was already set before this thread got there, use the existing one + return prevClient != null ? prevClient : ksmClient; + } + + @Override + public String canonicalize(String nameComponent) { + try { + + // As Keeper notation is essentially a URL, encode all components + // using standard URL escaping + return URLEncoder.encode(nameComponent, "UTF-8"); + + } + catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("Unexpected lack of UTF-8 support.", e); + } + } + + @Override + public Future getValue(UserContext userContext, Connectable connectable, + String name) throws GuacamoleException { + + // Attempt to find a KSM config for this connection or group + String ksmConfig = getConnectionGroupKsmConfig(userContext, connectable); + + return getClient(ksmConfig).getSecret(name, new GuacamoleExceptionSupplier>() { + + @Override + public Future get() throws GuacamoleException { + + // Get the user-supplied KSM config, if allowed by config and + // set by the user + String userKsmConfig = getUserKSMConfig(userContext, connectable); + + // If the user config happens to be the same as admin-defined one, + // don't bother trying again + if (userKsmConfig != null && !Objects.equal(userKsmConfig, ksmConfig)) + return getClient(userKsmConfig).getSecret(name); + + return CompletableFuture.completedFuture(null); + } + + }); + } + + @Override + public Future getValue(String name) throws GuacamoleException { + + // Use the default KSM configuration from guacamole.properties + return getClient(confService.getKsmConfig()).getSecret(name); + } + + /** + * Adds contextual parameter tokens for the secrets in the given record to + * the given map of existing tokens. The values of each token are + * determined from secrets within the record. Depending on the record, this + * will be a subset of the username, password, private key, and passphrase. + * + * @param tokens + * The map of parameter tokens that any new tokens should be added to. + * + * @param prefix + * The prefix that should be prepended to each added token. + * + * @param record + * The record to retrieve secrets from when generating tokens. This may + * be null. + * + * @throws GuacamoleException + * If configuration details in guacamole.properties cannot be parsed. + */ + private void addRecordTokens(Map> tokens, String prefix, + KeeperRecord record) throws GuacamoleException { + + if (record == null) + return; + + // Domain of server-related record + String domain = recordService.getDomain(record); + if (domain != null) + tokens.put(prefix + "DOMAIN", CompletableFuture.completedFuture(domain)); + + // Username of server-related record + String username = recordService.getUsername(record); + if (username != null) { + + // If the record had no directly defined domain, but there is a + // username, and the configuration is enabled to split Windows + // domains out of usernames, attempt to split the domain out now + if (domain == null && confService.getSplitWindowsUsernames()) { + WindowsUsername usernameAndDomain = + WindowsUsername.splitWindowsUsernameFromDomain(username); + + // Always store the username token + tokens.put(prefix + "USERNAME", CompletableFuture.completedFuture( + usernameAndDomain.getUsername())); + + // Only store the domain if one is detected + if (usernameAndDomain.hasDomain()) + tokens.put(prefix + "DOMAIN", CompletableFuture.completedFuture( + usernameAndDomain.getDomain())); + + } + + // If splitting is not enabled, store the whole value in the USERNAME token + else { + tokens.put(prefix + "USERNAME", CompletableFuture.completedFuture(username)); + } + } + + // Password of server-related record + String password = recordService.getPassword(record); + if (password != null) + tokens.put(prefix + "PASSWORD", CompletableFuture.completedFuture(password)); + + // Key passphrase of server-related record + String passphrase = recordService.getPassphrase(record); + if (passphrase != null) + tokens.put(prefix + "PASSPHRASE", CompletableFuture.completedFuture(passphrase)); + + // Private key of server-related record + Future privateKey = recordService.getPrivateKey(record); + tokens.put(prefix + "KEY", privateKey); + + } + + /** + * Search for a KSM configuration attribute, recursing up the connection group tree + * until a connection group with the appropriate attribute is found. If the KSM config + * is found, it will be returned. If not, the default value from the config file will + * be returned. + * + * @param userContext + * The userContext associated with the connection or connection group. + * + * @param connectable + * A connection or connection group for which the tokens are being replaced. + * + * @return + * The value of the KSM configuration attribute if found in the tree, the default + * KSM config blob defined in guacamole.properties otherwise. + * + * @throws GuacamoleException + * If an error occurs while attempting to retrieve the KSM config attribute, or if + * no KSM config is found in the connection group tree, and the value is also not + * defined in the config file. + */ + @Nonnull + private String getConnectionGroupKsmConfig( + UserContext userContext, Connectable connectable) throws GuacamoleException { + + // Check to make sure it's a usable type before proceeding + if ( + !(connectable instanceof Connection) + && !(connectable instanceof ConnectionGroup)) { + logger.warn( + "Unsupported Connectable type: {}; skipping KSM config lookup.", + connectable.getClass()); + + // Use the default value if searching is impossible + return confService.getKsmConfig(); + } + + // For connections, start searching the parent group for the KSM config + // For connection groups, start searching the group directly + String parentIdentifier = (connectable instanceof Connection) + ? ((Connection) connectable).getParentIdentifier() + : ((ConnectionGroup) connectable).getIdentifier(); + + // Keep track of all group identifiers seen while recursing up the tree + // in case there's a cycle - if the same identifier is ever seen twice, + // the search is over. + Set observedIdentifiers = new HashSet<>(); + observedIdentifiers.add(parentIdentifier); + + // Use the unwrapped connection group directory to avoid KSM config + // value sanitization + Directory connectionGroupDirectory = ( + (KsmDirectory) userContext.getConnectionGroupDirectory() + ).getUnderlyingDirectory(); + + while (true) { + + // Fetch the parent group, if one exists + ConnectionGroup group = connectionGroupDirectory.get(parentIdentifier); + if (group == null) + break; + + // If the current connection group has the KSM configuration attribute + // set to a non-empty value, return immediately + String ksmConfig = group.getAttributes().get(KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE); + if (ksmConfig != null && !ksmConfig.trim().isEmpty()) + return ksmConfig; + + // Otherwise, keep searching up the tree until an appropriate configuration is found + parentIdentifier = group.getParentIdentifier(); + + // If the parent is a group that's already been seen, this is a cycle, so there's no + // need to search any further + if (!observedIdentifiers.add(parentIdentifier)) + break; + } + + // If no KSM configuration was ever found, use the default value + return confService.getKsmConfig(); + + } + + /** + * Returns true if user-level KSM configuration is enabled for the given + * Connectable, false otherwise. + * + * @param connectable + * The connectable to check for whether user-level KSM configs are + * enabled. + * + * @return + * True if user-level KSM configuration is enabled for the given + * Connectable, false otherwise. + */ + private boolean isKsmUserConfigEnabled(Connectable connectable) { + + // User-level config is enabled IFF the appropriate attribute is set to true + if (connectable instanceof Attributes) + return KsmAttributeService.TRUTH_VALUE.equals(((Attributes) connectable).getAttributes().get( + KsmAttributeService.KSM_USER_CONFIG_ENABLED_ATTRIBUTE)); + + // If there's no attributes to check, the user config cannot be enabled + return false; + + } + + /** + * Return the KSM config blob for the current user IFF user KSM configs + * are enabled globally, and are enabled for the given connectable. If no + * KSM config exists for the given user or KSM configs are not enabled, + * null will be returned. + * + * @param userContext + * The user context from which the current user should be fetched. + * + * @param connectable + * The connectable to which the connection is being established. This + * is the conneciton which will be checked to see if user KSM configs + * are enabled. + * + * @return + * The base64 encoded KSM config blob for the current user if one + * exists, and if user KSM configs are enabled globally and for the + * provided connectable. + * + * @throws GuacamoleException + * If an error occurs while attempting to fetch the KSM config. + */ + private String getUserKSMConfig( + UserContext userContext, Connectable connectable) throws GuacamoleException { + + // If user KSM configs are enabled globally, and for the given connectable, + // return the user-specific KSM config, if one exists + if (confService.getAllowUserConfig() && isKsmUserConfigEnabled(connectable)) { + + // Get the underlying user, to avoid the KSM config sanitization + User self = ( + ((KsmDirectory) userContext.getUserDirectory()) + .getUnderlyingDirectory().get(userContext.self().getIdentifier())); + + return self.getAttributes().get( + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE); + } + + + // If user-specific KSM config is disabled globally or for the given + // connectable, return null to indicate that no user config exists + return null; + } + + /** + * Use the provided KSM client to add parameter tokens tokens to the + * provided token map. The supplied filter will be used to replace + * existing tokens in the provided connection parameters before KSM + * record lookup. The supplied GuacamoleConfiguration instance will + * be used to check the protocol, in case RDP-specific behavior is + * needed. + + * @param config + * The GuacamoleConfiguration associated with the Connectable for which + * tokens are being added. + * + * @param ksm + * The KSM client to use when fetching records. + * + * @param tokens + * The tokens to which any fetched KSM record values should be added. + * + * @param parameters + * The connection parameters associated with the Connectable for which + * tokens are being added. + * + * @throws GuacamoleException + * If an error occurs while attempting to fetch KSM records or check + * configuration settings. + */ + private void addConnectableTokens( + GuacamoleConfiguration config, KsmClient ksm, Map> tokens, + Map parameters, TokenFilter filter) throws GuacamoleException { + + // Retrieve and define server-specific tokens, if any + String hostname = parameters.get("hostname"); + if (hostname != null && !hostname.isEmpty()) + addRecordTokens(tokens, "KEEPER_SERVER_", + ksm.getRecordByHost(filter.filter(hostname))); + + // Tokens specific to RDP + if ("rdp".equals(config.getProtocol())) { + + // Retrieve and define gateway server-specific tokens, if any + String gatewayHostname = parameters.get("gateway-hostname"); + if (gatewayHostname != null && !gatewayHostname.isEmpty()) + addRecordTokens(tokens, "KEEPER_GATEWAY_", + ksm.getRecordByHost(filter.filter(gatewayHostname))); + + // Retrieve and define domain tokens, if any + String domain = parameters.get("domain"); + String filteredDomain = null; + if (domain != null && !domain.isEmpty()) { + filteredDomain = filter.filter(domain); + addRecordTokens(tokens, "KEEPER_DOMAIN_", + ksm.getRecordByDomain(filteredDomain)); + } + + // Retrieve and define gateway domain tokens, if any + String gatewayDomain = parameters.get("gateway-domain"); + String filteredGatewayDomain = null; + if (gatewayDomain != null && !gatewayDomain.isEmpty()) { + filteredGatewayDomain = filter.filter(gatewayDomain); + addRecordTokens(tokens, "KEEPER_GATEWAY_DOMAIN_", + ksm.getRecordByDomain(filteredGatewayDomain)); + } + + // If domain matching is disabled for user records, + // explicitly set the domains to null when storing + // user records to enable username-only matching + if (!confService.getMatchUserRecordsByDomain()) { + filteredDomain = null; + filteredGatewayDomain = null; + } + + // Retrieve and define user-specific tokens, if any + String username = parameters.get("username"); + if (username != null && !username.isEmpty()) + addRecordTokens(tokens, "KEEPER_USER_", + ksm.getRecordByLogin(filter.filter(username), + filteredDomain)); + + // Retrieve and define gateway user-specific tokens, if any + String gatewayUsername = parameters.get("gateway-username"); + if (gatewayUsername != null && !gatewayUsername.isEmpty()) + addRecordTokens(tokens, "KEEPER_GATEWAY_USER_", + ksm.getRecordByLogin( + filter.filter(gatewayUsername), + filteredGatewayDomain)); + } + + else { + + // Retrieve and define user-specific tokens, if any + // NOTE that non-RDP connections do not have a domain + // field in the connection parameters, so the domain + // will always be null + String username = parameters.get("username"); + if (username != null && !username.isEmpty()) + addRecordTokens(tokens, "KEEPER_USER_", + ksm.getRecordByLogin(filter.filter(username), null)); + } + } + + @Override + public Map> getTokens(UserContext userContext, Connectable connectable, + GuacamoleConfiguration config, TokenFilter filter) throws GuacamoleException { + + Map> tokens = new HashMap<>(); + Map parameters = config.getParameters(); + + // Only use the user-specific KSM config if explicitly enabled in the global + // configuration, AND for the specific connectable being connected to + String userKsmConfig = getUserKSMConfig(userContext, connectable); + if (userKsmConfig != null && !userKsmConfig.trim().isEmpty()) + addConnectableTokens( + config, getClient(userKsmConfig), tokens, parameters, filter); + + // Add connection group or globally defined tokens after the user-specific + // ones to ensure that the user config will be overriden on collision + String ksmConfig = getConnectionGroupKsmConfig(userContext, connectable); + addConnectableTokens( + config, getClient(ksmConfig), tokens, parameters, filter); + + return tokens; + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/UserLogin.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/UserLogin.java new file mode 100644 index 0000000..5cd50ee --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/secret/UserLogin.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.secret; + +import java.util.Objects; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +/** + * A class intended for use as a key in KSM user record client cache. This + * class contains both a username and a password. When identifying a KSM + * record using token syntax like "KEEPER_USER_*", the user record will + * actually be identified by both the user and domain, if the appropriate + * settings are enabled. + */ +class UserLogin { + + /** + * The username associated with the user record. + * This field should never be null. + */ + private final String username; + + /** + * The domain associated with the user record. + * This field can be null. + */ + private final String domain; + + /** + * Create a new UserLogin instance with the provided username and + * domain. The domain may be null, but the username should never be. + * + * @param username + * The username to create the UserLogin instance with. This should + * never be null. + * + * @param domain + * The domain to create the UserLogin instance with. This can be null. + */ + UserLogin(@Nonnull String username, @Nullable String domain) { + this.username = username; + this.domain = domain; + } + + @Override + public int hashCode() { + + return Objects.hash(domain, username); + + } + + @Override + public boolean equals(Object obj) { + + // Check if the other object is this exact object + if (this == obj) + return true; + + // Check if the other object is null + if (obj == null) + return false; + + // Check if the other object is also a UserLogin + if (getClass() != obj.getClass()) + return false; + + // If the other object is also a UserLogin, it must + // have the same username and domain + UserLogin other = (UserLogin) obj; + return Objects.equals(username, other.username) + && Objects.equals(domain, other.domain); + + } + + /** + * Get the username associated with this UserLogin. + * + * @return + * The username associated with this UserLogin. + */ + public String getUsername() { + return username; + } + + + /** + * Get the domain associated with this UserLogin. + * + * @return + * The domain associated with this UserLogin. + */ + public String getDomain() { + return domain; + } + +} \ No newline at end of file diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmConnection.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmConnection.java new file mode 100644 index 0000000..3981486 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmConnection.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.user; + +import java.util.Map; + +import org.apache.guacamole.net.auth.DelegatingConnection; +import org.apache.guacamole.vault.ksm.conf.KsmAttributeService; +import org.apache.guacamole.net.auth.Connection; + +import com.google.common.collect.Maps; + +/** + * A Connection that explicitly adds a blank entry for any defined KSM + * connection attributes. This ensures that any such field will always + * be displayed to the user when editing a connection through the UI. + */ +public class KsmConnection extends DelegatingConnection { + + /** + * Create a new Vault connection wrapping the provided Connection record. Any + * attributes defined in the provided connection attribute forms will have empty + * values automatically populated when getAttributes() is called. + * + * @param connection + * The connection record to wrap. + */ + KsmConnection(Connection connection) { + super(connection); + } + + /** + * Return the underlying wrapped connection record. + * + * @return + * The wrapped connection record. + */ + Connection getUnderlyingConnection() { + return getDelegateConnection(); + } + + @Override + public Map getAttributes() { + + // Make a copy of the existing map + Map attributes = Maps.newHashMap(super.getAttributes()); + + // Add the user-config-enabled configuration attribute + attributes.putIfAbsent(KsmAttributeService.KSM_USER_CONFIG_ENABLED_ATTRIBUTE, null); + return attributes; + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmConnectionGroup.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmConnectionGroup.java new file mode 100644 index 0000000..68d4457 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmConnectionGroup.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.user; + +import java.util.Map; + +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.DelegatingConnectionGroup; +import org.apache.guacamole.vault.ksm.conf.KsmAttributeService; + +import com.google.common.collect.Maps; + + /** + * A KSM-specific connection group implementation that always exposes + * the KSM_CONFIGURATION_ATTRIBUTE attribute, even when no value is set. + * The value of the attribute will be sanitized if non-empty. This ensures + * that the attribute will always show up in the UI, even for connection + * groups that don't already have it set, and that any sensitive information + * in the attribute value will not be exposed. + */ + public class KsmConnectionGroup extends DelegatingConnectionGroup { + + /** + * Create a new KsmConnectionGroup wrapping the provided ConnectionGroup record. + * + * @param connectionGroup + * The ConnectionGroup record to wrap. + */ + KsmConnectionGroup(ConnectionGroup connectionGroup) { + super(connectionGroup); + } + + /** + * Return the underlying wrapped connection group record. + * + * @return + * The wrapped connection group record. + */ + ConnectionGroup getUnderlyingConnectionGroup() { + return getDelegateConnectionGroup(); + } + + /** + * Return the underlying ConnectionGroup that's wrapped by this KsmConnectionGroup. + * + * @return + * The underlying ConnectionGroup that's wrapped by this KsmConnectionGroup. + */ + ConnectionGroup getUnderlyConnectionGroup() { + return getDelegateConnectionGroup(); + } + + @Override + public Map getAttributes() { + + // Make a copy of the existing map + Map attributes = Maps.newHashMap(super.getAttributes()); + + // Sanitize the KSM configuration attribute, and ensure the attribute + // is always present + attributes.put( + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE, + KsmAttributeService.sanitizeKsmAttributeValue( + attributes.get(KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE))); + + return attributes; + } + + } \ No newline at end of file diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmDirectory.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmDirectory.java new file mode 100644 index 0000000..5cfcca9 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmDirectory.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.user; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.DelegatingDirectory; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * A KSM-specific version of DecoratingDirectory that exposes the underlying + * directory for when it's needed. + */ +public abstract class KsmDirectory + extends DelegatingDirectory { + + /** + * Create a new KsmDirectory, delegating to the provided directory. + * + * @param directory + * The directory to delegate to. + */ + public KsmDirectory(Directory directory) { + super(directory); + } + + /** + * Returns the underlying directory that this DecoratingDirectory is + * delegating to. + * + * @return + * The underlying directory. + */ + public Directory getUnderlyingDirectory() { + return getDelegateDirectory(); + } + + /** + * Process and return a potentially-modified version of the object + * with the same identifier in the wrapped directory. + * + * @param object + * The object from the underlying directory. + * + * @return + * A potentially-modified version of the object with the same + * identifier in the wrapped directory. + */ + protected abstract ObjectType wrap(ObjectType object); + + @Override + public ObjectType get(String identifier) throws GuacamoleException { + + // Process and return the object from the wrapped directory + return wrap(super.get(identifier)); + + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + + // Process and return each object from the wrapped directory + return super.getAll(identifiers).stream().map( + superObject -> wrap(superObject) + ).collect(Collectors.toList()); + + } + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmDirectoryService.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmDirectoryService.java new file mode 100644 index 0000000..18934c9 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmDirectoryService.java @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.user; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.DecoratingDirectory; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.vault.ksm.conf.KsmAttributeService; +import org.apache.guacamole.vault.user.VaultDirectoryService; + +import com.google.inject.Inject; + +/** + * A KSM-specific vault directory service that wraps the connection group directory + * to enable automatic translation of KSM one-time tokens into base64-encoded JSON + * config bundles. + */ +public class KsmDirectoryService extends VaultDirectoryService { + + /** + * A factory for constructing new KsmUser instances. + */ + @Inject + private KsmUserFactory ksmUserFactory; + + /** + * Service for retrieving any custom attributes defined for the + * current vault implementation and processing of said attributes. + */ + @Inject + private KsmAttributeService attributeService; + + @Override + public Directory getConnectionDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // A Connection directory that will decorate all connections with a + // KsmConnection wrapper to ensure that all defined KSM fields will + // be exposed in the connection group attributes. + return new DecoratingDirectory(underlyingDirectory) { + + @Override + protected Connection decorate(Connection connection) throws GuacamoleException { + + // Wrap in a KsmConnection class to ensure that all defined KSM fields will be + // present + return new KsmConnection(connection); + } + + @Override + protected Connection undecorate(Connection connection) throws GuacamoleException { + + // Unwrap the KsmConnection + return ((KsmConnection) connection).getUnderlyingConnection(); + } + + }; + } + + @Override + public Directory getConnectionGroupDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // A ConnectionGroup directory that will intercept add and update calls to + // validate KSM configurations, and translate one-time-tokens, if possible, + // as well as ensuring that all ConnectionGroups returned include the + // KSM_CONFIGURATION_ATTRIBUTE attribute, so it will be available in the UI. + // The value of the KSM_CONFIGURATION_ATTRIBUTE will be sanitized if set. + return new KsmDirectory(underlyingDirectory) { + + @Override + public void add(ConnectionGroup connectionGroup) throws GuacamoleException { + + // Process attribute values before saving + connectionGroup.setAttributes( + attributeService.processAttributes( + connectionGroup.getAttributes())); + + super.add(connectionGroup); + } + + @Override + public void update(ConnectionGroup connectionGroup) throws GuacamoleException { + + // Unwrap the existing ConnectionGroup + if (connectionGroup instanceof KsmConnectionGroup) + connectionGroup = ((KsmConnectionGroup) connectionGroup).getUnderlyingConnectionGroup(); + + // Process attribute values before saving + connectionGroup.setAttributes( + attributeService.processAttributes( + connectionGroup.getAttributes())); + + super.update(connectionGroup); + + } + + @Override + protected ConnectionGroup wrap(ConnectionGroup object) { + + // Do not process the ConnectionGroup further if it does not exist + if (object == null) + return null; + + // Sanitize values when a ConnectionGroup is fetched from the directory + return new KsmConnectionGroup(object); + + } + + }; + } + + @Override + public Directory getUserDirectory( + Directory underlyingDirectory) throws GuacamoleException { + + // A User directory that will intercept add and update calls to + // validate KSM configurations, and translate one-time-tokens, if possible + // Additionally, this directory will will decorate all users with a + // KsmUser wrapper to ensure that all defined KSM fields will be exposed + // in the user attributes. The value of the KSM_CONFIGURATION_ATTRIBUTE + // will be sanitized if set. + return new KsmDirectory(underlyingDirectory) { + + @Override + public void add(User user) throws GuacamoleException { + + // Process attribute values before saving + user.setAttributes( + attributeService.processAttributes( + user.getAttributes())); + + super.add(user); + } + + @Override + public void update(User user) throws GuacamoleException { + + // Unwrap the existing user + if (user instanceof KsmUser) + user = ((KsmUser) user).getUnderlyingUser(); + + // Process attribute values before saving + user.setAttributes( + attributeService.processAttributes( + user.getAttributes())); + + super.update(user); + + } + + @Override + protected User wrap(User object) { + + // Do not process the user further if it does not exist + if (object == null) + return null; + + // Sanitize values when a user is fetched from the directory + return ksmUserFactory.create(object); + + } + + }; + } +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmUser.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmUser.java new file mode 100644 index 0000000..9c002eb --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmUser.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.user; + +import java.util.Map; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.DelegatingUser; +import org.apache.guacamole.vault.ksm.conf.KsmAttributeService; +import org.apache.guacamole.vault.ksm.conf.KsmConfigurationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Maps; +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; + + /** + * A KSM-specific user implementation that exposes the + * KSM_CONFIGURATION_ATTRIBUTE attribute even if no value is set. but only + * if user-specific KSM configuration is enabled. The value of the attribute + * will be sanitized if non-empty. This ensures that the attribute will always + * show up in the UI when the feature is enabled, even for users that don't + * already have it set, and that any sensitive information in the attribute + * value will not be exposed. + */ + public class KsmUser extends DelegatingUser { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(KsmUser.class); + + /** + * Service for retrieving KSM configuration details. + */ + @Inject + private KsmConfigurationService configurationService; + + /** + * Create a new Ksmuser wrapping the provided User record. + * + * @param user + * The User record to wrap. + */ + @AssistedInject + KsmUser(@Assisted User user) { + super(user); + } + + /** + * Return the underlying wrapped user record. + * + * @return + * The wrapped user record. + */ + User getUnderlyingUser() { + return getDelegateUser(); + } + + @Override + public Map getAttributes() { + + // Make a copy of the existing map + Map attributes = Maps.newHashMap(super.getAttributes()); + + // Figure out if user-level KSM config is enabled + boolean userKsmConfigEnabled = false; + try { + userKsmConfigEnabled = configurationService.getAllowUserConfig(); + } catch (GuacamoleException e) { + + logger.warn( + "Disabling user KSM config due to exception: {}" + , e.getMessage()); + logger.debug("Error looking up if user KSM config is enabled.", e); + + } + + // If user-specific KSM configuration is not enabled, do not expose the + // attribute at all + if (!userKsmConfigEnabled) + attributes.remove(KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE); + + else + // Sanitize the KSM configuration attribute, and ensure the attribute + // is always present + attributes.put( + KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE, + KsmAttributeService.sanitizeKsmAttributeValue( + attributes.get(KsmAttributeService.KSM_CONFIGURATION_ATTRIBUTE))); + + return attributes; + } + + } \ No newline at end of file diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmUserFactory.java b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmUserFactory.java new file mode 100644 index 0000000..9aafbb6 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/java/org/apache/guacamole/vault/ksm/user/KsmUserFactory.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.vault.ksm.user; + +import org.apache.guacamole.net.auth.User; + +/** + * Factory for creating KSM-specific users, which wrap an underlying User. + */ +public interface KsmUserFactory { + + /** + * Returns a new instance of a KsmUser, wrapping the provided underlying User. + * + * @param user + * The underlying User that should be wrapped. + * + * @return + * A new instance of a KsmUser, wrapping the provided underlying User. + */ + KsmUser create(User user); + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/resources/guac-manifest.json b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/resources/guac-manifest.json new file mode 100644 index 0000000..af4e4f3 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/resources/guac-manifest.json @@ -0,0 +1,16 @@ +{ + + "guacamoleVersion" : "1.6.0", + + "name" : "Keeper Secrets Manager", + "namespace" : "keeper-secrets-manager", + + "authProviders" : [ + "org.apache.guacamole.vault.ksm.KsmAuthenticationProvider" + ], + + "translations" : [ + "translations/en.json" + ] + +} diff --git a/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/resources/translations/en.json b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/resources/translations/en.json new file mode 100644 index 0000000..034f5f2 --- /dev/null +++ b/extensions/guacamole-vault/modules/guacamole-vault-ksm/src/main/resources/translations/en.json @@ -0,0 +1,25 @@ +{ + + "DATA_SOURCE_KEEPER_SECRETS_MANAGER" : { + "NAME" : "Keeper Secrets Manager" + }, + + "CONNECTION_ATTRIBUTES" : { + "SECTION_HEADER_KSM_CONFIG" : "Keeper Secrets Manager", + "FIELD_HEADER_KSM_USER_CONFIG_ENABLED" : "Allow user-provided KSM configuration" + }, + + "CONNECTION_GROUP_ATTRIBUTES" : { + "SECTION_HEADER_KSM_CONFIG" : "Keeper Secrets Manager", + "FIELD_HEADER_KSM_CONFIG" : "KSM Service Configuration ", + + "ERROR_INVALID_KSM_CONFIG_BLOB" : "The provided base64-encoded KSM configuration blob is not valid. Please ensure that you have copied the entire blob.", + "ERROR_INVALID_KSM_ONE_TIME_TOKEN" : "The provided configuration is not a valid KSM one-time token or base64-encoded configuration blob. Please ensure that you have copied the entire token value." + }, + + "USER_ATTRIBUTES" : { + "SECTION_HEADER_KSM_CONFIG" : "Keeper Secrets Manager", + "FIELD_HEADER_KSM_CONFIG" : "KSM Service Configuration " + } + +} diff --git a/extensions/guacamole-vault/pom.xml b/extensions/guacamole-vault/pom.xml new file mode 100644 index 0000000..a8ea92c --- /dev/null +++ b/extensions/guacamole-vault/pom.xml @@ -0,0 +1,67 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-vault + pom + 1.6.0 + guacamole-vault + http://guacamole.apache.org/ + + + org.apache.guacamole + extensions + 1.6.0 + ../ + + + + + + modules/guacamole-vault-dist + + + modules/guacamole-vault-base + + + modules/guacamole-vault-ksm + + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + provided + + + + + + diff --git a/extensions/pom.xml b/extensions/pom.xml new file mode 100644 index 0000000..53512ad --- /dev/null +++ b/extensions/pom.xml @@ -0,0 +1,149 @@ + + + + + 4.0.0 + org.apache.guacamole + extensions + pom + 1.6.0 + extensions + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-client + 1.6.0 + ../ + + + + + + guacamole-auth-ban + guacamole-auth-duo + guacamole-auth-header + guacamole-auth-jdbc + guacamole-auth-json + guacamole-auth-ldap + guacamole-auth-quickconnect + guacamole-auth-restrict + guacamole-auth-sso + guacamole-auth-totp + + + guacamole-history-recording-storage + guacamole-vault + + + guacamole-display-statistics + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + copy-runtime-dependencies + prepare-package + + copy-dependencies + + + runtime + ${project.build.directory}/classes + + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + generate-license-files + generate-resources + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + never-bundle-slf4j + + + + + org.slf4j:*:*:*:compile + org.slf4j:*:*:*:runtime + + + + + + enforce + + + + + + + + + + + + + org.slf4j + slf4j-api + provided + + + + + + + + + lgpl-extensions + + guacamole-auth-radius + + + + + + diff --git a/guacamole-common-js/.gitignore b/guacamole-common-js/.gitignore new file mode 100644 index 0000000..cc194bb --- /dev/null +++ b/guacamole-common-js/.gitignore @@ -0,0 +1,4 @@ +node/ +node_modules/ +target/ +*~ diff --git a/guacamole-common-js/.ratignore b/guacamole-common-js/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/guacamole-common-js/jsdoc-conf.json b/guacamole-common-js/jsdoc-conf.json new file mode 100644 index 0000000..4b43bfb --- /dev/null +++ b/guacamole-common-js/jsdoc-conf.json @@ -0,0 +1,14 @@ +{ + "source" : { + "include" : "src" + }, + "opts" : { + "recurse" : true, + "destination" : "target/apidocs" + }, + "templates" : { + "default" : { + "useLongnameInNav" : true + } + } +} diff --git a/guacamole-common-js/karma-ci.conf.js b/guacamole-common-js/karma-ci.conf.js new file mode 100644 index 0000000..859335b --- /dev/null +++ b/guacamole-common-js/karma-ci.conf.js @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A karma configuration intended for use in builds or CI. Runs all discovered + * unit tests under a headless firefox browser and immediately exits. + */ +module.exports = function(config) { + config.set({ + + // Discover and run jasmine tests + frameworks: ['jasmine'], + + // Pattern matching all javascript source and tests + files: [ + 'src/**/*.js' + ], + + // Run the tests once and exit + singleRun: true, + + // Disable automatic test running on changed files + autoWatch: false, + + // Use a headless firefox browser to run the tests + browsers: ['FirefoxHeadless'], + customLaunchers: { + 'FirefoxHeadless': { + base: 'Firefox', + flags: [ + '--headless' + ] + } + } + + }); + +}; diff --git a/guacamole-common-js/package-lock.json b/guacamole-common-js/package-lock.json new file mode 100644 index 0000000..e488cfa --- /dev/null +++ b/guacamole-common-js/package-lock.json @@ -0,0 +1,1881 @@ +{ + "name": "guacamole-common-js", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "jsdoc": "^4.0.3", + "karma": "^6.4.4", + "karma-firefox-launcher": "^2.1.3", + "karma-jasmine": "^5.1.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz", + "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", + "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "dev": true + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-firefox-launcher": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz", + "integrity": "sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==", + "dev": true, + "dependencies": { + "is-wsl": "^2.2.0", + "which": "^3.0.0" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/log4js/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/streamroller/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/guacamole-common-js/package.json b/guacamole-common-js/package.json new file mode 100644 index 0000000..b23b112 --- /dev/null +++ b/guacamole-common-js/package.json @@ -0,0 +1,9 @@ +{ + "description": "Dependencies to be installed by Maven for running unit tests and generating documentation", + "devDependencies": { + "jsdoc": "^4.0.3", + "karma": "^6.4.4", + "karma-firefox-launcher": "^2.1.3", + "karma-jasmine": "^5.1.0" + } +} diff --git a/guacamole-common-js/pom.xml b/guacamole-common-js/pom.xml new file mode 100644 index 0000000..8a34eec --- /dev/null +++ b/guacamole-common-js/pom.xml @@ -0,0 +1,237 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-common-js + pom + 1.6.0 + guacamole-common-js + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-client + 1.6.0 + ../ + + + + + + ${project.build.directory}/tmp + + + true + + + + + The base JavaScript API of the Guacamole project, providing JavaScript + support for the Guacamole stack, including a full client + implementation for the Guacamole protocol. + + + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + https://github.com/apache/guacamole-client + scm:git:https://git.wip-us.apache.org/repos/asf/guacamole-client.git + + + + + + + + + maven-assembly-plugin + + false + + static.xml + + + + + make-zip + package + + single + + + + + + + + com.github.buckelieg + minify-maven-plugin + + + default-minify + + + UTF-8 + CLOSURE + + / + / + all.js + + + common/license.js + + + + modules/**/*.js + + + + + minify + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + ${skipTests} + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.1.0 + + + createFirefoxTempdir + test + + + + + + + run + + + + + + + + com.github.eirslett + frontend-maven-plugin + 1.12.1 + + + + + v16.19.1 + + + ci + + + karma-ci.conf.js + + + + ${firefox.temp.dir} + + + + + + + + + install-node-and-npm + process-sources + + install-node-and-npm + + + + + + generate-docs + + npx + + package + + jsdoc -c jsdoc-conf.json + + + + + + npm-install + test + + npm + + + + + + run-tests + test + + karma + + + + + + + + + + + diff --git a/guacamole-common-js/src/main/webapp/common/license.js b/guacamole-common-js/src/main/webapp/common/license.js new file mode 100644 index 0000000..042f3ce --- /dev/null +++ b/guacamole-common-js/src/main/webapp/common/license.js @@ -0,0 +1,18 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ diff --git a/guacamole-common-js/src/main/webapp/modules/ArrayBufferReader.js b/guacamole-common-js/src/main/webapp/modules/ArrayBufferReader.js new file mode 100644 index 0000000..ea3a009 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/ArrayBufferReader.js @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A reader which automatically handles the given input stream, returning + * strictly received packets as array buffers. Note that this object will + * overwrite any installed event handlers on the given Guacamole.InputStream. + * + * @constructor + * @param {!Guacamole.InputStream} stream + * The stream that data will be read from. + */ +Guacamole.ArrayBufferReader = function(stream) { + + /** + * Reference to this Guacamole.InputStream. + * @private + */ + var guac_reader = this; + + // Receive blobs as array buffers + stream.onblob = function(data) { + + var arrayBuffer, bufferView; + + // Use native methods for directly decoding base64 to an array buffer + // when possible + if (Uint8Array.fromBase64) { + bufferView = Uint8Array.fromBase64(data); + arrayBuffer = bufferView.buffer; + } + + // Rely on binary strings and manual conversions where native methods + // like fromBase64() are not available + else { + + var binary = window.atob(data); + arrayBuffer = new ArrayBuffer(binary.length); + bufferView = new Uint8Array(arrayBuffer); + + for (var i=0; istart and ending at end - 1. + */ + var slice = function slice(blob, start, end) { + + // Use prefixed implementations if necessary + var sliceImplementation = ( + blob.slice + || blob.webkitSlice + || blob.mozSlice + ).bind(blob); + + var length = end - start; + + // The old Blob.slice() was length-based (not end-based). Try the + // length version first, if the two calls are not equivalent. + if (length !== end) { + + // If the result of the slice() call matches the expected length, + // trust that result. It must be correct. + var sliceResult = sliceImplementation(start, length); + if (sliceResult.size === length) + return sliceResult; + + } + + // Otherwise, use the most-recent standard: end-based slice() + return sliceImplementation(start, end); + + }; + + /** + * Sends the contents of the given blob over the underlying stream. + * + * @param {!Blob} blob + * The blob to send. + */ + this.sendBlob = function sendBlob(blob) { + + var offset = 0; + var reader = new FileReader(); + + /** + * Reads the next chunk of the blob provided to + * [sendBlob()]{@link Guacamole.BlobWriter#sendBlob}. The chunk itself + * is read asynchronously, and will not be available until + * reader.onload fires. + * + * @private + */ + var readNextChunk = function readNextChunk() { + + // If no further chunks remain, inform of completion and stop + if (offset >= blob.size) { + + // Fire completion event for completed blob + if (guacWriter.oncomplete) + guacWriter.oncomplete(blob); + + // No further chunks to read + return; + + } + + // Obtain reference to next chunk as a new blob + var chunk = slice(blob, offset, offset + arrayBufferWriter.blobLength); + offset += arrayBufferWriter.blobLength; + + // Attempt to read the blob contents represented by the blob into + // a new array buffer + reader.readAsArrayBuffer(chunk); + + }; + + // Send each chunk over the stream, continue reading the next chunk + reader.onload = function chunkLoadComplete() { + + // Send the successfully-read chunk + arrayBufferWriter.sendData(reader.result); + + // Continue sending more chunks after the latest chunk is + // acknowledged + arrayBufferWriter.onack = function sendMoreChunks(status) { + + if (guacWriter.onack) + guacWriter.onack(status); + + // Abort transfer if an error occurs + if (status.isError()) + return; + + // Inform of blob upload progress via progress events + if (guacWriter.onprogress) + guacWriter.onprogress(blob, offset - arrayBufferWriter.blobLength); + + // Queue the next chunk for reading + readNextChunk(); + + }; + + }; + + // If an error prevents further reading, inform of error and stop + reader.onerror = function chunkLoadFailed() { + + // Fire error event, including the context of the error + if (guacWriter.onerror) + guacWriter.onerror(blob, offset, reader.error); + + }; + + // Begin reading the first chunk + readNextChunk(); + + }; + + /** + * Signals that no further text will be sent, effectively closing the + * stream. + */ + this.sendEnd = function sendEnd() { + arrayBufferWriter.sendEnd(); + }; + + /** + * Fired for received data, if acknowledged by the server. + * + * @event + * @param {!Guacamole.Status} status + * The status of the operation. + */ + this.onack = null; + + /** + * Fired when an error occurs reading a blob passed to + * [sendBlob()]{@link Guacamole.BlobWriter#sendBlob}. The transfer for the + * the given blob will cease, but the stream will remain open. + * + * @event + * @param {!Blob} blob + * The blob that was being read when the error occurred. + * + * @param {!number} offset + * The offset of the failed read attempt within the blob, in bytes. + * + * @param {!DOMError} error + * The error that occurred. + */ + this.onerror = null; + + /** + * Fired for each successfully-read chunk of data as a blob is being sent + * via [sendBlob()]{@link Guacamole.BlobWriter#sendBlob}. + * + * @event + * @param {!Blob} blob + * The blob that is being read. + * + * @param {!number} offset + * The offset of the read that just succeeded. + */ + this.onprogress = null; + + /** + * Fired when a blob passed to + * [sendBlob()]{@link Guacamole.BlobWriter#sendBlob} has finished being + * sent. + * + * @event + * @param {!Blob} blob + * The blob that was sent. + */ + this.oncomplete = null; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Client.js b/guacamole-common-js/src/main/webapp/modules/Client.js new file mode 100644 index 0000000..03dee3e --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Client.js @@ -0,0 +1,2081 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Guacamole protocol client. Given a {@link Guacamole.Tunnel}, + * automatically handles incoming and outgoing Guacamole instructions via the + * provided tunnel, updating its display using one or more canvas elements. + * + * @constructor + * @param {!Guacamole.Tunnel} tunnel + * The tunnel to use to send and receive Guacamole instructions. + */ +Guacamole.Client = function(tunnel) { + + var guac_client = this; + + var currentState = Guacamole.Client.State.IDLE; + + var currentTimestamp = 0; + + /** + * The rough number of milliseconds to wait between sending keep-alive + * pings. This may vary depending on how frequently the browser allows + * timers to run, as well as how frequently the client receives messages + * from the server. + * + * @private + * @constant + * @type {!number} + */ + var KEEP_ALIVE_FREQUENCY = 5000; + + /** + * The current keep-alive ping timeout ID, if any. This will only be set + * upon connecting. + * + * @private + * @type {number} + */ + var keepAliveTimeout = null; + + /** + * The timestamp of the point in time that the last keep-live ping was + * sent, in milliseconds elapsed since midnight of January 1, 1970 UTC. + * + * @private + * @type {!number} + */ + var lastSentKeepAlive = 0; + + /** + * Translation from Guacamole protocol line caps to Layer line caps. + * + * @private + * @type {!Object.} + */ + var lineCap = { + 0: "butt", + 1: "round", + 2: "square" + }; + + /** + * Translation from Guacamole protocol line caps to Layer line caps. + * + * @private + * @type {!Object.} + */ + var lineJoin = { + 0: "bevel", + 1: "miter", + 2: "round" + }; + + /** + * The underlying Guacamole display. + * + * @private + * @type {!Guacamole.Display} + */ + var display = new Guacamole.Display(); + + /** + * All available layers and buffers + * + * @private + * @type {!Object.} + */ + var layers = {}; + + /** + * All audio players currently in use by the client. Initially, this will + * be empty, but audio players may be allocated by the server upon request. + * + * @private + * @type {!Object.} + */ + var audioPlayers = {}; + + /** + * All video players currently in use by the client. Initially, this will + * be empty, but video players may be allocated by the server upon request. + * + * @private + * @type {!Object.} + */ + var videoPlayers = {}; + + // No initial parsers + var parsers = []; + + // No initial streams + var streams = []; + + /** + * All current objects. The index of each object is dictated by the + * Guacamole server. + * + * @private + * @type {!Guacamole.Object[]} + */ + var objects = []; + + // Pool of available stream indices + var stream_indices = new Guacamole.IntegerPool(); + + // Array of allocated output streams by index + var output_streams = []; + + function setState(state) { + if (state != currentState) { + currentState = state; + if (guac_client.onstatechange) + guac_client.onstatechange(currentState); + } + } + + function isConnected() { + return currentState == Guacamole.Client.State.CONNECTED + || currentState == Guacamole.Client.State.WAITING; + } + + /** + * Produces an opaque representation of Guacamole.Client state which can be + * later imported through a call to importState(). This object is + * effectively an independent, compressed snapshot of protocol and display + * state. Invoking this function implicitly flushes the display. + * + * @param {!function} callback + * Callback which should be invoked once the state object is ready. The + * state object will be passed to the callback as the sole parameter. + * This callback may be invoked immediately, or later as the display + * finishes rendering and becomes ready. + */ + this.exportState = function exportState(callback) { + + // Start with empty state + var state = { + 'currentState' : currentState, + 'currentTimestamp' : currentTimestamp, + 'layers' : {} + }; + + var layersSnapshot = {}; + + // Make a copy of all current layers (protocol state) + for (var key in layers) { + layersSnapshot[key] = layers[key]; + } + + // Populate layers once data is available (display state, requires flush) + display.flush(function populateLayers() { + + // Export each defined layer/buffer + for (var key in layersSnapshot) { + + var index = parseInt(key); + var layer = layersSnapshot[key]; + + // Store layer/buffer dimensions + var exportLayer = { + 'width' : layer.width, + 'height' : layer.height + }; + + // Store layer/buffer image data, if it can be generated + if (layer.width && layer.height) { + var canvas = layer.toCanvas(); + exportLayer.url = canvas.toDataURL('image/png'); + } + + // Add layer properties if not a buffer nor the default layer + if (index > 0) { + exportLayer.x = layer.x; + exportLayer.y = layer.y; + exportLayer.z = layer.z; + exportLayer.alpha = layer.alpha; + exportLayer.matrix = layer.matrix; + exportLayer.parent = getLayerIndex(layer.parent); + } + + // Store exported layer + state.layers[key] = exportLayer; + + } + + // Invoke callback now that the state is ready + callback(state); + + }); + + }; + + /** + * Restores Guacamole.Client protocol and display state based on an opaque + * object from a prior call to exportState(). The Guacamole.Client instance + * used to export that state need not be the same as this instance. + * + * @param {!object} state + * An opaque representation of Guacamole.Client state from a prior call + * to exportState(). + * + * @param {function} [callback] + * The function to invoke when state has finished being imported. This + * may happen immediately, or later as images within the provided state + * object are loaded. + */ + this.importState = function importState(state, callback) { + + var key; + var index; + + currentState = state.currentState; + currentTimestamp = state.currentTimestamp; + + // Cancel any pending display operations/frames + display.cancel(); + + // Dispose of all layers + for (key in layers) { + index = parseInt(key); + if (index > 0) + layers[key].dispose(); + } + + layers = {}; + + // Import state of each layer/buffer + for (key in state.layers) { + + index = parseInt(key); + + var importLayer = state.layers[key]; + var layer = getLayer(index); + + // Reset layer size + display.resize(layer, importLayer.width, importLayer.height); + + // Initialize new layer if it has associated data + if (importLayer.url) { + display.setChannelMask(layer, Guacamole.Layer.SRC); + display.draw(layer, 0, 0, importLayer.url); + } + + // Set layer-specific properties if not a buffer nor the default layer + if (index > 0 && importLayer.parent >= 0) { + + // Apply layer position and set parent + var parent = getLayer(importLayer.parent); + display.move(layer, parent, importLayer.x, importLayer.y, importLayer.z); + + // Set layer transparency + display.shade(layer, importLayer.alpha); + + // Apply matrix transform + var matrix = importLayer.matrix; + display.distort(layer, + matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + + } + + } + + // Flush changes to display + display.flush(callback); + + }; + + /** + * Returns the underlying display of this Guacamole.Client. The display + * contains an Element which can be added to the DOM, causing the + * display to become visible. + * + * @return {!Guacamole.Display} + * The underlying display of this Guacamole.Client. + */ + this.getDisplay = function() { + return display; + }; + + /** + * Sends the current size of the screen. + * + * @param {!number} width + * The width of the screen. + * + * @param {!number} height + * The height of the screen. + */ + this.sendSize = function(width, height) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + tunnel.sendMessage("size", width, height); + + }; + + /** + * Sends a key event having the given properties as if the user + * pressed or released a key. + * + * @param {!boolean} pressed + * Whether the key is pressed (true) or released (false). + * + * @param {!number} keysym + * The keysym of the key being pressed or released. + */ + this.sendKeyEvent = function(pressed, keysym) { + // Do not send requests if not connected + if (!isConnected()) + return; + + tunnel.sendMessage("key", keysym, pressed); + }; + + /** + * Sends a mouse event having the properties provided by the given mouse + * state. + * + * @param {!Guacamole.Mouse.State} mouseState + * The state of the mouse to send in the mouse event. + * + * @param {boolean} [applyDisplayScale=false] + * Whether the provided mouse state uses local display units, rather + * than remote display units, and should be scaled to match the + * {@link Guacamole.Display}. + */ + this.sendMouseState = function sendMouseState(mouseState, applyDisplayScale) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + var x = mouseState.x; + var y = mouseState.y; + + // Translate for display units if requested + if (applyDisplayScale) { + x /= display.getScale(); + y /= display.getScale(); + } + + // Update client-side cursor + display.moveCursor( + Math.floor(x), + Math.floor(y) + ); + + // Build mask + var buttonMask = 0; + if (mouseState.left) buttonMask |= 1; + if (mouseState.middle) buttonMask |= 2; + if (mouseState.right) buttonMask |= 4; + if (mouseState.up) buttonMask |= 8; + if (mouseState.down) buttonMask |= 16; + + // Send message + tunnel.sendMessage("mouse", Math.floor(x), Math.floor(y), buttonMask); + }; + + /** + * Sends a touch event having the properties provided by the given touch + * state. + * + * @param {!Guacamole.Touch.State} touchState + * The state of the touch contact to send in the touch event. + * + * @param {boolean} [applyDisplayScale=false] + * Whether the provided touch state uses local display units, rather + * than remote display units, and should be scaled to match the + * {@link Guacamole.Display}. + */ + this.sendTouchState = function sendTouchState(touchState, applyDisplayScale) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + var x = touchState.x; + var y = touchState.y; + + // Translate for display units if requested + if (applyDisplayScale) { + x /= display.getScale(); + y /= display.getScale(); + } + + tunnel.sendMessage('touch', touchState.id, Math.floor(x), Math.floor(y), + Math.floor(touchState.radiusX), Math.floor(touchState.radiusY), + touchState.angle, touchState.force); + + }; + + /** + * Allocates an available stream index and creates a new + * Guacamole.OutputStream using that index, associating the resulting + * stream with this Guacamole.Client. Note that this stream will not yet + * exist as far as the other end of the Guacamole connection is concerned. + * Streams exist within the Guacamole protocol only when referenced by an + * instruction which creates the stream, such as a "clipboard", "file", or + * "pipe" instruction. + * + * @returns {!Guacamole.OutputStream} + * A new Guacamole.OutputStream with a newly-allocated index and + * associated with this Guacamole.Client. + */ + this.createOutputStream = function createOutputStream() { + + // Allocate index + var index = stream_indices.next(); + + // Return new stream + var stream = output_streams[index] = new Guacamole.OutputStream(guac_client, index); + return stream; + + }; + + /** + * Opens a new audio stream for writing, where audio data having the give + * mimetype will be sent along the returned stream. The instruction + * necessary to create this stream will automatically be sent. + * + * @param {!string} mimetype + * The mimetype of the audio data that will be sent along the returned + * stream. + * + * @return {!Guacamole.OutputStream} + * The created audio stream. + */ + this.createAudioStream = function(mimetype) { + + // Allocate and associate stream with audio metadata + var stream = guac_client.createOutputStream(); + tunnel.sendMessage("audio", stream.index, mimetype); + return stream; + + }; + + /** + * Opens a new file for writing, having the given index, mimetype and + * filename. The instruction necessary to create this stream will + * automatically be sent. + * + * @param {!string} mimetype + * The mimetype of the file being sent. + * + * @param {!string} filename + * The filename of the file being sent. + * + * @return {!Guacamole.OutputStream} + * The created file stream. + */ + this.createFileStream = function(mimetype, filename) { + + // Allocate and associate stream with file metadata + var stream = guac_client.createOutputStream(); + tunnel.sendMessage("file", stream.index, mimetype, filename); + return stream; + + }; + + /** + * Opens a new pipe for writing, having the given name and mimetype. The + * instruction necessary to create this stream will automatically be sent. + * + * @param {!string} mimetype + * The mimetype of the data being sent. + * + * @param {!string} name + * The name of the pipe. + * + * @return {!Guacamole.OutputStream} + * The created file stream. + */ + this.createPipeStream = function(mimetype, name) { + + // Allocate and associate stream with pipe metadata + var stream = guac_client.createOutputStream(); + tunnel.sendMessage("pipe", stream.index, mimetype, name); + return stream; + + }; + + /** + * Opens a new clipboard object for writing, having the given mimetype. The + * instruction necessary to create this stream will automatically be sent. + * + * @param {!string} mimetype + * The mimetype of the data being sent. + * + * @param {!string} name + * The name of the pipe. + * + * @return {!Guacamole.OutputStream} + * The created file stream. + */ + this.createClipboardStream = function(mimetype) { + + // Allocate and associate stream with clipboard metadata + var stream = guac_client.createOutputStream(); + tunnel.sendMessage("clipboard", stream.index, mimetype); + return stream; + + }; + + /** + * Opens a new argument value stream for writing, having the given + * parameter name and mimetype, requesting that the connection parameter + * with the given name be updated to the value described by the contents + * of the following stream. The instruction necessary to create this stream + * will automatically be sent. + * + * @param {!string} mimetype + * The mimetype of the data being sent. + * + * @param {!string} name + * The name of the connection parameter to attempt to update. + * + * @return {!Guacamole.OutputStream} + * The created argument value stream. + */ + this.createArgumentValueStream = function createArgumentValueStream(mimetype, name) { + + // Allocate and associate stream with argument value metadata + var stream = guac_client.createOutputStream(); + tunnel.sendMessage("argv", stream.index, mimetype, name); + return stream; + + }; + + /** + * Creates a new output stream associated with the given object and having + * the given mimetype and name. The legality of a mimetype and name is + * dictated by the object itself. The instruction necessary to create this + * stream will automatically be sent. + * + * @param {!number} index + * The index of the object for which the output stream is being + * created. + * + * @param {!string} mimetype + * The mimetype of the data which will be sent to the output stream. + * + * @param {!string} name + * The defined name of an output stream within the given object. + * + * @returns {!Guacamole.OutputStream} + * An output stream which will write blobs to the named output stream + * of the given object. + */ + this.createObjectOutputStream = function createObjectOutputStream(index, mimetype, name) { + + // Allocate and associate stream with object metadata + var stream = guac_client.createOutputStream(); + tunnel.sendMessage("put", index, stream.index, mimetype, name); + return stream; + + }; + + /** + * Requests read access to the input stream having the given name. If + * successful, a new input stream will be created. + * + * @param {!number} index + * The index of the object from which the input stream is being + * requested. + * + * @param {!string} name + * The name of the input stream to request. + */ + this.requestObjectInputStream = function requestObjectInputStream(index, name) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + tunnel.sendMessage("get", index, name); + }; + + /** + * Acknowledge receipt of a blob on the stream with the given index. + * + * @param {!number} index + * The index of the stream associated with the received blob. + * + * @param {!string} message + * A human-readable message describing the error or status. + * + * @param {!number} code + * The error code, if any, or 0 for success. + */ + this.sendAck = function(index, message, code) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + tunnel.sendMessage("ack", index, message, code); + }; + + /** + * Given the index of a file, writes a blob of data to that file. + * + * @param {!number} index + * The index of the file to write to. + * + * @param {!string} data + * Base64-encoded data to write to the file. + */ + this.sendBlob = function(index, data) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + tunnel.sendMessage("blob", index, data); + }; + + /** + * Marks a currently-open stream as complete. The other end of the + * Guacamole connection will be notified via an "end" instruction that the + * stream is closed, and the index will be made available for reuse in + * future streams. + * + * @param {!number} index + * The index of the stream to end. + */ + this.endStream = function(index) { + + // Do not send requests if not connected + if (!isConnected()) + return; + + // Explicitly close stream by sending "end" instruction + tunnel.sendMessage("end", index); + + // Free associated index and stream if they exist + if (output_streams[index]) { + stream_indices.free(index); + delete output_streams[index]; + } + + }; + + /** + * Fired whenever the state of this Guacamole.Client changes. + * + * @event + * @param {!number} state + * The new state of the client. + */ + this.onstatechange = null; + + /** + * Fired when the remote client sends a name update. + * + * @event + * @param {!string} name + * The new name of this client. + */ + this.onname = null; + + /** + * Fired when an error is reported by the remote client, and the connection + * is being closed. + * + * @event + * @param {!Guacamole.Status} status + * A status object which describes the error. + */ + this.onerror = null; + + /** + * Fired when an arbitrary message is received from the tunnel that should + * be processed by the client. By default, additional message-specific + * events such as "onjoin" and "onleave" will fire for the received message + * after this event has been processed. An event handler for "onmsg" need + * not be supplied if "onjoin" and/or "onleave" will be used. + * + * @event + * @param {!number} msgcode + * A status code sent by the remote server that indicates the nature of + * the message that is being sent to the client. + * + * @param {string[]} args + * An array of arguments to be processed with the message sent to the + * client. + * + * @return {boolean} + * true if message-specific events such as "onjoin" and + * "onleave" should be fired for this message, false otherwise. If + * no value is returned, message-specific events will be allowed to + * fire. + */ + this.onmsg = null; + + /** + * Fired when a user joins a shared connection. + * + * @event + * @param {!string} userID + * A unique value representing this specific user's connection to the + * shared connection. This value is generated by the server and is + * guaranteed to be unique relative to other users of the connection. + * + * @param {!string} name + * A human-readable name representing the user that joined, such as + * their username. This value is provided by the web application during + * the connection handshake and is not necessarily unique relative to + * other users of the connection. + */ + this.onjoin = null; + + /** + * Fired when a user leaves a shared connection. + * + * @event + * @param {!string} userID + * A unique value representing this specific user's connection to the + * shared connection. This value is generated by the server and is + * guaranteed to be unique relative to other users of the connection. + * + * @param {!string} name + * A human-readable name representing the user that left, such as their + * username. This value is provided by the web application during the + * connection handshake and is not necessarily unique relative to other + * users of the connection. + */ + this.onleave = null; + + /** + * Fired when a audio stream is created. The stream provided to this event + * handler will contain its own event handlers for received data. + * + * @event + * @param {!Guacamole.InputStream} stream + * The stream that will receive audio data from the server. + * + * @param {!string} mimetype + * The mimetype of the audio data which will be received. + * + * @return {Guacamole.AudioPlayer} + * An object which implements the Guacamole.AudioPlayer interface and + * has been initialized to play the data in the provided stream, or null + * if the built-in audio players of the Guacamole client should be + * used. + */ + this.onaudio = null; + + /** + * Fired when a video stream is created. The stream provided to this event + * handler will contain its own event handlers for received data. + * + * @event + * @param {!Guacamole.InputStream} stream + * The stream that will receive video data from the server. + * + * @param {!Guacamole.Display.VisibleLayer} layer + * The destination layer on which the received video data should be + * played. It is the responsibility of the Guacamole.VideoPlayer + * implementation to play the received data within this layer. + * + * @param {!string} mimetype + * The mimetype of the video data which will be received. + * + * @return {Guacamole.VideoPlayer} + * An object which implements the Guacamole.VideoPlayer interface and + * has been initialized to play the data in the provided stream, or null + * if the built-in video players of the Guacamole client should be + * used. + */ + this.onvideo = null; + + /** + * Fired when the remote client is explicitly declaring the level of + * multi-touch support provided by a particular display layer. + * + * @event + * @param {!Guacamole.Display.VisibleLayer} layer + * The layer whose multi-touch support level is being declared. + * + * @param {!number} touches + * The maximum number of simultaneous touches supported by the given + * layer, where 0 indicates that touch events are not supported at all. + */ + this.onmultitouch = null; + + /** + * Fired when the current value of a connection parameter is being exposed + * by the server. + * + * @event + * @param {!Guacamole.InputStream} stream + * The stream that will receive connection parameter data from the + * server. + * + * @param {!string} mimetype + * The mimetype of the data which will be received. + * + * @param {!string} name + * The name of the connection parameter whose value is being exposed. + */ + this.onargv = null; + + /** + * Fired when the clipboard of the remote client is changing. + * + * @event + * @param {!Guacamole.InputStream} stream + * The stream that will receive clipboard data from the server. + * + * @param {!string} mimetype + * The mimetype of the data which will be received. + */ + this.onclipboard = null; + + /** + * Fired when a file stream is created. The stream provided to this event + * handler will contain its own event handlers for received data. + * + * @event + * @param {!Guacamole.InputStream} stream + * The stream that will receive data from the server. + * + * @param {!string} mimetype + * The mimetype of the file received. + * + * @param {!string} filename + * The name of the file received. + */ + this.onfile = null; + + /** + * Fired when a filesystem object is created. The object provided to this + * event handler will contain its own event handlers and functions for + * requesting and handling data. + * + * @event + * @param {!Guacamole.Object} object + * The created filesystem object. + * + * @param {!string} name + * The name of the filesystem. + */ + this.onfilesystem = null; + + /** + * Fired when a pipe stream is created. The stream provided to this event + * handler will contain its own event handlers for received data; + * + * @event + * @param {!Guacamole.InputStream} stream + * The stream that will receive data from the server. + * + * @param {!string} mimetype + * The mimetype of the data which will be received. + * + * @param {!string} name + * The name of the pipe. + */ + this.onpipe = null; + + /** + * Fired when a "required" instruction is received. A required instruction + * indicates that additional parameters are required for the connection to + * continue, such as user credentials. + * + * @event + * @param {!string[]} parameters + * The names of the connection parameters that are required to be + * provided for the connection to continue. + */ + this.onrequired = null; + + /** + * Fired whenever a sync instruction is received from the server, indicating + * that the server is finished processing any input from the client and + * has sent any results. + * + * @event + * @param {!number} timestamp + * The timestamp associated with the sync instruction. + * + * @param {!number} frames + * The number of frames that were considered or combined to produce the + * frame associated with this sync instruction, or zero if this value + * is not known or the remote desktop server provides no concept of + * frames. + */ + this.onsync = null; + + /** + * Returns the layer with the given index, creating it if necessary. + * Positive indices refer to visible layers, an index of zero refers to + * the default layer, and negative indices refer to buffers. + * + * @private + * @param {!number} index + * The index of the layer to retrieve. + * + * @return {!(Guacamole.Display.VisibleLayer|Guacamole.Layer)} + * The layer having the given index. + */ + var getLayer = function getLayer(index) { + + // Get layer, create if necessary + var layer = layers[index]; + if (!layer) { + + // Create layer based on index + if (index === 0) + layer = display.getDefaultLayer(); + else if (index > 0) + layer = display.createLayer(); + else + layer = display.createBuffer(); + + // Add new layer + layers[index] = layer; + + } + + return layer; + + }; + + /** + * Returns the index passed to getLayer() when the given layer was created. + * Positive indices refer to visible layers, an index of zero refers to the + * default layer, and negative indices refer to buffers. + * + * @param {!(Guacamole.Display.VisibleLayer|Guacamole.Layer)} layer + * The layer whose index should be determined. + * + * @returns {number} + * The index of the given layer, or null if no such layer is associated + * with this client. + */ + var getLayerIndex = function getLayerIndex(layer) { + + // Avoid searching if there clearly is no such layer + if (!layer) + return null; + + // Search through each layer, returning the index of the given layer + // once found + for (var key in layers) { + if (layer === layers[key]) + return parseInt(key); + } + + // Otherwise, no such index + return null; + + }; + + function getParser(index) { + + var parser = parsers[index]; + + // If parser not yet created, create it, and tie to the + // oninstruction handler of the tunnel. + if (parser == null) { + parser = parsers[index] = new Guacamole.Parser(); + parser.oninstruction = tunnel.oninstruction; + } + + return parser; + + } + + /** + * Handlers for all defined layer properties. + * + * @private + * @type {!Object.} + */ + var layerPropertyHandlers = { + + "miter-limit": function(layer, value) { + display.setMiterLimit(layer, parseFloat(value)); + }, + + "multi-touch" : function layerSupportsMultiTouch(layer, value) { + + // Process "multi-touch" property only for true visible layers (not off-screen buffers) + if (guac_client.onmultitouch && layer instanceof Guacamole.Display.VisibleLayer) + guac_client.onmultitouch(layer, parseInt(value)); + + } + + }; + + /** + * Handlers for all instruction opcodes receivable by a Guacamole protocol + * client. + * + * @private + * @type {!Object.} + */ + var instructionHandlers = { + + "ack": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var reason = parameters[1]; + var code = parseInt(parameters[2]); + + // Get stream + var stream = output_streams[stream_index]; + if (stream) { + + // Signal ack if handler defined + if (stream.onack) + stream.onack(new Guacamole.Status(code, reason)); + + // If code is an error, invalidate stream if not already + // invalidated by onack handler + if (code >= 0x0100 && output_streams[stream_index] === stream) { + stream_indices.free(stream_index); + delete output_streams[stream_index]; + } + + } + + }, + + "arc": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var x = parseInt(parameters[1]); + var y = parseInt(parameters[2]); + var radius = parseInt(parameters[3]); + var startAngle = parseFloat(parameters[4]); + var endAngle = parseFloat(parameters[5]); + var negative = parseInt(parameters[6]); + + display.arc(layer, x, y, radius, startAngle, endAngle, negative != 0); + + }, + + "argv": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var mimetype = parameters[1]; + var name = parameters[2]; + + // Create stream + if (guac_client.onargv) { + var stream = streams[stream_index] = new Guacamole.InputStream(guac_client, stream_index); + guac_client.onargv(stream, mimetype, name); + } + + // Otherwise, unsupported + else + guac_client.sendAck(stream_index, "Receiving argument values unsupported", 0x0100); + + }, + + "audio": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var mimetype = parameters[1]; + + // Create stream + var stream = streams[stream_index] = + new Guacamole.InputStream(guac_client, stream_index); + + // Get player instance via callback + var audioPlayer = null; + if (guac_client.onaudio) + audioPlayer = guac_client.onaudio(stream, mimetype); + + // If unsuccessful, try to use a default implementation + if (!audioPlayer) + audioPlayer = Guacamole.AudioPlayer.getInstance(stream, mimetype); + + // If we have successfully retrieved an audio player, send success response + if (audioPlayer) { + audioPlayers[stream_index] = audioPlayer; + guac_client.sendAck(stream_index, "OK", 0x0000); + } + + // Otherwise, mimetype must be unsupported + else + guac_client.sendAck(stream_index, "BAD TYPE", 0x030F); + + }, + + "blob": function(parameters) { + + // Get stream + var stream_index = parseInt(parameters[0]); + var data = parameters[1]; + var stream = streams[stream_index]; + + // Write data + if (stream && stream.onblob) + stream.onblob(data); + + }, + + "body" : function handleBody(parameters) { + + // Get object + var objectIndex = parseInt(parameters[0]); + var object = objects[objectIndex]; + + var streamIndex = parseInt(parameters[1]); + var mimetype = parameters[2]; + var name = parameters[3]; + + // Create stream if handler defined + if (object && object.onbody) { + var stream = streams[streamIndex] = new Guacamole.InputStream(guac_client, streamIndex); + object.onbody(stream, mimetype, name); + } + + // Otherwise, unsupported + else + guac_client.sendAck(streamIndex, "Receipt of body unsupported", 0x0100); + + }, + + "cfill": function(parameters) { + + var channelMask = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var r = parseInt(parameters[2]); + var g = parseInt(parameters[3]); + var b = parseInt(parameters[4]); + var a = parseInt(parameters[5]); + + display.setChannelMask(layer, channelMask); + display.fillColor(layer, r, g, b, a); + + }, + + "clip": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + + display.clip(layer); + + }, + + "clipboard": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var mimetype = parameters[1]; + + // Create stream + if (guac_client.onclipboard) { + var stream = streams[stream_index] = new Guacamole.InputStream(guac_client, stream_index); + guac_client.onclipboard(stream, mimetype); + } + + // Otherwise, unsupported + else + guac_client.sendAck(stream_index, "Clipboard unsupported", 0x0100); + + }, + + "close": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + + display.close(layer); + + }, + + "copy": function(parameters) { + + var srcL = getLayer(parseInt(parameters[0])); + var srcX = parseInt(parameters[1]); + var srcY = parseInt(parameters[2]); + var srcWidth = parseInt(parameters[3]); + var srcHeight = parseInt(parameters[4]); + var channelMask = parseInt(parameters[5]); + var dstL = getLayer(parseInt(parameters[6])); + var dstX = parseInt(parameters[7]); + var dstY = parseInt(parameters[8]); + + display.setChannelMask(dstL, channelMask); + display.copy(srcL, srcX, srcY, srcWidth, srcHeight, + dstL, dstX, dstY); + + }, + + "cstroke": function(parameters) { + + var channelMask = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var cap = lineCap[parseInt(parameters[2])]; + var join = lineJoin[parseInt(parameters[3])]; + var thickness = parseInt(parameters[4]); + var r = parseInt(parameters[5]); + var g = parseInt(parameters[6]); + var b = parseInt(parameters[7]); + var a = parseInt(parameters[8]); + + display.setChannelMask(layer, channelMask); + display.strokeColor(layer, cap, join, thickness, r, g, b, a); + + }, + + "cursor": function(parameters) { + + var cursorHotspotX = parseInt(parameters[0]); + var cursorHotspotY = parseInt(parameters[1]); + var srcL = getLayer(parseInt(parameters[2])); + var srcX = parseInt(parameters[3]); + var srcY = parseInt(parameters[4]); + var srcWidth = parseInt(parameters[5]); + var srcHeight = parseInt(parameters[6]); + + display.setCursor(cursorHotspotX, cursorHotspotY, + srcL, srcX, srcY, srcWidth, srcHeight); + + }, + + "curve": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var cp1x = parseInt(parameters[1]); + var cp1y = parseInt(parameters[2]); + var cp2x = parseInt(parameters[3]); + var cp2y = parseInt(parameters[4]); + var x = parseInt(parameters[5]); + var y = parseInt(parameters[6]); + + display.curveTo(layer, cp1x, cp1y, cp2x, cp2y, x, y); + + }, + + "disconnect" : function handleDisconnect(parameters) { + + // Explicitly tear down connection + guac_client.disconnect(); + + }, + + "dispose": function(parameters) { + + var layer_index = parseInt(parameters[0]); + + // If visible layer, remove from parent + if (layer_index > 0) { + + // Remove from parent + var layer = getLayer(layer_index); + display.dispose(layer); + + // Delete reference + delete layers[layer_index]; + + } + + // If buffer, just delete reference + else if (layer_index < 0) + delete layers[layer_index]; + + // Attempting to dispose the root layer currently has no effect. + + }, + + "distort": function(parameters) { + + var layer_index = parseInt(parameters[0]); + var a = parseFloat(parameters[1]); + var b = parseFloat(parameters[2]); + var c = parseFloat(parameters[3]); + var d = parseFloat(parameters[4]); + var e = parseFloat(parameters[5]); + var f = parseFloat(parameters[6]); + + // Only valid for visible layers (not buffers) + if (layer_index >= 0) { + var layer = getLayer(layer_index); + display.distort(layer, a, b, c, d, e, f); + } + + }, + + "error": function(parameters) { + + var reason = parameters[0]; + var code = parseInt(parameters[1]); + + // Call handler if defined + if (guac_client.onerror) + guac_client.onerror(new Guacamole.Status(code, reason)); + + guac_client.disconnect(); + + }, + + "end": function(parameters) { + + var stream_index = parseInt(parameters[0]); + + // Get stream + var stream = streams[stream_index]; + if (stream) { + + // Signal end of stream if handler defined + if (stream.onend) + stream.onend(); + + // Invalidate stream + delete streams[stream_index]; + + } + + }, + + "file": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var mimetype = parameters[1]; + var filename = parameters[2]; + + // Create stream + if (guac_client.onfile) { + var stream = streams[stream_index] = new Guacamole.InputStream(guac_client, stream_index); + guac_client.onfile(stream, mimetype, filename); + } + + // Otherwise, unsupported + else + guac_client.sendAck(stream_index, "File transfer unsupported", 0x0100); + + }, + + "filesystem" : function handleFilesystem(parameters) { + + var objectIndex = parseInt(parameters[0]); + var name = parameters[1]; + + // Create object, if supported + if (guac_client.onfilesystem) { + var object = objects[objectIndex] = new Guacamole.Object(guac_client, objectIndex); + guac_client.onfilesystem(object, name); + } + + // If unsupported, simply ignore the availability of the filesystem + + }, + + "identity": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + + display.setTransform(layer, 1, 0, 0, 1, 0, 0); + + }, + + "img": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var channelMask = parseInt(parameters[1]); + var layer = getLayer(parseInt(parameters[2])); + var mimetype = parameters[3]; + var x = parseInt(parameters[4]); + var y = parseInt(parameters[5]); + + // Create stream + var stream = streams[stream_index] = new Guacamole.InputStream(guac_client, stream_index); + + // Draw received contents once decoded + display.setChannelMask(layer, channelMask); + display.drawStream(layer, x, y, stream, mimetype); + + }, + + "jpeg": function(parameters) { + + var channelMask = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var x = parseInt(parameters[2]); + var y = parseInt(parameters[3]); + var data = parameters[4]; + + display.setChannelMask(layer, channelMask); + display.draw(layer, x, y, "data:image/jpeg;base64," + data); + + }, + + "lfill": function(parameters) { + + var channelMask = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var srcLayer = getLayer(parseInt(parameters[2])); + + display.setChannelMask(layer, channelMask); + display.fillLayer(layer, srcLayer); + + }, + + "line": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var x = parseInt(parameters[1]); + var y = parseInt(parameters[2]); + + display.lineTo(layer, x, y); + + }, + + "lstroke": function(parameters) { + + var channelMask = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var srcLayer = getLayer(parseInt(parameters[2])); + + display.setChannelMask(layer, channelMask); + display.strokeLayer(layer, srcLayer); + + }, + + "mouse" : function handleMouse(parameters) { + + var x = parseInt(parameters[0]); + var y = parseInt(parameters[1]); + + // Display and move software cursor to received coordinates + display.showCursor(true); + display.moveCursor(x, y); + + }, + + "move": function(parameters) { + + var layer_index = parseInt(parameters[0]); + var parent_index = parseInt(parameters[1]); + var x = parseInt(parameters[2]); + var y = parseInt(parameters[3]); + var z = parseInt(parameters[4]); + + // Only valid for non-default layers + if (layer_index > 0 && parent_index >= 0) { + var layer = getLayer(layer_index); + var parent = getLayer(parent_index); + display.move(layer, parent, x, y, z); + } + + }, + + "msg" : function(parameters) { + + var userID; + var username; + + // Fire general message handling event first + var allowDefault = true; + var msgid = parseInt(parameters[0]); + if (guac_client.onmsg) { + allowDefault = guac_client.onmsg(msgid, parameters.slice(1)); + if (allowDefault === undefined) + allowDefault = true; + } + + // Fire message-specific convenience events if not prevented by the + // "onmsg" handler + if (allowDefault) { + switch (msgid) { + + case Guacamole.Client.Message.USER_JOINED: + userID = parameters[1]; + username = parameters[2]; + if (guac_client.onjoin) + guac_client.onjoin(userID, username); + break; + + case Guacamole.Client.Message.USER_LEFT: + userID = parameters[1]; + username = parameters[2]; + if (guac_client.onleave) + guac_client.onleave(userID, username); + break; + + } + } + + }, + + "name": function(parameters) { + if (guac_client.onname) guac_client.onname(parameters[0]); + }, + + "nest": function(parameters) { + var parser = getParser(parseInt(parameters[0])); + parser.receive(parameters[1]); + }, + + "pipe": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var mimetype = parameters[1]; + var name = parameters[2]; + + // Create stream + if (guac_client.onpipe) { + var stream = streams[stream_index] = new Guacamole.InputStream(guac_client, stream_index); + guac_client.onpipe(stream, mimetype, name); + } + + // Otherwise, unsupported + else + guac_client.sendAck(stream_index, "Named pipes unsupported", 0x0100); + + }, + + "png": function(parameters) { + + var channelMask = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var x = parseInt(parameters[2]); + var y = parseInt(parameters[3]); + var data = parameters[4]; + + display.setChannelMask(layer, channelMask); + display.draw(layer, x, y, "data:image/png;base64," + data); + + }, + + "pop": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + + display.pop(layer); + + }, + + "push": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + + display.push(layer); + + }, + + "rect": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var x = parseInt(parameters[1]); + var y = parseInt(parameters[2]); + var w = parseInt(parameters[3]); + var h = parseInt(parameters[4]); + + display.rect(layer, x, y, w, h); + + }, + + "required": function required(parameters) { + if (guac_client.onrequired) guac_client.onrequired(parameters); + }, + + "reset": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + + display.reset(layer); + + }, + + "set": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var name = parameters[1]; + var value = parameters[2]; + + // Call property handler if defined + var handler = layerPropertyHandlers[name]; + if (handler) + handler(layer, value); + + }, + + "shade": function(parameters) { + + var layer_index = parseInt(parameters[0]); + var a = parseInt(parameters[1]); + + // Only valid for visible layers (not buffers) + if (layer_index >= 0) { + var layer = getLayer(layer_index); + display.shade(layer, a); + } + + }, + + "size": function(parameters) { + + var layer_index = parseInt(parameters[0]); + var layer = getLayer(layer_index); + var width = parseInt(parameters[1]); + var height = parseInt(parameters[2]); + + display.resize(layer, width, height); + + }, + + "start": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var x = parseInt(parameters[1]); + var y = parseInt(parameters[2]); + + display.moveTo(layer, x, y); + + }, + + "sync": function(parameters) { + + var timestamp = parseInt(parameters[0]); + var frames = parameters[1] ? parseInt(parameters[1]) : 0; + + // Flush display, send sync when done + display.flush(function displaySyncComplete() { + + // Synchronize all audio players + for (var index in audioPlayers) { + var audioPlayer = audioPlayers[index]; + if (audioPlayer) + audioPlayer.sync(); + } + + // Send sync response to server + if (timestamp !== currentTimestamp) { + tunnel.sendMessage("sync", timestamp); + currentTimestamp = timestamp; + } + + }, timestamp, frames); + + // If received first update, no longer waiting. + if (currentState === Guacamole.Client.State.WAITING) + setState(Guacamole.Client.State.CONNECTED); + + // Call sync handler if defined + if (guac_client.onsync) + guac_client.onsync(timestamp, frames); + + }, + + "transfer": function(parameters) { + + var srcL = getLayer(parseInt(parameters[0])); + var srcX = parseInt(parameters[1]); + var srcY = parseInt(parameters[2]); + var srcWidth = parseInt(parameters[3]); + var srcHeight = parseInt(parameters[4]); + var function_index = parseInt(parameters[5]); + var dstL = getLayer(parseInt(parameters[6])); + var dstX = parseInt(parameters[7]); + var dstY = parseInt(parameters[8]); + + /* SRC */ + if (function_index === 0x3) + display.put(srcL, srcX, srcY, srcWidth, srcHeight, + dstL, dstX, dstY); + + /* Anything else that isn't a NO-OP */ + else if (function_index !== 0x5) + display.transfer(srcL, srcX, srcY, srcWidth, srcHeight, + dstL, dstX, dstY, Guacamole.Client.DefaultTransferFunction[function_index]); + + }, + + "transform": function(parameters) { + + var layer = getLayer(parseInt(parameters[0])); + var a = parseFloat(parameters[1]); + var b = parseFloat(parameters[2]); + var c = parseFloat(parameters[3]); + var d = parseFloat(parameters[4]); + var e = parseFloat(parameters[5]); + var f = parseFloat(parameters[6]); + + display.transform(layer, a, b, c, d, e, f); + + }, + + "undefine" : function handleUndefine(parameters) { + + // Get object + var objectIndex = parseInt(parameters[0]); + var object = objects[objectIndex]; + + // Signal end of object definition + if (object && object.onundefine) + object.onundefine(); + + }, + + "video": function(parameters) { + + var stream_index = parseInt(parameters[0]); + var layer = getLayer(parseInt(parameters[1])); + var mimetype = parameters[2]; + + // Create stream + var stream = streams[stream_index] = + new Guacamole.InputStream(guac_client, stream_index); + + // Get player instance via callback + var videoPlayer = null; + if (guac_client.onvideo) + videoPlayer = guac_client.onvideo(stream, layer, mimetype); + + // If unsuccessful, try to use a default implementation + if (!videoPlayer) + videoPlayer = Guacamole.VideoPlayer.getInstance(stream, layer, mimetype); + + // If we have successfully retrieved an video player, send success response + if (videoPlayer) { + videoPlayers[stream_index] = videoPlayer; + guac_client.sendAck(stream_index, "OK", 0x0000); + } + + // Otherwise, mimetype must be unsupported + else + guac_client.sendAck(stream_index, "BAD TYPE", 0x030F); + + } + + }; + + /** + * Sends a keep-alive ping to the Guacamole server, advising the server + * that the client is still connected and responding. The lastSentKeepAlive + * timestamp is automatically updated as a result of calling this function. + * + * @private + */ + var sendKeepAlive = function sendKeepAlive() { + tunnel.sendMessage('nop'); + lastSentKeepAlive = new Date().getTime(); + }; + + /** + * Schedules the next keep-alive ping based on the KEEP_ALIVE_FREQUENCY and + * the time that the last ping was sent, if ever. If enough time has + * elapsed that a ping should have already been sent, calling this function + * will send that ping immediately. + * + * @private + */ + var scheduleKeepAlive = function scheduleKeepAlive() { + + window.clearTimeout(keepAliveTimeout); + + var currentTime = new Date().getTime(); + var keepAliveDelay = Math.max(lastSentKeepAlive + KEEP_ALIVE_FREQUENCY - currentTime, 0); + + // Ping server regularly to keep connection alive, but send the ping + // immediately if enough time has elapsed that it should have already + // been sent + if (keepAliveDelay > 0) + keepAliveTimeout = window.setTimeout(sendKeepAlive, keepAliveDelay); + else + sendKeepAlive(); + + }; + + /** + * Stops sending any further keep-alive pings. If a keep-alive ping was + * scheduled to be sent, that ping is cancelled. + * + * @private + */ + var stopKeepAlive = function stopKeepAlive() { + window.clearTimeout(keepAliveTimeout); + }; + + tunnel.oninstruction = function(opcode, parameters) { + + var handler = instructionHandlers[opcode]; + if (handler) + handler(parameters); + + // Leverage network activity to ensure the next keep-alive ping is + // sent, even if the browser is currently throttling timers + scheduleKeepAlive(); + + }; + + /** + * Sends a disconnect instruction to the server and closes the tunnel. + */ + this.disconnect = function() { + + // Only attempt disconnection not disconnected. + if (currentState != Guacamole.Client.State.DISCONNECTED + && currentState != Guacamole.Client.State.DISCONNECTING) { + + setState(Guacamole.Client.State.DISCONNECTING); + + // Stop sending keep-alive messages + stopKeepAlive(); + + // Send disconnect message and disconnect + tunnel.sendMessage("disconnect"); + tunnel.disconnect(); + setState(Guacamole.Client.State.DISCONNECTED); + + } + + }; + + /** + * Connects the underlying tunnel of this Guacamole.Client, passing the + * given arbitrary data to the tunnel during the connection process. + * + * @param {string} data + * Arbitrary connection data to be sent to the underlying tunnel during + * the connection process. + * + * @throws {!Guacamole.Status} + * If an error occurs during connection. + */ + this.connect = function(data) { + + setState(Guacamole.Client.State.CONNECTING); + + try { + tunnel.connect(data); + } + catch (status) { + setState(Guacamole.Client.State.IDLE); + throw status; + } + + // Regularly send keep-alive ping to ensure the server knows we're + // still here, even if not active + scheduleKeepAlive(); + + setState(Guacamole.Client.State.WAITING); + }; + +}; + +/** + * All possible Guacamole Client states. + * + * @type {!Object.} + */ +Guacamole.Client.State = { + + /** + * The client is idle, with no active connection. + * + * @type number + */ + "IDLE" : 0, + + /** + * The client is in the process of establishing a connection. + * + * @type {!number} + */ + "CONNECTING" : 1, + + /** + * The client is waiting on further information or a remote server to + * establish the connection. + * + * @type {!number} + */ + "WAITING" : 2, + + /** + * The client is actively connected to a remote server. + * + * @type {!number} + */ + "CONNECTED" : 3, + + /** + * The client is in the process of disconnecting from the remote server. + * + * @type {!number} + */ + "DISCONNECTING" : 4, + + /** + * The client has completed the connection and is no longer connected. + * + * @type {!number} + */ + "DISCONNECTED" : 5 + +}; + +/** + * Map of all Guacamole binary raster operations to transfer functions. + * + * @private + * @type {!Object.} + */ +Guacamole.Client.DefaultTransferFunction = { + + /* BLACK */ + 0x0: function (src, dst) { + dst.red = dst.green = dst.blue = 0x00; + }, + + /* WHITE */ + 0xF: function (src, dst) { + dst.red = dst.green = dst.blue = 0xFF; + }, + + /* SRC */ + 0x3: function (src, dst) { + dst.red = src.red; + dst.green = src.green; + dst.blue = src.blue; + dst.alpha = src.alpha; + }, + + /* DEST (no-op) */ + 0x5: function (src, dst) { + // Do nothing + }, + + /* Invert SRC */ + 0xC: function (src, dst) { + dst.red = 0xFF & ~src.red; + dst.green = 0xFF & ~src.green; + dst.blue = 0xFF & ~src.blue; + dst.alpha = src.alpha; + }, + + /* Invert DEST */ + 0xA: function (src, dst) { + dst.red = 0xFF & ~dst.red; + dst.green = 0xFF & ~dst.green; + dst.blue = 0xFF & ~dst.blue; + }, + + /* AND */ + 0x1: function (src, dst) { + dst.red = ( src.red & dst.red); + dst.green = ( src.green & dst.green); + dst.blue = ( src.blue & dst.blue); + }, + + /* NAND */ + 0xE: function (src, dst) { + dst.red = 0xFF & ~( src.red & dst.red); + dst.green = 0xFF & ~( src.green & dst.green); + dst.blue = 0xFF & ~( src.blue & dst.blue); + }, + + /* OR */ + 0x7: function (src, dst) { + dst.red = ( src.red | dst.red); + dst.green = ( src.green | dst.green); + dst.blue = ( src.blue | dst.blue); + }, + + /* NOR */ + 0x8: function (src, dst) { + dst.red = 0xFF & ~( src.red | dst.red); + dst.green = 0xFF & ~( src.green | dst.green); + dst.blue = 0xFF & ~( src.blue | dst.blue); + }, + + /* XOR */ + 0x6: function (src, dst) { + dst.red = ( src.red ^ dst.red); + dst.green = ( src.green ^ dst.green); + dst.blue = ( src.blue ^ dst.blue); + }, + + /* XNOR */ + 0x9: function (src, dst) { + dst.red = 0xFF & ~( src.red ^ dst.red); + dst.green = 0xFF & ~( src.green ^ dst.green); + dst.blue = 0xFF & ~( src.blue ^ dst.blue); + }, + + /* AND inverted source */ + 0x4: function (src, dst) { + dst.red = 0xFF & (~src.red & dst.red); + dst.green = 0xFF & (~src.green & dst.green); + dst.blue = 0xFF & (~src.blue & dst.blue); + }, + + /* OR inverted source */ + 0xD: function (src, dst) { + dst.red = 0xFF & (~src.red | dst.red); + dst.green = 0xFF & (~src.green | dst.green); + dst.blue = 0xFF & (~src.blue | dst.blue); + }, + + /* AND inverted destination */ + 0x2: function (src, dst) { + dst.red = 0xFF & ( src.red & ~dst.red); + dst.green = 0xFF & ( src.green & ~dst.green); + dst.blue = 0xFF & ( src.blue & ~dst.blue); + }, + + /* OR inverted destination */ + 0xB: function (src, dst) { + dst.red = 0xFF & ( src.red | ~dst.red); + dst.green = 0xFF & ( src.green | ~dst.green); + dst.blue = 0xFF & ( src.blue | ~dst.blue); + } + +}; + +/** + * A list of possible messages that can be sent by the server for processing + * by the client. + * + * @type {!Object.} + */ +Guacamole.Client.Message = { + + /** + * A client message that indicates that a user has joined an existing + * connection. This message expects a single additional argument - the + * name of the user who has joined the connection. + * + * @type {!number} + */ + "USER_JOINED": 0x0001, + + /** + * A client message that indicates that a user has left an existing + * connection. This message expects a single additional argument - the + * name of the user who has left the connection. + * + * @type {!number} + */ + "USER_LEFT": 0x0002 + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/DataURIReader.js b/guacamole-common-js/src/main/webapp/modules/DataURIReader.js new file mode 100644 index 0000000..e95f79a --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/DataURIReader.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A reader which automatically handles the given input stream, returning + * received blobs as a single data URI built over the course of the stream. + * Note that this object will overwrite any installed event handlers on the + * given Guacamole.InputStream. + * + * @constructor + * @param {!Guacamole.InputStream} stream + * The stream that data will be read from. + * + * @param {!string} mimetype + * The mimetype of the data being received. + */ +Guacamole.DataURIReader = function(stream, mimetype) { + + /** + * Reference to this Guacamole.DataURIReader. + * + * @private + * @type {!Guacamole.DataURIReader} + */ + var guac_reader = this; + + /** + * Current data URI. + * + * @private + * @type {!string} + */ + var uri = 'data:' + mimetype + ';base64,'; + + // Receive blobs as array buffers + stream.onblob = function dataURIReaderBlob(data) { + + // Currently assuming data will ALWAYS be safe to simply append. This + // will not be true if the received base64 data encodes a number of + // bytes that isn't a multiple of three (as base64 expands in a ratio + // of exactly 3:4). + uri += data; + + }; + + // Simply call onend when end received + stream.onend = function dataURIReaderEnd() { + if (guac_reader.onend) + guac_reader.onend(); + }; + + /** + * Returns the data URI of all data received through the underlying stream + * thus far. + * + * @returns {!string} + * The data URI of all data received through the underlying stream thus + * far. + */ + this.getURI = function getURI() { + return uri; + }; + + /** + * Fired once this stream is finished and no further data will be written. + * + * @event + */ + this.onend = null; + +}; \ No newline at end of file diff --git a/guacamole-common-js/src/main/webapp/modules/Display.js b/guacamole-common-js/src/main/webapp/modules/Display.js new file mode 100644 index 0000000..dcb1e32 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Display.js @@ -0,0 +1,2143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * The Guacamole display. The display does not deal with the Guacamole + * protocol, and instead implements a set of graphical operations which + * embody the set of operations present in the protocol. The order operations + * are executed is guaranteed to be in the same order as their corresponding + * functions are called. + * + * @constructor + */ +Guacamole.Display = function() { + + /** + * Reference to this Guacamole.Display. + * @private + */ + var guac_display = this; + + var displayWidth = 0; + var displayHeight = 0; + var displayScale = 1; + + // Create display + var display = document.createElement("div"); + display.style.position = "relative"; + display.style.width = displayWidth + "px"; + display.style.height = displayHeight + "px"; + + // Ensure transformations on display originate at 0,0 + display.style.transformOrigin = + display.style.webkitTransformOrigin = + display.style.MozTransformOrigin = + display.style.OTransformOrigin = + display.style.msTransformOrigin = + "0 0"; + + // Create default layer + var default_layer = new Guacamole.Display.VisibleLayer(displayWidth, displayHeight); + + // Create cursor layer + var cursor = new Guacamole.Display.VisibleLayer(0, 0); + cursor.setChannelMask(Guacamole.Layer.SRC); + + // Add default layer and cursor to display + display.appendChild(default_layer.getElement()); + display.appendChild(cursor.getElement()); + + // Create bounding div + var bounds = document.createElement("div"); + bounds.style.position = "relative"; + bounds.style.width = (displayWidth*displayScale) + "px"; + bounds.style.height = (displayHeight*displayScale) + "px"; + + // Add display to bounds + bounds.appendChild(display); + + /** + * The X coordinate of the hotspot of the mouse cursor. The hotspot is + * the relative location within the image of the mouse cursor at which + * each click occurs. + * + * @type {!number} + */ + this.cursorHotspotX = 0; + + /** + * The Y coordinate of the hotspot of the mouse cursor. The hotspot is + * the relative location within the image of the mouse cursor at which + * each click occurs. + * + * @type {!number} + */ + this.cursorHotspotY = 0; + + /** + * The current X coordinate of the local mouse cursor. This is not + * necessarily the location of the actual mouse - it refers only to + * the location of the cursor image within the Guacamole display, as + * last set by moveCursor(). + * + * @type {!number} + */ + this.cursorX = 0; + + /** + * The current X coordinate of the local mouse cursor. This is not + * necessarily the location of the actual mouse - it refers only to + * the location of the cursor image within the Guacamole display, as + * last set by moveCursor(). + * + * @type {!number} + */ + this.cursorY = 0; + + /** + * The number of milliseconds over which display rendering statistics + * should be gathered, dispatching {@link #onstatistics} events as those + * statistics are available. If set to zero, no statistics will be + * gathered. + * + * @default 0 + * @type {!number} + */ + this.statisticWindow = 0; + + /** + * Fired when the default layer (and thus the entire Guacamole display) + * is resized. + * + * @event + * @param {!number} width + * The new width of the Guacamole display. + * + * @param {!number} height + * The new height of the Guacamole display. + */ + this.onresize = null; + + /** + * Fired whenever the local cursor image is changed. This can be used to + * implement special handling of the client-side cursor, or to override + * the default use of a software cursor layer. + * + * @event + * @param {!HTMLCanvasElement} canvas + * The cursor image. + * + * @param {!number} x + * The X-coordinate of the cursor hotspot. + * + * @param {!number} y + * The Y-coordinate of the cursor hotspot. + */ + this.oncursor = null; + + /** + * Fired whenever performance statistics are available for recently- + * rendered frames. This event will fire only if {@link #statisticWindow} + * is non-zero. + * + * @event + * @param {!Guacamole.Display.Statistics} stats + * An object containing general rendering performance statistics for + * the remote desktop, Guacamole server, and Guacamole client. + */ + this.onstatistics = null; + + /** + * The queue of all pending Tasks. Tasks will be run in order, with new + * tasks added at the end of the queue and old tasks removed from the + * front of the queue (FIFO). These tasks will eventually be grouped + * into a Frame. + * + * @private + * @type {!Task[]} + */ + var tasks = []; + + /** + * The queue of all frames. Each frame is a pairing of an array of tasks + * and a callback which must be called when the frame is rendered. + * + * @private + * @type {!Frame[]} + */ + var frames = []; + + /** + * Flushes all pending frames synchronously. This function will block until + * all pending frames have rendered. If a frame is currently blocked by an + * asynchronous operation like an image load, this function will return + * after reaching that operation and the flush operation will + * automamtically resume after that operation completes. + * + * @private + */ + var syncFlush = function syncFlush() { + + var localTimestamp = 0; + var remoteTimestamp = 0; + + var renderedLogicalFrames = 0; + var rendered_frames = 0; + + // Draw all pending frames, if ready + while (rendered_frames < frames.length) { + + var frame = frames[rendered_frames]; + if (!frame.isReady()) + break; + + frame.flush(); + + localTimestamp = frame.localTimestamp; + remoteTimestamp = frame.remoteTimestamp; + renderedLogicalFrames += frame.logicalFrames; + rendered_frames++; + + } + + // Remove rendered frames from array + frames.splice(0, rendered_frames); + + if (rendered_frames) + notifyFlushed(localTimestamp, remoteTimestamp, renderedLogicalFrames); + + }; + + /** + * Recently-gathered display render statistics, as made available by calls + * to notifyFlushed(). The contents of this array will be trimmed to + * contain only up to {@link #statisticWindow} milliseconds of statistics. + * + * @private + * @type {Guacamole.Display.Statistics[]} + */ + var statistics = []; + + /** + * Notifies that one or more frames have been successfully rendered + * (flushed) to the display. + * + * @private + * @param {!number} localTimestamp + * The local timestamp of the point in time at which the most recent, + * flushed frame was received by the display, in milliseconds since the + * Unix Epoch. + * + * @param {!number} remoteTimestamp + * The remote timestamp of sync instruction associated with the most + * recent, flushed frame received by the display. This timestamp is in + * milliseconds, but is arbitrary, having meaning only relative to + * other timestamps in the same connection. + * + * @param {!number} logicalFrames + * The number of remote desktop frames that were flushed. + */ + var notifyFlushed = function notifyFlushed(localTimestamp, remoteTimestamp, logicalFrames) { + + // Ignore if statistics are not being gathered + if (!guac_display.statisticWindow) + return; + + var current = new Date().getTime(); + + // Find the first statistic that is still within the configured time + // window + for (var first = 0; first < statistics.length; first++) { + if (current - statistics[first].timestamp <= guac_display.statisticWindow) + break; + } + + // Remove all statistics except those within the time window + statistics.splice(0, first - 1); + + // Record statistics for latest frame + statistics.push({ + localTimestamp : localTimestamp, + remoteTimestamp : remoteTimestamp, + timestamp : current, + frames : logicalFrames + }); + + // Determine the actual time interval of the available statistics (this + // will not perfectly match the configured interval, which is an upper + // bound) + var statDuration = (statistics[statistics.length - 1].timestamp - statistics[0].timestamp) / 1000; + + // Determine the amount of time that elapsed remotely (within the + // remote desktop) + var remoteDuration = (statistics[statistics.length - 1].remoteTimestamp - statistics[0].remoteTimestamp) / 1000; + + // Calculate the number of frames that have been rendered locally + // within the configured time interval + var localFrames = statistics.length; + + // Calculate the number of frames actually received from the remote + // desktop by the Guacamole server + var remoteFrames = statistics.reduce(function sumFrames(prev, stat) { + return prev + stat.frames; + }, 0); + + // Calculate the number of frames that the Guacamole server had to + // drop or combine with other frames + var drops = statistics.reduce(function sumDrops(prev, stat) { + return prev + Math.max(0, stat.frames - 1); + }, 0); + + // Produce lag and FPS statistics from above raw measurements + var stats = new Guacamole.Display.Statistics({ + processingLag : current - localTimestamp, + desktopFps : (remoteDuration && remoteFrames) ? remoteFrames / remoteDuration : null, + clientFps : statDuration ? localFrames / statDuration : null, + serverFps : remoteDuration ? localFrames / remoteDuration : null, + dropRate : remoteDuration ? drops / remoteDuration : null + }); + + // Notify of availability of new statistics + if (guac_display.onstatistics) + guac_display.onstatistics(stats); + + }; + + /** + * Flushes all pending frames. + * @private + */ + function __flush_frames() { + syncFlush(); + } + + /** + * An ordered list of tasks which must be executed atomically. Once + * executed, an associated (and optional) callback will be called. + * + * @private + * @constructor + * @param {function} [callback] + * The function to call when this frame is rendered. + * + * @param {!Task[]} tasks + * The set of tasks which must be executed to render this frame. + * + * @param {number} [timestamp] + * The remote timestamp of sync instruction associated with this frame. + * This timestamp is in milliseconds, but is arbitrary, having meaning + * only relative to other remote timestamps in the same connection. If + * omitted, a compatible but local timestamp will be used instead. + * + * @param {number} [logicalFrames=0] + * The number of remote desktop frames that were combined to produce + * this frame, or zero if this value is unknown or inapplicable. + */ + var Frame = function Frame(callback, tasks, timestamp, logicalFrames) { + + /** + * The local timestamp of the point in time at which this frame was + * received by the display, in milliseconds since the Unix Epoch. + * + * @type {!number} + */ + this.localTimestamp = new Date().getTime(); + + /** + * The remote timestamp of sync instruction associated with this frame. + * This timestamp is in milliseconds, but is arbitrary, having meaning + * only relative to other remote timestamps in the same connection. + * + * @type {!number} + */ + this.remoteTimestamp = timestamp || this.localTimestamp; + + /** + * The number of remote desktop frames that were combined to produce + * this frame. If unknown or not applicable, this will be zero. + * + * @type {!number} + */ + this.logicalFrames = logicalFrames || 0; + + /** + * Cancels rendering of this frame and all associated tasks. The + * callback provided at construction time, if any, is not invoked. + */ + this.cancel = function cancel() { + + callback = null; + + tasks.forEach(function cancelTask(task) { + task.cancel(); + }); + + tasks = []; + + }; + + /** + * Returns whether this frame is ready to be rendered. This function + * returns true if and only if ALL underlying tasks are unblocked. + * + * @returns {!boolean} + * true if all underlying tasks are unblocked, false otherwise. + */ + this.isReady = function() { + + // Search for blocked tasks + for (var i=0; i < tasks.length; i++) { + if (tasks[i].blocked) + return false; + } + + // If no blocked tasks, the frame is ready + return true; + + }; + + /** + * Renders this frame, calling the associated callback, if any, after + * the frame is complete. This function MUST only be called when no + * blocked tasks exist. Calling this function with blocked tasks + * will result in undefined behavior. + */ + this.flush = function() { + + // Draw all pending tasks. + for (var i=0; i < tasks.length; i++) + tasks[i].execute(); + + // Call callback + if (callback) callback(); + + }; + + }; + + /** + * A container for an task handler. Each operation which must be ordered + * is associated with a Task that goes into a task queue. Tasks in this + * queue are executed in order once their handlers are set, while Tasks + * without handlers block themselves and any following Tasks from running. + * + * @constructor + * @private + * @param {function} [taskHandler] + * The function to call when this task runs, if any. + * + * @param {boolean} [blocked] + * Whether this task should start blocked. + */ + function Task(taskHandler, blocked) { + + /** + * Reference to this Task. + * + * @private + * @type {!Guacamole.Display.Task} + */ + var task = this; + + /** + * Whether this Task is blocked. + * + * @type {boolean} + */ + this.blocked = blocked; + + /** + * Cancels this task such that it will not run. The task handler + * provided at construction time, if any, is not invoked. Calling + * execute() after calling this function has no effect. + */ + this.cancel = function cancel() { + task.blocked = false; + taskHandler = null; + }; + + /** + * Unblocks this Task, allowing it to run. + */ + this.unblock = function() { + if (task.blocked) { + task.blocked = false; + + if (frames.length) + __flush_frames(); + + } + }; + + /** + * Calls the handler associated with this task IMMEDIATELY. This + * function does not track whether this task is marked as blocked. + * Enforcing the blocked status of tasks is up to the caller. + */ + this.execute = function() { + if (taskHandler) taskHandler(); + }; + + } + + /** + * Schedules a task for future execution. The given handler will execute + * immediately after all previous tasks upon frame flush, unless this + * task is blocked. If any tasks is blocked, the entire frame will not + * render (and no tasks within will execute) until all tasks are unblocked. + * + * @private + * @param {function} [handler] + * The function to call when possible, if any. + * + * @param {boolean} [blocked] + * Whether the task should start blocked. + * + * @returns {!Task} + * The Task created and added to the queue for future running. + */ + function scheduleTask(handler, blocked) { + var task = new Task(handler, blocked); + tasks.push(task); + return task; + } + + /** + * Returns the element which contains the Guacamole display. + * + * @return {!Element} + * The element containing the Guacamole display. + */ + this.getElement = function() { + return bounds; + }; + + /** + * Returns the width of this display. + * + * @return {!number} + * The width of this display; + */ + this.getWidth = function() { + return displayWidth; + }; + + /** + * Returns the height of this display. + * + * @return {!number} + * The height of this display; + */ + this.getHeight = function() { + return displayHeight; + }; + + /** + * Returns the default layer of this display. Each Guacamole display always + * has at least one layer. Other layers can optionally be created within + * this layer, but the default layer cannot be removed and is the absolute + * ancestor of all other layers. + * + * @return {!Guacamole.Display.VisibleLayer} + * The default layer. + */ + this.getDefaultLayer = function() { + return default_layer; + }; + + /** + * Returns the cursor layer of this display. Each Guacamole display contains + * a layer for the image of the mouse cursor. This layer is a special case + * and exists above all other layers, similar to the hardware mouse cursor. + * + * @return {!Guacamole.Display.VisibleLayer} + * The cursor layer. + */ + this.getCursorLayer = function() { + return cursor; + }; + + /** + * Creates a new layer. The new layer will be a direct child of the default + * layer, but can be moved to be a child of any other layer. Layers returned + * by this function are visible. + * + * @return {!Guacamole.Display.VisibleLayer} + * The newly-created layer. + */ + this.createLayer = function() { + var layer = new Guacamole.Display.VisibleLayer(displayWidth, displayHeight); + layer.move(default_layer, 0, 0, 0); + return layer; + }; + + /** + * Creates a new buffer. Buffers are invisible, off-screen surfaces. They + * are implemented in the same manner as layers, but do not provide the + * same nesting semantics. + * + * @return {!Guacamole.Layer} + * The newly-created buffer. + */ + this.createBuffer = function() { + var buffer = new Guacamole.Layer(0, 0); + buffer.autosize = 1; + return buffer; + }; + + /** + * Flush all pending draw tasks, if possible, as a new frame. If the entire + * frame is not ready, the flush will wait until all required tasks are + * unblocked. + * + * @param {function} [callback] + * The function to call when this frame is flushed. This may happen + * immediately, or later when blocked tasks become unblocked. + * + * @param {number} timestamp + * The remote timestamp of sync instruction associated with this frame. + * This timestamp is in milliseconds, but is arbitrary, having meaning + * only relative to other remote timestamps in the same connection. + * + * @param {number} logicalFrames + * The number of remote desktop frames that were combined to produce + * this frame. + */ + this.flush = function(callback, timestamp, logicalFrames) { + + // Add frame, reset tasks + frames.push(new Frame(callback, tasks, timestamp, logicalFrames)); + tasks = []; + + // Attempt flush + __flush_frames(); + + }; + + /** + * Cancels rendering of all pending frames and associated rendering + * operations. The callbacks provided to outstanding past calls to flush(), + * if any, are not invoked. + */ + this.cancel = function cancel() { + + frames.forEach(function cancelFrame(frame) { + frame.cancel(); + }); + + frames = []; + + tasks.forEach(function cancelTask(task) { + task.cancel(); + }); + + tasks = []; + + }; + + /** + * Sets the hotspot and image of the mouse cursor displayed within the + * Guacamole display. + * + * @param {!number} hotspotX + * The X coordinate of the cursor hotspot. + * + * @param {!number} hotspotY + * The Y coordinate of the cursor hotspot. + * + * @param {!Guacamole.Layer} layer + * The source layer containing the data which should be used as the + * mouse cursor image. + * + * @param {!number} srcx + * The X coordinate of the upper-left corner of the rectangle within + * the source layer's coordinate space to copy data from. + * + * @param {!number} srcy + * The Y coordinate of the upper-left corner of the rectangle within + * the source layer's coordinate space to copy data from. + * + * @param {!number} srcw + * The width of the rectangle within the source layer's coordinate + * space to copy data from. + * + * @param {!number} srch + * The height of the rectangle within the source layer's coordinate + * space to copy data from. + */ + this.setCursor = function(hotspotX, hotspotY, layer, srcx, srcy, srcw, srch) { + scheduleTask(function __display_set_cursor() { + + // Set hotspot + guac_display.cursorHotspotX = hotspotX; + guac_display.cursorHotspotY = hotspotY; + + // Reset cursor size + cursor.resize(srcw, srch); + + // Draw cursor to cursor layer + cursor.copy(layer, srcx, srcy, srcw, srch, 0, 0); + guac_display.moveCursor(guac_display.cursorX, guac_display.cursorY); + + // Fire cursor change event + if (guac_display.oncursor) + guac_display.oncursor(cursor.toCanvas(), hotspotX, hotspotY); + + }); + }; + + /** + * Sets whether the software-rendered cursor is shown. This cursor differs + * from the hardware cursor in that it is built into the Guacamole.Display, + * and relies on its own Guacamole layer to render. + * + * @param {boolean} [shown=true] + * Whether to show the software cursor. + */ + this.showCursor = function(shown) { + + var element = cursor.getElement(); + var parent = element.parentNode; + + // Remove from DOM if hidden + if (shown === false) { + if (parent) + parent.removeChild(element); + } + + // Otherwise, ensure cursor is child of display + else if (parent !== display) + display.appendChild(element); + + }; + + /** + * Sets the location of the local cursor to the given coordinates. For the + * sake of responsiveness, this function performs its action immediately. + * Cursor motion is not maintained within atomic frames. + * + * @param {!number} x + * The X coordinate to move the cursor to. + * + * @param {!number} y + * The Y coordinate to move the cursor to. + */ + this.moveCursor = function(x, y) { + + // Move cursor layer + cursor.translate(x - guac_display.cursorHotspotX, + y - guac_display.cursorHotspotY); + + // Update stored position + guac_display.cursorX = x; + guac_display.cursorY = y; + + }; + + /** + * Changes the size of the given Layer to the given width and height. + * Resizing is only attempted if the new size provided is actually different + * from the current size. + * + * @param {!Guacamole.Layer} layer + * The layer to resize. + * + * @param {!number} width + * The new width. + * + * @param {!number} height + * The new height. + */ + this.resize = function(layer, width, height) { + scheduleTask(function __display_resize() { + + layer.resize(width, height); + + // Resize display if default layer is resized + if (layer === default_layer) { + + // Update (set) display size + displayWidth = width; + displayHeight = height; + display.style.width = displayWidth + "px"; + display.style.height = displayHeight + "px"; + + // Update bounds size + bounds.style.width = (displayWidth*displayScale) + "px"; + bounds.style.height = (displayHeight*displayScale) + "px"; + + // Notify of resize + if (guac_display.onresize) + guac_display.onresize(width, height); + + } + + }); + }; + + /** + * Draws the specified image at the given coordinates. The image specified + * must already be loaded. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!CanvasImageSource} image + * The image to draw. Note that this not a URL. + */ + this.drawImage = function(layer, x, y, image) { + scheduleTask(function __display_drawImage() { + layer.drawImage(x, y, image); + }); + }; + + /** + * Draws the image contained within the specified Blob at the given + * coordinates. The Blob specified must already be populated with image + * data. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!Blob} blob + * The Blob containing the image data to draw. + */ + this.drawBlob = function(layer, x, y, blob) { + + var task; + + // Prefer createImageBitmap() over blob URLs if available + if (window.createImageBitmap) { + + var bitmap; + + // Draw image once loaded + task = scheduleTask(function drawImageBitmap() { + layer.drawImage(x, y, bitmap); + }, true); + + // Load image from provided blob + window.createImageBitmap(blob).then(function bitmapLoaded(decoded) { + bitmap = decoded; + task.unblock(); + }); + + } + + // Use blob URLs and the Image object if createImageBitmap() is + // unavailable + else { + + // Create URL for blob + var url = URL.createObjectURL(blob); + + // Draw and free blob URL when ready + task = scheduleTask(function __display_drawBlob() { + + // Draw the image only if it loaded without errors + if (image.width && image.height) + layer.drawImage(x, y, image); + + // Blob URL no longer needed + URL.revokeObjectURL(url); + + }, true); + + // Load image from URL + var image = new Image(); + image.onload = task.unblock; + image.onerror = task.unblock; + image.src = url; + + } + + }; + + /** + * Draws the image within the given stream at the given coordinates. The + * image will be loaded automatically, and this and any future operations + * will wait for the image to finish loading. This function will + * automatically choose an appropriate method for reading and decoding the + * given image stream, and should be preferred for received streams except + * where manual decoding of the stream is unavoidable. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!Guacamole.InputStream} stream + * The stream along which image data will be received. + * + * @param {!string} mimetype + * The mimetype of the image within the stream. + */ + this.drawStream = function drawStream(layer, x, y, stream, mimetype) { + + // Leverage ImageDecoder to decode the image stream as it is received + // whenever possible, as this reduces latency that might otherwise be + // caused by waiting for the full image to be received + if (window.ImageDecoder && window.ReadableStream) { + + var imageDecoder = new ImageDecoder({ + type: mimetype, + data: stream.toReadableStream() + }); + + var decodedFrame = null; + + // Draw image once loaded + var task = scheduleTask(function drawImageBitmap() { + layer.drawImage(x, y, decodedFrame); + }, true); + + imageDecoder.decode({ completeFramesOnly: true }).then(function bitmapLoaded(result) { + decodedFrame = result.image; + task.unblock(); + }); + + } + + // NOTE: We do not use Blobs and createImageBitmap() here, as doing so + // is very latent compared to the old data URI method and the new + // ImageDecoder object. The new ImageDecoder object is currently + // supported by most browsers, with other browsers being much faster if + // data URIs are used. The iOS version of Safari is particularly laggy + // if Blobs and createImageBitmap() are used instead. + + // Lacking ImageDecoder, fall back to data URIs and the Image object + else { + var reader = new Guacamole.DataURIReader(stream, mimetype); + reader.onend = function drawImageDataURI() { + guac_display.draw(layer, x, y, reader.getURI()); + }; + } + + }; + + /** + * Draws the image at the specified URL at the given coordinates. The image + * will be loaded automatically, and this and any future operations will + * wait for the image to finish loading. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!string} url + * The URL of the image to draw. + */ + this.draw = function(layer, x, y, url) { + + var task = scheduleTask(function __display_draw() { + + // Draw the image only if it loaded without errors + if (image.width && image.height) + layer.drawImage(x, y, image); + + }, true); + + var image = new Image(); + image.onload = task.unblock; + image.onerror = task.unblock; + image.src = url; + + }; + + /** + * Plays the video at the specified URL within this layer. The video + * will be loaded automatically, and this and any future operations will + * wait for the video to finish loading. Future operations will not be + * executed until the video finishes playing. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!string} mimetype + * The mimetype of the video to play. + * + * @param {!number} duration + * The duration of the video in milliseconds. + * + * @param {!string} url + * The URL of the video to play. + */ + this.play = function(layer, mimetype, duration, url) { + + // Start loading the video + var video = document.createElement("video"); + video.type = mimetype; + video.src = url; + + // Start copying frames when playing + video.addEventListener("play", function() { + + function render_callback() { + layer.drawImage(0, 0, video); + if (!video.ended) + window.setTimeout(render_callback, 20); + } + + render_callback(); + + }, false); + + scheduleTask(video.play); + + }; + + /** + * Transfer a rectangle of image data from one Layer to this Layer using the + * specified transfer function. + * + * @param {!Guacamole.Layer} srcLayer + * The Layer to copy image data from. + * + * @param {!number} srcx + * The X coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcy + * The Y coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcw + * The width of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} srch + * The height of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!Guacamole.Layer} dstLayer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!function} transferFunction + * The transfer function to use to transfer data from source to + * destination. + */ + this.transfer = function(srcLayer, srcx, srcy, srcw, srch, dstLayer, x, y, transferFunction) { + scheduleTask(function __display_transfer() { + dstLayer.transfer(srcLayer, srcx, srcy, srcw, srch, x, y, transferFunction); + }); + }; + + /** + * Put a rectangle of image data from one Layer to this Layer directly + * without performing any alpha blending. Simply copy the data. + * + * @param {!Guacamole.Layer} srcLayer + * The Layer to copy image data from. + * + * @param {!number} srcx + * The X coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcy + * The Y coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcw + * The width of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} srch + * The height of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!Guacamole.Layer} dstLayer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + */ + this.put = function(srcLayer, srcx, srcy, srcw, srch, dstLayer, x, y) { + scheduleTask(function __display_put() { + dstLayer.put(srcLayer, srcx, srcy, srcw, srch, x, y); + }); + }; + + /** + * Copy a rectangle of image data from one Layer to this Layer. This + * operation will copy exactly the image data that will be drawn once all + * operations of the source Layer that were pending at the time this + * function was called are complete. This operation will not alter the + * size of the source Layer even if its autosize property is set to true. + * + * @param {!Guacamole.Layer} srcLayer + * The Layer to copy image data from. + * + * @param {!number} srcx + * The X coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcy + * The Y coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcw + * The width of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} srch + * The height of the rectangle within the source Layer's coordinate space to copy data from. + * + * @param {!Guacamole.Layer} dstLayer + * The layer to draw upon. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + */ + this.copy = function(srcLayer, srcx, srcy, srcw, srch, dstLayer, x, y) { + scheduleTask(function __display_copy() { + dstLayer.copy(srcLayer, srcx, srcy, srcw, srch, x, y); + }); + }; + + /** + * Starts a new path at the specified point. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The X coordinate of the point to draw. + * + * @param {!number} y + * The Y coordinate of the point to draw. + */ + this.moveTo = function(layer, x, y) { + scheduleTask(function __display_moveTo() { + layer.moveTo(x, y); + }); + }; + + /** + * Add the specified line to the current path. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The X coordinate of the endpoint of the line to draw. + * + * @param {!number} y + * The Y coordinate of the endpoint of the line to draw. + */ + this.lineTo = function(layer, x, y) { + scheduleTask(function __display_lineTo() { + layer.lineTo(x, y); + }); + }; + + /** + * Add the specified arc to the current path. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The X coordinate of the center of the circle which will contain the + * arc. + * + * @param {!number} y + * The Y coordinate of the center of the circle which will contain the + * arc. + * + * @param {!number} radius + * The radius of the circle. + * + * @param {!number} startAngle + * The starting angle of the arc, in radians. + * + * @param {!number} endAngle + * The ending angle of the arc, in radians. + * + * @param {!boolean} negative + * Whether the arc should be drawn in order of decreasing angle. + */ + this.arc = function(layer, x, y, radius, startAngle, endAngle, negative) { + scheduleTask(function __display_arc() { + layer.arc(x, y, radius, startAngle, endAngle, negative); + }); + }; + + /** + * Starts a new path at the specified point. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} cp1x + * The X coordinate of the first control point. + * + * @param {!number} cp1y + * The Y coordinate of the first control point. + * + * @param {!number} cp2x + * The X coordinate of the second control point. + * + * @param {!number} cp2y + * The Y coordinate of the second control point. + * + * @param {!number} x + * The X coordinate of the endpoint of the curve. + * + * @param {!number} y + * The Y coordinate of the endpoint of the curve. + */ + this.curveTo = function(layer, cp1x, cp1y, cp2x, cp2y, x, y) { + scheduleTask(function __display_curveTo() { + layer.curveTo(cp1x, cp1y, cp2x, cp2y, x, y); + }); + }; + + /** + * Closes the current path by connecting the end point with the start + * point (if any) with a straight line. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + */ + this.close = function(layer) { + scheduleTask(function __display_close() { + layer.close(); + }); + }; + + /** + * Add the specified rectangle to the current path. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} x + * The X coordinate of the upper-left corner of the rectangle to draw. + * + * @param {!number} y + * The Y coordinate of the upper-left corner of the rectangle to draw. + * + * @param {!number} w + * The width of the rectangle to draw. + * + * @param {!number} h + * The height of the rectangle to draw. + */ + this.rect = function(layer, x, y, w, h) { + scheduleTask(function __display_rect() { + layer.rect(x, y, w, h); + }); + }; + + /** + * Clip all future drawing operations by the current path. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as fillColor()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!Guacamole.Layer} layer + * The layer to affect. + */ + this.clip = function(layer) { + scheduleTask(function __display_clip() { + layer.clip(); + }); + }; + + /** + * Stroke the current path with the specified color. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!string} cap + * The line cap style. Can be "round", "square", or "butt". + * + * @param {!string} join + * The line join style. Can be "round", "bevel", or "miter". + * + * @param {!number} thickness + * The line thickness in pixels. + * + * @param {!number} r + * The red component of the color to fill. + * + * @param {!number} g + * The green component of the color to fill. + * + * @param {!number} b + * The blue component of the color to fill. + * + * @param {!number} a + * The alpha component of the color to fill. + */ + this.strokeColor = function(layer, cap, join, thickness, r, g, b, a) { + scheduleTask(function __display_strokeColor() { + layer.strokeColor(cap, join, thickness, r, g, b, a); + }); + }; + + /** + * Fills the current path with the specified color. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!number} r + * The red component of the color to fill. + * + * @param {!number} g + * The green component of the color to fill. + * + * @param {!number} b + * The blue component of the color to fill. + * + * @param {!number} a + * The alpha component of the color to fill. + */ + this.fillColor = function(layer, r, g, b, a) { + scheduleTask(function __display_fillColor() { + layer.fillColor(r, g, b, a); + }); + }; + + /** + * Stroke the current path with the image within the specified layer. The + * image data will be tiled infinitely within the stroke. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!string} cap + * The line cap style. Can be "round", "square", or "butt". + * + * @param {!string} join + * The line join style. Can be "round", "bevel", or "miter". + * + * @param {!number} thickness + * The line thickness in pixels. + * + * @param {!Guacamole.Layer} srcLayer + * The layer to use as a repeating pattern within the stroke. + */ + this.strokeLayer = function(layer, cap, join, thickness, srcLayer) { + scheduleTask(function __display_strokeLayer() { + layer.strokeLayer(cap, join, thickness, srcLayer); + }); + }; + + /** + * Fills the current path with the image within the specified layer. The + * image data will be tiled infinitely within the stroke. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + * + * @param {!Guacamole.Layer} srcLayer + * The layer to use as a repeating pattern within the fill. + */ + this.fillLayer = function(layer, srcLayer) { + scheduleTask(function __display_fillLayer() { + layer.fillLayer(srcLayer); + }); + }; + + /** + * Push current layer state onto stack. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + */ + this.push = function(layer) { + scheduleTask(function __display_push() { + layer.push(); + }); + }; + + /** + * Pop layer state off stack. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + */ + this.pop = function(layer) { + scheduleTask(function __display_pop() { + layer.pop(); + }); + }; + + /** + * Reset the layer, clearing the stack, the current path, and any transform + * matrix. + * + * @param {!Guacamole.Layer} layer + * The layer to draw upon. + */ + this.reset = function(layer) { + scheduleTask(function __display_reset() { + layer.reset(); + }); + }; + + /** + * Sets the given affine transform (defined with six values from the + * transform's matrix). + * + * @param {!Guacamole.Layer} layer + * The layer to modify. + * + * @param {!number} a + * The first value in the affine transform's matrix. + * + * @param {!number} b + * The second value in the affine transform's matrix. + * + * @param {!number} c + * The third value in the affine transform's matrix. + * + * @param {!number} d + * The fourth value in the affine transform's matrix. + * + * @param {!number} e + * The fifth value in the affine transform's matrix. + * + * @param {!number} f + * The sixth value in the affine transform's matrix. + */ + this.setTransform = function(layer, a, b, c, d, e, f) { + scheduleTask(function __display_setTransform() { + layer.setTransform(a, b, c, d, e, f); + }); + }; + + /** + * Applies the given affine transform (defined with six values from the + * transform's matrix). + * + * @param {!Guacamole.Layer} layer + * The layer to modify. + * + * @param {!number} a + * The first value in the affine transform's matrix. + * + * @param {!number} b + * The second value in the affine transform's matrix. + * + * @param {!number} c + * The third value in the affine transform's matrix. + * + * @param {!number} d + * The fourth value in the affine transform's matrix. + * + * @param {!number} e + * The fifth value in the affine transform's matrix. + * + * @param {!number} f + * The sixth value in the affine transform's matrix. + * + */ + this.transform = function(layer, a, b, c, d, e, f) { + scheduleTask(function __display_transform() { + layer.transform(a, b, c, d, e, f); + }); + }; + + /** + * Sets the channel mask for future operations on this Layer. + * + * The channel mask is a Guacamole-specific compositing operation identifier + * with a single bit representing each of four channels (in order): source + * image where destination transparent, source where destination opaque, + * destination where source transparent, and destination where source + * opaque. + * + * @param {!Guacamole.Layer} layer + * The layer to modify. + * + * @param {!number} mask + * The channel mask for future operations on this Layer. + */ + this.setChannelMask = function(layer, mask) { + scheduleTask(function __display_setChannelMask() { + layer.setChannelMask(mask); + }); + }; + + /** + * Sets the miter limit for stroke operations using the miter join. This + * limit is the maximum ratio of the size of the miter join to the stroke + * width. If this ratio is exceeded, the miter will not be drawn for that + * joint of the path. + * + * @param {!Guacamole.Layer} layer + * The layer to modify. + * + * @param {!number} limit + * The miter limit for stroke operations using the miter join. + */ + this.setMiterLimit = function(layer, limit) { + scheduleTask(function __display_setMiterLimit() { + layer.setMiterLimit(limit); + }); + }; + + /** + * Removes the given layer container entirely, such that it is no longer + * contained within its parent layer, if any. + * + * @param {!Guacamole.Display.VisibleLayer} layer + * The layer being removed from its parent. + */ + this.dispose = function dispose(layer) { + scheduleTask(function disposeLayer() { + layer.dispose(); + }); + }; + + /** + * Applies the given affine transform (defined with six values from the + * transform's matrix) to the given layer. + * + * @param {!Guacamole.Display.VisibleLayer} layer + * The layer being distorted. + * + * @param {!number} a + * The first value in the affine transform's matrix. + * + * @param {!number} b + * The second value in the affine transform's matrix. + * + * @param {!number} c + * The third value in the affine transform's matrix. + * + * @param {!number} d + * The fourth value in the affine transform's matrix. + * + * @param {!number} e + * The fifth value in the affine transform's matrix. + * + * @param {!number} f + * The sixth value in the affine transform's matrix. + */ + this.distort = function distort(layer, a, b, c, d, e, f) { + scheduleTask(function distortLayer() { + layer.distort(a, b, c, d, e, f); + }); + }; + + /** + * Moves the upper-left corner of the given layer to the given X and Y + * coordinate, sets the Z stacking order, and reparents the layer + * to the given parent layer. + * + * @param {!Guacamole.Display.VisibleLayer} layer + * The layer being moved. + * + * @param {!Guacamole.Display.VisibleLayer} parent + * The parent to set. + * + * @param {!number} x + * The X coordinate to move to. + * + * @param {!number} y + * The Y coordinate to move to. + * + * @param {!number} z + * The Z coordinate to move to. + */ + this.move = function move(layer, parent, x, y, z) { + scheduleTask(function moveLayer() { + layer.move(parent, x, y, z); + }); + }; + + /** + * Sets the opacity of the given layer to the given value, where 255 is + * fully opaque and 0 is fully transparent. + * + * @param {!Guacamole.Display.VisibleLayer} layer + * The layer whose opacity should be set. + * + * @param {!number} alpha + * The opacity to set. + */ + this.shade = function shade(layer, alpha) { + scheduleTask(function shadeLayer() { + layer.shade(alpha); + }); + }; + + /** + * Sets the scale of the client display element such that it renders at + * a relatively smaller or larger size, without affecting the true + * resolution of the display. + * + * @param {!number} scale + * The scale to resize to, where 1.0 is normal size (1:1 scale). + */ + this.scale = function(scale) { + + display.style.transform = + display.style.WebkitTransform = + display.style.MozTransform = + display.style.OTransform = + display.style.msTransform = + + "scale(" + scale + "," + scale + ")"; + + displayScale = scale; + + // Update bounds size + bounds.style.width = (displayWidth*displayScale) + "px"; + bounds.style.height = (displayHeight*displayScale) + "px"; + + }; + + /** + * Returns the scale of the display. + * + * @return {!number} + * The scale of the display. + */ + this.getScale = function() { + return displayScale; + }; + + /** + * Returns a canvas element containing the entire display, with all child + * layers composited within. + * + * @return {!HTMLCanvasElement} + * A new canvas element containing a copy of the display. + */ + this.flatten = function() { + + // Get destination canvas + var canvas = document.createElement("canvas"); + canvas.width = default_layer.width; + canvas.height = default_layer.height; + + var context = canvas.getContext("2d"); + + // Returns sorted array of children + function get_children(layer) { + + // Build array of children + var children = []; + for (var index in layer.children) + children.push(layer.children[index]); + + // Sort + children.sort(function children_comparator(a, b) { + + // Compare based on Z order + var diff = a.z - b.z; + if (diff !== 0) + return diff; + + // If Z order identical, use document order + var a_element = a.getElement(); + var b_element = b.getElement(); + var position = b_element.compareDocumentPosition(a_element); + + if (position & Node.DOCUMENT_POSITION_PRECEDING) return -1; + if (position & Node.DOCUMENT_POSITION_FOLLOWING) return 1; + + // Otherwise, assume same + return 0; + + }); + + // Done + return children; + + } + + // Draws the contents of the given layer at the given coordinates + function draw_layer(layer, x, y) { + + // Draw layer + if (layer.width > 0 && layer.height > 0) { + + // Save and update alpha + var initial_alpha = context.globalAlpha; + context.globalAlpha *= layer.alpha / 255.0; + + // Copy data + context.drawImage(layer.getCanvas(), x, y); + + // Draw all children + var children = get_children(layer); + for (var i=0; i} + */ + this.children = {}; + + // Set layer position + var canvas = layer.getCanvas(); + canvas.style.position = "absolute"; + canvas.style.left = "0px"; + canvas.style.top = "0px"; + + // Create div with given size + var div = document.createElement("div"); + div.appendChild(canvas); + div.style.width = width + "px"; + div.style.height = height + "px"; + div.style.position = "absolute"; + div.style.left = "0px"; + div.style.top = "0px"; + div.style.overflow = "hidden"; + + /** + * Superclass resize() function. + * @private + */ + var __super_resize = this.resize; + + this.resize = function(width, height) { + + // Resize containing div + div.style.width = width + "px"; + div.style.height = height + "px"; + + __super_resize(width, height); + + }; + + /** + * Returns the element containing the canvas and any other elements + * associated with this layer. + * + * @returns {!Element} + * The element containing this layer's canvas. + */ + this.getElement = function() { + return div; + }; + + /** + * The translation component of this layer's transform. + * + * @private + * @type {!string} + */ + var translate = "translate(0px, 0px)"; // (0, 0) + + /** + * The arbitrary matrix component of this layer's transform. + * + * @private + * @type {!string} + */ + var matrix = "matrix(1, 0, 0, 1, 0, 0)"; // Identity + + /** + * Moves the upper-left corner of this layer to the given X and Y + * coordinate. + * + * @param {!number} x + * The X coordinate to move to. + * + * @param {!number} y + * The Y coordinate to move to. + */ + this.translate = function(x, y) { + + layer.x = x; + layer.y = y; + + // Generate translation + translate = "translate(" + + x + "px," + + y + "px)"; + + // Set layer transform + div.style.transform = + div.style.WebkitTransform = + div.style.MozTransform = + div.style.OTransform = + div.style.msTransform = + + translate + " " + matrix; + + }; + + /** + * Moves the upper-left corner of this VisibleLayer to the given X and Y + * coordinate, sets the Z stacking order, and reparents this VisibleLayer + * to the given VisibleLayer. + * + * @param {!Guacamole.Display.VisibleLayer} parent + * The parent to set. + * + * @param {!number} x + * The X coordinate to move to. + * + * @param {!number} y + * The Y coordinate to move to. + * + * @param {!number} z + * The Z coordinate to move to. + */ + this.move = function(parent, x, y, z) { + + // Set parent if necessary + if (layer.parent !== parent) { + + // Maintain relationship + if (layer.parent) + delete layer.parent.children[layer.__unique_id]; + layer.parent = parent; + parent.children[layer.__unique_id] = layer; + + // Reparent element + var parent_element = parent.getElement(); + parent_element.appendChild(div); + + } + + // Set location + layer.translate(x, y); + layer.z = z; + div.style.zIndex = z; + + }; + + /** + * Sets the opacity of this layer to the given value, where 255 is fully + * opaque and 0 is fully transparent. + * + * @param {!number} a + * The opacity to set. + */ + this.shade = function(a) { + layer.alpha = a; + div.style.opacity = a/255.0; + }; + + /** + * Removes this layer container entirely, such that it is no longer + * contained within its parent layer, if any. + */ + this.dispose = function() { + + // Remove from parent container + if (layer.parent) { + delete layer.parent.children[layer.__unique_id]; + layer.parent = null; + } + + // Remove from parent element + if (div.parentNode) + div.parentNode.removeChild(div); + + }; + + /** + * Applies the given affine transform (defined with six values from the + * transform's matrix). + * + * @param {!number} a + * The first value in the affine transform's matrix. + * + * @param {!number} b + * The second value in the affine transform's matrix. + * + * @param {!number} c + * The third value in the affine transform's matrix. + * + * @param {!number} d + * The fourth value in the affine transform's matrix. + * + * @param {!number} e + * The fifth value in the affine transform's matrix. + * + * @param {!number} f + * The sixth value in the affine transform's matrix. + */ + this.distort = function(a, b, c, d, e, f) { + + // Store matrix + layer.matrix = [a, b, c, d, e, f]; + + // Generate matrix transformation + matrix = + + /* a c e + * b d f + * 0 0 1 + */ + + "matrix(" + a + "," + b + "," + c + "," + d + "," + e + "," + f + ")"; + + // Set layer transform + div.style.transform = + div.style.WebkitTransform = + div.style.MozTransform = + div.style.OTransform = + div.style.msTransform = + + translate + " " + matrix; + + }; + +}; + +/** + * The next identifier to be assigned to the layer container. This identifier + * uniquely identifies each VisibleLayer, but is unrelated to the index of + * the layer, which exists at the protocol/client level only. + * + * @private + * @type {!number} + */ +Guacamole.Display.VisibleLayer.__next_id = 0; + +/** + * A set of Guacamole display performance statistics, describing the speed at + * which the remote desktop, Guacamole server, and Guacamole client are + * rendering frames. + * + * @constructor + * @param {Guacamole.Display.Statistics|Object} [template={}] + * The object whose properties should be copied within the new + * Guacamole.Display.Statistics. + */ +Guacamole.Display.Statistics = function Statistics(template) { + + template = template || {}; + + /** + * The amount of time that the Guacamole client is taking to render + * individual frames, in milliseconds, if known. If this value is unknown, + * such as if the there are insufficient frame statistics recorded to + * calculate this value, this will be null. + * + * @type {?number} + */ + this.processingLag = template.processingLag; + + /** + * The framerate of the remote desktop currently being viewed within the + * relevant Gucamole.Display, independent of Guacamole, in frames per + * second. This represents the speed at which the remote desktop is + * producing frame data for the Guacamole server to consume. If this + * value is unknown, such as if the remote desktop server does not actually + * define frame boundaries, this will be null. + * + * @type {?number} + */ + this.desktopFps = template.desktopFps; + + /** + * The rate at which the Guacamole server is generating frames for the + * Guacamole client to consume, in frames per second. If the Guacamole + * server is correctly adjusting for variance in client/browser processing + * power, this rate should closely match the client rate, and should remain + * independent of any network latency. If this value is unknown, such as if + * the there are insufficient frame statistics recorded to calculate this + * value, this will be null. + * + * @type {?number} + */ + this.serverFps = template.serverFps; + + /** + * The rate at which the Guacamole client is consuming frames generated by + * the Guacamole server, in frames per second. If the Guacamole server is + * correctly adjusting for variance in client/browser processing power, + * this rate should closely match the server rate, regardless of any + * latency on the network between the server and client. If this value is + * unknown, such as if the there are insufficient frame statistics recorded + * to calculate this value, this will be null. + * + * @type {?number} + */ + this.clientFps = template.clientFps; + + /** + * The rate at which the Guacamole server is dropping or combining frames + * received from the remote desktop server to compensate for variance in + * client/browser processing power, in frames per second. This value may + * also be non-zero if the server is compensating for variances in its own + * processing power, or relative slowness in image compression vs. the rate + * that inbound frames are received. If this value is unknown, such as if + * the remote desktop server does not actually define frame boundaries, + * this will be null. + */ + this.dropRate = template.dropRate; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Event.js b/guacamole-common-js/src/main/webapp/modules/Event.js new file mode 100644 index 0000000..04a4148 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Event.js @@ -0,0 +1,326 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * An arbitrary event, emitted by a {@link Guacamole.Event.Target}. This object + * should normally serve as the base class for a different object that is more + * specific to the event type. + * + * @constructor + * @param {!string} type + * The unique name of this event type. + */ +Guacamole.Event = function Event(type) { + + /** + * The unique name of this event type. + * + * @type {!string} + */ + this.type = type; + + /** + * An arbitrary timestamp in milliseconds, indicating this event's + * position in time relative to other events. + * + * @type {!number} + */ + this.timestamp = new Date().getTime(); + + /** + * Returns the number of milliseconds elapsed since this event was created. + * + * @return {!number} + * The number of milliseconds elapsed since this event was created. + */ + this.getAge = function getAge() { + return new Date().getTime() - this.timestamp; + }; + + /** + * Requests that the legacy event handler associated with this event be + * invoked on the given event target. This function will be invoked + * automatically by implementations of {@link Guacamole.Event.Target} + * whenever {@link Guacamole.Event.Target#emit emit()} is invoked. + *

    + * Older versions of Guacamole relied on single event handlers with the + * prefix "on", such as "onmousedown" or "onkeyup". If a Guacamole.Event + * implementation is replacing the event previously represented by one of + * these handlers, this function gives the implementation the opportunity + * to provide backward compatibility with the old handler. + *

    + * Unless overridden, this function does nothing. + * + * @param {!Guacamole.Event.Target} eventTarget + * The {@link Guacamole.Event.Target} that emitted this event. + */ + this.invokeLegacyHandler = function invokeLegacyHandler(eventTarget) { + // Do nothing + }; + +}; + +/** + * A {@link Guacamole.Event} that may relate to one or more DOM events. + * Continued propagation and default behavior of the related DOM events may be + * prevented with {@link Guacamole.Event.DOMEvent#stopPropagation stopPropagation()} + * and {@link Guacamole.Event.DOMEvent#preventDefault preventDefault()} + * respectively. + * + * @constructor + * @augments Guacamole.Event + * + * @param {!string} type + * The unique name of this event type. + * + * @param {Event|Event[]} [events=[]] + * The DOM events that are related to this event, if any. Future calls to + * {@link Guacamole.Event.DOMEvent#preventDefault preventDefault()} and + * {@link Guacamole.Event.DOMEvent#stopPropagation stopPropagation()} will + * affect these events. + */ +Guacamole.Event.DOMEvent = function DOMEvent(type, events) { + + Guacamole.Event.call(this, type); + + // Default to empty array + events = events || []; + + // Automatically wrap non-array single Event in an array + if (!Array.isArray(events)) + events = [ events ]; + + /** + * Requests that the default behavior of related DOM events be prevented. + * Whether this request will be honored by the browser depends on the + * nature of those events and the timing of the request. + */ + this.preventDefault = function preventDefault() { + events.forEach(function applyPreventDefault(event) { + if (event.preventDefault) event.preventDefault(); + event.returnValue = false; + }); + }; + + /** + * Stops further propagation of related events through the DOM. Only events + * that are directly related to this event will be stopped. + */ + this.stopPropagation = function stopPropagation() { + events.forEach(function applyStopPropagation(event) { + event.stopPropagation(); + }); + }; + +}; + +/** + * Convenience function for cancelling all further processing of a given DOM + * event. Invoking this function prevents the default behavior of the event and + * stops any further propagation. + * + * @param {!Event} event + * The DOM event to cancel. + */ +Guacamole.Event.DOMEvent.cancelEvent = function cancelEvent(event) { + event.stopPropagation(); + if (event.preventDefault) event.preventDefault(); + event.returnValue = false; +}; + +/** + * An object which can dispatch {@link Guacamole.Event} objects. Listeners + * registered with {@link Guacamole.Event.Target#on on()} will automatically + * be invoked based on the type of {@link Guacamole.Event} passed to + * {@link Guacamole.Event.Target#dispatch dispatch()}. It is normally + * subclasses of Guacamole.Event.Target that will dispatch events, and usages + * of those subclasses that will catch dispatched events with on(). + * + * @constructor + */ +Guacamole.Event.Target = function Target() { + + /** + * A callback function which handles an event dispatched by an event + * target. + * + * @callback Guacamole.Event.Target~listener + * @param {!Guacamole.Event} event + * The event that was dispatched. + * + * @param {!Guacamole.Event.Target} target + * The object that dispatched the event. + */ + + /** + * All listeners (callback functions) registered for each event type passed + * to {@link Guacamole.Event.Targer#on on()}. + * + * @private + * @type {!Object.} + */ + var listeners = {}; + + /** + * Registers a listener for events having the given type, as dictated by + * the {@link Guacamole.Event#type type} property of {@link Guacamole.Event} + * provided to {@link Guacamole.Event.Target#dispatch dispatch()}. + * + * @param {!string} type + * The unique name of this event type. + * + * @param {!Guacamole.Event.Target~listener} listener + * The function to invoke when an event having the given type is + * dispatched. The {@link Guacamole.Event} object provided to + * {@link Guacamole.Event.Target#dispatch dispatch()} will be passed to + * this function, along with the dispatching Guacamole.Event.Target. + */ + this.on = function on(type, listener) { + + var relevantListeners = listeners[type]; + if (!relevantListeners) + listeners[type] = relevantListeners = []; + + relevantListeners.push(listener); + + }; + + /** + * Registers a listener for events having the given types, as dictated by + * the {@link Guacamole.Event#type type} property of {@link Guacamole.Event} + * provided to {@link Guacamole.Event.Target#dispatch dispatch()}. + *

    + * Invoking this function is equivalent to manually invoking + * {@link Guacamole.Event.Target#on on()} for each of the provided types. + * + * @param {!string[]} types + * The unique names of the event types to associate with the given + * listener. + * + * @param {!Guacamole.Event.Target~listener} listener + * The function to invoke when an event having any of the given types + * is dispatched. The {@link Guacamole.Event} object provided to + * {@link Guacamole.Event.Target#dispatch dispatch()} will be passed to + * this function, along with the dispatching Guacamole.Event.Target. + */ + this.onEach = function onEach(types, listener) { + types.forEach(function addListener(type) { + this.on(type, listener); + }, this); + }; + + /** + * Dispatches the given event, invoking all event handlers registered with + * this Guacamole.Event.Target for that event's + * {@link Guacamole.Event#type type}. + * + * @param {!Guacamole.Event} event + * The event to dispatch. + */ + this.dispatch = function dispatch(event) { + + // Invoke any relevant legacy handler for the event + event.invokeLegacyHandler(this); + + // Invoke all registered listeners + var relevantListeners = listeners[event.type]; + if (relevantListeners) { + for (var i = 0; i < relevantListeners.length; i++) { + relevantListeners[i](event, this); + } + } + + }; + + /** + * Unregisters a listener that was previously registered with + * {@link Guacamole.Event.Target#on on()} or + * {@link Guacamole.Event.Target#onEach onEach()}. If no such listener was + * registered, this function has no effect. If multiple copies of the same + * listener were registered, the first listener still registered will be + * removed. + * + * @param {!string} type + * The unique name of the event type handled by the listener being + * removed. + * + * @param {!Guacamole.Event.Target~listener} listener + * The listener function previously provided to + * {@link Guacamole.Event.Target#on on()}or + * {@link Guacamole.Event.Target#onEach onEach()}. + * + * @returns {!boolean} + * true if the specified listener was removed, false otherwise. + */ + this.off = function off(type, listener) { + + var relevantListeners = listeners[type]; + if (!relevantListeners) + return false; + + for (var i = 0; i < relevantListeners.length; i++) { + if (relevantListeners[i] === listener) { + relevantListeners.splice(i, 1); + return true; + } + } + + return false; + + }; + + /** + * Unregisters listeners that were previously registered with + * {@link Guacamole.Event.Target#on on()} or + * {@link Guacamole.Event.Target#onEach onEach()}. If no such listeners + * were registered, this function has no effect. If multiple copies of the + * same listener were registered for the same event type, the first + * listener still registered will be removed. + *

    + * Invoking this function is equivalent to manually invoking + * {@link Guacamole.Event.Target#off off()} for each of the provided types. + * + * @param {!string[]} types + * The unique names of the event types handled by the listeners being + * removed. + * + * @param {!Guacamole.Event.Target~listener} listener + * The listener function previously provided to + * {@link Guacamole.Event.Target#on on()} or + * {@link Guacamole.Event.Target#onEach onEach()}. + * + * @returns {!boolean} + * true if any of the specified listeners were removed, false + * otherwise. + */ + this.offEach = function offEach(types, listener) { + + var changed = false; + + types.forEach(function removeListener(type) { + changed |= this.off(type, listener); + }, this); + + return changed; + + }; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/InputSink.js b/guacamole-common-js/src/main/webapp/modules/InputSink.js new file mode 100644 index 0000000..616fe26 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/InputSink.js @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A hidden input field which attempts to keep itself focused at all times, + * except when another input field has been intentionally focused, whether + * programatically or by the user. The actual underlying input field, returned + * by getElement(), may be used as a reliable source of keyboard-related events, + * particularly composition and input events which may require a focused input + * field to be dispatched at all. + * + * @constructor + */ +Guacamole.InputSink = function InputSink() { + + /** + * Reference to this instance of Guacamole.InputSink. + * + * @private + * @type {!Guacamole.InputSink} + */ + var sink = this; + + /** + * The underlying input field, styled to be invisible. + * + * @private + * @type {!Element} + */ + var field = document.createElement('textarea'); + field.style.position = 'fixed'; + field.style.outline = 'none'; + field.style.border = 'none'; + field.style.margin = '0'; + field.style.padding = '0'; + field.style.height = '0'; + field.style.width = '0'; + field.style.left = '0'; + field.style.bottom = '0'; + field.style.resize = 'none'; + field.style.background = 'transparent'; + field.style.color = 'transparent'; + + // Keep field clear when modified via normal keypresses + field.addEventListener("keypress", function clearKeypress(e) { + field.value = ''; + }, false); + + // Keep field clear when modofied via composition events + field.addEventListener("compositionend", function clearCompletedComposition(e) { + if (e.data) + field.value = ''; + }, false); + + // Keep field clear when modofied via input events + field.addEventListener("input", function clearCompletedInput(e) { + if (e.data && !e.isComposing) + field.value = ''; + }, false); + + // Whenever focus is gained, automatically click to ensure cursor is + // actually placed within the field (the field may simply be highlighted or + // outlined otherwise) + field.addEventListener("focus", function focusReceived() { + window.setTimeout(function deferRefocus() { + field.click(); + field.select(); + }, 0); + }, true); + + /** + * Attempts to focus the underlying input field. The focus attempt occurs + * asynchronously, and may silently fail depending on browser restrictions. + */ + this.focus = function focus() { + window.setTimeout(function deferRefocus() { + field.focus(); // Focus must be deferred to work reliably across browsers + }, 0); + }; + + /** + * Returns the underlying input field. This input field MUST be manually + * added to the DOM for the Guacamole.InputSink to have any effect. + * + * @returns {!Element} + * The underlying input field. + */ + this.getElement = function getElement() { + return field; + }; + + // Automatically refocus input sink if part of DOM + document.addEventListener("keydown", function refocusSink(e) { + + // Do not refocus if focus is on an input field + var focused = document.activeElement; + if (focused && focused !== document.body) { + + // Only consider focused input fields which are actually visible + var rect = focused.getBoundingClientRect(); + if (rect.left + rect.width > 0 && rect.top + rect.height > 0) + return; + + } + + // Refocus input sink instead of handling click + sink.focus(); + + }, true); + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/InputStream.js b/guacamole-common-js/src/main/webapp/modules/InputStream.js new file mode 100644 index 0000000..58798a7 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/InputStream.js @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * An input stream abstraction used by the Guacamole client to facilitate + * transfer of files or other binary data. + * + * @constructor + * @param {!Guacamole.Client} client + * The client owning this stream. + * + * @param {!number} index + * The index of this stream. + */ +Guacamole.InputStream = function(client, index) { + + /** + * Reference to this stream. + * + * @private + * @type {!Guacamole.InputStream} + */ + var guac_stream = this; + + /** + * The index of this stream. + * + * @type {!number} + */ + this.index = index; + + /** + * Called when a blob of data is received. + * + * @event + * @param {!string} data + * The received base64 data. + */ + this.onblob = null; + + /** + * Called when this stream is closed. + * + * @event + */ + this.onend = null; + + /** + * Acknowledges the receipt of a blob. + * + * @param {!string} message + * A human-readable message describing the error or status. + * + * @param {!number} code + * The error code, if any, or 0 for success. + */ + this.sendAck = function(message, code) { + client.sendAck(guac_stream.index, message, code); + }; + + /** + * Creates a new ReadableStream that receives the data sent to this stream + * by the Guacamole server. This function may be invoked at most once per + * stream, and invoking this function will overwrite any installed event + * handlers on this stream. + * + * A ReadableStream is a JavaScript object defined by the "Streams" + * standard. It is supported by most browsers, but not necessarily all + * browsers. The caller should verify this support is present before + * invoking this function. The behavior of this function when the browser + * does not support ReadableStream is not defined. + * + * @see {@link https://streams.spec.whatwg.org/#rs-class} + * + * @returns {!ReadableStream} + * A new ReadableStream that receives the bytes sent along this stream + * by the Guacamole server. + */ + this.toReadableStream = function toReadableStream() { + return new ReadableStream({ + type: 'bytes', + start: function startStream(controller) { + + var reader = new Guacamole.ArrayBufferReader(guac_stream); + + // Provide any received blocks of data to the ReadableStream + // controller, such that they will be read by whatever is + // consuming the ReadableStream + reader.ondata = function dataReceived(data) { + + if (controller.byobRequest) { + + var view = controller.byobRequest.view; + var length = Math.min(view.byteLength, data.byteLength); + var byobBlock = new Uint8Array(data, 0, length); + + view.buffer.set(byobBlock); + controller.byobRequest.respond(length); + + if (length < data.byteLength) { + controller.enqueue(data.slice(length)); + } + + } + + else { + controller.enqueue(new Uint8Array(data)); + } + + }; + + // Notify the ReadableStream when the end of the stream is + // reached + reader.onend = function dataComplete() { + controller.close(); + }; + + } + }); + + }; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/IntegerPool.js b/guacamole-common-js/src/main/webapp/modules/IntegerPool.js new file mode 100644 index 0000000..6916cab --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/IntegerPool.js @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Integer pool which returns consistently increasing integers while integers + * are in use, and previously-used integers when possible. + * @constructor + */ +Guacamole.IntegerPool = function() { + + /** + * Reference to this integer pool. + * + * @private + */ + var guac_pool = this; + + /** + * Array of available integers. + * + * @private + * @type {!number[]} + */ + var pool = []; + + /** + * The next integer to return if no more integers remain. + * + * @type {!number} + */ + this.next_int = 0; + + /** + * Returns the next available integer in the pool. If possible, a previously + * used integer will be returned. + * + * @return {!number} + * The next available integer. + */ + this.next = function() { + + // If free'd integers exist, return one of those + if (pool.length > 0) + return pool.shift(); + + // Otherwise, return a new integer + return guac_pool.next_int++; + + }; + + /** + * Frees the given integer, allowing it to be reused. + * + * @param {!number} integer + * The integer to free. + */ + this.free = function(integer) { + pool.push(integer); + }; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/JSONReader.js b/guacamole-common-js/src/main/webapp/modules/JSONReader.js new file mode 100644 index 0000000..ef71d78 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/JSONReader.js @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A reader which automatically handles the given input stream, assembling all + * received blobs into a JavaScript object by appending them to each other, in + * order, and decoding the result as JSON. Note that this object will overwrite + * any installed event handlers on the given Guacamole.InputStream. + * + * @constructor + * @param {Guacamole.InputStream} stream + * The stream that JSON will be read from. + */ +Guacamole.JSONReader = function guacamoleJSONReader(stream) { + + /** + * Reference to this Guacamole.JSONReader. + * + * @private + * @type {!Guacamole.JSONReader} + */ + var guacReader = this; + + /** + * Wrapped Guacamole.StringReader. + * + * @private + * @type {!Guacamole.StringReader} + */ + var stringReader = new Guacamole.StringReader(stream); + + /** + * All JSON read thus far. + * + * @private + * @type {!string} + */ + var json = ''; + + /** + * Returns the current length of this Guacamole.JSONReader, in characters. + * + * @return {!number} + * The current length of this Guacamole.JSONReader. + */ + this.getLength = function getLength() { + return json.length; + }; + + /** + * Returns the contents of this Guacamole.JSONReader as a JavaScript + * object. + * + * @return {object} + * The contents of this Guacamole.JSONReader, as parsed from the JSON + * contents of the input stream. + */ + this.getJSON = function getJSON() { + return JSON.parse(json); + }; + + // Append all received text + stringReader.ontext = function ontext(text) { + + // Append received text + json += text; + + // Call handler, if present + if (guacReader.onprogress) + guacReader.onprogress(text.length); + + }; + + // Simply call onend when end received + stringReader.onend = function onend() { + if (guacReader.onend) + guacReader.onend(); + }; + + /** + * Fired once for every blob of data received. + * + * @event + * @param {!number} length + * The number of characters received. + */ + this.onprogress = null; + + /** + * Fired once this stream is finished and no further data will be written. + * + * @event + */ + this.onend = null; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/KeyEventInterpreter.js b/guacamole-common-js/src/main/webapp/modules/KeyEventInterpreter.js new file mode 100644 index 0000000..47b0902 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/KeyEventInterpreter.js @@ -0,0 +1,335 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * An object that will accept raw key events and produce a chronologically + * ordered array of key event objects. These events can be obtained by + * calling getEvents(). + * + * @constructor + * @param {number} [startTimestamp=0] + * The starting timestamp for the recording being intepreted. If provided, + * the timestamp of each intepreted event will be relative to this timestamp. + * If not provided, the raw recording timestamp will be used. + */ +Guacamole.KeyEventInterpreter = function KeyEventInterpreter(startTimestamp) { + + // Default to 0 seconds to keep the raw timestamps + if (startTimestamp === undefined || startTimestamp === null) + startTimestamp = 0; + + /** + * A precursor array to the KNOWN_KEYS map. The objects contained within + * will be constructed into full KeyDefinition objects. + * + * @constant + * @private + * @type {Object[]} + */ + var _KNOWN_KEYS = [ + {keysym: 0xFE03, name: 'AltGr' }, + {keysym: 0xFF08, name: 'Backspace' }, + {keysym: 0xFF09, name: 'Tab' }, + {keysym: 0xFF0B, name: 'Clear' }, + {keysym: 0xFF0D, name: 'Return', value: "\n" }, + {keysym: 0xFF13, name: 'Pause' }, + {keysym: 0xFF14, name: 'Scroll' }, + {keysym: 0xFF15, name: 'SysReq' }, + {keysym: 0xFF1B, name: 'Escape' }, + {keysym: 0xFF50, name: 'Home' }, + {keysym: 0xFF51, name: 'Left' }, + {keysym: 0xFF52, name: 'Up' }, + {keysym: 0xFF53, name: 'Right' }, + {keysym: 0xFF54, name: 'Down' }, + {keysym: 0xFF55, name: 'Page Up' }, + {keysym: 0xFF56, name: 'Page Down' }, + {keysym: 0xFF57, name: 'End' }, + {keysym: 0xFF63, name: 'Insert' }, + {keysym: 0xFF65, name: 'Undo' }, + {keysym: 0xFF6A, name: 'Help' }, + {keysym: 0xFF7F, name: 'Num' }, + {keysym: 0xFF80, name: 'Space', value: " " }, + {keysym: 0xFF8D, name: 'Enter', value: "\n" }, + {keysym: 0xFF95, name: 'Home' }, + {keysym: 0xFF96, name: 'Left' }, + {keysym: 0xFF97, name: 'Up' }, + {keysym: 0xFF98, name: 'Right' }, + {keysym: 0xFF99, name: 'Down' }, + {keysym: 0xFF9A, name: 'Page Up' }, + {keysym: 0xFF9B, name: 'Page Down' }, + {keysym: 0xFF9C, name: 'End' }, + {keysym: 0xFF9E, name: 'Insert' }, + {keysym: 0xFFAA, name: '*', value: "*" }, + {keysym: 0xFFAB, name: '+', value: "+" }, + {keysym: 0xFFAD, name: '-', value: "-" }, + {keysym: 0xFFAE, name: '.', value: "." }, + {keysym: 0xFFAF, name: '/', value: "/" }, + {keysym: 0xFFB0, name: '0', value: "0" }, + {keysym: 0xFFB1, name: '1', value: "1" }, + {keysym: 0xFFB2, name: '2', value: "2" }, + {keysym: 0xFFB3, name: '3', value: "3" }, + {keysym: 0xFFB4, name: '4', value: "4" }, + {keysym: 0xFFB5, name: '5', value: "5" }, + {keysym: 0xFFB6, name: '6', value: "6" }, + {keysym: 0xFFB7, name: '7', value: "7" }, + {keysym: 0xFFB8, name: '8', value: "8" }, + {keysym: 0xFFB9, name: '9', value: "9" }, + {keysym: 0xFFBE, name: 'F1' }, + {keysym: 0xFFBF, name: 'F2' }, + {keysym: 0xFFC0, name: 'F3' }, + {keysym: 0xFFC1, name: 'F4' }, + {keysym: 0xFFC2, name: 'F5' }, + {keysym: 0xFFC3, name: 'F6' }, + {keysym: 0xFFC4, name: 'F7' }, + {keysym: 0xFFC5, name: 'F8' }, + {keysym: 0xFFC6, name: 'F9' }, + {keysym: 0xFFC7, name: 'F10' }, + {keysym: 0xFFC8, name: 'F11' }, + {keysym: 0xFFC9, name: 'F12' }, + {keysym: 0xFFCA, name: 'F13' }, + {keysym: 0xFFCB, name: 'F14' }, + {keysym: 0xFFCC, name: 'F15' }, + {keysym: 0xFFCD, name: 'F16' }, + {keysym: 0xFFCE, name: 'F17' }, + {keysym: 0xFFCF, name: 'F18' }, + {keysym: 0xFFD0, name: 'F19' }, + {keysym: 0xFFD1, name: 'F20' }, + {keysym: 0xFFD2, name: 'F21' }, + {keysym: 0xFFD3, name: 'F22' }, + {keysym: 0xFFD4, name: 'F23' }, + {keysym: 0xFFD5, name: 'F24' }, + {keysym: 0xFFE1, name: 'Shift' }, + {keysym: 0xFFE2, name: 'Shift' }, + {keysym: 0xFFE3, name: 'Ctrl' }, + {keysym: 0xFFE4, name: 'Ctrl' }, + {keysym: 0xFFE5, name: 'Caps' }, + {keysym: 0xFFE7, name: 'Meta' }, + {keysym: 0xFFE8, name: 'Meta' }, + {keysym: 0xFFE9, name: 'Alt' }, + {keysym: 0xFFEA, name: 'Alt' }, + {keysym: 0xFFEB, name: 'Super' }, + {keysym: 0xFFEC, name: 'Super' }, + {keysym: 0xFFED, name: 'Hyper' }, + {keysym: 0xFFEE, name: 'Hyper' }, + {keysym: 0xFFFF, name: 'Delete' } + ]; + + /** + * All known keys, as a map of X11 keysym to KeyDefinition. + * + * @constant + * @private + * @type {Object.} + */ + var KNOWN_KEYS = {}; + _KNOWN_KEYS.forEach(function createKeyDefinitionMap(keyDefinition) { + + // Construct a map of keysym to KeyDefinition object + KNOWN_KEYS[keyDefinition.keysym] = ( + new Guacamole.KeyEventInterpreter.KeyDefinition(keyDefinition)); + + }); + + /** + * All key events parsed as of the most recent handleKeyEvent() invocation. + * + * @private + * @type {!Guacamole.KeyEventInterpreter.KeyEvent[]} + */ + var parsedEvents = []; + + /** + * If the provided keysym corresponds to a valid UTF-8 character, return + * a KeyDefinition for that keysym. Otherwise, return null. + * + * @private + * @param {Number} keysym + * The keysym to produce a UTF-8 KeyDefinition for, if valid. + * + * @returns {Guacamole.KeyEventInterpreter.KeyDefinition} + * A KeyDefinition for the provided keysym, if it's a valid UTF-8 + * keysym, or null otherwise. + */ + function getUnicodeKeyDefinition(keysym) { + + // Translate only if keysym maps to Unicode + if (keysym < 0x00 || (keysym > 0xFF && (keysym | 0xFFFF) != 0x0100FFFF)) + return null; + + // Convert to UTF8 string + var codepoint = keysym & 0xFFFF; + var name = String.fromCharCode(codepoint); + + // Create and return the definition + return new Guacamole.KeyEventInterpreter.KeyDefinition({ + keysym: keysym, name: name, value: name}); + + } + + /** + * Return a KeyDefinition corresponding to the provided keysym. + * + * @private + * @param {Number} keysym + * The keysym to return a KeyDefinition for. + * + * @returns {KeyDefinition} + * A KeyDefinition corresponding to the provided keysym. + */ + function getKeyDefinitionByKeysym(keysym) { + + // If it's a known type, return the existing definition + if (keysym in KNOWN_KEYS) + return KNOWN_KEYS[keysym]; + + // Return a UTF-8 KeyDefinition, if valid + var definition = getUnicodeKeyDefinition(keysym); + if (definition != null) + return definition; + + // If it's not UTF-8, return an unknown definition, with the name + // just set to the hex value of the keysym + return new Guacamole.KeyEventInterpreter.KeyDefinition({ + keysym: keysym, + name: '0x' + String(keysym.toString(16)) + }) + + } + + /** + * Handles a raw key event, appending a new key event object for every + * handled raw event. + * + * @param {!string[]} args + * The arguments of the key event. + */ + this.handleKeyEvent = function handleKeyEvent(args) { + + // The X11 keysym + var keysym = parseInt(args[0]); + + // Either 1 or 0 for pressed or released, respectively + var pressed = parseInt(args[1]); + + // The timestamp when this key event occured + var timestamp = parseInt(args[2]); + + // The timestamp relative to the provided initial timestamp + var relativeTimestap = timestamp - startTimestamp; + + // Known information about the parsed key + var definition = getKeyDefinitionByKeysym(keysym); + + // Push the latest parsed event into the list + parsedEvents.push(new Guacamole.KeyEventInterpreter.KeyEvent({ + definition: definition, + pressed: pressed, + timestamp: relativeTimestap + })); + + }; + + /** + * Return the current batch of typed text. Note that the batch may be + * incomplete, as more key events might be processed before the next + * batch starts. + * + * @returns {Guacamole.KeyEventInterpreter.KeyEvent[]} + * The current batch of text. + */ + this.getEvents = function getEvents() { + return parsedEvents; + }; + +}; + +/** + * A definition for a known key. + * + * @constructor + * @param {Guacamole.KeyEventInterpreter.KeyDefinition|object} [template={}] + * The object whose properties should be copied within the new + * KeyDefinition. + */ +Guacamole.KeyEventInterpreter.KeyDefinition = function KeyDefinition(template) { + + // Use empty object by default + template = template || {}; + + /** + * The X11 keysym of the key. + * @type {!number} + */ + this.keysym = parseInt(template.keysym); + + /** + * A human-readable name for the key. + * @type {!String} + */ + this.name = template.name; + + /** + * The value which would be typed in a typical text editor, if any. If the + * key is not associated with any typeable value, this will be undefined. + * @type {String} + */ + this.value = template.value; + +}; + +/** + * A granular description of an extracted key event, including a human-readable + * text representation of the event, whether the event is directly typed or not, + * and the timestamp when the event occured. + * + * @constructor + * @param {Guacamole.KeyEventInterpreter.KeyEvent|object} [template={}] + * The object whose properties should be copied within the new + * KeyEvent. + */ +Guacamole.KeyEventInterpreter.KeyEvent = function KeyEvent(template) { + + // Use empty object by default + template = template || {}; + + /** + * The key definition for the pressed key. + * + * @type {!Guacamole.KeyEventInterpreter.KeyDefinition} + */ + this.definition = template.definition; + + /** + * True if the key was pressed to create this event, or false if it was + * released. + * + * @type {!boolean} + */ + this.pressed = !!template.pressed; + + /** + * The timestamp from the recording when this event occured. + * + * @type {!Number} + */ + this.timestamp = template.timestamp; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Keyboard.js b/guacamole-common-js/src/main/webapp/modules/Keyboard.js new file mode 100644 index 0000000..18934ff --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Keyboard.js @@ -0,0 +1,1527 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Provides cross-browser and cross-keyboard keyboard for a specific element. + * Browser and keyboard layout variation is abstracted away, providing events + * which represent keys as their corresponding X11 keysym. + * + * @constructor + * @param {Element|Document} [element] + * The Element to use to provide keyboard events. If omitted, at least one + * Element must be manually provided through the listenTo() function for + * the Guacamole.Keyboard instance to have any effect. + */ +Guacamole.Keyboard = function Keyboard(element) { + + /** + * Reference to this Guacamole.Keyboard. + * + * @private + * @type {!Guacamole.Keyboard} + */ + var guac_keyboard = this; + + /** + * An integer value which uniquely identifies this Guacamole.Keyboard + * instance with respect to other Guacamole.Keyboard instances. + * + * @private + * @type {!number} + */ + var guacKeyboardID = Guacamole.Keyboard._nextID++; + + /** + * The name of the property which is added to event objects via markEvent() + * to note that they have already been handled by this Guacamole.Keyboard. + * + * @private + * @constant + * @type {!string} + */ + var EVENT_MARKER = '_GUAC_KEYBOARD_HANDLED_BY_' + guacKeyboardID; + + /** + * Fired whenever the user presses a key with the element associated + * with this Guacamole.Keyboard in focus. + * + * @event + * @param {!number} keysym + * The keysym of the key being pressed. + * + * @return {!boolean} + * true if the key event should be allowed through to the browser, + * false otherwise. + */ + this.onkeydown = null; + + /** + * Fired whenever the user releases a key with the element associated + * with this Guacamole.Keyboard in focus. + * + * @event + * @param {!number} keysym + * The keysym of the key being released. + */ + this.onkeyup = null; + + /** + * Set of known platform-specific or browser-specific quirks which must be + * accounted for to properly interpret key events, even if the only way to + * reliably detect that quirk is to platform/browser-sniff. + * + * @private + * @type {!Object.} + */ + var quirks = { + + /** + * Whether keyup events are universally unreliable. + * + * @type {!boolean} + */ + keyupUnreliable: false, + + /** + * Whether the Alt key is actually a modifier for typable keys and is + * thus never used for keyboard shortcuts. + * + * @type {!boolean} + */ + altIsTypableOnly: false, + + /** + * Whether we can rely on receiving a keyup event for the Caps Lock + * key. + * + * @type {!boolean} + */ + capsLockKeyupUnreliable: false + + }; + + // Set quirk flags depending on platform/browser, if such information is + // available + if (navigator && navigator.platform) { + + // All keyup events are unreliable on iOS (sadly) + if (navigator.platform.match(/ipad|iphone|ipod/i)) + quirks.keyupUnreliable = true; + + // The Alt key on Mac is never used for keyboard shortcuts, and the + // Caps Lock key never dispatches keyup events + else if (navigator.platform.match(/^mac/i)) { + quirks.altIsTypableOnly = true; + quirks.capsLockKeyupUnreliable = true; + } + + } + + /** + * A key event having a corresponding timestamp. This event is non-specific. + * Its subclasses should be used instead when recording specific key + * events. + * + * @private + * @constructor + * @param {KeyboardEvent} [orig] + * The relevant DOM keyboard event. + */ + var KeyEvent = function KeyEvent(orig) { + + /** + * Reference to this key event. + * + * @private + * @type {!KeyEvent} + */ + var key_event = this; + + /** + * The JavaScript key code of the key pressed. For most events (keydown + * and keyup), this is a scancode-like value related to the position of + * the key on the US English "Qwerty" keyboard. For keypress events, + * this is the Unicode codepoint of the character that would be typed + * by the key pressed. + * + * @type {!number} + */ + this.keyCode = orig ? (orig.which || orig.keyCode) : 0; + + /** + * The legacy DOM3 "keyIdentifier" of the key pressed, as defined at: + * http://www.w3.org/TR/2009/WD-DOM-Level-3-Events-20090908/#events-Events-KeyboardEvent + * + * @type {!string} + */ + this.keyIdentifier = orig && orig.keyIdentifier; + + /** + * The standard name of the key pressed, as defined at: + * http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent + * + * @type {!string} + */ + this.key = orig && orig.key; + + /** + * The location on the keyboard corresponding to the key pressed, as + * defined at: + * http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent + * + * @type {!number} + */ + this.location = orig ? getEventLocation(orig) : 0; + + /** + * The state of all local keyboard modifiers at the time this event was + * received. + * + * @type {!Guacamole.Keyboard.ModifierState} + */ + this.modifiers = orig ? Guacamole.Keyboard.ModifierState.fromKeyboardEvent(orig) : new Guacamole.Keyboard.ModifierState(); + + /** + * An arbitrary timestamp in milliseconds, indicating this event's + * position in time relative to other events. + * + * @type {!number} + */ + this.timestamp = new Date().getTime(); + + /** + * Whether the default action of this key event should be prevented. + * + * @type {!boolean} + */ + this.defaultPrevented = false; + + /** + * The keysym of the key associated with this key event, as determined + * by a best-effort guess using available event properties and keyboard + * state. + * + * @type {number} + */ + this.keysym = null; + + /** + * Whether the keysym value of this key event is known to be reliable. + * If false, the keysym may still be valid, but it's only a best guess, + * and future key events may be a better source of information. + * + * @type {!boolean} + */ + this.reliable = false; + + /** + * Returns the number of milliseconds elapsed since this event was + * received. + * + * @return {!number} + * The number of milliseconds elapsed since this event was + * received. + */ + this.getAge = function() { + return new Date().getTime() - key_event.timestamp; + }; + + }; + + /** + * Information related to the pressing of a key, which need not be a key + * associated with a printable character. The presence or absence of any + * information within this object is browser-dependent. + * + * @private + * @constructor + * @augments Guacamole.Keyboard.KeyEvent + * @param {!KeyboardEvent} orig + * The relevant DOM "keydown" event. + */ + var KeydownEvent = function KeydownEvent(orig) { + + // We extend KeyEvent + KeyEvent.call(this, orig); + + // If key is known from keyCode or DOM3 alone, use that + this.keysym = keysym_from_key_identifier(this.key, this.location) + || keysym_from_keycode(this.keyCode, this.location); + + /** + * Whether the keyup following this keydown event is known to be + * reliable. If false, we cannot rely on the keyup event to occur. + * + * @type {!boolean} + */ + this.keyupReliable = !quirks.keyupUnreliable; + + // DOM3 and keyCode are reliable sources if the corresponding key is + // not a printable key + if (this.keysym && !isPrintable(this.keysym)) + this.reliable = true; + + // Use legacy keyIdentifier as a last resort, if it looks sane + if (!this.keysym && key_identifier_sane(this.keyCode, this.keyIdentifier)) + this.keysym = keysym_from_key_identifier(this.keyIdentifier, this.location, this.modifiers.shift); + + // If a key is pressed while meta is held down, the keyup will + // never be sent in Chrome (bug #108404) + if (this.modifiers.meta && this.keysym !== 0xFFE7 && this.keysym !== 0xFFE8) + this.keyupReliable = false; + + // We cannot rely on receiving keyup for Caps Lock on certain platforms + else if (this.keysym === 0xFFE5 && quirks.capsLockKeyupUnreliable) + this.keyupReliable = false; + + // Determine whether default action for Alt+combinations must be prevented + var prevent_alt = !this.modifiers.ctrl && !quirks.altIsTypableOnly; + + // If alt is typeable only, and this is actually an alt key event, treat as AltGr instead + if (quirks.altIsTypableOnly && (this.keysym === 0xFFE9 || this.keysym === 0xFFEA)) + this.keysym = 0xFE03; + + // Determine whether default action for Ctrl+combinations must be prevented + var prevent_ctrl = !this.modifiers.alt; + + // We must rely on the (potentially buggy) keyIdentifier if preventing + // the default action is important + if ((prevent_ctrl && this.modifiers.ctrl) + || (prevent_alt && this.modifiers.alt) + || this.modifiers.meta + || this.modifiers.hyper) + this.reliable = true; + + // Record most recently known keysym by associated key code + recentKeysym[this.keyCode] = this.keysym; + + }; + + KeydownEvent.prototype = new KeyEvent(); + + /** + * Information related to the pressing of a key, which MUST be + * associated with a printable character. The presence or absence of any + * information within this object is browser-dependent. + * + * @private + * @constructor + * @augments Guacamole.Keyboard.KeyEvent + * @param {!KeyboardEvent} orig + * The relevant DOM "keypress" event. + */ + var KeypressEvent = function KeypressEvent(orig) { + + // We extend KeyEvent + KeyEvent.call(this, orig); + + // Pull keysym from char code + this.keysym = keysym_from_charcode(this.keyCode); + + // Keypress is always reliable + this.reliable = true; + + }; + + KeypressEvent.prototype = new KeyEvent(); + + /** + * Information related to the releasing of a key, which need not be a key + * associated with a printable character. The presence or absence of any + * information within this object is browser-dependent. + * + * @private + * @constructor + * @augments Guacamole.Keyboard.KeyEvent + * @param {!KeyboardEvent} orig + * The relevant DOM "keyup" event. + */ + var KeyupEvent = function KeyupEvent(orig) { + + // We extend KeyEvent + KeyEvent.call(this, orig); + + // If key is known from keyCode or DOM3 alone, use that (keyCode is + // still more reliable for keyup when dead keys are in use) + this.keysym = keysym_from_keycode(this.keyCode, this.location) + || keysym_from_key_identifier(this.key, this.location); + + // Fall back to the most recently pressed keysym associated with the + // keyCode if the inferred key doesn't seem to actually be pressed + if (!guac_keyboard.pressed[this.keysym]) + this.keysym = recentKeysym[this.keyCode] || this.keysym; + + // Keyup is as reliable as it will ever be + this.reliable = true; + + }; + + KeyupEvent.prototype = new KeyEvent(); + + /** + * An array of recorded events, which can be instances of the private + * KeydownEvent, KeypressEvent, and KeyupEvent classes. + * + * @private + * @type {!KeyEvent[]} + */ + var eventLog = []; + + /** + * Map of known JavaScript keycodes which do not map to typable characters + * to their X11 keysym equivalents. + * + * @private + * @type {!Object.} + */ + var keycodeKeysyms = { + 8: [0xFF08], // backspace + 9: [0xFF09], // tab + 12: [0xFF0B, 0xFF0B, 0xFF0B, 0xFFB5], // clear / KP 5 + 13: [0xFF0D], // enter + 16: [0xFFE1, 0xFFE1, 0xFFE2], // shift + 17: [0xFFE3, 0xFFE3, 0xFFE4], // ctrl + 18: [0xFFE9, 0xFFE9, 0xFFEA], // alt + 19: [0xFF13], // pause/break + 20: [0xFFE5], // caps lock + 27: [0xFF1B], // escape + 32: [0x0020], // space + 33: [0xFF55, 0xFF55, 0xFF55, 0xFFB9], // page up / KP 9 + 34: [0xFF56, 0xFF56, 0xFF56, 0xFFB3], // page down / KP 3 + 35: [0xFF57, 0xFF57, 0xFF57, 0xFFB1], // end / KP 1 + 36: [0xFF50, 0xFF50, 0xFF50, 0xFFB7], // home / KP 7 + 37: [0xFF51, 0xFF51, 0xFF51, 0xFFB4], // left arrow / KP 4 + 38: [0xFF52, 0xFF52, 0xFF52, 0xFFB8], // up arrow / KP 8 + 39: [0xFF53, 0xFF53, 0xFF53, 0xFFB6], // right arrow / KP 6 + 40: [0xFF54, 0xFF54, 0xFF54, 0xFFB2], // down arrow / KP 2 + 45: [0xFF63, 0xFF63, 0xFF63, 0xFFB0], // insert / KP 0 + 46: [0xFFFF, 0xFFFF, 0xFFFF, 0xFFAE], // delete / KP decimal + 91: [0xFFE7], // left windows/command key (meta_l) + 92: [0xFFE8], // right window/command key (meta_r) + 93: [0xFF67], // menu key + 96: [0xFFB0], // KP 0 + 97: [0xFFB1], // KP 1 + 98: [0xFFB2], // KP 2 + 99: [0xFFB3], // KP 3 + 100: [0xFFB4], // KP 4 + 101: [0xFFB5], // KP 5 + 102: [0xFFB6], // KP 6 + 103: [0xFFB7], // KP 7 + 104: [0xFFB8], // KP 8 + 105: [0xFFB9], // KP 9 + 106: [0xFFAA], // KP multiply + 107: [0xFFAB], // KP add + 109: [0xFFAD], // KP subtract + 110: [0xFFAE], // KP decimal + 111: [0xFFAF], // KP divide + 112: [0xFFBE], // f1 + 113: [0xFFBF], // f2 + 114: [0xFFC0], // f3 + 115: [0xFFC1], // f4 + 116: [0xFFC2], // f5 + 117: [0xFFC3], // f6 + 118: [0xFFC4], // f7 + 119: [0xFFC5], // f8 + 120: [0xFFC6], // f9 + 121: [0xFFC7], // f10 + 122: [0xFFC8], // f11 + 123: [0xFFC9], // f12 + 144: [0xFF7F], // num lock + 145: [0xFF14], // scroll lock + 225: [0xFE03] // altgraph (iso_level3_shift) + }; + + /** + * Map of known JavaScript keyidentifiers which do not map to typable + * characters to their unshifted X11 keysym equivalents. + * + * @private + * @type {!Object.} + */ + var keyidentifier_keysym = { + "Again": [0xFF66], + "AllCandidates": [0xFF3D], + "Alphanumeric": [0xFF30], + "Alt": [0xFFE9, 0xFFE9, 0xFFEA], + "Attn": [0xFD0E], + "AltGraph": [0xFE03], + "ArrowDown": [0xFF54], + "ArrowLeft": [0xFF51], + "ArrowRight": [0xFF53], + "ArrowUp": [0xFF52], + "Backspace": [0xFF08], + "CapsLock": [0xFFE5], + "Cancel": [0xFF69], + "Clear": [0xFF0B], + "Convert": [0xFF23], + "Copy": [0xFD15], + "Crsel": [0xFD1C], + "CrSel": [0xFD1C], + "CodeInput": [0xFF37], + "Compose": [0xFF20], + "Control": [0xFFE3, 0xFFE3, 0xFFE4], + "ContextMenu": [0xFF67], + "Delete": [0xFFFF], + "Down": [0xFF54], + "End": [0xFF57], + "Enter": [0xFF0D], + "EraseEof": [0xFD06], + "Escape": [0xFF1B], + "Execute": [0xFF62], + "Exsel": [0xFD1D], + "ExSel": [0xFD1D], + "F1": [0xFFBE], + "F2": [0xFFBF], + "F3": [0xFFC0], + "F4": [0xFFC1], + "F5": [0xFFC2], + "F6": [0xFFC3], + "F7": [0xFFC4], + "F8": [0xFFC5], + "F9": [0xFFC6], + "F10": [0xFFC7], + "F11": [0xFFC8], + "F12": [0xFFC9], + "F13": [0xFFCA], + "F14": [0xFFCB], + "F15": [0xFFCC], + "F16": [0xFFCD], + "F17": [0xFFCE], + "F18": [0xFFCF], + "F19": [0xFFD0], + "F20": [0xFFD1], + "F21": [0xFFD2], + "F22": [0xFFD3], + "F23": [0xFFD4], + "F24": [0xFFD5], + "Find": [0xFF68], + "GroupFirst": [0xFE0C], + "GroupLast": [0xFE0E], + "GroupNext": [0xFE08], + "GroupPrevious": [0xFE0A], + "FullWidth": null, + "HalfWidth": null, + "HangulMode": [0xFF31], + "Hankaku": [0xFF29], + "HanjaMode": [0xFF34], + "Help": [0xFF6A], + "Hiragana": [0xFF25], + "HiraganaKatakana": [0xFF27], + "Home": [0xFF50], + "Hyper": [0xFFED, 0xFFED, 0xFFEE], + "Insert": [0xFF63], + "JapaneseHiragana": [0xFF25], + "JapaneseKatakana": [0xFF26], + "JapaneseRomaji": [0xFF24], + "JunjaMode": [0xFF38], + "KanaMode": [0xFF2D], + "KanjiMode": [0xFF21], + "Katakana": [0xFF26], + "Left": [0xFF51], + "Meta": [0xFFE7, 0xFFE7, 0xFFE8], + "ModeChange": [0xFF7E], + "NonConvert": [0xFF22], + "NumLock": [0xFF7F], + "PageDown": [0xFF56], + "PageUp": [0xFF55], + "Pause": [0xFF13], + "Play": [0xFD16], + "PreviousCandidate": [0xFF3E], + "PrintScreen": [0xFF61], + "Redo": [0xFF66], + "Right": [0xFF53], + "Romaji": [0xFF24], + "RomanCharacters": null, + "Scroll": [0xFF14], + "Select": [0xFF60], + "Separator": [0xFFAC], + "Shift": [0xFFE1, 0xFFE1, 0xFFE2], + "SingleCandidate": [0xFF3C], + "Super": [0xFFEB, 0xFFEB, 0xFFEC], + "Tab": [0xFF09], + "UIKeyInputDownArrow": [0xFF54], + "UIKeyInputEscape": [0xFF1B], + "UIKeyInputLeftArrow": [0xFF51], + "UIKeyInputRightArrow": [0xFF53], + "UIKeyInputUpArrow": [0xFF52], + "Up": [0xFF52], + "Undo": [0xFF65], + "Win": [0xFFE7, 0xFFE7, 0xFFE8], + "Zenkaku": [0xFF28], + "ZenkakuHankaku": [0xFF2A] + }; + + /** + * All keysyms which should not repeat when held down. + * + * @private + * @type {!Object.} + */ + var no_repeat = { + 0xFE03: true, // ISO Level 3 Shift (AltGr) + 0xFFE1: true, // Left shift + 0xFFE2: true, // Right shift + 0xFFE3: true, // Left ctrl + 0xFFE4: true, // Right ctrl + 0xFFE5: true, // Caps Lock + 0xFFE7: true, // Left meta + 0xFFE8: true, // Right meta + 0xFFE9: true, // Left alt + 0xFFEA: true, // Right alt + 0xFFEB: true, // Left super/hyper + 0xFFEC: true // Right super/hyper + }; + + /** + * All modifiers and their states. + * + * @type {!Guacamole.Keyboard.ModifierState} + */ + this.modifiers = new Guacamole.Keyboard.ModifierState(); + + /** + * The state of every key, indexed by keysym. If a particular key is + * pressed, the value of pressed for that keysym will be true. If a key + * is not currently pressed, it will not be defined. + * + * @type {!Object.} + */ + this.pressed = {}; + + /** + * The state of every key, indexed by keysym, for strictly those keys whose + * status has been indirectly determined thorugh observation of other key + * events. If a particular key is implicitly pressed, the value of + * implicitlyPressed for that keysym will be true. If a key + * is not currently implicitly pressed (the key is not pressed OR the state + * of the key is explicitly known), it will not be defined. + * + * @private + * @type {!Object.} + */ + var implicitlyPressed = {}; + + /** + * The last result of calling the onkeydown handler for each key, indexed + * by keysym. This is used to prevent/allow default actions for key events, + * even when the onkeydown handler cannot be called again because the key + * is (theoretically) still pressed. + * + * @private + * @type {!Object.} + */ + var last_keydown_result = {}; + + /** + * The keysym most recently associated with a given keycode when keydown + * fired. This object maps keycodes to keysyms. + * + * @private + * @type {!Object.} + */ + var recentKeysym = {}; + + /** + * Timeout before key repeat starts. + * + * @private + * @type {number} + */ + var key_repeat_timeout = null; + + /** + * Interval which presses and releases the last key pressed while that + * key is still being held down. + * + * @private + * @type {number} + */ + var key_repeat_interval = null; + + /** + * Given an array of keysyms indexed by location, returns the keysym + * for the given location, or the keysym for the standard location if + * undefined. + * + * @private + * @param {number[]} keysyms + * An array of keysyms, where the index of the keysym in the array is + * the location value. + * + * @param {!number} location + * The location on the keyboard corresponding to the key pressed, as + * defined at: http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent + */ + var get_keysym = function get_keysym(keysyms, location) { + + if (!keysyms) + return null; + + return keysyms[location] || keysyms[0]; + }; + + /** + * Returns true if the given keysym corresponds to a printable character, + * false otherwise. + * + * @param {!number} keysym + * The keysym to check. + * + * @returns {!boolean} + * true if the given keysym corresponds to a printable character, + * false otherwise. + */ + var isPrintable = function isPrintable(keysym) { + + // Keysyms with Unicode equivalents are printable + return (keysym >= 0x00 && keysym <= 0xFF) + || (keysym & 0xFFFF0000) === 0x01000000; + + }; + + function keysym_from_key_identifier(identifier, location, shifted) { + + if (!identifier) + return null; + + var typedCharacter; + + // If identifier is U+xxxx, decode Unicode character + var unicodePrefixLocation = identifier.indexOf("U+"); + if (unicodePrefixLocation >= 0) { + var hex = identifier.substring(unicodePrefixLocation+2); + typedCharacter = String.fromCharCode(parseInt(hex, 16)); + } + + // If single character and not keypad, use that as typed character + else if (identifier.length === 1 && location !== 3) + typedCharacter = identifier; + + // Otherwise, look up corresponding keysym + else + return get_keysym(keyidentifier_keysym[identifier], location); + + // Alter case if necessary + if (shifted === true) + typedCharacter = typedCharacter.toUpperCase(); + else if (shifted === false) + typedCharacter = typedCharacter.toLowerCase(); + + // Get codepoint + var codepoint = typedCharacter.charCodeAt(0); + return keysym_from_charcode(codepoint); + + } + + function isControlCharacter(codepoint) { + return codepoint <= 0x1F || (codepoint >= 0x7F && codepoint <= 0x9F); + } + + function keysym_from_charcode(codepoint) { + + // Keysyms for control characters + if (isControlCharacter(codepoint)) return 0xFF00 | codepoint; + + // Keysyms for ASCII chars + if (codepoint >= 0x0000 && codepoint <= 0x00FF) + return codepoint; + + // Keysyms for Unicode + if (codepoint >= 0x0100 && codepoint <= 0x10FFFF) + return 0x01000000 | codepoint; + + return null; + + } + + function keysym_from_keycode(keyCode, location) { + return get_keysym(keycodeKeysyms[keyCode], location); + } + + /** + * Heuristically detects if the legacy keyIdentifier property of + * a keydown/keyup event looks incorrectly derived. Chrome, and + * presumably others, will produce the keyIdentifier by assuming + * the keyCode is the Unicode codepoint for that key. This is not + * correct in all cases. + * + * @private + * @param {!number} keyCode + * The keyCode from a browser keydown/keyup event. + * + * @param {string} keyIdentifier + * The legacy keyIdentifier from a browser keydown/keyup event. + * + * @returns {!boolean} + * true if the keyIdentifier looks sane, false if the keyIdentifier + * appears incorrectly derived or is missing entirely. + */ + var key_identifier_sane = function key_identifier_sane(keyCode, keyIdentifier) { + + // Missing identifier is not sane + if (!keyIdentifier) + return false; + + // Assume non-Unicode keyIdentifier values are sane + var unicodePrefixLocation = keyIdentifier.indexOf("U+"); + if (unicodePrefixLocation === -1) + return true; + + // If the Unicode codepoint isn't identical to the keyCode, + // then the identifier is likely correct + var codepoint = parseInt(keyIdentifier.substring(unicodePrefixLocation+2), 16); + if (keyCode !== codepoint) + return true; + + // The keyCodes for A-Z and 0-9 are actually identical to their + // Unicode codepoints + if ((keyCode >= 65 && keyCode <= 90) || (keyCode >= 48 && keyCode <= 57)) + return true; + + // The keyIdentifier does NOT appear sane + return false; + + }; + + /** + * Marks a key as pressed, firing the keydown event if registered. Key + * repeat for the pressed key will start after a delay if that key is + * not a modifier. The return value of this function depends on the + * return value of the keydown event handler, if any. + * + * @param {number} keysym + * The keysym of the key to press. + * + * @return {boolean} + * true if event should NOT be canceled, false otherwise. + */ + this.press = function(keysym) { + + // Don't bother with pressing the key if the key is unknown + if (keysym === null) return; + + // Only press if released + if (!guac_keyboard.pressed[keysym]) { + + // Mark key as pressed + guac_keyboard.pressed[keysym] = true; + + // Send key event + if (guac_keyboard.onkeydown) { + var result = guac_keyboard.onkeydown(keysym); + last_keydown_result[keysym] = result; + + // Stop any current repeat + window.clearTimeout(key_repeat_timeout); + window.clearInterval(key_repeat_interval); + + // Repeat after a delay as long as pressed + if (!no_repeat[keysym]) + key_repeat_timeout = window.setTimeout(function() { + key_repeat_interval = window.setInterval(function() { + guac_keyboard.onkeyup(keysym); + guac_keyboard.onkeydown(keysym); + }, 50); + }, 500); + + return result; + } + } + + // Return the last keydown result by default, resort to false if unknown + return last_keydown_result[keysym] || false; + + }; + + /** + * Marks a key as released, firing the keyup event if registered. + * + * @param {number} keysym + * The keysym of the key to release. + */ + this.release = function(keysym) { + + // Only release if pressed + if (guac_keyboard.pressed[keysym]) { + + // Mark key as released + delete guac_keyboard.pressed[keysym]; + delete implicitlyPressed[keysym]; + + // Stop repeat + window.clearTimeout(key_repeat_timeout); + window.clearInterval(key_repeat_interval); + + // Send key event + if (keysym !== null && guac_keyboard.onkeyup) + guac_keyboard.onkeyup(keysym); + + } + + }; + + /** + * Presses and releases the keys necessary to type the given string of + * text. + * + * @param {!string} str + * The string to type. + */ + this.type = function type(str) { + + // Press/release the key corresponding to each character in the string + for (var i = 0; i < str.length; i++) { + + // Determine keysym of current character + var codepoint = str.codePointAt ? str.codePointAt(i) : str.charCodeAt(i); + var keysym = keysym_from_charcode(codepoint); + + // Press and release key for current character + guac_keyboard.press(keysym); + guac_keyboard.release(keysym); + + } + + }; + + /** + * Resets the state of this keyboard, releasing all keys, and firing keyup + * events for each released key. + */ + this.reset = function() { + + // Release all pressed keys + for (var keysym in guac_keyboard.pressed) + guac_keyboard.release(parseInt(keysym)); + + // Clear event log + eventLog = []; + + }; + + /** + * Resynchronizes the remote state of the given modifier with its + * corresponding local modifier state, as dictated by + * {@link KeyEvent#modifiers} within the given key event, by pressing or + * releasing keysyms. + * + * @private + * @param {!string} modifier + * The name of the {@link Guacamole.Keyboard.ModifierState} property + * being updated. + * + * @param {!number[]} keysyms + * The keysyms which represent the modifier being updated. + * + * @param {!KeyEvent} keyEvent + * Guacamole's current best interpretation of the key event being + * processed. + */ + var updateModifierState = function updateModifierState(modifier, + keysyms, keyEvent) { + + var localState = keyEvent.modifiers[modifier]; + var remoteState = guac_keyboard.modifiers[modifier]; + + var i; + + // Do not trust changes in modifier state for events directly involving + // that modifier: (1) the flag may erroneously be cleared despite + // another version of the same key still being held and (2) the change + // in flag may be due to the current event being processed, thus + // updating things here is at best redundant and at worst incorrect + if (keysyms.indexOf(keyEvent.keysym) !== -1) + return; + + // Release all related keys if modifier is implicitly released + if (remoteState && localState === false) { + for (i = 0; i < keysyms.length; i++) { + guac_keyboard.release(keysyms[i]); + } + } + + // Press if modifier is implicitly pressed + else if (!remoteState && localState) { + + // Verify that modifier flag isn't already pressed or already set + // due to another version of the same key being held down + for (i = 0; i < keysyms.length; i++) { + if (guac_keyboard.pressed[keysyms[i]]) + return; + } + + // Mark as implicitly pressed only if there is other information + // within the key event relating to a different key. Some + // platforms, such as iOS, will send essentially empty key events + // for modifier keys, using only the modifier flags to signal the + // identity of the key. + var keysym = keysyms[0]; + if (keyEvent.keysym) + implicitlyPressed[keysym] = true; + + guac_keyboard.press(keysym); + + } + + }; + + /** + * Given a keyboard event, updates the remote key state to match the local + * modifier state and remote based on the modifier flags within the event. + * This function pays no attention to keycodes. + * + * @private + * @param {!KeyEvent} keyEvent + * Guacamole's current best interpretation of the key event being + * processed. + */ + var syncModifierStates = function syncModifierStates(keyEvent) { + + // Resync state of alt + updateModifierState('alt', [ + 0xFFE9, // Left alt + 0xFFEA, // Right alt + 0xFE03 // AltGr + ], keyEvent); + + // Resync state of shift + updateModifierState('shift', [ + 0xFFE1, // Left shift + 0xFFE2 // Right shift + ], keyEvent); + + // Resync state of ctrl + updateModifierState('ctrl', [ + 0xFFE3, // Left ctrl + 0xFFE4 // Right ctrl + ], keyEvent); + + // Resync state of meta + updateModifierState('meta', [ + 0xFFE7, // Left meta + 0xFFE8 // Right meta + ], keyEvent); + + // Resync state of hyper + updateModifierState('hyper', [ + 0xFFEB, // Left super/hyper + 0xFFEC // Right super/hyper + ], keyEvent); + + // Update state + guac_keyboard.modifiers = keyEvent.modifiers; + + }; + + /** + * Returns whether all currently pressed keys were implicitly pressed. A + * key is implicitly pressed if its status was inferred indirectly from + * inspection of other key events. + * + * @private + * @returns {!boolean} + * true if all currently pressed keys were implicitly pressed, false + * otherwise. + */ + var isStateImplicit = function isStateImplicit() { + + for (var keysym in guac_keyboard.pressed) { + if (!implicitlyPressed[keysym]) + return false; + } + + return true; + + }; + + /** + * Reads through the event log, removing events from the head of the log + * when the corresponding true key presses are known (or as known as they + * can be). + * + * @private + * @return {boolean} + * Whether the default action of the latest event should be prevented. + */ + function interpret_events() { + + // Do not prevent default if no event could be interpreted + var handled_event = interpret_event(); + if (!handled_event) + return false; + + // Interpret as much as possible + var last_event; + do { + last_event = handled_event; + handled_event = interpret_event(); + } while (handled_event !== null); + + // Reset keyboard state if we cannot expect to receive any further + // keyup events + if (isStateImplicit()) + guac_keyboard.reset(); + + return last_event.defaultPrevented; + + } + + /** + * Releases Ctrl+Alt, if both are currently pressed and the given keysym + * looks like a key that may require AltGr. + * + * @private + * @param {!number} keysym + * The key that was just pressed. + */ + var release_simulated_altgr = function release_simulated_altgr(keysym) { + + // Both Ctrl+Alt must be pressed if simulated AltGr is in use + if (!guac_keyboard.modifiers.ctrl || !guac_keyboard.modifiers.alt) + return; + + // Assume [A-Z] never require AltGr + if (keysym >= 0x0041 && keysym <= 0x005A) + return; + + // Assume [a-z] never require AltGr + if (keysym >= 0x0061 && keysym <= 0x007A) + return; + + // Release Ctrl+Alt if the keysym is printable + if (keysym <= 0xFF || (keysym & 0xFF000000) === 0x01000000) { + guac_keyboard.release(0xFFE3); // Left ctrl + guac_keyboard.release(0xFFE4); // Right ctrl + guac_keyboard.release(0xFFE9); // Left alt + guac_keyboard.release(0xFFEA); // Right alt + } + + }; + + /** + * Reads through the event log, interpreting the first event, if possible, + * and returning that event. If no events can be interpreted, due to a + * total lack of events or the need for more events, null is returned. Any + * interpreted events are automatically removed from the log. + * + * @private + * @return {KeyEvent} + * The first key event in the log, if it can be interpreted, or null + * otherwise. + */ + var interpret_event = function interpret_event() { + + // Peek at first event in log + var first = eventLog[0]; + if (!first) + return null; + + // Keydown event + if (first instanceof KeydownEvent) { + + var keysym = null; + var accepted_events = []; + + // Defer handling of Meta until it is known to be functioning as a + // modifier (it may otherwise actually be an alternative method for + // pressing a single key, such as Meta+Left for Home on ChromeOS) + if (first.keysym === 0xFFE7 || first.keysym === 0xFFE8) { + + // Defer handling until further events exist to provide context + if (eventLog.length === 1) + return null; + + // Drop keydown if it turns out Meta does not actually apply + if (eventLog[1].keysym !== first.keysym) { + if (!eventLog[1].modifiers.meta) + return eventLog.shift(); + } + + // Drop duplicate keydown events while waiting to determine + // whether to acknowledge Meta (browser may repeat keydown + // while the key is held) + else if (eventLog[1] instanceof KeydownEvent) + return eventLog.shift(); + + } + + // If event itself is reliable, no need to wait for other events + if (first.reliable) { + keysym = first.keysym; + accepted_events = eventLog.splice(0, 1); + } + + // If keydown is immediately followed by a keypress, use the indicated character + else if (eventLog[1] instanceof KeypressEvent) { + keysym = eventLog[1].keysym; + accepted_events = eventLog.splice(0, 2); + } + + // If keydown is immediately followed by anything else, then no + // keypress can possibly occur to clarify this event, and we must + // handle it now + else if (eventLog[1]) { + keysym = first.keysym; + accepted_events = eventLog.splice(0, 1); + } + + // Fire a key press if valid events were found + if (accepted_events.length > 0) { + + syncModifierStates(first); + + if (keysym) { + + // Fire event + release_simulated_altgr(keysym); + var defaultPrevented = !guac_keyboard.press(keysym); + recentKeysym[first.keyCode] = keysym; + + // Release the key now if we cannot rely on the associated + // keyup event + if (!first.keyupReliable) + guac_keyboard.release(keysym); + + // Record whether default was prevented + for (var i=0; i} + */ + var compositeOperation = { + /* 0x0 NOT IMPLEMENTED */ + 0x1: "destination-in", + 0x2: "destination-out", + /* 0x3 NOT IMPLEMENTED */ + 0x4: "source-in", + /* 0x5 NOT IMPLEMENTED */ + 0x6: "source-atop", + /* 0x7 NOT IMPLEMENTED */ + 0x8: "source-out", + 0x9: "destination-atop", + 0xA: "xor", + 0xB: "destination-over", + 0xC: "copy", + /* 0xD NOT IMPLEMENTED */ + 0xE: "source-over", + 0xF: "lighter" + }; + + /** + * Resizes the canvas element backing this Layer. This function should only + * be used internally. + * + * @private + * @param {number} [newWidth=0] + * The new width to assign to this Layer. + * + * @param {number} [newHeight=0] + * The new height to assign to this Layer. + */ + var resize = function resize(newWidth, newHeight) { + + // Default size to zero + newWidth = newWidth || 0; + newHeight = newHeight || 0; + + // Calculate new dimensions of internal canvas + var canvasWidth = Math.ceil(newWidth / CANVAS_SIZE_FACTOR) * CANVAS_SIZE_FACTOR; + var canvasHeight = Math.ceil(newHeight / CANVAS_SIZE_FACTOR) * CANVAS_SIZE_FACTOR; + + // Resize only if canvas dimensions are actually changing + if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) { + + // Copy old data only if relevant and non-empty + var oldData = null; + if (!empty && canvas.width !== 0 && canvas.height !== 0) { + + // Create canvas and context for holding old data + oldData = document.createElement("canvas"); + oldData.width = Math.min(layer.width, newWidth); + oldData.height = Math.min(layer.height, newHeight); + + var oldDataContext = oldData.getContext("2d"); + + // Copy image data from current + oldDataContext.drawImage(canvas, + 0, 0, oldData.width, oldData.height, + 0, 0, oldData.width, oldData.height); + + } + + // Preserve composite operation + var oldCompositeOperation = context.globalCompositeOperation; + + // Resize canvas + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + // Redraw old data, if any + if (oldData) + context.drawImage(oldData, + 0, 0, oldData.width, oldData.height, + 0, 0, oldData.width, oldData.height); + + // Restore composite operation + context.globalCompositeOperation = oldCompositeOperation; + + // Acknowledge reset of stack (happens on resize of canvas) + stackSize = 0; + context.save(); + + } + + // If the canvas size is not changing, manually force state reset + else + layer.reset(); + + // Assign new layer dimensions + layer.width = newWidth; + layer.height = newHeight; + + }; + + /** + * Given the X and Y coordinates of the upper-left corner of a rectangle + * and the rectangle's width and height, resize the backing canvas element + * as necessary to ensure that the rectangle fits within the canvas + * element's coordinate space. This function will only make the canvas + * larger. If the rectangle already fits within the canvas element's + * coordinate space, the canvas is left unchanged. + * + * @private + * @param {!number} x + * The X coordinate of the upper-left corner of the rectangle to fit. + * + * @param {!number} y + * The Y coordinate of the upper-left corner of the rectangle to fit. + * + * @param {!number} w + * The width of the rectangle to fit. + * + * @param {!number} h + * The height of the rectangle to fit. + */ + function fitRect(x, y, w, h) { + + // Calculate bounds + var opBoundX = w + x; + var opBoundY = h + y; + + // Determine max width + var resizeWidth; + if (opBoundX > layer.width) + resizeWidth = opBoundX; + else + resizeWidth = layer.width; + + // Determine max height + var resizeHeight; + if (opBoundY > layer.height) + resizeHeight = opBoundY; + else + resizeHeight = layer.height; + + // Resize if necessary + layer.resize(resizeWidth, resizeHeight); + + } + + /** + * Set to true if this Layer should resize itself to accommodate the + * dimensions of any drawing operation, and false (the default) otherwise. + * + * Note that setting this property takes effect immediately, and thus may + * take effect on operations that were started in the past but have not + * yet completed. If you wish the setting of this flag to only modify + * future operations, you will need to make the setting of this flag an + * operation with sync(). + * + * @example + * // Set autosize to true for all future operations + * layer.sync(function() { + * layer.autosize = true; + * }); + * + * @type {!boolean} + * @default false + */ + this.autosize = false; + + /** + * The current width of this layer. + * + * @type {!number} + */ + this.width = width; + + /** + * The current height of this layer. + * + * @type {!number} + */ + this.height = height; + + /** + * Returns the canvas element backing this Layer. Note that the dimensions + * of the canvas may not exactly match those of the Layer, as resizing a + * canvas while maintaining its state is an expensive operation. + * + * @returns {!HTMLCanvasElement} + * The canvas element backing this Layer. + */ + this.getCanvas = function getCanvas() { + return canvas; + }; + + /** + * Returns a new canvas element containing the same image as this Layer. + * Unlike getCanvas(), the canvas element returned is guaranteed to have + * the exact same dimensions as the Layer. + * + * @returns {!HTMLCanvasElement} + * A new canvas element containing a copy of the image content this + * Layer. + */ + this.toCanvas = function toCanvas() { + + // Create new canvas having same dimensions + var canvas = document.createElement('canvas'); + canvas.width = layer.width; + canvas.height = layer.height; + + // Copy image contents to new canvas + var context = canvas.getContext('2d'); + context.drawImage(layer.getCanvas(), 0, 0); + + return canvas; + + }; + + /** + * Changes the size of this Layer to the given width and height. Resizing + * is only attempted if the new size provided is actually different from + * the current size. + * + * @param {!number} newWidth + * The new width to assign to this Layer. + * + * @param {!number} newHeight + * The new height to assign to this Layer. + */ + this.resize = function(newWidth, newHeight) { + if (newWidth !== layer.width || newHeight !== layer.height) + resize(newWidth, newHeight); + }; + + /** + * Draws the specified image at the given coordinates. The image specified + * must already be loaded. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!CanvasImageSource} image + * The image to draw. Note that this is not a URL. + */ + this.drawImage = function(x, y, image) { + if (layer.autosize) fitRect(x, y, image.width, image.height); + context.drawImage(image, x, y); + empty = false; + }; + + /** + * Transfer a rectangle of image data from one Layer to this Layer using the + * specified transfer function. + * + * @param {!Guacamole.Layer} srcLayer + * The Layer to copy image data from. + * + * @param {!number} srcx + * The X coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcy + * The Y coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcw + * The width of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} srch + * The height of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + * + * @param {!function} transferFunction + * The transfer function to use to transfer data from source to + * destination. + */ + this.transfer = function(srcLayer, srcx, srcy, srcw, srch, x, y, transferFunction) { + + var srcCanvas = srcLayer.getCanvas(); + + // If entire rectangle outside source canvas, stop + if (srcx >= srcCanvas.width || srcy >= srcCanvas.height) return; + + // Otherwise, clip rectangle to area + if (srcx + srcw > srcCanvas.width) + srcw = srcCanvas.width - srcx; + + if (srcy + srch > srcCanvas.height) + srch = srcCanvas.height - srcy; + + // Stop if nothing to draw. + if (srcw === 0 || srch === 0) return; + + if (layer.autosize) fitRect(x, y, srcw, srch); + + // Get image data from src and dst + var src = srcLayer.getCanvas().getContext("2d").getImageData(srcx, srcy, srcw, srch); + var dst = context.getImageData(x , y, srcw, srch); + + // Apply transfer for each pixel + for (var i=0; i= srcCanvas.width || srcy >= srcCanvas.height) return; + + // Otherwise, clip rectangle to area + if (srcx + srcw > srcCanvas.width) + srcw = srcCanvas.width - srcx; + + if (srcy + srch > srcCanvas.height) + srch = srcCanvas.height - srcy; + + // Stop if nothing to draw. + if (srcw === 0 || srch === 0) return; + + if (layer.autosize) fitRect(x, y, srcw, srch); + + // Get image data from src and dst + var src = srcLayer.getCanvas().getContext("2d").getImageData(srcx, srcy, srcw, srch); + context.putImageData(src, x, y); + empty = false; + + }; + + /** + * Copy a rectangle of image data from one Layer to this Layer. This + * operation will copy exactly the image data that will be drawn once all + * operations of the source Layer that were pending at the time this + * function was called are complete. This operation will not alter the + * size of the source Layer even if its autosize property is set to true. + * + * @param {!Guacamole.Layer} srcLayer + * The Layer to copy image data from. + * + * @param {!number} srcx + * The X coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcy + * The Y coordinate of the upper-left corner of the rectangle within + * the source Layer's coordinate space to copy data from. + * + * @param {!number} srcw + * The width of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} srch + * The height of the rectangle within the source Layer's coordinate + * space to copy data from. + * + * @param {!number} x + * The destination X coordinate. + * + * @param {!number} y + * The destination Y coordinate. + */ + this.copy = function(srcLayer, srcx, srcy, srcw, srch, x, y) { + + var srcCanvas = srcLayer.getCanvas(); + + // If entire rectangle outside source canvas, stop + if (srcx >= srcCanvas.width || srcy >= srcCanvas.height) return; + + // Otherwise, clip rectangle to area + if (srcx + srcw > srcCanvas.width) + srcw = srcCanvas.width - srcx; + + if (srcy + srch > srcCanvas.height) + srch = srcCanvas.height - srcy; + + // Stop if nothing to draw. + if (srcw === 0 || srch === 0) return; + + if (layer.autosize) fitRect(x, y, srcw, srch); + context.drawImage(srcCanvas, srcx, srcy, srcw, srch, x, y, srcw, srch); + empty = false; + + }; + + /** + * Starts a new path at the specified point. + * + * @param {!number} x + * The X coordinate of the point to draw. + * + * @param {!number} y + * The Y coordinate of the point to draw. + */ + this.moveTo = function(x, y) { + + // Start a new path if current path is closed + if (pathClosed) { + context.beginPath(); + pathClosed = false; + } + + if (layer.autosize) fitRect(x, y, 0, 0); + context.moveTo(x, y); + + }; + + /** + * Add the specified line to the current path. + * + * @param {!number} x + * The X coordinate of the endpoint of the line to draw. + * + * @param {!number} y + * The Y coordinate of the endpoint of the line to draw. + */ + this.lineTo = function(x, y) { + + // Start a new path if current path is closed + if (pathClosed) { + context.beginPath(); + pathClosed = false; + } + + if (layer.autosize) fitRect(x, y, 0, 0); + context.lineTo(x, y); + + }; + + /** + * Add the specified arc to the current path. + * + * @param {!number} x + * The X coordinate of the center of the circle which will contain the + * arc. + * + * @param {!number} y + * The Y coordinate of the center of the circle which will contain the + * arc. + * + * @param {!number} radius + * The radius of the circle. + * + * @param {!number} startAngle + * The starting angle of the arc, in radians. + * + * @param {!number} endAngle + * The ending angle of the arc, in radians. + * + * @param {!boolean} negative + * Whether the arc should be drawn in order of decreasing angle. + */ + this.arc = function(x, y, radius, startAngle, endAngle, negative) { + + // Start a new path if current path is closed + if (pathClosed) { + context.beginPath(); + pathClosed = false; + } + + if (layer.autosize) fitRect(x, y, 0, 0); + context.arc(x, y, radius, startAngle, endAngle, negative); + + }; + + /** + * Starts a new path at the specified point. + * + * @param {!number} cp1x + * The X coordinate of the first control point. + * + * @param {!number} cp1y + * The Y coordinate of the first control point. + * + * @param {!number} cp2x + * The X coordinate of the second control point. + * + * @param {!number} cp2y + * The Y coordinate of the second control point. + * + * @param {!number} x + * The X coordinate of the endpoint of the curve. + * + * @param {!number} y + * The Y coordinate of the endpoint of the curve. + */ + this.curveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) { + + // Start a new path if current path is closed + if (pathClosed) { + context.beginPath(); + pathClosed = false; + } + + if (layer.autosize) fitRect(x, y, 0, 0); + context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + + }; + + /** + * Closes the current path by connecting the end point with the start + * point (if any) with a straight line. + */ + this.close = function() { + context.closePath(); + pathClosed = true; + }; + + /** + * Add the specified rectangle to the current path. + * + * @param {!number} x + * The X coordinate of the upper-left corner of the rectangle to draw. + * + * @param {!number} y + * The Y coordinate of the upper-left corner of the rectangle to draw. + * + * @param {!number} w + * The width of the rectangle to draw. + * + * @param {!number} h + * The height of the rectangle to draw. + */ + this.rect = function(x, y, w, h) { + + // Start a new path if current path is closed + if (pathClosed) { + context.beginPath(); + pathClosed = false; + } + + if (layer.autosize) fitRect(x, y, w, h); + context.rect(x, y, w, h); + + }; + + /** + * Clip all future drawing operations by the current path. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as fillColor()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + */ + this.clip = function() { + + // Set new clipping region + context.clip(); + + // Path now implicitly closed + pathClosed = true; + + }; + + /** + * Stroke the current path with the specified color. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!string} cap + * The line cap style. Can be "round", "square", or "butt". + * + * @param {!string} join + * The line join style. Can be "round", "bevel", or "miter". + * + * @param {!number} thickness + * The line thickness in pixels. + * + * @param {!number} r + * The red component of the color to fill. + * + * @param {!number} g + * The green component of the color to fill. + * + * @param {!number} b + * The blue component of the color to fill. + * + * @param {!number} a + * The alpha component of the color to fill. + */ + this.strokeColor = function(cap, join, thickness, r, g, b, a) { + + // Stroke with color + context.lineCap = cap; + context.lineJoin = join; + context.lineWidth = thickness; + context.strokeStyle = "rgba(" + r + "," + g + "," + b + "," + a/255.0 + ")"; + context.stroke(); + empty = false; + + // Path now implicitly closed + pathClosed = true; + + }; + + /** + * Fills the current path with the specified color. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!number} r + * The red component of the color to fill. + * + * @param {!number} g + * The green component of the color to fill. + * + * @param {!number} b + * The blue component of the color to fill. + * + * @param {!number} a + * The alpha component of the color to fill. + */ + this.fillColor = function(r, g, b, a) { + + // Fill with color + context.fillStyle = "rgba(" + r + "," + g + "," + b + "," + a/255.0 + ")"; + context.fill(); + empty = false; + + // Path now implicitly closed + pathClosed = true; + + }; + + /** + * Stroke the current path with the image within the specified layer. The + * image data will be tiled infinitely within the stroke. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!string} cap + * The line cap style. Can be "round", "square", or "butt". + * + * @param {!string} join + * The line join style. Can be "round", "bevel", or "miter". + * + * @param {!number} thickness + * The line thickness in pixels. + * + * @param {!Guacamole.Layer} srcLayer + * The layer to use as a repeating pattern within the stroke. + */ + this.strokeLayer = function(cap, join, thickness, srcLayer) { + + // Stroke with image data + context.lineCap = cap; + context.lineJoin = join; + context.lineWidth = thickness; + context.strokeStyle = context.createPattern( + srcLayer.getCanvas(), + "repeat" + ); + context.stroke(); + empty = false; + + // Path now implicitly closed + pathClosed = true; + + }; + + /** + * Fills the current path with the image within the specified layer. The + * image data will be tiled infinitely within the stroke. The current path + * is implicitly closed. The current path can continue to be reused + * for other operations (such as clip()) but a new path will be started + * once a path drawing operation (path() or rect()) is used. + * + * @param {!Guacamole.Layer} srcLayer + * The layer to use as a repeating pattern within the fill. + */ + this.fillLayer = function(srcLayer) { + + // Fill with image data + context.fillStyle = context.createPattern( + srcLayer.getCanvas(), + "repeat" + ); + context.fill(); + empty = false; + + // Path now implicitly closed + pathClosed = true; + + }; + + /** + * Push current layer state onto stack. + */ + this.push = function() { + + // Save current state onto stack + context.save(); + stackSize++; + + }; + + /** + * Pop layer state off stack. + */ + this.pop = function() { + + // Restore current state from stack + if (stackSize > 0) { + context.restore(); + stackSize--; + } + + }; + + /** + * Reset the layer, clearing the stack, the current path, and any transform + * matrix. + */ + this.reset = function() { + + // Clear stack + while (stackSize > 0) { + context.restore(); + stackSize--; + } + + // Restore to initial state + context.restore(); + context.save(); + + // Clear path + context.beginPath(); + pathClosed = false; + + }; + + /** + * Sets the given affine transform (defined with six values from the + * transform's matrix). + * + * @param {!number} a + * The first value in the affine transform's matrix. + * + * @param {!number} b + * The second value in the affine transform's matrix. + * + * @param {!number} c + * The third value in the affine transform's matrix. + * + * @param {!number} d + * The fourth value in the affine transform's matrix. + * + * @param {!number} e + * The fifth value in the affine transform's matrix. + * + * @param {!number} f + * The sixth value in the affine transform's matrix. + */ + this.setTransform = function(a, b, c, d, e, f) { + context.setTransform( + a, b, c, + d, e, f + /*0, 0, 1*/ + ); + }; + + /** + * Applies the given affine transform (defined with six values from the + * transform's matrix). + * + * @param {!number} a + * The first value in the affine transform's matrix. + * + * @param {!number} b + * The second value in the affine transform's matrix. + * + * @param {!number} c + * The third value in the affine transform's matrix. + * + * @param {!number} d + * The fourth value in the affine transform's matrix. + * + * @param {!number} e + * The fifth value in the affine transform's matrix. + * + * @param {!number} f + * The sixth value in the affine transform's matrix. + */ + this.transform = function(a, b, c, d, e, f) { + context.transform( + a, b, c, + d, e, f + /*0, 0, 1*/ + ); + }; + + /** + * Sets the channel mask for future operations on this Layer. + * + * The channel mask is a Guacamole-specific compositing operation identifier + * with a single bit representing each of four channels (in order): source + * image where destination transparent, source where destination opaque, + * destination where source transparent, and destination where source + * opaque. + * + * @param {!number} mask + * The channel mask for future operations on this Layer. + */ + this.setChannelMask = function(mask) { + context.globalCompositeOperation = compositeOperation[mask]; + }; + + /** + * Sets the miter limit for stroke operations using the miter join. This + * limit is the maximum ratio of the size of the miter join to the stroke + * width. If this ratio is exceeded, the miter will not be drawn for that + * joint of the path. + * + * @param {!number} limit + * The miter limit for stroke operations using the miter join. + */ + this.setMiterLimit = function(limit) { + context.miterLimit = limit; + }; + + // Initialize canvas dimensions + resize(width, height); + + // Explicitly render canvas below other elements in the layer (such as + // child layers). Chrome and others may fail to render layers properly + // without this. + canvas.style.zIndex = -1; + +}; + +/** + * Channel mask for the composite operation "rout". + * + * @type {!number} + */ +Guacamole.Layer.ROUT = 0x2; + +/** + * Channel mask for the composite operation "atop". + * + * @type {!number} + */ +Guacamole.Layer.ATOP = 0x6; + +/** + * Channel mask for the composite operation "xor". + * + * @type {!number} + */ +Guacamole.Layer.XOR = 0xA; + +/** + * Channel mask for the composite operation "rover". + * + * @type {!number} + */ +Guacamole.Layer.ROVER = 0xB; + +/** + * Channel mask for the composite operation "over". + * + * @type {!number} + */ +Guacamole.Layer.OVER = 0xE; + +/** + * Channel mask for the composite operation "plus". + * + * @type {!number} + */ +Guacamole.Layer.PLUS = 0xF; + +/** + * Channel mask for the composite operation "rin". + * Beware that WebKit-based browsers may leave the contents of the destination + * layer where the source layer is transparent, despite the definition of this + * operation. + * + * @type {!number} + */ +Guacamole.Layer.RIN = 0x1; + +/** + * Channel mask for the composite operation "in". + * Beware that WebKit-based browsers may leave the contents of the destination + * layer where the source layer is transparent, despite the definition of this + * operation. + * + * @type {!number} + */ +Guacamole.Layer.IN = 0x4; + +/** + * Channel mask for the composite operation "out". + * Beware that WebKit-based browsers may leave the contents of the destination + * layer where the source layer is transparent, despite the definition of this + * operation. + * + * @type {!number} + */ +Guacamole.Layer.OUT = 0x8; + +/** + * Channel mask for the composite operation "ratop". + * Beware that WebKit-based browsers may leave the contents of the destination + * layer where the source layer is transparent, despite the definition of this + * operation. + * + * @type {!number} + */ +Guacamole.Layer.RATOP = 0x9; + +/** + * Channel mask for the composite operation "src". + * Beware that WebKit-based browsers may leave the contents of the destination + * layer where the source layer is transparent, despite the definition of this + * operation. + * + * @type {!number} + */ +Guacamole.Layer.SRC = 0xC; + +/** + * Represents a single pixel of image data. All components have a minimum value + * of 0 and a maximum value of 255. + * + * @constructor + * + * @param {!number} r + * The red component of this pixel. + * + * @param {!number} g + * The green component of this pixel. + * + * @param {!number} b + * The blue component of this pixel. + * + * @param {!number} a + * The alpha component of this pixel. + */ +Guacamole.Layer.Pixel = function(r, g, b, a) { + + /** + * The red component of this pixel, where 0 is the minimum value, + * and 255 is the maximum. + * + * @type {!number} + */ + this.red = r; + + /** + * The green component of this pixel, where 0 is the minimum value, + * and 255 is the maximum. + * + * @type {!number} + */ + this.green = g; + + /** + * The blue component of this pixel, where 0 is the minimum value, + * and 255 is the maximum. + * + * @type {!number} + */ + this.blue = b; + + /** + * The alpha component of this pixel, where 0 is the minimum value, + * and 255 is the maximum. + * + * @type {!number} + */ + this.alpha = a; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Mouse.js b/guacamole-common-js/src/main/webapp/modules/Mouse.js new file mode 100644 index 0000000..083616e --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Mouse.js @@ -0,0 +1,1272 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Provides cross-browser mouse events for a given element. The events of + * the given element are automatically populated with handlers that translate + * mouse events into a non-browser-specific event provided by the + * Guacamole.Mouse instance. + * + * @example + * var mouse = new Guacamole.Mouse(client.getDisplay().getElement()); + * + * // Forward all mouse interaction over Guacamole connection + * mouse.onEach(['mousedown', 'mousemove', 'mouseup'], function sendMouseEvent(e) { + * client.sendMouseState(e.state, true); + * }); + * + * @example + * // Hide software cursor when mouse leaves display + * mouse.on('mouseout', function hideCursor() { + * client.getDisplay().showCursor(false); + * }); + * + * @constructor + * @augments Guacamole.Mouse.Event.Target + * @param {!Element} element + * The Element to use to provide mouse events. + */ +Guacamole.Mouse = function Mouse(element) { + + Guacamole.Mouse.Event.Target.call(this); + + /** + * Reference to this Guacamole.Mouse. + * + * @private + * @type {!Guacamole.Mouse} + */ + var guac_mouse = this; + + /** + * The number of mousemove events to require before re-enabling mouse + * event handling after receiving a touch event. + * + * @type {!number} + */ + this.touchMouseThreshold = 3; + + /** + * The minimum amount of pixels scrolled required for a single scroll button + * click. + * + * @type {!number} + */ + this.scrollThreshold = 53; + + /** + * The number of pixels to scroll per line. + * + * @type {!number} + */ + this.PIXELS_PER_LINE = 18; + + /** + * The number of pixels to scroll per page. + * + * @type {!number} + */ + this.PIXELS_PER_PAGE = this.PIXELS_PER_LINE * 16; + + /** + * Array of {@link Guacamole.Mouse.State} button names corresponding to the + * mouse button indices used by DOM mouse events. + * + * @private + * @type {!string[]} + */ + var MOUSE_BUTTONS = [ + Guacamole.Mouse.State.Buttons.LEFT, + Guacamole.Mouse.State.Buttons.MIDDLE, + Guacamole.Mouse.State.Buttons.RIGHT + ]; + + /** + * Counter of mouse events to ignore. This decremented by mousemove, and + * while non-zero, mouse events will have no effect. + * + * @private + * @type {!number} + */ + var ignore_mouse = 0; + + /** + * Cumulative scroll delta amount. This value is accumulated through scroll + * events and results in scroll button clicks if it exceeds a certain + * threshold. + * + * @private + * @type {!number} + */ + var scroll_delta = 0; + + // Block context menu so right-click gets sent properly + element.addEventListener("contextmenu", function(e) { + Guacamole.Event.DOMEvent.cancelEvent(e); + }, false); + + element.addEventListener("mousemove", function(e) { + + // If ignoring events, decrement counter + if (ignore_mouse) { + Guacamole.Event.DOMEvent.cancelEvent(e); + ignore_mouse--; + return; + } + + guac_mouse.move(Guacamole.Position.fromClientPosition(element, e.clientX, e.clientY), e); + + }, false); + + element.addEventListener("mousedown", function(e) { + + // Do not handle if ignoring events + if (ignore_mouse) { + Guacamole.Event.DOMEvent.cancelEvent(e); + return; + } + + var button = MOUSE_BUTTONS[e.button]; + if (button) + guac_mouse.press(button, e); + + }, false); + + element.addEventListener("mouseup", function(e) { + + // Do not handle if ignoring events + if (ignore_mouse) { + Guacamole.Event.DOMEvent.cancelEvent(e); + return; + } + + var button = MOUSE_BUTTONS[e.button]; + if (button) + guac_mouse.release(button, e); + + }, false); + + element.addEventListener("mouseout", function(e) { + + // Get parent of the element the mouse pointer is leaving + if (!e) e = window.event; + + // Check that mouseout is due to actually LEAVING the element + var target = e.relatedTarget || e.toElement; + while (target) { + if (target === element) + return; + target = target.parentNode; + } + + // Release all buttons and fire mouseout + guac_mouse.reset(e); + guac_mouse.out(e); + + }, false); + + // Override selection on mouse event element. + element.addEventListener("selectstart", function(e) { + Guacamole.Event.DOMEvent.cancelEvent(e); + }, false); + + // Ignore all pending mouse events when touch events are the apparent source + function ignorePendingMouseEvents() { ignore_mouse = guac_mouse.touchMouseThreshold; } + + element.addEventListener("touchmove", ignorePendingMouseEvents, false); + element.addEventListener("touchstart", ignorePendingMouseEvents, false); + element.addEventListener("touchend", ignorePendingMouseEvents, false); + + // Scroll wheel support + function mousewheel_handler(e) { + + // Determine approximate scroll amount (in pixels) + var delta = e.deltaY || -e.wheelDeltaY || -e.wheelDelta; + + // If successfully retrieved scroll amount, convert to pixels if not + // already in pixels + if (delta) { + + // Convert to pixels if delta was lines + if (e.deltaMode === 1) + delta = e.deltaY * guac_mouse.PIXELS_PER_LINE; + + // Convert to pixels if delta was pages + else if (e.deltaMode === 2) + delta = e.deltaY * guac_mouse.PIXELS_PER_PAGE; + + } + + // Otherwise, assume legacy mousewheel event and line scrolling + else + delta = e.detail * guac_mouse.PIXELS_PER_LINE; + + // Update overall delta + scroll_delta += delta; + + // Up + if (scroll_delta <= -guac_mouse.scrollThreshold) { + + // Repeatedly click the up button until insufficient delta remains + do { + guac_mouse.click(Guacamole.Mouse.State.Buttons.UP); + scroll_delta += guac_mouse.scrollThreshold; + } while (scroll_delta <= -guac_mouse.scrollThreshold); + + // Reset delta + scroll_delta = 0; + + } + + // Down + if (scroll_delta >= guac_mouse.scrollThreshold) { + + // Repeatedly click the down button until insufficient delta remains + do { + guac_mouse.click(Guacamole.Mouse.State.Buttons.DOWN); + scroll_delta -= guac_mouse.scrollThreshold; + } while (scroll_delta >= guac_mouse.scrollThreshold); + + // Reset delta + scroll_delta = 0; + + } + + // All scroll/wheel events must currently be cancelled regardless of + // whether the dispatched event is cancelled, as there is no Guacamole + // scroll event and thus no way to cancel scroll events that are + // smaller than required to produce an up/down click + Guacamole.Event.DOMEvent.cancelEvent(e); + + } + + if (window.WheelEvent) { + // All modern browsers support wheel events. + element.addEventListener('wheel', mousewheel_handler, false); + } + else { + // Legacy FireFox wheel events. + element.addEventListener('DOMMouseScroll', mousewheel_handler, false); + // Legacy Chrome/IE/other wheel events. + element.addEventListener('mousewheel', mousewheel_handler, false); + } + + /** + * Whether the browser supports CSS3 cursor styling, including hotspot + * coordinates. + * + * @private + * @type {!boolean} + */ + var CSS3_CURSOR_SUPPORTED = (function() { + + var div = document.createElement("div"); + + // If no cursor property at all, then no support + if (!("cursor" in div.style)) + return false; + + try { + // Apply simple 1x1 PNG + div.style.cursor = "url(data:image/png;base64," + + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB" + + "AQMAAAAl21bKAAAAA1BMVEX///+nxBvI" + + "AAAACklEQVQI12NgAAAAAgAB4iG8MwAA" + + "AABJRU5ErkJggg==) 0 0, auto"; + } + catch (e) { + return false; + } + + // Verify cursor property is set to URL with hotspot + return /\burl\([^()]*\)\s+0\s+0\b/.test(div.style.cursor || ""); + + })(); + + /** + * Changes the local mouse cursor to the given canvas, having the given + * hotspot coordinates. This affects styling of the element backing this + * Guacamole.Mouse only, and may fail depending on browser support for + * setting the mouse cursor. + * + * If setting the local cursor is desired, it is up to the implementation + * to do something else, such as use the software cursor built into + * Guacamole.Display, if the local cursor cannot be set. + * + * @param {!HTMLCanvasElement} canvas + * The cursor image. + * + * @param {!number} x + * The X-coordinate of the cursor hotspot. + * + * @param {!number} y + * The Y-coordinate of the cursor hotspot. + * + * @return {!boolean} + * true if the cursor was successfully set, false if the cursor could + * not be set for any reason. + */ + this.setCursor = function(canvas, x, y) { + + // Attempt to set via CSS3 cursor styling + if (CSS3_CURSOR_SUPPORTED) { + var dataURL = canvas.toDataURL('image/png'); + element.style.cursor = "url(" + dataURL + ") " + x + " " + y + ", auto"; + return true; + } + + // Otherwise, setting cursor failed + return false; + + }; + +}; + +/** + * The current state of a mouse, including position and buttons. + * + * @constructor + * @augments Guacamole.Position + * @param {Guacamole.Mouse.State|object} [template={}] + * The object whose properties should be copied within the new + * Guacamole.Mouse.State. + */ +Guacamole.Mouse.State = function State(template) { + + /** + * Returns the template object that would be provided to the + * Guacamole.Mouse.State constructor to produce a new Guacamole.Mouse.State + * object with the properties specified. The order and type of arguments + * used by this function are identical to those accepted by the + * Guacamole.Mouse.State constructor of Apache Guacamole 1.3.0 and older. + * + * @private + * @param {!number} x + * The X position of the mouse pointer in pixels. + * + * @param {!number} y + * The Y position of the mouse pointer in pixels. + * + * @param {!boolean} left + * Whether the left mouse button is pressed. + * + * @param {!boolean} middle + * Whether the middle mouse button is pressed. + * + * @param {!boolean} right + * Whether the right mouse button is pressed. + * + * @param {!boolean} up + * Whether the up mouse button is pressed (the fourth button, usually + * part of a scroll wheel). + * + * @param {!boolean} down + * Whether the down mouse button is pressed (the fifth button, usually + * part of a scroll wheel). + * + * @return {!object} + * The equivalent template object that would be passed to the new + * Guacamole.Mouse.State constructor. + */ + var legacyConstructor = function legacyConstructor(x, y, left, middle, right, up, down) { + return { + x : x, + y : y, + left : left, + middle : middle, + right : right, + up : up, + down : down + }; + }; + + // Accept old-style constructor, as well + if (arguments.length > 1) + template = legacyConstructor.apply(this, arguments); + else + template = template || {}; + + Guacamole.Position.call(this, template); + + /** + * Whether the left mouse button is currently pressed. + * + * @type {!boolean} + * @default false + */ + this.left = template.left || false; + + /** + * Whether the middle mouse button is currently pressed. + * + * @type {!boolean} + * @default false + */ + this.middle = template.middle || false; + + /** + * Whether the right mouse button is currently pressed. + * + * @type {!boolean} + * @default false + */ + this.right = template.right || false; + + /** + * Whether the up mouse button is currently pressed. This is the fourth + * mouse button, associated with upward scrolling of the mouse scroll + * wheel. + * + * @type {!boolean} + * @default false + */ + this.up = template.up || false; + + /** + * Whether the down mouse button is currently pressed. This is the fifth + * mouse button, associated with downward scrolling of the mouse scroll + * wheel. + * + * @type {!boolean} + * @default false + */ + this.down = template.down || false; + +}; + +/** + * All mouse buttons that may be represented by a + * {@link Guacamole.Mouse.State}. + * + * @readonly + * @enum + */ +Guacamole.Mouse.State.Buttons = { + + /** + * The name of the {@link Guacamole.Mouse.State} property representing the + * left mouse button. + * + * @constant + * @type {!string} + */ + LEFT : 'left', + + /** + * The name of the {@link Guacamole.Mouse.State} property representing the + * middle mouse button. + * + * @constant + * @type {!string} + */ + MIDDLE : 'middle', + + /** + * The name of the {@link Guacamole.Mouse.State} property representing the + * right mouse button. + * + * @constant + * @type {!string} + */ + RIGHT : 'right', + + /** + * The name of the {@link Guacamole.Mouse.State} property representing the + * up mouse button (the fourth mouse button, clicked when the mouse scroll + * wheel is scrolled up). + * + * @constant + * @type {!string} + */ + UP : 'up', + + /** + * The name of the {@link Guacamole.Mouse.State} property representing the + * down mouse button (the fifth mouse button, clicked when the mouse scroll + * wheel is scrolled up). + * + * @constant + * @type {!string} + */ + DOWN : 'down' + +}; + +/** + * Base event type for all mouse events. The mouse producing the event may be + * the user's local mouse (as with {@link Guacamole.Mouse}) or an emulated + * mouse (as with {@link Guacamole.Mouse.Touchpad}). + * + * @constructor + * @augments Guacamole.Event.DOMEvent + * @param {!string} type + * The type name of the event ("mousedown", "mouseup", etc.) + * + * @param {!Guacamole.Mouse.State} state + * The current mouse state. + * + * @param {Event|Event[]} [events=[]] + * The DOM events that are related to this event, if any. + */ +Guacamole.Mouse.Event = function MouseEvent(type, state, events) { + + Guacamole.Event.DOMEvent.call(this, type, events); + + /** + * The name of the event handler used by the Guacamole JavaScript API for + * this event prior to the migration to Guacamole.Event.Target. + * + * @private + * @constant + * @type {!string} + */ + var legacyHandlerName = 'on' + this.type; + + /** + * The current mouse state at the time this event was fired. + * + * @type {!Guacamole.Mouse.State} + */ + this.state = state; + + /** + * @inheritdoc + */ + this.invokeLegacyHandler = function invokeLegacyHandler(target) { + if (target[legacyHandlerName]) { + + this.preventDefault(); + this.stopPropagation(); + + target[legacyHandlerName](this.state); + + } + }; + +}; + +/** + * An object which can dispatch {@link Guacamole.Mouse.Event} objects + * representing mouse events. These mouse events may be produced from an actual + * mouse device (as with {@link Guacamole.Mouse}), from an emulated mouse + * device (as with {@link Guacamole.Mouse.Touchpad}, or may be programmatically + * generated (using functions like [dispatch()]{@link Guacamole.Mouse.Event.Target#dispatch}, + * [press()]{@link Guacamole.Mouse.Event.Target#press}, and + * [release()]{@link Guacamole.Mouse.Event.Target#release}). + * + * @constructor + * @augments Guacamole.Event.Target + */ +Guacamole.Mouse.Event.Target = function MouseEventTarget() { + + Guacamole.Event.Target.call(this); + + /** + * The current mouse state. The properties of this state are updated when + * mouse events fire. This state object is also passed in as a parameter to + * the handler of any mouse events. + * + * @type {!Guacamole.Mouse.State} + */ + this.currentState = new Guacamole.Mouse.State(); + + /** + * Fired whenever a mouse button is effectively pressed. Depending on the + * object dispatching the event, this can be due to a true mouse button + * press ({@link Guacamole.Mouse}), an emulated mouse button press from a + * touch gesture ({@link Guacamole.Mouse.Touchpad} and + * {@link Guacamole.Mouse.Touchscreen}), or may be programmatically + * generated through [dispatch()]{@link Guacamole.Mouse.Event.Target#dispatch}, + * [press()]{@link Guacamole.Mouse.Event.Target#press}, or + * [click()]{@link Guacamole.Mouse.Event.Target#click}. + * + * @event Guacamole.Mouse.Event.Target#mousedown + * @param {!Guacamole.Mouse.Event} event + * The mousedown event that was fired. + */ + + /** + * Fired whenever a mouse button is effectively released. Depending on the + * object dispatching the event, this can be due to a true mouse button + * release ({@link Guacamole.Mouse}), an emulated mouse button release from + * a touch gesture ({@link Guacamole.Mouse.Touchpad} and + * {@link Guacamole.Mouse.Touchscreen}), or may be programmatically + * generated through [dispatch()]{@link Guacamole.Mouse.Event.Target#dispatch}, + * [release()]{@link Guacamole.Mouse.Event.Target#release}, or + * [click()]{@link Guacamole.Mouse.Event.Target#click}. + * + * @event Guacamole.Mouse.Event.Target#mouseup + * @param {!Guacamole.Mouse.Event} event + * The mouseup event that was fired. + */ + + /** + * Fired whenever the mouse pointer is effectively moved. Depending on the + * object dispatching the event, this can be due to true mouse movement + * ({@link Guacamole.Mouse}), emulated mouse movement from + * a touch gesture ({@link Guacamole.Mouse.Touchpad} and + * {@link Guacamole.Mouse.Touchscreen}), or may be programmatically + * generated through [dispatch()]{@link Guacamole.Mouse.Event.Target#dispatch}, + * or [move()]{@link Guacamole.Mouse.Event.Target#move}. + * + * @event Guacamole.Mouse.Event.Target#mousemove + * @param {!Guacamole.Mouse.Event} event + * The mousemove event that was fired. + */ + + /** + * Fired whenever the mouse pointer leaves the boundaries of the element + * being monitored for interaction. This will only ever be automatically + * fired due to movement of an actual mouse device via + * {@link Guacamole.Mouse} unless programmatically generated through + * [dispatch()]{@link Guacamole.Mouse.Event.Target#dispatch}, + * or [out()]{@link Guacamole.Mouse.Event.Target#out}. + * + * @event Guacamole.Mouse.Event.Target#mouseout + * @param {!Guacamole.Mouse.Event} event + * The mouseout event that was fired. + */ + + /** + * Presses the given mouse button, if it isn't already pressed. Valid + * button names are defined by {@link Guacamole.Mouse.State.Buttons} and + * correspond to the button-related properties of + * {@link Guacamole.Mouse.State}. + * + * @fires Guacamole.Mouse.Event.Target#mousedown + * + * @param {!string} button + * The name of the mouse button to press, as defined by + * {@link Guacamole.Mouse.State.Buttons}. + * + * @param {Event|Event[]} [events=[]] + * The DOM events that are related to the mouse button press, if any. + */ + this.press = function press(button, events) { + if (!this.currentState[button]) { + this.currentState[button] = true; + this.dispatch(new Guacamole.Mouse.Event('mousedown', this.currentState, events)); + } + }; + + /** + * Releases the given mouse button, if it isn't already released. Valid + * button names are defined by {@link Guacamole.Mouse.State.Buttons} and + * correspond to the button-related properties of + * {@link Guacamole.Mouse.State}. + * + * @fires Guacamole.Mouse.Event.Target#mouseup + * + * @param {!string} button + * The name of the mouse button to release, as defined by + * {@link Guacamole.Mouse.State.Buttons}. + * + * @param {Event|Event[]} [events=[]] + * The DOM events related to the mouse button release, if any. + */ + this.release = function release(button, events) { + if (this.currentState[button]) { + this.currentState[button] = false; + this.dispatch(new Guacamole.Mouse.Event('mouseup', this.currentState, events)); + } + }; + + /** + * Clicks (presses and releases) the given mouse button. Valid button + * names are defined by {@link Guacamole.Mouse.State.Buttons} and + * correspond to the button-related properties of + * {@link Guacamole.Mouse.State}. + * + * @fires Guacamole.Mouse.Event.Target#mousedown + * @fires Guacamole.Mouse.Event.Target#mouseup + * + * @param {!string} button + * The name of the mouse button to click, as defined by + * {@link Guacamole.Mouse.State.Buttons}. + * + * @param {Event|Event[]} [events=[]] + * The DOM events related to the click, if any. + */ + this.click = function click(button, events) { + this.press(button, events); + this.release(button, events); + }; + + /** + * Moves the mouse to the given coordinates. + * + * @fires Guacamole.Mouse.Event.Target#mousemove + * + * @param {!(Guacamole.Position|object)} position + * The new coordinates of the mouse pointer. This object may be a + * {@link Guacamole.Position} or any object with "x" and "y" + * properties. + * + * @param {Event|Event[]} [events=[]] + * The DOM events related to the mouse movement, if any. + */ + this.move = function move(position, events) { + + if (this.currentState.x !== position.x || this.currentState.y !== position.y) { + this.currentState.x = position.x; + this.currentState.y = position.y; + this.dispatch(new Guacamole.Mouse.Event('mousemove', this.currentState, events)); + } + + }; + + /** + * Notifies event listeners that the mouse pointer has left the boundaries + * of the area being monitored for mouse events. + * + * @fires Guacamole.Mouse.Event.Target#mouseout + * + * @param {Event|Event[]} [events=[]] + * The DOM events related to the mouse leaving the boundaries of the + * monitored object, if any. + */ + this.out = function out(events) { + this.dispatch(new Guacamole.Mouse.Event('mouseout', this.currentState, events)); + }; + + /** + * Releases all mouse buttons that are currently pressed. If all mouse + * buttons have already been released, this function has no effect. + * + * @fires Guacamole.Mouse.Event.Target#mouseup + * + * @param {Event|Event[]} [events=[]] + * The DOM event related to all mouse buttons being released, if any. + */ + this.reset = function reset(events) { + for (var button in Guacamole.Mouse.State.Buttons) { + this.release(Guacamole.Mouse.State.Buttons[button], events); + } + }; + +}; + +/** + * Provides cross-browser relative touch event translation for a given element. + * + * Touch events are translated into mouse events as if the touches occurred + * on a touchpad (drag to push the mouse pointer, tap to click). + * + * @example + * var touchpad = new Guacamole.Mouse.Touchpad(client.getDisplay().getElement()); + * + * // Emulate a mouse using touchpad-style gestures, forwarding all mouse + * // interaction over Guacamole connection + * touchpad.onEach(['mousedown', 'mousemove', 'mouseup'], function sendMouseEvent(e) { + * + * // Re-show software mouse cursor if possibly hidden by a prior call to + * // showCursor(), such as a "mouseout" event handler that hides the + * // cursor + * client.getDisplay().showCursor(true); + * + * client.sendMouseState(e.state, true); + * + * }); + * + * @constructor + * @augments Guacamole.Mouse.Event.Target + * @param {!Element} element + * The Element to use to provide touch events. + */ +Guacamole.Mouse.Touchpad = function Touchpad(element) { + + Guacamole.Mouse.Event.Target.call(this); + + /** + * The "mouseout" event will never be fired by Guacamole.Mouse.Touchpad. + * + * @ignore + * @event Guacamole.Mouse.Touchpad#mouseout + */ + + /** + * Reference to this Guacamole.Mouse.Touchpad. + * + * @private + * @type {!Guacamole.Mouse.Touchpad} + */ + var guac_touchpad = this; + + /** + * The distance a two-finger touch must move per scrollwheel event, in + * pixels. + * + * @type {!number} + */ + this.scrollThreshold = 20 * (window.devicePixelRatio || 1); + + /** + * The maximum number of milliseconds to wait for a touch to end for the + * gesture to be considered a click. + * + * @type {!number} + */ + this.clickTimingThreshold = 250; + + /** + * The maximum number of pixels to allow a touch to move for the gesture to + * be considered a click. + * + * @type {!number} + */ + this.clickMoveThreshold = 10 * (window.devicePixelRatio || 1); + + /** + * The current mouse state. The properties of this state are updated when + * mouse events fire. This state object is also passed in as a parameter to + * the handler of any mouse events. + * + * @type {!Guacamole.Mouse.State} + */ + this.currentState = new Guacamole.Mouse.State(); + + var touch_count = 0; + var last_touch_x = 0; + var last_touch_y = 0; + var last_touch_time = 0; + var pixels_moved = 0; + + var touch_buttons = { + 1: "left", + 2: "right", + 3: "middle" + }; + + var gesture_in_progress = false; + var click_release_timeout = null; + + element.addEventListener("touchend", function(e) { + + e.preventDefault(); + + // If we're handling a gesture AND this is the last touch + if (gesture_in_progress && e.touches.length === 0) { + + var time = new Date().getTime(); + + // Get corresponding mouse button + var button = touch_buttons[touch_count]; + + // If mouse already down, release anad clear timeout + if (guac_touchpad.currentState[button]) { + + // Fire button up event + guac_touchpad.release(button, e); + + // Clear timeout, if set + if (click_release_timeout) { + window.clearTimeout(click_release_timeout); + click_release_timeout = null; + } + + } + + // If single tap detected (based on time and distance) + if (time - last_touch_time <= guac_touchpad.clickTimingThreshold + && pixels_moved < guac_touchpad.clickMoveThreshold) { + + // Fire button down event + guac_touchpad.press(button, e); + + // Delay mouse up - mouse up should be canceled if + // touchstart within timeout. + click_release_timeout = window.setTimeout(function() { + + // Fire button up event + guac_touchpad.release(button, e); + + // Gesture now over + gesture_in_progress = false; + + }, guac_touchpad.clickTimingThreshold); + + } + + // If we're not waiting to see if this is a click, stop gesture + if (!click_release_timeout) + gesture_in_progress = false; + + } + + }, false); + + element.addEventListener("touchstart", function(e) { + + e.preventDefault(); + + // Track number of touches, but no more than three + touch_count = Math.min(e.touches.length, 3); + + // Clear timeout, if set + if (click_release_timeout) { + window.clearTimeout(click_release_timeout); + click_release_timeout = null; + } + + // Record initial touch location and time for touch movement + // and tap gestures + if (!gesture_in_progress) { + + // Stop mouse events while touching + gesture_in_progress = true; + + // Record touch location and time + var starting_touch = e.touches[0]; + last_touch_x = starting_touch.clientX; + last_touch_y = starting_touch.clientY; + last_touch_time = new Date().getTime(); + pixels_moved = 0; + + } + + }, false); + + element.addEventListener("touchmove", function(e) { + + e.preventDefault(); + + // Get change in touch location + var touch = e.touches[0]; + var delta_x = touch.clientX - last_touch_x; + var delta_y = touch.clientY - last_touch_y; + + // Track pixels moved + pixels_moved += Math.abs(delta_x) + Math.abs(delta_y); + + // If only one touch involved, this is mouse move + if (touch_count === 1) { + + // Calculate average velocity in Manhatten pixels per millisecond + var velocity = pixels_moved / (new Date().getTime() - last_touch_time); + + // Scale mouse movement relative to velocity + var scale = 1 + velocity; + + // Update mouse location + var position = new Guacamole.Position(guac_touchpad.currentState); + position.x += delta_x*scale; + position.y += delta_y*scale; + + // Prevent mouse from leaving screen + position.x = Math.min(Math.max(0, position.x), element.offsetWidth - 1); + position.y = Math.min(Math.max(0, position.y), element.offsetHeight - 1); + + // Fire movement event, if defined + guac_touchpad.move(position, e); + + // Update touch location + last_touch_x = touch.clientX; + last_touch_y = touch.clientY; + + } + + // Interpret two-finger swipe as scrollwheel + else if (touch_count === 2) { + + // If change in location passes threshold for scroll + if (Math.abs(delta_y) >= guac_touchpad.scrollThreshold) { + + // Decide button based on Y movement direction + var button; + if (delta_y > 0) button = "down"; + else button = "up"; + + guac_touchpad.click(button, e); + + // Only update touch location after a scroll has been + // detected + last_touch_x = touch.clientX; + last_touch_y = touch.clientY; + + } + + } + + }, false); + +}; + +/** + * Provides cross-browser absolute touch event translation for a given element. + * + * Touch events are translated into mouse events as if the touches occurred + * on a touchscreen (tapping anywhere on the screen clicks at that point, + * long-press to right-click). + * + * @example + * var touchscreen = new Guacamole.Mouse.Touchscreen(client.getDisplay().getElement()); + * + * // Emulate a mouse using touchscreen-style gestures, forwarding all mouse + * // interaction over Guacamole connection + * touchscreen.onEach(['mousedown', 'mousemove', 'mouseup'], function sendMouseEvent(e) { + * + * // Re-show software mouse cursor if possibly hidden by a prior call to + * // showCursor(), such as a "mouseout" event handler that hides the + * // cursor + * client.getDisplay().showCursor(true); + * + * client.sendMouseState(e.state, true); + * + * }); + * + * @constructor + * @augments Guacamole.Mouse.Event.Target + * @param {!Element} element + * The Element to use to provide touch events. + */ +Guacamole.Mouse.Touchscreen = function Touchscreen(element) { + + Guacamole.Mouse.Event.Target.call(this); + + /** + * The "mouseout" event will never be fired by Guacamole.Mouse.Touchscreen. + * + * @ignore + * @event Guacamole.Mouse.Touchscreen#mouseout + */ + + /** + * Reference to this Guacamole.Mouse.Touchscreen. + * + * @private + * @type {!Guacamole.Mouse.Touchscreen} + */ + var guac_touchscreen = this; + + /** + * Whether a gesture is known to be in progress. If false, touch events + * will be ignored. + * + * @private + * @type {!boolean} + */ + var gesture_in_progress = false; + + /** + * The start X location of a gesture. + * + * @private + * @type {number} + */ + var gesture_start_x = null; + + /** + * The start Y location of a gesture. + * + * @private + * @type {number} + */ + var gesture_start_y = null; + + /** + * The timeout associated with the delayed, cancellable click release. + * + * @private + * @type {number} + */ + var click_release_timeout = null; + + /** + * The timeout associated with long-press for right click. + * + * @private + * @type {number} + */ + var long_press_timeout = null; + + /** + * The distance a two-finger touch must move per scrollwheel event, in + * pixels. + * + * @type {!number} + */ + this.scrollThreshold = 20 * (window.devicePixelRatio || 1); + + /** + * The maximum number of milliseconds to wait for a touch to end for the + * gesture to be considered a click. + * + * @type {!number} + */ + this.clickTimingThreshold = 250; + + /** + * The maximum number of pixels to allow a touch to move for the gesture to + * be considered a click. + * + * @type {!number} + */ + this.clickMoveThreshold = 16 * (window.devicePixelRatio || 1); + + /** + * The amount of time a press must be held for long press to be + * detected. + */ + this.longPressThreshold = 500; + + /** + * Returns whether the given touch event exceeds the movement threshold for + * clicking, based on where the touch gesture began. + * + * @private + * @param {!TouchEvent} e + * The touch event to check. + * + * @return {!boolean} + * true if the movement threshold is exceeded, false otherwise. + */ + function finger_moved(e) { + var touch = e.touches[0] || e.changedTouches[0]; + var delta_x = touch.clientX - gesture_start_x; + var delta_y = touch.clientY - gesture_start_y; + return Math.sqrt(delta_x*delta_x + delta_y*delta_y) >= guac_touchscreen.clickMoveThreshold; + } + + /** + * Begins a new gesture at the location of the first touch in the given + * touch event. + * + * @private + * @param {!TouchEvent} e + * The touch event beginning this new gesture. + */ + function begin_gesture(e) { + var touch = e.touches[0]; + gesture_in_progress = true; + gesture_start_x = touch.clientX; + gesture_start_y = touch.clientY; + } + + /** + * End the current gesture entirely. Wait for all touches to be done before + * resuming gesture detection. + * + * @private + */ + function end_gesture() { + window.clearTimeout(click_release_timeout); + window.clearTimeout(long_press_timeout); + gesture_in_progress = false; + } + + element.addEventListener("touchend", function(e) { + + // Do not handle if no gesture + if (!gesture_in_progress) + return; + + // Ignore if more than one touch + if (e.touches.length !== 0 || e.changedTouches.length !== 1) { + end_gesture(); + return; + } + + // Long-press, if any, is over + window.clearTimeout(long_press_timeout); + + // Always release mouse button if pressed + guac_touchscreen.release(Guacamole.Mouse.State.Buttons.LEFT, e); + + // If finger hasn't moved enough to cancel the click + if (!finger_moved(e)) { + + e.preventDefault(); + + // If not yet pressed, press and start delay release + if (!guac_touchscreen.currentState.left) { + + var touch = e.changedTouches[0]; + guac_touchscreen.move(Guacamole.Position.fromClientPosition(element, touch.clientX, touch.clientY)); + guac_touchscreen.press(Guacamole.Mouse.State.Buttons.LEFT, e); + + // Release button after a delay, if not canceled + click_release_timeout = window.setTimeout(function() { + guac_touchscreen.release(Guacamole.Mouse.State.Buttons.LEFT, e); + end_gesture(); + }, guac_touchscreen.clickTimingThreshold); + + } + + } // end if finger not moved + + }, false); + + element.addEventListener("touchstart", function(e) { + + // Ignore if more than one touch + if (e.touches.length !== 1) { + end_gesture(); + return; + } + + e.preventDefault(); + + // New touch begins a new gesture + begin_gesture(e); + + // Keep button pressed if tap after left click + window.clearTimeout(click_release_timeout); + + // Click right button if this turns into a long-press + long_press_timeout = window.setTimeout(function() { + var touch = e.touches[0]; + guac_touchscreen.move(Guacamole.Position.fromClientPosition(element, touch.clientX, touch.clientY)); + guac_touchscreen.click(Guacamole.Mouse.State.Buttons.RIGHT, e); + end_gesture(); + }, guac_touchscreen.longPressThreshold); + + }, false); + + element.addEventListener("touchmove", function(e) { + + // Do not handle if no gesture + if (!gesture_in_progress) + return; + + // Cancel long press if finger moved + if (finger_moved(e)) + window.clearTimeout(long_press_timeout); + + // Ignore if more than one touch + if (e.touches.length !== 1) { + end_gesture(); + return; + } + + // Update mouse position if dragging + if (guac_touchscreen.currentState.left) { + + e.preventDefault(); + + // Update state + var touch = e.touches[0]; + guac_touchscreen.move(Guacamole.Position.fromClientPosition(element, touch.clientX, touch.clientY), e); + + } + + }, false); + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Namespace.js b/guacamole-common-js/src/main/webapp/modules/Namespace.js new file mode 100644 index 0000000..227096f --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Namespace.js @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The namespace used by the Guacamole JavaScript API. Absolutely all classes + * defined by the Guacamole JavaScript API will be within this namespace. + * + * @namespace + */ +var Guacamole = Guacamole || {}; diff --git a/guacamole-common-js/src/main/webapp/modules/Object.js b/guacamole-common-js/src/main/webapp/modules/Object.js new file mode 100644 index 0000000..5d65f57 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Object.js @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * An object used by the Guacamole client to house arbitrarily-many named + * input and output streams. + * + * @constructor + * @param {!Guacamole.Client} client + * The client owning this object. + * + * @param {!number} index + * The index of this object. + */ +Guacamole.Object = function guacamoleObject(client, index) { + + /** + * Reference to this Guacamole.Object. + * + * @private + * @type {!Guacamole.Object} + */ + var guacObject = this; + + /** + * Map of stream name to corresponding queue of callbacks. The queue of + * callbacks is guaranteed to be in order of request. + * + * @private + * @type {!Object.} + */ + var bodyCallbacks = {}; + + /** + * Removes and returns the callback at the head of the callback queue for + * the stream having the given name. If no such callbacks exist, null is + * returned. + * + * @private + * @param {!string} name + * The name of the stream to retrieve a callback for. + * + * @returns {function} + * The next callback associated with the stream having the given name, + * or null if no such callback exists. + */ + var dequeueBodyCallback = function dequeueBodyCallback(name) { + + // If no callbacks defined, simply return null + var callbacks = bodyCallbacks[name]; + if (!callbacks) + return null; + + // Otherwise, pull off first callback, deleting the queue if empty + var callback = callbacks.shift(); + if (callbacks.length === 0) + delete bodyCallbacks[name]; + + // Return found callback + return callback; + + }; + + /** + * Adds the given callback to the tail of the callback queue for the stream + * having the given name. + * + * @private + * @param {!string} name + * The name of the stream to associate with the given callback. + * + * @param {!function} callback + * The callback to add to the queue of the stream with the given name. + */ + var enqueueBodyCallback = function enqueueBodyCallback(name, callback) { + + // Get callback queue by name, creating first if necessary + var callbacks = bodyCallbacks[name]; + if (!callbacks) { + callbacks = []; + bodyCallbacks[name] = callbacks; + } + + // Add callback to end of queue + callbacks.push(callback); + + }; + + /** + * The index of this object. + * + * @type {!number} + */ + this.index = index; + + /** + * Called when this object receives the body of a requested input stream. + * By default, all objects will invoke the callbacks provided to their + * requestInputStream() functions based on the name of the stream + * requested. This behavior can be overridden by specifying a different + * handler here. + * + * @event + * @param {!Guacamole.InputStream} inputStream + * The input stream of the received body. + * + * @param {!string} mimetype + * The mimetype of the data being received. + * + * @param {!string} name + * The name of the stream whose body has been received. + */ + this.onbody = function defaultBodyHandler(inputStream, mimetype, name) { + + // Call queued callback for the received body, if any + var callback = dequeueBodyCallback(name); + if (callback) + callback(inputStream, mimetype); + + }; + + /** + * Called when this object is being undefined. Once undefined, no further + * communication involving this object may occur. + * + * @event + */ + this.onundefine = null; + + /** + * Requests read access to the input stream having the given name. If + * successful, a new input stream will be created. + * + * @param {!string} name + * The name of the input stream to request. + * + * @param {function} [bodyCallback] + * The callback to invoke when the body of the requested input stream + * is received. This callback will be provided a Guacamole.InputStream + * and its mimetype as its two only arguments. If the onbody handler of + * this object is overridden, this callback will not be invoked. + */ + this.requestInputStream = function requestInputStream(name, bodyCallback) { + + // Queue body callback if provided + if (bodyCallback) + enqueueBodyCallback(name, bodyCallback); + + // Send request for input stream + client.requestObjectInputStream(guacObject.index, name); + + }; + + /** + * Creates a new output stream associated with this object and having the + * given mimetype and name. The legality of a mimetype and name is dictated + * by the object itself. + * + * @param {!string} mimetype + * The mimetype of the data which will be sent to the output stream. + * + * @param {!string} name + * The defined name of an output stream within this object. + * + * @returns {!Guacamole.OutputStream} + * An output stream which will write blobs to the named output stream + * of this object. + */ + this.createOutputStream = function createOutputStream(mimetype, name) { + return client.createObjectOutputStream(guacObject.index, mimetype, name); + }; + +}; + +/** + * The reserved name denoting the root stream of any object. The contents of + * the root stream MUST be a JSON map of stream name to mimetype. + * + * @constant + * @type {!string} + */ +Guacamole.Object.ROOT_STREAM = '/'; + +/** + * The mimetype of a stream containing JSON which maps available stream names + * to their corresponding mimetype. The root stream of a Guacamole.Object MUST + * have this mimetype. + * + * @constant + * @type {!string} + */ +Guacamole.Object.STREAM_INDEX_MIMETYPE = 'application/vnd.glyptodon.guacamole.stream-index+json'; diff --git a/guacamole-common-js/src/main/webapp/modules/OnScreenKeyboard.js b/guacamole-common-js/src/main/webapp/modules/OnScreenKeyboard.js new file mode 100644 index 0000000..221f3b2 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/OnScreenKeyboard.js @@ -0,0 +1,947 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Dynamic on-screen keyboard. Given the layout object for an on-screen + * keyboard, this object will construct a clickable on-screen keyboard with its + * own key events. + * + * @constructor + * @param {!Guacamole.OnScreenKeyboard.Layout} layout + * The layout of the on-screen keyboard to display. + */ +Guacamole.OnScreenKeyboard = function(layout) { + + /** + * Reference to this Guacamole.OnScreenKeyboard. + * + * @private + * @type {!Guacamole.OnScreenKeyboard} + */ + var osk = this; + + /** + * Map of currently-set modifiers to the keysym associated with their + * original press. When the modifier is cleared, this keysym must be + * released. + * + * @private + * @type {!Object.} + */ + var modifierKeysyms = {}; + + /** + * Map of all key names to their current pressed states. If a key is not + * pressed, it may not be in this map at all, but all pressed keys will + * have a corresponding mapping to true. + * + * @private + * @type {!Object.} + */ + var pressed = {}; + + /** + * All scalable elements which are part of the on-screen keyboard. Each + * scalable element is carefully controlled to ensure the interface layout + * and sizing remains constant, even on browsers that would otherwise + * experience rounding error due to unit conversions. + * + * @private + * @type {!ScaledElement[]} + */ + var scaledElements = []; + + /** + * Adds a CSS class to an element. + * + * @private + * @function + * @param {!Element} element + * The element to add a class to. + * + * @param {!string} classname + * The name of the class to add. + */ + var addClass = function addClass(element, classname) { + + // If classList supported, use that + if (element.classList) + element.classList.add(classname); + + // Otherwise, simply append the class + else + element.className += " " + classname; + + }; + + /** + * Removes a CSS class from an element. + * + * @private + * @function + * @param {!Element} element + * The element to remove a class from. + * + * @param {!string} classname + * The name of the class to remove. + */ + var removeClass = function removeClass(element, classname) { + + // If classList supported, use that + if (element.classList) + element.classList.remove(classname); + + // Otherwise, manually filter out classes with given name + else { + element.className = element.className.replace(/([^ ]+)[ ]*/g, + function removeMatchingClasses(match, testClassname) { + + // If same class, remove + if (testClassname === classname) + return ""; + + // Otherwise, allow + return match; + + } + ); + } + + }; + + /** + * Counter of mouse events to ignore. This decremented by mousemove, and + * while non-zero, mouse events will have no effect. + * + * @private + * @type {!number} + */ + var ignoreMouse = 0; + + /** + * Ignores all pending mouse events when touch events are the apparent + * source. Mouse events are ignored until at least touchMouseThreshold + * mouse events occur without corresponding touch events. + * + * @private + */ + var ignorePendingMouseEvents = function ignorePendingMouseEvents() { + ignoreMouse = osk.touchMouseThreshold; + }; + + /** + * An element whose dimensions are maintained according to an arbitrary + * scale. The conversion factor for these arbitrary units to pixels is + * provided later via a call to scale(). + * + * @private + * @constructor + * @param {!Element} element + * The element whose scale should be maintained. + * + * @param {!number} width + * The width of the element, in arbitrary units, relative to other + * ScaledElements. + * + * @param {!number} height + * The height of the element, in arbitrary units, relative to other + * ScaledElements. + * + * @param {boolean} [scaleFont=false] + * Whether the line height and font size should be scaled as well. + */ + var ScaledElement = function ScaledElement(element, width, height, scaleFont) { + + /** + * The width of this ScaledElement, in arbitrary units, relative to + * other ScaledElements. + * + * @type {!number} + */ + this.width = width; + + /** + * The height of this ScaledElement, in arbitrary units, relative to + * other ScaledElements. + * + * @type {!number} + */ + this.height = height; + + /** + * Resizes the associated element, updating its dimensions according to + * the given pixels per unit. + * + * @param {!number} pixels + * The number of pixels to assign per arbitrary unit. + */ + this.scale = function(pixels) { + + // Scale element width/height + element.style.width = (width * pixels) + "px"; + element.style.height = (height * pixels) + "px"; + + // Scale font, if requested + if (scaleFont) { + element.style.lineHeight = (height * pixels) + "px"; + element.style.fontSize = pixels + "px"; + } + + }; + + }; + + /** + * Returns whether all modifiers having the given names are currently + * active. + * + * @private + * @param {!string[]} names + * The names of all modifiers to test. + * + * @returns {!boolean} + * true if all specified modifiers are pressed, false otherwise. + */ + var modifiersPressed = function modifiersPressed(names) { + + // If any required modifiers are not pressed, return false + for (var i=0; i < names.length; i++) { + + // Test whether current modifier is pressed + var name = names[i]; + if (!(name in modifierKeysyms)) + return false; + + } + + // Otherwise, all required modifiers are pressed + return true; + + }; + + /** + * Returns the single matching Key object associated with the key of the + * given name, where that Key object's requirements (such as pressed + * modifiers) are all currently satisfied. + * + * @private + * @param {!string} keyName + * The name of the key to retrieve. + * + * @returns {Guacamole.OnScreenKeyboard.Key} + * The Key object associated with the given name, where that object's + * requirements are all currently satisfied, or null if no such Key + * can be found. + */ + var getActiveKey = function getActiveKey(keyName) { + + // Get key array for given name + var keys = osk.keys[keyName]; + if (!keys) + return null; + + // Find last matching key + for (var i = keys.length - 1; i >= 0; i--) { + + // Get candidate key + var candidate = keys[i]; + + // If all required modifiers are pressed, use that key + if (modifiersPressed(candidate.requires)) + return candidate; + + } + + // No valid key + return null; + + }; + + /** + * Presses the key having the given name, updating the associated key + * element with the "guac-keyboard-pressed" CSS class. If the key is + * already pressed, this function has no effect. + * + * @private + * @param {!string} keyName + * The name of the key to press. + * + * @param {!string} keyElement + * The element associated with the given key. + */ + var press = function press(keyName, keyElement) { + + // Press key if not yet pressed + if (!pressed[keyName]) { + + addClass(keyElement, "guac-keyboard-pressed"); + + // Get current key based on modifier state + var key = getActiveKey(keyName); + + // Update modifier state + if (key.modifier) { + + // Construct classname for modifier + var modifierClass = "guac-keyboard-modifier-" + getCSSName(key.modifier); + + // Retrieve originally-pressed keysym, if modifier was already pressed + var originalKeysym = modifierKeysyms[key.modifier]; + + // Activate modifier if not pressed + if (originalKeysym === undefined) { + + addClass(keyboard, modifierClass); + modifierKeysyms[key.modifier] = key.keysym; + + // Send key event only if keysym is meaningful + if (key.keysym && osk.onkeydown) + osk.onkeydown(key.keysym); + + } + + // Deactivate if not pressed + else { + + removeClass(keyboard, modifierClass); + delete modifierKeysyms[key.modifier]; + + // Send key event only if original keysym is meaningful + if (originalKeysym && osk.onkeyup) + osk.onkeyup(originalKeysym); + + } + + } + + // If not modifier, send key event now + else if (osk.onkeydown) + osk.onkeydown(key.keysym); + + // Mark key as pressed + pressed[keyName] = true; + + } + + }; + + /** + * Releases the key having the given name, removing the + * "guac-keyboard-pressed" CSS class from the associated element. If the + * key is already released, this function has no effect. + * + * @private + * @param {!string} keyName + * The name of the key to release. + * + * @param {!string} keyElement + * The element associated with the given key. + */ + var release = function release(keyName, keyElement) { + + // Release key if currently pressed + if (pressed[keyName]) { + + removeClass(keyElement, "guac-keyboard-pressed"); + + // Get current key based on modifier state + var key = getActiveKey(keyName); + + // Send key event if not a modifier key + if (!key.modifier && osk.onkeyup) + osk.onkeyup(key.keysym); + + // Mark key as released + pressed[keyName] = false; + + } + + }; + + // Create keyboard + var keyboard = document.createElement("div"); + keyboard.className = "guac-keyboard"; + + // Do not allow selection or mouse movement to propagate/register. + keyboard.onselectstart = + keyboard.onmousemove = + keyboard.onmouseup = + keyboard.onmousedown = function handleMouseEvents(e) { + + // If ignoring events, decrement counter + if (ignoreMouse) + ignoreMouse--; + + e.stopPropagation(); + return false; + + }; + + /** + * The number of mousemove events to require before re-enabling mouse + * event handling after receiving a touch event. + * + * @type {!number} + */ + this.touchMouseThreshold = 3; + + /** + * Fired whenever the user presses a key on this Guacamole.OnScreenKeyboard. + * + * @event + * @param {!number} keysym + * The keysym of the key being pressed. + */ + this.onkeydown = null; + + /** + * Fired whenever the user releases a key on this Guacamole.OnScreenKeyboard. + * + * @event + * @param {!number} keysym + * The keysym of the key being released. + */ + this.onkeyup = null; + + /** + * The keyboard layout provided at time of construction. + * + * @type {!Guacamole.OnScreenKeyboard.Layout} + */ + this.layout = new Guacamole.OnScreenKeyboard.Layout(layout); + + /** + * Returns the element containing the entire on-screen keyboard. + * + * @returns {!Element} + * The element containing the entire on-screen keyboard. + */ + this.getElement = function() { + return keyboard; + }; + + /** + * Resizes all elements within this Guacamole.OnScreenKeyboard such that + * the width is close to but does not exceed the specified width. The + * height of the keyboard is determined based on the width. + * + * @param {!number} width + * The width to resize this Guacamole.OnScreenKeyboard to, in pixels. + */ + this.resize = function(width) { + + // Get pixel size of a unit + var unit = Math.floor(width * 10 / osk.layout.width) / 10; + + // Resize all scaled elements + for (var i=0; i} keys + * A mapping of key name to key definition, where the key definition is + * the title of the key (a string), the keysym (a number), a single + * Key object, or an array of Key objects. + * + * @returns {!Object.} + * A more-predictable mapping of key name to key definition, where the + * key definition is always simply an array of Key objects. + */ + var getKeys = function getKeys(keys) { + + var keyArrays = {}; + + // Coerce all keys into individual key arrays + for (var name in layout.keys) { + keyArrays[name] = asKeyArray(name, keys[name]); + } + + return keyArrays; + + }; + + /** + * Map of all key names to their corresponding set of keys. Each key name + * may correspond to multiple keys due to the effect of modifiers. + * + * @type {!Object.} + */ + this.keys = getKeys(layout.keys); + + /** + * Given an arbitrary string representing the name of some component of the + * on-screen keyboard, returns a string formatted for use as a CSS class + * name. The result will be lowercase. Word boundaries previously denoted + * by CamelCase will be replaced by individual hyphens, as will all + * contiguous non-alphanumeric characters. + * + * @private + * @param {!string} name + * An arbitrary string representing the name of some component of the + * on-screen keyboard. + * + * @returns {!string} + * A string formatted for use as a CSS class name. + */ + var getCSSName = function getCSSName(name) { + + // Convert name from possibly-CamelCase to hyphenated lowercase + var cssName = name + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/[^A-Za-z0-9]+/g, '-') + .toLowerCase(); + + return cssName; + + }; + + /** + * Appends DOM elements to the given element as dictated by the layout + * structure object provided. If a name is provided, an additional CSS + * class, prepended with "guac-keyboard-", will be added to the top-level + * element. + * + * If the layout structure object is an array, all elements within that + * array will be recursively appended as children of a group, and the + * top-level element will be given the CSS class "guac-keyboard-group". + * + * If the layout structure object is an object, all properties within that + * object will be recursively appended as children of a group, and the + * top-level element will be given the CSS class "guac-keyboard-group". The + * name of each property will be applied as the name of each child object + * for the sake of CSS. Each property will be added in sorted order. + * + * If the layout structure object is a string, the key having that name + * will be appended. The key will be given the CSS class + * "guac-keyboard-key" and "guac-keyboard-key-NAME", where NAME is the name + * of the key. If the name of the key is a single character, this will + * first be transformed into the C-style hexadecimal literal for the + * Unicode codepoint of that character. For example, the key "A" would + * become "guac-keyboard-key-0x41". + * + * If the layout structure object is a number, a gap of that size will be + * inserted. The gap will be given the CSS class "guac-keyboard-gap", and + * will be scaled according to the same size units as each key. + * + * @private + * @param {!Element} element + * The element to append elements to. + * + * @param {!(Array|object|string|number)} object + * The layout structure object to use when constructing the elements to + * append. + * + * @param {string} [name] + * The name of the top-level element being appended, if any. + */ + var appendElements = function appendElements(element, object, name) { + + var i; + + // Create div which will become the group or key + var div = document.createElement('div'); + + // Add class based on name, if name given + if (name) + addClass(div, 'guac-keyboard-' + getCSSName(name)); + + // If an array, append each element + if (object instanceof Array) { + + // Add group class + addClass(div, 'guac-keyboard-group'); + + // Append all elements of array + for (i=0; i < object.length; i++) + appendElements(div, object[i]); + + } + + // If an object, append each property value + else if (object instanceof Object) { + + // Add group class + addClass(div, 'guac-keyboard-group'); + + // Append all children, sorted by name + var names = Object.keys(object).sort(); + for (i=0; i < names.length; i++) { + var name = names[i]; + appendElements(div, object[name], name); + } + + } + + // If a number, create as a gap + else if (typeof object === 'number') { + + // Add gap class + addClass(div, 'guac-keyboard-gap'); + + // Maintain scale + scaledElements.push(new ScaledElement(div, object, object)); + + } + + // If a string, create as a key + else if (typeof object === 'string') { + + // If key name is only one character, use codepoint for name + var keyName = object; + if (keyName.length === 1) + keyName = '0x' + keyName.charCodeAt(0).toString(16); + + // Add key container class + addClass(div, 'guac-keyboard-key-container'); + + // Create key element which will contain all possible caps + var keyElement = document.createElement('div'); + keyElement.className = 'guac-keyboard-key ' + + 'guac-keyboard-key-' + getCSSName(keyName); + + // Add all associated keys as caps within DOM + var keys = osk.keys[object]; + if (keys) { + for (i=0; i < keys.length; i++) { + + // Get current key + var key = keys[i]; + + // Create cap element for key + var capElement = document.createElement('div'); + capElement.className = 'guac-keyboard-cap'; + capElement.textContent = key.title; + + // Add classes for any requirements + for (var j=0; j < key.requires.length; j++) { + var requirement = key.requires[j]; + addClass(capElement, 'guac-keyboard-requires-' + getCSSName(requirement)); + addClass(keyElement, 'guac-keyboard-uses-' + getCSSName(requirement)); + } + + // Add cap to key within DOM + keyElement.appendChild(capElement); + + } + } + + // Add key to DOM, maintain scale + div.appendChild(keyElement); + scaledElements.push(new ScaledElement(div, osk.layout.keyWidths[object] || 1, 1, true)); + + /** + * Handles a touch event which results in the pressing of an OSK + * key. Touch events will result in mouse events being ignored for + * touchMouseThreshold events. + * + * @private + * @param {!TouchEvent} e + * The touch event being handled. + */ + var touchPress = function touchPress(e) { + e.preventDefault(); + ignoreMouse = osk.touchMouseThreshold; + press(object, keyElement); + }; + + /** + * Handles a touch event which results in the release of an OSK + * key. Touch events will result in mouse events being ignored for + * touchMouseThreshold events. + * + * @private + * @param {!TouchEvent} e + * The touch event being handled. + */ + var touchRelease = function touchRelease(e) { + e.preventDefault(); + ignoreMouse = osk.touchMouseThreshold; + release(object, keyElement); + }; + + /** + * Handles a mouse event which results in the pressing of an OSK + * key. If mouse events are currently being ignored, this handler + * does nothing. + * + * @private + * @param {!MouseEvent} e + * The touch event being handled. + */ + var mousePress = function mousePress(e) { + e.preventDefault(); + if (ignoreMouse === 0) + press(object, keyElement); + }; + + /** + * Handles a mouse event which results in the release of an OSK + * key. If mouse events are currently being ignored, this handler + * does nothing. + * + * @private + * @param {!MouseEvent} e + * The touch event being handled. + */ + var mouseRelease = function mouseRelease(e) { + e.preventDefault(); + if (ignoreMouse === 0) + release(object, keyElement); + }; + + // Handle touch events on key + keyElement.addEventListener("touchstart", touchPress, true); + keyElement.addEventListener("touchend", touchRelease, true); + + // Handle mouse events on key + keyElement.addEventListener("mousedown", mousePress, true); + keyElement.addEventListener("mouseup", mouseRelease, true); + keyElement.addEventListener("mouseout", mouseRelease, true); + + } // end if object is key name + + // Add newly-created group/key + element.appendChild(div); + + }; + + // Create keyboard layout in DOM + appendElements(keyboard, layout.layout); + +}; + +/** + * Represents an entire on-screen keyboard layout, including all available + * keys, their behaviors, and their relative position and sizing. + * + * @constructor + * @param {!(Guacamole.OnScreenKeyboard.Layout|object)} template + * The object whose identically-named properties will be used to initialize + * the properties of this layout. + */ +Guacamole.OnScreenKeyboard.Layout = function(template) { + + /** + * The language of keyboard layout, such as "en_US". This property is for + * informational purposes only, but it is recommend to conform to the + * [language code]_[country code] format. + * + * @type {!string} + */ + this.language = template.language; + + /** + * The type of keyboard layout, such as "qwerty". This property is for + * informational purposes only, and does not conform to any standard. + * + * @type {!string} + */ + this.type = template.type; + + /** + * Map of key name to corresponding keysym, title, or key object. If only + * the keysym or title is provided, the key object will be created + * implicitly. In all cases, the name property of the key object will be + * taken from the name given in the mapping. + * + * @type {!Object.} + */ + this.keys = template.keys; + + /** + * Arbitrarily nested, arbitrarily grouped key names. The contents of the + * layout will be traversed to produce an identically-nested grouping of + * keys in the DOM tree. All strings will be transformed into their + * corresponding sets of keys, while all objects and arrays will be + * transformed into named groups and anonymous groups respectively. Any + * numbers present will be transformed into gaps of that size, scaled + * according to the same units as each key. + * + * @type {!object} + */ + this.layout = template.layout; + + /** + * The width of the entire keyboard, in arbitrary units. The width of each + * key is relative to this width, as both width values are assumed to be in + * the same units. The conversion factor between these units and pixels is + * derived later via a call to resize() on the Guacamole.OnScreenKeyboard. + * + * @type {!number} + */ + this.width = template.width; + + /** + * The width of each key, in arbitrary units, relative to other keys in + * this layout. The true pixel size of each key will be determined by the + * overall size of the keyboard. If not defined here, the width of each + * key will default to 1. + * + * @type {!Object.} + */ + this.keyWidths = template.keyWidths || {}; + +}; + +/** + * Represents a single key, or a single possible behavior of a key. Each key + * on the on-screen keyboard must have at least one associated + * Guacamole.OnScreenKeyboard.Key, whether that key is explicitly defined or + * implied, and may have multiple Guacamole.OnScreenKeyboard.Key if behavior + * depends on modifier states. + * + * @constructor + * @param {!(Guacamole.OnScreenKeyboard.Key|object)} template + * The object whose identically-named properties will be used to initialize + * the properties of this key. + * + * @param {string} [name] + * The name to use instead of any name provided within the template, if + * any. If omitted, the name within the template will be used, assuming the + * template contains a name. + */ +Guacamole.OnScreenKeyboard.Key = function(template, name) { + + /** + * The unique name identifying this key within the keyboard layout. + * + * @type {!string} + */ + this.name = name || template.name; + + /** + * The human-readable title that will be displayed to the user within the + * key. If not provided, this will be derived from the key name. + * + * @type {!string} + */ + this.title = template.title || this.name; + + /** + * The keysym to be pressed/released when this key is pressed/released. If + * not provided, this will be derived from the title if the title is a + * single character. + * + * @type {number} + */ + this.keysym = template.keysym || (function deriveKeysym(title) { + + // Do not derive keysym if title is not exactly one character + if (!title || title.length !== 1) + return null; + + // For characters between U+0000 and U+00FF, the keysym is the codepoint + var charCode = title.charCodeAt(0); + if (charCode >= 0x0000 && charCode <= 0x00FF) + return charCode; + + // For characters between U+0100 and U+10FFFF, the keysym is the codepoint or'd with 0x01000000 + if (charCode >= 0x0100 && charCode <= 0x10FFFF) + return 0x01000000 | charCode; + + // Unable to derive keysym + return null; + + })(this.title); + + /** + * The name of the modifier set when the key is pressed and cleared when + * this key is released, if any. The names of modifiers are distinct from + * the names of keys; both the "RightShift" and "LeftShift" keys may set + * the "shift" modifier, for example. By default, the key will affect no + * modifiers. + * + * @type {string} + */ + this.modifier = template.modifier; + + /** + * An array containing the names of each modifier required for this key to + * have an effect. For example, a lowercase letter may require nothing, + * while an uppercase letter would require "shift", assuming the Shift key + * is named "shift" within the layout. By default, the key will require + * no modifiers. + * + * @type {!string[]} + */ + this.requires = template.requires || []; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/OutputStream.js b/guacamole-common-js/src/main/webapp/modules/OutputStream.js new file mode 100644 index 0000000..bb9bad6 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/OutputStream.js @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Abstract stream which can receive data. + * + * @constructor + * @param {!Guacamole.Client} client + * The client owning this stream. + * + * @param {!number} index + * The index of this stream. + */ +Guacamole.OutputStream = function(client, index) { + + /** + * Reference to this stream. + * + * @private + * @type {!Guacamole.OutputStream} + */ + var guac_stream = this; + + /** + * The index of this stream. + * @type {!number} + */ + this.index = index; + + /** + * Fired whenever an acknowledgement is received from the server, indicating + * that a stream operation has completed, or an error has occurred. + * + * @event + * @param {!Guacamole.Status} status + * The status of the operation. + */ + this.onack = null; + + /** + * Writes the given base64-encoded data to this stream as a blob. + * + * @param {!string} data + * The base64-encoded data to send. + */ + this.sendBlob = function(data) { + client.sendBlob(guac_stream.index, data); + }; + + /** + * Closes this stream. + */ + this.sendEnd = function() { + client.endStream(guac_stream.index); + }; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Parser.js b/guacamole-common-js/src/main/webapp/modules/Parser.js new file mode 100644 index 0000000..aa3dbe5 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Parser.js @@ -0,0 +1,348 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Simple Guacamole protocol parser that invokes an oninstruction event when + * full instructions are available from data received via receive(). + * + * @constructor + */ +Guacamole.Parser = function Parser() { + + /** + * Reference to this parser. + * + * @private + * @type {!Guacamole.Parser} + */ + var parser = this; + + /** + * Current buffer of received data. This buffer grows until a full + * element is available. After a full element is available, that element + * is flushed into the element buffer. + * + * @private + * @type {!string} + */ + var buffer = ''; + + /** + * Buffer of all received, complete elements. After an entire instruction + * is read, this buffer is flushed, and a new instruction begins. + * + * @private + * @type {!string[]} + */ + var elementBuffer = []; + + /** + * The character offset within the buffer of the current or most recently + * parsed element's terminator. If sufficient characters have not yet been + * read via calls to receive(), this may point to an offset well beyond the + * end of the buffer. If no characters for an element have yet been read, + * this will be -1. + * + * @private + * @type {!number} + */ + var elementEnd = -1; + + /** + * The character offset within the buffer of the location that the parser + * should start looking for the next element length search or next element + * value. + * + * @private + * @type {!number} + */ + var startIndex = 0; + + /** + * The declared length of the current element being parsed, in Unicode + * codepoints. + * + * @private + * @type {!number} + */ + var elementCodepoints = 0; + + /** + * The number of parsed characters that must accumulate in the begining of + * the parse buffer before processing time is expended to truncate that + * buffer and conserve memory. + * + * @private + * @constant + * @type {!number} + */ + var BUFFER_TRUNCATION_THRESHOLD = 4096; + + /** + * The lowest Unicode codepoint to require a surrogate pair when encoded + * with UTF-16. In UTF-16, characters with codepoints at or above this + * value are represented with a surrogate pair, while characters with + * codepoints below this value are represented with a single character. + * + * @private + * @constant + * @type {!number} + */ + var MIN_CODEPOINT_REQUIRES_SURROGATE = 0x10000; + + /** + * Appends the given instruction data packet to the internal buffer of + * this Guacamole.Parser, executing all completed instructions at + * the beginning of this buffer, if any. + * + * @param {!string} packet + * The instruction data to receive. + * + * @param {!boolean} [isBuffer=false] + * Whether the provided data should be treated as an instruction buffer + * that grows continuously. If true, the data provided to receive() + * MUST always start with the data provided to the previous call. If + * false (the default), only the new data should be provided to + * receive(), and previously-received data will automatically be + * buffered by the parser as needed. + */ + this.receive = function receive(packet, isBuffer) { + + if (isBuffer) + buffer = packet; + + else { + + // Truncate buffer as necessary + if (startIndex > BUFFER_TRUNCATION_THRESHOLD && elementEnd >= startIndex) { + + buffer = buffer.substring(startIndex); + + // Reset parse relative to truncation + elementEnd -= startIndex; + startIndex = 0; + + } + + // Append data to buffer ONLY if there is outstanding data present. It + // is otherwise much faster to simply parse the received buffer as-is, + // and tunnel implementations can take advantage of this by preferring + // to send only complete instructions. Both the HTTP and WebSocket + // tunnel implementations included with Guacamole already do this. + if (buffer.length) + buffer += packet; + else + buffer = packet; + + } + + // While search is within currently received data + while (elementEnd < buffer.length) { + + // If we are waiting for element data + if (elementEnd >= startIndex) { + + // If we have enough data in the buffer to fill the element + // value, but the number of codepoints in the expected substring + // containing the element value value is less that its declared + // length, that can only be because the element contains + // characters split between high and low surrogates, and the + // actual end of the element value is further out. The minimum + // number of additional characters that must be read to satisfy + // the declared length is simply the difference between the + // number of codepoints actually present vs. the expected + // length. + var codepoints = Guacamole.Parser.codePointCount(buffer, startIndex, elementEnd); + if (codepoints < elementCodepoints) { + elementEnd += elementCodepoints - codepoints; + continue; + } + + // If the current element ends with a character involving both + // a high and low surrogate, elementEnd points to the low + // surrogate and NOT the element terminator. We must shift the + // end and reevaluate. + else if (elementCodepoints && buffer.codePointAt(elementEnd - 1) >= MIN_CODEPOINT_REQUIRES_SURROGATE) { + elementEnd++; + continue; + } + + // We now have enough data for the element. Parse. + var element = buffer.substring(startIndex, elementEnd); + var terminator = buffer.substring(elementEnd, elementEnd + 1); + + // Add element to array + elementBuffer.push(element); + + // If last element, handle instruction + if (terminator === ';') { + + // Get opcode + var opcode = elementBuffer.shift(); + + // Call instruction handler. + if (parser.oninstruction !== null) + parser.oninstruction(opcode, elementBuffer); + + // Clear elements + elementBuffer = []; + + // Immediately truncate buffer if its contents have been + // completely parsed, so that the next call to receive() + // need not append to the buffer unnecessarily + if (!isBuffer && elementEnd + 1 === buffer.length) { + elementEnd = -1; + buffer = ''; + } + + } + else if (terminator !== ',') + throw new Error('Element terminator of instruction was not ";" nor ",".'); + + // Start searching for length at character after + // element terminator + startIndex = elementEnd + 1; + + } + + // Search for end of length + var lengthEnd = buffer.indexOf('.', startIndex); + if (lengthEnd !== -1) { + + // Parse length + elementCodepoints = parseInt(buffer.substring(elementEnd + 1, lengthEnd)); + if (isNaN(elementCodepoints)) + throw new Error('Non-numeric character in element length.'); + + // Calculate start of element + startIndex = lengthEnd + 1; + + // Calculate location of element terminator + elementEnd = startIndex + elementCodepoints; + + } + + // If no period yet, continue search when more data + // is received + else { + startIndex = buffer.length; + break; + } + + } // end parse loop + + }; + + /** + * Fired once for every complete Guacamole instruction received, in order. + * + * @event + * @param {!string} opcode + * The Guacamole instruction opcode. + * + * @param {!string[]} parameters + * The parameters provided for the instruction, if any. + */ + this.oninstruction = null; + +}; + +/** + * Returns the number of Unicode codepoints (not code units) within the given + * string. If character offsets are provided, only codepoints between those + * offsets are counted. Unlike the length property of a string, this function + * counts proper surrogate pairs as a single codepoint. High and low surrogate + * characters that are not part of a proper surrogate pair are counted + * separately as individual codepoints. + * + * @param {!string} str + * The string whose contents should be inspected. + * + * @param {number} [start=0] + * The index of the location in the given string where codepoint counting + * should start. If omitted, counting will begin at the start of the + * string. + * + * @param {number} [end] + * The index of the first location in the given string after where counting + * should stop (the character after the last character being counted). If + * omitted, all characters after the start location will be counted. + * + * @returns {!number} + * The number of Unicode codepoints within the requested portion of the + * given string. + */ +Guacamole.Parser.codePointCount = function codePointCount(str, start, end) { + + // Count only characters within the specified region + str = str.substring(start || 0, end); + + // Locate each proper Unicode surrogate pair (one high surrogate followed + // by one low surrogate) + var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); + + // Each surrogate pair represents a single codepoint but is represented by + // two characters in a JavaScript string, and thus is counted twice toward + // string length. Subtracting the number of surrogate pairs adjusts that + // length value such that it gives us the number of codepoints. + return str.length - (surrogatePairs ? surrogatePairs.length : 0); + +}; + +/** + * Converts each of the values within the given array to strings, formatting + * those strings as length-prefixed elements of a complete Guacamole + * instruction. + * + * @param {!Array.<*>} elements + * The values that should be encoded as the elements of a Guacamole + * instruction. Order of these elements is preserved. This array MUST have + * at least one element. + * + * @returns {!string} + * A complete Guacamole instruction consisting of each of the provided + * element values, in order. + */ +Guacamole.Parser.toInstruction = function toInstruction(elements) { + + /** + * Converts the given value to a length/string pair for use as an + * element in a Guacamole instruction. + * + * @private + * @param {*} value + * The value to convert. + * + * @return {!string} + * The converted value. + */ + var toElement = function toElement(value) { + var str = '' + value; + return Guacamole.Parser.codePointCount(str) + "." + str; + }; + + var instr = toElement(elements[0]); + for (var i = 1; i < elements.length; i++) + instr += ',' + toElement(elements[i]); + + return instr + ';'; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Position.js b/guacamole-common-js/src/main/webapp/modules/Position.js new file mode 100644 index 0000000..8c5c4fc --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Position.js @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A position in 2-D space. + * + * @constructor + * @param {Guacamole.Position|object} [template={}] + * The object whose properties should be copied within the new + * Guacamole.Position. + */ +Guacamole.Position = function Position(template) { + + template = template || {}; + + /** + * The current X position, in pixels. + * + * @type {!number} + * @default 0 + */ + this.x = template.x || 0; + + /** + * The current Y position, in pixels. + * + * @type {!number} + * @default 0 + */ + this.y = template.y || 0; + + /** + * Assigns the position represented by the given element and + * clientX/clientY coordinates. The clientX and clientY coordinates are + * relative to the browser viewport and are commonly available within + * JavaScript event objects. The final position is translated to + * coordinates that are relative the given element. + * + * @param {!Element} element + * The element the coordinates should be relative to. + * + * @param {!number} clientX + * The viewport-relative X coordinate to translate. + * + * @param {!number} clientY + * The viewport-relative Y coordinate to translate. + */ + this.fromClientPosition = function fromClientPosition(element, clientX, clientY) { + + this.x = clientX - element.offsetLeft; + this.y = clientY - element.offsetTop; + + // This is all JUST so we can get the position within the element + var parent = element.offsetParent; + while (parent && !(parent === document.body)) { + this.x -= parent.offsetLeft - parent.scrollLeft; + this.y -= parent.offsetTop - parent.scrollTop; + + parent = parent.offsetParent; + } + + // Element ultimately depends on positioning within document body, + // take document scroll into account. + if (parent) { + var documentScrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft; + var documentScrollTop = document.body.scrollTop || document.documentElement.scrollTop; + + this.x -= parent.offsetLeft - documentScrollLeft; + this.y -= parent.offsetTop - documentScrollTop; + } + + }; + +}; + +/** + * Returns a new {@link Guacamole.Position} representing the relative position + * of the given clientX/clientY coordinates within the given element. The + * clientX and clientY coordinates are relative to the browser viewport and are + * commonly available within JavaScript event objects. The final position is + * translated to coordinates that are relative the given element. + * + * @param {!Element} element + * The element the coordinates should be relative to. + * + * @param {!number} clientX + * The viewport-relative X coordinate to translate. + * + * @param {!number} clientY + * The viewport-relative Y coordinate to translate. + * + * @returns {!Guacamole.Position} + * A new Guacamole.Position representing the relative position of the given + * client coordinates. + */ +Guacamole.Position.fromClientPosition = function fromClientPosition(element, clientX, clientY) { + var position = new Guacamole.Position(); + position.fromClientPosition(element, clientX, clientY); + return position; +}; diff --git a/guacamole-common-js/src/main/webapp/modules/RawAudioFormat.js b/guacamole-common-js/src/main/webapp/modules/RawAudioFormat.js new file mode 100644 index 0000000..b2fd6ce --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/RawAudioFormat.js @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A description of the format of raw PCM audio, such as that used by + * Guacamole.RawAudioPlayer and Guacamole.RawAudioRecorder. This object + * describes the number of bytes per sample, the number of channels, and the + * overall sample rate. + * + * @constructor + * @param {!(Guacamole.RawAudioFormat|object)} template + * The object whose properties should be copied into the corresponding + * properties of the new Guacamole.RawAudioFormat. + */ +Guacamole.RawAudioFormat = function RawAudioFormat(template) { + + /** + * The number of bytes in each sample of audio data. This value is + * independent of the number of channels. + * + * @type {!number} + */ + this.bytesPerSample = template.bytesPerSample; + + /** + * The number of audio channels (ie: 1 for mono, 2 for stereo). + * + * @type {!number} + */ + this.channels = template.channels; + + /** + * The number of samples per second, per channel. + * + * @type {!number} + */ + this.rate = template.rate; + +}; + +/** + * Parses the given mimetype, returning a new Guacamole.RawAudioFormat + * which describes the type of raw audio data represented by that mimetype. If + * the mimetype is not a supported raw audio data mimetype, null is returned. + * + * @param {!string} mimetype + * The audio mimetype to parse. + * + * @returns {Guacamole.RawAudioFormat} + * A new Guacamole.RawAudioFormat which describes the type of raw + * audio data represented by the given mimetype, or null if the given + * mimetype is not supported. + */ +Guacamole.RawAudioFormat.parse = function parseFormat(mimetype) { + + var bytesPerSample; + + // Rate is absolutely required - if null is still present later, the + // mimetype must not be supported + var rate = null; + + // Default for both "audio/L8" and "audio/L16" is one channel + var channels = 1; + + // "audio/L8" has one byte per sample + if (mimetype.substring(0, 9) === 'audio/L8;') { + mimetype = mimetype.substring(9); + bytesPerSample = 1; + } + + // "audio/L16" has two bytes per sample + else if (mimetype.substring(0, 10) === 'audio/L16;') { + mimetype = mimetype.substring(10); + bytesPerSample = 2; + } + + // All other types are unsupported + else + return null; + + // Parse all parameters + var parameters = mimetype.split(','); + for (var i = 0; i < parameters.length; i++) { + + var parameter = parameters[i]; + + // All parameters must have an equals sign separating name from value + var equals = parameter.indexOf('='); + if (equals === -1) + return null; + + // Parse name and value from parameter string + var name = parameter.substring(0, equals); + var value = parameter.substring(equals+1); + + // Handle each supported parameter + switch (name) { + + // Number of audio channels + case 'channels': + channels = parseInt(value); + break; + + // Sample rate + case 'rate': + rate = parseInt(value); + break; + + // All other parameters are unsupported + default: + return null; + + } + + }; + + // The rate parameter is required + if (rate === null) + return null; + + // Return parsed format details + return new Guacamole.RawAudioFormat({ + bytesPerSample : bytesPerSample, + channels : channels, + rate : rate + }); + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/SessionRecording.js b/guacamole-common-js/src/main/webapp/modules/SessionRecording.js new file mode 100644 index 0000000..819854b --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/SessionRecording.js @@ -0,0 +1,1348 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A recording of a Guacamole session. Given a {@link Guacamole.Tunnel} or Blob, + * the Guacamole.SessionRecording automatically parses Guacamole instructions + * within the recording source as it plays back the recording. Playback of the + * recording may be controlled through function calls to the + * Guacamole.SessionRecording, even while the recording has not yet finished + * being created or downloaded. Parsing of the contents of the recording will + * begin immediately and automatically after this constructor is invoked. + * + * @constructor + * @param {!Blob|Guacamole.Tunnel} source + * The Blob from which the instructions of the recording should + * be read. + * @param {number} [refreshInterval=1000] + * The minimum number of milliseconds between updates to the recording + * position through the provided onseek() callback. If non-positive, this + * parameter will be ignored, and the recording position will only be + * updated when seek requests are made, or when new frames are rendered. + * If not specified, refreshInterval will default to 1000 milliseconds. + */ +Guacamole.SessionRecording = function SessionRecording(source, refreshInterval) { + + // Default the refresh interval to 1 second if not specified otherwise + if (refreshInterval === undefined) + refreshInterval = 1000; + + /** + * Reference to this Guacamole.SessionRecording. + * + * @private + * @type {!Guacamole.SessionRecording} + */ + var recording = this; + + /** + * The Blob from which the instructions of the recording should be read. + * Note that this value is initialized far below. + * + * @private + * @type {!Blob} + */ + var recordingBlob; + + /** + * The tunnel from which the recording should be read, if the recording is + * being read from a tunnel. If the recording was supplied as a Blob, this + * will be null. + * + * @private + * @type {Guacamole.Tunnel} + */ + var tunnel = null; + + /** + * The number of bytes that this Guacamole.SessionRecording should attempt + * to read from the given blob in each read operation. Larger blocks will + * generally read the blob more quickly, but may result in excessive + * time being spent within the parser, making the page unresponsive + * while the recording is loading. + * + * @private + * @constant + * @type {Number} + */ + var BLOCK_SIZE = 262144; + + /** + * The minimum number of characters which must have been read between + * keyframes. + * + * @private + * @constant + * @type {Number} + */ + var KEYFRAME_CHAR_INTERVAL = 16384; + + /** + * The minimum number of milliseconds which must elapse between keyframes. + * + * @private + * @constant + * @type {Number} + */ + var KEYFRAME_TIME_INTERVAL = 5000; + + /** + * All frames parsed from the provided blob. + * + * @private + * @type {!Guacamole.SessionRecording._Frame[]} + */ + var frames = []; + + /** + * The timestamp of the last frame which was flagged for use as a keyframe. + * If no timestamp has yet been flagged, this will be 0. + * + * @private + * @type {!number} + */ + var lastKeyframe = 0; + + /** + * Tunnel which feeds arbitrary instructions to the client used by this + * Guacamole.SessionRecording for playback of the session recording. + * + * @private + * @type {!Guacamole.SessionRecording._PlaybackTunnel} + */ + var playbackTunnel = new Guacamole.SessionRecording._PlaybackTunnel(); + + /** + * Guacamole.Client instance used for visible playback of the session + * recording. + * + * @private + * @type {!Guacamole.Client} + */ + var playbackClient = new Guacamole.Client(playbackTunnel); + + /** + * The current frame rendered within the playback client. If no frame is + * yet rendered, this will be -1. + * + * @private + * @type {!number} + */ + var currentFrame = -1; + + /** + * The position of the recording when playback began, in milliseconds. If + * playback is not in progress, this will be null. + * + * @private + * @type {number} + */ + var startVideoPosition = null; + + /** + * The real-world timestamp when playback began, in milliseconds. If + * playback is not in progress, this will be null. + * + * @private + * @type {number} + */ + var startRealTimestamp = null; + + /** + * The current position within the recording, in milliseconds. + * + * @private + * @type {!number} + */ + var currentPosition = 0; + + /** + * An object containing a single "aborted" property which is set to + * true if the in-progress seek operation should be aborted. If no seek + * operation is in progress, this will be null. + * + * @private + * @type {object} + */ + var activeSeek = null; + + /** + * The byte offset within the recording blob of the first character of + * the first instruction of the current frame. Here, "current frame" + * refers to the frame currently being parsed when the provided + * recording is initially loading. If the recording is not being + * loaded, this value has no meaning. + * + * @private + * @type {!number} + */ + var frameStart = 0; + + /** + * The byte offset within the recording blob of the character which + * follows the last character of the most recently parsed instruction + * of the current frame. Here, "current frame" refers to the frame + * currently being parsed when the provided recording is initially + * loading. If the recording is not being loaded, this value has no + * meaning. + * + * @private + * @type {!number} + */ + var frameEnd = 0; + + /** + * Whether the initial loading process has been aborted. If the loading + * process has been aborted, no further blocks of data should be read + * from the recording. + * + * @private + * @type {!boolean} + */ + var aborted = false; + + /** + * The function to invoke when the seek operation initiated by a call + * to seek() is cancelled or successfully completed. If no seek + * operation is in progress, this will be null. + * + * @private + * @type {function} + */ + var seekCallback = null; + + /** + * Any current timeout associated with scheduling frame replay, or updating + * the current position, or null if no frame position increment is currently + * scheduled. + * + * @private + * @type {number} + */ + var updateTimeout = null; + + /** + * The browser timestamp of the last time that currentPosition was updated + * while playing, or null if the recording is not currently playing. + * + * @private + * @type {number} + */ + var lastUpdateTimestamp = null; + + /** + * Parses all Guacamole instructions within the given blob, invoking + * the provided instruction callback for each such instruction. Once + * the end of the blob has been reached (no instructions remain to be + * parsed), the provided completion callback is invoked. If a parse + * error prevents reading instructions from the blob, the onerror + * callback of the Guacamole.SessionRecording is invoked, and no further + * data is handled within the blob. + * + * @private + * @param {!Blob} blob + * The blob to parse Guacamole instructions from. + * + * @param {function} [instructionCallback] + * The callback to invoke for each Guacamole instruction read from + * the given blob. This function must accept the same arguments + * as the oninstruction handler of Guacamole.Parser. + * + * @param {function} [completionCallback] + * The callback to invoke once all instructions have been read from + * the given blob. + */ + var parseBlob = function parseBlob(blob, instructionCallback, completionCallback) { + + // Do not read any further blocks if loading has been aborted + if (aborted && blob === recordingBlob) + return; + + // Prepare a parser to handle all instruction data within the blob, + // automatically invoking the provided instruction callback for all + // parsed instructions + var parser = new Guacamole.Parser(); + parser.oninstruction = instructionCallback; + + var offset = 0; + var reader = new FileReader(); + + /** + * Reads the block of data at offset bytes within the blob. If no + * such block exists, then the completion callback provided to + * parseBlob() is invoked as all data has been read. + * + * @private + */ + var readNextBlock = function readNextBlock() { + + // Do not read any further blocks if loading has been aborted + if (aborted && blob === recordingBlob) + return; + + // Parse all instructions within the block, invoking the + // onerror handler if a parse error occurs + if (reader.readyState === 2 /* DONE */) { + try { + parser.receive(reader.result); + } + catch (parseError) { + if (recording.onerror) { + recording.onerror(parseError.message); + } + return; + } + } + + // If no data remains, the read operation is complete and no + // further blocks need to be read + if (offset >= blob.size) { + if (completionCallback) + completionCallback(); + } + + // Otherwise, read the next block + else { + var block = blob.slice(offset, offset + BLOCK_SIZE); + offset += block.size; + reader.readAsText(block); + } + + }; + + // Read blocks until the end of the given blob is reached + reader.onload = readNextBlock; + readNextBlock(); + + }; + + /** + * Calculates the size in bytes of the given UTF8 string. + * + * @private + * @param {!string} str + * The string to calculate the size in bytes. + * + * @returns {!number} + * The size in bytes of the given string. + */ + var getUtf8StringByteSize = function(str) { + + var byteSize = str.length; + for (var i = str.length - 1; i >= 0; i--) { + var code = str.charCodeAt(i); + // A UTF8 character with such a code will be stored + // using two bytes. So we add one byte to the + // original string length to get the byte size. + if (code > 0x7F && code <= 0x7FF) + byteSize++; + // This is either a 3 byte UTF8 character or a low + // surrogate of a character which JavaSript + // interprets as two separate codes. More details: + // https://mathiasbynens.be/notes/javascript-encoding + else if (code > 0x7FF && code <= 0xFFFF) + byteSize += 2; + // If this is the low (trail) surrogate, we must skip + // the high surrogate code (i - 1). We already have + // the original length for two separate codes (this is + // how JavaScript interprets the character) plus + // we added two bytes at the previous step. + // Overall, 4 bytes for the character. + if (code >= 0xDC00 && code <= 0xDFFF) + i--; + } + return byteSize; + + }; + + /** + * Calculates the size of the given Guacamole instruction element, in + * bytes. This is necessary because the recording is stored as a Blob + * and we need to know the start and end positions of a frame (i.e. + * all the instructions which make up the frame). + * The size returned includes the characters which + * make up the length, the "." separator between the length and the + * element itself, and the "," or ";" terminator which follows the + * element. + * + * @private + * @param {!string} value + * The value of the element which has already been parsed (lacks + * the initial length, "." separator, and "," or ";" terminator). + * + * @returns {!number} + * The number of bytes which would make up the given + * element within a Guacamole instruction to be stored in Blob. + */ + var getElementSize = function getElementSize(value) { + + // Calculate base size, assuming at least one digit, the "." + // separator, and the "," or ";" terminator + var byteSize = getUtf8StringByteSize(value) + 3; + + // We need this to calculate the size of the length substring. + var valueLength = Guacamole.Parser.codePointCount(value); + + // Add one character for each additional digit that would occur + // in the element length prefix + while (valueLength >= 10) { + byteSize++; + valueLength = Math.floor(valueLength / 10); + } + + return byteSize; + + }; + + // Start playback client connected + playbackClient.connect(); + + // Hide cursor unless mouse position is received + playbackClient.getDisplay().showCursor(false); + + /** + * A key event interpreter to split all key events in this recording into + * human-readable batches of text. Constrcution is deferred until the first + * event is processed, to enable recording-relative timestamps. + * + * @type {!Guacamole.KeyEventInterpreter} + */ + var keyEventInterpreter = null; + + /** + * Initialize the key interpreter. This function should be called only once + * with the first timestamp in the recording as an argument. + * + * @private + * @param {!number} startTimestamp + * The timestamp of the first frame in the recording, i.e. the start of + * the recording. + */ + function initializeKeyInterpreter(startTimestamp) { + keyEventInterpreter = new Guacamole.KeyEventInterpreter(startTimestamp); + } + + /** + * Handles a newly-received instruction, whether from the main Blob or a + * tunnel, adding new frames and keyframes as necessary. Load progress is + * reported via onprogress automatically. + * + * @private + * @param {!string} opcode + * The opcode of the instruction to handle. + * + * @param {!string[]} args + * The arguments of the received instruction, if any. + */ + var loadInstruction = function loadInstruction(opcode, args) { + + // Advance end of frame by overall length of parsed instruction + frameEnd += getElementSize(opcode); + for (var i = 0; i < args.length; i++) + frameEnd += getElementSize(args[i]); + + // Once a sync is received, store all instructions since the last + // frame as a new frame + if (opcode === 'sync') { + + // Parse frame timestamp from sync instruction + var timestamp = parseInt(args[0]); + + // Add a new frame containing the instructions read since last frame + var frame = new Guacamole.SessionRecording._Frame(timestamp, frameStart, frameEnd); + frames.push(frame); + frameStart = frameEnd; + + // If this is the first frame, intialize the key event interpreter + // with the timestamp of the first frame + if (frames.length === 1) + initializeKeyInterpreter(timestamp); + + // This frame should eventually become a keyframe if enough data + // has been processed and enough recording time has elapsed, or if + // this is the absolute first frame + if (frames.length === 1 || (frameEnd - frames[lastKeyframe].start >= KEYFRAME_CHAR_INTERVAL + && timestamp - frames[lastKeyframe].timestamp >= KEYFRAME_TIME_INTERVAL)) { + frame.keyframe = true; + lastKeyframe = frames.length - 1; + + } + + // Notify that additional content is available + if (recording.onprogress) + recording.onprogress(recording.getDuration(), frameEnd); + + } + + else if (opcode === 'key') + keyEventInterpreter.handleKeyEvent(args); + }; + + /** + * Notifies that the session recording has been fully loaded. If the onload + * handler has not been defined, this function has no effect. + * + * @private + */ + var notifyLoaded = function notifyLoaded() { + if (recording.onload) + recording.onload(); + }; + + // Read instructions from provided blob, extracting each frame + if (source instanceof Blob) { + recordingBlob = source; + parseBlob(recordingBlob, loadInstruction, notifyLoaded); + } + + // If tunnel provided instead of Blob, extract frames, etc. as instructions + // are received, buffering things into a Blob for future seeks + else { + + tunnel = source; + recordingBlob = new Blob(); + + var errorEncountered = false; + var instructionBuffer = ''; + + // Read instructions from provided tunnel, extracting each frame + tunnel.oninstruction = function handleInstruction(opcode, args) { + + // Reconstitute received instruction + instructionBuffer += opcode.length + '.' + opcode; + args.forEach(function appendArg(arg) { + instructionBuffer += ',' + arg.length + '.' + arg; + }); + instructionBuffer += ';'; + + // Append to Blob (creating a new Blob in the process) + if (instructionBuffer.length >= BLOCK_SIZE) { + recordingBlob = new Blob([recordingBlob, instructionBuffer]); + instructionBuffer = ''; + } + + // Load parsed instruction into recording + loadInstruction(opcode, args); + + }; + + // Report any errors encountered + tunnel.onerror = function tunnelError(status) { + errorEncountered = true; + if (recording.onerror) + recording.onerror(status.message); + }; + + tunnel.onstatechange = function tunnelStateChanged(state) { + if (state === Guacamole.Tunnel.State.CLOSED) { + + // Append any remaining instructions + if (instructionBuffer.length) { + recordingBlob = new Blob([recordingBlob, instructionBuffer]); + instructionBuffer = ''; + } + + // Now that the recording is fully processed, and all key events + // have been extracted, call the onkeyevents handler if defined + if (recording.onkeyevents) + recording.onkeyevents(keyEventInterpreter.getEvents()); + + // Consider recording loaded if tunnel has closed without errors + if (!errorEncountered) + notifyLoaded(); + } + }; + + } + + /** + * Converts the given absolute timestamp to a timestamp which is relative + * to the first frame in the recording. + * + * @private + * @param {!number} timestamp + * The timestamp to convert to a relative timestamp. + * + * @returns {!number} + * The difference in milliseconds between the given timestamp and the + * first frame of the recording, or zero if no frames yet exist. + */ + var toRelativeTimestamp = function toRelativeTimestamp(timestamp) { + + // If no frames yet exist, all timestamps are zero + if (frames.length === 0) + return 0; + + // Calculate timestamp relative to first frame + return timestamp - frames[0].timestamp; + + }; + + /** + * Searches through the given region of frames for the closest frame + * having a relative timestamp less than or equal to the to the given + * relative timestamp. + * + * @private + * @param {!number} minIndex + * The index of the first frame in the region (the frame having the + * smallest timestamp). + * + * @param {!number} maxIndex + * The index of the last frame in the region (the frame having the + * largest timestamp). + * + * @param {!number} timestamp + * The relative timestamp to search for, where zero denotes the first + * frame in the recording. + * + * @returns {!number} + * The index of the frame having a relative timestamp closest to the + * given value. + */ + var findFrame = function findFrame(minIndex, maxIndex, timestamp) { + + // The region has only one frame - determine if it is before or after + // the requested timestamp + if (minIndex === maxIndex) { + + // Skip checking if this is the very first frame - no frame could + // possibly be earlier + if (minIndex === 0) + return minIndex; + + // If the closest frame occured after the requested timestamp, + // return the previous frame, which will be the closest with a + // timestamp before the requested timestamp + if (toRelativeTimestamp(frames[minIndex].timestamp) > timestamp) + return minIndex - 1; + + } + + // Split search region into two halves + var midIndex = Math.floor((minIndex + maxIndex) / 2); + var midTimestamp = toRelativeTimestamp(frames[midIndex].timestamp); + + // If timestamp is within lesser half, search again within that half + if (timestamp < midTimestamp && midIndex > minIndex) + return findFrame(minIndex, midIndex - 1, timestamp); + + // If timestamp is within greater half, search again within that half + if (timestamp > midTimestamp && midIndex < maxIndex) + return findFrame(midIndex + 1, maxIndex, timestamp); + + // Otherwise, we lucked out and found a frame with exactly the + // desired timestamp + return midIndex; + + }; + + /** + * Replays the instructions associated with the given frame, sending those + * instructions to the playback client. + * + * @private + * @param {!number} index + * The index of the frame within the frames array which should be + * replayed. + * + * @param {function} callback + * The callback to invoke once replay of the frame has completed. + */ + var replayFrame = function replayFrame(index, callback) { + + var frame = frames[index]; + + // Replay all instructions within the retrieved frame + parseBlob(recordingBlob.slice(frame.start, frame.end), function handleInstruction(opcode, args) { + playbackTunnel.receiveInstruction(opcode, args); + }, function replayCompleted() { + + // Store client state if frame is flagged as a keyframe + if (frame.keyframe && !frame.clientState) { + playbackClient.exportState(function storeClientState(state) { + frame.clientState = new Blob([JSON.stringify(state)]); + }); + } + + // Update state to correctly represent the current frame + currentFrame = index; + + if (callback) + callback(); + + }); + + }; + + /** + * Moves the playback position to the given frame, resetting the state of + * the playback client and replaying frames as necessary. The seek + * operation will proceed asynchronously. If a seek operation is already in + * progress, that seek is first aborted. The progress of the seek operation + * can be observed through the onseek handler and the provided callback. + * + * @private + * @param {!number} index + * The index of the frame which should become the new playback + * position. + * + * @param {function} callback + * The callback to invoke once the seek operation has completed. + * + * @param {number} [nextRealTimestamp] + * The timestamp of the point in time that the given frame should be + * displayed, as would be returned by new Date().getTime(). If omitted, + * the frame will be displayed as soon as possible. + */ + var seekToFrame = function seekToFrame(index, callback, nextRealTimestamp) { + + // Abort any in-progress seek + abortSeek(); + + // Note that a new seek operation is in progress + var thisSeek = activeSeek = { + aborted : false + }; + + var startIndex = index; + + // Replay any applicable incremental frames + var continueReplay = function continueReplay() { + + // Set the current position and notify changes + if (recording.onseek && currentFrame > startIndex) { + currentPosition = toRelativeTimestamp(frames[currentFrame].timestamp); + recording.onseek(currentPosition, currentFrame - startIndex, + index - startIndex); + } + + // Cancel seek if aborted + if (thisSeek.aborted) + return; + + // If frames remain, replay the next frame + if (currentFrame < index) + replayFrame(currentFrame + 1, continueReplay); + + // Otherwise, the seek operation is completed + else + callback(); + + }; + + // Continue replay after requested delay has elapsed, or + // immediately if no delay was requested + var continueAfterRequiredDelay = function continueAfterRequiredDelay() { + var delay = nextRealTimestamp ? Math.max(nextRealTimestamp - new Date().getTime(), 0) : 0; + if (delay) { + + // Clear any already-scheduled update before scheduling again + // to avoid multiple updates in flight at the same time + updateTimeout && clearTimeout(updateTimeout); + + // Schedule with the appropriate delay + updateTimeout = window.setTimeout(function timeoutComplete() { + updateTimeout = null; + continueReplay(); + }, delay); + } + else + continueReplay(); + }; + + // Back up until startIndex represents current state + for (; startIndex >= 0; startIndex--) { + + var frame = frames[startIndex]; + + // If we've reached the current frame, startIndex represents + // current state by definition + if (startIndex === currentFrame) + break; + + // If frame has associated absolute state, make that frame the + // current state + if (frame.clientState) { + frame.clientState.text().then(function textReady(text) { + playbackClient.importState(JSON.parse(text)); + currentFrame = startIndex; + continueAfterRequiredDelay(); + }); + return; + } + + } + + continueAfterRequiredDelay(); + + }; + + /** + * Aborts the seek operation currently in progress, if any. If no seek + * operation is in progress, this function has no effect. + * + * @private + */ + var abortSeek = function abortSeek() { + if (activeSeek) { + activeSeek.aborted = true; + activeSeek = null; + } + }; + + /** + * Advances playback to the next frame in the frames array and schedules + * playback of the frame following that frame based on their associated + * timestamps. If no frames exist after the next frame, playback is paused. + * + * @private + */ + var continuePlayback = function continuePlayback() { + + // Do not continue playback if the recording is paused + if (!recording.isPlaying()) + return; + + // If frames remain after advancing, schedule next frame + if (currentFrame + 1 < frames.length) { + + // Pull the upcoming frame + var next = frames[currentFrame + 1]; + + // The number of elapsed milliseconds on the clock since playback began + var realLifePlayTime = Date.now() - startRealTimestamp; + + // The number of milliseconds between the recording position when + // playback started and the position of the next frame + var timestampOffset = ( + toRelativeTimestamp(next.timestamp) - startVideoPosition); + + // The delay until the next frame should be rendered, taking into + // account any accumulated delays from rendering frames so far + var nextFrameDelay = timestampOffset - realLifePlayTime; + + // The delay until the refresh interval would induce an update to + // the current recording position, rounded to the nearest whole + // multiple of refreshInterval to ensure consistent timing for + // refresh intervals even with inconsistent frame timing + var nextRefreshDelay = refreshInterval >= 0 + ? (refreshInterval * (Math.floor( + (currentPosition + refreshInterval) / refreshInterval)) + ) - currentPosition + : nextFrameDelay; + + // If the next frame will occur before the next refresh interval, + // advance to the frame after the appropriate delay + if (nextFrameDelay <= nextRefreshDelay) + + seekToFrame(currentFrame + 1, function frameDelayElapsed() { + + // Record when the timestamp was updated and continue on + lastUpdateTimestamp = Date.now(); + continuePlayback(); + + }, Date.now() + nextFrameDelay); + + // The position needs to be incremented before the next frame + else { + + // Clear any existing update timeout + updateTimeout && window.clearTimeout(updateTimeout); + + updateTimeout = window.setTimeout(function incrementPosition() { + + updateTimeout = null; + + // Update the position + currentPosition += nextRefreshDelay; + + // Notifiy the new position using the onseek handler + if (recording.onseek) + recording.onseek(currentPosition); + + // Record when the timestamp was updated and continue on + lastUpdateTimestamp = Date.now(); + continuePlayback(); + + }, nextRefreshDelay); + } + + } + + // Otherwise stop playback + else + recording.pause(); + + }; + + /** + * Fired when loading of this recording has completed and all frames + * are available. + * + * @event + */ + this.onload = null; + + /** + * Fired when an error occurs which prevents the recording from being + * played back. + * + * @event + * @param {!string} message + * A human-readable message describing the error that occurred. + */ + this.onerror = null; + + /** + * Fired when further loading of this recording has been explicitly + * aborted through a call to abort(). + * + * @event + */ + this.onabort = null; + + /** + * Fired when new frames have become available while the recording is + * being downloaded. + * + * @event + * @param {!number} duration + * The new duration of the recording, in milliseconds. + * + * @param {!number} parsedSize + * The number of bytes that have been loaded/parsed. + */ + this.onprogress = null; + + /** + * Fired whenever playback of the recording has started. + * + * @event + */ + this.onplay = null; + + /** + * Fired whenever playback of the recording has been paused. This may + * happen when playback is explicitly paused with a call to pause(), or + * when playback is implicitly paused due to reaching the end of the + * recording. + * + * @event + */ + this.onpause = null; + + /** + * Fired with all extracted key events when the recording is fully + * processed. The callback will be invoked with an empty list + * if no key events were extracted. + * + * @event + * @param {!Guacamole.KeyEventInterpreter.KeyEvent[]} batch + * The extracted key events. + */ + this.onkeyevents = null; + + /** + * Fired whenever the playback position within the recording changes. + * + * @event + * @param {!number} position + * The new position within the recording, in milliseconds. + * + * @param {!number} current + * The number of frames that have been seeked through. If not + * seeking through multiple frames due to a call to seek(), this + * will be 1. + * + * @param {!number} total + * The number of frames that are being seeked through in the + * current seek operation. If not seeking through multiple frames + * due to a call to seek(), this will be 1. + */ + this.onseek = null; + + /** + * Connects the underlying tunnel, beginning download of the Guacamole + * session. Playback of the Guacamole session cannot occur until at least + * one frame worth of instructions has been downloaded. If the underlying + * recording source is a Blob, this function has no effect. + * + * @param {string} [data] + * The data to send to the tunnel when connecting. + */ + this.connect = function connect(data) { + if (tunnel) + tunnel.connect(data); + }; + + /** + * Disconnects the underlying tunnel, stopping further download of the + * Guacamole session. If the underlying recording source is a Blob, this + * function has no effect. + */ + this.disconnect = function disconnect() { + if (tunnel) + tunnel.disconnect(); + }; + + /** + * Aborts the loading process, stopping further processing of the + * provided data. If the underlying recording source is a Guacamole tunnel, + * it will be disconnected. + */ + this.abort = function abort() { + if (!aborted) { + + aborted = true; + if (recording.onabort) + recording.onabort(); + + if (tunnel) + tunnel.disconnect(); + + } + }; + + /** + * Returns the underlying display of the Guacamole.Client used by this + * Guacamole.SessionRecording for playback. The display contains an Element + * which can be added to the DOM, causing the display (and thus playback of + * the recording) to become visible. + * + * @return {!Guacamole.Display} + * The underlying display of the Guacamole.Client used by this + * Guacamole.SessionRecording for playback. + */ + this.getDisplay = function getDisplay() { + return playbackClient.getDisplay(); + }; + + /** + * Returns whether playback is currently in progress. + * + * @returns {!boolean} + * true if playback is currently in progress, false otherwise. + */ + this.isPlaying = function isPlaying() { + return !!startRealTimestamp; + }; + + /** + * Returns the current playback position within the recording, in + * milliseconds, where zero is the start of the recording. + * + * @returns {!number} + * The current playback position within the recording, in milliseconds. + */ + this.getPosition = function getPosition() { + + return currentPosition; + + }; + + /** + * Returns the duration of this recording, in milliseconds. If the + * recording is still being downloaded, this value will gradually increase. + * + * @returns {!number} + * The duration of this recording, in milliseconds. + */ + this.getDuration = function getDuration() { + + // If no frames yet exist, duration is zero + if (frames.length === 0) + return 0; + + // Recording duration is simply the timestamp of the last frame + return toRelativeTimestamp(frames[frames.length - 1].timestamp); + + }; + + /** + * Begins continuous playback of the recording downloaded thus far. + * Playback of the recording will continue until pause() is invoked or + * until no further frames exist. Playback is initially paused when a + * Guacamole.SessionRecording is created, and must be explicitly started + * through a call to this function. If playback is already in progress, + * this function has no effect. If a seek operation is in progress, + * playback resumes at the current position, and the seek is aborted as if + * completed. + */ + this.play = function play() { + + // If playback is not already in progress and frames remain, + // begin playback + if (!recording.isPlaying() && currentFrame + 1 < frames.length) { + + // Notify that playback is starting + if (recording.onplay) + recording.onplay(); + + // Store timestamp of playback start for relative scheduling of + // future frames + startVideoPosition = currentPosition; + startRealTimestamp = Date.now(); + + // Begin playback of video + lastUpdateTimestamp = Date.now(); + continuePlayback(); + + } + + }; + + /** + * Seeks to the given position within the recording. If the recording is + * currently being played back, playback will continue after the seek is + * performed. If the recording is currently paused, playback will be + * paused after the seek is performed. If a seek operation is already in + * progress, that seek is first aborted. The seek operation will proceed + * asynchronously. + * + * @param {!number} position + * The position within the recording to seek to, in milliseconds. + * + * @param {function} [callback] + * The callback to invoke once the seek operation has completed. + */ + this.seek = function seek(position, callback) { + + // Do not seek if no frames exist + if (frames.length === 0) + return; + + // Abort active seek operation, if any + recording.cancel(); + + // Pause playback, preserving playback state + var originallyPlaying = recording.isPlaying(); + recording.pause(); + + // Restore playback when seek is completed or cancelled + seekCallback = function restorePlaybackState() { + + // Seek is no longer in progress + seekCallback = null; + + // Restore playback state + if (originallyPlaying) { + recording.play(); + originallyPlaying = null; + } + + // Notify that seek has completed + if (callback) + callback(); + + }; + + // Find the index of the closest frame at or before the requested position + var closestFrame = findFrame(0, frames.length - 1, position); + + // Seek to the closest frame before or at the requested position + seekToFrame(closestFrame, function seekComplete() { + + // Update the current position to the requested position + // and invoke the the onseek callback. Note that this is the + // position provided to this function, NOT the position of the + // frame that was just seeked + currentPosition = position; + if (recording.onseek) + recording.onseek(position); + + seekCallback(); + + }); + + }; + + /** + * Cancels the current seek operation, setting the current frame of the + * recording to wherever the seek operation was able to reach prior to + * being cancelled. If a callback was provided to seek(), that callback + * is invoked. If a seek operation is not currently underway, this + * function has no effect. + */ + this.cancel = function cancel() { + if (seekCallback) { + abortSeek(); + seekCallback(); + } + }; + + /** + * Pauses playback of the recording, if playback is currently in progress. + * If playback is not in progress, this function has no effect. If a seek + * operation is in progress, the seek is aborted. Playback is initially + * paused when a Guacamole.SessionRecording is created, and must be + * explicitly started through a call to play(). + */ + this.pause = function pause() { + + // Abort any in-progress seek / playback + abortSeek(); + + // Cancel any currently-scheduled updates + updateTimeout && clearTimeout(updateTimeout); + + // Increment the current position by the amount of time passed since the + // the last time it was updated + currentPosition += Date.now() - lastUpdateTimestamp; + + // Stop playback only if playback is in progress + if (recording.isPlaying()) { + + // Notify that playback is stopping + if (recording.onpause) + recording.onpause(); + + // Playback is stopped + lastUpdateTimestamp = null; + startVideoPosition = null; + startRealTimestamp = null; + + } + + }; + +}; + +/** + * A single frame of Guacamole session data. Each frame is made up of the set + * of instructions used to generate that frame, and the timestamp as dictated + * by the "sync" instruction terminating the frame. Optionally, a frame may + * also be associated with a snapshot of Guacamole client state, such that the + * frame can be rendered without replaying all previous frames. + * + * @private + * @constructor + * @param {!number} timestamp + * The timestamp of this frame, as dictated by the "sync" instruction which + * terminates the frame. + * + * @param {!number} start + * The byte offset within the blob of the first character of the first + * instruction of this frame. + * + * @param {!number} end + * The byte offset within the blob of character which follows the last + * character of the last instruction of this frame. + */ +Guacamole.SessionRecording._Frame = function _Frame(timestamp, start, end) { + + /** + * Whether this frame should be used as a keyframe if possible. This value + * is purely advisory. The stored clientState must eventually be manually + * set for the frame to be used as a keyframe. By default, frames are not + * keyframes. + * + * @type {!boolean} + * @default false + */ + this.keyframe = false; + + /** + * The timestamp of this frame, as dictated by the "sync" instruction which + * terminates the frame. + * + * @type {!number} + */ + this.timestamp = timestamp; + + /** + * The byte offset within the blob of the first character of the first + * instruction of this frame. + * + * @type {!number} + */ + this.start = start; + + /** + * The byte offset within the blob of character which follows the last + * character of the last instruction of this frame. + * + * @type {!number} + */ + this.end = end; + + /** + * A snapshot of client state after this frame was rendered, as returned by + * a call to exportState(), serialized as JSON, and stored within a Blob. + * Use of Blobs here is required to ensure the browser can make use of + * larger disk-backed storage if the size of the recording is large. If no + * such snapshot has been taken, this will be null. + * + * @type {Blob} + * @default null + */ + this.clientState = null; + +}; + +/** + * A read-only Guacamole.Tunnel implementation which streams instructions + * received through explicit calls to its receiveInstruction() function. + * + * @private + * @constructor + * @augments {Guacamole.Tunnel} + */ +Guacamole.SessionRecording._PlaybackTunnel = function _PlaybackTunnel() { + + /** + * Reference to this Guacamole.SessionRecording._PlaybackTunnel. + * + * @private + * @type {!Guacamole.SessionRecording._PlaybackTunnel} + */ + var tunnel = this; + + this.connect = function connect(data) { + // Do nothing + }; + + this.sendMessage = function sendMessage(elements) { + // Do nothing + }; + + this.disconnect = function disconnect() { + // Do nothing + }; + + /** + * Invokes this tunnel's oninstruction handler, notifying users of this + * tunnel (such as a Guacamole.Client instance) that an instruction has + * been received. If the oninstruction handler has not been set, this + * function has no effect. + * + * @param {!string} opcode + * The opcode of the Guacamole instruction. + * + * @param {!string[]} args + * All arguments associated with this Guacamole instruction. + */ + this.receiveInstruction = function receiveInstruction(opcode, args) { + if (tunnel.oninstruction) + tunnel.oninstruction(opcode, args); + }; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Status.js b/guacamole-common-js/src/main/webapp/modules/Status.js new file mode 100644 index 0000000..19b872f --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Status.js @@ -0,0 +1,322 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A Guacamole status. Each Guacamole status consists of a status code, defined + * by the protocol, and an optional human-readable message, usually only + * included for debugging convenience. + * + * @constructor + * @param {!number} code + * The Guacamole status code, as defined by Guacamole.Status.Code. + * + * @param {string} [message] + * An optional human-readable message. + */ +Guacamole.Status = function(code, message) { + + /** + * Reference to this Guacamole.Status. + * + * @private + * @type {!Guacamole.Status} + */ + var guac_status = this; + + /** + * The Guacamole status code. + * + * @see Guacamole.Status.Code + * @type {!number} + */ + this.code = code; + + /** + * An arbitrary human-readable message associated with this status, if any. + * The human-readable message is not required, and is generally provided + * for debugging purposes only. For user feedback, it is better to translate + * the Guacamole status code into a message. + * + * @type {string} + */ + this.message = message; + + /** + * Returns whether this status represents an error. + * + * @returns {!boolean} + * true if this status represents an error, false otherwise. + */ + this.isError = function() { + return guac_status.code < 0 || guac_status.code > 0x00FF; + }; + +}; + +/** + * Enumeration of all Guacamole status codes. + */ +Guacamole.Status.Code = { + + /** + * The operation succeeded. + * + * @type {!number} + */ + "SUCCESS": 0x0000, + + /** + * The requested operation is unsupported. + * + * @type {!number} + */ + "UNSUPPORTED": 0x0100, + + /** + * The operation could not be performed due to an internal failure. + * + * @type {!number} + */ + "SERVER_ERROR": 0x0200, + + /** + * The operation could not be performed as the server is busy. + * + * @type {!number} + */ + "SERVER_BUSY": 0x0201, + + /** + * The operation could not be performed because the upstream server is not + * responding. + * + * @type {!number} + */ + "UPSTREAM_TIMEOUT": 0x0202, + + /** + * The operation was unsuccessful due to an error or otherwise unexpected + * condition of the upstream server. + * + * @type {!number} + */ + "UPSTREAM_ERROR": 0x0203, + + /** + * The operation could not be performed as the requested resource does not + * exist. + * + * @type {!number} + */ + "RESOURCE_NOT_FOUND": 0x0204, + + /** + * The operation could not be performed as the requested resource is + * already in use. + * + * @type {!number} + */ + "RESOURCE_CONFLICT": 0x0205, + + /** + * The operation could not be performed as the requested resource is now + * closed. + * + * @type {!number} + */ + "RESOURCE_CLOSED": 0x0206, + + /** + * The operation could not be performed because the upstream server does + * not appear to exist. + * + * @type {!number} + */ + "UPSTREAM_NOT_FOUND": 0x0207, + + /** + * The operation could not be performed because the upstream server is not + * available to service the request. + * + * @type {!number} + */ + "UPSTREAM_UNAVAILABLE": 0x0208, + + /** + * The session within the upstream server has ended because it conflicted + * with another session. + * + * @type {!number} + */ + "SESSION_CONFLICT": 0x0209, + + /** + * The session within the upstream server has ended because it appeared to + * be inactive. + * + * @type {!number} + */ + "SESSION_TIMEOUT": 0x020A, + + /** + * The session within the upstream server has been forcibly terminated. + * + * @type {!number} + */ + "SESSION_CLOSED": 0x020B, + + /** + * The operation could not be performed because bad parameters were given. + * + * @type {!number} + */ + "CLIENT_BAD_REQUEST": 0x0300, + + /** + * Permission was denied to perform the operation, as the user is not yet + * authorized (not yet logged in, for example). + * + * @type {!number} + */ + "CLIENT_UNAUTHORIZED": 0x0301, + + /** + * Permission was denied to perform the operation, and this permission will + * not be granted even if the user is authorized. + * + * @type {!number} + */ + "CLIENT_FORBIDDEN": 0x0303, + + /** + * The client took too long to respond. + * + * @type {!number} + */ + "CLIENT_TIMEOUT": 0x0308, + + /** + * The client sent too much data. + * + * @type {!number} + */ + "CLIENT_OVERRUN": 0x030D, + + /** + * The client sent data of an unsupported or unexpected type. + * + * @type {!number} + */ + "CLIENT_BAD_TYPE": 0x030F, + + /** + * The operation failed because the current client is already using too + * many resources. + * + * @type {!number} + */ + "CLIENT_TOO_MANY": 0x031D + +}; + +/** + * Returns the Guacamole protocol status code which most closely + * represents the given HTTP status code. + * + * @param {!number} status + * The HTTP status code to translate into a Guacamole protocol status + * code. + * + * @returns {!number} + * The Guacamole protocol status code which most closely represents the + * given HTTP status code. + */ +Guacamole.Status.Code.fromHTTPCode = function fromHTTPCode(status) { + + // Translate status codes with known equivalents + switch (status) { + + // HTTP 400 - Bad request + case 400: + return Guacamole.Status.Code.CLIENT_BAD_REQUEST; + + // HTTP 403 - Forbidden + case 403: + return Guacamole.Status.Code.CLIENT_FORBIDDEN; + + // HTTP 404 - Resource not found + case 404: + return Guacamole.Status.Code.RESOURCE_NOT_FOUND; + + // HTTP 429 - Too many requests + case 429: + return Guacamole.Status.Code.CLIENT_TOO_MANY; + + // HTTP 503 - Server unavailable + case 503: + return Guacamole.Status.Code.SERVER_BUSY; + + } + + // Default all other codes to generic internal error + return Guacamole.Status.Code.SERVER_ERROR; + +}; + +/** + * Returns the Guacamole protocol status code which most closely + * represents the given WebSocket status code. + * + * @param {!number} code + * The WebSocket status code to translate into a Guacamole protocol + * status code. + * + * @returns {!number} + * The Guacamole protocol status code which most closely represents the + * given WebSocket status code. + */ +Guacamole.Status.Code.fromWebSocketCode = function fromWebSocketCode(code) { + + // Translate status codes with known equivalents + switch (code) { + + // Successful disconnect (no error) + case 1000: // Normal Closure + return Guacamole.Status.Code.SUCCESS; + + // Codes which indicate the server is not reachable + case 1006: // Abnormal Closure (also signalled by JavaScript when the connection cannot be opened in the first place) + case 1015: // TLS Handshake + return Guacamole.Status.Code.UPSTREAM_NOT_FOUND; + + // Codes which indicate the server is reachable but busy/unavailable + case 1001: // Going Away + case 1012: // Service Restart + case 1013: // Try Again Later + case 1014: // Bad Gateway + return Guacamole.Status.Code.UPSTREAM_UNAVAILABLE; + + } + + // Default all other codes to generic internal error + return Guacamole.Status.Code.SERVER_ERROR; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/StringReader.js b/guacamole-common-js/src/main/webapp/modules/StringReader.js new file mode 100644 index 0000000..37b555c --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/StringReader.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A reader which automatically handles the given input stream, returning + * strictly text data. Note that this object will overwrite any installed event + * handlers on the given Guacamole.InputStream. + * + * @constructor + * @param {!Guacamole.InputStream} stream + * The stream that data will be read from. + */ +Guacamole.StringReader = function(stream) { + + /** + * Reference to this Guacamole.InputStream. + * + * @private + * @type {!Guacamole.StringReader} + */ + var guac_reader = this; + + /** + * Parser for received UTF-8 data. + * + * @type {!Guacamole.UTF8Parser} + */ + var utf8Parser = new Guacamole.UTF8Parser(); + + /** + * Wrapped Guacamole.ArrayBufferReader. + * + * @private + * @type {!Guacamole.ArrayBufferReader} + */ + var array_reader = new Guacamole.ArrayBufferReader(stream); + + // Receive blobs as strings + array_reader.ondata = function(buffer) { + + // Decode UTF-8 + var text = utf8Parser.decode(buffer); + + // Call handler, if present + if (guac_reader.ontext) + guac_reader.ontext(text); + + }; + + // Simply call onend when end received + array_reader.onend = function() { + if (guac_reader.onend) + guac_reader.onend(); + }; + + /** + * Fired once for every blob of text data received. + * + * @event + * @param {!string} text + * The data packet received. + */ + this.ontext = null; + + /** + * Fired once this stream is finished and no further data will be written. + * @event + */ + this.onend = null; + +}; \ No newline at end of file diff --git a/guacamole-common-js/src/main/webapp/modules/StringWriter.js b/guacamole-common-js/src/main/webapp/modules/StringWriter.js new file mode 100644 index 0000000..6daeed2 --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/StringWriter.js @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * A writer which automatically writes to the given output stream with text + * data. + * + * @constructor + * @param {!Guacamole.OutputStream} stream + * The stream that data will be written to. + */ +Guacamole.StringWriter = function(stream) { + + /** + * Reference to this Guacamole.StringWriter. + * + * @private + * @type {!Guacamole.StringWriter} + */ + var guac_writer = this; + + /** + * Wrapped Guacamole.ArrayBufferWriter. + * + * @private + * @type {!Guacamole.ArrayBufferWriter} + */ + var array_writer = new Guacamole.ArrayBufferWriter(stream); + + /** + * Internal buffer for UTF-8 output. + * + * @private + * @type {!Uint8Array} + */ + var buffer = new Uint8Array(8192); + + /** + * The number of bytes currently in the buffer. + * + * @private + * @type {!number} + */ + var length = 0; + + // Simply call onack for acknowledgements + array_writer.onack = function(status) { + if (guac_writer.onack) + guac_writer.onack(status); + }; + + /** + * Expands the size of the underlying buffer by the given number of bytes, + * updating the length appropriately. + * + * @private + * @param {!number} bytes + * The number of bytes to add to the underlying buffer. + */ + function __expand(bytes) { + + // Resize buffer if more space needed + if (length+bytes >= buffer.length) { + var new_buffer = new Uint8Array((length+bytes)*2); + new_buffer.set(buffer); + buffer = new_buffer; + } + + length += bytes; + + } + + /** + * Appends a single Unicode character to the current buffer, resizing the + * buffer if necessary. The character will be encoded as UTF-8. + * + * @private + * @param {!number} codepoint + * The codepoint of the Unicode character to append. + */ + function __append_utf8(codepoint) { + + var mask; + var bytes; + + // 1 byte + if (codepoint <= 0x7F) { + mask = 0x00; + bytes = 1; + } + + // 2 byte + else if (codepoint <= 0x7FF) { + mask = 0xC0; + bytes = 2; + } + + // 3 byte + else if (codepoint <= 0xFFFF) { + mask = 0xE0; + bytes = 3; + } + + // 4 byte + else if (codepoint <= 0x1FFFFF) { + mask = 0xF0; + bytes = 4; + } + + // If invalid codepoint, append replacement character + else { + __append_utf8(0xFFFD); + return; + } + + // Offset buffer by size + __expand(bytes); + var offset = length - 1; + + // Add trailing bytes, if any + for (var i=1; i>= 6; + } + + // Set initial byte + buffer[offset] = mask | codepoint; + + } + + /** + * Encodes the given string as UTF-8, returning an ArrayBuffer containing + * the resulting bytes. + * + * @private + * @param {!string} text + * The string to encode as UTF-8. + * + * @return {!Uint8Array} + * The encoded UTF-8 data. + */ + function __encode_utf8(text) { + + // Fill buffer with UTF-8 + for (var i=0; i 0) { + var out_buffer = buffer.subarray(0, length); + length = 0; + return out_buffer; + } + + } + + /** + * Sends the given text. + * + * @param {!string} text + * The text to send. + */ + this.sendText = function(text) { + if (text.length) + array_writer.sendData(__encode_utf8(text)); + }; + + /** + * Signals that no further text will be sent, effectively closing the + * stream. + */ + this.sendEnd = function() { + array_writer.sendEnd(); + }; + + /** + * Fired for received data, if acknowledged by the server. + * + * @event + * @param {!Guacamole.Status} status + * The status of the operation. + */ + this.onack = null; + +}; \ No newline at end of file diff --git a/guacamole-common-js/src/main/webapp/modules/Touch.js b/guacamole-common-js/src/main/webapp/modules/Touch.js new file mode 100644 index 0000000..19aa76b --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Touch.js @@ -0,0 +1,280 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Provides cross-browser multi-touch events for a given element. The events of + * the given element are automatically populated with handlers that translate + * touch events into a non-browser-specific event provided by the + * Guacamole.Touch instance. + * + * @constructor + * @augments Guacamole.Event.Target + * @param {!Element} element + * The Element to use to provide touch events. + */ +Guacamole.Touch = function Touch(element) { + + Guacamole.Event.Target.call(this); + + /** + * Reference to this Guacamole.Touch. + * + * @private + * @type {!Guacamole.Touch} + */ + var guacTouch = this; + + /** + * The default X/Y radius of each touch if the device or browser does not + * expose the size of the contact area. + * + * @private + * @constant + * @type {!number} + */ + var DEFAULT_CONTACT_RADIUS = Math.floor(16 * window.devicePixelRatio); + + /** + * The set of all active touches, stored by their unique identifiers. + * + * @type {!Object.} + */ + this.touches = {}; + + /** + * The number of active touches currently stored within + * {@link Guacamole.Touch#touches touches}. + */ + this.activeTouches = 0; + + /** + * Fired whenever a new touch contact is initiated on the element + * associated with this Guacamole.Touch. + * + * @event Guacamole.Touch#touchstart + * @param {!Guacamole.Touch.Event} event + * A {@link Guacamole.Touch.Event} object representing the "touchstart" + * event. + */ + + /** + * Fired whenever an established touch contact moves within the element + * associated with this Guacamole.Touch. + * + * @event Guacamole.Touch#touchmove + * @param {!Guacamole.Touch.Event} event + * A {@link Guacamole.Touch.Event} object representing the "touchmove" + * event. + */ + + /** + * Fired whenever an established touch contact is lifted from the element + * associated with this Guacamole.Touch. + * + * @event Guacamole.Touch#touchend + * @param {!Guacamole.Touch.Event} event + * A {@link Guacamole.Touch.Event} object representing the "touchend" + * event. + */ + + element.addEventListener('touchstart', function touchstart(e) { + + // Fire "ontouchstart" events for all new touches + for (var i = 0; i < e.changedTouches.length; i++) { + + var changedTouch = e.changedTouches[i]; + var identifier = changedTouch.identifier; + + // Ignore duplicated touches + if (guacTouch.touches[identifier]) + continue; + + var touch = guacTouch.touches[identifier] = new Guacamole.Touch.State({ + id : identifier, + radiusX : changedTouch.radiusX || DEFAULT_CONTACT_RADIUS, + radiusY : changedTouch.radiusY || DEFAULT_CONTACT_RADIUS, + angle : changedTouch.angle || 0.0, + force : changedTouch.force || 1.0 /* Within JavaScript changedTouch events, a force of 0.0 indicates the device does not support reporting changedTouch force */ + }); + + guacTouch.activeTouches++; + + touch.fromClientPosition(element, changedTouch.clientX, changedTouch.clientY); + guacTouch.dispatch(new Guacamole.Touch.Event('touchmove', e, touch)); + + } + + }, false); + + element.addEventListener('touchmove', function touchstart(e) { + + // Fire "ontouchmove" events for all updated touches + for (var i = 0; i < e.changedTouches.length; i++) { + + var changedTouch = e.changedTouches[i]; + var identifier = changedTouch.identifier; + + // Ignore any unrecognized touches + var touch = guacTouch.touches[identifier]; + if (!touch) + continue; + + // Update force only if supported by browser (otherwise, assume + // force is unchanged) + if (changedTouch.force) + touch.force = changedTouch.force; + + // Update touch area, if supported by browser and device + touch.angle = changedTouch.angle || 0.0; + touch.radiusX = changedTouch.radiusX || DEFAULT_CONTACT_RADIUS; + touch.radiusY = changedTouch.radiusY || DEFAULT_CONTACT_RADIUS; + + // Update with any change in position + touch.fromClientPosition(element, changedTouch.clientX, changedTouch.clientY); + guacTouch.dispatch(new Guacamole.Touch.Event('touchmove', e, touch)); + + } + + }, false); + + element.addEventListener('touchend', function touchstart(e) { + + // Fire "ontouchend" events for all updated touches + for (var i = 0; i < e.changedTouches.length; i++) { + + var changedTouch = e.changedTouches[i]; + var identifier = changedTouch.identifier; + + // Ignore any unrecognized touches + var touch = guacTouch.touches[identifier]; + if (!touch) + continue; + + // Stop tracking this particular touch + delete guacTouch.touches[identifier]; + guacTouch.activeTouches--; + + // Touch has ended + touch.force = 0.0; + + // Update with final position + touch.fromClientPosition(element, changedTouch.clientX, changedTouch.clientY); + guacTouch.dispatch(new Guacamole.Touch.Event('touchend', e, touch)); + + } + + }, false); + +}; + +/** + * The current state of a touch contact. + * + * @constructor + * @augments Guacamole.Position + * @param {Guacamole.Touch.State|object} [template={}] + * The object whose properties should be copied within the new + * Guacamole.Touch.State. + */ +Guacamole.Touch.State = function State(template) { + + template = template || {}; + + Guacamole.Position.call(this, template); + + /** + * An arbitrary integer ID which uniquely identifies this contact relative + * to other active contacts. + * + * @type {!number} + * @default 0 + */ + this.id = template.id || 0; + + /** + * The Y radius of the ellipse covering the general area of the touch + * contact, in pixels. + * + * @type {!number} + * @default 0 + */ + this.radiusX = template.radiusX || 0; + + /** + * The X radius of the ellipse covering the general area of the touch + * contact, in pixels. + * + * @type {!number} + * @default 0 + */ + this.radiusY = template.radiusY || 0; + + /** + * The rough angle of clockwise rotation of the general area of the touch + * contact, in degrees. + * + * @type {!number} + * @default 0.0 + */ + this.angle = template.angle || 0.0; + + /** + * The relative force exerted by the touch contact, where 0 is no force + * (the touch has been lifted) and 1 is maximum force (the maximum amount + * of force representable by the device). + * + * @type {!number} + * @default 1.0 + */ + this.force = template.force || 1.0; + +}; + +/** + * An event which represents a change in state of a single touch contact, + * including the creation or removal of that contact. If multiple contacts are + * involved in a touch interaction, each contact will be associated with its + * own event. + * + * @constructor + * @augments Guacamole.Event.DOMEvent + * @param {!string} type + * The name of the touch event type. Possible values are "touchstart", + * "touchmove", and "touchend". + * + * @param {!TouchEvent} event + * The DOM touch event that produced this Guacamole.Touch.Event. + * + * @param {!Guacamole.Touch.State} state + * The state of the touch contact associated with this event. + */ +Guacamole.Touch.Event = function TouchEvent(type, event, state) { + + Guacamole.Event.DOMEvent.call(this, type, [ event ]); + + /** + * The state of the touch contact associated with this event. + * + * @type {!Guacamole.Touch.State} + */ + this.state = state; + +}; diff --git a/guacamole-common-js/src/main/webapp/modules/Tunnel.js b/guacamole-common-js/src/main/webapp/modules/Tunnel.js new file mode 100644 index 0000000..7f2ee0f --- /dev/null +++ b/guacamole-common-js/src/main/webapp/modules/Tunnel.js @@ -0,0 +1,1377 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var Guacamole = Guacamole || {}; + +/** + * Core object providing abstract communication for Guacamole. This object + * is a null implementation whose functions do nothing. Guacamole applications + * should use {@link Guacamole.HTTPTunnel} instead, or implement their own tunnel based + * on this one. + * + * @constructor + * @see Guacamole.HTTPTunnel + */ +Guacamole.Tunnel = function() { + + /** + * Connect to the tunnel with the given optional data. This data is + * typically used for authentication. The format of data accepted is + * up to the tunnel implementation. + * + * @param {string} [data] + * The data to send to the tunnel when connecting. + */ + this.connect = function(data) {}; + + /** + * Disconnect from the tunnel. + */ + this.disconnect = function() {}; + + /** + * Send the given message through the tunnel to the service on the other + * side. All messages are guaranteed to be received in the order sent. + * + * @param {...*} elements + * The elements of the message to send to the service on the other side + * of the tunnel. + */ + this.sendMessage = function(elements) {}; + + /** + * Changes the stored numeric state of this tunnel, firing the onstatechange + * event if the new state is different and a handler has been defined. + * + * @private + * @param {!number} state + * The new state of this tunnel. + */ + this.setState = function(state) { + + // Notify only if state changes + if (state !== this.state) { + this.state = state; + if (this.onstatechange) + this.onstatechange(state); + } + + }; + + /** + * Changes the stored UUID that uniquely identifies this tunnel, firing the + * onuuid event if a handler has been defined. + * + * @private + * @param {string} uuid + * The new state of this tunnel. + */ + this.setUUID = function setUUID(uuid) { + this.uuid = uuid; + if (this.onuuid) + this.onuuid(uuid); + }; + + /** + * Returns whether this tunnel is currently connected. + * + * @returns {!boolean} + * true if this tunnel is currently connected, false otherwise. + */ + this.isConnected = function isConnected() { + return this.state === Guacamole.Tunnel.State.OPEN + || this.state === Guacamole.Tunnel.State.UNSTABLE; + }; + + /** + * The current state of this tunnel. + * + * @type {!number} + */ + this.state = Guacamole.Tunnel.State.CLOSED; + + /** + * The maximum amount of time to wait for data to be received, in + * milliseconds. If data is not received within this amount of time, + * the tunnel is closed with an error. The default value is 15000. + * + * @type {!number} + */ + this.receiveTimeout = 15000; + + /** + * The amount of time to wait for data to be received before considering + * the connection to be unstable, in milliseconds. If data is not received + * within this amount of time, the tunnel status is updated to warn that + * the connection appears unresponsive and may close. The default value is + * 1500. + * + * @type {!number} + */ + this.unstableThreshold = 1500; + + /** + * The UUID uniquely identifying this tunnel. If not yet known, this will + * be null. + * + * @type {string} + */ + this.uuid = null; + + /** + * Fired when the UUID that uniquely identifies this tunnel is known. + * + * @event + * @param {!string} + * The UUID uniquely identifying this tunnel. + */ + this.onuuid = null; + + /** + * Fired whenever an error is encountered by the tunnel. + * + * @event + * @param {!Guacamole.Status} status + * A status object which describes the error. + */ + this.onerror = null; + + /** + * Fired whenever the state of the tunnel changes. + * + * @event + * @param {!number} state + * The new state of the client. + */ + this.onstatechange = null; + + /** + * Fired once for every complete Guacamole instruction received, in order. + * + * @event + * @param {!string} opcode + * The Guacamole instruction opcode. + * + * @param {!string[]} parameters + * The parameters provided for the instruction, if any. + */ + this.oninstruction = null; + +}; + +/** + * The Guacamole protocol instruction opcode reserved for arbitrary internal + * use by tunnel implementations. The value of this opcode is guaranteed to be + * the empty string (""). Tunnel implementations may use this opcode for any + * purpose. It is currently used by the HTTP tunnel to mark the end of the HTTP + * response, and by the WebSocket tunnel to transmit the tunnel UUID and send + * connection stability test pings/responses. + * + * @constant + * @type {!string} + */ +Guacamole.Tunnel.INTERNAL_DATA_OPCODE = ''; + +/** + * All possible tunnel states. + * + * @type {!Object.} + */ +Guacamole.Tunnel.State = { + + /** + * A connection is in pending. It is not yet known whether connection was + * successful. + * + * @type {!number} + */ + "CONNECTING": 0, + + /** + * Connection was successful, and data is being received. + * + * @type {!number} + */ + "OPEN": 1, + + /** + * The connection is closed. Connection may not have been successful, the + * tunnel may have been explicitly closed by either side, or an error may + * have occurred. + * + * @type {!number} + */ + "CLOSED": 2, + + /** + * The connection is open, but communication through the tunnel appears to + * be disrupted, and the connection may close as a result. + * + * @type {!number} + */ + "UNSTABLE" : 3 + +}; + +/** + * Guacamole Tunnel implemented over HTTP via XMLHttpRequest. + * + * @constructor + * @augments Guacamole.Tunnel + * + * @param {!string} tunnelURL + * The URL of the HTTP tunneling service. + * + * @param {boolean} [crossDomain=false] + * Whether tunnel requests will be cross-domain, and thus must use CORS + * mechanisms and headers. By default, it is assumed that tunnel requests + * will be made to the same domain. + * + * @param {object} [extraTunnelHeaders={}] + * Key value pairs containing the header names and values of any additional + * headers to be sent in tunnel requests. By default, no extra headers will + * be added. + */ +Guacamole.HTTPTunnel = function(tunnelURL, crossDomain, extraTunnelHeaders) { + + /** + * Reference to this HTTP tunnel. + * + * @private + * @type {!Guacamole.HTTPTunnel} + */ + var tunnel = this; + + var TUNNEL_CONNECT = tunnelURL + "?connect"; + var TUNNEL_READ = tunnelURL + "?read:"; + var TUNNEL_WRITE = tunnelURL + "?write:"; + + var POLLING_ENABLED = 1; + var POLLING_DISABLED = 0; + + // Default to polling - will be turned off automatically if not needed + var pollingMode = POLLING_ENABLED; + + var sendingMessages = false; + var outputMessageBuffer = ""; + + // If requests are expected to be cross-domain, the cookie that the HTTP + // tunnel depends on will only be sent if withCredentials is true + var withCredentials = !!crossDomain; + + /** + * The current receive timeout ID, if any. + * + * @private + * @type {number} + */ + var receive_timeout = null; + + /** + * The current connection stability timeout ID, if any. + * + * @private + * @type {number} + */ + var unstableTimeout = null; + + /** + * The current connection stability test ping interval ID, if any. This + * will only be set upon successful connection. + * + * @private + * @type {number} + */ + var pingInterval = null; + + /** + * The number of milliseconds to wait between connection stability test + * pings. + * + * @private + * @constant + * @type {!number} + */ + var PING_FREQUENCY = 500; + + /** + * Additional headers to be sent in tunnel requests. This dictionary can be + * populated with key/value header pairs to pass information such as authentication + * tokens, etc. + * + * @private + * @type {!object} + */ + var extraHeaders = extraTunnelHeaders || {}; + + /** + * The name of the HTTP header containing the session token specific to the + * HTTP tunnel implementation. + * + * @private + * @constant + * @type {!string} + */ + var TUNNEL_TOKEN_HEADER = 'Guacamole-Tunnel-Token'; + + /** + * The session token currently assigned to this HTTP tunnel. All distinct + * HTTP tunnel connections will have their own dedicated session token. + * + * @private + * @type {string} + */ + var tunnelSessionToken = null; + + /** + * Adds the configured additional headers to the given request. + * + * @private + * @param {!XMLHttpRequest} request + * The request where the configured extra headers will be added. + * + * @param {!object} headers + * The headers to be added to the request. + */ + function addExtraHeaders(request, headers) { + for (var name in headers) { + request.setRequestHeader(name, headers[name]); + } + } + + /** + * Resets the state of timers tracking network activity and stability. If + * those timers are not yet started, invoking this function starts them. + * This function should be invoked when the tunnel is established and every + * time there is network activity on the tunnel, such that the timers can + * safely assume the network and/or server are not responding if this + * function has not been invoked for a significant period of time. + * + * @private + */ + var resetTimers = function resetTimers() { + + // Get rid of old timeouts (if any) + window.clearTimeout(receive_timeout); + window.clearTimeout(unstableTimeout); + + // Clear unstable status + if (tunnel.state === Guacamole.Tunnel.State.UNSTABLE) + tunnel.setState(Guacamole.Tunnel.State.OPEN); + + // Set new timeout for tracking overall connection timeout + receive_timeout = window.setTimeout(function () { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.UPSTREAM_TIMEOUT, "Server timeout.")); + }, tunnel.receiveTimeout); + + // Set new timeout for tracking suspected connection instability + unstableTimeout = window.setTimeout(function() { + tunnel.setState(Guacamole.Tunnel.State.UNSTABLE); + }, tunnel.unstableThreshold); + + }; + + /** + * Closes this tunnel, signaling the given status and corresponding + * message, which will be sent to the onerror handler if the status is + * an error status. + * + * @private + * @param {!Guacamole.Status} status + * The status causing the connection to close; + */ + function close_tunnel(status) { + + // Get rid of old timeouts (if any) + window.clearTimeout(receive_timeout); + window.clearTimeout(unstableTimeout); + + // Cease connection test pings + window.clearInterval(pingInterval); + + // Ignore if already closed + if (tunnel.state === Guacamole.Tunnel.State.CLOSED) + return; + + // If connection closed abnormally, signal error. + if (status.code !== Guacamole.Status.Code.SUCCESS && tunnel.onerror) { + + // Ignore RESOURCE_NOT_FOUND if we've already connected, as that + // only signals end-of-stream for the HTTP tunnel. + if (tunnel.state === Guacamole.Tunnel.State.CONNECTING + || status.code !== Guacamole.Status.Code.RESOURCE_NOT_FOUND) + tunnel.onerror(status); + + } + + // Reset output message buffer + sendingMessages = false; + + // Mark as closed + tunnel.setState(Guacamole.Tunnel.State.CLOSED); + + } + + + this.sendMessage = function() { + + // Do not attempt to send messages if not connected + if (!tunnel.isConnected()) + return; + + // Do not attempt to send empty messages + if (!arguments.length) + return; + + // Add message to buffer + outputMessageBuffer += Guacamole.Parser.toInstruction(arguments); + + // Send if not currently sending + if (!sendingMessages) + sendPendingMessages(); + + }; + + function sendPendingMessages() { + + // Do not attempt to send messages if not connected + if (!tunnel.isConnected()) + return; + + if (outputMessageBuffer.length > 0) { + + sendingMessages = true; + + var message_xmlhttprequest = new XMLHttpRequest(); + message_xmlhttprequest.open("POST", TUNNEL_WRITE + tunnel.uuid); + message_xmlhttprequest.withCredentials = withCredentials; + addExtraHeaders(message_xmlhttprequest, extraHeaders); + message_xmlhttprequest.setRequestHeader("Content-type", "application/octet-stream"); + message_xmlhttprequest.setRequestHeader(TUNNEL_TOKEN_HEADER, tunnelSessionToken); + + // Once response received, send next queued event. + message_xmlhttprequest.onreadystatechange = function() { + if (message_xmlhttprequest.readyState === 4) { + + resetTimers(); + + // If an error occurs during send, handle it + if (message_xmlhttprequest.status !== 200) + handleHTTPTunnelError(message_xmlhttprequest); + + // Otherwise, continue the send loop + else + sendPendingMessages(); + + } + }; + + message_xmlhttprequest.send(outputMessageBuffer); + outputMessageBuffer = ""; // Clear buffer + + } + else + sendingMessages = false; + + } + + function handleHTTPTunnelError(xmlhttprequest) { + + // Pull status code directly from headers provided by Guacamole + var code = parseInt(xmlhttprequest.getResponseHeader("Guacamole-Status-Code")); + if (code) { + var message = xmlhttprequest.getResponseHeader("Guacamole-Error-Message"); + close_tunnel(new Guacamole.Status(code, message)); + } + + // Failing that, derive a Guacamole status code from the HTTP status + // code provided by the browser + else if (xmlhttprequest.status) + close_tunnel(new Guacamole.Status( + Guacamole.Status.Code.fromHTTPCode(xmlhttprequest.status), + xmlhttprequest.statusText)); + + // Otherwise, assume server is unreachable + else + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.UPSTREAM_NOT_FOUND)); + + } + + function handleResponse(xmlhttprequest) { + + var interval = null; + var nextRequest = null; + + var dataUpdateEvents = 0; + + var parser = new Guacamole.Parser(); + parser.oninstruction = function instructionReceived(opcode, args) { + + // Switch to next request if end-of-stream is signalled + if (opcode === Guacamole.Tunnel.INTERNAL_DATA_OPCODE && args.length === 0) { + + // Reset parser state by simply switching to an entirely new + // parser + parser = new Guacamole.Parser(); + parser.oninstruction = instructionReceived; + + // Clean up interval if polling + if (interval) + clearInterval(interval); + + // Clean up object + xmlhttprequest.onreadystatechange = null; + xmlhttprequest.abort(); + + // Start handling next request + if (nextRequest) + handleResponse(nextRequest); + + } + + // Call instruction handler. + else if (opcode !== Guacamole.Tunnel.INTERNAL_DATA_OPCODE && tunnel.oninstruction) + tunnel.oninstruction(opcode, args); + + }; + + function parseResponse() { + + // Do not handle responses if not connected + if (!tunnel.isConnected()) { + + // Clean up interval if polling + if (interval !== null) + clearInterval(interval); + + return; + } + + // Do not parse response yet if not ready + if (xmlhttprequest.readyState < 2) return; + + // Attempt to read status + var status; + try { status = xmlhttprequest.status; } + + // If status could not be read, assume successful. + catch (e) { status = 200; } + + // Start next request as soon as possible IF request was successful + if (!nextRequest && status === 200) + nextRequest = makeRequest(); + + // Parse stream when data is received and when complete. + if (xmlhttprequest.readyState === 3 || + xmlhttprequest.readyState === 4) { + + resetTimers(); + + // Also poll every 30ms (some browsers don't repeatedly call onreadystatechange for new data) + if (pollingMode === POLLING_ENABLED) { + if (xmlhttprequest.readyState === 3 && !interval) + interval = setInterval(parseResponse, 30); + else if (xmlhttprequest.readyState === 4 && interval) + clearInterval(interval); + } + + // If canceled, stop transfer + if (xmlhttprequest.status === 0) { + tunnel.disconnect(); + return; + } + + // Halt on error during request + else if (xmlhttprequest.status !== 200) { + handleHTTPTunnelError(xmlhttprequest); + return; + } + + // Attempt to read in-progress data + var current; + try { current = xmlhttprequest.responseText; } + + // Do not attempt to parse if data could not be read + catch (e) { return; } + + try { + parser.receive(current, true); + } + catch (e) { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.SERVER_ERROR, e.message)); + return; + } + + } + + } + + // If response polling enabled, attempt to detect if still + // necessary (via wrapping parseResponse()) + if (pollingMode === POLLING_ENABLED) { + xmlhttprequest.onreadystatechange = function() { + + // If we receive two or more readyState==3 events, + // there is no need to poll. + if (xmlhttprequest.readyState === 3) { + dataUpdateEvents++; + if (dataUpdateEvents >= 2) { + pollingMode = POLLING_DISABLED; + xmlhttprequest.onreadystatechange = parseResponse; + } + } + + parseResponse(); + }; + } + + // Otherwise, just parse + else + xmlhttprequest.onreadystatechange = parseResponse; + + parseResponse(); + + } + + /** + * Arbitrary integer, unique for each tunnel read request. + * @private + */ + var request_id = 0; + + function makeRequest() { + + // Make request, increment request ID + var xmlhttprequest = new XMLHttpRequest(); + xmlhttprequest.open("GET", TUNNEL_READ + tunnel.uuid + ":" + (request_id++)); + xmlhttprequest.setRequestHeader(TUNNEL_TOKEN_HEADER, tunnelSessionToken); + xmlhttprequest.withCredentials = withCredentials; + addExtraHeaders(xmlhttprequest, extraHeaders); + xmlhttprequest.send(null); + + return xmlhttprequest; + + } + + this.connect = function(data) { + + // Start waiting for connect + resetTimers(); + + // Mark the tunnel as connecting + tunnel.setState(Guacamole.Tunnel.State.CONNECTING); + + // Start tunnel and connect + var connect_xmlhttprequest = new XMLHttpRequest(); + connect_xmlhttprequest.onreadystatechange = function() { + + if (connect_xmlhttprequest.readyState !== 4) + return; + + // If failure, throw error + if (connect_xmlhttprequest.status !== 200) { + handleHTTPTunnelError(connect_xmlhttprequest); + return; + } + + resetTimers(); + + // Get UUID and HTTP-specific tunnel session token from response + tunnel.setUUID(connect_xmlhttprequest.responseText); + tunnelSessionToken = connect_xmlhttprequest.getResponseHeader(TUNNEL_TOKEN_HEADER); + + // Fail connect attempt if token is not successfully assigned + if (!tunnelSessionToken) { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.UPSTREAM_NOT_FOUND)); + return; + } + + // Mark as open + tunnel.setState(Guacamole.Tunnel.State.OPEN); + + // Ping tunnel endpoint regularly to test connection stability + pingInterval = setInterval(function sendPing() { + tunnel.sendMessage("nop"); + }, PING_FREQUENCY); + + // Start reading data + handleResponse(makeRequest()); + + }; + + connect_xmlhttprequest.open("POST", TUNNEL_CONNECT, true); + connect_xmlhttprequest.withCredentials = withCredentials; + addExtraHeaders(connect_xmlhttprequest, extraHeaders); + connect_xmlhttprequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); + connect_xmlhttprequest.send(data); + + }; + + this.disconnect = function() { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.SUCCESS, "Manually closed.")); + }; + +}; + +Guacamole.HTTPTunnel.prototype = new Guacamole.Tunnel(); + +/** + * Guacamole Tunnel implemented over WebSocket via XMLHttpRequest. + * + * @constructor + * @augments Guacamole.Tunnel + * @param {!string} tunnelURL + * The URL of the WebSocket tunneling service. + */ +Guacamole.WebSocketTunnel = function(tunnelURL) { + + /** + * Reference to this WebSocket tunnel. + * + * @private + * @type {Guacamole.WebSocketTunnel} + */ + var tunnel = this; + + /** + * The parser that this tunnel will use to parse received Guacamole + * instructions. The parser is created when the tunnel is (re-)connected. + * Initially, this will be null. + * + * @private + * @type {Guacamole.Parser} + */ + var parser = null; + + /** + * The WebSocket used by this tunnel. + * + * @private + * @type {WebSocket} + */ + var socket = null; + + /** + * The current receive timeout ID, if any. + * + * @private + * @type {number} + */ + var receive_timeout = null; + + /** + * The current connection stability timeout ID, if any. + * + * @private + * @type {number} + */ + var unstableTimeout = null; + + /** + * The current connection stability test ping timeout ID, if any. This + * will only be set upon successful connection. + * + * @private + * @type {number} + */ + var pingTimeout = null; + + /** + * The WebSocket protocol corresponding to the protocol used for the current + * location. + * + * @private + * @type {!Object.} + */ + var ws_protocol = { + "http:": "ws:", + "https:": "wss:" + }; + + /** + * The number of milliseconds to wait between connection stability test + * pings. + * + * @private + * @constant + * @type {!number} + */ + var PING_FREQUENCY = 500; + + /** + * The timestamp of the point in time that the last connection stability + * test ping was sent, in milliseconds elapsed since midnight of January 1, + * 1970 UTC. + * + * @private + * @type {!number} + */ + var lastSentPing = 0; + + // Transform current URL to WebSocket URL + + // If not already a websocket URL + if ( tunnelURL.substring(0, 3) !== "ws:" + && tunnelURL.substring(0, 4) !== "wss:") { + + var protocol = ws_protocol[window.location.protocol]; + + // If absolute URL, convert to absolute WS URL + if (tunnelURL.substring(0, 1) === "/") + tunnelURL = + protocol + + "//" + window.location.host + + tunnelURL; + + // Otherwise, construct absolute from relative URL + else { + + // Get path from pathname + var slash = window.location.pathname.lastIndexOf("/"); + var path = window.location.pathname.substring(0, slash + 1); + + // Construct absolute URL + tunnelURL = + protocol + + "//" + window.location.host + + path + + tunnelURL; + + } + + } + + /** + * Sends an internal "ping" instruction to the Guacamole WebSocket + * endpoint, verifying network connection stability. If the network is + * stable, the Guacamole server will receive this instruction and respond + * with an identical ping. + * + * @private + */ + var sendPing = function sendPing() { + var currentTime = new Date().getTime(); + tunnel.sendMessage(Guacamole.Tunnel.INTERNAL_DATA_OPCODE, 'ping', currentTime); + lastSentPing = currentTime; + }; + + /** + * Resets the state of timers tracking network activity and stability. If + * those timers are not yet started, invoking this function starts them. + * This function should be invoked when the tunnel is established and every + * time there is network activity on the tunnel, such that the timers can + * safely assume the network and/or server are not responding if this + * function has not been invoked for a significant period of time. + * + * @private + */ + var resetTimers = function resetTimers() { + + // Get rid of old timeouts (if any) + window.clearTimeout(receive_timeout); + window.clearTimeout(unstableTimeout); + window.clearTimeout(pingTimeout); + + // Clear unstable status + if (tunnel.state === Guacamole.Tunnel.State.UNSTABLE) + tunnel.setState(Guacamole.Tunnel.State.OPEN); + + // Set new timeout for tracking overall connection timeout + receive_timeout = window.setTimeout(function () { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.UPSTREAM_TIMEOUT, "Server timeout.")); + }, tunnel.receiveTimeout); + + // Set new timeout for tracking suspected connection instability + unstableTimeout = window.setTimeout(function() { + tunnel.setState(Guacamole.Tunnel.State.UNSTABLE); + }, tunnel.unstableThreshold); + + var currentTime = new Date().getTime(); + var pingDelay = Math.max(lastSentPing + PING_FREQUENCY - currentTime, 0); + + // Ping tunnel endpoint regularly to test connection stability, sending + // the ping immediately if enough time has already elapsed + if (pingDelay > 0) + pingTimeout = window.setTimeout(sendPing, pingDelay); + else + sendPing(); + + }; + + /** + * Closes this tunnel, signaling the given status and corresponding + * message, which will be sent to the onerror handler if the status is + * an error status. + * + * @private + * @param {!Guacamole.Status} status + * The status causing the connection to close; + */ + function close_tunnel(status) { + + // Get rid of old timeouts (if any) + window.clearTimeout(receive_timeout); + window.clearTimeout(unstableTimeout); + window.clearTimeout(pingTimeout); + + // Ignore if already closed + if (tunnel.state === Guacamole.Tunnel.State.CLOSED) + return; + + // If connection closed abnormally, signal error. + if (status.code !== Guacamole.Status.Code.SUCCESS && tunnel.onerror) + tunnel.onerror(status); + + // Mark as closed + tunnel.setState(Guacamole.Tunnel.State.CLOSED); + + socket.close(); + + } + + this.sendMessage = function(elements) { + + // Do not attempt to send messages if not connected + if (!tunnel.isConnected()) + return; + + // Do not attempt to send empty messages + if (!arguments.length) + return; + + socket.send(Guacamole.Parser.toInstruction(arguments)); + + }; + + this.connect = function(data) { + + resetTimers(); + + // Mark the tunnel as connecting + tunnel.setState(Guacamole.Tunnel.State.CONNECTING); + + parser = new Guacamole.Parser(); + parser.oninstruction = function instructionReceived(opcode, args) { + + // Update state and UUID when first instruction received + if (tunnel.uuid === null) { + + // Associate tunnel UUID if received + if (opcode === Guacamole.Tunnel.INTERNAL_DATA_OPCODE && args.length === 1) + tunnel.setUUID(args[0]); + + // Tunnel is now open and UUID is available + tunnel.setState(Guacamole.Tunnel.State.OPEN); + + } + + // Call instruction handler. + if (opcode !== Guacamole.Tunnel.INTERNAL_DATA_OPCODE && tunnel.oninstruction) + tunnel.oninstruction(opcode, args); + + }; + + // Connect socket + socket = new WebSocket(tunnelURL + "?" + data, "guacamole"); + + socket.onopen = function(event) { + resetTimers(); + }; + + socket.onclose = function(event) { + + // Pull status code directly from closure reason provided by Guacamole + if (event.reason) + close_tunnel(new Guacamole.Status(parseInt(event.reason), event.reason)); + + // Failing that, derive a Guacamole status code from the WebSocket + // status code provided by the browser + else if (event.code) + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.fromWebSocketCode(event.code))); + + // Otherwise, assume server is unreachable + else + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.UPSTREAM_NOT_FOUND)); + + }; + + socket.onmessage = function(event) { + + resetTimers(); + + try { + parser.receive(event.data); + } + catch (e) { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.SERVER_ERROR, e.message)); + } + + }; + + }; + + this.disconnect = function() { + close_tunnel(new Guacamole.Status(Guacamole.Status.Code.SUCCESS, "Manually closed.")); + }; + +}; + +Guacamole.WebSocketTunnel.prototype = new Guacamole.Tunnel(); + +/** + * Guacamole Tunnel which cycles between all specified tunnels until + * no tunnels are left. Another tunnel is used if an error occurs but + * no instructions have been received. If an instruction has been + * received, or no tunnels remain, the error is passed directly out + * through the onerror handler (if defined). + * + * @constructor + * @augments Guacamole.Tunnel + * @param {...Guacamole.Tunnel} tunnelChain + * The tunnels to use, in order of priority. + */ +Guacamole.ChainedTunnel = function(tunnelChain) { + + /** + * Reference to this chained tunnel. + * @private + */ + var chained_tunnel = this; + + /** + * Data passed in via connect(), to be used for + * wrapped calls to other tunnels' connect() functions. + * @private + */ + var connect_data; + + /** + * Array of all tunnels passed to this ChainedTunnel through the + * constructor arguments. + * @private + */ + var tunnels = []; + + /** + * The tunnel committed via commit_tunnel(), if any, or null if no tunnel + * has yet been committed. + * + * @private + * @type {Guacamole.Tunnel} + */ + var committedTunnel = null; + + // Load all tunnels into array + for (var i=0; i + + + guacamole-common-js + guacamole-common-js + + zip + + + + src/main/webapp/modules/ + + *.js + + modules/ + + + target/${project.name}-${project.version}/ + + *.js + + + + + diff --git a/guacamole-common/.gitignore b/guacamole-common/.gitignore new file mode 100644 index 0000000..533192e --- /dev/null +++ b/guacamole-common/.gitignore @@ -0,0 +1,10 @@ + +# Compiled code +target/ + +# Backup files +*~ + +# Generated docs +doc/doxygen-output + diff --git a/guacamole-common/.ratignore b/guacamole-common/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/guacamole-common/pom.xml b/guacamole-common/pom.xml new file mode 100644 index 0000000..6f42bcc --- /dev/null +++ b/guacamole-common/pom.xml @@ -0,0 +1,109 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-common + jar + 1.6.0 + guacamole-common + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-client + 1.6.0 + ../ + + + + The base Java API of the Guacamole project, providing Java support for + the Guacamole stack. + + + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + https://github.com/apache/guacamole-client + scm:git:https://git.wip-us.apache.org/repos/asf/guacamole-client.git + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + javax.websocket + javax.websocket-api + 1.0 + provided + + + + + org.slf4j + slf4j-api + + + + + junit + junit + test + + + + + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientBadTypeException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientBadTypeException.java new file mode 100644 index 0000000..052f5da --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientBadTypeException.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when data has been submitted with an unsupported + * mimetype. + */ +public class GuacamoleClientBadTypeException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleClientBadTypeException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleClientBadTypeException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleClientBadTypeException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleClientBadTypeException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleClientBadTypeException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleClientBadTypeException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_BAD_TYPE; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientException.java new file mode 100644 index 0000000..f219fa4 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * A generic exception thrown when part of the Guacamole API encounters + * an error in the client's request. Such an error, if correctable, usually + * requires correction on the client side, not the server. + */ +public class GuacamoleClientException extends GuacamoleException { + + /** + * Creates a new GuacamoleException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleClientException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleClientException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleClientException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_BAD_REQUEST; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientOverrunException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientOverrunException.java new file mode 100644 index 0000000..1801da1 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientOverrunException.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when the client has sent too much data. This + * usually indicates that a server-side buffer is not large enough to + * accommodate the data, or protocol specifications prohibit data of the size + * received. + */ +public class GuacamoleClientOverrunException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleClientOverrunException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleClientOverrunException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleClientOverrunException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleClientOverrunException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleClientOverrunException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleClientOverrunException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_OVERRUN; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientTimeoutException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientTimeoutException.java new file mode 100644 index 0000000..230004b --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientTimeoutException.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when the client is taking too long to respond. + */ +public class GuacamoleClientTimeoutException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleClientTimeoutException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleClientTimeoutException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleClientTimeoutException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleClientTimeoutException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleClientTimeoutException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleClientTimeoutException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_TIMEOUT; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientTooManyException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientTooManyException.java new file mode 100644 index 0000000..4f75d88 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleClientTooManyException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when too many requests have been received + * by the current client, and further requests are being rejected, either + * temporarily or permanently. + */ +public class GuacamoleClientTooManyException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleClientTooManyException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleClientTooManyException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleClientTooManyException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleClientTooManyException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleClientTooManyException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleClientTooManyException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_TOO_MANY; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleConnectionClosedException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleConnectionClosedException.java new file mode 100644 index 0000000..578e341 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleConnectionClosedException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when an operation cannot be performed because + * its corresponding connection is closed. + */ +public class GuacamoleConnectionClosedException extends GuacamoleServerException { + + /** + * Creates a new GuacamoleConnectionClosedException with the given message + * and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleConnectionClosedException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleConnectionClosedException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleConnectionClosedException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleConnectionClosedException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleConnectionClosedException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SERVER_ERROR; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleException.java new file mode 100644 index 0000000..d984226 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleException.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * A generic exception thrown when parts of the Guacamole API encounter + * errors. + */ +public class GuacamoleException extends Exception { + + /** + * Creates a new GuacamoleException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleException(Throwable cause) { + super(cause); + } + + /** + * Returns the Guacamole status associated with this exception. This status + * can then be easily translated into an HTTP error code or Guacamole + * protocol error code. + * + * @return The corresponding Guacamole status. + */ + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SERVER_ERROR; + } + + /** + * Returns the most applicable HTTP status code that can be associated + * with this exception. + * + * @return + * An integer representing the most applicable HTTP status code + * associated with this exception. + */ + public int getHttpStatusCode() { + return getStatus().getHttpStatusCode(); + } + + /** + * Returns the most applicable WebSocket status code that can be + * associated with this exception. + * + * @return + * An integer representing the most applicable WebSocket status + * code associated with this exception. + */ + public int getWebSocketCode() { + return getStatus().getWebSocketCode(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceClosedException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceClosedException.java new file mode 100644 index 0000000..e1cc6d9 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceClosedException.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception which is thrown when a resource is no longer available because + * it is closed. + */ +public class GuacamoleResourceClosedException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleResourceClosedException with the given message + * and cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleResourceClosedException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleResourceClosedException with the given message. + * + * @param message + * A human readable description of the exception that occurred. + */ + public GuacamoleResourceClosedException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleResourceClosedException with the given cause. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleResourceClosedException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.RESOURCE_CLOSED; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceConflictException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceConflictException.java new file mode 100644 index 0000000..c9ce5a1 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceConflictException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when a resource has been requested, but that + * resource is locked or currently in use, and cannot be accessed by the + * current user. + */ +public class GuacamoleResourceConflictException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleResourceConflictException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleResourceConflictException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleResourceConflictException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleResourceConflictException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleResourceConflictException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleResourceConflictException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.RESOURCE_CONFLICT; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceNotFoundException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceNotFoundException.java new file mode 100644 index 0000000..eb9488f --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleResourceNotFoundException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * A generic exception thrown when part of the Guacamole API fails to find + * a requested resource, such as a configuration or tunnel. + */ +public class GuacamoleResourceNotFoundException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleResourceNotFoundException with the given message + * and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleResourceNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleResourceNotFoundException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleResourceNotFoundException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleResourceNotFoundException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleResourceNotFoundException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.RESOURCE_NOT_FOUND; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSecurityException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSecurityException.java new file mode 100644 index 0000000..cef9abd --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSecurityException.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * A security-related exception thrown when parts of the Guacamole API is + * denying access to a resource. + */ +public class GuacamoleSecurityException extends GuacamoleClientException { + + /** + * Creates a new GuacamoleSecurityException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleSecurityException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleSecurityException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleSecurityException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleSecurityException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleSecurityException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_FORBIDDEN; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleServerBusyException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleServerBusyException.java new file mode 100644 index 0000000..02dc893 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleServerBusyException.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when the server is too busy to service the + * request. + */ +public class GuacamoleServerBusyException extends GuacamoleServerException { + + /** + * Creates a new GuacamoleServerBusyException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleServerBusyException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleServerBusyException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleServerBusyException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleServerBusyException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleServerBusyException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SERVER_BUSY; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleServerException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleServerException.java new file mode 100644 index 0000000..576915e --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleServerException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * A generic exception thrown when part of the Guacamole API encounters + * an unexpected, internal error. An internal error, if correctable, would + * require correction on the server side, not the client. + */ +public class GuacamoleServerException extends GuacamoleException { + + /** + * Creates a new GuacamoleServerException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleServerException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleServerException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleServerException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleServerException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleServerException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SERVER_ERROR; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionClosedException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionClosedException.java new file mode 100644 index 0000000..90ff86d --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionClosedException.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception which indicates that a session within an upstream server (such + * as the remote desktop) has been forcibly terminated. + */ +public class GuacamoleSessionClosedException extends GuacamoleUpstreamException { + + /** + * Creates a new GuacamoleSessionClosedException with the given message and + * cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleSessionClosedException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleSessionClosedException with the given message. + * + * @param message + * A human readable description of the exception that occurred. + */ + public GuacamoleSessionClosedException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleSessionClosedException with the given cause. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleSessionClosedException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SESSION_CLOSED; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionConflictException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionConflictException.java new file mode 100644 index 0000000..8fa3875 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionConflictException.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception which indicates that a session within an upstream server (such + * as the remote desktop) has ended because it conflicted with another session. + */ +public class GuacamoleSessionConflictException extends GuacamoleUpstreamException { + + /** + * Creates a new GuacamoleSessionConflictException with the given message + * and cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleSessionConflictException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleSessionConflictException with the given message. + * + * @param message + * A human readable description of the exception that occurred. + */ + public GuacamoleSessionConflictException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleSessionConflictException with the given cause. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleSessionConflictException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SESSION_CONFLICT; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionTimeoutException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionTimeoutException.java new file mode 100644 index 0000000..7e33554 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleSessionTimeoutException.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception which indicates that a session within an upstream server (such + * as the remote desktop) has ended because it appeared to be inactive. + */ +public class GuacamoleSessionTimeoutException extends GuacamoleUpstreamException { + + /** + * Creates a new GuacamoleSessionTimeoutException with the given message + * and cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleSessionTimeoutException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleSessionTimeoutException with the given message. + * + * @param message + * A human readable description of the exception that occurred. + */ + public GuacamoleSessionTimeoutException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleSessionTimeoutException with the given cause. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleSessionTimeoutException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.SESSION_TIMEOUT; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUnauthorizedException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUnauthorizedException.java new file mode 100644 index 0000000..03e41aa --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUnauthorizedException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * A security-related exception thrown when parts of the Guacamole API is + * denying access to a resource, but access MAY be granted were the user + * authorized (logged in). + */ +public class GuacamoleUnauthorizedException extends GuacamoleSecurityException { + + /** + * Creates a new GuacamoleUnauthorizedException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleUnauthorizedException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleUnauthorizedException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleUnauthorizedException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleUnauthorizedException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleUnauthorizedException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.CLIENT_UNAUTHORIZED; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUnsupportedException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUnsupportedException.java new file mode 100644 index 0000000..0507d95 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUnsupportedException.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which is thrown when the requested operation is unsupported + * or unimplemented. + */ +public class GuacamoleUnsupportedException extends GuacamoleServerException { + + /** + * Creates a new GuacamoleUnsupportedException with the given message and cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleUnsupportedException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleUnsupportedException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleUnsupportedException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleUnsupportedException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleUnsupportedException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.UNSUPPORTED; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamException.java new file mode 100644 index 0000000..acc916d --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which indicates than an upstream server (such as the remote + * desktop) is returning an error or is otherwise unreachable. + */ +public class GuacamoleUpstreamException extends GuacamoleException { + + /** + * Creates a new GuacamoleUpstreamException with the given message and + * cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleUpstreamException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleUpstreamException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleUpstreamException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleUpstreamException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleUpstreamException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.UPSTREAM_ERROR; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamNotFoundException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamNotFoundException.java new file mode 100644 index 0000000..2f7699b --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamNotFoundException.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception which indicates that an upstream server (such as the remote + * desktop) does not appear to exist. + */ +public class GuacamoleUpstreamNotFoundException extends GuacamoleUpstreamException { + + /** + * Creates a new GuacamoleUpstreamNotFoundException with the given message + * and cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleUpstreamNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleUpstreamNotFoundException with the given message. + * + * @param message + * A human readable description of the exception that occurred. + */ + public GuacamoleUpstreamNotFoundException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleUpstreamNotFoundException with the given cause. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleUpstreamNotFoundException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.UPSTREAM_NOT_FOUND; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamTimeoutException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamTimeoutException.java new file mode 100644 index 0000000..284ccd9 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamTimeoutException.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + + +/** + * An exception which indicates than an upstream server (such as the remote + * desktop) is taking too long to respond. + */ +public class GuacamoleUpstreamTimeoutException extends GuacamoleUpstreamException { + + /** + * Creates a new GuacamoleUpstreamException with the given message and + * cause. + * + * @param message A human readable description of the exception that + * occurred. + * @param cause The cause of this exception. + */ + public GuacamoleUpstreamTimeoutException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleUpstreamException with the given message. + * + * @param message A human readable description of the exception that + * occurred. + */ + public GuacamoleUpstreamTimeoutException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleUpstreamException with the given cause. + * + * @param cause The cause of this exception. + */ + public GuacamoleUpstreamTimeoutException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.UPSTREAM_TIMEOUT; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamUnavailableException.java b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamUnavailableException.java new file mode 100644 index 0000000..7d62083 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/GuacamoleUpstreamUnavailableException.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception which indicates that an upstream server (such as the remote + * desktop) is not available to service the request. + */ +public class GuacamoleUpstreamUnavailableException extends GuacamoleUpstreamException { + + /** + * Creates a new GuacamoleUpstreamUnavailableException with the given + * message and cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleUpstreamUnavailableException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new GuacamoleUpstreamUnavailableException with the given + * message. + * + * @param message + * A human readable description of the exception that occurred. + */ + public GuacamoleUpstreamUnavailableException(String message) { + super(message); + } + + /** + * Creates a new GuacamoleUpstreamUnavailableException with the given + * cause. + * + * @param cause + * The cause of this exception. + */ + public GuacamoleUpstreamUnavailableException(Throwable cause) { + super(cause); + } + + @Override + public GuacamoleStatus getStatus() { + return GuacamoleStatus.UPSTREAM_UNAVAILABLE; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/io/GuacamoleReader.java b/guacamole-common/src/main/java/org/apache/guacamole/io/GuacamoleReader.java new file mode 100644 index 0000000..6ba5476 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/io/GuacamoleReader.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.io; + + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.protocol.GuacamoleInstruction; + +/** + * Provides abstract and raw character read access to a stream of Guacamole + * instructions. + */ +public interface GuacamoleReader { + + /** + * Returns whether instruction data is available for reading. Note that + * this does not guarantee an entire instruction is available. If a full + * instruction is not available, this function can return true, and a call + * to read() will still block. + * + * @return true if instruction data is available for reading, false + * otherwise. + * @throws GuacamoleException If an error occurs while checking for + * available data. + */ + public boolean available() throws GuacamoleException; + + /** + * Reads at least one complete Guacamole instruction, returning a buffer + * containing one or more complete Guacamole instructions and no + * incomplete Guacamole instructions. This function will block until at + * least one complete instruction is available. + * + * @return A buffer containing at least one complete Guacamole instruction, + * or null if no more instructions are available for reading. + * @throws GuacamoleException If an error occurs while reading from the + * stream. + */ + public char[] read() throws GuacamoleException; + + /** + * Reads exactly one complete Guacamole instruction and returns the fully + * parsed instruction. + * + * @return The next complete instruction from the stream, fully parsed, or + * null if no more instructions are available for reading. + * @throws GuacamoleException If an error occurs while reading from the + * stream, or if the instruction cannot be + * parsed. + */ + public GuacamoleInstruction readInstruction() throws GuacamoleException; + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/io/GuacamoleWriter.java b/guacamole-common/src/main/java/org/apache/guacamole/io/GuacamoleWriter.java new file mode 100644 index 0000000..e0516a6 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/io/GuacamoleWriter.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.io; + + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.protocol.GuacamoleInstruction; + +/** + * Provides abstract and raw character write access to a stream of Guacamole + * instructions. + */ +public interface GuacamoleWriter { + + /** + * Writes a portion of the given array of characters to the Guacamole + * instruction stream. The portion must contain only complete Guacamole + * instructions. + * + * @param chunk An array of characters containing Guacamole instructions. + * @param off The start offset of the portion of the array to write. + * @param len The length of the portion of the array to write. + * @throws GuacamoleException If an error occurred while writing the + * portion of the array specified. + */ + public void write(char[] chunk, int off, int len) throws GuacamoleException; + + /** + * Writes the entire given array of characters to the Guacamole instruction + * stream. The array must consist only of complete Guacamole instructions. + * + * @param chunk An array of characters consisting only of complete + * Guacamole instructions. + * @throws GuacamoleException If an error occurred while writing the + * the specified array. + */ + public void write(char[] chunk) throws GuacamoleException; + + /** + * Writes the given fully parsed instruction to the Guacamole instruction + * stream. + * + * @param instruction The Guacamole instruction to write. + * @throws GuacamoleException If an error occurred while writing the + * instruction. + */ + public void writeInstruction(GuacamoleInstruction instruction) throws GuacamoleException; + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/io/ReaderGuacamoleReader.java b/guacamole-common/src/main/java/org/apache/guacamole/io/ReaderGuacamoleReader.java new file mode 100644 index 0000000..207b1cc --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/io/ReaderGuacamoleReader.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.io; + + +import java.io.IOException; +import java.io.Reader; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleUpstreamTimeoutException; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.protocol.GuacamoleParser; + +/** + * A GuacamoleReader which wraps a standard Java Reader, using that Reader as + * the Guacamole instruction stream. + */ +public class ReaderGuacamoleReader implements GuacamoleReader { + + /** + * The GuacamoleParser instance for parsing instructions. + */ + private GuacamoleParser parser = new GuacamoleParser(); + + /** + * Wrapped Reader to be used for all input. + */ + private Reader input; + + /** + * Creates a new ReaderGuacamoleReader which will use the given Reader as + * the Guacamole instruction stream. + * + * @param input The Reader to use as the Guacamole instruction stream. + */ + public ReaderGuacamoleReader(Reader input) { + this.input = input; + } + + /** + * The location within the received data buffer that parsing should begin + * when more data is read. + */ + private int parseStart = 0; + + /** + * The buffer holding all received data. + */ + private char[] buffer = new char[20480]; + + /** + * The number of characters currently used within the data buffer. All + * other characters within the buffer are free space available for + * future reads. + */ + private int usedLength = 0; + + @Override + public boolean available() throws GuacamoleException { + try { + return input.ready() || usedLength > parseStart || parser.hasNext(); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + } + + @Override + public char[] read() throws GuacamoleException { + GuacamoleInstruction instruction = readInstruction(); + if (instruction == null) + return null; + + return instruction.toCharArray(); + } + + @Override + public GuacamoleInstruction readInstruction() throws GuacamoleException { + try { + // Loop until the parser has prepared a full instruction + while (!parser.hasNext()) { + + // Parse as much data from the buffer as we can + int parsed = 0; + while (parseStart < usedLength && (parsed = parser.append(buffer, parseStart, usedLength - parseStart)) != 0) { + parseStart += parsed; + } + + // If we still don't have a full instruction attempt to read more data into the buffer + if (!parser.hasNext()) { + + // If we have already parsed some of the buffer and the buffer is almost full then we can trim the parsed data off the buffer + if (parseStart > 0 && buffer.length - usedLength < GuacamoleParser.INSTRUCTION_MAX_LENGTH) { + System.arraycopy(buffer, parseStart, buffer, 0, usedLength - parseStart); + usedLength -= parseStart; + parseStart = 0; + } + + // Read more instruction data into the buffer + int numRead = input.read(buffer, usedLength, buffer.length - usedLength); + if (numRead == -1) + break; + + usedLength += numRead; + + } + + } + + return parser.next(); + + } + catch (SocketTimeoutException e) { + throw new GuacamoleUpstreamTimeoutException("Connection to guacd timed out.", e); + } + catch (SocketException e) { + throw new GuacamoleConnectionClosedException("Connection to guacd is closed.", e); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/io/WriterGuacamoleWriter.java b/guacamole-common/src/main/java/org/apache/guacamole/io/WriterGuacamoleWriter.java new file mode 100644 index 0000000..154fe0b --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/io/WriterGuacamoleWriter.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.io; + + +import java.io.IOException; +import java.io.Writer; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleUpstreamTimeoutException; +import org.apache.guacamole.protocol.GuacamoleInstruction; + +/** + * A GuacamoleWriter which wraps a standard Java Writer, using that Writer as + * the Guacamole instruction stream. + */ +public class WriterGuacamoleWriter implements GuacamoleWriter { + + /** + * Wrapped Writer to be used for all output. + */ + private Writer output; + + /** + * Creates a new WriterGuacamoleWriter which will use the given Writer as + * the Guacamole instruction stream. + * + * @param output The Writer to use as the Guacamole instruction stream. + */ + public WriterGuacamoleWriter(Writer output) { + this.output = output; + } + + @Override + public void write(char[] chunk, int off, int len) throws GuacamoleException { + try { + output.write(chunk, off, len); + output.flush(); + } + catch (SocketTimeoutException e) { + throw new GuacamoleUpstreamTimeoutException("Connection to guacd timed out.", e); + } + catch (SocketException e) { + throw new GuacamoleConnectionClosedException("Connection to guacd is closed.", e); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + } + + @Override + public void write(char[] chunk) throws GuacamoleException { + write(chunk, 0, chunk.length); + } + + @Override + public void writeInstruction(GuacamoleInstruction instruction) throws GuacamoleException { + write(instruction.toString().toCharArray()); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/io/package-info.java b/guacamole-common/src/main/java/org/apache/guacamole/io/package-info.java new file mode 100644 index 0000000..749d67c --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/io/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * All classes relating directly to data input or output. + */ +package org.apache.guacamole.io; + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/AbstractGuacamoleTunnel.java b/guacamole-common/src/main/java/org/apache/guacamole/net/AbstractGuacamoleTunnel.java new file mode 100644 index 0000000..41ab03f --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/AbstractGuacamoleTunnel.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + + +import java.util.concurrent.locks.ReentrantLock; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; + +/** + * Base GuacamoleTunnel implementation which synchronizes access to the + * underlying reader and writer with reentrant locks. Implementations need only + * provide the tunnel's UUID and socket. + */ +public abstract class AbstractGuacamoleTunnel implements GuacamoleTunnel { + + /** + * Lock acquired when a read operation is in progress. + */ + private final ReentrantLock readerLock; + + /** + * Lock acquired when a write operation is in progress. + */ + private final ReentrantLock writerLock; + + /** + * Creates a new GuacamoleTunnel which synchronizes access to the + * Guacamole instruction stream associated with the underlying + * GuacamoleSocket. + */ + public AbstractGuacamoleTunnel() { + readerLock = new ReentrantLock(); + writerLock = new ReentrantLock(); + } + + /** + * Acquires exclusive read access to the Guacamole instruction stream + * and returns a GuacamoleReader for reading from that stream. + * + * @return A GuacamoleReader for reading from the Guacamole instruction + * stream. + */ + @Override + public GuacamoleReader acquireReader() { + readerLock.lock(); + return getSocket().getReader(); + } + + /** + * Relinquishes exclusive read access to the Guacamole instruction + * stream. This function should be called whenever a thread finishes using + * a GuacamoleTunnel's GuacamoleReader. + */ + @Override + public void releaseReader() { + readerLock.unlock(); + } + + /** + * Returns whether there are threads waiting for read access to the + * Guacamole instruction stream. + * + * @return true if threads are waiting for read access the Guacamole + * instruction stream, false otherwise. + */ + @Override + public boolean hasQueuedReaderThreads() { + return readerLock.hasQueuedThreads(); + } + + /** + * Acquires exclusive write access to the Guacamole instruction stream + * and returns a GuacamoleWriter for writing to that stream. + * + * @return A GuacamoleWriter for writing to the Guacamole instruction + * stream. + */ + @Override + public GuacamoleWriter acquireWriter() { + writerLock.lock(); + return getSocket().getWriter(); + } + + /** + * Relinquishes exclusive write access to the Guacamole instruction + * stream. This function should be called whenever a thread finishes using + * a GuacamoleTunnel's GuacamoleWriter. + */ + @Override + public void releaseWriter() { + writerLock.unlock(); + } + + @Override + public boolean hasQueuedWriterThreads() { + return writerLock.hasQueuedThreads(); + } + + @Override + public void close() throws GuacamoleException { + getSocket().close(); + } + + @Override + public boolean isOpen() { + return getSocket().isOpen(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/DelegatingGuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/net/DelegatingGuacamoleSocket.java new file mode 100644 index 0000000..b519629 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/DelegatingGuacamoleSocket.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; + +/** + * GuacamoleSocket implementation which simply delegates all function calls to + * an underlying GuacamoleSocket. + */ +public class DelegatingGuacamoleSocket implements GuacamoleSocket { + + /** + * The wrapped socket. + */ + private final GuacamoleSocket socket; + + /** + * Wraps the given GuacamoleSocket such that all function calls against + * this DelegatingGuacamoleSocket will be delegated to it. + * + * @param socket + * The GuacamoleSocket to wrap. + */ + public DelegatingGuacamoleSocket(GuacamoleSocket socket) { + this.socket = socket; + } + + /** + * Returns the underlying GuacamoleSocket wrapped by this + * DelegatingGuacamoleSocket. + * + * @return + * The GuacamoleSocket wrapped by this DelegatingGuacamoleSocket. + */ + protected GuacamoleSocket getDelegateSocket() { + return socket; + } + + @Override + public String getProtocol() { + return socket.getProtocol(); + } + + @Override + public GuacamoleReader getReader() { + return socket.getReader(); + } + + @Override + public GuacamoleWriter getWriter() { + return socket.getWriter(); + } + + @Override + public void close() throws GuacamoleException { + socket.close(); + } + + @Override + public boolean isOpen() { + return socket.isOpen(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/DelegatingGuacamoleTunnel.java b/guacamole-common/src/main/java/org/apache/guacamole/net/DelegatingGuacamoleTunnel.java new file mode 100644 index 0000000..f71738e --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/DelegatingGuacamoleTunnel.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; + +/** + * GuacamoleTunnel implementation which simply delegates all function calls to + * an underlying GuacamoleTunnel. + */ +public class DelegatingGuacamoleTunnel implements GuacamoleTunnel { + + /** + * The wrapped GuacamoleTunnel. + */ + private final GuacamoleTunnel tunnel; + + /** + * Wraps the given tunnel such that all function calls against this tunnel + * will be delegated to it. + * + * @param tunnel + * The GuacamoleTunnel to wrap. + */ + public DelegatingGuacamoleTunnel(GuacamoleTunnel tunnel) { + this.tunnel = tunnel; + } + + @Override + public GuacamoleReader acquireReader() { + return tunnel.acquireReader(); + } + + @Override + public void releaseReader() { + tunnel.releaseReader(); + } + + @Override + public boolean hasQueuedReaderThreads() { + return tunnel.hasQueuedReaderThreads(); + } + + @Override + public GuacamoleWriter acquireWriter() { + return tunnel.acquireWriter(); + } + + @Override + public void releaseWriter() { + tunnel.releaseWriter(); + } + + @Override + public boolean hasQueuedWriterThreads() { + return tunnel.hasQueuedWriterThreads(); + } + + @Override + public UUID getUUID() { + return tunnel.getUUID(); + } + + @Override + public GuacamoleSocket getSocket() { + return tunnel.getSocket(); + } + + @Override + public void close() throws GuacamoleException { + tunnel.close(); + } + + @Override + public boolean isOpen() { + return tunnel.isOpen(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/GuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/net/GuacamoleSocket.java new file mode 100644 index 0000000..af068fa --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/GuacamoleSocket.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; + +/** + * Provides abstract socket-like access to a Guacamole connection. + */ +public interface GuacamoleSocket { + + /** + * Returns the name of the protocol to be used. If the protocol is not + * known or the implementation refuses to reveal the underlying protocol, + * null is returned. + * + *

    Implementations should aim to expose the name of the + * underlying protocol, such that protocol-specific responses like the + * "required" and "argv" instructions can be handled correctly by code + * consuming the GuacamoleSocket. + * + * @return + * The name of the protocol to be used, or null if this information is + * not available. + */ + public default String getProtocol() { + return null; + } + + /** + * Returns a GuacamoleReader which can be used to read from the + * Guacamole instruction stream associated with the connection + * represented by this GuacamoleSocket. + * + * @return A GuacamoleReader which can be used to read from the + * Guacamole instruction stream. + */ + public GuacamoleReader getReader(); + + /** + * Returns a GuacamoleWriter which can be used to write to the + * Guacamole instruction stream associated with the connection + * represented by this GuacamoleSocket. + * + * @return A GuacamoleWriter which can be used to write to the + * Guacamole instruction stream. + */ + public GuacamoleWriter getWriter(); + + /** + * Releases all resources in use by the connection represented by this + * GuacamoleSocket. + * + * @throws GuacamoleException If an error occurs while releasing resources. + */ + public void close() throws GuacamoleException; + + /** + * Returns whether this GuacamoleSocket is open and can be used for reading + * and writing. + * + * @return true if this GuacamoleSocket is open, false otherwise. + */ + public boolean isOpen(); + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/GuacamoleTunnel.java b/guacamole-common/src/main/java/org/apache/guacamole/net/GuacamoleTunnel.java new file mode 100644 index 0000000..9c91478 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/GuacamoleTunnel.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + + +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; + +/** + * Provides a unique identifier and synchronized access to the GuacamoleReader + * and GuacamoleWriter associated with a GuacamoleSocket. + */ +public interface GuacamoleTunnel { + + /** + * The Guacamole protocol instruction opcode reserved for arbitrary + * internal use by tunnel implementations. The value of this opcode is + * guaranteed to be the empty string (""). Tunnel implementations may use + * this opcode for any purpose. It is currently used by the HTTP tunnel to + * mark the end of the HTTP response, and by the WebSocket tunnel to + * transmit the tunnel UUID. + */ + static final String INTERNAL_DATA_OPCODE = ""; + + /** + * Acquires exclusive read access to the Guacamole instruction stream + * and returns a GuacamoleReader for reading from that stream. + * + * @return A GuacamoleReader for reading from the Guacamole instruction + * stream. + */ + GuacamoleReader acquireReader(); + + /** + * Relinquishes exclusive read access to the Guacamole instruction + * stream. This function should be called whenever a thread finishes using + * a GuacamoleTunnel's GuacamoleReader. + */ + void releaseReader(); + + /** + * Returns whether there are threads waiting for read access to the + * Guacamole instruction stream. + * + * @return true if threads are waiting for read access the Guacamole + * instruction stream, false otherwise. + */ + boolean hasQueuedReaderThreads(); + + /** + * Acquires exclusive write access to the Guacamole instruction stream + * and returns a GuacamoleWriter for writing to that stream. + * + * @return A GuacamoleWriter for writing to the Guacamole instruction + * stream. + */ + GuacamoleWriter acquireWriter(); + + /** + * Relinquishes exclusive write access to the Guacamole instruction + * stream. This function should be called whenever a thread finishes using + * a GuacamoleTunnel's GuacamoleWriter. + */ + void releaseWriter(); + + /** + * Returns whether there are threads waiting for write access to the + * Guacamole instruction stream. + * + * @return true if threads are waiting for write access the Guacamole + * instruction stream, false otherwise. + */ + boolean hasQueuedWriterThreads(); + + /** + * Returns the unique identifier associated with this GuacamoleTunnel. + * + * @return The unique identifier associated with this GuacamoleTunnel. + */ + UUID getUUID(); + + /** + * Returns the GuacamoleSocket used by this GuacamoleTunnel for reading + * and writing. + * + * @return The GuacamoleSocket used by this GuacamoleTunnel. + */ + GuacamoleSocket getSocket(); + + /** + * Release all resources allocated to this GuacamoleTunnel. + * + * @throws GuacamoleException if an error occurs while releasing + * resources. + */ + void close() throws GuacamoleException; + + /** + * Returns whether this GuacamoleTunnel is open, or has been closed. + * + * @return true if this GuacamoleTunnel is open, false if it is closed. + */ + boolean isOpen(); + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/InetGuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/net/InetGuacamoleSocket.java new file mode 100644 index 0000000..d10ce58 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/InetGuacamoleSocket.java @@ -0,0 +1,150 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + + +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.ReaderGuacamoleReader; +import org.apache.guacamole.io.WriterGuacamoleWriter; +import org.apache.guacamole.io.GuacamoleWriter; +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; + +import java.io.InputStreamReader; + +import java.io.OutputStreamWriter; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.SocketTimeoutException; +import java.net.StandardSocketOptions; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleUpstreamTimeoutException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides abstract socket-like access to a Guacamole connection over a given + * hostname and port. + */ +public class InetGuacamoleSocket implements GuacamoleSocket { + + /** + * Logger for this class. + */ + private Logger logger = LoggerFactory.getLogger(InetGuacamoleSocket.class); + + /** + * The GuacamoleReader this socket should read from. + */ + private GuacamoleReader reader; + + /** + * The GuacamoleWriter this socket should write to. + */ + private GuacamoleWriter writer; + + /** + * The number of milliseconds to wait for data on the TCP socket before + * timing out. + */ + private static final int SOCKET_TIMEOUT = 15000; + + /** + * The TCP socket that the GuacamoleReader and GuacamoleWriter exposed + * by this class should affect. + */ + private Socket sock; + + /** + * Creates a new InetGuacamoleSocket which reads and writes instructions + * to the Guacamole instruction stream of the Guacamole proxy server + * running at the given hostname and port. + * + * @param hostname The hostname of the Guacamole proxy server to connect to. + * @param port The port of the Guacamole proxy server to connect to. + * @throws GuacamoleException If an error occurs while connecting to the + * Guacamole proxy server. + */ + public InetGuacamoleSocket(String hostname, int port) throws GuacamoleException { + + try { + + logger.debug("Connecting to guacd at {}:{}.", hostname, port); + + // Get address + SocketAddress address = new InetSocketAddress( + InetAddress.getByName(hostname), + port + ); + + // Connect with timeout + sock = new Socket(); + sock.connect(address, SOCKET_TIMEOUT); + + // Set read timeout + sock.setSoTimeout(SOCKET_TIMEOUT); + + // Set TCP_NODELAY to avoid any latency that would otherwise be + // added by the networking stack and Nagle's algorithm + sock.setTcpNoDelay(true); + + // On successful connect, retrieve I/O streams + reader = new ReaderGuacamoleReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); + writer = new WriterGuacamoleWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF-8")); + + } + catch (SocketTimeoutException e) { + throw new GuacamoleUpstreamTimeoutException("Connection timed out.", e); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + + } + + @Override + public void close() throws GuacamoleException { + try { + logger.debug("Closing socket to guacd."); + sock.close(); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + } + + @Override + public GuacamoleReader getReader() { + return reader; + } + + @Override + public GuacamoleWriter getWriter() { + return writer; + } + + @Override + public boolean isOpen() { + return !sock.isClosed(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/SSLGuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/net/SSLGuacamoleSocket.java new file mode 100644 index 0000000..2540785 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/SSLGuacamoleSocket.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.io.ReaderGuacamoleReader; +import org.apache.guacamole.io.WriterGuacamoleWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides abstract socket-like access to a Guacamole connection over SSL to + * a given hostname and port. + */ +public class SSLGuacamoleSocket implements GuacamoleSocket { + + /** + * Logger for this class. + */ + private Logger logger = LoggerFactory.getLogger(SSLGuacamoleSocket.class); + + /** + * The GuacamoleReader this socket should read from. + */ + private GuacamoleReader reader; + + /** + * The GuacamoleWriter this socket should write to. + */ + private GuacamoleWriter writer; + + /** + * The number of milliseconds to wait for data on the TCP socket before + * timing out. + */ + private static final int SOCKET_TIMEOUT = 15000; + + /** + * The TCP socket that the GuacamoleReader and GuacamoleWriter exposed + * by this class should affect. + */ + private Socket sock; + + /** + * Creates a new SSLGuacamoleSocket which reads and writes instructions + * to the Guacamole instruction stream of the Guacamole proxy server + * running at the given hostname and port using SSL. + * + * @param hostname The hostname of the Guacamole proxy server to connect to. + * @param port The port of the Guacamole proxy server to connect to. + * @throws GuacamoleException If an error occurs while connecting to the + * Guacamole proxy server. + */ + public SSLGuacamoleSocket(String hostname, int port) throws GuacamoleException { + + // Get factory for SSL sockets + SocketFactory socket_factory = SSLSocketFactory.getDefault(); + + try { + + logger.debug("Connecting to guacd at {}:{} via SSL/TLS.", + hostname, port); + + // Get address + SocketAddress address = new InetSocketAddress( + InetAddress.getByName(hostname), + port + ); + + // Connect with timeout + sock = socket_factory.createSocket(); + sock.connect(address, SOCKET_TIMEOUT); + + // Set read timeout + sock.setSoTimeout(SOCKET_TIMEOUT); + + // On successful connect, retrieve I/O streams + reader = new ReaderGuacamoleReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); + writer = new WriterGuacamoleWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF-8")); + + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + + } + + @Override + public void close() throws GuacamoleException { + try { + logger.debug("Closing socket to guacd."); + sock.close(); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + } + + @Override + public GuacamoleReader getReader() { + return reader; + } + + @Override + public GuacamoleWriter getWriter() { + return writer; + } + + @Override + public boolean isOpen() { + return !sock.isClosed(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/SimpleGuacamoleTunnel.java b/guacamole-common/src/main/java/org/apache/guacamole/net/SimpleGuacamoleTunnel.java new file mode 100644 index 0000000..18dd253 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/SimpleGuacamoleTunnel.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + + +import java.util.UUID; + +/** + * GuacamoleTunnel implementation which uses a provided socket. The UUID of + * the tunnel will be randomly generated. + */ +public class SimpleGuacamoleTunnel extends AbstractGuacamoleTunnel { + + /** + * The UUID associated with this tunnel. Every tunnel must have a + * corresponding UUID such that tunnel read/write requests can be + * directed to the proper tunnel. + */ + private final UUID uuid = UUID.randomUUID(); + + /** + * The GuacamoleSocket that tunnel should use for communication on + * behalf of the connecting user. + */ + private final GuacamoleSocket socket; + + /** + * Creates a new GuacamoleTunnel which synchronizes access to the + * Guacamole instruction stream associated with the given GuacamoleSocket. + * + * @param socket The GuacamoleSocket to provide synchronized access for. + */ + public SimpleGuacamoleTunnel(GuacamoleSocket socket) { + this.socket = socket; + } + + @Override + public UUID getUUID() { + return uuid; + } + + @Override + public GuacamoleSocket getSocket() { + return socket; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/net/package-info.java b/guacamole-common/src/main/java/org/apache/guacamole/net/package-info.java new file mode 100644 index 0000000..9d9423d --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/net/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which apply to network-specific concepts, such as low-level sockets + * and tunnels. + */ +package org.apache.guacamole.net; + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/package-info.java b/guacamole-common/src/main/java/org/apache/guacamole/package-info.java new file mode 100644 index 0000000..fbcf3cf --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/package-info.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * All classes which apply generally across the Guacamole web application + * and all other web applications which use the API provided by the + * Guacamole project. + */ +package org.apache.guacamole; + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/ConfiguredGuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/ConfiguredGuacamoleSocket.java new file mode 100644 index 0000000..ee1e26a --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/ConfiguredGuacamoleSocket.java @@ -0,0 +1,361 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.util.List; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.DelegatingGuacamoleSocket; +import org.apache.guacamole.net.GuacamoleSocket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A GuacamoleSocket which pre-configures the connection based on a given + * GuacamoleConfiguration, completing the initial protocol handshake before + * accepting data for read or write. + * + * This is useful for forcing a connection to the Guacamole proxy server with + * a specific configuration while disallowing the client that will be using + * this GuacamoleSocket from manually controlling the initial protocol + * handshake. + */ +public class ConfiguredGuacamoleSocket extends DelegatingGuacamoleSocket { + + /** + * Logger for this class. + */ + private static final Logger logger = + LoggerFactory.getLogger(ConfiguredGuacamoleSocket.class); + + /** + * The configuration to use when performing the Guacamole protocol + * handshake. + */ + private GuacamoleConfiguration config; + + /** + * The unique identifier associated with this connection, as determined + * by the "ready" instruction received from the Guacamole proxy. + */ + private String id; + + /** + * The protocol version that will be used to communicate with guacd. The + * default is 1.0.0, and, if the server does not provide a specific version + * it will be assumed that it operates at this version and certain features + * may be unavailable. + */ + private GuacamoleProtocolVersion protocolVersion = + GuacamoleProtocolVersion.VERSION_1_0_0; + + /** + * Parses the given "error" instruction, throwing a GuacamoleException that + * corresponds to its status code and message. + * + * @param instruction + * The "error" instruction to parse. + * + * @throws GuacamoleException + * A GuacamoleException that corresponds to the status code and message + * present within the given "error" instruction. + */ + private static void handleReceivedError(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Provide reasonable default error message for invalid "error" + // instructions that fail to provide one + String message = "Internal error within guacd / protocol handling."; + + // Consider all error instructions without a corresponding status code + // to be server errors + GuacamoleStatus status = GuacamoleStatus.SERVER_ERROR; + + // Parse human-readable message from "error" instruction, warning if no + // message was given + List args = instruction.getArgs(); + if (args.size() >= 1) + message = args.get(0); + else + logger.debug("Received \"error\" instruction with no corresponding message."); + + // Parse the status code from the received error instruction, warning + // if the status code is missing or invalid + if (args.size() >= 2) { + try { + + // Translate numeric status code into a GuacamoleStatus + int statusCode = Integer.parseInt(args.get(1)); + GuacamoleStatus parsedStatus = GuacamoleStatus.fromGuacamoleStatusCode(statusCode); + if (parsedStatus != null) + status = parsedStatus; + else + logger.debug("Received \"error\" instruction with unknown/invalid status code: {}", statusCode); + + } + catch (NumberFormatException e) { + logger.debug("Received \"error\" instruction with non-numeric status code.", e); + } + } + else + logger.debug("Received \"error\" instruction without status code."); + + // Convert parsed status code and message to a GuacamoleException + throw status.toException(message); + + } + + /** + * Waits for the instruction having the given opcode, returning that + * instruction once it has been read. If the instruction is never read, + * an exception is thrown. + * + * Respects server control instructions that are allowed during the handshake + * phase, namely {@code error} and {@code disconnect}. + * + * @param reader + * The reader to read instructions from. + * + * @param opcode + * The opcode of the instruction we are expecting. + * + * @return + * The instruction having the given opcode. + * + * @throws GuacamoleException + * If an error occurs while reading, or if the expected instruction is + * not read. + */ + private GuacamoleInstruction expect(GuacamoleReader reader, String opcode) + throws GuacamoleException { + + // Wait for an instruction + GuacamoleInstruction instruction = reader.readInstruction(); + if (instruction == null) + throw new GuacamoleServerException("End of stream while waiting for \"" + opcode + "\"."); + + // Report connection closure if server explicitly disconnects + if ("disconnect".equals(instruction.getOpcode())) + throw new GuacamoleConnectionClosedException("Server disconnected while waiting for \"" + opcode + "\"."); + + // Pass through any received errors as GuacamoleExceptions + if ("error".equals(instruction.getOpcode())) + handleReceivedError(instruction); + + // Ensure instruction has expected opcode + if (!instruction.getOpcode().equals(opcode)) + throw new GuacamoleServerException("Expected \"" + opcode + "\" instruction but instead received \"" + instruction.getOpcode() + "\"."); + + return instruction; + + } + + /** + * Creates a new ConfiguredGuacamoleSocket which uses the given + * GuacamoleConfiguration to complete the initial protocol handshake over + * the given GuacamoleSocket. A default GuacamoleClientInformation object + * is used to provide basic client information. + * + * @param socket The GuacamoleSocket to wrap. + * @param config The GuacamoleConfiguration to use to complete the initial + * protocol handshake. + * @throws GuacamoleException If an error occurs while completing the + * initial protocol handshake. + */ + public ConfiguredGuacamoleSocket(GuacamoleSocket socket, + GuacamoleConfiguration config) throws GuacamoleException { + this(socket, config, new GuacamoleClientInformation()); + } + + /** + * Creates a new ConfiguredGuacamoleSocket which uses the given + * GuacamoleConfiguration and GuacamoleClientInformation to complete the + * initial protocol handshake over the given GuacamoleSocket. + * + * @param socket The GuacamoleSocket to wrap. + * @param config The GuacamoleConfiguration to use to complete the initial + * protocol handshake. + * @param info The GuacamoleClientInformation to use to complete the initial + * protocol handshake. + * @throws GuacamoleException If an error occurs while completing the + * initial protocol handshake. + */ + public ConfiguredGuacamoleSocket(GuacamoleSocket socket, + GuacamoleConfiguration config, + GuacamoleClientInformation info) throws GuacamoleException { + + super(socket); + this.config = config; + + // Get reader and writer + GuacamoleReader reader = socket.getReader(); + GuacamoleWriter writer = socket.getWriter(); + + // Get protocol / connection ID + String select_arg = config.getConnectionID(); + if (select_arg == null) + select_arg = config.getProtocol(); + + // Send requested protocol or connection ID + writer.writeInstruction(new GuacamoleInstruction("select", select_arg)); + + // Wait for server args + GuacamoleInstruction args = expect(reader, "args"); + + // Build args list off provided names and config + List arg_names = args.getArgs(); + String[] arg_values = new String[arg_names.size()]; + for (int i=0; i ready_args = ready.getArgs(); + if (ready_args.isEmpty()) + throw new GuacamoleServerException("No connection ID received"); + + id = ready.getArgs().get(0); + + } + + /** + * Returns the GuacamoleConfiguration used to configure this + * ConfiguredGuacamoleSocket. + * + * @return The GuacamoleConfiguration used to configure this + * ConfiguredGuacamoleSocket. + */ + public GuacamoleConfiguration getConfiguration() { + return config; + } + + /** + * Returns the unique ID associated with the Guacamole connection + * negotiated by this ConfiguredGuacamoleSocket. The ID is provided by + * the "ready" instruction returned by the Guacamole proxy. + * + * @return The ID of the negotiated Guacamole connection. + */ + public String getConnectionID() { + return id; + } + + /** + * Returns the version of the Guacamole protocol associated with the + * Guacamole connection negotiated by this ConfiguredGuacamoleSocket. This + * version is the lowest version common to both ConfiguredGuacamoleSocket + * and the relevant Guacamole proxy instance (guacd). + * + * @return + * The protocol version that this ConfiguredGuacamoleSocket will use to + * communicate with guacd. + */ + public GuacamoleProtocolVersion getProtocolVersion() { + return protocolVersion; + } + + @Override + public String getProtocol() { + return getConfiguration().getProtocol(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/FailoverGuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FailoverGuacamoleSocket.java new file mode 100644 index 0000000..15414c0 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FailoverGuacamoleSocket.java @@ -0,0 +1,267 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUpstreamException; +import org.apache.guacamole.GuacamoleUpstreamNotFoundException; +import org.apache.guacamole.GuacamoleUpstreamTimeoutException; +import org.apache.guacamole.GuacamoleUpstreamUnavailableException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.net.DelegatingGuacamoleSocket; +import org.apache.guacamole.net.GuacamoleSocket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * GuacamoleSocket which intercepts errors received early in the Guacamole + * session. Upstream errors which are intercepted early enough result in + * exceptions thrown immediately within the FailoverGuacamoleSocket's + * constructor, allowing a different socket to be substituted prior to + * fulfilling the connection. + */ +public class FailoverGuacamoleSocket extends DelegatingGuacamoleSocket { + + /** + * Logger for this class. + */ + private static final Logger logger = + LoggerFactory.getLogger(FailoverGuacamoleSocket.class); + + /** + * The default maximum number of characters of Guacamole instruction data + * to store if no explicit limit is provided. + */ + private static final int DEFAULT_INSTRUCTION_QUEUE_LIMIT = 131072; + + /** + * Queue of all instructions read while this FailoverGuacamoleSocket was + * being constructed. + */ + private final Queue instructionQueue = + new LinkedList(); + + /** + * Parses the given "error" instruction, throwing an exception if the + * instruction represents an error from the upstream remote desktop. + * + * @param instruction + * The "error" instruction to parse. + * + * @throws GuacamoleUpstreamException + * If the "error" instruction represents an error from the upstream + * remote desktop. + */ + private static void handleUpstreamErrors(GuacamoleInstruction instruction) + throws GuacamoleUpstreamException { + + // Ignore error instructions which are missing the status code + List args = instruction.getArgs(); + if (args.size() < 2) { + logger.debug("Received \"error\" instruction without status code."); + return; + } + + // Parse the status code from the received error instruction + int statusCode; + try { + statusCode = Integer.parseInt(args.get(1)); + } + catch (NumberFormatException e) { + logger.debug("Received \"error\" instruction with non-numeric status code.", e); + return; + } + + // Translate numeric status code into a GuacamoleStatus + GuacamoleStatus status = GuacamoleStatus.fromGuacamoleStatusCode(statusCode); + if (status == null) { + logger.debug("Received \"error\" instruction with unknown/invalid status code: {}", statusCode); + return; + } + + // Only handle error instructions related to the upstream remote desktop + switch (status) { + + // Generic upstream error + case UPSTREAM_ERROR: + throw new GuacamoleUpstreamException(args.get(0)); + + // Upstream is unreachable + case UPSTREAM_NOT_FOUND: + throw new GuacamoleUpstreamNotFoundException(args.get(0)); + + // Upstream did not respond + case UPSTREAM_TIMEOUT: + throw new GuacamoleUpstreamTimeoutException(args.get(0)); + + // Upstream is refusing the connection + case UPSTREAM_UNAVAILABLE: + throw new GuacamoleUpstreamUnavailableException(args.get(0)); + + } + + } + + /** + * Creates a new FailoverGuacamoleSocket which reads Guacamole instructions + * from the given socket, searching for errors from the upstream remote + * desktop until the given instruction queue limit is reached. If an + * upstream error is encountered, it is thrown as a + * GuacamoleUpstreamException. This constructor will block until an error + * is encountered, until insufficient space remains in the instruction + * queue, or until the connection appears to have been successful. + * Once the FailoverGuacamoleSocket has been created, all reads, writes, + * etc. will be delegated to the provided socket. + * + * @param socket + * The GuacamoleSocket of the Guacamole connection this + * FailoverGuacamoleSocket should handle. + * + * @param instructionQueueLimit + * The maximum number of characters of Guacamole instruction data to + * store within the instruction queue while searching for errors. Once + * this limit is exceeded, the connection is assumed to be successful. + * + * @throws GuacamoleException + * If an error occurs while reading data from the provided socket. + * + * @throws GuacamoleUpstreamException + * If the connection to guacd succeeded, but an error occurred while + * connecting to the remote desktop. + */ + public FailoverGuacamoleSocket(GuacamoleSocket socket, + final int instructionQueueLimit) + throws GuacamoleException, GuacamoleUpstreamException { + + super(socket); + + int totalQueueSize = 0; + + GuacamoleInstruction instruction; + GuacamoleReader reader = socket.getReader(); + + // Continuously read instructions, searching for errors + while ((instruction = reader.readInstruction()) != null) { + + // Add instruction to tail of instruction queue + instructionQueue.add(instruction); + + // If instruction is a "sync" instruction, stop reading + String opcode = instruction.getOpcode(); + if (opcode.equals("sync")) + break; + + // If instruction is an "error" instruction, parse its contents and + // stop reading + if (opcode.equals("error")) { + handleUpstreamErrors(instruction); + break; + } + + // Otherwise, track total data parsed, and assume connection is + // successful if no error encountered within reasonable space + totalQueueSize += instruction.toString().length(); + if (totalQueueSize >= instructionQueueLimit) + break; + + } + + } + + /** + * Creates a new FailoverGuacamoleSocket which reads Guacamole instructions + * from the given socket, searching for errors from the upstream remote + * desktop until a maximum of 128KB of instruction data has been queued. If + * an upstream error is encountered, it is thrown as a + * GuacamoleUpstreamException. This constructor will block until an error + * is encountered, until insufficient space remains in the instruction + * queue, or until the connection appears to have been successful. + * Once the FailoverGuacamoleSocket has been created, all reads, writes, + * etc. will be delegated to the provided socket. + * + * @param socket + * The GuacamoleSocket of the Guacamole connection this + * FailoverGuacamoleSocket should handle. + * + * @throws GuacamoleException + * If an error occurs while reading data from the provided socket. + * + * @throws GuacamoleUpstreamException + * If the connection to guacd succeeded, but an error occurred while + * connecting to the remote desktop. + */ + public FailoverGuacamoleSocket(GuacamoleSocket socket) + throws GuacamoleException, GuacamoleUpstreamException { + this(socket, DEFAULT_INSTRUCTION_QUEUE_LIMIT); + } + + /** + * GuacamoleReader which reads instructions from the queue populated when + * the FailoverGuacamoleSocket was constructed. Once the queue has been + * emptied, reads are delegated directly to the reader of the wrapped + * socket. + */ + private final GuacamoleReader queuedReader = new GuacamoleReader() { + + @Override + public boolean available() throws GuacamoleException { + return !instructionQueue.isEmpty() || getDelegateSocket().getReader().available(); + } + + @Override + public char[] read() throws GuacamoleException { + + // Read instructions from queue before finally delegating to + // underlying reader (received when FailoverGuacamoleSocket was + // being constructed) + if (!instructionQueue.isEmpty()) { + GuacamoleInstruction instruction = instructionQueue.remove(); + return instruction.toString().toCharArray(); + } + + return getDelegateSocket().getReader().read(); + + } + + @Override + public GuacamoleInstruction readInstruction() + throws GuacamoleException { + + // Read instructions from queue before finally delegating to + // underlying reader (received when FailoverGuacamoleSocket was + // being constructed) + if (!instructionQueue.isEmpty()) + return instructionQueue.remove(); + + return getDelegateSocket().getReader().readInstruction(); + + } + + }; + + @Override + public GuacamoleReader getReader() { + return queuedReader; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleReader.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleReader.java new file mode 100644 index 0000000..2c87416 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleReader.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; + +/** + * GuacamoleReader which applies a given GuacamoleFilter to observe or alter all + * read instructions. Instructions may also be dropped or denied by the filter. + */ +public class FilteredGuacamoleReader implements GuacamoleReader { + + /** + * The wrapped GuacamoleReader. + */ + private final GuacamoleReader reader; + + /** + * The filter to apply when reading instructions. + */ + private final GuacamoleFilter filter; + + /** + * Wraps the given GuacamoleReader, applying the given filter to all read + * instructions. Future reads will return only instructions which pass + * the filter. + * + * @param reader The GuacamoleReader to wrap. + * @param filter The filter which dictates which instructions are read, and + * how. + */ + public FilteredGuacamoleReader(GuacamoleReader reader, GuacamoleFilter filter) { + this.reader = reader; + this.filter = filter; + } + + @Override + public boolean available() throws GuacamoleException { + return reader.available(); + } + + @Override + public char[] read() throws GuacamoleException { + + GuacamoleInstruction filteredInstruction = readInstruction(); + if (filteredInstruction == null) + return null; + + return filteredInstruction.toString().toCharArray(); + + } + + @Override + public GuacamoleInstruction readInstruction() throws GuacamoleException { + + GuacamoleInstruction filteredInstruction; + + // Read and filter instructions until no instructions are dropped + do { + + // Read next instruction + GuacamoleInstruction unfilteredInstruction = reader.readInstruction(); + if (unfilteredInstruction == null) + return null; + + // Apply filter + filteredInstruction = filter.filter(unfilteredInstruction); + + } while (filteredInstruction == null); + + return filteredInstruction; + + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleSocket.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleSocket.java new file mode 100644 index 0000000..c3bfefd --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleSocket.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.DelegatingGuacamoleSocket; +import org.apache.guacamole.net.GuacamoleSocket; + +/** + * Implementation of GuacamoleSocket which allows individual instructions to be + * intercepted, overridden, etc. + */ +public class FilteredGuacamoleSocket extends DelegatingGuacamoleSocket { + + /** + * A reader for the wrapped GuacamoleSocket which may be filtered. + */ + private final GuacamoleReader reader; + + /** + * A writer for the wrapped GuacamoleSocket which may be filtered. + */ + private final GuacamoleWriter writer; + + /** + * Creates a new FilteredGuacamoleSocket which uses the given filters to + * determine whether instructions read/written are allowed through, + * modified, etc. If reads or writes should be unfiltered, simply specify + * null rather than a particular filter. + * + * @param socket The GuacamoleSocket to wrap. + * @param readFilter The GuacamoleFilter to apply to all read instructions, + * if any. + * @param writeFilter The GuacamoleFilter to apply to all written + * instructions, if any. + */ + public FilteredGuacamoleSocket(GuacamoleSocket socket, GuacamoleFilter readFilter, GuacamoleFilter writeFilter) { + + super(socket); + + // Apply filter to reader + if (readFilter != null) + reader = new FilteredGuacamoleReader(socket.getReader(), readFilter); + else + reader = socket.getReader(); + + // Apply filter to writer + if (writeFilter != null) + writer = new FilteredGuacamoleWriter(socket.getWriter(), writeFilter); + else + writer = socket.getWriter(); + + } + + @Override + public GuacamoleReader getReader() { + return reader; + } + + @Override + public GuacamoleWriter getWriter() { + return writer; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleWriter.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleWriter.java new file mode 100644 index 0000000..633d215 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/FilteredGuacamoleWriter.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.io.GuacamoleWriter; + +/** + * GuacamoleWriter which applies a given GuacamoleFilter to observe or alter + * all written instructions. Instructions may also be dropped or denied by + * the filter. + */ +public class FilteredGuacamoleWriter implements GuacamoleWriter { + + /** + * The wrapped GuacamoleWriter. + */ + private final GuacamoleWriter writer; + + /** + * The filter to apply when writing instructions. + */ + private final GuacamoleFilter filter; + + /** + * Parser for reading instructions prior to writing, such that they can be + * passed on to the filter. + */ + private final GuacamoleParser parser = new GuacamoleParser(); + + /** + * Wraps the given GuacamoleWriter, applying the given filter to all written + * instructions. Future writes will only write instructions which pass + * the filter. + * + * @param writer The GuacamoleWriter to wrap. + * @param filter The filter which dictates which instructions are written, + * and how. + */ + public FilteredGuacamoleWriter(GuacamoleWriter writer, GuacamoleFilter filter) { + this.writer = writer; + this.filter = filter; + } + + @Override + public void write(char[] chunk, int offset, int length) throws GuacamoleException { + + // Write all data in chunk + while (length > 0) { + + // Pass as much data through the parser as possible + int parsed; + while ((parsed = parser.append(chunk, offset, length)) != 0) { + offset += parsed; + length -= parsed; + } + + // If no instruction is available, it must be incomplete + if (!parser.hasNext()) + throw new GuacamoleServerException("Filtered write() contained an incomplete instruction."); + + // Write single instruction through filter + writeInstruction(parser.next()); + + } + + } + + @Override + public void write(char[] chunk) throws GuacamoleException { + write(chunk, 0, chunk.length); + } + + @Override + public void writeInstruction(GuacamoleInstruction instruction) throws GuacamoleException { + + // Write instruction only if not dropped + GuacamoleInstruction filteredInstruction = filter.filter(instruction); + if (filteredInstruction != null) + writer.writeInstruction(filteredInstruction); + + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleClientInformation.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleClientInformation.java new file mode 100644 index 0000000..b295db8 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleClientInformation.java @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + + +import java.util.ArrayList; +import java.util.List; + +/** + * An abstract representation of Guacamole client information, including all + * information required by the Guacamole protocol during the preamble. + */ +public class GuacamoleClientInformation { + + /** + * The optimal screen width requested by the client, in pixels. + */ + private int optimalScreenWidth = 1024; + + /** + * The optimal screen height requested by the client, in pixels. + */ + private int optimalScreenHeight = 768; + + /** + * The resolution of the optimal dimensions given, in DPI. + */ + private int optimalResolution = 96; + + /** + * The list of audio mimetypes reported by the client to be supported. + */ + private final List audioMimetypes = new ArrayList<>(); + + /** + * The list of video mimetypes reported by the client to be supported. + */ + private final List videoMimetypes = new ArrayList<>(); + + /** + * The list of image mimetypes reported by the client to be supported. + */ + private final List imageMimetypes = new ArrayList<>(); + + /** + * The name of the user reported by the client. + */ + private String name; + + /** + * The timezone reported by the client. + */ + private String timezone; + + /** + * Returns the optimal screen width requested by the client, in pixels. + * @return The optimal screen width requested by the client, in pixels. + */ + public int getOptimalScreenWidth() { + return optimalScreenWidth; + } + + /** + * Sets the client's optimal screen width. + * @param optimalScreenWidth The optimal screen width of the client. + */ + public void setOptimalScreenWidth(int optimalScreenWidth) { + this.optimalScreenWidth = optimalScreenWidth; + } + + /** + * Returns the optimal screen height requested by the client, in pixels. + * @return The optimal screen height requested by the client, in pixels. + */ + public int getOptimalScreenHeight() { + return optimalScreenHeight; + } + + /** + * Sets the client's optimal screen height. + * @param optimalScreenHeight The optimal screen height of the client. + */ + public void setOptimalScreenHeight(int optimalScreenHeight) { + this.optimalScreenHeight = optimalScreenHeight; + } + + /** + * Returns the resolution of the screen if the optimal width and height are + * used, in DPI. + * + * @return The optimal screen resolution. + */ + public int getOptimalResolution() { + return optimalResolution; + } + + /** + * Sets the resolution of the screen if the optimal width and height are + * used, in DPI. + * + * @param optimalResolution The optimal screen resolution in DPI. + */ + public void setOptimalResolution(int optimalResolution) { + this.optimalResolution = optimalResolution; + } + + /** + * Returns the list of audio mimetypes supported by the client. To add or + * removed supported mimetypes, the list returned by this function can be + * modified. + * + * @return The set of audio mimetypes supported by the client. + */ + public List getAudioMimetypes() { + return audioMimetypes; + } + + /** + * Returns the list of video mimetypes supported by the client. To add or + * removed supported mimetypes, the list returned by this function can be + * modified. + * + * @return The set of video mimetypes supported by the client. + */ + public List getVideoMimetypes() { + return videoMimetypes; + } + + /** + * Returns the list of image mimetypes supported by the client. To add or + * removed supported mimetypes, the list returned by this function can be + * modified. + * + * @return + * The set of image mimetypes supported by the client. + */ + public List getImageMimetypes() { + return imageMimetypes; + } + + /** + * Returns the name of the Guacamole user as reported by the client, or null + * if the user name is not set. + * + * @return + * A string value of the human-readable name reported by the client. + */ + public String getName() { + return name; + } + + /** + * Return the timezone as reported by the client, or null if the timezone + * is not set. Valid timezones are specified in IANA zone key format, + * also known as Olson time zone database or TZ Database. + * + * @return + * A string value of the timezone reported by the client. + */ + public String getTimezone() { + return timezone; + } + + /** + * Set the human-readable name of the user associated with this client. + * + * @param name + * The human-readable name of the user associated with this client. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Set the string value of the timezone, or null if the timezone will not + * be provided by the client. Valid timezones are specified in IANA zone + * key format (aka Olson time zone database or tz database). + * + * @param timezone + * The string value of the timezone reported by the client, in tz + * database format, or null if the timezone is not provided by the + * client. + */ + public void setTimezone(String timezone) { + this.timezone = timezone; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleConfiguration.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleConfiguration.java new file mode 100644 index 0000000..5c96066 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleConfiguration.java @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * All information necessary to complete the initial protocol handshake of a + * Guacamole session. + */ +public class GuacamoleConfiguration implements Serializable { + + /** + * Identifier unique to this version of GuacamoleConfiguration. + */ + private static final long serialVersionUID = 1L; + + /** + * The ID of the connection being joined. If this value is present, + * the protocol need not be specified. + */ + private String connectionID; + + /** + * The name of the protocol associated with this configuration. + */ + private String protocol; + + /** + * Map of all associated parameter values, indexed by parameter name. + */ + private final Map parameters = new HashMap(); + + /** + * Creates a new, blank GuacamoleConfiguration with its protocol, connection + * ID, and parameters unset. + */ + public GuacamoleConfiguration() { + } + + /** + * Copies the given GuacamoleConfiguration, creating a new, indepedent + * GuacamoleConfiguration containing the same protocol, connection ID, + * and parameter values, if any. + * + * @param config The GuacamoleConfiguration to copy. + */ + public GuacamoleConfiguration(GuacamoleConfiguration config) { + + // Copy protocol and connection ID + protocol = config.getProtocol(); + connectionID = config.getConnectionID(); + + // Copy parameter values + for (String name : config.getParameterNames()) + parameters.put(name, config.getParameter(name)); + + } + + /** + * Returns the ID of the connection being joined, if any. If no connection + * is being joined, this returns null, and the protocol must be set. + * + * @return The ID of the connection being joined, or null if no connection + * is being joined. + */ + public String getConnectionID() { + return connectionID; + } + + /** + * Sets the ID of the connection being joined, if any. If no connection + * is being joined, this value must be omitted. + * + * @param connectionID The ID of the connection being joined. + */ + public void setConnectionID(String connectionID) { + this.connectionID = connectionID; + } + + /** + * Returns the name of the protocol to be used. + * + * @return + * The name of the protocol to be used. + */ + public String getProtocol() { + return protocol; + } + + /** + * Sets the name of the protocol to be used. If no connection is being + * joined (a new connection is being established), this value must be set. + * + *

    If a connection is being joined, this value should still be + * set to ensure that protocol-specific responses like the + * "required" and "argv" instructions can be understood in their proper + * context by other code that may consume this GuacamoleConfiguration like + * {@link ConfiguredGuacamoleSocket}. + * + *

    If this value is unavailable or remains unset, it is still possible + * to join an established connection using + * {@link #setConnectionID(java.lang.String)}, however protocol-specific + * responses like the "required" and "argv" instructions might not be + * possible to handle correctly if the underlying protocol is not made + * available through some other means to the client receiving those + * responses. + * + * @param protocol + * The name of the protocol to be used. + */ + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + /** + * Returns the value set for the parameter with the given name, if any. + * @param name The name of the parameter to return the value for. + * @return The value of the parameter with the given name, or null if + * that parameter has not been set. + */ + public String getParameter(String name) { + return parameters.get(name); + } + + /** + * Sets the value for the parameter with the given name. + * + * @param name The name of the parameter to set the value for. + * @param value The value to set for the parameter with the given name. + */ + public void setParameter(String name, String value) { + parameters.put(name, value); + } + + /** + * Removes the value set for the parameter with the given name. + * + * @param name The name of the parameter to remove the value of. + */ + public void unsetParameter(String name) { + parameters.remove(name); + } + + /** + * Returns a set of all currently defined parameter names. Each name + * corresponds to a parameter that has a value set on this + * GuacamoleConfiguration via setParameter(). + * + * @return A set of all currently defined parameter names. + */ + public Set getParameterNames() { + return Collections.unmodifiableSet(parameters.keySet()); + } + + /** + * Returns a map which contains parameter name/value pairs as key/value + * pairs. Changes to this map will affect the parameters stored within + * this configuration. + * + * @return + * A map which contains all parameter name/value pairs as key/value + * pairs. + */ + public Map getParameters() { + return parameters; + } + + /** + * Replaces all current parameters with the parameters defined within the + * given map. Key/value pairs within the map represent parameter name/value + * pairs. + * + * @param parameters + * A map which contains all parameter name/value pairs as key/value + * pairs. + */ + public void setParameters(Map parameters) { + this.parameters.clear(); + this.parameters.putAll(parameters); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleFilter.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleFilter.java new file mode 100644 index 0000000..dd2f3a3 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleFilter.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.GuacamoleException; + +/** + * Interface which provides for the filtering of individual instructions. Each + * filtered instruction may be allowed through untouched, modified, replaced, + * dropped, or explicitly denied. + */ +public interface GuacamoleFilter { + + /** + * Applies the filter to the given instruction, returning the original + * instruction, a modified version of the original, or null, depending + * on the implementation. + * + * @param instruction The instruction to filter. + * @return The original instruction, if the instruction is to be allowed, + * a modified version of the instruction, if the instruction is + * to be overridden, or null, if the instruction is to be dropped. + * @throws GuacamoleException If an error occurs filtering the instruction, + * or if the instruction must be explicitly + * denied. + */ + public GuacamoleInstruction filter(GuacamoleInstruction instruction) throws GuacamoleException; + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleInstruction.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleInstruction.java new file mode 100644 index 0000000..2d6c7a1 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleInstruction.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * An abstract representation of a Guacamole instruction, as defined by the + * Guacamole protocol. + */ +public class GuacamoleInstruction { + + /** + * The opcode of this instruction. + */ + private final String opcode; + + /** + * All arguments of this instruction, in order. + */ + private final List args; + + /** + * The cached String result of converting this GuacamoleInstruction to the + * format used by the Guacamole protocol. + * + * @see #toString() + */ + private String rawString = null; + + /** + * The cached char[] result of converting this GuacamoleInstruction to the + * format used by the Guacamole protocol. + * + * @see #toCharArray() + */ + private char[] rawChars = null; + + /** + * Creates a new GuacamoleInstruction having the given opcode and list of + * argument values. + * + * @param opcode + * The opcode of the instruction to create. + * + * @param args + * The list of argument values to provide in the new instruction, if + * any. + */ + public GuacamoleInstruction(String opcode, String... args) { + this.opcode = opcode; + this.args = Collections.unmodifiableList(Arrays.asList(args)); + } + + /** + * Creates a new GuacamoleInstruction having the given opcode and list of + * argument values. The list given will be used to back the internal list of + * arguments and the list returned by {@link #getArgs()}. + *

    + * The provided argument list may not be modified in any way after being + * provided to this constructor. Doing otherwise will result in undefined + * behavior. + * + * @param opcode + * The opcode of the instruction to create. + * + * @param args + * The list of argument values to provide in the new instruction, if + * any. + */ + public GuacamoleInstruction(String opcode, List args) { + this.opcode = opcode; + this.args = Collections.unmodifiableList(args); + } + + /** + * Returns the opcode associated with this GuacamoleInstruction. + * + * @return + * The opcode associated with this GuacamoleInstruction. + */ + public String getOpcode() { + return opcode; + } + + /** + * Returns a List of all argument values specified for this + * GuacamoleInstruction. Note that the List returned is immutable. + * Attempts to modify the list will result in exceptions. + * + * @return + * An unmodifiable List of all argument values specified for this + * GuacamoleInstruction. + */ + public List getArgs() { + return args; + } + + /** + * Appends the given value to the provided StringBuilder as a Guacamole + * instruction element, including length prefix. + * + * @param buff + * The StringBuilder to append the element to. + * + * @param element + * The string value of the element to append. + */ + private static void appendElement(StringBuilder buff, String element) { + buff.append(element.codePointCount(0, element.length())); + buff.append('.'); + buff.append(element); + } + + /** + * Returns this GuacamoleInstruction in the form it would be sent over the + * Guacamole protocol. + * + * @return + * This GuacamoleInstruction in the form it would be sent over the + * Guacamole protocol. + */ + @Override + public String toString() { + + // Avoid rebuilding Guacamole protocol form of instruction if already + // known + if (rawString == null) { + + // Prefer to construct String from existing char array, rather than + // reconstruct protocol from scratch + if (rawChars != null) + rawString = new String(rawChars); + + // Reconstruct protocol details only if truly necessary + else { + + StringBuilder buff = new StringBuilder(); + + // Write opcode + appendElement(buff, opcode); + + // Write argument values + for (String value : args) { + buff.append(','); + appendElement(buff, value); + } + + // Write terminator + buff.append(';'); + + // Cache result for future calls + rawString = buff.toString(); + + } + + } + + return rawString; + + } + + /** + * Returns this GuacamoleInstruction in the form it would be sent over the + * Guacamole protocol. The returned char[] MUST NOT be modified. If the + * returned char[] is modified, the results of doing so are undefined. + * + * @return + * This GuacamoleInstruction in the form it would be sent over the + * Guacamole protocol. The returned char[] MUST NOT be modified. + */ + public char[] toCharArray() { + + // Avoid rebuilding Guacamole protocol form of instruction if already + // known + if (rawChars == null) + rawChars = toString().toCharArray(); + + return rawChars; + + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleParser.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleParser.java new file mode 100644 index 0000000..dbebd0a --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleParser.java @@ -0,0 +1,412 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * Parser for the Guacamole protocol. Arbitrary instruction data is appended, + * and instructions are returned as a result. Invalid instructions result in + * exceptions. + */ +public class GuacamoleParser implements Iterator { + + /** + * The maximum number of characters per instruction. + */ + public static final int INSTRUCTION_MAX_LENGTH = 8192; + + /** + * The maximum number of digits to allow per length prefix. + */ + public static final int INSTRUCTION_MAX_DIGITS = 5; + + /** + * The maximum number of elements per instruction, including the opcode. + */ + public static final int INSTRUCTION_MAX_ELEMENTS = 128; + + /** + * All possible states of the instruction parser. + */ + private enum State { + + /** + * The parser is currently waiting for data to complete the length prefix + * of the current element of the instruction. + */ + PARSING_LENGTH, + + /** + * The parser has finished reading the length prefix and is currently + * waiting for data to complete the content of the instruction. + */ + PARSING_CONTENT, + + /** + * The instruction has been fully parsed. + */ + COMPLETE, + + /** + * The instruction cannot be parsed because of a protocol error. + */ + ERROR + + } + + /** + * The latest parsed instruction, if any. + */ + private GuacamoleInstruction parsedInstruction; + + /** + * The parse state of the instruction. + */ + private State state = State.PARSING_LENGTH; + + /** + * The length of the current element, if known, in Java characters. This + * value may be adjusted as an element is parsed to take surrogates into + * account. + */ + private int elementLength = 0; + + /** + * The length of the current element, if known, in Unicode codepoints. This + * value will NOT change as an element is parsed. + */ + private int elementCodepoints; + + /** + * The number of elements currently parsed. + */ + private int elementCount = 0; + + /** + * All currently parsed elements. + */ + private final String elements[] = new String[INSTRUCTION_MAX_ELEMENTS]; + + /** + * A copy of the raw protocol data that has been parsed for the current + * instruction. This value is maintained by {@link #append(char[], int, int)}. + */ + private final char rawInstruction[] = new char[INSTRUCTION_MAX_LENGTH]; + + /** + * The offset within {@link #rawInstruction} that new data should be + * appended. This value is maintained by {@link #append(char[], int, int)}. + */ + private int rawInstructionOffset = 0; + + /** + * GuacamoleInstruction that efficiently exposes the originally parsed + * character buffer for calls to {@link #toString()} and {@link #toCharArray()} + * rather than regenerate the buffer from scratch. + */ + private static class ParsedGuacamoleInstruction extends GuacamoleInstruction { + + /** + * The original data parsed to produce this GuacamoleInstruction. + */ + private final char[] rawChars; + + /** + * A String containing the original data parsed to produce this + * GuacamoleInstruction. + */ + private String rawString = null; + + /** + * Creates a new GuacamoleInstruction that efficiently exposes the + * originally parsed character buffer rather than regenerating that + * buffer from scratch for {@link #toString()} and {@link #toCharArray()}. + * + * @param opcode + * The opcode of the instruction to create. + * + * @param args + * The list of argument values to provide in the new instruction, if + * any. + * + * @param raw + * The underlying representation of this instruction as would be sent + * over the network via the Guacamole protocol. + */ + public ParsedGuacamoleInstruction(String opcode, List args, char[] raw) { + super(opcode, args); + this.rawChars = raw; + } + + @Override + public String toString() { + + if (rawString == null) + rawString = new String(rawChars); + + return rawString; + + } + + @Override + public char[] toCharArray() { + return rawChars; + } + + } + + /** + * Appends data from the given buffer to the current instruction. + * + * @param chunk + * The buffer containing the data to append. + * + * @param offset + * The offset within the buffer where the data begins. + * + * @param length + * The length of the data to append. + * + * @return + * The number of characters appended, or 0 if complete instructions + * have already been parsed and must be read via next() before more + * data can be appended. + * + * @throws GuacamoleException + * If an error occurs while parsing the new data. + */ + public int append(char chunk[], int offset, int length) throws GuacamoleException { + + int originalOffset = offset; + int originalLength = length; + + // Process as much of the received chunk as possible + while (length > 0) { + + int appended = processElement(chunk, offset, length); + if (appended == 0) + break; + + length -= appended; + offset += appended; + } + + // Update the raw copy of the received instruction with whatever data + // has now been processed + int charsParsed = originalLength - length; + if (charsParsed > 0) { + + System.arraycopy(chunk, originalOffset, rawInstruction, rawInstructionOffset, charsParsed); + rawInstructionOffset += charsParsed; + + // If the instruction is now complete, we're good to store the + // parsed instruction for future retrieval via next() + if (state == State.COMPLETE) { + parsedInstruction = new ParsedGuacamoleInstruction(elements[0], + Arrays.asList(elements).subList(1, elementCount), + Arrays.copyOf(rawInstruction, rawInstructionOffset)); + rawInstructionOffset = 0; + } + + } + + return charsParsed; + + } + + /** + * Processes additional data from the given buffer, potentially adding + * another element to the current instruction being parsed. This function + * will need to be invoked multiple times per instruction until all data + * for that instruction is ready. + *

    + * This function DOES NOT update {@link #parsedInstruction}. The caller + * ({@link #append(char[], int, int)}) must update this as necessary when + * the parser {@link #state} indicates the instruction is complete. + * + * @param chunk + * The buffer containing the data to append. + * + * @param offset + * The offset within the buffer where the data begins. + * + * @param length + * The length of the data to append. + * + * @return + * The number of characters appended, or 0 if complete instructions + * have already been parsed and must be read via next() before more + * data can be appended. + * + * @throws GuacamoleException + * If an error occurs while parsing the new data. + */ + private int processElement(char chunk[], int offset, int length) throws GuacamoleException { + + int charsParsed = 0; + + // Do not exceed maximum number of elements + if (elementCount == INSTRUCTION_MAX_ELEMENTS && state != State.COMPLETE) { + state = State.ERROR; + throw new GuacamoleServerException("Instruction contains too many elements."); + } + + // Parse element length + if (state == State.PARSING_LENGTH) { + + int parsedLength = elementLength; + while (charsParsed < length) { + + // Pull next character + char c = chunk[offset + charsParsed++]; + + // If digit, add to length + if (c >= '0' && c <= '9') + parsedLength = parsedLength*10 + c - '0'; + + // If period, switch to parsing content + else if (c == '.') { + state = State.PARSING_CONTENT; + break; + } + + // If not digit, parse error + else { + state = State.ERROR; + throw new GuacamoleServerException("Non-numeric character in element length."); + } + + } + + // If too long, parse error + if (parsedLength > INSTRUCTION_MAX_LENGTH) { + state = State.ERROR; + throw new GuacamoleServerException("Instruction exceeds maximum length."); + } + + // Save length + elementCodepoints = elementLength = parsedLength; + + } // end parse length + + // Parse element content, if available + while (state == State.PARSING_CONTENT && charsParsed + elementLength + 1 <= length) { + + // Read element (which may not match element length if surrogate + // characters are present) + String element = new String(chunk, offset + charsParsed, elementLength); + + // Verify element contains the number of whole Unicode characters + // expected, scheduling a future read if we don't yet have enough + // characters + int codepoints = element.codePointCount(0, element.length()); + if (codepoints < elementCodepoints) { + elementLength += elementCodepoints - codepoints; + continue; + } + + // If the current element ends with a character involving both + // a high and low surrogate, elementLength points to the low + // surrogate and NOT the element terminator. We must correct the + // length and reevaluate. + else if (Character.isSurrogatePair(chunk[offset + charsParsed + elementLength - 1], + chunk[offset + charsParsed + elementLength])) { + elementLength++; + continue; + } + + charsParsed += elementLength; + elementLength = 0; + + // Add element to currently parsed elements + elements[elementCount++] = element; + + // Read terminator char following element + char terminator = chunk[offset + charsParsed++]; + switch (terminator) { + + // If semicolon, store end-of-instruction + case ';': + state = State.COMPLETE; + break; + + // If comma, move on to next element + case ',': + state = State.PARSING_LENGTH; + break; + + // Otherwise, parse error + default: + state = State.ERROR; + throw new GuacamoleServerException("Element terminator of instruction was not ';' nor ','"); + + } + + } // end parse content + + return charsParsed; + + } + + /** + * Appends data from the given buffer to the current instruction. + * + * @param chunk The data to append. + * @return The number of characters appended, or 0 if complete instructions + * have already been parsed and must be read via next() before + * more data can be appended. + * @throws GuacamoleException If an error occurs while parsing the new data. + */ + public int append(char chunk[]) throws GuacamoleException { + return append(chunk, 0, chunk.length); + } + + @Override + public boolean hasNext() { + return state == State.COMPLETE; + } + + @Override + public GuacamoleInstruction next() { + + // No instruction to return if not yet complete + if (state != State.COMPLETE) + return null; + + // Reset for next instruction. + state = State.PARSING_LENGTH; + elementCount = 0; + elementLength = 0; + + return parsedInstruction; + + } + + @Override + public void remove() { + throw new UnsupportedOperationException("GuacamoleParser does not support remove()."); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleProtocolCapability.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleProtocolCapability.java new file mode 100644 index 0000000..4a5653b --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleProtocolCapability.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +/** + * Capabilities which may not be present in all versions of the Guacamole + * protocol. + */ +public enum GuacamoleProtocolCapability { + + /** + * The protocol does not require handshake instructions to be sent in a + * specific order, nor that all handshake instructions be sent. Arbitrary + * handshake order was introduced in + * {@link GuacamoleProtocolVersion#VERSION_1_1_0}. + */ + ARBITRARY_HANDSHAKE_ORDER(GuacamoleProtocolVersion.VERSION_1_1_0), + + /** + * Support for the "msg" instruction. The "msg" instruction allows the + * server to send messages to the client. Support for this instruction was + * introduced in {@link GuacamoleProtocolVersion#VERSION_1_5_0}. + */ + MSG_INSTRUCTION(GuacamoleProtocolVersion.VERSION_1_5_0), + + /** + * Support for the "name" handshake instruction, allowing clients to send + * the name of the Guacamole user to be passed to guacd and associated with + * connections. Support for this instruction was introduced in + * {@link GuacamoleProtocolVersion#VERSION_1_5_0}. + */ + NAME_HANDSHAKE(GuacamoleProtocolVersion.VERSION_1_5_0), + + /** + * Negotiation of Guacamole protocol version between client and server + * during the protocol handshake. The ability to negotiate protocol + * versions was introduced in + * {@link GuacamoleProtocolVersion#VERSION_1_1_0}. + */ + PROTOCOL_VERSION_DETECTION(GuacamoleProtocolVersion.VERSION_1_1_0), + + /** + * Support for the "required" instruction. The "required" instruction + * allows the server to explicitly request connection parameters from the + * client without which the connection cannot continue, such as user + * credentials. Support for this instruction was introduced in + * {@link GuacamoleProtocolVersion#VERSION_1_3_0}. + */ + REQUIRED_INSTRUCTION(GuacamoleProtocolVersion.VERSION_1_3_0), + + /** + * Support for the "timezone" handshake instruction. The "timezone" + * instruction allows the client to request that the server forward their + * local timezone for use within the remote desktop session. Support for + * forwarding the client timezone was introduced in + * {@link GuacamoleProtocolVersion#VERSION_1_1_0}. + */ + TIMEZONE_HANDSHAKE(GuacamoleProtocolVersion.VERSION_1_1_0); + + /** + * The minimum protocol version required to support this capability. + */ + private final GuacamoleProtocolVersion version; + + /** + * Create a new enum value with the given protocol version as the minimum + * required to support the capability. + * + * @param version + * The minimum required protocol version for supporting the + * capability. + */ + private GuacamoleProtocolCapability(GuacamoleProtocolVersion version) { + this.version = version; + } + + /** + * Returns whether this capability is supported in the given Guacamole + * protocol version. + * + * @param version + * The Guacamole protocol version to check. + * + * @return + * true if this capability is supported by the given protocol version, + * false otherwise. + */ + public boolean isSupported(GuacamoleProtocolVersion version) { + return version.atLeast(this.version); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleProtocolVersion.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleProtocolVersion.java new file mode 100644 index 0000000..a8e4431 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleProtocolVersion.java @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Representation of a Guacamole protocol version. Convenience methods are + * provided for parsing and comparing versions, as is necessary when + * determining the version of the Guacamole protocol common to guacd and a + * client. + */ +public class GuacamoleProtocolVersion { + + /** + * Protocol version 1.0.0 and older. Any client that doesn't explicitly + * set the protocol version will negotiate down to this protocol version. + * This requires that handshake instructions be ordered correctly, and + * lacks support for certain protocol-related features introduced in later + * versions. + */ + public static final GuacamoleProtocolVersion VERSION_1_0_0 = new GuacamoleProtocolVersion(1, 0, 0); + + /** + * Protocol version 1.1.0, which introduces Client-Server version + * detection, arbitrary handshake instruction order, and support + * for passing the client timezone to the server during the handshake. + */ + public static final GuacamoleProtocolVersion VERSION_1_1_0 = new GuacamoleProtocolVersion(1, 1, 0); + + /** + * Protocol version 1.3.0, which introduces the "required" instruction + * allowing the server to explicitly request connection parameters from the + * client. + */ + public static final GuacamoleProtocolVersion VERSION_1_3_0 = new GuacamoleProtocolVersion(1, 3, 0); + + /** + * Protocol version 1.5.0, which introduces the "msg" instruction, allowing + * the server to send message notifications that will be displayed on the + * client. The version also adds support for the "name" handshake + * instruction, allowing guacd to store the name of the user who is + * accessing the connection. + */ + public static final GuacamoleProtocolVersion VERSION_1_5_0 = new GuacamoleProtocolVersion(1, 5, 0); + + /** + * The most recent version of the Guacamole protocol at the time this + * version of GuacamoleProtocolVersion was built. + */ + public static final GuacamoleProtocolVersion LATEST = VERSION_1_5_0; + + /** + * A regular expression that matches the VERSION_X_Y_Z pattern, where + * X is the major version component, Y is the minor version component, + * and Z is the patch version component. This expression puts each of + * the version components in their own group so that they can be easily + * used later. + */ + private static final Pattern VERSION_PATTERN = + Pattern.compile("^VERSION_([0-9]+)_([0-9]+)_([0-9]+)$"); + + /** + * The major version component of the protocol version. + */ + private final int major; + + /** + * The minor version component of the protocol version. + */ + private final int minor; + + /** + * The patch version component of the protocol version. + */ + private final int patch; + + /** + * Generate a new GuacamoleProtocolVersion object with the given + * major version, minor version, and patch version. + * + * @param major + * The integer representation of the major version component. + * + * @param minor + * The integer representation of the minor version component. + * + * @param patch + * The integer representation of the patch version component. + */ + public GuacamoleProtocolVersion(int major, int minor, int patch) { + this.major = major; + this.minor = minor; + this.patch = patch; + } + + /** + * Return the major version component of the protocol version. + * + * @return + * The integer major version component. + */ + public int getMajor() { + return major; + } + + /** + * Return the minor version component of the protocol version. + * + * @return + * The integer minor version component. + */ + public int getMinor() { + return minor; + } + + /** + * Return the patch version component of the protocol version. + * + * @return + * The integer patch version component. + */ + public int getPatch() { + return patch; + } + + /** + * Returns whether this GuacamoleProtocolVersion is at least as recent as + * (greater than or equal to) the given version. + * + * @param otherVersion + * The version to which this GuacamoleProtocolVersion should be compared. + * + * @return + * true if this object is at least as recent as the given version, + * false if the given version is newer. + */ + public boolean atLeast(GuacamoleProtocolVersion otherVersion) { + + // If major is not the same, return inequality + if (major != otherVersion.getMajor()) + return this.major > otherVersion.getMajor(); + + // Major is the same, but minor is not, return minor inequality + if (minor != otherVersion.getMinor()) + return this.minor > otherVersion.getMinor(); + + // Major and minor are equal, so return patch inequality + return patch >= otherVersion.getPatch(); + + } + + /** + * Parse the String format of the version provided and return the + * the enum value matching that version. If no value is provided, return + * null. + * + * @param version + * The String format of the version to parse. + * + * @return + * The enum value that matches the specified version, VERSION_1_0_0 + * if no match is found, or null if no comparison version is provided. + */ + public static GuacamoleProtocolVersion parseVersion(String version) { + + // Validate format of version string + Matcher versionMatcher = VERSION_PATTERN.matcher(version); + if (!versionMatcher.matches()) + return null; + + // Parse version number from version string + return new GuacamoleProtocolVersion( + Integer.parseInt(versionMatcher.group(1)), + Integer.parseInt(versionMatcher.group(2)), + Integer.parseInt(versionMatcher.group(3)) + ); + + } + + @Override + public int hashCode() { + int hash = 7; + hash = 61 * hash + this.major; + hash = 61 * hash + this.minor; + hash = 61 * hash + this.patch; + return hash; + } + + @Override + public boolean equals(Object obj) { + + if (obj == null || !(obj instanceof GuacamoleProtocolVersion)) + return false; + + // Versions are equal if all major/minor/patch components are identical + final GuacamoleProtocolVersion otherVersion = (GuacamoleProtocolVersion) obj; + return this.major == otherVersion.getMajor() + && this.minor == otherVersion.getMinor() + && this.patch == otherVersion.getPatch(); + + } + + @Override + public String toString() { + return "VERSION_" + getMajor() + "_" + getMinor() + "_" + getPatch(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleStatus.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleStatus.java new file mode 100644 index 0000000..894dc06 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/GuacamoleStatus.java @@ -0,0 +1,421 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.GuacamoleClientBadTypeException; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleClientOverrunException; +import org.apache.guacamole.GuacamoleClientTimeoutException; +import org.apache.guacamole.GuacamoleClientTooManyException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceClosedException; +import org.apache.guacamole.GuacamoleResourceConflictException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleServerBusyException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.GuacamoleSessionClosedException; +import org.apache.guacamole.GuacamoleSessionConflictException; +import org.apache.guacamole.GuacamoleSessionTimeoutException; +import org.apache.guacamole.GuacamoleUnauthorizedException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.GuacamoleUpstreamException; +import org.apache.guacamole.GuacamoleUpstreamNotFoundException; +import org.apache.guacamole.GuacamoleUpstreamTimeoutException; +import org.apache.guacamole.GuacamoleUpstreamUnavailableException; + +/** + * All possible statuses returned by various Guacamole instructions, each having + * a corresponding code. + */ +public enum GuacamoleStatus { + + /** + * The operation succeeded. + */ + SUCCESS(200, 1000, 0x0000) { + + @Override + public GuacamoleException toException(String message) { + throw new IllegalStateException("The Guacamole protocol SUCCESS " + + "status code cannot be converted into a " + + "GuacamoleException.", new GuacamoleServerException(message)); + } + + }, + + /** + * The requested operation is unsupported. + */ + UNSUPPORTED(501, 1011, 0x0100) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleUnsupportedException(message); + } + + }, + + /** + * The operation could not be performed due to an internal failure. + */ + SERVER_ERROR(500, 1011, 0x0200) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleServerException(message); + } + + }, + + /** + * The operation could not be performed as the server is busy. + */ + SERVER_BUSY(503, 1008, 0x0201) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleServerBusyException(message); + } + + }, + + /** + * The operation could not be performed because the upstream server is not + * responding. + */ + UPSTREAM_TIMEOUT(504, 1011, 0x0202) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleUpstreamTimeoutException(message); + } + + }, + + /** + * The operation was unsuccessful due to an error or otherwise unexpected + * condition of the upstream server. + */ + UPSTREAM_ERROR(502, 1011, 0x0203) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleUpstreamException(message); + } + + }, + + /** + * The operation could not be performed as the requested resource does not + * exist. + */ + RESOURCE_NOT_FOUND(404, 1002, 0x0204) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleResourceNotFoundException(message); + } + + }, + + /** + * The operation could not be performed as the requested resource is already + * in use. + */ + RESOURCE_CONFLICT(409, 1008, 0x0205) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleResourceConflictException(message); + } + + }, + + /** + * The operation could not be performed as the requested resource is now + * closed. + */ + RESOURCE_CLOSED(404, 1002, 0x0206) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleResourceClosedException(message); + } + + }, + + /** + * The operation could not be performed because the upstream server does + * not appear to exist. + */ + UPSTREAM_NOT_FOUND(502, 1011, 0x0207) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleUpstreamNotFoundException(message); + } + + }, + + /** + * The operation could not be performed because the upstream server is not + * available to service the request. + */ + UPSTREAM_UNAVAILABLE(502, 1011, 0x0208) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleUpstreamUnavailableException(message); + } + + }, + + /** + * The session within the upstream server has ended because it conflicted + * with another session. + */ + SESSION_CONFLICT(409, 1008, 0x0209) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleSessionConflictException(message); + } + + }, + + /** + * The session within the upstream server has ended because it appeared to + * be inactive. + */ + SESSION_TIMEOUT(408, 1002, 0x020A) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleSessionTimeoutException(message); + } + + }, + + /** + * The session within the upstream server has been forcibly terminated. + */ + SESSION_CLOSED(404, 1002, 0x020B) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleSessionClosedException(message); + } + + }, + + /** + * The operation could not be performed because bad parameters were given. + */ + CLIENT_BAD_REQUEST(400, 1002, 0x0300) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleClientException(message); + } + + }, + + /** + * Permission was denied to perform the operation, as the user is not yet + * authorized (not yet logged in, for example). As HTTP 401 has implications + * for HTTP-specific authorization schemes, this status continues to map to + * HTTP 403 ("Forbidden"). To do otherwise would risk unintended effects. + */ + CLIENT_UNAUTHORIZED(403, 1008, 0x0301) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleUnauthorizedException(message); + } + + }, + + /** + * Permission was denied to perform the operation, and this operation will + * not be granted even if the user is authorized. + */ + CLIENT_FORBIDDEN(403, 1008, 0x0303) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleSecurityException(message); + } + + }, + + /** + * The client took too long to respond. + */ + CLIENT_TIMEOUT(408, 1002, 0x0308) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleClientTimeoutException(message); + } + + }, + + /** + * The client sent too much data. + */ + CLIENT_OVERRUN(413, 1009, 0x030D) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleClientOverrunException(message); + } + + }, + + /** + * The client sent data of an unsupported or unexpected type. + */ + CLIENT_BAD_TYPE(415, 1003, 0x030F) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleClientBadTypeException(message); + } + + }, + + /** + * The operation failed because the current client is already using too + * many resources. + */ + CLIENT_TOO_MANY(429, 1008, 0x031D) { + + @Override + public GuacamoleException toException(String message) { + return new GuacamoleClientTooManyException(message); + } + + }; + + /** + * The most applicable HTTP error code. + */ + private final int http_code; + + /** + * The most applicable WebSocket error code. + */ + private final int websocket_code; + + /** + * The Guacamole protocol status code. + */ + private final int guac_code; + + /** + * Initializes a GuacamoleStatusCode with the given HTTP and Guacamole + * status/error code values. + * + * @param http_code The most applicable HTTP error code. + * @param websocket_code The most applicable WebSocket error code. + * @param guac_code The Guacamole protocol status code. + */ + private GuacamoleStatus(int http_code, int websocket_code, int guac_code) { + this.http_code = http_code; + this.websocket_code = websocket_code; + this.guac_code = guac_code; + } + + /** + * Returns the most applicable HTTP error code. + * + * @return The most applicable HTTP error code. + */ + public int getHttpStatusCode() { + return http_code; + } + + /** + * Returns the most applicable HTTP error code. + * + * @return The most applicable HTTP error code. + */ + public int getWebSocketCode() { + return websocket_code; + } + + /** + * Returns the corresponding Guacamole protocol status code. + * + * @return The corresponding Guacamole protocol status code. + */ + public int getGuacamoleStatusCode() { + return guac_code; + } + + /** + * Returns the GuacamoleStatus corresponding to the given Guacamole + * protocol status code. If no such GuacamoleStatus is defined, null is + * returned. + * + * @param code + * The Guacamole protocol status code to translate into a + * GuacamoleStatus. + * + * @return + * The GuacamoleStatus corresponding to the given Guacamole protocol + * status code, or null if no such GuacamoleStatus is defined. + */ + public static GuacamoleStatus fromGuacamoleStatusCode(int code) { + + // Search for a GuacamoleStatus having the given status code + for (GuacamoleStatus status : values()) { + if (status.getGuacamoleStatusCode() == code) + return status; + } + + // No such status found + return null; + + } + + /** + * Returns an instance of the {@link GuacamoleException} subclass + * corresponding to this Guacamole protocol status code. All status codes + * have a corresponding GuacamoleException except for {@link SUCCESS}. The + * returned GuacamoleException will have the provided human-readable + * message. + * + * @param message + * A human readable description of the error that occurred. + * + * @return + * An instance of the {@link GuacamoleException} subclass that + * corresponds to this status code and has the provided human-readable + * message. + * + * @throws IllegalStateException + * If invoked on {@link SUCCESS}, which has no corresponding + * GuacamoleException. + */ + public abstract GuacamoleException toException(String message); + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/protocol/package-info.java b/guacamole-common/src/main/java/org/apache/guacamole/protocol/package-info.java new file mode 100644 index 0000000..e80ecd0 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/protocol/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes relating directly to the Guacamole protocol. + */ +package org.apache.guacamole.protocol; + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnel.java b/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnel.java new file mode 100644 index 0000000..ff68b0c --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnel.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.servlet; + +import org.apache.guacamole.net.DelegatingGuacamoleTunnel; +import org.apache.guacamole.net.GuacamoleTunnel; + +/** + * Tracks the last time a particular GuacamoleTunnel was accessed. This + * information is not necessary for tunnels associated with WebSocket + * connections, as each WebSocket connection has its own read thread which + * continuously checks the state of the tunnel and which will automatically + * timeout when the underlying socket times out, but the HTTP tunnel has no + * such thread. Because the HTTP tunnel requires the stream to be split across + * multiple requests, tracking of activity on the tunnel must be performed + * independently of the HTTP requests. + */ +class GuacamoleHTTPTunnel extends DelegatingGuacamoleTunnel { + + /** + * The last time this tunnel was accessed. + */ + private long lastAccessedTime; + + /** + * Creates a new GuacamoleHTTPTunnel which wraps the given tunnel. + * Absolutely all function calls on this new GuacamoleHTTPTunnel will be + * delegated to the underlying GuacamoleTunnel. + * + * @param wrappedTunnel + * The GuacamoleTunnel to wrap within this GuacamoleHTTPTunnel. + */ + public GuacamoleHTTPTunnel(GuacamoleTunnel wrappedTunnel) { + super(wrappedTunnel); + } + + /** + * Updates this tunnel, marking it as recently accessed. + */ + public void access() { + lastAccessedTime = System.currentTimeMillis(); + } + + /** + * Returns the time this tunnel was last accessed, as the number of + * milliseconds since midnight January 1, 1970 GMT. Tunnel access must + * be explicitly marked through calls to the access() function. + * + * @return + * The time this tunnel was last accessed. + */ + public long getLastAccessedTime() { + return lastAccessedTime; + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnelMap.java b/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnelMap.java new file mode 100644 index 0000000..918ca20 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnelMap.java @@ -0,0 +1,211 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.servlet; + +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Map-style object which tracks in-use HTTP tunnels, automatically removing + * and closing tunnels which have not been used recently. This class is + * intended for use only within the GuacamoleHTTPTunnelServlet implementation, + * and has no real utility outside that implementation. + */ +class GuacamoleHTTPTunnelMap { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(GuacamoleHTTPTunnelMap.class); + + /** + * The number of seconds to wait between tunnel accesses before timing out + * Note that this will be enforced only within a factor of 2. If a tunnel + * is unused, it will take between TUNNEL_TIMEOUT and TUNNEL_TIMEOUT*2 + * seconds before that tunnel is closed and removed. + */ + private static final int TUNNEL_TIMEOUT = 15; + + /** + * Executor service which runs the periodic tunnel timeout task. + */ + private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + + /** + * Map of all tunnels that are using HTTP, indexed by their tunnel-specific + * session tokens. + */ + private final ConcurrentMap tunnelMap = + new ConcurrentHashMap(); + + /** + * Creates a new GuacamoleHTTPTunnelMap which automatically closes and + * removes HTTP tunnels which are no longer in use. + */ + public GuacamoleHTTPTunnelMap() { + + // Check for unused tunnels every few seconds + executor.scheduleAtFixedRate( + new TunnelTimeoutTask(TUNNEL_TIMEOUT * 1000l), + TUNNEL_TIMEOUT, TUNNEL_TIMEOUT, TimeUnit.SECONDS); + + } + + /** + * Task which iterates through all registered tunnels, removing and those + * tunnels which have not been accessed for a given number of milliseconds. + */ + private class TunnelTimeoutTask implements Runnable { + + /** + * The maximum amount of time to allow between accesses to any one + * HTTP tunnel, in milliseconds. + */ + private final long tunnelTimeout; + + /** + * Creates a new task which automatically closes and removes tunnels + * which have not been accessed for at least the given number of + * milliseconds. + * + * @param tunnelTimeout + * The maximum amount of time to allow between separate tunnel + * read/write requests, in milliseconds. + */ + public TunnelTimeoutTask(long tunnelTimeout) { + this.tunnelTimeout = tunnelTimeout; + } + + @Override + public void run() { + + // Get current time + long now = System.currentTimeMillis(); + + // For each tunnel, close and remove any tunnels which have expired + Iterator> entries = tunnelMap.entrySet().iterator(); + while (entries.hasNext()) { + + Map.Entry entry = entries.next(); + GuacamoleHTTPTunnel tunnel = entry.getValue(); + + // Get elapsed time since last access + long age = now - tunnel.getLastAccessedTime(); + + // If tunnel is too old, close and remove it + if (age >= tunnelTimeout) { + + // Remove old entry + logger.debug("HTTP tunnel \"{}\" has timed out.", entry.getKey()); + entries.remove(); + + // Attempt to close tunnel + try { + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close expired HTTP tunnel.", e); + } + + } + + } // end for each tunnel + + } // end timeout task run() + + } + + /** + * Returns the GuacamoleTunnel associated with the given tunnel-specific + * session token, wrapped within a GuacamoleHTTPTunnel. If the no tunnel + * is associated with the given token, null is returned. + * + * @param tunnelSessionToken + * The tunnel-specific session token of the HTTP tunnel to retrieve. + * + * @return + * The GuacamoleTunnel associated with the given tunnel-specific + * session token, wrapped within a GuacamoleHTTPTunnel, if such a + * tunnel exists, or null if there is no such tunnel. + */ + public GuacamoleHTTPTunnel get(String tunnelSessionToken) { + + // Update the last access time + GuacamoleHTTPTunnel tunnel = tunnelMap.get(tunnelSessionToken); + if (tunnel != null) + tunnel.access(); + + // Return tunnel, if any + return tunnel; + + } + + /** + * Registers that a new connection has been established using HTTP via the + * given GuacamoleTunnel. + * + * @param tunnelSessionToken + * The tunnel-specific session token of the HTTP tunnel being added + * (registered). + * + * @param tunnel + * The GuacamoleTunnel being registered, its associated connection + * having just been established via HTTP. + */ + public void put(String tunnelSessionToken, GuacamoleTunnel tunnel) { + tunnelMap.put(tunnelSessionToken, new GuacamoleHTTPTunnel(tunnel)); + } + + /** + * Removes the GuacamoleTunnel associated with the given tunnel-specific + * session token, if such a tunnel exists. The original tunnel is returned + * wrapped within a GuacamoleHTTPTunnel. + * + * @param tunnelSessionToken + * The tunnel-specific session token of the HTTP tunnel to remove + * (deregister). + * + * @return + * The GuacamoleTunnel having the given tunnel-specific session token, + * if such a tunnel exists, wrapped within a GuacamoleHTTPTunnel, or + * null if no such tunnel exists and no removal was performed. + */ + public GuacamoleHTTPTunnel remove(String tunnelSessionToken) { + return tunnelMap.remove(tunnelSessionToken); + } + + /** + * Shuts down this tunnel map, disallowing future tunnels from being + * registered and reclaiming any resources. + */ + public void shutdown() { + executor.shutdownNow(); + } + +} diff --git a/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnelServlet.java b/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnelServlet.java new file mode 100644 index 0000000..4920769 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/servlet/GuacamoleHTTPTunnelServlet.java @@ -0,0 +1,594 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.servlet; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; +import java.security.SecureRandom; +import java.util.Base64; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A HttpServlet implementing and abstracting the operations required by the + * HTTP implementation of the JavaScript Guacamole client's tunnel. + */ +public abstract class GuacamoleHTTPTunnelServlet extends HttpServlet { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(GuacamoleHTTPTunnelServlet.class); + + /** + * Map of absolutely all active tunnels using HTTP, indexed by tunnel + * session token. + */ + private final GuacamoleHTTPTunnelMap tunnels = new GuacamoleHTTPTunnelMap(); + + /** + * The name of the HTTP header that contains the tunnel-specific session + * token identifying each active and distinct HTTP tunnel connection. + */ + private static final String TUNNEL_TOKEN_HEADER_NAME = "Guacamole-Tunnel-Token"; + + /** + * The prefix of the query string which denotes a tunnel read operation. + */ + private static final String READ_PREFIX = "read:"; + + /** + * The prefix of the query string which denotes a tunnel write operation. + */ + private static final String WRITE_PREFIX = "write:"; + + /** + * Instance of SecureRandom for generating the session token specific to + * each distinct HTTP tunnel connection. + */ + private final SecureRandom secureRandom = new SecureRandom(); + + /** + * Instance of Base64.Encoder for encoding random session tokens as + * strings. + */ + private final Base64.Encoder encoder = Base64.getEncoder(); + + /** + * Generates a new, securely-random session token that may be used to + * represent the ongoing communication session of a distinct HTTP tunnel + * connection. + * + * @return + * A new, securely-random session token. + */ + protected String generateToken() { + byte[] bytes = new byte[33]; + secureRandom.nextBytes(bytes); + return encoder.encodeToString(bytes); + } + + /** + * Registers the given tunnel such that future read/write requests to that + * tunnel will be properly directed. + * + * @deprecated + * This function has been deprecated in favor of {@link #registerTunnel(java.lang.String, org.apache.guacamole.net.GuacamoleTunnel)}, + * which decouples identification of HTTP tunnel sessions from the + * tunnel UUID. + * + * @param tunnel + * The tunnel to register. + */ + @Deprecated + protected void registerTunnel(GuacamoleTunnel tunnel) { + registerTunnel(tunnel.getUUID().toString(), tunnel); + } + + /** + * Registers the given HTTP tunnel such that future read/write requests + * including the given tunnel-specific session token will be properly + * directed. The session token must be unpredictable (securely-random) and + * unique across all active HTTP tunnels. It is recommended that each HTTP + * tunnel session token be obtained through calling {@link #generateToken()}. + * + * @param tunnelSessionToken + * The tunnel-specific session token to associate with the HTTP tunnel + * being registered. + * + * @param tunnel + * The tunnel to register. + */ + protected void registerTunnel(String tunnelSessionToken, GuacamoleTunnel tunnel) { + tunnels.put(tunnelSessionToken, tunnel); + logger.debug("Registered tunnel \"{}\".", tunnel.getUUID()); + } + + /** + * Deregisters the given tunnel such that future read/write requests to + * that tunnel will be rejected. + * + * @deprecated + * This function has been deprecated in favor of {@link #deregisterTunnel(java.lang.String)}, + * which decouples identification of HTTP tunnel sessions from the + * tunnel UUID. + * + * @param tunnel + * The tunnel to deregister. + */ + @Deprecated + protected void deregisterTunnel(GuacamoleTunnel tunnel) { + deregisterTunnel(tunnel.getUUID().toString()); + } + + /** + * Deregisters the HTTP tunnel associated with the given tunnel-specific + * session token such that future read/write requests to that tunnel will + * be rejected. Each HTTP tunnel must be associated with a session token + * unique to that tunnel via a call {@link #registerTunnel(java.lang.String, org.apache.guacamole.net.GuacamoleTunnel)}. + * + * @param tunnelSessionToken + * The tunnel-specific session token associated with the HTTP tunnel + * being deregistered. + */ + protected void deregisterTunnel(String tunnelSessionToken) { + GuacamoleTunnel tunnel = tunnels.remove(tunnelSessionToken); + if (tunnel != null) + logger.debug("Deregistered tunnel \"{}\".", tunnel.getUUID()); + } + + /** + * Returns the tunnel associated with the given tunnel-specific session + * token, if it has been registered with {@link #registerTunnel(java.lang.String, org.apache.guacamole.net.GuacamoleTunnel)} + * and not yet deregistered with {@link #deregisterTunnel(java.lang.String)}. + * + * @param tunnelSessionToken + * The tunnel-specific session token associated with the HTTP tunnel to + * be retrieved. + * + * @return + * The tunnel corresponding to the given session token. + * + * @throws GuacamoleException + * If the requested tunnel does not exist because it has not yet been + * registered or it has been deregistered. + */ + protected GuacamoleTunnel getTunnel(String tunnelSessionToken) + throws GuacamoleException { + + // Pull tunnel from map + GuacamoleTunnel tunnel = tunnels.get(tunnelSessionToken); + if (tunnel == null) + throw new GuacamoleResourceNotFoundException("No such tunnel."); + + return tunnel; + + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { + handleTunnelRequest(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { + handleTunnelRequest(request, response); + } + + /** + * Sends an error on the given HTTP response using the information within + * the given GuacamoleStatus. + * + * @param response + * The HTTP response to use to send the error. + * + * @param guacamoleStatusCode + * The GuacamoleStatus code to send. + * + * @param guacamoleHttpCode + * The numeric HTTP code to send. + * + * @param message + * The human-readable error message to send. + * + * @throws ServletException + * If an error prevents sending of the error code. + */ + protected void sendError(HttpServletResponse response, int guacamoleStatusCode, + int guacamoleHttpCode, String message) + throws ServletException { + + try { + + // If response not committed, send error code and message + if (!response.isCommitted()) { + response.addHeader("Guacamole-Status-Code", Integer.toString(guacamoleStatusCode)); + response.addHeader("Guacamole-Error-Message", message); + response.sendError(guacamoleHttpCode); + } + + } + catch (IOException ioe) { + + // If unable to send error at all due to I/O problems, + // rethrow as servlet exception + throw new ServletException(ioe); + + } + + } + + /** + * Dispatches every HTTP GET and POST request to the appropriate handler + * function based on the query string. + * + * @param request + * The HttpServletRequest associated with the GET or POST request + * received. + * + * @param response + * The HttpServletResponse associated with the GET or POST request + * received. + * + * @throws ServletException + * If an error occurs while servicing the request. + */ + protected void handleTunnelRequest(HttpServletRequest request, + HttpServletResponse response) throws ServletException { + + try { + + String query = request.getQueryString(); + if (query == null) + throw new GuacamoleClientException("No query string provided."); + + // If connect operation, call doConnect() and return tunnel + // session token and UUID in response + if (query.equals("connect")) { + + GuacamoleTunnel tunnel = doConnect(request); + if (tunnel == null) + throw new GuacamoleResourceNotFoundException("No tunnel created."); + + // Register newly-created tunnel + String tunnelSessionToken = generateToken(); + registerTunnel(tunnelSessionToken, tunnel); + + try { + // Ensure buggy browsers do not cache response + response.setHeader("Cache-Control", "no-cache"); + + // Include tunnel session token for future requests + response.setHeader(TUNNEL_TOKEN_HEADER_NAME, tunnelSessionToken); + + // Send UUID to client + response.getWriter().print(tunnel.getUUID().toString()); + } + catch (IOException e) { + throw new GuacamoleServerException(e); + } + + // Connection successful + return; + + } + + // Pull tunnel-specific session token from request + String tunnelSessionToken = request.getHeader(TUNNEL_TOKEN_HEADER_NAME); + if (tunnelSessionToken == null) + throw new GuacamoleClientException("The HTTP tunnel session " + + "token is required for all requests after " + + "connecting."); + + // Dispatch valid tunnel read/write operations + if (query.startsWith(READ_PREFIX)) + doRead(request, response, tunnelSessionToken); + else if (query.startsWith(WRITE_PREFIX)) + doWrite(request, response, tunnelSessionToken); + + // Otherwise, invalid operation + else + throw new GuacamoleClientException("Invalid tunnel operation: " + query); + + } + + // Catch any thrown guacamole exception and attempt to pass within the + // HTTP response, logging each error appropriately. + catch (GuacamoleClientException e) { + logger.warn("HTTP tunnel request rejected: {}", e.getMessage()); + sendError(response, e.getStatus().getGuacamoleStatusCode(), + e.getStatus().getHttpStatusCode(), e.getMessage()); + } + catch (GuacamoleException e) { + logger.error("HTTP tunnel request failed: {}", e.getMessage()); + logger.debug("Internal error in HTTP tunnel.", e); + sendError(response, e.getStatus().getGuacamoleStatusCode(), + e.getStatus().getHttpStatusCode(), "Internal server error."); + } + + } + + /** + * Called whenever the JavaScript Guacamole client makes a connection + * request via HTTP. It it up to the implementor of this function to define + * what conditions must be met for a tunnel to be configured and returned + * as a result of this connection request (whether some sort of credentials + * must be specified, for example). + * + * @param request + * The HttpServletRequest associated with the connection request + * received. Any parameters specified along with the connection request + * can be read from this object. + * + * @return + * A newly constructed GuacamoleTunnel if successful, null otherwise. + * + * @throws GuacamoleException + * If an error occurs while constructing the GuacamoleTunnel, or if the + * conditions required for connection are not met. + */ + protected abstract GuacamoleTunnel doConnect(HttpServletRequest request) + throws GuacamoleException; + + /** + * Called whenever the JavaScript Guacamole client makes a read request. + * This function should in general not be overridden, as it already + * contains a proper implementation of the read operation. + * + * @param request + * The HttpServletRequest associated with the read request received. + * + * @param response + * The HttpServletResponse associated with the write request received. + * Any data to be sent to the client in response to the write request + * should be written to the response body of this HttpServletResponse. + * + * @param tunnelSessionToken + * The tunnel-specific session token of the HTTP tunnel to read from, + * as specified in the read request. This tunnel must have been created + * by a previous call to doConnect(). + * + * @throws GuacamoleException + * If an error occurs while handling the read request. + */ + protected void doRead(HttpServletRequest request, + HttpServletResponse response, String tunnelSessionToken) + throws GuacamoleException { + + // Get tunnel, ensure tunnel exists + GuacamoleTunnel tunnel = getTunnel(tunnelSessionToken); + + // Ensure tunnel is open + if (!tunnel.isOpen()) + throw new GuacamoleResourceNotFoundException("Tunnel is closed."); + + // Obtain exclusive read access + GuacamoleReader reader = tunnel.acquireReader(); + + try { + + // Note that although we are sending text, Webkit browsers will + // buffer 1024 bytes before starting a normal stream if we use + // anything but application/octet-stream. + response.setContentType("application/octet-stream"); + response.setHeader("Cache-Control", "no-cache"); + + // Get writer for response + Writer out = new BufferedWriter(new OutputStreamWriter( + response.getOutputStream(), "UTF-8")); + + // Stream data to response, ensuring output stream is closed + try { + + // Deregister tunnel and throw error if we reach EOF without + // having ever sent any data + char[] message = reader.read(); + if (message == null) + throw new GuacamoleConnectionClosedException("Tunnel reached end of stream."); + + // For all messages, until another stream is ready (we send at least one message) + do { + + // Get message output bytes + out.write(message, 0, message.length); + + // Flush if we expect to wait + if (!reader.available()) { + out.flush(); + response.flushBuffer(); + } + + // No more messages another stream can take over + if (tunnel.hasQueuedReaderThreads()) + break; + + } while (tunnel.isOpen() && (message = reader.read()) != null); + + // Close tunnel immediately upon EOF + if (message == null) { + deregisterTunnel(tunnelSessionToken); + tunnel.close(); + } + + // End-of-instructions marker + out.write("0.;"); + out.flush(); + response.flushBuffer(); + } + + // Send end-of-stream marker and close tunnel if connection is closed + catch (GuacamoleConnectionClosedException e) { + + // Deregister and close + deregisterTunnel(tunnelSessionToken); + tunnel.close(); + + // End-of-instructions marker + out.write("0.;"); + out.flush(); + response.flushBuffer(); + + } + + catch (GuacamoleException e) { + + // Deregister and close + deregisterTunnel(tunnelSessionToken); + tunnel.close(); + + throw e; + } + + // Always close output stream + finally { + out.close(); + } + + } + catch (IOException e) { + + // Log typically frequent I/O error if desired + logger.debug("Error writing to servlet output stream", e); + + // Deregister and close + deregisterTunnel(tunnelSessionToken); + tunnel.close(); + + } + finally { + tunnel.releaseReader(); + } + + } + + /** + * Called whenever the JavaScript Guacamole client makes a write request. + * This function should in general not be overridden, as it already + * contains a proper implementation of the write operation. + * + * @param request + * The HttpServletRequest associated with the write request received. + * Any data to be written will be specified within the body of this + * request. + * + * @param response + * The HttpServletResponse associated with the write request received. + * + * @param tunnelSessionToken + * The tunnel-specific session token of the HTTP tunnel to write to, + * as specified in the write request. This tunnel must have been created + * by a previous call to doConnect(). + * + * @throws GuacamoleException + * If an error occurs while handling the write request. + */ + protected void doWrite(HttpServletRequest request, + HttpServletResponse response, String tunnelSessionToken) + throws GuacamoleException { + + GuacamoleTunnel tunnel = getTunnel(tunnelSessionToken); + + // We still need to set the content type to avoid the default of + // text/html, as such a content type would cause some browsers to + // attempt to parse the result, even though the JavaScript client + // does not explicitly request such parsing. + response.setContentType("application/octet-stream"); + response.setHeader("Cache-Control", "no-cache"); + response.setContentLength(0); + + // Send data + try { + + // Get writer from tunnel + GuacamoleWriter writer = tunnel.acquireWriter(); + + // Get input reader for HTTP stream + Reader input = new InputStreamReader( + request.getInputStream(), "UTF-8"); + + // Transfer data from input stream to tunnel output, ensuring + // input is always closed + try { + + // Buffer + int length; + char[] buffer = new char[8192]; + + // Transfer data using buffer + while (tunnel.isOpen() && + (length = input.read(buffer, 0, buffer.length)) != -1) + writer.write(buffer, 0, length); + + } + + // Close input stream in all cases + finally { + input.close(); + } + + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + } + catch (IOException e) { + + // Deregister and close + deregisterTunnel(tunnelSessionToken); + tunnel.close(); + + throw new GuacamoleServerException("I/O Error sending data to server: " + e.getMessage(), e); + } + finally { + tunnel.releaseWriter(); + } + + } + + @Override + public void destroy() { + tunnels.shutdown(); + } + +} + +/** + * \example ExampleTunnelServlet.java + * + * A basic example demonstrating extending GuacamoleTunnelServlet and + * implementing doConnect() to configure the Guacamole connection as + * desired. + */ + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/servlet/package-info.java b/guacamole-common/src/main/java/org/apache/guacamole/servlet/package-info.java new file mode 100644 index 0000000..81965f2 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/servlet/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which build upon the Java Servlet API, providing an HTTP-based + * tunnel and session management. + */ +package org.apache.guacamole.servlet; + diff --git a/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java b/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java new file mode 100644 index 0000000..772ce64 --- /dev/null +++ b/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java @@ -0,0 +1,373 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.websocket; + +import java.io.IOException; +import java.util.List; +import javax.websocket.CloseReason; +import javax.websocket.CloseReason.CloseCode; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.RemoteEndpoint; +import javax.websocket.Session; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.protocol.FilteredGuacamoleWriter; +import org.apache.guacamole.protocol.GuacamoleFilter; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.protocol.GuacamoleStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A WebSocket implementation of GuacamoleTunnel functionality, compatible with + * the Guacamole.WebSocketTunnel object included with the JavaScript API. + * Messages sent/received are simply chunks of the Guacamole protocol + * instruction stream. + */ +public abstract class GuacamoleWebSocketTunnelEndpoint extends Endpoint { + + /** + * The default, minimum buffer size for instructions. + */ + private static final int BUFFER_SIZE = 8192; + + /** + * The opcode of the instruction used to indicate a connection stability + * test ping request or response. Note that this instruction is + * encapsulated within an internal tunnel instruction (with the opcode + * being the empty string), thus this will actually be the value of the + * first element of the received instruction. + */ + private static final String PING_OPCODE = "ping"; + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(GuacamoleWebSocketTunnelEndpoint.class); + + /** + * The underlying GuacamoleTunnel. WebSocket reads/writes will be handled + * as reads/writes to this tunnel. This value may be null if no connection + * has been established. + */ + private GuacamoleTunnel tunnel; + + /** + * Remote (client) side of this connection. This value will always be + * non-null if tunnel is non-null. + */ + private RemoteEndpoint.Basic remote; + + /** + * Sends the numeric Guacaomle Status Code and Web Socket + * code and closes the connection. + * + * @param session + * The outbound WebSocket connection to close. + * + * @param guacamoleStatusCode + * The numeric Guacamole status to send. + * + * @param webSocketCode + * The numeric WebSocket status to send. + */ + private void closeConnection(Session session, int guacamoleStatusCode, + int webSocketCode) { + + try { + CloseCode code = CloseReason.CloseCodes.getCloseCode(webSocketCode); + String message = Integer.toString(guacamoleStatusCode); + session.close(new CloseReason(code, message)); + } + catch (IOException e) { + logger.debug("Unable to close WebSocket connection.", e); + } + + } + + /** + * Sends the given Guacaomle Status and closes the given + * connection. + * + * @param session + * The outbound WebSocket connection to close. + * + * @param guacStatus + * The status to use for the connection. + */ + private void closeConnection(Session session, GuacamoleStatus guacStatus) { + closeConnection(session, guacStatus.getGuacamoleStatusCode(), + guacStatus.getWebSocketCode()); + } + + /** + * Sends a Guacamole instruction along the outbound WebSocket connection to + * the connected Guacamole client. If an instruction is already in the + * process of being sent by another thread, this function will block until + * in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from being + * sent. + */ + private void sendInstruction(String instruction) + throws IOException { + + // NOTE: Synchronization on the non-final remote field here is + // intentional. The remote (the outbound websocket connection) is only + // sensitive to simultaneous attempts to send messages with respect to + // itself. If the remote changes, then the outbound websocket + // connection has changed, and synchronization need only be performed + // in context of the new remote. + synchronized (remote) { + remote.sendText(instruction); + } + + } + + /** + * Sends a Guacamole instruction along the outbound WebSocket connection to + * the connected Guacamole client. If an instruction is already in the + * process of being sent by another thread, this function will block until + * in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from being + * sent. + */ + private void sendInstruction(GuacamoleInstruction instruction) + throws IOException { + sendInstruction(instruction.toString()); + } + + /** + * Returns a new tunnel for the given session. How this tunnel is created + * or retrieved is implementation-dependent. + * + * @param session The session associated with the active WebSocket + * connection. + * @param config Configuration information associated with the instance of + * the endpoint created for handling this single connection. + * @return A connected tunnel, or null if no such tunnel exists. + * @throws GuacamoleException If an error occurs while retrieving the + * tunnel, or if access to the tunnel is denied. + */ + protected abstract GuacamoleTunnel createTunnel(Session session, EndpointConfig config) + throws GuacamoleException; + + @Override + @OnOpen + public void onOpen(final Session session, EndpointConfig config) { + + // Store underlying remote for future use via sendInstruction() + remote = session.getBasicRemote(); + + try { + + // Get tunnel + tunnel = createTunnel(session, config); + if (tunnel == null) { + closeConnection(session, GuacamoleStatus.RESOURCE_NOT_FOUND); + return; + } + + } + catch (GuacamoleException e) { + logger.error("Creation of WebSocket tunnel to guacd failed: {}", e.getMessage()); + logger.debug("Error connecting WebSocket tunnel.", e); + closeConnection(session, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + return; + } + + // Manually register message handler + session.addMessageHandler(new MessageHandler.Whole() { + + @Override + public void onMessage(String message) { + GuacamoleWebSocketTunnelEndpoint.this.onMessage(message); + } + + }); + + // Prepare read transfer thread + Thread readThread = new Thread() { + + @Override + public void run() { + + StringBuilder buffer = new StringBuilder(BUFFER_SIZE); + GuacamoleReader reader = tunnel.acquireReader(); + char[] readMessage; + + try { + + // Send tunnel UUID + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + tunnel.getUUID().toString() + )); + + try { + + // Attempt to read + while ((readMessage = reader.read()) != null) { + + // Buffer message + buffer.append(readMessage); + + // Flush if we expect to wait or buffer is getting full + if (!reader.available() || buffer.length() >= BUFFER_SIZE) { + sendInstruction(buffer.toString()); + buffer.setLength(0); + } + + } + + // No more data + closeConnection(session, GuacamoleStatus.SUCCESS); + + } + + // Catch any thrown guacamole exception and attempt + // to pass within the WebSocket connection, logging + // each error appropriately. + catch (GuacamoleClientException e) { + logger.info("WebSocket connection terminated: {}", e.getMessage()); + logger.debug("WebSocket connection terminated due to client error.", e); + closeConnection(session, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + closeConnection(session, GuacamoleStatus.SUCCESS); + } + catch (GuacamoleException e) { + logger.error("Connection to guacd terminated abnormally: {}", e.getMessage()); + logger.debug("Internal error during connection to guacd.", e); + closeConnection(session, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + + } + catch (IOException e) { + logger.debug("I/O error prevents further reads.", e); + closeConnection(session, GuacamoleStatus.SERVER_ERROR); + } + + } + + }; + + readThread.start(); + + } + + @OnMessage + public void onMessage(String message) { + + // Ignore inbound messages if there is no associated tunnel + if (tunnel == null) + return; + + // Filter received instructions, handling tunnel-internal instructions + // without passing through to guacd + GuacamoleWriter writer = new FilteredGuacamoleWriter(tunnel.acquireWriter(), new GuacamoleFilter() { + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Filter out all tunnel-internal instructions + if (instruction.getOpcode().equals(GuacamoleTunnel.INTERNAL_DATA_OPCODE)) { + + // Respond to ping requests + List args = instruction.getArgs(); + if (args.size() >= 2 && args.get(0).equals(PING_OPCODE)) { + + try { + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + PING_OPCODE, args.get(1) + )); + } + catch (IOException e) { + logger.debug("Unable to send \"ping\" response for WebSocket tunnel.", e); + } + + } + + return null; + + } + + // Pass through all non-internal instructions untouched + return instruction; + + } + + }); + + try { + // Write received message + writer.write(message.toCharArray()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + } + catch (GuacamoleException e) { + logger.debug("WebSocket tunnel write failed.", e); + } + + tunnel.releaseWriter(); + + } + + @Override + @OnClose + public void onClose(Session session, CloseReason closeReason) { + + try { + if (tunnel != null) + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close WebSocket tunnel.", e); + } + + } + +} + diff --git a/guacamole-common/src/test/java/org/apache/guacamole/io/ReaderGuacamoleReaderTest.java b/guacamole-common/src/test/java/org/apache/guacamole/io/ReaderGuacamoleReaderTest.java new file mode 100644 index 0000000..1551779 --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/io/ReaderGuacamoleReaderTest.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.io; + +import java.io.StringReader; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * Tests the ReaderGuacamoleReader implementation of GuacamoleReader, validating + * that instructions are parsed correctly. + */ +public class ReaderGuacamoleReaderTest { + + /** + * Test of ReaderGuacamoleReader parsing. + * + * @throws GuacamoleException If a parse error occurs while parsing the + * known-good test string. + */ + @Test + public void testReader() throws GuacamoleException { + + // Test string + final String test = "1.a,2.bc,3.def,10.helloworld;4.test,5.test2;0.;3.foo;1.\uD83E\uDD79;"; + + GuacamoleReader reader = new ReaderGuacamoleReader(new StringReader(test)); + + GuacamoleInstruction instruction; + + // Validate first test instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals(3, instruction.getArgs().size()); + assertEquals("a", instruction.getOpcode()); + assertEquals("bc", instruction.getArgs().get(0)); + assertEquals("def", instruction.getArgs().get(1)); + assertEquals("helloworld", instruction.getArgs().get(2)); + + // Validate second test instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals(1, instruction.getArgs().size()); + assertEquals("test", instruction.getOpcode()); + assertEquals("test2", instruction.getArgs().get(0)); + + // Validate third test instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals(0, instruction.getArgs().size()); + assertEquals("", instruction.getOpcode()); + + // Validate fourth test instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals(0, instruction.getArgs().size()); + assertEquals("foo", instruction.getOpcode()); + + // Validate fifth test instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals(0, instruction.getArgs().size()); + assertEquals("\uD83E\uDD79", instruction.getOpcode()); + + // There should be no more instructions + instruction = reader.readInstruction(); + assertNull(instruction); + + } + + /** + * Test of ReaderGuacamoleReader's read method. + * + * @throws GuacamoleException If an error occurs while reading the instructions. + */ + @Test + public void testRead() throws GuacamoleException { + // Test string containing multiple instructions + final String test = "3.foo,3.bar;2.az,4.bazz;"; + + ReaderGuacamoleReader reader = new ReaderGuacamoleReader(new StringReader(test)); + + // Expected character arrays for the instructions + char[] expectedFirstInstruction = "3.foo,3.bar;".toCharArray(); + char[] expectedSecondInstruction = "2.az,4.bazz;".toCharArray(); + + // Read first instruction and verify + char[] firstInstructionChars = reader.read(); + assertNotNull(firstInstructionChars); + assertArrayEquals(expectedFirstInstruction, firstInstructionChars); + + // Read second instruction and verify + char[] secondInstructionChars = reader.read(); + assertNotNull(secondInstructionChars); + assertArrayEquals(expectedSecondInstruction, secondInstructionChars); + + // Verify that there are no more instructions + assertNull(reader.read()); + } + +} diff --git a/guacamole-common/src/test/java/org/apache/guacamole/protocol/FilteredGuacamoleReaderTest.java b/guacamole-common/src/test/java/org/apache/guacamole/protocol/FilteredGuacamoleReaderTest.java new file mode 100644 index 0000000..b766c73 --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/protocol/FilteredGuacamoleReaderTest.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.io.StringReader; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.ReaderGuacamoleReader; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Test which validates filtering of Guacamole instructions with + * FilteredGuacamoleReader. + */ +public class FilteredGuacamoleReaderTest { + + /** + * Filter which allows through "yes" instructions but drops all others. + */ + private static class TestFilter implements GuacamoleFilter { + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) throws GuacamoleException { + + if (instruction.getOpcode().equals("yes")) + return instruction; + + return null; + + } + + } + + @Test + public void testFilter() throws Exception { + + // Test string + final String test = "3.yes,1.A;2.no,1.B;3.yes,1.C;3.yes,1.D;4.nope,1.E;"; + + GuacamoleReader reader = new FilteredGuacamoleReader(new ReaderGuacamoleReader(new StringReader(test)), + new TestFilter()); + + GuacamoleInstruction instruction; + + // Validate first instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals("yes", instruction.getOpcode()); + assertEquals(1, instruction.getArgs().size()); + assertEquals("A", instruction.getArgs().get(0)); + + // Validate second instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals("yes", instruction.getOpcode()); + assertEquals(1, instruction.getArgs().size()); + assertEquals("C", instruction.getArgs().get(0)); + + // Validate third instruction + instruction = reader.readInstruction(); + assertNotNull(instruction); + assertEquals("yes", instruction.getOpcode()); + assertEquals(1, instruction.getArgs().size()); + assertEquals("D", instruction.getArgs().get(0)); + + // Should be done now + instruction = reader.readInstruction(); + assertNull(instruction); + + } + +} diff --git a/guacamole-common/src/test/java/org/apache/guacamole/protocol/FilteredGuacamoleWriterTest.java b/guacamole-common/src/test/java/org/apache/guacamole/protocol/FilteredGuacamoleWriterTest.java new file mode 100644 index 0000000..7b15550 --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/protocol/FilteredGuacamoleWriterTest.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.io.StringWriter; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.io.WriterGuacamoleWriter; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Test which validates filtering of Guacamole instructions with + * FilteredGuacamoleWriter. + */ +public class FilteredGuacamoleWriterTest { + + /** + * Filter which allows through "yes" instructions but drops all others. + */ + private static class TestFilter implements GuacamoleFilter { + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) throws GuacamoleException { + + if (instruction.getOpcode().equals("yes")) + return instruction; + + return null; + + } + + } + + @Test + public void testFilter() throws Exception { + + StringWriter stringWriter = new StringWriter(); + GuacamoleWriter writer = new FilteredGuacamoleWriter(new WriterGuacamoleWriter(stringWriter), + new TestFilter()); + + // Write a few chunks of complete instructions + writer.write("3.yes,1.A;2.no,1.B;3.yes,1.C;3.yes,1.D;4.nope,1.E;".toCharArray()); + writer.write("1.n,3.abc;3.yes,5.hello;2.no,4.test;3.yes,5.world;".toCharArray()); + + // Validate filtered results + assertEquals("3.yes,1.A;3.yes,1.C;3.yes,1.D;3.yes,5.hello;3.yes,5.world;", stringWriter.toString()); + + } + +} diff --git a/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleInstructionTest.java b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleInstructionTest.java new file mode 100644 index 0000000..1bd3284 --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleInstructionTest.java @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Unit test for GuacamoleParser. Verifies that parsing of the Guacamole + * protocol works as required. + */ +public class GuacamoleInstructionTest { + + /** + * A single test case for verifying that Guacamole protocol implementations + * correctly parse or encode Guacamole instructions. + */ + public static class TestCase extends GuacamoleInstruction { + + /** + * The full and correct Guacamole protocol representation of this + * instruction. + */ + public final String UNPARSED; + + /** + * The opcode that should be present in the Guacamole instruction; + */ + public final String OPCODE; + + /** + * All arguments that should be present in the Guacamole instruction; + */ + public final List ARGS; + + /** + * Creates a new TestCase representing the given Guacamole instruction. + * + * @param unparsed + * The full and correct Guacamole protocol representation of this + * instruction. + * + * @param opcode + * The opcode of the Guacamole instruction. + * + * @param args + * The arguments of the Guacamole instruction, if any. + */ + public TestCase(String unparsed, String opcode, String... args) { + super(opcode, Arrays.copyOf(args, args.length)); + this.UNPARSED = unparsed; + this.OPCODE = opcode; + this.ARGS = Collections.unmodifiableList(Arrays.asList(args)); + } + + } + + /** + * A single Unicode high surrogate character (any character between U+D800 + * and U+DB7F). + */ + public static final String HIGH_SURROGATE = "\uD802"; + + /** + * A single Unicode low surrogate character (any character between U+DC00 + * and U+DFFF). + */ + public static final String LOW_SURROGATE = "\uDF00"; + + /** + * A Unicode surrogate pair, consisting of a high and low surrogate. + */ + public static final String SURROGATE_PAIR = HIGH_SURROGATE + LOW_SURROGATE; + + /** + * A 4-character test string containing Unicode characters that require + * multiple bytes when encoded as UTF-8, including at least one character + * that is encoded as a surrogate pair in UTF-16. + */ + public static final String UTF8_MULTIBYTE = "\u72AC" + SURROGATE_PAIR + "z\u00C1"; + + /** + * Pre-defined set of test cases for verifying Guacamole instructions are + * correctly parsed and encoded. + */ + public static List TEST_CASES = Collections.unmodifiableList(Arrays.asList( + + // Empty instruction + new TestCase( + "0.;", + "" + ), + + // Instruction using basic Latin characters + new TestCase( + + "5.test2," + + "10.hellohello," + + "15.worldworldworld;", + + "test2", + "hellohello", + "worldworldworld" + + ), + + // Instruction using characters requiring multiple bytes in UTF-8 and + // surrogate pairs in UTF-16, including an element ending with a surrogate + // pair + new TestCase( + + "4.ab" + HIGH_SURROGATE + HIGH_SURROGATE + "," + + "6.a" + UTF8_MULTIBYTE + "b," + + "5.12345," + + "10.a" + UTF8_MULTIBYTE + UTF8_MULTIBYTE + "c;", + + "ab" + HIGH_SURROGATE + HIGH_SURROGATE, + "a" + UTF8_MULTIBYTE + "b", + "12345", + "a" + UTF8_MULTIBYTE + UTF8_MULTIBYTE + "c" + + ), + + // Instruction with an element values ending with an incomplete surrogate + // pair (high or low surrogate only) + new TestCase( + + "4.test," + + "5.1234" + HIGH_SURROGATE + "," + + "5.4567" + LOW_SURROGATE + ";", + + "test", + "1234" + HIGH_SURROGATE, + "4567" + LOW_SURROGATE + + ), + + // Instruction with element values containing incomplete surrogate pairs + new TestCase( + + "5.te" + LOW_SURROGATE + "st," + + "5.12" + HIGH_SURROGATE + "3" + LOW_SURROGATE + "," + + "6.5" + LOW_SURROGATE + LOW_SURROGATE + "4" + HIGH_SURROGATE + HIGH_SURROGATE + "," + + "10." + UTF8_MULTIBYTE + HIGH_SURROGATE + UTF8_MULTIBYTE + HIGH_SURROGATE + ";", + + "te" + LOW_SURROGATE + "st", + "12" + HIGH_SURROGATE + "3" + LOW_SURROGATE, + "5" + LOW_SURROGATE + LOW_SURROGATE + "4" + HIGH_SURROGATE + HIGH_SURROGATE, + UTF8_MULTIBYTE + HIGH_SURROGATE + UTF8_MULTIBYTE + HIGH_SURROGATE + + ) + + )); + + /** + * Verifies that instruction opcodes are represented correctly. + */ + @Test + public void testGetOpcode() { + for (TestCase testCase : TEST_CASES) { + assertEquals(testCase.OPCODE, testCase.getOpcode()); + } + } + + /** + * Verifies that instruction arguments are represented correctly. + */ + @Test + public void testGetArgs() { + for (TestCase testCase : TEST_CASES) { + assertEquals(testCase.ARGS, testCase.getArgs()); + } + } + + /** + * Verifies that instructions are encoded correctly. + */ + @Test + public void testToString() { + for (TestCase testCase : TEST_CASES) { + assertEquals(testCase.UNPARSED, testCase.toString()); + } + } + +} diff --git a/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleParserTest.java b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleParserTest.java new file mode 100644 index 0000000..dd24449 --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleParserTest.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.GuacamoleException; +import static org.apache.guacamole.protocol.GuacamoleInstructionTest.TEST_CASES; +import org.apache.guacamole.protocol.GuacamoleInstructionTest.TestCase; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Unit test for GuacamoleParser. Verifies that parsing of the Guacamole + * protocol works as required. + */ +public class GuacamoleParserTest { + + /** + * The GuacamoleParser instance being tested. + */ + private final GuacamoleParser parser = new GuacamoleParser(); + + /** + * Verify that GuacamoleParser correctly parses each of the instruction + * test cases included in the GuacamoleInstruction test. + * + * @throws GuacamoleException + * If a parse error occurs. + */ + @Test + public void testParser() throws GuacamoleException { + + // Build buffer containing all of the instruction test cases, one after + // the other + StringBuilder allTestCases = new StringBuilder(); + for (TestCase testCase : TEST_CASES) + allTestCases.append(testCase.UNPARSED); + + // Prepare buffer and offsets for feeding the data into the parser as + // if received over the network + char buffer[] = allTestCases.toString().toCharArray(); + int offset = 0; + int length = buffer.length; + + // Verify that each of the expected instructions is received in order + for (TestCase testCase : TEST_CASES) { + + // Feed data into parser until parser refuses to receive more data + int parsed; + while (length > 0 && (parsed = parser.append(buffer, offset, length)) != 0) { + offset += parsed; + length -= parsed; + } + + // An instruction should now be parsed and ready for retrieval + assertTrue(parser.hasNext()); + + // Verify instruction contains expected opcode and args + GuacamoleInstruction instruction = parser.next(); + assertNotNull(instruction); + assertEquals(testCase.OPCODE, instruction.getOpcode()); + assertEquals(testCase.ARGS, instruction.getArgs()); + + } + + // There should be no more instructions + assertFalse(parser.hasNext()); + + } + +} diff --git a/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleProtocolVersionTest.java b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleProtocolVersionTest.java new file mode 100644 index 0000000..d5082b5 --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleProtocolVersionTest.java @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit test for GuacamoleProtocolVersion. Verifies that Guacamole protocol + * version string parsing works as required. + */ +public class GuacamoleProtocolVersionTest { + + /** + * Verifies that valid version strings are parsed successfully. + */ + @Test + public void testValidVersionParse() { + GuacamoleProtocolVersion version = GuacamoleProtocolVersion.parseVersion("VERSION_012_102_398"); + Assert.assertNotNull(version); + Assert.assertEquals(12, version.getMajor()); + Assert.assertEquals(102, version.getMinor()); + Assert.assertEquals(398, version.getPatch()); + } + + /** + * Verifies that invalid version strings fail to parse. + */ + @Test + public void testInvalidVersionParse() { + + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("potato")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION_")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION___")); + + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION__2_3")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION_1__3")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION_1_2_")); + + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION_A_2_3")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION_1_B_3")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("VERSION_1_2_C")); + + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("_1_2_3")); + Assert.assertNull(GuacamoleProtocolVersion.parseVersion("version_1_2_3")); + + } + + /** + * Verifies that the atLeast() function defined by GuacamoleProtocolVersion + * behaves as required for a series of three versions which are in strictly + * increasing order (a < b < c). + * + * @param a + * The String representation of the version which is known to be the + * smaller than versions b and c. + * + * @param b + * The String representation of the version which is known to be + * larger than version a but smaller than version c. + * + * @param c + * The String representation of the version which is known to be the + * larger than versions a and b. + */ + private void testVersionCompare(String a, String b, String c) { + + GuacamoleProtocolVersion verA = GuacamoleProtocolVersion.parseVersion(a); + GuacamoleProtocolVersion verB = GuacamoleProtocolVersion.parseVersion(b); + GuacamoleProtocolVersion verC = GuacamoleProtocolVersion.parseVersion(c); + + Assert.assertTrue(verC.atLeast(verB)); + Assert.assertTrue(verC.atLeast(verA)); + Assert.assertTrue(verB.atLeast(verA)); + + Assert.assertFalse(verB.atLeast(verC)); + Assert.assertFalse(verA.atLeast(verC)); + Assert.assertFalse(verA.atLeast(verB)); + + Assert.assertTrue(verA.atLeast(verA)); + Assert.assertTrue(verB.atLeast(verB)); + Assert.assertTrue(verC.atLeast(verC)); + + } + + /** + * Verifies that version order comparisons using atLeast() behave as + * required. + */ + @Test + public void testVersionCompare() { + testVersionCompare("VERSION_0_0_1", "VERSION_0_0_2", "VERSION_0_0_3"); + testVersionCompare("VERSION_0_1_0", "VERSION_0_2_0", "VERSION_0_3_0"); + testVersionCompare("VERSION_1_0_0", "VERSION_2_0_0", "VERSION_3_0_0"); + testVersionCompare("VERSION_1_2_3", "VERSION_1_3_3", "VERSION_2_0_0"); + } + + /** + * Verifies that versions can be tested for equality using equals(). + */ + @Test + public void testVersionEquals() { + + GuacamoleProtocolVersion version; + + version = GuacamoleProtocolVersion.parseVersion("VERSION_012_102_398"); + Assert.assertTrue(version.equals(version)); + Assert.assertTrue(version.equals(new GuacamoleProtocolVersion(12, 102, 398))); + Assert.assertFalse(version.equals(new GuacamoleProtocolVersion(12, 102, 399))); + Assert.assertFalse(version.equals(new GuacamoleProtocolVersion(12, 103, 398))); + Assert.assertFalse(version.equals(new GuacamoleProtocolVersion(11, 102, 398))); + + version = GuacamoleProtocolVersion.parseVersion("VERSION_1_0_0"); + Assert.assertTrue(version.equals(GuacamoleProtocolVersion.VERSION_1_0_0)); + Assert.assertFalse(version.equals(GuacamoleProtocolVersion.VERSION_1_1_0)); + + version = GuacamoleProtocolVersion.parseVersion("VERSION_1_1_0"); + Assert.assertTrue(version.equals(GuacamoleProtocolVersion.VERSION_1_1_0)); + Assert.assertFalse(version.equals(GuacamoleProtocolVersion.VERSION_1_0_0)); + + } + + /** + * Verifies that versions can be converted to their Guacamole protocol + * representation through calling toString(). + */ + @Test + public void testToString() { + Assert.assertEquals("VERSION_1_0_0", GuacamoleProtocolVersion.VERSION_1_0_0.toString()); + Assert.assertEquals("VERSION_1_1_0", GuacamoleProtocolVersion.VERSION_1_1_0.toString()); + Assert.assertEquals("VERSION_12_103_398", new GuacamoleProtocolVersion(12, 103, 398).toString()); + } + +} diff --git a/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleStatusTest.java b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleStatusTest.java new file mode 100644 index 0000000..0d38e6e --- /dev/null +++ b/guacamole-common/src/test/java/org/apache/guacamole/protocol/GuacamoleStatusTest.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocol; + +import org.apache.guacamole.GuacamoleException; +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit test for GuacamoleStatus that verifies exception translation functions + * as required. + */ +public class GuacamoleStatusTest { + + /** + * Verifies that the {@link SUCCESS} status code does NOT translate to a + * GuacamoleException, but instead throws an IllegalStateException. + */ + @Test + public void testSuccessHasNoException() { + + try { + GuacamoleStatus.SUCCESS.toException("Test message"); + Assert.fail("GuacamoleStatus.SUCCESS must throw " + + "IllegalStateException for toException()."); + } + catch (IllegalStateException e) { + // Expected + } + + } + + /** + * Verifies that each non-success GuacamoleStatus maps to a + * GuacamoleException associated with that GuacamoleStatus. + */ + @Test + public void testStatusExceptionMapping() { + + for (GuacamoleStatus status : GuacamoleStatus.values()) { + + // Ignore SUCCESS status (tested via testSuccessHasNoException()) + if (status == GuacamoleStatus.SUCCESS) + continue; + + String message = "Test message: " + status; + GuacamoleException e = status.toException(message); + + Assert.assertEquals("toException() should return a " + + "GuacamoleException that maps to the same status.", + status, e.getStatus()); + + Assert.assertEquals("toException() should return a " + + "GuacamoleException that uses the provided message.", + message, e.getMessage()); + + } + + } + +} diff --git a/guacamole-docker/README.md b/guacamole-docker/README.md new file mode 100644 index 0000000..a6e7e16 --- /dev/null +++ b/guacamole-docker/README.md @@ -0,0 +1,236 @@ +What is Apache Guacamole? +========================= + +[Apache Guacamole](http://guacamole.apache.org/) is a clientless remote desktop +gateway. It supports standard protocols like VNC and RDP. We call it clientless +because no plugins or client software are required. + +Thanks to HTML5, once Guacamole is installed on a server, all you need to +access your desktops is a web browser. + +How to use this image +===================== + +Using this image will require an existing, running Docker container with the +[guacd image](https://registry.hub.docker.com/u/guacamole/guacd/), and another +Docker container providing either a PostgreSQL, MySQL or SQLServer database. + +The name of the database and all associated credentials are specified with +environment variables given when the container is created. All other +configuration information is generated from the Docker links. + +Beware that you will need to initialize the database manually. Guacamole will +not automatically create its own tables, but SQL scripts are provided to do +this. + +Once the Guacamole image is running, Guacamole will be accessible at +`http://[address of container]:8080/guacamole/`. The instructions below use the +`-p 8080:8080` option to expose this port at the level of the machine hosting +Docker, as well. + +Docker Secrets +============== +The string `_FILE` may be appended to some of the environment variables listed +below if you are using MySQL, PostgreSQL or SQLServer authentication. This will +cause the startup script to load the values for those variables from files +within the container. + +This is useful for specifying sensitive info, ie. passwords for +the database, in secured files instead of plaintext environment variables. This +is generally used for loading values from [Docker secrets](https://docs.docker.com/engine/swarm/secrets/#read-more-about-docker-secret-commands), +which are stored at `/run/secrets/` within the container. + +It is important to note that the startup script is configured such that: + +1. You may mix the use of Docker secrets and normal environment variables. +For example, you may wish to use `MYSQL_USER_FILE` and `MYSQL_PASSWORD_FILE`, +but wish to specify the database name with `MYSQL_DATABASE` + +2. If both a normal environment variable and its corresponding secret are defined +in the same command line, or section within a [Compose](https://docs.docker.com/compose/) file, +the secret will take precedence. For instance, if both `MYSQL_PASSWORD` +and `MYSQL_PASSWORD_FILE` are given, `MYSQL_PASSWORD_FILE` will be used. + +Deploying Guacamole with PostgreSQL authentication +-------------------------------------------------- + + docker run --name some-guacamole --link some-guacd:guacd \ + --link some-postgres:postgres \ + -e POSTGRESQL_DATABASE=guacamole_db \ + -e POSTGRESQL_USER=guacamole_user \ + -e POSTGRESQL_PASSWORD=some_password \ + -e POSTGRESQL_DATABASE_FILE=/run/secrets/ \ + -e POSTGRESQL_USER_FILE=/run/secrets/ \ + -e POSTGRESQL_PASSWORD_FILE=/run/secrets/ \ + -d -p 8080:8080 guacamole/guacamole + +Linking Guacamole to PostgreSQL requires three environment variables. If any of +these environment variables are omitted, you will receive an error message, and +the image will stop: + +1. `POSTGRESQL_DATABASE` - The name of the database to use for Guacamole + authentication. +2. `POSTGRESQL_USER` - The user that Guacamole will use to connect to PostgreSQL. +3. `POSTGRESQL_PASSWORD` - The password that Guacamole will provide when + connecting to PostgreSQL as `POSTGRESQL_USER`. +4. `POSTGRESQL_DATABASE_FILE` - The path of the docker secret containing the name + of database to use for Guacamole authentication. +5. `POSTGRESQL_USER_FILE` - The path of the docker secret containing the name of + the user that Guacamole will use to connect to PostgreSQL. +6. `POSTGRESQL_PASSWORD_FILE` - The path of the docker secret containing the + password that Guacamole will provide when connecting to PostgreSQL as + `POSTGRESQL_USER. + +### Initializing the PostgreSQL database + +If your database is not already initialized with the Guacamole schema, you will +need to do so prior to using Guacamole. A convenience script for generating the +necessary SQL to do this is included in the Guacamole image. + +To generate a SQL script which can be used to initialize a fresh PostgreSQL +database +[as documented in the Guacamole manual](http://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-postgresql): + + docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql > initdb.sql + +Alternatively, you can use the SQL scripts included with the +guacamole-auth-jdbc extension from +[the corresponding release](http://guacamole.apache.org/releases/). + +Once this script is generated, you must: + +1. Create a database for Guacamole within PostgreSQL, such as `guacamole_db`. +2. Run the script on the newly-created database. +3. Create a user for Guacamole within PostgreSQL with access to the tables and + sequences of this database, such as `guacamole_user`. + +The process for doing this via the `psql` and `createdb` utilities included +with PostgreSQL is documented in +[the Guacamole manual](http://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-postgresql). + +Deploying Guacamole with MySQL authentication +-------------------------------------------------- + + docker run --name some-guacamole --link some-guacd:guacd \ + --link some-mysql:mysql \ + -e MYSQL_DATABASE=guacamole_db \ + -e MYSQL_USER=guacamole_user \ + -e MYSQL_PASSWORD=some_password \ + -e MYSQL_DATABASE_FILE=/run/secrets/ \ + -e MYSQL_USER_FILE=/run/secrets/ \ + -e MYSQL_PASSWORD_FILE=/run/secrets/ \ + -d -p 8080:8080 guacamole/guacamole + +Linking Guacamole to MySQL requires three environment variables. If any of +these environment variables are omitted, you will receive an error message, and +the image will stop: + +1. `MYSQL_DATABASE` - The name of the database to use for Guacamole + authentication. +2. `MYSQL_USER` - The user that Guacamole will use to connect to MySQL. +3. `MYSQL_PASSWORD` - The password that Guacamole will provide when connecting + to MySQL as `MYSQL_USER`. +4. `MYSQL_DATABASE_FILE` - The path of the docker secret containing the name of + the database to use for Guacamole authentication. +5. `MYSQL_USER_FILE` - The path of the docker secret containing the name of the + user that Guacamole will use to connect to MySQL. +6. `MYSQL_PASSWORD_FILE` - The path of the docker secret containing the + password that Guacamole will provide when connecting to MySQL + as`MYSQL_USER`. + +### Initializing the MySQL database + +If your database is not already initialized with the Guacamole schema, you will +need to do so prior to using Guacamole. A convenience script for generating the +necessary SQL to do this is included in the Guacamole image. + +To generate a SQL script which can be used to initialize a fresh MySQL database +[as documented in the Guacamole manual](http://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-mysql): + + docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql + +Alternatively, you can use the SQL scripts included with +[guacamole-auth-jdbc](https://github.com/apache/guacamole-client/tree/0.9.10-incubating/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema). + +Once this script is generated, you must: + +1. Create a database for Guacamole within MySQL, such as `guacamole_db`. +2. Create a user for Guacamole within MySQL with access to this database, such + as `guacamole_user`. +3. Run the script on the newly-created database. + +The process for doing this via the `mysql` utility included with MySQL is +documented in +[the Guacamole manual](http://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-mysql). + +Deploying Guacamole with SQLServer authentication +-------------------------------------------------- + +Linking Guacamole to SQLServer requires three environment variables. If any of +these environment variables are omitted, you will receive an error message, and +the image will stop: + +1. `SQLSERVER_DATABASE` - The name of the database to use for Guacamole + authentication. +2. `SQLSERVER_USER` - The user that Guacamole will use to connect to SQLServer. +3. `SQLSERVER_PASSWORD` - The password that Guacamole will provide when + connecting to SQLServer as `SQLSERVER_USER`. + + docker run --name some-guacamole --link some-guacd:guacd \ + --link some-sqlserver:sqlserver \ + -e SQLSERVER_DATABASE=guacamole_db \ + -e SQLSERVER_USER=guacamole_user \ + -e SQLSERVER_PASSWORD=some_password \ + -d -p 8080:8080 guacamole/guacamole + +Alternatively, if you want to store database credentials using Docker secrets, +the following three variables are required and replace the previous three: + +1. `SQLSERVER_DATABASE_FILE` - The path of the docker secret containing the name + of database to use for Guacamole authentication. +2. `SQLSERVER_USER_FILE` - The path of the docker secret containing the name of + the user that Guacamole will use to connect to SQLServer. +3. `SQLSERVER_PASSWORD_FILE` - The path of the docker secret containing the + password that Guacamole will provide when connecting to SQLServer as + `SQLSERVER_USER. + + docker run --name some-guacamole --link some-guacd:guacd \ + --link some-sqlserver:sqlserver \ + -e SQLSERVER_DATABASE_FILE=/run/secrets/ \ + -e SQLSERVER_USER_FILE=/run/secrets/ \ + -e SQLSERVER_PASSWORD_FILE=/run/secrets/ \ + -d -p 8080:8080 guacamole/guacamole + +### Initializing the SQLServer database + +If your database is not already initialized with the Guacamole schema, you will +need to do so prior to using Guacamole. A convenience script for generating the +necessary SQL to do this is included in the Guacamole image. + +To generate a SQL script which can be used to initialize a fresh SQLServer +database +[as documented in the Guacamole manual](http://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-sqlserver): + + docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --sqlserver > initdb.sql + +Alternatively, you can use the SQL scripts included with the +guacamole-auth-jdbc extension from +[the corresponding release](http://guacamole.apache.org/releases/). + +Once this script is generated, you must: + +1. Create a database for Guacamole within SQLServer, such as `guacamole_db`. +2. Run the script on the newly-created database. +3. Create a user for Guacamole within SQLServer with access to the tables and + sequences of this database, such as `guacamole_user`. + +The process for doing this via the `sqlcmd` utilities included +with SQLServer is documented in +[the Guacamole manual](http://guacamole.apache.org/doc/gug/jdbc-auth.html#jdbc-auth-sqlserver). + +Reporting issues +================ + +Please report any bugs encountered by opening a new issue in +[our JIRA](https://issues.apache.org/jira/browse/GUACAMOLE/). + diff --git a/guacamole-docker/bin/build-guacamole.sh b/guacamole-docker/bin/build-guacamole.sh new file mode 100755 index 0000000..595bd70 --- /dev/null +++ b/guacamole-docker/bin/build-guacamole.sh @@ -0,0 +1,64 @@ +#!/bin/bash -e +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn build-guacamole.sh +## +## Builds Guacamole, saving "guacamole.war" and all applicable extension .jars +## using the guacamole-client source contained within the given directory. +## Extension files will be grouped by their associated type, identical to +## extracting the .tar.gz files included with each Guacamole release except +## that version numbers are stripped from directory and .jar file names. +## +## The build process is split across multiple scripts within the +## /opt/guacamole/build.d directory. Additional steps may be added to the +## build process by adding .sh scripts to this directory. Any such scripts MUST +## be shell scripts ending with a ".sh" extension and MUST be written for bash +## (the shell used by this entrypoint). +## +## @param BUILD_DIR +## The directory which currently contains the guacamole-client source and +## in which the build should be performed. +## +## @param DESTINATION +## The directory to save guacamole.war within, along with all extension +## .jars. Note that this script will create extension-specific +## subdirectories within this directory, and files will thus be grouped by +## extension type. +## + +## +## The directory which currently contains the guacamole-client source and in +## which the build should be performed. +## +BUILD_DIR="$1" + +## +## The directory to save guacamole.war within, along with all extension .jars. +## Note that this script will create extension-specific subdirectories within +## this directory, and files will thus be grouped by extension type. +## +DESTINATION="$2" + +# Run all scripts within the "build.d" directory +for SCRIPT in /opt/guacamole/build.d/*.sh; do + source "$SCRIPT" +done + diff --git a/guacamole-docker/bin/entrypoint.sh b/guacamole-docker/bin/entrypoint.sh new file mode 100755 index 0000000..509332f --- /dev/null +++ b/guacamole-docker/bin/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash -e +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn entrypoint.sh +## +## (Re-)configures the Apache Guacamole web application based on the values of +## environment variables, deploys the web application beneath a bundled copy of +## Apache Tomcat, and starts Tomcat. +## +## The startup process is split across multiple scripts within the +## /opt/guacamole/entrypoint.d directory. Additional steps may be added to the +## startup process by adding .sh scripts to this directory. Any such scripts +## MUST be shell scripts ending with a ".sh" extension and MUST be written for +## bash (the shell used by this entrypoint). +## + +# Run all scripts within the "entrypoint.d" directory +for SCRIPT in /opt/guacamole/entrypoint.d/*.sh; do + source "$SCRIPT" +done + diff --git a/guacamole-docker/bin/initdb.sh b/guacamole-docker/bin/initdb.sh new file mode 100755 index 0000000..cf5b37e --- /dev/null +++ b/guacamole-docker/bin/initdb.sh @@ -0,0 +1,73 @@ +#!/bin/sh -e +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn initdb.sh +## +## Generates a database initialization SQL script for a database of the given +## type. The SQL will be sent to STDOUT. +## +## @param DATABASE +## The database to generate the SQL script for. This may be either +## "--postgresql", for PostgreSQL, "--mysql" for MySQL, or "--sqlserver" for Microsoft SQL Server. +## + +DATABASE="$1" + +## +## Prints usage information for this shell script and exits with an error code. +## Calling this function will immediately terminate execution of the script. +## +incorrect_usage() { + cat < $VAR_PREFIX" + mkdir -p "$DESTINATION/environment/$VAR_PREFIX/extensions" + ln -s "$DESTINATION/extensions/$EXT_PATH"/*.jar "$DESTINATION/environment/$VAR_PREFIX/extensions/" + else + echo "Skipped: $EXT_PATH (not built)" + fi + + done + +} + +# +# This section is a mapping of all bundled extensions to their corresponding +# variable prefixes. Each line consists of a whitespace-separated pair of +# extension path (the relative directory containing the .jar file) to that +# extension's variable prefix. For readability, a period may be used in lieu of +# a space. +# +# NOTES: +# +# (1) The actual variables used by each extension are not determined here, but +# rather by the transformation of their configuration properties to variables +# ("lowercase-with-dashes" to "UPPERCASE_WITH_UNDERSCORES"). The variable +# prefixes listed here should be chosen to match the prefixes resulting from +# that transformation of the extensions' properties. +# +# (2) The paths on the left side of this mapping are the paths of the extension +# .jar files relative to the "/opt/guacamole/extensions" directory used by the +# container to store extensions prior to use. They are identical to the paths +# used by the distribution .tar.gz files provided with each Guacamole release, +# except that the version numbers have been stripped from the top-level path. +# +# (3) The script processing this file uses these prefixes to define and process +# an additional "ENABLED" variable (ie: "BAN_ENABLED", "TOTP_ENABLED", etc.) +# that can be used to enable/disable an extension entirely regardless of the +# presence/absence of other variables with the prefix. This allows extensions +# that need no configuration to be easily enabled. It also allows extensions +# that already have configuration present to be easily disabled without +# requiring that all other configuration be removed. +# +map_extensions <<'EOF' + guacamole-auth-ban..........................BAN_ + guacamole-auth-duo..........................DUO_ + guacamole-auth-header.......................HTTP_AUTH_ + guacamole-auth-jdbc/mysql...................MYSQL_ + guacamole-auth-jdbc/postgresql..............POSTGRESQL_ + guacamole-auth-jdbc/sqlserver...............SQLSERVER_ + guacamole-auth-json.........................JSON_ + guacamole-auth-ldap.........................LDAP_ + guacamole-auth-quickconnect.................QUICKCONNECT_ + guacamole-auth-radius.......................RADIUS_ + guacamole-auth-restrict.....................RESTRICT_ + guacamole-auth-sso/cas......................CAS_ + guacamole-auth-sso/openid...................OPENID_ + guacamole-auth-sso/saml.....................SAML_ + guacamole-auth-sso/ssl......................SSL_AUTH_ + guacamole-auth-totp.........................TOTP_ + guacamole-display-statistics................DISPLAY_STATISTICS_ + guacamole-history-recording-storage.........RECORDING_ + guacamole-vault/ksm.........................KSM_ +EOF + diff --git a/guacamole-docker/build.d/020-download-drivers.sh b/guacamole-docker/build.d/020-download-drivers.sh new file mode 100644 index 0000000..a5fe6c7 --- /dev/null +++ b/guacamole-docker/build.d/020-download-drivers.sh @@ -0,0 +1,99 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn 020-download-drivers.sh +## +## Downloads all JDBC drivers required by the various supported databases. Each +## downloaded driver is stored beneath /opt/guacamole/drivers, with symbolic +## links added to the mappings beneath /opt/guacamole/environment to ensure any +## required drivers are added to GUACAMOLE_HOME if necessary to support a +## requested database. +## + +## +## Downloads the JDBC driver at the given URL, storing the driver's .jar file +## under the given name and environment variable prefix. The downloaded .jar +## file is stored such that it is pulled into GUACAMOLE_HOME automatically if +## environment variables with that prefix are used. +## +## If the URL is for a .tar.gz file and not a .jar file, the .jar will be +## automatically extracted from the .tar.gz as it is downloaded. +## +## @param VAR_PREFIX +## The environment variable prefix used by the extension that requires the +## driver. +## +## @param URL +## The URL that the driver should be downloaded from. +## +## @param DEST_JAR +## The filename to assign to the downloaded .jar file. This is mainly +## needed to ensure that the drivers bundled with the image have names that +## are predictable and reliable enough that they can be consumed by +## third-party use of this image. +## +download_driver() { + + local VAR_PREFIX="$1" + local URL="$2" + local DEST_JAR="$3" + + # Ensure primary destination path for .jar file exists + local DEST_PATH="$DESTINATION/drivers/" + mkdir -p "$DEST_PATH" + + # Download requested .jar file, extracting from .tar.gz if necessary + if [[ "$URL" == *.tar.gz ]]; then + curl -L "$URL" | tar -xz \ + --wildcards \ + --no-anchored \ + --no-wildcards-match-slash \ + --to-stdout \ + "*.jar" > "$DEST_PATH/$DEST_JAR" + else + curl -L "$URL" > "$DEST_PATH/$DEST_JAR" + fi + + # Add any required link to ensure the .jar file is loaded along with the + # extension that requires it + mkdir -p "$DESTINATION/environment/$VAR_PREFIX/lib" + ln -s "$DEST_PATH/$DEST_JAR" "$DESTINATION/environment/$VAR_PREFIX/lib/" + +} + +# +# Download and link any required JDBC drivers +# + +# MySQL JDBC driver +download_driver "MYSQL_" \ + "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-$MYSQL_JDBC_VERSION.tar.gz" \ + "mysql-jdbc.jar" + +# PostgreSQL JDBC driver +download_driver "POSTGRESQL_" \ + "https://jdbc.postgresql.org/download/postgresql-$PGSQL_JDBC_VERSION.jar" \ + "postgresql-jdbc.jar" + +# SQL Server JDBC driver +download_driver "SQLSERVER_" \ + "https://github.com/microsoft/mssql-jdbc/releases/download/v$MSSQL_JDBC_VERSION/mssql-jdbc-$MSSQL_JDBC_VERSION.jre8.jar" \ + "mssql-jdbc.jar" + diff --git a/guacamole-docker/build.d/999-verify-sanity.sh b/guacamole-docker/build.d/999-verify-sanity.sh new file mode 100644 index 0000000..48707da --- /dev/null +++ b/guacamole-docker/build.d/999-verify-sanity.sh @@ -0,0 +1,47 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn 999-verify-sanity.sh +## +## Performs sanity checks on the results of the build that verify the image +## contains everything it is expected to contain, including all built +## extensions. If symbolic links were not correctly constructed, or some built +## extensions were not mapped to environment variable prefixes, this script +## will log errors and fail the build. +## + +# Perform basic sanity checks that the symbolic links used to associated +# environment variables with extensions/libraries have been correctly created, +# bailing out if any problems are found. +( + + # Search for any broken symbolic links intended to map files for + # environment variables + find "$DESTINATION/environment/" -xtype l | sed 's/^/Broken link: /' + + # Search for extensions that have not been mapped to any environment + # variables at all + comm -23 \ + <(find "$DESTINATION/extensions/" -name "*.jar" -exec realpath "{}" ";" | sort -u) \ + <(find "$DESTINATION/environment/" -path "**/extensions/*.jar" -exec realpath "{}" ";" | sort -u) \ + | sed 's/^/Unmapped extension: /' + +) | sed 's/^/ERROR: /' | (! grep .) >&2 || exit 1 + diff --git a/guacamole-docker/entrypoint.d/000-migrate-docker-links.sh b/guacamole-docker/entrypoint.d/000-migrate-docker-links.sh new file mode 100644 index 0000000..e87fb26 --- /dev/null +++ b/guacamole-docker/entrypoint.d/000-migrate-docker-links.sh @@ -0,0 +1,136 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn 000-migrate-docker-links.sh +## +## Checks for usage of any Docker links that were formerly supported +## but are now deprecated, warning when any deprecated Docker links are +## encountered. Until support for Docker links is entirely removed, the values +## of environment variables that are injected by Docker for deprecated Docker +## links are automatically reassigned to currently supported variables. +## + +## +## Unsets all environment variables whose names start with the given prefix. +## +## @param LEGACY_VAR_PREFIX +## The name prefix of the environment variables that should be unset. +## +unset_starts_with() { + + local LEGACY_VAR_PREFIX="$1" + + local LEGACY_VAR_NAME + + # Unset all environment variables starting with the given prefix + while read -r LEGACY_VAR_NAME; do + unset "$LEGACY_VAR_NAME" + done < <(awk 'BEGIN{for(v in ENVIRON) print v}' | grep "^$LEGACY_VAR_PREFIX") + +} + +## +## Checks for usage of the given deprecated Docker link, automatically +## assigning the values of its associated environment variables to the given +## set of currently supported environment variables. If usage of the +## deprecated Docker link is found, a warning is printed to STDERR. +## +## @param LEGACY_LINK_NAME +## The name of the Docker link that's deprecated, as would be provided to +## the "docker" command with the "--link" option. +## +## @param LEGACY_LINK_PORT_NUMBER +## The TCP port number used by the service originally pointed to by the +## deprecated Docker link. This will be the port number exposed by the +## Docker image customarily used for that service. +## +## @param CURRENT_ADDR_VAR_NAME +## The name of the environment variable that is currently supported and +## represents the IP addresss or hostname of the service originally pointed +## to by the deprecated Docker link. +## +## @param CURRENT_PORT_VAR_NAME +## The name of the environment variable that is currently supported and +## represents the TCP port of the service originally pointed to by the +## deprecated Docker link. +## +deprecate_link() { + + local LEGACY_LINK_NAME="$1" + local LEGACY_LINK_PORT_NUMBER="$2" + local CURRENT_ADDR_VAR_NAME="$3" + local CURRENT_PORT_VAR_NAME="$4" + + # Determine names of environment variables injected by Docker for the link + # having the given name + local LEGACY_LINK_VAR_PREFIX="`echo "$LEGACY_LINK_NAME" | tr 'a-z' 'A-Z'`" + local LEGACY_LINK_VAR_TCP_PREFIX="${LEGACY_LINK_VAR_PREFIX}_PORT_${LEGACY_LINK_PORT_NUMBER}_TCP" + local LEGACY_ADDR_VAR_NAME="${LEGACY_LINK_VAR_TCP_PREFIX}_ADDR" + local LEGACY_PORT_VAR_NAME="${LEGACY_LINK_VAR_TCP_PREFIX}_PORT" + + # NOTE: We pull these values early to ensure we can safely unset the + # legacy variables without losing the ability to reassign those values to + # the proper variables later + local LEGACY_LINK_ADDR="${!LEGACY_ADDR_VAR_NAME}" + local LEGACY_LINK_PORT="${!LEGACY_PORT_VAR_NAME}" + + if [ -n "$LEGACY_LINK_ADDR" -o -n "$LEGACY_LINK_PORT" ]; then + echo "WARNING: The \"$LEGACY_LINK_NAME\" Docker link has been deprecated in favor of the \"$CURRENT_ADDR_VAR_NAME\" and \"$CURRENT_PORT_VAR_NAME\" environment variables. Please migrate your configuration when possible, as Docker considers the linking feature to be legacy and support for Docker links may be removed in future releases. See: https://docs.docker.com/engine/network/links/" >&2 + + # + # Clear out any environment variables related to the legacy link (NOTE: + # this is necessary not only to clean the environment of variables that + # aren't actually used, but also to avoid tripping warnings about + # legacy "POSTGRES_" variable naming). + # + # The variables that Docker will set are documented here: + # + # https://docs.docker.com/engine/network/links/ + # + + unset "${LEGACY_LINK_VAR_PREFIX}_NAME" + unset "${LEGACY_LINK_VAR_PREFIX}_PORT" + unset_starts_with "${LEGACY_LINK_VAR_TCP_PREFIX}_" + unset_starts_with "${LEGACY_LINK_VAR_PREFIX}_ENV_" + + # A variable containing just the prefix documented by Docker is also + # injected, but this is not documented at the above URL + unset "$LEGACY_LINK_VAR_TCP_PREFIX" + + # Migrate legacy Docker link values over to the proper variables + export "$CURRENT_ADDR_VAR_NAME"="$LEGACY_LINK_ADDR" + export "$CURRENT_PORT_VAR_NAME"="$LEGACY_LINK_PORT" + + fi + +} + +# Legacy Docker link support for connecting the webapp image with guacd +deprecate_link "guacd" 4822 "GUACD_HOSTNAME" "GUACD_PORT" + +# Legacy Docker link support for connecting the webapp image with the various +# supported databases +deprecate_link "mysql" 3306 "MYSQL_HOSTNAME" "MYSQL_PORT" +deprecate_link "postgres" 5432 "POSTGRESQL_HOSTNAME" "POSTGRESQL_PORT" +deprecate_link "sqlserver" 1433 "SQLSERVER_HOSTNAME" "SQLSERVER_PORT" + +# No other Docker links have been historically supported by the +# "guacamole/guacamole" image. + diff --git a/guacamole-docker/entrypoint.d/010-migrate-legacy-variables.sh b/guacamole-docker/entrypoint.d/010-migrate-legacy-variables.sh new file mode 100644 index 0000000..e829f23 --- /dev/null +++ b/guacamole-docker/entrypoint.d/010-migrate-legacy-variables.sh @@ -0,0 +1,117 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn 010-migrate-legacy-variables.sh +## +## Checks for usage of any environment variables that were formerly supported +## but are now deprecated, warning when any deprecated variables are +## encountered. Until support for a deprecated variable is entirely removed, +## the value provided for the deprecated variable is automatically assigned to +## the currently-supported variable. +## + +## +## Checks for usage of the given deprecated environment variable, automatically +## assigning its value to the given currently-supported environment variable. +## If usage of the deprecated variable is found, a warning is printed to +## STDERR. +## +## @param LEGACY_VAR_NAME +## The name of the environment variable that's deprecated. +## +## @param CURRENT_VAR_NAME +## The name of the environment variable that is currently supported and +## replaces the deprecated variable. +## +deprecate_variable() { + + local LEGACY_VAR_NAME="$1" + local CURRENT_VAR_NAME="$2" + + if [ -n "${!LEGACY_VAR_NAME}" ]; then + echo "WARNING: The \"$LEGACY_VAR_NAME\" environment variable has been deprecated in favor of \"$CURRENT_VAR_NAME\". Please migrate your configuration when possible, as support for the older name may be removed in future releases." >&2 + export "$CURRENT_VAR_NAME"="${!LEGACY_VAR_NAME}" + fi + +} + +## +## Checks for usage of any environment variables using the given deprecated +## prefix, automatically assigning their values to corresponding environment +## variables having the given currently-supported prefix. If usage of the +## deprecated prefix is found, a warning is printed to STDERR. +## +## @param LEGACY_VAR_PREFIX +## The environment variable prefix that's deprecated. +## +## @param CURRENT_VAR_PREFIX +## The environment variable prefix that is currently supported and +## replaces the deprecated variable prefix. +## +deprecate_variable_prefix() { + + local LEGACY_VAR_PREFIX="$1" + local CURRENT_VAR_PREFIX="$2" + + local LEGACY_VAR_NAME + local CURRENT_VAR_NAME + local HAS_LEGACY_VARIABLES=0 + + # Automatically reassign all "POSTGRES_*" variables to "POSTGRESQL_*" + while read -r LEGACY_VAR_NAME; do + HAS_LEGACY_VARIABLES=1 + CURRENT_VAR_NAME="$CURRENT_VAR_PREFIX${LEGACY_VAR_NAME#$LEGACY_VAR_PREFIX}" + export "$CURRENT_VAR_NAME"="${!LEGACY_VAR_NAME}" + unset "$LEGACY_VAR_NAME" + done < <(awk 'BEGIN{for(v in ENVIRON) print v}' | grep "^$LEGACY_VAR_PREFIX") + + if [ "$HAS_LEGACY_VARIABLES" = "1" ]; then + echo "WARNING: The \"$LEGACY_VAR_PREFIX\" prefix for environment variables has been deprecated in favor of the \"$CURRENT_VAR_PREFIX\" prefix. Please migrate your configuration when possible, as support for the older prefix may be removed in future releases." >&2 + export "$CURRENT_VAR_NAME"="$LEGACY_VAR_NAME" + fi + +} + +# The old "*_USER" style for configuring the user account to be used to access +# the database is being replaced with "*_USERNAME" such that all environment +# variables exactly correspond to the names of configuration properties from +# guacamole.properties. +deprecate_variable "MYSQL_USER" "MYSQL_USERNAME" +deprecate_variable "POSTGRES_USER" "POSTGRESQL_USERNAME" +deprecate_variable "POSTGRESQL_USER" "POSTGRESQL_USERNAME" +deprecate_variable "SQLSERVER_USER" "SQLSERVER_USERNAME" + +# The old "POSTGRES_" prefix for configuring usage of PostgreSQL is being +# replaced with "POSTGRESQL_" such that all environment variables exactly +# correspond to the names of configuration properties from +# guacamole.properties. +deprecate_variable_prefix "POSTGRES_" "POSTGRESQL_" + +# The old "PROXY_*" names for attributes supported by RemoteIpValve are being +# replaced with "REMOTE_IP_VALVE_*" attributes that more closely and +# predictably match their attribute names +deprecate_variable "PROXY_ALLOWED_IPS_REGEX" "REMOTE_IP_VALVE_INTERNAL_PROXIES" +deprecate_variable "PROXY_IP_HEADER" "REMOTE_IP_VALVE_REMOTE_IP_HEADER" +deprecate_variable "PROXY_PROTOCOL_HEADER" "REMOTE_IP_VALVE_PROTOCOL_HEADER" +# NOTE: PROXY_BY_HEADER never worked as there is no "remoteIpProxiesHeader" attribute for RemoteIpValve + +# The old "LOGBACK_LEVEL" environment variable has been replaced with +# "LOG_LEVEL" for consistency with the guacd image +deprecate_variable "LOGBACK_LEVEL" "LOG_LEVEL" diff --git a/guacamole-docker/entrypoint.d/100-generate-guacamole-home.sh b/guacamole-docker/entrypoint.d/100-generate-guacamole-home.sh new file mode 100644 index 0000000..1db4d60 --- /dev/null +++ b/guacamole-docker/entrypoint.d/100-generate-guacamole-home.sh @@ -0,0 +1,111 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn 010-generate-guacamole-home.sh +## +## Automatically generates a temporary, skeleton GUACAMOLE_HOME to be used for +## this run of the container. GUACAMOLE_HOMEs from previous runs are +## automatically deleted prior to creating the new skeleton. A +## randomly-generated temporary directory is used instead of a standard +## directory like "/etc/guacamole" to allow users to use "/etc/guacamole" as a +## basis for their own configuration. +## + +## +## The directory to copy/link over as a basis for the GUACAMOLE_HOME actually +## used by the Guacamole web application. Any configuration generated by this +## container will be overlaid on top of this configuration. To achieve the +## overlay, symbolic links will be created for all files inside and beneath +## this directory. Only the guacamole.properties file will be copied instead of +## using symbolic links (to ensure property generation performed by the +## container does not potentially modify an external file). +## +GUACAMOLE_HOME_TEMPLATE="$GUACAMOLE_HOME" + +## +## Tests whether a given property is set within the guacamole.properties file +## in GUACAMOLE_HOME. +## +## @param PROPERTY_NAME +## The name of the property to check. +## +## @returns +## Zero if the given property is set to any value within +## guacamole.properties, non-zero otherwise. +## +is_property_set() { + local PROPERTY_NAME="$1" + grep "^[[:space:]]*$PROPERTY_NAME\>" "$GUACAMOLE_HOME/guacamole.properties" &> /dev/null +} + +# +# Start with a fresh GUACAMOLE_HOME +# + +rm -rf /tmp/guacamole-home.* +GUACAMOLE_HOME="`mktemp -p /tmp -d guacamole-home.XXXXXXXXXX`" +mkdir -p "$GUACAMOLE_HOME/"{lib,extensions} + +cat > "$GUACAMOLE_HOME/guacamole.properties" <> "$GUACAMOLE_HOME/guacamole.properties" + fi + +fi + +# Enable reading of properties directly from environment variables unless +# overridden +if ! is_property_set "enable-environment-properties"; then + cat >> "$GUACAMOLE_HOME/guacamole.properties" <<'EOF' +# +# NOTE: The following was automatically added by the container entrypoint to +# allow all Guacamole configuration properties to be automatically read from +# environment variables. If this is not desired, you can override this behavior +# by specifying the "enable-environment-properties" variable yourself in your +# own guacamole.properties file. +# +enable-environment-properties: true +EOF +fi + diff --git a/guacamole-docker/entrypoint.d/500-generate-tomcat-catalina-base.sh b/guacamole-docker/entrypoint.d/500-generate-tomcat-catalina-base.sh new file mode 100644 index 0000000..cd86951 --- /dev/null +++ b/guacamole-docker/entrypoint.d/500-generate-tomcat-catalina-base.sh @@ -0,0 +1,50 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## 500-generate-tomcat-catalina-base.sh +## +## Automcatically generates a fresh, temporary CATALINA_BASE for Apache Tomcat. +## This allows Tomcat to run as a reduced-privilege user, and allows its +## configuration to be dynamically generated by the container entrypoint at +## startup. +## + +# +# Start with a fresh CATALINA_BASE +# + +rm -rf /tmp/catalina-base.* +export CATALINA_BASE="`mktemp -p /tmp -d catalina-base.XXXXXXXXXX`" + +# User-only writable CATALINA_BASE +for dir in logs temp webapps work; do + mkdir -p $CATALINA_BASE/$dir +done +cp -R /usr/local/tomcat/conf $CATALINA_BASE + +cat >> "$CATALINA_BASE/conf/catalina.properties" < /dev/null + +} + +# Search environment for enabled extensions/features based on environment +# variable prefixes +for VAR_BASE in /opt/guacamole/environment/*; do + + # Skip any directories without at least one corresponding environment + # variable set + is_feature_enabled "$(basename "$VAR_BASE")" || continue + + # Execute any associated configuration script + [ ! -e "$VAR_BASE/configure.sh" ] || source "$VAR_BASE/configure.sh" + + # Add any required links for extensions/libraries associated with the + # configured extension + for SUBDIR in lib extensions; do + if [ -d "$VAR_BASE/$SUBDIR" ]; then + mkdir -p "$GUACAMOLE_HOME/$SUBDIR/" + ln -s "$VAR_BASE/$SUBDIR"/* "$GUACAMOLE_HOME/$SUBDIR/" + fi + done + +done + diff --git a/guacamole-docker/entrypoint.d/999-start-tomcat.sh b/guacamole-docker/entrypoint.d/999-start-tomcat.sh new file mode 100644 index 0000000..e31b4e3 --- /dev/null +++ b/guacamole-docker/entrypoint.d/999-start-tomcat.sh @@ -0,0 +1,30 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn 999-start-tomcat.sh +## +## Starts Tomcat. This script replaces the current process with the Tomcat +## process and does not exit. +## + +# Start tomcat +cd /usr/local/tomcat +exec catalina.sh run + diff --git a/guacamole-docker/environment/REMOTE_IP_VALVE_/configure.sh b/guacamole-docker/environment/REMOTE_IP_VALVE_/configure.sh new file mode 100644 index 0000000..d998dc1 --- /dev/null +++ b/guacamole-docker/environment/REMOTE_IP_VALVE_/configure.sh @@ -0,0 +1,60 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn REMOTE_IP_VALVE_/configure.sh +## +## Configures Tomcat to forward the IP addresses of clients behind a proxy if +## the REMOTE_IP_VALVE_ENABLED environment variable is set to "true". +## + +## +## Array of all xmlstarlet command-line options necessary to add the +## RemoteIpValve attributes that correspond to various "REMOTE_IP_VALVE_*" +## environment variables. +## +declare -a VALVE_ATTRIBUTES=( --insert '/Server/Service/Engine/Host/Valve[not(@className)]' --type attr -n className -v org.apache.catalina.valves.RemoteIpValve ) + +# Translate all properties supported by RemoteIpValve into corresponding +# environment variables +for ATTRIBUTE in \ + remoteIpHeader \ + internalProxies \ + proxiesHeader \ + trustedProxies \ + protocolHeader \ + protocolHeaderHttpsValue \ + httpServerPort \ + httpsServerPort; do + + VAR_NAME="REMOTE_IP_VALVE_$(echo "$ATTRIBUTE" | sed 's/\([a-z]\)\([A-Z]\)/\1_\2/g' | tr 'a-z' 'A-Z')" + if [ -n "${!VAR_NAME}" ]; then + VALVE_ATTRIBUTES+=( --insert '/Server/Service/Engine/Host/Valve[@className="org.apache.catalina.valves.RemoteIpValve"]' --type attr -n "$ATTRIBUTE" -v "${!VAR_NAME}" ) + else + echo "Using default RemoteIpValve value for \"$ATTRIBUTE\" attribute." + fi + +done + +# Programmatically add requested RemoteIpValve entry +xmlstarlet edit --inplace \ + --insert '/Server/Service/Engine/Host/*' --type elem -n Valve \ + "${VALVE_ATTRIBUTES[@]}" \ + "$CATALINA_BASE/conf/server.xml" + diff --git a/guacamole-docker/mozilla-firefox.pref b/guacamole-docker/mozilla-firefox.pref new file mode 100644 index 0000000..f854044 --- /dev/null +++ b/guacamole-docker/mozilla-firefox.pref @@ -0,0 +1,3 @@ +Package: * +Pin: release o=LP-PPA-mozillateam +Pin-Priority: 1001 diff --git a/guacamole-ext/.gitignore b/guacamole-ext/.gitignore new file mode 100644 index 0000000..42f4a1a --- /dev/null +++ b/guacamole-ext/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/guacamole-ext/.ratignore b/guacamole-ext/.ratignore new file mode 100644 index 0000000..e69de29 diff --git a/guacamole-ext/pom.xml b/guacamole-ext/pom.xml new file mode 100644 index 0000000..779dcc0 --- /dev/null +++ b/guacamole-ext/pom.xml @@ -0,0 +1,121 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-ext + jar + 1.6.0 + guacamole-ext + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-client + 1.6.0 + ../ + + + + The Java API for extending the main Guacamole web application. This + is not needed for authoring a new Guacamole-based web application. + + + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + https://github.com/apache/guacamole-client + scm:git:https://git.wip-us.apache.org/repos/asf/guacamole-client.git + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + org.apache.guacamole + guacamole-common + 1.6.0 + compile + + + + + junit + junit + test + + + + + com.google.guava + guava + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.github.seancfoley + ipaddress + + + + + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/environment/DefaultEnvironment.java b/guacamole-ext/src/main/java/org/apache/guacamole/environment/DefaultEnvironment.java new file mode 100644 index 0000000..a3db06c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/environment/DefaultEnvironment.java @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.environment; + +import org.apache.guacamole.properties.GuacamoleProperties; +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Internal implementation of Environment that provides the default + * implementations for any functions that are added to the Environment + * interface. This is primarily necessary to allow those default implementations + * to log warnings or informational messages without needing to repeatedly + * recreate the Logger. + */ +class DefaultEnvironment extends DelegatingEnvironment { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(DefaultEnvironment.class); + + /** + * Creates a new DefaultEnvironment that provides default implementations + * for functions that may not be implemented by the given Environment + * implementation. The versions provided by DefaultEnvironment must still + * be manually called by actual public default functions on + * Environment to have any effect. + * + * @param environment + * The environment that may not provide implementations for all + * functions defined by the Environment interface. + */ + protected DefaultEnvironment(Environment environment) { + super(environment); + } + + @Override + public Collection getPropertyCollection( + GuacamoleProperty property) throws GuacamoleException { + + /* Pull the given property as a string. */ + StringGuacamoleProperty stringProperty = new StringGuacamoleProperty() { + + @Override + public String getName() { return property.getName(); } + + }; + + /* Parse the string to a Collection of the desired type. */ + return property.parseValueCollection(getProperty(stringProperty)); + + } + + @Override + public Collection getPropertyCollection( + GuacamoleProperty property, Type defaultValue) + throws GuacamoleException { + + /* Pull the given property as a string. */ + StringGuacamoleProperty stringProperty = new StringGuacamoleProperty() { + + @Override + public String getName() { return property.getName(); } + + }; + + /* Check the value and return the default if null. */ + String stringValue = getProperty(stringProperty); + if (stringValue == null) + return Collections.singletonList(defaultValue); + + /* Parse the string and return the collection. */ + return property.parseValueCollection(stringValue); + + } + + @Override + public Collection getPropertyCollection( + GuacamoleProperty property, Collection defaultValue) + throws GuacamoleException { + + /* Pull the given property as a string. */ + StringGuacamoleProperty stringProperty = new StringGuacamoleProperty() { + + @Override + public String getName() { return property.getName(); } + + }; + + /* Check the value and return the default if null. */ + String stringValue = getProperty(stringProperty); + if (stringValue == null) + return defaultValue; + + /* Parse the string and return the collection. */ + return property.parseValueCollection(stringValue); + + } + + @Override + public Collection getRequiredPropertyCollection( + GuacamoleProperty property) throws GuacamoleException { + + /* Pull the given property as a string. */ + StringGuacamoleProperty stringProperty = new StringGuacamoleProperty() { + + @Override + public String getName() { return property.getName(); } + + }; + + /* Parse the string to a Collection of the desired type. */ + return property.parseValueCollection(getRequiredProperty(stringProperty)); + + } + + @Override + public void addGuacamoleProperties(GuacamoleProperties properties) + throws GuacamoleException { + throw new GuacamoleUnsupportedException(String.format("%s does not " + + "support dynamic definition of Guacamole properties.", + getClass())); + } + + @Override + public CaseSensitivity getCaseSensitivity() { + + try { + return DefaultEnvironment.this.getProperty(CASE_SENSITIVITY, CaseSensitivity.ENABLED); + } + catch (GuacamoleException e) { + + logger.error("Defaulting to case-sensitive handling of " + + "usernames and group names as the desired case " + + "sensitivity configuration could not be read: {}", + e.getMessage()); + + logger.debug("Error reading case sensitivity configuration.", e); + return CaseSensitivity.ENABLED; + + } + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/environment/DelegatingEnvironment.java b/guacamole-ext/src/main/java/org/apache/guacamole/environment/DelegatingEnvironment.java new file mode 100644 index 0000000..8b3cf9c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/environment/DelegatingEnvironment.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.environment; + +import java.io.File; +import java.util.Collection; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.guacamole.properties.GuacamoleProperties; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.apache.guacamole.protocols.ProtocolInfo; + +/** + * Environment implementation which simply delegates all function calls to a + * wrapped Environment instance. + */ +public class DelegatingEnvironment implements Environment { + + /** + * The Environment instance that all function calls should be delegated to. + */ + private final Environment environment; + + /** + * Creates a new DelegatingEnvironment which delegates all function calls + * to the given Environment. + * + * @param environment + * The Environment that all function calls should be delegated to. + */ + public DelegatingEnvironment(Environment environment) { + this.environment = environment; + } + + @Override + public File getGuacamoleHome() { + return environment.getGuacamoleHome(); + } + + @Override + public Map getProtocols() { + return environment.getProtocols(); + } + + @Override + public ProtocolInfo getProtocol(String name) { + return environment.getProtocol(name); + } + + @Override + public Type getProperty(GuacamoleProperty property) throws GuacamoleException { + return environment.getProperty(property); + } + + @Override + public Type getProperty(GuacamoleProperty property, Type defaultValue) throws GuacamoleException { + return environment.getProperty(property, defaultValue); + } + + @Override + public Collection getPropertyCollection(GuacamoleProperty property) + throws GuacamoleException { + return environment.getPropertyCollection(property); + } + + @Override + public Collection getPropertyCollection(GuacamoleProperty property, + Type defaultValue) throws GuacamoleException { + return environment.getPropertyCollection(property, defaultValue); + } + + @Override + public Collection getPropertyCollection(GuacamoleProperty property, + Collection defaultValue) throws GuacamoleException { + return environment.getPropertyCollection(property, defaultValue); + } + + @Override + public Type getRequiredProperty(GuacamoleProperty property) throws GuacamoleException { + return environment.getRequiredProperty(property); + } + + @Override + public Collection getRequiredPropertyCollection(GuacamoleProperty property) + throws GuacamoleException { + return environment.getRequiredPropertyCollection(property); + } + + @Override + public GuacamoleProxyConfiguration getDefaultGuacamoleProxyConfiguration() throws GuacamoleException { + return environment.getDefaultGuacamoleProxyConfiguration(); + } + + @Override + public void addGuacamoleProperties(GuacamoleProperties properties) throws GuacamoleException { + environment.addGuacamoleProperties(properties); + } + + @Override + public CaseSensitivity getCaseSensitivity() { + return environment.getCaseSensitivity(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/environment/Environment.java b/guacamole-ext/src/main/java/org/apache/guacamole/environment/Environment.java new file mode 100644 index 0000000..01d81bb --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/environment/Environment.java @@ -0,0 +1,346 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.environment; + +import org.apache.guacamole.properties.GuacamoleProperties; +import java.io.File; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.function.Supplier; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.CaseSensitivity; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.apache.guacamole.properties.StringGuacamoleProperty; +import org.apache.guacamole.protocols.ProtocolInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The environment of an arbitrary Guacamole instance, describing available + * protocols, configuration parameters, and the GUACAMOLE_HOME directory. + */ +public interface Environment { + + /** + * The hostname of the server where guacd (the Guacamole proxy server) is + * running. + */ + public static final StringGuacamoleProperty GUACD_HOSTNAME = new StringGuacamoleProperty() { + + @Override + public String getName() { return "guacd-hostname"; } + + }; + + /** + * The port that guacd (the Guacamole proxy server) is listening on. + */ + public static final IntegerGuacamoleProperty GUACD_PORT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "guacd-port"; } + + }; + + /** + * Whether guacd requires SSL/TLS on connections. + */ + public static final BooleanGuacamoleProperty GUACD_SSL = new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "guacd-ssl"; } + + }; + + /** + * A property that configures how Guacamole handles case sensitivity - it + * can be enabled for both usernames and group names, just usernames, just + * group names, or disabled for both. + */ + public static final EnumGuacamoleProperty CASE_SENSITIVITY = + new EnumGuacamoleProperty(CaseSensitivity.class) { + + @Override + public String getName() { return "case-sensitivity"; } + + }; + + /** + * Returns the Guacamole home directory as determined when this Environment + * object was created. The Guacamole home directory is found by checking, in + * order: the guacamole.home system property, the GUACAMOLE_HOME environment + * variable, and finally the .guacamole directory in the home directory of + * the user running the servlet container. + * + * @return The File representing the Guacamole home directory, which may + * or may not exist, and may turn out to not be a directory. + */ + public File getGuacamoleHome(); + + /** + * Returns a map of all available protocols, where each key is the name of + * that protocol as would be passed to guacd during connection. + * + * @return A map of all available protocols. + */ + public Map getProtocols(); + + /** + * Returns the protocol having the given name. The name must be the + * protocol name as would be passed to guacd during connection. + * + * @param name The name of the protocol. + * @return The protocol having the given name, or null if no such + * protocol is registered. + */ + public ProtocolInfo getProtocol(String name); + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties, if any. + * + * @param + * The type that the given property is parsed into. + * + * @param property + * The property to read from guacamole.properties. + * + * @return + * The parsed value of the property as read from guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs while parsing the value for the given property in + * guacamole.properties. + */ + public Type getProperty(GuacamoleProperty property) + throws GuacamoleException; + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties, if any. If no value is found, the + * provided default value is returned. + * + * @param + * The type that the given property is parsed into. + * + * @param property + * The property to read from guacamole.properties. + * + * @param defaultValue + * The value to return if no value was given in guacamole.properties. + * + * @return + * The parsed value of the property as read from guacamole.properties, + * or the provided default value if no value was found. + * + * @throws GuacamoleException + * If an error occurs while parsing the value for the given property in + * guacamole.properties. + */ + public Type getProperty(GuacamoleProperty property, + Type defaultValue) throws GuacamoleException; + + /** + * Given a GuacamoleProperty, parses and returns a sorted Collection of the + * value set for that property in guacamole.properties, if any. The + * implementation of parsing and returning a collection of multiple + * values is up to the individual property implementations, and not all + * implementations will support reading and returning multiple values. + * + * @param + * The type that the given property is parsed into. + * + * @param property + * The property to read from guacamole.properties. + * + * @return + * A sorted collection of the the parsed values of the property as read + * from guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs while parsing the value for the given property in + * guacamole.properties. + */ + public default Collection getPropertyCollection( + GuacamoleProperty property) throws GuacamoleException { + return new DefaultEnvironment(this).getPropertyCollection(property); + } + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties, if any. If no value is found, a + * Collection is returned with the provided default value. The + * implementation of parsing and returning a collection of multiple + * values is up to the individual property implementations, and not all + * implementations will support reading and returning multiple values. + * + * @param + * The type that the given property is parsed into. + * + * @param property + * The property to read from guacamole.properties. + * + * @param defaultValue + * The single value to return in the Collection if no value was given + * in guacamole.properties. + * + * @return + * A sorted collection of the the parsed values of the property as read + * from guacamole.properties, or a Collection with the single default + * value provided. + * + * @throws GuacamoleException + * If an error occurs while parsing the value for the given property in + * guacamole.properties. + */ + public default Collection getPropertyCollection( + GuacamoleProperty property, Type defaultValue) + throws GuacamoleException { + return new DefaultEnvironment(this).getPropertyCollection(property, defaultValue); + } + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties, if any. If no value is found, the + * provided Collection of default values is returned. The + * implementation of parsing and returning a collection of multiple + * values is up to the individual property implementations, and not all + * implementations will support reading and returning multiple values. + * + * @param + * The type that the given property is parsed into. + * + * @param property + * The property to read from guacamole.properties. + * + * @param defaultValue + * The Collection of values to return in the Collection if no value was + * given in guacamole.properties. + * + * @return + * A sorted collection of the the parsed values of the property as read + * from guacamole.properties, or a Collection with the single default + * value provided. + * + * @throws GuacamoleException + * If an error occurs while parsing the value for the given property in + * guacamole.properties. + */ + public default Collection getPropertyCollection( + GuacamoleProperty property, Collection defaultValue) + throws GuacamoleException { + return new DefaultEnvironment(this).getPropertyCollection(property, defaultValue); + } + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties. An exception is thrown if the value + * is not provided. + * + * @param The type that the given property is parsed into. + * @param property The property to read from guacamole.properties. + * @return The parsed value of the property as read from + * guacamole.properties. + * @throws GuacamoleException If an error occurs while parsing the value + * for the given property in + * guacamole.properties, or if the property is + * not specified. + */ + public Type getRequiredProperty(GuacamoleProperty property) + throws GuacamoleException; + + /** + * Given a GuacamoleProperty, parses and returns a sorted Collection of + * values for that property in guacamole.properties. An exception is thrown + * if the value is not provided. The implementation of parsing and returning + * a collection of multiple values is up to the individual property + * implementations, and not all implementations will support reading and + * returning multiple values. + * + * @param + * The type that the given property is parsed into. + * + * @param property + * The property to read from guacamole.properties. + * + * @return + * A sorted Collection of the property as read from guacamole.properties. + * + * @throws GuacamoleException + * If an error occurs while parsing the value for the given property in + * guacamole.properties, or if the property is not specified. + */ + public default Collection getRequiredPropertyCollection( + GuacamoleProperty property) throws GuacamoleException { + return new DefaultEnvironment(this).getRequiredPropertyCollection(property); + } + + /** + * Returns the connection information which should be used, by default, to + * connect to guacd when establishing a remote desktop connection. + * + * @return + * The connection information which should be used, by default, to + * connect to guacd. + * + * @throws GuacamoleException + * If the connection information for guacd cannot be retrieved. + */ + public GuacamoleProxyConfiguration getDefaultGuacamoleProxyConfiguration() + throws GuacamoleException; + + /** + * Adds another possible source of Guacamole configuration properties to + * this Environment. Properties not already defined by other sources of + * Guacamole configuration properties will alternatively be read from the + * given {@link GuacamoleProperties}. + * + * @param properties + * The GuacamoleProperties to add to this Environment. + * + * @throws GuacamoleException + * If the given GuacamoleProperties cannot be added, or if this + * Environment does not support this operation. + */ + public default void addGuacamoleProperties(GuacamoleProperties properties) + throws GuacamoleException { + new DefaultEnvironment(this).addGuacamoleProperties(properties); + } + + /** + * Returns the case sensitivity configuration for Guacamole as defined + * in guacamole.properties, or the default of enabling case sensitivity + * for both usernames and group names. + * + * @return + * The case sensitivity setting as configured in guacamole.properties, + * or the default of enabling case sensitivity. + */ + public default CaseSensitivity getCaseSensitivity() { + return new DefaultEnvironment(this).getCaseSensitivity(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/environment/LocalEnvironment.java b/guacamole-ext/src/main/java/org/apache/guacamole/environment/LocalEnvironment.java new file mode 100644 index 0000000..bd0f3f1 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/environment/LocalEnvironment.java @@ -0,0 +1,443 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.environment; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.File; +import java.io.FileInputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.properties.GuacamoleProperties; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.apache.guacamole.protocols.ProtocolInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The environment of the locally-running Guacamole instance, describing + * available protocols, configuration parameters, and the GUACAMOLE_HOME + * directory. Sources of configuration properties like guacamole.properties and + * environment variables will be automatically added by the Guacamole web + * application and may also be added by extensions using + * {@link #addGuacamoleProperties(org.apache.guacamole.properties.GuacamoleProperties)}. + */ +public class LocalEnvironment implements Environment { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(LocalEnvironment.class); + + /** + * Array of all known protocol names. + */ + private static final String[] KNOWN_PROTOCOLS = new String[] { + "kubernetes", + "rdp", + "ssh", + "telnet", + "vnc", + }; + + /** + * The hostname to use when connecting to guacd if no hostname is provided + * within guacamole.properties. + */ + private static final String DEFAULT_GUACD_HOSTNAME = "localhost"; + + /** + * The port to use when connecting to guacd if no port is provided within + * guacamole.properties. + */ + private static final int DEFAULT_GUACD_PORT = 4822; + + /** + * Whether SSL/TLS is enabled for connections to guacd if not specified + * within guacamole.properties. + */ + private static final boolean DEFAULT_GUACD_SSL = false; + + /** + * The location of GUACAMOLE_HOME, which may not truly exist. + */ + private final File guacHome; + + /** + * The map of all available protocols. + */ + private final Map availableProtocols; + + /** + * All GuacamoleProperties instances added via addGuacamoleProperties(), in + * the order that they were added. This storage has been made static to + * allow addGuacamoleProperties() to work as expected even if extensions + * continue to use the deprecated constructor to create non-singleton + * instances. + */ + private static final List availableProperties = new CopyOnWriteArrayList<>(); + + /** + * The Jackson parser for parsing JSON files. + */ + private static final ObjectMapper mapper = new ObjectMapper(); + + /** + * Singleton instance of this environment, to be returned by calls to + * getInstance(). + */ + private static final LocalEnvironment instance = new LocalEnvironment(); + + /** + * Returns a singleton instance of LocalEnvironment which may be shared by + * the Guacamole web application and all extensions. + * + * @return + * A singleton instance of this class. + */ + public static LocalEnvironment getInstance() { + return instance; + } + + /** + * Creates a new LocalEnvironment, initializing that environment based on + * the contents of GUACAMOLE_HOME. Sources of configuration properties like + * guacamole.properties and environment variables will be automatically + * added by the Guacamole web application and/or any installed extensions. + * + * @deprecated + * Extensions leveraging LocalEnvironment should instead use + * LocalEnvironment.getInstance() to obtain a singleton instance of the + * environment. + */ + @Deprecated + public LocalEnvironment() { + + // Determine location of GUACAMOLE_HOME + guacHome = findGuacamoleHome(); + logger.info("GUACAMOLE_HOME is \"{}\".", guacHome.getAbsolutePath()); + + // Read all protocols + availableProtocols = readProtocols(); + + } + + /** + * Locates the Guacamole home directory by checking, in order: + * the guacamole.home system property, the GUACAMOLE_HOME environment + * variable, and finally the .guacamole directory in the home directory of + * the user running the servlet container. If even the .guacamole directory + * doesn't exist, then /etc/guacamole will be used. + * + * @return The File representing the Guacamole home directory, which may + * or may not exist, and may turn out to not be a directory. + */ + private static File findGuacamoleHome() { + + // Attempt to find Guacamole home + File guacHome; + + // Use system property by default + String desiredDir = System.getProperty("guacamole.home"); + + // Failing that, try the GUACAMOLE_HOME environment variable + if (desiredDir == null) desiredDir = System.getenv("GUACAMOLE_HOME"); + + // If successful, use explicitly specified directory + if (desiredDir != null) + guacHome = new File(desiredDir); + + // If not explicitly specified, use standard locations + else { + + // Try ~/.guacamole first + guacHome = new File(System.getProperty("user.home"), ".guacamole"); + + // If that doesn't exist, try /etc/guacamole if the /etc directory + // exists on this system + if (!guacHome.exists() && new File("/etc").exists()) + guacHome = new File("/etc/guacamole"); + + } + + // Return discovered directory + return guacHome; + + } + + /** + * Parses the given JSON file, returning the parsed ProtocolInfo. The JSON + * format is conveniently and intentionally identical to a serialized + * ProtocolInfo object, which is identical to the JSON format used by the + * protocol REST service built into the Guacamole web application. + * + * @param input + * An input stream containing JSON describing the forms and parameters + * associated with a protocol supported by Guacamole. + * + * @return + * A new ProtocolInfo object which contains the forms and parameters + * described by the JSON file parsed. + * + * @throws IOException + * If an error occurs while parsing the JSON file. + */ + private ProtocolInfo readProtocol(InputStream input) + throws IOException { + return mapper.readValue(input, ProtocolInfo.class); + } + + /** + * Reads through all pre-defined protocols and any protocols within the + * "protocols" subdirectory of GUACAMOLE_HOME, returning a map containing + * each of these protocols. The key of each entry will be the name of that + * protocol, as would be passed to guacd during connection. + * + * @return + * A map of all available protocols. + */ + private Map readProtocols() { + + // Map of all available protocols + Map protocols = new HashMap(); + + // Get protcols directory + File protocol_directory = new File(getGuacamoleHome(), "protocols"); + + // Read protocols from directory if it exists + if (protocol_directory.isDirectory()) { + + // Get all JSON files + File[] files = protocol_directory.listFiles( + new FilenameFilter() { + + @Override + public boolean accept(File file, String string) { + return string.endsWith(".json"); + } + + } + ); + + // Warn if directory contents are not available + if (files == null) { + logger.error("Unable to read contents of \"{}\".", protocol_directory.getAbsolutePath()); + files = new File[0]; + } + + // Load each protocol from each file + for (File file : files) { + + try { + + // Parse protocol + FileInputStream stream = new FileInputStream(file); + ProtocolInfo protocol = readProtocol(stream); + stream.close(); + + // Store protocol + protocols.put(protocol.getName(), protocol); + + } + catch (IOException e) { + logger.error("Unable to read connection parameter information from \"{}\": {}", file.getAbsolutePath(), e.getMessage()); + logger.debug("Error reading protocol JSON.", e); + } + + } + + } + + // If known protocols are not already defined, read from classpath + for (String protocol : KNOWN_PROTOCOLS) { + + // If protocol not defined yet, attempt to load from classpath + if (!protocols.containsKey(protocol)) { + + InputStream stream = LocalEnvironment.class.getResourceAsStream( + "/org/apache/guacamole/protocols/" + + protocol + ".json"); + + // Parse JSON if available + if (stream != null) { + try { + protocols.put(protocol, readProtocol(stream)); + } + catch (IOException e) { + logger.error("Unable to read pre-defined connection parameter information for protocol \"{}\": {}", protocol, e.getMessage()); + logger.debug("Error reading pre-defined protocol JSON.", e); + } + } + + } + + } + + // Protocols map now fully populated + return protocols; + + } + + @Override + public File getGuacamoleHome() { + return guacHome; + } + + /** + * Returns the string value of the property having the given name, trying + * each source of properties added with addGuacamoleProperties() until a + * value is found. If no such property is defined, null is returned. + * + * @param name + * The name of the property value to retrieve. + * + * @return + * The value of the property having the given name, or null if no such + * property is defined. + * + * @throws GuacamoleException + * If an error occurs retrieving a property from a GuacamoleProperties + * implementation added via addGuacamoleProperties(). + */ + private String getPropertyValue(String name) throws GuacamoleException { + + // Search all provided GuacamoleProperties implementations, in order + for (GuacamoleProperties properties : availableProperties) { + String value = properties.getProperty(name); + if (value != null) + return value; + } + + // No such property + return null; + + } + + @Override + public Type getProperty(GuacamoleProperty property) throws GuacamoleException { + return property.parseValue(getPropertyValue(property.getName())); + } + + @Override + public Type getProperty(GuacamoleProperty property, + Type defaultValue) throws GuacamoleException { + + Type value = getProperty(property); + if (value == null) + return defaultValue; + + return value; + + } + + @Override + public Collection getPropertyCollection(GuacamoleProperty property) + throws GuacamoleException { + + return property.parseValueCollection(getPropertyValue(property.getName())); + + } + + @Override + public Collection getPropertyCollection(GuacamoleProperty property, + Type defaultValue) throws GuacamoleException { + + Collection value = getPropertyCollection(property); + if (value == null) + return Collections.singletonList(defaultValue); + + return value; + + } + + @Override + public Collection getPropertyCollection(GuacamoleProperty property, + Collection defaultValue) throws GuacamoleException { + + Collection value = getPropertyCollection(property); + if (value == null) + return defaultValue; + + return value; + + } + + @Override + public Type getRequiredProperty(GuacamoleProperty property) + throws GuacamoleException { + + Type value = getProperty(property); + if (value == null) + throw new GuacamoleServerException("Property " + property.getName() + " is required."); + + return value; + + } + + @Override + public Collection getRequiredPropertyCollection(GuacamoleProperty property) + throws GuacamoleException { + + Collection value = getPropertyCollection(property); + if (value == null) + throw new GuacamoleServerException("Property " + property.getName() + " is required."); + + return value; + + } + + @Override + public Map getProtocols() { + return availableProtocols; + } + + @Override + public ProtocolInfo getProtocol(String name) { + return availableProtocols.get(name); + } + + @Override + public GuacamoleProxyConfiguration getDefaultGuacamoleProxyConfiguration() + throws GuacamoleException { + + // Parse guacd hostname/port/ssl properties + return new GuacamoleProxyConfiguration( + getProperty(Environment.GUACD_HOSTNAME, DEFAULT_GUACD_HOSTNAME), + getProperty(Environment.GUACD_PORT, DEFAULT_GUACD_PORT), + getProperty(Environment.GUACD_SSL, DEFAULT_GUACD_SSL) + ); + + } + + @Override + public void addGuacamoleProperties(GuacamoleProperties properties) { + availableProperties.add(properties); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/BooleanField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/BooleanField.java new file mode 100644 index 0000000..032c503 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/BooleanField.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import java.util.Collections; + +/** + * Represents a field with strictly one possible value. It is assumed that the + * field may be blank, but that its sole non-blank value is the value provided. + * The provided value represents "true" while all other values, including + * having no associated value, represent "false". + */ +public class BooleanField extends Field { + + /** + * Creates a new BooleanField with the given name and truth value. The + * truth value is the value that, when assigned to this field, means that + * this field is "true". + * + * @param name + * The unique name to associate with this field. + * + * @param truthValue + * The value to consider "true" for this field. All other values will + * be considered "false". + */ + public BooleanField(String name, String truthValue) { + super(name, Field.Type.BOOLEAN, Collections.singletonList(truthValue)); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/DateField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/DateField.java new file mode 100644 index 0000000..d7c6bed --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/DateField.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Represents a date field. The field may contain only date values which + * conform to a standard pattern, defined by DateField.FORMAT. + */ +public class DateField extends Field { + + /** + * The date format used by date fields, compatible with SimpleDateFormat. + */ + public static final String FORMAT = "yyyy-MM-dd"; + + /** + * Creates a new DateField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public DateField(String name) { + super(name, Field.Type.DATE); + } + + /** + * Converts the given date into a string which follows the format used by + * date fields. + * + * @param date + * The date value to format, which may be null. + * + * @return + * The formatted date, or null if the provided time was null. + */ + public static String format(Date date) { + DateFormat dateFormat = new SimpleDateFormat(DateField.FORMAT); + return date == null ? null : dateFormat.format(date); + } + + /** + * Parses the given string into a corresponding date. The string must + * follow the standard format used by date fields, as defined by FORMAT + * and as would be produced by format(). + * + * @param dateString + * The date string to parse, which may be null. + * + * @return + * The date corresponding to the given date string, or null if the + * provided date string was null or blank. + * + * @throws ParseException + * If the given date string does not conform to the standard format + * used by date fields. + */ + public static Date parse(String dateString) + throws ParseException { + + // Return null if no date provided + if (dateString == null || dateString.isEmpty()) + return null; + + // Parse date according to format + DateFormat dateFormat = new SimpleDateFormat(DateField.FORMAT); + return dateFormat.parse(dateString); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/EmailField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/EmailField.java new file mode 100644 index 0000000..e56a757 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/EmailField.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a text field which may contain an email address. + */ +public class EmailField extends Field { + + /** + * Creates a new EmailField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public EmailField(String name) { + super(name, Field.Type.EMAIL); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/EnumField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/EnumField.java new file mode 100644 index 0000000..1c07baf --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/EnumField.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import java.util.Collection; + +/** + * Represents an arbitrary field with a finite, enumerated set of possible + * values. + */ +public class EnumField extends Field { + + /** + * Creates a new EnumField with the given name and possible values. + * + * @param name + * The unique name to associate with this field. + * + * @param options + * All possible legal options for this field. + */ + public EnumField(String name, Collection options) { + super(name, Field.Type.ENUM, options); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java new file mode 100644 index 0000000..aa1c925 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java @@ -0,0 +1,250 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Collection; + +/** + * Represents an arbitrary field, such as an HTTP parameter, the parameter of a + * remote desktop protocol, or an input field within a form. Fields are generic + * and typed dynamically through a type string, with the semantics of the field + * defined by the type string. The behavior of each field type is defined + * either through the web application itself (see FormService.js) or through + * extensions. + */ +@JsonInclude(value=Include.NON_NULL) +public class Field { + + /** + * All types of fields which are available by default. Additional field + * types may be defined by extensions by using a unique field type name and + * registering that name with the form service within JavaScript. + * + * See FormService.js. + */ + public static class Type { + + /** + * A text field, accepting arbitrary values. + */ + public static final String TEXT = "TEXT"; + + /** + * An email address field. This field type generally behaves + * identically to arbitrary text fields, but has semantic differences. + */ + public static final String EMAIL = "EMAIL"; + + /** + * A username field. This field type generally behaves identically to + * arbitrary text fields, but has semantic differences. + */ + public static final String USERNAME = "USERNAME"; + + /** + * A password field, whose value is sensitive and must be hidden. + */ + public static final String PASSWORD = "PASSWORD"; + + /** + * A numeric field, whose value must contain only digits. + */ + public static final String NUMERIC = "NUMERIC"; + + /** + * A boolean field, whose value is either blank or "true". + */ + public static final String BOOLEAN = "BOOLEAN"; + + /** + * An enumerated field, whose legal values are fully enumerated by a + * provided, finite list. + */ + public static final String ENUM = "ENUM"; + + /** + * A text field that can span more than one line. + */ + public static final String MULTILINE = "MULTILINE"; + + /** + * A time zone field whose legal values are only valid time zone IDs, + * as dictated by Java within TimeZone.getAvailableIDs(). + */ + public static final String TIMEZONE = "TIMEZONE"; + + /** + * Field type which allows selection of languages. The languages + * displayed are the set of languages supported by the Guacamole web + * application. Legal values are valid language IDs, as dictated by + * the filenames of Guacamole's available translations. + */ + public static final String LANGUAGE = "LANGUAGE"; + + /** + * A date field whose legal values conform to the pattern "YYYY-MM-DD", + * zero-padded. + */ + public static final String DATE = "DATE"; + + /** + * A time field whose legal values conform to the pattern "HH:MM:SS", + * zero-padded, 24-hour. + */ + public static final String TIME = "TIME"; + + /** + * An HTTP query parameter which is expected to be embedded in the URL + * given to a user. + */ + public static final String QUERY_PARAMETER = "QUERY_PARAMETER"; + + /** + * A color scheme accepted by the Guacamole server terminal emulator + * and protocols which leverage it. + */ + public static final String TERMINAL_COLOR_SCHEME = "TERMINAL_COLOR_SCHEME"; + + /** + * A redirect field whose value is an encoded URL to which the user + * will be redirected. + */ + public static final String REDIRECT = "REDIRECT"; + + } + + /** + * The unique name that identifies this field. + */ + private String name; + + /** + * The type of this field. + */ + private String type; + + /** + * A collection of all legal values of this field. + */ + private Collection options; + + /** + * Creates a new Parameter with no associated name or type. + */ + public Field() { + } + + /** + * Creates a new Field with the given name and type. + * + * @param name + * The unique name to associate with this field. + * + * @param type + * The type of this field. + */ + public Field(String name, String type) { + this.name = name; + this.type = type; + } + + /** + * Creates a new Field with the given name, type, and possible values. + * + * @param name + * The unique name to associate with this field. + * + * @param type + * The type of this field. + * + * @param options + * A collection of all possible valid options for this field. + */ + public Field(String name, String type, Collection options) { + this.name = name; + this.type = type; + this.options = options; + } + + /** + * Returns the unique name associated with this field. + * + * @return + * The unique name associated with this field. + */ + public String getName() { + return name; + } + + /** + * Sets the unique name associated with this field. + * + * @param name + * The unique name to assign to this field. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the type of this field. + * + * @return + * The type of this field. + */ + public String getType() { + return type; + } + + /** + * Sets the type of this field. + * + * @param type + * The type of this field. + */ + public void setType(String type) { + this.type = type; + } + + /** + * Returns a mutable collection of field options. Changes to this + * collection directly affect the available options. + * + * @return + * A mutable collection of field options, or null if the field has no + * options. + */ + public Collection getOptions() { + return options; + } + + /** + * Sets the options available as possible values of this field. + * + * @param options + * The options to associate with this field. + */ + public void setOptions(Collection options) { + this.options = options; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/FieldOption.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/FieldOption.java new file mode 100644 index 0000000..3a501a6 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/FieldOption.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +/** + * Describes an available legal value for an enumerated field. + */ +@JsonInclude(value=Include.NON_NULL) +public class FieldOption { + + /** + * The value that will be assigned if this option is chosen. + */ + private String value; + + /** + * A human-readable title describing the effect of the value. + */ + private String title; + + /** + * Creates a new FieldOption with no associated value or title. + */ + public FieldOption() { + } + + /** + * Creates a new FieldOption having the given value and title. + * + * @param value + * The value to assign if this option is chosen. + * + * @param title + * The human-readable title to associate with this option. + */ + public FieldOption(String value, String title) { + this.value = value; + this.title = title; + } + + /** + * Returns the value that will be assigned if this option is chosen. + * + * @return + * The value that will be assigned if this option is chosen. + */ + public String getValue() { + return value; + } + + /** + * Sets the value that will be assigned if this option is chosen. + * + * @param value + * The value to assign if this option is chosen. + */ + public void setValue(String value) { + this.value = value; + } + + /** + * Returns the human-readable title describing the effect of this option. + * + * @return + * The human-readable title describing the effect of this option. + */ + public String getTitle() { + return title; + } + + /** + * Sets the human-readable title describing the effect of this option. + * + * @param title + * A human-readable title describing the effect of this option. + */ + public void setTitle(String title) { + this.title = title; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/Form.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/Form.java new file mode 100644 index 0000000..d71b140 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/Form.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.ArrayList; +import java.util.Collection; + +/** + * Information which describes logical set of fields. + */ +@JsonInclude(value=Include.NON_NULL) +public class Form { + + /** + * The name of this form. The form name must identify the form uniquely + * from other forms. + */ + private String name; + + /** + * All fields associated with this form. + */ + private Collection fields; + + /** + * Creates a new Form object with no associated fields. The name is left + * unset as null. If no form name is provided, this form must not be used + * in the same context as another unnamed form. + */ + public Form() { + fields = new ArrayList(); + } + + /** + * Creates a new Form object having the given name and containing the given + * fields. + * + * @param name + * A name which uniquely identifies this form. + * + * @param fields + * The fields to provided within the new Form. + */ + public Form(String name, Collection fields) { + this.name = name; + this.fields = fields; + } + + /** + * Returns a mutable collection of the fields associated with this form. + * Changes to this collection affect the fields exposed to the user. + * + * @return + * A mutable collection of fields. + */ + public Collection getFields() { + return fields; + } + + /** + * Sets the collection of fields associated with this form. + * + * @param fields + * The collection of fields to associate with this form. + */ + public void setFields(Collection fields) { + this.fields = fields; + } + + /** + * Returns the name of this form. Form names must uniquely identify each + * form. + * + * @return + * The name of this form, or null if the form has no name. + */ + public String getName() { + return name; + } + + /** + * Sets the name of this form. Form names must uniquely identify each form. + * + * @param name + * The name to assign to this form. + */ + public void setName(String name) { + this.name = name; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java new file mode 100644 index 0000000..a87d772 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a language field. The field may contain only valid language + * identifiers as used by the Guacamole web application for its translations. + * Language identifiers are defined by the filenames of the JSON files + * containing the translation. + */ +public class LanguageField extends Field { + + /** + * Creates a new LanguageField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public LanguageField(String name) { + super(name, Field.Type.LANGUAGE); + } + + /** + * Parses the given string into a language ID string. As any string may be + * a valid language ID as long as it has a corresponding translation, the + * only transformation currently performed by this function is to ensure + * that a blank language string is parsed into null. + * + * @param language + * The language string to parse, which may be null. + * + * @return + * The ID of the language corresponding to the given string, or null if + * if the given language string was null or blank. + */ + public static String parse(String language) { + + // Return null if no language is provided + if (language == null || language.isEmpty()) + return null; + + // Otherwise, assume language is already a valid language ID + return language; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/MultilineField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/MultilineField.java new file mode 100644 index 0000000..88741ec --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/MultilineField.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a field which can contain multiple lines of text. + */ +public class MultilineField extends Field { + + /** + * Creates a new MultilineField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public MultilineField(String name) { + super(name, Field.Type.MULTILINE); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/NumericField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/NumericField.java new file mode 100644 index 0000000..ce2dba4 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/NumericField.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a field which may contain only integer values. + */ +public class NumericField extends Field { + + /** + * Creates a new NumericField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public NumericField(String name) { + super(name, Field.Type.NUMERIC); + } + + /** + * Formats the given integer in the format required by a numeric field. + * + * @param i + * The integer to format, which may be null. + * + * @return + * A string representation of the given integer, or null if the given + * integer was null. + */ + public static String format(Integer i) { + + // Return null if no value provided + if (i == null) + return null; + + // Convert to string + return i.toString(); + + } + + /** + * Parses the given string as an integer, where the given string is in the + * format required by a numeric field. + * + * @param str + * The string to parse as an integer, which may be null. + * + * @return + * The integer representation of the given string, or null if the given + * string was null. + * + * @throws NumberFormatException + * If the given string is not in a parseable format. + */ + public static Integer parse(String str) throws NumberFormatException { + + // Return null if no value provided + if (str == null || str.isEmpty()) + return null; + + // Parse as integer + return Integer.valueOf(str); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/PasswordField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/PasswordField.java new file mode 100644 index 0000000..1bc3d4f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/PasswordField.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a field which contains sensitive text information related to + * authenticating a user. + */ +public class PasswordField extends Field { + + /** + * Creates a new PasswordField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public PasswordField(String name) { + super(name, Field.Type.PASSWORD); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/RedirectField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/RedirectField.java new file mode 100644 index 0000000..6fcc435 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/RedirectField.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import java.net.URI; +import org.apache.guacamole.language.Translatable; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * A Guacamole field that redirects a user to another page. + */ +public class RedirectField extends Field implements Translatable { + + /** + * The URL to which the user should be redirected. The URL should be + * encoded + */ + private final URI redirectUrl; + + /** + * The translatable message that should be displayed for the user while the + * browser redirects. + */ + private final TranslatableMessage redirectMessage; + + /** + * Creates a new field which facilitates redirection of the user + * to another page. + * + * @param name + * The name of this field. + * + * @param redirectUrl + * The URL to which the user should be redirected. + * + * @param redirectMessage + * The translatable message that should be displayed for the user while + * the browser redirects. + */ + public RedirectField(String name, URI redirectUrl, + TranslatableMessage redirectMessage) { + + // Init base field properties + super(name, Field.Type.REDIRECT); + + // Store the URL to which the user will be redirected + this.redirectUrl = redirectUrl; + + // Store the message that will be displayed for the user during redirect + this.redirectMessage = redirectMessage; + + } + + /** + * Returns the URL to which the user should be redirected. + * + * @return + * The URL to which the user should be redirected. + */ + public String getRedirectUrl() { + return redirectUrl.toString(); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return redirectMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/TerminalColorSchemeField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/TerminalColorSchemeField.java new file mode 100644 index 0000000..ccd7ce5 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/TerminalColorSchemeField.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a terminal color scheme field. The field may contain only valid + * terminal color schemes as used by the Guacamole server terminal emulator + * and protocols which leverage it (SSH, telnet, Kubernetes). + */ +public class TerminalColorSchemeField extends Field { + + /** + * Creates a new TerminalColorSchemeField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public TerminalColorSchemeField(String name) { + super(name, Field.Type.TERMINAL_COLOR_SCHEME); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java new file mode 100644 index 0000000..990ad73 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import java.util.Collection; + +/** + * Represents a basic text field. The field may generally contain any data, but + * may not contain multiple lines. + */ +public class TextField extends Field { + + /** + * Creates a new TextField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public TextField(String name) { + super(name, Field.Type.TEXT); + } + + /** + * Creates a new TextField with the given name and possible values. As a + * text field may contain any data by definition, any provided options are + * simply known-good values. + * + * @param name + * The unique name to associate with this field. + * + * @param options + * A set of known legal options for this field. + */ + public TextField(String name, Collection options) { + super(name, Field.Type.TEXT, options); + } + + /** + * Parses the given string, interpreting empty strings as equivalent to + * null. For all other cases, the given string is returned verbatim. + * + * @param str + * The string to parse, which may be null. + * + * @return + * The given string, or null if the given string was null or empty. + */ + public static String parse(String str) { + + // Return null if no value provided + if (str == null || str.isEmpty()) + return null; + + // Otherwise, return string unmodified + return str; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/TimeField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/TimeField.java new file mode 100644 index 0000000..7833362 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/TimeField.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Represents a time field. The field may contain only time values which + * conform to a standard pattern, defined by TimeField.FORMAT. + */ +public class TimeField extends Field { + + /** + * The time format used by time fields, compatible with SimpleDateFormat. + */ + public static final String FORMAT = "HH:mm:ss"; + + /** + * Creates a new TimeField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public TimeField(String name) { + super(name, Field.Type.TIME); + } + + /** + * Parses the given string into a corresponding time. The string must + * follow the standard format used by time fields, as defined by + * FORMAT and as would be produced by format(). + * + * @param timeString + * The time string to parse, which may be null. + * + * @return + * The time corresponding to the given time string, or null if the + * provided time string was null or blank. + * + * @throws ParseException + * If the given time string does not conform to the standard format + * used by time fields. + */ + public static Date parse(String timeString) + throws ParseException { + + // Return null if no time provided + if (timeString == null || timeString.isEmpty()) + return null; + + // Parse time according to format + DateFormat timeFormat = new SimpleDateFormat(TimeField.FORMAT); + return timeFormat.parse(timeString); + + } + + /** + * Converts the given time into a string which follows the format used by + * time fields. + * + * @param time + * The time value to format, which may be null. + * + * @return + * The formatted time, or null if the provided time was null. + */ + public static String format(Date time) { + DateFormat timeFormat = new SimpleDateFormat(TimeField.FORMAT); + return time == null ? null : timeFormat.format(time); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/TimeZoneField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/TimeZoneField.java new file mode 100644 index 0000000..90084e4 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/TimeZoneField.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a time zone field. The field may contain only valid time zone + * identifiers, as defined by the IANA time zone database. Such identifiers are + * also valid Java time zone IDs as dictated by TimeZone.getAvailableIDs(). + */ +public class TimeZoneField extends Field { + + /** + * Creates a new TimeZoneField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public TimeZoneField(String name) { + super(name, Field.Type.TIMEZONE); + } + + /** + * Parses the given string into a time zone ID string. As these strings are + * equivalent, the only transformation currently performed by this function + * is to ensure that a blank time zone string is parsed into null. + * + * @param timeZone + * The time zone string to parse, which may be null. + * + * @return + * The ID of the time zone corresponding to the given string, or null + * if the given time zone string was null or blank. + */ + public static String parse(String timeZone) { + + // Return null if no time zone provided + if (timeZone == null || timeZone.isEmpty()) + return null; + + // Otherwise, assume time zone is valid + return timeZone; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/UsernameField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/UsernameField.java new file mode 100644 index 0000000..0e78514 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/UsernameField.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a text field which will contain the uniquely-identifying name of + * a user. + */ +public class UsernameField extends Field { + + /** + * Creates a new UsernameField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public UsernameField(String name) { + super(name, Field.Type.USERNAME); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/package-info.java new file mode 100644 index 0000000..c0b6088 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides classes which describe the contents and semantics of forms which + * may be presented to the user. + */ +package org.apache.guacamole.form; diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/Translatable.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/Translatable.java new file mode 100644 index 0000000..e85cdc8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/Translatable.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +/** + * An object which is associated with a translatable message that can be passed + * through an arbitrary translation service, producing a human-readable message + * in the user's native language. + */ +public interface Translatable { + + /** + * Returns a message which can be translated using a translation service, + * consisting of a translation key and optional set of substitution + * variables. + * + * @return + * A message which can be translated using a translation service. + */ + TranslatableMessage getTranslatableMessage(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientBadTypeException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientBadTypeException.java new file mode 100644 index 0000000..e48b1cf --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientBadTypeException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleClientBadTypeException; + +/** + * A {@link GuacamoleClientBadTypeException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleClientBadTypeException extends GuacamoleClientBadTypeException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleClientBadTypeException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientBadTypeException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientBadTypeException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleClientBadTypeException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientBadTypeException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientBadTypeException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleClientBadTypeException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleClientBadTypeException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientException.java new file mode 100644 index 0000000..59818ed --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleClientException; + +/** + * A {@link GuacamoleClientException} whose associated message is translatable + * and can be passed through an arbitrary translation service, producing a + * human-readable message in the user's native language. + */ +public class TranslatableGuacamoleClientException extends GuacamoleClientException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleClientException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleClientException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleClientException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleClientException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientOverrunException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientOverrunException.java new file mode 100644 index 0000000..3ad94c8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientOverrunException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleClientOverrunException; + +/** + * A {@link GuacamoleClientOverrunException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleClientOverrunException extends GuacamoleClientOverrunException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleClientOverrunException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientOverrunException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientOverrunException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleClientOverrunException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientOverrunException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientOverrunException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleClientOverrunException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleClientOverrunException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientTimeoutException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientTimeoutException.java new file mode 100644 index 0000000..6b9ea7e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientTimeoutException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleClientTimeoutException; + +/** + * A {@link GuacamoleClientTimeoutException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleClientTimeoutException extends GuacamoleClientTimeoutException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleClientTimeoutException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientTimeoutException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientTimeoutException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleClientTimeoutException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientTimeoutException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientTimeoutException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleClientTimeoutException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleClientTimeoutException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientTooManyException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientTooManyException.java new file mode 100644 index 0000000..d1ba1ca --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleClientTooManyException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleClientTooManyException; + +/** + * A {@link GuacamoleClientTooManyException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleClientTooManyException extends GuacamoleClientTooManyException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleClientTooManyException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientTooManyException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientTooManyException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleClientTooManyException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleClientTooManyException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleClientTooManyException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleClientTooManyException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleClientTooManyException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleConnectionClosedException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleConnectionClosedException.java new file mode 100644 index 0000000..9b615a5 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleConnectionClosedException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleConnectionClosedException; + +/** + * A {@link GuacamoleConnectionClosedException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleConnectionClosedException extends GuacamoleConnectionClosedException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleConnectionClosedException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleConnectionClosedException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleConnectionClosedException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleConnectionClosedException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleConnectionClosedException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleConnectionClosedException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleConnectionClosedException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleConnectionClosedException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleCredentialsException.java new file mode 100644 index 0000000..86c04b8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleCredentialsException.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleCredentialsException; + +/** + * A {@link GuacamoleCredentialsException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleCredentialsException + extends GuacamoleCredentialsException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleCredentialsException with the given + * message, cause, and associated credential information. The message must + * be provided in both non-translatable (readable as-written) and + * translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleCredentialsException(String message, + TranslatableMessage translatableMessage, Throwable cause, CredentialsInfo credentialsInfo) { + super(message, cause, credentialsInfo); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleCredentialsException with the given + * message, and associated credential information. The message must be + * provided in both non-translatable (readable as-written) and translatable + * forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleCredentialsException(String message, + TranslatableMessage translatableMessage, CredentialsInfo credentialsInfo) { + super(message, credentialsInfo); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleCredentialsException with the given + * message, cause, and associated credential information. The message must + * be provided in both non-translatable (readable as-written) and + * translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleCredentialsException(String message, + String key, Throwable cause, CredentialsInfo credentialsInfo) { + this(message, new TranslatableMessage(key), cause, credentialsInfo); + } + + /** + * Creates a new TranslatableGuacamoleCredentialsException with the given + * message, and associated credential information. The message must be + * provided in both non-translatable (readable as-written) and translatable + * forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleCredentialsException(String message, + String key, CredentialsInfo credentialsInfo) { + this(message, new TranslatableMessage(key), credentialsInfo); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java new file mode 100644 index 0000000..5b51d2c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; + +/** + * A {@link GuacamoleInsufficientCredentialsException} whose associated message + * is translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleInsufficientCredentialsException + extends GuacamoleInsufficientCredentialsException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleInsufficientCredentialsException with + * the given message, cause, and associated credential information. The + * message must be provided in both non-translatable (readable as-written) + * and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInsufficientCredentialsException(String message, + TranslatableMessage translatableMessage, Throwable cause, CredentialsInfo credentialsInfo) { + super(message, cause, credentialsInfo); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleInsufficientCredentialsException with + * the given message, and associated credential information. The message + * must be provided in both non-translatable (readable as-written) and + * translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInsufficientCredentialsException(String message, + TranslatableMessage translatableMessage, CredentialsInfo credentialsInfo) { + super(message, credentialsInfo); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleInsufficientCredentialsException with + * the given message, cause, and associated credential information. The + * message must be provided in both non-translatable (readable as-written) + * and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInsufficientCredentialsException(String message, + String key, Throwable cause, CredentialsInfo credentialsInfo) { + this(message, new TranslatableMessage(key), cause, credentialsInfo); + } + + /** + * Creates a new TranslatableGuacamoleInsufficientCredentialsException with + * the given message, and associated credential information. The message + * must be provided in both non-translatable (readable as-written) and + * translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInsufficientCredentialsException(String message, + String key, CredentialsInfo credentialsInfo) { + this(message, new TranslatableMessage(key), credentialsInfo); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInvalidCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInvalidCredentialsException.java new file mode 100644 index 0000000..7d878ec --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInvalidCredentialsException.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * A {@link GuacamoleInvalidCredentialsException} whose associated message + * is translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleInvalidCredentialsException + extends GuacamoleInvalidCredentialsException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleInvalidCredentialsException with + * the given message, cause, and associated credential information. The + * message must be provided in both non-translatable (readable as-written) + * and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInvalidCredentialsException(String message, + TranslatableMessage translatableMessage, Throwable cause, CredentialsInfo credentialsInfo) { + super(message, cause, credentialsInfo); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleInvalidCredentialsException with + * the given message, and associated credential information. The message + * must be provided in both non-translatable (readable as-written) and + * translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInvalidCredentialsException(String message, + TranslatableMessage translatableMessage, CredentialsInfo credentialsInfo) { + super(message, credentialsInfo); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleInvalidCredentialsException with + * the given message, cause, and associated credential information. The + * message must be provided in both non-translatable (readable as-written) + * and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInvalidCredentialsException(String message, + String key, Throwable cause, CredentialsInfo credentialsInfo) { + this(message, new TranslatableMessage(key), cause, credentialsInfo); + } + + /** + * Creates a new TranslatableGuacamoleInvalidCredentialsException with + * the given message, and associated credential information. The message + * must be provided in both non-translatable (readable as-written) and + * translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public TranslatableGuacamoleInvalidCredentialsException(String message, + String key, CredentialsInfo credentialsInfo) { + this(message, new TranslatableMessage(key), credentialsInfo); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceClosedException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceClosedException.java new file mode 100644 index 0000000..b0e5b48 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceClosedException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleResourceClosedException; + +/** + * A {@link GuacamoleResourceClosedException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleResourceClosedException extends GuacamoleResourceClosedException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleResourceClosedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleResourceClosedException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleResourceClosedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleResourceClosedException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleResourceClosedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleResourceClosedException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleResourceClosedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleResourceClosedException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceConflictException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceConflictException.java new file mode 100644 index 0000000..e730206 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceConflictException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleResourceConflictException; + +/** + * A {@link GuacamoleResourceConflictException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleResourceConflictException extends GuacamoleResourceConflictException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleResourceConflictException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleResourceConflictException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleResourceConflictException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleResourceConflictException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleResourceConflictException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleResourceConflictException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleResourceConflictException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleResourceConflictException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceNotFoundException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceNotFoundException.java new file mode 100644 index 0000000..138da0e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleResourceNotFoundException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleResourceNotFoundException; + +/** + * A {@link GuacamoleResourceNotFoundException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleResourceNotFoundException extends GuacamoleResourceNotFoundException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleResourceNotFoundException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleResourceNotFoundException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleResourceNotFoundException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleResourceNotFoundException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleResourceNotFoundException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleResourceNotFoundException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleResourceNotFoundException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleResourceNotFoundException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSecurityException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSecurityException.java new file mode 100644 index 0000000..e6a9ecd --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSecurityException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleSecurityException; + +/** + * A {@link GuacamoleSecurityException} whose associated message is translatable + * and can be passed through an arbitrary translation service, producing a + * human-readable message in the user's native language. + */ +public class TranslatableGuacamoleSecurityException extends GuacamoleSecurityException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleSecurityException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSecurityException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSecurityException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleSecurityException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSecurityException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSecurityException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleSecurityException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleSecurityException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleServerBusyException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleServerBusyException.java new file mode 100644 index 0000000..7d735b4 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleServerBusyException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleServerBusyException; + +/** + * A {@link GuacamoleServerBusyException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleServerBusyException extends GuacamoleServerBusyException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleServerBusyException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleServerBusyException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleServerBusyException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleServerBusyException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleServerBusyException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleServerBusyException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleServerBusyException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleServerBusyException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleServerException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleServerException.java new file mode 100644 index 0000000..686498c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleServerException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleServerException; + +/** + * A {@link GuacamoleServerException} whose associated message is translatable + * and can be passed through an arbitrary translation service, producing a + * human-readable message in the user's native language. + */ +public class TranslatableGuacamoleServerException extends GuacamoleServerException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleServerException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleServerException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleServerException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleServerException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleServerException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleServerException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleServerException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleServerException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionClosedException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionClosedException.java new file mode 100644 index 0000000..ca9a025 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionClosedException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleSessionClosedException; + +/** + * A {@link GuacamoleSessionClosedException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleSessionClosedException extends GuacamoleSessionClosedException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleSessionClosedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSessionClosedException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSessionClosedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleSessionClosedException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSessionClosedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSessionClosedException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleSessionClosedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleSessionClosedException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionConflictException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionConflictException.java new file mode 100644 index 0000000..b20575b --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionConflictException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleSessionConflictException; + +/** + * A {@link GuacamoleSessionConflictException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleSessionConflictException extends GuacamoleSessionConflictException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleSessionConflictException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSessionConflictException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSessionConflictException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleSessionConflictException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSessionConflictException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSessionConflictException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleSessionConflictException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleSessionConflictException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionTimeoutException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionTimeoutException.java new file mode 100644 index 0000000..700a3ee --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleSessionTimeoutException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleSessionTimeoutException; + +/** + * A {@link GuacamoleSessionTimeoutException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleSessionTimeoutException extends GuacamoleSessionTimeoutException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleSessionTimeoutException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSessionTimeoutException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSessionTimeoutException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleSessionTimeoutException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleSessionTimeoutException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleSessionTimeoutException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleSessionTimeoutException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleSessionTimeoutException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUnauthorizedException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUnauthorizedException.java new file mode 100644 index 0000000..340aced --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUnauthorizedException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleUnauthorizedException; + +/** + * A {@link GuacamoleUnauthorizedException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleUnauthorizedException extends GuacamoleUnauthorizedException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleUnauthorizedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUnauthorizedException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUnauthorizedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleUnauthorizedException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUnauthorizedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUnauthorizedException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleUnauthorizedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleUnauthorizedException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUnsupportedException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUnsupportedException.java new file mode 100644 index 0000000..184f65a --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUnsupportedException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleUnsupportedException; + +/** + * A {@link GuacamoleUnsupportedException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleUnsupportedException extends GuacamoleUnsupportedException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleUnsupportedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUnsupportedException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUnsupportedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleUnsupportedException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUnsupportedException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUnsupportedException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleUnsupportedException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleUnsupportedException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamException.java new file mode 100644 index 0000000..0122acb --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleUpstreamException; + +/** + * A {@link GuacamoleUpstreamException} whose associated message is translatable + * and can be passed through an arbitrary translation service, producing a + * human-readable message in the user's native language. + */ +public class TranslatableGuacamoleUpstreamException extends GuacamoleUpstreamException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleUpstreamException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleUpstreamException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamException with the given + * message and cause. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleUpstreamException with the given + * message. The message must be provided in both non-translatable (readable + * as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleUpstreamException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamNotFoundException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamNotFoundException.java new file mode 100644 index 0000000..e9b3214 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamNotFoundException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleUpstreamNotFoundException; + +/** + * A {@link GuacamoleUpstreamNotFoundException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleUpstreamNotFoundException extends GuacamoleUpstreamNotFoundException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleUpstreamNotFoundException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamNotFoundException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamNotFoundException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleUpstreamNotFoundException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamNotFoundException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamNotFoundException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleUpstreamNotFoundException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleUpstreamNotFoundException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamTimeoutException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamTimeoutException.java new file mode 100644 index 0000000..9cac87c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamTimeoutException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleUpstreamTimeoutException; + +/** + * A {@link GuacamoleUpstreamTimeoutException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleUpstreamTimeoutException extends GuacamoleUpstreamTimeoutException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleUpstreamTimeoutException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamTimeoutException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamTimeoutException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleUpstreamTimeoutException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamTimeoutException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamTimeoutException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleUpstreamTimeoutException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleUpstreamTimeoutException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamUnavailableException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamUnavailableException.java new file mode 100644 index 0000000..2962eb6 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleUpstreamUnavailableException.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +import org.apache.guacamole.GuacamoleUpstreamUnavailableException; + +/** + * A {@link GuacamoleUpstreamUnavailableException} whose associated message is + * translatable and can be passed through an arbitrary translation service, + * producing a human-readable message in the user's native language. + */ +public class TranslatableGuacamoleUpstreamUnavailableException extends GuacamoleUpstreamUnavailableException implements Translatable { + + /** + * A translatable, human-readable description of the exception that + * occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * Creates a new TranslatableGuacamoleUpstreamUnavailableException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamUnavailableException(String message, TranslatableMessage translatableMessage, Throwable cause) { + super(message, cause); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamUnavailableException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param translatableMessage + * A translatable, human-readable description of the exception that + * occurred. + */ + public TranslatableGuacamoleUpstreamUnavailableException(String message, TranslatableMessage translatableMessage) { + super(message); + this.translatableMessage = translatableMessage; + } + + /** + * Creates a new TranslatableGuacamoleUpstreamUnavailableException with the + * given message and cause. The message must be provided in both + * non-translatable (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @param cause + * The cause of this exception. + */ + public TranslatableGuacamoleUpstreamUnavailableException(String message, String key, Throwable cause) { + this(message, new TranslatableMessage(key), cause); + } + + /** + * Creates a new TranslatableGuacamoleUpstreamUnavailableException with the + * given message. The message must be provided in both non-translatable + * (readable as-written) and translatable forms. + * + * @param message + * A human-readable description of the exception that occurred. This + * message should be readable on its own and as-written, without + * requiring a translation service. + * + * @param key + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + public TranslatableGuacamoleUpstreamUnavailableException(String message, String key) { + this(message, new TranslatableMessage(key)); + } + + @Override + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableMessage.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableMessage.java new file mode 100644 index 0000000..cb6aa3e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableMessage.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.language; + +/** + * A message which can be translated using a translation service, providing a + * translation key and optional set of values to be substituted into the + * translation string associated with that key. + */ +public class TranslatableMessage { + + /** + * The arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + */ + private final String key; + + /** + * An arbitrary object whose properties should be substituted for the + * corresponding placeholders within the string associated with the key. + */ + private final Object variables; + + /** + * Creates a new TranslatableMessage associated with the given translation + * key, without any associated variables. + * + * @param key + * The translation key to associate with the TranslatableMessage. + */ + public TranslatableMessage(String key) { + this(key, null); + } + + /** + * Creates a new TranslatableMessage associated with the given translation + * key and associated variables. + * + * @param key + * The translation key to associate with the TranslatableMessage. + * + * @param variables + * An arbitrary object whose properties should be substituted for the + * corresponding placeholders within the string associated with the + * given translation key. + */ + public TranslatableMessage(String key, Object variables) { + this.key = key; + this.variables = variables; + } + + /** + * Returns the arbitrary key which can be used to look up the message to be + * displayed in the user's native language. + * + * @return + * The arbitrary key associated with the human-readable message. + */ + public String getKey() { + return key; + } + + /** + * Returns an arbitrary object whose properties should be substituted for + * the corresponding placeholders within the string associated with the key. + * If not applicable, null is returned. + * + * @return + * An arbitrary object whose properties should be substituted for the + * corresponding placeholders within the string associated with the key, + * or null if not applicable. + */ + public Object getVariables() { + return variables; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/RequestDetails.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/RequestDetails.java new file mode 100644 index 0000000..ca55ac9 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/RequestDetails.java @@ -0,0 +1,411 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * A copy of the details of an HTTP request. The values within this object can + * be accessed even when outside the scope of the specific request represented. + */ +public class RequestDetails { + + /** + * The address of the client that sent the associated request. + */ + private final String remoteAddress; + + /** + * The hostname or, if the hostname cannot be determined, the address of the + * client that sent the associated request. + */ + private final String remoteHostname; + + /** + * The HttpSession associated with the request, if any. + */ + private final HttpSession session; + + /** + * An unmodifiable Map of all HTTP headers included in the associated + * request. If there are no such headers, this Map will be empty. As there + * may be many values for each header, each value is stored as a separate + * entry in an unmodifiable List. The keys of this map (header names) are + * case-insensitive. + */ + private final Map> headers; + + /** + * An unmodifiable Map of all HTTP parameters included in the associated + * request. If there are no such parameters, this Map will be empty. As + * there may be many values for each parameter, each value is stored as a + * separate entry in an unmodifiable List. Unlike headers, the keys of this + * map (parameter names) are case-sensitive. + */ + private final Map> parameters; + + /** + * An unmodifiable list of all cookies associated with the request. If + * there are no cookies associated with the request, this List will be + * empty. + */ + private final List cookies; + + /** + * Returns an unmodifiable Map of all HTTP headers within the given request. + * If there are no such headers, the returned Map will be empty. As there + * may be many values for each header, each value is stored as a separate + * entry in an unmodifiable List. The keys of the returned map (header + * names) are case-insensitive. + * + * @param request + * The HTTP request to extract all headers from. + * + * @return + * An unmodifiable Map of all HTTP headers in the given request. + */ + private static Map> getHeaders(HttpServletRequest request) { + + @SuppressWarnings("unchecked") // getHeaderNames() is explicitly documented as returning a Enumeration + Enumeration names = (Enumeration) request.getHeaderNames(); + + // Represent the total lack of headers as an empty map, not null + if (names == null) + return Collections.emptyMap(); + + // Headers are case-insensitive + Map> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + names.asIterator().forEachRemaining((String name) -> { + + @SuppressWarnings("unchecked") // getHeaders() is explicitly documented as returning a Enumeration + Enumeration values = (Enumeration) request.getHeaders(name); + if (values != null && values.hasMoreElements()) + headers.put(name, Collections.unmodifiableList(Collections.list(values))); + + }); + + return Collections.unmodifiableMap(headers); + + } + + /** + * Returns an unmodifiable Map of all HTTP parameters within the given + * request. If there are no such parameters, the returned Map will be empty. + * As there may be many values for each parameter, each value is stored as a + * separate entry in an unmodifiable List. Unlike headers, the keys of the + * returned map (parameter names) are case-sensitive. + * + * @param request + * The HTTP request to extract all parameters from. + * + * @return + * An unmodifiable Map of all HTTP parameters in the given request. + */ + private static Map> getParameters(HttpServletRequest request) { + + @SuppressWarnings("unchecked") // getParameterNames() is explicitly documented as returning a Enumeration + Enumeration names = (Enumeration) request.getParameterNames(); + + // Represent the total lack of parameters as an empty map, not null + if (names == null) + return Collections.emptyMap(); + + // Unlike headers, parameters are case-sensitive + Map> parameters = new HashMap<>(); + names.asIterator().forEachRemaining((String name) -> { + + String[] values = request.getParameterValues(name); + if (values != null && values.length != 0) + parameters.put(name, Collections.unmodifiableList(Arrays.asList(values))); + + }); + + return Collections.unmodifiableMap(parameters); + + } + + /** + * Returns an unmodifiable List of all cookies in the given HTTP request. + * + * @param request + * The HTTP request to extract all cookies from. + * + * @return + * An unmodifiable List of all cookies in the given request. + */ + private static List getCookies(HttpServletRequest request) { + + Cookie[] cookies = request.getCookies(); + if (cookies == null || cookies.length == 0) + return Collections.emptyList(); + + return Collections.unmodifiableList(Arrays.asList(cookies)); + + } + + /** + * Creates a new RequestDetails that copies the details of the given HTTP + * request. The provided request may safely go out of scope and be reused + * for future requests without rendering the content of this RequestDetails + * invalid or inaccessible. + *

    + * Though an HttpSession will be retrieved from the given request if the + * HttpSession already exists on the request, no HttpSession will be created + * through invoking this constructor. + * + * @param request + * The HTTP request to copy the details of. + */ + public RequestDetails(HttpServletRequest request) { + this.cookies = getCookies(request); + this.headers = getHeaders(request); + this.parameters = getParameters(request); + this.remoteAddress = request.getRemoteAddr(); + this.remoteHostname = request.getRemoteHost(); + this.session = request.getSession(false); + } + + /** + * Creates a new RequestDetails that copies the details of the given + * RequestDetails. + * + * @param requestDetails + * The RequestDetails to copy. + */ + public RequestDetails(RequestDetails requestDetails) { + this.cookies = requestDetails.getCookies(); + this.headers = requestDetails.getHeaders(); + this.parameters = requestDetails.getParameters(); + this.remoteAddress = requestDetails.getRemoteAddress(); + this.remoteHostname = requestDetails.getRemoteHostname(); + this.session = requestDetails.getSession(); + } + + /** + * Returns the first value stored for the given key in the given Map. If no + * such key exists in the map, or no values are associated with the given + * key, null is returned. + * + * @param map + * A Map of keys to multiple values, where each set of multiple values + * is represented by a List. + * + * @param key + * The key to look up. + * + * @return + * The first value stored for the given key in the given Map, or null + * if there is no such value or no such key. + */ + private static String getFirstValue(Map> map, String key) { + + List values = map.get(key); + if (values == null || values.isEmpty()) + return null; + + return values.get(0); + + } + + /** + * Returns the value of the HTTP header having the given name. Header names + * are case-insensitive. If no such header was present, null is returned. If + * the header had multiple values, the first value is returned. + * + * @param name + * The name of the header to retrieve. This name is case-insensitive. + * + * @return + * The first value of the HTTP header with the given name, or null if + * there is no such header. + */ + public String getHeader(String name) { + return getFirstValue(headers, name); + } + + /** + * Returns an unmodifiable List of all values of the HTTP header having the + * given name. Header names are case-insensitive. If no such header was + * present, the returned List will be empty. + * + * @param name + * The name of the header to retrieve. This name is case-insensitive. + * + * @return + * An unmodifiable List of all values of the HTTP header with the + * given name, or an empty List if there is no such header. + */ + public List getHeaders(String name) { + return headers.getOrDefault(name, Collections.emptyList()); + } + + /** + * Returns an unmodifiable Set of the names of all HTTP headers present on + * the request. If there are no headers, this set will be empty. Header + * names are case-insensitive, and the returned Set will perform lookups in + * a case-insensitive manner. + * + * @return + * An unmodifiable Set of the names of all HTTP headers present on the + * request. + */ + public Set getHeaderNames() { + return headers.keySet(); + } + + /** + * Returns an unmodifiable Map of all values of all HTTP headers on the + * request, where each Map key is a header name. Each Map value is an + * unmodifiable List of all values provided for the associated header and + * will contain at least one value. Header names are case-insensitive, and + * the returned map will perform lookups in a case-insensitive manner. + * + * @return + * An unmodifiable Map of all values of all HTTP headers on the + * request. + */ + public Map> getHeaders() { + return headers; + } + + /** + * Returns the value of the HTTP parameter having the given name. Parameter + * names are case-sensitive. If no such parameter was present, null is + * returned. If the parameter had multiple values, the first value is + * returned. + * + * @param name + * The name of the parameter to retrieve. This name is case-sensitive. + * + * @return + * The first value of the HTTP parameter with the given name, or null + * if there is no such parameter. + */ + public String getParameter(String name) { + return getFirstValue(parameters, name); + } + + /** + * Returns an unmodifiable List of all values of the HTTP parameter having + * the given name. Parameter names are case-sensitive. If no such parameter + * was present, the returned List will be empty. + * + * @param name + * The name of the parameter to retrieve. This name is case-sensitive. + * + * @return + * An unmodifiable List of all values of the HTTP parameter with the + * given name, or an empty List if there is no such parameter. + */ + public List getParameters(String name) { + return parameters.getOrDefault(name, Collections.emptyList()); + } + + /** + * Returns an unmodifiable Set of the names of all HTTP parameters present + * on the request. If there are no parameters, this set will be empty. + * Parameter names are case-sensitive, and the returned Set will perform + * lookups in a case-sensitive manner. + * + * @return + * An unmodifiable Set of the names of all HTTP parameters present on + * the request. + */ + public Set getParameterNames() { + return parameters.keySet(); + } + + /** + * Returns an unmodifiable Map of all values of all HTTP parameters on the + * request, where each Map key is a parameter name. Each Map value is an + * unmodifiable List of all values provided for the associated parameter and + * will contain at least one value. Parameter names are case-sensitive, and + * the returned map will perform lookups in a case-sensitive manner. + * + * @return + * An unmodifiable Map of all values of all HTTP parameters on the + * request. + */ + public Map> getParameters() { + return parameters; + } + + /** + * Returns an unmodifiable List of all cookies in the request. If no cookies + * are present, the returned List will be empty. + * + * @return + * An unmodifiable List of all cookies in the request, which may an + * empty List. + */ + public List getCookies() { + return cookies; + } + + /** + * Returns the HttpSession associated with the request, if any. + *

    + * NOTE: Guacamole itself does not use the HttpSession. + * The extension subsystem does not provide access to the session object + * used by Guacamole, which is considered internal. Access to an HttpSession + * is only of use if you have another application in place that + * does use HttpSession and needs to be considered. + * + * @return + * The HttpSession associated with the request, or null if there is + * no HttpSession. + */ + public HttpSession getSession() { + return session; + } + + /** + * Returns the address of the client that sent the associated request. + * + * @return + * The address of the client that sent the request. + */ + public String getRemoteAddress() { + return remoteAddress; + } + + /** + * Returns the hostname of the client that sent the associated request, if + * known. If the hostname of the client cannot be determined, the address + * will be returned instead. + * + * @return + * The hostname or address of the client that sent the request. + */ + public String getRemoteHostname() { + return remoteHostname; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractActiveConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractActiveConnection.java new file mode 100644 index 0000000..eacb0ba --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractActiveConnection.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Date; +import org.apache.guacamole.net.GuacamoleTunnel; + +/** + * Base implementation of an ActiveConnection, providing storage and simply + * getters/setters for its main properties. + */ +public abstract class AbstractActiveConnection extends AbstractIdentifiable + implements ActiveConnection { + + /** + * The identifier of the associated connection. + */ + private String connectionIdentifier; + + /** + * The identifier of the associated sharing profile. + */ + private String sharingProfileIdentifier; + + /** + * The date and time this active connection began. + */ + private Date startDate; + + /** + * The remote host that initiated this connection. + */ + private String remoteHost; + + /** + * The username of the user that initiated this connection. + */ + private String username; + + /** + * The underlying GuacamoleTunnel. + */ + private GuacamoleTunnel tunnel; + + @Override + public String getConnectionIdentifier() { + return connectionIdentifier; + } + + @Override + public void setConnectionIdentifier(String connnectionIdentifier) { + this.connectionIdentifier = connnectionIdentifier; + } + + @Override + public String getSharingProfileIdentifier() { + return sharingProfileIdentifier; + } + + @Override + public void setSharingProfileIdentifier(String sharingProfileIdentifier) { + this.sharingProfileIdentifier = sharingProfileIdentifier; + } + + @Override + public Date getStartDate() { + return startDate; + } + + @Override + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + @Override + public String getRemoteHost() { + return remoteHost; + } + + @Override + public void setRemoteHost(String remoteHost) { + this.remoteHost = remoteHost; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public void setUsername(String username) { + this.username = username; + } + + @Override + public GuacamoleTunnel getTunnel() { + return tunnel; + } + + @Override + public void setTunnel(GuacamoleTunnel tunnel) { + this.tunnel = tunnel; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractActivityLog.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractActivityLog.java new file mode 100644 index 0000000..bff1271 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractActivityLog.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.language.TranslatableMessage; + +/** + * Base implementation of an ActivityLog, providing storage and simple + * getters/setters for its main properties. + */ +public abstract class AbstractActivityLog implements ActivityLog { + + /** + * The type of this ActivityLog. + */ + private final Type type; + + /** + * A human-readable description of this log. + */ + private final TranslatableMessage description; + + /** + * Creates a new AbstractActivityLog having the given type and + * human-readable description. + * + * @param type + * The type of this ActivityLog. + * + * @param description + * A human-readable message that describes this log. + */ + public AbstractActivityLog(Type type, TranslatableMessage description) { + this.type = type; + this.description = description; + } + + @Override + public Type getType() { + return type; + } + + @Override + public TranslatableMessage getDescription() { + return description; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticatedUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticatedUser.java new file mode 100644 index 0000000..10107c2 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticatedUser.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; + +/** + * Basic implementation of an AuthenticatedUser which uses the username to + * determine equality. Username comparison is case-sensitive. + */ +public abstract class AbstractAuthenticatedUser extends AbstractIdentifiable + implements AuthenticatedUser { + + /** + * Creates a new AbstractAuthenticatedUser that considers usernames to be + * case-sensitive or case-insensitive based on the provided case sensitivity + * flag. + * + * @param caseSensitive + * true if usernames should be considered case-sensitive, false + * otherwise. + */ + public AbstractAuthenticatedUser(boolean caseSensitive) { + super(caseSensitive); + } + + /** + * Creates a new AbstractAuthenticatedUser that considers usernames to be + * case-sensitive or case-insensitive based on the case sensitivity setting + * of the provided {@link Environment}, as returned by + * {@link Environment#getCaseSensitivity()}. + * + * @param environment + * The Environment that should determine whether this + * AbstractAuthenticatedUser considers usernames to be case-sensitive. + */ + public AbstractAuthenticatedUser(Environment environment) { + this(environment.getCaseSensitivity().caseSensitiveUsernames()); + } + + /** + * Creates a new AbstractAuthenticatedUser that considers usernames to be + * case-sensitive or case-insensitive based on the case sensitivity setting + * of an instance of {@link LocalEnvironment}, as returned by + * {@link LocalEnvironment#getCaseSensitivity()}. + */ + public AbstractAuthenticatedUser() { + this(LocalEnvironment.getInstance()); + } + + // Prior functionality now resides within AbstractIdentifiable + + @Override + public Set getEffectiveUserGroups() { + return Collections.emptySet(); + } + + @Override + public void invalidate() { + // Nothing to invalidate + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java new file mode 100644 index 0000000..6b6fd8f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; + +/** + * Base implementation of AuthenticationProvider which provides default + * implementations of most functions. Implementations must provide their + * own {@link #getIdentifier()}, but otherwise need only override an implemented + * function if they wish to actually implement the functionality defined for + * that function by the AuthenticationProvider interface. + */ +public abstract class AbstractAuthenticationProvider implements AuthenticationProvider { + + /** + * {@inheritDoc} + * + *

    This implementation simply returns {@code null}. Implementations that + * wish to expose REST resources which are not specific to a user's session + * should override this function. + */ + @Override + public Object getResource() throws GuacamoleException { + return null; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns the provided {@code credentials} + * without performing any updates. Implementations that wish to perform + * credential updates for in-progress authentication requests should + * override this function. + */ + @Override + public Credentials updateCredentials(Credentials credentials) + throws GuacamoleException { + return credentials; + } + + /** + * {@inheritDoc} + * + *

    This implementation performs no authentication whatsoever, ignoring + * the provided {@code credentials} and simply returning {@code null}. Any + * authentication attempt will thus fall through to other + * {@link AuthenticationProvider} implementations, perhaps within other + * installed extensions, with this {@code AuthenticationProvider} making no + * claim regarding the user's identity nor whether the user should be + * allowed or disallowed from accessing Guacamole. Implementations that wish + * to authenticate users should override this function. + */ + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + return null; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns the provided + * {@code authenticatedUser} without modification. Implementations that + * wish to update a user's {@link AuthenticatedUser} object with respect to + * new {@link Credentials} received in requests which follow the initial, + * successful authentication attempt should override this function. + */ + @Override + public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return authenticatedUser; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns {@code null}, effectively allowing + * authentication to continue but refusing to provide data for the given + * user. Implementations that wish to veto the authentication results of + * other {@link AuthenticationProvider} implementations or provide data for + * authenticated users should override this function. + */ + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + return null; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns the provided {@code context} + * without modification. Implementations that wish to update a user's + * {@link UserContext} object with respect to newly-updated + * {@link AuthenticatedUser} or {@link Credentials} (such as those received + * in requests which follow the initial, successful authentication attempt) + * should override this function. + */ + @Override + public UserContext updateUserContext(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return context; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns the provided {@code context} + * without performing any decoration. Implementations that wish to augment + * the functionality or data provided by other + * {@link AuthenticationProvider} implementations should override this + * function. + */ + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return context; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply invokes + * {@link #decorate(UserContext,AuthenticatedUser,Credentials)} with the + * provided {@code context}, {@code authenticatedUser}, and + * {@code credentials}. Implementations which override + * {@link #decorate(UserContext,AuthenticatedUser,Credentials)} and which + * need to update their existing decorated object following possible + * updates to the {@link UserContext} or {@link AuthenticatedUser} (rather + * than generate an entirely new decorated object) should override this + * function. + */ + @Override + public UserContext redecorate(UserContext decorated, UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return decorate(context, authenticatedUser, credentials); + } + + /** + * {@inheritDoc} + * + *

    This implementation does nothing. Implementations that wish to perform + * cleanup tasks when the {@link AuthenticationProvider} is being unloaded + * should override this function. + */ + @Override + public void shutdown() { + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractConnection.java new file mode 100644 index 0000000..c3a8fe3 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractConnection.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Basic implementation of a Guacamole connection. + */ +public abstract class AbstractConnection extends AbstractIdentifiable + implements Connection { + + /** + * The name associated with this connection. + */ + private String name; + + + /** + * The unique identifier of the parent ConnectionGroup for + * this Connection. + */ + private String parentIdentifier; + + /** + * The GuacamoleConfiguration associated with this connection. + */ + private GuacamoleConfiguration configuration; + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getParentIdentifier() { + return parentIdentifier; + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + this.parentIdentifier = parentIdentifier; + } + + @Override + public GuacamoleConfiguration getConfiguration() { + return configuration; + } + + @Override + public void setConfiguration(GuacamoleConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public Set getSharingProfileIdentifiers() + throws GuacamoleException { + return Collections.emptySet(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractConnectionGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractConnectionGroup.java new file mode 100644 index 0000000..b3488b3 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractConnectionGroup.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * Basic implementation of a Guacamole connection group. + */ +public abstract class AbstractConnectionGroup extends AbstractIdentifiable + implements ConnectionGroup { + + /** + * The name associated with this connection group. + */ + private String name; + + /** + * The unique identifier of the parent connection group for + * this connection group. + */ + private String parentIdentifier; + + /** + * The type of this connection group. + */ + private ConnectionGroup.Type type; + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getParentIdentifier() { + return parentIdentifier; + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + this.parentIdentifier = parentIdentifier; + } + + @Override + public ConnectionGroup.Type getType() { + return type; + } + + @Override + public void setType(ConnectionGroup.Type type) { + this.type = type; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractIdentifiable.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractIdentifiable.java new file mode 100644 index 0000000..eed7ebe --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractIdentifiable.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.properties.CaseSensitivity; + +/** + * Abstract implementation of Identifiable which provides equals() and + * hashCode() implementations which use the identifier to determine equality. + * The identifier comparison is case-sensitive unless configured otherwise via + * the {@link AbstractIdentifiable#AbstractIdentifiable(boolean)} constructor. + * + * If using case-insensitive identifiers, any identifiers that are retrieved + * from or assigned to this object will first be canonicalized to a + * case-insensitive form using {@link CaseSensitivity#canonicalize(java.lang.String, boolean)}. + */ +public abstract class AbstractIdentifiable implements Identifiable { + + /** + * The unique string which identifies this object. + */ + private String identifier; + + /** + * Whether this object's identifier should be compared in a case-sensitive + * manner. If NOT case-sensitive, the identifier will be transformed into a + * canonical, case-insensitive form before use, including during assignment + * and retrieval. This affects the behavior of getIdentifier() and + * setIdentifier(). + */ + private final boolean caseSensitive; + + /** + * Creates a new AbstractIdentifiable that compares identifiers according + * to the provided case sensitivity flag. If using case-insensitive + * identifiers, any identifiers that are retrieved from or assigned to this + * object will first be canonicalized to a case-insensitive form using + * {@link CaseSensitivity#canonicalize(java.lang.String, boolean)}. + * + * @param caseSensitive + * true if identifiers should be compared in a case-sensitive manner, + * false otherwise. + */ + public AbstractIdentifiable(boolean caseSensitive) { + this.caseSensitive = caseSensitive; + } + + /** + * Creates a new AbstractIdentifiable that compares identifiers in a + * case-sensitive manner. This is equivalent to invoking {@link #AbstractIdentifiable(boolean)} + * with the case sensitivity flag set to true. + */ + public AbstractIdentifiable() { + this(true); + } + + @Override + public String getIdentifier() { + return CaseSensitivity.canonicalize(identifier, caseSensitive); + } + + @Override + public void setIdentifier(String identifier) { + this.identifier = CaseSensitivity.canonicalize(identifier, caseSensitive); + } + + @Override + public int hashCode() { + + String thisIdentifier = getIdentifier(); + if (thisIdentifier == null) + return 0; + + return thisIdentifier.hashCode(); + + } + + @Override + public boolean equals(Object other) { + + // Not equal if null or not the same type of object + if (other == null || getClass() != other.getClass()) + return false; + + // Get identifiers of objects being compared + String thisIdentifier = getIdentifier(); + String otherIdentifier = ((AbstractIdentifiable) other).getIdentifier(); + + // If null, equal only if this identifier is null + if (otherIdentifier == null) + return thisIdentifier == null; + + // Otherwise, equal only if strings are identical + return otherIdentifier.equals(thisIdentifier); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractSharingProfile.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractSharingProfile.java new file mode 100644 index 0000000..ac9275f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractSharingProfile.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.HashMap; +import java.util.Map; + +/** + * Base implementation of a sharing profile which can be used to share a + * Guacamole connection. + */ +public abstract class AbstractSharingProfile implements SharingProfile { + + /** + * The human-readable name of this sharing profile. + */ + private String name; + + /** + * The unique identifier associated with this sharing profile. + */ + private String identifier; + + /** + * The identifier of the primary connection that this sharing profile can + * be used to share. + */ + private String primaryConnectionIdentifier; + + /** + * All connection parameters with this sharing profile. + */ + private final Map parameters = new HashMap(); + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getIdentifier() { + return identifier; + } + + @Override + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + @Override + public String getPrimaryConnectionIdentifier() { + return primaryConnectionIdentifier; + } + + @Override + public void setPrimaryConnectionIdentifier(String primaryConnectionIdentifier) { + this.primaryConnectionIdentifier = primaryConnectionIdentifier; + } + + @Override + public Map getParameters() { + return parameters; + } + + @Override + public void setParameters(Map parameters) { + this.parameters.clear(); + this.parameters.putAll(parameters); + } + + @Override + public int hashCode() { + if (identifier == null) return 0; + return identifier.hashCode(); + } + + @Override + public boolean equals(Object obj) { + + // Not equal if null or not an SharingProfile + if (obj == null) return false; + if (!(obj instanceof AbstractSharingProfile)) return false; + + // Get identifier + String objIdentifier = ((AbstractSharingProfile) obj).identifier; + + // If null, equal only if this identifier is null + if (objIdentifier == null) return identifier == null; + + // Otherwise, equal only if strings are identical + return objIdentifier.equals(identifier); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUser.java new file mode 100644 index 0000000..37f7af7 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUser.java @@ -0,0 +1,238 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * Base implementation of User which provides default implementations of + * most functions. + */ +public abstract class AbstractUser extends AbstractIdentifiable + implements User { + + /** + * This user's password. Note that while this provides a means for the + * password to be set, the data stored in this String is not necessarily + * the user's actual password. It may be hashed, it may be arbitrary. + */ + private String password; + + /** + * Creates a new AbstractUser that considers usernames to be case-sensitive + * or case-insensitive based on the provided case sensitivity flag. + * + * @param caseSensitive + * true if usernames should be considered case-sensitive, false + * otherwise. + */ + public AbstractUser(boolean caseSensitive) { + super(caseSensitive); + } + + /** + * Creates a new AbstractUser that considers usernames to be case-sensitive + * or case-insensitive based on the case sensitivity setting of the provided + * {@link Environment}, as returned by {@link Environment#getCaseSensitivity()}. + * + * @param environment + * The Environment that should determine whether this AbstractUser + * considers usernames to be case-sensitive. + */ + public AbstractUser(Environment environment) { + this(environment.getCaseSensitivity().caseSensitiveUsernames()); + } + + /** + * Creates a new AbstractUser that considers usernames to be case-sensitive + * or case-insensitive based on the case sensitivity setting of an instance + * of {@link LocalEnvironment}, as returned by @link LocalEnvironment#getCaseSensitivity()}. + */ + public AbstractUser() { + this(LocalEnvironment.getInstance()); + } + + @Override + public String getPassword() { + return password; + } + + @Override + public void setPassword(String password) { + this.password = password; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty map. Implementations + * that wish to expose custom attributes should override this function. + */ + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply ignores all attributes given. + * Implementations that wish to support modification of custom attributes + * should override this function. + */ + @Override + public void setAttributes(Map attributes) { + // Ignore all attributes by default + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns {@code null}. Implementations that + * wish to expose the date and time that a user was last active should + * override this function. + */ + @Override + public Date getLastActive() { + return null; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + return SystemPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getSharingProfilePermissions() { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty related object set. + * Implementations that wish to expose group membership should override + * this function. + */ + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + return RelatedObjectSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns {@code this}. Implementations that + * wish to expose permissions which apply indirectly (such as through + * group inheritance) should override this function. + */ + @Override + public Permissions getEffectivePermissions() throws GuacamoleException { + return this; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserContext.java new file mode 100644 index 0000000..c4dbf10 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserContext.java @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; +import org.apache.guacamole.net.auth.simple.SimpleConnectionGroup; +import org.apache.guacamole.net.auth.simple.SimpleDirectory; + +/** + * Base implementation of UserContext which provides default implementations of + * most functions. Implementations must provide their own {@link #self()} and + * {@link #getAuthenticationProvider()}, but otherwise need only override an + * implemented function if they wish to actually implement the functionality + * defined for that function by the UserContext interface. + */ +public abstract class AbstractUserContext implements UserContext { + + /** + * The unique identifier that will be used for the root connection group if + * {@link #getRootConnectionGroup()} is not overridden. + */ + protected static final String DEFAULT_ROOT_CONNECTION_GROUP = "ROOT"; + + /** + * {@inheritDoc} + * + *

    This implementation simply returns {@code null}. Implementations that + * wish to expose REST resources specific to a user's session should + * override this function. + */ + @Override + public Object getResource() throws GuacamoleException { + return null; + } + + /** + * {@inheritDoc} + * + *

    This implementation returns a {@link Directory} which contains only + * the {@link User} returned by {@link #self()} (the current user + * associated with this {@link UserContext}. Implementations that wish to + * expose the existence of other users should override this function. + */ + @Override + public Directory getUserDirectory() throws GuacamoleException { + return new SimpleDirectory(self()); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Directory}. + * Implementations that wish to expose user groups should override this + * function. + */ + @Override + public Directory getUserGroupDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Directory}. + * Implementations that wish to expose connections should override this + * function. + */ + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + /** + * {@inheritDoc} + * + *

    This implementation returns a {@link Directory} which contains only + * the root connection group returned by {@link #getRootConnectionGroup()}. + * Implementations that wish to provide a structured connection hierarchy + * should override this function. If only a flat list of connections will + * be used, only {@link #getConnectionDirectory()} needs to be overridden. + */ + @Override + public Directory getConnectionGroupDirectory() + throws GuacamoleException { + return new SimpleDirectory(getRootConnectionGroup()); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Directory}. + * Implementations that wish to expose the status of active connections + * should override this function. + */ + @Override + public Directory getActiveConnectionDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Directory}. + * Implementations that wish to provide screen sharing functionality + * through the use of sharing profiles should override this function. + */ + @Override + public Directory getSharingProfileDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link ActivityRecordSet}. + * Implementations that wish to expose connection usage history should + * override this function. + */ + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link ActivityRecordSet}. + * Implementations that wish to expose user login/logout history should + * override this function. + */ + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + + /** + * {@inheritDoc} + * + *

    This implementation returns a new {@link ConnectionGroup} with the + * identifier defined by {@link #DEFAULT_ROOT_CONNECTION_GROUP} and + * containing all connections exposed by the {@link Directory} returned by + * {@link #getConnectionDirectory()}. Implementations that wish to provide + * a structured connection hierarchy should override this function. If only + * a flat list of connections will be used, only + * {@link #getConnectionDirectory()} needs to be overridden. + */ + @Override + public ConnectionGroup getRootConnectionGroup() + throws GuacamoleException { + return new SimpleConnectionGroup( + DEFAULT_ROOT_CONNECTION_GROUP, + DEFAULT_ROOT_CONNECTION_GROUP, + getConnectionDirectory().getIdentifiers(), + Collections.emptySet() + ); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Collection}. + * Implementations that wish to expose custom user attributes as fields + * within user edit screens should override this function. + */ + @Override + public Collection getUserAttributes() { + return Collections.emptyList(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Collection}. + * Implementations that wish to expose custom user group attributes as + * fields within user group edit screens should override this function. + */ + @Override + public Collection getUserGroupAttributes() { + return Collections.emptyList(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Collection}. + * Implementations that wish to expose custom connection attributes as + * fields within connection edit screens should override this function. + */ + @Override + public Collection getConnectionAttributes() { + return Collections.emptyList(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Collection}. + * Implementations that wish to expose custom connection group attributes + * as fields within connection group edit screens should override this + * function. + */ + @Override + public Collection getConnectionGroupAttributes() { + return Collections.emptyList(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns an empty {@link Collection}. + * Implementations that wish to expose custom sharing profile attributes as + * fields within sharing profile edit screens should override this function. + */ + @Override + public Collection getSharingProfileAttributes() { + return Collections.emptyList(); + } + + /** + * {@inheritDoc} + * + *

    This implementation does nothing. Implementations that wish to perform + * cleanup tasks when the user associated with this {@link UserContext} is + * being logged out should override this function. + */ + @Override + public void invalidate() { + } + + /** + * {@inheritDoc} + * + *

    This implementation simply returns this. Implementations + * that wish to provide additional privileges to extensions requesting + * privileged access should override this function. + */ + @Override + public UserContext getPrivileged() { + return this; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserGroup.java new file mode 100644 index 0000000..1de3aae --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserGroup.java @@ -0,0 +1,222 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * Base implementation of UserGroup which provides default implementations of + * most functions. + */ +public abstract class AbstractUserGroup extends AbstractIdentifiable implements UserGroup { + + /** + * Creates a new AbstractUserGroup that considers group names to be + * case-sensitive or case-insensitive based on the provided case + * sensitivity flag. + * + * @param caseSensitive + * true if group names should be considered case-sensitive, false + * otherwise. + */ + public AbstractUserGroup(boolean caseSensitive) { + super(caseSensitive); + } + + /** + * Creates a new AbstractUserGroup that considers group names to be + * case-sensitive or case-insensitive based on the case sensitivity setting + * of the provided {@link Environment}, as returned by + * {@link Environment#getCaseSensitivity()}. + * + * @param environment + * The Environment that should determine whether this AbstractUserGroup + * considers group names to be case-sensitive. + */ + public AbstractUserGroup(Environment environment) { + this(environment.getCaseSensitivity().caseSensitiveGroupNames()); + } + + /** + * Creates a new AbstractUserGroup that considers group names to be + * case-sensitive or case-insensitive based on the case sensitivity setting + * of an instance of {@link LocalEnvironment}, as returned by + * {@link LocalEnvironment#getCaseSensitivity()}. + */ + public AbstractUserGroup() { + this(LocalEnvironment.getInstance()); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty map. Implementations + * that wish to expose custom attributes should override this function. + */ + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + /** + * {@inheritDoc} + * + *

    This implementation simply ignores all attributes given. + * Implementations that wish to support modification of custom attributes + * should override this function. + */ + @Override + public void setAttributes(Map attributes) { + // Ignore all attributes by default + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + return SystemPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty permission set. + * Implementations that wish to expose permissions should override this + * function. + */ + @Override + public ObjectPermissionSet getSharingProfilePermissions() { + return ObjectPermissionSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty related object set. + * Implementations that wish to expose group membership should override + * this function. + */ + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + return RelatedObjectSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty related object set. + * Implementations that wish to expose group membership should override + * this function. + */ + @Override + public RelatedObjectSet getMemberUsers() throws GuacamoleException { + return RelatedObjectSet.EMPTY_SET; + } + + /** + * {@inheritDoc} + * + *

    This implementation simply an immutable, empty related object set. + * Implementations that wish to expose group membership should override + * this function. + */ + @Override + public RelatedObjectSet getMemberUserGroups() throws GuacamoleException { + return RelatedObjectSet.EMPTY_SET; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java new file mode 100644 index 0000000..9bcce3e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * A pairing of username and GuacamoleTunnel representing an active usage of a + * particular connection. + */ +public interface ActiveConnection extends Identifiable, Connectable, + Shareable { + + /** + * Returns the identifier of the connection being actively used. Unlike the + * other information stored in this object, the connection identifier must + * be present and MAY NOT be null. + * + * @return + * The identifier of the connection being actively used. + */ + String getConnectionIdentifier(); + + /** + * Sets the identifier of the connection being actively used. + * + * @param connnectionIdentifier + * The identifier of the connection being actively used. + */ + void setConnectionIdentifier(String connnectionIdentifier); + + /** + * Returns the identifier of the sharing profile being actively used. If + * the connection is being accessed directly, this will be null. + * + * @return + * The identifier of the sharing profile being actively used. + */ + String getSharingProfileIdentifier(); + + /** + * Sets the identifier of the sharing profile being actively used. + * + * @param sharingProfileIdentifier + * The identifier of the sharing profile being actively used. + */ + void setSharingProfileIdentifier(String sharingProfileIdentifier); + + /** + * Returns the date and time the connection began. + * + * @return + * The date and time the connection began, or null if this + * information is not available. + */ + Date getStartDate(); + + /** + * Sets the date and time the connection began. + * + * @param startDate + * The date and time the connection began, or null if this + * information is not available. + */ + void setStartDate(Date startDate); + + /** + * Returns the hostname or IP address of the remote host that initiated the + * connection, if known. If the hostname or IP address is not known, null + * is returned. + * + * @return + * The hostname or IP address of the remote host, or null if this + * information is not available. + */ + String getRemoteHost(); + + /** + * Sets the hostname or IP address of the remote host that initiated the + * connection. + * + * @param remoteHost + * The hostname or IP address of the remote host, or null if this + * information is not available. + */ + void setRemoteHost(String remoteHost); + + /** + * Returns the name of the user who is using this connection. + * + * @return + * The name of the user who is using this connection, or null if this + * information is not available. + */ + String getUsername(); + + /** + * Sets the name of the user who is using this connection. + * + * @param username + * The name of the user who is using this connection, or null if this + * information is not available. + */ + void setUsername(String username); + + /** + * Returns the connected GuacamoleTunnel being used. This may be null if + * access to the underlying tunnel is denied. + * + * @return + * The connected GuacamoleTunnel, or null if permission is denied. + */ + GuacamoleTunnel getTunnel(); + + /** + * Sets the connected GuacamoleTunnel being used. + * + * @param tunnel + * The connected GuacamoleTunnel, or null if permission is denied. + */ + void setTunnel(GuacamoleTunnel tunnel); + + /** + * Returns whether this ActiveConnection may be joined through a call to + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation, java.util.Map)} + * by the user that retrieved this ActiveConnection. + * + * @return + * true if the user that retrieved this ActiveConnection may join the + * ActiveConnection through a call to + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation, java.util.Map)}, + * false otherwise. + */ + default boolean isConnectable() { + return false; + } + + @Override + default GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + default int getActiveConnections() { + return 0; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityLog.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityLog.java new file mode 100644 index 0000000..f55ea49 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityLog.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.io.InputStream; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * An arbitrary log of an activity whose content may be exposed to a user with + * sufficient privileges. Types of content that might be exposed in this way + * include textual server logs, Guacamole session recordings, and typescripts. + */ +public interface ActivityLog { + + /** + * The value returned by {@link #getSize()} if the number of available + * bytes within {@link #getContent()} is unknown. + */ + public static final long UNKNOWN_SIZE = -1; + + /** + * All possible types of {@link ActivityLog}. + */ + enum Type { + + /** + * A Guacamole session recording in the form of a Guacamole protocol + * dump. + */ + GUACAMOLE_SESSION_RECORDING("application/octet-stream"), + + /** + * A text log from a server-side process, such as the Guacamole web + * application or guacd. + */ + SERVER_LOG("text/plain"), + + /** + * A text session recording in the form of a standard typescript. + */ + TYPESCRIPT("application/octet-stream"), + + /** + * The timing file related to a typescript. + */ + TYPESCRIPT_TIMING("text/plain"); + + /** + * The MIME type of the content of an activity log of this type. + */ + private final String contentType; + + /** + * Creates a new Type that may be associated with content having the + * given MIME type. + * + * @param contentType + * The MIME type of the content of an activity log of this type. + */ + Type(String contentType) { + this.contentType = contentType; + } + + /** + * Returns the MIME type of the content of an activity log of this + * type, as might be sent via the HTTP "Content-Type" header. + * + * @return + * The MIME type of the content of an activity log of this type. + */ + public String getContentType() { + return contentType; + } + + } + + /** + * Returns the type of this activity log. The type of an activity log + * dictates how its content should be interpreted or exposed. + * + * @return + * The type of this activity log. + */ + Type getType(); + + /** + * Returns a human-readable message that describes this log. This message + * should provide sufficient information for a user with access to this + * log to understand its context and/or purpose. + * + * @return + * A human-readable message that describes this log. + */ + TranslatableMessage getDescription(); + + /** + * Returns the number of bytes available for reading within the content of + * this log. If this value is unknown, -1 ({@link #UNKNOWN_SIZE}) should be + * returned. + * + * @return + * The number of bytes available for reading within the content of + * this log, or -1 ({@link #UNKNOWN_SIZE}) if this value is unknown. + * + * @throws GuacamoleException + * If the size of the content of this log cannot be determined due to + * an error. + */ + long getSize() throws GuacamoleException; + + /** + * Returns an InputStream that allows the content of this log to be read. + * Multiple instances of this InputStream may be open at any given time. It + * is the responsibility of the caller to close the returned InputStream. + * + * @return + * An InputStream that allows the content of this log to be read. + * + * @throws GuacamoleException + * If the content of this log cannot be read due to an error. + */ + InputStream getContent() throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java new file mode 100644 index 0000000..df321d7 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.UUID; + +/** + * A logging record describing when a user started and ended a particular + * activity. + */ +public interface ActivityRecord extends ReadableAttributes { + + /** + * Returns the date and time the activity began. + * + * @return + * The date and time the activity began. + */ + public Date getStartDate(); + + /** + * Returns the date and time the activity ended, if applicable. + * + * @return + * The date and time the activity ended, or null if the activity is + * still ongoing or if the end time is unknown. + */ + public Date getEndDate(); + + /** + * Returns the hostname or IP address of the remote host that performed the + * activity associated with this record, if known. If the hostname or IP + * address is not known, null is returned. + * + * @return + * The hostname or IP address of the remote host, or null if this + * information is not available. + */ + public String getRemoteHost(); + + /** + * Returns the name of the user who performed or is performing the activity + * at the times given by this record. + * + * @return + * The name of the user who performed or is performing the associated + * activity. + */ + public String getUsername(); + + /** + * Returns whether the activity associated with this record is still + * ongoing. + * + * @return + * true if the activity associated with this record is still ongoing, + * false otherwise. + */ + public boolean isActive(); + + /** + * Returns the unique identifier assigned to this record, if any. If this + * record is not uniquely identifiable, this may be null. If provided, this + * unique identifier MUST be unique across all {@link ActivityRecord} + * objects within the same {@link ActivityRecordSet}. + * + * @return + * The unique identifier assigned to this record, or null if this + * record has no such identifier. + */ + public default String getIdentifier() { + UUID uuid = getUUID(); + return uuid != null ? uuid.toString() : null; + } + + /** + * Returns a UUID that uniquely identifies this record. If provided, this + * UUID MUST be deterministic and unique across all {@link ActivityRecord} + * objects within the same {@link ActivityRecordSet}, and SHOULD be unique + * across all {@link ActivityRecord} objects. + * + * @return + * A UUID that uniquely identifies this record, or null if no such + * unique identifier exists. + */ + public default UUID getUUID() { + return null; + } + + /** + * Returns a Map of logs related to this record and accessible by the + * current user, such as Guacamole session recordings. Each log is + * associated with a corresponding, arbitrary, unique name. If the user + * does not have access to any logs, or if no logs are available, this may + * be an empty map. + * + * @return + * A Map of logs related to this record. + */ + public default Map getLogs() { + return Collections.emptyMap(); + } + + @Override + public default Map getAttributes() { + return Collections.emptyMap(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java new file mode 100644 index 0000000..f5b9305 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; + +/** + * A set of all available records related to a type of activity which has a + * defined start and end time, such as a user being logged in or connected, or a + * subset of those records. + * + * @param + * The type of ActivityRecord contained within this set. + */ +public interface ActivityRecordSet { + + /** + * All properties of activity records which can be used as sorting + * criteria. + */ + enum SortableProperty { + + /** + * The date and time when the activity associated with the record + * began. + */ + START_DATE + + }; + + /** + * Returns all records within this set as a standard Collection. + * + * @return + * A collection containing all records within this set. + * + * @throws GuacamoleException + * If an error occurs while retrieving the records within this set. + */ + Collection asCollection() throws GuacamoleException; + + /** + * Returns the record having the given unique identifier, if records within + * this set have unique identifiers. If records within this set do not have + * defined unique identifiers, this function has no effect. + * + * @param identifier + * The unique identifier of the record to retrieve. + * + * @return + * The record having the given unique identifier, or null if there is + * no such record. + * + * @throws GuacamoleException + * If an error occurs while retrieving the record. + */ + default RecordType get(String identifier) throws GuacamoleException { + return asCollection().stream() + .filter((record) -> { + String recordIdentifier = record.getIdentifier(); + return recordIdentifier != null && recordIdentifier.equals(identifier); + }) + .findFirst().orElse(null); + } + + /** + * Returns the subset of records which contain the given value. The + * properties and semantics involved with determining whether a particular + * record "contains" the given value is implementation dependent. This + * function may affect the contents of the current ActivityRecordSet. The + * contents of the current ActivityRecordSet should NOT be relied upon + * after this function is called. + * + * @param value + * The value which all records within the resulting subset should + * contain. + * + * @return + * The subset of records which contain the specified value. + * + * @throws GuacamoleException + * If an error occurs while restricting the current subset. + */ + ActivityRecordSet contains(String value) + throws GuacamoleException; + + /** + * Returns the subset of records containing only the first + * limit records. If the subset has fewer than + * limit records, then this function has no effect. This + * function may also affect the contents of the current ActivityRecordSet. + * The contents of the current ActivityRecordSet should NOT be relied upon + * after this function is called. + * + * @param limit + * The maximum number of records that the new subset should contain. + * + * @return + * The subset of records that containing only the first + * limit records. + * + * @throws GuacamoleException + * If an error occurs while limiting the current subset. + */ + ActivityRecordSet limit(int limit) throws GuacamoleException; + + /** + * Returns a ActivityRecordSet containing identically the records within + * this set, sorted according to the specified criteria. The sort operation + * performed is guaranteed to be stable with respect to any past call to + * sort(). This function may also affect the contents of the current + * ActivityRecordSet. The contents of the current ActivityRecordSet + * should NOT be relied upon after this function is called. + * + * @param property + * The property by which the records within the resulting set should be + * sorted. + * + * @param desc + * Whether the records should be sorted according to the specified + * property in descending order. If false, records will be sorted + * according to the specified property in ascending order. + * + * @return + * The ActivityRecordSet, sorted according to the specified criteria. + * + * @throws GuacamoleException + * If an error occurs while sorting the current subset, or if the given + * property is not supported by the implementation. + */ + ActivityRecordSet sort(SortableProperty property, boolean desc) + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AtomicDirectoryOperation.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AtomicDirectoryOperation.java new file mode 100644 index 0000000..0e081f0 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AtomicDirectoryOperation.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; + +/** + * An operation that should be attempted atomically when passed to + * {@link Directory#tryAtomically}, if atomic operations are supported by + * the Directory. + */ +public interface AtomicDirectoryOperation { + + /** + * Attempt the operation atomically. If the Directory does not support + * atomic operations, the atomic flag will be set to false. If the atomic + * flag is set to true, the provided directory is guaranteed to perform + * the operations within this function atomically. Atomicity of the + * provided directory outside this function, or of the directory invoking + * this function are not guaranteed. + * + *

    NOTE: If atomicity is required for this operation, a + * GuacamoleException may be thrown by this function before any changes are + * made, ensuring the operation will only ever be performed atomically. + * + * @param atomic + * True if the provided directory is guaranteed to perform the operation + * atomically within the context of this function. + * + * @param directory + * A directory that will perform the operation atomically if the atomic + * flag is set to true. If the flag is false, the directory may still + * be used, though atomicity is not guaranteed. + * + * @throws GuacamoleException + * If an issue occurs during the operation. + */ + void executeOperation(boolean atomic, Directory directory) + throws GuacamoleException; +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Attributes.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Attributes.java new file mode 100644 index 0000000..cdb9186 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Attributes.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Map; + +/** + * An object which is associated with a set of arbitrary attributes that may + * be modifiable, defined as name/value pairs. + */ +public interface Attributes extends ReadableAttributes { + + /** + * Sets the given attributes. If an attribute within the map is not + * supported, it will simply be dropped. Any attributes not within the given + * map will be left untouched. Attributes which are not declared within the + * associated UserContext MUST NOT be submitted, but other extensions may + * manipulate the declared attributes through decorate() and redecorate(). + * + * Implementations may optionally allow storage of unsupported attributes. + * Extensions which rely on other extensions to store their attribute + * values should verify that such storage is supported by first testing + * that the attribute value is retrievable via getAttributes() after being + * set. + * + * @param attributes + * A map of all attribute identifiers to their corresponding values. + */ + void setAttributes(Map attributes); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticatedUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticatedUser.java new file mode 100644 index 0000000..a799937 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticatedUser.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Set; + +/** + * A user of the Guacamole web application who has been authenticated by an + * AuthenticationProvider. + */ +public interface AuthenticatedUser extends Identifiable { + + /** + * The identifier reserved for representing a user that has authenticated + * anonymously. + */ + public static final String ANONYMOUS_IDENTIFIER = ""; + + /** + * Returns the AuthenticationProvider that authenticated this user. + * + * @return + * The AuthenticationProvider that authenticated this user. + */ + AuthenticationProvider getAuthenticationProvider(); + + /** + * Returns the credentials that the user provided when they successfully + * authenticated. + * + * @return + * The credentials provided by the user when they authenticated. + */ + Credentials getCredentials(); + + /** + * Returns a read-only set of the identifiers of all user groups which + * apply to this authenticated user. The exact semantics of what user + * groups apply are up to the implementation, and the user groups within + * this set may be implied, derived dynamically, inherited through multiple + * levels of group membership, etc. + * + * Note that, as with user identifiers, user group identifiers form the + * basis of identity which applies across authentication providers. It is + * expected that any two user groups having the same identifier represent + * the same group, even if defined by different authentication providers. + * + * @return + * A read-only set of the identifiers of all user groups which apply + * to this authenticated user. + */ + Set getEffectiveUserGroups(); + + /** + * Invalidates this authenticated user and their associated token such that + * they are no longer logged in. This function will be automatically + * invoked when the user logs out, or when their session expires. + */ + void invalidate(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java new file mode 100644 index 0000000..680c7c3 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java @@ -0,0 +1,278 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; + +/** + * Provides means of authorizing users and for accessing and managing data + * associated with those users. Access to such data is limited according to the + * AuthenticationProvider implementation. + */ +public interface AuthenticationProvider { + + /** + * Returns the identifier which uniquely and consistently identifies this + * AuthenticationProvider implementation. This identifier may not be null + * and must be unique across all AuthenticationProviders loaded by the + * Guacamole web application. + * + * @return + * The unique identifier assigned to this AuthenticationProvider, which + * may not be null. + */ + String getIdentifier(); + + /** + * Returns an arbitrary REST resource representing this + * AuthenticationProvider. The REST resource returned must be properly + * annotated with JSR-311 annotations, and may serve as the root resource + * for any number of subresources. The returned resource is ultimately + * exposed at ".../api/ext/IDENTIFIER/", where IDENTIFIER is the identifier + * of this AuthenticationProvider. + * + * REST resources returned by this function will be reachable by all users, + * regardless of whether they have authenticated. REST resources which + * must only be accessible by authenticated users should instead be returned + * from UserContext.getResource(). + * + * @return + * An arbitrary REST resource, annotated with JSR-311 annotations, or + * null if no such resource is defined. + * + * @throws GuacamoleException + * If the REST resource cannot be returned due to an error. + */ + Object getResource() throws GuacamoleException; + + /** + * Given the set of credentials that a user has submitted during + * authentication but has not yet been provided to the + * {@link #authenticateUser(org.apache.guacamole.net.auth.Credentials)} or + * {@link #updateAuthenticatedUser(org.apache.guacamole.net.auth.AuthenticatedUser, org.apache.guacamole.net.auth.Credentials)} + * functions of installed AuthenticationProviders, returns the set of + * credentials that should be used instead. The returned credentials may + * be the original credentials, with or without modifications, or may be an + * entirely new {@link Credentials} object. + * + * @param credentials + * The credentials provided by a user during authentication. + * + * @return + * The set of credentials that should be provided to all + * AuthenticationProviders, including this AuthenticationProvider. This + * set of credentials may optionally be entirely new or may have been + * modified. + * + * @throws GuacamoleException + * If an error occurs while updating the provided credentials. + */ + default Credentials updateCredentials(Credentials credentials) + throws GuacamoleException { + return credentials; + } + + /** + * Returns an AuthenticatedUser representing the user authenticated by the + * given credentials, if any. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * An AuthenticatedUser representing the user authenticated by the + * given credentials, if any, or null if the credentials are invalid. + * + * @throws GuacamoleException + * If an error occurs while authenticating the user, or if access is + * temporarily, permanently, or conditionally denied, such as if the + * supplied credentials are insufficient or invalid. + */ + AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException; + + /** + * Returns a new or updated AuthenticatedUser for the given credentials + * already having produced the given AuthenticatedUser. Note that because + * this function will be called for all future requests after initial + * authentication, including tunnel requests, care must be taken to avoid + * using functions of HttpServletRequest which invalidate the entire request + * body, such as getParameter(). Doing otherwise may cause the + * GuacamoleHTTPTunnelServlet to fail. + * + * @param credentials + * The credentials to use for authentication. + * + * @param authenticatedUser + * An AuthenticatedUser object representing the user authenticated by + * an arbitrary set of credentials. The AuthenticatedUser may come from + * this AuthenticationProvider or any other installed + * AuthenticationProvider. + * + * @return + * An updated AuthenticatedUser representing the user authenticated by + * the given credentials, if any, or null if the credentials are + * invalid. + * + * @throws GuacamoleException + * If an error occurs while updating the AuthenticatedUser. + */ + AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException; + + /** + * Returns the UserContext of the user authenticated by the given + * credentials. + * + * @param authenticatedUser + * An AuthenticatedUser object representing the user authenticated by + * an arbitrary set of credentials. The AuthenticatedUser may come from + * this AuthenticationProvider or any other installed + * AuthenticationProvider. + * + * @return + * A UserContext describing the permissions, connection, connection + * groups, etc. accessible or associated with the given authenticated + * user, or null if this AuthenticationProvider refuses to provide any + * such data. + * + * @throws GuacamoleException + * If an error occurs while creating the UserContext. + */ + UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException; + + /** + * Returns a new or updated UserContext for the given AuthenticatedUser + * already having the given UserContext. Note that because this function + * will be called for all future requests after initial authentication, + * including tunnel requests, care must be taken to avoid using functions + * of HttpServletRequest which invalidate the entire request body, such as + * getParameter(). Doing otherwise may cause the GuacamoleHTTPTunnelServlet + * to fail. + * + * @param context + * The existing UserContext belonging to the user in question. + * + * @param authenticatedUser + * An AuthenticatedUser object representing the user authenticated by + * an arbitrary set of credentials. The AuthenticatedUser may come from + * this AuthenticationProvider or any other installed + * AuthenticationProvider. + * + * @param credentials + * The credentials which were most recently submitted. These are not + * guaranteed to be the same as the credentials associated with the + * AuthenticatedUser when they originally authenticated. + * + * @return + * An updated UserContext describing the permissions, connection, + * connection groups, etc. accessible or associated with the given + * authenticated user, or null if this AuthenticationProvider refuses + * to provide any such data. + * + * @throws GuacamoleException + * If an error occurs while updating the UserContext. + */ + UserContext updateUserContext(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException; + + /** + * Given a UserContext returned from getUserContext() of a different + * AuthenticationProvider, returns a UserContext instance which decorates + * (wraps) that UserContext, delegating and overriding implemented + * functions as necessary. Each UserContext created via getUserContext() + * will be passed to the decorate() functions of all other + * AuthenticationProviders, allowing those AuthenticationProviders to + * augment (or perhaps even limit) the functionality or data provided. + * + * @param context + * An existing UserContext generated by getUserContext() of a different + * AuthenticationProvider. + * + * @param authenticatedUser + * The AuthenticatedUser object representing the user associated with + * the given UserContext. + * + * @param credentials + * The credentials which were most recently submitted for the given + * AuthenticatedUser. These are not guaranteed to be the same as the + * credentials associated with the AuthenticatedUser object, which are + * the credentials provided when the user originally authenticated. + * + * @return + * A decorated (wrapped) UserContext object, or the original, + * undecorated UserContext. + * + * @throws GuacamoleException + * If the UserContext cannot be decorated due to an error. + */ + UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException; + + /** + * Given a UserContext returned by updateUserContext() of a different + * AuthenticationProvider, returns a UserContext instance which decorates + * (wraps) that UserContext, delegating and overriding implemented + * functions as necessary. Each UserContext created via updateUserContext() + * will be passed to the decorate() functions of all other + * AuthenticationProviders, allowing those AuthenticationProviders to + * augment (or perhaps even limit) the functionality or data provided. + * + * @param decorated + * The UserContext returned when decorate() was invoked on this + * AuthenticationProvider for the UserContext which was just updated + * via a call to updateUserContext(). + * + * @param context + * An existing UserContext generated by updateUserContext() of a + * different AuthenticationProvider. + * + * @param authenticatedUser + * The AuthenticatedUser object representing the user associated with + * the given UserContext. + * + * @param credentials + * The credentials which were most recently submitted for the given + * AuthenticatedUser. These are not guaranteed to be the same as the + * credentials associated with the AuthenticatedUser object, which are + * the credentials provided when the user originally authenticated. + * + * @return + * A decorated (wrapped) UserContext object, or the original, + * undecorated UserContext. + * + * @throws GuacamoleException + * If the UserContext cannot be decorated due to an error. + */ + UserContext redecorate(UserContext decorated, UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException; + + /** + * Frees all resources associated with this AuthenticationProvider. This + * function will be automatically invoked when the Guacamole server is + * shutting down. + */ + void shutdown(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationSession.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationSession.java new file mode 100644 index 0000000..8d13e61 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationSession.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * Representation of an in-progress authentication attempt. + */ +public class AuthenticationSession { + + /** + * The absolute point in time after which this authentication session is + * invalid. This value is a UNIX epoch timestamp, as may be returned by + * {@link System#currentTimeMillis()}. + */ + private final long expirationTimestamp; + + /** + * Creates a new AuthenticationSession representing an in-progress + * authentication attempt. + * + * @param expires + * The number of milliseconds that may elapse before this session must + * be considered invalid. + */ + public AuthenticationSession(long expires) { + this.expirationTimestamp = System.currentTimeMillis() + expires; + } + + /** + * Returns whether this authentication session is still valid (has not yet + * expired). + * + * @return + * true if this authentication session is still valid, false if it has + * expired. + */ + public boolean isValid() { + return System.currentTimeMillis() < expirationTimestamp; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationSessionManager.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationSessionManager.java new file mode 100644 index 0000000..d8a47f4 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationSessionManager.java @@ -0,0 +1,221 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * Manager service that temporarily stores a user's authentication status while + * the authentication flow is underway. Authentication attempts are represented + * as temporary authentication sessions, allowing authentication attempts to + * span multiple requests, redirects, etc. Invalid or stale authentication + * sessions are automatically purged from storage. + * + * @param + * The type of sessions managed by this session manager. + */ +public abstract class AuthenticationSessionManager { + + /** + * Map of authentication session identifiers to their associated + * {@link AuthenticationSession}. + */ + private final ConcurrentMap sessions = new ConcurrentHashMap<>(); + + /** + * Set of identifiers of all sessions that are in a pending state, meaning + * that the session was successfully created, but the overall auth result + * has not yet been determined. + * + * Exposed as a ConcurrentMap instead of a Set because there is no + * ConcurrentSet class offering the required atomic operations. + */ + private final ConcurrentMap pendingSessions = new ConcurrentHashMap<>(); + + /** + * Executor service which runs the periodic cleanup task + */ + private final ScheduledExecutorService executor = + Executors.newScheduledThreadPool(1); + + /** + * Creates a new AuthenticationSessionManager that manages in-progress + * authentication attempts. Invalid, stale sessions are automatically + * cleaned up. + */ + public AuthenticationSessionManager() { + executor.scheduleAtFixedRate(() -> { + + // Invalidate any stale sessions + for (Map.Entry entry : sessions.entrySet()) { + if (!entry.getValue().isValid()) + invalidateSession(entry.getKey()); + } + + }, 1, 1, TimeUnit.MINUTES); + } + + /** + * Generates a cryptographically-secure value identical in form to the + * session tokens generated by {@link #defer(org.apache.guacamole.auth.sso.AuthenticationSession)} + * but invalid. The returned value is indistinguishable from a valid token, + * but is not a valid token. + * + * @return + * An invalid token value that is indistinguishable from a valid + * token. + */ + public String generateInvalid() { + return IdentifierGenerator.generateIdentifier(); + } + + /** + * Remove the session associated with the given identifier, if any, from the + * map of sessions, and the set of pending sessions. + * + * @param identifier + * The identifier of the session to remove, if one exists. + */ + public void invalidateSession(String identifier) { + + // Do not attempt to remove a null identifier + if (identifier == null) + return; + + // Remove from the overall list of sessions + sessions.remove(identifier); + + // Remove from the set of pending sessions + pendingSessions.remove(identifier); + + } + + /** + * Reactivate (remove from pending) the session associated with the given + * session identifier, if any. After calling this method, any session with + * the given identifier will be ready to be resumed again. + * + * @param identifier + * The identifier of the session to reactivate, if one exists. + */ + public void reactivateSession(String identifier) { + + // Remove from the set of pending sessions to reactivate + if (identifier != null) + pendingSessions.remove(identifier); + + } + + /** + * Resumes the Guacamole side of the authentication process that was + * previously deferred through a call to defer(). Once invoked, the + * provided value ceases to be valid for future calls to resume(). + * + * @param identifier + * The unique string returned by the call to defer(). For convenience, + * this value may safely be null. + * + * @return + * The {@link AuthenticationSession} originally provided when defer() + * was invoked, or null if the session is no longer valid or no such + * value was returned by defer(). + */ + public T resume(String identifier) { + if (identifier != null) { + + T session = sessions.get(identifier); + + // Mark the session as pending. NOTE: Unless explicitly removed + // from pending status via a call to reactivateSession(), + // the next attempt to resume this session will fail + if (pendingSessions.putIfAbsent(identifier, true) != null) { + + // If the session was already marked as pending, invalidate it + invalidateSession(identifier); + return null; + + } + + if (session != null && session.isValid()) + return session; + } + + return null; + + } + + /** + * Defers the Guacamole side of authentication for the user having the + * given authentication session such that it may be later resumed through a + * call to resume(). If authentication is never resumed, the session will + * automatically be cleaned up after it ceases to be valid. + * + * This method will automatically generate a new identifier. + * + * @param session + * The {@link AuthenticationSession} representing the in-progress + * authentication attempt. + * + * @return + * A unique and unpredictable string that may be used to represent the + * given session when calling resume(). + */ + public String defer(T session) { + String identifier = IdentifierGenerator.generateIdentifier(); + sessions.put(identifier, session); + return identifier; + } + + /** + * Defers the Guacamole side of authentication for the user having the + * given authentication session such that it may be later resumed through a + * call to resume(). If authentication is never resumed, the session will + * automatically be cleaned up after it ceases to be valid. + * + * This method accepts an externally generated ID, which should be a UUID + * or similar unique identifier. + * + * @param session + * The {@link AuthenticationSession} representing the in-progress + * authentication attempt. + * + * @param identifier + * A unique and unpredictable string that may be used to represent the + * given session when calling resume(). + */ + public void defer(T session, String identifier) { + sessions.put(identifier, session); + } + + /** + * Shuts down the executor service that periodically removes all invalid + * authentication sessions. This must be invoked when the auth extension is + * shut down in order to avoid resource leaks. + */ + public void shutdown() { + executor.shutdownNow(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connectable.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connectable.java new file mode 100644 index 0000000..2f3326f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connectable.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * An object which Guacamole can connect to. + */ +public interface Connectable { + + /* + * IMPORTANT: + * ---------- + * The web application (guacamole) defines its own version of this + * interface containing defaults which allow backwards compatibility with + * 1.0.0. Any changes to this interface MUST be properly reflected in that + * copy of the interface such that they are binary compatible. + */ + + /** + * Establishes a connection to guacd using the information associated with + * this object. The connection will be provided the given client + * information. + * + * @deprecated + * This function has been deprecated in favor of + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation, java.util.Map)}, + * which allows for connection parameter tokens to be injected and + * applied by cooperating extensions, replacing the functionality + * previously provided through the {@link org.apache.guacamole.token.StandardTokens} + * class. It continues to be defined on this interface for + * compatibility. New implementations should instead implement + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation, java.util.Map)}. + * + * @param info + * Information associated with the connecting client. + * + * @return + * A fully-established GuacamoleTunnel. + * + * @throws GuacamoleException + * If an error occurs while connecting to guacd, or if permission to + * connect is denied. + */ + @Deprecated + default GuacamoleTunnel connect(GuacamoleClientInformation info) + throws GuacamoleException { + return this.connect(info, Collections.emptyMap()); + } + + /** + * Establishes a connection to guacd using the information associated with + * this object. The connection will be provided the given client + * information. Implementations which support parameter tokens should + * apply the given tokens when configuring the connection, such as with a + * {@link org.apache.guacamole.token.TokenFilter}. + * + * @see Parameter Tokens + * + * @param info + * Information associated with the connecting client. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. If the + * implementation does not support parameter tokens, this Map may be + * ignored. + * + * @return + * A fully-established GuacamoleTunnel. + * + * @throws GuacamoleException + * If an error occurs while connecting to guacd, or if permission to + * connect is denied. + */ + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException; + + /** + * Returns the number of active connections associated with this object. + * Implementations may simply return 0 if this value is not tracked. + * + * @return + * The number of active connections associated with this object. + */ + public int getActiveConnections(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java new file mode 100644 index 0000000..24cf49c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Represents a pairing of a GuacamoleConfiguration with a unique, + * human-readable identifier, and abstracts the connection process. The + * backing GuacamoleConfiguration may be intentionally obfuscated or tokenized + * to protect sensitive configuration information. + */ +public interface Connection extends Identifiable, Connectable, Attributes, Nameable { + + /** + * Returns the unique identifier of the parent ConnectionGroup for + * this Connection. + * + * @return The unique identifier of the parent ConnectionGroup for + * this Connection. + */ + public String getParentIdentifier(); + + /** + * Sets the unique identifier of the parent ConnectionGroup for + * this Connection. + * + * @param parentIdentifier The unique identifier of the parent + * ConnectionGroup for this Connection. + */ + public void setParentIdentifier(String parentIdentifier); + + /** + * Returns the GuacamoleConfiguration associated with this Connection. Note + * that because configurations may contain sensitive information, some data + * in this configuration may be omitted or tokenized. + * + * @return The GuacamoleConfiguration associated with this Connection. + */ + public GuacamoleConfiguration getConfiguration(); + + /** + * Sets the GuacamoleConfiguration associated with this Connection. + * + * @param config The GuacamoleConfiguration to associate with this + * Connection. + */ + public void setConfiguration(GuacamoleConfiguration config); + + /** + * Returns the date and time that this connection was last used. If the + * connection was never used, the time that the connection was last used is + * unknown, or this information is not visible to the current user, this + * may be null. + * + * @return + * The date and time this connection was last used, or null if this + * information is unavailable or inapplicable. + */ + Date getLastActive(); + + /** + * Returns a list of ConnectionRecords representing the usage history + * of this Connection, including any active users. ConnectionRecords + * in this list will be sorted in descending order of end time (active + * connections are first), and then in descending order of start time + * (newer connections are first). If connection history tracking is + * not implemented this method should throw GuacamoleUnsupportedException. + * + * @deprecated + * This function has been deprecated in favor of + * {@link getConnectionHistory}, which returns the connection history + * as an ActivityRecordSet that can be easily sorted and filtered. + * While the getHistory() method is provided for API compatibility, + * new implementations should avoid use of this method and, instead, + * implement the getConnectionHistory() method. + * + * @return + * A list of ConnectionRecrods representing the usage history of this + * Connection. + * + * @throws GuacamoleException + * If history tracking is not implemented, if an error occurs while + * reading the history of this connection, or if permission is + * denied. + */ + @Deprecated + default List getHistory() + throws GuacamoleException { + return Collections.unmodifiableList(new ArrayList<>(getConnectionHistory().asCollection())); + } + + /** + * Returns an ActivityRecordSet containing ConnectionRecords that + * represent the usage history of this Connection, including any active + * users. ConnectionRecords in this list will be sorted in descending order + * of end time (active connections are first), and then in descending order + * of start time (newer connections are first). If connection history + * tracking has not been implemented, or has been implemented using the + * deprecated {@link getHistory} method, this function should throw + * GuacamoleUnsupportedExpcetion. + * + * @return + * An ActivityRecordSet containing ConnectionRecords representing the + * usage history of this Connection. + * + * @throws GuacamoleException + * If history tracking is not implemented, if an error occurs while + * reading the history of this connection, or if permission is + * denied. + */ + default ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("This implementation of Connection does not provide connection history."); + } + + /** + * Returns identifiers of all readable sharing profiles that can be used to + * join this connection when it is active. The level of access granted to a + * joining user is dictated by the connection parameters associated with + * the sharing profile, not necessarily the parameters of the primary + * connection being joined. + * + * @return + * A Set of identifiers representing the sharing profiles for this + * connection. + * + * @throws GuacamoleException + * If an error occurs while fetching the sharing profiles for this + * connection. + */ + public Set getSharingProfileIdentifiers() throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionGroup.java new file mode 100644 index 0000000..a080afc --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionGroup.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Set; +import org.apache.guacamole.GuacamoleException; + +/** + * Represents a connection group, which can contain both other connection groups + * as well as connections. + */ +public interface ConnectionGroup extends Identifiable, Connectable, Attributes, Nameable { + + /** + * All legal types of connection group. + */ + public enum Type { + + /** + * A connection group that purely organizes other connections or + * connection groups, serving only as a container. An organizational + * connection group is analogous to a directory or folder in a + * filesystem. + */ + ORGANIZATIONAL, + + /** + * A connection group that acts as a load balancer. A balancing + * connection group can be connected to in the same manner as a + * connection, and will transparently route to the least-used + * underlying connection. + */ + BALANCING + + }; + + /** + * Returns the unique identifier of the parent ConnectionGroup for + * this ConnectionGroup. + * + * @return The unique identifier of the parent ConnectionGroup for + * this ConnectionGroup. + */ + public String getParentIdentifier(); + + /** + * Sets the unique identifier of the parent ConnectionGroup for + * this ConnectionGroup. + * + * @param parentIdentifier The unique identifier of the parent + * ConnectionGroup for this ConnectionGroup. + */ + public void setParentIdentifier(String parentIdentifier); + + /** + * Set the type of this ConnectionGroup. + * + * @param type The type of this ConnectionGroup. + */ + public void setType(Type type); + + /** + * Returns the type of this connection. + * @return the type of this connection. + */ + public Type getType(); + + /** + * Returns the identifiers of all readable connections that are children + * of this connection group. + * + * @return + * The set of identifiers of all readable connections that are children + * of this connection group. + * + * @throws GuacamoleException + * If an error occurs while retrieving the identifiers. + */ + public Set getConnectionIdentifiers() throws GuacamoleException; + + /** + * Returns the identifiers of all readable connection groups that are + * children of this connection group. + * + * @return + * The set of identifiers of all readable connection groups that are + * children of this connection group. + * + * @throws GuacamoleException + * If an error occurs while retrieving the identifiers. + */ + + public Set getConnectionGroupIdentifiers() + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java new file mode 100644 index 0000000..50ba624 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.UUID; +import org.apache.guacamole.net.GuacamoleTunnel; + +/** + * A logging record describing when a user started and ended usage of a + * particular connection. + */ +public interface ConnectionRecord extends ActivityRecord { + + /** + * Returns the identifier of the connection associated with this + * connection record. + * + * @return + * The identifier of the connection associated with this connection + * record. + */ + public String getConnectionIdentifier(); + + /** + * Returns the name of the connection associated with this connection + * record. + * + * @return + * The name of the connection associated with this connection record. + */ + public String getConnectionName(); + + /** + * Returns the identifier of the sharing profile that was used to access the + * connection associated with this connection record. If the connection was + * accessed directly (without involving a sharing profile), this will be + * null. + * + * @return + * The identifier of the sharing profile used to access the connection + * associated with this connection record, or null if the connection + * was accessed directly. + */ + public String getSharingProfileIdentifier(); + + /** + * Returns the name of the sharing profile that was used to access the + * connection associated with this connection record. If the connection was + * accessed directly (without involving a sharing profile), this will be + * null. + * + * @return + * The name of the sharing profile used to access the connection + * associated with this connection record, or null if the connection + * was accessed directly. + */ + public String getSharingProfileName(); + + /** + * {@inheritDoc} + *

    If implemented, this UUID SHOULD be identical to the UUID of the + * {@link GuacamoleTunnel} originally returned when the connection was + * established to allow extensions and/or the web application to + * automatically associate connection information with corresponding + * history records, such as log messages and session recordings. + */ + @Override + public default UUID getUUID() { + return null; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java new file mode 100644 index 0000000..62c84ec --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * The set of all available connection records, or a subset of those records. + * + * @deprecated + * Use {@link ActivityRecordSet}<{@link ConnectionRecord}> instead. + */ +@Deprecated +public interface ConnectionRecordSet + extends ActivityRecordSet { +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java new file mode 100644 index 0000000..bbcfa48 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java @@ -0,0 +1,404 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.net.RequestDetails; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * Simple arbitrary set of credentials, including a username/password pair and + * a copy of the details of the HTTP request received for authentication. + *

    + * This class is used along with AuthenticationProvider to provide arbitrary + * HTTP-based authentication for Guacamole. + */ +public class Credentials implements Serializable { + + /** + * Unique identifier associated with this specific version of Credentials. + */ + private static final long serialVersionUID = 1L; + + /** + * An arbitrary username. + */ + private String username; + + /** + * An arbitrary password. + */ + private String password; + + /** + * The details of the HTTP request that provided these Credentials. + */ + private transient RequestDetails requestDetails; + + /** + * The HttpServletRequest carrying additional credentials, if any. + */ + private transient HttpServletRequest request; + + /** + * Creates a new Credentials object with the given username, password, + * and HTTP request. The details of the request are copied for later + * reference and can be retrieved with {@link #getRequestDetails()}. + * + * @param username + * The username that was provided for authentication. + * + * @param password + * The password that was provided for authentication. + * + * @param request + * The HTTP request associated with the authentication + * request. + */ + public Credentials(String username, String password, HttpServletRequest request) { + this(username, password, new RequestDetails(request)); + this.request = request; + } + + /** + * Creates a new Credentials object with the given username, password, + * and general HTTP request details. + * + * @param username + * The username that was provided for authentication. + * + * @param password + * The password that was provided for authentication. + * + * @param requestDetails + * The details of the HTTP request associated with the authentication + * request. + */ + public Credentials(String username, String password, RequestDetails requestDetails) { + this.username = username; + this.password = password; + this.requestDetails = requestDetails; + } + + /** + * Returns the password associated with this set of credentials. + * + * @return + * The password associated with this username/password pair, or null + * if no password has been set. + */ + public String getPassword() { + return password; + } + + /** + * Sets the password associated with this set of credentials. + * + * @param password + * The password to associate with this username/password pair. + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * Returns the username associated with this set of credentials. + * + * @return + * The username associated with this username/password pair, or null + * if no username has been set. + */ + public String getUsername() { + return username; + } + + /** + * Sets the username associated with this set of credentials. + * + * @param username + * The username to associate with this username/password pair. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Returns the HttpServletRequest associated with this set of credentials. + * + * @deprecated + * It is not reliable to reference an HttpServletRequest outside the + * scope of the specific request that created it. Use + * {@link #getRequestDetails()} instead. + * + * @return + * The HttpServletRequest associated with this set of credentials, + * or null if no such request exists. + */ + @Deprecated + public HttpServletRequest getRequest() { + return request; + } + + /** + * Sets the HttpServletRequest associated with this set of credentials. + * + * @deprecated + * It is not reliable to reference an HttpServletRequest outside the + * scope of the specific request that created it. Use + * {@link #setRequestDetails(org.apache.guacamole.net.RequestDetails)} + * instead. + * + * @param request + * The HttpServletRequest to associated with this set of credentials. + */ + @Deprecated + public void setRequest(HttpServletRequest request) { + setRequestDetails(new RequestDetails(request)); + this.request = request; + } + + /** + * Returns the details of the HTTP request related to these Credentials. + * + * @return + * The details of the HTTP request related to these Credentials. + */ + public RequestDetails getRequestDetails() { + return requestDetails; + } + + /** + * Replaces the current HTTP request details of these Credentials with the + * given details. + * + * @param requestDetails + * The details of the HTTP request that should replace the established + * details within these Credentials. + */ + public void setRequestDetails(RequestDetails requestDetails) { + this.requestDetails = requestDetails; + } + + /** + * Returns the HttpSession associated with this set of credentials. + *

    + * This is a convenience function that is equivalent to invoking + * {@link RequestDetails#getSession()} on the {@link RequestDetails} + * returned by {@link #getRequestDetails()}. + *

    + * NOTE: Guacamole itself does not use the HttpSession. + * The extension subsystem does not provide access to the session object + * used by Guacamole, which is considered internal. Access to an HttpSession + * is only of use if you have another application in place that + * does use HttpSession and needs to be considered. + * + * @return + * The HttpSession associated with this set of credentials, or null if + * there is no HttpSession. + */ + public HttpSession getSession() { + return requestDetails.getSession(); + } + + /** + * Sets the HttpSession associated with this set of credentials. + * + * @deprecated + * Since 1.6.0, the HttpSession that may be associated with a + * Credentials object is tied to the RequestDetails. If the HttpSession + * is part of a Credentials and truly needs to be replaced by another + * HttpSession, use {@link #setRequestDetails(org.apache.guacamole.net.RequestDetails)} + * to override the underlying {@link RequestDetails} instead. + * + * @param session + * The HttpSession to associated with this set of credentials. + */ + @Deprecated + public void setSession(HttpSession session) { + setRequestDetails(new RequestDetails(getRequestDetails()) { + + @Override + public HttpSession getSession() { + return session; + } + + }); + } + + /** + * Returns the value of the HTTP header having the given name from the + * original details of the HTTP request that is related to these + * credentials. Header names are case-insensitive. If no such header was + * present, null is returned. If the header had multiple values, the first + * value is returned. + *

    + * For access to all values of a header, as well as other details of the + * request, see {@link #getRequestDetails()}. This is a convenience + * function that is equivalent to invoking {@link RequestDetails#getHeader(java.lang.String)}. + * + * @param name + * The name of the header to retrieve. This name is case-insensitive. + * + * @return + * The first value of the HTTP header with the given name, or null if + * there is no such header. + */ + public String getHeader(String name) { + return getRequestDetails().getHeader(name); + } + + /** + * Returns the value of the HTTP parameter having the given name from the + * original details of the HTTP request that is related to these + * credentials. Parameter names are case-sensitive. If no such parameter was + * present, null is returned. If the parameter had multiple values, the + * first value is returned. + *

    + * For access to all values of a parameter, as well as other details of the + * request, see {@link #getRequestDetails()}. This is a convenience + * function that is equivalent to invoking {@link RequestDetails#getParameter(java.lang.String)}. + * + * @param name + * The name of the parameter to retrieve. This name is case-sensitive. + * + * @return + * The first value of the HTTP parameter with the given name, or null + * if there is no such parameter. + */ + public String getParameter(String name) { + return getRequestDetails().getParameter(name); + } + + /** + * Returns the address of the client end of the connection which provided + * these credentials, if known. + *

    + * This is a convenience function that is equivalent to invoking + * {@link RequestDetails#getRemoteAddress()} on the + * {@link RequestDetails} returned by {@link #getRequestDetails()}. + * + * @return + * The address of the client end of the connection which provided these + * credentials, or null if the address is not known. + */ + public String getRemoteAddress() { + return getRequestDetails().getRemoteAddress(); + } + + /** + * Sets the address of the client end of the connection which provided + * these credentials. + * + * @deprecated + * Since 1.6.0, the address that may be associated with a Credentials + * object is tied to the RequestDetails. If the address truly needs to + * be replaced, use {@link #setRequestDetails(org.apache.guacamole.net.RequestDetails)} + * to override the underlying {@link RequestDetails} instead. + * + * @param remoteAddress + * The address of the client end of the connection which provided these + * credentials, or null if the address is not known. + */ + @Deprecated + public void setRemoteAddress(String remoteAddress) { + setRequestDetails(new RequestDetails(getRequestDetails()) { + + @Override + public String getRemoteAddress() { + return remoteAddress; + } + + }); + } + + /** + * Returns the hostname of the client end of the connection which provided + * these credentials, if known. If the hostname of the client cannot be + * determined, but the address is known, the address may be returned + * instead. + *

    + * This is a convenience function that is equivalent to invoking + * {@link RequestDetails#getRemoteHostname()} on the + * {@link RequestDetails} returned by {@link #getRequestDetails()}. + * + * @return + * The hostname or address of the client end of the connection which + * provided these credentials, or null if the hostname is not known. + */ + public String getRemoteHostname() { + return getRequestDetails().getRemoteHostname(); + } + + /** + * Sets the hostname of the client end of the connection which provided + * these credentials, if known. If the hostname of the client cannot be + * determined, but the address is known, the address may be specified + * instead. + * + * @deprecated + * Since 1.6.0, the hostname that may be associated with a Credentials + * object is tied to the RequestDetails. If the hostname truly needs to + * be replaced, use {@link #setRequestDetails(org.apache.guacamole.net.RequestDetails)} + * to override the underlying {@link RequestDetails} instead. + * + * @param remoteHostname + * The hostname or address of the client end of the connection which + * provided these credentials, or null if the hostname is not known. + */ + @Deprecated + public void setRemoteHostname(String remoteHostname) { + setRequestDetails(new RequestDetails(getRequestDetails()) { + + @Override + public String getRemoteHostname() { + return remoteHostname; + } + + }); + } + + /** + * Returns whether this Credentials object does not contain any specific + * authentication parameters, including HTTP parameters and the HTTP header + * used for the authentication token. An authentication request that + * contains no parameters whatsoever will tend to be the first, anonymous, + * credential-less authentication attempt that results in the initial login + * screen rendering. + * + * @return + * true if this Credentials object contains no authentication + * parameters whatsoever, false otherwise. + */ + public boolean isEmpty() { + + // An authentication request that contains an explicit username or + // password (even if blank) is non-empty, regardless of how the values + // were passed + if (getUsername() != null || getPassword() != null) + return false; + + // An authentication request is non-empty if it contains any HTTP + // parameters at all or contains an authentication token + return getRequestDetails().getParameterNames().isEmpty() && getHeader("Guacamole-Token") == null; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DecoratingActivityRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DecoratingActivityRecordSet.java new file mode 100644 index 0000000..3461d9d --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DecoratingActivityRecordSet.java @@ -0,0 +1,165 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.guacamole.GuacamoleException; + +/** + * ActivityRecordSet implementation which simplifies decorating the records + * within an underlying ActivityRecordSet. The decorate() function must be + * implemented to define how each record is decorated. As ActivityRecordSets + * are read-only, there is no need to define an undecorate() function as + * required by {@link DecoratingDirectory}. + * + * @param + * The type of records stored within this ActivityRecordSet. + */ +public abstract class DecoratingActivityRecordSet + extends DelegatingActivityRecordSet { + + /** + * Creates a new DecoratingActivityRecordSet which decorates the records + * within the given set. + * + * @param recordSet + * The ActivityRecordSet whose records are being decorated. + */ + public DecoratingActivityRecordSet(ActivityRecordSet recordSet) { + super(recordSet); + } + + /** + * Given a record retrieved from a ActivityRecordSet which originates from + * a different AuthenticationProvider, returns an identical type of record + * optionally wrapped with additional information, functionality, etc. If + * this record set chooses to decorate the record provided, it is up to the + * implementation of that decorated record to properly pass through + * operations as appropriate. All records retrieved from this + * DecoratingActivityRecordSet will first be passed through this function. + * + * @param record + * A record from a ActivityRecordSet which originates from a different + * AuthenticationProvider. + * + * @return + * A record which may have been decorated by this + * DecoratingActivityRecordSet. If the record was not decorated, the + * original, unmodified record may be returned instead. + * + * @throws GuacamoleException + * If the provided record cannot be decorated due to an error. + */ + protected abstract RecordType decorate(RecordType record) + throws GuacamoleException; + + /** + * Given an ActivityRecordSet which originates from a different + * AuthenticationProvider, returns an identical type of record set + * optionally wrapped with additional information, functionality, etc. If + * this record set chooses to decorate the record set provided, it is up to + * the implementation of that decorated record set to properly pass through + * operations as appropriate. All record sets retrieved from this + * DecoratingActivityRecordSet will first be passed through this function, + * such as those returned by {@link #limit(int)} and similar functions. + *

    + * By default, this function will wrap any provided ActivityRecordSet in a + * simple, anonymous instance of DecoratingActivityRecordSet that delegates + * to the decorate() implementations of this DecoratingActivityRecordSet. + * This default behavior may need to be overridden if the + * DecoratingActivityRecordSet implementation maintains any internal + * state. + * + * @param recordSet + * An ActivityRecordSet which originates from a different + * AuthenticationProvider. + * + * @return + * A record set which may have been decorated by this + * DecoratingActivityRecordSet. If the record set was not decorated, the + * original, unmodified record set may be returned instead, however + * beware that this may result in records within the set no longer + * being decorated. + * + * @throws GuacamoleException + * If the provided record set cannot be decorated due to an error. + */ + protected ActivityRecordSet decorate(ActivityRecordSet recordSet) + throws GuacamoleException { + final DecoratingActivityRecordSet decorator = this; + return new DecoratingActivityRecordSet(recordSet) { + + @Override + protected RecordType decorate(RecordType record) throws GuacamoleException { + return decorator.decorate(record); + } + + @Override + protected ActivityRecordSet decorate(ActivityRecordSet recordSet) + throws GuacamoleException { + return decorator.decorate(recordSet); + } + + }; + } + + @Override + public RecordType get(String string) throws GuacamoleException { + + RecordType record = super.get(string); + if (record != null) + return decorate(record); + + return null; + + } + + @Override + public ActivityRecordSet sort(SortableProperty property, + boolean desc) throws GuacamoleException { + return decorate(super.sort(property, desc)); + } + + @Override + public ActivityRecordSet limit(int limit) throws GuacamoleException { + return decorate(super.limit(limit)); + } + + @Override + public ActivityRecordSet contains(String value) throws GuacamoleException { + return decorate(super.contains(value)); + } + + @Override + public Collection asCollection() throws GuacamoleException { + + Collection records = super.asCollection(); + + List decoratedRecords = new ArrayList<>(records.size()); + for (RecordType record : records) + decoratedRecords.add(decorate(record)); + + return decoratedRecords; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DecoratingDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DecoratingDirectory.java new file mode 100644 index 0000000..dc35e3b --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DecoratingDirectory.java @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.ArrayList; +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; + +/** + * Directory implementation which simplifies decorating the objects within an + * underlying Directory. The decorate() and undecorate() functions must be + * implemented to define how each object is decorated, and how that decoration + * may be removed. + * + * @param + * The type of objects stored within this Directory. + */ +public abstract class DecoratingDirectory + extends DelegatingDirectory { + + /** + * Creates a new DecoratingDirectory which decorates the objects within + * the given directory. + * + * @param directory + * The Directory whose objects are being decorated. + */ + public DecoratingDirectory(Directory directory) { + super(directory); + } + + /** + * Given an object retrieved from a Directory which originates from a + * different AuthenticationProvider, returns an identical type of object + * optionally wrapped with additional information, functionality, etc. If + * this directory chooses to decorate the object provided, it is up to the + * implementation of that decorated object to properly pass through + * operations as appropriate, as well as provide for an eventual + * undecorate() operation. All objects retrieved from this + * DecoratingDirectory will first be passed through this function. + * + * @param object + * An object from a Directory which originates from a different + * AuthenticationProvider. + * + * @return + * An object which may have been decorated by this + * DecoratingDirectory. If the object was not decorated, the original, + * unmodified object may be returned instead. + * + * @throws GuacamoleException + * If the provided object cannot be decorated due to an error. + */ + protected abstract ObjectType decorate(ObjectType object) + throws GuacamoleException; + + /** + * Given an object originally returned from a call to this + * DecoratingDirectory's decorate() function, reverses the decoration + * operation, returning the original object. This function is effectively + * the exact inverse of the decorate() function. The return value of + * undecorate(decorate(X)) must be identically X. All objects given to this + * DecoratingDirectory via add() or update() will first be passed through + * this function. + * + * @param object + * An object which was originally returned by a call to this + * DecoratingDirectory's decorate() function. + * + * @return + * The original object which was provided to this DecoratingDirectory's + * decorate() function. + * + * @throws GuacamoleException + * If the provided object cannot be undecorated due to an error. + */ + protected abstract ObjectType undecorate(ObjectType object) + throws GuacamoleException; + + @Override + public ObjectType get(String identifier) throws GuacamoleException { + + // Decorate only if object exists + ObjectType object = super.get(identifier); + if (object != null) + return decorate(object); + + return null; + + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + + Collection objects = super.getAll(identifiers); + + // Decorate all retrieved objects, if any + Collection decorated = new ArrayList(objects.size()); + for (ObjectType object : objects) + decorated.add(decorate(object)); + + return decorated; + + } + + @Override + public void add(ObjectType object) throws GuacamoleException { + super.add(decorate(object)); + } + + @Override + public void update(ObjectType object) throws GuacamoleException { + super.update(undecorate(object)); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingActivityRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingActivityRecord.java new file mode 100644 index 0000000..155612b --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingActivityRecord.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Date; +import java.util.Map; +import java.util.UUID; + +/** + * ActivityRecord implementation which simply delegates all function calls to an + * underlying ActivityRecord. + */ +public class DelegatingActivityRecord implements ActivityRecord { + + /** + * The wrapped ActivityRecord. + */ + private final ActivityRecord record; + + /** + * Wraps the given ActivityRecord such that all function calls against this + * DelegatingActivityRecord will be delegated to it. + * + * @param record + * The record to wrap. + */ + public DelegatingActivityRecord(ActivityRecord record) { + this.record = record; + } + + /** + * Returns the underlying ActivityRecord wrapped by this + * DelegatingActivityRecord. + * + * @return + * The ActivityRecord wrapped by this DelegatingActivityRecord. + */ + protected ActivityRecord getDelegateActivityRecord() { + return record; + } + + @Override + public Date getStartDate() { + return record.getStartDate(); + } + + @Override + public Date getEndDate() { + return record.getEndDate(); + } + + @Override + public String getRemoteHost() { + return record.getRemoteHost(); + } + + @Override + public String getUsername() { + return record.getUsername(); + } + + @Override + public boolean isActive() { + return record.isActive(); + } + + @Override + public String getIdentifier() { + return record.getIdentifier(); + } + + @Override + public UUID getUUID() { + return record.getUUID(); + } + + @Override + public Map getLogs() { + return record.getLogs(); + } + + @Override + public Map getAttributes() { + return record.getAttributes(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingActivityRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingActivityRecordSet.java new file mode 100644 index 0000000..84ae954 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingActivityRecordSet.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; + +/** + * ActivityRecordSet implementation which simply delegates all function calls + * to an underlying ActivityRecordSet. + * + * @param + * The type of ActivityRecord contained within this set. + */ +public class DelegatingActivityRecordSet + implements ActivityRecordSet { + + /** + * The wrapped ActivityRecordSet. + */ + private final ActivityRecordSet recordSet; + + /** + * Wraps the given ActivityRecordSet such that all function calls against this + * DelegatingActivityRecordSet will be delegated to it. + * + * @param recordSet + * The ActivityRecordSet to wrap. + */ + public DelegatingActivityRecordSet(ActivityRecordSet recordSet) { + this.recordSet = recordSet; + } + + /** + * Returns the underlying ActivityRecordSet wrapped by this + * DelegatingActivityRecordSet. + * + * @return + * The ActivityRecordSet wrapped by this DelegatingActivityRecordSet. + */ + protected ActivityRecordSet getDelegateActivityRecordSet() { + return recordSet; + } + + @Override + public RecordType get(String identifier) throws GuacamoleException { + return recordSet.get(identifier); + } + + @Override + public Collection asCollection() throws GuacamoleException { + return recordSet.asCollection(); + } + + @Override + public ActivityRecordSet contains(String value) throws GuacamoleException { + return recordSet.contains(value); + } + + @Override + public ActivityRecordSet limit(int limit) throws GuacamoleException { + return recordSet.limit(limit); + } + + @Override + public ActivityRecordSet sort(SortableProperty property, + boolean desc) throws GuacamoleException { + return recordSet.sort(property, desc); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnection.java new file mode 100644 index 0000000..cc99baa --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnection.java @@ -0,0 +1,184 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Connection implementation which simply delegates all function calls to an + * underlying Connection. + */ +public class DelegatingConnection implements Connection { + + /** + * The wrapped Connection. + */ + private final Connection connection; + + /** + * The tokens which should apply strictly to the next call to + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation)}. + * This storage is intended as a temporary bridge allowing the old version + * of connect() to be overridden while still resulting in the same behavior + * as older versions of DelegatingConnection. This storage should be + * removed once support for the old, deprecated connect() is removed. + */ + private final ThreadLocal> currentTokens = + new ThreadLocal>() { + + @Override + protected Map initialValue() { + return Collections.emptyMap(); + } + + }; + + /** + * Wraps the given Connection such that all function calls against this + * DelegatingConnection will be delegated to it. + * + * @param connection + * The Connection to wrap. + */ + public DelegatingConnection(Connection connection) { + this.connection = connection; + } + + /** + * Returns the underlying Connection wrapped by this DelegatingConnection. + * + * @return + * The Connection wrapped by this DelegatingConnection. + */ + protected Connection getDelegateConnection() { + return connection; + } + + @Override + public String getIdentifier() { + return connection.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + connection.setIdentifier(identifier); + } + + @Override + public String getName() { + return connection.getName(); + } + + @Override + public void setName(String name) { + connection.setName(name); + } + + @Override + public String getParentIdentifier() { + return connection.getParentIdentifier(); + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + connection.setParentIdentifier(parentIdentifier); + } + + @Override + public GuacamoleConfiguration getConfiguration() { + return connection.getConfiguration(); + } + + @Override + public void setConfiguration(GuacamoleConfiguration config) { + connection.setConfiguration(config); + } + + @Override + public Map getAttributes() { + return connection.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + connection.setAttributes(attributes); + } + + @Override + public Date getLastActive() { + return connection.getLastActive(); + } + + @Deprecated + @Override + public List getHistory() + throws GuacamoleException { + return connection.getHistory(); + } + + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + return connection.getConnectionHistory(); + } + + @Override + public Set getSharingProfileIdentifiers() + throws GuacamoleException { + return connection.getSharingProfileIdentifiers(); + } + + @Override + @Deprecated + public GuacamoleTunnel connect(GuacamoleClientInformation info) + throws GuacamoleException { + return connection.connect(info, currentTokens.get()); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Make received tokens available within the legacy connect() strictly + // in context of the current connect() call + try { + currentTokens.set(tokens); + return connect(info); + } + finally { + currentTokens.remove(); + } + + } + + @Override + public int getActiveConnections() { + return connection.getActiveConnections(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnectionGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnectionGroup.java new file mode 100644 index 0000000..5af6eb1 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnectionGroup.java @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * ConnectionGroup implementation which simply delegates all function calls to + * an underlying ConnectionGroup. + */ +public class DelegatingConnectionGroup implements ConnectionGroup { + + /** + * The wrapped ConnectionGroup. + */ + private final ConnectionGroup connectionGroup; + + /** + * The tokens which should apply strictly to the next call to + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation)}. + * This storage is intended as a temporary bridge allowing the old version + * of connect() to be overridden while still resulting in the same behavior + * as older versions of DelegatingConnectionGroup. This storage + * should be removed once support for the old, deprecated connect() is + * removed. + */ + private final ThreadLocal> currentTokens = + new ThreadLocal>() { + + @Override + protected Map initialValue() { + return Collections.emptyMap(); + } + + }; + + /** + * Wraps the given ConnectionGroup such that all function calls against this + * DelegatingConnectionGroup will be delegated to it. + * + * @param connectionGroup + * The ConnectionGroup to wrap. + */ + public DelegatingConnectionGroup(ConnectionGroup connectionGroup) { + this.connectionGroup = connectionGroup; + } + + /** + * Returns the underlying ConnectionGroup wrapped by this + * DelegatingConnectionGroup. + * + * @return + * The ConnectionGroup wrapped by this DelegatingConnectionGroup. + */ + protected ConnectionGroup getDelegateConnectionGroup() { + return connectionGroup; + } + + @Override + public String getIdentifier() { + return connectionGroup.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + connectionGroup.setIdentifier(identifier); + } + + @Override + public String getName() { + return connectionGroup.getName(); + } + + @Override + public void setName(String name) { + connectionGroup.setName(name); + } + + @Override + public String getParentIdentifier() { + return connectionGroup.getParentIdentifier(); + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + connectionGroup.setParentIdentifier(parentIdentifier); + } + + @Override + public void setType(Type type) { + connectionGroup.setType(type); + } + + @Override + public Type getType() { + return connectionGroup.getType(); + } + + @Override + public Set getConnectionIdentifiers() throws GuacamoleException { + return connectionGroup.getConnectionIdentifiers(); + } + + @Override + public Set getConnectionGroupIdentifiers() throws GuacamoleException { + return connectionGroup.getConnectionGroupIdentifiers(); + } + + @Override + public Map getAttributes() { + return connectionGroup.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + connectionGroup.setAttributes(attributes); + } + + @Override + @Deprecated + public GuacamoleTunnel connect(GuacamoleClientInformation info) + throws GuacamoleException { + return connectionGroup.connect(info, currentTokens.get()); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Make received tokens available within the legacy connect() strictly + // in context of the current connect() call + try { + currentTokens.set(tokens); + return connect(info); + } + finally { + currentTokens.remove(); + } + + } + + @Override + public int getActiveConnections() { + return connectionGroup.getActiveConnections(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnectionRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnectionRecord.java new file mode 100644 index 0000000..4d953b4 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingConnectionRecord.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Date; +import java.util.Map; +import java.util.UUID; + +/** + * ConnectionRecord implementation which simply delegates all function calls to + * an underlying ConnectionRecord. + */ +public class DelegatingConnectionRecord extends DelegatingActivityRecord + implements ConnectionRecord { + + /** + * The wrapped ConnectionRecord. + */ + private final ConnectionRecord record; + + /** + * Wraps the given ConnectionRecord such that all function calls against + * this DelegatingConnectionRecord will be delegated to it. + * + * @param record + * The record to wrap. + */ + public DelegatingConnectionRecord(ConnectionRecord record) { + super(record); + this.record = record; + } + + /** + * Returns the underlying ConnectionRecord wrapped by this + * DelegatingConnectionRecord. + * + * @return + * The ConnectionRecord wrapped by this DelegatingConnectionRecord. + */ + protected ConnectionRecord getDelegateConnectionRecord() { + return record; + } + + @Override + public String getConnectionIdentifier() { + return record.getConnectionIdentifier(); + } + + @Override + public String getConnectionName() { + return record.getConnectionName(); + } + + @Override + public String getSharingProfileIdentifier() { + return record.getSharingProfileIdentifier(); + } + + @Override + public String getSharingProfileName() { + return record.getSharingProfileName(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingDirectory.java new file mode 100644 index 0000000..cc19847 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingDirectory.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; + +/** + * Directory implementation which simply delegates all function calls to an + * underlying Directory. + * + * @param + * The type of objects stored within this Directory. + */ +public class DelegatingDirectory + implements Directory { + + /** + * The wrapped Directory. + */ + private final Directory directory; + + /** + * Wraps the given Directory such that all function calls against this + * DelegatingDirectory will be delegated to it. + * + * @param directory + * The directory to wrap. + */ + public DelegatingDirectory(Directory directory) { + this.directory = directory; + } + + /** + * Returns the underlying Directory wrapped by this DelegatingDirectory. + * + * @return + * The Directory wrapped by this DelegatingDirectory. + */ + protected Directory getDelegateDirectory() { + return directory; + } + + @Override + public ObjectType get(String identifier) throws GuacamoleException { + return directory.get(identifier); + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + return directory.getAll(identifiers); + } + + @Override + public Set getIdentifiers() throws GuacamoleException { + return directory.getIdentifiers(); + } + + @Override + public void add(ObjectType object) throws GuacamoleException { + directory.add(object); + } + + @Override + public void update(ObjectType object) throws GuacamoleException { + directory.update(object); + } + + @Override + public void remove(String identifier) throws GuacamoleException { + directory.remove(identifier); + } + + @Override + public void tryAtomically(AtomicDirectoryOperation operation) + throws GuacamoleException { + directory.tryAtomically(operation); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingSharingProfile.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingSharingProfile.java new file mode 100644 index 0000000..c16bbeb --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingSharingProfile.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Map; + +/** + * SharingProfile implementation which simply delegates all function calls to an + * underlying SharingProfile. + */ +public class DelegatingSharingProfile implements SharingProfile { + + /** + * The wrapped SharingProfile. + */ + private final SharingProfile sharingProfile; + + /** + * Wraps the given SharingProfile such that all function calls against this + * DelegatingSharingProfile will be delegated to it. + * + * @param sharingProfile + * The SharingProfile to wrap. + */ + public DelegatingSharingProfile(SharingProfile sharingProfile) { + this.sharingProfile = sharingProfile; + } + + /** + * Returns the underlying SharingProfile wrapped by this + * DelegatingSharingProfile. + * + * @return + * The SharingProfile wrapped by this DelegatingSharingProfile. + */ + protected SharingProfile getDelegateSharingProfile() { + return sharingProfile; + } + + @Override + public String getIdentifier() { + return sharingProfile.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + sharingProfile.setIdentifier(identifier); + } + + @Override + public String getName() { + return sharingProfile.getName(); + } + + @Override + public void setName(String name) { + sharingProfile.setName(name); + } + + @Override + public String getPrimaryConnectionIdentifier() { + return sharingProfile.getPrimaryConnectionIdentifier(); + } + + @Override + public void setPrimaryConnectionIdentifier(String identifier) { + sharingProfile.setPrimaryConnectionIdentifier(identifier); + } + + @Override + public Map getParameters() { + return sharingProfile.getParameters(); + } + + @Override + public void setParameters(Map parameters) { + sharingProfile.setParameters(parameters); + } + + @Override + public Map getAttributes() { + return sharingProfile.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + sharingProfile.setAttributes(attributes); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUser.java new file mode 100644 index 0000000..9f2d93b --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUser.java @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * User implementation which simply delegates all function calls to an + * underlying User. + */ +public class DelegatingUser implements User { + + /** + * The wrapped User. + */ + private final User user; + + /** + * Wraps the given User such that all function calls against this + * DelegatingUser will be delegated to it. + * + * @param user + * The User to wrap. + */ + public DelegatingUser(User user) { + this.user = user; + } + + /** + * Returns the underlying User wrapped by this DelegatingUser. + * + * @return + * The User wrapped by this DelegatingUser. + */ + protected User getDelegateUser() { + return user; + } + + @Override + public String getIdentifier() { + return user.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + user.setIdentifier(identifier); + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public void setPassword(String password) { + user.setPassword(password); + } + + @Override + public boolean isDisabled() { + return user.isDisabled(); + } + + @Override + public void setDisabled(boolean disabled) { + user.setDisabled(disabled); + } + + @Override + public Map getAttributes() { + return user.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + user.setAttributes(attributes); + } + + @Override + public Date getLastActive() { + return user.getLastActive(); + } + + @Deprecated + @Override + public List getHistory() + throws GuacamoleException { + return user.getHistory(); + } + + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return user.getUserHistory(); + } + + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + return user.getSystemPermissions(); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return user.getConnectionPermissions(); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return user.getConnectionGroupPermissions(); + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() + throws GuacamoleException { + return user.getSharingProfilePermissions(); + } + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + return user.getActiveConnectionPermissions(); + } + + @Override + public ObjectPermissionSet getUserPermissions() throws GuacamoleException { + return user.getUserPermissions(); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + return user.getUserGroupPermissions(); + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + return user.getUserGroups(); + } + + @Override + public Permissions getEffectivePermissions() throws GuacamoleException { + return user.getEffectivePermissions(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUserContext.java new file mode 100644 index 0000000..7431fa8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUserContext.java @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.Form; + +/** + * UserContext implementation which simply delegates all function calls to + * an underlying UserContext. + */ +public class DelegatingUserContext implements UserContext { + + /** + * The wrapped UserContext. + */ + private final UserContext userContext; + + /** + * Wraps the given UserContext such that all function calls against this + * DelegatingUserContext will be delegated to it. + * + * @param userContext + * The UserContext to wrap. + */ + public DelegatingUserContext(UserContext userContext) { + this.userContext = userContext; + } + + /** + * Returns the underlying UserContext wrapped by this + * DelegatingUserContext. + * + * @return + * The UserContext wrapped by this DelegatingUserContext. + */ + protected UserContext getDelegateUserContext() { + return userContext; + } + + @Override + public User self() { + return userContext.self(); + } + + @Override + public Object getResource() throws GuacamoleException { + return userContext.getResource(); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return userContext.getAuthenticationProvider(); + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + return userContext.getUserDirectory(); + } + + @Override + public Directory getUserGroupDirectory() throws GuacamoleException { + return userContext.getUserGroupDirectory(); + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return userContext.getConnectionDirectory(); + } + + @Override + public Directory getConnectionGroupDirectory() + throws GuacamoleException { + return userContext.getConnectionGroupDirectory(); + } + + @Override + public Directory getActiveConnectionDirectory() + throws GuacamoleException { + return userContext.getActiveConnectionDirectory(); + } + + @Override + public Directory getSharingProfileDirectory() + throws GuacamoleException { + return userContext.getSharingProfileDirectory(); + } + + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + return userContext.getConnectionHistory(); + } + + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return userContext.getUserHistory(); + } + + @Override + public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { + return userContext.getRootConnectionGroup(); + } + + @Override + public Collection getUserAttributes() { + return userContext.getUserAttributes(); + } + + @Override + public Collection getUserPreferenceAttributes() { + return userContext.getUserPreferenceAttributes(); + } + + @Override + public Collection getUserGroupAttributes() { + return userContext.getUserGroupAttributes(); + } + + @Override + public Collection getConnectionAttributes() { + return userContext.getConnectionAttributes(); + } + + @Override + public Collection getConnectionGroupAttributes() { + return userContext.getConnectionGroupAttributes(); + } + + @Override + public Collection getSharingProfileAttributes() { + return userContext.getSharingProfileAttributes(); + } + + @Override + public void invalidate() { + userContext.invalidate(); + } + + @Override + public UserContext getPrivileged() { + return userContext.getPrivileged(); + } + + @Override + public boolean isValid() { + return userContext.isValid(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUserGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUserGroup.java new file mode 100644 index 0000000..d525307 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/DelegatingUserGroup.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * UserGroup implementation which simply delegates all function calls to an + * underlying UserGroup. + */ +public class DelegatingUserGroup implements UserGroup { + + /** + * The wrapped UserGroup. + */ + private final UserGroup userGroup; + + /** + * Wraps the given UserGroup such that all function calls against this + * DelegatingUserGroup will be delegated to it. + * + * @param userGroup + * The UserGroup to wrap. + */ + public DelegatingUserGroup(UserGroup userGroup) { + this.userGroup = userGroup; + } + + /** + * Returns the underlying UserGroup wrapped by this DelegatingUserGroup. + * + * @return + * The UserGroup wrapped by this DelegatingUserGroup. + */ + protected UserGroup getDelegateUserGroupGroup() { + return userGroup; + } + + @Override + public String getIdentifier() { + return userGroup.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + userGroup.setIdentifier(identifier); + } + + @Override + public boolean isDisabled() { + return userGroup.isDisabled(); + } + + @Override + public void setDisabled(boolean disabled) { + userGroup.setDisabled(disabled); + } + + @Override + public Map getAttributes() { + return userGroup.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + userGroup.setAttributes(attributes); + } + + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + return userGroup.getSystemPermissions(); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return userGroup.getConnectionPermissions(); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return userGroup.getConnectionGroupPermissions(); + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() + throws GuacamoleException { + return userGroup.getSharingProfilePermissions(); + } + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + return userGroup.getActiveConnectionPermissions(); + } + + @Override + public ObjectPermissionSet getUserPermissions() throws GuacamoleException { + return userGroup.getUserPermissions(); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + return userGroup.getUserGroupPermissions(); + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + return userGroup.getUserGroups(); + } + + @Override + public RelatedObjectSet getMemberUsers() throws GuacamoleException { + return userGroup.getMemberUsers(); + } + + @Override + public RelatedObjectSet getMemberUserGroups() throws GuacamoleException { + return userGroup.getMemberUserGroups(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Directory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Directory.java new file mode 100644 index 0000000..bc5c52a --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Directory.java @@ -0,0 +1,243 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; + +/** + * Provides access to a collection of all objects with associated identifiers, + * and allows user manipulation and removal. Objects returned by a Directory + * are not necessarily backed by the stored objects, thus updating an object + * always requires calling the update() function. + * + * @param + * The type of objects stored within this Directory. + */ +public interface Directory { + + /** + * All Directory types that may be found on the {@link UserContext} + * interface. + */ + public enum Type { + + /** + * The type of a Directory that contains {@link ActiveConnection} + * objects. + */ + ACTIVE_CONNECTION(ActiveConnection.class), + + /** + * The type of a Directory that contains {@link Connection} + * objects. + */ + CONNECTION(Connection.class), + + /** + * The type of a Directory that contains {@link ConnectionGroup} + * objects. + */ + CONNECTION_GROUP(ConnectionGroup.class), + + /** + * The type of a Directory that contains {@link SharingProfile} + * objects. + */ + SHARING_PROFILE(SharingProfile.class), + + /** + * The type of a Directory that contains {@link User} objects. + */ + USER(User.class), + + /** + * The type of a Directory that contains {@link UserGroup} + * objects. + */ + USER_GROUP(UserGroup.class); + + /** + * The base class of the type of object stored within the type of + * Directory represented by this Directory.Type. + */ + private final Class objectType; + + /** + * Creates a new Directory.Type representing the type of a Directory + * that contains only subclasses of the given class. + * + * @param objectType + * The base class of the type of object stored within the type of + * Directory represented by this Directory.Type. + */ + private Type(Class objectType) { + this.objectType = objectType; + } + + /** + * Returns the base class of the type of object stored within a + * {@link Directory} of this type. + * + * @return + * The base class of the type of object stored within a + * {@link Directory} of this type. + */ + public Class getObjectType() { + return objectType; + } + + /** + * Returns the Directory.Type representing the type of a Directory that + * could contain an object having the given class. The class may be a + * subclass of the overall base class of the objects stored within the + * Directory. + * + * @param objectType + * The class to determine the Directory.Type of. + * + * @return + * The Directory.Type representing the type of a Directory that + * could contain an object having the given class, or null if there + * is no such Directory available via the UserContext interface. + */ + public static Type of(Class objectType) { + + for (Type type : Type.values()) { + if (type.getObjectType().isAssignableFrom(objectType)) + return type; + } + + return null; + + } + + } + + /** + * Returns the object having the given identifier. Note that changes to + * the object returned will not necessarily affect the object stored within + * the Directory. To update an object stored within an + * Directory such that future calls to get() will return the updated + * object, you must call update() on the object after modification. + * + * @param identifier The identifier to use when locating the object to + * return. + * @return The object having the given identifier, or null if no such object + * exists. + * + * @throws GuacamoleException If an error occurs while retrieving the + * object, or if permission for retrieving the + * object is denied. + */ + ObjectType get(String identifier) throws GuacamoleException; + + /** + * Returns the objects having the given identifiers. Note that changes to + * any object returned will not necessarily affect the object stored within + * the Directory. To update an object stored within a + * Directory such that future calls to get() will return the updated + * object, you must call update() on the object after modification. + * + * @param identifiers + * The identifiers to use when locating the objects to return. + * + * @return + * The objects having the given identifiers. If any identifiers do not + * correspond to accessible objects, those identifiers will be ignored. + * If no objects correspond to any of the given identifiers, the + * returned collection will be empty. + * + * @throws GuacamoleException + * If an error occurs while retrieving the objects, or if permission + * to retrieve the requested objects is denied. + */ + Collection getAll(Collection identifiers) + throws GuacamoleException; + + /** + * Returns a Set containing all identifiers for all objects within this + * Directory. + * + * @return A Set of all identifiers. + * @throws GuacamoleException If an error occurs while retrieving + * the identifiers. + */ + Set getIdentifiers() throws GuacamoleException; + + /** + * Adds the given object to the overall set. If a new identifier is + * created for the added object, that identifier will be automatically + * assigned via setIdentifier(). + * + * @param object + * The object to add. + * + * @throws GuacamoleException + * If an error occurs while adding the object, or if adding the object + * is not allowed. + */ + void add(ObjectType object) + throws GuacamoleException; + + /** + * Updates the stored object with the data contained in the given object. + * + * @param object The object which will supply the data for the update. + * + * @throws GuacamoleException If an error occurs while updating the object, + * or if updating the object is not allowed. + */ + void update(ObjectType object) + throws GuacamoleException; + + /** + * Removes the object with the given identifier from the overall set. + * + * @param identifier The identifier of the object to remove. + * + * @throws GuacamoleException If an error occurs while removing the object, + * or if removing the object is not allowed. + */ + void remove(String identifier) throws GuacamoleException; + + /** + * Attempt to perform the provided operation atomically if possible. If the + * operation can be performed atomically, the atomic flag will be set to + * true, and the directory passed to the provided operation callback will + * peform directory operations atomically within the operation callback. + * + * @param operation + * The directory operation that should be performed atomically. + * + * @throws GuacamoleException + * If an error occurs during execution of the provided operation. + */ + default void tryAtomically(AtomicDirectoryOperation operation) + throws GuacamoleException { + + // By default, perform the operation non-atomically. If atomic operation + // is supported by an implementation, it must be implemented there. + operation.executeOperation(false, this); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Disableable.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Disableable.java new file mode 100644 index 0000000..e515bc8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Disableable.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * An interface that defines items that can be enabled or disabled. + */ +public interface Disableable { + + /** + * Returns true if this object is disabled, otherwise false. + * + * @return + * True if this object is disabled, otherwise false. + */ + default public boolean isDisabled() { + return false; + } + + /** + * Set the disabled status of this object to the boolean value provided, + * true if the object should be disabled, otherwise false. + * + * @param disabled + * True if the object should be disabled, otherwise false. + */ + default public void setDisabled(boolean disabled) { + // Default implementation takes no action. + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/FileActivityLog.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/FileActivityLog.java new file mode 100644 index 0000000..df3cc31 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/FileActivityLog.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.language.TranslatableMessage; + +/** + * ActivityLog implementation that exposes the content of a local file. + */ +public class FileActivityLog extends AbstractActivityLog { + + /** + * The File providing the content of this log. + */ + private final File content; + + /** + * Creates a new FileActivityLog that exposes the content of the given + * local file as an {@link ActivityLog}. + * + * @param type + * The type of this ActivityLog. + * + * @param description + * A human-readable message that describes this log. + * + * @param content + * The File that should be used to provide the content of this log. + */ + public FileActivityLog(Type type, TranslatableMessage description, File content) { + super(type, description); + this.content = content; + } + + @Override + public long getSize() throws GuacamoleException { + return content.length(); + } + + @Override + public InputStream getContent() throws GuacamoleException { + try { + return new FileInputStream(content); + } + catch (FileNotFoundException e) { + throw new GuacamoleResourceNotFoundException("Associated file " + + "does not exist or cannot be read.", e); + } + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/GuacamoleProxyConfiguration.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/GuacamoleProxyConfiguration.java new file mode 100644 index 0000000..7a24837 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/GuacamoleProxyConfiguration.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * Information which describes how the connection to guacd should be + * established. This includes the hostname and port which guacd is listening on, + * as well as the type of encryption required, if any. + * + * @author Michael Jumper + */ +public class GuacamoleProxyConfiguration { + + /** + * All possible types of encryption used by guacd. + */ + public enum EncryptionMethod { + + /** + * Unencrypted (plaintext). + */ + NONE, + + /** + * Encrypted with SSL or TLS. + */ + SSL + + } + + /** + * The hostname or address of the machine where guacd is running. + */ + private final String hostname; + + /** + * The port that guacd is listening on. + */ + private final int port; + + /** + * The type of encryption required by guacd. + */ + private final EncryptionMethod encryptionMethod; + + /** + * Creates a new GuacamoleProxyConfiguration having the given hostname, + * port, and encryption method. + * + * @param hostname + * The hostname or address of the machine where guacd is running. + * + * @param port + * The port that guacd is listening on. + * + * @param encryptionMethod + * The type of encryption required by the instance of guacd running at + * the given hostname and port. + */ + public GuacamoleProxyConfiguration(String hostname, int port, + EncryptionMethod encryptionMethod) { + this.hostname = hostname; + this.port = port; + this.encryptionMethod = encryptionMethod; + } + + /** + * Creates a new GuacamoleProxyConfiguration having the given hostname and + * port, with encryption method being restricted to either NONE or SSL. + * + * @param hostname + * The hostname or address of the machine where guacd is running. + * + * @param port + * The port that guacd is listening on. + * + * @param ssl + * true if guacd requires SSL/TLS encryption, false if communication + * with guacd should be unencrypted. + */ + public GuacamoleProxyConfiguration(String hostname, int port, boolean ssl) { + this(hostname, port, ssl ? EncryptionMethod.SSL : EncryptionMethod.NONE); + } + + /** + * Returns the hostname or address of the machine where guacd is running. + * + * @return + * The hostname or address of the machine where guacd is running. + */ + public String getHostname() { + return hostname; + } + + /** + * Returns the port that guacd is listening on. + * + * @return + * The port that guacd is listening on. + */ + public int getPort() { + return port; + } + + /** + * Returns the type of encryption required by guacd. + * + * @return + * The type of encryption required by guacd. + */ + public EncryptionMethod getEncryptionMethod() { + return encryptionMethod; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Identifiable.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Identifiable.java new file mode 100644 index 0000000..d32fec0 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Identifiable.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * An object which has a deterministic, unique identifier, which may not be + * null. + */ +public interface Identifiable { + + /** + * Returns the unique identifier assigned to this object. All identifiable + * objects must have a deterministic, unique identifier which may not be + * null. + * + * @return + * The unique identifier assigned to this object, which may not be + * null. + */ + public String getIdentifier(); + + /** + * Sets the identifier assigned to this object. + * + * @param identifier + * The identifier to assign. + */ + public void setIdentifier(String identifier); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java new file mode 100644 index 0000000..2a2dd34 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import com.google.common.io.BaseEncoding; +import java.math.BigInteger; +import java.security.SecureRandom; + +/** + * Generator of unique and unpredictable identifiers. Each generated identifier + * is an arbitrary, random string produced using a cryptographically-secure + * random number generator. + */ +public class IdentifierGenerator { + + /** + * Cryptographically-secure random number generator for generating unique + * identifiers. + */ + private static final SecureRandom secureRandom = new SecureRandom(); + + /** + * IdentifierGenerator is a utility class that is not intended to be + * separately instantiated. + */ + private IdentifierGenerator() {} + + /** + * Generates a unique and unpredictable identifier. Each identifier is at + * least 256-bit and produced using a cryptographically-secure random + * number generator. The identifier may contain characters that differ only + * in case. + * + * @return + * A unique and unpredictable identifier with at least 256 bits of + * entropy. + */ + public static String generateIdentifier() { + return generateIdentifier(256); + } + + /** + * Generates a unique and unpredictable identifier having at least the + * given number of bits of entropy. The resulting identifier may have more + * than the number of bits required. The identifier may contain characters + * that differ only in case. + * + * @param minBits + * The number of bits of entropy that the identifier should contain. + * + * @return + * A unique and unpredictable identifier with at least the given number + * of bits of entropy. + */ + public static String generateIdentifier(int minBits) { + return generateIdentifier(minBits, true); + } + + /** + * Generates a unique and unpredictable identifier having at least the + * given number of bits of entropy. The resulting identifier may have more + * than the number of bits required. The identifier may contain characters + * that differ only in case. + * + * @param minBits + * The number of bits of entropy that the identifier should contain. + * + * @param caseSensitive + * Whether identifiers are permitted to contain characters that vary + * by case. If false, all characters that may vary by case will be + * lowercase, and the generated identifier will be longer. + * + * @return + * A unique and unpredictable identifier with at least the given number + * of bits of entropy. + */ + public static String generateIdentifier(int minBits, boolean caseSensitive) { + + // Generate a base64 identifier if we're allowed to vary by case + if (caseSensitive) { + int minBytes = (minBits + 23) / 24 * 3; // Round up to nearest multiple of 3 bytes, as base64 encodes blocks of 3 bytes at a time + byte[] bytes = new byte[minBytes]; + secureRandom.nextBytes(bytes); + return BaseEncoding.base64().encode(bytes); + } + + // Generate base32 identifiers if we cannot vary by case + minBits = (minBits + 4) / 5 * 5; // Round up to nearest multiple of 5 bits, as base32 encodes 5 bits at a time + return new BigInteger(minBits, secureRandom).toString(32); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Nameable.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Nameable.java new file mode 100644 index 0000000..d402060 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Nameable.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +/** + * An object which has a human-readable, arbitrary name. No requirement is + * imposed by this interface regarding whether this name must be unique, + * however implementations are free to impose such restrictions. + */ +public interface Nameable { + + /** + * Returns the human-readable name assigned to this object. + * + * @return + * The name assigned to this object. + */ + String getName(); + + /** + * Sets the human-readable name assigned to this object. + * + * @param name + * The name to assign. + */ + void setName(String name); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Permissions.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Permissions.java new file mode 100644 index 0000000..3b698be --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Permissions.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * An object which may be granted permissions to access/manipulate various + * other objects or aspects of the system. The permissions granted are exposed + * through subclasses of PermissionSet, and may be mutable depending on the + * access level of the current user. + */ +public interface Permissions { + + /** + * Returns all permissions given to this object regarding currently-active + * connections. + * + * @return + * An ObjectPermissionSet of all active connection permissions granted + * to this object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException; + + /** + * Returns all connection group permissions given to this object. + * + * @return + * An ObjectPermissionSet of all connection group permissions granted + * to this object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException; + + /** + * Returns all connection permissions given to this object. + * + * @return + * An ObjectPermissionSet of all connection permissions granted to this + * object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + ObjectPermissionSet getConnectionPermissions() throws GuacamoleException; + + /** + * Returns all sharing profile permissions given to this object. + * + * @return + * An ObjectPermissionSet of all sharing profile permissions granted to + * this object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + ObjectPermissionSet getSharingProfilePermissions() + throws GuacamoleException; + + /** + * Returns all system-level permissions given to this object. + * + * @return + * A SystemPermissionSet of all system-level permissions granted to + * this object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + SystemPermissionSet getSystemPermissions() throws GuacamoleException; + + /** + * Returns all user permissions given to this object. + * + * @return + * An ObjectPermissionSet of all user permissions granted to this + * object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + ObjectPermissionSet getUserPermissions() throws GuacamoleException; + + /** + * Returns all user group permissions given to this object. + * + * @return + * An ObjectPermissionSet of all user group permissions granted to this + * object. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + ObjectPermissionSet getUserGroupPermissions() throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ReadableAttributes.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ReadableAttributes.java new file mode 100644 index 0000000..9ad5b08 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ReadableAttributes.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Map; + +/** + * An object which is associated with a set of arbitrary attributes, defined + * as name/value pairs. + */ +public interface ReadableAttributes { + + /** + * Returns all attributes associated with this object. The returned map + * may not be modifiable. + * + * @return + * A map of all attribute identifiers to their corresponding values, + * for all attributes associated with this object, which may not be + * modifiable. + */ + Map getAttributes(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/RelatedObjectSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/RelatedObjectSet.java new file mode 100644 index 0000000..05f4c24 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/RelatedObjectSet.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; + +/** + * An arbitrary set of existing objects sharing some common relation. Unlike a + * Directory, which provides for maintaining the entire lifecycle of its + * objects, a RelatedObjectSet only maintains the relation between its + * containing object and the objects within the set. Adding/removing an object + * from a RelatedObjectSet affects only the status of the specific relationship + * represented by the RelatedObjectSet, not the existence of the objects + * themselves. + */ +public interface RelatedObjectSet { + + /** + * Returns a Set which contains the identifiers of all objects contained + * within this RelatedObjectSet. + * + * @return + * A Set which contains the identifiers of all objects contained + * within this RelatedObjectSet. + * + * @throws GuacamoleException + * If an error occurs while retrieving the objects within the set, or + * if objects cannot be retrieved due to lack of permissions to do so. + */ + Set getObjects() throws GuacamoleException; + + /** + * Adds the objects having the given identifiers, if not already present. + * If a specified object is already present, no operation is performed + * regarding that object. + * + * @param identifiers + * The identifiers of all objects being added. + * + * @throws GuacamoleException + * If an error occurs while adding the objects, or if permission to add + * objects is denied. + */ + void addObjects(Set identifiers) throws GuacamoleException; + + /** + * Removes each of the objects having the specified identifiers, if + * present. If a specified object is not present, no operation is performed + * regarding that object. + * + * @param identifiers + * The identifiers of all objects being removed. + * + * @throws GuacamoleException + * If an error occurs while removing the objects, or if permission to + * remove objects is denied. + */ + void removeObjects(Set identifiers) throws GuacamoleException; + + /** + * An immutable instance of RelatedObjectSEt which contains no objects. + */ + static final RelatedObjectSet EMPTY_SET = new RelatedObjectSet() { + + @Override + public Set getObjects() throws GuacamoleException { + return Collections.emptySet(); + } + + @Override + public void addObjects(Set identifiers) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removeObjects(Set identifiers) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + }; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Shareable.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Shareable.java new file mode 100644 index 0000000..f5ad400 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Shareable.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.credentials.UserCredentials; + +/** + * An object which can be shared with others via specially-generated sets of + * credentials. It is expected, but not required, that these credentials are + * temporary. + * + * @param + * The type of object which dictates the semantics/restrictions of shared + * objects. + */ +public interface Shareable { + + /** + * Returns a full set of credentials which can be used to authenticate as a + * user with access strictly to this object. The semantics and restrictions + * of the shared object (when accessed using the returned sharing + * credentials) are defined by the {@link T} associated with the given + * identifier and within the + * {@link Directory}<{@link T}> of the same {@link UserContext} that + * this Shareable was retrieved from. + * + * @param identifier + * The identifier of a {@link T} within the + * {@link Directory}<{@link T}> of the same {@link UserContext} + * that this Shareable was retrieved from. + * + * @return + * A full set of credentials which can be used to authenticate and + * obtain access to this object. + * + * @throws GuacamoleException + * If credentials could not be generated, or permission to share this + * object is denied. + */ + public UserCredentials getSharingCredentials(String identifier) + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/SharingProfile.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/SharingProfile.java new file mode 100644 index 0000000..1fe75d9 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/SharingProfile.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Map; + +/** + * Represents the semantics which apply to an existing connection when shared, + * along with a human-readable name and unique identifier. + */ +public interface SharingProfile extends Identifiable, Attributes, Nameable { + + /** + * Returns the identifier of the primary connection associated with this + * connection. The primary connection is the connection that this sharing + * profile can be used to share. + * + * @return + * The identifier of the primary connection associated with this + * connection. + */ + public String getPrimaryConnectionIdentifier(); + + /** + * Sets the identifier of the primary connection associated with this + * connection. The primary connection is the connection that this sharing + * profile can be used to share. + * + * @param identifier + * The identifier of the primary connection associated with this + * connection. + */ + public void setPrimaryConnectionIdentifier(String identifier); + + /** + * Returns a map which contains connection parameter name/value pairs as + * key/value pairs. Changes to this map will affect the parameters stored + * within this sharing profile. The differences in these parameters compared + * to those of the associated primary connection yield different levels of + * access to users joining the primary connection via this sharing profile. + * Note that because configurations may contain sensitive information, some + * data in this map may be omitted or tokenized. + * + * @return + * A map which contains all connection parameter name/value pairs as + * key/value pairs. + */ + public Map getParameters(); + + /** + * Replaces all current parameters with the parameters defined within the + * given map. Key/value pairs within the map represent parameter name/value + * pairs. The differences in these parameters compared to those of the + * associated primary connection yield different levels of access to users + * joining the primary connection via this sharing profile. + * + * @param parameters + * A map which contains all connection parameter name/value pairs as + * key/value pairs. + */ + public void setParameters(Map parameters); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java new file mode 100644 index 0000000..422e0ea --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Connection implementation which overrides the connect() function of an + * underlying Connection, adding a given set of parameter tokens to the tokens + * already supplied. If not supplying a static set of tokens at construction + * time, implementations should override either {@link #addTokens(java.util.Map)} + * or {@link #getTokens()} to provide tokens dynamically. + */ +public class TokenInjectingConnection extends DelegatingConnection { + + /** + * The additional tokens to include with each call to connect(). + */ + private final Map tokens; + + /** + * Returns the tokens which should be added to an in-progress call to + * connect(). If not overridden, this function will return the tokens + * provided when this instance of TokenInjectingConnection was created. If + * the values of existing tokens need to be considered, implementations + * should override {@link #addTokens(java.util.Map)} instead. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + * + * @throws GuacamoleException + * If the applicable tokens cannot be generated. + */ + protected Map getTokens() throws GuacamoleException { + return tokens; + } + + /** + * Adds tokens to an in-progress call to connect(). If not overridden, this + * function will add the tokens returned by {@link #getTokens()}. + * + * @param tokens + * A modifiable Map containing the tokens already supplied to + * connect(). + * + * @throws GuacamoleException + * If the applicable tokens cannot be generated. + */ + protected void addTokens(Map tokens) throws GuacamoleException { + tokens.putAll(getTokens()); + } + + /** + * Wraps the given Connection, automatically adding the given tokens to + * each invocation of connect(). Any additional tokens which have the same + * name as existing tokens will override the existing values. + * + * @param connection + * The Connection to wrap. + * + * @param tokens + * The additional tokens to include with each call to connect(). + */ + public TokenInjectingConnection(Connection connection, + Map tokens) { + super(connection); + this.tokens = tokens; + } + + /** + * Wraps the given Connection such that the additional parameter tokens + * added by {@link #addTokens(java.util.Map)} or returned by + * {@link #getTokens()} are included with each invocation of connect(). + * Any additional tokens which have the same name as existing tokens will + * override the existing values. + * + * @param connection + * The Connection to wrap. + */ + public TokenInjectingConnection(Connection connection) { + this(connection, Collections.emptyMap()); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Apply provided tokens over those given to connect() + tokens = new HashMap<>(tokens); + addTokens(tokens); + + return super.connect(info, tokens); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java new file mode 100644 index 0000000..c7dfa0a --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * ConnectionGroup implementation which overrides the connect() function of an + * underlying ConnectionGroup, adding a given set of parameter tokens to the + * tokens already supplied. If not supplying a static set of tokens at + * construction time, implementations should override either + * {@link #addTokens(java.util.Map)} or {@link #getTokens()} to provide tokens + * dynamically. + */ +public class TokenInjectingConnectionGroup extends DelegatingConnectionGroup { + + /** + * The additional tokens to include with each call to connect(). + */ + private final Map tokens; + + /** + * Returns the tokens which should be added to an in-progress call to + * connect(). If not overridden, this function will return the tokens + * provided when this instance of TokenInjectingConnection was created. If + * the values of existing tokens need to be considered, implementations + * should override {@link #addTokens(java.util.Map)} instead. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + * + * @throws GuacamoleException + * If the applicable tokens cannot be generated. + */ + protected Map getTokens() throws GuacamoleException { + return tokens; + } + + /** + * Adds tokens to an in-progress call to connect(). If not overridden, this + * function will add the tokens returned by {@link #getTokens()}. + * + * @param tokens + * A modifiable Map containing the tokens already supplied to + * connect(). + * + * @throws GuacamoleException + * If the applicable tokens cannot be generated. + */ + protected void addTokens(Map tokens) throws GuacamoleException { + tokens.putAll(getTokens()); + } + + /** + * Wraps the given ConnectionGroup, automatically adding the given tokens + * to each invocation of connect(). Any additional tokens which have the + * same name as existing tokens will override the existing values. + * + * @param connectionGroup + * The ConnectionGroup to wrap. + * + * @param tokens + * The additional tokens to include with each call to connect(). + */ + public TokenInjectingConnectionGroup(ConnectionGroup connectionGroup, + Map tokens) { + super(connectionGroup); + this.tokens = tokens; + } + + /** + * Wraps the given ConnectionGroup such that the additional parameter + * tokens added by {@link #addTokens(java.util.Map)} or returned by + * {@link #getTokens()} are included with each invocation of connect(). Any + * additional tokens which have the same name as existing tokens will + * override the existing values. + * + * @param connectionGroup + * The ConnectionGroup to wrap. + */ + public TokenInjectingConnectionGroup(ConnectionGroup connectionGroup) { + this(connectionGroup, Collections.emptyMap()); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Apply provided tokens over those given to connect() + tokens = new HashMap<>(tokens); + addTokens(tokens); + + return super.connect(info, tokens); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java new file mode 100644 index 0000000..79c2769 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java @@ -0,0 +1,216 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; + +/** + * UserContext implementation which decorates a given UserContext, + * automatically applying additional parameter tokens during the connection + * process of any retrieved Connections and ConnectionGroups. + */ +public class TokenInjectingUserContext extends DelegatingUserContext { + + /** + * The additional tokens to include with each call to connect() if + * getTokens() or addTokens() are not overridden. + */ + private final Map tokens; + + /** + * Wraps the given UserContext, overriding the connect() function of each + * retrieved Connection and ConnectionGroup such that the given additional + * parameter tokens are included. Any additional tokens which have the same + * name as existing tokens will override the existing values. If tokens + * specific to a particular connection or connection group need to be + * included, getTokens() or addTokens() may be overridden to provide a + * different set of tokens. + * + * @param userContext + * The UserContext to wrap. + * + * @param tokens + * The additional tokens to include with each call to connect(). + */ + public TokenInjectingUserContext(UserContext userContext, + Map tokens) { + super(userContext); + this.tokens = tokens; + } + + /** + * Wraps the given UserContext, overriding the connect() function of each + * retrieved Connection and ConnectionGroup such that the additional + * parameter tokens added by addTokens() or returned by getTokens() are + * included. Any additional tokens which have the same name as existing + * tokens will override the existing values. + * + * @param userContext + * The UserContext to wrap. + */ + public TokenInjectingUserContext(UserContext userContext) { + this(userContext, Collections.emptyMap()); + } + + /** + * Returns the tokens which should be added to an in-progress call to + * connect() for the given Connection. If not overridden, this function + * will return the tokens provided when this instance of + * TokenInjectingUserContext was created. If the values of existing tokens + * need to be considered, implementations should override + * {@link #addTokens(org.apache.guacamole.net.auth.Connection, java.util.Map)} + * instead. + * + * @param connection + * The Connection on which connect() has been called. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + * + * @throws GuacamoleException + * If the tokens applicable to the given connection cannot be + * generated. + */ + protected Map getTokens(Connection connection) + throws GuacamoleException { + return tokens; + } + + /** + * Adds tokens to an in-progress call to connect() for the given + * Connection. If not overridden, this function will add the tokens + * returned by {@link #getTokens(org.apache.guacamole.net.auth.Connection)}. + * + * @param connection + * The Connection on which connect() has been called. + * + * @param tokens + * A modifiable Map containing the tokens already supplied to + * connect(). + * + * @throws GuacamoleException + * If the tokens applicable to the given connection cannot be + * generated. + */ + protected void addTokens(Connection connection, Map tokens) + throws GuacamoleException { + tokens.putAll(getTokens(connection)); + } + + /** + * Returns the tokens which should be added to an in-progress call to + * connect() for the given ConnectionGroup. If not overridden, this + * function will return the tokens provided when this instance of + * TokenInjectingUserContext was created. If the values of existing tokens + * need to be considered, implementations should override + * {@link #addTokens(org.apache.guacamole.net.auth.ConnectionGroup, java.util.Map)} + * instead. + * + * @param connectionGroup + * The ConnectionGroup on which connect() has been called. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + * + * @throws GuacamoleException + * If the tokens applicable to the given connection group cannot be + * generated. + */ + protected Map getTokens(ConnectionGroup connectionGroup) + throws GuacamoleException { + return tokens; + } + + /** + * Adds tokens to an in-progress call to connect() for the given + * ConnectionGroup. If not overridden, this function will add the tokens + * returned by {@link #getTokens(org.apache.guacamole.net.auth.ConnectionGroup)}. + * + * @param connectionGroup + * The ConnectionGroup on which connect() has been called. + * + * @param tokens + * A modifiable Map containing the tokens already supplied to + * connect(). + * + * @throws GuacamoleException + * If the tokens applicable to the given connection cannot be + * generated. + */ + protected void addTokens(ConnectionGroup connectionGroup, + Map tokens) throws GuacamoleException { + tokens.putAll(getTokens(connectionGroup)); + } + + @Override + public Directory getConnectionGroupDirectory() + throws GuacamoleException { + return new DecoratingDirectory(super.getConnectionGroupDirectory()) { + + @Override + protected ConnectionGroup decorate(ConnectionGroup object) throws GuacamoleException { + return new TokenInjectingConnectionGroup(object) { + + @Override + protected void addTokens(Map tokens) throws GuacamoleException { + TokenInjectingUserContext.this.addTokens(object, tokens); + } + + }; + } + + @Override + protected ConnectionGroup undecorate(ConnectionGroup object) throws GuacamoleException { + return ((TokenInjectingConnectionGroup) object).getDelegateConnectionGroup(); + } + + }; + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return new DecoratingDirectory(super.getConnectionDirectory()) { + + @Override + protected Connection decorate(Connection object) throws GuacamoleException { + return new TokenInjectingConnection(object) { + + @Override + protected void addTokens(Map tokens) throws GuacamoleException { + TokenInjectingUserContext.this.addTokens(object, tokens); + } + + }; + } + + @Override + protected Connection undecorate(Connection object) throws GuacamoleException { + return ((TokenInjectingConnection) object).getDelegateConnection(); + } + + }; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java new file mode 100644 index 0000000..d658bb0 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; + +/** + * A user of the Guacamole web application. + */ +public interface User extends Disableable, Identifiable, Attributes, Permissions { + + /** + * All standard attribute names with semantics defined by the Guacamole web + * application. Extensions may additionally define their own attributes + * with completely arbitrary names and semantics, so long as those names do + * not conflict with the names listed here. All standard attribute names + * have a "guac-" prefix to avoid such conflicts. + */ + public static class Attribute { + + /** + * The user's full name. + */ + public static String FULL_NAME = "guac-full-name"; + + /** + * The email address of the user. + */ + public static String EMAIL_ADDRESS = "guac-email-address"; + + /** + * The organization, company, group, etc. that the user belongs to. + */ + public static String ORGANIZATION = "guac-organization"; + + /** + * The role that the user has at the organization, company, group, etc. + * they belong to. + */ + public static String ORGANIZATIONAL_ROLE = "guac-organizational-role"; + + } + + /** + * Returns this user's password. Note that the password returned may be + * hashed or completely arbitrary. + * + * @return A String which may (or may not) be the user's password. + */ + public String getPassword(); + + /** + * Sets this user's password. Note that while this function is guaranteed + * to change the password of this User object, there is no guarantee that + * getPassword() will return the value given to setPassword(). + * + * @param password The password to set. + */ + public void setPassword(String password); + + /** + * Returns the date and time that this user was last active. If the user + * was never active, the time that the user was last active is unknown, or + * this information is not visible to the current user, this may be null. + * + * @return + * The date and time this user was last active, or null if this + * information is unavailable or inapplicable. + */ + Date getLastActive(); + + /** + * Returns a list of ActivityRecords representing the login history + * of this user, including any active sessions. ActivityRecords + * in this list will be sorted in descending order of end time (active + * sessions are first), and then in descending order of start time + * (newer sessions are first). If user login history is not implemented + * this method should throw GuacamoleUnsupportedException. + * + * @deprecated + * This function is deprecated in favor of {@link getUserHistory}, which + * returns the login history as an ActivityRecordSet which supports + * various sort and filter functions. While this continues to be defined + * for API compatibility, new implementation should avoid this function + * and use getUserHistory(), instead. + * + * @return + * A list of ActivityRecords representing the login history of this + * User. + * + * @throws GuacamoleException + * If history tracking is not implemented, if an error occurs while + * reading the history of this user, or if permission is denied. + */ + @Deprecated + default List getHistory() throws GuacamoleException { + return Collections.unmodifiableList(new ArrayList<>(getUserHistory().asCollection())); + } + + /** + * Returns an ActivityRecordSet containing ActivityRecords representing + * the login history for this user, including any active sessions. + * ActivityRecords in this list will be sorted in descending order of end + * time (active sessions are first), and then in descending order of start + * time (newer sessions are first). If login history tracking is not + * implemented, or is only implemented using the deprecated {@link getHistory} + * method, this method should throw GuacamoleUnsupportedException. + * + * @return + * An ActivityRecordSet containing ActivityRecords representing the + * login history for this user. + * + * @throws GuacamoleException + * If history tracking is not implemented, if an error occurs while + * reading the history of this user, or if permission is denied. + */ + default ActivityRecordSet getUserHistory() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("The default implementation of User does not provide login history."); + } + + /** + * Returns a set of all readable user groups of which this user is a member. + * If permission is granted for the current user to modify the membership of + * this user, then the returned set will be mutable, and any such + * modifications should be made through changes to the returned set. + * + * @return + * The set of all readable user groups of which this user is a member. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user groups. + */ + RelatedObjectSet getUserGroups() throws GuacamoleException; + + /** + * Returns a read-only view of all permissions granted to this user. The + * exact semantics of what permissions are granted are up to the + * implementation, and the permissions within this view may be implied, + * derived dynamically, inherited through multiple levels of group + * membership, etc. + * + * @return + * A read-only view of the permissions which are granted to this user. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if reading all + * permissions is not allowed. + */ + Permissions getEffectivePermissions() throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java new file mode 100644 index 0000000..a9ea7ea --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java @@ -0,0 +1,328 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collection; +import java.util.Collections; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.Form; + +/** + * The context of an active user. The functions of this class enforce all + * permissions and act only within the rights of the associated user. + */ +public interface UserContext { + + /** + * Returns the User whose access rights control the operations of this + * UserContext. + * + * @return The User whose access rights control the operations of this + * UserContext. + */ + User self(); + + /** + * Returns true if the session for the User associated with this user + * context is valid, or false otherwise. If the session is not valid, + * the webapp can be expected to terminate the session within a short + * period of time. + * + * NOTE: The webapp currently checks once a minute, and terminates any + * session marked as invalid. + * + * @return + * true if the session for the User associated with this user + * context is valid, or false otherwise. + */ + default boolean isValid() { + + // A user context is always valid unless explicitly updated by an + // implementation + return true; + + } + + /** + * Returns an arbitrary REST resource representing this UserContext. The + * REST resource returned must be properly annotated with JSR-311 + * annotations, and may serve as the root resource for any number of + * subresources. The returned resource is ultimately exposed at + * ".../api/session/ext/IDENTIFIER/", where IDENTIFIER is the identifier of + * the AuthenticationProvider associated with this UserContext. + * + * REST resources returned by this function will only be reachable by + * authenticated users with valid authentication tokens. REST resources + * which should be accessible by all users regardless of whether they have + * authenticated should instead be returned from + * AuthenticationProvider.getResource(). + * + * @return + * An arbitrary REST resource, annotated with JSR-311 annotations, or + * null if no such resource is defined. + * + * @throws GuacamoleException + * If the REST resource cannot be returned due to an error. + */ + Object getResource() throws GuacamoleException; + + /** + * Returns the AuthenticationProvider which created this UserContext, which + * may not be the same AuthenticationProvider that authenticated the user + * associated with this UserContext. + * + * @return + * The AuthenticationProvider that created this UserContext. + */ + AuthenticationProvider getAuthenticationProvider(); + + /** + * Retrieves a Directory which can be used to view and manipulate other + * users, but only as allowed by the permissions given to the user of this + * UserContext. + * + * @return A Directory whose operations are bound by the restrictions + * of this UserContext. + * + * @throws GuacamoleException If an error occurs while creating the + * Directory. + */ + Directory getUserDirectory() throws GuacamoleException; + + /** + * Retrieves a Directory which can be used to view and manipulate user + * groups, but only as allowed by the permissions given to the user of this + * UserContext. + * + * @return + * A Directory whose operations are bound by the restrictions + * of this UserContext. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + Directory getUserGroupDirectory() throws GuacamoleException; + + /** + * Retrieves a Directory which can be used to view and manipulate + * connections and their configurations, but only as allowed by the + * permissions given to the user. + * + * @return A Directory whose operations are bound by the permissions of + * the user. + * + * @throws GuacamoleException If an error occurs while creating the + * Directory. + */ + Directory getConnectionDirectory() + throws GuacamoleException; + + /** + * Retrieves a Directory which can be used to view and manipulate + * connection groups and their members, but only as allowed by the + * permissions given to the user. + * + * @return A Directory whose operations are bound by the permissions of + * the user. + * + * @throws GuacamoleException If an error occurs while creating the + * Directory. + */ + Directory getConnectionGroupDirectory() + throws GuacamoleException; + + /** + * Retrieves a Directory which can be used to view and manipulate + * active connections, but only as allowed by the permissions given to the + * user. + * + * @return + * A Directory whose operations are bound by the permissions of the + * user. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + Directory getActiveConnectionDirectory() + throws GuacamoleException; + + /** + * Retrieves a Directory which can be used to view and manipulate + * sharing profiles and their configurations, but only as allowed by the + * permissions given to the user. + * + * @return + * A Directory whose operations are bound by the permissions of the + * user. + * + * @throws GuacamoleException + * If an error occurs while creating the Directory. + */ + Directory getSharingProfileDirectory() + throws GuacamoleException; + + /** + * Retrieves all connection records visible to current user. Connection + * history records describe the start and end times of connections, and + * correspond to the times that users connect or disconnect to individual + * remote desktops. The resulting set of connection records can be further + * filtered and ordered using the methods defined on ActivityRecordSet. + * + * @return + * A set of all connection records visible to the current user. + * + * @throws GuacamoleException + * If an error occurs while retrieving the connection records. + */ + ActivityRecordSet getConnectionHistory() + throws GuacamoleException; + + /** + * Retrieves all user history records visible to current user. User history + * records describe the start and end times of user sessions, and correspond + * to the times that users logged in or out. The resulting set of user + * records can be further filtered and ordered using the methods defined on + * ActivityRecordSet. + * + * @return + * A set of all user records visible to the current user. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user records. + */ + ActivityRecordSet getUserHistory() throws GuacamoleException; + + /** + * Retrieves a connection group which can be used to view and manipulate + * connections, but only as allowed by the permissions given to the user of + * this UserContext. + * + * @return A connection group whose operations are bound by the restrictions + * of this UserContext. + * + * @throws GuacamoleException If an error occurs while creating the + * Directory. + */ + ConnectionGroup getRootConnectionGroup() throws GuacamoleException; + + /** + * Retrieves a collection of all attributes applicable to users. This + * collection will contain only those attributes which the current user has + * general permission to view or modify. If there are no such attributes, + * this collection will be empty. + * + * @return + * A collection of all attributes applicable to users. + */ + Collection getUserAttributes(); + + /** + * Retrieves a collection of user attributes, specific to the user preferences + * page in the UI. Unlike standard user attributes, these should be self-editable. + * + * @return + * A collection of form of user attributes, specific to the user preferences + * page in the UI. + */ + default Collection getUserPreferenceAttributes() { + + // By default, a user context does not expose any preference user attributes + return Collections.emptyList(); + + } + + /** + * Retrieves a collection of all attributes applicable to user groups. This + * collection will contain only those attributes which the current user has + * general permission to view or modify. If there are no such attributes, + * this collection will be empty. + * + * @return + * A collection of all attributes applicable to user groups. + */ + Collection getUserGroupAttributes(); + + /** + * Retrieves a collection of all attributes applicable to connections. This + * collection will contain only those attributes which the current user has + * general permission to view or modify. If there are no such attributes, + * this collection will be empty. + * + * @return + * A collection of all attributes applicable to connections. + */ + Collection getConnectionAttributes(); + + /** + * Retrieves a collection of all attributes applicable to connection + * groups. This collection will contain only those attributes which the + * current user has general permission to view or modify. If there are no + * such attributes, this collection will be empty. + * + * @return + * A collection of all attributes applicable to connection groups. + */ + Collection getConnectionGroupAttributes(); + + /** + * Retrieves a collection of all attributes applicable to sharing profiles. + * This collection will contain only those attributes which the current user + * has general permission to view or modify. If there are no such + * attributes, this collection will be empty. + * + * @return + * A collection of all attributes applicable to sharing profile. + */ + Collection getSharingProfileAttributes(); + + /** + * Invalidates this user context, releasing all associated resources. This + * function will be invoked when the user logs out, or when their session + * is automatically invalidated. + */ + void invalidate(); + + /** + * Returns a user context which provides privileged access. Unlike the + * original user context, which is required to enforce its own permissions + * and act only within the rights of the associated user, the user context + * returned by this function MAY ignore the restrictions that otherwise + * limit the current user's access. + * + *

    This function is intended to allow extensions which decorate other + * extensions to act independently of the restrictions that affect the + * current user. This function will only be invoked by extensions and + * WILL NOT be invoked directly by the web application. Implementations of + * this function MAY still enforce access restrictions, particularly if + * they do not want to grant full, unrestricted access to other extensions. + * + *

    A default implementation which simply returns this is + * provided for compatibility with Apache Guacamole 1.1.0 and older. + * + * @return + * A user context instance which MAY ignore some or all restrictions + * which otherwise limit the current user's access. + */ + default UserContext getPrivileged() { + return this; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserGroup.java new file mode 100644 index 0000000..840c386 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserGroup.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; + +/** + * A user group of the Guacamole web application. Each user group may contain + * any number of Guacamole users and other user groups, and defines the + * permissions implicitly granted to its members. + */ +public interface UserGroup extends Disableable, Identifiable, Attributes, Permissions { + + /** + * Returns a set of all readable user groups of which this user group is a + * member. If permission is granted for the current user to modify the + * membership of this user group, then the returned set will be mutable, + * and any such modifications should be made through changes to the + * returned set. + * + * @return + * The set of all readable user groups of which this user group is a + * member. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user groups. + */ + RelatedObjectSet getUserGroups() throws GuacamoleException; + + /** + * Returns a set of all readable users that are members of this user group. + * If permission is granted for the current user to modify the members of + * this group, then the returned set will be mutable, and any such + * modifications should be made through changes to the returned set. + * + * @return + * The set all readable users that are members of this user group, + * which may be mutable. + * + * @throws GuacamoleException + * If an error occurs while retrieving the users. + */ + RelatedObjectSet getMemberUsers() throws GuacamoleException; + + /** + * Returns a set of all readable user groups that are members of this user + * group. If permission is granted for the current user to modify the + * members of this group, then the returned set will be mutable, and any + * such modifications should be made through changes to the returned set. + * + * @return + * The set of all readable user groups that are members of this user + * group, which may be mutable. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user groups. + */ + RelatedObjectSet getMemberUserGroups() throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/CredentialsInfo.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/CredentialsInfo.java new file mode 100644 index 0000000..83b6fc2 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/CredentialsInfo.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.credentials; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.PasswordField; +import org.apache.guacamole.form.UsernameField; + +/** + * Information which describes a set of valid credentials. + */ +public class CredentialsInfo { + + /** + * All fields required for valid credentials. + */ + private final Collection fields; + + /** + * Creates a new CredentialsInfo object which requires the given fields for + * any conforming credentials. + * + * @param fields + * The fields to require. + */ + public CredentialsInfo(Collection fields) { + this.fields = fields; + } + + /** + * Returns all fields required for valid credentials as described by this + * object. + * + * @return + * All fields required for valid credentials. + */ + public Collection getFields() { + return Collections.unmodifiableCollection(fields); + } + + /** + * CredentialsInfo object which describes empty credentials. No fields are + * required. + */ + public static final CredentialsInfo EMPTY = new CredentialsInfo(Collections.emptyList()); + + /** + * A field describing the username HTTP parameter expected by Guacamole + * during login, if usernames are being used. + */ + public static final Field USERNAME = new UsernameField("username"); + + /** + * A field describing the password HTTP parameter expected by Guacamole + * during login, if passwords are being used. + */ + public static final Field PASSWORD = new PasswordField("password"); + + /** + * CredentialsInfo object which describes standard username/password + * credentials. + */ + public static final CredentialsInfo USERNAME_PASSWORD = new CredentialsInfo(Arrays.asList( + USERNAME, + PASSWORD + )); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleCredentialsException.java new file mode 100644 index 0000000..6d973e1 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleCredentialsException.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.credentials; + +import org.apache.guacamole.GuacamoleUnauthorizedException; + +/** + * A security-related exception thrown when access is denied to a user because + * of a problem related to the provided credentials. Additional information + * describing the form of valid credentials is provided. + */ +public class GuacamoleCredentialsException extends GuacamoleUnauthorizedException { + + /** + * Information describing the form of valid credentials. + */ + private final CredentialsInfo credentialsInfo; + + /** + * Creates a new GuacamoleInvalidCredentialsException with the given + * message, cause, and associated credential information. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleCredentialsException(String message, Throwable cause, + CredentialsInfo credentialsInfo) { + super(message, cause); + this.credentialsInfo = credentialsInfo; + } + + /** + * Creates a new GuacamoleInvalidCredentialsException with the given + * message and associated credential information. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleCredentialsException(String message, CredentialsInfo credentialsInfo) { + super(message); + this.credentialsInfo = credentialsInfo; + } + + /** + * Creates a new GuacamoleInvalidCredentialsException with the given cause + * and associated credential information. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleCredentialsException(Throwable cause, CredentialsInfo credentialsInfo) { + super(cause); + this.credentialsInfo = credentialsInfo; + } + + /** + * Returns information describing the form of valid credentials. + * + * @return + * Information describing the form of valid credentials. + */ + public CredentialsInfo getCredentialsInfo() { + return credentialsInfo; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java new file mode 100644 index 0000000..06ae3ea --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.credentials; + +/** + * A security-related exception thrown when access is denied to a user because + * the provided credentials are not sufficient for authentication to succeed. + * The validity or invalidity of the given credentials is not specified, and + * more information is needed before a decision can be made. Additional + * information describing the form of valid credentials is provided. + */ +public class GuacamoleInsufficientCredentialsException extends GuacamoleCredentialsException { + + /** + * Creates a new GuacamoleInsufficientCredentialsException with the given + * message, cause, and associated credential information. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleInsufficientCredentialsException(String message, Throwable cause, + CredentialsInfo credentialsInfo) { + super(message, cause, credentialsInfo); + } + + /** + * Creates a new GuacamoleInsufficientCredentialsException with the given + * message and associated credential information. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleInsufficientCredentialsException(String message, CredentialsInfo credentialsInfo) { + super(message, credentialsInfo); + } + + /** + * Creates a new GuacamoleInsufficientCredentialsException with the given + * cause and associated credential information. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleInsufficientCredentialsException(Throwable cause, CredentialsInfo credentialsInfo) { + super(cause, credentialsInfo); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInvalidCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInvalidCredentialsException.java new file mode 100644 index 0000000..7986c5d --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInvalidCredentialsException.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.credentials; + +/** + * A security-related exception thrown when access is denied to a user because + * the provided credentials are invalid. Additional information describing + * the form of valid credentials is provided. + */ +public class GuacamoleInvalidCredentialsException extends GuacamoleCredentialsException { + + /** + * Creates a new GuacamoleInvalidCredentialsException with the given + * message, cause, and associated credential information. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleInvalidCredentialsException(String message, Throwable cause, + CredentialsInfo credentialsInfo) { + super(message, cause, credentialsInfo); + } + + /** + * Creates a new GuacamoleInvalidCredentialsException with the given + * message and associated credential information. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleInvalidCredentialsException(String message, CredentialsInfo credentialsInfo) { + super(message, credentialsInfo); + } + + /** + * Creates a new GuacamoleInvalidCredentialsException with the given cause + * and associated credential information. + * + * @param cause + * The cause of this exception. + * + * @param credentialsInfo + * Information describing the form of valid credentials. + */ + public GuacamoleInvalidCredentialsException(Throwable cause, CredentialsInfo credentialsInfo) { + super(cause, credentialsInfo); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/UserCredentials.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/UserCredentials.java new file mode 100644 index 0000000..7895c71 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/UserCredentials.java @@ -0,0 +1,218 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.credentials; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.form.Field; + +/** + * A fully-valid set of credentials and associated values. Each instance of + * this object should describe a full set of parameter name/value pairs which + * can be used to authenticate successfully, even if that success depends on + * factors not described by this object. + */ +public class UserCredentials extends CredentialsInfo { + + /** + * All fields required for valid credentials. + */ + private Map values; + + /** + * Creates a new UserCredentials object which requires the given fields and + * values. + * + * @param fields + * The fields to require. + * + * @param values + * The values required for each field, as a map of field name to + * correct value. + */ + public UserCredentials(Collection fields, Map values) { + super(fields); + this.values = values; + } + + /** + * Creates a new UserCredentials object which requires fields described by + * the given CredentialsInfo. The value required for each field in the + * CredentialsInfo is defined in the given Map. + * + * @param info + * The CredentialsInfo object describing the fields to require. + * + * @param values + * The values required for each field, as a map of field name to + * correct value. + */ + public UserCredentials(CredentialsInfo info, Map values) { + this(info.getFields(), values); + } + + /** + * Creates a new UserCredentials object which requires fields described by + * the given CredentialsInfo but does not yet have any defined values. + * + * @param info + * The CredentialsInfo object describing the fields to require. + */ + public UserCredentials(CredentialsInfo info) { + this(info, new HashMap()); + } + + /** + * Creates a new UserCredentials object which requires the given fields but + * does not yet have any defined values. + * + * @param fields + * The fields to require. + */ + public UserCredentials(Collection fields) { + this(fields, new HashMap()); + } + + /** + * Returns a map of field names to values which backs this UserCredentials + * object. Modifications to the returned map will directly affect the + * associated name/value pairs. + * + * @return + * A map of field names to their corresponding values which backs this + * UserCredentials object. + */ + public Map getValues() { + return values; + } + + /** + * Replaces the map backing this UserCredentials object with the given map. + * All field name/value pairs described by the original map are replaced by + * the name/value pairs in the given map. + * + * @param values + * The map of field names to their corresponding values which should be + * used to back this UserCredentials object. + */ + public void setValues(Map values) { + this.values = values; + } + + /** + * Returns the value defined by this UserCrendentials object for the field + * having the given name. + * + * @param name + * The name of the field whose value should be returned. + * + * @return + * The value of the field having the given name, or null if no value is + * defined for that field. + */ + public String getValue(String name) { + return values.get(name); + } + + /** + * Returns the value defined by this UserCrendentials object for the given + * field. + * + * @param field + * The field whose value should be returned. + * + * @return + * The value of the given field, or null if no value is defined for + * that field. + */ + public String getValue(Field field) { + return getValue(field.getName()); + } + + /** + * Sets the value of the field having the given name. Any existing value + * for that field is replaced. + * + * @param name + * The name of the field whose value should be assigned. + * + * @param value + * The value to assign to the field having the given name. + * + * @return + * The previous value of the field, or null if the value of the field + * was not previously defined. + */ + public String setValue(String name, String value) { + return values.put(name, value); + } + + /** + * Sets the value of the given field. Any existing value for that field is + * replaced. + * + * @param field + * The field whose value should be assigned. + * + * @param value + * The value to assign to the given field. + * + * @return + * The previous value of the field, or null if the value of the field + * was not previously defined. + */ + public String setValue(Field field, String value) { + return setValue(field.getName(), value); + } + + /** + * Removes (undefines) the value of the field having the given name, + * returning its previous value. If the field value was not defined, this + * function has no effect, and null is returned. + * + * @param name + * The name of the field whose value should be removed. + * + * @return + * The previous value of the field, or null if the value of the field + * was not previously defined. + */ + public String removeValue(String name) { + return values.remove(name); + } + + /** + * Removes (undefines) the value of the given field returning its previous + * value. If the field value was not defined, this function has no effect, + * and null is returned. + * + * @param field + * The field whose value should be removed. + * + * @return + * The previous value of the field, or null if the value of the field + * was not previously defined. + */ + public String removeValue(Field field) { + return removeValue(field.getName()); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/package-info.java new file mode 100644 index 0000000..1d57c0c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides classes which can be used to extend or replace the authentication + * functionality of the Guacamole web application. + */ +package org.apache.guacamole.net.auth; + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/ObjectPermission.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/ObjectPermission.java new file mode 100644 index 0000000..2918be6 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/ObjectPermission.java @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.permission; + + +/** + * A permission which affects a specific object, rather than the system as a + * whole. + */ +public class ObjectPermission implements Permission { + + /** + * Specific types of object-level permissions. Each permission type is + * related to a specific class of object-level operation. + */ + public enum Type { + + /** + * Read data within an object. + */ + READ, + + /** + * Update data within an object. + */ + UPDATE, + + /** + * Delete an object. + */ + DELETE, + + /** + * Change who has access to an object. + */ + ADMINISTER + + } + + /** + * The identifier of the GuacamoleConfiguration associated with the + * operation affected by this permission. + */ + private final String identifier; + + /** + * The type of operation affected by this permission. + */ + private final Type type; + + /** + * Creates a new ObjectPermission having the given type and identifier. + * The identifier must be the unique identifier assigned to the object + * associated with this permission by the AuthenticationProvider in use. + * + * @param type + * The type of operation affected by this permission. + * + * @param identifier + * The identifier of the object associated with the operation affected + * by this permission. + */ + public ObjectPermission(Type type, String identifier) { + + this.identifier = identifier; + this.type = type; + + } + + /** + * Returns the identifier of the specific object affected by this + * permission. + * + * @return The identifier of the specific object affected by this + * permission. + */ + public String getObjectIdentifier() { + return identifier; + } + + @Override + public Type getType() { + return type; + } + + @Override + public int hashCode() { + int hash = 5; + if (identifier != null) hash = 47 * hash + identifier.hashCode(); + if (type != null) hash = 47 * hash + type.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) { + + // Not equal if null or wrong type + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + final ObjectPermission other = (ObjectPermission) obj; + + // Not equal if different type + if (this.type != other.type) + return false; + + // If null identifier, equality depends on whether other identifier + // is null + if (identifier == null) + return other.identifier == null; + + // Otherwise, equality depends entirely on identifier + return identifier.equals(other.identifier); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/ObjectPermissionSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/ObjectPermissionSet.java new file mode 100644 index 0000000..638f952 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/ObjectPermissionSet.java @@ -0,0 +1,181 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.permission; + +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; + + +/** + * A set of permissions which affect arbitrary objects, where each object has + * an associated unique identifier. + */ +public interface ObjectPermissionSet extends PermissionSet { + + /** + * Tests whether the permission of the given type is granted for the + * object having the given identifier. + * + * @param permission + * The permission to check. + * + * @param identifier + * The identifier of the object affected by the permission being + * checked. + * + * @return + * true if the permission is granted, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while checking permissions, or if permissions + * cannot be checked due to lack of permissions to do so. + */ + boolean hasPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException; + + /** + * Adds the specified permission for the object having the given + * identifier. + * + * @param permission + * The permission to add. + * + * @param identifier + * The identifier of the object affected by the permission being + * added. + * + * @throws GuacamoleException + * If an error occurs while adding the permission, or if permission to + * add permissions is denied. + */ + void addPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException; + + /** + * Removes the specified permission for the object having the given + * identifier. + * + * @param permission + * The permission to remove. + * + * @param identifier + * The identifier of the object affected by the permission being + * added. + * + * @throws GuacamoleException + * If an error occurs while removing the permission, or if permission + * to remove permissions is denied. + */ + void removePermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException; + + /** + * Tests whether this user has the specified permissions for the objects + * having the given identifiers. The identifier of an object is returned + * in a new collection if at least one of the specified permissions is + * granted for that object. + * + * @param permissions + * The permissions to check. An identifier will be included in the + * resulting collection if at least one of these permissions is granted + * for the associated object + * + * @param identifiers + * The identifiers of the objects affected by the permissions being + * checked. + * + * @return + * A collection containing the subset of identifiers for which at least + * one of the specified permissions is granted. + * + * @throws GuacamoleException + * If an error occurs while checking permissions, or if permissions + * cannot be checked due to lack of permissions to do so. + */ + Collection getAccessibleObjects( + Collection permissions, + Collection identifiers) throws GuacamoleException; + + @Override + Set getPermissions() + throws GuacamoleException; + + @Override + void addPermissions(Set permissions) + throws GuacamoleException; + + @Override + void removePermissions(Set permissions) + throws GuacamoleException; + + /** + * An immutable instance of ObjectPermissionSet which contains no + * permissions. + */ + static final ObjectPermissionSet EMPTY_SET = new ObjectPermissionSet() { + + @Override + public boolean hasPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + return false; + } + + @Override + public void addPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public Collection getAccessibleObjects(Collection permissions, + Collection identifiers) throws GuacamoleException { + return Collections.emptySet(); + } + + @Override + public Set getPermissions() + throws GuacamoleException { + return Collections.emptySet(); + } + + @Override + public void addPermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + }; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/Permission.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/Permission.java new file mode 100644 index 0000000..73be29e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/Permission.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.permission; + + +/** + * A permission which affects a specific type of operation, where all available + * operation types are defined by an enumeration. + * + * @param + * The enumeration of all available operation types that this permission + * can affect. + */ +public interface Permission { + + /** + * Returns the type of operation affected by this permission. + * @return The type of operation affected by this permission. + */ + public Type getType(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/PermissionSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/PermissionSet.java new file mode 100644 index 0000000..d559775 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/PermissionSet.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.permission; + +import java.util.Set; +import org.apache.guacamole.GuacamoleException; + + +/** + * An arbitrary set of permissions. + * + * @param + * The type of permission stored within this PermissionSet. + */ +public interface PermissionSet { + + /** + * Returns a Set which contains all permissions granted within this + * permission set. + * + * @return + * A Set containing all permissions granted within this permission set. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions, or if permissions + * cannot be retrieved due to lack of permissions to do so. + */ + Set getPermissions() throws GuacamoleException; + + /** + * Adds the specified permissions, if not already granted. If a specified + * permission is already granted, no operation is performed regarding that + * permission. + * + * @param permissions + * The permissions to add. + * + * @throws GuacamoleException + * If an error occurs while adding the permissions, or if permission to + * add permissions is denied. + */ + void addPermissions(Set permissions) + throws GuacamoleException; + + /** + * Removes each of the specified permissions, if granted. If a specified + * permission is not granted, no operation is performed regarding that + * permission. + * + * @param permissions + * The permissions to remove. + * + * @throws GuacamoleException + * If an error occurs while removing the permissions, or if permission + * to remove permissions is denied. + */ + void removePermissions(Set permissions) + throws GuacamoleException; + + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/SystemPermission.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/SystemPermission.java new file mode 100644 index 0000000..c0c1734 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/SystemPermission.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.permission; + + +/** + * A permission which affects the system as a whole, rather than an individual + * object. + */ +public class SystemPermission implements Permission { + + /** + * Specific types of system-level permissions. Each permission type is + * related to a specific class of system-level operation. + */ + public enum Type { + + /** + * Create users. + */ + CREATE_USER, + + /** + * Create user groups. + */ + CREATE_USER_GROUP, + + /** + * Create connections. + */ + CREATE_CONNECTION, + + /** + * Create connection groups. + */ + CREATE_CONNECTION_GROUP, + + /** + * Create sharing profiles. + */ + CREATE_SHARING_PROFILE, + + /** + * Audit the system in general, which involves the ability to view + * active and historical connection records, user logon records, etc., + * but lacks permission to change any of these details (interact with + * active connections, update user accounts, etc). + */ + AUDIT, + + /** + * Administer the system in general, including adding permissions + * which affect the system (like user creation, connection creation, + * and system administration). + */ + ADMINISTER + + } + + /** + * The type of operation affected by this permission. + */ + private Type type; + + /** + * Creates a new SystemPermission with the given + * type. + * + * @param type The type of operation controlled by this permission. + */ + public SystemPermission(Type type) { + this.type = type; + } + + @Override + public Type getType() { + return type; + } + + @Override + public int hashCode() { + return type.hashCode(); + } + + @Override + public boolean equals(Object obj) { + + // Not equal if null or wrong type + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + final SystemPermission other = (SystemPermission) obj; + + // Compare types + if (type != other.type) + return false; + + return true; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/SystemPermissionSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/SystemPermissionSet.java new file mode 100644 index 0000000..52b62cd --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/SystemPermissionSet.java @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.permission; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; + + +/** + * A set of permissions which affects the system as a whole. + */ +public interface SystemPermissionSet extends PermissionSet { + + /** + * Tests whether the permission of the given type is granted. + * + * @param permission + * The permission to check. + * + * @return + * true if the permission is granted, false otherwise. + * + * @throws GuacamoleException + * If an error occurs while checking permissions, or if permissions + * cannot be checked due to lack of permissions to do so. + */ + boolean hasPermission(SystemPermission.Type permission) + throws GuacamoleException; + + /** + * Adds the specified permission. + * + * @param permission + * The permission to add. + * + * @throws GuacamoleException + * If an error occurs while adding the permission, or if permission to + * add permissions is denied. + */ + void addPermission(SystemPermission.Type permission) + throws GuacamoleException; + + /** + * Removes the specified permission. + * + * @param permission + * The permission to remove. + * + * @throws GuacamoleException + * If an error occurs while removing the permission, or if permission + * to remove permissions is denied. + */ + void removePermission(SystemPermission.Type permission) + throws GuacamoleException; + + @Override + Set getPermissions() throws GuacamoleException; + + @Override + void addPermissions(Set permissions) + throws GuacamoleException; + + @Override + void removePermissions(Set permissions) + throws GuacamoleException; + + /** + * An immutable instance of SystemPermissionSet which contains no + * permissions. + */ + static final SystemPermissionSet EMPTY_SET = new SystemPermissionSet() { + + @Override + public boolean hasPermission(SystemPermission.Type permission) + throws GuacamoleException { + return false; + } + + @Override + public void addPermission(SystemPermission.Type permission) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermission(SystemPermission.Type permission) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public Set getPermissions() + throws GuacamoleException { + return Collections.emptySet(); + } + + @Override + public void addPermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + }; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/package-info.java new file mode 100644 index 0000000..e8c639f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/permission/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides classes which describe the various permissions a Guacamole user + * can be granted. + */ +package org.apache.guacamole.net.auth.permission; + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java new file mode 100644 index 0000000..21aca57 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.ActivityRecordSet.SortableProperty; + +/** + * An immutable and empty ActivityRecordSet. + * + * @param + * The type of ActivityRecord contained within this set. + */ +public class SimpleActivityRecordSet + implements ActivityRecordSet { + + /** + * The records associated with this record set, if any. + */ + private final Collection records; + + /** + * Create a new SimpleActivityRecordSet that contains an empty set of + * records. + */ + public SimpleActivityRecordSet() { + records = Collections.emptyList(); + } + + /** + * Create a new SimpleActivityRecordSet that contains the provided records + * which will back this record set. + * + * @param records + * The records that this SimpleActivityRecordSet should contain. + */ + public SimpleActivityRecordSet(Collection records) { + this.records = Collections.unmodifiableCollection(records); + } + + @Override + public Collection asCollection() + throws GuacamoleException { + return records; + } + + @Override + public ActivityRecordSet contains(String value) + throws GuacamoleException { + return this; + } + + @Override + public ActivityRecordSet limit(int limit) + throws GuacamoleException { + return this; + } + + @Override + public ActivityRecordSet sort(SortableProperty property, + boolean desc) throws GuacamoleException { + return this; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java new file mode 100644 index 0000000..202181a --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Provides means of retrieving a set of named GuacamoleConfigurations for a + * given Credentials object. This is a simple AuthenticationProvider + * implementation intended to be easily extended. It is useful for simple + * authentication situations where access to web-based administration and + * complex users and permissions are not required. + * + * The interface provided by SimpleAuthenticationProvider is similar to that of + * the AuthenticationProvider interface of older Guacamole releases. + */ +public abstract class SimpleAuthenticationProvider + extends AbstractAuthenticationProvider { + + /** + * Given an arbitrary credentials object, returns a Map containing all + * configurations authorized by those credentials. The keys of this Map + * are Strings which uniquely identify each configuration. + * + * @param credentials The credentials to use to retrieve authorized + * configurations. + * @return A Map of all configurations authorized by the given credentials, + * or null if the credentials given are not authorized. + * @throws GuacamoleException If an error occurs while retrieving + * configurations. + */ + public abstract Map + getAuthorizedConfigurations(Credentials credentials) + throws GuacamoleException; + + /** + * AuthenticatedUser which contains its own predefined set of authorized + * configurations. + */ + private class SimpleAuthenticatedUser extends AbstractAuthenticatedUser { + + /** + * The credentials provided when this AuthenticatedUser was + * authenticated. + */ + private final Credentials credentials; + + /** + * The GuacamoleConfigurations that this AuthenticatedUser is + * authorized to use. + */ + private final Map configs; + + /** + * Creates a new SimpleAuthenticatedUser associated with the given + * credentials and having access to the given Map of + * GuacamoleConfigurations. + * + * @param credentials + * The credentials provided by the user when they authenticated. + * + * @param configs + * A Map of all GuacamoleConfigurations for which this user has + * access. The keys of this Map are Strings which uniquely identify + * each configuration. + */ + public SimpleAuthenticatedUser(Credentials credentials, Map configs) { + + // Store credentials and configurations + this.credentials = credentials; + this.configs = configs; + + // Pull username from credentials if it exists + String username = credentials.getUsername(); + if (username != null && !username.isEmpty()) + setIdentifier(username); + + // Otherwise generate a random username + else + setIdentifier(UUID.randomUUID().toString()); + + } + + /** + * Returns a Map containing all GuacamoleConfigurations that this user + * is authorized to use. The keys of this Map are Strings which + * uniquely identify each configuration. + * + * @return + * A Map of all configurations for which this user is authorized. + */ + public Map getAuthorizedConfigurations() { + return configs; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return SimpleAuthenticationProvider.this; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public Set getEffectiveUserGroups() { + return Collections.emptySet(); + } + + } + + @Override + public AuthenticatedUser authenticateUser(final Credentials credentials) + throws GuacamoleException { + + // Get configurations + Map configs = + getAuthorizedConfigurations(credentials); + + // Return as unauthorized if not authorized to retrieve configs + if (configs == null) + return null; + + return new SimpleAuthenticatedUser(credentials, configs); + + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + // Get configurations + Map configs = + getAuthorizedConfigurations(authenticatedUser.getCredentials()); + + // Return as unauthorized if not authorized to retrieve configs + if (configs == null) + return null; + + // Return user context restricted to authorized configs + return new SimpleUserContext(this, authenticatedUser.getIdentifier(), configs, true); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java new file mode 100644 index 0000000..8e59c3c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java @@ -0,0 +1,330 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.GuacamoleSocket; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.InetGuacamoleSocket; +import org.apache.guacamole.net.SSLGuacamoleSocket; +import org.apache.guacamole.net.SimpleGuacamoleTunnel; +import org.apache.guacamole.net.auth.AbstractConnection; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.ConnectionRecord; +import org.apache.guacamole.net.auth.GuacamoleProxyConfiguration; +import org.apache.guacamole.protocol.ConfiguredGuacamoleSocket; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.token.TokenFilter; + +/** + * A Connection implementation which establishes the underlying connection to + * guacd using the configuration information provided in guacamole.properties. + * Parameter tokens provided to connect() are automatically applied if + * explicitly requested. Tracking of active connections and connection history + * is not provided. + */ +public class SimpleConnection extends AbstractConnection { + + /** + * Backing configuration, containing all sensitive information. + */ + private GuacamoleConfiguration fullConfig; + + /** + * The proxy configuration describing how to connect to guacd. + */ + private GuacamoleProxyConfiguration proxyConfig; + + /** + * Whether parameter tokens in the underlying GuacamoleConfiguration should + * be automatically applied upon connecting. If false, parameter tokens + * will not be interpreted at all. + */ + private final boolean interpretTokens; + + /** + * The tokens which should apply strictly to the next call to + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation)}. + * This storage is intended as a temporary bridge allowing the old version + * of connect() to be overridden while still resulting in the same behavior + * as older versions of SimpleConnection. This storage should be + * removed once support for the old, deprecated connect() is removed. + */ + private final ThreadLocal> currentTokens = + new ThreadLocal>() { + + @Override + protected Map initialValue() { + return Collections.emptyMap(); + } + + }; + + /** + * Creates a completely uninitialized SimpleConnection. The name, + * identifier, and configuration of this SimpleConnection must eventually + * be set before the SimpleConnection may be used. Parameter tokens within + * the GuacamoleConfiguration eventually supplied with + * {@link #setConfiguration(org.apache.guacamole.protocol.GuacamoleConfiguration)} + * will not be interpreted. + */ + public SimpleConnection() { + this(false); + } + + /** + * Creates a completely uninitialized SimpleConnection. The name, + * identifier, and configuration of this SimpleConnection must eventually + * be set before the SimpleConnection may be used. Parameter tokens within + * the GuacamoleConfiguration eventually supplied with + * {@link #setConfiguration(org.apache.guacamole.protocol.GuacamoleConfiguration)} + * will not be interpreted unless explicitly requested. + * + * @param interpretTokens + * Whether parameter tokens in the underlying GuacamoleConfiguration + * should be automatically applied upon connecting. If false, parameter + * tokens will not be interpreted at all. + */ + public SimpleConnection(boolean interpretTokens) { + this.interpretTokens = interpretTokens; + } + + /** + * Creates a new SimpleConnection having the given identifier and + * GuacamoleConfiguration. Parameter tokens within the + * GuacamoleConfiguration will not be interpreted unless explicitly + * requested. + * + * @param name + * The name to associate with this connection. + * + * @param identifier + * The identifier to associate with this connection. + * + * @param config + * The configuration describing how to connect to this connection. + */ + public SimpleConnection(String name, String identifier, + GuacamoleConfiguration config) { + this(name, identifier, config, false); + } + + /** + * Creates a new SimpleConnection having the given identifier and + * GuacamoleConfiguration. Parameter tokens will be interpreted if + * explicitly requested. + * + * @param name + * The name to associate with this connection. + * + * @param identifier + * The identifier to associate with this connection. + * + * @param config + * The configuration describing how to connect to this connection. + * + * @param interpretTokens + * Whether parameter tokens in the underlying GuacamoleConfiguration + * should be automatically applied upon connecting. If false, parameter + * tokens will not be interpreted at all. + */ + public SimpleConnection(String name, String identifier, + GuacamoleConfiguration config, boolean interpretTokens) { + + super.setName(name); + super.setIdentifier(identifier); + super.setConfiguration(config); + + this.fullConfig = config; + this.interpretTokens = interpretTokens; + + } + + /** + * Creates a new SimpleConnection having the given identifier, + * GuacamoleConfiguration, and GuacamoleProxyConfiguration. Parameter tokens + * will be interpreted if explicitly requested. + * + * @param name + * The name to associate with this connection. + * + * @param identifier + * The identifier to associate with this connection. + * + * @param proxyConfig + * The Guacamole proxy configuration describing how the connection to + * guacd should be established, or null if the default settings will be + * used. + * + * @param config + * The configuration describing how to connect to this connection. + * + * @param interpretTokens + * Whether parameter tokens in the underlying GuacamoleConfiguration + * should be automatically applied upon connecting. If false, parameter + * tokens will not be interpreted at all. + */ + public SimpleConnection(String name, String identifier, + GuacamoleProxyConfiguration proxyConfig, + GuacamoleConfiguration config, boolean interpretTokens) { + + this(name, identifier, config, interpretTokens); + this.proxyConfig = proxyConfig; + + } + + /** + * Returns the GuacamoleConfiguration describing how to connect to this + * connection. Unlike {@link #getConfiguration()}, which is allowed to omit + * or tokenize information, the GuacamoleConfiguration returned by this + * function will always be the full configuration to be used to establish + * the connection, as provided when this SimpleConnection was created or via + * {@link #setConfiguration(org.apache.guacamole.protocol.GuacamoleConfiguration)}. + * + * @return + * The full GuacamoleConfiguration describing how to connect to this + * connection, without any information omitted or tokenized. + */ + protected GuacamoleConfiguration getFullConfiguration() { + return fullConfig; + } + + @Override + public void setConfiguration(GuacamoleConfiguration config) { + super.setConfiguration(config); + this.fullConfig = config; + } + + @Override + public int getActiveConnections() { + return 0; + } + + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + // Do nothing - there are no attributes + } + + @Override + @Deprecated + public GuacamoleTunnel connect(GuacamoleClientInformation info) + throws GuacamoleException { + + // Retrieve proxy configuration from environment if we don't have one + if (proxyConfig == null) + proxyConfig = LocalEnvironment.getInstance().getDefaultGuacamoleProxyConfiguration(); + + // Get guacd connection parameters + String hostname = proxyConfig.getHostname(); + int port = proxyConfig.getPort(); + + // Apply tokens to config parameters + GuacamoleConfiguration filteredConfig = new GuacamoleConfiguration(getFullConfiguration()); + new TokenFilter(currentTokens.get()).filterValues(filteredConfig.getParameters()); + + GuacamoleSocket socket; + + // Determine socket type based on required encryption method + switch (proxyConfig.getEncryptionMethod()) { + + // If guacd requires SSL, use it + case SSL: + socket = new ConfiguredGuacamoleSocket( + new SSLGuacamoleSocket(hostname, port), + filteredConfig, info + ); + break; + + // Connect directly via TCP if encryption is not enabled + case NONE: + socket = new ConfiguredGuacamoleSocket( + new InetGuacamoleSocket(hostname, port), + filteredConfig, info + ); + break; + + // Abort if encryption method is unknown + default: + throw new GuacamoleServerException("Unimplemented encryption method."); + + } + + return new SimpleGuacamoleTunnel(socket); + + } + + /** + * {@inheritDoc} + * + *

    This implementation will connect using the GuacamoleConfiguration + * returned by {@link #getFullConfiguration()}, honoring the + * "guacd-hostname", "guacd-port", and "guacd-ssl" properties set within + * guacamole.properties. Parameter tokens will be taken into account if + * the SimpleConnection was explicitly requested to do so when created. + * + *

    Implementations requiring more complex behavior should consider using + * the {@link AbstractConnection} base class or implementing + * {@link org.apache.guacamole.net.auth.Connection} directly. + */ + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Make received tokens available within the legacy connect() strictly + // in context of the current connect() call + try { + + // Automatically filter configurations only if explicitly + // configured to do so + if (interpretTokens) + currentTokens.set(tokens); + + return connect(info); + + } + finally { + currentTokens.remove(); + } + + } + + @Override + public Date getLastActive() { + return null; + } + + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet<>(); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionDirectory.java new file mode 100644 index 0000000..77eaf98 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionDirectory.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.net.auth.Connection; + +/** + * An extremely simple read-only implementation of a Directory of + * GuacamoleConfigurations which provides access to a pre-defined Map of + * GuacamoleConfigurations. + * + * @deprecated Use {@link SimpleDirectory} instead. + */ +@Deprecated +public class SimpleConnectionDirectory extends SimpleDirectory { + + /** + * The Map of Connections to provide access to. + */ + private final Map connections = + new HashMap(); + + /** + * Creates a new SimpleConnectionDirectory which provides access to the + * connections contained within the given Map. + * + * @param connections + * A Collection of all connections that should be present in this + * connection directory. + */ + public SimpleConnectionDirectory(Collection connections) { + + // Add all given connections + for (Connection connection : connections) + this.connections.put(connection.getIdentifier(), connection); + + // Use the connection map to back the underlying directory + super.setObjects(this.connections); + + } + + /** + * An internal method for modifying the Connections in this Directory. + * Returns the previous connection for the given identifier, if found. + * + * @param connection The connection to add or update the Directory with. + * @return The previous connection for the connection identifier, if found. + */ + public Connection putConnection(Connection connection) { + return connections.put(connection.getIdentifier(), connection); + } + + /** + * An internal method for removing a Connection from this Directory. + * @param identifier The identifier of the Connection to remove. + * @return The previous connection for the given identifier, if found. + */ + public Connection removeConnection(String identifier) { + return connections.remove(identifier); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionGroup.java new file mode 100644 index 0000000..b2f7de0 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionGroup.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.AbstractConnectionGroup; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * An extremely simple read-only implementation of a ConnectionGroup which + * returns the connection and connection group identifiers it was constructed + * with. Load balancing across this connection group is not allowed. + */ +public class SimpleConnectionGroup extends AbstractConnectionGroup { + + /** + * The identifiers of all connections in this group. + */ + private final Set connectionIdentifiers; + + /** + * The identifiers of all connection groups in this group. + */ + private final Set connectionGroupIdentifiers; + + /** + * Creates a new SimpleConnectionGroup having the given name and identifier + * which will expose the given contents. + * + * @param name + * The name to associate with this connection group. + * + * @param identifier + * The identifier to associate with this connection group. + * + * @param connectionIdentifiers + * The connection identifiers to expose when requested. + * + * @param connectionGroupIdentifiers + * The connection group identifiers to expose when requested. + */ + public SimpleConnectionGroup(String name, String identifier, + Collection connectionIdentifiers, + Collection connectionGroupIdentifiers) { + + // Set name + setName(name); + + // Set identifier + setIdentifier(identifier); + + // Set group type + setType(ConnectionGroup.Type.ORGANIZATIONAL); + + // Populate contents + this.connectionIdentifiers = new HashSet(connectionIdentifiers); + this.connectionGroupIdentifiers = new HashSet(connectionGroupIdentifiers); + + } + + @Override + public int getActiveConnections() { + return 0; + } + + @Override + public Set getConnectionIdentifiers() { + return connectionIdentifiers; + } + + @Override + public Set getConnectionGroupIdentifiers() { + return connectionGroupIdentifiers; + } + + @Override + public Map getAttributes() { + return Collections.emptyMap(); + } + + @Override + public void setAttributes(Map attributes) { + // Do nothing - there are no attributes + } + + @Override + @Deprecated + public GuacamoleTunnel connect(GuacamoleClientInformation info) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + return connect(info); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionGroupDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionGroupDirectory.java new file mode 100644 index 0000000..e087054 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionGroupDirectory.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.net.auth.ConnectionGroup; + +/** + * An extremely simple read-only implementation of a Directory of + * ConnectionGroup which provides which provides access to a pre-defined + * Collection of ConnectionGroups. + * + * @deprecated Use {@link SimpleDirectory} instead. + */ +@Deprecated +public class SimpleConnectionGroupDirectory + extends SimpleDirectory { + + /** + * The Map of ConnectionGroups to provide access to. + */ + private final Map connectionGroups = + new HashMap(); + + /** + * Creates a new SimpleConnectionGroupDirectory which contains the given + * groups. + * + * @param groups A Collection of all groups that should be present in this + * connection group directory. + */ + public SimpleConnectionGroupDirectory(Collection groups) { + + // Add all given groups + for (ConnectionGroup group : groups) + connectionGroups.put(group.getIdentifier(), group); + + // Use the connection group map to back the underlying AbstractDirectory + super.setObjects(connectionGroups); + + } + + /** + * An internal method for modifying the ConnectionGroups in this Directory. + * Returns the previous connection group for the given identifier, if found. + * + * @param connectionGroup The connection group to add or update the + * Directory with. + * @return The previous connection group for the connection group + * identifier, if found. + */ + public ConnectionGroup putConnectionGroup(ConnectionGroup connectionGroup) { + return connectionGroups.put(connectionGroup.getIdentifier(), connectionGroup); + } + + /** + * An internal method for removing a ConnectionGroup from this Directory. + * + * @param identifier The identifier of the ConnectionGroup to remove. + * @return The previous connection group for the given identifier, if found. + */ + public ConnectionGroup removeConnectionGroup(String identifier) { + return connectionGroups.remove(identifier); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java new file mode 100644 index 0000000..41971c9 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ConnectionRecord; + +/** + * An immutable and empty ConnectionRecordSet. + * + * @deprecated + * Use {@link SimpleActivityRecordSet}<{@link ConnectionRecord}> + * instead. + */ +@Deprecated +public class SimpleConnectionRecordSet implements org.apache.guacamole.net.auth.ConnectionRecordSet { + + @Override + public Collection asCollection() + throws GuacamoleException { + return Collections.emptyList(); + } + + @Override + public org.apache.guacamole.net.auth.ConnectionRecordSet contains(String value) + throws GuacamoleException { + return this; + } + + @Override + public org.apache.guacamole.net.auth.ConnectionRecordSet limit(int limit) + throws GuacamoleException { + return this; + } + + @Override + public org.apache.guacamole.net.auth.ConnectionRecordSet sort(SortableProperty property, boolean desc) + throws GuacamoleException { + return this; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java new file mode 100644 index 0000000..3865570 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * An extremely simple read-only implementation of a Directory which provides + * access to a pre-defined Map of arbitrary objects. Any changes to the Map + * will affect the available contents of this SimpleDirectory. + * + * @param + * The type of objects stored within this SimpleDirectory. + */ +public class SimpleDirectory + implements Directory { + + /** + * The Map of objects to provide access to. + */ + private Map objects = Collections.emptyMap(); + + /** + * Creates a new empty SimpleDirectory which does not provide access to + * any objects. + */ + public SimpleDirectory() { + } + + /** + * Creates a new SimpleDirectory which provides access to the objects + * contained within the given Map. The given Map will be used to back all + * operations on the SimpleDirectory. + * + * @param objects + * The Map of objects to provide access to. + */ + public SimpleDirectory(Map objects) { + this.objects = objects; + } + + /** + * Creates a new SimpleDirectory which provides access to the given object. + * + * @param object + * The object to provide access to. + */ + public SimpleDirectory(ObjectType object) { + this(Collections.singletonMap(object.getIdentifier(), object)); + } + + /** + * Creates a new SimpleDirectory which provides access to the given + * objects. Note that a new Map will be created to store the given objects. + * If the objects are already available in Map form, it is more efficient + * to use the {@link #SimpleDirectory(java.util.Map)} constructor. + * + * @param objects + * The objects that should be present in this directory. + */ + @SafeVarargs + public SimpleDirectory(ObjectType... objects) { + this(Arrays.asList(objects)); + } + + /** + * Creates a new SimpleDirectory which provides access to the + * objects contained within the Collection. Note that a new Map will be + * created to store the given objects. If the objects are already available + * in Map form, it is more efficient to use the + * {@link #SimpleDirectory(java.util.Map)} constructor. + * + * @param objects + * A Collection of all objects that should be present in this directory. + */ + public SimpleDirectory(Collection objects) { + this.objects = new HashMap(objects.size()); + for (ObjectType object : objects) + this.objects.put(object.getIdentifier(), object); + } + + /** + * Sets the Map which backs this SimpleDirectory. Future function calls + * which retrieve objects from this SimpleDirectory will use the provided + * Map. + * + * @param objects + * The Map of objects to provide access to. + */ + protected void setObjects(Map objects) { + this.objects = objects; + } + + /** + * Returns the Map which currently backs this SimpleDirectory. Changes to + * this Map will affect future function calls that retrieve objects from + * this SimpleDirectory. + * + * @return + * The Map of objects which currently backs this SimpleDirectory. + */ + protected Map getObjects() { + return objects; + } + + @Override + public ObjectType get(String identifier) + throws GuacamoleException { + return objects.get(identifier); + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + + // Create collection which has an appropriate initial size + Collection foundObjects = new ArrayList(identifiers.size()); + + // Populate collection with matching objects + for (String identifier : identifiers) { + + // Add the object which has the current identifier, if any + ObjectType object = objects.get(identifier); + if (object != null) + foundObjects.add(object); + + } + + return foundObjects; + + } + + @Override + public Set getIdentifiers() throws GuacamoleException { + return objects.keySet(); + } + + @Override + public void add(ObjectType connection) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void update(ObjectType connection) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void remove(String identifier) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleObjectPermissionSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleObjectPermissionSet.java new file mode 100644 index 0000000..cbb298e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleObjectPermissionSet.java @@ -0,0 +1,201 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * A read-only implementation of ObjectPermissionSet which uses a backing Set + * of Permissions to determine which permissions are present. + */ +public class SimpleObjectPermissionSet implements ObjectPermissionSet { + + /** + * The set of all permissions currently granted. + */ + private Set permissions = Collections.emptySet(); + + /** + * Creates a new empty SimpleObjectPermissionSet. If you are not extending + * SimpleObjectPermissionSet and only need an immutable, empty + * ObjectPermissionSet, consider using {@link ObjectPermissionSet#EMPTY_SET} + * instead. + */ + public SimpleObjectPermissionSet() { + } + + /** + * Creates a new set of ObjectPermissions for each possible combination of + * the given identifiers and permission types. + * + * @param identifiers + * The identifiers which should have one ObjectPermission for each of + * the given permission types. + * + * @param types + * The permissions which should be granted for each of the given + * identifiers. + * + * @return + * A new set of ObjectPermissions containing one ObjectPermission for + * each possible combination of the given identifiers and permission + * types. + */ + private static Set createPermissions(Collection identifiers, + Collection types) { + + // Add a permission of each type to the set for each identifier given + Set permissions = new HashSet<>(identifiers.size()); + types.forEach(type -> { + identifiers.forEach(identifier -> permissions.add(new ObjectPermission(type, identifier))); + }); + + return permissions; + + } + + /** + * Creates a new SimpleObjectPermissionSet which contains permissions for + * all possible unique combinations of the given identifiers and permission + * types. + * + * @param identifiers + * The identifiers which should be associated permissions having each + * of the given permission types. + * + * @param types + * The types of permissions which should be granted for each of the + * given identifiers. + */ + public SimpleObjectPermissionSet(Collection identifiers, + Collection types) { + this(createPermissions(identifiers, types)); + } + + /** + * Creates a new SimpleObjectPermissionSet which contains only READ + * permissions for each of the given identifiers. + * + * @param identifiers + * The identifiers which should each be associated with READ + * permission. + */ + public SimpleObjectPermissionSet(Collection identifiers) { + this(identifiers, Collections.singletonList(ObjectPermission.Type.READ)); + } + + /** + * Creates a new SimpleObjectPermissionSet which contains the permissions + * within the given Set. + * + * @param permissions + * The Set of permissions this SimpleObjectPermissionSet should + * contain. + */ + public SimpleObjectPermissionSet(Set permissions) { + this.permissions = permissions; + } + + /** + * Sets the Set which backs this SimpleObjectPermissionSet. Future function + * calls on this SimpleObjectPermissionSet will use the provided Set. + * + * @param permissions + * The Set of permissions this SimpleObjectPermissionSet should + * contain. + */ + protected void setPermissions(Set permissions) { + this.permissions = permissions; + } + + @Override + public Set getPermissions() { + return permissions; + } + + @Override + public boolean hasPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + + ObjectPermission objectPermission = + new ObjectPermission(permission, identifier); + + return permissions.contains(objectPermission); + + } + + @Override + public void addPermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermission(ObjectPermission.Type permission, + String identifier) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public Collection getAccessibleObjects( + Collection permissionTypes, + Collection identifiers) throws GuacamoleException { + + Collection accessibleObjects = new ArrayList(permissions.size()); + + // For each identifier/permission combination + for (String identifier : identifiers) { + for (ObjectPermission.Type permissionType : permissionTypes) { + + // Add identifier if at least one requested permission is granted + ObjectPermission permission = new ObjectPermission(permissionType, identifier); + if (permissions.contains(permission)) { + accessibleObjects.add(identifier); + break; + } + + } + } + + return accessibleObjects; + + } + + @Override + public void addPermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleRelatedObjectSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleRelatedObjectSet.java new file mode 100644 index 0000000..3796c43 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleRelatedObjectSet.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.auth.RelatedObjectSet; + +/** + * A read-only implementation of RelatedObjectSet which uses a backing Set + * of identifiers to determine which objects are present. + */ +public class SimpleRelatedObjectSet implements RelatedObjectSet { + + /** + * A set containing the identifiers of all objects currently present. + */ + private Set identifiers = Collections.emptySet(); + + /** + * Creates a new empty SimpleRelatedObjectSet. If you are not extending + * SimpleRelatedObjectSet and only need an immutable, empty + * RelatedObjectSet, consider using {@link RelatedObjectSet#EMPTY_SET} + * instead. + */ + public SimpleRelatedObjectSet() { + } + + /** + * Creates a new SimpleRelatedObjectSet which contains the objects having + * the identifiers within the given Set. The given Set backs the contents + * of the new SimpleRelatedObjectSet. While the SimpleRelatedObjectSet is + * read-only, any changes to the underlying Set will be reflected in the + * SimpleRelatedObjectSet. + * + * @param identifiers + * The Set containing the identifiers of all objects which should be + * present within the new SimpleRelatedObjectSet. + */ + public SimpleRelatedObjectSet(Set identifiers) { + this.identifiers = identifiers; + } + + /** + * Replaces the Set of object identifiers which backs this + * SimpleRelatedObjectSet. Future function calls on this + * SimpleRelatedObjectSet will instead use the provided Set. + * + * @param identifiers + * The Set containing the identifiers of all objects which should be + * present within this SimpleRelatedObjectSet. + */ + protected void setObjects(Set identifiers) { + this.identifiers = identifiers; + } + + @Override + public Set getObjects() { + return identifiers; + } + + @Override + public void addObjects(Set identifiers) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removeObjects(Set identifiers) throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleSystemPermissionSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleSystemPermissionSet.java new file mode 100644 index 0000000..24c6d2d --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleSystemPermissionSet.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collections; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * A read-only implementation of SystemPermissionSet which uses a backing Set + * of Permissions to determine which permissions are present. + */ +public class SimpleSystemPermissionSet implements SystemPermissionSet { + + /** + * The set of all permissions currently granted. + */ + private Set permissions = Collections.emptySet(); + + /** + * Creates a new empty SimpleSystemPermissionSet. If you are not extending + * SimpleSystemPermissionSet and only need an immutable, empty + * SystemPermissionSet, consider using {@link SystemPermissionSet#EMPTY_SET} + * instead. + */ + public SimpleSystemPermissionSet() { + } + + /** + * Creates a new SimpleSystemPermissionSet which contains the permissions + * within the given Set. + * + * @param permissions + * The Set of permissions this SimpleSystemPermissionSet should + * contain. + */ + public SimpleSystemPermissionSet(Set permissions) { + this.permissions = permissions; + } + + /** + * Sets the Set which backs this SimpleSystemPermissionSet. Future function + * calls on this SimpleSystemPermissionSet will use the provided Set. + * + * @param permissions + * The Set of permissions this SimpleSystemPermissionSet should + * contain. + */ + protected void setPermissions(Set permissions) { + this.permissions = permissions; + } + + @Override + public Set getPermissions() { + return permissions; + } + + @Override + public boolean hasPermission(SystemPermission.Type permission) + throws GuacamoleException { + + SystemPermission systemPermission = new SystemPermission(permission); + return permissions.contains(systemPermission); + + } + + @Override + public void addPermission(SystemPermission.Type permission) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermission(SystemPermission.Type permission) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void addPermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + + @Override + public void removePermissions(Set permissions) + throws GuacamoleException { + throw new GuacamoleSecurityException("Permission denied."); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java new file mode 100644 index 0000000..8e349e2 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractUser; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; + +/** + * A read-only User implementation which has no permissions. Implementations + * that need to define permissions should extend this class and override the + * associated getters. + */ +public class SimpleUser extends AbstractUser { + + /** + * All user permissions granted to this user. + */ + private final Set userPermissions = new HashSet<>(); + + /** + * All connection permissions granted to this user. + */ + private final Set connectionPermissions = new HashSet<>(); + + /** + * All connection group permissions granted to this user. + */ + private final Set connectionGroupPermissions = new HashSet<>(); + + /** + * Creates a completely uninitialized SimpleUser. + */ + public SimpleUser() { + } + + /** + * Creates a new SimpleUser having the given username. + * + * @param username + * The username to assign to this SimpleUser. + */ + public SimpleUser(String username) { + super.setIdentifier(username); + } + + /** + * Adds a new READ permission to the given set of permissions for each of + * the given identifiers. + * + * @param permissions + * The set of permissions to add READ permissions to. + * + * @param identifiers + * The identifiers which should each have a corresponding READ + * permission added to the given set. + */ + private void addReadPermissions(Set permissions, + Collection identifiers) { + + // Add a READ permission to the set for each identifier given + identifiers.forEach(identifier -> + permissions.add(new ObjectPermission( + ObjectPermission.Type.READ, + identifier) + )); + + } + + /** + * Creates a new SimpleUser having the given username and READ access to + * the connections and connection groups having the given identifiers. + * + * @param username + * The username to assign to this SimpleUser. + * + * @param connectionIdentifiers + * The identifiers of all connections this user has READ access to. + * + * @param connectionGroupIdentifiers + * The identifiers of all connection groups this user has READ access + * to. + * + * @deprecated + * Extend and override the applicable permission set getters instead, + * relying on SimpleUser to expose no permissions by default for all + * permission sets that aren't overridden. See {@link SimpleObjectPermissionSet} + * for convenient methods of providing a read-only permission set with + * specific permissions. + */ + @Deprecated + public SimpleUser(String username, + Collection connectionIdentifiers, + Collection connectionGroupIdentifiers) { + + this(username); + + // Add permissions + addReadPermissions(connectionPermissions, connectionIdentifiers); + addReadPermissions(connectionGroupPermissions, connectionGroupIdentifiers); + + } + + /** + * Creates a new SimpleUser having the given username and READ access to + * the users, connections, and groups having the given identifiers. + * + * @param username + * The username to assign to this SimpleUser. + * + * @param userIdentifiers + * The identifiers of all users this user has READ access to. + * + * @param connectionIdentifiers + * The identifiers of all connections this user has READ access to. + * + * @param connectionGroupIdentifiers + * The identifiers of all connection groups this user has READ access + * to. + * + * @deprecated + * Extend and override the applicable permission set getters instead, + * relying on SimpleUser to expose no permissions by default for all + * permission sets that aren't overridden. See {@link SimpleObjectPermissionSet} + * for convenient methods of providing a read-only permission set with + * specific permissions. + */ + @Deprecated + public SimpleUser(String username, + Collection userIdentifiers, + Collection connectionIdentifiers, + Collection connectionGroupIdentifiers) { + + this(username); + + // Add permissions + addReadPermissions(userPermissions, userIdentifiers); + addReadPermissions(connectionPermissions, connectionIdentifiers); + addReadPermissions(connectionGroupPermissions, connectionGroupIdentifiers); + + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + return new SimpleObjectPermissionSet(connectionPermissions); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + return new SimpleObjectPermissionSet(connectionGroupPermissions); + } + + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + return new SimpleObjectPermissionSet(userPermissions); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java new file mode 100644 index 0000000..2cefee2 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractUserContext; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * An extremely simple UserContext implementation which provides access to + * a defined and restricted set of GuacamoleConfigurations. Access to + * querying or modifying either users or permissions is denied. + */ +public class SimpleUserContext extends AbstractUserContext { + + /** + * The AuthenticationProvider that created this UserContext. + */ + private final AuthenticationProvider authProvider; + + /** + * The unique identifier (username) of the user whose permissions dictate + * the configurations accessible within this UserContext. + */ + private final String username; + + /** + * The Directory with access to all connections within the root group + * associated with this UserContext. + */ + private final Directory connectionDirectory; + + /** + * Creates a new SimpleUserContext which provides access to only those + * configurations within the given Map. The username is set to the + * ANONYMOUS_IDENTIFIER defined by AuthenticatedUser, effectively declaring + * the current user as anonymous. Parameter tokens within the given + * GuacamoleConfigurations will not be interpreted. + * + * @param authProvider + * The AuthenticationProvider creating this UserContext. + * + * @param configs + * A Map of all configurations for which the user associated with this + * UserContext has read access. + */ + public SimpleUserContext(AuthenticationProvider authProvider, + Map configs) { + this(authProvider, AuthenticatedUser.ANONYMOUS_IDENTIFIER, configs); + } + + /** + * Creates a new SimpleUserContext for the user with the given username + * which provides access to only those configurations within the given Map. + * Parameter tokens within the given GuacamoleConfigurations will not be + * interpreted. + * + * @param authProvider + * The AuthenticationProvider creating this UserContext. + * + * @param username + * The username of the user associated with this UserContext. + * + * @param configs + * A Map of all configurations for which the user associated with + * this UserContext has read access. + */ + public SimpleUserContext(AuthenticationProvider authProvider, + String username, Map configs) { + this(authProvider, username, configs, false); + } + + /** + * Creates a new SimpleUserContext for the user with the given username + * which provides access to only those configurations within the given Map. + * Parameter tokens within the given GuacamoleConfigurations will be + * interpreted if explicitly requested. + * + * @param authProvider + * The AuthenticationProvider creating this UserContext. + * + * @param username + * The username of the user associated with this UserContext. + * + * @param configs + * A Map of all configurations for which the user associated with + * this UserContext has read access. + * + * @param interpretTokens + * Whether parameter tokens in the underlying GuacamoleConfigurations + * should be automatically applied upon connecting. If false, parameter + * tokens will not be interpreted at all. + */ + public SimpleUserContext(AuthenticationProvider authProvider, + String username, Map configs, + boolean interpretTokens) { + + // Produce map of connections from given configs + Map connections = new ConcurrentHashMap(configs.size()); + for (Map.Entry configEntry : configs.entrySet()) { + + // Get connection identifier and configuration + String identifier = configEntry.getKey(); + GuacamoleConfiguration config = configEntry.getValue(); + + // Add as simple connection + Connection connection = new SimpleConnection(identifier, identifier, config, interpretTokens); + connection.setParentIdentifier(DEFAULT_ROOT_CONNECTION_GROUP); + connections.put(identifier, connection); + + } + + this.username = username; + this.authProvider = authProvider; + this.connectionDirectory = new SimpleDirectory(connections); + + } + + @Override + public User self() { + return new SimpleUser(username) { + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(getConnectionDirectory().getIdentifiers()); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { + return new SimpleObjectPermissionSet(getConnectionGroupDirectory().getIdentifiers()); + } + + }; + } + + @Override + public Object getResource() throws GuacamoleException { + return null; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return connectionDirectory; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserDirectory.java new file mode 100644 index 0000000..bb5e37a --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserDirectory.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import java.util.Collections; +import org.apache.guacamole.net.auth.User; + +/** + * An extremely simple read-only implementation of a Directory of Users which + * provides access to a single pre-defined User. + * + * @deprecated Use {@link SimpleDirectory} instead. + */ +@Deprecated +public class SimpleUserDirectory extends SimpleDirectory { + + /** + * Creates a new SimpleUserDirectory which provides access to the single + * user provided. + * + * @param user The user to provide access to. + */ + public SimpleUserDirectory(User user) { + super(Collections.singletonMap(user.getIdentifier(), user)); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserGroup.java new file mode 100644 index 0000000..be52d16 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserGroup.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth.simple; + +import org.apache.guacamole.net.auth.AbstractUserGroup; + +/** + * A read-only UserGroup implementation which has no members and no + * permissions. Implementations that need to define members or permissions + * should extend this class and override the associated getters. + */ +public class SimpleUserGroup extends AbstractUserGroup { + + /** + * Creates a completely uninitialized SimpleUserGroup. + */ + public SimpleUserGroup() { + } + + /** + * Creates a new SimpleUserGroup having the given identifier. + * + * @param identifier + * The identifier to assign to this SimpleUserGroup. + */ + public SimpleUserGroup(String identifier) { + super.setIdentifier(identifier); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/package-info.java new file mode 100644 index 0000000..3ac95c3 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/package-info.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides a basic AuthenticationProvider base class that can be used to create + * simple AuthenticationProviders in the same way allowed by the old + * authentication API. + */ +package org.apache.guacamole.net.auth.simple; + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/ApplicationShutdownEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/ApplicationShutdownEvent.java new file mode 100644 index 0000000..ba7f50b --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/ApplicationShutdownEvent.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.event.listener.Listener; + +/** + * Event that is dispatched when the web application has nearly completely shut + * down, including the authentication/authorization portion of extensions. Any + * installed extensions are still loaded (such that they may receive this event + * via {@link Listener#handleEvent(java.lang.Object)}, but their authentication + * providers will have been shut down via {@link AuthenticationProvider#shutdown()}, + * and resources from user sessions will have been closed and released via + * {@link UserContext#invalidate()}. + */ +public interface ApplicationShutdownEvent { +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/ApplicationStartedEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/ApplicationStartedEvent.java new file mode 100644 index 0000000..cf2ae2f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/ApplicationStartedEvent.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +/** + * Event that is dispatched when the web application has finished starting up, + * including all extensions. This event indicates only that the web application + * startup process has completed and all extensions have been loaded. It does + * not indicate whether all extensions have started successfully. + */ +public interface ApplicationStartedEvent { +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationFailureEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationFailureEvent.java new file mode 100644 index 0000000..8705900 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationFailureEvent.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.event.listener.Listener; + +/** + * An event which is triggered whenever a user's credentials fail to be + * authenticated. The credentials that failed to be authenticated are included + * within this event, and can be retrieved using getCredentials(). + */ +public class AuthenticationFailureEvent implements AuthenticationProviderEvent, + CredentialEvent, FailureEvent { + + /** + * The credentials which failed authentication. + */ + private final Credentials credentials; + + /** + * The AuthenticationProvider that encountered the failure. This may be + * null if the AuthenticationProvider is not known, such as if the failure + * is caused by every AuthenticationProvider passively refusing to + * authenticate the user but without explicitly rejecting the user + * (returning null for calls to {@link AuthenticationProvider#authenticateUser(org.apache.guacamole.net.auth.Credentials)}), + * or if the failure is external to any installed AuthenticationProvider + * (such as within a {@link Listener}. + */ + private final AuthenticationProvider authProvider; + + /** + * The Throwable that was thrown resulting in the failure, if any. This + * may be null if authentication failed without a known error, such as if + * the failure is caused by every AuthenticationProvider passively refusing + * to authenticate the user but without explicitly rejecting the user + * (returning null for calls to {@link AuthenticationProvider#authenticateUser(org.apache.guacamole.net.auth.Credentials)}). + */ + private final Throwable failure; + + /** + * Creates a new AuthenticationFailureEvent which represents a failure + * to authenticate the given credentials where there is no specific + * AuthenticationProvider nor Throwable associated with the failure. + * + * @param credentials + * The credentials which failed authentication. + */ + public AuthenticationFailureEvent(Credentials credentials) { + this(credentials, null); + } + + /** + * Creates a new AuthenticationFailureEvent which represents a failure + * to authenticate the given credentials where there is no specific + * AuthenticationProvider causing the failure. + * + * @param credentials + * The credentials which failed authentication. + * + * @param failure + * The Throwable that was thrown resulting in the failure, or null if + * there is no such Throwable. + */ + public AuthenticationFailureEvent(Credentials credentials, Throwable failure) { + this(credentials, null, failure); + } + + /** + * Creates a new AuthenticationFailureEvent which represents a failure + * to authenticate the given credentials. + * + * @param credentials + * The credentials which failed authentication. + * + * @param authProvider + * The AuthenticationProvider that caused the failure, or null if there + * is no such AuthenticationProvider. + * + * @param failure + * The Throwable that was thrown resulting in the failure, or null if + * there is no such Throwable. + */ + public AuthenticationFailureEvent(Credentials credentials, + AuthenticationProvider authProvider, Throwable failure) { + this.credentials = credentials; + this.authProvider = authProvider; + this.failure = failure; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + /** + * {@inheritDoc} + * + *

    NOTE: In the case of an authentication failure, cases where this may + * be null include if authentication failed without a definite single + * AuthenticationProvider causing that failure, such as if the failure is + * caused by every AuthenticationProvider passively refusing to + * authenticate the user but without explicitly rejecting the user + * (returning null for calls to {@link AuthenticationProvider#authenticateUser(org.apache.guacamole.net.auth.Credentials)}), + * or if the failure is external to any installed AuthenticationProvider + * (such as within a {@link Listener}. + */ + @Override + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + /** + * {@inheritDoc} + * + *

    NOTE: In the case of an authentication failure, cases where this may + * be null include if authentication failed without a known error, such as + * if the failure is caused by every AuthenticationProvider passively + * refusing to authenticate the user but without explicitly rejecting the + * user (returning null for calls to {@link AuthenticationProvider#authenticateUser(org.apache.guacamole.net.auth.Credentials)}). + */ + @Override + public Throwable getFailure() { + return failure; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationProviderEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationProviderEvent.java new file mode 100644 index 0000000..7faa876 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationProviderEvent.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * An event which may be dispatched due to a specific AuthenticationProvider. + */ +public interface AuthenticationProviderEvent { + + /** + * Returns the AuthenticationProvider that resulted in the event, if any. + * If the event occurred without any definite causing + * AuthenticationProvider, this may be null. + * + * @return + * The AuthenticationProvider that resulted in the event, or null if no + * such AuthenticationProvider is known. + */ + AuthenticationProvider getAuthenticationProvider(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationRequestReceivedEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationRequestReceivedEvent.java new file mode 100644 index 0000000..eeefcfc --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationRequestReceivedEvent.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +/** + * An event which is triggered whenever a user's credentials have been + * submitted for authentication, but that latest authentication request has not + * yet succeeded or failed. The credentials that were received for + * authentication are included within this event, and can be retrieved using + * {@link #getCredentials()}. + *

    + * If a {@link org.apache.guacamole.net.event.listener.Listener} throws + * a GuacamoleException when handling an event of this type, the authentication + * request is entirely aborted as if it failed, and will be processed by any + * other listener or authentication provider. + */ +public interface AuthenticationRequestReceivedEvent extends CredentialEvent { +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationSuccessEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationSuccessEvent.java new file mode 100644 index 0000000..a727096 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/AuthenticationSuccessEvent.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An event which is triggered whenever a user's credentials pass + * authentication. The credentials that passed authentication are included + * within this event, and can be retrieved using getCredentials(). + *

    + * If a {@link org.apache.guacamole.net.event.listener.Listener} throws + * a GuacamoleException when handling an event of this type, successful authentication + * is effectively vetoed and will be subsequently processed as though the + * authentication failed. + */ +public class AuthenticationSuccessEvent implements UserEvent, CredentialEvent, + AuthenticationProviderEvent { + + /** + * The AuthenticatedUser identifying the user that successfully + * authenticated. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * Whether the successful authentication attempt represented by this event + * is related to an established Guacamole session. + */ + private final boolean existingSession; + + /** + * Creates a new AuthenticationSuccessEvent which represents a successful + * authentication attempt by the user identified by the given + * AuthenticatedUser object. The authentication attempt is presumed to be + * a fresh authentication attempt unrelated to an established session (a + * login attempt). + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user that successfully + * authenticated. + */ + public AuthenticationSuccessEvent(AuthenticatedUser authenticatedUser) { + this(authenticatedUser, false); + } + + /** + * Creates a new AuthenticationSuccessEvent which represents a successful + * authentication attempt by the user identified by the given + * AuthenticatedUser object. Whether the authentication attempt is + * related to an established session (a periodic re-authentication attempt + * that updates session status) or not (a fresh login attempt) is + * determined by the value of the provided flag. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user that successfully + * authenticated. + * + * @param existingSession + * Whether this AuthenticationSuccessEvent represents an + * re-authentication attempt that updates the status of an established + * Guacamole session. + */ + public AuthenticationSuccessEvent(AuthenticatedUser authenticatedUser, boolean existingSession) { + this.authenticatedUser = authenticatedUser; + this.existingSession = existingSession; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public Credentials getCredentials() { + return getAuthenticatedUser().getCredentials(); + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return getAuthenticatedUser().getAuthenticationProvider(); + } + + /** + * Returns whether the successful authentication attempt represented by + * this event is related to an established Guacamole session. During normal + * operation, the Guacamole web application will periodically + * re-authenticate with the server to verify its authentication token and + * update the session state, in which case the value returned by this + * function will be true. If the user was not already authenticated and has + * just initially logged in, false is returned. + * + * @return + * true if this AuthenticationSuccessEvent is related to a Guacamole + * session that was already established, false otherwise. + */ + public boolean isExistingSession() { + return existingSession; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/CredentialEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/CredentialEvent.java new file mode 100644 index 0000000..ef902ee --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/CredentialEvent.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.Credentials; + +/** + * Abstract basis for events which may have associated user credentials when + * triggered. + */ +public interface CredentialEvent { + + /** + * Returns the current credentials of the user triggering the event, if any. + * + * @return The current credentials of the user triggering the event, if + * any, or null if no credentials are associated with the event. + */ + Credentials getCredentials(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectoryEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectoryEvent.java new file mode 100644 index 0000000..468851a --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectoryEvent.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * Abstract basis for events which involve a modification made to the objects + * within a {@link Directory} through the operations exposed by the Directory + * interface. + * + * @param + * The type of object stored within the {@link Directory}. + */ +public interface DirectoryEvent + extends IdentifiableObjectEvent { + + /** + * The types of directory operations that may be represented by a + * DirectoryEvent. + */ + public enum Operation { + + /** + * An object was added to the {@link Directory}. The object added can + * be accessed with {@link #getObject()}, and its identifier may be + * obtained from {@link #getObjectIdentifier()}. + */ + ADD, + + /** + * An object was retrieved from a {@link Directory}. The object + * retrieved can be accessed with {@link #getObject()}, and its + * identifier may be obtained from {@link #getObjectIdentifier()}. + */ + GET, + + /** + * An existing object within a {@link Directory} was modified. The + * modified object can be accessed with {@link #getObject()}, and its + * identifier may be obtained from {@link #getObjectIdentifier()}. + */ + UPDATE, + + /** + * An existing object within a {@link Directory} was deleted/removed. + * The identifier of the object that was deleted may be obtained from + * {@link #getObjectIdentifier()}. The full object that was deleted + * will be made available via {@link #getObject()} if possible, but + * this is not guaranteed for deletions. + */ + REMOVE + + } + + /** + * Returns the operation that was performed/attempted. + * + * @return + * The operation that was performed or attempted. + */ + Operation getOperation(); + + /** + * {@inheritDoc} + *

    + * If the object was just created, this will be the identifier of the new + * object. + */ + @Override + String getObjectIdentifier(); + + /** + * {@inheritDoc} + *

    + * Currently, for object creation ({@link Operation#ADD ADD}), retrieval + * ({@link Operation#GET GET}), and modification ({@link Operation#UPDATE UPDATE}), + * it can be expected that the affected object will be available, however + * the caller should verify this regardless. For deletions + * ({@link Operation#REMOVE REMOVE}), the object can only be made available for + * single deletions, and cannot be made available for batch deletions. + */ + @Override + ObjectType getObject(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectoryFailureEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectoryFailureEvent.java new file mode 100644 index 0000000..a9ec474 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectoryFailureEvent.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * Event that is dispatched whenever a REST API request to create/modify/delete + * an object within a {@link Directory} fails. The specific failure is made + * available via {@link #getFailure()}. + * + * @param + * The type of object stored within the {@link Directory}. + */ +public interface DirectoryFailureEvent + extends DirectoryEvent, FailureEvent { + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectorySuccessEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectorySuccessEvent.java new file mode 100644 index 0000000..691cee7 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/DirectorySuccessEvent.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * Event that is dispatched whenever a REST API request to create/modify/delete + * an object within a {@link Directory} succeeds. + * + * @param + * The type of object stored within the {@link Directory}. + */ +public interface DirectorySuccessEvent + extends DirectoryEvent { + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/FailureEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/FailureEvent.java new file mode 100644 index 0000000..dfc3375 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/FailureEvent.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +/** + * An event which represents failure of an operation, where that failure may + * be associated with a particular Throwable. + */ +public interface FailureEvent { + + /** + * Returns the Throwable that represents the failure that occurred, if any. + * If the failure was recognized but without a definite known error, this + * may be null. + * + * @return + * The Throwable that represents the failure that occurred, or null if + * no such Throwable is known. + */ + Throwable getFailure(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/IdentifiableObjectEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/IdentifiableObjectEvent.java new file mode 100644 index 0000000..69ecfea --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/IdentifiableObjectEvent.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * Abstract basis for events which affect or directly relate to objects that + * are {@link Identifiable} and may be stored within a {@link Directory}. + * + * @param + * The type of object affected or related to the event. + */ +public interface IdentifiableObjectEvent + extends AuthenticationProviderEvent, UserEvent { + + /** + * {@inheritDoc} + *

    + * NOTE: For subclasses of {@link IdentifiableObjectEvent}, this will be the + * AuthenticationProvider associated with the affected, {@link Identifiable} + * object. This is not necessarily the same as the AuthenticationProvider + * that authenticated the user performing the operation, which can be + * retrieved via {@link #getAuthenticatedUser()} and + * {@link AuthenticatedUser#getAuthenticationProvider()}. + */ + @Override + AuthenticationProvider getAuthenticationProvider(); + + /** + * Returns the type of {@link Directory} that may contains the object + * affected by the operation. + * + * @return + * The type of objects stored within the {@link Directory}. + */ + Directory.Type getDirectoryType(); + + /** + * Returns the identifier of the object affected by the operation. + * + * @return + * The identifier of the object affected by the operation. + */ + String getObjectIdentifier(); + + /** + * Returns the object affected by the operation, if available. Whether the + * affected object is available is context- and implementation-dependent. + * There is no general guarantee across all implementations of this event + * that the affected object will be available. If the object is not + * available, null is returned. + * + * @return + * The object affected by the operation performed, or null if that + * object is not available in the context of this event. + */ + ObjectType getObject(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelCloseEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelCloseEvent.java new file mode 100644 index 0000000..87b6054 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelCloseEvent.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; + +/** + * An event which is triggered whenever a tunnel is being closed. The tunnel + * being closed can be accessed through getTunnel(), and the UserContext + * associated with the request which is closing the tunnel can be retrieved + * with getUserContext(). + *

    + * If a {@link org.apache.guacamole.net.event.listener.Listener} throws + * a GuacamoleException when handling an event of this type, the request to close + * the tunnel is effectively vetoed and will remain connected. + */ +public class TunnelCloseEvent implements UserEvent, CredentialEvent, TunnelEvent { + + /** + * The AuthenticatedUser associated with the user that is closing the + * tunnel, if any. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * The credentials associated with the request that closed the tunnel, if + * any. + */ + private final Credentials credentials; + + /** + * The tunnel being closed. + */ + private final GuacamoleTunnel tunnel; + + /** + * Creates a new TunnelCloseEvent which represents the closing of the + * given tunnel via a request associated with the given credentials. + * + * @param authenticatedUser + * The AuthenticatedUser associated with the user that is closing the + * tunnel, if any. + * + * @param credentials + * The credentials associated with the request that closed the + * tunnel. Note that these credentials are not necessarily the same as + * the credentials provided when the user authenticated. + * + * @param tunnel + * The tunnel being closed. + */ + public TunnelCloseEvent(AuthenticatedUser authenticatedUser, + Credentials credentials, GuacamoleTunnel tunnel) { + this.authenticatedUser = authenticatedUser; + this.credentials = credentials; + this.tunnel = tunnel; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public GuacamoleTunnel getTunnel() { + return tunnel; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelConnectEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelConnectEvent.java new file mode 100644 index 0000000..89a2fb0 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelConnectEvent.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * An event which is triggered whenever a tunnel is being connected. The tunnel + * being connected can be accessed through getTunnel(), and the UserContext + * associated with the request which is connecting the tunnel can be retrieved + * with getUserContext(). + *

    + * If a {@link org.apache.guacamole.net.event.listener.Listener} throws + * a GuacamoleException when handling an event of this type, the tunnel connection + * is effectively vetoed and will be subsequently closed. + */ +public class TunnelConnectEvent implements UserEvent, CredentialEvent, TunnelEvent { + + /** + * The AuthenticatedUser associated with the user that is connecting the + * tunnel, if any. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * The credentials associated with the request that is connecting the + * tunnel, if any. + */ + private final Credentials credentials; + + /** + * The tunnel being connected. + */ + private final GuacamoleTunnel tunnel; + + /** + * Creates a new TunnelConnectEvent which represents the connecting of the + * given tunnel via a request associated with the given credentials. + * + * @param authenticatedUser + * The AuthenticatedUser associated with the user that is connecting the + * tunnel, if any. + * + * @param credentials + * The credentials associated with the request that connected the + * tunnel. Note that these credentials are not necessarily the same as + * the credentials provided when the user authenticated. + * + * @param tunnel The tunnel being connected. + */ + public TunnelConnectEvent(AuthenticatedUser authenticatedUser, + Credentials credentials, GuacamoleTunnel tunnel) { + this.authenticatedUser = authenticatedUser; + this.credentials = credentials; + this.tunnel = tunnel; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public GuacamoleTunnel getTunnel() { + return tunnel; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelEvent.java new file mode 100644 index 0000000..f104e03 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/TunnelEvent.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.GuacamoleTunnel; + +/** + * Abstract basis for events associated with tunnels. + */ +public interface TunnelEvent { + + /** + * Returns the tunnel associated with this event, if any. + * + * @return The tunnel associated with this event, if any, or null if no + * tunnel is associated with this event. + */ + GuacamoleTunnel getTunnel(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/UserEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/UserEvent.java new file mode 100644 index 0000000..5f1c1db --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/UserEvent.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +import org.apache.guacamole.net.auth.AuthenticatedUser; + +/** + * Abstract basis for events which may have an associated AuthenticatedUser when + * triggered. + */ +public interface UserEvent { + + /** + * Returns the AuthenticatedUser identifying the user triggering the event, + * if any. + * + * @return + * The AuthenticatedUser identifying the user triggering the event, if + * any, or null if no AuthenticatedUser is associated with the event. + */ + AuthenticatedUser getAuthenticatedUser(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/UserSessionInvalidatedEvent.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/UserSessionInvalidatedEvent.java new file mode 100644 index 0000000..4398cfa --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/UserSessionInvalidatedEvent.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event; + +/** + * Event that is dispatched when a user has logged out or their session has + * expired. + */ +public interface UserSessionInvalidatedEvent extends UserEvent { +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/AuthenticationFailureListener.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/AuthenticationFailureListener.java new file mode 100644 index 0000000..6e707e6 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/AuthenticationFailureListener.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event.listener; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.event.AuthenticationFailureEvent; + +/** + * A listener whose authenticationFailed() hook will fire immediately + * after a user's authentication attempt fails. Note that this hook cannot + * be used to cancel the authentication failure. + * + * @deprecated + * Listeners should instead implement the {@link Listener} interface. + */ +@Deprecated +public interface AuthenticationFailureListener { + + /** + * Event hook which fires immediately after a user's authentication attempt + * fails. + * + * @param e + * The AuthenticationFailureEvent describing the authentication + * failure that just occurred. + * + * @throws GuacamoleException + * If an error occurs while handling the authentication failure event. + * Note that throwing an exception will NOT cause the authentication + * failure to be canceled (which makes no sense), but it will prevent + * subsequent listeners from receiving the notification. + */ + void authenticationFailed(AuthenticationFailureEvent e) + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/AuthenticationSuccessListener.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/AuthenticationSuccessListener.java new file mode 100644 index 0000000..6ba05a3 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/AuthenticationSuccessListener.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event.listener; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.event.AuthenticationSuccessEvent; + +/** + * A listener whose hooks will fire immediately before and after a user's + * authentication attempt succeeds. If a user successfully authenticates, + * the authenticationSucceeded() hook has the opportunity to cancel the + * authentication and force it to fail. + * + * @deprecated + * Listeners should instead implement the {@link Listener} interface. + */ +@Deprecated +public interface AuthenticationSuccessListener { + + /** + * Event hook which fires immediately after a user's authentication attempt + * succeeds. The return value of this hook dictates whether the + * successful authentication attempt is canceled. + * + * @param e + * The AuthenticationFailureEvent describing the authentication + * failure that just occurred. + * + * @return + * true if the successful authentication attempt should be + * allowed, or false if the attempt should be denied, causing + * the attempt to effectively fail. + * + * @throws GuacamoleException + * If an error occurs while handling the authentication success event. + * Throwing an exception will also cancel the authentication success. + */ + boolean authenticationSucceeded(AuthenticationSuccessEvent e) + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/Listener.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/Listener.java new file mode 100644 index 0000000..af480b7 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/Listener.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event.listener; + +import org.apache.guacamole.GuacamoleException; + +/** + * A listener for events that occur in handing various Guacamole requests + * such as authentication, tunnel connect/close, etc. Listeners are registered + * through the extension manifest mechanism. When an event occurs, listeners + * are notified in the order in which they are declared in the manifest and + * continues until either all listeners have been notified or with the first + * listener that throws a GuacamoleException or other runtime exception. + */ +public interface Listener { + + /** + * Notifies the recipient that an event has occurred. + *

    + * Throwing an exception from an event listener can act to veto an action in + * progress for some event types. See the Javadoc for specific event types for + * details. + * + * @param event + * An object that describes the event that has occurred. + * + * @throws GuacamoleException + * If the listener wishes to stop notification of the event to subsequent + * listeners. For some event types, this acts to veto an action in progress; + * e.g. treating a successful authentication as though it failed. + */ + void handleEvent(Object event) throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/TunnelCloseListener.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/TunnelCloseListener.java new file mode 100644 index 0000000..84d7658 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/TunnelCloseListener.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event.listener; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.event.TunnelCloseEvent; + +/** + * A listener whose tunnelClosed() hook will fire immediately before an + * existing tunnel is closed. + * + * @deprecated + * Listeners should instead implement the {@link Listener} interface. + */ +@Deprecated +public interface TunnelCloseListener { + + /** + * Event hook which fires immediately before an existing tunnel is closed. + * The return value of this hook dictates whether the tunnel is allowed to + * be closed. + * + * @param e + * The TunnelCloseEvent describing the tunnel being closed and + * any associated credentials. + * + * @return + * true if the tunnel should be allowed to be closed, or false + * if the attempt should be denied, causing the attempt to + * effectively fail. + * + * @throws GuacamoleException + * If an error occurs while handling the tunnel close event. Throwing + * an exception will also stop the tunnel from being closed. + */ + boolean tunnelClosed(TunnelCloseEvent e) throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/TunnelConnectListener.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/TunnelConnectListener.java new file mode 100644 index 0000000..e224f74 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/TunnelConnectListener.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.event.listener; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.event.TunnelConnectEvent; + +/** + * A listener whose tunnelConnected() hook will fire immediately after a new + * tunnel is connected. + * + * @deprecated + * Listeners should instead implement the {@link Listener} interface. + */ +@Deprecated +public interface TunnelConnectListener { + + /** + * Event hook which fires immediately after a new tunnel is connected. + * The return value of this hook dictates whether the tunnel is made visible + * to the session. + * + * @param e + * The TunnelConnectEvent describing the tunnel being connected and + * any associated credentials. + * + * @return + * true if the tunnel should be allowed to be connected, or false + * if the attempt should be denied, causing the attempt to + * effectively fail. + * + * @throws GuacamoleException + * If an error occurs while handling the tunnel connect event. Throwing + * an exception will also stop the tunnel from being made visible to the + * session. + */ + boolean tunnelConnected(TunnelConnectEvent e) throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/package-info.java new file mode 100644 index 0000000..b499ed0 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/listener/package-info.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides classes for hooking into various events that take place as + * users log into and use the Guacamole web application. These event + * hooks can be used to take action upon occurrence of an event and, + * in some cases, prevent the web application from allowing the + * event to continue for the user that triggered it. + */ +package org.apache.guacamole.net.event.listener; + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/event/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/package-info.java new file mode 100644 index 0000000..2088a7f --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/event/package-info.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides classes for storing information about events that are + * triggered when users log into and use the Guacamole web application. + * These event classes are most useful when used with hooks implemented + * using listener classes. + * + * @see org.apache.guacamole.net.event.listener + */ +package org.apache.guacamole.net.event; + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/BooleanGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/BooleanGuacamoleProperty.java new file mode 100644 index 0000000..8fd51e7 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/BooleanGuacamoleProperty.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is an boolean. Legal true values are "true", + * or "false". Case does not matter. + */ +public abstract class BooleanGuacamoleProperty implements GuacamoleProperty { + + @Override + public Boolean parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + // If "true", return true + if (value.equalsIgnoreCase("true")) + return true; + + // If "false", return false + if (value.equalsIgnoreCase("false")) + return false; + + // Otherwise, fail + throw new GuacamoleServerException("Property \"" + getName() + + "\" must be either \"true\" or \"false\"."); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/ByteArrayProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/ByteArrayProperty.java new file mode 100644 index 0000000..f9974ac --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/ByteArrayProperty.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import com.google.common.io.BaseEncoding; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is a byte array. The bytes of the byte array + * must be represented as a hexadecimal string within the property value. The + * hexadecimal string is case-insensitive. + */ +public abstract class ByteArrayProperty implements GuacamoleProperty { + + @Override + public byte[] parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + // Return value parsed from hex + try { + return BaseEncoding.base16().decode(value.toUpperCase()); + } + + // Fail parse if hex invalid + catch (IllegalArgumentException e) { + throw new GuacamoleServerException("Invalid hexadecimal value.", e); + } + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/CaseSensitivity.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/CaseSensitivity.java new file mode 100644 index 0000000..15bc243 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/CaseSensitivity.java @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Locale; +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * An enum that supports configuring various user and group case sensitivity + * settings. + */ +public enum CaseSensitivity { + + /** + * Case sensitivity enabled for both usernames and group names. + */ + @PropertyValue("enabled") + ENABLED(true, true), + + /** + * Case sensitivity enabled for usernames but disabled for group names. + */ + @PropertyValue("usernames") + USERS(true, false), + + /** + * Case sensitivity disabled for usernames but enabled for group names. + */ + @PropertyValue("group-names") + GROUPS(false, true), + + /** + * Case sensitivity disabled for both usernames and group names. + */ + @PropertyValue("disabled") + DISABLED(false, false); + + /** + * Whether or not case sensitivity should be enabled for usernames. + */ + private final boolean usernames; + + /** + * Whether or not case sensitivity should be enabled for group names. + */ + private final boolean groupNames; + + /** + * Creates a new CaseSensitivity value that represents a setting controlling + * whether usernames and group names are case-sensitive. + * + * @param usernames + * true if usernames should be considered case-sensitive, false if + * usernames should be considered case-insensitive. + * + * @param groupNames + * true if group names should be considered case-sensitive, false if + * group names should be considered case-insensitive. + */ + CaseSensitivity(boolean usernames, boolean groupNames) { + this.usernames = usernames; + this.groupNames = groupNames; + } + + /** + * Return "true" if case sensitivity is enabled for usernames, otherwise + * "false". + * + * @return + * "true" if case sensitivity is enabled for usernames, otherwise "false". + */ + public boolean caseSensitiveUsernames() { + return usernames; + } + + /** + * Return "true" if case sensitivity is enabled group names, otherwise + * "false". + * + * @return + * "true" if case sensitivity is enabled for group names, otherwise + * "false". + */ + public boolean caseSensitiveGroupNames() { + return groupNames; + } + + /** + * Converts the given identifier into a canonical form which ensures simple + * verbatim string comparisons are consistent with the case sensitivity + * setting. If case-sensitive, identifiers are simply returned without + * modification. If case-insensitive, identifiers are converted to + * lowercase with respect to the {@link Locale#ROOT} locale. + * + * @param identifier + * The identifier to convert into a canonical form. + * + * @param caseSensitive + * Whether the given identifier is case-sensitive. + * + * @return + * The given identifier, transformed as necessary to ensure that + * verbatim string comparisons are consistent with the case sensitivity + * setting. + */ + public static String canonicalize(String identifier, boolean caseSensitive) { + + if (identifier == null) + return null; + + return caseSensitive ? identifier : identifier.toLowerCase(Locale.ROOT); + + } + + /** + * Canonicalizes the given username according to whether usernames are + * case-sensitive under this case sensitivity setting. This function is + * equivalent to manually invoking {@link #canonicalize(java.lang.String, boolean)} + * with the value of {@link #caseSensitiveUsernames()}. + * + * @param username + * The username to canonicalize. + * + * @return + * The given username, transformed as necessary to ensure that + * verbatim string comparisons are consistent with the case sensitivity + * setting for usernames. + */ + public String canonicalizeUsername(String username) { + return canonicalize(username, usernames); + } + + /** + * Canonicalizes the given group name according to whether group names are + * case-sensitive under this case sensitivity setting. This function is + * equivalent to manually invoking {@link #canonicalize(java.lang.String, boolean)} + * with the value of {@link #caseSensitiveGroupNames()}. + * + * @param groupName + * The group name to canonicalize. + * + * @return + * The given group name, transformed as necessary to ensure that + * verbatim string comparisons are consistent with the case sensitivity + * setting for group names. + */ + public String canonicalizeGroupName(String groupName) { + return canonicalize(groupName, groupNames); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/EnumGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/EnumGuacamoleProperty.java new file mode 100644 index 0000000..a552993 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/EnumGuacamoleProperty.java @@ -0,0 +1,290 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose possible values are defined by an enum. Possible + * values may be defined either through providing an explicit mapping or + * through annotating the enum constant definitions with the + * {@link PropertyValue} annotation. + * + * @param + * The enum which defines the possible values of this property. + */ +public abstract class EnumGuacamoleProperty> implements GuacamoleProperty { + + /** + * Defines the string value which should be accepted and parsed into the + * annotated enum constant. This annotation is repeatable, and each enum + * constant may be associated with any any number of string values. + */ + @Repeatable(PropertyValues.class) + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + public static @interface PropertyValue { + + /** + * Returns the String value that should produce the annotated enum + * constant when parsed. + * + * @return + * The String value that should produce the annotated enum constant + * when parsed. + */ + String value(); + + } + + /** + * Defines the string values which should be accepted and parsed into the + * annotated enum constant. Each enum constant may be associated with any + * any number of string values. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + public static @interface PropertyValues { + + /** + * Returns the {@link PropertyValue} annotations that represent the + * String values that should produce the annotated enum constant when + * parsed. + * + * @return + * The {@link PropertyValue} annotations that represent the String + * values that should produce the annotated enum constant when + * parsed. + */ + PropertyValue[] value(); + + } + + /** + * Mapping of valid property values to the corresponding enum constants + * that those values parse to. + */ + private final Map valueMapping; + + /** + * Produces a mapping of Guacamole property value to corresponding enum + * constant. All enum constants annotated with {@link PropertyValue} are + * included in the resulting Map. + * + * @param + * The enum for which a value mapping is being produced. + * + * @param enumClass + * The Class of the enum for which a value mapping is being produced. + * + * @return + * A new Map which associates the Guacamole property string values of + * enum constants (as defined by {@link PropertyValue} annotations) + * with their corresponding enum constants. + */ + private static > Map getValueMapping(Class enumClass) { + + T[] values = enumClass.getEnumConstants(); + Map valueMapping = new HashMap<>(values.length); + + for (T value : values) { + + // Retrieve Field which corresponds to the current enum constant + Field field; + try { + field = enumClass.getDeclaredField(value.name()); + } + catch (NoSuchFieldException e) { + // This SHOULD be impossible + throw new IllegalStateException("Fields of enum do not " + + "match declared values.", e); + } + + // Map enum constant only if one or more PropertyValue annotations + // are present + PropertyValues valuesAnnotation = field.getAnnotation(PropertyValues.class); + if (valuesAnnotation != null) { + for (PropertyValue valueAnnotation : valuesAnnotation.value()) + valueMapping.put(valueAnnotation.value(), value); + } + + // The PropertyValue annotation may appear as a separate, single + // annotation, or as a multi-valued annotation via PropertyValues + // (see above) + PropertyValue valueAnnotation = field.getAnnotation(PropertyValue.class); + if (valueAnnotation != null) + valueMapping.put(valueAnnotation.value(), value); + + } + + return valueMapping; + + } + + /** + * Produces a new Map having the given key/value pairs. Each key MUST be a + * String, and each value MUST be an enum constant belonging to the given + * enum. + * + * @param + * The enum whose constants may be used as values within the Map. + * + * @param key + * The key of the first key/value pair to include within the Map. + * + * @param value + * The value of the first key/value pair to include within the Map. + * + * @param additional + * Any additional key/value pairs to be included beyond the first. This + * array must be even in length, where each even element is a String + * key and each odd element is the enum constant value to be associated + * with the key immediately preceding it. + * + * @return + * A new Map having each of the given key/value pairs. + * + * @throws IllegalArgumentException + * If any provided key is not a String, if any provided value is not + * an enum constant from the given enum type, or if the length of + * {@code additional} is not even. + */ + @SuppressWarnings("unchecked") // We check this ourselves with instanceof and getDeclaringClass() + private static > Map mapOf(String key, T value, + Object... additional) throws IllegalArgumentException { + + // Verify length of additional pairs is even + if (additional.length % 2 != 0) + throw new IllegalArgumentException("Array of additional key/value pairs must be even in length."); + + // Add first type-checked pair + Map valueMapping = new HashMap<>(1 + additional.length); + valueMapping.put(key, value); + + Class enumClass = value.getDeclaringClass(); + + // Add remaining, unchecked pairs + for (int i = 0; i < additional.length; i += 2) { + + // Verify that unchecked keys are indeed Strings + Object additionalKey = additional[i]; + if (!(additionalKey instanceof String)) + throw new IllegalArgumentException("Keys of additional key/value pairs must be strings."); + + // Verify that unchecked values are indeed constants defined by the + // expected enum + Object additionalValue = additional[i + 1]; + if (!(additionalValue instanceof Enum) || enumClass != ((Enum) additionalValue).getDeclaringClass()) + throw new IllegalArgumentException("Values of additional key/value pairs must be enum constants of the correct type."); + + valueMapping.put((String) additionalKey, (T) additionalValue); + + } + + return valueMapping; + + } + + /** + * Creates a new EnumGuacamoleProperty which parses String property values + * into corresponding enum constants as defined by the given Map. + * + * @param valueMapping + * A Map which maps all legal String values to their corresponding enum + * constants. + */ + public EnumGuacamoleProperty(Map valueMapping) { + this.valueMapping = valueMapping; + } + + /** + * Creates a new EnumGuacamoleProperty which parses String property values + * into corresponding enum constants as defined by the + * {@link PropertyValue} annotations associated with those constants. + * + * @param enumClass + * The enum whose annotated constants should be used as legal values of + * this property. + */ + public EnumGuacamoleProperty(Class enumClass) { + this(getValueMapping(enumClass)); + } + + /** + * Creates a new EnumGuacamoleProperty which parses the given String + * property values into the given corresponding enum constants. + * + * @param key + * The first String value to accept as a legal value of this property. + * + * @param value + * The enum constant that {@code key} should be parsed into. + * + * @param additional + * Any additional key/value pairs to be included beyond the first. This + * array must be even in length, where each even element is a String + * key and each odd element is the enum constant value to be associated + * with the key immediately preceding it. + * + * @throws IllegalArgumentException + * If any provided key is not a String, if any provided value is not + * an enum constant from the given enum type, or if the length of + * {@code additional} is not even. + */ + public EnumGuacamoleProperty(String key, T value, Object... additional) + throws IllegalArgumentException { + this(mapOf(key, value, additional)); + } + + @Override + public T parseValue(String value) throws GuacamoleException { + + // Simply pass through null values + if (value == null) + return null; + + // Translate values based on explicit string/constant mapping + T parsedValue = valueMapping.get(value); + if (parsedValue != null) + return parsedValue; + + // Produce human-readable error if no matching constant is found + List legalValues = new ArrayList<>(valueMapping.keySet()); + Collections.sort(legalValues); + + throw new GuacamoleServerException(String.format("\"%s\" is not a " + + "valid value for property \"%s\". Valid values are: \"%s\"", + value, getName(), String.join("\", \"", legalValues))); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/FileGuacamoleProperties.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/FileGuacamoleProperties.java new file mode 100644 index 0000000..74d4e06 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/FileGuacamoleProperties.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * GuacamoleProperties implementation which reads all properties from a + * standard Java properties file. Whitespace at the end of property values is + * automatically trimmed. + */ +public class FileGuacamoleProperties extends PropertiesGuacamoleProperties { + + /** + * Reads the given Java properties file, storing all property name/value + * pairs in a new {@link Properties} object. + * + * @param propertiesFile + * The Java properties file to read. + * + * @return + * A new Properties containing all property name/value pairs defined in + * the given file. + * + * @throws GuacamoleException + * If an error prevents reading the given Java properties file. + */ + private static Properties read(File propertiesFile) throws GuacamoleException { + + // Fail early if file simply does not exist + if (!propertiesFile.exists()) + throw new GuacamoleServerException(String.format("\"%s\" does not " + + "exist.", propertiesFile)); + + // Load properties from stream, if any, always closing stream when done + Properties properties = new Properties(); + try (InputStream stream = new FileInputStream(propertiesFile)) { + properties.load(stream); + } + catch (IOException e) { + throw new GuacamoleServerException(String.format("\"%s\" cannot " + + "be read: %s", propertiesFile, e.getMessage()), e); + } + + return properties; + + } + + /** + * Creates a new FileGuacamoleProperties which reads all properties from + * the given standard Java properties file. + * + * @param propertiesFile + * The Java properties file to read. + * + * @throws GuacamoleException + * If an error prevents reading the given Java properties file. + */ + public FileGuacamoleProperties(File propertiesFile) throws GuacamoleException { + super(read(propertiesFile)); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/FileGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/FileGuacamoleProperty.java new file mode 100644 index 0000000..38e1dac --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/FileGuacamoleProperty.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.guacamole.GuacamoleException; + +/** + * A GuacamoleProperty whose value is a filename. + */ +public abstract class FileGuacamoleProperty implements GuacamoleProperty { + + @Override + public File parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + return new File(value); + + } + + @Override + public List parseValueCollection(String value) throws GuacamoleException { + + // If no property is provided, return null. + if (value == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(value)); + if (stringValues.isEmpty()) + return null; + + // Translate values to Files and add to result array. + List fileValues = new ArrayList<>(); + for (String stringFile : stringValues) { + fileValues.add(new File(stringFile)); + } + + return fileValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/GuacamoleProperties.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/GuacamoleProperties.java new file mode 100644 index 0000000..d775126 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/GuacamoleProperties.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Properties; +import org.apache.guacamole.GuacamoleException; + +/** + * An arbitrary set of Guacamole configuration property name/value pairs. This + * interface is similar in concept to {@link Properties} except that + * implementations are not required to allow properties to be enumerated or + * iterated. Properties may simply be retrieved by their names, if known. + */ +public interface GuacamoleProperties { + + /** + * Returns the value of the property having the given name, if defined. If + * no such property exists, null is returned. + * + * @param name + * The name of the property to retrieve. + * + * @return + * The value of the given property, or null if no such property is + * defined. + * + * @throws GuacamoleException + * If an error prevents the given property from being read. + */ + String getProperty(String name) throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/GuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/GuacamoleProperty.java new file mode 100644 index 0000000..bcbea05 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/GuacamoleProperty.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Collection; +import java.util.Collections; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; + +/** + * An abstract representation of a property in the guacamole.properties file, + * which parses into a specific type. + * + * @param + * The type this GuacamoleProperty will parse into. + */ +public interface GuacamoleProperty { + + /** + * A pattern which matches against the delimiters between values. This is + * currently simply a semicolon and any following whitespace. Parts of the + * input string which match this pattern will not be included in the parsed + * result. + */ + static final Pattern DELIMITER_PATTERN = Pattern.compile(";\\s*"); + + /** + * Returns the name of the property in guacamole.properties that this + * GuacamoleProperty will parse. + * + * @return + * The name of the property in guacamole.properties that this + * GuacamoleProperty will parse. + */ + public String getName(); + + /** + * Parses the given string value into the type associated with this + * GuacamoleProperty. + * + * @param value + * The string value to parse. + * + * @return + * The parsed value. + * + * @throws GuacamoleException + * If an error occurs while parsing the provided value. + */ + public Type parseValue(String value) throws GuacamoleException; + + /** + * Parses the given string value into a Collection of values of the type + * associated with this GuacamoleProperty. The default implementation + * simply returns a list containing a single item as parsed by the + * parseValue method. + * + * @param value + * The string value to parse. + * + * @return + * A sorted Collection of the parsed values. + * + * @throws GuacamoleException + * If an error occurs while parsing the provided value. + */ + default public Collection parseValueCollection(String value) + throws GuacamoleException { + + return Collections.singletonList(parseValue(value)); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/IPAddressListProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/IPAddressListProperty.java new file mode 100644 index 0000000..1e0f6ed --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/IPAddressListProperty.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import inet.ipaddr.IPAddress; +import inet.ipaddr.IPAddressString; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty implementation that parses a String for a comma-separated + * list of IP addresses and/or IP subnets, both IPv4 and IPv6, and returns the + * list of those valid IP addresses/subnets. + */ +public abstract class IPAddressListProperty implements GuacamoleProperty> { + + /** + * A pattern which matches against the delimiters between values. This is + * currently simply a comma and any following whitespace. Parts of the + * input string which match this pattern will not be included in the parsed + * result. + */ + private static final Pattern DELIMITER_PATTERN = Pattern.compile(",\\s*"); + + @Override + public List parseValue(String values) throws GuacamoleException { + + // Null for null + if (values == null) + return null; + + // Not null, just empty + if (values.isEmpty()) + return Collections.emptyList(); + + // Split the string into an array + List addrStrings = Arrays.asList(DELIMITER_PATTERN.split(values)); + List ipAddresses = new ArrayList<>(); + + // Loop through each string + for (String addrString : addrStrings) { + + // Convert the string to an IPAddressString for validation + IPAddressString ipString = new IPAddressString(addrString); + + // If this isn't a valid address, subnet, etc., throw an exception + if (!ipString.isIPAddress()) + throw new GuacamoleServerException("Invalid IP address specified: " + addrString); + + // Add the address to the list. + ipAddresses.add(ipString.getAddress()); + } + + // Return our list of valid IP addresses and/or subnets + return ipAddresses; + + } + + /** + * Return true if the provided address list contains the client address, + * or false if no match is found. + * + * @param addrList + * The address list to check for matches. + * + * @param ipAddr + * The client address to look for in the list. + * + * @return + * True if the client address is in the provided list, otherwise + * false. + */ + public static boolean addressListContains(List addrList, IPAddress ipAddr) { + + // If either is null, return false + if (ipAddr == null || addrList == null) + return false; + + for (IPAddress ipEntry : addrList) + + // If version matches and entry contains it, return true + if (ipEntry.getIPVersion().equals(ipAddr.getIPVersion()) + && ipEntry.contains(ipAddr)) + return true; + + // No match, so return false + return false; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/IntegerGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/IntegerGuacamoleProperty.java new file mode 100644 index 0000000..8746f27 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/IntegerGuacamoleProperty.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is an integer. + */ +public abstract class IntegerGuacamoleProperty implements GuacamoleProperty { + + @Override + public Integer parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + try { + return Integer.valueOf(value); + } + catch (NumberFormatException e) { + throw new GuacamoleServerException("Property \"" + getName() + "\" must be an integer.", e); + } + + } + + @Override + public List parseValueCollection(String value) throws GuacamoleException { + + if (value == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(value)); + if (stringValues.isEmpty()) + return null; + + // Translate values to Integers, validating along the way. + List intValues = new ArrayList<>(); + for (String stringInt : stringValues) { + intValues.add(parseValue(stringInt)); + } + + return intValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/LongGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/LongGuacamoleProperty.java new file mode 100644 index 0000000..b118a61 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/LongGuacamoleProperty.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is an long. + */ +public abstract class LongGuacamoleProperty implements GuacamoleProperty { + + @Override + public Long parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + try { + return Long.valueOf(value); + } + catch (NumberFormatException e) { + throw new GuacamoleServerException("Property \"" + getName() + "\" must be an long.", e); + } + + } + + @Override + public List parseValueCollection(String value) throws GuacamoleException { + + if (value == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(value)); + if (stringValues.isEmpty()) + return null; + + // Translate values to Longs, validating along the way. + List longValues = new ArrayList<>(); + for (String stringLong : stringValues) { + longValues.add(parseValue(stringLong)); + } + + return longValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/PropertiesGuacamoleProperties.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/PropertiesGuacamoleProperties.java new file mode 100644 index 0000000..cf92331 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/PropertiesGuacamoleProperties.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Properties; +import org.apache.guacamole.GuacamoleException; + +/** + * GuacamoleProperties implementation which reads all properties from a + * {@link Properties} object. Whitespace at the end of property values is + * automatically trimmed. + */ +public class PropertiesGuacamoleProperties implements GuacamoleProperties { + + /** + * The Properties from which all property values should be read. + */ + private final Properties properties; + + /** + * Creates a new PropertiesGuacamoleProperties which wraps the given + * {@link Properties}, providing access to the values of any properties + * defined therein. + * + * @param properties + * The Properties that should be used as the source of all property + * values exposed by this instance of PropertiesGuacamoleProperties. + */ + public PropertiesGuacamoleProperties(Properties properties) { + this.properties = properties; + } + + + @Override + public String getProperty(String name) throws GuacamoleException { + + String value = properties.getProperty(name); + if (value == null) + return null; + + return value.trim(); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/StringGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/StringGuacamoleProperty.java new file mode 100644 index 0000000..abc2b15 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/StringGuacamoleProperty.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Arrays; +import java.util.List; +import org.apache.guacamole.GuacamoleException; + +/** + * A GuacamoleProperty whose value is a simple string. + */ +public abstract class StringGuacamoleProperty implements GuacamoleProperty { + + @Override + public String parseValue(String value) throws GuacamoleException { + return value; + } + + @Override + public List parseValueCollection(String value) throws GuacamoleException { + + if (value == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(value)); + if (stringValues.isEmpty()) + return null; + + return stringValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/StringListProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/StringListProperty.java new file mode 100644 index 0000000..574a3d8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/StringListProperty.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; + +/** + * A GuacamoleProperty whose value is a List of Strings. The string value + * parsed to produce this list is a comma-delimited list. Duplicate values are + * ignored, as is any whitespace following delimiters. To maintain + * compatibility with the behavior of Java properties in general, only + * whitespace at the beginning of each value is ignored; trailing whitespace + * becomes part of the value. + * + * @deprecated + * This class is now deprecated in favor of using the StringGuacamoleProperty + * class with the parseValueCollection method. + */ +@Deprecated +public abstract class StringListProperty implements GuacamoleProperty> { + + @Override + public List parseValue(String values) throws GuacamoleException { + + // If no property provided, return null. + if (values == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(values)); + if (stringValues.isEmpty()) + return null; + + return stringValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/TimeZoneGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/TimeZoneGuacamoleProperty.java new file mode 100644 index 0000000..d4a15f9 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/TimeZoneGuacamoleProperty.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TimeZone; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is a TimeZone. + */ +public abstract class TimeZoneGuacamoleProperty + implements GuacamoleProperty { + + /** + * A regex that matches valid variants of GMT timezones. + */ + public static final Pattern GMT_REGEX = + Pattern.compile("^GMT([+-](0|00)((:)?00)?)?$"); + + @Override + public TimeZone parseValue(String value) throws GuacamoleException { + + // Nothing in, nothing out + if (value == null || value.isEmpty()) + return null; + + // Attempt to return the TimeZone of the provided string value. + TimeZone tz = TimeZone.getTimeZone(value); + + // If the input is not GMT, but the output is GMT, the TimeZone is not + // valid and we throw an exception. + if (!GMT_REGEX.matcher(value).matches() + && GMT_REGEX.matcher(tz.getID()).matches()) + throw new GuacamoleServerException("Property \"" + getName() + + "\" does not specify a valid time zone."); + + return tz; + + } + + @Override + public List parseValueCollection(String value) throws GuacamoleException { + + if (value == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(value)); + if (stringValues.isEmpty()) + return null; + + // Translate values to Integers, validating along the way. + List tzValues = new ArrayList<>(); + for (String stringTz : stringValues) { + tzValues.add(parseValue(stringTz)); + } + + return tzValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/URIGuacamoleProperty.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/URIGuacamoleProperty.java new file mode 100644 index 0000000..ae6077c --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/URIGuacamoleProperty.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is a URI. + */ +public abstract class URIGuacamoleProperty implements GuacamoleProperty { + + @Override + public URI parseValue(String value) throws GuacamoleException { + + // If nothing is provided, just return null. + if (value == null) + return null; + + try { + return new URI(value); + } + catch (URISyntaxException e) { + throw new GuacamoleServerException("Value \"" + value + + "\" is not a valid URI."); + } + + } + + @Override + public List parseValueCollection(String value) throws GuacamoleException { + + // Nothing provided, return nothing. + if (value == null) + return null; + + // Split string into a list of individual values + List stringValues = Arrays.asList(DELIMITER_PATTERN.split(value)); + if (stringValues.isEmpty()) + return null; + + // Translate values to URIs, validating along the way. + List uriValues = new ArrayList<>(); + for (String stringUri : stringValues) { + uriValues.add(parseValue(stringUri)); + } + + return uriValues; + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/properties/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/properties/package-info.java new file mode 100644 index 0000000..8db9d75 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/properties/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides classes for reading properties from the web-application-wide + * guacamole.properties file. + */ +package org.apache.guacamole.properties; + diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/protocols/ProtocolInfo.java b/guacamole-ext/src/main/java/org/apache/guacamole/protocols/ProtocolInfo.java new file mode 100644 index 0000000..5b370d1 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/protocols/ProtocolInfo.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.protocols; + +import java.util.ArrayList; +import java.util.Collection; +import org.apache.guacamole.form.Form; + +/** + * Describes a protocol and all parameters associated with it, as required by + * a protocol plugin for guacd. Each parameter is described with a Form, which + * allows the parameters of a protocol to be exposed to the user as friendly + * groupings of fields. + */ +public class ProtocolInfo { + + /** + * The unique name associated with this protocol. + */ + private String name; + + /** + * A collection of forms describing all known parameters for a connection + * using this protocol. + */ + private Collection connectionForms; + + /** + * A collection of forms describing all known parameters relevant to a + * sharing profile whose primary connection uses this protocol. + */ + private Collection sharingProfileForms; + + /** + * Creates a new ProtocolInfo having the given name and forms. The given + * collections of forms are used to describe the parameters for connections + * and sharing profiles respectively. + * + * @param name + * The unique name associated with the protocol. + * + * @param connectionForms + * A collection of forms describing all known parameters for a + * connection using this protocol. + * + * @param sharingProfileForms + * A collection of forms describing all known parameters relevant to a + * sharing profile whose primary connection uses this protocol. + */ + public ProtocolInfo(String name, Collection connectionForms, + Collection sharingProfileForms) { + this.name = name; + this.connectionForms = connectionForms; + this.sharingProfileForms = sharingProfileForms; + } + + /** + * Creates a new ProtocolInfo with no associated name or forms. + */ + public ProtocolInfo() { + this(null); + } + + /** + * Creates a new ProtocolInfo having the given name, but without any forms. + * + * @param name + * The unique name associated with the protocol. + */ + public ProtocolInfo(String name) { + this(name, new ArrayList()); + } + + /** + * Creates a new ProtocolInfo having the given name and forms. The given + * forms are used to describe the parameters for both connections and + * sharing profiles. + * + * @param name + * The unique name associated with the protocol. + * + * @param forms + * A collection of forms describing all known parameters for this + * protocol, regardless of whether it is used in the context of a + * connection or a sharing profile. + */ + public ProtocolInfo(String name, Collection forms) { + this(name, forms, new ArrayList(forms)); + } + + /** + * Returns the unique name of this protocol. The protocol name is the + * value required by the corresponding protocol plugin for guacd. + * + * @return The unique name of this protocol. + */ + public String getName() { + return name; + } + + /** + * Sets the unique name of this protocol. The protocol name is the value + * required by the corresponding protocol plugin for guacd. + * + * @param name The unique name of this protocol. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns a mutable collection of forms describing all known parameters for + * a connection using this protocol. Changes to this collection affect the + * forms exposed to the user. + * + * @return + * A mutable collection of forms describing all known parameters for a + * connection using this protocol. + */ + public Collection getConnectionForms() { + return connectionForms; + } + + /** + * Sets the collection of forms describing all known parameters for a + * connection using this protocol. The provided collection must be mutable. + * + * @param connectionForms + * A mutable collection of forms describing all known parameters for a + * connection using this protocol. + */ + public void setConnectionForms(Collection connectionForms) { + this.connectionForms = connectionForms; + } + + /** + * Returns a mutable collection of forms describing all known parameters + * relevant to a sharing profile whose primary connection uses this + * protocol. Changes to this collection affect the forms exposed to the + * user. + * + * @return + * A mutable collection of forms describing all known parameters + * relevant to a sharing profile whose primary connection uses this + * protocol. + */ + public Collection getSharingProfileForms() { + return sharingProfileForms; + } + + /** + * Sets the collection of forms describing all known parameters relevant to + * a sharing profile whose primary connection uses this protocol. The + * provided collection must be mutable. + * + * @param sharingProfileForms + * A mutable collection of forms describing all known parameters + * relevant to a sharing profile whose primary connection uses this + * protocol. + */ + public void setSharingProfileForms(Collection sharingProfileForms) { + this.sharingProfileForms = sharingProfileForms; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/token/GuacamoleTokenUndefinedException.java b/guacamole-ext/src/main/java/org/apache/guacamole/token/GuacamoleTokenUndefinedException.java new file mode 100644 index 0000000..1a80e47 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/token/GuacamoleTokenUndefinedException.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.token; + +import org.apache.guacamole.GuacamoleServerException; + +/** + * An exception thrown when a token cannot be substituted because it has no + * corresponding value. Additional information describing the undefined token + * is provided. + */ +public class GuacamoleTokenUndefinedException extends GuacamoleServerException { + + /** + * The name of the token that is undefined. + */ + private final String tokenName; + + /** + * Creates a new GuacamoleTokenUndefinedException with the given message, + * cause, and associated undefined token name. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param cause + * The cause of this exception. + * + * @param tokenName + * The name of the token which has no defined value. + */ + public GuacamoleTokenUndefinedException(String message, Throwable cause, + String tokenName) { + super(message, cause); + this.tokenName = tokenName; + } + + /** + * Creates a new GuacamoleTokenUndefinedException with the given + * message and associated undefined token name. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param tokenName + * The name of the token which has no defined value. + */ + public GuacamoleTokenUndefinedException(String message, String tokenName) { + super(message); + this.tokenName = tokenName; + } + + /** + * Creates a new GuacamoleTokenUndefinedException with the given cause + * and associated undefined token name. + * + * @param cause + * The cause of this exception. + * + * @param tokenName + * The name of the token which has no defined value. + */ + public GuacamoleTokenUndefinedException(Throwable cause, String tokenName) { + super(cause); + this.tokenName = tokenName; + } + + /** + * Returns the name of the token which has no defined value, causing this + * exception to be thrown. + * + * @return + * The name of the token which has no defined value. + */ + public String getTokenName() { + return tokenName; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java b/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java new file mode 100644 index 0000000..3118cf2 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.token; + +import java.text.SimpleDateFormat; +import java.util.Date; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Utility class which provides access to standardized token names, as well as + * facilities for generating those tokens from common objects. + * + * @deprecated Standard tokens are now supplied by default to the connect() + * functions of connections and connection groups. Manually generating the + * standard tokens is not necessary. + */ +@Deprecated +public class StandardTokens { + + /** + * The name of the username token added via addStandardTokens(). + */ + public static final String USERNAME_TOKEN = "GUAC_USERNAME"; + + /** + * The name of the password token added via addStandardTokens(). + */ + public static final String PASSWORD_TOKEN = "GUAC_PASSWORD"; + + /** + * The name of the client hostname token added via addStandardTokens(). + */ + public static final String CLIENT_HOSTNAME_TOKEN = "GUAC_CLIENT_HOSTNAME"; + + /** + * The name of the client address token added via addStandardTokens(). + */ + public static final String CLIENT_ADDRESS_TOKEN = "GUAC_CLIENT_ADDRESS"; + + /** + * The name of the date token (server-local time) added via + * addStandardTokens(). + */ + public static final String DATE_TOKEN = "GUAC_DATE"; + + /** + * The name of the time token (server-local time) added via + * addStandardTokens(). + */ + public static final String TIME_TOKEN = "GUAC_TIME"; + + /** + * The date format that should be used for the date token. This format must + * be compatible with Java's SimpleDateFormat. + */ + private static final String DATE_FORMAT = "yyyyMMdd"; + + /** + * The date format that should be used for the time token. This format must + * be compatible with Java's SimpleDateFormat. + */ + private static final String TIME_FORMAT = "HHmmss"; + + /** + * This utility class should not be instantiated. + */ + private StandardTokens() {} + + /** + * Adds tokens which are standardized by guacamole-ext to the given + * TokenFilter and which do not require a corresponding Credentials object. + * These the server date and time (GUAC_DATE and GUAC_TIME respectively). + * + * @param filter + * The TokenFilter to add standard tokens to. + */ + public static void addStandardTokens(TokenFilter filter) { + + // Add date/time tokens (server-local time) + Date currentTime = new Date(); + filter.setToken(DATE_TOKEN, new SimpleDateFormat(DATE_FORMAT).format(currentTime)); + filter.setToken(TIME_TOKEN, new SimpleDateFormat(TIME_FORMAT).format(currentTime)); + + } + + /** + * Adds tokens which are standardized by guacamole-ext to the given + * TokenFilter using the values from the given Credentials object. These + * standardized tokens include the current username (GUAC_USERNAME), + * password (GUAC_PASSWORD), and the server date and time (GUAC_DATE and + * GUAC_TIME respectively). If either the username or password are not set + * within the given credentials, the corresponding token(s) will remain + * unset. + * + * @param filter + * The TokenFilter to add standard tokens to. + * + * @param credentials + * The Credentials to use when populating the GUAC_USERNAME and + * GUAC_PASSWORD tokens. + */ + public static void addStandardTokens(TokenFilter filter, Credentials credentials) { + + // Add username token + String username = credentials.getUsername(); + if (username != null) + filter.setToken(USERNAME_TOKEN, username); + + // Add password token + String password = credentials.getPassword(); + if (password != null) + filter.setToken(PASSWORD_TOKEN, password); + + // Add client hostname token + String hostname = credentials.getRemoteHostname(); + if (hostname != null) + filter.setToken(CLIENT_HOSTNAME_TOKEN, hostname); + + // Add client address token + String address = credentials.getRemoteAddress(); + if (address != null) + filter.setToken(CLIENT_ADDRESS_TOKEN, address); + + // Add any tokens which do not require credentials + addStandardTokens(filter); + + } + + /** + * Adds tokens which are standardized by guacamole-ext to the given + * TokenFilter using the values from the given AuthenticatedUser object, + * including any associated credentials. These standardized tokens include + * the current username (GUAC_USERNAME), password (GUAC_PASSWORD), and the + * server date and time (GUAC_DATE and GUAC_TIME respectively). If either + * the username or password are not set within the given user or their + * provided credentials, the corresponding token(s) will remain unset. + * + * @param filter + * The TokenFilter to add standard tokens to. + * + * @param user + * The AuthenticatedUser to use when populating the GUAC_USERNAME and + * GUAC_PASSWORD tokens. + */ + public static void addStandardTokens(TokenFilter filter, AuthenticatedUser user) { + + // Default to the authenticated user's username for the GUAC_USERNAME + // token + filter.setToken(USERNAME_TOKEN, user.getIdentifier()); + + // Add tokens specific to credentials + addStandardTokens(filter, user.getCredentials()); + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/token/TokenFilter.java b/guacamole-ext/src/main/java/org/apache/guacamole/token/TokenFilter.java new file mode 100644 index 0000000..673e134 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/token/TokenFilter.java @@ -0,0 +1,400 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.token; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Filtering object which replaces tokens of the form "${TOKEN_NAME}" with + * their corresponding values. Unknown tokens are not replaced. If TOKEN_NAME + * is a valid token, the literal value "${TOKEN_NAME}" can be included by using + * "$${TOKEN_NAME}". + */ +public class TokenFilter { + + /** + * The logger for this class. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(TokenFilter.class); + + /** + * Regular expression which matches individual tokens, with additional + * capturing groups for convenient retrieval of leading text, the possible + * escape character preceding the token, the name of the token, and the + * entire token itself. + */ + private final Pattern tokenPattern = Pattern.compile("(.*?)(^|.)(\\$\\{([A-Za-z0-9_]*)(\\:(.*))?\\})"); + + /** + * The index of the capturing group within tokenPattern which matches + * non-token text preceding a possible token. + */ + private static final int LEADING_TEXT_GROUP = 1; + + /** + * The index of the capturing group within tokenPattern which matches the + * character immediately preceding a possible token, possibly denoting that + * the token should instead be interpreted as a literal. + */ + private static final int ESCAPE_CHAR_GROUP = 2; + + /** + * The index of the capturing group within tokenPattern which matches the + * entire token, including the leading "${" and terminating "}" strings. + */ + private static final int TOKEN_GROUP = 3; + + /** + * The index of the capturing group within tokenPattern which matches only + * the token name contained within the "${" and "}" strings. + */ + private static final int TOKEN_NAME_GROUP = 4; + + /** + * The index of the capturing group within tokenPattern which matches the + * string of the actual modifier for the token. + */ + private static final int TOKEN_MODIFIER = 6; + + /** + * The values of all known tokens. + */ + private final Map tokenValues; + + /** + * Creates a new TokenFilter which has no associated tokens. Tokens must + * later be given using {@link #setToken(java.lang.String, java.lang.String)} + * or {@link #setTokens(java.util.Map)}. + */ + public TokenFilter() { + this(Collections.emptyMap()); + } + + /** + * Creates a new TokenFilter which is initialized with the given token + * name/value pairs. + * + * @param tokenValues + * A map containing token names and their corresponding values. + */ + public TokenFilter(Map tokenValues) { + this.tokenValues = new HashMap<>(tokenValues); + } + + /** + * Sets the token having the given name to the given value. Any existing + * value for that token is replaced. + * + * @param name + * The name of the token to set. + * + * @param value + * The value to set the token to. + */ + public void setToken(String name, String value) { + tokenValues.put(name, value); + } + + /** + * Returns the value of the token with the given name, or null if no such + * token has been set. + * + * @param name + * The name of the token to return. + * + * @return + * The value of the token with the given name, or null if no such + * token exists. + */ + public String getToken(String name) { + return tokenValues.get(name); + } + + /** + * Removes the value of the token with the given name. If no such token + * exists, this function has no effect. + * + * @param name + * The name of the token whose value should be removed. + */ + public void unsetToken(String name) { + tokenValues.remove(name); + } + + /** + * Returns a map of all tokens, with each key being a token name, and each + * value being the corresponding token value. Changes to this map will + * directly affect the tokens associated with this filter. + * + * @return + * A map of all token names and their corresponding values. + */ + public Map getTokens() { + return tokenValues; + } + + /** + * Replaces all current token values with the contents of the given map, + * where each map key represents a token name, and each map value + * represents a token value. + * + * @param tokens + * A map containing the token names and corresponding values to + * assign. + */ + public void setTokens(Map tokens) { + tokenValues.clear(); + tokenValues.putAll(tokens); + } + + /** + * Filters the given string, replacing any tokens with their corresponding + * values. Handling of undefined tokens depends on the value given for the + * strict flag. + * + * @param input + * The string to filter. + * + * @param strict + * Whether to disallow tokens which lack values from existing in the + * string. If true, an exception will be thrown if any tokens in the + * string lack corresponding values. If false, tokens which lack values + * will be interpreted as literals. + * + * @return + * A copy of the input string, with any tokens replaced with their + * corresponding values. + * + * @throws GuacamoleTokenUndefinedException + * If the strict flag is set to true and at least one token in the + * given string has no corresponding value. + */ + private String filter(String input, boolean strict) + throws GuacamoleTokenUndefinedException { + + StringBuilder output = new StringBuilder(); + Matcher tokenMatcher = tokenPattern.matcher(input); + + // Track last regex match + int endOfLastMatch = 0; + + // For each possible token + while (tokenMatcher.find()) { + + // Pull possible leading text and first char before possible token + String literal = tokenMatcher.group(LEADING_TEXT_GROUP); + String escape = tokenMatcher.group(ESCAPE_CHAR_GROUP); + String modifier = tokenMatcher.group(TOKEN_MODIFIER); + + // Append leading non-token text + output.append(literal); + + // If char before token is '$', the token itself is escaped + if ("$".equals(escape)) { + String notToken = tokenMatcher.group(TOKEN_GROUP); + output.append(notToken); + } + + // If char is not '$', interpret as a token + else { + + // The char before the token, if any, is a literal + output.append(escape); + + // Pull token value + String tokenName = tokenMatcher.group(TOKEN_NAME_GROUP); + String tokenValue = getToken(tokenName); + + // If token is unknown, interpretation depends on whether + // strict mode is enabled + if (tokenValue == null) { + + // Token marked as optional, so just skip it and update + // last match. + if (modifier != null && modifier.equals("OPTIONAL")) { + LOGGER.debug("The token \"{}\" has no value and has been " + + "marked as optional, so it will be treated " + + "as a blank value instead of a literal.", + tokenName); + endOfLastMatch = tokenMatcher.end(); + continue; + } + + // Fail outright if strict mode is enabled + if (strict) + throw new GuacamoleTokenUndefinedException("Token " + + "has no defined value.", tokenName); + + // If strict mode is NOT enabled, simply interpret as + // a literal + output.append(tokenMatcher.group(TOKEN_GROUP)); + + } + + // Otherwise, check for modifiers and substitute value appropriately + else { + + // If a modifier is present, try to use it. + if (modifier != null && !modifier.isEmpty()) { + switch (modifier) { + // Switch token to upper-case + case "UPPER": + output.append(tokenValue.toUpperCase()); + break; + + // Switch token to lower case + case "LOWER": + output.append(tokenValue.toLowerCase()); + break; + + // Just append the token value + default: + output.append(tokenValue); + } + } + + // No modifier present, so just append token value. + else + output.append(tokenValue); + + } + + } + + // Update last regex match + endOfLastMatch = tokenMatcher.end(); + + } + + // Append any remaining non-token text + output.append(input.substring(endOfLastMatch)); + + return output.toString(); + + } + + /** + * Filters the given string, replacing any tokens with their corresponding + * values. Any tokens present in the given string which lack values will + * be interpreted as literals. + * + * @param input + * The string to filter. + * + * @return + * A copy of the input string, with any tokens replaced with their + * corresponding values. + */ + public String filter(String input) { + + // Filter with strict mode disabled (should always succeed) + try { + return filter(input, false); + } + + // GuacamoleTokenUndefinedException cannot be thrown when strict mode + // is disabled + catch (GuacamoleTokenUndefinedException e) { + throw new IllegalStateException("filter() threw " + + "GuacamoleTokenUndefinedException despite strict mode " + + "being disabled."); + } + + } + + /** + * Filters the given string, replacing any tokens with their corresponding + * values. If any token in the given string has no defined value within + * this TokenFilter, a GuacamoleTokenUndefinedException will be thrown. + * + * @param input + * The string to filter. + * + * @return + * A copy of the input string, with any tokens replaced with their + * corresponding values. + * + * @throws GuacamoleTokenUndefinedException + * If at least one token in the given string has no corresponding + * value. + */ + public String filterStrict(String input) + throws GuacamoleTokenUndefinedException { + return filter(input, true); + } + + /** + * Given an arbitrary map containing String values, replace each non-null + * value with the corresponding filtered value. Any tokens present in the + * values of the given map which lack defined values within this + * TokenFilter will be interpreted as literals. + * + * @param map + * The map whose values should be filtered. + */ + public void filterValues(Map map) { + + // For each map entry + for (Map.Entry entry : map.entrySet()) { + + // If value is non-null, filter value through this TokenFilter + String value = entry.getValue(); + if (value != null) + entry.setValue(filter(value)); + + } + + } + + /** + * Given an arbitrary map containing String values, replace each non-null + * value with the corresponding filtered value. If any token in any string + * has no defined value within this TokenFilter, a + * GuacamoleTokenUndefinedException will be thrown. + * + * @param map + * The map whose values should be filtered. + * + * @throws GuacamoleTokenUndefinedException + * If at least one token in at least one string has no corresponding + * value. + */ + public void filterValuesStrict(Map map) + throws GuacamoleTokenUndefinedException { + + // For each map entry + for (Map.Entry entry : map.entrySet()) { + + // If value is non-null, filter value through this TokenFilter + String value = entry.getValue(); + if (value != null) + entry.setValue(filterStrict(value)); + + } + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/token/TokenName.java b/guacamole-ext/src/main/java/org/apache/guacamole/token/TokenName.java new file mode 100644 index 0000000..ae83346 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/token/TokenName.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.token; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility class for generating parameter token names. + */ +public class TokenName { + + /** + * Pattern which matches logical groupings of words within a + * string. This pattern is intended to match logical groupings + * regardless of the naming convention used: "CamelCase", + * "headlessCamelCase", "lowercase_with_underscores", + * "lowercase-with-dashes" or even "aVery-INCONSISTENTMix_ofAllStyles". + */ + private static final Pattern STRING_NAME_GROUPING = Pattern.compile( + + // "Camel" word groups + "\\p{javaUpperCase}\\p{javaLowerCase}+" + + // Groups of digits + + "|[0-9]+" + + // Groups of uppercase letters, excluding the uppercase letter + // which begins a following "Camel" group + + "|\\p{javaUpperCase}+(?!\\p{javaLowerCase})" + + // Groups of lowercase letters which match no other pattern + + "|\\p{javaLowerCase}+" + + // Groups of word characters letters which match no other pattern + + "|\\b\\w+\\b" + + ); + + /** + * This utility class should not be instantiated. + */ + private TokenName() {} + + /** + * Generates the name of the parameter token that should be populated with + * the given string. The provided string will be automatically transformed + * from "CamelCase", "headlessCamelCase", "lowercase_with_underscores", + * and "mixes_ofBoth_Styles" to consistent "UPPERCASE_WITH_UNDERSCORES". + * Each returned token name will be prefixed with the string value provided + * in the prefix. The value provided in prefix will be prepended to the + * string, but will itself not be transformed. + * + * @param name + * The string to be used to generate the token name. + * + * @param prefix + * The prefix to prepend to the generated token name. + * + * @return + * The name of the parameter token that should be populated with the + * given string. + */ + public static String canonicalize(final String name, final String prefix) { + + // If even one logical word grouping cannot be found, default to + // simply converting the string to uppercase and adding the + // prefix + Matcher groupMatcher = STRING_NAME_GROUPING.matcher(name); + if (!groupMatcher.find()) + return prefix + name.toUpperCase(); + + // Split the given name into logical word groups, separated by + // underscores and converted to uppercase + StringBuilder builder = new StringBuilder(prefix); + builder.append(groupMatcher.group(0).toUpperCase()); + + while (groupMatcher.find()) { + builder.append("_"); + builder.append(groupMatcher.group(0).toUpperCase()); + } + + return builder.toString(); + + } + + /** + * Generate the name of a parameter token from the given string, with no + * added prefix, such that the token name will simply be the transformed + * version of the string. See + * {@link #canonicalize(java.lang.String, java.lang.String)} + * + * + * @param name + * The string to use to generate the token name. + * + * @return + * The name of the parameter token that should be populated with the + * given string. + */ + public static String canonicalize(final String name) { + return canonicalize(name, ""); + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/xml/DocumentHandler.java b/guacamole-ext/src/main/java/org/apache/guacamole/xml/DocumentHandler.java new file mode 100644 index 0000000..ed55290 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/xml/DocumentHandler.java @@ -0,0 +1,204 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.xml; + +import java.util.Deque; +import java.util.LinkedList; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * A simple ContentHandler implementation which digests SAX document events and + * produces simpler tag-level events, maintaining its own stack for the + * convenience of the tag handlers. + */ +public class DocumentHandler extends DefaultHandler { + + /** + * The name of the root element of the document. + */ + private String rootElementName; + + /** + * The handler which will be used to handle element events for the root + * element of the document. + */ + private TagHandler root; + + /** + * The stack of all states applicable to the current parser state. Each + * element of the stack references the TagHandler for the element being + * parsed at that level of the document, where the current element is + * last in the stack, and the root element is first. + */ + private Deque stack = + new LinkedList(); + + /** + * Creates a new DocumentHandler which will use the given TagHandler + * to handle the root element. + * + * @param rootElementName The name of the root element of the document + * being handled. + * @param root The TagHandler to use for the root element. + */ + public DocumentHandler(String rootElementName, TagHandler root) { + this.root = root; + this.rootElementName = rootElementName; + } + + /** + * Returns the current element state. The current element state is the + * state of the element the parser is currently within. + * + * @return The current element state. + */ + private DocumentHandlerState getCurrentState() { + + // If no state, return null + if (stack.isEmpty()) + return null; + + return stack.getLast(); + } + + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + + // If the SAX implementation does not provide the local name, the + // qualified name should be used instead + String name = localName.isEmpty() ? qName : localName; + + // Get current state + DocumentHandlerState current = getCurrentState(); + + // Handler for tag just read + TagHandler handler; + + // If no stack, use root handler + if (current == null) { + + // Validate element name + if (!name.equals(rootElementName)) + throw new SAXException("Root element must be '" + rootElementName + "'"); + + handler = root; + } + + // Otherwise, get handler from parent + else { + TagHandler parent_handler = current.getTagHandler(); + handler = parent_handler.childElement(name); + } + + // If no handler returned, the element was not expected + if (handler == null) + throw new SAXException("Unexpected element: '" + name + "'"); + + // Initialize handler + handler.init(attributes); + + // Append new element state to stack + stack.addLast(new DocumentHandlerState(handler)); + + } + + @Override + public void endElement(String uri, String localName, String qName) + throws SAXException { + + // Pop last element from stack + DocumentHandlerState completed = stack.removeLast(); + + // Finish element by sending text content + completed.getTagHandler().complete( + completed.getTextContent().toString()); + + } + + @Override + public void characters(char[] ch, int start, int length) + throws SAXException { + + // Get current state + DocumentHandlerState current = getCurrentState(); + if (current == null) + throw new SAXException("Character data not allowed outside XML document."); + + // Append received chunk to text content + current.getTextContent().append(ch, start, length); + + } + + /** + * The current state of the DocumentHandler. + */ + private static class DocumentHandlerState { + + /** + * The current text content of the current element being parsed. + */ + private StringBuilder textContent = new StringBuilder(); + + /** + * The TagHandler which must handle document events related to the + * element currently being parsed. + */ + private TagHandler tagHandler; + + /** + * Creates a new DocumentHandlerState which will maintain the state + * of parsing of the current element, as well as contain the TagHandler + * which will receive events related to that element. + * + * @param tagHandler The TagHandler which should receive any events + * related to the element being parsed. + */ + public DocumentHandlerState(TagHandler tagHandler) { + this.tagHandler = tagHandler; + } + + /** + * Returns the mutable StringBuilder which contains the current text + * content of the element being parsed. + * + * @return The mutable StringBuilder which contains the current text + * content of the element being parsed. + */ + public StringBuilder getTextContent() { + return textContent; + } + + /** + * Returns the TagHandler which must handle any events relating to the + * element being parsed. + * + * @return The TagHandler which must handle any events relating to the + * element being parsed. + */ + public TagHandler getTagHandler() { + return tagHandler; + } + + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/xml/TagHandler.java b/guacamole-ext/src/main/java/org/apache/guacamole/xml/TagHandler.java new file mode 100644 index 0000000..ad0b8db --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/xml/TagHandler.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.xml; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * A simple element-level event handler for events triggered by the + * SAX-driven DocumentHandler parser. + */ +public interface TagHandler { + + /** + * Called when a child element of the current element is parsed. + * + * @param localName The local name of the child element seen. + * @return The TagHandler which should handle all element-level events + * related to the child element. + * @throws SAXException If the child element being parsed was not expected, + * or some other error prevents a proper TagHandler + * from being constructed for the child element. + */ + public TagHandler childElement(String localName) + throws SAXException; + + /** + * Called when the element corresponding to this TagHandler is first seen, + * just after an instance is created. + * + * @param attributes The attributes of the element seen. + * @throws SAXException If an error prevents a the TagHandler from being + * from being initialized. + */ + public void init(Attributes attributes) throws SAXException; + + /** + * Called when this element, and all child elements, have been fully parsed, + * and the entire text content of this element (if any) is available. + * + * @param textContent The full text content of this element, if any. + * @throws SAXException If the text content received is not valid for any + * reason, or the child elements parsed are not + * correct. + */ + public void complete(String textContent) throws SAXException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/xml/package-info.java b/guacamole-ext/src/main/java/org/apache/guacamole/xml/package-info.java new file mode 100644 index 0000000..f92314b --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/xml/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes driving the SAX-based XML parser used by the Guacamole web + * application. + */ +package org.apache.guacamole.xml; + diff --git a/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/kubernetes.json b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/kubernetes.json new file mode 100644 index 0000000..a6361d6 --- /dev/null +++ b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/kubernetes.json @@ -0,0 +1,215 @@ +{ + "name" : "kubernetes", + + "connectionForms" : [ + + { + "name" : "network", + "fields" : [ + { + "name" : "hostname", + "type" : "TEXT" + }, + { + "name" : "port", + "type" : "NUMERIC" + }, + { + "name" : "use-ssl", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "ignore-cert", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "ca-cert", + "type" : "MULTILINE" + } + ] + }, + + { + "name" : "container", + "fields" : [ + { + "name" : "namespace", + "type" : "TEXT" + }, + { + "name" : "pod", + "type" : "TEXT" + }, + { + "name" : "container", + "type" : "TEXT" + }, + { + "name" : "exec-command", + "type" : "TEXT" + } + ] + }, + + { + "name" : "authentication", + "fields" : [ + { + "name" : "client-cert", + "type" : "MULTILINE" + }, + { + "name" : "client-key", + "type" : "MULTILINE" + } + ] + }, + + { + "name" : "clipboard", + "fields" : [ + { + "name" : "clipboard-buffer-size", + "type" : "ENUM", + "options" : [ "", "262144", "1048576", "10485760" ] + } + ] + }, + + { + "name" : "display", + "fields" : [ + { + "name" : "color-scheme", + "type" : "TERMINAL_COLOR_SCHEME", + "options" : [ "", "black-white", "gray-black", "green-black", "white-black" ] + }, + { + "name" : "font-name", + "type" : "TEXT" + }, + { + "name" : "font-size", + "type" : "ENUM", + "options" : [ "", "8", "9", "10", "11", "12", "14", "18", "24", "30", "36", "48", "60", "72", "96" ] + }, + { + "name" : "scrollback", + "type" : "NUMERIC" + }, + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "clipboard", + "fields" : [ + { + "name" : "disable-copy", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-paste", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "behavior", + "fields" : [ + { + "name" : "backspace", + "type" : "ENUM", + "options" : [ "", "127", "8" ] + } + ] + }, + + { + "name" : "typescript", + "fields" : [ + { + "name" : "typescript-path", + "type" : "TEXT" + }, + { + "name" : "typescript-name", + "type" : "TEXT" + }, + { + "name" : "create-typescript-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "typescript-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "recording", + "fields" : [ + { + "name" : "recording-path", + "type" : "TEXT" + }, + { + "name" : "recording-name", + "type" : "TEXT" + }, + { + "name" : "recording-exclude-output", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-exclude-mouse", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-include-keys", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "create-recording-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + } + + ], + "sharingProfileForms" : [ + + { + "name" : "display", + "fields" : [ + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + } + + ] +} diff --git a/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/rdp.json b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/rdp.json new file mode 100644 index 0000000..5833111 --- /dev/null +++ b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/rdp.json @@ -0,0 +1,528 @@ +{ + "name" : "rdp", + "connectionForms" : [ + + { + "name" : "network", + "fields" : [ + { + "name" : "hostname", + "type" : "TEXT" + }, + { + "name" : "port", + "type" : "NUMERIC" + }, + { + "name" : "timeout", + "type" : "NUMERIC" + } + ] + }, + + { + "name" : "authentication", + "fields" : [ + { + "name" : "username", + "type" : "USERNAME" + }, + { + "name" : "password", + "type" : "PASSWORD" + }, + { + "name" : "domain", + "type" : "TEXT" + }, + { + "name" : "security", + "type" : "ENUM", + "options" : [ "", "rdp", "tls", "nla", "vmconnect", "any" ] + }, + { + "name" : "disable-auth", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "ignore-cert", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "cert-tofu", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "cert-fingerprints", + "type" : "TEXT" + } + ] + }, + + { + "name" : "gateway", + "fields" : [ + { + "name" : "gateway-hostname", + "type" : "TEXT" + }, + { + "name" : "gateway-port", + "type" : "NUMERIC" + }, + { + "name" : "gateway-username", + "type" : "USERNAME" + }, + { + "name" : "gateway-password", + "type" : "PASSWORD" + }, + { + "name" : "gateway-domain", + "type" : "TEXT" + } + ] + }, + + { + "name" : "basic-parameters", + "fields" : [ + { + "name" : "initial-program", + "type" : "TEXT" + }, + { + "name" : "client-name", + "type" : "TEXT" + }, + { + "name" : "server-layout", + "type" : "ENUM", + "options" : [ + "", + "cs-cz-qwertz", + "de-ch-qwertz", + "de-de-qwertz", + "en-gb-qwerty", + "en-us-qwerty", + "es-es-qwerty", + "es-latam-qwerty", + "failsafe", + "fr-be-azerty", + "fr-fr-azerty", + "fr-ca-qwerty", + "fr-ch-qwertz", + "hu-hu-qwertz", + "it-it-qwerty", + "ja-jp-qwerty", + "no-no-qwerty", + "pl-pl-qwerty", + "pt-br-qwerty", + "pt-pt-qwerty", + "ro-ro-qwerty", + "sv-se-qwerty", + "da-dk-qwerty", + "tr-tr-qwerty" + ] + }, + { + "name" : "timezone", + "type" : "TIMEZONE" + }, + { + "name" : "enable-touch", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "console", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "display", + "fields" : [ + { + "name" : "width", + "type" : "NUMERIC" + }, + { + "name" : "height", + "type" : "NUMERIC" + }, + { + "name" : "dpi", + "type" : "NUMERIC" + }, + { + "name" : "color-depth", + "type" : "ENUM", + "options" : [ "", "8", "16", "24", "32" ] + }, + { + "name" : "force-lossless", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "resize-method", + "type" : "ENUM", + "options" : [ "", "reconnect", "display-update" ] + }, + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "clipboard", + "fields" : [ + { + "name" : "normalize-clipboard", + "type" : "ENUM", + "options" : [ "", "preserve", "unix", "windows" ] + }, + { + "name" : "clipboard-buffer-size", + "type" : "ENUM", + "options" : [ "", "262144", "1048576", "10485760", "52428800" ] + }, + { + "name" : "disable-copy", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-paste", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "device-redirection", + "fields" : [ + { + "name" : "console-audio", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-audio", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-audio-input", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-printing", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "printer-name", + "type" : "TEXT" + }, + { + "name" : "enable-drive", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "drive-name", + "type" : "TEXT" + }, + { + "name" : "disable-download", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-upload", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "drive-path", + "type" : "TEXT" + }, + { + "name" : "create-drive-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "static-channels", + "type" : "TEXT" + } + ] + }, + + { + "name" : "performance", + "fields" : [ + { + "name" : "enable-wallpaper", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-theming", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-font-smoothing", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-full-window-drag", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-desktop-composition", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "enable-menu-animations", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-bitmap-caching", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-offscreen-caching", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-glyph-caching", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-gfx", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "remoteapp", + "fields" : [ + { + "name" : "remote-app", + "type" : "TEXT" + }, + { + "name" : "remote-app-dir", + "type" : "TEXT" + }, + { + "name" : "remote-app-args", + "type" : "TEXT" + } + ] + }, + + { + "name" : "preconnection-pdu", + "fields" : [ + { + "name" : "preconnection-id", + "type" : "NUMERIC" + }, + { + "name" : "preconnection-blob", + "type" : "TEXT" + } + ] + }, + + { + "name" : "load-balancing", + "fields" : [ + { + "name" : "load-balance-info", + "type" : "TEXT" + } + ] + }, + + { + "name" : "recording", + "fields" : [ + { + "name" : "recording-path", + "type" : "TEXT" + }, + { + "name" : "recording-name", + "type" : "TEXT" + }, + { + "name" : "recording-exclude-output", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-exclude-mouse", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-exclude-touch", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-include-keys", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "create-recording-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "sftp", + "fields" : [ + { + "name" : "enable-sftp", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "sftp-hostname", + "type" : "TEXT" + }, + { + "name" : "sftp-port", + "type" : "NUMERIC" + }, + { + "name" : "sftp-timeout", + "type" : "NUMERIC" + }, + { + "name" : "sftp-host-key", + "type" : "TEXT" + }, + { + "name" : "sftp-username", + "type" : "USERNAME" + }, + { + "name" : "sftp-password", + "type" : "PASSWORD" + }, + { + "name" : "sftp-private-key", + "type" : "MULTILINE" + }, + { + "name" : "sftp-passphrase", + "type" : "PASSWORD" + }, + { + "name" : "sftp-public-key", + "type" : "MULTILINE" + }, + { + "name" : "sftp-root-directory", + "type" : "TEXT" + }, + { + "name" : "sftp-directory", + "type" : "TEXT" + }, + { + "name" : "sftp-server-alive-interval", + "type" : "NUMERIC" + }, + { + "name" : "sftp-disable-download", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "sftp-disable-upload", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "wol", + "fields" : [ + { + "name" : "wol-send-packet", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "wol-mac-addr", + "type" : "TEXT" + }, + { + "name" : "wol-broadcast-addr", + "type" : "TEXT" + }, + { + "name" : "wol-udp-port", + "type" : "NUMERIC" + }, + { + "name" : "wol-wait-time", + "type" : "NUMERIC" + } + ] + } + + ], + "sharingProfileForms" : [ + + { + "name" : "display", + "fields" : [ + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + } + + ] +} diff --git a/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/ssh.json b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/ssh.json new file mode 100644 index 0000000..a321978 --- /dev/null +++ b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/ssh.json @@ -0,0 +1,271 @@ +{ + "name" : "ssh", + "connectionForms" : [ + + { + "name" : "network", + "fields" : [ + { + "name" : "hostname", + "type" : "TEXT" + }, + { + "name" : "port", + "type" : "NUMERIC" + }, + { + "name" : "host-key", + "type" : "TEXT" + }, + { + "name" : "timeout", + "type" : "NUMERIC" + } + ] + }, + + { + "name" : "authentication", + "fields" : [ + { + "name" : "username", + "type" : "USERNAME" + }, + { + "name" : "password", + "type" : "PASSWORD" + }, + { + "name" : "private-key", + "type" : "MULTILINE" + }, + { + "name" : "passphrase", + "type" : "PASSWORD" + }, + { + "name" : "public-key", + "type" : "MULTILINE" + } + ] + }, + + { + "name" : "display", + "fields" : [ + { + "name" : "color-scheme", + "type" : "TERMINAL_COLOR_SCHEME", + "options" : [ "", "black-white", "gray-black", "green-black", "white-black" ] + }, + { + "name" : "font-name", + "type" : "TEXT" + }, + { + "name" : "font-size", + "type" : "ENUM", + "options" : [ "", "8", "9", "10", "11", "12", "14", "18", "24", "30", "36", "48", "60", "72", "96" ] + }, + { + "name" : "scrollback", + "type" : "NUMERIC" + }, + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "clipboard", + "fields" : [ + { + "name" : "clipboard-buffer-size", + "type" : "ENUM", + "options" : [ "", "262144", "1048576", "10485760" ] + }, + { + "name" : "disable-copy", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-paste", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "session", + "fields" : [ + { + "name" : "command", + "type" : "TEXT" + }, + { + "name" : "locale", + "type" : "TEXT" + }, + { + "name" : "timezone", + "type" : "TIMEZONE" + }, + { + "name" : "server-alive-interval", + "type" : "NUMERIC" + } + ] + }, + + { + "name" : "behavior", + "fields" : [ + { + "name" : "backspace", + "type" : "ENUM", + "options" : [ "", "127", "8" ] + }, + { + "name" : "terminal-type", + "type" : "ENUM", + "options" : [ "", "xterm", "xterm-256color", "vt220", "vt100", "ansi", "linux" ] + } + ] + }, + + { + "name" : "typescript", + "fields" : [ + { + "name" : "typescript-path", + "type" : "TEXT" + }, + { + "name" : "typescript-name", + "type" : "TEXT" + }, + { + "name" : "create-typescript-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "typescript-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "recording", + "fields" : [ + { + "name" : "recording-path", + "type" : "TEXT" + }, + { + "name" : "recording-name", + "type" : "TEXT" + }, + { + "name" : "recording-exclude-output", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-exclude-mouse", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-include-keys", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "create-recording-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "sftp", + "fields" : [ + { + "name" : "enable-sftp", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "sftp-root-directory", + "type" : "TEXT" + }, + { + "name" : "sftp-disable-download", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "sftp-disable-upload", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "wol", + "fields" : [ + { + "name" : "wol-send-packet", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "wol-mac-addr", + "type" : "TEXT" + }, + { + "name" : "wol-broadcast-addr", + "type" : "TEXT" + }, + { + "name" : "wol-udp-port", + "type" : "NUMERIC" + }, + { + "name" : "wol-wait-time", + "type" : "NUMERIC" + } + ] + } + + ], + "sharingProfileForms" : [ + + { + "name" : "display", + "fields" : [ + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + } + + ] +} diff --git a/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/telnet.json b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/telnet.json new file mode 100644 index 0000000..68e488e --- /dev/null +++ b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/telnet.json @@ -0,0 +1,224 @@ +{ + "name" : "telnet", + "connectionForms" : [ + + { + "name" : "network", + "fields" : [ + { + "name" : "hostname", + "type" : "TEXT" + }, + { + "name" : "port", + "type" : "NUMERIC" + }, + { + "name" : "timeout", + "type" : "NUMERIC" + } + ] + }, + + { + "name" : "authentication", + "fields" : [ + { + "name" : "username", + "type" : "USERNAME" + }, + { + "name" : "password", + "type" : "PASSWORD" + }, + { + "name" : "username-regex", + "type" : "TEXT" + }, + { + "name" : "password-regex", + "type" : "TEXT" + }, + { + "name" : "login-success-regex", + "type" : "TEXT" + }, + { + "name" : "login-failure-regex", + "type" : "TEXT" + } + ] + }, + + { + "name" : "display", + "fields" : [ + { + "name" : "color-scheme", + "type" : "TERMINAL_COLOR_SCHEME", + "options" : [ "", "black-white", "gray-black", "green-black", "white-black" ] + }, + { + "name" : "font-name", + "type" : "TEXT" + }, + { + "name" : "font-size", + "type" : "ENUM", + "options" : [ "", "8", "9", "10", "11", "12", "14", "18", "24", "30", "36", "48", "60", "72", "96" ] + }, + { + "name" : "scrollback", + "type" : "NUMERIC" + }, + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "clipboard", + "fields" : [ + { + "name" : "clipboard-buffer-size", + "type" : "ENUM", + "options" : [ "", "262144", "1048576", "10485760" ] + }, + { + "name" : "disable-copy", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-paste", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "behavior", + "fields" : [ + { + "name" : "backspace", + "type" : "ENUM", + "options" : [ "", "127", "8" ] + }, + { + "name" : "terminal-type", + "type" : "ENUM", + "options" : [ "", "xterm", "xterm-256color", "vt220", "vt100", "ansi", "linux" ] + } + ] + }, + + { + "name" : "typescript", + "fields" : [ + { + "name" : "typescript-path", + "type" : "TEXT" + }, + { + "name" : "typescript-name", + "type" : "TEXT" + }, + { + "name" : "create-typescript-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "typescript-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "recording", + "fields" : [ + { + "name" : "recording-path", + "type" : "TEXT" + }, + { + "name" : "recording-name", + "type" : "TEXT" + }, + { + "name" : "recording-exclude-output", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-exclude-mouse", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-include-keys", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "create-recording-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "wol", + "fields" : [ + { + "name" : "wol-send-packet", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "wol-mac-addr", + "type" : "TEXT" + }, + { + "name" : "wol-broadcast-addr", + "type" : "TEXT" + }, + { + "name" : "wol-udp-port", + "type" : "NUMERIC" + }, + { + "name" : "wol-wait-time", + "type" : "NUMERIC" + } + ] + } + + ], + "sharingProfileForms" : [ + + { + "name" : "display", + "fields" : [ + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + } + + ] +} diff --git a/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/vnc.json b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/vnc.json new file mode 100644 index 0000000..85eec1b --- /dev/null +++ b/guacamole-ext/src/main/resources/org/apache/guacamole/protocols/vnc.json @@ -0,0 +1,293 @@ +{ + "name" : "vnc", + "connectionForms" : [ + + { + "name" : "network", + "fields" : [ + { + "name" : "hostname", + "type" : "TEXT" + }, + { + "name" : "port", + "type" : "NUMERIC" + } + ] + }, + + { + "name" : "authentication", + "fields" : [ + { + "name" : "username", + "type" : "USERNAME" + }, + { + "name" : "password", + "type" : "PASSWORD" + } + ] + }, + + { + "name" : "display", + "fields" : [ + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-server-input", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-display-resize", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "swap-red-blue", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "cursor", + "type" : "ENUM", + "options" : [ "", "local", "remote" ] + }, + { + "name" : "color-depth", + "type" : "ENUM", + "options" : [ "", "8", "16", "24", "32" ] + }, + { + "name" : "force-lossless", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "compress-level", + "type" : "ENUM", + "options" : [ "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] + }, + { + "name" : "quality-level", + "type" : "ENUM", + "options" : [ "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] + }, + { + "name" : "encodings", + "type" : "TEXT" + } + ] + }, + + { + "name" : "clipboard", + "fields" : [ + { + "name" : "clipboard-buffer-size", + "type" : "ENUM", + "options" : [ "", "262144", "1048576", "10485760", "52428800" ] + }, + { + "name" : "clipboard-encoding", + "type" : "ENUM", + "options" : [ "", "ISO8859-1", "UTF-8", "UTF-16", "CP1252" ] + }, + { + "name" : "disable-copy", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "disable-paste", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "repeater", + "fields" : [ + { + "name" : "dest-host", + "type" : "TEXT" + }, + { + "name" : "dest-port", + "type" : "NUMERIC" + } + ] + }, + + { + "name" : "recording", + "fields" : [ + { + "name" : "recording-path", + "type" : "TEXT" + }, + { + "name" : "recording-name", + "type" : "TEXT" + }, + { + "name" : "recording-exclude-output", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-exclude-mouse", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-include-keys", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "create-recording-path", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "recording-write-existing", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "sftp", + "fields" : [ + { + "name" : "enable-sftp", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "sftp-hostname", + "type" : "TEXT" + }, + { + "name" : "sftp-port", + "type" : "NUMERIC" + }, + { + "name" : "sftp-timeout", + "type" : "NUMERIC" + }, + { + "name" : "sftp-host-key", + "type" : "TEXT" + }, + { + "name" : "sftp-username", + "type" : "USERNAME" + }, + { + "name" : "sftp-password", + "type" : "PASSWORD" + }, + { + "name" : "sftp-private-key", + "type" : "MULTILINE" + }, + { + "name" : "sftp-passphrase", + "type" : "PASSWORD" + }, + { + "name" : "sftp-public-key", + "type" : "MULTILINE" + }, + { + "name" : "sftp-root-directory", + "type" : "TEXT" + }, + { + "name" : "sftp-directory", + "type" : "TEXT" + }, + { + "name" : "sftp-server-alive-interval", + "type" : "NUMERIC" + }, + { + "name" : "sftp-disable-download", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "sftp-disable-upload", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + }, + + { + "name" : "audio", + "fields" : [ + { + "name" : "enable-audio", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "audio-servername", + "type" : "TEXT" + } + ] + }, + + { + "name" : "wol", + "fields" : [ + { + "name" : "wol-send-packet", + "type" : "BOOLEAN", + "options" : [ "true" ] + }, + { + "name" : "wol-mac-addr", + "type" : "TEXT" + }, + { + "name" : "wol-broadcast-addr", + "type" : "TEXT" + }, + { + "name" : "wol-udp-port", + "type" : "NUMERIC" + }, + { + "name" : "wol-wait-time", + "type" : "NUMERIC" + } + ] + } + + ], + "sharingProfileForms" : [ + + { + "name" : "display", + "fields" : [ + { + "name" : "read-only", + "type" : "BOOLEAN", + "options" : [ "true" ] + } + ] + } + + ] +} diff --git a/guacamole-ext/src/test/java/org/apache/guacamole/net/auth/DirectoryTest.java b/guacamole-ext/src/test/java/org/apache/guacamole/net/auth/DirectoryTest.java new file mode 100644 index 0000000..04623aa --- /dev/null +++ b/guacamole-ext/src/test/java/org/apache/guacamole/net/auth/DirectoryTest.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.junit.Assert; +import org.junit.Test; + +/** + * Test that verifies the functionality provided by the Directory interface. + */ +public class DirectoryTest { + + /** + * Returns a Collection of all classes that have associated Directories + * available via the UserContext interface. The classes are retrieved + * using reflection by enumerating the type parameters of the return types + * of all functions that return a Directory. + * + * @return + * A Collection of all classes that have associated Directories + * available via the UserContext interface. + */ + @SuppressWarnings("unchecked") // Verified via calls to isAssignableFrom() + private Collection> getDirectoryTypes() { + + Set> types = new HashSet<>(); + + Method[] methods = UserContext.class.getMethods(); + for (Method method : methods) { + + if (!Directory.class.isAssignableFrom(method.getReturnType())) + continue; + + Type retType = method.getGenericReturnType(); + Assert.assertTrue("UserContext functions that return directories " + + "must have proper type parameters for the returned " + + "directory.", retType instanceof ParameterizedType); + + Type[] typeArgs = ((ParameterizedType) retType).getActualTypeArguments(); + Assert.assertEquals("UserContext functions that return directories " + + "must properly declare exactly one type argument for " + + "those directories.", 1, typeArgs.length); + + Class directoryType = (Class) typeArgs[0]; + Assert.assertTrue("Directories returned by UserContext functions " + + "must contain subclasses of Identifiable.", + Identifiable.class.isAssignableFrom(directoryType)); + + types.add((Class) directoryType); + + } + + return Collections.unmodifiableSet(types); + + } + + /** + * Verifies that Directory.Type covers the types of all directories exposed + * by the UserContext interface. + */ + @Test + public void testTypeCoverage() { + + Collection> types = getDirectoryTypes(); + + Assert.assertEquals("Directory.Type must provide exactly one value " + + "for each type of directory provideed by the UserContext " + + "interface.", types.size(), Directory.Type.values().length); + + for (Class type : types) { + + Directory.Type dirType = Directory.Type.of(type); + Assert.assertNotNull("of() must provide mappings for all directory " + + "types defined on the UserContext interface.", dirType); + + Assert.assertEquals("getObjectType() must return the same base " + + "superclass used by UserContext for all directory " + + "types defined on the UserContext interface.", type, + dirType.getObjectType()); + + } + + } + + /** + * Verifies that each type declared by Directory.Type exposes an + * associated class via getObjectType() which then maps back to the same + * type via Directory.Type.of(). + */ + @Test + public void testTypeIdentity() { + for (Directory.Type dirType : Directory.Type.values()) { + Assert.assertEquals("For all defined directory types, " + + "Directory.Type.of(theType.getObjectType()) must " + + "correctly map back to theType.", dirType, + Directory.Type.of(dirType.getObjectType())); + } + } + +} diff --git a/guacamole-ext/src/test/java/org/apache/guacamole/properties/EnumGuacamolePropertyTest.java b/guacamole-ext/src/test/java/org/apache/guacamole/properties/EnumGuacamolePropertyTest.java new file mode 100644 index 0000000..f2f313c --- /dev/null +++ b/guacamole-ext/src/test/java/org/apache/guacamole/properties/EnumGuacamolePropertyTest.java @@ -0,0 +1,374 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Test which verifies that EnumGuacamoleProperty functions correctly. + */ +public class EnumGuacamolePropertyTest { + + /** + * Example enum consisting of a small set of possible fish. All values of + * this enum are annotated with {@link PropertyValue}. + */ + public static enum Fish { + + /** + * Salmon are large, anadromous fish prized for their pink/red/orange + * flesh. + * + * @see Salmon (Wikipedia) + */ + @PropertyValue("salmon") + SALMON, + + /** + * Trout are freshwater fish related to salmon, popular both as food + * and as game fish. + * + * @see Trout (Wikipedia) + */ + @PropertyValue("trout") + TROUT, + + /** + * Mackerel are pelagic fish, typically having vertical stripes along + * their backs. + * + * @see Mackerel (Wikipedia) + */ + @PropertyValue("mackerel") + MACKEREL, + + /** + * Tuna are large, predatory, saltwater fish in the same family as + * mackerel. They are one of the few fish that can maintain a body + * temperature higher than the surrounding water. + * + * @see Tuna (Wikipedia) + */ + @PropertyValue("tuna") + @PropertyValue("yellowfin") + TUNA, + + /** + * Sardines are small, herring-like fish commonly served in cans. + * Sardines are considered prey fish and feed almost exclusively on + * zooplankton. + * + * @see Sardine (Wikipedia) + */ + @PropertyValue("sardine") + SARDINE + + } + + /** + * Example enum consisting of a small set of possible vegetables. None of + * the values of this enum are annotated with {@link PropertyValue}. + */ + public static enum Vegetable { + + /** + * Potatoes are starchy root vegetables native to the Americas. The + * tuber itself is edible, but other parts can be toxic. + * + * @see Potato (Wikipedia) + */ + POTATO, + + /** + * Carrots are root vegetables, tapered in shape and generally orange + * in color. + * + * @see Carrot (Wikipedia) + */ + CARROT + + } + + /** + * Example Guacamole property which parses String values as Fish constants. + */ + private static final EnumGuacamoleProperty FAVORITE_FISH = new EnumGuacamoleProperty(Fish.class) { + + @Override + public String getName() { + return "favorite-fish"; + } + + }; + + /** + * Verifies that EnumGuacamoleProperty correctly parses string values that + * are associated with their corresponding enum constants using the + * {@link PropertyValue} annotation. + * + * @throws GuacamoleException + * If a valid test value is incorrectly recognized by parseValue() as + * invalid. + */ + @Test + public void testParseValue() throws GuacamoleException { + assertEquals(Fish.SALMON, FAVORITE_FISH.parseValue("salmon")); + assertEquals(Fish.TROUT, FAVORITE_FISH.parseValue("trout")); + assertEquals(Fish.MACKEREL, FAVORITE_FISH.parseValue("mackerel")); + assertEquals(Fish.TUNA, FAVORITE_FISH.parseValue("tuna")); + assertEquals(Fish.TUNA, FAVORITE_FISH.parseValue("yellowfin")); + assertEquals(Fish.SARDINE, FAVORITE_FISH.parseValue("sardine")); + } + + /** + * Verifies that the absence of a property value (null) is parsed by + * EnumGuacamoleProperty as the absence of an enum constant (also null). + * + * @throws GuacamoleException + * If a valid test value is incorrectly recognized by parseValue() as + * invalid. + */ + @Test + public void testParseNullValue() throws GuacamoleException { + assertNull(FAVORITE_FISH.parseValue(null)); + } + + /** + * Verifies that GuacamoleException is thrown when attempting to parse an + * invalid value, and that the error message contains a sorted list of all + * allowed values. + */ + @Test + public void testParseInvalidValue() { + try { + FAVORITE_FISH.parseValue("anchovy"); + fail("Invalid EnumGuacamoleProperty values should fail to parse with an exception."); + } + catch (GuacamoleException e) { + String message = e.getMessage(); + assertTrue(message.contains("\"mackerel\", \"salmon\", \"sardine\", \"trout\", \"tuna\", \"yellowfin\"")); + } + } + + /** + * Verifies that EnumGuacamoleProperty can be constructed for enums that + * are not annotated with {@link PropertyValue}. + * + * @throws GuacamoleException + * If a valid test value is incorrectly recognized by parseValue() as + * invalid. + */ + @Test + public void testUnannotatedEnum() throws GuacamoleException { + + EnumGuacamoleProperty favoriteVegetable = new EnumGuacamoleProperty( + "potato", Vegetable.POTATO, + "carrot", Vegetable.CARROT + ) { + + @Override + public String getName() { + return "favorite-vegetable"; + } + + }; + + assertEquals(Vegetable.POTATO, favoriteVegetable.parseValue("potato")); + assertEquals(Vegetable.CARROT, favoriteVegetable.parseValue("carrot")); + + } + + /** + * Verifies that an IllegalArgumentException is thrown if key/value pairs + * are provided in the wrong order (value followed by key instead of key + * followed by value). + */ + @Test + public void testUnannotatedEnumBadOrder() { + + try { + + new EnumGuacamoleProperty( + "potato", Vegetable.POTATO, + Vegetable.CARROT, "carrot" + ) { + + @Override + public String getName() { + return "favorite-vegetable"; + } + + }; + + fail("EnumGuacamoleProperty should not accept key/value pairs in value/key order."); + + } + catch (IllegalArgumentException e) { + // Success + } + + } + + /** + * Verifies that an IllegalArgumentException is thrown if constants from + * the wrong enum are provided in an explicit mapping. + */ + @Test + public void testUnannotatedEnumBadValue() { + + try { + + new EnumGuacamoleProperty( + "potato", Vegetable.POTATO, + "carrot", Fish.TROUT + ) { + + @Override + public String getName() { + return "favorite-vegetable"; + } + + }; + + fail("EnumGuacamoleProperty should not accept values from the wrong enum."); + + } + catch (IllegalArgumentException e) { + // Success + } + + } + + /** + * Verifies that an IllegalArgumentException is thrown if non-String keys + * are provided in an explicit mapping. + */ + @Test + public void testUnannotatedEnumBadKey() { + + try { + + new EnumGuacamoleProperty( + "potato", Vegetable.POTATO, + 1, Vegetable.CARROT + ) { + + @Override + public String getName() { + return "favorite-vegetable"; + } + + }; + + fail("EnumGuacamoleProperty should not accept keys that are not Strings."); + + } + catch (IllegalArgumentException e) { + // Success + } + + } + + /** + * Verifies that an IllegalArgumentException is thrown if the length of the + * {@code additional} array is not even. + */ + @Test + public void testUnannotatedEnumBadLength() { + + try { + + new EnumGuacamoleProperty( + "potato", Vegetable.POTATO, + 1, Vegetable.CARROT, 2 + ) { + + @Override + public String getName() { + return "favorite-vegetable"; + } + + }; + + fail("EnumGuacamoleProperty should not accept additional key/value pairs from an array that is not even in length."); + + } + catch (IllegalArgumentException e) { + // Success + } + + } + + /** + * Verifies that explicit string/constant mappings take priority over the + * {@link PropertyValue} annotation when both are used. + * + * @throws GuacamoleException + * If a valid test value is incorrectly recognized by parseValue() as + * invalid. + */ + @Test + public void testAnnotationPrecedence() throws GuacamoleException { + + EnumGuacamoleProperty favoriteFish = new EnumGuacamoleProperty( + "chinook", Fish.SALMON, + "rainbow", Fish.TROUT + ) { + + @Override + public String getName() { + return "favorite-fish"; + } + + }; + + assertEquals(Fish.SALMON, favoriteFish.parseValue("chinook")); + assertEquals(Fish.TROUT, favoriteFish.parseValue("rainbow")); + + try { + favoriteFish.parseValue("salmon"); + fail("Explicit key/value mapping should take priority over annotations."); + } + catch (GuacamoleException e) { + // Success + } + + try { + favoriteFish.parseValue("trout"); + fail("Explicit key/value mapping should take priority over annotations."); + } + catch (GuacamoleException e) { + // Success + } + + try { + favoriteFish.parseValue("tuna"); + fail("Annotations should not have any effect if explicit key/value mapping is used."); + } + catch (GuacamoleException e) { + // Success + } + + } + +} diff --git a/guacamole-ext/src/test/java/org/apache/guacamole/properties/TimeZoneGuacamolePropertyTest.java b/guacamole-ext/src/test/java/org/apache/guacamole/properties/TimeZoneGuacamolePropertyTest.java new file mode 100644 index 0000000..4c4ced1 --- /dev/null +++ b/guacamole-ext/src/test/java/org/apache/guacamole/properties/TimeZoneGuacamolePropertyTest.java @@ -0,0 +1,258 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Arrays; +import java.util.List; +import java.util.TimeZone; +import org.apache.guacamole.GuacamoleException; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Tests that validate Time Zone property input. + */ +public class TimeZoneGuacamolePropertyTest { + + /** + * An array of valid TimeZones that should be correct parsed by the TimeZone + * property, returning either the same or synonymous zone. + */ + private static final List TZ_TEST_VALID = Arrays.asList( + "America/Los_Angeles", + "America/New_York", + "Australia/Sydney", + "Africa/Johannesburg", + "Asia/Shanghai" + ); + + /** + * An array of invalid timezone names that should be parsed to GMT, which + * should cause an exception to be thrown by the TimeZone property. + */ + private static final List TZ_TEST_INVALID = Arrays.asList( + "Chips/Guacamole", + "Chips/Queso", + "Chips/Salsa", + "Mashed/Avacado", + "Pico/De_Guayo" + ); + + /** + * An array of valid GMT specifications that should be correctly parsed + * by the TimeZone property as GMT. + */ + private static final List TZ_GMT_VALID = Arrays.asList( + "GMT", + "GMT-0000", + "GMT+000", + "GMT+00:00", + "GMT-0:00", + "GMT+0" + ); + + /** + * An array of invalid GMT specifications that should cause an exception to + * be thrown for the TimeZone property. + */ + private static final List TZ_GMT_INVALID = Arrays.asList( + "GMTx0000", + "GMT=00:00", + "GMT0:00", + "GMT+000000", + "GMT-000:000", + "GMT100" + ); + + /** + * An array of custom GMT offsets that should evaluate correctly for + * the TimeZone property. + */ + private static final List TZ_CUSTOM_VALID = Arrays.asList( + "GMT-23:59", + "GMT+01:30", + "GMT-00:30", + "GMT-11:25" + ); + + /** + * An array of invalid custom GMT offsets that should cause an exception + * to be thrown by the TimeZone property. + */ + private static final List TZ_CUSTOM_INVALID = Arrays.asList( + "GMT-9999", + "GMT+2500", + "GMT+29:30", + "GMT-1:99", + "GMT+10:65" + ); + + /** + * The list of all available timezones that are known to the TimeZone class. + */ + private static final List TZ_AVAIL_IDS = + Arrays.asList(TimeZone.getAvailableIDs()); + + /** + * An example TimeZoneGuacamoleProperty for testing how various possible + * TimeZone values will be parsed. + */ + private static final TimeZoneGuacamoleProperty WHERE_IN_WORLD = + new TimeZoneGuacamoleProperty() { + + @Override + public String getName() { + return "carmen-sandiego"; + } + + }; + + /** + * Tests to verify that each of the items in this list returns a valid, + * non-GMT timezone. + * + * @throws GuacamoleException + * If a test value fails to parse correctly as a non-GMT timezone. + */ + @Test + public void testValidTZs() throws GuacamoleException { + for (String tzStr : TZ_TEST_VALID) { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + assertFalse(TimeZoneGuacamoleProperty.GMT_REGEX.matcher(tzId).matches()); + } + } + + /** + * Tests invalid time zones to make sure that they produce the desired + * result, which is an exception thrown failing to parse the value. + */ + @Test + public void testInvalidTZs() { + TZ_TEST_INVALID.forEach((tzStr) -> { + try { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + fail("Invalid TimeZoneGuacamoleProperty should fail to parse with an exception."); + } + catch (GuacamoleException e) { + String msg = e.getMessage(); + assertTrue(msg.contains("does not specify a valid time zone")); + } + }); + } + + /** + * Tests a list of strings that should be valid representations of the GMT + * time zone, throwing an exception if an invalid String is found. + * + * @throws GuacamoleException + * If the test value incorrectly fails to parse as a valid GMT string. + */ + @Test + public void testValidGMT() throws GuacamoleException { + for (String tzStr : TZ_GMT_VALID) { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + assertNotNull(tzId); + } + } + + /** + * Tests various invalid GMT representations to insure that parsing of these + * values fails and the expected GuacamoleException is thrown. + */ + @Test + public void testInvalidGMT() { + TZ_GMT_INVALID.forEach((tzStr) -> { + try { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + fail("Invalid GMT value \"" + tzStr + "\" for TimeZoneGuacamoleProperty should fail to parse with an exception."); + } + catch (GuacamoleException e) { + String msg = e.getMessage(); + assertTrue(msg.contains("does not specify a valid time zone")); + } + }); + } + + /** + * Tests several custom offsets from GMT to make sure that they are returned + * as valid TimeZone objects. + * + * @throws GuacamoleException + * If the test unexpectedly fails because a custom offset throws an + * exception as an invalid TimeZone. + */ + @Test + public void testValidCustomTz() throws GuacamoleException { + for (String tzStr : TZ_CUSTOM_VALID) { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + assertNotNull(tzId); + } + } + + /** + * Tests several invalid custom timezone offsets to make sure that they are + * not accepted as valid timezones. + */ + @Test + public void testInvalidCustomTz() { + TZ_CUSTOM_INVALID.forEach((tzStr) -> { + try { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + fail("Invalid custom time zone value \"" + tzStr + "\" for TimeZoneGuacamoleProperty should fail to parse with an exception."); + } + catch (GuacamoleException e) { + String msg = e.getMessage(); + assertTrue(msg.contains("does not specify a valid time zone")); + } + }); + } + + /** + * Tests the list of available identifiers provided by the TimeZone class + * to make sure that all identifiers provided pass through successfully and + * do not yield unexpected results. + * + * @throws GuacamoleException + * If the test fails unexpectedly because the timezone is not recognized + * and is converted to GMT. + */ + public void availTzCheck() throws GuacamoleException { + for (String tzStr : TZ_AVAIL_IDS) { + String tzId = WHERE_IN_WORLD.parseValue(tzStr).getID(); + assertNotNull(tzId); + assertTrue(tzId.equals(tzStr)); + } + } + + /** + * Tests parse of null input values to make sure the resuling parsed value + * is also null. + * + * @throws GuacamoleException + * If the test unexpectedly fails parsing a null value instead + * recognizing it as an invalid value. + */ + @Test + public void nullTzCheck() throws GuacamoleException { + assertNull(WHERE_IN_WORLD.parseValue(null)); + } + + +} diff --git a/guacamole-ext/src/test/java/org/apache/guacamole/token/TokenFilterTest.java b/guacamole-ext/src/test/java/org/apache/guacamole/token/TokenFilterTest.java new file mode 100644 index 0000000..116a860 --- /dev/null +++ b/guacamole-ext/src/test/java/org/apache/guacamole/token/TokenFilterTest.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.token; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * Test which verifies the filtering functionality of TokenFilter. + */ +public class TokenFilterTest { + + /** + * Verifies that token replacement via filter() functions as specified. + */ + @Test + public void testFilter() { + + // Create token filter + TokenFilter tokenFilter = new TokenFilter(); + tokenFilter.setToken("TOKEN_A", "value-of-a"); + tokenFilter.setToken("TOKEN_B", "value-of-b"); + tokenFilter.setToken("TOKEN_C", "Value-of-C"); + + // Test basic substitution and escaping + assertEquals( + "$${NOPE}hellovalue-of-aworldvalue-of-b${NOT_A_TOKEN}", + tokenFilter.filter("$$${NOPE}hello${TOKEN_A}world${TOKEN_B}$${NOT_A_TOKEN}") + ); + + // Unknown tokens must be interpreted as literals + assertEquals( + "${NOPE}hellovalue-of-aworld${TOKEN_D}", + tokenFilter.filter("${NOPE}hello${TOKEN_A}world${TOKEN_D}") + ); + + assertEquals( + "Value-of-C", + tokenFilter.filter("${TOKEN_C}") + ); + + assertEquals( + "value-of-c", + tokenFilter.filter("${TOKEN_C:LOWER}") + ); + + assertEquals( + "VALUE-OF-C", + tokenFilter.filter("${TOKEN_C:UPPER}") + ); + + } + + /** + * Verifies that token replacement via filterValues() functions as + * specified. + */ + @Test + public void testFilterValues() { + + // Create token filter + TokenFilter tokenFilter = new TokenFilter(); + tokenFilter.setToken("TOKEN_A", "value-of-a"); + tokenFilter.setToken("TOKEN_B", "value-of-b"); + + // Create test map + Map map = new HashMap<>(); + map.put(1, "$$${NOPE}hello${TOKEN_A}world${TOKEN_B}$${NOT_A_TOKEN}"); + map.put(2, "${NOPE}hello${TOKEN_A}world${TOKEN_C}"); + map.put(3, null); + + // Filter map values + tokenFilter.filterValues(map); + + // Filter should not affect size of map + assertEquals(3, map.size()); + + // Filtered value 1 + assertEquals( + "$${NOPE}hellovalue-of-aworldvalue-of-b${NOT_A_TOKEN}", + map.get(1) + ); + + // Filtered value 2 + assertEquals( + "${NOPE}hellovalue-of-aworld${TOKEN_C}", + map.get(2) + ); + + // Null values are not filtered + assertNull(map.get(3)); + + } + +} diff --git a/guacamole-ext/src/test/java/org/apache/guacamole/token/TokenNameTest.java b/guacamole-ext/src/test/java/org/apache/guacamole/token/TokenNameTest.java new file mode 100644 index 0000000..a1d3e2f --- /dev/null +++ b/guacamole-ext/src/test/java/org/apache/guacamole/token/TokenNameTest.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.token; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +/** + * Test which verifies automatic generation of connection parameter token names. + */ +public class TokenNameTest { + + /** + * Verifies that TokenName.canonicalize() generates token names as + * specified, regardless of the format of the provided string. + */ + @Test + public void testCanonicalize() { + assertEquals("A", TokenName.canonicalize("a")); + assertEquals("B", TokenName.canonicalize("b")); + assertEquals("1", TokenName.canonicalize("1")); + assertEquals("SOME_URL", TokenName.canonicalize("someURL")); + assertEquals("LOWERCASE_WITH_DASHES", TokenName.canonicalize("lowercase-with-dashes")); + assertEquals("HEADLESS_CAMEL_CASE", TokenName.canonicalize("headlessCamelCase")); + assertEquals("CAMEL_CASE", TokenName.canonicalize("CamelCase")); + assertEquals("CAMEL_CASE", TokenName.canonicalize("CamelCase")); + assertEquals("LOWERCASE_WITH_UNDERSCORES", TokenName.canonicalize("lowercase_with_underscores")); + assertEquals("UPPERCASE_WITH_UNDERSCORES", TokenName.canonicalize("UPPERCASE_WITH_UNDERSCORES")); + assertEquals("A_VERY_INCONSISTENT_MIX_OF_ALL_STYLES", TokenName.canonicalize("aVery-INCONSISTENTMix_ofAllStyles")); + assertEquals("ABC_123_DEF_456", TokenName.canonicalize("abc123def456")); + assertEquals("ABC_123_DEF_456", TokenName.canonicalize("ABC123DEF456")); + assertEquals("WORD_A_WORD_AB_WORD_ABC_WORD", TokenName.canonicalize("WordAWordABWordABCWord")); + + assertEquals("AUTH_ATTRIBUTE", TokenName.canonicalize("Attribute", "AUTH_")); + assertEquals("auth_SOMETHING", TokenName.canonicalize("Something", "auth_")); + } + +} diff --git a/guacamole/.gitignore b/guacamole/.gitignore new file mode 100644 index 0000000..104d923 --- /dev/null +++ b/guacamole/.gitignore @@ -0,0 +1,6 @@ +src/main/webapp/META-INF/ +src/main/webapp/generated/ +nb-configuration.xml +customs.json +target/ +*~ diff --git a/guacamole/.ratignore b/guacamole/.ratignore new file mode 100644 index 0000000..548fcb7 --- /dev/null +++ b/guacamole/.ratignore @@ -0,0 +1 @@ +src/main/frontend/dist/**/* diff --git a/guacamole/doc/example/user-mapping.xml b/guacamole/doc/example/user-mapping.xml new file mode 100644 index 0000000..3b4853f --- /dev/null +++ b/guacamole/doc/example/user-mapping.xml @@ -0,0 +1,70 @@ + + + + + + + vnc + localhost + 5900 + VNCPASS + + + + + + + + vnc + localhost + 5901 + VNCPASS + + + + + vnc + otherhost + 5900 + VNCPASS + + + + + + + + + vnc + localhost + 5900 + VNCPASS + + + + + diff --git a/guacamole/pom.xml b/guacamole/pom.xml new file mode 100644 index 0000000..b0743b0 --- /dev/null +++ b/guacamole/pom.xml @@ -0,0 +1,379 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole + war + 1.6.0 + guacamole + http://guacamole.apache.org/ + + + org.apache.guacamole + guacamole-client + 1.6.0 + ../ + + + + The Guacamole web application, providing authentication and an HTML5 + remote desktop client. + + + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + https://github.com/apache/guacamole-client + scm:git:https://git.wip-us.apache.org/repos/asf/guacamole-client.git + + + + + + + + com.github.eirslett + frontend-maven-plugin + 1.11.3 + + src/main/frontend + ${project.build.directory} + + + + --openssl-legacy-provider + + + + + + install-node-and-npm + + install-node-and-npm + + + v18.18.0 + 9.8.1 + + + + npm-ci + + npm + + + ci + + + + npm-build + generate-resources + + npm + + + run build + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + copy-npm-dependency-list + generate-resources + + copy-resources + + + ${dependency.list.directory} + + + src/main/frontend/dist + + npm-dependencies.txt + + + + + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + generate-license-files + generate-resources + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.1 + + + + + + + src/main/frontend/dist + + translations/*.json + index.html + verifyCachedVersion.js + + + + + + src/main/frontend/dist + true + + translations/*.json + index.html + verifyCachedVersion.js + + + + + + ${project.build.directory}/licenses + META-INF + + + + + + + + org.apache.guacamole + guacamole-common-js + zip + + + + + + + default-cli + process-resources + + exploded + + + + + + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + javax.websocket + javax.websocket-api + 1.0 + provided + + + + + org.slf4j + slf4j-api + + + org.slf4j + jul-to-slf4j + + + ch.qos.logback + logback-classic + + + + + com.sun.mail + javax.mail + + + + + + + + org.apache.guacamole + guacamole-ext + 1.6.0 + + + + + org.apache.guacamole + guacamole-common-js + 1.6.0 + zip + runtime + + + + + org.eclipse.jetty + jetty-websocket + 8.1.1.v20120215 + provided + + + + + org.eclipse.jetty + jetty-parent + 20 + provided + pom + + + org.eclipse.jetty.websocket + websocket-api + 9.0.7.v20131107 + provided + + + org.eclipse.jetty.websocket + websocket-servlet + 9.0.7.v20131107 + provided + + + + + org.apache.tomcat + tomcat-catalina + 7.0.37 + provided + + + + org.apache.tomcat + tomcat-coyote + 7.0.37 + provided + + + + + com.google.inject + guice + + + com.google.inject.extensions + guice-assistedinject + + + com.google.inject.extensions + guice-servlet + + + + + org.glassfish.jersey.containers + jersey-container-servlet-core + + + org.glassfish.jersey.inject + jersey-hk2 + + + org.glassfish.hk2 + guice-bridge + + + org.glassfish.jersey.media + jersey-media-json-jackson + + + + + jakarta.activation + jakarta.activation-api + + + + + + + + javax.annotation + jsr250-api + 1.0 + + + + + com.google.guava + guava + + + + + jakarta.activation + jakarta.activation-api + 1.2.2 + + + + + diff --git a/guacamole/src/licenses/bundled/angular-module-shim-0.0.4/LICENSE b/guacamole/src/licenses/bundled/angular-module-shim-0.0.4/LICENSE new file mode 100644 index 0000000..806ee6e --- /dev/null +++ b/guacamole/src/licenses/bundled/angular-module-shim-0.0.4/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Jed Richards + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/guacamole/src/licenses/bundled/angular-module-shim-0.0.4/README b/guacamole/src/licenses/bundled/angular-module-shim-0.0.4/README new file mode 100644 index 0000000..24f2b27 --- /dev/null +++ b/guacamole/src/licenses/bundled/angular-module-shim-0.0.4/README @@ -0,0 +1,8 @@ +angular-module-shim (https://github.com/jedrichards/angular-module-shim) +------------------------------------------------------------------------ + + Version: 0.0.4 + From: 'Jed Richards' (https://github.com/jedrichards) + License(s): + MIT (bundled/angular-module-shim-0.0.4/LICENSE) + diff --git a/guacamole/src/licenses/bundled/carlito/LICENSE b/guacamole/src/licenses/bundled/carlito/LICENSE new file mode 100644 index 0000000..e999b31 --- /dev/null +++ b/guacamole/src/licenses/bundled/carlito/LICENSE @@ -0,0 +1,95 @@ +Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Carlito". + +This Font Software is licensed under the SIL Open Font License, +Version 1.1 as shown below. + +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. + diff --git a/guacamole/src/licenses/bundled/carlito/README b/guacamole/src/licenses/bundled/carlito/README new file mode 100644 index 0000000..5e82a31 --- /dev/null +++ b/guacamole/src/licenses/bundled/carlito/README @@ -0,0 +1,8 @@ +Carlito (http://code.google.com/p/chromium/issues/detail?id=280557) +------------------------------------------------------------------- + + Version: N/A + From: 'tyPoland Lukasz Dziedzic' (http://www.lukaszdziedzic.eu/) + License(s): + SIL Open Font (bundled/carlito/LICENSE) + diff --git a/guacamole/src/licenses/bundled/glyptodon-enterprise-player/LICENSE b/guacamole/src/licenses/bundled/glyptodon-enterprise-player/LICENSE new file mode 100644 index 0000000..69e9767 --- /dev/null +++ b/guacamole/src/licenses/bundled/glyptodon-enterprise-player/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2019 Glyptodon, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/guacamole/src/licenses/bundled/glyptodon-enterprise-player/README b/guacamole/src/licenses/bundled/glyptodon-enterprise-player/README new file mode 100644 index 0000000..c9cef30 --- /dev/null +++ b/guacamole/src/licenses/bundled/glyptodon-enterprise-player/README @@ -0,0 +1,9 @@ +Session Recording Player for Glyptodon Enterprise +(https://github.com/glyptodon/glyptodon-enterprise-player) +---------------------------------------------------------- + + Version: 1.1.0-1 + From: 'Glyptodon, Inc.' (https://glyptodon.com/) + License(s): + MIT (bundled/glyptodon-enterprise-player/LICENSE) + diff --git a/guacamole/src/main/frontend/.gitignore b/guacamole/src/main/frontend/.gitignore new file mode 100644 index 0000000..70f460b --- /dev/null +++ b/guacamole/src/main/frontend/.gitignore @@ -0,0 +1,3 @@ +*~ +node_modules +dist diff --git a/guacamole/src/main/frontend/package-lock.json b/guacamole/src/main/frontend/package-lock.json new file mode 100644 index 0000000..7ad1e32 --- /dev/null +++ b/guacamole/src/main/frontend/package-lock.json @@ -0,0 +1,10612 @@ +{ + "name": "frontend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "dependencies": { + "@simonwep/pickr": "^1.8.2", + "angular": "^1.8.3", + "angular-route": "^1.8.3", + "angular-templatecache-webpack-plugin": "^1.0.1", + "angular-translate": "^2.19.1", + "angular-translate-interpolation-messageformat": "^2.19.1", + "angular-translate-loader-static-files": "^2.19.1", + "blob-polyfill": "^9.0.20240710", + "csv": "^6.3.9", + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "datalist-polyfill": "^1.25.1", + "file-saver": "^2.0.5", + "fuzzysort": "^3.0.2", + "jquery": "^3.7.1", + "jstz": "^2.1.1", + "lodash": "^4.17.21", + "yaml": "^2.5.0" + }, + "devDependencies": { + "@babel/core": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "babel-loader": "^8.3.0", + "clean-webpack-plugin": "^4.0.0", + "closure-webpack-plugin": "^2.6.1", + "copy-webpack-plugin": "^5.1.2", + "css-loader": "^5.2.7", + "css-minimizer-webpack-plugin": "^1.3.0", + "exports-loader": "^1.1.1", + "find-package-json": "^1.2.0", + "google-closure-compiler": "20240317.0.0", + "html-webpack-plugin": "^4.5.2", + "mini-css-extract-plugin": "^1.6.2", + "webpack": "^4.47.0", + "webpack-cli": "^4.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "license": "MIT", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uglify-js": { + "version": "3.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/angular": { + "version": "1.8.3", + "license": "MIT" + }, + "node_modules/angular-route": { + "version": "1.8.3", + "license": "MIT" + }, + "node_modules/angular-templatecache-webpack-plugin": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "fs": "0.0.1-security", + "glob": "^7.1.6", + "glob-parent": "^5.1.1", + "jsesc": "^3.0.2", + "lodash.template": "^4.5.0", + "path": "^0.12.7", + "schema-utils": "^1.0.0" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/angular-translate": { + "version": "2.19.1", + "license": "MIT", + "dependencies": { + "angular": "^1.8.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/angular-translate-interpolation-messageformat": { + "version": "2.19.1", + "license": "MIT", + "dependencies": { + "angular-translate": "~2.19.1", + "messageformat": "~1.0.2" + } + }, + "node_modules/angular-translate-loader-static-files": { + "version": "2.19.1", + "license": "MIT", + "dependencies": { + "angular-translate": "~2.19.1" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "devOptional": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "license": "MIT", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/atob": { + "version": "2.1.2", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/blob-polyfill": { + "version": "9.0.20240710", + "resolved": "https://registry.npmjs.org/blob-polyfill/-/blob-polyfill-9.0.20240710.tgz", + "integrity": "sha512-DPUO/EjNANCgSVg0geTy1vmUpu5hhp9tV2F7xUSTUd1jwe4XpwupGB+lt5PhVUqpqAk+zK1etqp6Pl/HVf71Ug==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.23.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/cacache": { + "version": "12.0.4", + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001632", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-webpack-plugin": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/closure-webpack-plugin": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "8.x", + "acorn-walk": "^8.2.0", + "schema-utils": "1.x", + "unquoted-property-validator": "^1.0.2", + "webpack-sources": "1.x" + }, + "engines": { + "node": ">= 6.9.0 || >= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "google-closure-compiler": ">=20200830.0.0", + "webpack": "4.x" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.30.0", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.37.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader": { + "version": "5.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^15.0.5", + "cssnano": "^4.1.10", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.3.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/cacache": { + "version": "15.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/serialize-javascript": { + "version": "5.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ssri": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csv": { + "version": "6.3.9", + "license": "MIT", + "dependencies": { + "csv-generate": "^4.4.1", + "csv-parse": "^5.5.6", + "csv-stringify": "^6.5.0", + "stream-transform": "^3.3.2" + }, + "engines": { + "node": ">= 0.1.90" + } + }, + "node_modules/csv-generate": { + "version": "4.4.1", + "license": "MIT" + }, + "node_modules/csv-parse": { + "version": "5.5.6", + "license": "MIT" + }, + "node_modules/csv-stringify": { + "version": "6.5.0", + "license": "MIT" + }, + "node_modules/cyclist": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/d3-path": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/datalist-polyfill": { + "version": "1.25.1", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.798", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exports-loader": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/exports-loader/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exports-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/exports-loader/node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "license": "ISC" + }, + "node_modules/file-saver": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT", + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-package-json": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "license": "ISC" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzysort": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.0.2.tgz", + "integrity": "sha512-ZyahVgxvckB1Qosn7YGWLDJJp2XlyaQ2WmZeI+d0AzW0AMqVYnz5N89G6KAKa6m/LOtv+kzJn4lhDF/yVg11Cg==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/google-closure-compiler": { + "version": "20240317.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "4.x", + "google-closure-compiler-java": "^20240317.0.0", + "minimist": "1.x", + "vinyl": "2.x", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "bin": { + "google-closure-compiler": "cli.js" + }, + "engines": { + "node": ">=10" + }, + "optionalDependencies": { + "google-closure-compiler-linux": "^20240317.0.0", + "google-closure-compiler-osx": "^20240317.0.0", + "google-closure-compiler-windows": "^20240317.0.0" + } + }, + "node_modules/google-closure-compiler-java": { + "version": "20240317.0.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/google-closure-compiler-linux": { + "version": "20240317.0.0", + "cpu": [ + "x32", + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "3.3.10", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jstz": { + "version": "2.1.1", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-plural": { + "version": "3.0.6", + "license": "ISC", + "bin": { + "make-plural": "bin/make-plural" + }, + "optionalDependencies": { + "minimist": "^1.2.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/messageformat": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "glob": "~7.0.6", + "make-plural": "~3.0.6", + "messageformat-parser": "^1.0.0", + "nopt": "~3.0.6", + "reserved-words": "^0.1.1" + }, + "bin": { + "messageformat": "bin/messageformat.js" + } + }, + "node_modules/messageformat-parser": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/messageformat/node_modules/glob": { + "version": "7.0.6", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/mini-css-extract-plugin": { + "version": "1.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanopop": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/util": { + "version": "0.11.1", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "3.0.6", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/prr": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "devOptional": true, + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reserved-words": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/ret": { + "version": "0.1.15", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "dev": true, + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/split-string": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/static-extend": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/stream-transform": { + "version": "3.3.2", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/terser": { + "version": "4.8.1", + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz", + "integrity": "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==", + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "license": "MIT" + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/unquoted-property-validator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.0", + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/use": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "1.7.5", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "license": "ISC", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack": { + "version": "4.47.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/guacamole/src/main/frontend/package.json b/guacamole/src/main/frontend/package.json new file mode 100644 index 0000000..5d63c88 --- /dev/null +++ b/guacamole/src/main/frontend/package.json @@ -0,0 +1,43 @@ +{ + "private": true, + "scripts": { + "build": "webpack --progress" + }, + "dependencies": { + "@simonwep/pickr": "^1.8.2", + "angular": "^1.8.3", + "angular-route": "^1.8.3", + "angular-templatecache-webpack-plugin": "^1.0.1", + "angular-translate": "^2.19.1", + "angular-translate-interpolation-messageformat": "^2.19.1", + "angular-translate-loader-static-files": "^2.19.1", + "blob-polyfill": "^9.0.20240710", + "csv": "^6.3.9", + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "datalist-polyfill": "^1.25.1", + "file-saver": "^2.0.5", + "fuzzysort": "^3.0.2", + "jquery": "^3.7.1", + "jstz": "^2.1.1", + "lodash": "^4.17.21", + "yaml": "^2.5.0" + }, + "devDependencies": { + "@babel/core": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "babel-loader": "^8.3.0", + "clean-webpack-plugin": "^4.0.0", + "closure-webpack-plugin": "^2.6.1", + "copy-webpack-plugin": "^5.1.2", + "css-loader": "^5.2.7", + "css-minimizer-webpack-plugin": "^1.3.0", + "exports-loader": "^1.1.1", + "find-package-json": "^1.2.0", + "google-closure-compiler": "20240317.0.0", + "html-webpack-plugin": "^4.5.2", + "mini-css-extract-plugin": "^1.6.2", + "webpack": "^4.47.0", + "webpack-cli": "^4.10.0" + } +} diff --git a/guacamole/src/main/frontend/plugins/dependency-list-plugin.js b/guacamole/src/main/frontend/plugins/dependency-list-plugin.js new file mode 100644 index 0000000..2dfaa00 --- /dev/null +++ b/guacamole/src/main/frontend/plugins/dependency-list-plugin.js @@ -0,0 +1,157 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const finder = require('find-package-json'); +const fs = require('fs'); +const path = require('path'); +const validateOptions = require('schema-utils'); + +/** + * The name of this plugin. + * + * @type {string} + */ +const PLUGIN_NAME = 'dependency-list-plugin'; + +/** + * The schema of the configuration options object accepted by the constructor + * of DependencyListPlugin. + * + * @see https://github.com/webpack/schema-utils/blob/v1.0.0/README.md#usage + */ +const PLUGIN_OPTIONS_SCHEMA = { + type: 'object', + properties: { + + /** + * The name of the file that should contain the dependency list. By + * default, this will be "npm-dependencies.txt". + */ + filename: { type: 'string' }, + + /** + * The path in which the dependency list file should be saved. By + * default, this will be the output path of the Webpack compiler. + */ + path: { type: 'string' } + + }, + additionalProperties: false +}; + +/** + * Webpack plugin that automatically lists each of the NPM dependencies + * included within any bundles produced by the compile process. + */ +class DependencyListPlugin { + + /** + * Creates a new DependencyListPlugin configured with the given options. + * The options given must conform to the options schema. + * + * @see PLUGIN_OPTIONS_SCHEMA + * + * @param {*} options + * The configuration options to apply to the plugin. + */ + constructor(options = {}) { + validateOptions(PLUGIN_OPTIONS_SCHEMA, options, 'DependencyListPlugin'); + this.options = options; + } + + /** + * Entrypoint for all Webpack plugins. This function will be invoked when + * the plugin is being associated with the compile process. + * + * @param {Compiler} compiler + * A reference to the Webpack compiler. + */ + apply(compiler) { + + /** + * Logger for this plugin. + * + * @type {Logger} + */ + const logger = compiler.getInfrastructureLogger(PLUGIN_NAME); + + /** + * The directory receiving the dependency list file. + * + * @type {string} + */ + const outputPath = this.options.path || compiler.options.output.path; + + /** + * The full path to the output file that should contain the list of + * discovered NPM module dependencies. + * + * @type {string} + */ + const outputFile = path.join( + outputPath, + this.options.filename || 'npm-dependencies.txt' + ); + + // Wait for compilation to fully complete + compiler.hooks.done.tap(PLUGIN_NAME, (stats) => { + + const moduleCoords = {}; + + // Map each file used within any bundle built by the compiler to + // its corresponding NPM package, ignoring files that have no such + // package + stats.compilation.fileDependencies.forEach(file => { + + // Locate NPM package corresponding to file dependency (there + // may not be one) + const moduleFinder = finder(file); + const npmPackage = moduleFinder.next().value; + + // Translate absolute path into more readable path relative to + // root of compilation process + const relativePath = path.relative(compiler.options.context, file); + + if (npmPackage.name) { + moduleCoords[npmPackage.name + ':' + npmPackage.version] = true; + logger.info('File dependency "%s" mapped to NPM package "%s" (v%s)', + relativePath, npmPackage.name, npmPackage.version); + } + else + logger.info('Skipping file dependency "%s" (no NPM package)', + relativePath); + + }); + + // Create output path if it doesn't yet exist + if (!fs.existsSync(outputPath)) + fs.mkdirSync(outputPath, { recursive: true, mode: 0o755 }); + + // Write all discovered NPM packages to configured output file + const sortedCoords = Object.keys(moduleCoords).sort(); + fs.writeFileSync(outputFile, sortedCoords.join('\n') + '\n'); + + }); + + } + +} + +module.exports = DependencyListPlugin; + diff --git a/guacamole/src/main/frontend/src/angular-module-shim.js b/guacamole/src/main/frontend/src/angular-module-shim.js new file mode 100644 index 0000000..3e6e6d3 --- /dev/null +++ b/guacamole/src/main/frontend/src/angular-module-shim.js @@ -0,0 +1,56 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014 Jed Richards + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +(function(angular) { + + 'use strict'; + + if ( !angular ) { + throw new Error('angular-module-shim: Missing Angular'); + } + + var origFn = angular.module; + var hash = {}; + + angular.module = function(name,requires,configFn) { + + var requires = requires || []; + var registered = hash[name]; + var module; + + if ( registered ) { + module = origFn(name); + module.requires.push.apply(module.requires,requires); + // Register the config function if it exists. + if (configFn) { + module.config(configFn); + } + } else { + hash[name] = true; + module = origFn(name,requires,configFn); + } + + return module; + }; +})(window.angular); diff --git a/guacamole/src/main/frontend/src/app/auth/authModule.js b/guacamole/src/main/frontend/src/app/auth/authModule.js new file mode 100644 index 0000000..84c3e33 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/auth/authModule.js @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for authentication and management of tokens. + */ +angular.module('auth', [ + 'rest', + 'storage' +]); diff --git a/guacamole/src/main/frontend/src/app/auth/service/authenticationService.js b/guacamole/src/main/frontend/src/app/auth/service/authenticationService.js new file mode 100644 index 0000000..af5a9ab --- /dev/null +++ b/guacamole/src/main/frontend/src/app/auth/service/authenticationService.js @@ -0,0 +1,550 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for authenticating a user against the REST API. Invoking the + * authenticate() or login() functions of this service will automatically + * affect the login dialog, if visible. + * + * This service broadcasts events on $rootScope depending on the status and + * result of authentication operations: + * + * "guacLoginPending" + * An authentication request is being submitted and we are awaiting the + * result. The request may not yet have been submitted if the parameters + * for that request are not ready. This event receives a promise that + * resolves with the HTTP parameters that were ultimately submitted as its + * sole parameter. + * + * "guacLogin" + * Authentication was successful and a new token was created. This event + * receives the authentication token as its sole parameter. + * + * "guacLogout" + * An existing token is being destroyed. This event receives the + * authentication token as its sole parameter. If the existing token for + * the current session is being replaced without destroying that session, + * this event is not fired. + * + * "guacLoginFailed" + * An authentication request has failed for any reason. This event is + * broadcast before any other events that are specific to the nature of + * the failure, and may be used to detect login failures in lieu of those + * events. This event receives two parameters: the HTTP parameters + * submitted and the Error object received from the REST endpoint. + * + * "guacInsufficientCredentials" + * An authentication request failed because additional credentials are + * needed before the request can be processed. This event receives two + * parameters: the HTTP parameters submitted and the Error object received + * from the REST endpoint. + * + * "guacInvalidCredentials" + * An authentication request failed because the credentials provided are + * invalid. This event receives two parameters: the HTTP parameters + * submitted and the Error object received from the REST endpoint. + */ +angular.module('auth').factory('authenticationService', ['$injector', + function authenticationService($injector) { + + // Required types + var AuthenticationResult = $injector.get('AuthenticationResult'); + var Error = $injector.get('Error'); + + // Required services + var $q = $injector.get('$q'); + var $rootScope = $injector.get('$rootScope'); + var localStorageService = $injector.get('localStorageService'); + var requestService = $injector.get('requestService'); + + var service = {}; + + /** + * The most recent authentication result, or null if no authentication + * result is cached. + * + * @type AuthenticationResult + */ + var cachedResult = null; + + /** + * The unique identifier of the local storage key which stores the latest + * authentication token. + * + * @type String + */ + var AUTH_TOKEN_STORAGE_KEY = 'GUAC_AUTH_TOKEN'; + + /** + * Retrieves the authentication result cached in memory. If the user has not + * yet authenticated, the user has logged out, or the last authentication + * attempt failed, null is returned. + * + * NOTE: setAuthenticationResult() will be called upon page load, so the + * cache should always be populated after the page has successfully loaded. + * + * @returns {AuthenticationResult} + * The last successful authentication result, or null if the user is not + * currently authenticated. + */ + var getAuthenticationResult = function getAuthenticationResult() { + + // Use cached result, if any + if (cachedResult) + return cachedResult; + + // Return explicit null if no auth data is currently stored + return null; + + }; + + /** + * Stores the given authentication result for future retrieval. The given + * result MUST be the result of the most recent authentication attempt. + * + * @param {AuthenticationResult} data + * The last successful authentication result, or null if the last + * authentication attempt failed. + */ + var setAuthenticationResult = function setAuthenticationResult(data) { + + // Clear the currently-stored result and auth token if the last + // attempt failed + if (!data) { + cachedResult = null; + localStorageService.removeItem(AUTH_TOKEN_STORAGE_KEY); + } + + // Otherwise, store the authentication attempt directly. + // Note that only the auth token is stored in persistent local storage. + // To re-obtain an autentication result upon a fresh page load, + // reauthenticate with the persistent token, which can be obtained by + // calling getCurrentToken(). + else { + + // Always store in cache + cachedResult = data; + + // Persist only the auth token past tab/window closure, and only + // if not anonymous + if (data.username !== AuthenticationResult.ANONYMOUS_USERNAME) + localStorageService.setItem( + AUTH_TOKEN_STORAGE_KEY, data.authToken); + + } + + }; + + /** + * Clears the stored authentication result, if any. If no authentication + * result is currently stored, this function has no effect. + */ + var clearAuthenticationResult = function clearAuthenticationResult() { + setAuthenticationResult(null); + }; + + /** + * Makes a request to authenticate a user using the token REST API endpoint + * and given arbitrary parameters, returning a promise that succeeds only + * if the authentication operation was successful. The resulting + * authentication data can be retrieved later via getCurrentToken() or + * getCurrentUsername(). Invoking this function will affect the UI, + * including the login screen if visible. + * + * The provided parameters can be virtually any object, as each property + * will be sent as an HTTP parameter in the authentication request. + * Standard parameters include "username" for the user's username, + * "password" for the user's associated password, and "token" for the + * auth token to check/update. + * + * If a token is provided, it will be reused if possible. + * + * @param {Object|Promise} parameters + * Arbitrary parameters to authenticate with. If a Promise is provided, + * that Promise must resolve with the parameters to be submitted when + * those parameters are available, and any error will be handled as if + * from the authentication endpoint of the REST API itself. + * + * @returns {Promise} + * A promise which succeeds only if the login operation was successful. + */ + service.authenticate = function authenticate(parameters) { + + // Coerce received parameters object into a Promise, if it isn't + // already a Promise + parameters = $q.resolve(parameters); + + // Notify that a fresh authentication request is underway + $rootScope.$broadcast('guacLoginPending', parameters); + + // Attempt authentication after auth parameters are available ... + return parameters.then(function requestParametersReady(requestParams) { + + // Strip any properties that are from AngularJS core, such as the + // '$$state' property added by $q. Properties added by AngularJS + // core will have a '$' prefix. The '$$state' property is + // particularly problematic, as it is self-referential and explodes + // the stack when fed to $.param(). + requestParams = _.omitBy(requestParams, (value, key) => key.startsWith('$')); + + return requestService({ + method: 'POST', + url: 'api/tokens', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: $.param(requestParams) + }) + + // ... if authentication succeeds, handle received auth data ... + .then(function authenticationSuccessful(data) { + + var currentToken = service.getCurrentToken(); + + // If a new token was received, ensure the old token is invalidated, + // if any, and notify listeners of the new token + if (data.authToken !== currentToken) { + + // If an old token existed, request that the token be revoked + if (currentToken) { + service.revokeToken(currentToken).catch(angular.noop); + } + + // Notify of login and new token + setAuthenticationResult(new AuthenticationResult(data)); + $rootScope.$broadcast('guacLogin', data.authToken); + + } + + // Update cached authentication result, even if the token remains + // the same + else + setAuthenticationResult(new AuthenticationResult(data)); + + // Authentication was successful + return data; + + }); + + }) + + // ... if authentication fails, propogate failure to returned promise + ['catch'](requestService.createErrorCallback(function authenticationFailed(error) { + + // Notify of generic login failure, for any event consumers that + // wish to handle all types of failures at once + $rootScope.$broadcast('guacLoginFailed', parameters, error); + + // Request credentials if provided credentials were invalid + if (error.type === Error.Type.INVALID_CREDENTIALS) { + $rootScope.$broadcast('guacInvalidCredentials', parameters, error); + clearAuthenticationResult(); + } + + // Request more credentials if provided credentials were not enough + else if (error.type === Error.Type.INSUFFICIENT_CREDENTIALS) { + $rootScope.$broadcast('guacInsufficientCredentials', parameters, error); + clearAuthenticationResult(); + } + + // Abort rendering of page if an internal error occurs + else if (error.type === Error.Type.INTERNAL_ERROR) + $rootScope.$broadcast('guacFatalPageError', error); + + // Authentication failed + throw error; + + })); + + }; + + /** + * Makes a request to update the current auth token, if any, using the + * token REST API endpoint. If the optional parameters object is provided, + * its properties will be included as parameters in the update request. + * This function returns a promise that succeeds only if the authentication + * operation was successful. The resulting authentication data can be + * retrieved later via getCurrentToken() or getCurrentUsername(). + * + * If there is no current auth token, this function behaves identically to + * authenticate(), and makes a general authentication request. + * + * @param {Object} [parameters] + * Arbitrary parameters to authenticate with, if any. + * + * @returns {Promise} + * A promise which succeeds only if the login operation was successful. + */ + service.updateCurrentToken = function updateCurrentToken(parameters) { + + // HTTP parameters for the authentication request + var httpParameters = {}; + + // Add token parameter if current token is known + var token = service.getCurrentToken(); + if (token) + httpParameters.token = service.getCurrentToken(); + + // Add any additional parameters + if (parameters) + angular.extend(httpParameters, parameters); + + // Make the request + return service.authenticate(httpParameters); + + }; + + /** + * Determines whether the session associated with a particular token is + * still valid, without performing an operation that would result in that + * session being marked as active. If no token is provided, the session of + * the current user is checked. + * + * @param {string} [token] + * The authentication token to pass with the "Guacamole-Token" header. + * If omitted, and the user is logged in, the user's current + * authentication token will be used. + * + * @returns {Promise.} + * A promise that resolves with the boolean value "true" if the session + * is valid, and resolves with the boolean value "false" otherwise, + * including if an error prevents session validity from being + * determined. The promise is never rejected. + */ + service.getValidity = function getValidity(token) { + + // NOTE: Because this is a HEAD request, we will not receive a JSON + // response body. We will only have a simple yes/no regarding whether + // the auth token can be expected to be usable. + return service.request({ + method: 'HEAD', + url: 'api/session' + }, token) + + .then(function sessionIsValid() { + return true; + }) + + ['catch'](function sessionIsNotValid() { + return false; + }); + + }; + + /** + * Makes a request to revoke an authentication token using the token REST + * API endpoint, returning a promise that succeeds only if the token was + * successfully revoked. + * + * @param {string} token + * The authentication token to revoke. + * + * @returns {Promise} + * A promise which succeeds only if the token was successfully revoked. + */ + service.revokeToken = function revokeToken(token) { + return service.request({ + method: 'DELETE', + url: 'api/session' + }, token); + }; + + /** + * Makes a request to authenticate a user using the token REST API endpoint + * with a username and password, ignoring any currently-stored token, + * returning a promise that succeeds only if the login operation was + * successful. The resulting authentication data can be retrieved later + * via getCurrentToken() or getCurrentUsername(). Invoking this function + * will affect the UI, including the login screen if visible. + * + * @param {String} username + * The username to log in with. + * + * @param {String} password + * The password to log in with. + * + * @returns {Promise} + * A promise which succeeds only if the login operation was successful. + */ + service.login = function login(username, password) { + return service.authenticate({ + username: username, + password: password + }); + }; + + /** + * Makes a request to logout a user using the token REST API endpoint, + * returning a promise that succeeds only if the logout operation was + * successful. Invoking this function will affect the UI, causing the + * visible components of the application to be replaced with a status + * message noting that the user has been logged out. + * + * @returns {Promise} + * A promise which succeeds only if the logout operation was + * successful. + */ + service.logout = function logout() { + + // Clear authentication data + var token = service.getCurrentToken(); + clearAuthenticationResult(); + + // Notify listeners that a token is being destroyed + $rootScope.$broadcast('guacLogout', token); + + // Delete old token + return service.revokeToken(token); + + }; + + /** + * Returns whether the current user has authenticated anonymously. An + * anonymous user is denoted by the identifier reserved by the Guacamole + * extension API for anonymous users (the empty string). + * + * @returns {Boolean} + * true if the current user has authenticated anonymously, false + * otherwise. + */ + service.isAnonymous = function isAnonymous() { + return service.getCurrentUsername() === ''; + }; + + /** + * Returns the username of the current user. If the current user is not + * logged in, this value may not be valid. + * + * @returns {String} + * The username of the current user, or null if no authentication data + * is present. + */ + service.getCurrentUsername = function getCurrentUsername() { + + // Return username, if available + var authData = getAuthenticationResult(); + if (authData) + return authData.username; + + // No auth data present + return null; + + }; + + /** + * Returns the auth token associated with the current user. If the current + * user is not logged in, this token may not be valid. + * + * @returns {String} + * The auth token associated with the current user, or null if no + * authentication data is present. + */ + service.getCurrentToken = function getCurrentToken() { + + // Return cached auth token, if available + var authData = getAuthenticationResult(); + if (authData) + return authData.authToken; + + // Fall back to the value from local storage if not found in cache + return localStorageService.getItem(AUTH_TOKEN_STORAGE_KEY); + + }; + + /** + * Returns the identifier of the data source that authenticated the current + * user. If the current user is not logged in, this value may not be valid. + * + * @returns {String} + * The identifier of the data source that authenticated the current + * user, or null if no authentication data is present. + */ + service.getDataSource = function getDataSource() { + + // Return data source, if available + var authData = getAuthenticationResult(); + if (authData) + return authData.dataSource; + + // No auth data present + return null; + + }; + + /** + * Returns the identifiers of all data sources available to the current + * user. If the current user is not logged in, this value may not be valid. + * + * @returns {String[]} + * The identifiers of all data sources availble to the current user, + * or an empty array if no authentication data is present. + */ + service.getAvailableDataSources = function getAvailableDataSources() { + + // Return data sources, if available + var authData = getAuthenticationResult(); + if (authData) + return authData.availableDataSources; + + // No auth data present + return []; + + }; + + /** + * Makes an HTTP request leveraging the requestService(), automatically + * including the given authentication token using the "Guacamole-Token" + * header. If no token is provided, the user's current authentication token + * is used instead. If the user is not logged in, the "Guacamole-Token" + * header is simply omitted. The provided configuration object is not + * modified by this function. + * + * @param {Object} object + * A configuration object describing the HTTP request to be made by + * requestService(). As described by requestService(), this object must + * be a configuration object accepted by AngularJS' $http service. + * + * @param {string} [token] + * The authentication token to pass with the "Guacamole-Token" header. + * If omitted, and the user is logged in, the user's current + * authentication token will be used. + * + * @returns {Promise.} + * A promise that will resolve with the data from the HTTP response for + * the underlying requestService() call if successful, or reject with + * an @link{Error} describing the failure. + */ + service.request = function request(object, token) { + + // Attempt to use current token if none is provided + token = token || service.getCurrentToken(); + + // Add "Guacamole-Token" header if an authentication token is available + if (token) { + object = _.merge({ + headers : { 'Guacamole-Token' : token } + }, object); + } + + return requestService(object); + + }; + + return service; +}]); diff --git a/guacamole/src/main/frontend/src/app/auth/types/AuthenticationResult.js b/guacamole/src/main/frontend/src/app/auth/types/AuthenticationResult.js new file mode 100644 index 0000000..e277461 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/auth/types/AuthenticationResult.js @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the AuthenticationResult class. + */ +angular.module('auth').factory('AuthenticationResult', [function defineAuthenticationResult() { + + /** + * The object returned by REST API calls when representing the successful + * result of an authentication attempt. + * + * @constructor + * @param {AuthenticationResult|Object} [template={}] + * The object whose properties should be copied within the new + * AuthenticationResult. + */ + var AuthenticationResult = function AuthenticationResult(template) { + + // Use empty object by default + template = template || {}; + + /** + * The unique token generated for the user that authenticated. + * + * @type String + */ + this.authToken = template.authToken; + + /** + * The name which uniquely identifies the user that authenticated. + * + * @type String + */ + this.username = template.username; + + /** + * The unique identifier of the data source which authenticated the + * user. + * + * @type String + */ + this.dataSource = template.dataSource; + + /** + * The identifiers of all data sources available to the user that + * authenticated. + * + * @type String[] + */ + this.availableDataSources = template.availableDataSources; + + }; + + /** + * The username reserved by the Guacamole extension API for users which have + * authenticated anonymously. + * + * @type String + */ + AuthenticationResult.ANONYMOUS_USERNAME = ''; + + return AuthenticationResult; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/clientModule.js b/guacamole/src/main/frontend/src/app/client/clientModule.js new file mode 100644 index 0000000..73d3220 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/clientModule.js @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code used to connect to a connection or balancing group. + */ +angular.module('client', [ + 'auth', + 'clipboard', + 'element', + 'history', + 'navigation', + 'notification', + 'osk', + 'rest', + 'textInput', + 'touch' +]); diff --git a/guacamole/src/main/frontend/src/app/client/controllers/clientController.js b/guacamole/src/main/frontend/src/app/client/controllers/clientController.js new file mode 100644 index 0000000..6a486fe --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/controllers/clientController.js @@ -0,0 +1,879 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for the page used to connect to a connection or balancing group. + */ +angular.module('client').controller('clientController', ['$scope', '$routeParams', '$injector', + function clientController($scope, $routeParams, $injector) { + + // Required types + const ConnectionGroup = $injector.get('ConnectionGroup'); + const ManagedClient = $injector.get('ManagedClient'); + const ManagedClientGroup = $injector.get('ManagedClientGroup'); + const ManagedClientState = $injector.get('ManagedClientState'); + const ManagedFilesystem = $injector.get('ManagedFilesystem'); + const Protocol = $injector.get('Protocol'); + const ScrollState = $injector.get('ScrollState'); + + // Required services + const $location = $injector.get('$location'); + const authenticationService = $injector.get('authenticationService'); + const connectionGroupService = $injector.get('connectionGroupService'); + const clipboardService = $injector.get('clipboardService'); + const dataSourceService = $injector.get('dataSourceService'); + const guacClientManager = $injector.get('guacClientManager'); + const guacFullscreen = $injector.get('guacFullscreen'); + const iconService = $injector.get('iconService'); + const preferenceService = $injector.get('preferenceService'); + const requestService = $injector.get('requestService'); + const tunnelService = $injector.get('tunnelService'); + const userPageService = $injector.get('userPageService'); + + /** + * The minimum number of pixels a drag gesture must move to result in the + * menu being shown or hidden. + * + * @type Number + */ + var MENU_DRAG_DELTA = 64; + + /** + * The maximum X location of the start of a drag gesture for that gesture + * to potentially show the menu. + * + * @type Number + */ + var MENU_DRAG_MARGIN = 64; + + /** + * When showing or hiding the menu via a drag gesture, the maximum number + * of pixels the touch can move vertically and still affect the menu. + * + * @type Number + */ + var MENU_DRAG_VERTICAL_TOLERANCE = 10; + + /** + * In order to open the guacamole menu, we need to hit ctrl-alt-shift. There are + * several possible keysysms for each key. + */ + var SHIFT_KEYS = {0xFFE1 : true, 0xFFE2 : true}, + ALT_KEYS = {0xFFE9 : true, 0xFFEA : true, 0xFE03 : true, + 0xFFE7 : true, 0xFFE8 : true}, + CTRL_KEYS = {0xFFE3 : true, 0xFFE4 : true}, + MENU_KEYS = angular.extend({}, SHIFT_KEYS, ALT_KEYS, CTRL_KEYS); + + /** + * Keysym for detecting any END key presses, for the purpose of passing through + * the Ctrl-Alt-Del sequence to a remote system. + */ + var END_KEYS = {0xFF57 : true, 0xFFB1 : true}; + + /** + * Keysym for sending the DELETE key when the Ctrl-Alt-End hotkey + * combo is pressed. + * + * @type Number + */ + var DEL_KEY = 0xFFFF; + + /** + * Menu-specific properties. + */ + $scope.menu = { + + /** + * Whether the menu is currently shown. + * + * @type Boolean + */ + shown : false, + + /** + * The currently selected input method. This may be any of the values + * defined within preferenceService.inputMethods. + * + * @type String + */ + inputMethod : preferenceService.preferences.inputMethod, + + /** + * Whether translation of touch to mouse events should emulate an + * absolute pointer device, or a relative pointer device. + * + * @type Boolean + */ + emulateAbsoluteMouse : preferenceService.preferences.emulateAbsoluteMouse, + + /** + * The current scroll state of the menu. + * + * @type ScrollState + */ + scrollState : new ScrollState(), + + /** + * The current desired values of all editable connection parameters as + * a set of name/value pairs, including any changes made by the user. + * + * @type {Object.} + */ + connectionParameters : {} + + }; + + // Convenience method for closing the menu + $scope.closeMenu = function closeMenu() { + $scope.menu.shown = false; + }; + + /** + * Applies any changes to connection parameters made by the user within the + * Guacamole menu to the given ManagedClient. If no client is supplied, + * this function has no effect. + * + * @param {ManagedClient} client + * The client to apply parameter changes to. + */ + $scope.applyParameterChanges = function applyParameterChanges(client) { + angular.forEach($scope.menu.connectionParameters, function sendArgv(value, name) { + if (client) + ManagedClient.setArgument(client, name, value); + }); + }; + + /** + * The currently-focused client within the current ManagedClientGroup. If + * there is no current group, no client is focused, or multiple clients are + * focused, this will be null. + * + * @type ManagedClient + */ + $scope.focusedClient = null; + + /** + * The set of clients that should be attached to the client UI. This will + * be immediately initialized by a call to updateAttachedClients() below. + * + * @type ManagedClientGroup + */ + $scope.clientGroup = null; + + /** + * @borrows ManagedClientGroup.getName + */ + $scope.getName = ManagedClientGroup.getName; + + /** + * @borrows ManagedClientGroup.getTitle + */ + $scope.getTitle = ManagedClientGroup.getTitle; + + /** + * Arbitrary context that should be exposed to the guacGroupList directive + * displaying the dropdown list of available connections within the + * Guacamole menu. + */ + $scope.connectionListContext = { + + /** + * The set of clients desired within the current view. For each client + * that should be present within the current view, that client's ID + * will map to "true" here. + * + * @type {Object.} + */ + attachedClients : {}, + + /** + * Notifies that the client with the given ID has been added or + * removed from the set of clients desired within the current view, + * and the current view should be updated accordingly. + * + * @param {string} id + * The ID of the client that was added or removed from the current + * view. + */ + updateAttachedClients : function updateAttachedClients(id) { + $scope.addRemoveClient(id, !$scope.connectionListContext.attachedClients[id]); + } + + }; + + /** + * Adds or removes the client with the given ID from the set of clients + * within the current view, updating the current URL accordingly. + * + * @param {string} id + * The ID of the client to add or remove from the current view. + * + * @param {boolean} [remove=false] + * Whether the specified client should be added (false) or removed + * (true). + */ + $scope.addRemoveClient = function addRemoveClient(id, remove) { + + // Deconstruct current path into corresponding client IDs + const ids = ManagedClientGroup.getClientIdentifiers($routeParams.id); + + // Add/remove ID as requested + if (remove) + _.pull(ids, id); + else + ids.push(id); + + // Reconstruct path, updating attached clients via change in route + $location.path('/client/' + ManagedClientGroup.getIdentifier(ids)); + + }; + + /** + * Reloads the contents of $scope.clientGroup to reflect the client IDs + * currently listed in the URL. + */ + const reparseRoute = function reparseRoute() { + + const previousClients = $scope.clientGroup ? $scope.clientGroup.clients.slice() : []; + + // Replace existing group with new group + setAttachedGroup(guacClientManager.getManagedClientGroup($routeParams.id)); + + // Store current set of attached clients for later use within the + // Guacamole menu + $scope.connectionListContext.attachedClients = {}; + $scope.clientGroup.clients.forEach((client) => { + $scope.connectionListContext.attachedClients[client.id] = true; + }); + + // Ensure menu is closed if updated view is not a modification of the + // current view (has no clients in common). The menu should remain open + // only while the current view is being modified, not when navigating + // to an entirely different view. + if (_.isEmpty(_.intersection(previousClients, $scope.clientGroup.clients))) + $scope.menu.shown = false; + + // Update newly-attached clients with current contents of clipboard + clipboardService.resyncClipboard(); + + }; + + /** + * Replaces the ManagedClientGroup currently attached to the client + * interface via $scope.clientGroup with the given ManagedClientGroup, + * safely cleaning up after the previous group. If no ManagedClientGroup is + * provided, the existing group is simply removed. + * + * @param {ManagedClientGroup} [managedClientGroup] + * The ManagedClientGroup to attach to the interface, if any. + */ + const setAttachedGroup = function setAttachedGroup(managedClientGroup) { + + // Do nothing if group is not actually changing + if ($scope.clientGroup === managedClientGroup) + return; + + if ($scope.clientGroup) { + + // Remove all disconnected clients from management (the user has + // seen their status) + _.filter($scope.clientGroup.clients, client => { + + const connectionState = client.clientState.connectionState; + return connectionState === ManagedClientState.ConnectionState.DISCONNECTED + || connectionState === ManagedClientState.ConnectionState.TUNNEL_ERROR + || connectionState === ManagedClientState.ConnectionState.CLIENT_ERROR; + + }).forEach(client => { + guacClientManager.removeManagedClient(client.id); + }); + + // Flag group as detached + $scope.clientGroup.attached = false; + + } + + if (managedClientGroup) { + $scope.clientGroup = managedClientGroup; + $scope.clientGroup.attached = true; + $scope.clientGroup.lastUsed = new Date().getTime(); + } + + }; + + // Init sets of clients based on current URL ... + reparseRoute(); + + // ... and re-initialize those sets if the URL has changed without + // reloading the route + $scope.$on('$routeUpdate', reparseRoute); + + /** + * The root connection groups of the connection hierarchy that should be + * presented to the user for selecting a different connection, as a map of + * data source identifier to the root connection group of that data + * source. This will be null if the connection group hierarchy has not yet + * been loaded or if the hierarchy is inapplicable due to only one + * connection or balancing group being available. + * + * @type Object. + */ + $scope.rootConnectionGroups = null; + + /** + * Array of all connection properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionProperties = [ + 'name' + ]; + + /** + * Array of all connection group properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionGroupProperties = [ + 'name' + ]; + + // Retrieve root groups and all descendants + dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + authenticationService.getAvailableDataSources(), + ConnectionGroup.ROOT_IDENTIFIER + ) + .then(function rootGroupsRetrieved(rootConnectionGroups) { + + // Store retrieved groups only if there are multiple connections or + // balancing groups available + var clientPages = userPageService.getClientPages(rootConnectionGroups); + if (clientPages.length > 1) + $scope.rootConnectionGroups = rootConnectionGroups; + + }, requestService.WARN); + + /** + * Map of all available sharing profiles for the current connection by + * their identifiers. If this information is not yet available, or no such + * sharing profiles exist, this will be an empty object. + * + * @type Object. + */ + $scope.sharingProfiles = {}; + + /** + * Map of all substituted key presses. If one key is pressed in place of another + * the value of the substituted key is stored in an object with the keysym of + * the original key. + * + * @type Object. + */ + var substituteKeysPressed = {}; + + /** + * Returns whether the shortcut for showing/hiding the Guacamole menu + * (Ctrl+Alt+Shift) has been pressed. + * + * @param {Guacamole.Keyboard} keyboard + * The Guacamole.Keyboard object tracking the local keyboard state. + * + * @returns {boolean} + * true if Ctrl+Alt+Shift has been pressed, false otherwise. + */ + const isMenuShortcutPressed = function isMenuShortcutPressed(keyboard) { + + // Ctrl+Alt+Shift has NOT been pressed if any key is currently held + // down that isn't Ctrl, Alt, or Shift + if (_.findKey(keyboard.pressed, (val, keysym) => !MENU_KEYS[keysym])) + return false; + + // Verify that one of each required key is held, regardless of + // left/right location on the keyboard + return !!( + _.findKey(SHIFT_KEYS, (val, keysym) => keyboard.pressed[keysym]) + && _.findKey(ALT_KEYS, (val, keysym) => keyboard.pressed[keysym]) + && _.findKey(CTRL_KEYS, (val, keysym) => keyboard.pressed[keysym]) + ); + + }; + + // Show menu if the user swipes from the left, hide menu when the user + // swipes from the right, scroll menu while visible + $scope.menuDrag = function menuDrag(inProgress, startX, startY, currentX, currentY, deltaX, deltaY) { + + if ($scope.menu.shown) { + + // Hide menu if swipe-from-right gesture is detected + if (Math.abs(currentY - startY) < MENU_DRAG_VERTICAL_TOLERANCE + && startX - currentX >= MENU_DRAG_DELTA) + $scope.menu.shown = false; + + // Scroll menu by default + else { + $scope.menu.scrollState.left -= deltaX; + $scope.menu.scrollState.top -= deltaY; + } + + } + + // Show menu if swipe-from-left gesture is detected + else if (startX <= MENU_DRAG_MARGIN) { + if (Math.abs(currentY - startY) < MENU_DRAG_VERTICAL_TOLERANCE + && currentX - startX >= MENU_DRAG_DELTA) + $scope.menu.shown = true; + } + + return false; + + }; + + // Show/hide UI elements depending on input method + $scope.$watch('menu.inputMethod', function setInputMethod(inputMethod) { + + // Show input methods only if selected + $scope.showOSK = (inputMethod === 'osk'); + $scope.showTextInput = (inputMethod === 'text'); + + }); + + // Update client state/behavior as visibility of the Guacamole menu changes + $scope.$watch('menu.shown', function menuVisibilityChanged(menuShown, menuShownPreviousState) { + + // Re-update available connection parameters, if there is a focused + // client (parameter information may not have been available at the + // time focus changed) + if (menuShown) + $scope.menu.connectionParameters = $scope.focusedClient ? + ManagedClient.getArgumentModel($scope.focusedClient) : {}; + + // Send any argument value data once menu is hidden + else if (menuShownPreviousState) + $scope.applyParameterChanges($scope.focusedClient); + + /* Broadcast changes to the menu display state */ + $scope.$broadcast('guacMenuShown', menuShown); + + }); + + // Toggle the menu when the guacClientToggleMenu event is received + $scope.$on('guacToggleMenu', + () => $scope.menu.shown = !$scope.menu.shown); + + // Show the menu when the guacClientShowMenu event is received + $scope.$on('guacShowMenu', () => $scope.menu.shown = true); + + // Hide the menu when the guacClientHideMenu event is received + $scope.$on('guacHideMenu', () => $scope.menu.shown = false); + + // Automatically track and cache the currently-focused client + $scope.$on('guacClientFocused', function focusedClientChanged(event, newFocusedClient) { + + const oldFocusedClient = $scope.focusedClient; + $scope.focusedClient = newFocusedClient; + + // Apply any parameter changes when focus is changing + if (oldFocusedClient) + $scope.applyParameterChanges(oldFocusedClient); + + // Update available connection parameters, if there is a focused + // client + $scope.menu.connectionParameters = newFocusedClient ? + ManagedClient.getArgumentModel(newFocusedClient) : {}; + + }); + + // Automatically update connection parameters that have been modified + // for the current focused client + $scope.$on('guacClientArgumentsUpdated', function argumentsChanged(event, focusedClient) { + + // Ignore any updated arguments not for the current focused client + if ($scope.focusedClient && $scope.focusedClient === focusedClient) + $scope.menu.connectionParameters = ManagedClient.getArgumentModel(focusedClient); + + }); + + // Update page icon when thumbnail changes + $scope.$watch('focusedClient.thumbnail.canvas', function thumbnailChanged(canvas) { + iconService.setIcons(canvas); + }); + + // Pull sharing profiles once the tunnel UUID is known + $scope.$watch('focusedClient.tunnel.uuid', function retrieveSharingProfiles(uuid) { + + // Only pull sharing profiles if tunnel UUID is actually available + if (!uuid) { + $scope.sharingProfiles = {}; + return; + } + + // Pull sharing profiles for the current connection + tunnelService.getSharingProfiles(uuid) + .then(function sharingProfilesRetrieved(sharingProfiles) { + $scope.sharingProfiles = sharingProfiles; + }, requestService.WARN); + + }); + + /** + * Produces a sharing link for the current connection using the given + * sharing profile. The resulting sharing link, and any required login + * information, will be displayed to the user within the Guacamole menu. + * + * @param {SharingProfile} sharingProfile + * The sharing profile to use to generate the sharing link. + */ + $scope.share = function share(sharingProfile) { + if ($scope.focusedClient) + ManagedClient.createShareLink($scope.focusedClient, sharingProfile); + }; + + /** + * Returns whether the current connection has any associated share links. + * + * @returns {Boolean} + * true if the current connection has at least one associated share + * link, false otherwise. + */ + $scope.isShared = function isShared() { + return !!$scope.focusedClient && ManagedClient.isShared($scope.focusedClient); + }; + + /** + * Returns the total number of share links associated with the current + * connection. + * + * @returns {Number} + * The total number of share links associated with the current + * connection. + */ + $scope.getShareLinkCount = function getShareLinkCount() { + + if (!$scope.focusedClient) + return 0; + + // Count total number of links within the ManagedClient's share link map + var linkCount = 0; + for (const dummy in $scope.focusedClient.shareLinks) + linkCount++; + + return linkCount; + + }; + + // Opening the Guacamole menu after Ctrl+Alt+Shift, preventing those + // keypresses from reaching any Guacamole client + $scope.$on('guacBeforeKeydown', function incomingKeydown(event, keysym, keyboard) { + + // Toggle menu if menu shortcut (Ctrl+Alt+Shift) is pressed + if (isMenuShortcutPressed(keyboard)) { + + // Don't send this key event through to the client, and release + // all other keys involved in performing this shortcut + event.preventDefault(); + keyboard.reset(); + + // Toggle the menu + $scope.$apply(function() { + $scope.menu.shown = !$scope.menu.shown; + }); + + } + + // Prevent all keydown events while menu is open + else if ($scope.menu.shown) + event.preventDefault(); + + }); + + // Prevent all keyup events while menu is open + $scope.$on('guacBeforeKeyup', function incomingKeyup(event, keysym, keyboard) { + if ($scope.menu.shown) + event.preventDefault(); + }); + + // Send Ctrl-Alt-Delete when Ctrl-Alt-End is pressed. + $scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) { + + // If one of the End keys is pressed, and we have a one keysym from each + // of Ctrl and Alt groups, send Ctrl-Alt-Delete. + if (END_KEYS[keysym] + && _.findKey(ALT_KEYS, (val, keysym) => keyboard.pressed[keysym]) + && _.findKey(CTRL_KEYS, (val, keysym) => keyboard.pressed[keysym]) + ) { + + // Don't send this event through to the client. + event.preventDefault(); + + // Record the substituted key press so that it can be + // properly dealt with later. + substituteKeysPressed[keysym] = DEL_KEY; + + // Send through the delete key. + $scope.$broadcast('guacSyntheticKeydown', DEL_KEY); + } + + }); + + // Update pressed keys as they are released + $scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) { + + // Deal with substitute key presses + if (substituteKeysPressed[keysym]) { + event.preventDefault(); + $scope.$broadcast('guacSyntheticKeyup', substituteKeysPressed[keysym]); + delete substituteKeysPressed[keysym]; + } + + }); + + // Update page title when client title changes + $scope.$watch('getTitle(clientGroup)', function clientTitleChanged(title) { + $scope.page.title = title; + }); + + /** + * Returns whether the current connection has been flagged as unstable due + * to an apparent network disruption. + * + * @returns {Boolean} + * true if the current connection has been flagged as unstable, false + * otherwise. + */ + $scope.isConnectionUnstable = function isConnectionUnstable() { + return _.findIndex($scope.clientGroup.clients, client => client.clientState.tunnelUnstable) !== -1; + }; + + /** + * Immediately disconnects all currently-focused clients, if any. + */ + $scope.disconnect = function disconnect() { + + // Disconnect if client is available + if ($scope.clientGroup) { + $scope.clientGroup.clients.forEach(client => { + if (client.clientProperties.focused) + client.client.disconnect(); + }); + } + + // Hide menu + $scope.menu.shown = false; + + }; + + /** + * Disconnects the given ManagedClient, removing it from the current + * view. + * + * @param {ManagedClient} client + * The client to disconnect. + */ + $scope.closeClientTile = function closeClientTile(client) { + + $scope.addRemoveClient(client.id, true); + guacClientManager.removeManagedClient(client.id); + + // Ensure at least one client has focus (the only client with + // focus may just have been removed) + ManagedClientGroup.verifyFocus($scope.clientGroup); + + }; + + /** + * Action which immediately disconnects the currently-connected client, if + * any. + */ + var DISCONNECT_MENU_ACTION = { + name : 'CLIENT.ACTION_DISCONNECT', + className : 'danger disconnect', + callback : $scope.disconnect + }; + + /** + * Action that toggles fullscreen mode within the + * currently-connected client and then closes the menu. + */ + var FULLSCREEN_MENU_ACTION = { + name : 'CLIENT.ACTION_FULLSCREEN', + classname : 'fullscreen action', + callback : function fullscreen() { + + guacFullscreen.toggleFullscreenMode(); + $scope.menu.shown = false; + } + }; + + // Set client-specific menu actions + $scope.clientMenuActions = [ DISCONNECT_MENU_ACTION,FULLSCREEN_MENU_ACTION ]; + + /** + * @borrows Protocol.getNamespace + */ + $scope.getProtocolNamespace = Protocol.getNamespace; + + /** + * The currently-visible filesystem within the filesystem menu, if the + * filesystem menu is open. If no filesystem is currently visible, this + * will be null. + * + * @type ManagedFilesystem + */ + $scope.filesystemMenuContents = null; + + /** + * Hides the filesystem menu. + */ + $scope.hideFilesystemMenu = function hideFilesystemMenu() { + $scope.filesystemMenuContents = null; + }; + + /** + * Shows the filesystem menu, displaying the contents of the given + * filesystem within it. + * + * @param {ManagedFilesystem} filesystem + * The filesystem to show within the filesystem menu. + */ + $scope.showFilesystemMenu = function showFilesystemMenu(filesystem) { + $scope.filesystemMenuContents = filesystem; + }; + + /** + * Returns whether the filesystem menu should be visible. + * + * @returns {Boolean} + * true if the filesystem menu is shown, false otherwise. + */ + $scope.isFilesystemMenuShown = function isFilesystemMenuShown() { + return !!$scope.filesystemMenuContents && $scope.menu.shown; + }; + + // Automatically refresh display when filesystem menu is shown + $scope.$watch('isFilesystemMenuShown()', function refreshFilesystem() { + + // Refresh filesystem, if defined + var filesystem = $scope.filesystemMenuContents; + if (filesystem) + ManagedFilesystem.refresh(filesystem, filesystem.currentDirectory); + + }); + + /** + * Returns the full path to the given file as an ordered array of parent + * directories. + * + * @param {ManagedFilesystem.File} file + * The file whose full path should be retrieved. + * + * @returns {ManagedFilesystem.File[]} + * An array of directories which make up the hierarchy containing the + * given file, in order of increasing depth. + */ + $scope.getPath = function getPath(file) { + + var path = []; + + // Add all files to path in ascending order of depth + while (file && file.parent) { + path.unshift(file); + file = file.parent; + } + + return path; + + }; + + /** + * Changes the current directory of the given filesystem to the given + * directory. + * + * @param {ManagedFilesystem} filesystem + * The filesystem whose current directory should be changed. + * + * @param {ManagedFilesystem.File} file + * The directory to change to. + */ + $scope.changeDirectory = function changeDirectory(filesystem, file) { + ManagedFilesystem.changeDirectory(filesystem, file); + }; + + /** + * Begins a file upload through the attached Guacamole client for + * each file in the given FileList. + * + * @param {FileList} files + * The files to upload. + */ + $scope.uploadFiles = function uploadFiles(files) { + + // Upload each file + for (var i = 0; i < files.length; i++) + ManagedClient.uploadFile($scope.filesystemMenuContents.client, files[i], $scope.filesystemMenuContents); + + }; + + /** + * Determines whether the attached client group has any associated file + * transfers, regardless of those file transfers' state. + * + * @returns {Boolean} + * true if there are any file transfers associated with the + * attached client group, false otherise. + */ + $scope.hasTransfers = function hasTransfers() { + + // There are no file transfers if there is no client group + if (!$scope.clientGroup) + return false; + + return _.findIndex($scope.clientGroup.clients, ManagedClient.hasTransfers) !== -1; + + }; + + /** + * Returns whether the current user can share the current connection with + * other users. A connection can be shared if and only if there is at least + * one associated sharing profile. + * + * @returns {Boolean} + * true if the current user can share the current connection with other + * users, false otherwise. + */ + $scope.canShareConnection = function canShareConnection() { + + // If there is at least one sharing profile, the connection can be shared + for (var dummy in $scope.sharingProfiles) + return true; + + // Otherwise, sharing is not possible + return false; + + }; + + // Clean up when view destroyed + $scope.$on('$destroy', function clientViewDestroyed() { + setAttachedGroup(null); + + // always unset fullscreen mode to not confuse user + guacFullscreen.setFullscreenMode(false); + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacClient.js b/guacamole/src/main/frontend/src/app/client/directives/guacClient.js new file mode 100644 index 0000000..18a1b08 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacClient.js @@ -0,0 +1,675 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for the guacamole client. + */ +angular.module('client').directive('guacClient', [function guacClient() { + + const directive = { + restrict: 'E', + replace: true, + templateUrl: 'app/client/templates/guacClient.html' + }; + + directive.scope = { + + /** + * The client to display within this guacClient directive. + * + * @type ManagedClient + */ + client : '=', + + /** + * Whether translation of touch to mouse events should emulate an + * absolute pointer device, or a relative pointer device. + * + * @type boolean + */ + emulateAbsoluteMouse : '=' + + }; + + directive.controller = ['$scope', '$injector', '$element', + function guacClientController($scope, $injector, $element) { + + // Required types + const ManagedClient = $injector.get('ManagedClient'); + + // Required services + const $rootScope = $injector.get('$rootScope'); + const $window = $injector.get('$window'); + + /** + * Whether the local, hardware mouse cursor is in use. + * + * @type Boolean + */ + let localCursor = false; + + /** + * The current Guacamole client instance. + * + * @type Guacamole.Client + */ + let client = null; + + /** + * The display of the current Guacamole client instance. + * + * @type Guacamole.Display + */ + let display = null; + + /** + * The element associated with the display of the current + * Guacamole client instance. + * + * @type Element + */ + let displayElement = null; + + /** + * The element which must contain the Guacamole display element. + * + * @type Element + */ + const displayContainer = $element.find('.display')[0]; + + /** + * The main containing element for the entire directive. + * + * @type Element + */ + const main = $element[0]; + + /** + * Guacamole mouse event object, wrapped around the main client + * display. + * + * @type Guacamole.Mouse + */ + const mouse = new Guacamole.Mouse(displayContainer); + + /** + * Guacamole absolute mouse emulation object, wrapped around the + * main client display. + * + * @type Guacamole.Mouse.Touchscreen + */ + const touchScreen = new Guacamole.Mouse.Touchscreen(displayContainer); + + /** + * Guacamole relative mouse emulation object, wrapped around the + * main client display. + * + * @type Guacamole.Mouse.Touchpad + */ + const touchPad = new Guacamole.Mouse.Touchpad(displayContainer); + + /** + * Guacamole touch event handling object, wrapped around the main + * client dislay. + * + * @type Guacamole.Touch + */ + const touch = new Guacamole.Touch(displayContainer); + + /** + * Updates the scale of the attached Guacamole.Client based on current window + * size and "auto-fit" setting. + */ + const updateDisplayScale = function updateDisplayScale() { + + if (!display) return; + + // Calculate scale to fit screen + $scope.client.clientProperties.minScale = Math.min( + main.offsetWidth / Math.max(display.getWidth(), 1), + main.offsetHeight / Math.max(display.getHeight(), 1) + ); + + // Calculate appropriate maximum zoom level + $scope.client.clientProperties.maxScale = Math.max($scope.client.clientProperties.minScale, 3); + + // Clamp zoom level, maintain auto-fit + if (display.getScale() < $scope.client.clientProperties.minScale || $scope.client.clientProperties.autoFit) + $scope.client.clientProperties.scale = $scope.client.clientProperties.minScale; + + else if (display.getScale() > $scope.client.clientProperties.maxScale) + $scope.client.clientProperties.scale = $scope.client.clientProperties.maxScale; + + }; + + /** + * Scrolls the client view such that the mouse cursor is visible. + * + * @param {Guacamole.Mouse.State} mouseState The current mouse + * state. + */ + const scrollToMouse = function scrollToMouse(mouseState) { + + // Determine mouse position within view + const mouse_view_x = mouseState.x + displayContainer.offsetLeft - main.scrollLeft; + const mouse_view_y = mouseState.y + displayContainer.offsetTop - main.scrollTop; + + // Determine viewport dimensions + const view_width = main.offsetWidth; + const view_height = main.offsetHeight; + + // Determine scroll amounts based on mouse position relative to document + + let scroll_amount_x; + if (mouse_view_x > view_width) + scroll_amount_x = mouse_view_x - view_width; + else if (mouse_view_x < 0) + scroll_amount_x = mouse_view_x; + else + scroll_amount_x = 0; + + let scroll_amount_y; + if (mouse_view_y > view_height) + scroll_amount_y = mouse_view_y - view_height; + else if (mouse_view_y < 0) + scroll_amount_y = mouse_view_y; + else + scroll_amount_y = 0; + + // Scroll (if necessary) to keep mouse on screen. + main.scrollLeft += scroll_amount_x; + main.scrollTop += scroll_amount_y; + + }; + + /** + * Return the name of the angular event associated with the provided + * mouse event. + * + * @param {Guacamole.Mouse.MouseEvent} event + * The mouse event to determine an angular event name for. + * + * @returns + * The name of the angular event associated with the provided + * mouse event. + */ + const getMouseEventName = event => { + switch (event.type) { + case 'mousedown': + return 'guacClientMouseDown'; + case 'mouseup': + return 'guacClientMouseUp'; + default: + return 'guacClientMouseMove'; + } + }; + + /** + * Handles a mouse event originating from the user's actual mouse. + * This differs from handleEmulatedMouseEvent() in that the + * software mouse cursor must be shown only if the user's browser + * does not support explicitly setting the hardware mouse cursor. + * + * @param {Guacamole.Mouse.MouseEvent} event + * The mouse event to handle. + */ + const handleMouseEvent = function handleMouseEvent(event) { + + // Do not attempt to handle mouse state changes if the client + // or display are not yet available + if (!client || !display) + return; + + event.stopPropagation(); + event.preventDefault(); + + // Send mouse state, show cursor if necessary + display.showCursor(!localCursor); + client.sendMouseState(event.state, true); + + // Broadcast the mouse event + $rootScope.$broadcast(getMouseEventName(event), event, client); + + }; + + /** + * Handles a mouse event originating from one of Guacamole's mouse + * emulation objects. This differs from handleMouseState() in that + * the software mouse cursor must always be shown (as the emulated + * mouse device will not have its own cursor). + * + * @param {Guacamole.Mouse.MouseEvent} event + * The mouse event to handle. + */ + const handleEmulatedMouseEvent = function handleEmulatedMouseEvent(event) { + + // Do not attempt to handle mouse state changes if the client + // or display are not yet available + if (!client || !display) + return; + + event.stopPropagation(); + event.preventDefault(); + + // Ensure software cursor is shown + display.showCursor(true); + + // Send mouse state, ensure cursor is visible + scrollToMouse(event.state); + client.sendMouseState(event.state, true); + + // Broadcast the mouse event + $rootScope.$broadcast(getMouseEventName(event), event, client); + + }; + + /** + * Return the name of the angular event associated with the provided + * touch event. + * + * @param {Guacamole.Touch.TouchEvent} event + * The touch event to determine an angular event name for. + * + * @returns + * The name of the angular event associated with the provided + * touch event. + */ + const getTouchEventName = event => { + switch (event.type) { + case 'touchstart': + return 'guacClientTouchStart'; + case 'touchend': + return 'guacClientTouchEnd'; + default: + return 'guacClientTouchMove'; + } + }; + + /** + * Handles a touch event originating from the user's device. + * + * @param {Guacamole.Touch.Event} touchEvent + * The touch event. + */ + const handleTouchEvent = function handleTouchEvent(event) { + + // Do not attempt to handle touch state changes if the client + // or display are not yet available + if (!client || !display) + return; + + event.preventDefault(); + + // Send touch state, hiding local cursor + display.showCursor(false); + client.sendTouchState(event.state, true); + + // Broadcast the touch event + $rootScope.$broadcast(getTouchEventName(event), event, client); + + }; + + // Attach any given managed client + $scope.$watch('client', function attachManagedClient(managedClient) { + + // Remove any existing display + displayContainer.innerHTML = ""; + + // Only proceed if a client is given + if (!managedClient) + return; + + // Get Guacamole client instance + client = managedClient.client; + + // Attach possibly new display + display = client.getDisplay(); + display.scale($scope.client.clientProperties.scale); + + // Add display element + displayElement = display.getElement(); + displayContainer.appendChild(displayElement); + + // Do nothing when the display element is clicked on + display.getElement().onclick = function(e) { + e.preventDefault(); + return false; + }; + + // Connect and update interface to match required size, deferring + // connecting until a future element resize if the main element + // size (desired display size) is not known and thus can't be sent + // during the handshake + $scope.mainElementResized(); + + }); + + // Update actual view scrollLeft when scroll properties change + $scope.$watch('client.clientProperties.scrollLeft', function scrollLeftChanged(scrollLeft) { + main.scrollLeft = scrollLeft; + $scope.client.clientProperties.scrollLeft = main.scrollLeft; + }); + + // Update actual view scrollTop when scroll properties change + $scope.$watch('client.clientProperties.scrollTop', function scrollTopChanged(scrollTop) { + main.scrollTop = scrollTop; + $scope.client.clientProperties.scrollTop = main.scrollTop; + }); + + // Update scale when display is resized + $scope.$watch('client.managedDisplay.size', function setDisplaySize() { + $scope.$evalAsync(updateDisplayScale); + }); + + // Keep local cursor up-to-date + $scope.$watch('client.managedDisplay.cursor', function setCursor(cursor) { + if (cursor) + localCursor = mouse.setCursor(cursor.canvas, cursor.x, cursor.y); + }); + + // Update touch event handling depending on remote multi-touch + // support and mouse emulation mode + $scope.$watchGroup([ + 'client.multiTouchSupport', + 'emulateAbsoluteMouse' + ], function touchBehaviorChanged() { + + // Clear existing event handling + touch.offEach(['touchstart', 'touchmove', 'touchend'], handleTouchEvent); + touchScreen.offEach(['mousedown', 'mousemove', 'mouseup'], handleEmulatedMouseEvent); + touchPad.offEach(['mousedown', 'mousemove', 'mouseup'], handleEmulatedMouseEvent); + + // Directly forward local touch events + if ($scope.client.multiTouchSupport) + touch.onEach(['touchstart', 'touchmove', 'touchend'], handleTouchEvent); + + // Switch to touchscreen if mouse emulation is required and + // absolute mouse emulation is preferred + else if ($scope.emulateAbsoluteMouse) + touchScreen.onEach(['mousedown', 'mousemove', 'mouseup'], handleEmulatedMouseEvent); + + // Use touchpad for mouse emulation if absolute mouse emulation + // is not preferred + else + touchPad.onEach(['mousedown', 'mousemove', 'mouseup'], handleEmulatedMouseEvent); + + }); + + // Adjust scale if modified externally + $scope.$watch('client.clientProperties.scale', function changeScale(scale) { + + // Fix scale within limits + scale = Math.max(scale, $scope.client.clientProperties.minScale); + scale = Math.min(scale, $scope.client.clientProperties.maxScale); + + // If at minimum zoom level, hide scroll bars + if (scale === $scope.client.clientProperties.minScale) + main.style.overflow = "hidden"; + + // If not at minimum zoom level, show scroll bars + else + main.style.overflow = "auto"; + + // Apply scale if client attached + if (display) + display.scale(scale); + + if (scale !== $scope.client.clientProperties.scale) + $scope.client.clientProperties.scale = scale; + + }); + + // If autofit is set, the scale should be set to the minimum scale, filling the screen + $scope.$watch('client.clientProperties.autoFit', function changeAutoFit(autoFit) { + if(autoFit) + $scope.client.clientProperties.scale = $scope.client.clientProperties.minScale; + }); + + /** + * Sends the current size of the main element (the display container) + * to the Guacamole server, requesting that the remote display be + * resized. If the Guacamole client is not yet connected, it will be + * connected and the current size will sent through the initial + * handshake. If the size of the main element is not yet known, this + * function may need to be invoked multiple times until the size is + * known and the client may be connected. + */ + $scope.mainElementResized = function mainElementResized() { + + // Send new display size, if changed + if (client && display && main.offsetWidth && main.offsetHeight) { + + // Connect, if not already connected + ManagedClient.connect($scope.client, main.offsetWidth, main.offsetHeight); + + const pixelDensity = $window.devicePixelRatio || 1; + const width = main.offsetWidth * pixelDensity; + const height = main.offsetHeight * pixelDensity; + + if (display.getWidth() !== width || display.getHeight() !== height) + client.sendSize(width, height); + + } + + $scope.$evalAsync(updateDisplayScale); + + }; + + // Scroll client display if absolute mouse is in use (the same drag + // gesture is needed for moving the mouse pointer with relative mouse) + $scope.clientDrag = function clientDrag(inProgress, startX, startY, currentX, currentY, deltaX, deltaY) { + + if ($scope.emulateAbsoluteMouse) { + $scope.client.clientProperties.scrollLeft -= deltaX; + $scope.client.clientProperties.scrollTop -= deltaY; + } + + return false; + + }; + + /** + * If a pinch gesture is in progress, the scale of the client display when + * the pinch gesture began. + * + * @type Number + */ + let initialScale = null; + + /** + * If a pinch gesture is in progress, the X coordinate of the point on the + * client display that was centered within the pinch at the time the + * gesture began. + * + * @type Number + */ + let initialCenterX = 0; + + /** + * If a pinch gesture is in progress, the Y coordinate of the point on the + * client display that was centered within the pinch at the time the + * gesture began. + * + * @type Number + */ + let initialCenterY = 0; + + // Zoom and pan client via pinch gestures + $scope.clientPinch = function clientPinch(inProgress, startLength, currentLength, centerX, centerY) { + + // Do not handle pinch gestures if they would conflict with remote + // handling of similar gestures + if ($scope.client.multiTouchSupport > 1) + return false; + + // Do not handle pinch gestures while relative mouse is in use (2+ + // contact point gestures are used by relative mouse emulation to + // support right click, middle click, and scrolling) + if (!$scope.emulateAbsoluteMouse) + return false; + + // Stop gesture if not in progress + if (!inProgress) { + initialScale = null; + return false; + } + + // Set initial scale if gesture has just started + if (!initialScale) { + initialScale = $scope.client.clientProperties.scale; + initialCenterX = (centerX + $scope.client.clientProperties.scrollLeft) / initialScale; + initialCenterY = (centerY + $scope.client.clientProperties.scrollTop) / initialScale; + } + + // Determine new scale absolutely + let currentScale = initialScale * currentLength / startLength; + + // Fix scale within limits - scroll will be miscalculated otherwise + currentScale = Math.max(currentScale, $scope.client.clientProperties.minScale); + currentScale = Math.min(currentScale, $scope.client.clientProperties.maxScale); + + // Update scale based on pinch distance + $scope.client.clientProperties.autoFit = false; + $scope.client.clientProperties.scale = currentScale; + + // Scroll display to keep original pinch location centered within current pinch + $scope.client.clientProperties.scrollLeft = initialCenterX * currentScale - centerX; + $scope.client.clientProperties.scrollTop = initialCenterY * currentScale - centerY; + + return false; + + }; + + // Ensure focus is regained via mousedown before forwarding event + mouse.on('mousedown', document.body.focus.bind(document.body)); + + // Forward all mouse events + mouse.onEach(['mousedown', 'mousemove', 'mouseup'], handleMouseEvent); + + // Hide software cursor when mouse leaves display + mouse.on('mouseout', function() { + if (!display) return; + display.showCursor(false); + }); + + // Update remote clipboard if local clipboard changes + $scope.$on('guacClipboard', function onClipboard(event, data) { + ManagedClient.setClipboard($scope.client, data); + }); + + // Translate local keydown events to remote keydown events if keyboard is enabled + $scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) { + if ($scope.client.clientProperties.focused) { + client.sendKeyEvent(1, keysym); + event.preventDefault(); + } + }); + + // Translate local keyup events to remote keyup events if keyboard is enabled + $scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) { + if ($scope.client.clientProperties.focused) { + client.sendKeyEvent(0, keysym); + event.preventDefault(); + } + }); + + // Universally handle all synthetic keydown events + $scope.$on('guacSyntheticKeydown', function syntheticKeydownListener(event, keysym) { + if ($scope.client.clientProperties.focused) + client.sendKeyEvent(1, keysym); + }); + + // Universally handle all synthetic keyup events + $scope.$on('guacSyntheticKeyup', function syntheticKeyupListener(event, keysym) { + if ($scope.client.clientProperties.focused) + client.sendKeyEvent(0, keysym); + }); + + /** + * Whether a drag/drop operation is currently in progress (the user has + * dragged a file over the Guacamole connection but has not yet + * dropped it). + * + * @type boolean + */ + $scope.dropPending = false; + + /** + * Displays a visual indication that dropping the file currently + * being dragged is possible. Further propagation and default behavior + * of the given event is automatically prevented. + * + * @param {Event} e + * The event related to the in-progress drag/drop operation. + */ + const notifyDragStart = function notifyDragStart(e) { + + e.preventDefault(); + e.stopPropagation(); + + $scope.$apply(() => { + $scope.dropPending = true; + }); + + }; + + /** + * Removes the visual indication that dropping the file currently + * being dragged is possible. Further propagation and default behavior + * of the given event is automatically prevented. + * + * @param {Event} e + * The event related to the end of the former drag/drop operation. + */ + const notifyDragEnd = function notifyDragEnd(e) { + + e.preventDefault(); + e.stopPropagation(); + + $scope.$apply(() => { + $scope.dropPending = false; + }); + + }; + + main.addEventListener('dragenter', notifyDragStart, false); + main.addEventListener('dragover', notifyDragStart, false); + main.addEventListener('dragleave', notifyDragEnd, false); + + // File drop event handler + main.addEventListener('drop', function(e) { + + notifyDragEnd(e); + + // Ignore file drops if no attached client + if (!$scope.client) + return; + + // Upload each file + const files = e.dataTransfer.files; + for (let i = 0; i < files.length; i++) + ManagedClient.uploadFile($scope.client, files[i]); + + }, false); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacClientNotification.js b/guacamole/src/main/frontend/src/app/client/directives/guacClientNotification.js new file mode 100644 index 0000000..03344b6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacClientNotification.js @@ -0,0 +1,409 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for displaying a non-global notification describing the status + * of a specific Guacamole client, including prompts for any information + * necessary to continue the connection. + */ +angular.module('client').directive('guacClientNotification', [function guacClientNotification() { + + const directive = { + restrict: 'E', + replace: true, + templateUrl: 'app/client/templates/guacClientNotification.html' + }; + + directive.scope = { + + /** + * The client whose status should be displayed. + * + * @type ManagedClient + */ + client : '=' + + }; + + directive.controller = ['$scope', '$injector', '$element', + function guacClientNotificationController($scope, $injector, $element) { + + // Required types + const ManagedClient = $injector.get('ManagedClient'); + const ManagedClientState = $injector.get('ManagedClientState'); + const Protocol = $injector.get('Protocol'); + + // Required services + const $location = $injector.get('$location'); + const authenticationService = $injector.get('authenticationService'); + const guacClientManager = $injector.get('guacClientManager'); + const guacTranslate = $injector.get('guacTranslate'); + const requestService = $injector.get('requestService'); + const userPageService = $injector.get('userPageService'); + + /** + * A Notification object describing the client status to display as a + * dialog or prompt, as would be accepted by guacNotification.showStatus(), + * or false if no status should be shown. + * + * @type {Notification|Object|Boolean} + */ + $scope.status = false; + + /** + * All error codes for which automatic reconnection is appropriate when a + * client error occurs. + */ + const CLIENT_AUTO_RECONNECT = { + 0x0200: true, + 0x0202: true, + 0x0203: true, + 0x0207: true, + 0x0208: true, + 0x0301: true, + 0x0308: true + }; + + /** + * All error codes for which automatic reconnection is appropriate when a + * tunnel error occurs. + */ + const TUNNEL_AUTO_RECONNECT = { + 0x0200: true, + 0x0202: true, + 0x0203: true, + 0x0207: true, + 0x0208: true, + 0x0308: true + }; + + /** + * Action which logs out from Guacamole entirely. + */ + const LOGOUT_ACTION = { + name : "CLIENT.ACTION_LOGOUT", + className : "logout button", + callback : function logoutCallback() { + authenticationService.logout() + ['catch'](requestService.IGNORE); + } + }; + + /** + * Action which returns the user to the home screen. If the home page has + * not yet been determined, this will be null. + */ + let NAVIGATE_HOME_ACTION = null; + + // Assign home page action once user's home page has been determined + userPageService.getHomePage() + .then(function homePageRetrieved(homePage) { + + // Define home action only if different from current location + if ($location.path() !== homePage.url) { + NAVIGATE_HOME_ACTION = { + name : "CLIENT.ACTION_NAVIGATE_HOME", + className : "home button", + callback : function navigateHomeCallback() { + $location.url(homePage.url); + } + }; + } + + }, requestService.WARN); + + /** + * Action which replaces the current client with a newly-connected client. + */ + const RECONNECT_ACTION = { + name : "CLIENT.ACTION_RECONNECT", + className : "reconnect button", + callback : function reconnectCallback() { + $scope.client = guacClientManager.replaceManagedClient($scope.client.id); + $scope.status = false; + } + }; + + /** + * The reconnect countdown to display if an error or status warrants an + * automatic, timed reconnect. + */ + const RECONNECT_COUNTDOWN = { + text: "CLIENT.TEXT_RECONNECT_COUNTDOWN", + callback: RECONNECT_ACTION.callback, + remaining: 15 + }; + + /** + * Displays a notification at the end of a Guacamole connection, whether + * that connection is ending normally or due to an error. As the end of + * a Guacamole connection may be due to changes in authentication status, + * this will also implicitly peform a re-authentication attempt to check + * for such changes, possibly resulting in auth-related events like + * guacInvalidCredentials. + * + * @param {Notification|Boolean|Object} status + * The status notification to show, as would be accepted by + * guacNotification.showStatus(). + */ + const notifyConnectionClosed = function notifyConnectionClosed(status) { + + // Re-authenticate to verify auth status at end of connection + authenticationService.updateCurrentToken($location.search()) + ['catch'](requestService.IGNORE) + + // Show the requested status once the authentication check has finished + ['finally'](function authenticationCheckComplete() { + $scope.status = status; + }); + + }; + + /** + * Notifies the user that the connection state has changed. + * + * @param {String} connectionState + * The current connection state, as defined by + * ManagedClientState.ConnectionState. + */ + const notifyConnectionState = function notifyConnectionState(connectionState) { + + // Hide any existing status + $scope.status = false; + + // Do not display status if status not known + if (!connectionState) + return; + + // Build array of available actions + let actions; + if (NAVIGATE_HOME_ACTION) + actions = [ NAVIGATE_HOME_ACTION, RECONNECT_ACTION, LOGOUT_ACTION ]; + else + actions = [ RECONNECT_ACTION, LOGOUT_ACTION ]; + + // Get any associated status code + const status = $scope.client.clientState.statusCode; + + // Connecting + if (connectionState === ManagedClientState.ConnectionState.CONNECTING + || connectionState === ManagedClientState.ConnectionState.WAITING) { + $scope.status = { + className : "connecting", + title: "CLIENT.DIALOG_HEADER_CONNECTING", + text: { + key : "CLIENT.TEXT_CLIENT_STATUS_" + connectionState.toUpperCase() + } + }; + } + + // Client error + else if (connectionState === ManagedClientState.ConnectionState.CLIENT_ERROR) { + + // Translation IDs for this error code + const errorPrefix = "CLIENT.ERROR_CLIENT_"; + const errorId = errorPrefix + status.toString(16).toUpperCase(); + const defaultErrorId = errorPrefix + "DEFAULT"; + + // Determine whether the reconnect countdown applies + const countdown = (status in CLIENT_AUTO_RECONNECT) ? RECONNECT_COUNTDOWN : null; + + // Use the guacTranslate service to determine if there is a translation for + // this error code; if not, use the default + guacTranslate(errorId, defaultErrorId).then( + + // Show error status + translationResult => notifyConnectionClosed({ + className : "error", + title : "CLIENT.DIALOG_HEADER_CONNECTION_ERROR", + text : { + key : translationResult.id + }, + countdown : countdown, + actions : actions + }) + ); + + } + + // Tunnel error + else if (connectionState === ManagedClientState.ConnectionState.TUNNEL_ERROR) { + + // Translation IDs for this error code + const errorPrefix = "CLIENT.ERROR_TUNNEL_"; + const errorId = errorPrefix + status.toString(16).toUpperCase(); + const defaultErrorId = errorPrefix + "DEFAULT"; + + // Determine whether the reconnect countdown applies + const countdown = (status in TUNNEL_AUTO_RECONNECT) ? RECONNECT_COUNTDOWN : null; + + // Use the guacTranslate service to determine if there is a translation for + // this error code; if not, use the default + guacTranslate(errorId, defaultErrorId).then( + + // Show error status + translationResult => notifyConnectionClosed({ + className : "error", + title : "CLIENT.DIALOG_HEADER_CONNECTION_ERROR", + text : { + key : translationResult.id + }, + countdown : countdown, + actions : actions + }) + ); + + } + + // Disconnected + else if (connectionState === ManagedClientState.ConnectionState.DISCONNECTED) { + notifyConnectionClosed({ + title : "CLIENT.DIALOG_HEADER_DISCONNECTED", + text : { + key : "CLIENT.TEXT_CLIENT_STATUS_" + connectionState.toUpperCase() + }, + actions : actions + }); + } + + // Hide status for all other states + else + $scope.status = false; + + }; + + /** + * Prompts the user to enter additional connection parameters. If the + * protocol and associated parameters of the underlying connection are not + * yet known, this function has no effect and should be re-invoked once + * the parameters are known. + * + * @param {Object.} requiredParameters + * The set of all parameters requested by the server via "required" + * instructions, where each object key is the name of a requested + * parameter and each value is the current value entered by the user. + */ + const notifyParametersRequired = function notifyParametersRequired(requiredParameters) { + + /** + * Action which submits the current set of parameter values, requesting + * that the connection continue. + */ + const SUBMIT_PARAMETERS = { + name : "CLIENT.ACTION_CONTINUE", + className : "button", + callback : function submitParameters() { + if ($scope.client) { + const params = $scope.client.requiredParameters; + $scope.client.requiredParameters = null; + ManagedClient.sendArguments($scope.client, params); + } + } + }; + + /** + * Action which cancels submission of additional parameters and + * disconnects from the current connection. + */ + const CANCEL_PARAMETER_SUBMISSION = { + name : "CLIENT.ACTION_CANCEL", + className : "button", + callback : function cancelSubmission() { + $scope.client.requiredParameters = null; + $scope.client.client.disconnect(); + } + }; + + // Attempt to prompt for parameters only if the parameters that apply + // to the underlying connection are known + if (!$scope.client.protocol || !$scope.client.forms) + return; + + // Prompt for parameters + $scope.status = { + className : "parameters-required", + formNamespace : Protocol.getNamespace($scope.client.protocol), + forms : $scope.client.forms, + formModel : requiredParameters, + formSubmitCallback : SUBMIT_PARAMETERS.callback, + actions : [ SUBMIT_PARAMETERS, CANCEL_PARAMETER_SUBMISSION ] + }; + + }; + + /** + * Returns whether the given connection state allows for submission of + * connection parameters via "argv" instructions. + * + * @param {String} connectionState + * The connection state to test, as defined by + * ManagedClientState.ConnectionState. + * + * @returns {boolean} + * true if the given connection state allows submission of connection + * parameters via "argv" instructions, false otherwise. + */ + const canSubmitParameters = function canSubmitParameters(connectionState) { + return (connectionState === ManagedClientState.ConnectionState.WAITING || + connectionState === ManagedClientState.ConnectionState.CONNECTED); + }; + + // Show status dialog when connection status changes + $scope.$watchGroup([ + 'client.clientState.connectionState', + 'client.requiredParameters', + 'client.protocol', + 'client.forms' + ], function clientStateChanged(newValues) { + + const connectionState = newValues[0]; + const requiredParameters = newValues[1]; + + // Prompt for parameters only if parameters can actually be submitted + if (requiredParameters && canSubmitParameters(connectionState)) + notifyParametersRequired(requiredParameters); + + // Otherwise, just show general connection state + else + notifyConnectionState(connectionState); + + }); + + /** + * Prevents the default behavior of the given AngularJS event if a + * notification is currently shown and the client is focused. + * + * @param {event} e + * The AngularJS event to selectively prevent. + */ + const preventDefaultDuringNotification = function preventDefaultDuringNotification(e) { + if ($scope.status && $scope.client.clientProperties.focused) + e.preventDefault(); + }; + + // Block internal handling of key events (by the client) if a + // notification is visible + $scope.$on('guacBeforeKeydown', preventDefaultDuringNotification); + $scope.$on('guacBeforeKeyup', preventDefaultDuringNotification); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacClientPanel.js b/guacamole/src/main/frontend/src/app/client/directives/guacClientPanel.js new file mode 100644 index 0000000..1aaafec --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacClientPanel.js @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A toolbar/panel which displays a list of active Guacamole connections. The + * panel is fixed to the bottom-right corner of its container and can be + * manually hidden/exposed by the user. + */ +angular.module('client').directive('guacClientPanel', ['$injector', function guacClientPanel($injector) { + + // Required services + const guacClientManager = $injector.get('guacClientManager'); + const sessionStorageFactory = $injector.get('sessionStorageFactory'); + + // Required types + const ManagedClientGroup = $injector.get('ManagedClientGroup'); + const ManagedClientState = $injector.get('ManagedClientState'); + + /** + * Getter/setter for the boolean flag controlling whether the client panel + * is currently hidden. This flag is maintained in session-local storage to + * allow the state of the panel to persist despite navigation within the + * same tab. When hidden, the panel will be collapsed against the right + * side of the container. By default, the panel is visible. + * + * @type Function + */ + var panelHidden = sessionStorageFactory.create(false); + + return { + // Element only + restrict: 'E', + replace: true, + scope: { + + /** + * The ManagedClientGroup instances associated with the active + * connections to be displayed within this panel. + * + * @type ManagedClientGroup[] + */ + clientGroups : '=' + + }, + templateUrl: 'app/client/templates/guacClientPanel.html', + controller: ['$scope', '$element', function guacClientPanelController($scope, $element) { + + /** + * The DOM element containing the scrollable portion of the client + * panel. + * + * @type Element + */ + var scrollableArea = $element.find('.client-panel-connection-list')[0]; + + /** + * On-scope reference to session-local storage of the flag + * controlling whether then panel is hidden. + */ + $scope.panelHidden = panelHidden; + + /** + * Returns whether this panel currently has any client groups + * associated with it. + * + * @return {Boolean} + * true if at least one client group is associated with this + * panel, false otherwise. + */ + $scope.hasClientGroups = function hasClientGroups() { + return $scope.clientGroups && $scope.clientGroups.some(function(group) { + // Check if there is any group that is not attached + return !group.attached; + }); + }; + + /** + * @borrows ManagedClientGroup.getIdentifier + */ + $scope.getIdentifier = ManagedClientGroup.getIdentifier; + + /** + * @borrows ManagedClientGroup.getTitle + */ + $scope.getTitle = ManagedClientGroup.getTitle; + + /** + * Returns whether the status of any client within the given client + * group has changed in a way that requires the user's attention. + * This may be due to an error, or due to a server-initiated + * disconnect. + * + * @param {ManagedClientGroup} clientGroup + * The client group to test. + * + * @returns {Boolean} + * true if the given client requires the user's attention, + * false otherwise. + */ + $scope.hasStatusUpdate = function hasStatusUpdate(clientGroup) { + return _.findIndex(clientGroup.clients, (client) => { + + // Test whether the client has encountered an error + switch (client.clientState.connectionState) { + case ManagedClientState.ConnectionState.CONNECTION_ERROR: + case ManagedClientState.ConnectionState.TUNNEL_ERROR: + case ManagedClientState.ConnectionState.DISCONNECTED: + return true; + } + + return false; + + }) !== -1; + }; + + /** + * Initiates an orderly disconnect of all clients within the given + * group. The clients are removed from management such that + * attempting to connect to any of the same connections will result + * in new connections being established, rather than displaying a + * notification that the connection has ended. + * + * @param {ManagedClientGroup} clientGroup + * The group of clients to disconnect. + */ + $scope.disconnect = function disconnect(clientGroup) { + guacClientManager.removeManagedClientGroup(ManagedClientGroup.getIdentifier(clientGroup)); + }; + + /** + * Toggles whether the client panel is currently hidden. + */ + $scope.togglePanel = function togglePanel() { + panelHidden(!panelHidden()); + }; + + // Override vertical scrolling, scrolling horizontally instead + scrollableArea.addEventListener('wheel', function reorientVerticalScroll(e) { + + var deltaMultiplier = { + /* DOM_DELTA_PIXEL */ 0x00: 1, + /* DOM_DELTA_LINE */ 0x01: 15, + /* DOM_DELTA_PAGE */ 0x02: scrollableArea.offsetWidth + }; + + if (e.deltaY) { + this.scrollLeft += e.deltaY * (deltaMultiplier[e.deltaMode] || deltaMultiplier(0x01)); + e.preventDefault(); + } + + }); + + }] + }; +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacClientUserCount.js b/guacamole/src/main/frontend/src/app/client/directives/guacClientUserCount.js new file mode 100644 index 0000000..3c42fc3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacClientUserCount.js @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive that displays a status indicator showing the number of users + * joined to a connection. The specific usernames of those users are visible in + * a tooltip on mouseover, and small notifications are displayed as users + * join/leave the connection. + */ +angular.module('client').directive('guacClientUserCount', [function guacClientUserCount() { + + const directive = { + restrict: 'E', + replace: true, + templateUrl: 'app/client/templates/guacClientUserCount.html' + }; + + directive.scope = { + + /** + * The client whose current users should be displayed. + * + * @type ManagedClient + */ + client : '=' + + }; + + directive.controller = ['$scope', '$injector', '$element', + function guacClientUserCountController($scope, $injector, $element) { + + // Required types + var AuthenticationResult = $injector.get('AuthenticationResult'); + + // Required services + var $translate = $injector.get('$translate'); + + /** + * The maximum number of messages displayed by this directive at any + * given time. Old messages will be discarded as necessary to ensure + * the number of messages displayed never exceeds this value. + * + * @constant + * @type number + */ + var MAX_MESSAGES = 3; + + /** + * The list that should contain any notifications regarding users + * joining or leaving the connection. + * + * @type HTMLUListElement + */ + var messages = $element.find('.client-user-count-messages')[0]; + + /** + * Map of the usernames of all users of the current connection to the + * number of concurrent connections those users have to the current + * connection. + * + * @type Object. + */ + $scope.userCounts = {}; + + /** + * Displays a message noting that a change related to a particular user + * of this connection has occurred. + * + * @param {!string} str + * The key of the translation string containing the message to + * display. This translation key must accept "USERNAME" as the + * name of the translation parameter containing the username of + * the user in question. + * + * @param {!string} username + * The username of the user in question. + */ + var notify = function notify(str, username) { + $translate(str, { 'USERNAME' : username }).then(function translationReady(text) { + + if (messages.childNodes.length === 3) + messages.removeChild(messages.lastChild); + + var message = document.createElement('li'); + message.className = 'client-user-count-message'; + message.textContent = text; + messages.insertBefore(message, messages.firstChild); + + // Automatically remove the notification after its "fadeout" + // animation ends. NOTE: This will not fire if the element is + // not visible at all. + message.addEventListener('animationend', function animationEnded() { + messages.removeChild(message); + }); + + }); + }; + + /** + * Displays a message noting that a particular user has joined the + * current connection. + * + * @param {!string} username + * The username of the user that joined. + */ + var notifyUserJoined = function notifyUserJoined(username) { + if ($scope.isAnonymous(username)) + notify('CLIENT.TEXT_ANONYMOUS_USER_JOINED', username); + else + notify('CLIENT.TEXT_USER_JOINED', username); + }; + + /** + * Displays a message noting that a particular user has left the + * current connection. + * + * @param {!string} username + * The username of the user that left. + */ + var notifyUserLeft = function notifyUserLeft(username) { + if ($scope.isAnonymous(username)) + notify('CLIENT.TEXT_ANONYMOUS_USER_LEFT', username); + else + notify('CLIENT.TEXT_USER_LEFT', username); + }; + + /** + * The ManagedClient attached to this directive at the time the + * notification update scope watch was last invoked. This is necessary + * as $scope.$watchGroup() does not allow for the callback to know + * whether the scope was previously uninitialized (it's "oldValues" + * parameter receives a copy of the new values if there are no old + * values). + * + * @type ManagedClient + */ + var oldClient = null; + + /** + * Returns whether the given username represents an anonymous user. + * + * @param {!string} username + * The username of the user to check. + * + * @returns {!boolean} + * true if the given username represents an anonymous user, false + * otherwise. + */ + $scope.isAnonymous = function isAnonymous(username) { + return username === AuthenticationResult.ANONYMOUS_USERNAME; + }; + + /** + * Returns the translation key of the translation string that should be + * used to render the number of connections a user with the given + * username has to the current connection. The appropriate string will + * vary by whether the user is anonymous. + * + * @param {!string} username + * The username of the user to check. + * + * @returns {!string} + * The translation key of the translation string that should be + * used to render the number of connections the user with the given + * username has to the current connection. + */ + $scope.getUserCountTranslationKey = function getUserCountTranslationKey(username) { + return $scope.isAnonymous(username) ? 'CLIENT.INFO_ANONYMOUS_USER_COUNT' : 'CLIENT.INFO_USER_COUNT'; + }; + + // Update visible notifications as users join/leave + $scope.$watchGroup([ 'client', 'client.userCount' ], function usersChanged() { + + // Resynchronize directive with state of any attached client when + // the client changes, to ensure notifications are only shown for + // future changes in users present + if (oldClient !== $scope.client) { + + $scope.userCounts = {}; + oldClient = $scope.client; + + angular.forEach($scope.client.users, function initUsers(connections, username) { + var count = Object.keys(connections).length; + $scope.userCounts[username] = count; + }); + + return; + + } + + // Display join/leave notifications for users who are currently + // connected but whose connection counts have changed + angular.forEach($scope.client.users, function addNewUsers(connections, username) { + + var count = Object.keys(connections).length; + var known = $scope.userCounts[username] || 0; + + if (count > known) + notifyUserJoined(username); + else if (count < known) + notifyUserLeft(username); + + $scope.userCounts[username] = count; + + }); + + // Display leave notifications for users who are no longer connected + angular.forEach($scope.userCounts, function removeOldUsers(count, username) { + if (!$scope.client.users[username]) { + notifyUserLeft(username); + delete $scope.userCounts[username]; + } + }); + + }); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacClientZoom.js b/guacamole/src/main/frontend/src/app/client/directives/guacClientZoom.js new file mode 100644 index 0000000..471ca19 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacClientZoom.js @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for controlling the zoom level and scale-to-fit behavior of a + * a single Guacamole client. + */ +angular.module('client').directive('guacClientZoom', [function guacClientZoom() { + + const directive = { + restrict: 'E', + replace: true, + templateUrl: 'app/client/templates/guacClientZoom.html' + }; + + directive.scope = { + + /** + * The client to control the zoom/autofit of. + * + * @type ManagedClient + */ + client : '=' + + }; + + directive.controller = ['$scope', '$injector', '$element', + function guacClientZoomController($scope, $injector, $element) { + + /** + * Zooms in by 10%, automatically disabling autofit. + */ + $scope.zoomIn = function zoomIn() { + $scope.client.clientProperties.autoFit = false; + $scope.client.clientProperties.scale += 0.1; + }; + + /** + * Zooms out by 10%, automatically disabling autofit. + */ + $scope.zoomOut = function zoomOut() { + $scope.client.clientProperties.autoFit = false; + $scope.client.clientProperties.scale -= 0.1; + }; + + /** + * Resets the client autofit setting to false. + */ + $scope.clearAutoFit = function clearAutoFit() { + $scope.client.clientProperties.autoFit = false; + }; + + /** + * Notifies that the autofit setting has been manually changed by the + * user. + */ + $scope.autoFitChanged = function autoFitChanged() { + + // Reset to 100% scale when autofit is first disabled + if (!$scope.client.clientProperties.autoFit) + $scope.client.clientProperties.scale = 1; + + }; + + }]; + + return directive; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacFileBrowser.js b/guacamole/src/main/frontend/src/app/client/directives/guacFileBrowser.js new file mode 100644 index 0000000..f1daf3e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacFileBrowser.js @@ -0,0 +1,281 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays the contents of a filesystem received through the + * Guacamole client. + */ +angular.module('client').directive('guacFileBrowser', [function guacFileBrowser() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * @type ManagedFilesystem + */ + filesystem : '=' + + }, + + templateUrl: 'app/client/templates/guacFileBrowser.html', + controller: ['$scope', '$element', '$injector', function guacFileBrowserController($scope, $element, $injector) { + + // Required types + var ManagedFilesystem = $injector.get('ManagedFilesystem'); + + // Required services + var $interpolate = $injector.get('$interpolate'); + var $templateRequest = $injector.get('$templateRequest'); + + /** + * The jQuery-wrapped element representing the contents of the + * current directory within the file browser. + * + * @type Element[] + */ + var currentDirectoryContents = $element.find('.current-directory-contents'); + + /** + * Statically-cached template HTML used to render each file within + * a directory. Once available, this will be used through + * createFileElement() to generate the DOM elements which make up + * a directory listing. + * + * @type String + */ + var fileTemplate = null; + + /** + * Returns whether the given file is a normal file. + * + * @param {ManagedFilesystem.File} file + * The file to test. + * + * @returns {Boolean} + * true if the given file is a normal file, false otherwise. + */ + $scope.isNormalFile = function isNormalFile(file) { + return file.type === ManagedFilesystem.File.Type.NORMAL; + }; + + /** + * Returns whether the given file is a directory. + * + * @param {ManagedFilesystem.File} file + * The file to test. + * + * @returns {Boolean} + * true if the given file is a directory, false otherwise. + */ + $scope.isDirectory = function isDirectory(file) { + return file.type === ManagedFilesystem.File.Type.DIRECTORY; + }; + + /** + * Changes the currently-displayed directory to the given + * directory. + * + * @param {ManagedFilesystem.File} file + * The directory to change to. + */ + $scope.changeDirectory = function changeDirectory(file) { + ManagedFilesystem.changeDirectory($scope.filesystem, file); + }; + + /** + * Initiates a download of the given file. The progress of the + * download can be observed through guacFileTransferManager. + * + * @param {ManagedFilesystem.File} file + * The file to download. + */ + $scope.downloadFile = function downloadFile(file) { + ManagedFilesystem.downloadFile($scope.filesystem, file.streamName); + }; + + /** + * Recursively interpolates all text nodes within the DOM tree of + * the given element. All other node types, attributes, etc. will + * be left uninterpolated. + * + * @param {Element} element + * The element at the root of the DOM tree to be interpolated. + * + * @param {Object} context + * The evaluation context to use when evaluating expressions + * embedded in text nodes within the provided element. + */ + var interpolateElement = function interpolateElement(element, context) { + + // Interpolate the contents of text nodes directly + if (element.nodeType === Node.TEXT_NODE) + element.nodeValue = $interpolate(element.nodeValue)(context); + + // Recursively interpolate the contents of all descendant text + // nodes + if (element.hasChildNodes()) { + var children = element.childNodes; + for (var i = 0; i < children.length; i++) + interpolateElement(children[i], context); + } + + }; + + /** + * Creates a new element representing the given file and properly + * handling user events, bypassing the overhead incurred through + * use of ngRepeat and related techniques. + * + * Note that this function depends on the availability of the + * statically-cached fileTemplate. + * + * @param {ManagedFilesystem.File} file + * The file to generate an element for. + * + * @returns {Element[]} + * A jQuery-wrapped array containing a single DOM element + * representing the given file. + */ + var createFileElement = function createFileElement(file) { + + // Create from internal template + var element = angular.element(fileTemplate); + interpolateElement(element[0], file); + + // Double-clicking on unknown file types will do nothing + var fileAction = function doNothing() {}; + + // Change current directory when directories are clicked + if ($scope.isDirectory(file)) { + element.addClass('directory'); + fileAction = function changeDirectory() { + $scope.changeDirectory(file); + }; + } + + // Initiate downloads when normal files are clicked + else if ($scope.isNormalFile(file)) { + element.addClass('normal-file'); + fileAction = function downloadFile() { + $scope.downloadFile(file); + }; + } + + // Mark file as focused upon click + element.on('click', function handleFileClick() { + + // Fire file-specific action if already focused + if (element.hasClass('focused')) { + fileAction(); + element.removeClass('focused'); + } + + // Otherwise mark as focused + else { + element.parent().children().removeClass('focused'); + element.addClass('focused'); + } + + }); + + // Prevent text selection during navigation + element.on('selectstart', function avoidSelect(e) { + e.preventDefault(); + e.stopPropagation(); + }); + + return element; + + }; + + /** + * Sorts the given map of files, returning an array of those files + * grouped by file type (directories first, followed by non- + * directories) and sorted lexicographically. + * + * @param {Object.} files + * The map of files to sort. + * + * @returns {ManagedFilesystem.File[]} + * An array of all files in the given map, sorted + * lexicographically with directories first, followed by non- + * directories. + */ + var sortFiles = function sortFiles(files) { + + // Get all given files as an array + var unsortedFiles = []; + for (var name in files) + unsortedFiles.push(files[name]); + + // Sort files - directories first, followed by all other files + // sorted by name + return unsortedFiles.sort(function fileComparator(a, b) { + + // Directories come before non-directories + if ($scope.isDirectory(a) && !$scope.isDirectory(b)) + return -1; + + // Non-directories come after directories + if (!$scope.isDirectory(a) && $scope.isDirectory(b)) + return 1; + + // All other combinations are sorted by name + return a.name.localeCompare(b.name); + + }); + + }; + + // Watch directory contents once file template is available + $templateRequest('app/client/templates/file.html').then(function fileTemplateRetrieved(html) { + + // Store file template statically + fileTemplate = html; + + // Update the contents of the file browser whenever the current directory (or its contents) changes + $scope.$watch('filesystem.currentDirectory.files', function currentDirectoryChanged(files) { + + // Clear current content + currentDirectoryContents.html(''); + + // Display all files within current directory, sorted + angular.forEach(sortFiles(files), function displayFile(file) { + currentDirectoryContents.append(createFileElement(file)); + }); + + }); + + }, angular.noop); // end retrieve file template + + // Refresh file browser when any upload completes + $scope.$on('guacUploadComplete', function uploadComplete(event, filename) { + + // Refresh filesystem, if it exists + if ($scope.filesystem) + ManagedFilesystem.refresh($scope.filesystem, $scope.filesystem.currentDirectory); + + }); + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacFileTransfer.js b/guacamole/src/main/frontend/src/app/client/directives/guacFileTransfer.js new file mode 100644 index 0000000..d016a72 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacFileTransfer.js @@ -0,0 +1,216 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Directive which displays an active file transfer, providing links for + * downloads, if applicable. + */ +angular.module('client').directive('guacFileTransfer', [function guacFileTransfer() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The file transfer to display. + * + * @type ManagedFileUpload|ManagedFileDownload + */ + transfer : '=' + + }, + + templateUrl: 'app/client/templates/guacFileTransfer.html', + controller: ['$scope', '$injector', function guacFileTransferController($scope, $injector) { + + // Required services + const guacTranslate = $injector.get('guacTranslate'); + + // Required types + var ManagedFileTransferState = $injector.get('ManagedFileTransferState'); + + /** + * Returns the unit string that is most appropriate for the + * number of bytes transferred thus far - either 'gb', 'mb', 'kb', + * or 'b'. + * + * @returns {String} + * The unit string that is most appropriate for the number of + * bytes transferred thus far. + */ + $scope.getProgressUnit = function getProgressUnit() { + + var bytes = $scope.transfer.progress; + + // Gigabytes + if (bytes > 1000000000) + return 'gb'; + + // Megabytes + if (bytes > 1000000) + return 'mb'; + + // Kilobytes + if (bytes > 1000) + return 'kb'; + + // Bytes + return 'b'; + + }; + + /** + * Returns the amount of data transferred thus far, in the units + * returned by getProgressUnit(). + * + * @returns {Number} + * The amount of data transferred thus far, in the units + * returned by getProgressUnit(). + */ + $scope.getProgressValue = function getProgressValue() { + + var bytes = $scope.transfer.progress; + if (!bytes) + return bytes; + + // Convert bytes to necessary units + switch ($scope.getProgressUnit()) { + + // Gigabytes + case 'gb': + return (bytes / 1000000000).toFixed(1); + + // Megabytes + case 'mb': + return (bytes / 1000000).toFixed(1); + + // Kilobytes + case 'kb': + return (bytes / 1000).toFixed(1); + + // Bytes + case 'b': + default: + return bytes; + + } + + }; + + /** + * Returns the percentage of bytes transferred thus far, if the + * overall length of the file is known. + * + * @returns {Number} + * The percentage of bytes transferred thus far, if the + * overall length of the file is known. + */ + $scope.getPercentDone = function getPercentDone() { + return $scope.transfer.progress / $scope.transfer.length * 100; + }; + + /** + * Determines whether the associated file transfer is in progress. + * + * @returns {Boolean} + * true if the file transfer is in progress, false othherwise. + */ + $scope.isInProgress = function isInProgress() { + + // Not in progress if there is no transfer + if (!$scope.transfer) + return false; + + // Determine in-progress status based on stream state + switch ($scope.transfer.transferState.streamState) { + + // IDLE or OPEN file transfers are active + case ManagedFileTransferState.StreamState.IDLE: + case ManagedFileTransferState.StreamState.OPEN: + return true; + + // All others are not active + default: + return false; + + } + + }; + + /** + * Returns whether the file associated with this file transfer can + * be saved locally via a call to save(). + * + * @returns {Boolean} + * true if a call to save() will result in the file being + * saved, false otherwise. + */ + $scope.isSavable = function isSavable() { + return !!$scope.transfer.blob; + }; + + /** + * Saves the downloaded file, if any. If this transfer is an upload + * or the download is not yet complete, this function has no + * effect. + */ + $scope.save = function save() { + + // Ignore if no blob exists + if (!$scope.transfer.blob) + return; + + // Save file + saveAs($scope.transfer.blob, $scope.transfer.filename); + + }; + + /** + * Returns whether an error has occurred. If an error has occurred, + * the transfer is no longer active, and the text of the error can + * be read from getErrorText(). + * + * @returns {Boolean} + * true if an error has occurred during transfer, false + * otherwise. + */ + $scope.hasError = function hasError() { + return $scope.transfer.transferState.streamState === ManagedFileTransferState.StreamState.ERROR; + }; + + // The translated error message for the current status code + $scope.translatedErrorMessage = ''; + + $scope.$watch('transfer.transferState.statusCode', function statusCodeChanged(statusCode) { + + // Determine translation name of error + const errorName = 'CLIENT.ERROR_UPLOAD_' + statusCode.toString(16).toUpperCase(); + + // Use translation string, or the default if no translation is found for this error code + guacTranslate(errorName, 'CLIENT.ERROR_UPLOAD_DEFAULT').then( + translationResult => $scope.translatedErrorMessage = translationResult.message + ); + + }); + + }] // end file transfer controller + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacFileTransferManager.js b/guacamole/src/main/frontend/src/app/client/directives/guacFileTransferManager.js new file mode 100644 index 0000000..3a7c3a3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacFileTransferManager.js @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Directive which displays all active file transfers. + */ +angular.module('client').directive('guacFileTransferManager', [function guacFileTransferManager() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The client group whose file transfers should be managed by this + * directive. + * + * @type ManagedClientGroup + */ + clientGroup : '=' + + }, + + templateUrl: 'app/client/templates/guacFileTransferManager.html', + controller: ['$scope', '$injector', function guacFileTransferManagerController($scope, $injector) { + + // Required types + const ManagedClient = $injector.get('ManagedClient'); + const ManagedClientGroup = $injector.get('ManagedClientGroup'); + const ManagedFileTransferState = $injector.get('ManagedFileTransferState'); + + /** + * Determines whether the given file transfer state indicates an + * in-progress transfer. + * + * @param {ManagedFileTransferState} transferState + * The file transfer state to check. + * + * @returns {Boolean} + * true if the given file transfer state indicates an in- + * progress transfer, false otherwise. + */ + var isInProgress = function isInProgress(transferState) { + switch (transferState.streamState) { + + // IDLE or OPEN file transfers are active + case ManagedFileTransferState.StreamState.IDLE: + case ManagedFileTransferState.StreamState.OPEN: + return true; + + // All others are not active + default: + return false; + + } + }; + + /** + * Removes all file transfers which are not currently in-progress. + */ + $scope.clearCompletedTransfers = function clearCompletedTransfers() { + + // Nothing to clear if no client group attached + if (!$scope.clientGroup) + return; + + // Remove completed uploads + $scope.clientGroup.clients.forEach(client => { + client.uploads = client.uploads.filter(function isUploadInProgress(upload) { + return isInProgress(upload.transferState); + }); + }); + + }; + + /** + * @borrows ManagedClientGroup.hasMultipleClients + */ + $scope.hasMultipleClients = ManagedClientGroup.hasMultipleClients; + + /** + * @borrows ManagedClient.hasTransfers + */ + $scope.hasTransfers = ManagedClient.hasTransfers; + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacThumbnail.js b/guacamole/src/main/frontend/src/app/client/directives/guacThumbnail.js new file mode 100644 index 0000000..3b518e7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacThumbnail.js @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for displaying a Guacamole client as a non-interactive + * thumbnail. + */ +angular.module('client').directive('guacThumbnail', [function guacThumbnail() { + + return { + // Element only + restrict: 'E', + replace: true, + scope: { + + /** + * The client to display within this guacThumbnail directive. + * + * @type ManagedClient + */ + client : '=' + + }, + templateUrl: 'app/client/templates/guacThumbnail.html', + controller: ['$scope', '$injector', '$element', function guacThumbnailController($scope, $injector, $element) { + + // Required services + var $window = $injector.get('$window'); + + /** + * The display of the current Guacamole client instance. + * + * @type Guacamole.Display + */ + var display = null; + + /** + * The element associated with the display of the current + * Guacamole client instance. + * + * @type Element + */ + var displayElement = null; + + /** + * The element which must contain the Guacamole display element. + * + * @type Element + */ + var displayContainer = $element.find('.display')[0]; + + /** + * The main containing element for the entire directive. + * + * @type Element + */ + var main = $element[0]; + + /** + * Updates the scale of the attached Guacamole.Client based on current window + * size and "auto-fit" setting. + */ + $scope.updateDisplayScale = function updateDisplayScale() { + + if (!display) return; + + // Fit within available area + display.scale(Math.min( + main.offsetWidth / Math.max(display.getWidth(), 1), + main.offsetHeight / Math.max(display.getHeight(), 1) + )); + + }; + + // Attach any given managed client + $scope.$watch('client', function attachManagedClient(managedClient) { + + // Remove any existing display + displayContainer.innerHTML = ""; + + // Only proceed if a client is given + if (!managedClient) + return; + + // Get Guacamole client instance + var client = managedClient.client; + + // Attach possibly new display + display = client.getDisplay(); + + // Add display element + displayElement = display.getElement(); + displayContainer.appendChild(displayElement); + + }); + + // Update scale when display is resized + $scope.$watch('client.managedDisplay.size', function setDisplaySize(size) { + $scope.$evalAsync($scope.updateDisplayScale); + }); + + }] + }; +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacTiledClients.js b/guacamole/src/main/frontend/src/app/client/directives/guacTiledClients.js new file mode 100644 index 0000000..52289bc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacTiledClients.js @@ -0,0 +1,184 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays one or more Guacamole clients in an evenly-tiled + * view. The number of rows and columns used for the arrangement of tiles is + * automatically determined by the number of clients present. + */ +angular.module('client').directive('guacTiledClients', [function guacTiledClients() { + + const directive = { + restrict: 'E', + templateUrl: 'app/client/templates/guacTiledClients.html', + }; + + directive.scope = { + + /** + * The function to invoke when the "close" button in the header of a + * client tile is clicked. The ManagedClient that is closed will be + * made available to the Angular expression defining the callback as + * "$client". + * + * @type function + */ + onClose : '&', + + /** + * The group of Guacamole clients that should be displayed in an + * evenly-tiled grid arrangement. + * + * @type ManagedClientGroup + */ + clientGroup : '=', + + /** + * Whether translation of touch to mouse events should emulate an + * absolute pointer device, or a relative pointer device. + * + * @type boolean + */ + emulateAbsoluteMouse : '=' + + }; + + directive.controller = ['$scope', '$injector', '$element', + function guacTiledClientsController($scope, $injector, $element) { + + // Required services + const $rootScope = $injector.get('$rootScope'); + + // Required types + const ManagedClient = $injector.get('ManagedClient'); + const ManagedClientGroup = $injector.get('ManagedClientGroup'); + + /** + * Returns the currently-focused ManagedClient. If there is no such + * client, or multiple clients are focused, null is returned. + * + * @returns {ManagedClient} + * The currently-focused client, or null if there are no focused + * clients or if multiple clients are focused. + */ + $scope.getFocusedClient = function getFocusedClient() { + + const managedClientGroup = $scope.clientGroup; + if (managedClientGroup) { + const focusedClients = _.filter(managedClientGroup.clients, client => client.clientProperties.focused); + if (focusedClients.length === 1) + return focusedClients[0]; + } + + return null; + + }; + + // Notify whenever identify of currently-focused client changes + $scope.$watch('getFocusedClient()', function focusedClientChanged(focusedClient) { + $rootScope.$broadcast('guacClientFocused', focusedClient); + }); + + // Notify whenever arguments of currently-focused client changes + $scope.$watch('getFocusedClient().arguments', function focusedClientParametersChanged() { + $rootScope.$broadcast('guacClientArgumentsUpdated', $scope.getFocusedClient()); + }, true); + + // Notify whenever protocol of currently-focused client changes + $scope.$watch('getFocusedClient().protocol', function focusedClientParametersChanged() { + $rootScope.$broadcast('guacClientProtocolUpdated', $scope.getFocusedClient()); + }, true); + + /** + * Returns a callback for guacClick that assigns or updates keyboard + * focus to the given client, allowing that client to receive and + * handle keyboard events. Multiple clients may have keyboard focus + * simultaneously. + * + * @param {ManagedClient} client + * The client that should receive keyboard focus. + * + * @return {guacClick~callback} + * The callback that guacClient should invoke when the given client + * has been clicked. + */ + $scope.getFocusAssignmentCallback = function getFocusAssignmentCallback(client) { + return (shift, ctrl) => { + + // Clear focus of all other clients if not selecting multiple + if (!shift && !ctrl) { + $scope.clientGroup.clients.forEach(client => { + client.clientProperties.focused = false; + }); + } + + client.clientProperties.focused = true; + + // Fill in any gaps if performing rectangular multi-selection + // via shift-click + if (shift) { + + let minRow = $scope.clientGroup.rows - 1; + let minColumn = $scope.clientGroup.columns - 1; + let maxRow = 0; + let maxColumn = 0; + + // Determine extents of selected area + ManagedClientGroup.forEach($scope.clientGroup, (client, row, column) => { + if (client.clientProperties.focused) { + minRow = Math.min(minRow, row); + minColumn = Math.min(minColumn, column); + maxRow = Math.max(maxRow, row); + maxColumn = Math.max(maxColumn, column); + } + }); + + ManagedClientGroup.forEach($scope.clientGroup, (client, row, column) => { + client.clientProperties.focused = + row >= minRow + && row <= maxRow + && column >= minColumn + && column <= maxColumn; + }); + + } + + }; + }; + + /** + * @borrows ManagedClientGroup.hasMultipleClients + */ + $scope.hasMultipleClients = ManagedClientGroup.hasMultipleClients; + + /** + * @borrows ManagedClientGroup.getClientGrid + */ + $scope.getClientGrid = ManagedClientGroup.getClientGrid; + + /** + * @borrows ManagedClient.isShared + */ + $scope.isShared = ManagedClient.isShared; + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacTiledThumbnails.js b/guacamole/src/main/frontend/src/app/client/directives/guacTiledThumbnails.js new file mode 100644 index 0000000..e6417c9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacTiledThumbnails.js @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for displaying a group of Guacamole clients as a non-interactive + * thumbnail of tiled client displays. + */ +angular.module('client').directive('guacTiledThumbnails', [function guacTiledThumbnails() { + + const directive = { + restrict: 'E', + replace: true, + templateUrl: 'app/client/templates/guacTiledThumbnails.html' + }; + + directive.scope = { + + /** + * The group of clients to display as a thumbnail of tiled client + * displays. + * + * @type ManagedClientGroup + */ + clientGroup : '=' + + }; + + directive.controller = ['$scope', '$injector', '$element', + function guacTiledThumbnailsController($scope, $injector, $element) { + + // Required types + const ManagedClientGroup = $injector.get('ManagedClientGroup'); + + /** + * The overall height of the thumbnail view of the tiled grid of + * clients within the client group, in pixels. This value is + * intentionally based off a snapshot of the current browser size at + * the time the directive comes into existence to ensure the contents + * of the thumbnail are familiar in appearance and aspect ratio. + */ + $scope.height = Math.min(window.innerHeight, 128); + + /** + * The overall width of the thumbnail view of the tiled grid of + * clients within the client group, in pixels. This value is + * intentionally based off a snapshot of the current browser size at + * the time the directive comes into existence to ensure the contents + * of the thumbnail are familiar in appearance and aspect ratio. + */ + $scope.width = window.innerWidth / window.innerHeight * $scope.height; + + /** + * @borrows ManagedClientGroup.getClientGrid + */ + $scope.getClientGrid = ManagedClientGroup.getClientGrid; + + }]; + + return directive; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacViewport.js b/guacamole/src/main/frontend/src/app/client/directives/guacViewport.js new file mode 100644 index 0000000..d14a70a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacViewport.js @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides a fullscreen environment for its content. + */ +angular.module('client').directive('guacViewport', [function guacViewport() { + + return { + // Element only + restrict: 'E', + scope: {}, + transclude: true, + templateUrl: 'app/client/templates/guacViewport.html', + controller: ['$scope', '$injector', '$element', + function guacViewportController($scope, $injector, $element) { + + // Required services + var $window = $injector.get('$window'); + + /** + * The fullscreen container element. + * + * @type Element + */ + var element = $element.find('.viewport')[0]; + + /** + * The width of the browser viewport when fitVisibleArea() was last + * invoked, in pixels, or null if fitVisibleArea() has not yet been + * called. + * + * @type Number + */ + var lastViewportWidth = null; + + /** + * The height of the browser viewport when fitVisibleArea() was + * last invoked, in pixels, or null if fitVisibleArea() has not yet + * been called. + * + * @type Number + */ + var lastViewportHeight = null; + + /** + * Resizes the container element inside the guacViewport such that + * it exactly fits within the visible area, even if the browser has + * been scrolled. + */ + var fitVisibleArea = function fitVisibleArea() { + + // Calculate viewport dimensions (this is NOT necessarily the + // same as 100vw and 100vh, 100%, etc., particularly when the + // on-screen keyboard of a mobile device pops open) + var viewportWidth = $window.innerWidth; + var viewportHeight = $window.innerHeight; + + // Adjust element width to fit exactly within visible area + if (viewportWidth !== lastViewportWidth) { + element.style.width = viewportWidth + 'px'; + lastViewportWidth = viewportWidth; + } + + // Adjust element height to fit exactly within visible area + if (viewportHeight !== lastViewportHeight) { + element.style.height = viewportHeight + 'px'; + lastViewportHeight = viewportHeight; + } + + // Scroll element such that its upper-left corner is exactly + // within the viewport upper-left corner, if not already there + if (element.scrollLeft || element.scrollTop) { + $window.scrollTo( + $window.pageXOffset + element.scrollLeft, + $window.pageYOffset + element.scrollTop + ); + } + + }; + + // Fit container within visible region when window scrolls + $window.addEventListener('scroll', fitVisibleArea); + + // Poll every 10ms, in case scroll event does not fire + var pollArea = $window.setInterval(fitVisibleArea, 10); + + // Clean up on destruction + $scope.$on('$destroy', function destroyViewport() { + $window.removeEventListener('scroll', fitVisibleArea); + $window.clearInterval(pollArea); + }); + + }] + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/client/directives/guacZoomCtrl.js b/guacamole/src/main/frontend/src/app/client/directives/guacZoomCtrl.js new file mode 100644 index 0000000..3e5b468 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/directives/guacZoomCtrl.js @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which converts between human-readable zoom + * percentage and display scale. + */ +angular.module('client').directive('guacZoomCtrl', function guacZoomCtrl() { + return { + restrict: 'A', + require: 'ngModel', + priority: 101, + link: function(scope, element, attrs, ngModel) { + + // Evaluate the ngChange attribute when the model + // changes. + ngModel.$viewChangeListeners.push(function() { + scope.$eval(attrs.ngChange); + }); + + // When pushing to the menu, mutiply by 100. + ngModel.$formatters.push(function(value) { + return Math.round(value * 100); + }); + + // When parsing value from menu, divide by 100. + ngModel.$parsers.push(function(value) { + return Math.round(value) / 100; + }); + } + } +}); diff --git a/guacamole/src/main/frontend/src/app/client/services/guacAudio.js b/guacamole/src/main/frontend/src/app/client/services/guacAudio.js new file mode 100644 index 0000000..95aec4c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/services/guacAudio.js @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for checking browser audio support. + */ +angular.module('client').factory('guacAudio', [function guacAudio() { + + /** + * Object describing the UI's level of audio support. + */ + return new (function() { + + /** + * Array of all supported audio mimetypes. + * + * @type String[] + */ + this.supported = Guacamole.AudioPlayer.getSupportedTypes(); + + })(); + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/services/guacClientManager.js b/guacamole/src/main/frontend/src/app/client/services/guacClientManager.js new file mode 100644 index 0000000..990d10c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/services/guacClientManager.js @@ -0,0 +1,328 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for managing several active Guacamole clients. + */ +angular.module('client').factory('guacClientManager', ['$injector', + function guacClientManager($injector) { + + // Required types + const ManagedClient = $injector.get('ManagedClient'); + const ManagedClientGroup = $injector.get('ManagedClientGroup'); + + // Required services + const $window = $injector.get('$window'); + const sessionStorageFactory = $injector.get('sessionStorageFactory'); + + var service = {}; + + /** + * Getter/setter which retrieves or sets the map of all active managed + * clients. Each key is the ID of the connection used by that client. + * + * @type Function + */ + var storedManagedClients = sessionStorageFactory.create({}, function destroyClientStorage() { + + // Disconnect all clients when storage is destroyed + service.clear(); + + }); + + /** + * Returns a map of all active managed clients. Each key is the ID of the + * connection used by that client. + * + * @returns {Object.} + * A map of all active managed clients. + */ + service.getManagedClients = function getManagedClients() { + return storedManagedClients(); + }; + + /** + * Getter/setter which retrieves or sets the array of all active managed + * client groups. + * + * @type Function + */ + const storedManagedClientGroups = sessionStorageFactory.create([], function destroyClientGroupStorage() { + + // Disconnect all clients when storage is destroyed + service.clear(); + + }); + + /** + * Returns an array of all managed client groups. + * + * @returns {ManagedClientGroup[]>} + * An array of all active managed client groups. + */ + service.getManagedClientGroups = function getManagedClientGroups() { + return storedManagedClientGroups(); + }; + + /** + * Removes the ManagedClient with the given ID from all + * ManagedClientGroups, automatically adjusting the tile size of the + * clients that remain in each group. All client groups that are empty + * after the client is removed will also be removed. + * + * @param {string} id + * The ID of the ManagedClient to remove. + */ + const ungroupManagedClient = function ungroupManagedClient(id) { + + const managedClientGroups = storedManagedClientGroups(); + + // Remove client from all groups + managedClientGroups.forEach(group => { + const removed = _.remove(group.clients, client => (client.id === id)); + if (removed.length) { + + // Reset focus state if client is being removed from a group + // that isn't currently attached (focus may otherwise be + // retained and result in a newly added connection unexpectedly + // sharing focus) + if (!group.attached) + removed.forEach(client => { client.clientProperties.focused = false; }); + + // Recalculate group grid if number of clients is changing + ManagedClientGroup.recalculateTiles(group); + + } + }); + + // Remove any groups that are now empty + _.remove(managedClientGroups, group => !group.clients.length); + + }; + + /** + * Removes the existing ManagedClient associated with the connection having + * the given ID, if any. If no such a ManagedClient already exists, this + * function has no effect. + * + * @param {String} id + * The ID of the connection whose ManagedClient should be removed. + * + * @returns {Boolean} + * true if an existing client was removed, false otherwise. + */ + service.removeManagedClient = function removeManagedClient(id) { + + var managedClients = storedManagedClients(); + + // Remove client if it exists + if (id in managedClients) { + + // Pull client out of any containing groups + ungroupManagedClient(id); + + // Disconnect and remove + managedClients[id].client.disconnect(); + delete managedClients[id]; + + // A client was removed + return true; + + } + + // No client was removed + return false; + + }; + + /** + * Creates a new ManagedClient associated with the connection having the + * given ID. If such a ManagedClient already exists, it is disconnected and + * replaced. + * + * @param {String} id + * The ID of the connection whose ManagedClient should be retrieved. + * + * @returns {ManagedClient} + * The ManagedClient associated with the connection having the given + * ID. + */ + service.replaceManagedClient = function replaceManagedClient(id) { + + const managedClients = storedManagedClients(); + const managedClientGroups = storedManagedClientGroups(); + + // Remove client if it exists + if (id in managedClients) { + + const hadFocus = managedClients[id].clientProperties.focused; + managedClients[id].client.disconnect(); + delete managedClients[id]; + + // Remove client from all groups + managedClientGroups.forEach(group => { + + const index = _.findIndex(group.clients, client => (client.id === id)); + if (index === -1) + return; + + group.clients[index] = managedClients[id] = ManagedClient.getInstance(id); + managedClients[id].clientProperties.focused = hadFocus; + + }); + + } + + return managedClients[id]; + + }; + + /** + * Returns the ManagedClient associated with the connection having the + * given ID. If no such ManagedClient exists, a new ManagedClient is + * created. + * + * @param {String} id + * The ID of the connection whose ManagedClient should be retrieved. + * + * @returns {ManagedClient} + * The ManagedClient associated with the connection having the given + * ID. + */ + service.getManagedClient = function getManagedClient(id) { + + var managedClients = storedManagedClients(); + + // Ensure any existing client is removed from its containing group + // prior to being returned + ungroupManagedClient(id); + + // Create new managed client if it doesn't already exist + if (!(id in managedClients)) + managedClients[id] = ManagedClient.getInstance(id); + + // Return existing client + return managedClients[id]; + + }; + + /** + * Returns the ManagedClientGroup having the given ID. If no such + * ManagedClientGroup exists, a new ManagedClientGroup is created by + * extracting the relevant connections from the ID. + * + * @param {String} id + * The ID of the ManagedClientGroup to retrieve or create. + * + * @returns {ManagedClientGroup} + * The ManagedClientGroup having the given ID. + */ + service.getManagedClientGroup = function getManagedClientGroup(id) { + + const managedClientGroups = storedManagedClientGroups(); + const existingGroup = _.find(managedClientGroups, (group) => { + return id === ManagedClientGroup.getIdentifier(group); + }); + + // Prefer to return the existing group if it exactly matches + if (existingGroup) + return existingGroup; + + const clients = []; + const clientIds = ManagedClientGroup.getClientIdentifiers(id); + + // Separate active clients by whether they should be displayed within + // the current view + clientIds.forEach(function groupClients(id) { + clients.push(service.getManagedClient(id)); + }); + + const group = new ManagedClientGroup({ + clients : clients + }); + + // Focus the first client if there are no clients focused + ManagedClientGroup.verifyFocus(group); + + managedClientGroups.push(group); + return group; + + }; + + /** + * Removes the existing ManagedClientGroup having the given ID, if any, + * disconnecting and removing all ManagedClients associated with that + * group. If no such a ManagedClientGroup currently exists, this function + * has no effect. + * + * @param {String} id + * The ID of the ManagedClientGroup to remove. + * + * @returns {Boolean} + * true if a ManagedClientGroup was removed, false otherwise. + */ + service.removeManagedClientGroup = function removeManagedClientGroup(id) { + + const managedClients = storedManagedClients(); + const managedClientGroups = storedManagedClientGroups(); + + // Remove all matching groups (there SHOULD only be one) + const removed = _.remove(managedClientGroups, (group) => ManagedClientGroup.getIdentifier(group) === id); + + // Disconnect all clients associated with the removed group(s) + removed.forEach((group) => { + group.clients.forEach((client) => { + + const id = client.id; + if (managedClients[id]) { + managedClients[id].client.disconnect(); + delete managedClients[id]; + } + + }); + }); + + return !!removed.length; + + }; + + /** + * Disconnects and removes all currently-connected clients and client + * groups. + */ + service.clear = function clear() { + + var managedClients = storedManagedClients(); + + // Disconnect each managed client + for (var id in managedClients) + managedClients[id].client.disconnect(); + + // Clear managed clients and client groups + storedManagedClients({}); + storedManagedClientGroups([]); + + }; + + // Disconnect all clients when window is unloaded + $window.addEventListener('unload', service.clear); + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/services/guacFullscreen.js b/guacamole/src/main/frontend/src/app/client/services/guacFullscreen.js new file mode 100644 index 0000000..12720e9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/services/guacFullscreen.js @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for providing true fullscreen and keyboard lock support. + * Keyboard lock is currently only supported by Chromium based browsers + * (Edge >= V79, Chrome >= V68 and Opera >= V55) + */ +angular.module('client').factory('guacFullscreen', ['$injector', + function guacFullscreen($injector) { + + var service = {}; + + // check is browser in true fullscreen mode + service.isInFullscreenMode = function isInFullscreenMode() { + return document.fullscreenElement; + } + + // set fullscreen mode + service.setFullscreenMode = function setFullscreenMode(state) { + if (document.fullscreenEnabled) { + if (state && !service.isInFullscreenMode()) + document.documentElement.requestFullscreen().then(navigator.keyboard.lock()); + else if (!state && service.isInFullscreenMode()) + document.exitFullscreen().then(navigator.keyboard.unlock()); + } + } + + // toggles current fullscreen mode (off if on, on if off) + service.toggleFullscreenMode = function toggleFullscreenMode() { + if (!service.isInFullscreenMode()) + service.setFullscreenMode(true); + else + service.setFullscreenMode(false); + } + + return service; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/services/guacImage.js b/guacamole/src/main/frontend/src/app/client/services/guacImage.js new file mode 100644 index 0000000..2cf15fb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/services/guacImage.js @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for checking browser image support. + */ +angular.module('client').factory('guacImage', ['$injector', function guacImage($injector) { + + // Required services + var $q = $injector.get('$q'); + + var service = {}; + + /** + * Map of possibly-supported image mimetypes to corresponding test images + * encoded with base64. If the image is correctly decoded, it will be a + * single pixel (1x1) image. + * + * @type Object. + */ + var testImages = { + + /** + * Test JPEG image, encoded as base64. + */ + 'image/jpeg' : + '/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoH' + + 'BwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQME' + + 'BAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU' + + 'FBQUFBQUFBQUFBQUFBT/wAARCAABAAEDAREAAhEBAxEB/8QAFAABAAAAAAAAAAA' + + 'AAAAAAAAACf/EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAUAQEAAAAAAAAAAAAAAA' + + 'AAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AVMH/2Q==', + + /** + * Test PNG image, encoded as base64. + */ + 'image/png' : + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX///+nxBvI' + + 'AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==', + + /** + * Test WebP image, encoded as base64. + */ + 'image/webp' : 'UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==' + + }; + + /** + * Deferred which tracks the progress and ultimate result of all pending + * image format tests. + * + * @type Deferred + */ + var deferredSupportedMimetypes = $q.defer(); + + /** + * Array of all promises associated with pending image tests. Each image + * test promise MUST be guaranteed to resolve and MUST NOT be rejected. + * + * @type Promise[] + */ + var pendingTests = []; + + /** + * The array of supported image formats. This will be gradually populated + * by the various image tests that occur in the background, and will not be + * fully populated until all promises within pendingTests are resolved. + * + * @type String[] + */ + var supported = []; + + /** + * Return a promise which resolves with to an array of image mimetypes + * supported by the browser, once those mimetypes are known. The returned + * promise is guaranteed to resolve successfully. + * + * @returns {Promise.} + * A promise which resolves with an array of image mimetypes supported + * by the browser. + */ + service.getSupportedMimetypes = function getSupportedMimetypes() { + return deferredSupportedMimetypes.promise; + }; + + // Test each possibly-supported image + angular.forEach(testImages, function testImageSupport(data, mimetype) { + + // Add promise for current image test + var imageTest = $q.defer(); + pendingTests.push(imageTest.promise); + + // Attempt to load image + var image = new Image(); + image.src = 'data:' + mimetype + ';base64,' + data; + + // Store as supported depending on whether load was successful + image.onload = image.onerror = function imageTestComplete() { + + // Image format is supported if successfully decoded + if (image.width === 1 && image.height === 1) + supported.push(mimetype); + + // Test is complete + imageTest.resolve(); + + }; + + }); + + // When all image tests are complete, resolve promise with list of + // supported formats + $q.all(pendingTests).then(function imageTestsCompleted() { + deferredSupportedMimetypes.resolve(supported); + }); + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/services/guacTranslate.js b/guacamole/src/main/frontend/src/app/client/services/guacTranslate.js new file mode 100644 index 0000000..c7fe8e9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/services/guacTranslate.js @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A wrapper around the angular-translate $translate service that offers a + * convenient way to fall back to a default translation if the requested + * translation is not available. + */ + angular.module('client').factory('guacTranslate', ['$injector', function guacTranslate($injector) { + + // Required services + const $q = $injector.get('$q'); + const $translate = $injector.get('$translate'); + + // Required types + const TranslationResult = $injector.get('TranslationResult'); + + /** + * Returns a promise that will be resolved with a TranslationResult containg either the + * requested ID and message (if translated), or the default ID and message if translated, + * or the literal value of `defaultTranslationId` for both the ID and message if neither + * is translated. + * + * @param {String} translationId + * The requested translation ID, which may or may not be translated. + * + * @param {Sting} defaultTranslationId + * The translation ID that will be used if no translation is found for `translationId`. + * + * @returns {Promise.} + * A promise which resolves with a TranslationResult containing the results from + * the translation attempt. + */ + var translateWithFallback = function translateWithFallback(translationId, defaultTranslationId) { + const deferredTranslation = $q.defer(); + + // Attempt to translate the requested translation ID + $translate(translationId).then( + + // If the requested translation is available, use that + translation => deferredTranslation.resolve(new TranslationResult({ + id: translationId, message: translation + })), + + // Otherwise, try the default translation ID + () => $translate(defaultTranslationId).then( + + // Default translation worked, so use that + defaultTranslation => + deferredTranslation.resolve(new TranslationResult({ + id: defaultTranslationId, message: defaultTranslation + })), + + // Neither translation is available; as a fallback, return default ID for both + () => deferredTranslation.resolve(new TranslationResult({ + id: defaultTranslationId, message: defaultTranslationId + })), + ) + ); + + return deferredTranslation.promise; + }; + + return translateWithFallback; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/services/guacVideo.js b/guacamole/src/main/frontend/src/app/client/services/guacVideo.js new file mode 100644 index 0000000..08a3c36 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/services/guacVideo.js @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for checking browser video support. + */ +angular.module('client').factory('guacVideo', [function guacVideo() { + + /** + * Object describing the UI's level of video support. + */ + return new (function() { + + /** + * Array of all supported video mimetypes. + */ + this.supported = Guacamole.VideoPlayer.getSupportedTypes(); + + })(); + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/styles/client.css b/guacamole/src/main/frontend/src/app/client/styles/client.css new file mode 100644 index 0000000..4d45298 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/client.css @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +body.client { + background: black; + padding: 0; + margin: 0; + overflow: hidden; +} + +#preload { + visibility: hidden; + position: absolute; + left: 0; + right: 0; + width: 0; + height: 0; + overflow: hidden; +} + +.client-view { + + position: absolute; + top: 0; + left: 0; + + width: 100%; + height: 100%; + + font-size: 0px; + +} + +.client-view-content { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: column; + -ms-flex-pack: end; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: vertical; + -moz-box-pack: end; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: vertical; + -webkit-box-pack: end; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: column; + -webkit-flex-pack: end; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: column; + flex-pack: end; + + width: 100%; + height: 100%; + + font-size: 12pt; + +} + +.client-view .client-body { + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; + position: relative; +} + +.client-view .client-bottom { + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; +} + +.client-view .client-body guac-tiled-clients { + + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + + width: auto; + height: auto; + +} + +.client .menu .header h2 { + text-transform: none; +} + +.client .user-menu .menu-contents li a.disconnect { + background-repeat: no-repeat; + background-size: 1em; + background-position: 0.75em center; + padding-left: 2.5em; + background-image: url('images/x.svg'); +} + +.client .drop-pending .display { + background: #3161a9; +} + +.client .drop-pending .display > *{ + opacity: 0.5; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/styles/connection-select-menu.css b/guacamole/src/main/frontend/src/app/client/styles/connection-select-menu.css new file mode 100644 index 0000000..69aefad --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/connection-select-menu.css @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#guac-menu .header h2.connection-select-menu { + overflow: visible; +} + +.connection-select-menu { + padding: 0; + min-width: 0; +} + +.connection-select-menu .menu-dropdown { + border: none; +} + +.connection-select-menu .menu-dropdown .menu-contents { + font-weight: normal; + font-size: 0.8em; + right: auto; + left: 0; + max-width: 100vw; + width: 400px; +} + +.connection-select-menu .menu-dropdown .menu-contents .filter input { + border-bottom: 1px solid rgba(0,0,0,0.125); + border-left: none; +} + +.connection-select-menu .menu-dropdown .menu-contents .filter { + margin-bottom: 0.5em; + padding: 0; +} + +.connection-select-menu .menu-dropdown .menu-contents .group-list .caption { + display: inline-block; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + +.connection-select-menu .menu-dropdown .menu-contents .caption .connection, +.connection-select-menu .menu-dropdown .menu-contents .caption .connection-group { + display: inline-block; +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/connection-warning.css b/guacamole/src/main/frontend/src/app/client/styles/connection-warning.css new file mode 100644 index 0000000..daeb0f4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/connection-warning.css @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#connection-warning { + + position: absolute; + right: 0.25em; + bottom: 0.25em; + z-index: 20; + + width: 3in; + max-width: 100%; + min-height: 1em; + + border-left: 2em solid #FA0; + box-shadow: 1px 1px 2px rgba(0,0,0,0.25); + background: #FFE; + padding: 0.5em 0.75em; + font-size: .8em; + +} + +#connection-warning::before { + + content: ' '; + display: block; + position: absolute; + left: -2em; + top: 0; + + width: 1.25em; + height: 100%; + margin: 0 0.375em; + + background: url('images/warning.svg'); + background-size: contain; + background-position: center; + background-repeat: no-repeat; + +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/display.css b/guacamole/src/main/frontend/src/app/client/styles/display.css new file mode 100644 index 0000000..0233f42 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/display.css @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.software-cursor { + cursor: url('images/mouse/blank.gif'),url('images/mouse/blank.cur'),default; + overflow: hidden; + cursor: none; +} + +.guac-error .software-cursor { + cursor: default; +} + +div.main { + overflow: auto; + width: 100%; + height: 100%; + position: relative; + font-size: 0px; +} + +div.displayOuter { + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + display: table; +} + +div.displayMiddle { + width: 100%; + height: 100%; + display: table-cell; + vertical-align: middle; + text-align: center; +} + +div.display { + display: inline-block; +} + +div.display * { + position: relative; +} + +div.display > * { + margin-left: auto; + margin-right: auto; +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/file-browser.css b/guacamole/src/main/frontend/src/app/client/styles/file-browser.css new file mode 100644 index 0000000..bafaa03 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/file-browser.css @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* Hide directory contents by default */ + +.file-browser .directory > .children { + padding-left: 1em; + display: none; +} + +.file-browser .list-item .caption { + white-space: nowrap; + border: 1px solid transparent; +} + +.file-browser .list-item.focused .caption { + border: 1px dotted rgba(0, 0, 0, 0.5); + background: rgba(204, 221, 170, 0.5); +} + +/* Directory / file icons */ + +.file-browser .normal-file > .caption .icon { + background-image: url('images/file.svg'); +} + +.file-browser .directory > .caption .icon { + background-image: url('images/folder-closed.svg'); +} + +.file-browser .directory.previous > .caption .icon { + background-image: url('images/folder-up.svg'); +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/file-transfer-dialog.css b/guacamole/src/main/frontend/src/app/client/styles/file-transfer-dialog.css new file mode 100644 index 0000000..66d39a0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/file-transfer-dialog.css @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#file-transfer-dialog { + + position: absolute; + right: 0; + bottom: 0; + z-index: 20; + + font-size: 0.8em; + + width: 4in; + max-width: 100%; + max-height: 3in; + +} + +#file-transfer-dialog .transfer-manager { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: column; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: vertical; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: vertical; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: column; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: column; + + max-width: inherit; + max-height: inherit; + + border: 1px solid rgba(0, 0, 0, 0.5); + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25); + +} + +#file-transfer-dialog .transfer-manager .header { + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; +} + +#file-transfer-dialog .transfer-manager .transfer-manager-body { + + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; + + overflow: auto; + +} + +/* + * Shrink maximum height if viewport is too small for default 3in dialog. + */ +@media all and (max-height: 3in) { + + #file-transfer-dialog { + max-height: 1.5in; + } + +} + +/* + * If viewport is too small for even the 1.5in dialog, fit all available space. + */ +@media all and (max-height: 1.5in) { + + #file-transfer-dialog { + height: 100%; + } + + #file-transfer-dialog .transfer-manager { + position: absolute; + left: 0.5em; + top: 0.5em; + right: 0.5em; + bottom: 0.5em; + } + +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/filesystem-menu.css b/guacamole/src/main/frontend/src/app/client/styles/filesystem-menu.css new file mode 100644 index 0000000..aed541a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/filesystem-menu.css @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#filesystem-menu .header h2 { + font-size: 1em; + font-weight: normal; + padding-top: 0; + padding-bottom: 0; +} + +#filesystem-menu .header { + -ms-flex-align: center; + -moz-box-align: center; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} + +#filesystem-menu .menu-body { + padding: 0.25em; +} + +#filesystem-menu .header.breadcrumbs { + display: block; + background: rgba(0,0,0,0.0125); + border-bottom: 1px solid rgba(0,0,0,0.05); + box-shadow: none; + margin-top: 0; + border-top: none; +} + +#filesystem-menu .header.breadcrumbs .breadcrumb { + display: inline-block; + padding: 0.5em; + font-size: 0.8em; + font-weight: bold; +} + +#filesystem-menu .header.breadcrumbs .breadcrumb:hover { + background-color: #CDA; + cursor: pointer; +} + +#filesystem-menu .header.breadcrumbs .breadcrumb.root { + background-size: 1.5em 1.5em; + -moz-background-size: 1.5em 1.5em; + -webkit-background-size: 1.5em 1.5em; + -khtml-background-size: 1.5em 1.5em; + background-repeat: no-repeat; + background-position: center center; + background-image: url('images/drive.svg'); + width: 2em; + height: 2em; + padding: 0; + vertical-align: middle; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/styles/guac-menu.css b/guacamole/src/main/frontend/src/app/client/styles/guac-menu.css new file mode 100644 index 0000000..66df2cb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/guac-menu.css @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#guac-menu .content { + + padding: 0; + margin: 0; + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: column; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: vertical; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: vertical; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: column; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: column; + +} + +#guac-menu .content > * { + + margin: 0; + + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; + +} + +#guac-menu .content > * + * { + margin-top: 1em; +} + +#guac-menu .header h2 { + white-space: nowrap; + overflow: hidden; + width: 100%; + text-overflow: ellipsis; +} + +#guac-menu #mouse-settings .choice { + text-align: center; +} + +#guac-menu #mouse-settings .choice .figure { + display: inline-block; + vertical-align: middle; + width: 75%; + max-width: 320px; +} + +#guac-menu #keyboard-settings .caption { + font-size: 0.9em; + margin-left: 2em; + margin-right: 2em; +} + +#guac-menu #mouse-settings .figure .caption { + text-align: center; + font-size: 0.9em; +} + +#guac-menu #mouse-settings .figure img { + display: block; + width: 100%; + max-width: 320px; + margin: 1em auto; +} + +#guac-menu #keyboard-settings .figure { + float: right; + max-width: 30%; + margin: 1em; +} + +#guac-menu #keyboard-settings .figure img { + width: 100%; +} + +#guac-menu #zoom-settings { + text-align: center; +} + +#guac-menu #devices .device { + + padding: 1em; + border: 1px solid rgba(0, 0, 0, 0.125); + background: rgba(0, 0, 0, 0.04); + + padding-left: 3.5em; + background-size: 1.5em 1.5em; + -moz-background-size: 1.5em 1.5em; + -webkit-background-size: 1.5em 1.5em; + -khtml-background-size: 1.5em 1.5em; + + background-repeat: no-repeat; + background-position: 1em center; + +} + +#guac-menu #devices .device:hover { + cursor: pointer; + border-color: black; +} + +#guac-menu #devices .device.filesystem { + background-image: url('images/drive.svg'); +} + +#guac-menu #share-links { + + padding: 1em; + border: 1px solid rgba(0, 0, 0, 0.125); + background: rgba(0, 0, 0, 0.04); + + font-size: 0.8em; + +} + +#guac-menu #share-links h3 { + padding-bottom: 0; +} + +#guac-menu #share-links th { + white-space: nowrap; +} + +#guac-menu #share-links a[href] { + + display: block; + padding: 0 1em; + + font-family: monospace; + font-weight: bold; + +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/keyboard.css b/guacamole/src/main/frontend/src/app/client/styles/keyboard.css new file mode 100644 index 0000000..5bf3888 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/keyboard.css @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.keyboard-container { + + text-align: center; + + width: 100%; + margin: 0; + padding: 0; + + border-top: 1px solid black; + background: #222; + opacity: 0.85; + + z-index: 1; + +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/menu.css b/guacamole/src/main/frontend/src/app/client/styles/menu.css new file mode 100644 index 0000000..b5742ab --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/menu.css @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.menu { + overflow: hidden; + position: absolute; + top: 0; + height: 100%; + max-width: 100%; + width: 480px; + background: #EEE; + box-shadow: inset -1px 0 2px white, 1px 0 2px black; + z-index: 100; + -webkit-transition: left 0.125s, opacity 0.125s; + -moz-transition: left 0.125s, opacity 0.125s; + -ms-transition: left 0.125s, opacity 0.125s; + -o-transition: left 0.125s, opacity 0.125s; + transition: left 0.125s, opacity 0.125s; +} + +.menu-content { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: column; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: vertical; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: vertical; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: column; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: column; + + width: 100%; + height: 100%; + +} + +.menu-content .header { + + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; + + margin-bottom: 0; + +} + +.menu-body { + + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; + + padding: 1em; + overflow: auto; + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: column; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: vertical; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: vertical; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: column; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: column; + +} + +.menu-body > * { + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; +} + +.menu-section h3 { + margin: 0; + padding: 0; + padding-bottom: 1em; +} + +.menu-section ~ .menu-section h3 { + padding-top: 1em; +} + +.menu, +.menu.closed { + left: -480px; + opacity: 0; +} + +.menu.open { + left: 0px; + opacity: 1; +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/notification.css b/guacamole/src/main/frontend/src/app/client/styles/notification.css new file mode 100644 index 0000000..86b2db3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/notification.css @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.client-status-modal { + + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + + display: none; + background: rgba(0, 0, 0, 0.5); + +} + +.client-status-modal.shown { + display: block; +} + +.client-status-modal guac-modal { + position: absolute; +} + +.client-status-modal .notification { + background: rgba(40, 40, 40, 0.75); + color: white; + width: 100%; + max-width: 100%; + padding: 1em; + text-align: center; + border: none; +} + +.client-status-modal .notification.error { + background: rgba(112, 9, 8, 0.75) +} + +.client-status-modal .notification .title-bar { + display: none +} + +.client-status-modal .notification .button { + background: transparent; + border: 2px solid white; + box-shadow: none; + text-shadow: none; + font-weight: normal; +} + +.client-status-modal .notification .button:hover { + text-decoration: underline; + background: rgba(255, 255, 255, 0.25); +} + +.client-status-modal .notification .button:active { + background: rgba(255, 255, 255, 0.5); +} + +.client-status-modal .notification .parameters { + width: 100%; + max-width: 5in; + margin: 0 auto; +} + +.client-status-modal .notification .parameters h3, +.client-status-modal .notification .parameters .password-field .toggle-password { + display: none; +} + +.client-status-modal .notification .parameters input[type=email], +.client-status-modal .notification .parameters input[type=number], +.client-status-modal .notification .parameters input[type=password], +.client-status-modal .notification .parameters input[type=text], +.client-status-modal .notification .parameters textarea { + background: transparent; + border: 2px solid white; + color: white; +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/share-menu.css b/guacamole/src/main/frontend/src/app/client/styles/share-menu.css new file mode 100644 index 0000000..8e1ae7c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/share-menu.css @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.share-menu { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: row; + +} + +.share-menu .menu-dropdown .menu-title { + + padding-left: 2em; + + background-repeat: no-repeat; + background-size: 1em; + background-position: 0.5em center; + background-image: url('images/share.svg'); + +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/thumbnail-display.css b/guacamole/src/main/frontend/src/app/client/styles/thumbnail-display.css new file mode 100644 index 0000000..468c51a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/thumbnail-display.css @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +div.thumbnail-main { + overflow: hidden; + width: 100%; + height: 100%; + position: relative; + font-size: 0px; +} + +.thumbnail-main .display { + pointer-events: none; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/styles/tiled-client-grid.css b/guacamole/src/main/frontend/src/app/client/styles/tiled-client-grid.css new file mode 100644 index 0000000..7ec0cdf --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/tiled-client-grid.css @@ -0,0 +1,277 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Overall tiled grid layout. + */ + +.tiled-client-grid { + width: 100%; + height: 100%; +} + +.tiled-client-grid, +.tiled-client-grid .tiled-client-row, +.tiled-client-grid .tiled-client-cell, +.tiled-client-grid .client-tile { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.tiled-client-grid { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} + +.tiled-client-grid .tiled-client-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; +} + +/* + * Rendering of individual clients within tiles. + */ + +.tiled-client-grid .client-tile { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + line-height: 1.5; +} + +.tiled-client-grid .client-tile .client-tile-header { + + display: -webkit-box; + + display: -webkit-flex; + + display: -ms-flexbox; + + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + + margin: 0; + background: #444; + padding: 0 0.25em; + font-size: 0.8em; + color: white; + z-index: 30; + min-height: 1.5em; + +} + +.tiled-client-grid .client-tile.focused .client-tile-header { + background-color: #3161a9; +} + +.tiled-client-grid .client-tile .client-tile-header > * { + -webkit-box-flex: 0; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; +} + +.tiled-client-grid .client-tile .client-tile-header .client-tile-name { + + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + + padding: 0 0.5em; + margin-bottom: -0.125em; + +} + +.tiled-client-grid .client-tile .main { + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.tiled-client-grid .client-tile-disconnect, +.tiled-client-grid .client-tile-shared-indicator { + max-height: 1em; + height: 100%; +} + +.tiled-client-grid .client-tile-shared-indicator { + display: none; +} + +.tiled-client-grid .shared .client-tile-shared-indicator { + display: inline; +} + +.tiled-client-grid .client-user-count { + + visibility: hidden; + + display: block; + position: absolute; + right: 0; + top: 0; + z-index: 1; + + border-radius: 0.25em; + padding: 0.125em 0.75em; + margin: 0.5em; + + background: #055; + color: white; + font-weight: bold; + font-size: 0.8em; + +} + +.tiled-client-grid .client-user-count::before { + + content: ' '; + display: inline-block; + + margin-bottom: -0.2em; + padding-right: 0.25em; + width: 1em; + height: 1em; + + background: center / contain no-repeat url('images/user-icons/guac-user-white.svg'); + background-size: contain; + background-position: center; + background-repeat: no-repeat; + +} + +.tiled-client-grid .client-user-count .client-user-count-users, +.tiled-client-grid .client-user-count .client-user-count-messages { + + position: absolute; + right: 0; + + margin: 0; + padding: 0; + margin-top: 0.5em; + list-style: none; + +} + +.tiled-client-grid .client-user-count .client-user-count-users, +.tiled-client-grid .client-user-count .client-user-count-message { + border-radius: 0.25em; + background: black; + color: white; + padding: 0.5em; +} + +.tiled-client-grid .client-user-count .client-user-count-message { + white-space: nowrap; + animation: 1s linear 3s fadeout; +} + +.tiled-client-grid .client-tile-header .client-user-count { + display: inline-block; + position: relative; + white-space: nowrap; + background: black; + padding-left: 0.5em; + padding-right: 0.75em; +} + +.tiled-client-grid .client-tile-header .client-user-count::before { + padding-right: 0.75em; +} + +.tiled-client-grid .joined .client-user-count { + visibility: visible; +} + +.tiled-client-grid .client-user-count .client-user-count-users { + display: none; +} + +.tiled-client-grid .client-user-count:hover .client-user-count-users { + display: block; +} + +.tiled-client-grid .client-user-count .client-user-count-user::after { + content: ', '; + margin-right: 0.25em; +} + +.tiled-client-grid .client-user-count .client-user-count-user:last-child::after { + content: none; +} + +.tiled-client-grid .client-user-count .client-user-count-user { + display: inline-block; +} + +.tiled-client-grid .client-user-count .client-user-count-user.anonymous { + font-style: italic; + opacity: 0.5; +} + +.tiled-client-grid .client-user-count .client-user-count-users { + width: 256px; + max-width: 75vw; + white-space: normal; + border: 1px solid #333; +} + +.tiled-client-grid .client-user-count .client-user-count-users::before { + + content: ' '; + display: block; + + position: absolute; + right: 0.5em; + top: -0.5em; + + width: 1em; + height: 1em; + + background: black; + border: 1px solid #333; + border-right: none; + border-bottom: none; + transform: rotate(45deg); + +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/transfer-manager.css b/guacamole/src/main/frontend/src/app/client/styles/transfer-manager.css new file mode 100644 index 0000000..9b47919 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/transfer-manager.css @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.transfer-manager { + background: white; +} + +.transfer-manager .header h2 { + font-size: 1em; + padding-top: 0; + padding-bottom: 0; +} + +.transfer-manager .header { + margin: 0; + -ms-flex-align: center; + -moz-box-align: center; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} + +.transfer-manager h3 { + margin: 0.25em; + font-size: 1em; + margin-bottom: 0; + opacity: 0.5; + text-align: center; +} + +.transfer-manager .transfers { + display: table; + padding: 0.25em; + width: 100%; +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/transfer.css b/guacamole/src/main/frontend/src/app/client/styles/transfer.css new file mode 100644 index 0000000..2c9c624 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/transfer.css @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.transfer { + display: table-row; +} + +.transfer .transfer-status { + display: table-cell; + padding: 0.25em; + position: relative; +} + +.transfer .text { + display: table-cell; + text-align: right; + padding: 0.25em +} + +.transfer .filename { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + position: relative; + font-family: monospace; + font-weight: bold; + padding: 0.125em; +} + +@keyframes transfer-progress { + from {background-position: 0px 0px;} + to {background-position: 64px 0px;} +} + +@-webkit-keyframes transfer-progress { + from {background-position: 0px 0px;} + to {background-position: 64px 0px;} +} + +.transfer .progress { + + width: 100%; + padding: 0.25em; + + position: absolute; + top: 0; + left: 0; + bottom: 0; + opacity: 0.25; + +} + +.transfer.in-progress .progress { + + background-color: #EEE; + background-image: url('images/progress.svg'); + + background-size: 16px 16px; + -moz-background-size: 16px 16px; + -webkit-background-size: 16px 16px; + -khtml-background-size: 16px 16px; + + animation-name: transfer-progress; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: infinite; + + -webkit-animation-name: transfer-progress; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + +} + +.transfer .progress .bar { + display: none; + background: #A3D655; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 0; +} + +.transfer.in-progress .progress .bar { + display: initial; +} + +.transfer.savable { + cursor: pointer; +} + +.transfer.savable .filename { + color: blue; + text-decoration: underline; +} + +.transfer.error { + background: #FDD; +} + +.transfer.error .text, +.transfer.error .progress .bar { + display: none; +} + +.transfer .error-text { + display: none; +} + +.transfer.error .error-text { + display: block; + margin: 0; + margin-top: 0.5em; + width: 100%; +} diff --git a/guacamole/src/main/frontend/src/app/client/styles/viewport.css b/guacamole/src/main/frontend/src/app/client/styles/viewport.css new file mode 100644 index 0000000..f1bf157 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/viewport.css @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.viewport { + position: absolute; + bottom: 0; + right: 0; + width: 100%; + height: 100%; + overflow: hidden; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/styles/zoom.css b/guacamole/src/main/frontend/src/app/client/styles/zoom.css new file mode 100644 index 0000000..03aa682 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/styles/zoom.css @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.client-zoom .client-zoom-out, +.client-zoom .client-zoom-in, +.client-zoom .client-zoom-state { + display: inline-block; + vertical-align: middle; +} + +.client-zoom .client-zoom-out, +.client-zoom .client-zoom-in { + max-width: 3em; + border: 1px solid rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.1); + border-radius: 2em; + margin: 0.5em; + cursor: pointer; +} + +.client-zoom .client-zoom-out img, +.client-zoom .client-zoom-in img { + width: 100%; + opacity: 0.5; +} + +.client-zoom .client-zoom-out:hover, +.client-zoom .client-zoom-in:hover { + border: 1px solid rgba(0, 0, 0, 1); + background: #CDA; +} + +.client-zoom .client-zoom-out:hover img, +.client-zoom .client-zoom-in:hover img { + opacity: 1; +} + +.client-zoom .client-zoom-state { + font-size: 1.5em; +} + +.client-zoom .client-zoom-autofit { + text-align: left; + margin-top: 1em; +} + +.client-zoom .client-zoom-state input { + width: 2em; + font-size: 1em; + padding: 0; + background: transparent; + border-color: rgba(0, 0, 0, 0.125); +} + +.client-zoom .client-zoom-state input::-webkit-inner-spin-button, +.client-zoom .client-zoom-state input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} diff --git a/guacamole/src/main/frontend/src/app/client/templates/client.html b/guacamole/src/main/frontend/src/app/client/templates/client.html new file mode 100644 index 0000000..66dca3a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/client.html @@ -0,0 +1,228 @@ + + + + +
    +
    + + +
    + + + + + +
    + + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    +
    + + +
    + +
    + + +
    + {{'CLIENT.TEXT_CLIENT_STATUS_UNSTABLE' | translate}} +
    + + + + + + + +
    diff --git a/guacamole/src/main/frontend/src/app/client/templates/connection.html b/guacamole/src/main/frontend/src/app/client/templates/connection.html new file mode 100644 index 0000000..ae5ef91 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/connection.html @@ -0,0 +1,9 @@ + diff --git a/guacamole/src/main/frontend/src/app/client/templates/connectionGroup.html b/guacamole/src/main/frontend/src/app/client/templates/connectionGroup.html new file mode 100644 index 0000000..2e7d794 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/connectionGroup.html @@ -0,0 +1,10 @@ + diff --git a/guacamole/src/main/frontend/src/app/client/templates/file.html b/guacamole/src/main/frontend/src/app/client/templates/file.html new file mode 100644 index 0000000..8430470 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/file.html @@ -0,0 +1,9 @@ +
    + + +
    +
    + {{::name}} +
    + +
    diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacClient.html b/guacamole/src/main/frontend/src/app/client/templates/guacClient.html new file mode 100644 index 0000000..46a78d6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacClient.html @@ -0,0 +1,17 @@ +
    + + +
    + +
    +
    +
    +
    + +
    + +
    diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacClientNotification.html b/guacamole/src/main/frontend/src/app/client/templates/guacClientNotification.html new file mode 100644 index 0000000..9948a2b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacClientNotification.html @@ -0,0 +1,5 @@ +
    + + + +
    diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacClientPanel.html b/guacamole/src/main/frontend/src/app/client/templates/guacClientPanel.html new file mode 100644 index 0000000..0705969 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacClientPanel.html @@ -0,0 +1,30 @@ +
    + + +
    + + + + +
    \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacClientUserCount.html b/guacamole/src/main/frontend/src/app/client/templates/guacClientUserCount.html new file mode 100644 index 0000000..fa7eff9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacClientUserCount.html @@ -0,0 +1,11 @@ +
    + {{ client.userCount }} +
      +
        +
      • +
      +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacClientZoom.html b/guacamole/src/main/frontend/src/app/client/templates/guacClientZoom.html new file mode 100644 index 0000000..d2e7410 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacClientZoom.html @@ -0,0 +1,18 @@ +
      +
      +
      -
      +
      + % +
      +
      +
      +
      +
      + +
      +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacFileBrowser.html b/guacamole/src/main/frontend/src/app/client/templates/guacFileBrowser.html new file mode 100644 index 0000000..70ea53d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacFileBrowser.html @@ -0,0 +1,6 @@ +
      + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacFileTransfer.html b/guacamole/src/main/frontend/src/app/client/templates/guacFileTransfer.html new file mode 100644 index 0000000..32ead84 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacFileTransfer.html @@ -0,0 +1,22 @@ +
      + + +
      + + +
      +
      + {{transfer.filename}} +
      + + +

      {{translatedErrorMessage}}

      + +
      + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacFileTransferManager.html b/guacamole/src/main/frontend/src/app/client/templates/guacFileTransferManager.html new file mode 100644 index 0000000..6b546a2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacFileTransferManager.html @@ -0,0 +1,22 @@ +
      + + +
      +

      {{'CLIENT.SECTION_HEADER_FILE_TRANSFERS' | translate}}

      + +
      + + +
      +
      +

      {{ client.name }}

      +
      + + +
      +
      +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacThumbnail.html b/guacamole/src/main/frontend/src/app/client/templates/guacThumbnail.html new file mode 100644 index 0000000..931016e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacThumbnail.html @@ -0,0 +1,11 @@ +
      + + +
      +
      +
      +
      +
      +
      + +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacTiledClients.html b/guacamole/src/main/frontend/src/app/client/templates/guacTiledClients.html new file mode 100644 index 0000000..ad24ca2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacTiledClients.html @@ -0,0 +1,33 @@ +
      +
      +
      + +
      +

      + + {{ client.title }} + + +

      + + + + + + + +
      + +
      +
      +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacTiledThumbnails.html b/guacamole/src/main/frontend/src/app/client/templates/guacTiledThumbnails.html new file mode 100644 index 0000000..010899c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacTiledThumbnails.html @@ -0,0 +1,14 @@ +
      +
      +
      + +
      + +
      + +
      +
      +
      diff --git a/guacamole/src/main/frontend/src/app/client/templates/guacViewport.html b/guacamole/src/main/frontend/src/app/client/templates/guacViewport.html new file mode 100644 index 0000000..28081ec --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/templates/guacViewport.html @@ -0,0 +1,2 @@ +
      +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ClientProperties.js b/guacamole/src/main/frontend/src/app/client/types/ClientProperties.js new file mode 100644 index 0000000..0087c8e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ClientProperties.js @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for generating new guacClient properties objects. + */ +angular.module('client').factory('ClientProperties', ['$injector', function defineClientProperties($injector) { + + /** + * Object used for interacting with a guacClient directive. + * + * @constructor + * @param {ClientProperties|Object} [template={}] + * The object whose properties should be copied within the new + * ClientProperties. + */ + var ClientProperties = function ClientProperties(template) { + + // Use empty object by default + template = template || {}; + + /** + * Whether the display should be scaled automatically to fit within the + * available space. + * + * @type Boolean + */ + this.autoFit = template.autoFit || true; + + /** + * The current scale. If autoFit is true, the effect of setting this + * value is undefined. + * + * @type Number + */ + this.scale = template.scale || 1; + + /** + * The minimum scale value. + * + * @type Number + */ + this.minScale = template.minScale || 1; + + /** + * The maximum scale value. + * + * @type Number + */ + this.maxScale = template.maxScale || 3; + + /** + * Whether this client should receive keyboard events. + * + * @type Boolean + */ + this.focused = template.focused || false; + + /** + * The relative Y coordinate of the scroll offset of the display within + * the client element. + * + * @type Number + */ + this.scrollTop = template.scrollTop || 0; + + /** + * The relative X coordinate of the scroll offset of the display within + * the client element. + * + * @type Number + */ + this.scrollLeft = template.scrollLeft || 0; + + }; + + return ClientProperties; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedArgument.js b/guacamole/src/main/frontend/src/app/client/types/ManagedArgument.js new file mode 100644 index 0000000..5e676bf --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedArgument.js @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedArgument class used by ManagedClient. + */ +angular.module('client').factory('ManagedArgument', ['$q', function defineManagedArgument($q) { + + /** + * Object which represents an argument (connection parameter) which may be + * changed by the user while the connection is open. + * + * @constructor + * @param {ManagedArgument|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedArgument. + */ + var ManagedArgument = function ManagedArgument(template) { + + // Use empty object by default + template = template || {}; + + /** + * The name of the connection parameter. + * + * @type {String} + */ + this.name = template.name; + + /** + * The current value of the connection parameter. + * + * @type {String} + */ + this.value = template.value; + + /** + * A valid, open output stream which may be used to apply a new value + * to the connection parameter. + * + * @type {Guacamole.OutputStream} + */ + this.stream = template.stream; + + /** + * True if this argument has been modified in the webapp, but yet to + * be confirmed by guacd, or false in any other case. A pending + * argument cannot be modified again, and must be recreated before + * editing is enabled again. + * + * @type {boolean} + */ + this.pending = false; + + }; + + /** + * Requests editable access to a given connection parameter, returning a + * promise which is resolved with a ManagedArgument instance that provides + * such access if the parameter is indeed editable. + * + * @param {ManagedClient} managedClient + * The ManagedClient instance associated with the connection for which + * an editable version of the connection parameter is being retrieved. + * + * @param {String} name + * The name of the connection parameter. + * + * @param {String} value + * The current value of the connection parameter, as received from a + * prior, inbound "argv" stream. + * + * @returns {Promise.} + * A promise which is resolved with the new ManagedArgument instance + * once the requested parameter has been verified as editable. + */ + ManagedArgument.getInstance = function getInstance(managedClient, name, value) { + + var deferred = $q.defer(); + + // Create internal, fully-populated instance of ManagedArgument, to be + // returned only once mutability of the associated connection parameter + // has been verified + var managedArgument = new ManagedArgument({ + name : name, + value : value, + stream : managedClient.client.createArgumentValueStream('text/plain', name) + }); + + // The connection parameter is editable only if a successful "ack" is + // received + managedArgument.stream.onack = function ackReceived(status) { + if (status.isError()) + deferred.reject(status); + else + deferred.resolve(managedArgument); + }; + + return deferred.promise; + + }; + + /** + * Sets the given editable argument (connection parameter) to the given + * value, updating the behavior of the associated connection in real-time. + * If successful, the ManagedArgument provided cannot be used for future + * calls to setValue() and will be read-only until replaced with a new + * instance. This function only has an effect if the new parameter value + * is different from the current value. + * + * @param {ManagedArgument} managedArgument + * The ManagedArgument instance associated with the connection + * parameter being modified. + * + * @param {String} value + * The new value to assign to the connection parameter. + */ + ManagedArgument.setValue = function setValue(managedArgument, value) { + + // Stream new value only if value has changed and a change is not + // already pending + if (!managedArgument.pending && value !== managedArgument.value) { + + var writer = new Guacamole.StringWriter(managedArgument.stream); + writer.sendText(value); + writer.sendEnd(); + + // ManagedArgument instance is no longer usable + managedArgument.pending = true; + + } + + }; + + return ManagedArgument; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js b/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js new file mode 100644 index 0000000..b7e83a3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js @@ -0,0 +1,1147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* global Guacamole, _ */ + +/** + * Provides the ManagedClient class used by the guacClientManager service. + */ +angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', + function defineManagedClient($rootScope, $injector) { + + // Required types + const ClientProperties = $injector.get('ClientProperties'); + const ClientIdentifier = $injector.get('ClientIdentifier'); + const ClipboardData = $injector.get('ClipboardData'); + const ManagedArgument = $injector.get('ManagedArgument'); + const ManagedClientState = $injector.get('ManagedClientState'); + const ManagedClientThumbnail = $injector.get('ManagedClientThumbnail'); + const ManagedDisplay = $injector.get('ManagedDisplay'); + const ManagedFilesystem = $injector.get('ManagedFilesystem'); + const ManagedFileUpload = $injector.get('ManagedFileUpload'); + const ManagedShareLink = $injector.get('ManagedShareLink'); + + // Required services + const $document = $injector.get('$document'); + const $q = $injector.get('$q'); + const $window = $injector.get('$window'); + const activeConnectionService = $injector.get('activeConnectionService'); + const authenticationService = $injector.get('authenticationService'); + const clipboardService = $injector.get('clipboardService'); + const connectionGroupService = $injector.get('connectionGroupService'); + const connectionService = $injector.get('connectionService'); + const preferenceService = $injector.get('preferenceService'); + const requestService = $injector.get('requestService'); + const tunnelService = $injector.get('tunnelService'); + const guacAudio = $injector.get('guacAudio'); + const guacHistory = $injector.get('guacHistory'); + const guacImage = $injector.get('guacImage'); + const guacVideo = $injector.get('guacVideo'); + + /** + * The minimum amount of time to wait between updates to the client + * thumbnail, in milliseconds. + * + * @type Number + */ + var THUMBNAIL_UPDATE_FREQUENCY = 5000; + + /** + * A deferred pipe stream, that has yet to be consumed, as well as all + * axuilary information needed to pull data from the stream. + * + * @constructor + * @param {DeferredPipeStream|Object} [template={}] + * The object whose properties should be copied within the new + * DeferredPipeStream. + */ + var DeferredPipeStream = function DeferredPipeStream(template) { + + // Use empty object by default + template = template || {}; + + /** + * The stream that will receive data from the server. + * + * @type Guacamole.InputStream + */ + this.stream = template.stream; + + /** + * The mimetype of the data which will be received. + * + * @type String + */ + this.mimetype = template.mimetype; + + /** + * The name of the pipe. + * + * @type String + */ + this.name = template.name; + + }; + + /** + * Object which serves as a surrogate interface, encapsulating a Guacamole + * client while it is active, allowing it to be maintained in the + * background. One or more ManagedClients are grouped within + * ManagedClientGroups before being attached to the client view. + * + * @constructor + * @param {ManagedClient|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedClient. + */ + var ManagedClient = function ManagedClient(template) { + + // Use empty object by default + template = template || {}; + + /** + * The ID of the connection associated with this client. + * + * @type String + */ + this.id = template.id; + + /** + * The actual underlying Guacamole client. + * + * @type Guacamole.Client + */ + this.client = template.client; + + /** + * The tunnel being used by the underlying Guacamole client. + * + * @type Guacamole.Tunnel + */ + this.tunnel = template.tunnel; + + /** + * The display associated with the underlying Guacamole client. + * + * @type ManagedDisplay + */ + this.managedDisplay = template.managedDisplay; + + /** + * The name returned associated with the connection or connection + * group in use. + * + * @type String + */ + this.name = template.name; + + /** + * The title which should be displayed as the page title for this + * client. + * + * @type String + */ + this.title = template.title; + + /** + * The name which uniquely identifies the protocol of the connection in + * use. If the protocol cannot be determined, such as when a connection + * group is in use, this will be null. + * + * @type {String} + */ + this.protocol = template.protocol || null; + + /** + * An array of forms describing all known parameters for the connection + * in use, including those which may not be editable. + * + * @type {Form[]} + */ + this.forms = template.forms || []; + + /** + * The most recently-generated thumbnail for this connection, as + * stored within the local connection history. If no thumbnail is + * stored, this will be null. + * + * @type ManagedClientThumbnail + */ + this.thumbnail = template.thumbnail; + + /** + * The current state of all parameters requested by the server via + * "required" instructions, where each object key is the name of a + * requested parameter and each value is the current value entered by + * the user or null if no parameters are currently being requested. + * + * @type Object. + */ + this.requiredParameters = null; + + /** + * All uploaded files. As files are uploaded, their progress can be + * observed through the elements of this array. It is intended that + * this array be manipulated externally as needed. + * + * @type ManagedFileUpload[] + */ + this.uploads = template.uploads || []; + + /** + * All currently-exposed filesystems. When the Guacamole server exposes + * a filesystem object, that object will be made available as a + * ManagedFilesystem within this array. + * + * @type ManagedFilesystem[] + */ + this.filesystems = template.filesystems || []; + + /** + * The current number of users sharing this connection, excluding the + * user that originally started the connection. Duplicate connections + * from the same user are included in this total. + */ + this.userCount = template.userCount || 0; + + /** + * All users currently sharing this connection, excluding the user that + * originally started the connection. If the connection is not shared, + * this object will be empty. This map consists of key/value pairs + * where each key is the user's username and each value is an object + * tracking the unique connections currently used by that user (a map + * of Guacamole protocol user IDs to boolean values). + * + * @type Object.> + */ + this.users = template.users || {}; + + /** + * All available share links generated for the this ManagedClient via + * ManagedClient.createShareLink(). Each resulting share link is stored + * under the identifier of its corresponding SharingProfile. + * + * @type Object. + */ + this.shareLinks = template.shareLinks || {}; + + /** + * The number of simultaneous touch contacts supported by the remote + * desktop. Unless explicitly declared otherwise by the remote desktop + * after connecting, this will be 0 (multi-touch unsupported). + * + * @type Number + */ + this.multiTouchSupport = template.multiTouchSupport || 0; + + /** + * The current state of the Guacamole client (idle, connecting, + * connected, terminated with error, etc.). + * + * @type ManagedClientState + */ + this.clientState = template.clientState || new ManagedClientState(); + + /** + * Properties associated with the display and behavior of the Guacamole + * client. + * + * @type ClientProperties + */ + this.clientProperties = template.clientProperties || new ClientProperties(); + + /** + * All editable arguments (connection parameters), stored by their + * names. Arguments will only be present within this set if their + * current values have been exposed by the server via an inbound "argv" + * stream and the server has confirmed that the value may be changed + * through a successful "ack" to an outbound "argv" stream. + * + * @type {Object.} + */ + this.arguments = template.arguments || {}; + + /** + * Any received pipe streams that have not been consumed by an onpipe + * handler or registered pipe handler, indexed by pipe stream name. + * + * @type {Object.} + */ + this.deferredPipeStreams = template.deferredPipeStreams || {}; + + /** + * Handlers for deferred pipe streams, indexed by the name of the pipe + * stream that the handler should handle. + * + * @type {Object.} + */ + this.deferredPipeStreamHandlers = template.deferredPipeStreamHandlers || {}; + + }; + + /** + * The mimetype of audio data to be sent along the Guacamole connection if + * audio input is supported. + * + * @constant + * @type String + */ + ManagedClient.AUDIO_INPUT_MIMETYPE = 'audio/L16;rate=44100,channels=2'; + + /** + * Returns a promise which resolves with the string of connection + * parameters to be passed to the Guacamole client during connection. This + * string generally contains the desired connection ID, display resolution, + * and supported audio/video/image formats. The returned promise is + * guaranteed to resolve successfully. + * + * @param {ClientIdentifier} identifier + * The identifier representing the connection or group to connect to. + * + * @param {number} [width] + * The optimal display width, in local CSS pixels. If omitted, the + * browser window width will be used. + * + * @param {number} [height] + * The optimal display height, in local CSS pixels. If omitted, the + * browser window height will be used. + * + * @returns {Promise.} + * A promise which resolves with the string of connection parameters to + * be passed to the Guacamole client, once the string is ready. + */ + const getConnectString = function getConnectString(identifier, width, height) { + + const deferred = $q.defer(); + + // Calculate optimal width/height for display + const pixel_density = $window.devicePixelRatio || 1; + const optimal_dpi = pixel_density * 96; + const optimal_width = width * pixel_density; + const optimal_height = height * pixel_density; + + // Build base connect string + let connectString = + "token=" + encodeURIComponent(authenticationService.getCurrentToken()) + + "&GUAC_DATA_SOURCE=" + encodeURIComponent(identifier.dataSource) + + "&GUAC_ID=" + encodeURIComponent(identifier.id) + + "&GUAC_TYPE=" + encodeURIComponent(identifier.type) + + "&GUAC_WIDTH=" + Math.floor(optimal_width) + + "&GUAC_HEIGHT=" + Math.floor(optimal_height) + + "&GUAC_DPI=" + Math.floor(optimal_dpi) + + "&GUAC_TIMEZONE=" + encodeURIComponent(preferenceService.preferences.timezone); + + // Add audio mimetypes to connect string + guacAudio.supported.forEach(function(mimetype) { + connectString += "&GUAC_AUDIO=" + encodeURIComponent(mimetype); + }); + + // Add video mimetypes to connect string + guacVideo.supported.forEach(function(mimetype) { + connectString += "&GUAC_VIDEO=" + encodeURIComponent(mimetype); + }); + + // Add image mimetypes to connect string + guacImage.getSupportedMimetypes().then(function supportedMimetypesKnown(mimetypes) { + + // Add each image mimetype + angular.forEach(mimetypes, function addImageMimetype(mimetype) { + connectString += "&GUAC_IMAGE=" + encodeURIComponent(mimetype); + }); + + // Connect string is now ready - nothing else is deferred + deferred.resolve(connectString); + + }); + + return deferred.promise; + + }; + + /** + * Requests the creation of a new audio stream, recorded from the user's + * local audio input device. If audio input is supported by the connection, + * an audio stream will be created which will remain open until the remote + * desktop requests that it be closed. If the audio stream is successfully + * created but is later closed, a new audio stream will automatically be + * established to take its place. The mimetype used for all audio streams + * produced by this function is defined by + * ManagedClient.AUDIO_INPUT_MIMETYPE. + * + * @param {Guacamole.Client} client + * The Guacamole.Client for which the audio stream is being requested. + */ + var requestAudioStream = function requestAudioStream(client) { + + // Create new audio stream, associating it with an AudioRecorder + var stream = client.createAudioStream(ManagedClient.AUDIO_INPUT_MIMETYPE); + var recorder = Guacamole.AudioRecorder.getInstance(stream, ManagedClient.AUDIO_INPUT_MIMETYPE); + + // If creation of the AudioRecorder failed, simply end the stream + if (!recorder) + stream.sendEnd(); + + // Otherwise, ensure that another audio stream is created after this + // audio stream is closed + else + recorder.onclose = requestAudioStream.bind(this, client); + + }; + + /** + * Creates a new ManagedClient representing the specified connection or + * connection group. The ManagedClient will not initially be connected, + * and must be explicitly connected by invoking ManagedClient.connect(). + * + * @param {String} id + * The ID of the connection or group to connect to. This String must be + * a valid ClientIdentifier string, as would be generated by + * ClientIdentifier.toString(). + * + * @returns {ManagedClient} + * A new ManagedClient instance which represents the connection or + * connection group having the given ID. + */ + ManagedClient.getInstance = function getInstance(id) { + + var tunnel; + + // If WebSocket available, try to use it. + if ($window.WebSocket) + tunnel = new Guacamole.ChainedTunnel( + new Guacamole.WebSocketTunnel('websocket-tunnel'), + new Guacamole.HTTPTunnel('tunnel') + ); + + // If no WebSocket, then use HTTP. + else + tunnel = new Guacamole.HTTPTunnel('tunnel'); + + // Get new client instance + var client = new Guacamole.Client(tunnel); + + // Associate new managed client with new client and tunnel + var managedClient = new ManagedClient({ + id : id, + client : client, + tunnel : tunnel + }); + + // Fire events for tunnel errors + tunnel.onerror = function tunnelError(status) { + $rootScope.$apply(function handleTunnelError() { + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.TUNNEL_ERROR, + status.code); + }); + }; + + // Pull protocol-specific information from tunnel once tunnel UUID is + // known + tunnel.onuuid = function tunnelAssignedUUID(uuid) { + tunnelService.getProtocol(uuid).then(function protocolRetrieved(protocol) { + managedClient.protocol = protocol.name; + managedClient.forms = protocol.connectionForms; + }, requestService.WARN); + }; + + // Update connection state as tunnel state changes + tunnel.onstatechange = function tunnelStateChanged(state) { + $rootScope.$evalAsync(function updateTunnelState() { + + switch (state) { + + // Connection is being established + case Guacamole.Tunnel.State.CONNECTING: + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.CONNECTING); + break; + + // Connection is established / no longer unstable + case Guacamole.Tunnel.State.OPEN: + ManagedClientState.setTunnelUnstable(managedClient.clientState, false); + break; + + // Connection is established but misbehaving + case Guacamole.Tunnel.State.UNSTABLE: + ManagedClientState.setTunnelUnstable(managedClient.clientState, true); + break; + + // Connection has closed + case Guacamole.Tunnel.State.CLOSED: + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.DISCONNECTED); + break; + + } + + }); + }; + + // Update connection state as client state changes + client.onstatechange = function clientStateChanged(clientState) { + $rootScope.$evalAsync(function updateClientState() { + + switch (clientState) { + + // Idle + case Guacamole.Client.State.IDLE: + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.IDLE); + break; + + // Connecting + case Guacamole.Client.State.CONNECTING: + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.CONNECTING); + break; + + // Connected + waiting + case Guacamole.Client.State.WAITING: + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.WAITING); + break; + + // Connected + case Guacamole.Client.State.CONNECTED: + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.CONNECTED); + + // Sync current clipboard data + clipboardService.getClipboard().then((data) => { + ManagedClient.setClipboard(managedClient, data); + }, angular.noop); + + // Begin streaming audio input if possible + requestAudioStream(client); + + // Update thumbnail with initial display contents + ManagedClient.updateThumbnail(managedClient); + break; + + // Update history during disconnect phases + case Guacamole.Client.State.DISCONNECTING: + case Guacamole.Client.State.DISCONNECTED: + ManagedClient.updateThumbnail(managedClient); + break; + + } + + }); + }; + + // Disconnect and update status when the client receives an error + client.onerror = function clientError(status) { + $rootScope.$apply(function handleClientError() { + + // Disconnect, if connected + client.disconnect(); + + // Update state + ManagedClientState.setConnectionState(managedClient.clientState, + ManagedClientState.ConnectionState.CLIENT_ERROR, + status.code); + + }); + }; + + // Update user count when a new user joins + client.onjoin = function userJoined(id, username) { + $rootScope.$apply(function usersChanged() { + + var connections = managedClient.users[username] || {}; + managedClient.users[username] = connections; + + managedClient.userCount++; + connections[id] = true; + + }); + }; + + // Update user count when a user leaves + client.onleave = function userLeft(id, username) { + $rootScope.$apply(function usersChanged() { + + var connections = managedClient.users[username] || {}; + managedClient.users[username] = connections; + + managedClient.userCount--; + delete connections[id]; + + // Delete user entry after no connections remain + if (_.isEmpty(connections)) + delete managedClient.users[username]; + + }); + }; + + // Automatically update the client thumbnail + client.onsync = function syncReceived() { + + var thumbnail = managedClient.thumbnail; + var timestamp = new Date().getTime(); + + // Update thumbnail if it doesn't exist or is old + if (!thumbnail || timestamp - thumbnail.timestamp >= THUMBNAIL_UPDATE_FREQUENCY) { + $rootScope.$apply(function updateClientThumbnail() { + ManagedClient.updateThumbnail(managedClient); + }); + } + + }; + + // A default onpipe implementation that will automatically defer any + // received pipe streams, automatically invoking any registered handlers + // that may already be set for the received name + client.onpipe = (stream, mimetype, name) => { + + // Defer the pipe stream + managedClient.deferredPipeStreams[name] = new DeferredPipeStream( + { stream, mimetype, name }); + + // Invoke the handler now, if set + const handler = managedClient.deferredPipeStreamHandlers[name]; + if (handler) { + + // Handle the stream, and clear from the deferred streams + handler(stream, mimetype, name); + delete managedClient.deferredPipeStreams[name]; + } + }; + + // Test for argument mutability whenever an argument value is + // received + client.onargv = function clientArgumentValueReceived(stream, mimetype, name) { + + // Ignore arguments which do not use a mimetype currently supported + // by the web application + if (mimetype !== 'text/plain') + return; + + var reader = new Guacamole.StringReader(stream); + + // Assemble received data into a single string + var value = ''; + reader.ontext = function textReceived(text) { + value += text; + }; + + // Test mutability once stream is finished, storing the current + // value for the argument only if it is mutable + reader.onend = function textComplete() { + ManagedArgument.getInstance(managedClient, name, value).then(function argumentIsMutable(argument) { + managedClient.arguments[name] = argument; + }, function ignoreImmutableArguments() {}); + }; + + }; + + // Handle any received clipboard data + client.onclipboard = function clientClipboardReceived(stream, mimetype) { + + var reader; + + // If the received data is text, read it as a simple string + if (/^text\//.exec(mimetype)) { + + reader = new Guacamole.StringReader(stream); + + // Assemble received data into a single string + var data = ''; + reader.ontext = function textReceived(text) { + data += text; + }; + + // Set clipboard contents once stream is finished + reader.onend = function textComplete() { + clipboardService.setClipboard(new ClipboardData({ + source : managedClient.id, + type : mimetype, + data : data + }))['catch'](angular.noop); + }; + + } + + // Otherwise read the clipboard data as a Blob + else { + reader = new Guacamole.BlobReader(stream, mimetype); + reader.onend = function blobComplete() { + clipboardService.setClipboard(new ClipboardData({ + source : managedClient.id, + type : mimetype, + data : reader.getBlob() + }))['catch'](angular.noop); + }; + } + + }; + + // Update level of multi-touch support when known + client.onmultitouch = function multiTouchSupportDeclared(layer, touches) { + managedClient.multiTouchSupport = touches; + }; + + // Update title when a "name" instruction is received + client.onname = function clientNameReceived(name) { + $rootScope.$apply(function updateClientTitle() { + managedClient.title = name; + }); + }; + + // Handle any received files + client.onfile = function clientFileReceived(stream, mimetype, filename) { + tunnelService.downloadStream(tunnel.uuid, stream, mimetype, filename); + }; + + // Handle any received filesystem objects + client.onfilesystem = function fileSystemReceived(object, name) { + $rootScope.$apply(function exposeFilesystem() { + managedClient.filesystems.push(ManagedFilesystem.getInstance(managedClient, object, name)); + }); + }; + + // Handle any received prompts + client.onrequired = function onrequired(parameters) { + $rootScope.$apply(function promptUser() { + managedClient.requiredParameters = {}; + angular.forEach(parameters, function populateParameter(name) { + managedClient.requiredParameters[name] = ''; + }); + }); + }; + + // Manage the client display + managedClient.managedDisplay = ManagedDisplay.getInstance(client.getDisplay()); + + // Parse connection details from ID + var clientIdentifier = ClientIdentifier.fromString(id); + + // Defer actually connecting the Guacamole client until + // ManagedClient.connect() is explicitly invoked + + // If using a connection, pull connection name and protocol information + if (clientIdentifier.type === ClientIdentifier.Types.CONNECTION) { + connectionService.getConnection(clientIdentifier.dataSource, clientIdentifier.id) + .then(function connectionRetrieved(connection) { + managedClient.name = managedClient.title = connection.name; + }, requestService.WARN); + } + + // If using a connection group, pull connection name + else if (clientIdentifier.type === ClientIdentifier.Types.CONNECTION_GROUP) { + connectionGroupService.getConnectionGroup(clientIdentifier.dataSource, clientIdentifier.id) + .then(function connectionGroupRetrieved(group) { + managedClient.name = managedClient.title = group.name; + }, requestService.WARN); + } + + // If using an active connection, pull corresponding connection, then + // pull connection name and protocol information from that + else if (clientIdentifier.type === ClientIdentifier.Types.ACTIVE_CONNECTION) { + activeConnectionService.getActiveConnection(clientIdentifier.dataSource, clientIdentifier.id) + .then(function activeConnectionRetrieved(activeConnection) { + + // Attempt to retrieve connection details only if the + // underlying connection is known + if (activeConnection.connectionIdentifier) { + connectionService.getConnection(clientIdentifier.dataSource, activeConnection.connectionIdentifier) + .then(function connectionRetrieved(connection) { + managedClient.name = managedClient.title = connection.name; + }, requestService.WARN); + } + + }, requestService.WARN); + } + + return managedClient; + + }; + + /** + * Connects the given ManagedClient instance to its associated connection + * or connection group. If the ManagedClient has already been connected, + * including if connected but subsequently disconnected, this function has + * no effect. + * + * @param {ManagedClient} managedClient + * The ManagedClient to connect. + * + * @param {number} [width] + * The optimal display width, in local CSS pixels. If omitted, the + * browser window width will be used. + * + * @param {number} [height] + * The optimal display height, in local CSS pixels. If omitted, the + * browser window height will be used. + */ + ManagedClient.connect = function connect(managedClient, width, height) { + + // Ignore if already connected + if (managedClient.clientState.connectionState !== ManagedClientState.ConnectionState.IDLE) + return; + + // Parse connection details from ID + const clientIdentifier = ClientIdentifier.fromString(managedClient.id); + + // Connect the Guacamole client + getConnectString(clientIdentifier, width, height) + .then(function connectClient(connectString) { + managedClient.client.connect(connectString); + }); + + }; + + /** + * Uploads the given file to the server through the given Guacamole client. + * The file transfer can be monitored through the corresponding entry in + * the uploads array of the given managedClient. + * + * @param {ManagedClient} managedClient + * The ManagedClient through which the file is to be uploaded. + * + * @param {File} file + * The file to upload. + * + * @param {ManagedFilesystem} [filesystem] + * The filesystem to upload the file to, if any. If not specified, the + * file will be sent as a generic Guacamole file stream. + * + * @param {ManagedFilesystem.File} [directory=filesystem.currentDirectory] + * The directory within the given filesystem to upload the file to. If + * not specified, but a filesystem is given, the current directory of + * that filesystem will be used. + */ + ManagedClient.uploadFile = function uploadFile(managedClient, file, filesystem, directory) { + + // Use generic Guacamole file streams by default + var object = null; + var streamName = null; + + // If a filesystem is given, determine the destination object and stream + if (filesystem) { + object = filesystem.object; + streamName = (directory || filesystem.currentDirectory).streamName + '/' + file.name; + } + + // Start and manage file upload + managedClient.uploads.push(ManagedFileUpload.getInstance(managedClient, file, object, streamName)); + + }; + + /** + * Sends the given clipboard data over the given Guacamole client, setting + * the contents of the remote clipboard to the data provided. If the given + * clipboard data was originally received from that client, the data is + * ignored and this function has no effect. + * + * @param {ManagedClient} managedClient + * The ManagedClient over which the given clipboard data is to be sent. + * + * @param {ClipboardData} data + * The clipboard data to send. + */ + ManagedClient.setClipboard = function setClipboard(managedClient, data) { + + // Ignore clipboard data that was received from this connection + if (data.source === managedClient.id) + return; + + var writer; + + // Create stream with proper mimetype + var stream = managedClient.client.createClipboardStream(data.type); + + // Send data as a string if it is stored as a string + if (typeof data.data === 'string') { + writer = new Guacamole.StringWriter(stream); + writer.sendText(data.data); + writer.sendEnd(); + } + + // Otherwise, assume the data is a File/Blob + else { + + // Write File/Blob asynchronously + writer = new Guacamole.BlobWriter(stream); + writer.oncomplete = function clipboardSent() { + writer.sendEnd(); + }; + + // Begin sending data + writer.sendBlob(data.data); + + } + + }; + + /** + * Assigns the given value to the connection parameter having the given + * name, updating the behavior of the connection in real-time. If the + * connection parameter is not editable, this function has no effect. + * + * @param {ManagedClient} managedClient + * The ManagedClient instance associated with the active connection + * being modified. + * + * @param {String} name + * The name of the connection parameter to modify. + * + * @param {String} value + * The value to attempt to assign to the given connection parameter. + */ + ManagedClient.setArgument = function setArgument(managedClient, name, value) { + var managedArgument = managedClient.arguments[name]; + managedArgument && ManagedArgument.setValue(managedArgument, value); + }; + + /** + * Sends the given connection parameter values using "argv" streams, + * updating the behavior of the connection in real-time if the server is + * expecting or requiring these parameters. + * + * @param {ManagedClient} managedClient + * The ManagedClient instance associated with the active connection + * being modified. + * + * @param {Object.} values + * The set of values to attempt to assign to corresponding connection + * parameters, where each object key is the connection parameter being + * set. + */ + ManagedClient.sendArguments = function sendArguments(managedClient, values) { + angular.forEach(values, function sendArgument(value, name) { + var stream = managedClient.client.createArgumentValueStream("text/plain", name); + var writer = new Guacamole.StringWriter(stream); + writer.sendText(value); + writer.sendEnd(); + }); + }; + + /** + * Retrieves the current values of all editable connection parameters as a + * set of name/value pairs suitable for use as the model of a form which + * edits those parameters. + * + * @param {ManagedClient} client + * The ManagedClient instance associated with the active connection + * whose parameter values are being retrieved. + * + * @returns {Object.} + * A new set of name/value pairs containing the current values of all + * editable parameters. + */ + ManagedClient.getArgumentModel = function getArgumentModel(client) { + + var model = {}; + + angular.forEach(client.arguments, function addModelEntry(managedArgument) { + model[managedArgument.name] = managedArgument.value; + }); + + return model; + + }; + + /** + * Produces a sharing link for the given ManagedClient using the given + * sharing profile. The resulting sharing link, and any required login + * information, can be retrieved from the shareLinks property + * of the given ManagedClient once the various underlying service calls + * succeed. + * + * @param {ManagedClient} client + * The ManagedClient which will be shared via the generated sharing + * link. + * + * @param {SharingProfile} sharingProfile + * The sharing profile to use to generate the sharing link. + * + * @returns {Promise} + * A Promise which is resolved once the sharing link has been + * successfully generated, and rejected if generating the link fails. + */ + ManagedClient.createShareLink = function createShareLink(client, sharingProfile) { + + // Retrieve sharing credentials for the sake of generating a share link + var credentialRequest = tunnelService.getSharingCredentials( + client.tunnel.uuid, sharingProfile.identifier); + + // Add a new share link once the credentials are ready + credentialRequest.then(function sharingCredentialsReceived(sharingCredentials) { + client.shareLinks[sharingProfile.identifier] = + ManagedShareLink.getInstance(sharingProfile, sharingCredentials); + }, requestService.WARN); + + return credentialRequest; + + }; + + /** + * Returns whether the given ManagedClient is being shared. A ManagedClient + * is shared if it has any associated share links. + * + * @param {ManagedClient} client + * The ManagedClient to check. + * + * @returns {Boolean} + * true if the ManagedClient has at least one associated share link, + * false otherwise. + */ + ManagedClient.isShared = function isShared(client) { + + // The connection is shared if at least one share link exists + for (var dummy in client.shareLinks) + return true; + + // No share links currently exist + return false; + + }; + + /** + * Returns whether the given client has any associated file transfers, + * regardless of those file transfers' state. + * + * @param {GuacamoleClient} client + * The client for which file transfers should be checked. + * + * @returns {boolean} + * true if there are any file transfers associated with the + * given client, false otherwise. + */ + ManagedClient.hasTransfers = function hasTransfers(client) { + return !!(client && client.uploads && client.uploads.length); + }; + + /** + * Store the thumbnail of the given managed client within the connection + * history under its associated ID. If the client is not connected, this + * function has no effect. + * + * @param {ManagedClient} managedClient + * The client whose history entry should be updated. + */ + ManagedClient.updateThumbnail = function updateThumbnail(managedClient) { + + var display = managedClient.client.getDisplay(); + + // Update stored thumbnail of previous connection + if (display && display.getWidth() > 0 && display.getHeight() > 0) { + + // Get screenshot + var canvas = display.flatten(); + + // Calculate scale of thumbnail (max 320x240, max zoom 100%) + var scale = Math.min(320 / canvas.width, 240 / canvas.height, 1); + + // Create thumbnail canvas + var thumbnail = $document[0].createElement("canvas"); + thumbnail.width = canvas.width*scale; + thumbnail.height = canvas.height*scale; + + // Scale screenshot to thumbnail + var context = thumbnail.getContext("2d"); + context.drawImage(canvas, + 0, 0, canvas.width, canvas.height, + 0, 0, thumbnail.width, thumbnail.height + ); + + // Store updated thumbnail within client + managedClient.thumbnail = new ManagedClientThumbnail({ + timestamp : new Date().getTime(), + canvas : thumbnail + }); + + // Update historical thumbnail + guacHistory.updateThumbnail(managedClient.id, thumbnail.toDataURL("image/png")); + + } + + }; + + + /** + * Register a handler that will be automatically invoked for any deferred + * pipe stream with the provided name, either when a pipe stream with a + * name matching a registered handler is received, or immediately when this + * function is called, if such a pipe stream has already been received. + * + * NOTE: Pipe streams are automatically deferred by the default onpipe + * implementation. To preserve this behavior when using a custom onpipe + * callback, make sure to defer to the default implementation as needed. + * + * @param {ManagedClient} managedClient + * The client for which the deferred pipe stream handler should be set. + * + * @param {String} name + * The name of the pipe stream that should be handeled by the provided + * handler. If another handler is already registered for this name, it + * will be replaced by the handler provided to this function. + * + * @param {Function} handler + * The handler that should handle any deferred pipe stream with the + * provided name. This function must take the same arguments as the + * standard onpipe handler - namely, the stream itself, the mimetype, + * and the name. + */ + ManagedClient.registerDeferredPipeHandler = function registerDeferredPipeHandler( + managedClient, name, handler) { + managedClient.deferredPipeStreamHandlers[name] = handler; + + // Invoke the handler now, if the pipestream has already been received + if (managedClient.deferredPipeStreams[name]) { + + // Invoke the handler with the deferred pipe stream + var deferredStream = managedClient.deferredPipeStreams[name]; + handler(deferredStream.stream, + deferredStream.mimetype, + deferredStream.name); + + // Clean up the now-consumed pipe stream + delete managedClient.deferredPipeStreams[name]; + } + }; + + /** + * Detach the provided deferred pipe stream handler, if it is currently + * registered for the provided pipe stream name. + * + * @param {String} name + * The name of the associated pipe stream for the handler that should + * be detached. + * + * @param {Function} handler + * The handler that should be detached. + * + * @param {ManagedClient} managedClient + * The client for which the deferred pipe stream handler should be + * detached. + */ + ManagedClient.detachDeferredPipeHandler = function detachDeferredPipeHandler( + managedClient, name, handler) { + + // Remove the handler if found + if (managedClient.deferredPipeStreamHandlers[name] === handler) + delete managedClient.deferredPipeStreamHandlers[name]; + }; + + return ManagedClient; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedClientGroup.js b/guacamole/src/main/frontend/src/app/client/types/ManagedClientGroup.js new file mode 100644 index 0000000..cd42bdc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedClientGroup.js @@ -0,0 +1,359 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedClientGroup class used by the guacClientManager service. + */ +angular.module('client').factory('ManagedClientGroup', ['$injector', function defineManagedClientGroup($injector) { + + /** + * Object which serves as a grouping of ManagedClients. Each + * ManagedClientGroup may be attached, detached, and reattached dynamically + * from different client views, with its contents automatically displayed + * in a tiled arrangment if needed. + * + * @constructor + * @param {ManagedClientGroup|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedClientGroup. + */ + const ManagedClientGroup = function ManagedClientGroup(template) { + + // Use empty object by default + template = template || {}; + + /** + * The time that this group was last brought to the foreground of + * the current tab, as the number of milliseconds elapsed since + * midnight of January 1, 1970 UTC. If the group has not yet been + * viewed, this will be 0. + * + * @type Number + */ + this.lastUsed = template.lastUsed || 0; + + /** + * Whether this ManagedClientGroup is currently attached to the client + * interface (true) or is running in the background (false). + * + * @type {boolean} + * @default false + */ + this.attached = template.attached || false; + + /** + * The clients that should be displayed within the client interface + * when this group is attached. + * + * @type {ManagedClient[]} + * @default [] + */ + this.clients = template.clients || []; + + /** + * The number of rows that should be used when arranging the clients + * within this group in a grid. By default, this value is automatically + * calculated from the number of clients. + * + * @type {number} + */ + this.rows = template.rows || ManagedClientGroup.getRows(this); + + /** + * The number of columns that should be used when arranging the clients + * within this group in a grid. By default, this value is automatically + * calculated from the number of clients. + * + * @type {number} + */ + this.columns = template.columns || ManagedClientGroup.getColumns(this); + + }; + + /** + * Updates the number of rows and columns stored within the given + * ManagedClientGroup such that the clients within the group are evenly + * distributed. This function should be called whenever the size of a + * group changes. + * + * @param {ManagedClientGroup} group + * The ManagedClientGroup that should be updated. + */ + ManagedClientGroup.recalculateTiles = function recalculateTiles(group) { + + const recalculated = new ManagedClientGroup({ + clients : group.clients + }); + + group.rows = recalculated.rows; + group.columns = recalculated.columns; + + }; + + /** + * Returns the unique ID representing the given ManagedClientGroup or set + * of client IDs. The ID of a ManagedClientGroup consists simply of the + * IDs of all its ManagedClients, separated by periods. + * + * @param {ManagedClientGroup|string[]} group + * The ManagedClientGroup or array of client IDs to determine the + * ManagedClientGroup ID of. + * + * @returns {string} + * The unique ID representing the given ManagedClientGroup, or the + * unique ID that would represent a ManagedClientGroup containing the + * clients with the given IDs. + */ + ManagedClientGroup.getIdentifier = function getIdentifier(group) { + + if (!_.isArray(group)) + group = _.map(group.clients, client => client.id); + + return group.join('.'); + + }; + + /** + * Returns an array of client identifiers for all clients contained within + * the given ManagedClientGroup. Order of the identifiers is preserved + * with respect to the order of the clients within the group. + * + * @param {ManagedClientGroup|string} group + * The ManagedClientGroup to retrieve the client identifiers from, + * or its ID. + * + * @returns {string[]} + * The client identifiers of all clients contained within the given + * ManagedClientGroup. + */ + ManagedClientGroup.getClientIdentifiers = function getClientIdentifiers(group) { + + if (_.isString(group)) + return group.split(/\./); + + return group.clients.map(client => client.id); + + }; + + /** + * Returns the number of columns that should be used to evenly arrange + * all provided clients in a tiled grid. + * + * @returns {Number} + * The number of columns that should be used for the grid of + * clients. + */ + ManagedClientGroup.getColumns = function getColumns(group) { + + if (!group.clients.length) + return 0; + + return Math.ceil(Math.sqrt(group.clients.length)); + + }; + + /** + * Returns the number of rows that should be used to evenly arrange all + * provided clients in a tiled grid. + * + * @returns {Number} + * The number of rows that should be used for the grid of clients. + */ + ManagedClientGroup.getRows = function getRows(group) { + + if (!group.clients.length) + return 0; + + return Math.ceil(group.clients.length / ManagedClientGroup.getColumns(group)); + + }; + + /** + * Returns the title which should be displayed as the page title if the + * given client group is attached to the interface. + * + * @param {ManagedClientGroup} group + * The ManagedClientGroup to determine the title of. + * + * @returns {string} + * The title of the given ManagedClientGroup. + */ + ManagedClientGroup.getTitle = function getTitle(group) { + + // Use client-specific title if only one client + if (group.clients.length === 1) + return group.clients[0].title; + + // With multiple clients, somehow combining multiple page titles would + // be confusing. Instead, use the combined names. + return ManagedClientGroup.getName(group); + + }; + + /** + * Returns the combined names of all clients within the given + * ManagedClientGroup, as determined by the names of the associated + * connections or connection groups. + * + * @param {ManagedClientGroup} group + * The ManagedClientGroup to determine the name of. + * + * @returns {string} + * The combined names of all clients within the given + * ManagedClientGroup. + */ + ManagedClientGroup.getName = function getName(group) { + + // Generate a name from ONLY the focused clients, unless there are no + // focused clients + let relevantClients = _.filter(group.clients, client => client.clientProperties.focused); + if (!relevantClients.length) + relevantClients = group.clients; + + return _.filter(relevantClients, (client => !!client.name)).map(client => client.name).join(', ') || '...'; + + }; + + /** + * A callback that is invoked for a ManagedClient within a ManagedClientGroup. + * + * @callback ManagedClientGroup~clientCallback + * @param {ManagedClient} client + * The relevant ManagedClient. + * + * @param {number} row + * The row number of the client within the tiled grid, where 0 is the + * first row. + * + * @param {number} column + * The column number of the client within the tiled grid, where 0 is + * the first column. + * + * @param {number} index + * The index of the client within the relevant + * {@link ManagedClientGroup#clients} array. + */ + + /** + * Loops through each of the clients associated with the given + * ManagedClientGroup, invoking the given callback for each client. + * + * @param {ManagedClientGroup} group + * The ManagedClientGroup to loop through. + * + * @param {ManagedClientGroup~clientCallback} callback + * The callback to invoke for each of the clients within the given + * ManagedClientGroup. + */ + ManagedClientGroup.forEach = function forEach(group, callback) { + let current = 0; + for (let row = 0; row < group.rows; row++) { + for (let column = 0; column < group.columns; column++) { + + callback(group.clients[current], row, column, current); + current++; + + if (current >= group.clients.length) + return; + + } + } + }; + + /** + * Returns whether the given ManagedClientGroup contains more than one + * client. + * + * @param {ManagedClientGroup} group + * The ManagedClientGroup to test. + * + * @returns {boolean} + * true if two or more clients are currently present in the given + * group, false otherwise. + */ + ManagedClientGroup.hasMultipleClients = function hasMultipleClients(group) { + return group && group.clients.length > 1; + }; + + /** + * Returns a two-dimensional array of all ManagedClients within the given + * group, arranged in the grid defined by {@link ManagedClientGroup#rows} + * and {@link ManagedClientGroup#columns}. If any grid cell lacks a + * corresponding client (because the number of clients does not divide + * evenly into a grid), that cell will be null. + * + * For the sake of AngularJS scope watches, the results of calling this + * function are cached and will always favor modifying an existing array + * over creating a new array, even for nested arrays. + * + * @param {ManagedClientGroup} group + * The ManagedClientGroup defining the tiled grid arrangement of + * ManagedClients. + * + * @returns {ManagedClient[][]} + * A two-dimensional array of all ManagedClients within the given + * group. + */ + ManagedClientGroup.getClientGrid = function getClientGrid(group) { + + let index = 0; + + // Operate on cached copy of grid + const clientGrid = group._grid || (group._grid = []); + + // Delete any rows in excess of the required size + clientGrid.splice(group.rows); + + for (let row = 0; row < group.rows; row++) { + + // Prefer to use existing column arrays, deleting any columns in + // excess of the required size + const currentRow = clientGrid[row] || (clientGrid[row] = []); + currentRow.splice(group.columns); + + for (let column = 0; column < group.columns; column++) { + currentRow[column] = group.clients[index++] || null; + } + + } + + return clientGrid; + + }; + + /** + * Verifies that focus is assigned to at least one client in the given + * group. If no client has focus, focus is assigned to the first client in + * the group. + * + * @param {ManagedClientGroup} group + * The group to verify. + */ + ManagedClientGroup.verifyFocus = function verifyFocus(group) { + + // Focus the first client if there are no clients focused + if (group.clients.length >= 1 && _.findIndex(group.clients, client => client.clientProperties.focused) === -1) { + group.clients[0].clientProperties.focused = true; + } + + }; + + return ManagedClientGroup; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedClientState.js b/guacamole/src/main/frontend/src/app/client/types/ManagedClientState.js new file mode 100644 index 0000000..10f71b4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedClientState.js @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedClient class used by the guacClientManager service. + */ +angular.module('client').factory('ManagedClientState', [function defineManagedClientState() { + + /** + * Object which represents the state of a Guacamole client and its tunnel, + * including any error conditions. + * + * @constructor + * @param {ManagedClientState|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedClientState. + */ + var ManagedClientState = function ManagedClientState(template) { + + // Use empty object by default + template = template || {}; + + /** + * The current connection state. Valid values are described by + * ManagedClientState.ConnectionState. + * + * @type String + * @default ManagedClientState.ConnectionState.IDLE + */ + this.connectionState = template.connectionState || ManagedClientState.ConnectionState.IDLE; + + /** + * Whether the network connection used by the tunnel seems unstable. If + * the network connection is unstable, the remote desktop connection + * may perform poorly or disconnect. + * + * @type Boolean + * @default false + */ + this.tunnelUnstable = template.tunnelUnstable || false; + + /** + * The status code of the current error condition, if connectionState + * is CLIENT_ERROR or TUNNEL_ERROR. For all other connectionState + * values, this will be @link{Guacamole.Status.Code.SUCCESS}. + * + * @type Number + * @default Guacamole.Status.Code.SUCCESS + */ + this.statusCode = template.statusCode || Guacamole.Status.Code.SUCCESS; + + }; + + /** + * Valid connection state strings. Each state string is associated with a + * specific state of a Guacamole connection. + */ + ManagedClientState.ConnectionState = { + + /** + * The Guacamole connection has not yet been attempted. + * + * @type String + */ + IDLE : "IDLE", + + /** + * The Guacamole connection is being established. + * + * @type String + */ + CONNECTING : "CONNECTING", + + /** + * The Guacamole connection has been successfully established, and the + * client is now waiting for receipt of initial graphical data. + * + * @type String + */ + WAITING : "WAITING", + + /** + * The Guacamole connection has been successfully established, and + * initial graphical data has been received. + * + * @type String + */ + CONNECTED : "CONNECTED", + + /** + * The Guacamole connection has terminated successfully. No errors are + * indicated. + * + * @type String + */ + DISCONNECTED : "DISCONNECTED", + + /** + * The Guacamole connection has terminated due to an error reported by + * the client. The associated error code is stored in statusCode. + * + * @type String + */ + CLIENT_ERROR : "CLIENT_ERROR", + + /** + * The Guacamole connection has terminated due to an error reported by + * the tunnel. The associated error code is stored in statusCode. + * + * @type String + */ + TUNNEL_ERROR : "TUNNEL_ERROR" + + }; + + /** + * Sets the current client state and, if given, the associated status code. + * If an error is already represented, this function has no effect. If the + * client state was previously marked as unstable, that flag is implicitly + * cleared. + * + * @param {ManagedClientState} clientState + * The ManagedClientState to update. + * + * @param {String} connectionState + * The connection state to assign to the given ManagedClientState, as + * listed within ManagedClientState.ConnectionState. + * + * @param {Number} [statusCode] + * The status code to assign to the given ManagedClientState, if any, + * as listed within Guacamole.Status.Code. If no status code is + * specified, the status code of the ManagedClientState is not touched. + */ + ManagedClientState.setConnectionState = function(clientState, connectionState, statusCode) { + + // Do not set state after an error is registered + if (clientState.connectionState === ManagedClientState.ConnectionState.TUNNEL_ERROR + || clientState.connectionState === ManagedClientState.ConnectionState.CLIENT_ERROR) + return; + + // Update connection state + clientState.connectionState = connectionState; + clientState.tunnelUnstable = false; + + // Set status code, if given + if (statusCode) + clientState.statusCode = statusCode; + + }; + + /** + * Updates the given client state, setting whether the underlying tunnel + * is currently unstable. An unstable tunnel is not necessarily + * disconnected, but appears to be misbehaving and may be disconnected. + * + * @param {ManagedClientState} clientState + * The ManagedClientState to update. + * + * @param {Boolean} unstable + * Whether the underlying tunnel of the connection currently appears + * unstable. + */ + ManagedClientState.setTunnelUnstable = function setTunnelUnstable(clientState, unstable) { + clientState.tunnelUnstable = unstable; + }; + + return ManagedClientState; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedClientThumbnail.js b/guacamole/src/main/frontend/src/app/client/types/ManagedClientThumbnail.js new file mode 100644 index 0000000..fd9b3de --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedClientThumbnail.js @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedClientThumbnail class used by ManagedClient. + */ +angular.module('client').factory('ManagedClientThumbnail', [function defineManagedClientThumbnail() { + + /** + * Object which represents a thumbnail of the Guacamole client display, + * along with the time that the thumbnail was generated. + * + * @constructor + * @param {ManagedClientThumbnail|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedClientThumbnail. + */ + var ManagedClientThumbnail = function ManagedClientThumbnail(template) { + + // Use empty object by default + template = template || {}; + + /** + * The time that this thumbnail was generated, as the number of + * milliseconds elapsed since midnight of January 1, 1970 UTC. + * + * @type Number + */ + this.timestamp = template.timestamp; + + /** + * The thumbnail of the Guacamole client display. + * + * @type HTMLCanvasElement + */ + this.canvas = template.canvas; + + }; + + return ManagedClientThumbnail; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedDisplay.js b/guacamole/src/main/frontend/src/app/client/types/ManagedDisplay.js new file mode 100644 index 0000000..fedefad --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedDisplay.js @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedDisplay class used by the guacClientManager service. + */ +angular.module('client').factory('ManagedDisplay', ['$rootScope', + function defineManagedDisplay($rootScope) { + + /** + * Object which serves as a surrogate interface, encapsulating a Guacamole + * display while it is active, allowing it to be detached and reattached + * from different client views. + * + * @constructor + * @param {ManagedDisplay|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedDisplay. + */ + var ManagedDisplay = function ManagedDisplay(template) { + + // Use empty object by default + template = template || {}; + + /** + * The underlying Guacamole display. + * + * @type Guacamole.Display + */ + this.display = template.display; + + /** + * The current size of the Guacamole display. + * + * @type ManagedDisplay.Dimensions + */ + this.size = new ManagedDisplay.Dimensions(template.size); + + /** + * The current mouse cursor, if any. + * + * @type ManagedDisplay.Cursor + */ + this.cursor = template.cursor; + + }; + + /** + * Object which represents the size of the Guacamole display. + * + * @constructor + * @param {ManagedDisplay.Dimensions|Object} template + * The object whose properties should be copied within the new + * ManagedDisplay.Dimensions. + */ + ManagedDisplay.Dimensions = function Dimensions(template) { + + // Use empty object by default + template = template || {}; + + /** + * The current width of the Guacamole display, in pixels. + * + * @type Number + */ + this.width = template.width || 0; + + /** + * The current width of the Guacamole display, in pixels. + * + * @type Number + */ + this.height = template.height || 0; + + }; + + /** + * Object which represents a mouse cursor used by the Guacamole display. + * + * @constructor + * @param {ManagedDisplay.Cursor|Object} template + * The object whose properties should be copied within the new + * ManagedDisplay.Cursor. + */ + ManagedDisplay.Cursor = function Cursor(template) { + + // Use empty object by default + template = template || {}; + + /** + * The actual mouse cursor image. + * + * @type HTMLCanvasElement + */ + this.canvas = template.canvas; + + /** + * The X coordinate of the cursor hotspot. + * + * @type Number + */ + this.x = template.x; + + /** + * The Y coordinate of the cursor hotspot. + * + * @type Number + */ + this.y = template.y; + + }; + + /** + * Creates a new ManagedDisplay which represents the current state of the + * given Guacamole display. + * + * @param {Guacamole.Display} display + * The Guacamole display to represent. Changes to this display will + * affect this ManagedDisplay. + * + * @returns {ManagedDisplay} + * A new ManagedDisplay which represents the current state of the + * given Guacamole display. + */ + ManagedDisplay.getInstance = function getInstance(display) { + + var managedDisplay = new ManagedDisplay({ + display : display + }); + + // Store changes to display size + display.onresize = function setClientSize() { + $rootScope.$apply(function updateClientSize() { + managedDisplay.size = new ManagedDisplay.Dimensions({ + width : display.getWidth(), + height : display.getHeight() + }); + }); + }; + + // Store changes to display cursor + display.oncursor = function setClientCursor(canvas, x, y) { + $rootScope.$apply(function updateClientCursor() { + managedDisplay.cursor = new ManagedDisplay.Cursor({ + canvas : canvas, + x : x, + y : y + }); + }); + }; + + return managedDisplay; + + }; + + return ManagedDisplay; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedFileTransferState.js b/guacamole/src/main/frontend/src/app/client/types/ManagedFileTransferState.js new file mode 100644 index 0000000..1301cc7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedFileTransferState.js @@ -0,0 +1,133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedFileTransferState class used by the guacClientManager + * service. + */ +angular.module('client').factory('ManagedFileTransferState', [function defineManagedFileTransferState() { + + /** + * Object which represents the state of a Guacamole stream, including any + * error conditions. + * + * @constructor + * @param {ManagedFileTransferState|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedFileTransferState. + */ + var ManagedFileTransferState = function ManagedFileTransferState(template) { + + // Use empty object by default + template = template || {}; + + /** + * The current stream state. Valid values are described by + * ManagedFileTransferState.StreamState. + * + * @type String + * @default ManagedFileTransferState.StreamState.IDLE + */ + this.streamState = template.streamState || ManagedFileTransferState.StreamState.IDLE; + + /** + * The status code of the current error condition, if streamState + * is ERROR. For all other streamState values, this will be + * @link{Guacamole.Status.Code.SUCCESS}. + * + * @type Number + * @default Guacamole.Status.Code.SUCCESS + */ + this.statusCode = template.statusCode || Guacamole.Status.Code.SUCCESS; + + }; + + /** + * Valid stream state strings. Each state string is associated with a + * specific state of a Guacamole stream. + */ + ManagedFileTransferState.StreamState = { + + /** + * The stream has not yet been opened. + * + * @type String + */ + IDLE : "IDLE", + + /** + * The stream has been successfully established. Data can be sent or + * received. + * + * @type String + */ + OPEN : "OPEN", + + /** + * The stream has terminated successfully. No errors are indicated. + * + * @type String + */ + CLOSED : "CLOSED", + + /** + * The stream has terminated due to an error. The associated error code + * is stored in statusCode. + * + * @type String + */ + ERROR : "ERROR" + + }; + + /** + * Sets the current transfer state and, if given, the associated status + * code. If an error is already represented, this function has no effect. + * + * @param {ManagedFileTransferState} transferState + * The ManagedFileTransferState to update. + * + * @param {String} streamState + * The stream state to assign to the given ManagedFileTransferState, as + * listed within ManagedFileTransferState.StreamState. + * + * @param {Number} [statusCode] + * The status code to assign to the given ManagedFileTransferState, if + * any, as listed within Guacamole.Status.Code. If no status code is + * specified, the status code of the ManagedFileTransferState is not + * touched. + */ + ManagedFileTransferState.setStreamState = function setStreamState(transferState, streamState, statusCode) { + + // Do not set state after an error is registered + if (transferState.streamState === ManagedFileTransferState.StreamState.ERROR) + return; + + // Update stream state + transferState.streamState = streamState; + + // Set status code, if given + if (statusCode) + transferState.statusCode = statusCode; + + }; + + return ManagedFileTransferState; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedFileUpload.js b/guacamole/src/main/frontend/src/app/client/types/ManagedFileUpload.js new file mode 100644 index 0000000..95eef0c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedFileUpload.js @@ -0,0 +1,208 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedFileUpload class used by the guacClientManager service. + */ +angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector', + function defineManagedFileUpload($rootScope, $injector) { + + // Required types + var Error = $injector.get('Error'); + var ManagedFileTransferState = $injector.get('ManagedFileTransferState'); + + // Required services + var requestService = $injector.get('requestService'); + var tunnelService = $injector.get('tunnelService'); + + /** + * Object which serves as a surrogate interface, encapsulating a Guacamole + * file upload while it is active, allowing it to be detached and + * reattached from different client views. + * + * @constructor + * @param {ManagedFileUpload|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedFileUpload. + */ + var ManagedFileUpload = function ManagedFileUpload(template) { + + // Use empty object by default + template = template || {}; + + /** + * The current state of the file transfer stream. + * + * @type ManagedFileTransferState + */ + this.transferState = template.transferState || new ManagedFileTransferState(); + + /** + * The mimetype of the file being transferred. + * + * @type String + */ + this.mimetype = template.mimetype; + + /** + * The filename of the file being transferred. + * + * @type String + */ + this.filename = template.filename; + + /** + * The number of bytes transferred so far. + * + * @type Number + */ + this.progress = template.progress; + + /** + * The total number of bytes in the file. + * + * @type Number + */ + this.length = template.length; + + }; + + /** + * Creates a new ManagedFileUpload which uploads the given file to the + * server through the given Guacamole client. + * + * @param {ManagedClient} managedClient + * The ManagedClient through which the file is to be uploaded. + * + * @param {File} file + * The file to upload. + * + * @param {Object} [object] + * The object to upload the file to, if any, such as a filesystem + * object. + * + * @param {String} [streamName] + * The name of the stream to upload the file to. If an object is given, + * this must be specified. + * + * @return {ManagedFileUpload} + * A new ManagedFileUpload object which can be used to track the + * progress of the upload. + */ + ManagedFileUpload.getInstance = function getInstance(managedClient, file, object, streamName) { + + var managedFileUpload = new ManagedFileUpload(); + + // Pull Guacamole.Tunnel and Guacamole.Client from given ManagedClient + var client = managedClient.client; + var tunnel = managedClient.tunnel; + + // Open file for writing + var stream; + if (!object) + stream = client.createFileStream(file.type, file.name); + + // If object/streamName specified, upload to that instead of a file + // stream + else + stream = object.createOutputStream(file.type, streamName); + + // Notify that the file transfer is pending + $rootScope.$evalAsync(function uploadStreamOpen() { + + // Init managed upload + managedFileUpload.filename = file.name; + managedFileUpload.mimetype = file.type; + managedFileUpload.progress = 0; + managedFileUpload.length = file.size; + + // Notify that stream is open + ManagedFileTransferState.setStreamState(managedFileUpload.transferState, + ManagedFileTransferState.StreamState.OPEN); + + }); + + // Upload file once stream is acknowledged + stream.onack = function beginUpload(status) { + + // Notify of any errors from the Guacamole server + if (status.isError()) { + $rootScope.$apply(function uploadStreamError() { + ManagedFileTransferState.setStreamState(managedFileUpload.transferState, + ManagedFileTransferState.StreamState.ERROR, + status.code); + }); + return; + } + + // Begin upload + tunnelService.uploadToStream(tunnel.uuid, stream, file, function uploadContinuing(length) { + $rootScope.$apply(function uploadStreamProgress() { + managedFileUpload.progress = length; + }); + }) + + // Notify if upload succeeds + .then(function uploadSuccessful() { + + // Upload complete + managedFileUpload.progress = file.size; + + // Close the stream + stream.sendEnd(); + ManagedFileTransferState.setStreamState(managedFileUpload.transferState, + ManagedFileTransferState.StreamState.CLOSED); + + // Notify of upload completion + $rootScope.$broadcast('guacUploadComplete', file.name); + }, + + // Notify if upload fails + requestService.createErrorCallback(function uploadFailed(error) { + + // Use provide status code if the error is coming from the stream + if (error.type === Error.Type.STREAM_ERROR) + ManagedFileTransferState.setStreamState(managedFileUpload.transferState, + ManagedFileTransferState.StreamState.ERROR, + error.statusCode); + + // Fail with internal error for all other causes + else + ManagedFileTransferState.setStreamState(managedFileUpload.transferState, + ManagedFileTransferState.StreamState.ERROR, + Guacamole.Status.Code.INTERNAL_ERROR); + + // Close the stream + stream.sendEnd(); + + })); + + // Ignore all further acks + stream.onack = null; + + + }; + + return managedFileUpload; + + }; + + return ManagedFileUpload; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedFilesystem.js b/guacamole/src/main/frontend/src/app/client/types/ManagedFilesystem.js new file mode 100644 index 0000000..a81fcb1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedFilesystem.js @@ -0,0 +1,340 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedFilesystem class used by ManagedClient to represent + * available remote filesystems. + */ +angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector', + function defineManagedFilesystem($rootScope, $injector) { + + // Required types + var tunnelService = $injector.get('tunnelService'); + + /** + * Object which serves as a surrogate interface, encapsulating a Guacamole + * filesystem object while it is active, allowing it to be detached and + * reattached from different client views. + * + * @constructor + * @param {ManagedFilesystem|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedFilesystem. + */ + var ManagedFilesystem = function ManagedFilesystem(template) { + + // Use empty object by default + template = template || {}; + + /** + * The client that originally received the "filesystem" instruction + * that resulted in the creation of this ManagedFilesystem. + * + * @type ManagedClient + */ + this.client = template.client; + + /** + * The Guacamole filesystem object, as received via a "filesystem" + * instruction. + * + * @type Guacamole.Object + */ + this.object = template.object; + + /** + * The declared, human-readable name of the filesystem + * + * @type String + */ + this.name = template.name; + + /** + * The root directory of the filesystem. + * + * @type ManagedFilesystem.File + */ + this.root = template.root; + + /** + * The current directory being viewed or manipulated within the + * filesystem. + * + * @type ManagedFilesystem.File + */ + this.currentDirectory = template.currentDirectory || template.root; + + }; + + /** + * Refreshes the contents of the given file, if that file is a directory. + * Only the immediate children of the file are refreshed. Files further + * down the directory tree are not refreshed. + * + * @param {ManagedFilesystem} filesystem + * The filesystem associated with the file being refreshed. + * + * @param {ManagedFilesystem.File} file + * The file being refreshed. + */ + ManagedFilesystem.refresh = function updateDirectory(filesystem, file) { + + // Do not attempt to refresh the contents of directories + if (file.mimetype !== Guacamole.Object.STREAM_INDEX_MIMETYPE) + return; + + // Request contents of given file + filesystem.object.requestInputStream(file.streamName, function handleStream(stream, mimetype) { + + // Ignore stream if mimetype is wrong + if (mimetype !== Guacamole.Object.STREAM_INDEX_MIMETYPE) { + stream.sendAck('Unexpected mimetype', Guacamole.Status.Code.UNSUPPORTED); + return; + } + + // Signal server that data is ready to be received + stream.sendAck('Ready', Guacamole.Status.Code.SUCCESS); + + // Read stream as JSON + var reader = new Guacamole.JSONReader(stream); + + // Acknowledge received JSON blobs + reader.onprogress = function onprogress() { + stream.sendAck("Received", Guacamole.Status.Code.SUCCESS); + }; + + // Reset contents of directory + reader.onend = function jsonReady() { + $rootScope.$evalAsync(function updateFileContents() { + + // Empty contents + file.files = {}; + + // Determine the expected filename prefix of each stream + var expectedPrefix = file.streamName; + if (expectedPrefix.charAt(expectedPrefix.length - 1) !== '/') + expectedPrefix += '/'; + + // For each received stream name + var mimetypes = reader.getJSON(); + for (var name in mimetypes) { + + // Assert prefix is correct + if (name.substring(0, expectedPrefix.length) !== expectedPrefix) + continue; + + // Extract filename from stream name + var filename = name.substring(expectedPrefix.length); + + // Deduce type from mimetype + var type = ManagedFilesystem.File.Type.NORMAL; + if (mimetypes[name] === Guacamole.Object.STREAM_INDEX_MIMETYPE) + type = ManagedFilesystem.File.Type.DIRECTORY; + + // Add file entry + file.files[filename] = new ManagedFilesystem.File({ + mimetype : mimetypes[name], + streamName : name, + type : type, + parent : file, + name : filename + }); + + } + + }); + }; + + }); + + }; + + /** + * Creates a new ManagedFilesystem instance from the given Guacamole.Object + * and human-readable name. Upon creation, a request to populate the + * contents of the root directory will be automatically dispatched. + * + * @param {ManagedClient} client + * The client that originally received the "filesystem" instruction + * that resulted in the creation of this ManagedFilesystem. + * + * @param {Guacamole.Object} object + * The Guacamole.Object defining the filesystem. + * + * @param {String} name + * A human-readable name for the filesystem. + * + * @returns {ManagedFilesystem} + * The newly-created ManagedFilesystem. + */ + ManagedFilesystem.getInstance = function getInstance(client, object, name) { + + // Init new filesystem object + var managedFilesystem = new ManagedFilesystem({ + client : client, + object : object, + name : name, + root : new ManagedFilesystem.File({ + mimetype : Guacamole.Object.STREAM_INDEX_MIMETYPE, + streamName : Guacamole.Object.ROOT_STREAM, + type : ManagedFilesystem.File.Type.DIRECTORY + }) + }); + + // Retrieve contents of root + ManagedFilesystem.refresh(managedFilesystem, managedFilesystem.root); + + return managedFilesystem; + + }; + + /** + * Downloads the given file from the server using the given Guacamole + * client and filesystem. The browser will automatically start the + * download upon completion of this function. + * + * @param {ManagedFilesystem} managedFilesystem + * The ManagedFilesystem from which the file is to be downloaded. Any + * path information provided must be relative to this filesystem. + * + * @param {String} path + * The full, absolute path of the file to download. + */ + ManagedFilesystem.downloadFile = function downloadFile(managedFilesystem, path) { + + // Request download + managedFilesystem.object.requestInputStream(path, function downloadStreamReceived(stream, mimetype) { + + // Parse filename from string + var filename = path.match(/(.*[\\/])?(.*)/)[2]; + + // Start download + tunnelService.downloadStream(managedFilesystem.client.tunnel.uuid, stream, mimetype, filename); + + }); + + }; + + /** + * Changes the current directory of the given filesystem, automatically + * refreshing the contents of that directory. + * + * @param {ManagedFilesystem} filesystem + * The filesystem whose current directory should be changed. + * + * @param {ManagedFilesystem.File} file + * The directory to change to. + */ + ManagedFilesystem.changeDirectory = function changeDirectory(filesystem, file) { + + // Refresh contents + ManagedFilesystem.refresh(filesystem, file); + + // Set current directory + filesystem.currentDirectory = file; + + }; + + /** + * A file within a ManagedFilesystem. Each ManagedFilesystem.File provides + * sufficient information for retrieval or replacement of the file's + * contents, as well as the file's name and type. + * + * @param {ManagedFilesystem|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedFilesystem.File. + */ + ManagedFilesystem.File = function File(template) { + + /** + * The mimetype of the data contained within this file. + * + * @type String + */ + this.mimetype = template.mimetype; + + /** + * The name of the stream representing this files contents within its + * associated filesystem object. + * + * @type String + */ + this.streamName = template.streamName; + + /** + * The type of this file. All legal file type strings are defined + * within ManagedFilesystem.File.Type. + * + * @type String + */ + this.type = template.type; + + /** + * The name of this file. + * + * @type String + */ + this.name = template.name; + + /** + * The parent directory of this file. In the case of the root + * directory, this will be null. + * + * @type ManagedFilesystem.File + */ + this.parent = template.parent; + + /** + * Map of all known files containined within this file by name. This is + * only applicable to directories. + * + * @type Object. + */ + this.files = template.files || {}; + + }; + + /** + * All legal type strings for a ManagedFilesystem.File. + * + * @type Object. + */ + ManagedFilesystem.File.Type = { + + /** + * A normal file. As ManagedFilesystem does not currently represent any + * other non-directory types of files, like symbolic links, this type + * string may be used for any non-directory file. + * + * @type String + */ + NORMAL : 'NORMAL', + + /** + * A directory. + * + * @type String + */ + DIRECTORY : 'DIRECTORY' + + }; + + return ManagedFilesystem; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedShareLink.js b/guacamole/src/main/frontend/src/app/client/types/ManagedShareLink.js new file mode 100644 index 0000000..6afa93d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedShareLink.js @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ManagedShareLink class used by ManagedClient to represent + * generated connection sharing links. + */ +angular.module('client').factory('ManagedShareLink', ['$injector', + function defineManagedShareLink($injector) { + + // Required types + var UserCredentials = $injector.get('UserCredentials'); + + /** + * Object which represents a link which can be used to gain access to an + * active Guacamole connection. + * + * @constructor + * @param {ManagedShareLink|Object} [template={}] + * The object whose properties should be copied within the new + * ManagedShareLink. + */ + var ManagedShareLink = function ManagedShareLink(template) { + + // Use empty object by default + template = template || {}; + + /** + * The human-readable display name of this share link. + * + * @type String + */ + this.name = template.name; + + /** + * The actual URL of the link which can be used to access the shared + * connection. + * + * @type String + */ + this.href = template.href; + + /** + * The sharing profile which was used to generate the share link. + * + * @type SharingProfile + */ + this.sharingProfile = template.sharingProfile; + + /** + * The credentials from which the share link was derived. + * + * @type UserCredentials + */ + this.sharingCredentials = template.sharingCredentials; + + }; + + /** + * Creates a new ManagedShareLink from a set of UserCredentials and the + * SharingProfile which was used to generate those UserCredentials. + * + * @param {SharingProfile} sharingProfile + * The SharingProfile which was used, via the REST API, to generate the + * given UserCredentials. + * + * @param {UserCredentials} sharingCredentials + * The UserCredentials object returned by the REST API in response to a + * request to share a connection using the given SharingProfile. + * + * @return {ManagedShareLink} + * A new ManagedShareLink object can be used to access the connection + * shared via the given SharingProfile and resulting UserCredentials. + */ + ManagedShareLink.getInstance = function getInstance(sharingProfile, sharingCredentials) { + + // Generate new share link using the given profile and credentials + return new ManagedShareLink({ + 'name' : sharingProfile.name, + 'href' : UserCredentials.getLink(sharingCredentials), + 'sharingProfile' : sharingProfile, + 'sharingCredentials' : sharingCredentials + }); + + }; + + return ManagedShareLink; + +}]); diff --git a/guacamole/src/main/frontend/src/app/client/types/TranslationResult.js b/guacamole/src/main/frontend/src/app/client/types/TranslationResult.js new file mode 100644 index 0000000..0a81511 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/client/types/TranslationResult.js @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the TranslationResult class used by the guacTranslate service. This class contains + * both the translated message and the translation ID that generated the message, in the case + * where it's unknown whether a translation is defined or not. + */ + angular.module('client').factory('TranslationResult', [function defineTranslationResult() { + + /** + * Object which represents the result of a translation as returned from + * the guacTranslate service. + * + * @constructor + * @param {TranslationResult|Object} [template={}] + * The object whose properties should be copied within the new + * TranslationResult. + */ + const TranslationResult = function TranslationResult(template) { + + // Use empty object by default + template = template || {}; + + /** + * The translation ID. + * + * @type {String} + */ + this.id = template.id; + + /** + * The translated message. + * + * @type {String} + */ + this.message = template.message; + + }; + + return TranslationResult; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/clipboard/clipboardModule.js b/guacamole/src/main/frontend/src/app/clipboard/clipboardModule.js new file mode 100644 index 0000000..b7528a4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/clipboard/clipboardModule.js @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code used to manipulate/observe the clipboard. + */ +angular.module('clipboard', []); diff --git a/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js b/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js new file mode 100644 index 0000000..315b08b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js @@ -0,0 +1,133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive provides an editor for the clipboard content maintained by + * clipboardService. Changes to the clipboard by clipboardService will + * automatically be reflected in the editor, and changes in the editor will + * automatically be reflected in the clipboard by clipboardService. + */ +angular.module('clipboard').directive('guacClipboard', ['$injector', + function guacClipboard($injector) { + + // Required types + const ClipboardData = $injector.get('ClipboardData'); + + // Required services + const $window = $injector.get('$window'); + const clipboardService = $injector.get('clipboardService'); + + /** + * Configuration object for the guacClipboard directive. + * + * @type Object. + */ + var config = { + restrict : 'E', + replace : true, + templateUrl : 'app/clipboard/templates/guacClipboard.html' + }; + + // guacClipboard directive controller + config.controller = ['$scope', '$injector', '$element', + function guacClipboardController($scope, $injector, $element) { + + /** + * The DOM element which will contain the clipboard contents within the + * user interface provided by this directive. We populate the clipboard + * editor via this DOM element rather than updating a model so that we + * are prepared for future support of rich text contents. + * + * @type {!Element} + */ + var element = $element[0].querySelectorAll('.clipboard')[0]; + + /** + * Whether clipboard contents should be displayed in the clipboard + * editor. If false, clipboard contents will not be displayed until + * the user manually reveals them. + * + * @type {!boolean} + */ + $scope.contentsShown = false; + + /** + * Reveals the contents of the clipboard editor, automatically + * assigning input focus to the editor if possible. + */ + $scope.showContents = function showContents() { + $scope.contentsShown = true; + $window.setTimeout(function setFocus() { + element.focus(); + }, 0); + }; + + /** + * Rereads the contents of the clipboard field, updating the + * ClipboardData object on the scope as necessary. The type of data + * stored within the ClipboardData object will be heuristically + * determined from the HTML contents of the clipboard field. + */ + var updateClipboardData = function updateClipboardData() { + + // Read contents of clipboard textarea + clipboardService.setClipboard(new ClipboardData({ + type : 'text/plain', + data : element.value + })); + + }; + + /** + * Updates the contents of the clipboard editor to the given data. + * + * @param {ClipboardData} data + * The ClipboardData to display within the clipboard editor for + * editing. + */ + const updateClipboardEditor = function updateClipboardEditor(data) { + + // If the clipboard data is a string, render it as text + if (typeof data.data === 'string') + element.value = data.data; + + // Ignore other data types for now + + }; + + // Update the internally-stored clipboard data when events are fired + // that indicate the clipboard field may have been changed + element.addEventListener('input', updateClipboardData); + element.addEventListener('change', updateClipboardData); + + // Update remote clipboard if local clipboard changes + $scope.$on('guacClipboard', function clipboardChanged(event, data) { + updateClipboardEditor(data); + }); + + // Init clipboard editor with current clipboard contents + clipboardService.getClipboard().then((data) => { + updateClipboardEditor(data); + }, angular.noop); + + }]; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/clipboard/services/clipboardService.js b/guacamole/src/main/frontend/src/app/clipboard/services/clipboardService.js new file mode 100644 index 0000000..4ec9d04 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/clipboard/services/clipboardService.js @@ -0,0 +1,625 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for maintaining and accessing clipboard data. If possible, this + * service will leverage the local clipboard. If the local clipboard is not + * available, an internal in-memory clipboard will be used instead. + */ +angular.module('clipboard').factory('clipboardService', ['$injector', + function clipboardService($injector) { + + // Get required services + const $q = $injector.get('$q'); + const $window = $injector.get('$window'); + const $rootScope = $injector.get('$rootScope'); + const sessionStorageFactory = $injector.get('sessionStorageFactory'); + + // Required types + const ClipboardData = $injector.get('ClipboardData'); + + /** + * Getter/setter which retrieves or sets the current stored clipboard + * contents. The stored clipboard contents are strictly internal to + * Guacamole, and may not reflect the local clipboard if local clipboard + * access is unavailable. + * + * @type Function + */ + const storedClipboardData = sessionStorageFactory.create(new ClipboardData()); + + var service = {}; + + /** + * The amount of time to wait before actually serving a request to read + * clipboard data, in milliseconds. Providing a reasonable delay between + * request and read attempt allows the cut/copy operation to settle, in + * case the data we are anticipating to be present is not actually present + * in the clipboard yet. + * + * @constant + * @type Number + */ + var CLIPBOARD_READ_DELAY = 100; + + /** + * The promise associated with the current pending clipboard read attempt. + * If no clipboard read is active, this will be null. + * + * @type Promise. + */ + var pendingRead = null; + + /** + * Reference to the window.document object. + * + * @private + * @type HTMLDocument + */ + var document = $window.document; + + /** + * The textarea that will be used to hold the local clipboard contents. + * + * @type Element + */ + var clipboardContent = document.createElement('textarea'); + + // Ensure clipboard target is selectable but not visible + clipboardContent.className = 'clipboard-service-target'; + + // Add clipboard target to DOM + document.body.appendChild(clipboardContent); + + /** + * Stops the propagation of the given event through the DOM tree. This is + * identical to invoking stopPropagation() on the event directly, except + * that this function is usable as an event handler itself. + * + * @param {Event} e + * The event whose propagation through the DOM tree should be stopped. + */ + var stopEventPropagation = function stopEventPropagation(e) { + e.stopPropagation(); + }; + + // Prevent events generated due to execCommand() from disturbing external things + clipboardContent.addEventListener('cut', stopEventPropagation); + clipboardContent.addEventListener('copy', stopEventPropagation); + clipboardContent.addEventListener('paste', stopEventPropagation); + clipboardContent.addEventListener('input', stopEventPropagation); + + /** + * A stack of past node selection ranges. A range convering the nodes + * currently selected within the document can be pushed onto this stack + * with pushSelection(), and the most recently pushed selection can be + * popped off the stack (and thus re-selected) with popSelection(). + * + * @type Range[] + */ + var selectionStack = []; + + /** + * Pushes the current selection range to the selection stack such that it + * can later be restored with popSelection(). + */ + var pushSelection = function pushSelection() { + + // Add a range representing the current selection to the stack + var selection = $window.getSelection(); + if (selection.getRangeAt && selection.rangeCount) + selectionStack.push(selection.getRangeAt(0)); + + }; + + /** + * Pops a selection range off the selection stack restoring the document's + * previous selection state. The selection range will be the most recent + * selection range pushed by pushSelection(). If there are no selection + * ranges currently on the stack, this function has no effect. + */ + var popSelection = function popSelection() { + + // Pull one selection range from the stack + var range = selectionStack.pop(); + if (!range) + return; + + // Replace any current selection with the retrieved selection + var selection = $window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + + }; + + /** + * Selects all nodes within the given element. This will replace the + * current selection with a new selection range that covers the element's + * contents. If the original selection should be preserved, use + * pushSelection() and popSelection(). + * + * @param {Element} element + * The element whose contents should be selected. + */ + var selectAll = function selectAll(element) { + + // Use the select() function defined for input elements, if available + if (element.select) + element.select(); + + // Fallback to manual manipulation of the selection + else { + + // Generate a range which selects all nodes within the given element + var range = document.createRange(); + range.selectNodeContents(element); + + // Replace any current selection with the generated range + var selection = $window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + + } + + }; + + /** + * Sets the local clipboard, if possible, to the given text. + * + * @param {ClipboardData} data + * The data to assign to the local clipboard should be set. + * + * @return {Promise} + * A promise that will resolve if setting the clipboard was successful, + * and will reject if it failed. + */ + const setLocalClipboard = function setLocalClipboard(data) { + + var deferred = $q.defer(); + + try { + + // Attempt to read the clipboard using the Asynchronous Clipboard + // API, if it's available + if (navigator.clipboard && navigator.clipboard.writeText) { + if (data.type === 'text/plain') { + navigator.clipboard.writeText(data.data).then(deferred.resolve, deferred.reject); + return deferred.promise; + } + } + + } + + // Ignore any hard failures to use Asynchronous Clipboard API, falling + // back to traditional document.execCommand() + catch (ignore) {} + + // Track the originally-focused element prior to changing focus + var originalElement = document.activeElement; + pushSelection(); + + // Copy the given value into the clipboard DOM element + if (typeof data.data === 'string') + clipboardContent.value = data.data; + else { + clipboardContent.innerHTML = ''; + var img = document.createElement('img'); + img.src = URL.createObjectURL(data.data); + clipboardContent.appendChild(img); + } + + // Select all data within the clipboard target + clipboardContent.focus(); + selectAll(clipboardContent); + + // Attempt to copy data from clipboard element into local clipboard + if (document.execCommand('copy')) + deferred.resolve(); + else + deferred.reject(); + + // Unfocus the clipboard DOM event to avoid mobile keyboard opening, + // restoring whichever element was originally focused + clipboardContent.blur(); + originalElement.focus(); + popSelection(); + + return deferred.promise; + }; + + /** + * Parses the given data URL, returning its decoded contents as a new Blob. + * If the URL is not a valid data URL, null will be returned instead. + * + * @param {String} url + * The data URL to parse. + * + * @returns {Blob} + * A new Blob containing the decoded contents of the data URL, or null + * if the URL is not a valid data URL. + */ + service.parseDataURL = function parseDataURL(url) { + + // Parse given string as a data URL + var result = /^data:([^;]*);base64,([a-zA-Z0-9+/]*[=]*)$/.exec(url); + if (!result) + return null; + + // Pull the mimetype and base64 contents of the data URL + var type = result[1]; + var data = $window.atob(result[2]); + + // Convert the decoded binary string into a typed array + var buffer = new Uint8Array(data.length); + for (var i = 0; i < data.length; i++) + buffer[i] = data.charCodeAt(i); + + // Produce a proper blob containing the data and type provided in + // the data URL + return new Blob([buffer], { type : type }); + + }; + + /** + * Returns the content of the given element as plain, unformatted text, + * preserving only individual characters and newlines. Formatting, images, + * etc. are not taken into account. + * + * @param {Element} element + * The element whose text content should be returned. + * + * @returns {String} + * The plain text contents of the given element, including newlines and + * spacing but otherwise without any formatting. + */ + service.getTextContent = function getTextContent(element) { + + var blocks = []; + var currentBlock = ''; + + // For each child of the given element + var current = element.firstChild; + while (current) { + + // Simply append the content of any text nodes + if (current.nodeType === Node.TEXT_NODE) + currentBlock += current.nodeValue; + + // Render
      as a newline character + else if (current.nodeName === 'BR') + currentBlock += '\n'; + + // Render as alt text, if available + else if (current.nodeName === 'IMG') + currentBlock += current.getAttribute('alt') || ''; + + // For all other nodes, handling depends on whether they are + // block-level elements + else { + + // If we are entering a new block context, start a new block if + // the current block is non-empty + if (currentBlock.length && $window.getComputedStyle(current).display === 'block') { + + // Trim trailing newline (would otherwise inflate the line count by 1) + if (currentBlock.substring(currentBlock.length - 1) === '\n') + currentBlock = currentBlock.substring(0, currentBlock.length - 1); + + // Finish current block and start a new block + blocks.push(currentBlock); + currentBlock = ''; + + } + + // Append the content of the current element to the current block + currentBlock += service.getTextContent(current); + + } + + current = current.nextSibling; + + } + + // Add any in-progress block + if (currentBlock.length) + blocks.push(currentBlock); + + // Combine all non-empty blocks, separated by newlines + return blocks.join('\n'); + + }; + + /** + * Replaces the current text content of the given element with the given + * text. To avoid affecting the position of the cursor within an editable + * element, or firing unnecessary DOM modification events, the underlying + * textContent property of the element is only touched if + * doing so would actually change the text. + * + * @param {Element} element + * The element whose text content should be changed. + * + * @param {String} text + * The text content to assign to the given element. + */ + service.setTextContent = function setTextContent(element, text) { + + // Strip out any images + $(element).find('img').remove(); + + // Reset text content only if doing so will actually change the content + if (service.getTextContent(element) !== text) + element.textContent = text; + + }; + + /** + * Returns the URL of the single image within the given element, if the + * element truly contains only one child and that child is an image. If the + * content of the element is mixed or not an image, null is returned. + * + * @param {Element} element + * The element whose image content should be retrieved. + * + * @returns {String} + * The URL of the image contained within the given element, if that + * element contains only a single child element which happens to be an + * image, or null if the content of the element is not purely an image. + */ + service.getImageContent = function getImageContent(element) { + + // Return the source of the single child element, if it is an image + var firstChild = element.firstChild; + if (firstChild && firstChild.nodeName === 'IMG' && !firstChild.nextSibling) + return firstChild.getAttribute('src'); + + // Otherwise, the content of this element is not simply an image + return null; + + }; + + /** + * Replaces the current contents of the given element with a single image + * having the given URL. To avoid affecting the position of the cursor + * within an editable element, or firing unnecessary DOM modification + * events, the content of the element is only touched if doing so would + * actually change content. + * + * @param {Element} element + * The element whose image content should be changed. + * + * @param {String} url + * The URL of the image which should be assigned as the contents of the + * given element. + */ + service.setImageContent = function setImageContent(element, url) { + + // Retrieve the URL of the current image contents, if any + var currentImage = service.getImageContent(element); + + // If the current contents are not the given image (or not an image + // at all), reassign the contents + if (currentImage !== url) { + + // Clear current contents + element.innerHTML = ''; + + // Add a new image as the sole contents of the element + var img = document.createElement('img'); + img.src = url; + element.appendChild(img); + + } + + }; + + /** + * Get the current value of the local clipboard. + * + * @return {Promise.} + * A promise that will resolve with the contents of the local clipboard + * if getting the clipboard was successful, and will reject if it + * failed. + */ + const getLocalClipboard = function getLocalClipboard() { + + // If the clipboard is already being read, do not overlap the read + // attempts; instead share the result across all requests + if (pendingRead) + return pendingRead; + + var deferred = $q.defer(); + + try { + + // Attempt to read the clipboard using the Asynchronous Clipboard + // API, if it's available + if (navigator.clipboard && navigator.clipboard.readText) { + + navigator.clipboard.readText().then(function textRead(text) { + deferred.resolve(new ClipboardData({ + type : 'text/plain', + data : text + })); + }, deferred.reject); + + return deferred.promise; + + } + + } + + // Ignore any hard failures to use Asynchronous Clipboard API, falling + // back to traditional document.execCommand() + catch (ignore) {} + + // Track the originally-focused element prior to changing focus + var originalElement = document.activeElement; + + /** + * Attempts to paste the clipboard contents into the + * currently-focused element. The promise related to the current + * attempt to read the clipboard will be resolved or rejected + * depending on whether the attempt to paste succeeds. + */ + var performPaste = function performPaste() { + + // Attempt paste local clipboard into clipboard DOM element + if (document.execCommand('paste')) { + + // If the pasted data is a single image, resolve with a blob + // containing that image + var currentImage = service.getImageContent(clipboardContent); + if (currentImage) { + + // Convert the image's data URL into a blob + var blob = service.parseDataURL(currentImage); + if (blob) { + deferred.resolve(new ClipboardData({ + type : blob.type, + data : blob + })); + } + + // Reject if conversion fails + else + deferred.reject(); + + } // end if clipboard is an image + + // Otherwise, assume the clipboard contains plain text + else + deferred.resolve(new ClipboardData({ + type : 'text/plain', + data : clipboardContent.value + })); + + } + + // Otherwise, reading from the clipboard has failed + else + deferred.reject(); + + }; + + // Mark read attempt as in progress, cleaning up event listener and + // selection once the paste attempt has completed + pendingRead = deferred.promise['finally'](function cleanupReadAttempt() { + + // Do not use future changes in focus + clipboardContent.removeEventListener('focus', performPaste); + + // Unfocus the clipboard DOM event to avoid mobile keyboard opening, + // restoring whichever element was originally focused + clipboardContent.blur(); + originalElement.focus(); + popSelection(); + + // No read is pending any longer + pendingRead = null; + + }); + + // Wait for the next event queue run before attempting to read + // clipboard data (in case the copy/cut has not yet completed) + $window.setTimeout(function deferredClipboardRead() { + + pushSelection(); + + // Ensure clipboard element is blurred (and that the "focus" event + // will fire) + clipboardContent.blur(); + clipboardContent.addEventListener('focus', performPaste); + + // Clear and select the clipboard DOM element + clipboardContent.value = ''; + clipboardContent.focus(); + selectAll(clipboardContent); + + // If focus failed to be set, we cannot read the clipboard + if (document.activeElement !== clipboardContent) + deferred.reject(); + + }, CLIPBOARD_READ_DELAY); + + return pendingRead; + + }; + + /** + * Returns the current value of the internal clipboard shared across all + * active Guacamole connections running within the current browser tab. If + * access to the local clipboard is available, the internal clipboard is + * first synchronized with the current local clipboard contents. If access + * to the local clipboard is unavailable, only the internal clipboard will + * be used. + * + * @return {Promise.} + * A promise that will resolve with the contents of the internal + * clipboard, first retrieving those contents from the local clipboard + * if permission to do so has been granted. This promise is always + * resolved. + */ + service.getClipboard = function getClipboard() { + return getLocalClipboard().then((data) => storedClipboardData(data), () => storedClipboardData()); + }; + + /** + * Sets the content of the internal clipboard shared across all active + * Guacamole connections running within the current browser tab. If + * access to the local clipboard is available, the local clipboard is + * first set to the provided clipboard content. If access to the local + * clipboard is unavailable, only the internal clipboard will be used. A + * "guacClipboard" event will be broadcast with the assigned data once the + * operation has completed. + * + * @param {ClipboardData} data + * The data to assign to the clipboard. + * + * @return {Promise} + * A promise that will resolve after the clipboard content has been + * set. This promise is always resolved. + */ + service.setClipboard = function setClipboard(data) { + return setLocalClipboard(data)['catch'](angular.noop).finally(() => { + + // Update internal clipboard and broadcast event notifying of + // updated contents + storedClipboardData(data); + $rootScope.$broadcast('guacClipboard', data); + + }); + }; + + /** + * Resynchronizes the local and internal clipboards, setting the contents + * of the internal clipboard to that of the local clipboard (if local + * clipboard access is granted) and broadcasting a "guacClipboard" event + * with the current internal clipboard contents for consumption by external + * components like the "guacClient" directive. + */ + service.resyncClipboard = function resyncClipboard() { + getLocalClipboard().then(function clipboardRead(data) { + return service.setClipboard(data); + }, angular.noop); + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css b/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css new file mode 100644 index 0000000..cec0c26 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.clipboard, .clipboard-service-target { + background: white; +} + +.clipboard { + position: relative; + border: 1px solid #AAA; + -moz-border-radius: 0.25em; + -webkit-border-radius: 0.25em; + -khtml-border-radius: 0.25em; + border-radius: 0.25em; + width: 100%; + height: 2in; + white-space: pre; + padding: 0.25em; +} + +.clipboard p, +.clipboard div { + margin: 0; +} + +.clipboard img { + max-width: 100%; + max-height: 100%; + display: block; + margin: 0 auto; + border: 1px solid black; + background: url('images/checker.svg'); +} + +.clipboard-service-target { + position: fixed; + left: -1em; + right: -1em; + width: 1em; + height: 1em; + white-space: pre; + overflow: hidden; +} + +.clipboard-editor { + position: relative; +} + +.clipboard-editor .clipboard { + overflow: auto; + font-size: 1em; +} + +.clipboard-editor .clipboard.clipboard-contents-hidden { + color: transparent; + overflow: hidden; +} + +.clipboard-editor .clipboard-contents-hidden-hint { + + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + + cursor: pointer; + + display: flex; + align-items: center; + +} + +.clipboard-editor .clipboard-contents-hidden-hint .clipboard-contents-hidden-hint-text { + + flex: 1; + + background: rgba(0, 0, 0, 0.125); + color: #888; + + padding: 0.5em; + overflow: hidden; + font-size: 0.9em; + text-align: center; + font-style: italic; + +} + +.clipboard-editor .clipboard-contents-hidden-hint:hover .clipboard-contents-hidden-hint-text { + text-decoration: underline; +} diff --git a/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html b/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html new file mode 100644 index 0000000..159ee35 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html @@ -0,0 +1,12 @@ +
      + +
      +

      {{ 'CLIENT.ACTION_SHOW_CLIPBOARD' | translate }}

      +
      +
      diff --git a/guacamole/src/main/frontend/src/app/clipboard/types/ClipboardData.js b/guacamole/src/main/frontend/src/app/clipboard/types/ClipboardData.js new file mode 100644 index 0000000..34f699a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/clipboard/types/ClipboardData.js @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ClipboardData class used for interchange between the + * guacClipboard directive, clipboardService service, etc. + */ +angular.module('clipboard').factory('ClipboardData', [function defineClipboardData() { + + /** + * Arbitrary data which can be contained by the clipboard. + * + * @constructor + * @param {ClipboardData|Object} [template={}] + * The object whose properties should be copied within the new + * ClipboardData. + */ + var ClipboardData = function ClipboardData(template) { + + // Use empty object by default + template = template || {}; + + /** + * The ID of the ManagedClient handling the remote desktop connection + * that originated this clipboard data, or null if the data originated + * from the clipboard editor or local clipboard. + * + * @type {string} + */ + this.source = template.source; + + /** + * The mimetype of the data currently stored within the clipboard. + * + * @type String + */ + this.type = template.type || 'text/plain'; + + /** + * The data currently stored within the clipboard. Depending on the + * nature of the stored data, this may be either a String, a Blob, or a + * File. + * + * @type String|Blob|File + */ + this.data = template.data || ''; + + }; + + return ClipboardData; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacClick.js b/guacamole/src/main/frontend/src/app/element/directives/guacClick.js new file mode 100644 index 0000000..0847d3c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacClick.js @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides handling of click and click-like touch events. + * The state of Shift and Ctrl modifiers is tracked through these click events + * to allow for specific handling of Shift+Click and Ctrl+Click. + */ +angular.module('element').directive('guacClick', [function guacClick() { + + return { + restrict: 'A', + + link: function linkGuacClick($scope, $element, $attrs) { + + /** + * A callback that is invoked by the guacClick directive when a + * click or click-like event is received. + * + * @callback guacClick~callback + * @param {boolean} shift + * Whether Shift was held down at the time the click occurred. + * + * @param {boolean} ctrl + * Whether Ctrl or Meta (the Mac "Command" key) was held down + * at the time the click occurred. + */ + + /** + * The callback to invoke when a click or click-like event is + * received on the associated element. + * + * @type guacClick~callback + */ + const guacClick = $scope.$eval($attrs.guacClick); + + /** + * The element which will register the click. + * + * @type Element + */ + const element = $element[0]; + + /** + * Whether either Shift key is currently pressed. + * + * @type boolean + */ + let shift = false; + + /** + * Whether either Ctrl key is currently pressed. To allow the + * Command key to be used on Mac platforms, this flag also + * considers the state of either Meta key. + * + * @type boolean + */ + let ctrl = false; + + /** + * Updates the state of the {@link shift} and {@link ctrl} flags + * based on which keys are currently marked as held down by the + * given Guacamole.Keyboard. + * + * @param {Guacamole.Keyboard} keyboard + * The Guacamole.Keyboard instance to read key states from. + */ + const updateModifiers = function updateModifiers(keyboard) { + + shift = !!( + keyboard.pressed[0xFFE1] // Left shift + || keyboard.pressed[0xFFE2] // Right shift + ); + + ctrl = !!( + keyboard.pressed[0xFFE3] // Left ctrl + || keyboard.pressed[0xFFE4] // Right ctrl + || keyboard.pressed[0xFFE7] // Left meta (command) + || keyboard.pressed[0xFFE8] // Right meta (command) + ); + + }; + + // Update tracking of modifier states for each key press + $scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) { + updateModifiers(keyboard); + }); + + // Update tracking of modifier states for each key release + $scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) { + updateModifiers(keyboard); + }); + + // Fire provided callback for each mouse-initiated "click" event ... + element.addEventListener('click', function elementClicked(e) { + if (element.contains(e.target)) + $scope.$apply(() => guacClick(shift, ctrl)); + }); + + // ... and for touch-initiated click-like events + element.addEventListener('touchstart', function elementClicked(e) { + if (element.contains(e.target)) + $scope.$apply(() => guacClick(shift, ctrl)); + }); + + } // end guacClick link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacDrop.js b/guacamole/src/main/frontend/src/app/element/directives/guacDrop.js new file mode 100644 index 0000000..3f70706 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacDrop.js @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which allows multiple files to be uploaded. Dragging files onto + * the associated element will call the provided callback function with any + * dragged files. + */ +angular.module('element').directive('guacDrop', ['$injector', function guacDrop($injector) { + + // Required services + const guacNotification = $injector.get('guacNotification'); + + return { + restrict: 'A', + + link: function linkGuacDrop($scope, $element, $attrs) { + + /** + * The function to call whenever files are dragged. The callback is + * provided a single parameter: the FileList containing all dragged + * files. + * + * @type Function + */ + const guacDrop = $scope.$eval($attrs.guacDrop); + + /** + * Any number of space-seperated classes to be applied to the + * element a drop is pending: when the user has dragged something + * over the element, but not yet dropped. These classes will be + * removed when a drop is not pending. + * + * @type String + */ + const guacDraggedClass = $scope.$eval($attrs.guacDraggedClass); + + /** + * Whether upload of multiple files should be allowed. If false, an + * error will be displayed explaining the restriction, otherwise + * any number of files may be dragged. Defaults to true if not set. + * + * @type Boolean + */ + const guacMultiple = 'guacMultiple' in $attrs + ? $scope.$eval($attrs.guacMultiple) : true; + + /** + * The element which will register drag event. + * + * @type Element + */ + const element = $element[0]; + + /** + * Applies any classes provided in the guacDraggedClass attribute. + * Further propagation and default behavior of the given event is + * automatically prevented. + * + * @param {Event} e + * The event related to the in-progress drag/drop operation. + */ + const notifyDragStart = function notifyDragStart(e) { + + e.preventDefault(); + e.stopPropagation(); + + // Skip further processing if no classes were provided + if (!guacDraggedClass) + return; + + // Add each provided class + guacDraggedClass.split(' ').forEach(classToApply => + element.classList.add(classToApply)); + + }; + + /** + * Removes any classes provided in the guacDraggedClass attribute. + * Further propagation and default behavior of the given event is + * automatically prevented. + * + * @param {Event} e + * The event related to the end of the drag/drop operation. + */ + const notifyDragEnd = function notifyDragEnd(e) { + + e.preventDefault(); + e.stopPropagation(); + + // Skip further processing if no classes were provided + if (!guacDraggedClass) + return; + + // Remove each provided class + guacDraggedClass.split(' ').forEach(classToRemove => + element.classList.remove(classToRemove)); + + }; + + // Add listeners to the drop target to ensure that the visual state + // stays up to date + element.addEventListener('dragenter', notifyDragStart); + element.addEventListener('dragover', notifyDragStart); + element.addEventListener('dragleave', notifyDragEnd); + + /** + * Event listener that will be invoked if the user drops anything + * onto the event. If a valid file is provided, the onFile callback + * provided to this directive will be called; otherwise an error + * will be displayed, if appropriate. + * + * @param {Event} e + * The drop event that triggered this handler. + */ + element.addEventListener('drop', e => { + + notifyDragEnd(e); + + const files = e.dataTransfer.files; + + // Ignore any non-files that are dragged into the drop area + if (files.length < 1) + return; + + // If multi-file upload is disabled, If more than one file was + // provided, print an error explaining the problem + if (!guacMultiple && files.length >= 2) { + + guacNotification.showStatus({ + className : 'error', + title : 'APP.DIALOG_HEADER_ERROR', + text: { key : 'APP.ERROR_SINGLE_FILE_ONLY'}, + + // Add a button to hide the error + actions : [{ + name : 'APP.ACTION_ACKNOWLEDGE', + callback : () => guacNotification.showStatus(false) + }] + }); + return; + + } + + // Invoke the callback with the files. Note that if guacMultiple + // is set to false, this will always be a single file. + guacDrop(files); + + }); + + } // end guacDrop link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacFocus.js b/guacamole/src/main/frontend/src/app/element/directives/guacFocus.js new file mode 100644 index 0000000..5087e7f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacFocus.js @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which allows elements to be manually focused / blurred. + */ +angular.module('element').directive('guacFocus', ['$injector', function guacFocus($injector) { + + // Required services + var $parse = $injector.get('$parse'); + var $timeout = $injector.get('$timeout'); + + return { + restrict: 'A', + + link: function linkGuacFocus($scope, $element, $attrs) { + + /** + * Whether the element associated with this directive should be + * focussed. + * + * @type Boolean + */ + var guacFocus = $parse($attrs.guacFocus); + + /** + * The element which will be focused / blurred. + * + * @type Element + */ + var element = $element[0]; + + // Set/unset focus depending on value of guacFocus + $scope.$watch(guacFocus, function updateFocus(value) { + $timeout(function updateFocusAfterRender() { + if (value) + element.focus(); + else + element.blur(); + }); + }); + + } // end guacFocus link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacMarker.js b/guacamole/src/main/frontend/src/app/element/directives/guacMarker.js new file mode 100644 index 0000000..3ca15bd --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacMarker.js @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which stores a marker which refers to a specific element, + * allowing that element to be scrolled into view when desired. + */ +angular.module('element').directive('guacMarker', ['$injector', function guacMarker($injector) { + + // Required types + var Marker = $injector.get('Marker'); + + // Required services + var $parse = $injector.get('$parse'); + + return { + restrict: 'A', + + link: function linkGuacMarker($scope, $element, $attrs) { + + /** + * The property in which a new Marker should be stored. The new + * Marker will refer to the element associated with this directive. + * + * @type Marker + */ + var guacMarker = $parse($attrs.guacMarker); + + /** + * The element to associate with the new Marker. + * + * @type Element + */ + var element = $element[0]; + + // Assign new marker + guacMarker.assign($scope, new Marker(element)); + + } + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacResize.js b/guacamole/src/main/frontend/src/app/element/directives/guacResize.js new file mode 100644 index 0000000..0d8794a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacResize.js @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which calls a given callback when its associated element is + * resized. This will modify the internal DOM tree of the associated element, + * and the associated element MUST have position (for example, + * "position: relative"). + */ +angular.module('element').directive('guacResize', ['$document', function guacResize($document) { + + return { + restrict: 'A', + + link: function linkGuacResize($scope, $element, $attrs) { + + /** + * The function to call whenever the associated element is + * resized. The function will be passed the width and height of + * the element, in pixels. + * + * @type Function + */ + var guacResize = $scope.$eval($attrs.guacResize); + + /** + * The element which will monitored for size changes. + * + * @type Element + */ + var element = $element[0]; + + /** + * The resize sensor - an HTML object element. + * + * @type HTMLObjectElement + */ + var resizeSensor = $document[0].createElement('object'); + + /** + * The width of the associated element, in pixels. + * + * @type Number + */ + var lastWidth = element.offsetWidth; + + /** + * The height of the associated element, in pixels. + * + * @type Number + */ + var lastHeight = element.offsetHeight; + + /** + * Checks whether the size of the associated element has changed + * and, if so, calls the resize callback with the new width and + * height as parameters. + */ + var checkSize = function checkSize() { + + // Call callback only if size actually changed + if (element.offsetWidth !== lastWidth + || element.offsetHeight !== lastHeight) { + + // Call resize callback, if defined + if (guacResize) { + $scope.$evalAsync(function elementSizeChanged() { + guacResize(element.offsetWidth, element.offsetHeight); + }); + } + + // Update stored size + lastWidth = element.offsetWidth; + lastHeight = element.offsetHeight; + + } + + }; + + // Register event listener once window object exists + resizeSensor.onload = function resizeSensorReady() { + resizeSensor.contentDocument.defaultView.addEventListener('resize', checkSize); + checkSize(); + }; + + // Load blank contents + resizeSensor.className = 'resize-sensor'; + resizeSensor.type = 'text/html'; + resizeSensor.data = 'app/element/templates/blank.html'; + + // Add resize sensor to associated element + element.insertBefore(resizeSensor, element.firstChild); + + } // end guacResize link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacScroll.js b/guacamole/src/main/frontend/src/app/element/directives/guacScroll.js new file mode 100644 index 0000000..630897d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacScroll.js @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which allows elements to be manually scrolled, and for their + * scroll state to be observed. + */ +angular.module('element').directive('guacScroll', [function guacScroll() { + + return { + restrict: 'A', + + link: function linkGuacScroll($scope, $element, $attrs) { + + /** + * The current scroll state of the element. + * + * @type ScrollState + */ + var guacScroll = $scope.$eval($attrs.guacScroll); + + /** + * The element which is being scrolled, or monitored for changes + * in scroll. + * + * @type Element + */ + var element = $element[0]; + + /** + * Returns the current left edge of the scrolling rectangle. + * + * @returns {Number} + * The current left edge of the scrolling rectangle. + */ + var getScrollLeft = function getScrollLeft() { + return guacScroll.left; + }; + + /** + * Returns the current top edge of the scrolling rectangle. + * + * @returns {Number} + * The current top edge of the scrolling rectangle. + */ + var getScrollTop = function getScrollTop() { + return guacScroll.top; + }; + + // Update underlying scrollLeft property when left changes + $scope.$watch(getScrollLeft, function scrollLeftChanged(left) { + element.scrollLeft = left; + guacScroll.left = element.scrollLeft; + }); + + // Update underlying scrollTop property when top changes + $scope.$watch(getScrollTop, function scrollTopChanged(top) { + element.scrollTop = top; + guacScroll.top = element.scrollTop; + }); + + } // end guacScroll link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/directives/guacUpload.js b/guacamole/src/main/frontend/src/app/element/directives/guacUpload.js new file mode 100644 index 0000000..d1c10a9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/directives/guacUpload.js @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which allows files to be uploaded. Clicking on the associated + * element will result in a file selector dialog, which then calls the provided + * callback function with any chosen files. + */ +angular.module('element').directive('guacUpload', ['$document', function guacUpload($document) { + + return { + restrict: 'A', + + link: function linkGuacUpload($scope, $element, $attrs) { + + /** + * The function to call whenever files are chosen. The callback is + * provided a single parameter: the FileList containing all chosen + * files. + * + * @type Function + */ + const guacUpload = $scope.$eval($attrs.guacUpload); + + /** + * Whether upload of multiple files should be allowed. If false, the + * file dialog will only allow a single file to be chosen at once, + * otherwise any number of files may be chosen. Defaults to true if + * not set. + * + * @type Boolean + */ + const guacMultiple = 'guacMultiple' in $attrs + ? $scope.$eval($attrs.guacMultiple) : true; + + /** + * The element which will register the click. + * + * @type Element + */ + const element = $element[0]; + + /** + * Internal form, containing a single file input element. + * + * @type HTMLFormElement + */ + const form = $document[0].createElement('form'); + + /** + * Internal file input element. + * + * @type HTMLInputElement + */ + const input = $document[0].createElement('input'); + + // Init input element + input.type = 'file'; + input.multiple = guacMultiple; + + // Add input element to internal form + form.appendChild(input); + + // Notify of any chosen files + input.addEventListener('change', function filesSelected() { + $scope.$apply(function setSelectedFiles() { + + // Only set chosen files selection is not canceled + if (guacUpload && input.files.length > 0) + guacUpload(input.files); + + // Reset selection + form.reset(); + + }); + }); + + // Open file chooser when element is clicked + element.addEventListener('click', function elementClicked() { + input.click(); + }); + + } // end guacUpload link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/elementModule.js b/guacamole/src/main/frontend/src/app/element/elementModule.js new file mode 100644 index 0000000..0b564fb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/elementModule.js @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for manipulating element state, such as focus or scroll position, as + * well as handling browser events. + */ +angular.module('element', []); diff --git a/guacamole/src/main/frontend/src/app/element/styles/resize-sensor.css b/guacamole/src/main/frontend/src/app/element/styles/resize-sensor.css new file mode 100644 index 0000000..9f308eb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/styles/resize-sensor.css @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.resize-sensor { + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + overflow: hidden; + border: none; + opacity: 0; + z-index: -1; +} diff --git a/guacamole/src/main/frontend/src/app/element/templates/blank.html b/guacamole/src/main/frontend/src/app/element/templates/blank.html new file mode 100644 index 0000000..47dc938 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/templates/blank.html @@ -0,0 +1,8 @@ + + + + + _ + + + diff --git a/guacamole/src/main/frontend/src/app/element/types/Marker.js b/guacamole/src/main/frontend/src/app/element/types/Marker.js new file mode 100644 index 0000000..c1b47ac --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/types/Marker.js @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the Marker class definition. + */ +angular.module('element').factory('Marker', [function defineMarker() { + + /** + * Creates a new Marker which allows its associated element to be scolled + * into view as desired. + * + * @constructor + * @param {Element} element + * The element to associate with this marker. + */ + var Marker = function Marker(element) { + + /** + * Scrolls scrollable elements, or the window, as needed to bring the + * element associated with this marker into view. + */ + this.scrollIntoView = function scrollIntoView() { + element.scrollIntoView(); + }; + + }; + + return Marker; + +}]); diff --git a/guacamole/src/main/frontend/src/app/element/types/ScrollState.js b/guacamole/src/main/frontend/src/app/element/types/ScrollState.js new file mode 100644 index 0000000..8956243 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/element/types/ScrollState.js @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ScrollState class definition. + */ +angular.module('element').factory('ScrollState', [function defineScrollState() { + + /** + * Creates a new ScrollState, representing the current scroll position of + * an arbitrary element. This constructor initializes the properties of the + * new ScrollState with the corresponding properties of the given template. + * + * @constructor + * @param {ScrollState|Object} [template={}] + * The object whose properties should be copied within the new + * ScrollState. + */ + var ScrollState = function ScrollState(template) { + + // Use empty object by default + template = template || {}; + + /** + * The left edge of the view rectangle within the scrollable area. This + * value naturally increases as the user scrolls right. + * + * @type Number + */ + this.left = template.left || 0; + + /** + * The top edge of the view rectangle within the scrollable area. This + * value naturally increases as the user scrolls down. + * + * @type Number + */ + this.top = template.top || 0; + + }; + + return ScrollState; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/checkboxFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/checkboxFieldController.js new file mode 100644 index 0000000..bb2676c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/checkboxFieldController.js @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for checkbox fields. + */ +angular.module('form').controller('checkboxFieldController', ['$scope', + function checkboxFieldController($scope) { + + // Update typed value when model is changed + $scope.$watch('model', function modelChanged(model) { + $scope.typedValue = (model === $scope.field.options[0]); + }); + + // Update string value in model when typed value is changed + $scope.$watch('typedValue', function typedValueChanged(typedValue) { + $scope.model = (typedValue ? $scope.field.options[0] : ''); + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/dateFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/dateFieldController.js new file mode 100644 index 0000000..31d85a8 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/dateFieldController.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for date fields. + */ +angular.module('form').controller('dateFieldController', ['$scope', '$injector', + function dateFieldController($scope, $injector) { + + // Required services + var $filter = $injector.get('$filter'); + + /** + * Options which dictate the behavior of the input field model, as defined + * by https://docs.angularjs.org/api/ng/directive/ngModelOptions + * + * @type Object. + */ + $scope.modelOptions = { + + /** + * Space-delimited list of events on which the model will be updated. + * + * @type String + */ + updateOn : 'blur', + + /** + * The time zone to use when reading/writing the Date object of the + * model. + * + * @type String + */ + timezone : 'UTC' + + }; + + /** + * Parses the date components of the given string into a Date with only the + * date components set. The resulting Date will be in the UTC timezone, + * with the time left as midnight. The input string must be in the format + * YYYY-MM-DD (zero-padded). + * + * @param {String} str + * The date string to parse. + * + * @returns {Date} + * A Date object, in the UTC timezone, with only the date components + * set. + */ + var parseDate = function parseDate(str) { + + // Parse date, return blank if invalid + var parsedDate = new Date(str + 'T00:00Z'); + if (isNaN(parsedDate.getTime())) + return null; + + return parsedDate; + + }; + + // Update typed value when model is changed + $scope.$watch('model', function modelChanged(model) { + $scope.typedValue = (model ? parseDate(model) : null); + }); + + // Update string value in model when typed value is changed + $scope.$watch('typedValue', function typedValueChanged(typedValue) { + $scope.model = (typedValue ? $filter('date')(typedValue, 'yyyy-MM-dd', 'UTC') : ''); + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/languageFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/languageFieldController.js new file mode 100644 index 0000000..b7669ff --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/languageFieldController.js @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for the language field type. The language field type allows the + * user to select a language from the set of languages supported by the + * Guacamole web application. + */ +angular.module('form').controller('languageFieldController', ['$scope', '$injector', + function languageFieldController($scope, $injector) { + + // Required services + var languageService = $injector.get('languageService'); + var requestService = $injector.get('requestService'); + + /** + * A map of all available language keys to their human-readable + * names. + * + * @type Object. + */ + $scope.languages = null; + + // Retrieve defined languages + languageService.getLanguages().then(function languagesRetrieved(languages) { + $scope.languages = languages; + }, requestService.DIE); + + // Interpret undefined/null as empty string + $scope.$watch('model', function setModel(model) { + if (!model && model !== '') + $scope.model = ''; + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/numberFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/numberFieldController.js new file mode 100644 index 0000000..02da81b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/numberFieldController.js @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for number fields. + */ +angular.module('form').controller('numberFieldController', ['$scope', + function numberFieldController($scope) { + + // Update typed value when model is changed + $scope.$watch('model', function modelChanged(model) { + $scope.typedValue = (model ? Number(model) : null); + }); + + // Update string value in model when typed value is changed + $scope.$watch('typedValue', function typedValueChanged(typedValue) { + $scope.model = ((typedValue || typedValue === 0) ? typedValue.toString() : ''); + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/passwordFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/passwordFieldController.js new file mode 100644 index 0000000..0725eb4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/passwordFieldController.js @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for password fields. + */ +angular.module('form').controller('passwordFieldController', ['$scope', + function passwordFieldController($scope) { + + /** + * The type to use for the input field. By default, the input field will + * have the type 'password', and thus will be masked. + * + * @type String + * @default 'password' + */ + $scope.passwordInputType = 'password'; + + /** + * Returns a string which describes the action the next call to + * togglePassword() will have. + * + * @return {String} + * A string which describes the action the next call to + * togglePassword() will have. + */ + $scope.getTogglePasswordHelpText = function getTogglePasswordHelpText() { + + // If password is hidden, togglePassword() will show the password + if ($scope.passwordInputType === 'password') + return 'FORM.HELP_SHOW_PASSWORD'; + + // If password is shown, togglePassword() will hide the password + return 'FORM.HELP_HIDE_PASSWORD'; + + }; + + /** + * Toggles visibility of the field contents, if this field is a + * password field. Initially, password contents are masked + * (invisible). + */ + $scope.togglePassword = function togglePassword() { + + // If password is hidden, show the password + if ($scope.passwordInputType === 'password') + $scope.passwordInputType = 'text'; + + // If password is shown, hide the password + else + $scope.passwordInputType = 'password'; + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/redirectFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/redirectFieldController.js new file mode 100644 index 0000000..3ec9326 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/redirectFieldController.js @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Controller for the redirect field, which redirects the user to the provided + * URL. + */ +angular.module('form').controller('redirectFieldController', ['$scope','$window', + function redirectFieldController($scope,$window) { + + /** + * Redirect the user to the provided URL. + */ + $window.location.href = $scope.field.redirectUrl; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/selectFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/selectFieldController.js new file mode 100644 index 0000000..e780378 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/selectFieldController.js @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for select fields. + */ +angular.module('form').controller('selectFieldController', ['$scope', '$injector', + function selectFieldController($scope, $injector) { + + // Interpret undefined/null as empty string + $scope.$watch('model', function setModel(model) { + if (!model && model !== '') + $scope.model = ''; + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/terminalColorSchemeFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/terminalColorSchemeFieldController.js new file mode 100644 index 0000000..fb85a50 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/terminalColorSchemeFieldController.js @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for terminal color scheme fields. + */ +angular.module('form').controller('terminalColorSchemeFieldController', ['$scope', '$injector', + function terminalColorSchemeFieldController($scope, $injector) { + + // Required types + var ColorScheme = $injector.get('ColorScheme'); + + /** + * The currently selected color scheme. If a pre-defined color scheme is + * selected, this will be the connection parameter value associated with + * that color scheme. If a custom color scheme is selected, this will be + * the string "custom". + * + * @type String + */ + $scope.selectedColorScheme = ''; + + /** + * The current custom color scheme, if a custom color scheme has been + * specified. If no custom color scheme has yet been specified, this will + * be a ColorScheme instance that has been initialized to the default + * colors. + * + * @type ColorScheme + */ + $scope.customColorScheme = new ColorScheme(); + + /** + * The array of colors to include within the color picker as pre-defined + * options for convenience. + * + * @type String[] + */ + $scope.defaultPalette = new ColorScheme().colors; + + /** + * Whether the raw details of the custom color scheme should be shown. By + * default, such details are hidden. + * + * @type Boolean + */ + $scope.detailsShown = false; + + /** + * The palette indices of all colors which are considered low-intensity. + * + * @type Number[] + */ + $scope.lowIntensity = [ 0, 1, 2, 3, 4, 5, 6, 7 ]; + + /** + * The palette indices of all colors which are considered high-intensity. + * + * @type Number[] + */ + $scope.highIntensity = [ 8, 9, 10, 11, 12, 13, 14, 15 ]; + + /** + * The string value which is assigned to selectedColorScheme if a custom + * color scheme is selected. + * + * @constant + * @type String + */ + var CUSTOM_COLOR_SCHEME = 'custom'; + + /** + * Returns whether a custom color scheme has been selected. + * + * @returns {Boolean} + * true if a custom color scheme has been selected, false otherwise. + */ + $scope.isCustom = function isCustom() { + return $scope.selectedColorScheme === CUSTOM_COLOR_SCHEME; + }; + + /** + * Shows the raw details of the custom color scheme. If the details are + * already shown, this function has no effect. + */ + $scope.showDetails = function showDetails() { + $scope.detailsShown = true; + }; + + /** + * Hides the raw details of the custom color scheme. If the details are + * already hidden, this function has no effect. + */ + $scope.hideDetails = function hideDetails() { + $scope.detailsShown = false; + }; + + // Keep selected color scheme and custom color scheme in sync with changes + // to model + $scope.$watch('model', function modelChanged(model) { + if ($scope.selectedColorScheme === CUSTOM_COLOR_SCHEME || (model && !_.includes($scope.field.options, model))) { + $scope.customColorScheme = ColorScheme.fromString(model); + $scope.selectedColorScheme = CUSTOM_COLOR_SCHEME; + } + else + $scope.selectedColorScheme = model || ''; + }); + + // Keep model in sync with changes to selected color scheme + $scope.$watch('selectedColorScheme', function selectedColorSchemeChanged(selectedColorScheme) { + if (!selectedColorScheme) + $scope.model = ''; + else if (selectedColorScheme === CUSTOM_COLOR_SCHEME) + $scope.model = ColorScheme.toString($scope.customColorScheme); + else + $scope.model = selectedColorScheme; + }); + + // Keep model in sync with changes to custom color scheme + $scope.$watch('customColorScheme', function customColorSchemeChanged(customColorScheme) { + if ($scope.selectedColorScheme === CUSTOM_COLOR_SCHEME) + $scope.model = ColorScheme.toString(customColorScheme); + }, true); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/textFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/textFieldController.js new file mode 100644 index 0000000..8dd134a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/textFieldController.js @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for text fields. + */ +angular.module('form').controller('textFieldController', ['$scope', '$injector', + function textFieldController($scope, $injector) { + + /** + * The ID of the datalist element that should be associated with the text + * field, providing a set of known-good values. If no such values are + * defined, this will be null. + * + * @type String + */ + $scope.dataListId = null; + + // Generate unique ID for datalist, if applicable + if ($scope.field.options && $scope.field.options.length) + $scope.dataListId = $scope.fieldId + '-datalist'; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/timeFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/timeFieldController.js new file mode 100644 index 0000000..174ec60 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/timeFieldController.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for time fields. + */ +angular.module('form').controller('timeFieldController', ['$scope', '$injector', + function timeFieldController($scope, $injector) { + + // Required services + var $filter = $injector.get('$filter'); + + /** + * Options which dictate the behavior of the input field model, as defined + * by https://docs.angularjs.org/api/ng/directive/ngModelOptions + * + * @type Object. + */ + $scope.modelOptions = { + + /** + * Space-delimited list of events on which the model will be updated. + * + * @type String + */ + updateOn : 'blur', + + /** + * The time zone to use when reading/writing the Date object of the + * model. + * + * @type String + */ + timezone : 'UTC' + + }; + + /** + * Parses the time components of the given string into a Date with only the + * time components set. The resulting Date will be in the UTC timezone, + * with the date left as 1970-01-01. The input string must be in the format + * HH:MM:SS (zero-padded, 24-hour). + * + * @param {String} str + * The time string to parse. + * + * @returns {Date} + * A Date object, in the UTC timezone, with only the time components + * set. + */ + var parseTime = function parseTime(str) { + + // Parse time, return blank if invalid + var parsedDate = new Date('1970-01-01T' + str + 'Z'); + if (isNaN(parsedDate.getTime())) + return null; + + return parsedDate; + + }; + + // Update typed value when model is changed + $scope.$watch('model', function modelChanged(model) { + $scope.typedValue = (model ? parseTime(model) : null); + }); + + // Update string value in model when typed value is changed + $scope.$watch('typedValue', function typedValueChanged(typedValue) { + $scope.model = (typedValue ? $filter('date')(typedValue, 'HH:mm:ss', 'UTC') : ''); + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/controllers/timeZoneFieldController.js b/guacamole/src/main/frontend/src/app/form/controllers/timeZoneFieldController.js new file mode 100644 index 0000000..39f0c38 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/controllers/timeZoneFieldController.js @@ -0,0 +1,708 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for time zone fields. Time zone fields use IANA time zone + * database identifiers as the standard representation for each supported time + * zone. These identifiers are also legal Java time zone IDs. + */ +angular.module('form').controller('timeZoneFieldController', ['$scope', '$injector', + function timeZoneFieldController($scope, $injector) { + + /** + * Map of time zone regions to the map of all time zone name/ID pairs + * within those regions. + * + * @type Object.> + */ + $scope.timeZones = { + + "Africa" : { + "Abidjan" : "Africa/Abidjan", + "Accra" : "Africa/Accra", + "Addis Ababa" : "Africa/Addis_Ababa", + "Algiers" : "Africa/Algiers", + "Asmara" : "Africa/Asmara", + "Asmera" : "Africa/Asmera", + "Bamako" : "Africa/Bamako", + "Bangui" : "Africa/Bangui", + "Banjul" : "Africa/Banjul", + "Bissau" : "Africa/Bissau", + "Blantyre" : "Africa/Blantyre", + "Brazzaville" : "Africa/Brazzaville", + "Bujumbura" : "Africa/Bujumbura", + "Cairo" : "Africa/Cairo", + "Casablanca" : "Africa/Casablanca", + "Ceuta" : "Africa/Ceuta", + "Conakry" : "Africa/Conakry", + "Dakar" : "Africa/Dakar", + "Dar es Salaam" : "Africa/Dar_es_Salaam", + "Djibouti" : "Africa/Djibouti", + "Douala" : "Africa/Douala", + "El Aaiun" : "Africa/El_Aaiun", + "Freetown" : "Africa/Freetown", + "Gaborone" : "Africa/Gaborone", + "Harare" : "Africa/Harare", + "Johannesburg" : "Africa/Johannesburg", + "Juba" : "Africa/Juba", + "Kampala" : "Africa/Kampala", + "Khartoum" : "Africa/Khartoum", + "Kigali" : "Africa/Kigali", + "Kinshasa" : "Africa/Kinshasa", + "Lagos" : "Africa/Lagos", + "Libreville" : "Africa/Libreville", + "Lome" : "Africa/Lome", + "Luanda" : "Africa/Luanda", + "Lubumbashi" : "Africa/Lubumbashi", + "Lusaka" : "Africa/Lusaka", + "Malabo" : "Africa/Malabo", + "Maputo" : "Africa/Maputo", + "Maseru" : "Africa/Maseru", + "Mbabane" : "Africa/Mbabane", + "Mogadishu" : "Africa/Mogadishu", + "Monrovia" : "Africa/Monrovia", + "Nairobi" : "Africa/Nairobi", + "Ndjamena" : "Africa/Ndjamena", + "Niamey" : "Africa/Niamey", + "Nouakchott" : "Africa/Nouakchott", + "Ouagadougou" : "Africa/Ouagadougou", + "Porto-Novo" : "Africa/Porto-Novo", + "Sao Tome" : "Africa/Sao_Tome", + "Timbuktu" : "Africa/Timbuktu", + "Tripoli" : "Africa/Tripoli", + "Tunis" : "Africa/Tunis", + "Windhoek" : "Africa/Windhoek" + }, + + "America" : { + "Adak" : "America/Adak", + "Anchorage" : "America/Anchorage", + "Anguilla" : "America/Anguilla", + "Antigua" : "America/Antigua", + "Araguaina" : "America/Araguaina", + "Argentina / Buenos Aires" : "America/Argentina/Buenos_Aires", + "Argentina / Catamarca" : "America/Argentina/Catamarca", + "Argentina / Comodoro Rivadavia" : "America/Argentina/ComodRivadavia", + "Argentina / Cordoba" : "America/Argentina/Cordoba", + "Argentina / Jujuy" : "America/Argentina/Jujuy", + "Argentina / La Rioja" : "America/Argentina/La_Rioja", + "Argentina / Mendoza" : "America/Argentina/Mendoza", + "Argentina / Rio Gallegos" : "America/Argentina/Rio_Gallegos", + "Argentina / Salta" : "America/Argentina/Salta", + "Argentina / San Juan" : "America/Argentina/San_Juan", + "Argentina / San Luis" : "America/Argentina/San_Luis", + "Argentina / Tucuman" : "America/Argentina/Tucuman", + "Argentina / Ushuaia" : "America/Argentina/Ushuaia", + "Aruba" : "America/Aruba", + "Asuncion" : "America/Asuncion", + "Atikokan" : "America/Atikokan", + "Atka" : "America/Atka", + "Bahia" : "America/Bahia", + "Bahia Banderas" : "America/Bahia_Banderas", + "Barbados" : "America/Barbados", + "Belem" : "America/Belem", + "Belize" : "America/Belize", + "Blanc-Sablon" : "America/Blanc-Sablon", + "Boa Vista" : "America/Boa_Vista", + "Bogota" : "America/Bogota", + "Boise" : "America/Boise", + "Buenos Aires" : "America/Buenos_Aires", + "Cambridge Bay" : "America/Cambridge_Bay", + "Campo Grande" : "America/Campo_Grande", + "Cancun" : "America/Cancun", + "Caracas" : "America/Caracas", + "Catamarca" : "America/Catamarca", + "Cayenne" : "America/Cayenne", + "Cayman" : "America/Cayman", + "Chicago" : "America/Chicago", + "Chihuahua" : "America/Chihuahua", + "Coral Harbour" : "America/Coral_Harbour", + "Cordoba" : "America/Cordoba", + "Costa Rica" : "America/Costa_Rica", + "Creston" : "America/Creston", + "Cuiaba" : "America/Cuiaba", + "Curacao" : "America/Curacao", + "Danmarkshavn" : "America/Danmarkshavn", + "Dawson" : "America/Dawson", + "Dawson Creek" : "America/Dawson_Creek", + "Denver" : "America/Denver", + "Detroit" : "America/Detroit", + "Dominica" : "America/Dominica", + "Edmonton" : "America/Edmonton", + "Eirunepe" : "America/Eirunepe", + "El Salvador" : "America/El_Salvador", + "Ensenada" : "America/Ensenada", + "Fort Wayne" : "America/Fort_Wayne", + "Fortaleza" : "America/Fortaleza", + "Glace Bay" : "America/Glace_Bay", + "Godthab" : "America/Godthab", + "Goose Bay" : "America/Goose_Bay", + "Grand Turk" : "America/Grand_Turk", + "Grenada" : "America/Grenada", + "Guadeloupe" : "America/Guadeloupe", + "Guatemala" : "America/Guatemala", + "Guayaquil" : "America/Guayaquil", + "Guyana" : "America/Guyana", + "Halifax" : "America/Halifax", + "Havana" : "America/Havana", + "Hermosillo" : "America/Hermosillo", + "Indiana / Indianapolis" : "America/Indiana/Indianapolis", + "Indiana / Knox" : "America/Indiana/Knox", + "Indiana / Marengo" : "America/Indiana/Marengo", + "Indiana / Petersburg" : "America/Indiana/Petersburg", + "Indiana / Tell City" : "America/Indiana/Tell_City", + "Indiana / Vevay" : "America/Indiana/Vevay", + "Indiana / Vincennes" : "America/Indiana/Vincennes", + "Indiana / Winamac" : "America/Indiana/Winamac", + "Indianapolis" : "America/Indianapolis", + "Inuvik" : "America/Inuvik", + "Iqaluit" : "America/Iqaluit", + "Jamaica" : "America/Jamaica", + "Jujuy" : "America/Jujuy", + "Juneau" : "America/Juneau", + "Kentucky / Louisville" : "America/Kentucky/Louisville", + "Kentucky / Monticello" : "America/Kentucky/Monticello", + "Kralendijk" : "America/Kralendijk", + "La Paz" : "America/La_Paz", + "Lima" : "America/Lima", + "Los Angeles" : "America/Los_Angeles", + "Louisville" : "America/Louisville", + "Lower Princes" : "America/Lower_Princes", + "Maceio" : "America/Maceio", + "Managua" : "America/Managua", + "Manaus" : "America/Manaus", + "Marigot" : "America/Marigot", + "Martinique" : "America/Martinique", + "Matamoros" : "America/Matamoros", + "Mazatlan" : "America/Mazatlan", + "Mendoza" : "America/Mendoza", + "Menominee" : "America/Menominee", + "Merida" : "America/Merida", + "Metlakatla" : "America/Metlakatla", + "Mexico City" : "America/Mexico_City", + "Miquelon" : "America/Miquelon", + "Moncton" : "America/Moncton", + "Monterrey" : "America/Monterrey", + "Montevideo" : "America/Montevideo", + "Montreal" : "America/Montreal", + "Montserrat" : "America/Montserrat", + "Nassau" : "America/Nassau", + "New York" : "America/New_York", + "Nipigon" : "America/Nipigon", + "Nome" : "America/Nome", + "Noronha" : "America/Noronha", + "North Dakota / Beulah" : "America/North_Dakota/Beulah", + "North Dakota / Center" : "America/North_Dakota/Center", + "North Dakota / New Salem" : "America/North_Dakota/New_Salem", + "Ojinaga" : "America/Ojinaga", + "Panama" : "America/Panama", + "Pangnirtung" : "America/Pangnirtung", + "Paramaribo" : "America/Paramaribo", + "Phoenix" : "America/Phoenix", + "Port-au-Prince" : "America/Port-au-Prince", + "Port of Spain" : "America/Port_of_Spain", + "Porto Acre" : "America/Porto_Acre", + "Porto Velho" : "America/Porto_Velho", + "Puerto Rico" : "America/Puerto_Rico", + "Rainy River" : "America/Rainy_River", + "Rankin Inlet" : "America/Rankin_Inlet", + "Recife" : "America/Recife", + "Regina" : "America/Regina", + "Resolute" : "America/Resolute", + "Rio Branco" : "America/Rio_Branco", + "Rosario" : "America/Rosario", + "Santa Isabel" : "America/Santa_Isabel", + "Santarem" : "America/Santarem", + "Santiago" : "America/Santiago", + "Santo Domingo" : "America/Santo_Domingo", + "Sao Paulo" : "America/Sao_Paulo", + "Scoresbysund" : "America/Scoresbysund", + "Shiprock" : "America/Shiprock", + "Sitka" : "America/Sitka", + "St. Barthelemy" : "America/St_Barthelemy", + "St. Johns" : "America/St_Johns", + "St. Kitts" : "America/St_Kitts", + "St. Lucia" : "America/St_Lucia", + "St. Thomas" : "America/St_Thomas", + "St. Vincent" : "America/St_Vincent", + "Swift Current" : "America/Swift_Current", + "Tegucigalpa" : "America/Tegucigalpa", + "Thule" : "America/Thule", + "Thunder Bay" : "America/Thunder_Bay", + "Tijuana" : "America/Tijuana", + "Toronto" : "America/Toronto", + "Tortola" : "America/Tortola", + "Vancouver" : "America/Vancouver", + "Virgin" : "America/Virgin", + "Whitehorse" : "America/Whitehorse", + "Winnipeg" : "America/Winnipeg", + "Yakutat" : "America/Yakutat", + "Yellowknife" : "America/Yellowknife" + }, + + "Antarctica" : { + "Casey" : "Antarctica/Casey", + "Davis" : "Antarctica/Davis", + "Dumont d'Urville" : "Antarctica/DumontDUrville", + "Macquarie" : "Antarctica/Macquarie", + "Mawson" : "Antarctica/Mawson", + "McMurdo" : "Antarctica/McMurdo", + "Palmer" : "Antarctica/Palmer", + "Rothera" : "Antarctica/Rothera", + "South Pole" : "Antarctica/South_Pole", + "Syowa" : "Antarctica/Syowa", + "Troll" : "Antarctica/Troll", + "Vostok" : "Antarctica/Vostok" + }, + + "Arctic" : { + "Longyearbyen" : "Arctic/Longyearbyen" + }, + + "Asia" : { + "Aden" : "Asia/Aden", + "Almaty" : "Asia/Almaty", + "Amman" : "Asia/Amman", + "Anadyr" : "Asia/Anadyr", + "Aqtau" : "Asia/Aqtau", + "Aqtobe" : "Asia/Aqtobe", + "Ashgabat" : "Asia/Ashgabat", + "Ashkhabad" : "Asia/Ashkhabad", + "Baghdad" : "Asia/Baghdad", + "Bahrain" : "Asia/Bahrain", + "Baku" : "Asia/Baku", + "Bangkok" : "Asia/Bangkok", + "Beirut" : "Asia/Beirut", + "Bishkek" : "Asia/Bishkek", + "Brunei" : "Asia/Brunei", + "Calcutta" : "Asia/Calcutta", + "Chita" : "Asia/Chita", + "Choibalsan" : "Asia/Choibalsan", + "Chongqing" : "Asia/Chongqing", + "Colombo" : "Asia/Colombo", + "Dacca" : "Asia/Dacca", + "Damascus" : "Asia/Damascus", + "Dhaka" : "Asia/Dhaka", + "Dili" : "Asia/Dili", + "Dubai" : "Asia/Dubai", + "Dushanbe" : "Asia/Dushanbe", + "Gaza" : "Asia/Gaza", + "Harbin" : "Asia/Harbin", + "Hebron" : "Asia/Hebron", + "Ho Chi Minh" : "Asia/Ho_Chi_Minh", + "Hong Kong" : "Asia/Hong_Kong", + "Hovd" : "Asia/Hovd", + "Irkutsk" : "Asia/Irkutsk", + "Istanbul" : "Asia/Istanbul", + "Jakarta" : "Asia/Jakarta", + "Jayapura" : "Asia/Jayapura", + "Jerusalem" : "Asia/Jerusalem", + "Kabul" : "Asia/Kabul", + "Kamchatka" : "Asia/Kamchatka", + "Karachi" : "Asia/Karachi", + "Kashgar" : "Asia/Kashgar", + "Kathmandu" : "Asia/Kathmandu", + "Katmandu" : "Asia/Katmandu", + "Khandyga" : "Asia/Khandyga", + "Kolkata" : "Asia/Kolkata", + "Krasnoyarsk" : "Asia/Krasnoyarsk", + "Kuala Lumpur" : "Asia/Kuala_Lumpur", + "Kuching" : "Asia/Kuching", + "Kuwait" : "Asia/Kuwait", + "Macao" : "Asia/Macao", + "Macau" : "Asia/Macau", + "Magadan" : "Asia/Magadan", + "Makassar" : "Asia/Makassar", + "Manila" : "Asia/Manila", + "Muscat" : "Asia/Muscat", + "Nicosia" : "Asia/Nicosia", + "Novokuznetsk" : "Asia/Novokuznetsk", + "Novosibirsk" : "Asia/Novosibirsk", + "Omsk" : "Asia/Omsk", + "Oral" : "Asia/Oral", + "Phnom Penh" : "Asia/Phnom_Penh", + "Pontianak" : "Asia/Pontianak", + "Pyongyang" : "Asia/Pyongyang", + "Qatar" : "Asia/Qatar", + "Qyzylorda" : "Asia/Qyzylorda", + "Rangoon" : "Asia/Rangoon", + "Riyadh" : "Asia/Riyadh", + "Saigon" : "Asia/Saigon", + "Sakhalin" : "Asia/Sakhalin", + "Samarkand" : "Asia/Samarkand", + "Seoul" : "Asia/Seoul", + "Shanghai" : "Asia/Shanghai", + "Singapore" : "Asia/Singapore", + "Srednekolymsk" : "Asia/Srednekolymsk", + "Taipei" : "Asia/Taipei", + "Tashkent" : "Asia/Tashkent", + "Tbilisi" : "Asia/Tbilisi", + "Tehran" : "Asia/Tehran", + "Tel Aviv" : "Asia/Tel_Aviv", + "Thimbu" : "Asia/Thimbu", + "Thimphu" : "Asia/Thimphu", + "Tokyo" : "Asia/Tokyo", + "Ujung Pandang" : "Asia/Ujung_Pandang", + "Ulaanbaatar" : "Asia/Ulaanbaatar", + "Ulan Bator" : "Asia/Ulan_Bator", + "Urumqi" : "Asia/Urumqi", + "Ust-Nera" : "Asia/Ust-Nera", + "Vientiane" : "Asia/Vientiane", + "Vladivostok" : "Asia/Vladivostok", + "Yakutsk" : "Asia/Yakutsk", + "Yekaterinburg" : "Asia/Yekaterinburg", + "Yerevan" : "Asia/Yerevan" + }, + + "Atlantic" : { + "Azores" : "Atlantic/Azores", + "Bermuda" : "Atlantic/Bermuda", + "Canary" : "Atlantic/Canary", + "Cape Verde" : "Atlantic/Cape_Verde", + "Faeroe" : "Atlantic/Faeroe", + "Faroe" : "Atlantic/Faroe", + "Jan Mayen" : "Atlantic/Jan_Mayen", + "Madeira" : "Atlantic/Madeira", + "Reykjavik" : "Atlantic/Reykjavik", + "South Georgia" : "Atlantic/South_Georgia", + "St. Helena" : "Atlantic/St_Helena", + "Stanley" : "Atlantic/Stanley" + }, + + "Australia" : { + "Adelaide" : "Australia/Adelaide", + "Brisbane" : "Australia/Brisbane", + "Broken Hill" : "Australia/Broken_Hill", + "Canberra" : "Australia/Canberra", + "Currie" : "Australia/Currie", + "Darwin" : "Australia/Darwin", + "Eucla" : "Australia/Eucla", + "Hobart" : "Australia/Hobart", + "Lindeman" : "Australia/Lindeman", + "Lord Howe" : "Australia/Lord_Howe", + "Melbourne" : "Australia/Melbourne", + "North" : "Australia/North", + "Perth" : "Australia/Perth", + "Queensland" : "Australia/Queensland", + "South" : "Australia/South", + "Sydney" : "Australia/Sydney", + "Tasmania" : "Australia/Tasmania", + "Victoria" : "Australia/Victoria", + "West" : "Australia/West", + "Yancowinna" : "Australia/Yancowinna" + }, + + "Brazil" : { + "Acre" : "Brazil/Acre", + "Fernando de Noronha" : "Brazil/DeNoronha", + "East" : "Brazil/East", + "West" : "Brazil/West" + }, + + "Canada" : { + "Atlantic" : "Canada/Atlantic", + "Central" : "Canada/Central", + "Eastern" : "Canada/Eastern", + "Mountain" : "Canada/Mountain", + "Newfoundland" : "Canada/Newfoundland", + "Pacific" : "Canada/Pacific", + "Saskatchewan" : "Canada/Saskatchewan", + "Yukon" : "Canada/Yukon" + }, + + "Chile" : { + "Continental" : "Chile/Continental", + "Easter Island" : "Chile/EasterIsland" + }, + + "Europe" : { + "Amsterdam" : "Europe/Amsterdam", + "Andorra" : "Europe/Andorra", + "Athens" : "Europe/Athens", + "Belfast" : "Europe/Belfast", + "Belgrade" : "Europe/Belgrade", + "Berlin" : "Europe/Berlin", + "Bratislava" : "Europe/Bratislava", + "Brussels" : "Europe/Brussels", + "Bucharest" : "Europe/Bucharest", + "Budapest" : "Europe/Budapest", + "Busingen" : "Europe/Busingen", + "Chisinau" : "Europe/Chisinau", + "Copenhagen" : "Europe/Copenhagen", + "Dublin" : "Europe/Dublin", + "Gibraltar" : "Europe/Gibraltar", + "Guernsey" : "Europe/Guernsey", + "Helsinki" : "Europe/Helsinki", + "Isle of Man" : "Europe/Isle_of_Man", + "Istanbul" : "Europe/Istanbul", + "Jersey" : "Europe/Jersey", + "Kaliningrad" : "Europe/Kaliningrad", + "Kiev" : "Europe/Kiev", + "Lisbon" : "Europe/Lisbon", + "Ljubljana" : "Europe/Ljubljana", + "London" : "Europe/London", + "Luxembourg" : "Europe/Luxembourg", + "Madrid" : "Europe/Madrid", + "Malta" : "Europe/Malta", + "Mariehamn" : "Europe/Mariehamn", + "Minsk" : "Europe/Minsk", + "Monaco" : "Europe/Monaco", + "Moscow" : "Europe/Moscow", + "Nicosia" : "Europe/Nicosia", + "Oslo" : "Europe/Oslo", + "Paris" : "Europe/Paris", + "Podgorica" : "Europe/Podgorica", + "Prague" : "Europe/Prague", + "Riga" : "Europe/Riga", + "Rome" : "Europe/Rome", + "Samara" : "Europe/Samara", + "San Marino" : "Europe/San_Marino", + "Sarajevo" : "Europe/Sarajevo", + "Simferopol" : "Europe/Simferopol", + "Skopje" : "Europe/Skopje", + "Sofia" : "Europe/Sofia", + "Stockholm" : "Europe/Stockholm", + "Tallinn" : "Europe/Tallinn", + "Tirane" : "Europe/Tirane", + "Tiraspol" : "Europe/Tiraspol", + "Uzhgorod" : "Europe/Uzhgorod", + "Vaduz" : "Europe/Vaduz", + "Vatican" : "Europe/Vatican", + "Vienna" : "Europe/Vienna", + "Vilnius" : "Europe/Vilnius", + "Volgograd" : "Europe/Volgograd", + "Warsaw" : "Europe/Warsaw", + "Zagreb" : "Europe/Zagreb", + "Zaporozhye" : "Europe/Zaporozhye", + "Zurich" : "Europe/Zurich" + }, + + "GMT" : { + "GMT-14" : "Etc/GMT-14", + "GMT-13" : "Etc/GMT-13", + "GMT-12" : "Etc/GMT-12", + "GMT-11" : "Etc/GMT-11", + "GMT-10" : "Etc/GMT-10", + "GMT-9" : "Etc/GMT-9", + "GMT-8" : "Etc/GMT-8", + "GMT-7" : "Etc/GMT-7", + "GMT-6" : "Etc/GMT-6", + "GMT-5" : "Etc/GMT-5", + "GMT-4" : "Etc/GMT-4", + "GMT-3" : "Etc/GMT-3", + "GMT-2" : "Etc/GMT-2", + "GMT-1" : "Etc/GMT-1", + "GMT+0" : "Etc/GMT+0", + "GMT+1" : "Etc/GMT+1", + "GMT+2" : "Etc/GMT+2", + "GMT+3" : "Etc/GMT+3", + "GMT+4" : "Etc/GMT+4", + "GMT+5" : "Etc/GMT+5", + "GMT+6" : "Etc/GMT+6", + "GMT+7" : "Etc/GMT+7", + "GMT+8" : "Etc/GMT+8", + "GMT+9" : "Etc/GMT+9", + "GMT+10" : "Etc/GMT+10", + "GMT+11" : "Etc/GMT+11", + "GMT+12" : "Etc/GMT+12" + }, + + "Indian" : { + "Antananarivo" : "Indian/Antananarivo", + "Chagos" : "Indian/Chagos", + "Christmas" : "Indian/Christmas", + "Cocos" : "Indian/Cocos", + "Comoro" : "Indian/Comoro", + "Kerguelen" : "Indian/Kerguelen", + "Mahe" : "Indian/Mahe", + "Maldives" : "Indian/Maldives", + "Mauritius" : "Indian/Mauritius", + "Mayotte" : "Indian/Mayotte", + "Reunion" : "Indian/Reunion" + }, + + "Mexico" : { + "Baja Norte" : "Mexico/BajaNorte", + "Baja Sur" : "Mexico/BajaSur", + "General" : "Mexico/General" + }, + + "Pacific" : { + "Apia" : "Pacific/Apia", + "Auckland" : "Pacific/Auckland", + "Bougainville" : "Pacific/Bougainville", + "Chatham" : "Pacific/Chatham", + "Chuuk" : "Pacific/Chuuk", + "Easter" : "Pacific/Easter", + "Efate" : "Pacific/Efate", + "Enderbury" : "Pacific/Enderbury", + "Fakaofo" : "Pacific/Fakaofo", + "Fiji" : "Pacific/Fiji", + "Funafuti" : "Pacific/Funafuti", + "Galapagos" : "Pacific/Galapagos", + "Gambier" : "Pacific/Gambier", + "Guadalcanal" : "Pacific/Guadalcanal", + "Guam" : "Pacific/Guam", + "Honolulu" : "Pacific/Honolulu", + "Johnston" : "Pacific/Johnston", + "Kiritimati" : "Pacific/Kiritimati", + "Kosrae" : "Pacific/Kosrae", + "Kwajalein" : "Pacific/Kwajalein", + "Majuro" : "Pacific/Majuro", + "Marquesas" : "Pacific/Marquesas", + "Midway" : "Pacific/Midway", + "Nauru" : "Pacific/Nauru", + "Niue" : "Pacific/Niue", + "Norfolk" : "Pacific/Norfolk", + "Noumea" : "Pacific/Noumea", + "Pago Pago" : "Pacific/Pago_Pago", + "Palau" : "Pacific/Palau", + "Pitcairn" : "Pacific/Pitcairn", + "Pohnpei" : "Pacific/Pohnpei", + "Ponape" : "Pacific/Ponape", + "Port Moresby" : "Pacific/Port_Moresby", + "Rarotonga" : "Pacific/Rarotonga", + "Saipan" : "Pacific/Saipan", + "Samoa" : "Pacific/Samoa", + "Tahiti" : "Pacific/Tahiti", + "Tarawa" : "Pacific/Tarawa", + "Tongatapu" : "Pacific/Tongatapu", + "Truk" : "Pacific/Truk", + "Wake" : "Pacific/Wake", + "Wallis" : "Pacific/Wallis", + "Yap" : "Pacific/Yap" + } + + }; + + /** + * All selectable regions. + * + * @type String[] + */ + $scope.regions = (function collectRegions() { + + // Start with blank entry + var regions = [ '' ]; + + // Add each available region + for (var region in $scope.timeZones) + regions.push(region); + + return regions; + + })(); + + /** + * Direct mapping of all time zone IDs to the region containing that ID. + * + * @type Object. + */ + var timeZoneRegions = (function mapRegions() { + + var regions = {}; + + // For each available region + for (var region in $scope.timeZones) { + + // Get time zones within that region + var timeZonesInRegion = $scope.timeZones[region]; + + // For each of those time zones + for (var timeZoneName in timeZonesInRegion) { + + // Get corresponding ID + var timeZoneID = timeZonesInRegion[timeZoneName]; + + // Store region in map + regions[timeZoneID] = region; + + } + + } + + return regions; + + })(); + + /** + * Map of regions to the currently selected time zone for that region. + * Initially, all regions will be set to default selections (the first + * time zone, sorted lexicographically). + * + * @type Object. + */ + var selectedTimeZone = (function produceDefaultTimeZones() { + + var defaultTimeZone = {}; + + // For each available region + for (var region in $scope.timeZones) { + + // Get time zones within that region + var timeZonesInRegion = $scope.timeZones[region]; + + // No default initially + var defaultZoneName = null; + var defaultZoneID = null; + + // For each of those time zones + for (var timeZoneName in timeZonesInRegion) { + + // Get corresponding ID + var timeZoneID = timeZonesInRegion[timeZoneName]; + + // Set as default if earlier than existing default + if (!defaultZoneName || timeZoneName < defaultZoneName) { + defaultZoneName = timeZoneName; + defaultZoneID = timeZoneID; + } + + } + + // Store default zone + defaultTimeZone[region] = defaultZoneID; + + } + + return defaultTimeZone; + + })(); + + /** + * The name of the region currently selected. The selected region narrows + * which time zones are selectable. + * + * @type String + */ + $scope.region = ''; + + // Ensure corresponding region is selected + $scope.$watch('model', function setModel(model) { + $scope.region = timeZoneRegions[model] || ''; + selectedTimeZone[$scope.region] = model; + }); + + // Restore time zone selection when region changes + $scope.$watch('region', function restoreSelection(region) { + $scope.model = selectedTimeZone[region] || null; + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/directives/form.js b/guacamole/src/main/frontend/src/app/form/directives/form.js new file mode 100644 index 0000000..4de051b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/directives/form.js @@ -0,0 +1,307 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* global _ */ + +/** + * A directive that allows editing of a collection of fields. + */ +angular.module('form').directive('guacForm', [function form() { + + return { + // Element only + restrict: 'E', + replace: true, + scope: { + + /** + * The translation namespace of the translation strings that will + * be generated for all fields. This namespace is absolutely + * required. If this namespace is omitted, all generated + * translation strings will be placed within the MISSING_NAMESPACE + * namespace, as a warning. + * + * @type String + */ + namespace : '=', + + /** + * The form content to display. This may be a form, an array of + * forms, or a simple array of fields. + * + * @type Form[]|Form|Field[]|Field + */ + content : '=', + + /** + * The object which will receive all field values. Each field value + * will be assigned to the property of this object having the same + * name. + * + * @type Object. + */ + model : '=', + + /** + * Whether the contents of the form should be restricted to those + * fields/forms which match properties defined within the given + * model object. By default, all fields will be shown. + * + * @type Boolean + */ + modelOnly : '=', + + /** + * Whether the contents of the form should be rendered as disabled. + * By default, form fields are enabled. + * + * @type Boolean + */ + disabled : '=', + + /** + * The name of the field to be focused, if any. + * + * @type String + */ + focused : '=', + + /** + * The client associated with this form, if any. + * + * NOTE: If the provided client has any managed arguments in the + * pending state, any fields with the same name rendered by this + * form will be disabled. The fields will be re-enabled when guacd + * sends an updated argument with a the same name. + * + * @type ManagedClient + */ + client: '=' + + }, + templateUrl: 'app/form/templates/form.html', + controller: ['$scope', '$injector', function formController($scope, $injector) { + + // Required services + var formService = $injector.get('formService'); + var translationStringService = $injector.get('translationStringService'); + + /** + * The array of all forms to display. + * + * @type Form[] + */ + $scope.forms = []; + + /** + * The object which will receive all field values. Normally, this + * will be the object provided within the "model" attribute. If + * no such object has been provided, a blank model will be used + * instead as a placeholder, such that the fields of this form + * will have something to bind to. + * + * @type Object. + */ + $scope.values = {}; + + /** + * Produces the translation string for the section header of the + * given form. The translation string will be of the form: + * + * NAMESPACE.SECTION_HEADER_NAME + * + * where NAMESPACE is the namespace provided to the + * directive and NAME is the form name transformed + * via translationStringService.canonicalize(). + * + * @param {Form} form + * The form for which to produce the translation string. + * + * @returns {String} + * The translation string which produces the translated header + * of the form. + */ + $scope.getSectionHeader = function getSectionHeader(form) { + + // If no form, or no name, then no header + if (!form || !form.name) + return ''; + + return translationStringService.canonicalize($scope.namespace || 'MISSING_NAMESPACE') + + '.SECTION_HEADER_' + translationStringService.canonicalize(form.name); + + }; + + /** + * Returns an object as would be provided to the ngClass directive + * that defines the CSS classes that should be applied to the given + * form. + * + * @param {Form} form + * The form to generate the CSS classes for. + * + * @return {!Object.} + * The ngClass object defining the CSS classes for the given + * form. + */ + $scope.getFormClasses = function getFormClasses(form) { + return formService.getClasses('form-', form); + }; + + /** + * Determines whether the given object is a form, under the + * assumption that the object is either a form or a field. + * + * @param {Form|Field} obj + * The object to test. + * + * @returns {Boolean} + * true if the given object appears to be a form, false + * otherwise. + */ + var isForm = function isForm(obj) { + return !!('name' in obj && 'fields' in obj); + }; + + // Produce set of forms from any given content + $scope.$watch('content', function setContent(content) { + + // If no content provided, there are no forms + if (!content) { + $scope.forms = []; + return; + } + + // Ensure content is an array + if (!angular.isArray(content)) + content = [content]; + + // If content is an array of fields, convert to an array of forms + if (content.length && !isForm(content[0])) { + content = [{ + fields : content + }]; + } + + // Content is now an array of forms + $scope.forms = content; + + }); + + // Update string value and re-assign to model when field is changed + $scope.$watch('model', function setModel(model) { + + // Assign new model only if provided + if (model) + $scope.values = model; + + // Otherwise, use blank model + else + $scope.values = {}; + + }); + + /** + * Returns whether the given field should be focused or not. + * + * @param {Field} field + * The field to check. + * + * @returns {Boolean} + * true if the given field should be focused, false otherwise. + */ + $scope.isFocused = function isFocused(field) { + return field && (field.name === $scope.focused); + }; + + /** + * Returns whether the given field should be displayed to the + * current user. + * + * @param {Field} field + * The field to check. + * + * @returns {Boolean} + * true if the given field should be visible, false otherwise. + */ + $scope.isVisible = function isVisible(field) { + + // All fields are visible if contents are not restricted to + // model properties only + if (!$scope.modelOnly) + return true; + + // Otherwise, fields are only visible if they are present + // within the model + return field && (field.name in $scope.values); + + }; + + + /** + * Returns whether the given field should be disabled (read-only) + * when presented to the current user. + * + * @param {Field} field + * The field to check. + * + * @returns {Boolean} + * true if the given field should be disabled, false otherwise. + */ + $scope.isDisabled = function isDisabled(field) { + + /* + * The field is disabled if either the form as a whole is disabled, + * or if a client is provided to the directive, and the field is + * marked as pending. + */ + return $scope.disabled || + _.get($scope.client, ['arguments', field.name, 'pending']); + }; + + /** + * Returns whether at least one of the given fields should be + * displayed to the current user. + * + * @param {Field[]} fields + * The array of fields to check. + * + * @returns {Boolean} + * true if at least one field within the given array should be + * visible, false otherwise. + */ + $scope.containsVisible = function containsVisible(fields) { + + // If fields are defined, check whether at least one is visible + if (fields) { + for (var i = 0; i < fields.length; i++) { + if ($scope.isVisible(fields[i])) + return true; + } + } + + // Otherwise, there are no visible fields + return false; + + }; + + }] // end controller + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/directives/formField.js b/guacamole/src/main/frontend/src/app/form/directives/formField.js new file mode 100644 index 0000000..73ffb12 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/directives/formField.js @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * A directive that allows editing of a field. + */ +angular.module('form').directive('guacFormField', [function formField() { + + return { + // Element only + restrict: 'E', + replace: true, + scope: { + + /** + * The translation namespace of the translation strings that will + * be generated for this field. This namespace is absolutely + * required. If this namespace is omitted, all generated + * translation strings will be placed within the MISSING_NAMESPACE + * namespace, as a warning. + * + * @type String + */ + namespace : '=', + + /** + * The field to display. + * + * @type Field + */ + field : '=', + + /** + * The property which contains this fields current value. When this + * field changes, the property will be updated accordingly. + * + * @type String + */ + model : '=', + + /** + * Whether this field should be rendered as disabled. By default, + * form fields are enabled. + * + * @type Boolean + */ + disabled : '=', + + /** + * Whether this field should be focused. + * + * @type Boolean + */ + focused : '=', + + /** + * The client associated with this form field, if any. + * + * @type ManagedClient + */ + client: '=' + + }, + templateUrl: 'app/form/templates/formField.html', + controller: ['$scope', '$injector', '$element', function formFieldController($scope, $injector, $element) { + + // Required services + var $log = $injector.get('$log'); + var formService = $injector.get('formService'); + var translationStringService = $injector.get('translationStringService'); + + /** + * The element which should contain any compiled field content. The + * actual content of a field is dynamically determined by its type. + * + * @type Element[] + */ + var fieldContent = $element.find('.form-field'); + + /** + * An ID value which is reasonably likely to be unique relative to + * other elements on the page. This ID should be used to associate + * the relevant input element with the label provided by the + * guacFormField directive, if there is such an input element. + * + * @type String + */ + $scope.fieldId = 'guac-field-XXXXXXXXXXXXXXXX'.replace(/X/g, function getRandomCharacter() { + return Math.floor(Math.random() * 36).toString(36); + }) + '-' + new Date().getTime().toString(36); + + /** + * Produces the translation string for the header of the current + * field. The translation string will be of the form: + * + * NAMESPACE.FIELD_HEADER_NAME + * + * where NAMESPACE is the namespace provided to the + * directive and NAME is the field name transformed + * via translationStringService.canonicalize(). + * + * @returns {String} + * The translation string which produces the translated header + * of the field. + */ + $scope.getFieldHeader = function getFieldHeader() { + + // If no field, or no name, then no header + if (!$scope.field || !$scope.field.name) + return ''; + + return translationStringService.canonicalize($scope.namespace || 'MISSING_NAMESPACE') + + '.FIELD_HEADER_' + translationStringService.canonicalize($scope.field.name); + + }; + + /** + * Produces the translation string for the given field option + * value. The translation string will be of the form: + * + * NAMESPACE.FIELD_OPTION_NAME_VALUE + * + * where NAMESPACE is the namespace provided to the + * directive, NAME is the field name transformed + * via translationStringService.canonicalize(), and + * VALUE is the option value transformed via + * translationStringService.canonicalize() + * + * @param {String} value + * The name of the option value. + * + * @returns {String} + * The translation string which produces the translated name of the + * value specified. + */ + $scope.getFieldOption = function getFieldOption(value) { + + // If no field, or no value, then no corresponding translation string + if (!$scope.field || !$scope.field.name) + return ''; + + return translationStringService.canonicalize($scope.namespace || 'MISSING_NAMESPACE') + + '.FIELD_OPTION_' + translationStringService.canonicalize($scope.field.name) + + '_' + translationStringService.canonicalize(value || 'EMPTY'); + + }; + + /** + * Returns an object as would be provided to the ngClass directive + * that defines the CSS classes that should be applied to this + * field. + * + * @return {!Object.} + * The ngClass object defining the CSS classes for the current + * field. + */ + $scope.getFieldClasses = function getFieldClasses() { + return formService.getClasses('labeled-field-', $scope.field, { + empty: !$scope.model + }); + }; + + /** + * Returns whether the current field should be displayed. + * + * @returns {Boolean} + * true if the current field should be displayed, false + * otherwise. + */ + $scope.isFieldVisible = function isFieldVisible() { + return fieldContent[0].hasChildNodes(); + }; + + // Update field contents when field definition is changed + $scope.$watch('field', function setField(field) { + + // Reset contents + fieldContent.innerHTML = ''; + + // Append field content + if (field) { + formService.insertFieldElement(fieldContent[0], + field.type, $scope)['catch'](function fieldCreationFailed() { + $log.warn('Failed to retrieve field with type "' + field.type + '"'); + }); + } + + }); + + }] // end controller + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/directives/guacInputColor.js b/guacamole/src/main/frontend/src/app/form/directives/guacInputColor.js new file mode 100644 index 0000000..1762c31 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/directives/guacInputColor.js @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which implements a color input field. If the underlying color + * picker implementation cannot be used due to a lack of browser support, this + * directive will become read-only, functioning essentially as a color preview. + * + * @see colorPickerService + */ +angular.module('form').directive('guacInputColor', [function guacInputColor() { + + var config = { + restrict: 'E', + replace: true, + templateUrl: 'app/form/templates/guacInputColor.html', + transclude: true + }; + + config.scope = { + + /** + * The current selected color value, in standard 6-digit hexadecimal + * RGB notation. When the user selects a different color using this + * directive, this value will updated accordingly. + * + * @type String + */ + model: '=', + + /** + * An optional array of colors to include within the color picker as a + * convenient selection of pre-defined colors. The colors within the + * array must be in standard 6-digit hexadecimal RGB notation. + * + * @type String[] + */ + palette: '=' + + }; + + config.controller = ['$scope', '$element', '$injector', + function guacInputColorController($scope, $element, $injector) { + + // Required services + var colorPickerService = $injector.get('colorPickerService'); + + /** + * @borrows colorPickerService.isAvailable() + */ + $scope.isColorPickerAvailable = colorPickerService.isAvailable; + + /** + * Returns whether the color currently selected is "dark" in the sense + * that the color white will have higher contrast against it than the + * color black. + * + * @returns {Boolean} + * true if the currently selected color is relatively dark (white + * text would provide better contrast than black), false otherwise. + */ + $scope.isDark = function isDark() { + + // Assume not dark if color is invalid or undefined + var rgb = $scope.model && /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/.exec($scope.model); + if (!rgb) + return false; + + // Parse color component values as hexadecimal + var red = parseInt(rgb[1], 16); + var green = parseInt(rgb[2], 16); + var blue = parseInt(rgb[3], 16); + + // Convert RGB to luminance in HSL space (as defined by the + // relative luminance formula given by the W3C for accessibility) + var luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue; + + // Consider the background to be dark if white text over that + // background would provide better contrast than black + return luminance <= 153; // 153 is the component value 0.6 converted from 0-1 to the 0-255 range + + }; + + /** + * Prompts the user to choose a color by displaying a color selection + * dialog. If the user chooses a color, this directive's model is + * automatically updated. If the user cancels the dialog, the model is + * left untouched. + */ + $scope.selectColor = function selectColor() { + colorPickerService.selectColor($element[0], $scope.model, $scope.palette) + .then(function colorSelected(color) { + $scope.model = color; + }, angular.noop); + }; + + }]; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/directives/guacLenientDate.js b/guacamole/src/main/frontend/src/app/form/directives/guacLenientDate.js new file mode 100644 index 0000000..6b46bfc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/directives/guacLenientDate.js @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which modifies the parsing and formatting of ngModel when used + * on an HTML5 date input field, relaxing the otherwise strict parsing and + * validation behavior. The behavior of this directive for other input elements + * is undefined. + */ +angular.module('form').directive('guacLenientDate', ['$injector', + function guacLenientDate($injector) { + + // Required services + var $filter = $injector.get('$filter'); + + /** + * Directive configuration object. + * + * @type Object. + */ + var config = { + restrict : 'A', + require : 'ngModel' + }; + + // Linking function + config.link = function linkGuacLenientDate($scope, $element, $attrs, ngModel) { + + // Parse date strings leniently + ngModel.$parsers = [function parse(viewValue) { + + // If blank, return null + if (!viewValue) + return null; + + // Match basic date pattern + var match = /([0-9]*)(?:-([0-9]*)(?:-([0-9]*))?)?/.exec(viewValue); + if (!match) + return null; + + // Determine year, month, and day based on pattern + var year = parseInt(match[1] || '0') || new Date().getFullYear(); + var month = parseInt(match[2] || '0') || 1; + var day = parseInt(match[3] || '0') || 1; + + // Convert to Date object + var parsedDate = new Date(Date.UTC(year, month - 1, day)); + if (isNaN(parsedDate.getTime())) + return null; + + return parsedDate; + + }]; + + // Format date strings as "yyyy-MM-dd" + ngModel.$formatters = [function format(modelValue) { + return modelValue ? $filter('date')(modelValue, 'yyyy-MM-dd', 'UTC') : ''; + }]; + + }; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/directives/guacLenientTime.js b/guacamole/src/main/frontend/src/app/form/directives/guacLenientTime.js new file mode 100644 index 0000000..acdb53a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/directives/guacLenientTime.js @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which modifies the parsing and formatting of ngModel when used + * on an HTML5 time input field, relaxing the otherwise strict parsing and + * validation behavior. The behavior of this directive for other input elements + * is undefined. + */ +angular.module('form').directive('guacLenientTime', ['$injector', + function guacLenientTime($injector) { + + // Required services + var $filter = $injector.get('$filter'); + + /** + * Directive configuration object. + * + * @type Object. + */ + var config = { + restrict : 'A', + require : 'ngModel' + }; + + // Linking function + config.link = function linkGuacLenientTIme($scope, $element, $attrs, ngModel) { + + // Parse time strings leniently + ngModel.$parsers = [function parse(viewValue) { + + // If blank, return null + if (!viewValue) + return null; + + // Match basic time pattern + var match = /([0-9]*)(?::([0-9]*)(?::([0-9]*))?)?(?:\s*(a|p))?/.exec(viewValue.toLowerCase()); + if (!match) + return null; + + // Determine hour, minute, and second based on pattern + var hour = parseInt(match[1] || '0'); + var minute = parseInt(match[2] || '0'); + var second = parseInt(match[3] || '0'); + + // Handle AM/PM + if (match[4]) { + + // Interpret 12 AM as 00:00 and 12 PM as 12:00 + if (hour === 12) + hour = 0; + + // Increment hour to evening if PM + if (match[4] === 'p') + hour += 12; + + } + + // Wrap seconds and minutes into minutes and hours + minute += second / 60; second %= 60; + hour += minute / 60; minute %= 60; + + // Constrain hours to 0 - 23 + hour %= 24; + + // Convert to Date object + var parsedDate = new Date(Date.UTC(1970, 0, 1, hour, minute, second)); + if (isNaN(parsedDate.getTime())) + return null; + + return parsedDate; + + }]; + + // Format time strings as "HH:mm:ss" + ngModel.$formatters = [function format(modelValue) { + return modelValue ? $filter('date')(modelValue, 'HH:mm:ss', 'UTC') : ''; + }]; + + }; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/formModule.js b/guacamole/src/main/frontend/src/app/form/formModule.js new file mode 100644 index 0000000..1135118 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/formModule.js @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for displaying dynamic forms. + */ +angular.module('form', [ + 'locale', + 'rest' +]); diff --git a/guacamole/src/main/frontend/src/app/form/services/colorPickerService.js b/guacamole/src/main/frontend/src/app/form/services/colorPickerService.js new file mode 100644 index 0000000..d8494a6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/services/colorPickerService.js @@ -0,0 +1,270 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import '@simonwep/pickr/dist/themes/monolith.min.css' + +/** + * A service for prompting the user to choose a color using the "Pickr" color + * picker. As the Pickr color picker might not be available if the JavaScript + * features it requires are not supported by the browser (Internet Explorer), + * the isAvailable() function should be used to test for usability. + */ +angular.module('form').provider('colorPickerService', function colorPickerServiceProvider() { + + /** + * A singleton instance of the "Pickr" color picker, shared by all users of + * this service. Pickr does not initialize synchronously, nor is it + * supported by all browsers. If Pickr is not yet initialized, or is + * unsupported, this will be null. + * + * @type {Pickr} + */ + var pickr = null; + + /** + * Whether Pickr has completed initialization. + * + * @type {Boolean} + */ + var pickrInitComplete = false; + + /** + * The HTML element to provide to Pickr as the root element. + * + * @type {HTMLDivElement} + */ + var pickerContainer = document.createElement('div'); + pickerContainer.className = 'shared-color-picker'; + + /** + * An instance of Deferred which represents an active request for the + * user to choose a color. The promise associated with the Deferred will + * be resolved with the chosen color once a color is chosen, and rejected + * if the request is cancelled or Pickr is not available. If no request is + * active, this will be null. + * + * @type {Deferred} + */ + var activeRequest = null; + + /** + * Resolves the current active request with the given color value. If no + * color value is provided, the active request is rejected. If no request + * is active, this function has no effect. + * + * @param {String} [color] + * The color value to resolve the active request with. + */ + var completeActiveRequest = function completeActiveRequest(color) { + if (activeRequest) { + + // Hide color picker, if shown + pickr.hide(); + + // Resolve/reject active request depending on value provided + if (color) + activeRequest.resolve(color); + else + activeRequest.reject(); + + // No active request + activeRequest = null; + + } + }; + + try { + pickr = Pickr.create({ + + // Bind color picker to the container element + el : pickerContainer, + + // Wrap color picker dialog in Guacamole-specific class for + // sake of additional styling + appClass : 'guac-input-color-picker', + + 'default' : '#000000', + + // Display color details as hex + defaultRepresentation : 'HEX', + + // Use "monolith" theme, as a nice balance between "nano" (does + // not work in Internet Explorer) and "classic" (too big) + theme : 'monolith', + + // Leverage the container element as the button which shows the + // picker, relying on our own styling for that button + useAsButton : true, + appendToBody : true, + + // Do not include opacity controls + lockOpacity : true, + + // Include a selection of palette entries for convenience and + // reference + swatches : [], + + components: { + + // Include hue and color preview controls + preview : true, + hue : true, + + // Display only a text color input field and the save and + // cancel buttons (no clear button) + interaction: { + input : true, + save : true, + cancel : true + } + + } + + }); + + // Hide color picker after user clicks "cancel" + pickr.on('cancel', function colorChangeCanceled() { + completeActiveRequest(); + }); + + // Keep model in sync with changes to the color picker + pickr.on('save', function colorChanged(color) { + completeActiveRequest(color.toHEXA().toString()); + activeRequest = null; + }); + + // Keep color picker in sync with changes to the model + pickr.on('init', function pickrReady() { + pickrInitComplete = true; + }); + } + catch (e) { + // If the "Pickr" color picker cannot be loaded (Internet Explorer), + // the available flag will remain set to false + } + + // Factory method required by provider + this.$get = ['$injector', function colorPickerServiceFactory($injector) { + + // Required services + var $q = $injector.get('$q'); + var $translate = $injector.get('$translate'); + + var service = {}; + + /** + * Promise which is resolved when Pickr initialization has completed + * and rejected if Pickr cannot be used. + * + * @type {Promise} + */ + var pickrPromise = (function getPickr() { + + var deferred = $q.defer(); + + // Resolve promise when Pickr has completed initialization + if (pickrInitComplete) + deferred.resolve(); + else if (pickr) + pickr.on('init', deferred.resolve); + + // Reject promise if Pickr cannot be used at all + else + deferred.reject(); + + return deferred.promise; + + })(); + + /** + * Returns whether the underlying color picker (Pickr) can be used by + * calling selectColor(). If the browser cannot support the color + * picker, false is returned. + * + * @returns {Boolean} + * true if the underlying color picker can be used by calling + * selectColor(), false otherwise. + */ + service.isAvailable = function isAvailable() { + return pickrInitComplete; + }; + + /** + * Prompts the user to choose a color, returning the color chosen via a + * Promise. + * + * @param {Element} element + * The element that the user interacted with to indicate their + * desire to choose a color. + * + * @param {String} current + * The color that should be selected by default, in standard + * 6-digit hexadecimal RGB format, including "#" prefix. + * + * @param {String[]} [palette] + * An array of color choices which should be exposed to the user + * within the color chooser for convenience. Each color must be in + * standard 6-digit hexadecimal RGB format, including "#" prefix. + * + * @returns {Promise.} + * A Promise which is resolved with the color chosen by the user, + * in standard 6-digit hexadecimal RGB format with "#" prefix, and + * rejected if the selection operation was cancelled or the color + * picker cannot be used. + */ + service.selectColor = function selectColor(element, current, palette) { + + // Show picker once the relevant translation strings have been + // retrieved and Pickr is ready for use + return $q.all({ + 'saveString' : $translate('APP.ACTION_SAVE'), + 'cancelString' : $translate('APP.ACTION_CANCEL'), + 'pickr' : pickrPromise + }).then(function dependenciesReady(deps) { + + // Cancel any active request + completeActiveRequest(); + + // Reset state of color picker to provided parameters + pickr.setColor(current); + element.appendChild(pickerContainer); + + // Assign translated strings to button text + var pickrRoot = pickr.getRoot(); + pickrRoot.interaction.save.value = deps.saveString; + pickrRoot.interaction.cancel.value = deps.cancelString; + + // Replace all color swatches with the palette of colors given + while (pickr.removeSwatch(0)) {} + angular.forEach(palette, pickr.addSwatch.bind(pickr)); + + // Show color picker and wait for user to complete selection + activeRequest = $q.defer(); + pickr.show(); + return activeRequest.promise; + + }); + + }; + + return service; + + }]; + +}); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/form/services/formService.js b/guacamole/src/main/frontend/src/app/form/services/formService.js new file mode 100644 index 0000000..d2ac6be --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/services/formService.js @@ -0,0 +1,428 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for maintaining form-related metadata and linking that data to + * corresponding controllers and templates. + */ +angular.module('form').provider('formService', function formServiceProvider() { + + /** + * Reference to the provider itself. + * + * @type formServiceProvider + */ + var provider = this; + + /** + * Map of all registered field type definitions by name. + * + * @type Object. + */ + this.fieldTypes = { + + /** + * Text field type. + * + * @see {@link Field.Type.TEXT} + * @type FieldType + */ + 'TEXT' : { + module : 'form', + controller : 'textFieldController', + templateUrl : 'app/form/templates/textField.html' + }, + + /** + * Email address field type. + * + * @see {@link Field.Type.EMAIL} + * @type FieldType + */ + 'EMAIL' : { + templateUrl : 'app/form/templates/emailField.html' + }, + + /** + * Numeric field type. + * + * @see {@link Field.Type.NUMERIC} + * @type FieldType + */ + 'NUMERIC' : { + module : 'form', + controller : 'numberFieldController', + templateUrl : 'app/form/templates/numberField.html' + }, + + /** + * Boolean field type. + * + * @see {@link Field.Type.BOOLEAN} + * @type FieldType + */ + 'BOOLEAN' : { + module : 'form', + controller : 'checkboxFieldController', + templateUrl : 'app/form/templates/checkboxField.html' + }, + + /** + * Username field type. Identical in principle to a text field, but may + * have different semantics. + * + * @see {@link Field.Type.USERNAME} + * @type FieldType + */ + 'USERNAME' : { + templateUrl : 'app/form/templates/usernameField.html' + }, + + /** + * Password field type. Similar to a text field, but the contents of + * the field are masked. + * + * @see {@link Field.Type.PASSWORD} + * @type FieldType + */ + 'PASSWORD' : { + module : 'form', + controller : 'passwordFieldController', + templateUrl : 'app/form/templates/passwordField.html' + }, + + /** + * Enumerated field type. The user is presented a finite list of values + * to choose from. + * + * @see {@link Field.Type.ENUM} + * @type FieldType + */ + 'ENUM' : { + module : 'form', + controller : 'selectFieldController', + templateUrl : 'app/form/templates/selectField.html' + }, + + /** + * Multiline field type. The user may enter multiple lines of text. + * + * @see {@link Field.Type.MULTILINE} + * @type FieldType + */ + 'MULTILINE' : { + templateUrl : 'app/form/templates/textAreaField.html' + }, + + /** + * Field type which allows selection of languages. The languages + * displayed are the set of languages supported by the Guacamole web + * application. Legal values are valid language IDs, as dictated by + * the filenames of Guacamole's available translations. + * + * @see {@link Field.Type.LANGUAGE} + * @type FieldType + */ + 'LANGUAGE' : { + module : 'form', + controller : 'languageFieldController', + templateUrl : 'app/form/templates/languageField.html' + }, + + /** + * Field type which allows selection of time zones. + * + * @see {@link Field.Type.TIMEZONE} + * @type FieldType + */ + 'TIMEZONE' : { + module : 'form', + controller : 'timeZoneFieldController', + templateUrl : 'app/form/templates/timeZoneField.html' + }, + + /** + * Field type which allows selection of individual dates. + * + * @see {@link Field.Type.DATE} + * @type FieldType + */ + 'DATE' : { + module : 'form', + controller : 'dateFieldController', + templateUrl : 'app/form/templates/dateField.html' + }, + + /** + * Field type which allows selection of times of day. + * + * @see {@link Field.Type.TIME} + * @type FieldType + */ + 'TIME' : { + module : 'form', + controller : 'timeFieldController', + templateUrl : 'app/form/templates/timeField.html' + }, + + /** + * Field type which allows selection of color schemes accepted by the + * Guacamole server terminal emulator and protocols which leverage it. + * + * @see {@link Field.Type.TERMINAL_COLOR_SCHEME} + * @type FieldType + */ + 'TERMINAL_COLOR_SCHEME' : { + module : 'form', + controller : 'terminalColorSchemeFieldController', + templateUrl : 'app/form/templates/terminalColorSchemeField.html' + }, + + /** + * Field type that supports redirecting the client browser to another + * URL. + * + * @see {@link Field.Type.REDIRECT} + * @type FieldType + */ + 'REDIRECT' : { + module : 'form', + controller : 'redirectFieldController', + templateUrl : 'app/form/templates/redirectField.html' + } + + }; + + /** + * Registers a new field type under the given name. + * + * @param {String} fieldTypeName + * The name which uniquely identifies the field type being registered. + * + * @param {FieldType} fieldType + * The field type definition to associate with the given name. + */ + this.registerFieldType = function registerFieldType(fieldTypeName, fieldType) { + + // Store field type + provider.fieldTypes[fieldTypeName] = fieldType; + + }; + + // Factory method required by provider + this.$get = ['$injector', function formServiceFactory($injector) { + + // Required services + var $compile = $injector.get('$compile'); + var $q = $injector.get('$q'); + var $templateRequest = $injector.get('$templateRequest'); + + /** + * Map of module name to the injector instance created for that module. + * + * @type {Object.} + */ + var injectors = {}; + + var service = {}; + + service.fieldTypes = provider.fieldTypes; + + /** + * Given the name of a module, returns an injector instance which + * injects dependencies within that module. A new injector may be + * created and initialized if no such injector has yet been requested. + * If the injector available to formService already includes the + * requested module, that injector will simply be returned. + * + * @param {String} module + * The name of the module to produce an injector for. + * + * @returns {injector} + * An injector instance which injects dependencies for the given + * module. + */ + var getInjector = function getInjector(module) { + + // Use the formService's injector if possible + if ($injector.modules[module]) + return $injector; + + // If the formService's injector does not include the requested + // module, create the necessary injector, reusing that injector for + // future calls + injectors[module] = injectors[module] || angular.injector(['ng', module]); + return injectors[module]; + + }; + + /** + * Given form content and an arbitrary prefix, returns a corresponding + * CSS class object as would be provided to the ngClass directive that + * assigns a content-specific CSS class based on the prefix and + * form/field name. Generated class names follow the lowercase with + * dashes naming convention. For example, if the prefix is "field-" and + * the provided content is a field with the name "Swap red/blue", the + * object { 'field-swap-red-blue' : true } would be returned. + * + * @param {!string} prefix + * The arbitrary prefix to prepend to the name of the generated CSS + * class. + * + * @param {!(Form|Field)} [content] + * The form or field whose name should be used to produce the CSS + * class name. + * + * @param {Object.} [object={}] + * The optional base ngClass object that should be used to provide + * additional name/value pairs within the returned object. + * + * @return {!Object.} + * The ngClass object based on the provided object and defining a + * CSS class name for the given content. + */ + service.getClasses = function getClasses(prefix, content, object) { + + // Default to no additional properties + object = object || {}; + + // Perform no transformation if there is no content or + // corresponding name + if (!content || !content.name) + return object; + + // Transform content name and prefix into lowercase-with-dashes + // CSS class name + var className = prefix + content.name.replace(/[^a-zA-Z0-9]+/g, '-').toLowerCase(); + + // Add CSS class name to provided base object (without touching + // base object) + var classes = angular.extend({}, object); + classes[className] = true; + return classes; + + }; + + /** + * Compiles and links the field associated with the given name to the given + * scope, producing a distinct and independent DOM Element which functions + * as an instance of that field. The scope object provided must include at + * least the following properties: + * + * namespace: + * A String which defines the unique namespace associated the + * translation strings used by the form using a field of this type. + * + * fieldId: + * A String value which is reasonably likely to be unique and may + * be used to associate the main element of the field with its + * label. + * + * field: + * The Field object that is being rendered, representing a field of + * this type. + * + * model: + * The current String value of the field, if any. + * + * disabled: + * A boolean value which is true if the field should be disabled. + * If false or undefined, the field should be enabled. + * + * @param {Element} fieldContainer + * The DOM Element whose contents should be replaced with the + * compiled field template. + * + * @param {String} fieldTypeName + * The name of the field type defining the nature of the element to be + * created. + * + * @param {Object} scope + * The scope to which the new element will be linked. + * + * @return {Promise.} + * A Promise which resolves to the compiled Element. If an error occurs + * while retrieving the field type, this Promise will be rejected. + */ + service.insertFieldElement = function insertFieldElement(fieldContainer, + fieldTypeName, scope) { + + // Ensure field type is defined + var fieldType = provider.fieldTypes[fieldTypeName]; + if (!fieldType) + return $q.reject(); + + var templateRequest; + + // Use raw HTML template if provided + if (fieldType.template) { + var deferredTemplate = $q.defer(); + deferredTemplate.resolve(fieldType.template); + templateRequest = deferredTemplate.promise; + } + + // If no raw HTML template is provided, retrieve template from URL + else if (fieldType.templateUrl) + templateRequest = $templateRequest(fieldType.templateUrl); + + // Otherwise, use empty template + else { + var emptyTemplate= $q.defer(); + emptyTemplate.resolve(''); + templateRequest = emptyTemplate.promise; + } + + // Defer compilation of template pending successful retrieval + var compiledTemplate = $q.defer(); + + // Resolve with compiled HTML upon success + templateRequest.then(function templateRetrieved(html) { + + // Insert template into DOM + fieldContainer.innerHTML = html; + + // Populate scope using defined controller + if (fieldType.module && fieldType.controller) { + var $controller = getInjector(fieldType.module).get('$controller'); + $controller(fieldType.controller, { + '$scope' : scope, + '$element' : angular.element(fieldContainer.childNodes) + }); + } + + // Compile DOM with populated scope + compiledTemplate.resolve($compile(fieldContainer.childNodes)(scope)); + + }) + + // Reject on failure + ['catch'](function templateError() { + compiledTemplate.reject(); + }); + + // Return promise which resolves to the compiled template + return compiledTemplate.promise; + + }; + + return service; + + }]; + +}); diff --git a/guacamole/src/main/frontend/src/app/form/styles/form-field.css b/guacamole/src/main/frontend/src/app/form/styles/form-field.css new file mode 100644 index 0000000..a94b94a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/styles/form-field.css @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* Keep toggle-password icon on same line */ +.form-field .password-field { + white-space: nowrap; +} + +/* Generic 1x1em icon/button */ +.form-field .password-field .icon.toggle-password { + + display: inline-block; + opacity: 0.5; + cursor: default; + + background-repeat: no-repeat; + background-size: 1em; + width: 1em; + height: 1em; + +} + +/* Icon for unmasking passwords */ +.form-field .password-field input[type=password] ~ .icon.toggle-password { + background-image: url('images/action-icons/guac-show-pass.svg'); +} + +/* Icon for masking passwords */ +.form-field .password-field input[type=text] ~ .icon.toggle-password { + background-image: url('images/action-icons/guac-hide-pass.svg'); +} diff --git a/guacamole/src/main/frontend/src/app/form/styles/form.css b/guacamole/src/main/frontend/src/app/form/styles/form.css new file mode 100644 index 0000000..963d31c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/styles/form.css @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.form table.fields th { + text-align: left; + font-weight: normal; + padding-right: 1em; +} diff --git a/guacamole/src/main/frontend/src/app/form/styles/redirect-field.css b/guacamole/src/main/frontend/src/app/form/styles/redirect-field.css new file mode 100644 index 0000000..8df06c6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/styles/redirect-field.css @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.redirect-field-container { + height: 100%; + width: 100%; + position: fixed; + left: 0; + top: 0; + display: table; + background: white; +} + +.redirect-field { + width: 100%; + display: table-cell; + vertical-align: middle; + text-align: center; +} diff --git a/guacamole/src/main/frontend/src/app/form/styles/terminal-color-scheme-field.css b/guacamole/src/main/frontend/src/app/form/styles/terminal-color-scheme-field.css new file mode 100644 index 0000000..01eac1a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/styles/terminal-color-scheme-field.css @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.terminal-color-scheme-field { + max-width: 320px; +} + +.terminal-color-scheme-field select { + width: 100%; +} + +.terminal-color-scheme-field .custom-color-scheme { + background: #EEE; + padding: 0.5em; + border: 1px solid silver; + border-spacing: 0; + margin-top: -2px; + width: 100%; +} + +.terminal-color-scheme-field .custom-color-scheme-section { + display: -ms-flexbox; + display: -moz-box; + display: -webkit-box; + display: -webkit-flex; + display: flex; +} + +.terminal-color-scheme-field .guac-input-color { + + display: block; + margin: 2px; + width: 1.5em; + height: 1.5em; + min-width: 1.25em; + border-radius: 0.15em; + line-height: 1.5em; + text-align: center; + font-size: 0.75em; + cursor: pointer; + color: black; + + -ms-flex: 1; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; + +} + +.terminal-color-scheme-field .guac-input-color.read-only { + cursor: not-allowed; +} + +.terminal-color-scheme-field .guac-input-color.dark { + color: white; +} + +.terminal-color-scheme-field .palette .guac-input-color { + font-weight: bold; +} + +/* Hide palette numbers unless color scheme details are visible */ +.terminal-color-scheme-field.custom-color-scheme-details-hidden .custom-color-scheme .palette .guac-input-color { + color: transparent; +} + +/* + * Custom color scheme details header + */ + +.terminal-color-scheme-field .custom-color-scheme-details-header { + font-size: 0.8em; + margin: 0.5em 0; + padding: 0; +} + +.terminal-color-scheme-field .custom-color-scheme-details-header::before { + content: '▸ '; +} + +.terminal-color-scheme-field.custom-color-scheme-details-visible .custom-color-scheme-details-header::before { + content: '▾ '; +} + +/* + * Details show/hide link + */ + +/* Render show/hide as a link */ +.terminal-color-scheme-field .custom-color-scheme-hide-details, +.terminal-color-scheme-field .custom-color-scheme-show-details { + color: blue; + text-decoration: underline; + cursor: pointer; + margin: 0 0.25em; + font-weight: normal; +} + +.terminal-color-scheme-field .custom-color-scheme-hide-details { + display: none; +} + +.terminal-color-scheme-field.custom-color-scheme-details-visible .custom-color-scheme-hide-details { + display: inline; +} + +.terminal-color-scheme-field.custom-color-scheme-details-visible .custom-color-scheme-show-details { + display: none; +} + +/* + * Color scheme details + */ + +.terminal-color-scheme-field .custom-color-scheme-details { + display: none; +} + +.terminal-color-scheme-field.custom-color-scheme-details-visible .custom-color-scheme-details { + display: block; + width: 100%; + margin: 0.5em 0; +} + +/* + * Color picker + */ + +/* Increase width of color picker to allow two even rows of eight color + * swatches */ +.guac-input-color-picker[data-theme="monolith"] { + width: 16.25em; +} + +/* Remove Guacamole-specific styles inherited from the generic button rules */ +.guac-input-color-picker[data-theme="monolith"] button { + min-width: 0; + padding: 0; + margin: 0; + box-shadow: none; +} diff --git a/guacamole/src/main/frontend/src/app/form/templates/checkboxField.html b/guacamole/src/main/frontend/src/app/form/templates/checkboxField.html new file mode 100644 index 0000000..39d1f6b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/checkboxField.html @@ -0,0 +1,10 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/dateField.html b/guacamole/src/main/frontend/src/app/form/templates/dateField.html new file mode 100644 index 0000000..93a231f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/dateField.html @@ -0,0 +1,13 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/emailField.html b/guacamole/src/main/frontend/src/app/form/templates/emailField.html new file mode 100644 index 0000000..c5170b7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/emailField.html @@ -0,0 +1,12 @@ + diff --git a/guacamole/src/main/frontend/src/app/form/templates/form.html b/guacamole/src/main/frontend/src/app/form/templates/form.html new file mode 100644 index 0000000..642c577 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/form.html @@ -0,0 +1,21 @@ +
      +
      + + +

      {{getSectionHeader(form) | translate}}

      + + +
      + +
      + +
      +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/formField.html b/guacamole/src/main/frontend/src/app/form/templates/formField.html new file mode 100644 index 0000000..8534515 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/formField.html @@ -0,0 +1,12 @@ +
      + + +
      + +
      + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/guacInputColor.html b/guacamole/src/main/frontend/src/app/form/templates/guacInputColor.html new file mode 100644 index 0000000..eae1f66 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/guacInputColor.html @@ -0,0 +1,11 @@ +
      + +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/form/templates/languageField.html b/guacamole/src/main/frontend/src/app/form/templates/languageField.html new file mode 100644 index 0000000..a19d21c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/languageField.html @@ -0,0 +1,7 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/numberField.html b/guacamole/src/main/frontend/src/app/form/templates/numberField.html new file mode 100644 index 0000000..1bf58a1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/numberField.html @@ -0,0 +1,10 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/passwordField.html b/guacamole/src/main/frontend/src/app/form/templates/passwordField.html new file mode 100644 index 0000000..17cfc0a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/passwordField.html @@ -0,0 +1,12 @@ +
      + +
      +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/redirectField.html b/guacamole/src/main/frontend/src/app/form/templates/redirectField.html new file mode 100644 index 0000000..2dffa63 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/redirectField.html @@ -0,0 +1,8 @@ +
      +
      +

      +

      +
      +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/form/templates/selectField.html b/guacamole/src/main/frontend/src/app/form/templates/selectField.html new file mode 100644 index 0000000..6355275 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/selectField.html @@ -0,0 +1,8 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/terminalColorSchemeField.html b/guacamole/src/main/frontend/src/app/form/templates/terminalColorSchemeField.html new file mode 100644 index 0000000..027f4e7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/terminalColorSchemeField.html @@ -0,0 +1,65 @@ +
      + + + + + +
      + + +
      + + {{ 'COLOR_SCHEME.FIELD_HEADER_FOREGROUND' | translate }} + +
      + + +
      + + {{ 'COLOR_SCHEME.FIELD_HEADER_BACKGROUND' | translate }} + +
      + + +
      + + {{ index }} + +
      + + +
      + + {{ index }} + +
      + +
      + + +

      + {{'COLOR_SCHEME.SECTION_HEADER_DETAILS' | translate}} + {{'COLOR_SCHEME.ACTION_SHOW_DETAILS' | translate}} + {{'COLOR_SCHEME.ACTION_HIDE_DETAILS' | translate}} +

      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/textAreaField.html b/guacamole/src/main/frontend/src/app/form/templates/textAreaField.html new file mode 100644 index 0000000..4e63eb5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/textAreaField.html @@ -0,0 +1,9 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/textField.html b/guacamole/src/main/frontend/src/app/form/templates/textField.html new file mode 100644 index 0000000..fac7b38 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/textField.html @@ -0,0 +1,15 @@ +
      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/timeField.html b/guacamole/src/main/frontend/src/app/form/templates/timeField.html new file mode 100644 index 0000000..0b33f5f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/timeField.html @@ -0,0 +1,13 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/timeZoneField.html b/guacamole/src/main/frontend/src/app/form/templates/timeZoneField.html new file mode 100644 index 0000000..690bf68 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/timeZoneField.html @@ -0,0 +1,18 @@ +
      + + + + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/form/templates/usernameField.html b/guacamole/src/main/frontend/src/app/form/templates/usernameField.html new file mode 100644 index 0000000..6a5c664 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/templates/usernameField.html @@ -0,0 +1,10 @@ +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/form/types/ColorScheme.js b/guacamole/src/main/frontend/src/app/form/types/ColorScheme.js new file mode 100644 index 0000000..f51a667 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/types/ColorScheme.js @@ -0,0 +1,949 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ColorScheme class. + */ +angular.module('form').factory('ColorScheme', [function defineColorScheme() { + + /** + * Intermediate representation of a custom color scheme which can be + * converted to the color scheme format used by Guacamole's terminal + * emulator. All colors must be represented in the six-digit hexadecimal + * RGB notation used by HTML ("#000000" for black, etc.). + * + * @constructor + * @param {ColorScheme|Object} [template={}] + * The object whose properties should be copied within the new + * ColorScheme. + */ + var ColorScheme = function ColorScheme(template) { + + // Use empty object by default + template = template || {}; + + /** + * The terminal background color. This will be the default foreground + * color of the Guacamole terminal emulator ("#000000") by default. + * + * @type {String} + */ + this.background = template.background || '#000000'; + + /** + * The terminal foreground color. This will be the default foreground + * color of the Guacamole terminal emulator ("#999999") by default. + * + * @type {String} + */ + this.foreground = template.foreground || '#999999'; + + /** + * The terminal color palette. Default values are provided for the + * normal 16 terminal colors using the default values of the Guacamole + * terminal emulator, however the terminal emulator and this + * representation support up to 256 colors. + * + * @type {String[]} + */ + this.colors = template.colors || [ + + // Normal colors + '#000000', // Black + '#993E3E', // Red + '#3E993E', // Green + '#99993E', // Brown + '#3E3E99', // Blue + '#993E99', // Magenta + '#3E9999', // Cyan + '#999999', // White + + // Intense colors + '#3E3E3E', // Black + '#FF6767', // Red + '#67FF67', // Green + '#FFFF67', // Brown + '#6767FF', // Blue + '#FF67FF', // Magenta + '#67FFFF', // Cyan + '#FFFFFF' // White + + ]; + + /** + * The string which was parsed to produce this ColorScheme instance, if + * ColorScheme.fromString() was used to produce this ColorScheme. + * + * @private + * @type {String} + */ + this._originalString = template._originalString; + + }; + + /** + * Given a color string in the standard 6-digit hexadecimal RGB format, + * returns a X11 color spec which represents the same color. + * + * @param {String} color + * The hexadecimal color string to convert. + * + * @returns {String} + * The X11 color spec representing the same color as the given + * hexadecimal string, or null if the given string is not a valid + * 6-digit hexadecimal RGB color. + */ + var fromHexColor = function fromHexColor(color) { + + var groups = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/.exec(color); + if (!groups) + return null; + + return 'rgb:' + groups[1] + '/' + groups[2] + '/' + groups[3]; + + }; + + /** + * Parses the same subset of the X11 color spec supported by the Guacamole + * terminal emulator (the "rgb:*" format), returning the equivalent 6-digit + * hexadecimal color string supported by the ColorScheme representation. + * The X11 color spec defined by Xlib's XParseColor(). The human-readable + * color names supported by the Guacamole terminal emulator (the same color + * names as supported by xterm) may also be used. + * + * @param {String} color + * The X11 color spec to parse, or the name of a known named color. + * + * @returns {String} + * The 6-digit hexadecimal color string which represents the same color + * as the given X11 color spec/name, or null if the given spec/name is + * invalid. + */ + var toHexColor = function toHexColor(color) { + + /** + * Shifts or truncates the given hexadecimal string such that it + * contains exactly two hexadecimal digits, as required by any + * individual color component of the 6-digit hexadecimal RGB format. + * + * @param {String} component + * The hexadecimal string to shift or truncate to two digits. + * + * @returns {String} + * A new 2-digit hexadecimal string containing the same digits as + * the provided string, shifted or truncated as necessary to fit + * within the 2-digit length limit. + */ + var toHexComponent = function toHexComponent(component) { + return (component + '0').substring(0, 2).toUpperCase(); + }; + + // Attempt to parse any non-RGB color as a named color + var groups = /^rgb:([0-9A-Fa-f]{1,4})\/([0-9A-Fa-f]{1,4})\/([0-9A-Fa-f]{1,4})$/.exec(color); + if (!groups) + return ColorScheme.NAMED_COLORS[color.toLowerCase()] || null; + + // Convert to standard 6-digit hexadecimal RGB format + return '#' + toHexComponent(groups[1]) + toHexComponent(groups[2]) + toHexComponent(groups[3]); + + }; + + /** + * Converts the given string representation of a color scheme which is + * supported by the Guacamole terminal emulator to a corresponding, + * intermediate ColorScheme object. + * + * @param {String} str + * An arbitrary color scheme, in the string format supported by the + * Guacamole terminal emulator. + * + * @returns {ColorScheme} + * A new ColorScheme instance which represents the same color scheme as + * the given string. + */ + ColorScheme.fromString = function fromString(str) { + + var scheme = new ColorScheme({ _originalString : str }); + + // For each semicolon-separated statement in the provided color scheme + var statements = str.split(/;/); + for (var i = 0; i < statements.length; i++) { + + // Skip any statements which cannot be parsed + var statement = statements[i]; + var groups = /^\s*(background|foreground|color([0-9]+))\s*:\s*(\S*)\s*$/.exec(statement); + if (!groups) + continue; + + // If the statement is valid and contains a valid color, map that + // color to the appropriate property of the ColorScheme object + var color = toHexColor(groups[3]); + if (color) { + if (groups[1] === 'background') + scheme.background = color; + else if (groups[1] === 'foreground') + scheme.foreground = color; + else + scheme.colors[parseInt(groups[2])] = color; + } + + } + + return scheme; + + }; + + /** + * Returns whether the two given color schemes define the exact same + * colors. + * + * @param {ColorScheme} a + * The first ColorScheme to compare. + * + * @param {ColorScheme} b + * The second ColorScheme to compare. + * + * @returns {Boolean} + * true if both color schemes contain the same colors, false otherwise. + */ + ColorScheme.equals = function equals(a, b) { + return a.foreground === b.foreground + && a.background === b.background + && _.isEqual(a.colors, b.colors); + }; + + /** + * Converts the given ColorScheme to a string representation which is + * supported by the Guacamole terminal emulator. + * + * @param {ColorScheme} scheme + * The ColorScheme to convert to a string. + * + * @returns {String} + * The given color scheme, converted to the string format supported by + * the Guacamole terminal emulator. + */ + ColorScheme.toString = function toString(scheme) { + + // Use originally-provided string if it equates to the exact same color scheme + if (!_.isUndefined(scheme._originalString) && ColorScheme.equals(scheme, ColorScheme.fromString(scheme._originalString))) + return scheme._originalString; + + // Add background and foreground + var str = 'background: ' + fromHexColor(scheme.background) + ';\n' + + 'foreground: ' + fromHexColor(scheme.foreground) + ';'; + + // Add color definitions for each palette entry + for (var index in scheme.colors) + str += '\ncolor' + index + ': ' + fromHexColor(scheme.colors[index]) + ';'; + + return str; + + }; + + /** + * The set of all named colors supported by the Guacamole terminal + * emulator and their corresponding 6-digit hexadecimal RGB + * representations. This set should contain all colors supported by xterm. + * + * @constant + * @type {Object.} + */ + ColorScheme.NAMED_COLORS = { + 'aliceblue' : '#F0F8FF', + 'antiquewhite' : '#FAEBD7', + 'antiquewhite1' : '#FFEFDB', + 'antiquewhite2' : '#EEDFCC', + 'antiquewhite3' : '#CDC0B0', + 'antiquewhite4' : '#8B8378', + 'aqua' : '#00FFFF', + 'aquamarine' : '#7FFFD4', + 'aquamarine1' : '#7FFFD4', + 'aquamarine2' : '#76EEC6', + 'aquamarine3' : '#66CDAA', + 'aquamarine4' : '#458B74', + 'azure' : '#F0FFFF', + 'azure1' : '#F0FFFF', + 'azure2' : '#E0EEEE', + 'azure3' : '#C1CDCD', + 'azure4' : '#838B8B', + 'beige' : '#F5F5DC', + 'bisque' : '#FFE4C4', + 'bisque1' : '#FFE4C4', + 'bisque2' : '#EED5B7', + 'bisque3' : '#CDB79E', + 'bisque4' : '#8B7D6B', + 'black' : '#000000', + 'blanchedalmond' : '#FFEBCD', + 'blue' : '#0000FF', + 'blue1' : '#0000FF', + 'blue2' : '#0000EE', + 'blue3' : '#0000CD', + 'blue4' : '#00008B', + 'blueviolet' : '#8A2BE2', + 'brown' : '#A52A2A', + 'brown1' : '#FF4040', + 'brown2' : '#EE3B3B', + 'brown3' : '#CD3333', + 'brown4' : '#8B2323', + 'burlywood' : '#DEB887', + 'burlywood1' : '#FFD39B', + 'burlywood2' : '#EEC591', + 'burlywood3' : '#CDAA7D', + 'burlywood4' : '#8B7355', + 'cadetblue' : '#5F9EA0', + 'cadetblue1' : '#98F5FF', + 'cadetblue2' : '#8EE5EE', + 'cadetblue3' : '#7AC5CD', + 'cadetblue4' : '#53868B', + 'chartreuse' : '#7FFF00', + 'chartreuse1' : '#7FFF00', + 'chartreuse2' : '#76EE00', + 'chartreuse3' : '#66CD00', + 'chartreuse4' : '#458B00', + 'chocolate' : '#D2691E', + 'chocolate1' : '#FF7F24', + 'chocolate2' : '#EE7621', + 'chocolate3' : '#CD661D', + 'chocolate4' : '#8B4513', + 'coral' : '#FF7F50', + 'coral1' : '#FF7256', + 'coral2' : '#EE6A50', + 'coral3' : '#CD5B45', + 'coral4' : '#8B3E2F', + 'cornflowerblue' : '#6495ED', + 'cornsilk' : '#FFF8DC', + 'cornsilk1' : '#FFF8DC', + 'cornsilk2' : '#EEE8CD', + 'cornsilk3' : '#CDC8B1', + 'cornsilk4' : '#8B8878', + 'crimson' : '#DC143C', + 'cyan' : '#00FFFF', + 'cyan1' : '#00FFFF', + 'cyan2' : '#00EEEE', + 'cyan3' : '#00CDCD', + 'cyan4' : '#008B8B', + 'darkblue' : '#00008B', + 'darkcyan' : '#008B8B', + 'darkgoldenrod' : '#B8860B', + 'darkgoldenrod1' : '#FFB90F', + 'darkgoldenrod2' : '#EEAD0E', + 'darkgoldenrod3' : '#CD950C', + 'darkgoldenrod4' : '#8B6508', + 'darkgray' : '#A9A9A9', + 'darkgreen' : '#006400', + 'darkgrey' : '#A9A9A9', + 'darkkhaki' : '#BDB76B', + 'darkmagenta' : '#8B008B', + 'darkolivegreen' : '#556B2F', + 'darkolivegreen1' : '#CAFF70', + 'darkolivegreen2' : '#BCEE68', + 'darkolivegreen3' : '#A2CD5A', + 'darkolivegreen4' : '#6E8B3D', + 'darkorange' : '#FF8C00', + 'darkorange1' : '#FF7F00', + 'darkorange2' : '#EE7600', + 'darkorange3' : '#CD6600', + 'darkorange4' : '#8B4500', + 'darkorchid' : '#9932CC', + 'darkorchid1' : '#BF3EFF', + 'darkorchid2' : '#B23AEE', + 'darkorchid3' : '#9A32CD', + 'darkorchid4' : '#68228B', + 'darkred' : '#8B0000', + 'darksalmon' : '#E9967A', + 'darkseagreen' : '#8FBC8F', + 'darkseagreen1' : '#C1FFC1', + 'darkseagreen2' : '#B4EEB4', + 'darkseagreen3' : '#9BCD9B', + 'darkseagreen4' : '#698B69', + 'darkslateblue' : '#483D8B', + 'darkslategray' : '#2F4F4F', + 'darkslategray1' : '#97FFFF', + 'darkslategray2' : '#8DEEEE', + 'darkslategray3' : '#79CDCD', + 'darkslategray4' : '#528B8B', + 'darkslategrey' : '#2F4F4F', + 'darkturquoise' : '#00CED1', + 'darkviolet' : '#9400D3', + 'deeppink' : '#FF1493', + 'deeppink1' : '#FF1493', + 'deeppink2' : '#EE1289', + 'deeppink3' : '#CD1076', + 'deeppink4' : '#8B0A50', + 'deepskyblue' : '#00BFFF', + 'deepskyblue1' : '#00BFFF', + 'deepskyblue2' : '#00B2EE', + 'deepskyblue3' : '#009ACD', + 'deepskyblue4' : '#00688B', + 'dimgray' : '#696969', + 'dimgrey' : '#696969', + 'dodgerblue' : '#1E90FF', + 'dodgerblue1' : '#1E90FF', + 'dodgerblue2' : '#1C86EE', + 'dodgerblue3' : '#1874CD', + 'dodgerblue4' : '#104E8B', + 'firebrick' : '#B22222', + 'firebrick1' : '#FF3030', + 'firebrick2' : '#EE2C2C', + 'firebrick3' : '#CD2626', + 'firebrick4' : '#8B1A1A', + 'floralwhite' : '#FFFAF0', + 'forestgreen' : '#228B22', + 'fuchsia' : '#FF00FF', + 'gainsboro' : '#DCDCDC', + 'ghostwhite' : '#F8F8FF', + 'gold' : '#FFD700', + 'gold1' : '#FFD700', + 'gold2' : '#EEC900', + 'gold3' : '#CDAD00', + 'gold4' : '#8B7500', + 'goldenrod' : '#DAA520', + 'goldenrod1' : '#FFC125', + 'goldenrod2' : '#EEB422', + 'goldenrod3' : '#CD9B1D', + 'goldenrod4' : '#8B6914', + 'gray' : '#BEBEBE', + 'gray0' : '#000000', + 'gray1' : '#030303', + 'gray10' : '#1A1A1A', + 'gray100' : '#FFFFFF', + 'gray11' : '#1C1C1C', + 'gray12' : '#1F1F1F', + 'gray13' : '#212121', + 'gray14' : '#242424', + 'gray15' : '#262626', + 'gray16' : '#292929', + 'gray17' : '#2B2B2B', + 'gray18' : '#2E2E2E', + 'gray19' : '#303030', + 'gray2' : '#050505', + 'gray20' : '#333333', + 'gray21' : '#363636', + 'gray22' : '#383838', + 'gray23' : '#3B3B3B', + 'gray24' : '#3D3D3D', + 'gray25' : '#404040', + 'gray26' : '#424242', + 'gray27' : '#454545', + 'gray28' : '#474747', + 'gray29' : '#4A4A4A', + 'gray3' : '#080808', + 'gray30' : '#4D4D4D', + 'gray31' : '#4F4F4F', + 'gray32' : '#525252', + 'gray33' : '#545454', + 'gray34' : '#575757', + 'gray35' : '#595959', + 'gray36' : '#5C5C5C', + 'gray37' : '#5E5E5E', + 'gray38' : '#616161', + 'gray39' : '#636363', + 'gray4' : '#0A0A0A', + 'gray40' : '#666666', + 'gray41' : '#696969', + 'gray42' : '#6B6B6B', + 'gray43' : '#6E6E6E', + 'gray44' : '#707070', + 'gray45' : '#737373', + 'gray46' : '#757575', + 'gray47' : '#787878', + 'gray48' : '#7A7A7A', + 'gray49' : '#7D7D7D', + 'gray5' : '#0D0D0D', + 'gray50' : '#7F7F7F', + 'gray51' : '#828282', + 'gray52' : '#858585', + 'gray53' : '#878787', + 'gray54' : '#8A8A8A', + 'gray55' : '#8C8C8C', + 'gray56' : '#8F8F8F', + 'gray57' : '#919191', + 'gray58' : '#949494', + 'gray59' : '#969696', + 'gray6' : '#0F0F0F', + 'gray60' : '#999999', + 'gray61' : '#9C9C9C', + 'gray62' : '#9E9E9E', + 'gray63' : '#A1A1A1', + 'gray64' : '#A3A3A3', + 'gray65' : '#A6A6A6', + 'gray66' : '#A8A8A8', + 'gray67' : '#ABABAB', + 'gray68' : '#ADADAD', + 'gray69' : '#B0B0B0', + 'gray7' : '#121212', + 'gray70' : '#B3B3B3', + 'gray71' : '#B5B5B5', + 'gray72' : '#B8B8B8', + 'gray73' : '#BABABA', + 'gray74' : '#BDBDBD', + 'gray75' : '#BFBFBF', + 'gray76' : '#C2C2C2', + 'gray77' : '#C4C4C4', + 'gray78' : '#C7C7C7', + 'gray79' : '#C9C9C9', + 'gray8' : '#141414', + 'gray80' : '#CCCCCC', + 'gray81' : '#CFCFCF', + 'gray82' : '#D1D1D1', + 'gray83' : '#D4D4D4', + 'gray84' : '#D6D6D6', + 'gray85' : '#D9D9D9', + 'gray86' : '#DBDBDB', + 'gray87' : '#DEDEDE', + 'gray88' : '#E0E0E0', + 'gray89' : '#E3E3E3', + 'gray9' : '#171717', + 'gray90' : '#E5E5E5', + 'gray91' : '#E8E8E8', + 'gray92' : '#EBEBEB', + 'gray93' : '#EDEDED', + 'gray94' : '#F0F0F0', + 'gray95' : '#F2F2F2', + 'gray96' : '#F5F5F5', + 'gray97' : '#F7F7F7', + 'gray98' : '#FAFAFA', + 'gray99' : '#FCFCFC', + 'green' : '#00FF00', + 'green1' : '#00FF00', + 'green2' : '#00EE00', + 'green3' : '#00CD00', + 'green4' : '#008B00', + 'greenyellow' : '#ADFF2F', + 'grey' : '#BEBEBE', + 'grey0' : '#000000', + 'grey1' : '#030303', + 'grey10' : '#1A1A1A', + 'grey100' : '#FFFFFF', + 'grey11' : '#1C1C1C', + 'grey12' : '#1F1F1F', + 'grey13' : '#212121', + 'grey14' : '#242424', + 'grey15' : '#262626', + 'grey16' : '#292929', + 'grey17' : '#2B2B2B', + 'grey18' : '#2E2E2E', + 'grey19' : '#303030', + 'grey2' : '#050505', + 'grey20' : '#333333', + 'grey21' : '#363636', + 'grey22' : '#383838', + 'grey23' : '#3B3B3B', + 'grey24' : '#3D3D3D', + 'grey25' : '#404040', + 'grey26' : '#424242', + 'grey27' : '#454545', + 'grey28' : '#474747', + 'grey29' : '#4A4A4A', + 'grey3' : '#080808', + 'grey30' : '#4D4D4D', + 'grey31' : '#4F4F4F', + 'grey32' : '#525252', + 'grey33' : '#545454', + 'grey34' : '#575757', + 'grey35' : '#595959', + 'grey36' : '#5C5C5C', + 'grey37' : '#5E5E5E', + 'grey38' : '#616161', + 'grey39' : '#636363', + 'grey4' : '#0A0A0A', + 'grey40' : '#666666', + 'grey41' : '#696969', + 'grey42' : '#6B6B6B', + 'grey43' : '#6E6E6E', + 'grey44' : '#707070', + 'grey45' : '#737373', + 'grey46' : '#757575', + 'grey47' : '#787878', + 'grey48' : '#7A7A7A', + 'grey49' : '#7D7D7D', + 'grey5' : '#0D0D0D', + 'grey50' : '#7F7F7F', + 'grey51' : '#828282', + 'grey52' : '#858585', + 'grey53' : '#878787', + 'grey54' : '#8A8A8A', + 'grey55' : '#8C8C8C', + 'grey56' : '#8F8F8F', + 'grey57' : '#919191', + 'grey58' : '#949494', + 'grey59' : '#969696', + 'grey6' : '#0F0F0F', + 'grey60' : '#999999', + 'grey61' : '#9C9C9C', + 'grey62' : '#9E9E9E', + 'grey63' : '#A1A1A1', + 'grey64' : '#A3A3A3', + 'grey65' : '#A6A6A6', + 'grey66' : '#A8A8A8', + 'grey67' : '#ABABAB', + 'grey68' : '#ADADAD', + 'grey69' : '#B0B0B0', + 'grey7' : '#121212', + 'grey70' : '#B3B3B3', + 'grey71' : '#B5B5B5', + 'grey72' : '#B8B8B8', + 'grey73' : '#BABABA', + 'grey74' : '#BDBDBD', + 'grey75' : '#BFBFBF', + 'grey76' : '#C2C2C2', + 'grey77' : '#C4C4C4', + 'grey78' : '#C7C7C7', + 'grey79' : '#C9C9C9', + 'grey8' : '#141414', + 'grey80' : '#CCCCCC', + 'grey81' : '#CFCFCF', + 'grey82' : '#D1D1D1', + 'grey83' : '#D4D4D4', + 'grey84' : '#D6D6D6', + 'grey85' : '#D9D9D9', + 'grey86' : '#DBDBDB', + 'grey87' : '#DEDEDE', + 'grey88' : '#E0E0E0', + 'grey89' : '#E3E3E3', + 'grey9' : '#171717', + 'grey90' : '#E5E5E5', + 'grey91' : '#E8E8E8', + 'grey92' : '#EBEBEB', + 'grey93' : '#EDEDED', + 'grey94' : '#F0F0F0', + 'grey95' : '#F2F2F2', + 'grey96' : '#F5F5F5', + 'grey97' : '#F7F7F7', + 'grey98' : '#FAFAFA', + 'grey99' : '#FCFCFC', + 'honeydew' : '#F0FFF0', + 'honeydew1' : '#F0FFF0', + 'honeydew2' : '#E0EEE0', + 'honeydew3' : '#C1CDC1', + 'honeydew4' : '#838B83', + 'hotpink' : '#FF69B4', + 'hotpink1' : '#FF6EB4', + 'hotpink2' : '#EE6AA7', + 'hotpink3' : '#CD6090', + 'hotpink4' : '#8B3A62', + 'indianred' : '#CD5C5C', + 'indianred1' : '#FF6A6A', + 'indianred2' : '#EE6363', + 'indianred3' : '#CD5555', + 'indianred4' : '#8B3A3A', + 'indigo' : '#4B0082', + 'ivory' : '#FFFFF0', + 'ivory1' : '#FFFFF0', + 'ivory2' : '#EEEEE0', + 'ivory3' : '#CDCDC1', + 'ivory4' : '#8B8B83', + 'khaki' : '#F0E68C', + 'khaki1' : '#FFF68F', + 'khaki2' : '#EEE685', + 'khaki3' : '#CDC673', + 'khaki4' : '#8B864E', + 'lavender' : '#E6E6FA', + 'lavenderblush' : '#FFF0F5', + 'lavenderblush1' : '#FFF0F5', + 'lavenderblush2' : '#EEE0E5', + 'lavenderblush3' : '#CDC1C5', + 'lavenderblush4' : '#8B8386', + 'lawngreen' : '#7CFC00', + 'lemonchiffon' : '#FFFACD', + 'lemonchiffon1' : '#FFFACD', + 'lemonchiffon2' : '#EEE9BF', + 'lemonchiffon3' : '#CDC9A5', + 'lemonchiffon4' : '#8B8970', + 'lightblue' : '#ADD8E6', + 'lightblue1' : '#BFEFFF', + 'lightblue2' : '#B2DFEE', + 'lightblue3' : '#9AC0CD', + 'lightblue4' : '#68838B', + 'lightcoral' : '#F08080', + 'lightcyan' : '#E0FFFF', + 'lightcyan1' : '#E0FFFF', + 'lightcyan2' : '#D1EEEE', + 'lightcyan3' : '#B4CDCD', + 'lightcyan4' : '#7A8B8B', + 'lightgoldenrod' : '#EEDD82', + 'lightgoldenrod1' : '#FFEC8B', + 'lightgoldenrod2' : '#EEDC82', + 'lightgoldenrod3' : '#CDBE70', + 'lightgoldenrod4' : '#8B814C', + 'lightgoldenrodyellow' : '#FAFAD2', + 'lightgray' : '#D3D3D3', + 'lightgreen' : '#90EE90', + 'lightgrey' : '#D3D3D3', + 'lightpink' : '#FFB6C1', + 'lightpink1' : '#FFAEB9', + 'lightpink2' : '#EEA2AD', + 'lightpink3' : '#CD8C95', + 'lightpink4' : '#8B5F65', + 'lightsalmon' : '#FFA07A', + 'lightsalmon1' : '#FFA07A', + 'lightsalmon2' : '#EE9572', + 'lightsalmon3' : '#CD8162', + 'lightsalmon4' : '#8B5742', + 'lightseagreen' : '#20B2AA', + 'lightskyblue' : '#87CEFA', + 'lightskyblue1' : '#B0E2FF', + 'lightskyblue2' : '#A4D3EE', + 'lightskyblue3' : '#8DB6CD', + 'lightskyblue4' : '#607B8B', + 'lightslateblue' : '#8470FF', + 'lightslategray' : '#778899', + 'lightslategrey' : '#778899', + 'lightsteelblue' : '#B0C4DE', + 'lightsteelblue1' : '#CAE1FF', + 'lightsteelblue2' : '#BCD2EE', + 'lightsteelblue3' : '#A2B5CD', + 'lightsteelblue4' : '#6E7B8B', + 'lightyellow' : '#FFFFE0', + 'lightyellow1' : '#FFFFE0', + 'lightyellow2' : '#EEEED1', + 'lightyellow3' : '#CDCDB4', + 'lightyellow4' : '#8B8B7A', + 'lime' : '#00FF00', + 'limegreen' : '#32CD32', + 'linen' : '#FAF0E6', + 'magenta' : '#FF00FF', + 'magenta1' : '#FF00FF', + 'magenta2' : '#EE00EE', + 'magenta3' : '#CD00CD', + 'magenta4' : '#8B008B', + 'maroon' : '#B03060', + 'maroon1' : '#FF34B3', + 'maroon2' : '#EE30A7', + 'maroon3' : '#CD2990', + 'maroon4' : '#8B1C62', + 'mediumaquamarine' : '#66CDAA', + 'mediumblue' : '#0000CD', + 'mediumorchid' : '#BA55D3', + 'mediumorchid1' : '#E066FF', + 'mediumorchid2' : '#D15FEE', + 'mediumorchid3' : '#B452CD', + 'mediumorchid4' : '#7A378B', + 'mediumpurple' : '#9370DB', + 'mediumpurple1' : '#AB82FF', + 'mediumpurple2' : '#9F79EE', + 'mediumpurple3' : '#8968CD', + 'mediumpurple4' : '#5D478B', + 'mediumseagreen' : '#3CB371', + 'mediumslateblue' : '#7B68EE', + 'mediumspringgreen' : '#00FA9A', + 'mediumturquoise' : '#48D1CC', + 'mediumvioletred' : '#C71585', + 'midnightblue' : '#191970', + 'mintcream' : '#F5FFFA', + 'mistyrose' : '#FFE4E1', + 'mistyrose1' : '#FFE4E1', + 'mistyrose2' : '#EED5D2', + 'mistyrose3' : '#CDB7B5', + 'mistyrose4' : '#8B7D7B', + 'moccasin' : '#FFE4B5', + 'navajowhite' : '#FFDEAD', + 'navajowhite1' : '#FFDEAD', + 'navajowhite2' : '#EECFA1', + 'navajowhite3' : '#CDB38B', + 'navajowhite4' : '#8B795E', + 'navy' : '#000080', + 'navyblue' : '#000080', + 'oldlace' : '#FDF5E6', + 'olive' : '#808000', + 'olivedrab' : '#6B8E23', + 'olivedrab1' : '#C0FF3E', + 'olivedrab2' : '#B3EE3A', + 'olivedrab3' : '#9ACD32', + 'olivedrab4' : '#698B22', + 'orange' : '#FFA500', + 'orange1' : '#FFA500', + 'orange2' : '#EE9A00', + 'orange3' : '#CD8500', + 'orange4' : '#8B5A00', + 'orangered' : '#FF4500', + 'orangered1' : '#FF4500', + 'orangered2' : '#EE4000', + 'orangered3' : '#CD3700', + 'orangered4' : '#8B2500', + 'orchid' : '#DA70D6', + 'orchid1' : '#FF83FA', + 'orchid2' : '#EE7AE9', + 'orchid3' : '#CD69C9', + 'orchid4' : '#8B4789', + 'palegoldenrod' : '#EEE8AA', + 'palegreen' : '#98FB98', + 'palegreen1' : '#9AFF9A', + 'palegreen2' : '#90EE90', + 'palegreen3' : '#7CCD7C', + 'palegreen4' : '#548B54', + 'paleturquoise' : '#AFEEEE', + 'paleturquoise1' : '#BBFFFF', + 'paleturquoise2' : '#AEEEEE', + 'paleturquoise3' : '#96CDCD', + 'paleturquoise4' : '#668B8B', + 'palevioletred' : '#DB7093', + 'palevioletred1' : '#FF82AB', + 'palevioletred2' : '#EE799F', + 'palevioletred3' : '#CD6889', + 'palevioletred4' : '#8B475D', + 'papayawhip' : '#FFEFD5', + 'peachpuff' : '#FFDAB9', + 'peachpuff1' : '#FFDAB9', + 'peachpuff2' : '#EECBAD', + 'peachpuff3' : '#CDAF95', + 'peachpuff4' : '#8B7765', + 'peru' : '#CD853F', + 'pink' : '#FFC0CB', + 'pink1' : '#FFB5C5', + 'pink2' : '#EEA9B8', + 'pink3' : '#CD919E', + 'pink4' : '#8B636C', + 'plum' : '#DDA0DD', + 'plum1' : '#FFBBFF', + 'plum2' : '#EEAEEE', + 'plum3' : '#CD96CD', + 'plum4' : '#8B668B', + 'powderblue' : '#B0E0E6', + 'purple' : '#A020F0', + 'purple1' : '#9B30FF', + 'purple2' : '#912CEE', + 'purple3' : '#7D26CD', + 'purple4' : '#551A8B', + 'rebeccapurple' : '#663399', + 'red' : '#FF0000', + 'red1' : '#FF0000', + 'red2' : '#EE0000', + 'red3' : '#CD0000', + 'red4' : '#8B0000', + 'rosybrown' : '#BC8F8F', + 'rosybrown1' : '#FFC1C1', + 'rosybrown2' : '#EEB4B4', + 'rosybrown3' : '#CD9B9B', + 'rosybrown4' : '#8B6969', + 'royalblue' : '#4169E1', + 'royalblue1' : '#4876FF', + 'royalblue2' : '#436EEE', + 'royalblue3' : '#3A5FCD', + 'royalblue4' : '#27408B', + 'saddlebrown' : '#8B4513', + 'salmon' : '#FA8072', + 'salmon1' : '#FF8C69', + 'salmon2' : '#EE8262', + 'salmon3' : '#CD7054', + 'salmon4' : '#8B4C39', + 'sandybrown' : '#F4A460', + 'seagreen' : '#2E8B57', + 'seagreen1' : '#54FF9F', + 'seagreen2' : '#4EEE94', + 'seagreen3' : '#43CD80', + 'seagreen4' : '#2E8B57', + 'seashell' : '#FFF5EE', + 'seashell1' : '#FFF5EE', + 'seashell2' : '#EEE5DE', + 'seashell3' : '#CDC5BF', + 'seashell4' : '#8B8682', + 'sienna' : '#A0522D', + 'sienna1' : '#FF8247', + 'sienna2' : '#EE7942', + 'sienna3' : '#CD6839', + 'sienna4' : '#8B4726', + 'silver' : '#C0C0C0', + 'skyblue' : '#87CEEB', + 'skyblue1' : '#87CEFF', + 'skyblue2' : '#7EC0EE', + 'skyblue3' : '#6CA6CD', + 'skyblue4' : '#4A708B', + 'slateblue' : '#6A5ACD', + 'slateblue1' : '#836FFF', + 'slateblue2' : '#7A67EE', + 'slateblue3' : '#6959CD', + 'slateblue4' : '#473C8B', + 'slategray' : '#708090', + 'slategray1' : '#C6E2FF', + 'slategray2' : '#B9D3EE', + 'slategray3' : '#9FB6CD', + 'slategray4' : '#6C7B8B', + 'slategrey' : '#708090', + 'snow' : '#FFFAFA', + 'snow1' : '#FFFAFA', + 'snow2' : '#EEE9E9', + 'snow3' : '#CDC9C9', + 'snow4' : '#8B8989', + 'springgreen' : '#00FF7F', + 'springgreen1' : '#00FF7F', + 'springgreen2' : '#00EE76', + 'springgreen3' : '#00CD66', + 'springgreen4' : '#008B45', + 'steelblue' : '#4682B4', + 'steelblue1' : '#63B8FF', + 'steelblue2' : '#5CACEE', + 'steelblue3' : '#4F94CD', + 'steelblue4' : '#36648B', + 'tan' : '#D2B48C', + 'tan1' : '#FFA54F', + 'tan2' : '#EE9A49', + 'tan3' : '#CD853F', + 'tan4' : '#8B5A2B', + 'teal' : '#008080', + 'thistle' : '#D8BFD8', + 'thistle1' : '#FFE1FF', + 'thistle2' : '#EED2EE', + 'thistle3' : '#CDB5CD', + 'thistle4' : '#8B7B8B', + 'tomato' : '#FF6347', + 'tomato1' : '#FF6347', + 'tomato2' : '#EE5C42', + 'tomato3' : '#CD4F39', + 'tomato4' : '#8B3626', + 'turquoise' : '#40E0D0', + 'turquoise1' : '#00F5FF', + 'turquoise2' : '#00E5EE', + 'turquoise3' : '#00C5CD', + 'turquoise4' : '#00868B', + 'violet' : '#EE82EE', + 'violetred' : '#D02090', + 'violetred1' : '#FF3E96', + 'violetred2' : '#EE3A8C', + 'violetred3' : '#CD3278', + 'violetred4' : '#8B2252', + 'webgray' : '#808080', + 'webgreen' : '#008000', + 'webgrey' : '#808080', + 'webmaroon' : '#800000', + 'webpurple' : '#800080', + 'wheat' : '#F5DEB3', + 'wheat1' : '#FFE7BA', + 'wheat2' : '#EED8AE', + 'wheat3' : '#CDBA96', + 'wheat4' : '#8B7E66', + 'white' : '#FFFFFF', + 'whitesmoke' : '#F5F5F5', + 'x11gray' : '#BEBEBE', + 'x11green' : '#00FF00', + 'x11grey' : '#BEBEBE', + 'x11maroon' : '#B03060', + 'x11purple' : '#A020F0', + 'yellow' : '#FFFF00', + 'yellow1' : '#FFFF00', + 'yellow2' : '#EEEE00', + 'yellow3' : '#CDCD00', + 'yellow4' : '#8B8B00', + 'yellowgreen' : '#9ACD32' + }; + + return ColorScheme; + +}]); diff --git a/guacamole/src/main/frontend/src/app/form/types/FieldType.js b/guacamole/src/main/frontend/src/app/form/types/FieldType.js new file mode 100644 index 0000000..386d623 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/form/types/FieldType.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the FieldType class. + */ +angular.module('form').factory('FieldType', [function defineFieldType() { + + /** + * The object used by the formService for describing field types. + * + * @constructor + * @param {FieldType|Object} [template={}] + * The object whose properties should be copied within the new + * FieldType. + */ + var FieldType = function FieldType(template) { + + // Use empty object by default + template = template || {}; + + /** + * The raw HTML of the template that should be injected into the DOM of + * a form using this field type. If provided, this will be used instead + * of templateUrl. + * + * @type String + */ + this.template = template.template; + + /** + * The URL of the template that should be injected into the DOM of a + * form using this field type. This property will be ignored if a raw + * HTML template is supplied via the template property. + * + * @type String + */ + this.templateUrl = template.templateUrl; + + /** + * The name of the AngularJS module defining the controller for this + * field type. This is optional, as not all field types will need + * controllers. + * + * @type String + */ + this.module = template.module; + + /** + * The name of the controller for this field type. This is optional, as + * not all field types will need controllers. If a controller is + * specified, it will receive the following properties on the scope: + * + * namespace: + * A String which defines the unique namespace associated the + * translation strings used by the form using a field of this type. + * + * field: + * The Field object that is being rendered, representing a field of + * this type. + * + * model: + * The current String value of the field, if any. + * + * @type String + */ + this.controller = template.controller; + + }; + + return FieldType; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/groupList/directives/guacGroupList.js b/guacamole/src/main/frontend/src/app/groupList/directives/guacGroupList.js new file mode 100644 index 0000000..16ff9dd --- /dev/null +++ b/guacamole/src/main/frontend/src/app/groupList/directives/guacGroupList.js @@ -0,0 +1,249 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays the contents of a connection group within an + * automatically-paginated view. + */ +angular.module('groupList').directive('guacGroupList', [function guacGroupList() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The connection groups to display as a map of data source + * identifier to corresponding root group. + * + * @type Object. + */ + connectionGroups : '=', + + /** + * Arbitrary object which shall be made available to the connection + * and connection group templates within the scope as + * context. + * + * @type Object + */ + context : '=', + + /** + * The map of @link{GroupListItem} type to the URL or ID of the + * Angular template to use when rendering a @link{GroupListItem} of + * that type. The @link{GroupListItem} itself will be within the + * scope of the template as item, and the arbitrary + * context object, if any, will be exposed as context. + * If the template for a type is omitted, items of that type will + * not be rendered. All standard types are defined by + * @link{GroupListItem.Type}, but use of custom types is legal. + * + * @type Object. + */ + templates : '=', + + /** + * Whether the root of the connection group hierarchy given should + * be shown. If false (the default), only the descendants of the + * given connection group will be listed. + * + * @type Boolean + */ + showRootGroup : '=', + + /** + * The maximum number of connections or groups to show per page. + * + * @type Number + */ + pageSize : '=', + + /** + * A callback which accepts an array of GroupListItems as its sole + * parameter. If provided, the callback will be invoked whenever an + * array of root-level GroupListItems is about to be rendered. + * Changes may be made by this function to that array or to the + * GroupListItems themselves. + * + * @type Function + */ + decorator : '=' + + }, + + templateUrl: 'app/groupList/templates/guacGroupList.html', + controller: ['$scope', '$injector', function guacGroupListController($scope, $injector) { + + // Required services + var activeConnectionService = $injector.get('activeConnectionService'); + var dataSourceService = $injector.get('dataSourceService'); + var requestService = $injector.get('requestService'); + + // Required types + var GroupListItem = $injector.get('GroupListItem'); + + /** + * Map of data source identifier to the number of active + * connections associated with a given connection identifier. + * If this information is unknown, or there are no active + * connections for a given identifier, no number will be stored. + * + * @type Object.> + */ + var connectionCount = {}; + + /** + * A list of all items which should appear at the root level. As + * connections and connection groups from multiple data sources may + * be included in a guacGroupList, there may be multiple root + * items, even if the root connection group is shown. + * + * @type GroupListItem[] + */ + $scope.rootItems = []; + + /** + * Returns the number of active usages of a given connection. + * + * @param {String} dataSource + * The identifier of the data source containing the given + * connection. + * + * @param {Connection} connection + * The connection whose active connections should be counted. + * + * @returns {Number} + * The number of currently-active usages of the given + * connection. + */ + var countActiveConnections = function countActiveConnections(dataSource, connection) { + return connectionCount[dataSource][connection.identifier]; + }; + + /** + * Returns whether a @link{GroupListItem} of the given type can be + * displayed. If there is no template associated with the given + * type, then a @link{GroupListItem} of that type cannot be + * displayed. + * + * @param {String} type + * The type to check. + * + * @returns {Boolean} + * true if the given @link{GroupListItem} type can be displayed, + * false otherwise. + */ + $scope.isVisible = function isVisible(type) { + return !!$scope.templates[type]; + }; + + // Set contents whenever the connection group is assigned or changed + $scope.$watch('connectionGroups', function setContents(connectionGroups) { + + // Reset stored data + var dataSources = []; + $scope.rootItems = []; + connectionCount = {}; + + // If connection groups are given, add them to the interface + if (connectionGroups) { + + // Add each provided connection group + angular.forEach(connectionGroups, function addConnectionGroup(connectionGroup, dataSource) { + + var rootItem; + + // Prepare data source for active connection counting + dataSources.push(dataSource); + connectionCount[dataSource] = {}; + + // If the provided connection group is already a + // GroupListItem, no need to create a new item + if (connectionGroup instanceof GroupListItem) + rootItem = connectionGroup; + + // Create root item for current connection group + else + rootItem = GroupListItem.fromConnectionGroup(dataSource, connectionGroup, + $scope.isVisible(GroupListItem.Type.CONNECTION), + $scope.isVisible(GroupListItem.Type.SHARING_PROFILE), + countActiveConnections); + + // If root group is to be shown, add it as a root item + if ($scope.showRootGroup) + $scope.rootItems.push(rootItem); + + // Otherwise, add its children as root items + else { + angular.forEach(rootItem.children, function addRootItem(child) { + $scope.rootItems.push(child); + }); + } + + }); + + // Count active connections by connection identifier + dataSourceService.apply( + activeConnectionService.getActiveConnections, + dataSources + ) + .then(function activeConnectionsRetrieved(activeConnectionMap) { + + // Within each data source, count each active connection by identifier + angular.forEach(activeConnectionMap, function addActiveConnections(activeConnections, dataSource) { + angular.forEach(activeConnections, function addActiveConnection(activeConnection) { + + // If counter already exists, increment + var identifier = activeConnection.connectionIdentifier; + if (connectionCount[dataSource][identifier]) + connectionCount[dataSource][identifier]++; + + // Otherwise, initialize counter to 1 + else + connectionCount[dataSource][identifier] = 1; + + }); + }); + + }, requestService.DIE); + + } + + // Invoke item decorator, if provided + if ($scope.decorator) + $scope.decorator($scope.rootItems); + + }); + + /** + * Toggle the open/closed status of a group list item. + * + * @param {GroupListItem} groupListItem + * The list item to expand, which should represent a + * connection group. + */ + $scope.toggleExpanded = function toggleExpanded(groupListItem) { + groupListItem.expanded = !groupListItem.expanded; + }; + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/groupList/directives/guacGroupListFilter.js b/guacamole/src/main/frontend/src/app/groupList/directives/guacGroupListFilter.js new file mode 100644 index 0000000..ad1bd43 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/groupList/directives/guacGroupListFilter.js @@ -0,0 +1,304 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides a filtering text input field which automatically + * produces a filtered subset of the given connection groups. + */ +angular.module('groupList').directive('guacGroupListFilter', [function guacGroupListFilter() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The property to which a subset of the provided map of connection + * groups will be assigned. The type of each item within the + * original map is preserved within the filtered map. + * + * @type Object. + */ + filteredConnectionGroups : '=', + + /** + * The placeholder text to display within the filter input field + * when no filter has been provided. + * + * @type String + */ + placeholder : '&', + + /** + * The connection groups to filter, as a map of data source + * identifier to corresponding root group. A subset of this map + * will be exposed as filteredConnectionGroups. + * + * @type Object. + */ + connectionGroups : '&', + + /** + * An array of expressions to filter against for each connection in + * the hierarchy of connections and groups in the provided map. + * These expressions must be Angular expressions which resolve to + * properties on the connections in the provided map. + * + * @type String[] + */ + connectionProperties : '&', + + /** + * An array of expressions to filter against for each connection group + * in the hierarchy of connections and groups in the provided map. + * These expressions must be Angular expressions which resolve to + * properties on the connection groups in the provided map. + * + * @type String[] + */ + connectionGroupProperties : '&' + + }, + + templateUrl: 'app/groupList/templates/guacGroupListFilter.html', + controller: ['$scope', '$injector', function guacGroupListFilterController($scope, $injector) { + + // Required types + var ConnectionGroup = $injector.get('ConnectionGroup'); + var FilterPattern = $injector.get('FilterPattern'); + var GroupListItem = $injector.get('GroupListItem'); + + /** + * The pattern object to use when filtering connections. + * + * @type FilterPattern + */ + var connectionFilterPattern = new FilterPattern($scope.connectionProperties()); + + /** + * The pattern object to use when filtering connection groups. + * + * @type FilterPattern + */ + var connectionGroupFilterPattern = new FilterPattern($scope.connectionGroupProperties()); + + /** + * The filter search string to use to restrict the displayed + * connection groups. + * + * @type String + */ + $scope.searchString = null; + + /** + * Flattens the connection group hierarchy of the given connection + * group such that all descendants are copied as immediate + * children. The hierarchy of nested connection groups is otherwise + * completely preserved. A connection or connection group nested + * two or more levels deep within the hierarchy will thus appear + * within the returned connection group in two places: in its + * original location AND as an immediate child. + * + * @param {ConnectionGroup} connectionGroup + * The connection group whose descendents should be copied as + * first-level children. + * + * @returns {ConnectionGroup} + * A new connection group completely identical to the provided + * connection group, except that absolutely all descendents + * have been copied into the first level of children. + */ + var flattenConnectionGroup = function flattenConnectionGroup(connectionGroup) { + + // Replace connection group with shallow copy + connectionGroup = new ConnectionGroup(connectionGroup); + + // Ensure child arrays are defined and independent copies + connectionGroup.childConnections = angular.copy(connectionGroup.childConnections) || []; + connectionGroup.childConnectionGroups = angular.copy(connectionGroup.childConnectionGroups) || []; + + // Flatten all children to the top-level group + angular.forEach(connectionGroup.childConnectionGroups, function flattenChild(child) { + + var flattenedChild = flattenConnectionGroup(child); + + // Merge all child connections + Array.prototype.push.apply( + connectionGroup.childConnections, + flattenedChild.childConnections + ); + + // Merge all child connection groups + Array.prototype.push.apply( + connectionGroup.childConnectionGroups, + flattenedChild.childConnectionGroups + ); + + }); + + return connectionGroup; + + }; + + /** + * Flattens the connection group hierarchy of the given + * GroupListItem such that all descendants are copied as immediate + * children. The hierarchy of nested items is otherwise completely + * preserved. A connection or connection group nested two or more + * levels deep within the hierarchy will thus appear within the + * returned item in two places: in its original location AND as an + * immediate child. + * + * @param {GroupListItem} item + * The GroupListItem whose descendents should be copied as + * first-level children. + * + * @returns {GroupListItem} + * A new GroupListItem completely identical to the provided + * item, except that absolutely all descendents have been + * copied into the first level of children. + */ + var flattenGroupListItem = function flattenGroupListItem(item) { + + // Replace item with shallow copy + item = new GroupListItem(item); + + // Ensure children are defined and independent copies + item.children = angular.copy(item.children) || []; + + // Flatten all children to the top-level group + angular.forEach(item.children, function flattenChild(child) { + if (child.type === GroupListItem.Type.CONNECTION_GROUP) { + + var flattenedChild = flattenGroupListItem(child); + + // Merge all children + Array.prototype.push.apply( + item.children, + flattenedChild.children + ); + + } + }); + + return item; + + }; + + /** + * Replaces the set of children within the given GroupListItem such + * that only children which match the filter predicate for the + * current search string are present. + * + * @param {GroupListItem} item + * The GroupListItem whose children should be filtered. + */ + var filterGroupListItem = function filterGroupListItem(item) { + item.children = item.children.filter(function applyFilterPattern(child) { + + // Filter connections and connection groups by + // given pattern + switch (child.type) { + + case GroupListItem.Type.CONNECTION: + return connectionFilterPattern.predicate(child.wrappedItem); + + case GroupListItem.Type.CONNECTION_GROUP: + return connectionGroupFilterPattern.predicate(child.wrappedItem); + + } + + // Include all other children + return true; + + }); + }; + + /** + * Replaces the set of child connections and connection groups + * within the given connection group such that only children which + * match the filter predicate for the current search string are + * present. + * + * @param {ConnectionGroup} connectionGroup + * The connection group whose children should be filtered. + */ + var filterConnectionGroup = function filterConnectionGroup(connectionGroup) { + connectionGroup.childConnections = connectionGroup.childConnections.filter(connectionFilterPattern.predicate); + connectionGroup.childConnectionGroups = connectionGroup.childConnectionGroups.filter(connectionGroupFilterPattern.predicate); + }; + + /** + * Applies the current filter predicate, filtering all provided + * connection groups and storing the result in + * filteredConnectionGroups. + */ + var updateFilteredConnectionGroups = function updateFilteredConnectionGroups() { + + // Do not apply any filtering (and do not flatten) if no + // search string is provided + if (!$scope.searchString) { + $scope.filteredConnectionGroups = $scope.connectionGroups() || {}; + return; + } + + // Clear all current filtered groups + $scope.filteredConnectionGroups = {}; + + // Re-filter any provided groups + var connectionGroups = $scope.connectionGroups(); + if (connectionGroups) { + angular.forEach(connectionGroups, function updateFilteredConnectionGroup(connectionGroup, dataSource) { + + var filteredGroup; + + // Flatten and filter depending on type + if (connectionGroup instanceof GroupListItem) { + filteredGroup = flattenGroupListItem(connectionGroup); + filterGroupListItem(filteredGroup); + } + else { + filteredGroup = flattenConnectionGroup(connectionGroup); + filterConnectionGroup(filteredGroup); + } + + // Store now-filtered root + $scope.filteredConnectionGroups[dataSource] = filteredGroup; + + }); + } + + }; + + // Recompile and refilter when pattern is changed + $scope.$watch('searchString', function searchStringChanged(searchString) { + connectionFilterPattern.compile(searchString); + connectionGroupFilterPattern.compile(searchString); + updateFilteredConnectionGroups(); + }); + + // Refilter when items change + $scope.$watchCollection($scope.connectionGroups, function itemsChanged() { + updateFilteredConnectionGroups(); + }); + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/groupList/groupListModule.js b/guacamole/src/main/frontend/src/app/groupList/groupListModule.js new file mode 100644 index 0000000..eb37ac5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/groupList/groupListModule.js @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for displaying the contents of a connection group, allowing the user + * to select individual connections or groups. + */ +angular.module('groupList', [ + 'navigation', + 'list', + 'rest' +]); diff --git a/guacamole/src/main/frontend/src/app/groupList/templates/guacGroupList.html b/guacamole/src/main/frontend/src/app/groupList/templates/guacGroupList.html new file mode 100644 index 0000000..e76f2e3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/groupList/templates/guacGroupList.html @@ -0,0 +1,41 @@ +
      + + + + +
      +
      +
      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/groupList/templates/guacGroupListFilter.html b/guacamole/src/main/frontend/src/app/groupList/templates/guacGroupListFilter.html new file mode 100644 index 0000000..bbaec1c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/groupList/templates/guacGroupListFilter.html @@ -0,0 +1,6 @@ +
      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/groupList/types/GroupListItem.js b/guacamole/src/main/frontend/src/app/groupList/types/GroupListItem.js new file mode 100644 index 0000000..2255cb4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/groupList/types/GroupListItem.js @@ -0,0 +1,445 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the GroupListItem class definition. + */ +angular.module('groupList').factory('GroupListItem', ['$injector', function defineGroupListItem($injector) { + + // Required types + var ClientIdentifier = $injector.get('ClientIdentifier'); + var ConnectionGroup = $injector.get('ConnectionGroup'); + + /** + * Creates a new GroupListItem, initializing the properties of that + * GroupListItem with the corresponding properties of the given template. + * + * @constructor + * @param {GroupListItem|Object} [template={}] + * The object whose properties should be copied within the new + * GroupListItem. + */ + var GroupListItem = function GroupListItem(template) { + + // Use empty object by default + template = template || {}; + + /** + * The identifier of the data source associated with the connection, + * connection group, or sharing profile this item represents. + * + * @type String + */ + this.dataSource = template.dataSource; + + /** + * The unique identifier associated with the connection, connection + * group, or sharing profile this item represents. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * The human-readable display name of this item. + * + * @type String + */ + this.name = template.name; + + /** + * The unique identifier of the protocol, if this item represents a + * connection. If this item does not represent a connection, this + * property is not applicable. + * + * @type String + */ + this.protocol = template.protocol; + + /** + * All children items of this item. If this item contains no children, + * this will be an empty array. + * + * @type GroupListItem[] + */ + this.children = template.children || []; + + /** + * The type of object represented by this GroupListItem. Standard types + * are defined by GroupListItem.Type, but custom types are also legal. + * + * @type String + */ + this.type = template.type; + + /** + * Whether this item, or items of the same type, can contain children. + * This may be true even if this particular item does not presently + * contain children. + * + * @type Boolean + */ + this.expandable = template.expandable; + + /** + * Whether this item represents a balancing connection group. + * + * @type Boolean + */ + this.balancing = template.balancing; + + /** + * Whether the children items should be displayed. + * + * @type Boolean + */ + this.expanded = template.expanded; + + /** + * Returns the number of currently active users for this connection, + * connection group, or sharing profile, if known. If unknown, null may + * be returned. + * + * @returns {Number} + * The number of currently active users for this connection, + * connection group, or sharing profile. + */ + this.getActiveConnections = template.getActiveConnections || (function getActiveConnections() { + return null; + }); + + /** + * Returns the unique string identifier that must be used when + * connecting to a connection or connection group represented by this + * GroupListItem. + * + * @returns {String} + * The client identifier associated with the connection or + * connection group represented by this GroupListItem, or null if + * this GroupListItem cannot have an associated client identifier. + */ + this.getClientIdentifier = template.getClientIdentifier || function getClientIdentifier() { + + // If the item is a connection, generate a connection identifier + if (this.type === GroupListItem.Type.CONNECTION) + return ClientIdentifier.toString({ + dataSource : this.dataSource, + type : ClientIdentifier.Types.CONNECTION, + id : this.identifier + }); + + // If the item is a connection group, generate a connection group identifier + if (this.type === GroupListItem.Type.CONNECTION_GROUP && this.balancing) + return ClientIdentifier.toString({ + dataSource : this.dataSource, + type : ClientIdentifier.Types.CONNECTION_GROUP, + id : this.identifier + }); + + // Otherwise, no such identifier can exist + return null; + + }; + + /** + * Returns the relative URL of the client page that connects to the + * connection or connection group represented by this GroupListItem. + * + * @returns {String} + * The relative URL of the client page that connects to the + * connection or connection group represented by this GroupListItem, + * or null if this GroupListItem cannot be connected to. + */ + this.getClientURL = template.getClientURL || function getClientURL() { + + // There is a client page for this item only if it has an + // associated client identifier + var identifier = this.getClientIdentifier(); + if (identifier) + return '#/client/' + encodeURIComponent(identifier); + + return null; + + }; + + /** + * The connection, connection group, or sharing profile whose data is + * exposed within this GroupListItem. If the type of this GroupListItem + * is not one of the types defined by GroupListItem.Type, then this + * value may be anything. + * + * @type Connection|ConnectionGroup|SharingProfile|* + */ + this.wrappedItem = template.wrappedItem; + + /** + * The sorting weight to apply when displaying this GroupListItem. This + * weight is relative only to other sorting weights. If two items have + * the same weight, they will be sorted based on their names. + * + * @type Number + * @default 0 + */ + this.weight = template.weight || 0; + + }; + + /** + * Creates a new GroupListItem using the contents of the given connection. + * + * @param {String} dataSource + * The identifier of the data source containing the given connection + * group. + * + * @param {ConnectionGroup} connection + * The connection whose contents should be represented by the new + * GroupListItem. + * + * @param {Boolean} [includeSharingProfiles=true] + * Whether sharing profiles should be included in the contents of the + * resulting GroupListItem. By default, sharing profiles are included. + * + * @param {Function} [countActiveConnections] + * A getter which returns the current number of active connections for + * the given connection. If omitted, the number of active connections + * known at the time this function was called is used instead. This + * function will be passed, in order, the data source identifier and + * the connection in question. + * + * @returns {GroupListItem} + * A new GroupListItem which represents the given connection. + */ + GroupListItem.fromConnection = function fromConnection(dataSource, + connection, includeSharingProfiles, countActiveConnections) { + + var children = []; + + // Add any sharing profiles + if (connection.sharingProfiles && includeSharingProfiles !== false) { + connection.sharingProfiles.forEach(function addSharingProfile(child) { + children.push(GroupListItem.fromSharingProfile(dataSource, + child, countActiveConnections)); + }); + } + + // Return item representing the given connection + return new GroupListItem({ + + // Identifying information + name : connection.name, + identifier : connection.identifier, + protocol : connection.protocol, + dataSource : dataSource, + + // Type information + expandable : includeSharingProfiles !== false, + type : GroupListItem.Type.CONNECTION, + + // Already-converted children + children : children, + + // Count of currently active connections using this connection + getActiveConnections : function getActiveConnections() { + + // Use getter, if provided + if (countActiveConnections) + return countActiveConnections(dataSource, connection); + + return connection.activeConnections; + + }, + + // Wrapped item + wrappedItem : connection + + }); + + }; + + /** + * Creates a new GroupListItem using the contents and descendants of the + * given connection group. + * + * @param {String} dataSource + * The identifier of the data source containing the given connection + * group. + * + * @param {ConnectionGroup} connectionGroup + * The connection group whose contents and descendants should be + * represented by the new GroupListItem and its descendants. + * + * @param {Boolean} [includeConnections=true] + * Whether connections should be included in the contents of the + * resulting GroupListItem. By default, connections are included. + * + * @param {Boolean} [includeSharingProfiles=true] + * Whether sharing profiles should be included in the contents of the + * resulting GroupListItem. By default, sharing profiles are included. + * + * @param {Function} [countActiveConnections] + * A getter which returns the current number of active connections for + * the given connection. If omitted, the number of active connections + * known at the time this function was called is used instead. This + * function will be passed, in order, the data source identifier and + * the connection group in question. + * + * @param {Function} [countActiveConnectionGroups] + * A getter which returns the current number of active connections for + * the given connection group. If omitted, the number of active + * connections known at the time this function was called is used + * instead. This function will be passed, in order, the data source + * identifier and the connection group in question. + * + * @returns {GroupListItem} + * A new GroupListItem which represents the given connection group, + * including all descendants. + */ + GroupListItem.fromConnectionGroup = function fromConnectionGroup(dataSource, + connectionGroup, includeConnections, includeSharingProfiles, + countActiveConnections, countActiveConnectionGroups) { + + var children = []; + + // Add any child connections + if (connectionGroup.childConnections && includeConnections !== false) { + connectionGroup.childConnections.forEach(function addChildConnection(child) { + children.push(GroupListItem.fromConnection(dataSource, child, + includeSharingProfiles, countActiveConnections)); + }); + } + + // Add any child groups + if (connectionGroup.childConnectionGroups) { + connectionGroup.childConnectionGroups.forEach(function addChildGroup(child) { + children.push(GroupListItem.fromConnectionGroup(dataSource, + child, includeConnections, includeSharingProfiles, + countActiveConnections, countActiveConnectionGroups)); + }); + } + + // Return item representing the given connection group + return new GroupListItem({ + + // Identifying information + name : connectionGroup.name, + identifier : connectionGroup.identifier, + dataSource : dataSource, + + // Type information + type : GroupListItem.Type.CONNECTION_GROUP, + balancing : connectionGroup.type === ConnectionGroup.Type.BALANCING, + expandable : true, + + // Already-converted children + children : children, + + // Count of currently active connection groups using this connection + getActiveConnections : function getActiveConnections() { + + // Use getter, if provided + if (countActiveConnectionGroups) + return countActiveConnectionGroups(dataSource, connectionGroup); + + return connectionGroup.activeConnections; + + }, + + + // Wrapped item + wrappedItem : connectionGroup + + }); + + }; + + /** + * Creates a new GroupListItem using the contents of the given sharing + * profile. + * + * @param {String} dataSource + * The identifier of the data source containing the given sharing + * profile. + * + * @param {SharingProfile} sharingProfile + * The sharing profile whose contents should be represented by the new + * GroupListItem. + * + * @returns {GroupListItem} + * A new GroupListItem which represents the given sharing profile. + */ + GroupListItem.fromSharingProfile = function fromSharingProfile(dataSource, + sharingProfile) { + + // Return item representing the given sharing profile + return new GroupListItem({ + + // Identifying information + name : sharingProfile.name, + identifier : sharingProfile.identifier, + dataSource : dataSource, + + // Type information + type : GroupListItem.Type.SHARING_PROFILE, + + // Wrapped item + wrappedItem : sharingProfile + + }); + + }; + + /** + * All pre-defined types of GroupListItems. Note that, while these are the + * standard types supported by GroupListItem and the related guacGroupList + * directive, the type string is otherwise arbitrary and custom types are + * legal. + * + * @type Object. + */ + GroupListItem.Type = { + + /** + * The standard type string of a GroupListItem which represents a + * connection. + * + * @type String + */ + CONNECTION : 'connection', + + /** + * The standard type string of a GroupListItem which represents a + * connection group. + * + * @type String + */ + CONNECTION_GROUP : 'connection-group', + + /** + * The standard type string of a GroupListItem which represents a + * sharing profile. + * + * @type String + */ + SHARING_PROFILE : 'sharing-profile' + + }; + + return GroupListItem; + +}]); diff --git a/guacamole/src/main/frontend/src/app/history/historyModule.js b/guacamole/src/main/frontend/src/app/history/historyModule.js new file mode 100644 index 0000000..c7ec7e1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/history/historyModule.js @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code relating to connection history. + */ +angular.module('history', [ + 'storage' +]); diff --git a/guacamole/src/main/frontend/src/app/history/services/guacHistory.js b/guacamole/src/main/frontend/src/app/history/services/guacHistory.js new file mode 100644 index 0000000..d5dcbfe --- /dev/null +++ b/guacamole/src/main/frontend/src/app/history/services/guacHistory.js @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for reading and manipulating the Guacamole connection history. + */ +angular.module('history').factory('guacHistory', ['$injector', + function guacHistory($injector) { + + // Required types + var HistoryEntry = $injector.get('HistoryEntry'); + + // Required services + var localStorageService = $injector.get('localStorageService'); + var preferenceService = $injector.get('preferenceService'); + + var service = {}; + + // The parameter name for getting the history from local storage + var GUAC_HISTORY_STORAGE_KEY = "GUAC_HISTORY"; + + /** + * The top few recent connections, sorted in order of most recent access. + * + * @type HistoryEntry[] + */ + service.recentConnections = []; + + /** + * Remove from the list of connection history the item having the given + * identfier. + * + * @param {String} id + * The identifier of the item to remove from the history list. + * + * @returns {boolean} + * True if the removal was successful, otherwise false. + */ + service.removeEntry = function removeEntry(id) { + + return _.remove(service.recentConnections, entry => entry.id === id).length > 0; + + }; + + /** + * Updates the thumbnail and access time of the history entry for the + * connection with the given ID. + * + * @param {String} id + * The ID of the connection whose history entry should be updated. + * + * @param {String} thumbnail + * The URL of the thumbnail image to associate with the history entry. + */ + service.updateThumbnail = function(id, thumbnail) { + + var i; + + // Remove any existing entry for this connection + for (i=0; i < service.recentConnections.length; i++) { + if (service.recentConnections[i].id === id) { + service.recentConnections.splice(i, 1); + break; + } + } + + // Store new entry in history + service.recentConnections.unshift(new HistoryEntry( + id, + thumbnail, + new Date().getTime() + )); + + // Truncate history to ideal length + if (service.recentConnections.length > preferenceService.preferences.numberOfRecentConnections) + service.recentConnections.length = preferenceService.preferences.numberOfRecentConnections; + + // Save updated history + localStorageService.setItem(GUAC_HISTORY_STORAGE_KEY, service.recentConnections); + + }; + + // Init stored connection history from localStorage + var storedHistory = localStorageService.getItem(GUAC_HISTORY_STORAGE_KEY) || []; + if (storedHistory instanceof Array) + service.recentConnections = storedHistory; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/history/types/HistoryEntry.js b/guacamole/src/main/frontend/src/app/history/types/HistoryEntry.js new file mode 100644 index 0000000..5942086 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/history/types/HistoryEntry.js @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the HistoryEntry class used by the guacHistory service. + */ +angular.module('history').factory('HistoryEntry', [function defineHistoryEntry() { + + /** + * A single entry in the connection history. + * + * @constructor + * @param {String} id The ID of the connection. + * + * @param {String} thumbnail + * The URL of the thumbnail to use to represent the connection. + */ + var HistoryEntry = function HistoryEntry(id, thumbnail) { + + /** + * The ID of the connection associated with this history entry, + * including type prefix. + */ + this.id = id; + + /** + * The thumbnail associated with the connection associated with this + * history entry. + */ + this.thumbnail = thumbnail; + + }; + + return HistoryEntry; + +}]); diff --git a/guacamole/src/main/frontend/src/app/home/controllers/homeController.js b/guacamole/src/main/frontend/src/app/home/controllers/homeController.js new file mode 100644 index 0000000..8d84b49 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/controllers/homeController.js @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for the home page. + */ +angular.module('home').controller('homeController', ['$scope', '$injector', + function homeController($scope, $injector) { + + // Get required types + var ConnectionGroup = $injector.get('ConnectionGroup'); + var GroupListItem = $injector.get('GroupListItem'); + + // Get required services + var authenticationService = $injector.get('authenticationService'); + var connectionGroupService = $injector.get('connectionGroupService'); + var dataSourceService = $injector.get('dataSourceService'); + var preferenceService = $injector.get('preferenceService'); + var requestService = $injector.get('requestService'); + + /** + * Map of data source identifier to the root connection group of that data + * source, or null if the connection group hierarchy has not yet been + * loaded. + * + * @type Object. + */ + $scope.rootConnectionGroups = null; + + /** + * Array of all connection properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionProperties = [ + 'name' + ]; + + /** + * Array of all connection group properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionGroupProperties = [ + 'name' + ]; + + /** + * Returns whether the "Recent Connections" section should be displayed on + * the home screen. + * + * @returns {!boolean} + * true if recent connections should be displayed on the home screen, + * false otherwise. + */ + $scope.isRecentConnectionsVisible = function isRecentConnectionsVisible() { + return preferenceService.preferences.showRecentConnections; + }; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface to be + * useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.rootConnectionGroups !== null; + + }; + + // Retrieve root groups and all descendants + dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + authenticationService.getAvailableDataSources(), + ConnectionGroup.ROOT_IDENTIFIER + ) + .then(function rootGroupsRetrieved(rootConnectionGroups) { + $scope.rootConnectionGroups = rootConnectionGroups; + }, requestService.DIE); + +}]); diff --git a/guacamole/src/main/frontend/src/app/home/directives/guacRecentConnections.js b/guacamole/src/main/frontend/src/app/home/directives/guacRecentConnections.js new file mode 100644 index 0000000..4be6065 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/directives/guacRecentConnections.js @@ -0,0 +1,184 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays the recently-accessed connections nested beneath + * each of the given connection groups. + */ +angular.module('home').directive('guacRecentConnections', [function guacRecentConnections() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The root connection groups to display, and all visible + * descendants, as a map of data source identifier to the root + * connection group within that data source. Recent connections + * will only be shown if they exist within this hierarchy, + * regardless of their existence within the history. + * + * @type Object. + */ + rootGroups : '=' + + }, + + templateUrl: 'app/home/templates/guacRecentConnections.html', + controller: ['$scope', '$injector', function guacRecentConnectionsController($scope, $injector) { + + // Required types + var ClientIdentifier = $injector.get('ClientIdentifier'); + var RecentConnection = $injector.get('RecentConnection'); + + // Required services + var guacHistory = $injector.get('guacHistory'); + var preferenceService = $injector.get('preferenceService'); + + /** + * Array of all known and visible recently-used connections. + * + * @type RecentConnection[] + */ + $scope.recentConnections = []; + + /** + * Remove the connection from the recent connection list having the + * given identifier. + * + * @param {!RecentConnection} recentConnection + * The recent connection to remove from the history list. + * + * @returns {boolean} + * True if the removal was successful, otherwise false. + */ + $scope.removeRecentConnection = function removeRecentConnection(recentConnection) { + return ($scope.recentConnections.splice($scope.recentConnections.indexOf(recentConnection), 1) + && guacHistory.removeEntry(recentConnection.entry.id)); + }; + + /** + * Returns whether recent connections are available for display. + * + * @returns {!boolean} + * true if recent connections are present, false otherwise. + */ + $scope.hasRecentConnections = function hasRecentConnections() { + return !!$scope.recentConnections.length; + }; + + /** + * Map of all visible objects, connections or connection groups, by + * object identifier. + * + * @type Object. + */ + var visibleObjects = {}; + + /** + * Adds the given connection to the internal set of visible + * objects. + * + * @param {String} dataSource + * The identifier of the data source associated with the + * given connection group. + * + * @param {Connection} connection + * The connection to add to the internal set of visible objects. + */ + var addVisibleConnection = function addVisibleConnection(dataSource, connection) { + + // Add given connection to set of visible objects + visibleObjects[ClientIdentifier.toString({ + dataSource : dataSource, + type : ClientIdentifier.Types.CONNECTION, + id : connection.identifier + })] = connection; + + }; + + /** + * Adds the given connection group to the internal set of visible + * objects, along with any descendants. + * + * @param {String} dataSource + * The identifier of the data source associated with the + * given connection group. + * + * @param {ConnectionGroup} connectionGroup + * The connection group to add to the internal set of visible + * objects, along with any descendants. + */ + var addVisibleConnectionGroup = function addVisibleConnectionGroup(dataSource, connectionGroup) { + + // Add given connection group to set of visible objects + visibleObjects[ClientIdentifier.toString({ + dataSource : dataSource, + type : ClientIdentifier.Types.CONNECTION_GROUP, + id : connectionGroup.identifier + })] = connectionGroup; + + // Add all child connections + if (connectionGroup.childConnections) + connectionGroup.childConnections.forEach(function addChildConnection(child) { + addVisibleConnection(dataSource, child); + }); + + // Add all child connection groups + if (connectionGroup.childConnectionGroups) + connectionGroup.childConnectionGroups.forEach(function addChildConnectionGroup(child) { + addVisibleConnectionGroup(dataSource, child); + }); + + }; + + // Update visible objects when root groups are set + $scope.$watch("rootGroups", function setRootGroups(rootGroups) { + + // Clear connection arrays + $scope.recentConnections = []; + + // Produce collection of visible objects + visibleObjects = {}; + if (rootGroups) { + angular.forEach(rootGroups, function addConnectionGroup(rootGroup, dataSource) { + addVisibleConnectionGroup(dataSource, rootGroup); + }); + } + + // Add any recent connections that are visible + guacHistory.recentConnections.forEach(function addRecentConnection(historyEntry) { + + // Add recent connections for history entries with associated visible objects + if (historyEntry.id in visibleObjects) { + + var object = visibleObjects[historyEntry.id]; + $scope.recentConnections.push(new RecentConnection(object.name, historyEntry)); + + } + + }); + + }); // end rootGroup scope watch + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/home/homeModule.js b/guacamole/src/main/frontend/src/app/home/homeModule.js new file mode 100644 index 0000000..5d930da --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/homeModule.js @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +angular.module('home', ['client', 'groupList', 'history', 'navigation', 'rest']); diff --git a/guacamole/src/main/frontend/src/app/home/styles/home.css b/guacamole/src/main/frontend/src/app/home/styles/home.css new file mode 100644 index 0000000..8ae0486 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/styles/home.css @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.history-unavailable div.recent-connections { + display: none; +} + +div.recent-connections, +div.clipboardDiv, +div.settings, +div.all-connections { + margin: 1em; + padding: 0; +} + +.all-connections .list-buttons { + text-align: center; + padding: 0; +} + +div.recent-connections { + text-align: center; +} + +div.recent-connections div.connection { + -moz-border-radius: 0.5em; + -webkit-border-radius: 0.5em; + -khtml-border-radius: 0.5em; + border-radius: 0.5em; + display: inline-block; + padding: 1em; + margin: 1em; + text-align: center; + max-width: 75%; + overflow: hidden; + position: relative; +} + +a.home-connection, .empty.balancer a.home-connection-group { + display: block; +} + +/* Show only expand/collapse icon for connection groups on home screen ... */ + +.all-connections .connection-group > .caption .icon { + display: none; +} + +.all-connections .connection-group > .caption .icon.expand { + display: inline-block; +} + +/* ... except for empty balancing groups, which should be rendered as if they + * are connections. */ + +.all-connections .connection-group.empty.balancer > .caption .icon { + display: inline-block; +} + +.all-connections .connection-group.empty.balancer > .caption .icon.expand { + display: none; +} + +.recent-connections .connection .remove-recent { + visibility: hidden; +} + +.recent-connections .connection:hover .remove-recent { + visibility: visible; +} + +.recent-connections .connection .remove-recent::after { + content: ''; + display: block; + height: 100%; + width: 100%; + background-repeat: no-repeat; + background-size: contain; + background-position: center center; + background-image: url('images/x-black.svg'); +} + +.recent-connections .connection .remove-recent { + height: 1em; + width: 1em; + position: absolute; + top: 10px; + z-index: 10; + float: right; + right: 10px; + opacity: .2; +} + +.recent-connections .connection .remove-recent:hover { + opacity: 1.0; +} diff --git a/guacamole/src/main/frontend/src/app/home/templates/connection.html b/guacamole/src/main/frontend/src/app/home/templates/connection.html new file mode 100644 index 0000000..85a7f57 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/templates/connection.html @@ -0,0 +1,16 @@ + + + +
      + + + {{item.name}} + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/home/templates/connectionGroup.html b/guacamole/src/main/frontend/src/app/home/templates/connectionGroup.html new file mode 100644 index 0000000..ba0a204 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/templates/connectionGroup.html @@ -0,0 +1,10 @@ + + + +
      + + + {{item.name}} + +
      diff --git a/guacamole/src/main/frontend/src/app/home/templates/guacRecentConnections.html b/guacamole/src/main/frontend/src/app/home/templates/guacRecentConnections.html new file mode 100644 index 0000000..2d25bc1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/templates/guacRecentConnections.html @@ -0,0 +1,25 @@ +
      + + +

      {{'HOME.INFO_NO_RECENT_CONNECTIONS' | translate}}

      + + + diff --git a/guacamole/src/main/frontend/src/app/home/templates/home.html b/guacamole/src/main/frontend/src/app/home/templates/home.html new file mode 100644 index 0000000..872ac98 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/templates/home.html @@ -0,0 +1,36 @@ +
      + +
      + + +
      +

      {{'HOME.SECTION_HEADER_RECENT_CONNECTIONS' | translate}}

      + +
      + + + +
      +

      {{'HOME.SECTION_HEADER_ALL_CONNECTIONS' | translate}}

      + + +
      +
      + +
      + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/home/types/ActiveConnection.js b/guacamole/src/main/frontend/src/app/home/types/ActiveConnection.js new file mode 100644 index 0000000..3de16c9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/types/ActiveConnection.js @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ActiveConnection class used by the guacRecentConnections + * directive. + */ +angular.module('home').factory('ActiveConnection', [function defineActiveConnection() { + + /** + * A recently-user connection, visible to the current user, with an + * associated history entry. + * + * @constructor + */ + var ActiveConnection = function ActiveConnection(name, client) { + + /** + * The human-readable name of this connection. + * + * @type String + */ + this.name = name; + + /** + * The client associated with this active connection. + * + * @type ManagedClient + */ + this.client = client; + + }; + + return ActiveConnection; + +}]); diff --git a/guacamole/src/main/frontend/src/app/home/types/RecentConnection.js b/guacamole/src/main/frontend/src/app/home/types/RecentConnection.js new file mode 100644 index 0000000..149d71f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/home/types/RecentConnection.js @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the RecentConnection class used by the guacRecentConnections + * directive. + */ +angular.module('home').factory('RecentConnection', [function defineRecentConnection() { + + /** + * A recently-user connection, visible to the current user, with an + * associated history entry. + * + * @constructor + */ + var RecentConnection = function RecentConnection(name, entry) { + + /** + * The human-readable name of this connection. + * + * @type String + */ + this.name = name; + + /** + * The history entry associated with this recent connection. + * + * @type HistoryEntry + */ + this.entry = entry; + + }; + + return RecentConnection; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/controllers/importConnectionsController.js b/guacamole/src/main/frontend/src/app/import/controllers/importConnectionsController.js new file mode 100644 index 0000000..b468820 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/controllers/importConnectionsController.js @@ -0,0 +1,699 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* global _ */ + +/** + * The allowed MIME type for CSV files. + * + * @type String + */ +const CSV_MIME_TYPE = 'text/csv'; + +/** + * A fallback regular expression for CSV filenames, if no MIME type is provided + * by the browser. Any file that matches this regex will be considered to be a + * CSV file. + * + * @type RegExp + */ +const CSV_FILENAME_REGEX = /\.csv$/i; + +/** + * The allowed MIME type for JSON files. + * + * @type String + */ +const JSON_MIME_TYPE = 'application/json'; + +/** + * A fallback regular expression for JSON filenames, if no MIME type is provided + * by the browser. Any file that matches this regex will be considered to be a + * JSON file. + * + * @type RegExp + */ +const JSON_FILENAME_REGEX = /\.json$/i; + +/** + * The allowed MIME types for YAML files. + * NOTE: There is no registered MIME type for YAML files. This may result in a + * wide variety of possible browser-supplied MIME types. + * + * @type String[] + */ +const YAML_MIME_TYPES = [ + 'text/x-yaml', + 'text/yaml', + 'text/yml', + 'application/x-yaml', + 'application/x-yml', + 'application/yaml', + 'application/yml' +]; + +/** + * A fallback regular expression for YAML filenames, if no MIME type is provided + * by the browser. Any file that matches this regex will be considered to be a + * YAML file. + * + * @type RegExp + */ +const YAML_FILENAME_REGEX = /\.ya?ml$/i; + +/** + * Possible signatures for zip files (which include most modern Microsoft office + * documents - most notable excel). If any file, regardless of extension, has + * these starting bytes, it's invalid and must be rejected. + * For more, see https://en.wikipedia.org/wiki/List_of_file_signatures and + * https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files. + * + * @type String[] + */ +const ZIP_SIGNATURES = [ + 'PK\u0003\u0004', + 'PK\u0005\u0006', + 'PK\u0007\u0008' +]; + +/* + * All file types supported for connection import. + * + * @type {String[]} + */ +const LEGAL_MIME_TYPES = [CSV_MIME_TYPE, JSON_MIME_TYPE, ...YAML_MIME_TYPES]; + +/** + * The controller for the connection import page. + */ +angular.module('import').controller('importConnectionsController', ['$scope', '$injector', + function importConnectionsController($scope, $injector) { + + // Required services + const $location = $injector.get('$location'); + const $q = $injector.get('$q'); + const $routeParams = $injector.get('$routeParams'); + const connectionParseService = $injector.get('connectionParseService'); + const connectionService = $injector.get('connectionService'); + const guacNotification = $injector.get('guacNotification'); + const permissionService = $injector.get('permissionService'); + const userService = $injector.get('userService'); + const userGroupService = $injector.get('userGroupService'); + + // Required types + const ConnectionImportConfig = $injector.get('ConnectionImportConfig'); + const DirectoryPatch = $injector.get('DirectoryPatch'); + const Error = $injector.get('Error'); + const ParseError = $injector.get('ParseError'); + const PermissionSet = $injector.get('PermissionSet'); + const User = $injector.get('User'); + const UserGroup = $injector.get('UserGroup'); + + /** + * The result of parsing the current upload, if successful. + * + * @type {ParseResult} + */ + $scope.parseResult = null; + + /** + * The failure associated with the current attempt to create connections + * through the API, if any. + * + * @type {Error} + */ + $scope.patchFailure = null;; + + /** + * True if the file is fully uploaded and ready to be processed, or false + * otherwise. + * + * @type {Boolean} + */ + $scope.dataReady = false; + + /** + * True if the file upload has been aborted mid-upload, or false otherwise. + */ + $scope.aborted = false; + + /** + * True if fully-uploaded data is being processed, or false otherwise. + */ + $scope.processing = false; + + /** + * The MIME type of the uploaded file, if any. + * + * @type {String} + */ + $scope.mimeType = null; + + /** + * The name of the file that's currently being uploaded, or has yet to + * be imported, if any. + * + * @type {String} + */ + $scope.fileName = null; + + /** + * The raw string contents of the uploaded file, if any. + * + * @type {String} + */ + $scope.fileData = null; + + /** + * The file reader currently being used to upload the file, if any. If + * null, no file upload is currently in progress. + * + * @type {FileReader} + */ + $scope.fileReader = null; + + /** + * The configuration options for this import, to be chosen by the user. + * + * @type {ConnectionImportConfig} + */ + $scope.importConfig = new ConnectionImportConfig(); + + /** + * Clear all file upload state. + */ + function resetUploadState() { + + $scope.aborted = false; + $scope.dataReady = false; + $scope.processing = false; + $scope.fileData = null; + $scope.mimeType = null; + $scope.fileReader = null; + $scope.parseResult = null; + $scope.patchFailure = null; + $scope.fileName = null; + + } + + // Indicate that data is currently being loaded / processed if the the file + // has been provided but not yet fully uploaded, or if the the file is + // fully loaded and is currently being processed. + $scope.isLoading = () => ( + ($scope.fileName && !$scope.dataReady && !$scope.patchFailure) + || $scope.processing); + + /** + * Create all users and user groups mentioned in the import file that don't + * already exist in the current data source. Return an object describing the + * result of the creation requests. + * + * @param {ParseResult} parseResult + * The result of parsing the user-supplied import file. + * + * @return {Promise.} + * A promise resolving to an object containing the results of the calls + * to create the users and groups. + */ + function createUsersAndGroups(parseResult) { + + const dataSource = $routeParams.dataSource; + + return $q.all({ + existingUsers : userService.getUsers(dataSource), + existingGroups : userGroupService.getUserGroups(dataSource) + }).then(({existingUsers, existingGroups}) => { + + const userPatches = Object.keys(parseResult.users) + + // Filter out any existing users + .filter(identifier => !existingUsers[identifier]) + + // A patch to create each new user + .map(username => new DirectoryPatch({ + op: 'add', + path: '/', + value: new User({ username }) + })); + + const groupPatches = Object.keys(parseResult.groups) + + // Filter out any existing groups + .filter(identifier => !existingGroups[identifier]) + + // A patch to create each new user group + .map(identifier => new DirectoryPatch({ + op: 'add', + path: '/', + value: new UserGroup({ identifier }) + })); + + // Create all the users and groups + return $q.all({ + userResponse: userService.patchUsers(dataSource, userPatches), + userGroupResponse: userGroupService.patchUserGroups( + dataSource, groupPatches) + }); + + }); + + } + + /** + * Grant read permissions for each user and group in the supplied parse + * result to each connection in their connection list. Note that there will + * be a seperate request for each user and group. + * + * @param {ParseResult} parseResult + * The result of successfully parsing a user-supplied import file. + * + * @param {Object} response + * The response from the PATCH API request. + * + * @returns {Promise.} + * A promise that will resolve with the result of every permission + * granting request. + */ + function grantConnectionPermissions(parseResult, response) { + + const dataSource = $routeParams.dataSource; + + // All connection grant requests, one per user/group + const userRequests = {}; + const groupRequests = {}; + + // Create a PermissionSet granting access to all connections at + // the provided indices within the provided parse result + const createPermissionSet = indices => + new PermissionSet({ connectionPermissions: indices.reduce( + (permissions, index) => { + const connectionId = response.patches[index].identifier; + permissions[connectionId] = [ + PermissionSet.ObjectPermissionType.READ]; + return permissions; + }, {}) }); + + // Now that we've created all the users, grant access to each + _.forEach(parseResult.users, (connectionIndices, identifier) => + + // Grant the permissions - note the group flag is `false` + userRequests[identifier] = permissionService.patchPermissions( + dataSource, identifier, + + // Create the permissions to these connections for this user + createPermissionSet(connectionIndices), + + // Do not remove any permissions + new PermissionSet(), + + // This call is not for a group + false)); + + // Now that we've created all the groups, grant access to each + _.forEach(parseResult.groups, (connectionIndices, identifier) => + + // Grant the permissions - note the group flag is `true` + groupRequests[identifier] = permissionService.patchPermissions( + dataSource, identifier, + + // Create the permissions to these connections for this user + createPermissionSet(connectionIndices), + + // Do not remove any permissions + new PermissionSet(), + + // This call is for a group + true)); + + // Return the result from all the permission granting calls + return $q.all({ ...userRequests, ...groupRequests }); + } + + /** + * Process a successfully parsed import file, creating any specified + * connections, creating and granting permissions to any specified users + * and user groups. If successful, the user will be shown a success message. + * If not, any errors will be displayed and any already-created entities + * will be rolled back. + * + * @param {ParseResult} parseResult + * The result of parsing the user-supplied import file. + */ + function handleParseSuccess(parseResult) { + + $scope.processing = false; + $scope.parseResult = parseResult; + + // If errors were encounted during file parsing, abort further + // processing - the user will have a chance to fix the errors and try + // again + if (parseResult.hasErrors) + return; + + const dataSource = $routeParams.dataSource; + + // First, attempt to create the connections + connectionService.patchConnections(dataSource, parseResult.patches) + .then(connectionResponse => + + // If connection creation is successful, create users and groups + createUsersAndGroups(parseResult).then(() => + + // Grant any new permissions to users and groups. NOTE: Any + // existing permissions for updated connections will NOT be + // removed - only new permissions will be added. + grantConnectionPermissions(parseResult, connectionResponse) + .then(() => { + + $scope.processing = false; + + // Display a success message if everything worked + guacNotification.showStatus({ + className : 'success', + title : 'IMPORT.DIALOG_HEADER_SUCCESS', + text : { + key: 'IMPORT.INFO_CONNECTIONS_IMPORTED_SUCCESS', + variables: { NUMBER: parseResult.connectionCount } + }, + + // Add a button to acknowledge and redirect to + // the connection listing page + actions : [{ + name : 'IMPORT.ACTION_ACKNOWLEDGE', + callback : () => { + + // Close the notification + guacNotification.showStatus(false); + + // Redirect to connection list page + $location.url('/settings/' + dataSource + '/connections'); + } + }] + }); + })) + + // If an error occurs while trying to create users or groups, + // display the error to the user. + .catch(handleError) + ) + + // If an error occurred when the call to create the connections was made, + // skip any further processing - the user will have a chance to fix the + // problems and try again + .catch(patchFailure => { + $scope.processing = false; + $scope.patchFailure = patchFailure; + }); + } + + /** + * Display the provided error to the user in a dismissable dialog. + * + * @argument {ParseError|Error} error + * The error to display. + */ + const handleError = error => { + + // Any error indicates that processing of the file has failed, so clear + // all upload state to allow for a fresh retry + resetUploadState(); + + let text; + + // If it's a import file parsing error + if (error instanceof ParseError) + text = { + + // Use the translation key if available + key: error.key || error.message, + variables: error.variables + }; + + // If it's a generic REST error + else if (error instanceof Error) + text = error.translatableMessage; + + // If it's an unknown type, just use the message directly + else + text = { key: error }; + + guacNotification.showStatus({ + className : 'error', + title : 'IMPORT.DIALOG_HEADER_ERROR', + text, + + // Add a button to hide the error + actions : [{ + name : 'IMPORT.ACTION_ACKNOWLEDGE', + callback : () => guacNotification.showStatus(false) + }] + }); + + }; + + /** + * Process the uploaded import file, importing the connections, granting + * connection permissions, or displaying errors to the user if there are + * problems with the provided file. + * + * @param {String} mimeType + * The MIME type of the uploaded data file. + * + * @param {String} data + * The raw string contents of the import file. + */ + function processData(mimeType, data) { + + // Data processing has begun + $scope.processing = true; + + // The function that will process all the raw data and return a list of + // patches to be submitted to the API + let processDataCallback; + + // Choose the appropriate parse function based on the mimetype + if (mimeType === JSON_MIME_TYPE) + processDataCallback = connectionParseService.parseJSON; + + else if (mimeType === CSV_MIME_TYPE) + processDataCallback = connectionParseService.parseCSV; + + else if (YAML_MIME_TYPES.indexOf(mimeType) >= 0) + processDataCallback = connectionParseService.parseYAML; + + // The file type was validated before being uploaded - this should + // never happen + else + processDataCallback = () => { + throw new ParseError({ + message: "Unexpected invalid file type: " + mimeType + }); + }; + + // Make the call to process the data into a series of patches + processDataCallback($scope.importConfig, data) + + // Send the data off to be imported if parsing is successful + .then(handleParseSuccess) + + // Display any error found while parsing the file + .catch(handleError); + } + + /** + * Process the uploaded import data. Only usuable if the upload is fully + * complete. + */ + $scope.import = () => processData($scope.mimeType, $scope.fileData); + + /** + * Returns true if import should be disabled, or false if import should be + * allowed. + * + * @return {Boolean} + * True if import should be disabled, otherwise false. + */ + $scope.importDisabled = () => + + // Disable import if no data is ready + !$scope.dataReady || + + // Disable import if the file is currently being processed + $scope.processing; + + /** + * Cancel any in-progress upload, or clear any uploaded-but-errored-out + * batch. + */ + $scope.cancel = function() { + + // If the upload is in progress, stop it now; the FileReader will + // reset the upload state when it stops + if ($scope.fileReader) { + $scope.aborted = true; + $scope.fileReader.abort(); + } + + // Clear any upload state - there's no FileReader handler to do it + else + resetUploadState(); + + }; + + /** + * Returns true if cancellation should be disabled, or false if + * cancellation should be allowed. + * + * @return {Boolean} + * True if cancellation should be disabled, or false if cancellation + * should be allowed. + */ + $scope.cancelDisabled = () => + + // Disable cancellation if the import has already been cancelled + $scope.aborted || + + // Disable cancellation if the file is currently being processed + $scope.processing || + + // Disable cancellation if no data is ready or being uploaded + !($scope.fileReader || $scope.dataReady); + + /** + * Handle a provided File upload, reading all data onto the scope for + * import processing, should the user request an import. Note that this + * function is used as a callback for directives that invoke it with a file + * list, but directive-level checking should ensure that there is only ever + * one file provided at a time. + * + * @argument {File[]} files + * The files to upload onto the scope for further processing. There + * should only ever be a single file in the array. + */ + $scope.handleFiles = files => { + + // There should only ever be a single file in the array + const file = files[0]; + + // The name and MIME type of the file as provided by the browser + let fileName = file.name; + let mimeType = file.type; + + // If no MIME type was provided by the browser at all, use REGEXes as a + // fallback to try to determine the file type. NOTE: Windows 10/11 are + // known to do this with YAML files. + if (!_.trim(mimeType).length) { + + // If the file name matches what we'd expect for a CSV file, set the + // CSV MIME type and move on + if (CSV_FILENAME_REGEX.test(fileName)) + mimeType = CSV_MIME_TYPE; + + // If the file name matches what we'd expect for a JSON file, set + // the JSON MIME type and move on + else if (JSON_FILENAME_REGEX.test(fileName)) + mimeType = JSON_MIME_TYPE; + + // If the file name matches what we'd expect for a JSON file, set + // one of the allowed YAML MIME types and move on + else if (YAML_FILENAME_REGEX.test(fileName)) + mimeType = YAML_MIME_TYPES[0]; + + else { + + // If none of the REGEXes pass, there's nothing more to be tried + handleError(new ParseError({ + message: "Unknown type for file: " + fileName, + key: 'IMPORT.ERROR_DETECTED_INVALID_TYPE' + })); + return; + + } + + } + + // Check if the mimetype is one of the supported types, + // e.g. "application/json" or "text/csv" + else if (LEGAL_MIME_TYPES.indexOf(mimeType) < 0) { + + // If the provided file is not one of the supported types, + // display an error and abort processing + handleError(new ParseError({ + message: "Invalid file type: " + mimeType, + key: 'IMPORT.ERROR_INVALID_MIME_TYPE', + variables: { TYPE: mimeType } + })); + return; + + } + + // Save the name and type to the scope + $scope.fileName = fileName; + $scope.mimeType = mimeType; + + // Initialize upload state + $scope.aborted = false; + $scope.dataReady = false; + $scope.processing = false; + $scope.uploadStarted = true; + + // Save the file to the scope when ready + $scope.fileReader = new FileReader(); + $scope.fileReader.onloadend = (e => { + + // If the upload was explicitly aborted, clear any upload state and + // do not process the data + if ($scope.aborted) + resetUploadState(); + + else { + + const fileData = e.target.result; + + // Check if the file has a header of a known-bad type + if (_.some(ZIP_SIGNATURES, + signature => fileData.startsWith(signature))) { + + // Throw an error and abort processing + handleError(new ParseError({ + message: "Invalid file type detected", + key: 'IMPORT.ERROR_DETECTED_INVALID_TYPE' + })); + return; + + } + + // Save the uploaded data + $scope.fileData = fileData; + + // Mark the data as ready + $scope.dataReady = true; + + // Clear the file reader from the scope now that this file is + // fully uploaded + $scope.fileReader = null; + + } + }); + + // Read all the data into memory + $scope.fileReader.readAsText(file); + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/directives/connectionImportErrors.js b/guacamole/src/main/frontend/src/app/import/directives/connectionImportErrors.js new file mode 100644 index 0000000..17d2fef --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/directives/connectionImportErrors.js @@ -0,0 +1,319 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* global _ */ + +/** + * A directive that displays errors that occurred during parsing of a connection + * import file, or errors that were returned from the API during the connection + * batch creation attempt. + */ +angular.module('import').directive('connectionImportErrors', [ + function connectionImportErrors() { + + const directive = { + restrict: 'E', + replace: true, + templateUrl: 'app/import/templates/connectionErrors.html', + scope: { + + /** + * The result of parsing the import file. Any errors in this file + * will be displayed to the user. + * + * @type ParseResult + */ + parseResult : '=', + + /** + * The error associated with an attempt to batch create the + * connections represented by the ParseResult, if the ParseResult + * had no errors. If the provided ParseResult has errors, no request + * should have been made, and any provided patch error will be + * ignored. + * + * @type Error + */ + patchFailure : '=', + + } + }; + + directive.controller = ['$scope', '$injector', + function connectionImportErrorsController($scope, $injector) { + + // Required types + const DirectoryPatch = $injector.get('DirectoryPatch'); + const DisplayErrorList = $injector.get('DisplayErrorList'); + const ImportConnectionError = $injector.get('ImportConnectionError'); + const ParseError = $injector.get('ParseError'); + const SortOrder = $injector.get('SortOrder'); + + // Required services + const $q = $injector.get('$q'); + const $translate = $injector.get('$translate'); + + // There are errors to display if the parse result generated errors, or + // if the patch request failed + $scope.hasErrors = () => + !!_.get($scope, 'parseResult.hasErrors') || !!$scope.patchFailure; + + /** + * All connections with their associated errors for display. These may + * be either parsing failures, or errors returned from the API. Both + * error types will be adapted to a common display format, though the + * error types will never be mixed, because no REST request should ever + * be made if there are client-side parse errors. + * + * @type {ImportConnectionError[]} + */ + $scope.connectionErrors = []; + + /** + * SortOrder instance which maintains the sort order of the visible + * connection errors. + * + * @type SortOrder + */ + $scope.errorOrder = new SortOrder([ + 'rowNumber', + 'name', + 'group', + 'protocol', + 'errors', + ]); + + /** + * Array of all connection error properties that are filterable. + * + * @type String[] + */ + $scope.filteredErrorProperties = [ + 'rowNumber', + 'name', + 'group', + 'protocol', + 'errors', + ]; + + /** + * Generate a ImportConnectionError representing any errors associated + * with the row at the given index within the given parse result. + * + * @param {ParseResult} parseResult + * The result of parsing the connection import file. + * + * @param {Integer} index + * The current row within the patches array, 0-indexed. + * + * @param {Integer} row + * The current row within the original connection, 0-indexed. + * If any REMOVE patches are present, this may be greater than + * the index. + * + * @returns {ImportConnectionError} + * The connection error object associated with the given row in the + * given parse result. + */ + const generateConnectionError = (parseResult, index, row) => { + + // Get the patch associated with the current row + const patch = parseResult.patches[index]; + + // The value of a patch is just the Connection object + const connection = patch.value; + + return new ImportConnectionError({ + + // Add 1 to the provided row to get the position in the file + rowNumber: row + 1, + + // Basic connection information - name, group, and protocol. + name: connection.name, + group: parseResult.groupPaths[index], + protocol: connection.protocol, + + // The human-readable error messages + errors: new DisplayErrorList( + [ ...(parseResult.errors[index] || []) ]) + }); + }; + + // If a new connection patch failure is seen, update the display list + $scope.$watch('patchFailure', function patchFailureChanged(patchFailure) { + + const { parseResult } = $scope; + + // Do not attempt to process anything before the data has loaded + if (!patchFailure || !parseResult) + return; + + // All promises from all translation requests. The scope will not be + // updated until all translations are ready. + const translationPromises = []; + + // Any error returned from the API specifically associated with the + // preceding REMOVE patch + let removeError = null; + + // Fetch the API error, if any, of the patch at the given index + const getAPIError = index => + _.get(patchFailure, ['patches', index, 'error']); + + // The row number for display. Unlike the index, this number will + // skip any REMOVE patches. In other words, this is the index of + // connections within the original import file. + let row = 0; + + // Set up the list of connection errors based on the existing parse + // result, with error messages fetched from the patch failure + const connectionErrors = parseResult.patches.reduce( + (errors, patch, index) => { + + // Do not process display REMOVE patches - they are always + // followed by ADD patches containing the actual content + // (and errors, if any) + if (patch.op === DirectoryPatch.Operation.REMOVE) { + + // Save the API error, if any, so it can be displayed + // alongside the connection information associated with the + // following ADD patch + removeError = getAPIError(index); + + // Do not add an entry for this remove patch - it should + // always be followed by a corresponding CREATE patch + // containing the relevant connection information + return errors; + + } + + // Generate a connection error for display + const connectionError = generateConnectionError( + parseResult, index, row++); + + // Add the error associated with the previous REMOVE patch, if + // any, to the error associated with the current patch, if any + const apiErrors = [ removeError, getAPIError(index) ]; + + // Clear the previous REMOVE patch error after consuming it + removeError = null; + + // Go through each potential API error + apiErrors.forEach(error => + + // If the API error exists, fetch the translation and + // update it when it's ready + error && translationPromises.push($translate( + error.key, error.variables) + .then(translatedError => + connectionError.errors.getArray().push(translatedError) + ))); + + errors.push(connectionError); + return errors; + + }, []); + + // Once all the translations have been completed, update the + // connectionErrors all in one go, to ensure no excessive reloading + $q.all(translationPromises).then(() => { + $scope.connectionErrors = connectionErrors; + }); + + }); + + // If a new parse result with errors is seen, update the display list + $scope.$watch('parseResult', function parseResultChanged(parseResult) { + + // Do not process if there are no errors in the provided result + if (!parseResult || !parseResult.hasErrors) + return; + + // All promises from all translation requests. The scope will not be + // updated until all translations are ready. + const translationPromises = []; + + // The parse result should only be updated on a fresh file import; + // therefore it should be safe to skip checking the patch errors + // entirely - if set, they will be from the previous file and no + // longer relevant. + + // The row number for display. Unlike the index, this number will + // skip any REMOVE patches. In other words, this is the index of + // connections within the original import file. + let row = 0; + + // Set up the list of connection errors based on the updated parse + // result + const connectionErrors = parseResult.patches.reduce( + (errors, patch, index) => { + + // Do not process display REMOVE patches - they are always + // followed by ADD patches containing the actual content + // (and errors, if any) + if (patch.op === DirectoryPatch.Operation.REMOVE) + return errors; + + // Generate a connection error for display + const connectionError = generateConnectionError( + parseResult, index, row++); + + // Go through the errors and check if any are translateable + connectionError.errors.getArray().forEach( + (error, errorIndex) => { + + // If this error is a ParseError, it can be translated. + // NOTE: Generally one would translate error messages in the + // template, but in this case, the connection errors need to + // be raw strings in order to enable sorting and filtering. + if (error instanceof ParseError) + + // Fetch the translation and update it when it's ready + translationPromises.push($translate( + error.key, error.variables) + .then(translatedError => { + connectionError.errors.getArray()[errorIndex] = translatedError; + })); + + // If the error is not a known translatable type, add the + // message directly to the error array + else + connectionError.errors.getArray()[errorIndex] = ( + error.message ? error.message : error); + + }); + + errors.push(connectionError); + return errors; + + }, []); + + // Once all the translations have been completed, update the + // connectionErrors all in one go, to ensure no excessive reloading + $q.all(translationPromises).then(() => { + $scope.connectionErrors = connectionErrors; + }); + + }); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/importModule.js b/guacamole/src/main/frontend/src/app/import/importModule.js new file mode 100644 index 0000000..45551e3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/importModule.js @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code supporting importing user-supplied files. Currently, only + * connection import is supported. + */ +angular.module('import', ['element', 'list', 'notification', 'rest']); diff --git a/guacamole/src/main/frontend/src/app/import/services/connectionCSVService.js b/guacamole/src/main/frontend/src/app/import/services/connectionCSVService.js new file mode 100644 index 0000000..375ce0a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/services/connectionCSVService.js @@ -0,0 +1,461 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * 'License'); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* global _ */ + +// A suffix that indicates that a particular header refers to a parameter +const PARAMETER_SUFFIX = ' (parameter)'; + +// A suffix that indicates that a particular header refers to an attribute +const ATTRIBUTE_SUFFIX = ' (attribute)'; + +/** + * A service for parsing user-provided CSV connection data for bulk import. + */ +angular.module('import').factory('connectionCSVService', + ['$injector', function connectionCSVService($injector) { + + // Required types + const ParseError = $injector.get('ParseError'); + const ImportConnection = $injector.get('ImportConnection'); + const TranslatableMessage = $injector.get('TranslatableMessage'); + + // Required services + const $q = $injector.get('$q'); + const $routeParams = $injector.get('$routeParams'); + const schemaService = $injector.get('schemaService'); + + const service = {}; + + /** + * Returns a promise that resolves to a object detailing the connection + * attributes for the current data source, as well as the connection + * paremeters for every protocol, for the current data source. + * + * The object that the promise will contain an "attributes" key that maps to + * a set of attribute names, and a "protocolParameters" key that maps to an + * object mapping protocol names to sets of parameter names for that protocol. + * + * The intended use case for this object is to determine if there is a + * connection parameter or attribute with a given name, by e.g. checking the + * path `.protocolParameters[protocolName]` to see if a protocol exists, + * checking the path `.protocolParameters[protocolName][fieldName]` to see + * if a parameter exists for a given protocol, or checking the path + * `.attributes[fieldName]` to check if a connection attribute exists. + * + * @returns {Promise.} + * A promise that resolves to a object detailing the connection + * attributes and parameters for every protocol, for the current data + * source. + */ + function getFieldLookups() { + + // The current data source - the one that the connections will be + // imported into + const dataSource = $routeParams.dataSource; + + // Fetch connection attributes and protocols for the current data source + return $q.all({ + attributes : schemaService.getConnectionAttributes(dataSource), + protocols : schemaService.getProtocols(dataSource) + }) + .then(function connectionStructureRetrieved({attributes, protocols}) { + + return { + + // Translate the forms and fields into a flat map of attribute + // name to `true` boolean value + attributes: attributes.reduce( + (attributeMap, form) => { + form.fields.forEach( + field => attributeMap[field.name] = true); + return attributeMap + }, {}), + + // Translate the protocol definitions into a map of protocol + // name to map of field name to `true` boolean value + protocolParameters: _.mapValues( + protocols, protocol => protocol.connectionForms.reduce( + (protocolFieldMap, form) => { + form.fields.forEach( + field => protocolFieldMap[field.name] = true); + return protocolFieldMap; + }, {})) + }; + }); + } + + /** + * Split a raw user-provided, semicolon-seperated list of identifiers into + * an array of identifiers. If identifiers contain semicolons, they can be + * escaped with backslashes, and backslashes can also be escaped using other + * backslashes. + * + * @param {String} rawIdentifiers + * The raw string value as fetched from the CSV. + * + * @returns {Array.} + * An array of identifier values. + */ + function splitIdentifiers(rawIdentifiers) { + + // Keep track of whether a backslash was seen + let escaped = false; + + return _.reduce(rawIdentifiers, (identifiers, ch) => { + + // The current identifier will be the last one in the final list + let identifier = identifiers[identifiers.length - 1]; + + // If a semicolon is seen, set the "escaped" flag and continue + // to the next character + if (!escaped && ch == '\\') { + escaped = true; + return identifiers; + } + + // End the current identifier and start a new one if there's an + // unescaped semicolon + else if (!escaped && ch == ';') { + identifiers.push(''); + return identifiers; + } + + // In all other cases, just append to the identifier + else { + identifier += ch; + escaped = false; + } + + // Save the updated identifier to the list + identifiers[identifiers.length - 1] = identifier; + + return identifiers; + + }, ['']) + + // Filter out any 0-length (empty) identifiers + .filter(identifier => identifier.length); + + } + + /** + * Given a CSV header row, create and return a promise that will resolve to + * a function that can take a CSV data row and return a ImportConnection + * object. If an error occurs while parsing a particular row, the resolved + * function will throw a ParseError describing the failure. + * + * The provided CSV must contain columns for name and protocol. Optionally, + * the parentIdentifier of the target parent connection group, or a connection + * name path e.g. "ROOT/parent/child" may be included. Additionallty, + * connection parameters or attributes can be included. + * + * The names of connection attributes and parameters are not guaranteed to + * be mutually exclusive, so the CSV import format supports a distinguishing + * suffix. A column may be explicitly declared to be a parameter using a + * " (parameter)" suffix, or an attribute using an " (attribute)" suffix. + * No suffix is required if the name is unique across connections and + * attributes. + * + * If a parameter or attribute name conflicts with the standard + * "name", "protocol", "group", or "parentIdentifier" fields, the suffix is + * required. + * + * If a failure occurs while attempting to create the transformer function, + * the promise will be rejected with a ParseError describing the failure. + * + * @returns {Promise.>} + * A promise that will resolve to a function that translates a CSV data + * row (array of strings) to a ImportConnection object. + */ + service.getCSVTransformer = function getCSVTransformer(headerRow) { + + // A promise that will be resolved with the transformer or rejected if + // an error occurs + const deferred = $q.defer(); + + getFieldLookups().then(({attributes, protocolParameters}) => { + + // All configuration required to generate a function that can + // transform a row of CSV into a connection object. + // NOTE: This is a single object instead of a collection of variables + // to ensure that no stale references are used - e.g. when one getter + // invokes another getter + const transformConfig = { + + // Callbacks for required fields + nameGetter: undefined, + protocolGetter: undefined, + + // Callbacks for a parent group ID or group path + groupGetter: undefined, + parentIdentifierGetter: undefined, + + // Callbacks for user and user group identifiers + usersGetter: () => [], + userGroupsGetter: () => [], + + // Callbacks that will generate either connection attributes or + // parameters. These callbacks will return a {type, name, value} + // object containing the type ("parameter" or "attribute"), + // the name of the attribute or parameter, and the corresponding + // value. + parameterOrAttributeGetters: [] + + }; + + // A set of all headers that have been seen so far. If any of these + // are duplicated, the CSV is invalid. + const headerSet = {}; + + // Iterate through the headers one by one + headerRow.forEach((rawHeader, index) => { + + // Trim to normalize all headers + const header = rawHeader.trim(); + + // Check if the header is duplicated + if (headerSet[header]) { + deferred.reject(new ParseError({ + message: 'Duplicate CSV Header: ' + header, + translatableMessage: new TranslatableMessage({ + key: 'IMPORT.ERROR_DUPLICATE_CSV_HEADER', + variables: { HEADER: header } + }) + })); + return; + } + + // Mark that this particular header has already been seen + headerSet[header] = true; + + // A callback that returns the field at the current index + const fetchFieldAtIndex = row => row[index]; + + // A callback that splits raw string identifier lists by + // semicolon characters into an array of identifiers + const identifierListCallback = row => + splitIdentifiers(fetchFieldAtIndex(row)); + + // Set up the name callback + if (header == 'name') + transformConfig.nameGetter = fetchFieldAtIndex; + + // Set up the protocol callback + else if (header == 'protocol') + transformConfig.protocolGetter = fetchFieldAtIndex; + + // Set up the group callback + else if (header == 'group') + transformConfig.groupGetter = fetchFieldAtIndex; + + // Set up the group parent ID callback + else if (header == 'parentIdentifier') + transformConfig.parentIdentifierGetter = fetchFieldAtIndex; + + // Set the user identifiers callback + else if (header == 'users') + transformConfig.usersGetter = ( + identifierListCallback); + + // Set the user group identifiers callback + else if (header == 'groups') + transformConfig.userGroupsGetter = ( + identifierListCallback); + + // At this point, any other header might refer to a connection + // parameter or to an attribute + + // A field may be explicitly specified as a parameter + else if (header.endsWith(PARAMETER_SUFFIX)) { + + // Push as an explicit parameter getter + const parameterName = header.replace(PARAMETER_SUFFIX, ''); + transformConfig.parameterOrAttributeGetters.push( + row => ({ + type: 'parameters', + name: parameterName, + value: fetchFieldAtIndex(row) + }) + ); + } + + // A field may be explicitly specified as a parameter + else if (header.endsWith(ATTRIBUTE_SUFFIX)) { + + // Push as an explicit attribute getter + const attributeName = header.replace(ATTRIBUTE_SUFFIX, ''); + transformConfig.parameterOrAttributeGetters.push( + row => ({ + type: 'attributes', + name: attributeName, + value: fetchFieldAtIndex(row) + }) + ); + } + + // The field is ambiguous, either an attribute or parameter, + // so the getter will have to determine this for every row + else + transformConfig.parameterOrAttributeGetters.push(row => { + + // The name is just the value of the current header + const name = header; + + // The value is at the index that matches the position + // of the header + const value = fetchFieldAtIndex(row); + + // If no value is provided, do not check the validity + // of the parameter/attribute. Doing so would prevent + // the import of a list of mixed protocol types, where + // fields are only populated for protocols for which + // they are valid parameters. If a value IS provided, + // it must be a valid parameter or attribute for the + // current protocol, which will be checked below. + if (!value) + return {}; + + // The protocol may determine whether a field is + // a parameter or an attribute (or both) + const protocol = transformConfig.protocolGetter(row); + + // Any errors encountered while processing this row + const errors = []; + + // Before checking whether it's an attribute or protocol, + // make sure this is a valid protocol to start + if (!protocolParameters[protocol]) + + // If the protocol is invalid, do not throw an error + // here - this will be handled further downstream + // by non-CSV-specific error handling + return {}; + + // Determine if the field refers to an attribute or a + // parameter (or both, which is an error) + const isAttribute = !!attributes[name]; + const isParameter = !!_.get( + protocolParameters, [protocol, name]); + + // If there is both an attribute and a protocol-specific + // parameter with the provided name, it's impossible to + // figure out which this should be + if (isAttribute && isParameter) + errors.push(new ParseError({ + message: 'Ambiguous CSV Header: ' + header, + key: 'IMPORT.ERROR_AMBIGUOUS_CSV_HEADER', + variables: { HEADER: header } + })); + + // It's neither an attribute or a parameter + else if (!isAttribute && !isParameter) + errors.push(new ParseError({ + message: 'Invalid CSV Header: ' + header, + key: 'IMPORT.ERROR_INVALID_CSV_HEADER', + variables: { HEADER: header } + })); + + // Choose the appropriate type + const type = isAttribute ? 'attributes' : 'parameters'; + + return { type, name, value, errors }; + }); + }); + + const { + nameGetter, protocolGetter, + parentIdentifierGetter, groupGetter, + usersGetter, userGroupsGetter, + parameterOrAttributeGetters + } = transformConfig; + + // Fail if the name wasn't provided. Note that this is a file-level + // error, not specific to any connection. + if (!nameGetter) + deferred.reject(new ParseError({ + message: 'The connection name must be provided', + key: 'IMPORT.ERROR_REQUIRED_NAME_FILE' + })); + + // Fail if the protocol wasn't provided + if (!protocolGetter) + deferred.reject(new ParseError({ + message: 'The connection protocol must be provided', + key: 'IMPORT.ERROR_REQUIRED_PROTOCOL_FILE' + })); + + // The function to transform a CSV row into a connection object + deferred.resolve(function transformCSVRow(row) { + + // Get name and protocol + const name = nameGetter(row); + const protocol = protocolGetter(row); + + // Get any users or user groups who should be granted access + const users = usersGetter(row); + const groups = userGroupsGetter(row); + + // Get the parent group ID and/or group path + const group = groupGetter && groupGetter(row); + const parentIdentifier = ( + parentIdentifierGetter && parentIdentifierGetter(row)); + + return new ImportConnection({ + + // Fields that are not protocol-specific + name, + protocol, + parentIdentifier, + group, + users, + groups, + + // Fields that might potentially be either attributes or + // parameters, depending on the protocol + ...parameterOrAttributeGetters.reduce((values, getter) => { + + // Determine the type, name, and value + const { type, name, value, errors } = getter(row); + + // Set the value if available + if (type && name && value) + values[type][name] = value; + + // If there were errors + if (errors && errors.length) + values.errors = [...values.errors, ...errors]; + + // Continue on to the next attribute or parameter + return values; + + }, {parameters: {}, attributes: {}, errors: []}) + + }); + + }); + + }); + + return deferred.promise; + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/services/connectionParseService.js b/guacamole/src/main/frontend/src/app/import/services/connectionParseService.js new file mode 100644 index 0000000..5971700 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/services/connectionParseService.js @@ -0,0 +1,843 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * 'License'); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* global _ */ + +import { parse as parseCSVData } from 'csv-parse/lib/sync' +import { parse as parseYAMLData } from 'yaml' + +/** + * A particularly unfriendly looking error that the CSV parser throws if a + * binary file parse attempt is made. If at all possible, this message should + * never be displayed to the user since it makes it look like the application + * is broken. As such, the code will attempt to filter out this error and print + * something a bit more generic. Lowercased for slightly fuzzier matching. + * + * @type String + */ +const BINARY_CSV_ERROR_MESSAGE = "Argument must be a Buffer".toLowerCase(); + +/** + * A service for parsing user-provided JSON, YAML, or JSON connection data into + * an appropriate format for bulk uploading using the PATCH REST endpoint. + */ +angular.module('import').factory('connectionParseService', + ['$injector', function connectionParseService($injector) { + + // Required types + const Connection = $injector.get('Connection'); + const ConnectionImportConfig = $injector.get('ConnectionImportConfig'); + const DirectoryPatch = $injector.get('DirectoryPatch'); + const ImportConnection = $injector.get('ImportConnection'); + const ParseError = $injector.get('ParseError'); + const ParseResult = $injector.get('ParseResult'); + const TranslatableMessage = $injector.get('TranslatableMessage'); + + // Required services + const $q = $injector.get('$q'); + const $routeParams = $injector.get('$routeParams'); + const schemaService = $injector.get('schemaService'); + const connectionCSVService = $injector.get('connectionCSVService'); + const connectionGroupService = $injector.get('connectionGroupService'); + + const service = {}; + + /** + * The identifier of the root connection group, under which all other groups + * and connections exist. + * + * @type String + */ + const ROOT_GROUP_IDENTIFIER = 'ROOT'; + + /** + * Perform basic checks, common to all file types - namely that the parsed + * data is an array, and contains at least one connection entry. Returns an + * error if any of these basic checks fails. + * + * @returns {ParseError} + * An error describing the parsing failure, if one of the basic checks + * fails. + */ + function performBasicChecks(parsedData) { + + // Make sure that the file data parses to an array (connection list) + if (!(parsedData instanceof Array)) + return new ParseError({ + message: 'Import data must be a list of connections', + key: 'IMPORT.ERROR_ARRAY_REQUIRED' + }); + + // Make sure that the connection list is not empty - contains at least + // one connection + if (!parsedData.length) + return new ParseError({ + message: 'The provided file is empty', + key: 'IMPORT.ERROR_EMPTY_FILE' + }); + } + + /** + * A collection of connection-group-tree-derived maps that are useful for + * processing connections. + * + * @constructor + * @param {TreeLookups|{}} template + * The object whose properties should be copied within the new + * ConnectionImportConfig. + */ + const TreeLookups = template => ({ + + /** + * A map of all known group paths to the corresponding identifier for + * that group. The is that a user-provided import file might directly + * specify a named group path like "ROOT", "ROOT/parent", or + * "ROOT/parent/child". This field field will map all of the above to + * the identifier of the appropriate group, if defined. + * + * @type Object. + */ + groupPathsByIdentifier: template.groupPathsByIdentifier || {}, + + /** + * A map of all known group identifiers to the path of the corresponding + * group. These paths are all of the form "ROOT/parent/child". + * + * @type Object. + */ + groupIdentifiersByPath: template.groupIdentifiersByPath || {}, + + /** + * A map of group identifier, to connection name, to connection + * identifier. These paths are all of the form "ROOT/parent/child". The + * idea is that existing connections can be found by checking if a + * connection already exists with the same parent group, and with the + * same name as an user-supplied import connection. + * + * @type Object. + */ + connectionIdsByGroupAndName : template.connectionIdsByGroupAndName || {} + + }); + + /** + * Returns a promise that resolves to a TreeLookups object containing maps + * useful for processing user-supplied connections to be imported, derived + * from the current connection group tree, starting at the ROOT group. + * + * @returns {Promise.} + * A promise that resolves to a TreeLookups object containing maps + * useful for processing connections. + */ + function getTreeLookups() { + + // The current data source - defines all the groups that the connections + // might be imported into + const dataSource = $routeParams.dataSource; + + const deferredTreeLookups = $q.defer(); + + connectionGroupService.getConnectionGroupTree(dataSource).then( + rootGroup => { + + const lookups = new TreeLookups({}); + + // Add the specified group to the lookup, appending all specified + // prefixes, and then recursively call saveLookups for all children + // of the group, appending to the prefix for each level + const saveLookups = (prefix, group) => { + + // To get the path for the current group, add the name + const currentPath = prefix + group.name; + + // Add the current path to the identifier map + lookups.groupPathsByIdentifier[currentPath] = group.identifier; + + // Add the current identifier to the path map + lookups.groupIdentifiersByPath[group.identifier] = currentPath; + + // Add each connection to the connection map + _.forEach(group.childConnections, + connection => _.setWith( + lookups.connectionIdsByGroupAndName, + [group.identifier, connection.name], + connection.identifier, Object)); + + // Add each child group to the lookup + const nextPrefix = currentPath + "/"; + _.forEach(group.childConnectionGroups, + childGroup => saveLookups(nextPrefix, childGroup)); + + } + + // Start at the root group + saveLookups("", rootGroup); + + // Resolve with the now fully-populated lookups + deferredTreeLookups.resolve(lookups); + + }); + + return deferredTreeLookups.promise; + } + + /** + * Returns a promise that will resolve to a transformer function that will + * perform various checks and transforms relating to the connection group + * tree hierarchy, pushing any errors into the resolved connection object. + * It will: + * - Ensure that a connection specifies either a valid group path (no path + * defaults to ROOT), or a valid parent group identifier, but not both + * - Ensure that this connection does not duplicate another connection + * earlier in the import file + * - Handle import connections that match existing connections connections + * based on the provided import config. + * + * The group set on the connection may begin with the root identifier, a + * leading slash, or may omit the root identifier entirely. The group may + * optionally end with a trailing slash. + * + * @param {ConnectionImportConfig} importConfig + * The configuration options selected by the user prior to import. + * + * @returns {Promise.>} + * A promise that will resolve to a function that will apply various + * connection tree based checks and transforms to this connection. + */ + function getTreeTransformer(importConfig) { + + // A map of group path with connection name, to connection object, used + // for detecting duplicate connections within the import file itself + const connectionsInFile = {}; + + return getTreeLookups().then(treeLookups => connection => { + + const { groupPathsByIdentifier, groupIdentifiersByPath, + connectionIdsByGroupAndName } = treeLookups; + + const providedIdentifier = connection.parentIdentifier; + + // The normalized group path for this connection, of the form + // "ROOT/parent/child" + let group; + + // The identifier for the parent group of this connection + let parentIdentifier; + + // The operator to apply for this connection + let op = DirectoryPatch.Operation.ADD; + + // If both are specified, the parent group is ambigious + if (providedIdentifier && connection.group) { + connection.errors.push(new ParseError({ + message: 'Only one of group or parentIdentifier can be set', + key: 'IMPORT.ERROR_AMBIGUOUS_PARENT_GROUP' + })); + return connection; + } + + // If a parent group identifier is present, but not valid + else if (providedIdentifier + && !groupPathsByIdentifier[providedIdentifier]) { + connection.errors.push(new ParseError({ + message: 'No group with identifier: ' + providedIdentifier, + key: 'IMPORT.ERROR_INVALID_GROUP_IDENTIFIER', + variables: { IDENTIFIER: providedIdentifier } + })); + return connection; + } + + // If the parent identifier is valid, use it to determine the path + else if (providedIdentifier) { + parentIdentifier = providedIdentifier; + group = groupPathsByIdentifier[providedIdentifier]; + } + + // If a user-supplied group path is provided, attempt to normalize + // and match it to an existing connection group + else if (connection.group) { + + // The group path extracted from the user-provided connection, + // to be translated into an absolute path starting at the root + group = connection.group; + + // If the provided group isn't a string, it can never be valid + if (typeof group !== 'string') { + connection.errors.push(new ParseError({ + message: 'Invalid group type - must be a string', + key: 'IMPORT.ERROR_INVALID_GROUP_TYPE' + })); + return connection; + } + + // Allow the group to start with a leading slash instead instead + // of explicitly requiring the root connection group + if (group.startsWith('/')) + group = ROOT_GROUP_IDENTIFIER + group; + + // Allow groups to begin directly with the path under the root + else if (!group.startsWith(ROOT_GROUP_IDENTIFIER)) + group = ROOT_GROUP_IDENTIFIER + '/' + group; + + // Allow groups to end with a trailing slash + if (group.endsWith('/')) + group = group.slice(0, -1); + + // Look up the parent identifier for the specified group path + parentIdentifier = groupPathsByIdentifier[group]; + + // If the group doesn't match anything in the tree + if (!parentIdentifier) { + connection.errors.push(new ParseError({ + message: 'No group found named: ' + connection.group, + key: 'IMPORT.ERROR_INVALID_GROUP', + variables: { GROUP: connection.group } + })); + return connection; + } + + } + + // If no group is specified at all, default to the root group + else { + parentIdentifier = ROOT_GROUP_IDENTIFIER; + group = ROOT_GROUP_IDENTIFIER; + } + + // The full path, of the form "ROOT/Child Group/Connection Name" + const path = group + '/' + connection.name; + + // Error out if this is a duplicate of a connection already in the + // file + if (!!_.get(connectionsInFile, path)) + connection.errors.push(new ParseError({ + message: 'Duplicate connection in file: ' + path, + key: 'IMPORT.ERROR_DUPLICATE_CONNECTION_IN_FILE', + variables: { NAME: connection.name, PATH: group } + })); + + // Mark the current path as already seen in the file + _.setWith(connectionsInFile, path, connection, Object); + + // Check if this would be an update to an existing connection + const existingIdentifier = _.get(connectionIdsByGroupAndName, + [parentIdentifier, connection.name]); + + // The default behavior is to create connections if no conflict + let importMode = ImportConnection.ImportMode.CREATE; + let identifier; + + // If updates to existing connections are disallowed + if (existingIdentifier && importConfig.existingConnectionMode === + ConnectionImportConfig.ExistingConnectionMode.REJECT) + connection.errors.push(new ParseError({ + message: 'Rejecting update to existing connection: ' + path, + key: 'IMPORT.ERROR_REJECT_UPDATE_CONNECTION', + variables: { NAME: connection.name, PATH: group } + })); + + // If the connection is being replaced, set the existing identifer + else if (existingIdentifier) { + identifier = existingIdentifier; + importMode = ImportConnection.ImportMode.REPLACE; + } + + else + importMode = ImportConnection.ImportMode.CREATE; + + // Set the import mode, normalized path, and validated identifier + return new ImportConnection({ ...connection, + importMode, group, identifier, parentIdentifier }); + + }); + } + + /** + * Returns a promise that resolves to a map of all valid protocols to a map + * of connection parameter names to a map of lower-cased and trimmed option + * values for that parameter to the actual valid option value. + * + * This format is designed for easy retrieval of corrected parameter values + * if the user-provided value matches a valid option except for case or + * leading/trailing whitespace. + * + * If a parameter has no options (i.e. any string value is allowed), the + * parameter name will map to a null value. + * + * @returns {Promise.>>>} + * A promise that resolves to a map of all valid protocols to parameter + * names to valid values. + */ + function getProtocolParameterOptions() { + + // The current data source - the one that the connections will be + // imported into + const dataSource = $routeParams.dataSource; + + // Fetch the protocols and convert to a set of valid protocol names + return schemaService.getProtocols(dataSource).then( + protocols => _.mapValues(protocols, ({connectionForms}) => { + + const fieldMap = {}; + + // Go through all the connection forms and get the fields for each + connectionForms.forEach(({fields}) => fields.forEach(field => { + + const { name, options } = field; + + // Set the value to null to indicate that there are no options + if (!options) + fieldMap[name] = null; + + // Set the value to a map of lowercased/trimmed option values + // to actual option values + else + fieldMap[name] = _.mapKeys( + options, option => option.trim().toLowerCase()); + + })); + + return fieldMap; + })); + } + + /** + * Resolves to function that will perform field-level (not connection + * hierarchy dependent) checks and transforms to a provided connection, + * returning the transformed connection. + * + * @returns {Promise.>} + * A promise resolving to a function that will apply field-level + * transforms and checks to a provided connection, returning the + * transformed connection. + */ + function getFieldTransformer() { + + return getProtocolParameterOptions().then(protocols => connection => { + + // Ensure that a protocol was specified for this connection + const protocol = connection.protocol; + if (!protocol) + connection.errors.push(new ParseError({ + message: 'Missing required protocol field', + key: 'IMPORT.ERROR_REQUIRED_PROTOCOL_CONNECTION' + })); + + // Ensure that a valid protocol was specified for this connection + if (!protocols[protocol]) + connection.errors.push(new ParseError({ + message: 'Invalid protocol: ' + protocol, + key: 'IMPORT.ERROR_INVALID_PROTOCOL', + variables: { PROTOCOL: protocol } + })); + + // Ensure that a name was specified for this connection + if (!connection.name) + connection.errors.push(new ParseError({ + message: 'Missing required name field', + key: 'IMPORT.ERROR_REQUIRED_NAME_CONNECTION' + })); + + // Ensure that the specified user list, if any, is an array + const users = connection.users; + if (users) { + + // Ensure all users in the array are trimmed strings + if (Array.isArray(users)) + connection.users = users.map(user => String(user).trim()); + + else + connection.errors.push(new ParseError({ + message: 'Invalid users list - must be an array', + key: 'IMPORT.ERROR_INVALID_USERS_TYPE' + })); + + } + + // Ensure that the specified user group list, if any, is an array + const groups = connection.groups; + if (groups) { + + // Ensure all groups in the array are trimmed strings + if (Array.isArray(groups)) + connection.groups = groups.map(group => String(group).trim()); + + else + connection.errors.push(new ParseError({ + message: 'Invalid groups list - must be an array', + key: 'IMPORT.ERROR_INVALID_USER_GROUPS_TYPE' + })); + + } + + // If the protocol is not valid, there's no point in trying to check + // parameter case sensitivity + if (!protocols[protocol]) + return connection; + + _.forEach(connection.parameters, (value, name) => { + + // An explicit null value for a parameter is valid - do not + // process it further + if (value === null) + return; + + // All non-null connection parameters must be strings. + const stringValue = String(value); + + // Convert the provided value to the format that would match + // the lookup object format + const comparisonValue = stringValue.toLowerCase().trim(); + + // The validated / corrected option value for this connection + // parameter, if any + const validOptionValue = _.get( + protocols, [protocol, name, comparisonValue]); + + // If the provided value fuzzily matches a valid option value, + // use the valid option value instead + if (validOptionValue) + connection.parameters[name] = validOptionValue; + + // Even if no option is found, the value must be a string + else + connection.parameters[name] = stringValue; + + }); + + _.forEach(connection.attributes, (value, name) => { + + // An explicit null value for an attribute is valid - do not + // process it further + if (value === null) + return; + + // All non-null connection attributes must be strings + connection.attributes[name] = String(value); + + }); + + return connection; + }); + } + + /** + * Convert a provided connection array into a ParseResult. Any provided + * transform functions will be run on each entry in `connectionData` before + * any other processing is done. + * + * @param {ConnectionImportConfig} importConfig + * The configuration options selected by the user prior to import. + * + * @param {*[]} connectionData + * An arbitrary array of data. This must evaluate to a ImportConnection + * object after being run through all functions in `transformFunctions`. + * + * @param {Function[]} transformFunctions + * An array of transformation functions to run on each entry in + * `connection` data. + * + * @return {Promise.} + * A promise resolving to ParseResult object representing the result of + * parsing all provided connection data. + */ + function parseConnectionData( + importConfig, connectionData, transformFunctions) { + + // Check that the provided connection data array is not empty + const checkError = performBasicChecks(connectionData); + if (checkError) { + const deferred = $q.defer(); + deferred.reject(checkError); + return deferred.promise; + } + + let index = 0; + + // Get the tree transformer and relevant protocol information + return $q.all({ + fieldTransformer : getFieldTransformer(), + treeTransformer : getTreeTransformer(importConfig), + }) + .then(({fieldTransformer, treeTransformer}) => + connectionData.reduce((parseResult, data) => { + + const { patches, users, groups, groupPaths } = parseResult; + + // Run the array data through each provided transform + let connectionObject = data; + _.forEach(transformFunctions, transform => { + connectionObject = transform(connectionObject); + }); + + // Apply the field level transforms + connectionObject = fieldTransformer(connectionObject); + + // Apply the connection group hierarchy transforms + connectionObject = treeTransformer(connectionObject); + + // If there are any errors for this connection, fail the whole batch + if (connectionObject.errors.length) + parseResult.hasErrors = true; + + // The value for the patch is a full-fledged Connection + const value = new Connection(connectionObject); + + // If a new connection is being created + if (connectionObject.importMode + === ImportConnection.ImportMode.CREATE) + + // Add a patch for creating the connection + patches.push(new DirectoryPatch({ + op: DirectoryPatch.Operation.ADD, + path: '/', + value + })); + + // The connection is being replaced, and permissions are only being + // added, not replaced + else if (importConfig.existingPermissionMode === + ConnectionImportConfig.ExistingPermissionMode.PRESERVE) + + // Add a patch for replacing the connection + patches.push(new DirectoryPatch({ + op: DirectoryPatch.Operation.REPLACE, + path: '/' + connectionObject.identifier, + value + })); + + // The connection is being replaced, and permissions are also being + // replaced + else { + + // Add a patch for removing the existing connection + patches.push(new DirectoryPatch({ + op: DirectoryPatch.Operation.REMOVE, + path: '/' + connectionObject.identifier + })); + + // Increment the index for the additional remove patch + index += 1; + + // Add a second patch for creating the replacement connection + patches.push(new DirectoryPatch({ + op: DirectoryPatch.Operation.ADD, + path: '/', + value + })); + + } + + // Save the connection group path into the parse result + groupPaths[index] = connectionObject.group; + + // Save the errors for this connection into the parse result + parseResult.errors[index] = connectionObject.errors; + + // Add this connection index to the list for each user + _.forEach(connectionObject.users, identifier => { + + // If there's an existing list, add the index to that + if (users[identifier]) + users[identifier].push(index); + + // Otherwise, create a new list with just this index + else + users[identifier] = [index]; + }); + + // Add this connection index to the list for each group + _.forEach(connectionObject.groups, identifier => { + + // If there's an existing list, add the index to that + if (groups[identifier]) + groups[identifier].push(index); + + // Otherwise, create a new list with just this index + else + groups[identifier] = [index]; + }); + + // Return the existing parse result state and continue on to the + // next connection in the file + index++; + parseResult.connectionCount++; + return parseResult; + + }, new ParseResult())); + } + + /** + * Convert a provided CSV representation of a connection list into a JSON + * object to be submitted to the PATCH REST endpoint, as well as a list of + * objects containing lists of user and user group identifiers to be granted + * to each connection. + * + * @param {ConnectionImportConfig} importConfig + * The configuration options selected by the user prior to import. + * + * @param {String} csvData + * The CSV-encoded connection list to process. + * + * @return {Promise.} + * A promise resolving to ParseResult object representing the result of + * parsing all provided connection data. + */ + service.parseCSV = function parseCSV(importConfig, csvData) { + + // Convert to an array of arrays, one per CSV row (including the header) + // NOTE: skip_empty_lines is required, or a trailing newline will error + let parsedData; + try { + parsedData = parseCSVData(csvData, {skip_empty_lines: true}); + } + + // If the CSV parser throws an error, reject with that error + catch(error) { + + const message = error.message; + console.error(error); + + const deferred = $q.defer(); + + // If the error message looks like the expected (and ugly) message + // that's thrown when a binary file is provided, throw a more + // friendy error. + if (_.trim(message).toLowerCase() == BINARY_CSV_ERROR_MESSAGE) + deferred.reject(new ParseError({ + message: "CSV binary parse attempt error: " + error.message, + key: "IMPORT.ERROR_DETECTED_INVALID_TYPE" + })); + + // Otherwise, pass the error from the library through to the user + else + deferred.reject(new ParseError({ + message: "CSV Parse Failure: " + error.message, + key: "IMPORT.ERROR_PARSE_FAILURE_CSV", + variables: { ERROR: error.message } + })); + + return deferred.promise; + } + + // The header row - an array of string header values + const header = parsedData.length ? parsedData[0] : []; + + // Slice off the header row to get the data rows + const connectionData = parsedData.slice(1); + + // Generate the CSV transform function, and apply it to every row + // before applying all the rest of the standard transforms + return connectionCSVService.getCSVTransformer(header).then( + csvTransformer => + + // Apply the CSV transform to every row + parseConnectionData( + importConfig, connectionData, [csvTransformer])); + + }; + + /** + * Convert a provided YAML representation of a connection list into a JSON + * object to be submitted to the PATCH REST endpoint, as well as a list of + * objects containing lists of user and user group identifiers to be granted + * to each connection. + * + * @param {ConnectionImportConfig} importConfig + * The configuration options selected by the user prior to import. + * + * @param {String} yamlData + * The YAML-encoded connection list to process. + * + * @return {Promise.} + * A promise resolving to ParseResult object representing the result of + * parsing all provided connection data. + */ + service.parseYAML = function parseYAML(importConfig, yamlData) { + + // Parse from YAML into a javascript array + let connectionData; + try { + connectionData = parseYAMLData(yamlData); + } + + // If the YAML parser throws an error, reject with that error + catch(error) { + console.error(error); + const deferred = $q.defer(); + deferred.reject(new ParseError({ + message: "YAML Parse Failure: " + error.message, + key: "IMPORT.ERROR_PARSE_FAILURE_YAML", + variables: { ERROR: error.message } + })); + return deferred.promise; + } + + // Produce a ParseResult, making sure that each record is converted to + // the ImportConnection type before further parsing + return parseConnectionData(importConfig, connectionData, + [connection => new ImportConnection(connection)]); + }; + + /** + * Convert a provided JSON-encoded representation of a connection list into + * an array of patches to be submitted to the PATCH REST endpoint, as well + * as a list of objects containing lists of user and user group identifiers + * to be granted to each connection. + * + * @param {ConnectionImportConfig} importConfig + * The configuration options selected by the user prior to import. + * + * @param {String} jsonData + * The JSON-encoded connection list to process. + * + * @return {Promise.} + * A promise resolving to ParseResult object representing the result of + * parsing all provided connection data. + */ + service.parseJSON = function parseJSON(importConfig, jsonData) { + + // Parse from JSON into a javascript array + let connectionData; + try { + connectionData = JSON.parse(jsonData); + } + + // If the JSON parse attempt throws an error, reject with that error + catch(error) { + console.error(error); + const deferred = $q.defer(); + deferred.reject(new ParseError({ + message: "JSON Parse Failure: " + error.message, + key: "IMPORT.ERROR_PARSE_FAILURE_JSON", + variables: { ERROR: error.message } + })); + return deferred.promise; + } + + // Produce a ParseResult, making sure that each record is converted to + // the ImportConnection type before further parsing + return parseConnectionData(importConfig, connectionData, + [connection => new ImportConnection(connection)]); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/styles/help.css b/guacamole/src/main/frontend/src/app/import/styles/help.css new file mode 100644 index 0000000..9cbdb5b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/styles/help.css @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.import.help { + + text-transform: none; + +} + +.import.help p { + + max-width: 70em; + +} + +.import.help h2 { + + padding-bottom: 0px; + +} + +.import.help p, .import.help pre { + + margin-left: 1em; + +} + +.import.help pre { + + background-color: rgba(0,0,0,0.15); + padding: 10px; + width: fit-content; + +} + +.import.help .footnotes { + + border-top: 1px solid gray; + padding-top: 1em; + width: fit-content; + margin-left: 1em; + +} diff --git a/guacamole/src/main/frontend/src/app/import/styles/import.css b/guacamole/src/main/frontend/src/app/import/styles/import.css new file mode 100644 index 0000000..5e2cd71 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/styles/import.css @@ -0,0 +1,190 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.import .import-buttons { + + margin-top: 10px; + display: flex; + gap: 10px; + justify-content: center; + +} + +.import .errors table { + + width: 100%; + +} + +.import .errors .error-message { + + color: red; + +} + +.import .errors .error-message ul { + + margin: 0px; + +} + +.file-upload-container { + + display: flex; + flex-direction: column; + align-items: center; + padding: 24px 24px 24px; + + width: fit-content; + + border: 1px solid rgba(0,0,0,.25); + box-shadow: 1px 1px 2px rgb(0 0 0 / 25%); + + margin-left: auto; + margin-right: auto; + +} + +.file-upload-container.file-selected { + + display: flex; + flex-direction: row; + gap: 100px; + +} + +.file-upload-container .clear { + + margin: 0; + +} + +.file-upload-container .upload-header { + + display: flex; + flex-direction: row; + width: 500px; + margin-bottom: 5px; + justify-content: space-between; + +} + +.file-upload-container .file-error { + + color: red; + +} + +.file-upload-container .file-options { + + font-weight: bold; + +} + +.file-upload-container .file-upload-input { + + display: none; + +} + +.file-upload-container .drop-target { + + display: flex; + flex-direction: column; + + align-items: center; + justify-content: space-evenly; + + width: 500px; + height: 200px; + + background: rgba(0,0,0,.04); + border: 1px solid black; + +} + +.file-upload-container .drop-target.file-present { + + background: rgba(0,0,0,.15); + +} + + +.file-upload-container .drop-target .file-name { + + font-weight: bold; + font-size: 1.5em; + +} + +.file-upload-container .drop-target.drop-pending { + + background: #3161a9; + +} + +.file-upload-container .drop-target.drop-pending > * { + + opacity: 0.5; + +} + +.file-upload-container .drop-target .title { + + font-weight: bold; + font-size: 1.25em; + +} + +.file-upload-container .drop-target .browse-link { + + text-decoration: underline; + cursor: pointer; + +} + +.file-upload-container .import-config { + + margin-top: 0.5em; + list-style: none; + width: 100%; + padding-left: 0; + +} + +.file-upload-container .import-config .help { + + visibility: hidden; + cursor: help; + +} + +.file-upload-container .import-config .help::after { + + content: ''; + visibility: visible; + display: inline-block; + background-image: url('images/question.svg'); + background-size: contain; + width: 20px; + height: 20px; + position: relative; + top: 4px; + +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/import/templates/connectionErrors.html b/guacamole/src/main/frontend/src/app/import/templates/connectionErrors.html new file mode 100644 index 0000000..f2d486c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/templates/connectionErrors.html @@ -0,0 +1,49 @@ +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      + {{'IMPORT.TABLE_HEADER_ROW_NUMBER' | translate}} + + {{'IMPORT.TABLE_HEADER_NAME' | translate}} + + {{'IMPORT.TABLE_HEADER_GROUP' | translate}} + + {{'IMPORT.TABLE_HEADER_PROTOCOL' | translate}} + + {{'IMPORT.TABLE_HEADER_ERRORS' | translate}} +
      {{error.rowNumber}}{{error.name}}{{error.group}}{{error.protocol}} +
        +
      • + {{ message }} +
      • +
      +
      + + + +
      diff --git a/guacamole/src/main/frontend/src/app/import/templates/connectionImport.html b/guacamole/src/main/frontend/src/app/import/templates/connectionImport.html new file mode 100644 index 0000000..a6cc0fe --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/templates/connectionImport.html @@ -0,0 +1,82 @@ +
      + +
      +

      {{'IMPORT.SECTION_HEADER_CONNECTION_IMPORT' | translate}}

      + +
      + +
      +
      {{fileName}}
      + +
      + +
      + +
      + {{'IMPORT.HELP_UPLOAD_FILE_TYPES' | translate}} + {{'IMPORT.ACTION_VIEW_FORMAT_HELP' | translate}} + +
      + +
      + +
      {{'IMPORT.HELP_UPLOAD_DROP_TITLE' | translate}}
      + + + + {{'IMPORT.ACTION_BROWSE' | translate}} + + +
      {{fileName}}
      + +
      + +
        +
      • + + + +
      • +
      • + + + +
      • +
      + +
      + +
      + + +
      + +
      + + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/import/templates/connectionImportFileHelp.html b/guacamole/src/main/frontend/src/app/import/templates/connectionImportFileHelp.html new file mode 100644 index 0000000..d3abda1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/templates/connectionImportFileHelp.html @@ -0,0 +1,29 @@ +
      + +
      +

      {{'IMPORT.SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE' | translate}}

      + +
      + +

      {{'IMPORT.HELP_FILE_TYPE_HEADER' | translate}}

      +

      {{'IMPORT.HELP_FILE_TYPE_DESCRIPTION' | translate}}

      + +

      {{'IMPORT.SECTION_HEADER_CSV' | translate}}

      +

      {{'IMPORT.HELP_CSV_DESCRIPTION' | translate}}

      +

      {{'IMPORT.HELP_CSV_MORE_DETAILS' | translate}}

      +
      {{'IMPORT.HELP_CSV_EXAMPLE' | translate }}
      + +

      {{'IMPORT.SECTION_HEADER_JSON' | translate}}

      +

      {{'IMPORT.HELP_JSON_DESCRIPTION' | translate}}

      +

      {{'IMPORT.HELP_JSON_MORE_DETAILS' | translate}}

      +
      {{'IMPORT.HELP_JSON_EXAMPLE' | translate }}
      + +

      {{'IMPORT.SECTION_HEADER_YAML' | translate}}

      +

      {{'IMPORT.HELP_YAML_DESCRIPTION' | translate}}

      +
      {{'IMPORT.HELP_YAML_EXAMPLE' | translate}}
      + +
        +
      1. {{'IMPORT.HELP_SEMICOLON_FOOTNOTE' | translate}}
      2. +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/import/types/ConnectionImportConfig.js b/guacamole/src/main/frontend/src/app/import/types/ConnectionImportConfig.js new file mode 100644 index 0000000..fb06730 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/types/ConnectionImportConfig.js @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ConnectionImportConfig class. + */ +angular.module('import').factory('ConnectionImportConfig', [ + function defineConnectionImportConfig() { + + /** + * A representation of any user-specified configuration when + * batch-importing connections. + * + * @constructor + * @param {ConnectionImportConfig|Object} [template={}] + * The object whose properties should be copied within the new + * ConnectionImportConfig. + */ + const ConnectionImportConfig = function ConnectionImportConfig(template) { + + // Use empty object by default + template = template || {}; + + /** + * The mode for handling connections that match existing connections. + * + * @type ConnectionImportConfig.ExistingConnectionMode + */ + this.existingConnectionMode = template.existingConnectionMode + || ConnectionImportConfig.ExistingConnectionMode.REJECT; + + /** + * The mode for handling permissions on existing connections that are + * being updated. Only meaningful if the importer is configured to + * replace existing connections. + * + * @type ConnectionImportConfig.ExistingPermissionMode + */ + this.existingPermissionMode = template.existingPermissionMode + || ConnectionImportConfig.ExistingPermissionMode.PRESERVE; + + }; + + /** + * Valid modes for the behavior of the importer when an imported connection + * already exists. + */ + ConnectionImportConfig.ExistingConnectionMode = { + + /** + * Any Connection that has the same name and parent group as an existing + * connection will cause the entire import to be rejected with an error. + */ + REJECT : "REJECT", + + /** + * Replace/update any existing connections. + */ + REPLACE : "REPLACE" + + }; + + /** + * Valid modes for the behavior of the importer with respect to connection + * permissions when existing connections are being replaced. + */ + ConnectionImportConfig.ExistingPermissionMode = { + + /** + * Any new permissions specified in the imported connection will be + * added to the existing connection, without removing any existing + * permissions. + */ + PRESERVE : "PRESERVE", + + /** + * Any existing permissions will be removed, ensuring that only the + * users or groups specified in the import file will be granted to the + * replaced connection after import. + */ + REPLACE : "REPLACE" + + }; + + return ConnectionImportConfig; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/import/types/DisplayErrorList.js b/guacamole/src/main/frontend/src/app/import/types/DisplayErrorList.js new file mode 100644 index 0000000..26ee65d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/types/DisplayErrorList.js @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the DisplayErrorList class. + */ +angular.module('import').factory('DisplayErrorList', [ + function defineDisplayErrorList() { + + /** + * A list of human-readable error messages, intended to be usable in a + * sortable / filterable table. + * + * @constructor + * @param {String[]} messages + * The error messages that should be prepared for display. + */ + const DisplayErrorList = function DisplayErrorList(messages) { + + /** + * The error messages that should be prepared for display. + * + * @type {String[]} + */ + this.messages = messages || []; + + /** + * The single String message composed of all messages concatenated + * together. This will be used for filtering / sorting, and should only + * be calculated once, when toString() is called. + * + * @type {String} + */ + this.concatenatedMessage = null; + + }; + + /** + * Return a sortable / filterable representation of all the error messages + * wrapped by this DisplayErrorList. + * + * NOTE: Once this method is called, any changes to the underlying array + * will have no effect. This is to ensure that repeated calls to toString() + * by sorting / filtering UI code will not regenerate the concatenated + * message every time. + * + * @returns {String} + * A sortable / filterable representation of the error messages wrapped + * by this DisplayErrorList + */ + DisplayErrorList.prototype.toString = function messageListToString() { + + // Generate the concatenated message if not already generated + if (!this.concatenatedMessage) + this.concatenatedMessage = this.messages.join(' '); + + return this.concatenatedMessage; + + } + + /** + * Return the underlying array containing the raw error messages, wrapped + * by this DisplayErrorList. + * + * @returns {String[]} + * The underlying array containing the raw error messages, wrapped by + * this DisplayErrorList + */ + DisplayErrorList.prototype.getArray = function getUnderlyingArray() { + return this.messages; + } + + return DisplayErrorList; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/types/ImportConnection.js b/guacamole/src/main/frontend/src/app/import/types/ImportConnection.js new file mode 100644 index 0000000..47c13a8 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/types/ImportConnection.js @@ -0,0 +1,147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ImportConnection class. + */ +angular.module('import').factory('ImportConnection', ['$injector', + function defineImportConnection($injector) { + + /** + * A representation of a connection to be imported, as parsed from an + * user-supplied import file. + * + * @constructor + * @param {ImportConnection|Object} [template={}] + * The object whose properties should be copied within the new + * Connection. + */ + const ImportConnection = function ImportConnection(template) { + + // Use empty object by default + template = template || {}; + + /** + * The unique identifier of the connection group that contains this + * connection. + * + * @type String + */ + this.parentIdentifier = template.parentIdentifier; + + /** + * The path to the connection group that contains this connection, + * written as e.g. "ROOT/parent/child/group". + * + * @type String + */ + this.group = template.group; + + /** + * The identifier of the connection being updated. Only meaningful if + * the replace operation is set. + */ + this.identifier = template.identifier; + + /** + * The human-readable name of this connection, which is not necessarily + * unique. + * + * @type String + */ + this.name = template.name; + + /** + * The name of the protocol associated with this connection, such as + * "vnc" or "rdp". + * + * @type String + */ + this.protocol = template.protocol; + + /** + * Connection configuration parameters, as dictated by the protocol in + * use, arranged as name/value pairs. + * + * @type Object. + */ + this.parameters = template.parameters || {}; + + /** + * Arbitrary name/value pairs which further describe this connection. + * The semantics and validity of these attributes are dictated by the + * extension which defines them. + * + * @type Object. + */ + this.attributes = template.attributes || {}; + + /** + * The identifiers of all users who should be granted read access to + * this connection. + * + * @type String[] + */ + this.users = template.users || []; + + /** + * The identifiers of all user groups who should be granted read access + * to this connection. + * + * @type String[] + */ + this.groups = template.groups || []; + + /** + * The mode import mode for this connection. If not otherwise specified, + * a brand new connection should be created. + */ + this.importMode = template.importMode || ImportConnection.ImportMode.CREATE; + + /** + * Any errors specific to this connection encountered while parsing. + * + * @type ParseError[] + */ + this.errors = template.errors || []; + + }; + + /** + * The possible import modes for a given connection. + */ + ImportConnection.ImportMode = { + + /** + * The connection should be created fresh. This mode is valid IFF there + * is no existing connection with the same name and parent group. + */ + CREATE : "CREATE", + + /** + * This connection will replace the existing connection with the same + * name and parent group. + */ + REPLACE : "REPLACE" + + }; + + return ImportConnection; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/import/types/ImportConnectionError.js b/guacamole/src/main/frontend/src/app/import/types/ImportConnectionError.js new file mode 100644 index 0000000..9fabe23 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/types/ImportConnectionError.js @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ImportConnectionError class. + */ +angular.module('import').factory('ImportConnectionError', ['$injector', + function defineImportConnectionError($injector) { + + // Required types + const DisplayErrorList = $injector.get('DisplayErrorList'); + + /** + * A representation of the errors associated with a connection to be + * imported, along with some basic information connection information to + * identify the connection having the error, as returned from a parsed + * user-supplied import file. + * + * @constructor + * @param {ImportConnectionError|Object} [template={}] + * The object whose properties should be copied within the new + * ImportConnectionError. + */ + const ImportConnectionError = function ImportConnectionError(template) { + + // Use empty object by default + template = template || {}; + + /** + * The row number within the original connection import file for this + * connection. This should be 1-indexed. + */ + this.rowNumber = template.rowNumber; + + /** + * The human-readable name of this connection, which is not necessarily + * unique. + * + * @type String + */ + this.name = template.name; + + /** + * The human-readable connection group path for this connection, of the + * form "ROOT/Parent/Child". + * + * @type String + */ + this.group = template.group; + + /** + * The name of the protocol associated with this connection, such as + * "vnc" or "rdp". + * + * @type String + */ + this.protocol = template.protocol; + + /** + * The error messages associated with this particular connection, if any. + * + * @type ImportConnectionError + */ + this.errors = template.errors || new DisplayErrorList(); + + }; + + return ImportConnectionError; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/types/ParseError.js b/guacamole/src/main/frontend/src/app/import/types/ParseError.js new file mode 100644 index 0000000..b4b3dd6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/types/ParseError.js @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ParseError class. + */ +angular.module('import').factory('ParseError', [function defineParseError() { + + /** + * An error representing a parsing failure when attempting to convert + * user-provided data into a list of Connection objects. + * + * @constructor + * @param {ParseError|Object} [template={}] + * The object whose properties should be copied within the new + * ParseError. + */ + const ParseError = function ParseError(template) { + + // Use empty object by default + template = template || {}; + + /** + * A human-readable message describing the error that occurred. + * + * @type String + */ + this.message = template.message; + + /** + * The key associated with the translation string that used when + * displaying this message. + * + * @type String + */ + this.key = template.key; + + /** + * The object which should be passed through to the translation service + * for the sake of variable substitution. Each property of the provided + * object will be substituted for the variable of the same name within + * the translation string. + * + * @type Object + */ + this.variables = template.variables; + + // If no translation key is available, fall back to the untranslated + // key, passing the raw message directly through the translation system + if (!this.key) { + this.key = 'APP.TEXT_UNTRANSLATED'; + this.variables = { MESSAGE: this.message }; + } + + }; + + return ParseError; + +}]); diff --git a/guacamole/src/main/frontend/src/app/import/types/ParseResult.js b/guacamole/src/main/frontend/src/app/import/types/ParseResult.js new file mode 100644 index 0000000..3d15511 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/import/types/ParseResult.js @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ParseResult class. + */ +angular.module('import').factory('ParseResult', [function defineParseResult() { + + /** + * The result of parsing a connection import file - containing a list of + * API patches ready to be submitted to the PATCH REST API for batch + * connection creation/replacement, a set of users and user groups to grant + * access to each connection, a group path for every connection, and any + * errors that may have occurred while parsing each connection. + * + * @constructor + * @param {ParseResult|Object} [template={}] + * The object whose properties should be copied within the new + * ParseResult. + */ + const ParseResult = function ParseResult(template) { + + // Use empty object by default + template = template || {}; + + /** + * An array of patches, ready to be submitted to the PATCH REST API for + * batch connection creation / replacement. Note that this array may + * contain more patches than connections from the original file - in the + * case that connections are being fully replaced, there will be a + * remove and a create patch for each replaced connection. + * + * @type {DirectoryPatch[]} + */ + this.patches = template.patches || []; + + /** + * An object whose keys are the user identifiers of users specified + * in the batch import, and whose values are an array of indices of + * connections within the patches array to which those users should be + * granted access. + * + * @type {Object.} + */ + this.users = template.users || {}; + + /** + * An object whose keys are the user group identifiers of every user + * group specified in the batch import. i.e. a set of all user group + * identifiers. + * + * @type {Object.} + */ + this.groups = template.users || {}; + + /** + * A map of connection index within the patch array, to connection group + * path for that connection, of the form "ROOT/Parent/Child". + * + * @type {Object.} + */ + this.groupPaths = template.groupPaths || {}; + + /** + * An array of errors encountered while parsing the corresponding + * connection (at the same array index in the patches array). Each + * connection should have an array of errors. If empty, no errors + * occurred for this connection. + * + * @type {ParseError[][]} + */ + this.errors = template.errors || []; + + /** + * True if any errors were encountered while parsing the connections + * represented by this ParseResult. This should always be true if there + * are a non-zero number of elements in the errors list for any + * connection, or false otherwise. + * + * @type {Boolean} + */ + this.hasErrors = template.hasErrors || false; + + /** + * The integer number of unique connections present in the parse result. + * This may be less than the length of the patches array, if any REMOVE + * patches are present. + * + * @Type {Number} + */ + this.connectionCount = template.connectionCount || 0; + + }; + + return ParseResult; + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/config/httpDefaults.js b/guacamole/src/main/frontend/src/app/index/config/httpDefaults.js new file mode 100644 index 0000000..9de1ce2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/config/httpDefaults.js @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Defaults for the AngularJS $http service. + */ +angular.module('index').config(['$httpProvider', function httpDefaults($httpProvider) { + + // Do not cache the responses of GET requests + $httpProvider.defaults.headers.get = { + 'Cache-Control' : 'no-cache', + 'Pragma' : 'no-cache' + }; + + // Use "application/json" content type by default for PATCH requests + $httpProvider.defaults.headers.patch = { + 'Content-Type' : 'application/json' + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/config/indexRouteConfig.js b/guacamole/src/main/frontend/src/app/index/config/indexRouteConfig.js new file mode 100644 index 0000000..d24df91 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/config/indexRouteConfig.js @@ -0,0 +1,223 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The config block for setting up all the url routing. + */ +angular.module('index').config(['$routeProvider', '$locationProvider', + function indexRouteConfig($routeProvider, $locationProvider) { + + // Disable HTML5 mode (use # for routing) + $locationProvider.html5Mode(false); + + // Clear hash prefix to keep /#/thing/bat URL style + $locationProvider.hashPrefix(''); + + /** + * Attempts to re-authenticate with the Guacamole server, sending any + * query parameters in the URL, along with the current auth token, and + * updating locally stored token if necessary. + * + * @param {Service} $injector + * The Angular $injector service. + * + * @returns {Promise} + * A promise which resolves successfully only after an attempt to + * re-authenticate has been made. If the authentication attempt fails, + * the promise will be rejected. + */ + var updateCurrentToken = ['$injector', function updateCurrentToken($injector) { + + // Required services + var $location = $injector.get('$location'); + var authenticationService = $injector.get('authenticationService'); + + // Re-authenticate including any parameters in URL + return authenticationService.updateCurrentToken($location.search()); + + }]; + + /** + * Redirects the user to their home page. This necessarily requires + * attempting to re-authenticate with the Guacamole server, as the user's + * credentials may have changed, and thus their most-appropriate home page + * may have changed as well. + * + * @param {Service} $injector + * The Angular $injector service. + * + * @returns {Promise} + * A promise which resolves successfully only after an attempt to + * re-authenticate and determine the user's proper home page has been + * made. + */ + var routeToUserHomePage = ['$injector', function routeToUserHomePage($injector) { + + // Required services + var $location = $injector.get('$location'); + var $q = $injector.get('$q'); + var userPageService = $injector.get('userPageService'); + + // Promise for routing attempt + var route = $q.defer(); + + // Re-authenticate including any parameters in URL + $injector.invoke(updateCurrentToken) + .then(function tokenUpdateComplete() { + + // Redirect to home page + userPageService.getHomePage() + .then(function homePageRetrieved(homePage) { + + // If home page is the requested location, allow through + if ($location.path() === homePage.url) + route.resolve(); + + // Otherwise, reject and reroute + else { + $location.path(homePage.url); + route.reject(); + } + + }) + + // If retrieval of home page fails, assume requested page is OK + ['catch'](function homePageFailed() { + route.resolve(); + }); + + }) + + ['catch'](function tokenUpdateFailed() { + route.reject(); + }); + + // Return promise that will resolve only if the requested page is the + // home page + return route.promise; + + }]; + + // Configure each possible route + $routeProvider + + // Home screen + .when('/', { + title : 'APP.NAME', + bodyClassName : 'home', + templateUrl : 'app/home/templates/home.html', + controller : 'homeController', + resolve : { routeToUserHomePage: routeToUserHomePage } + }) + + // Connection import page + .when('/import/:dataSource/connection', { + title : 'APP.NAME', + bodyClassName : 'settings', + templateUrl : 'app/import/templates/connectionImport.html', + controller : 'importConnectionsController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Connection import file format help page + .when('/import/connection/file-format-help', { + title : 'APP.NAME', + bodyClassName : 'settings', + templateUrl : 'app/import/templates/connectionImportFileHelp.html', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Management screen + .when('/settings/:dataSource?/:tab', { + title : 'APP.NAME', + bodyClassName : 'settings', + templateUrl : 'app/settings/templates/settings.html', + controller : 'settingsController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Connection editor + .when('/manage/:dataSource/connections/:id*?', { + title : 'APP.NAME', + bodyClassName : 'manage', + templateUrl : 'app/manage/templates/manageConnection.html', + controller : 'manageConnectionController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Sharing profile editor + .when('/manage/:dataSource/sharingProfiles/:id*?', { + title : 'APP.NAME', + bodyClassName : 'manage', + templateUrl : 'app/manage/templates/manageSharingProfile.html', + controller : 'manageSharingProfileController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Connection group editor + .when('/manage/:dataSource/connectionGroups/:id*?', { + title : 'APP.NAME', + bodyClassName : 'manage', + templateUrl : 'app/manage/templates/manageConnectionGroup.html', + controller : 'manageConnectionGroupController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // User editor + .when('/manage/:dataSource/users/:id*?', { + title : 'APP.NAME', + bodyClassName : 'manage', + templateUrl : 'app/manage/templates/manageUser.html', + controller : 'manageUserController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // User group editor + .when('/manage/:dataSource/userGroups/:id*?', { + title : 'APP.NAME', + bodyClassName : 'manage', + templateUrl : 'app/manage/templates/manageUserGroup.html', + controller : 'manageUserGroupController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Recording player + .when('/settings/:dataSource/recording/:identifier/:name', { + title : 'APP.NAME', + bodyClassName : 'settings', + templateUrl : 'app/settings/templates/settingsConnectionHistoryPlayer.html', + controller : 'connectionHistoryPlayerController', + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Client view + .when('/client/:id', { + bodyClassName : 'client', + templateUrl : 'app/client/templates/client.html', + controller : 'clientController', + reloadOnUrl : false, + resolve : { updateCurrentToken: updateCurrentToken } + }) + + // Redirect to home screen if page not found + .otherwise({ + resolve : { routeToUserHomePage: routeToUserHomePage } + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/config/indexTranslationConfig.js b/guacamole/src/main/frontend/src/app/index/config/indexTranslationConfig.js new file mode 100644 index 0000000..3e94203 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/config/indexTranslationConfig.js @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The configuration block for setting up everything having to do with i18n. + */ +angular.module('index').config(['$injector', function($injector) { + + // Required providers + var $translateProvider = $injector.get('$translateProvider'); + var preferenceServiceProvider = $injector.get('preferenceServiceProvider'); + + // Fallback to US English + $translateProvider.fallbackLanguage('en'); + + // Prefer chosen language + $translateProvider.preferredLanguage(preferenceServiceProvider.preferences.language); + + // Escape any HTML in translation strings + $translateProvider.useSanitizeValueStrategy('escape'); + + // Load translations via translationLoader service + $translateProvider.useLoader('translationLoader'); + + // Provide pluralization, etc. via messageformat.js + $translateProvider.useMessageFormatInterpolation(); + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/config/templateRequestDecorator.js b/guacamole/src/main/frontend/src/app/index/config/templateRequestDecorator.js new file mode 100644 index 0000000..2f832de --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/config/templateRequestDecorator.js @@ -0,0 +1,364 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Overrides $templateRequest such that HTML patches defined within Guacamole + * extensions are automatically applied to template contents. As the results of + * $templateRequest are cached internally, $templateCache is also overridden to + * update the internal cache as necessary. + */ +angular.module('index').config(['$provide', function($provide) { + + /** + * A map of previously-returned promises from past calls to + * $templateRequest(). Future calls to $templateRequest() will return + * new promises chained to the first promise returned for a given URL, + * rather than redo patch processing for every request. + * + * @type Object.> + */ + var promiseCache = {}; + + // Decorate $templateCache such that promiseCache is updated if a template + // is modified within $templateCache at runtime + $provide.decorator('$templateCache', ['$delegate', + function decorateTemplateCache($delegate) { + + // Create shallow copy of original $templateCache which we can safely + // override + var decoratedTemplateCache = angular.extend({}, $delegate); + + /** + * Overridden version of $templateCache.put() which automatically + * invalidates the cached $templateRequest result when used. Only the + * URL parameter is defined, as all other arguments, if any, will be + * passed through to the original $templateCache.put() when the actual + * put() operation is performed. + * + * @param {String} url + * The URL of the template whose entry is being updated. + * + * @return {Object} + * The value returned by $templateCache.put(), which is defined as + * being the value that was just stored at the provided URL. + */ + decoratedTemplateCache.put = function put(url) { + + // Evict old cached $templateRequest() result + delete promiseCache[url]; + + // Continue with originally-requested put() operation + return $delegate.put.apply(this, arguments); + + }; + + return decoratedTemplateCache; + + }]); + + // Decorate $templateRequest such that it automatically applies any HTML + // patches associated with installed Guacamole extensions + $provide.decorator('$templateRequest', ['$delegate', '$injector', + function decorateTemplateRequest($delegate, $injector) { + + // Required services + var $q = $injector.get('$q'); + var patchService = $injector.get('patchService'); + + /** + * Represents a single HTML patching operation which will be applied + * to the raw HTML of a template. The name of the patching operation + * MUST be one of the valid names defined within + * PatchOperation.Operations. + * + * @constructor + * @param {String} name + * The name of the patching operation that will be applied. Valid + * names are defined within PatchOperation.Operations. + * + * @param {String} selector + * The CSS selector which determines which elements within a + * template will be affected by the patch operation. + */ + var PatchOperation = function PatchOperation(name, selector) { + + /** + * Applies this patch operation to the template defined by the + * given root element, which must be a single element wrapped by + * JQuery. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template to which + * this patch operation should be applied. + * + * @param {Element[]} elements + * The elements which should be applied by the patch + * operation. For example, if the patch operation is inserting + * elements, these are the elements that will be inserted. + */ + this.apply = function apply(root, elements) { + PatchOperation.Operations[name](root, selector, elements); + }; + + }; + + /** + * Mapping of all valid patch operation names to their corresponding + * implementations. Each implementation accepts the same three + * parameters: the root element of the template being patched, the CSS + * selector determining which elements within the template are patched, + * and an array of elements which make up the body of the patch. + * + * @type Object. + */ + PatchOperation.Operations = { + + /** + * Inserts the given elements before the elements matched by the + * provided CSS selector. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String} selector + * The CSS selector which determines where this patch operation + * should be applied within the template defined by root. + * + * @param {Element[]} elements + * The contents of the patch which should be applied to the + * template defined by root at the locations selected by the + * given CSS selector. + */ + 'before' : function before(root, selector, elements) { + root.find(selector).before(elements); + }, + + /** + * Inserts the given elements after the elements matched by the + * provided CSS selector. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String} selector + * The CSS selector which determines where this patch operation + * should be applied within the template defined by root. + * + * @param {Element[]} elements + * The contents of the patch which should be applied to the + * template defined by root at the locations selected by the + * given CSS selector. + */ + 'after' : function after(root, selector, elements) { + root.find(selector).after(elements); + }, + + /** + * Replaces the elements matched by the provided CSS selector with + * the given elements. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String} selector + * The CSS selector which determines where this patch operation + * should be applied within the template defined by root. + * + * @param {Element[]} elements + * The contents of the patch which should be applied to the + * template defined by root at the locations selected by the + * given CSS selector. + */ + 'replace' : function replace(root, selector, elements) { + root.find(selector).replaceWith(elements); + }, + + /** + * Inserts the given elements within the elements matched by the + * provided CSS selector, before any existing children. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String} selector + * The CSS selector which determines where this patch operation + * should be applied within the template defined by root. + * + * @param {Element[]} elements + * The contents of the patch which should be applied to the + * template defined by root at the locations selected by the + * given CSS selector. + */ + 'before-children' : function beforeChildren(root, selector, elements) { + root.find(selector).prepend(elements); + }, + + /** + * Inserts the given elements within the elements matched by the + * provided CSS selector, after any existing children. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String} selector + * The CSS selector which determines where this patch operation + * should be applied within the template defined by root. + * + * @param {Element[]} elements + * The contents of the patch which should be applied to the + * template defined by root at the locations selected by the + * given CSS selector. + */ + 'after-children' : function afterChildren(root, selector, elements) { + root.find(selector).append(elements); + }, + + /** + * Inserts the given elements within the elements matched by the + * provided CSS selector, replacing any existing children. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String} selector + * The CSS selector which determines where this patch operation + * should be applied within the template defined by root. + * + * @param {Element[]} elements + * The contents of the patch which should be applied to the + * template defined by root at the locations selected by the + * given CSS selector. + */ + 'replace-children' : function replaceChildren(root, selector, elements) { + root.find(selector).empty().append(elements); + } + + }; + + /** + * Applies each of the given HTML patches to the given template. + * + * @param {Element[]} root + * The JQuery-wrapped root element of the template being + * patched. + * + * @param {String[]} patches + * An array of all HTML patches to be applied to the given + * template. + */ + var applyPatches = function applyPatches(root, patches) { + + // Apply all defined patches + angular.forEach(patches, function applyPatch(patch) { + + var elements = $(patch); + + // Filter out and parse all applicable meta tags + var operations = []; + elements = elements.filter(function filterMetaTags(index, element) { + + // Leave non-meta tags untouched + if (element.tagName !== 'META') + return true; + + // Only meta tags having a valid "name" attribute need + // to be filtered + var name = element.getAttribute('name'); + if (!name || !(name in PatchOperation.Operations)) + return true; + + // The "content" attribute must be present for any + // valid "name" meta tag + var content = element.getAttribute('content'); + if (!content) + return true; + + // Filter out and parse meta tag + operations.push(new PatchOperation(name, content)); + return false; + + }); + + // Apply each operation implied by the meta tags + angular.forEach(operations, function applyOperation(operation) { + operation.apply(root, elements); + }); + + }); + + }; + + /** + * Invokes $templateRequest() with all arguments exactly as provided, + * applying all HTML patches from any installed Guacamole extensions + * to the HTML of the requested template. + * + * @param {String} url + * The URL of the template being requested. + * + * @returns {Promise.} + * A Promise which resolves with the patched HTML contents of the + * requested template if retrieval of the template is successful. + */ + var decoratedTemplateRequest = function decoratedTemplateRequest(url) { + + var deferred = $q.defer(); + + // Chain to cached promise if it already exists + var cachedPromise = promiseCache[url]; + if (cachedPromise) { + cachedPromise.then(deferred.resolve, deferred.reject); + return deferred.promise; + } + + // Resolve promise with patched template HTML + $delegate.apply(this, arguments).then(function patchTemplate(data) { + + // Retrieve and apply all patches + patchService.getPatches().then(function applyRetrievedPatches(patches) { + + // Parse HTML into DOM tree + var root = $('
      ').html(data); + + // Apply all HTML patches to the parsed DOM + applyPatches(root, patches); + + // Transform back into HTML + deferred.resolve.call(this, root.html()); + + }, deferred.reject); + + }, deferred.reject); + + // Cache this promise for future results + promiseCache[url] = deferred.promise; + return deferred.promise; + + }; + + return decoratedTemplateRequest; + + }]); +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/index/controllers/indexController.js b/guacamole/src/main/frontend/src/app/index/controllers/indexController.js new file mode 100644 index 0000000..2f472a6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/controllers/indexController.js @@ -0,0 +1,400 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for the root of the application. + */ +angular.module('index').controller('indexController', ['$scope', '$injector', + function indexController($scope, $injector) { + + /** + * The number of milliseconds that should elapse between client-side + * session checks. This DOES NOT impact whether a session expires at all; + * such checks will always be server-side. This only affects how quickly + * the client-side view can recognize that a user's session has expired + * absent any action taken by the user. + * + * @type {!number} + */ + const SESSION_VALIDITY_RECHECK_INTERVAL = 15000; + + // Required types + const Error = $injector.get('Error'); + const ManagedClientState = $injector.get('ManagedClientState'); + + // Required services + const $document = $injector.get('$document'); + const $interval = $injector.get('$interval'); + const $location = $injector.get('$location'); + const $route = $injector.get('$route'); + const $window = $injector.get('$window'); + const authenticationService = $injector.get('authenticationService'); + const clipboardService = $injector.get('clipboardService'); + const guacNotification = $injector.get('guacNotification'); + const guacClientManager = $injector.get('guacClientManager'); + + /** + * The error that prevents the current page from rendering at all. If no + * such error has occurred, this will be null. + * + * @type Error + */ + $scope.fatalError = null; + + /** + * The notification service. + */ + $scope.guacNotification = guacNotification; + + /** + * All currently-active connections, grouped into their corresponding + * tiled views. + * + * @type ManagedClientGroup[] + */ + $scope.getManagedClientGroups = guacClientManager.getManagedClientGroups; + + /** + * The message to display to the user as instructions for the login + * process. + * + * @type TranslatableMessage + */ + $scope.loginHelpText = null; + + /** + * Whether the user has selected to log back in after having logged out. + * + * @type boolean + */ + $scope.reAuthenticating = false; + + /** + * The credentials that the authentication service is has already accepted, + * pending additional credentials, if any. If the user is logged in, or no + * credentials have been accepted, this will be null. If credentials have + * been accepted, this will be a map of name/value pairs corresponding to + * the parameters submitted in a previous authentication attempt. + * + * @type Object. + */ + $scope.acceptedCredentials = null; + + /** + * The credentials that the authentication service is currently expecting, + * if any. If the user is logged in, this will be null. + * + * @type Field[] + */ + $scope.expectedCredentials = null; + + /** + * Possible overall states of the client side of the web application. + * + * @enum {string} + */ + var ApplicationState = { + + /** + * A non-interactive authentication attempt failed. + */ + AUTOMATIC_LOGIN_REJECTED : 'automaticLoginRejected', + + /** + * The application has fully loaded but is awaiting credentials from + * the user before proceeding. + */ + AWAITING_CREDENTIALS : 'awaitingCredentials', + + /** + * A fatal error has occurred that will prevent the client side of the + * application from functioning properly. + */ + FATAL_ERROR : 'fatalError', + + /** + * The application has just started within the user's browser and has + * not yet settled into any specific state. + */ + LOADING : 'loading', + + /** + * The user has manually logged out. + */ + LOGGED_OUT : 'loggedOut', + + /** + * The application has fully loaded and the user has logged in + */ + READY : 'ready' + + }; + + /** + * The current overall state of the client side of the application. + * Possible values are defined by {@link ApplicationState}. + * + * @type string + */ + $scope.applicationState = ApplicationState.LOADING; + + /** + * Basic page-level information. + */ + $scope.page = { + + /** + * The title of the page. + * + * @type String + */ + title: '', + + /** + * The name of the CSS class to apply to the page body, if any. + * + * @type String + */ + bodyClassName: '' + + }; + + // Add default destination for input events + var sink = new Guacamole.InputSink(); + $document[0].body.appendChild(sink.getElement()); + + // Create event listeners at the global level + var keyboard = new Guacamole.Keyboard($document[0]); + keyboard.listenTo(sink.getElement()); + + // Broadcast keydown events + keyboard.onkeydown = function onkeydown(keysym) { + + // Do not handle key events if not logged in + if ($scope.applicationState !== ApplicationState.READY) + return true; + + // Warn of pending keydown + var guacBeforeKeydownEvent = $scope.$broadcast('guacBeforeKeydown', keysym, keyboard); + if (guacBeforeKeydownEvent.defaultPrevented) + return true; + + // If not prevented via guacBeforeKeydown, fire corresponding keydown event + var guacKeydownEvent = $scope.$broadcast('guacKeydown', keysym, keyboard); + return !guacKeydownEvent.defaultPrevented; + + }; + + // Broadcast keyup events + keyboard.onkeyup = function onkeyup(keysym) { + + // Do not handle key events if not logged in or if a notification is + // shown + if ($scope.applicationState !== ApplicationState.READY) + return; + + // Warn of pending keyup + var guacBeforeKeydownEvent = $scope.$broadcast('guacBeforeKeyup', keysym, keyboard); + if (guacBeforeKeydownEvent.defaultPrevented) + return; + + // If not prevented via guacBeforeKeyup, fire corresponding keydown event + $scope.$broadcast('guacKeyup', keysym, keyboard); + + }; + + // Release all keys when window loses focus + $window.onblur = function () { + keyboard.reset(); + }; + + /** + * Returns whether the current user has at least one active connection + * running within the current tab. + * + * @returns {!boolean} + * true if the current user has at least one active connection running + * in the current browser tab, false otherwise. + */ + var hasActiveTunnel = function hasActiveTunnel() { + + var clients = guacClientManager.getManagedClients(); + for (var id in clients) { + + switch (clients[id].clientState.connectionState) { + case ManagedClientState.ConnectionState.CONNECTING: + case ManagedClientState.ConnectionState.WAITING: + case ManagedClientState.ConnectionState.CONNECTED: + return true; + } + + } + + return false; + + }; + + // If we're logged in and not connected to anything, periodically check + // whether the current session is still valid. If the session has expired, + // refresh the auth state to reshow the login screen (rather than wait for + // the user to take some action and discover that they are not logged in + // after all). There is no need to do this if a connection is active as + // that connection activity will already automatically check session + // validity. + $interval(function cleanUpViewIfSessionInvalid() { + if (!!authenticationService.getCurrentToken() && !hasActiveTunnel()) { + authenticationService.getValidity().then(function validityDetermined(valid) { + if (!valid) + $scope.reAuthenticate(); + }); + } + }, SESSION_VALIDITY_RECHECK_INTERVAL); + + // Release all keys upon form submission (there may not be corresponding + // keyup events for key presses involved in submitting a form) + $document.on('submit', function formSubmitted() { + keyboard.reset(); + }); + + // Attempt to read the clipboard if it may have changed + $window.addEventListener('load', clipboardService.resyncClipboard, true); + $window.addEventListener('copy', clipboardService.resyncClipboard); + $window.addEventListener('cut', clipboardService.resyncClipboard); + $window.addEventListener('focus', function focusGained(e) { + + // Only recheck clipboard if it's the window itself that gained focus + if (e.target === $window) + clipboardService.resyncClipboard(); + + }, true); + + /** + * Sets the current overall state of the client side of the + * application to the given value. Possible values are defined by + * {@link ApplicationState}. The title and class associated with the + * current page are automatically reset to the standard values applicable + * to the application as a whole (rather than any specific page). + * + * @param {!string} state + * The state to assign, as defined by {@link ApplicationState}. + */ + const setApplicationState = function setApplicationState(state) { + $scope.applicationState = state; + $scope.page.title = 'APP.NAME'; + $scope.page.bodyClassName = ''; + }; + + /** + * Navigates the user back to the root of the application (or reloads the + * current route and controller if the user is already there), effectively + * forcing reauthentication. If the user is not logged in, this will result + * in the login screen appearing. + */ + $scope.reAuthenticate = function reAuthenticate() { + + $scope.reAuthenticating = true; + + // Clear out URL state to conveniently bring user back to home screen + // upon relogin + if ($location.path() !== '/') + $location.url('/'); + else + $route.reload(); + + }; + + // Display login screen if a whole new set of credentials is needed + $scope.$on('guacInvalidCredentials', function loginInvalid(event, parameters, error) { + + setApplicationState(ApplicationState.AWAITING_CREDENTIALS); + + $scope.loginHelpText = null; + $scope.acceptedCredentials = {}; + $scope.expectedCredentials = error.expected; + + }); + + // Prompt for remaining credentials if provided credentials were not enough + $scope.$on('guacInsufficientCredentials', function loginInsufficient(event, parameters, error) { + + setApplicationState(ApplicationState.AWAITING_CREDENTIALS); + + $scope.loginHelpText = error.translatableMessage; + $scope.acceptedCredentials = parameters; + $scope.expectedCredentials = error.expected; + + }); + + // Alert user to authentication errors that occur in the absence of an + // interactive login form + $scope.$on('guacLoginFailed', function loginFailed(event, parameters, error) { + + // All errors related to an interactive login form are handled elsewhere + if ($scope.applicationState === ApplicationState.AWAITING_CREDENTIALS + || error.type === Error.Type.INSUFFICIENT_CREDENTIALS + || error.type === Error.Type.INVALID_CREDENTIALS) + return; + + setApplicationState(ApplicationState.AUTOMATIC_LOGIN_REJECTED); + $scope.reAuthenticating = false; + $scope.fatalError = error; + + }); + + // Replace absolutely all content with an error message if the page itself + // cannot be displayed due to an error + $scope.$on('guacFatalPageError', function fatalPageError(error) { + setApplicationState(ApplicationState.FATAL_ERROR); + $scope.fatalError = error; + }); + + // Replace the overall user interface with an informational message if the + // user has manually logged out + $scope.$on('guacLogout', function loggedOut() { + $scope.applicationState = ApplicationState.LOGGED_OUT; + $scope.reAuthenticating = false; + }); + + // Ensure new pages always start with clear keyboard state + $scope.$on('$routeChangeStart', function routeChanging() { + keyboard.reset(); + }); + + // Update title and CSS class upon navigation + $scope.$on('$routeChangeSuccess', function(event, current, previous) { + + // If the current route is available + if (current.$$route) { + + // Clear login screen if route change was successful (and thus + // login was either successful or not required) + $scope.applicationState = ApplicationState.READY; + + // Set title + var title = current.$$route.title; + if (title) + $scope.page.title = title; + + // Set body CSS class + $scope.page.bodyClassName = current.$$route.bodyClassName || ''; + } + + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/filters/arrayFilter.js b/guacamole/src/main/frontend/src/app/index/filters/arrayFilter.js new file mode 100644 index 0000000..8612953 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/filters/arrayFilter.js @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A filter for transforming an object into an array of all non-inherited + * property key/value pairs. The resulting array contains one object for each + * property in the original object, where the "key" property contains the + * original property key and the "value" property contains the original + * property value. + */ +angular.module('index').filter('toArray', [function toArrayFactory() { + + /** + * The name of the property to use to store the cached result of converting + * an object to an array. This property is added to each object converted, + * such that the same array is returned each time unless the original + * object has changed. + * + * @type String + */ + var CACHE_KEY = '_guac_toArray'; + + return function toArrayFilter(input) { + + // If no object is available, just return an empty array + if (!input) { + return []; + } + + // Translate object into array of key/value pairs + var array = []; + angular.forEach(input, function fetchValueByKey(value, key) { + array.push({ + key : key, + value : value + }); + }); + + // Sort consistently by key + array.sort(function compareKeys(a, b) { + if (a.key < b.key) return -1; + if (a.key > b.key) return 1; + return 0; + }); + + // Define non-enumerable property for holding cached array + if (!input[CACHE_KEY]) { + Object.defineProperty(input, CACHE_KEY, { + value : [], + enumerable : false, + configurable : true, + writable : true + }); + } + + // Update cache if resulting array is different + if (!angular.equals(input[CACHE_KEY], array)) + input[CACHE_KEY] = array; + + return input[CACHE_KEY]; + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/filters/escapeFilter.js b/guacamole/src/main/frontend/src/app/index/filters/escapeFilter.js new file mode 100644 index 0000000..c1ec4e0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/filters/escapeFilter.js @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A filter for making sure that a string is URI-encoded and + * that any characters with special meaning for URIs are escaped. + */ +angular.module('index').filter('escape', [function escapeFilter() { + + return function escapeFilter(input) { + + if (input) + return window.encodeURIComponent(input); + + return ''; + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/filters/resolveFilter.js b/guacamole/src/main/frontend/src/app/index/filters/resolveFilter.js new file mode 100644 index 0000000..a774d28 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/filters/resolveFilter.js @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Filter which accepts a promise as input, returning the resolved value of + * that promise if/when the promise is resolved. While the promise is not + * resolved, null is returned. + */ +angular.module('index').filter('resolve', [function resolveFilter() { + + /** + * The name of the property to use to store the resolved promise value. + * + * @type {!string} + */ + const RESOLVED_VALUE_KEY = '_guac_resolveFilter_resolvedValue'; + + return function resolveFilter(promise) { + + if (!promise) + return null; + + // Assign value to RESOLVED_VALUE_KEY automatically upon resolution of + // the received promise + if (!(RESOLVED_VALUE_KEY in promise)) { + promise[RESOLVED_VALUE_KEY] = null; + promise.then((value) => { + return promise[RESOLVED_VALUE_KEY] = value; + }); + } + + // Always return cached value + return promise[RESOLVED_VALUE_KEY]; + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/indexModule.js b/guacamole/src/main/frontend/src/app/index/indexModule.js new file mode 100644 index 0000000..2bcc945 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/indexModule.js @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +require('angular-module-shim.js'); +require('relocateParameters.js'); + +require('angular-translate-interpolation-messageformat'); +require('angular-translate-loader-static-files'); + +/** + * The module for the root of the application. + */ +angular.module('index', [ + + require('angular-route'), + require('angular-translate'), + + 'auth', + 'client', + 'clipboard', + 'home', + 'import', + 'login', + 'manage', + 'navigation', + 'notification', + 'rest', + 'settings', + + 'templates-main' + +]); + +// Recursively pull in all other JavaScript and CSS files as requirements (just +// like old minify-maven-plugin build) +const context = require.context('../', true, /.*\.(css|js)$/); +context.keys().forEach(key => context(key)); + diff --git a/guacamole/src/main/frontend/src/app/index/services/iconService.js b/guacamole/src/main/frontend/src/app/index/services/iconService.js new file mode 100644 index 0000000..ed9e057 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/services/iconService.js @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for updating or resetting the favicon of the current page. + */ +angular.module('index').factory('iconService', ['$rootScope', function iconService($rootScope) { + + var service = {}; + + /** + * The URL of the image used for the low-resolution (64x64) favicon. This + * MUST match the URL which is set statically within index.html. + * + * @constant + * @type String + */ + var DEFAULT_SMALL_ICON_URL = 'images/logo-64.png'; + + /** + * The URL of the image used for the high-resolution (144x144) favicon. This + * MUST match the URL which is set statically within index.html. + * + * @constant + * @type String + */ + var DEFAULT_LARGE_ICON_URL = 'images/logo-144.png'; + + /** + * JQuery-wrapped array of all link tags which point to the small, + * low-resolution page icon. + * + * @type Element[] + */ + var smallIcons = $('link[rel=icon][href="' + DEFAULT_SMALL_ICON_URL + '"]'); + + /** + * JQuery-wrapped array of all link tags which point to the large, + * high-resolution page icon. + * + * @type Element[] + */ + var largeIcons = $('link[rel=icon][href="' + DEFAULT_LARGE_ICON_URL + '"]'); + + /** + * Generates an icon by scaling the provided image to fit the given + * dimensions, returning a canvas containing the generated icon. + * + * @param {HTMLCanvasElement} canvas + * A canvas element containing the image which should be scaled to + * produce the contents of the generated icon. + * + * @param {Number} width + * The width of the icon to generate, in pixels. + * + * @param {Number} height + * The height of the icon to generate, in pixels. + * + * @returns {HTMLCanvasElement} + * A new canvas element having the given dimensions and containing the + * provided image, scaled to fit. + */ + var generateIcon = function generateIcon(canvas, width, height) { + + // Create icon canvas having the provided dimensions + var icon = document.createElement('canvas'); + icon.width = width; + icon.height = height; + + // Calculate the scale factor necessary to fit the provided image + // within the icon dimensions + var scale = Math.min(width / canvas.width, height / canvas.height); + + // Calculate the dimensions and position of the scaled image within + // the icon, offsetting the image such that it is centered + var scaledWidth = canvas.width * scale; + var scaledHeight = canvas.height * scale; + var offsetX = (width - scaledWidth) / 2; + var offsetY = (height - scaledHeight) / 2; + + // Draw the icon, scaling the provided image as necessary + var context = icon.getContext('2d'); + context.drawImage(canvas, offsetX, offsetY, scaledWidth, scaledHeight); + return icon; + + }; + + /** + * Temporarily sets the icon of the current page to the contents of the + * given canvas element. The image within the canvas element will be + * automatically scaled and centered to fit within the dimensions of the + * page icons. The page icons will be automatically reset to their original + * values upon navigation. + * + * @param {HTMLCanvasElement} canvas + * The canvas element containing the icon. If this value is null or + * undefined, this function has no effect. + */ + service.setIcons = function setIcons(canvas) { + + // Do nothing if no canvas provided + if (!canvas) + return; + + // Assign low-resolution (64x64) icon + var smallIcon = generateIcon(canvas, 64, 64); + smallIcons.attr('href', smallIcon.toDataURL('image/png')); + + // Assign high-resolution (144x144) icon + var largeIcon = generateIcon(canvas, 144, 144); + largeIcons.attr('href', largeIcon.toDataURL('image/png')); + + }; + + /** + * Resets the icons of the current page to their original values, undoing + * any previous calls to setIcons(). This function is automatically invoked + * upon navigation. + */ + service.setDefaultIcons = function setDefaultIcons() { + smallIcons.attr('href', DEFAULT_SMALL_ICON_URL); + largeIcons.attr('href', DEFAULT_LARGE_ICON_URL); + }; + + // Automatically reset page icons after navigation + $rootScope.$on('$routeChangeSuccess', function resetIcon() { + service.setDefaultIcons(); + }); + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/index/styles/animation.css b/guacamole/src/main/frontend/src/app/index/styles/animation.css new file mode 100644 index 0000000..c2d48d5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/animation.css @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * fadein: Fade from fully transparent to fully opaque. + */ +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} +@-moz-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/** + * fadeout: Fade from fully opaque to fully transparent. + */ +@keyframes fadeout { + from { opacity: 1; } + to { opacity: 0; } +} +@-moz-keyframes fadeout { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes fadeout { + from { opacity: 1; } + to { opacity: 0; } +} + +/** + * popin: Increase in size and opacity from invisibly tiny and transparent to + * full size and opaque. + */ +@keyframes popin { + from { transform: scale(0); opacity: 0; } + to { transform: scale(1); } +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/automatic-login-rejected.css b/guacamole/src/main/frontend/src/app/index/styles/automatic-login-rejected.css new file mode 100644 index 0000000..d034f81 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/automatic-login-rejected.css @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.automatic-login-rejected-modal guac-modal { + background: white; + z-index: 20; +} + +.automatic-login-rejected-modal .notification { + display: inline-block; + max-width: 5in; + padding: 1em; + width: 100%; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/buttons.css b/guacamole/src/main/frontend/src/app/index/styles/buttons.css new file mode 100644 index 0000000..2f2ce9e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/buttons.css @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +a.button { + cursor: default; + display: inline-block; +} + +input[type="submit"], button, a.button { + + -webkit-appearance: none; + text-decoration: none; + + background-color: #3C3C3C; + border: 1px solid rgba(0, 0, 0, 0.4); + + color: white; + text-shadow: -1px -1px rgba(0, 0, 0, 0.3); + font-size: 1em; + font-weight: bold; + font-family: Carlito, FreeSans, Helvetica, Arial, sans-serif; + + padding: 0.35em 1em; + min-width: 5em; + margin: 0.25em; + + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25); + +} + +input[type="submit"]:hover, button:hover, a.button:hover { + background-color: #5A5A5A; +} + +input[type="submit"]:active, button:active, a.button:active { + + background-color: #2C2C2C; + + box-shadow: + inset 1px 1px 0.25em rgba(0, 0, 0, 0.25), + -1px -1px 0.25em rgba(0, 0, 0, 0.25), + 1px 1px 0.25em rgba(255, 255, 255, 0.25); +} + +button.danger, a.button.danger { + background: #A43; +} + +button.danger:hover, a.button.danger:hover { + background: #C54; +} + +button.danger:active, a.button.danger:active { + background: #932; +} + +input[type="submit"]:disabled, button:disabled, button.danger:disabled { + background-color: #3C3C3C; + color: rgba(255, 255, 255, 0.5); + opacity: 0.75; +} + +.button.logout, button.logout, +.button.reconnect, button.reconnect, +.button.manage, button.manage, +.button.back, button.back, +.button.home, button.home, +.button.change-password, button.change-password { + position: relative; + padding-left: 1.8em; +} + +.button.logout::before, button.logout::before, +.button.reconnect::before, button.reconnect::before, +.button.manage::before, button.manage::before, +.button.back::before, button.back::before, +.button.home::before, button.home::before, +.button.change-password::before, button.change-password::before { + content: ' '; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 1.8em; + background-repeat: no-repeat; + background-size: 1em; + background-position: 0.5em 0.45em; +} + +.button.logout::before, +button.logout::before { + background-image: url('images/action-icons/guac-logout.svg'); +} + +.button.reconnect::before, +button.reconnect::before { + background-image: url('images/circle-arrows.svg'); +} + +.button.manage::before, +button.manage::before { + background-image: url('images/action-icons/guac-config.svg'); +} + +.button.back::before, +button.back::before { + background-image: url('images/action-icons/guac-back.svg'); +} + +.button.home::before, +button.home::before { + background-image: url('images/action-icons/guac-home.svg'); +} + +.button.change-password::before, +button.change-password::before { + background-image: url('images/action-icons/guac-key.svg'); +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/cloak.css b/guacamole/src/main/frontend/src/app/index/styles/cloak.css new file mode 100644 index 0000000..701107b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/cloak.css @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Hide portions of DOM by default until Angular has finished loading, + * compiling, etc. + */ + +*[ng-cloak], .translate-cloak { + display: none !important; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/fatal-page-error.css b/guacamole/src/main/frontend/src/app/index/styles/fatal-page-error.css new file mode 100644 index 0000000..2684118 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/fatal-page-error.css @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.fatal-page-error-modal guac-modal { + z-index: 30; +} + +.fatal-page-error { + display: inline-block; + width: 100%; + max-width: 5in; + padding: 1em; + text-align: left; +} + +.fatal-page-error h1 { + text-transform: uppercase; + padding: 0; + padding-right: 1em; +} + +.fatal-page-error h1::before { + content: ' '; + display: inline-block; + background: url('images/warning.svg'); + background-repeat: no-repeat; + height: 1em; + width: 1em; + background-size: contain; + margin: 0 0.25em; + margin-bottom: -0.2em; +} + +/* Ensure fatal error is initially hidden, fading the error message in when + * needed */ + +.fatal-page-error-outer { + visibility: hidden; + opacity: 0; + transition: opacity, visibility; + transition-duration: 0.25s; +} + +.shown.fatal-page-error-outer { + visibility: visible; + opacity: 1; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/font-carlito.css b/guacamole/src/main/frontend/src/app/index/styles/font-carlito.css new file mode 100644 index 0000000..e7edbd2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/font-carlito.css @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * The Carlito font is licensed under the SIL Open Font License, and thus is + * freely redistributable so long as it is distributed with software. + * + * The SIL OFL license can be found at http://scripts.sil.org/OFL or in the + * "LICENSE" file within the same directory as the Carlito-*.woff font files. + */ + +@font-face { + font-family: 'Carlito'; + font-weight: normal; + font-style: normal; + src: url('fonts/carlito/Carlito-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Carlito'; + font-weight: bold; + font-style: normal; + src: url('fonts/carlito/Carlito-Bold.woff') format('woff'); +} + +@font-face { + font-family: 'Carlito'; + font-weight: normal; + font-style: italic; + src: url('fonts/carlito/Carlito-Italic.woff') format('woff'); +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/headers.css b/guacamole/src/main/frontend/src/app/index/styles/headers.css new file mode 100644 index 0000000..457eb52 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/headers.css @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +h1 { + + margin: 0; + padding: 0.5em; + + font-size: 2em; + vertical-align: middle; + text-align: center; + +} + +h2 { + font-size: 1.25em; + font-weight: bold; + text-transform: uppercase; + padding: 0.5em; + margin: 0; +} + +.header { + + border-bottom: 1px solid rgba(0, 0, 0, 0.125); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.125); + background: rgba(0, 0, 0, 0.04); + + margin-bottom: 0; + margin-top: 0; + border-top: none; + width: 100%; + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: row; + +} + +.header.tabbed { + margin-bottom: 0; +} + +.header:not(.ng-hide) ~ * .header, +.header:not(.ng-hide) ~ .header { + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.header h2 { + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; +} + +.header .filter { + margin: 0; + padding: 0.5em; +} + +.header .filter input { + -moz-border-radius: 0; + -webkit-border-radius: 0; + -khtml-border-radius: 0; + border-radius: 0; + border: none; + border-left: 1px solid rgba(0, 0, 0, 0.125); + background-color: transparent; +} + +.header:not(.ng-hide) ~ .header .user-menu { + display: none; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/input.css b/guacamole/src/main/frontend/src/app/index/styles/input.css new file mode 100644 index 0000000..4141c76 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/input.css @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +input[type=checkbox], input[type=number], input[type=text], input[type=email], input[type=radio], label, textarea { + -webkit-tap-highlight-color: rgba(128,192,128,0.5); +} + +div.location, input[type=text], input[type=email], input[type=number], input[type=password], textarea { + border: 1px solid #777; + -moz-border-radius: 0.2em; + -webkit-border-radius: 0.2em; + -khtml-border-radius: 0.2em; + border-radius: 0.2em; + width: 100%; + max-width: 16em; + padding: 0.25em; + font-size: 0.8em; + background: white; + cursor: text; +} + +textarea { + max-width: none; + width: 30em; + height: 10em; + white-space: pre; + word-wrap: normal; + overflow: auto; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/lists.css b/guacamole/src/main/frontend/src/app/index/styles/lists.css new file mode 100644 index 0000000..80df491 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/lists.css @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.user, +.user-group, +.connection-group, +.connection { + cursor: pointer; +} + +.user a, +.user-group a, +.connection a, +.connection-group a { + text-decoration:none; + color: black; +} + +.user a:hover, +.user-group a:hover, +.connection a:hover, +.connection-group a:hover { + text-decoration:none; + color: black; +} + +.user a:visited, +.user-group a:visited, +.connection a:visited, +.connection-group a:visited { + text-decoration:none; + color: black; +} + +.recent-connections .connection:hover { + background: #CDA; +} + +.recent-connections .connection .thumbnail { + display: block; + margin: 0.5em; +} + +.recent-connections .connection .thumbnail > * { + border: 1px solid black; + background: black; + box-shadow: 1px 1px 5px black; + max-width: 75%; + display: inline-block; +} + +.caption * { + vertical-align: middle; +} + +.caption .choice { + display: inline-block; +} + +.caption .name { + margin-left: 0.25em; +} + +.placeholder { + + color: rgba(255, 255, 255, 0.5); + text-shadow: -1px -1px rgba(0, 0, 0, 0.5); + text-align: center; + opacity: 0.5; + + font-size: 2em; + font-weight: bolder; + +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/loading.css b/guacamole/src/main/frontend/src/app/index/styles/loading.css new file mode 100644 index 0000000..d7d81ae --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/loading.css @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.loading { + position: relative; + min-height: 200px; +} + +.view.loading { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.loading * { + visibility: hidden; +} + +.loading::before { + + display: block; + position: absolute; + content: ''; + + /* Dictated by size of image */ + width: 96px; + height: 96px; + margin-left: -48px; + margin-top: -48px; + + top: 50%; + left: 50%; + + background-image: url('images/cog.svg'); + background-size: 96px 96px; + background-position: center center; + background-repeat: no-repeat; + + animation: spinning-cog 4s linear infinite; + -moz-animation: spinning-cog 4s linear infinite; + -webkit-animation: spinning-cog 4s linear infinite; + +} + +@keyframes spinning-cog { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@-moz-keyframes spinning-cog { + 0% { -moz-transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); } +} + +@-webkit-keyframes spinning-cog { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/logged-out.css b/guacamole/src/main/frontend/src/app/index/styles/logged-out.css new file mode 100644 index 0000000..531ef00 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/logged-out.css @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.logged-out-modal guac-modal { + background: white; + z-index: 20; +} + +.logged-out-modal .notification { + display: inline-block; + max-width: 3in; + width: 100%; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/other-connections.css b/guacamole/src/main/frontend/src/app/index/styles/other-connections.css new file mode 100644 index 0000000..3fc8ff3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/other-connections.css @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#other-connections .client-panel { + + display: none; + position: fixed; + right: 0; + bottom: 0; + + border: 1px solid rgba(255, 255, 255, 0.25); + background: rgba(0, 0, 0, 0.25); + max-width: 100%; + white-space: nowrap; + transition: max-width 0.125s, width 0.125s; + + /* Render above modal status */ + z-index: 20; + +} + +#other-connections .client-panel.has-clients { + display: block; +} + +#other-connections .client-panel.hidden { + max-width: 16px; +} + +#other-connections .client-panel-handle { + + position: absolute; + left: 0; + bottom: 0; + height: 100%; + width: 16px; + z-index: 1; + + background-color: white; + background-repeat: no-repeat; + background-size: contain; + background-position: center center; + background-image: url(images/arrows/right.svg); + opacity: 0.5; + +} + +#other-connections .client-panel-handle:hover { + opacity: 0.75; +} + +#other-connections .client-panel.hidden .client-panel-handle { + background-image: url(images/arrows/left.svg); +} + +#other-connections .client-panel-connection-list { + + text-align: right; + + margin: 0; + padding: 0; + padding-left: 16px; + + overflow-x: auto; + overflow-y: hidden; + +} + +#other-connections .client-panel-connection { + + display: inline-block; + position: relative; + + margin: 0.5em; + border: 1px solid white; + background: black; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5); + + animation: 0.1s linear 0s popin; + opacity: 0.5; + transition: opacity 0.25s; + + max-height: 128px; + overflow: hidden; + vertical-align: middle; + +} + +#other-connections .client-panel-connection a[href]::before { + + display: block; + content: ' '; + + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 1; + + background: url('images/warning-white.svg'); + background-size: 48px; + background-position: center; + background-repeat: no-repeat; + background-color: black; + + opacity: 0; + transition: opacity 0.25s; + +} + +#other-connections .client-panel-connection.needs-attention a[href]::before { + opacity: 0.75; +} + +#other-connections button.close-other-connection { + + position: absolute; + top: 0; + right: 0; + z-index: 2; + + margin: 0; + padding: 4px; + min-width: 0; + border: none; + background: transparent; + box-shadow: none; + text-shadow: none; + + opacity: 0.5; + line-height: 1; + +} + +#other-connections button.close-other-connection:hover { + opacity: 1; +} + +#other-connections button.close-other-connection img { + background: #A43; + border-radius: 18px; + width: 100%; + max-width: 18px; + padding: 3px; +} + +#other-connections button.close-other-connection:hover img { + background: #C54; +} + +#other-connections .client-panel.hidden .client-panel-connection-list { + /* Hide scrollbar when panel is hidden (will be visible through panel + * show/hide button otherwise) */ + overflow-x: hidden; +} + +#other-connections .client-panel.hidden .client-panel-connection { + /* Hide thumbnails when panel is hidden (will be visible through panel + * show/hide button otherwise) */ + visibility: hidden; +} + +#other-connections .client-panel-connection .name { + + position: absolute; + padding: 0.25em 0.5em; + left: 0; + right: 0; + bottom: 0; + z-index: 2; + + text-align: left; + color: white; + background: rgba(0, 0, 0, 0.5); + font-size: 0.75em; + font-weight: bold; + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + +} + +#other-connections .client-panel-connection:hover { + opacity: 1; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/sorted-tables.css b/guacamole/src/main/frontend/src/app/index/styles/sorted-tables.css new file mode 100644 index 0000000..70c43bb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/sorted-tables.css @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +table.sorted { + border-collapse: collapse; +} + +table.sorted th { + background: rgba(0, 0, 0, 0.125); + font-weight: normal; +} + +table.sorted th, +table.sorted td { + border: 1px solid #AAA; + padding: 0.5em 1em; +} + +table.sorted th.sortable { + cursor: pointer; +} + +table.sorted th.sort-primary { + font-weight: bold; + padding-right: 0; +} + +table.sorted th.sort-primary:after { + + display: inline-block; + width: 1em; + height: 1em; + vertical-align: middle; + content: ' '; + + background-size: 1em 1em; + background-position: right center; + background-repeat: no-repeat; + background-image: url('images/arrows/down.svg'); + +} + +table.sorted th.sort-primary.sort-descending:after { + background-image: url('images/arrows/up.svg'); +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/status.css b/guacamole/src/main/frontend/src/app/index/styles/status.css new file mode 100644 index 0000000..7fd6367 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/status.css @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.global-status-modal guac-modal { + background: rgba(0, 0, 0, 0.5); +} + +.global-status-modal .notification { + + width: 75%; + max-width: 5in; + margin-left: auto; + margin-right: auto; + overflow: auto; + + text-align: left; + +} + +.global-status-modal .notification .body { + margin: 1.25em; +} + +.global-status-modal .notification .buttons { + margin: 1em; +} diff --git a/guacamole/src/main/frontend/src/app/index/styles/ui.css b/guacamole/src/main/frontend/src/app/index/styles/ui.css new file mode 100644 index 0000000..453831f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/index/styles/ui.css @@ -0,0 +1,283 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + background: white; + font-family: Carlito, FreeSans, Helvetica, Arial, sans-serif; + padding: 0; + margin: 0; +} + +img { + border: none; + vertical-align: middle; +} + +div.section { + margin: 1em; + padding: 0; +} + +/* + * List elements + */ + +.list-item { + + display: block; + text-align: left; + cursor: pointer; + + position: relative; + +} + +.icon { + width: 24px; + height: 24px; + background-size: 16px 16px; + -moz-background-size: 16px 16px; + -webkit-background-size: 16px 16px; + -khtml-background-size: 16px 16px; + background-repeat: no-repeat; + background-position: center center; + display: inline-block; + vertical-align: middle; +} + +.list-item * { + vertical-align: middle; +} + +.list-item .caption { + padding: 0.1em; +} + +.list-item .caption:after { + clear: right; + content: ""; + display: block; +} + +.list-item .name { + color: black; + font-weight: normal; + padding: 0.1em; + margin-left: 0.25em; +} + +.list-item .usage { + float: right; + font-style: italic; + color: gray; +} + +.list-item.in-use { + opacity: 0.5; +} + +.choice .list-item.in-use { + opacity: 1; +} + +/* + * List element styling + */ + +.list-item.selected { + background: #DEB; +} + +.caption.active * { + opacity: 0.5; +} + +.caption .activeUserCount { + font-style: italic; + margin-right: 1em; + float: right; +} + +.list-item:not(.selected) .caption:hover { + background: #CDA; +} + +.choice .list-item { + display: inline-block; +} + +.choice input[type='checkbox'] { + vertical-align: top; + height: 24px; + padding: 0; + margin: 0; +} + +.disabled .list-item:not(.selected) { + opacity: 0.25; +} + +.disabled .list-item:not(.selected):hover { + background: inherit; +} + +/* + * List element icons + */ + +.icon.user { + background-image: url('images/user-icons/guac-user.svg'); +} + +.icon.user.add { + background-image: url('images/action-icons/guac-user-add.svg'); +} + +.icon.user-group { + background-image: url('images/user-icons/guac-user-group.svg'); +} + +.icon.user-group.add { + background-image: url('images/action-icons/guac-user-group-add.svg'); +} + +.icon.connection { + background-image: url('images/protocol-icons/guac-plug.svg'); +} + +.icon.connection.add { + background-image: url('images/action-icons/guac-monitor-add.svg'); +} + +.connection .icon, +.connection-group .icon, +.sharing-profile .icon { + display: inline-block; + width: 24px; + height: 24px; + background-size: 16px 16px; + -moz-background-size: 16px 16px; + -webkit-background-size: 16px 16px; + -khtml-background-size: 16px 16px; + background-repeat: no-repeat; + background-position: center center; +} + +.connection-group > .caption .icon { + background-image: url('images/folder-closed.svg'); +} + +.connection-group.expanded > .caption .icon { + background-image: url('images/folder-open.svg'); +} + +.connection .icon { + background-image: url('images/protocol-icons/guac-plug.svg'); +} + +.connection .icon.kubernetes, +.connection .icon.ssh, +.connection .icon.telnet { + background-image: url('images/protocol-icons/guac-text.svg'); +} + +.connection .icon.vnc, +.connection .icon.rdp { + background-image: url('images/protocol-icons/guac-monitor.svg'); +} + +.sharing-profile .icon { + background-image: url('images/share.svg'); +} + +/* + * Groups + */ + +.expandable > .children { + margin-left: 13px; + padding-left: 13px; +} + +.connection-group.empty.balancer .icon { + background-image: url('images/protocol-icons/guac-monitor.svg'); +} + +.expandable.expanded > .children > .list-item { + position: relative; +} + +.expandable.expanded > .children > .list-item:before, +.expandable.expanded > .children > .list-item:after { + display: block; + content: ' '; + position: absolute; + z-index: -1; +} + +.expandable.expanded > .children > .list-item:before { + border-left: 1px solid #BBB; + left: -13px; + top: -0.75em; + bottom: 0; +} + +.expandable.expanded > .children > .list-item:last-child:before { + height: 1.5em; +} + +.expandable.expanded > .children > .list-item:after { + display: block; + content: ' '; + border-bottom: 1px solid #BBB; + left: -13px; + width: 13px; + top: 0.75em; +} + +.expandable > .caption .icon.expand { + background-image: url('images/group-icons/guac-closed.svg'); +} + +.expandable.expanded > .caption .icon.expand { + background-image: url('images/group-icons/guac-open.svg'); +} + +.expandable.empty > .caption .icon.expand { + opacity: 0.25; + background-image: url('images/group-icons/guac-open.svg'); +} + +.history th, +.history td { + padding-left: 1em; + padding-right: 1em; +} + +.buttons { + text-align: center; + margin: 1em; +} diff --git a/guacamole/src/main/frontend/src/app/list/directives/guacFilter.js b/guacamole/src/main/frontend/src/app/list/directives/guacFilter.js new file mode 100644 index 0000000..5a284d6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/directives/guacFilter.js @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides a filtering text input field which automatically + * produces a filtered subset of the elements of some given array. + */ +angular.module('list').directive('guacFilter', [function guacFilter() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The property to which a subset of the provided array will be + * assigned. + * + * @type Array + */ + filteredItems : '=', + + /** + * The placeholder text to display within the filter input field + * when no filter has been provided. + * + * @type String + */ + placeholder : '&', + + /** + * An array of objects to filter. A subset of this array will be + * exposed as filteredItems. + * + * @type Array + */ + items : '&', + + /** + * An array of expressions to filter against for each object in the + * items array. These expressions must be Angular expressions + * which resolve to properties on the objects in the items array. + * + * @type String[] + */ + properties : '&' + + }, + + templateUrl: 'app/list/templates/guacFilter.html', + controller: ['$scope', '$injector', function guacFilterController($scope, $injector) { + + // Required types + var FilterPattern = $injector.get('FilterPattern'); + + /** + * The pattern object to use when filtering items. + * + * @type FilterPattern + */ + var filterPattern = new FilterPattern($scope.properties()); + + /** + * The filter search string to use to restrict the displayed items. + * + * @type String + */ + $scope.searchString = null; + + /** + * Applies the current filter predicate, filtering all provided + * items and storing the result in filteredItems. + */ + var updateFilteredItems = function updateFilteredItems() { + + var items = $scope.items(); + if (items) + $scope.filteredItems = items.filter(filterPattern.predicate); + else + $scope.filteredItems = []; + + }; + + // Recompile and refilter when pattern is changed + $scope.$watch('searchString', function searchStringChanged(searchString) { + filterPattern.compile(searchString); + updateFilteredItems(); + }); + + // Refilter when items change + $scope.$watchCollection($scope.items, function itemsChanged() { + updateFilteredItems(); + }); + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/list/directives/guacPager.js b/guacamole/src/main/frontend/src/app/list/directives/guacPager.js new file mode 100644 index 0000000..956abc3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/directives/guacPager.js @@ -0,0 +1,300 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides pagination controls, along with a paginated + * subset of the elements of some given array. + */ +angular.module('list').directive('guacPager', [function guacPager() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The property to which a subset of the provided array will be + * assigned. + * + * @type Array + */ + page : '=', + + /** + * The maximum number of items per page. + * + * @type Number + */ + pageSize : '&', + + /** + * The maximum number of page choices to provide, regardless of the + * total number of pages. + * + * @type Number + */ + pageCount : '&', + + /** + * An array objects to paginate. Subsets of this array will be + * exposed as pages. + * + * @type Array + */ + items : '&' + + }, + + templateUrl: 'app/list/templates/guacPager.html', + controller: ['$scope', function guacPagerController($scope) { + + /** + * The default size of a page, if not provided via the pageSize + * attribute. + * + * @type Number + */ + var DEFAULT_PAGE_SIZE = 10; + + /** + * The default maximum number of page choices to provide, if a + * value is not providede via the pageCount attribute. + * + * @type Number + */ + var DEFAULT_PAGE_COUNT = 11; + + /** + * An array of arrays, where the Nth array contains the contents of + * the Nth page. + * + * @type Array[] + */ + var pages = []; + + /** + * The number of the first selectable page. + * + * @type Number; + */ + $scope.firstPage = 1; + + /** + * The number of the page immediately before the currently-selected + * page. + * + * @type Number; + */ + $scope.previousPage = 1; + + /** + * The number of the currently-selected page. + * + * @type Number; + */ + $scope.currentPage = 1; + + /** + * The number of the page immediately after the currently-selected + * page. + * + * @type Number; + */ + $scope.nextPage = 1; + + /** + * The number of the last selectable page. + * + * @type Number; + */ + $scope.lastPage = 1; + + /** + * An array of relevant page numbers that the user may want to jump + * to directly. + * + * @type Number[] + */ + $scope.pageNumbers = []; + + /** + * Updates the displayed page number choices. + */ + var updatePageNumbers = function updatePageNumbers() { + + // Get page count + var pageCount = $scope.pageCount() || DEFAULT_PAGE_COUNT; + + // Determine start/end of page window + var windowStart = $scope.currentPage - (pageCount - 1) / 2; + var windowEnd = windowStart + pageCount - 1; + + // Shift window as necessary if it extends beyond the first page + if (windowStart < $scope.firstPage) { + windowEnd = Math.min($scope.lastPage, windowEnd - windowStart + $scope.firstPage); + windowStart = $scope.firstPage; + } + + // Shift window as necessary if it extends beyond the last page + else if (windowEnd > $scope.lastPage) { + windowStart = Math.max(1, windowStart - windowEnd + $scope.lastPage); + windowEnd = $scope.lastPage; + } + + // Generate list of relevant page numbers + $scope.pageNumbers = []; + for (var pageNumber = windowStart; pageNumber <= windowEnd; pageNumber++) + $scope.pageNumbers.push(pageNumber); + + }; + + /** + * Iterates through the bound items array, splitting it into pages + * based on the current page size. + */ + var updatePages = function updatePages() { + + // Get current items and page size + var items = $scope.items(); + var pageSize = $scope.pageSize() || DEFAULT_PAGE_SIZE; + + // Clear current pages + pages = []; + + // Only split into pages if items actually exist + if (items) { + + // Split into pages of pageSize items each + for (var i = 0; i < items.length; i += pageSize) + pages.push(items.slice(i, i + pageSize)); + + } + + // Update minimum and maximum values + $scope.firstPage = 1; + $scope.lastPage = pages.length; + + // Select an appropriate page + var adjustedCurrentPage = Math.min($scope.lastPage, Math.max($scope.firstPage, $scope.currentPage)); + $scope.selectPage(adjustedCurrentPage); + + }; + + /** + * Selects the page having the given number, assigning that page to + * the property bound to the page attribute. If no such page + * exists, the property will be set to undefined instead. Valid + * page numbers begin at 1. + * + * @param {Number} page + * The number of the page to select. Valid page numbers begin + * at 1. + */ + $scope.selectPage = function selectPage(page) { + + // Select the chosen page + $scope.currentPage = page; + $scope.page = pages[page-1]; + + // Update next/previous page numbers + $scope.nextPage = Math.min($scope.lastPage, $scope.currentPage + 1); + $scope.previousPage = Math.max($scope.firstPage, $scope.currentPage - 1); + + // Update which page numbers are shown + updatePageNumbers(); + + }; + + /** + * Returns whether the given page number can be legally selected + * via selectPage(), resulting in a different page being shown. + * + * @param {Number} page + * The page number to check. + * + * @returns {Boolean} + * true if the page having the given number can be selected, + * false otherwise. + */ + $scope.canSelectPage = function canSelectPage(page) { + return page !== $scope.currentPage + && page >= $scope.firstPage + && page <= $scope.lastPage; + }; + + /** + * Returns whether the page having the given number is currently + * selected. + * + * @param {Number} page + * The page number to check. + * + * @returns {Boolean} + * true if the page having the given number is currently + * selected, false otherwise. + */ + $scope.isSelected = function isSelected(page) { + return page === $scope.currentPage; + }; + + /** + * Returns whether pages exist before the first page listed in the + * pageNumbers array. + * + * @returns {Boolean} + * true if pages exist before the first page listed in the + * pageNumbers array, false otherwise. + */ + $scope.hasMorePagesBefore = function hasMorePagesBefore() { + var firstPageNumber = $scope.pageNumbers[0]; + return firstPageNumber !== $scope.firstPage; + }; + + /** + * Returns whether pages exist after the last page listed in the + * pageNumbers array. + * + * @returns {Boolean} + * true if pages exist after the last page listed in the + * pageNumbers array, false otherwise. + */ + $scope.hasMorePagesAfter = function hasMorePagesAfter() { + var lastPageNumber = $scope.pageNumbers[$scope.pageNumbers.length - 1]; + return lastPageNumber !== $scope.lastPage; + }; + + // Update available pages when available items are changed + $scope.$watchCollection($scope.items, function itemsChanged() { + updatePages(); + }); + + // Update available pages when page size is changed + $scope.$watch($scope.pageSize, function pageSizeChanged() { + updatePages(); + }); + + // Update available page numbers when page count is changed + $scope.$watch($scope.pageCount, function pageCountChanged() { + updatePageNumbers(); + }); + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/list/directives/guacSortOrder.js b/guacamole/src/main/frontend/src/app/list/directives/guacSortOrder.js new file mode 100644 index 0000000..09ed787 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/directives/guacSortOrder.js @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Updates the priority of the sorting property given by "guac-sort-property" + * within the SortOrder object given by "guac-sort-order". The CSS classes + * "sort-primary" and "sort-descending" will be applied to the associated + * element depending on the priority and sort direction of the given property. + * + * The associated element will automatically be assigned the "sortable" CSS + * class. + */ +angular.module('list').directive('guacSortOrder', [function guacFocus() { + + return { + restrict: 'A', + + link: function linkGuacSortOrder($scope, $element, $attrs) { + + /** + * The object defining the sorting order. + * + * @type SortOrder + */ + var sortOrder = $scope.$eval($attrs.guacSortOrder); + + /** + * The name of the property whose priority within the sort order + * is controlled by this directive. + * + * @type String + */ + var sortProperty = $scope.$eval($attrs.guacSortProperty); + + /** + * Returns whether the sort property defined via the + * "guac-sort-property" attribute is the primary sort property of + * the associated sort order. + * + * @returns {Boolean} + * true if the sort property defined via the + * "guac-sort-property" attribute is the primary sort property, + * false otherwise. + */ + var isPrimary = function isPrimary() { + return sortOrder.primary === sortProperty; + }; + + /** + * Returns whether the primary property of the sort order is + * sorted in descending order. + * + * @returns {Boolean} + * true if the primary property of the sort order is sorted in + * descending order, false otherwise. + */ + var isDescending = function isDescending() { + return sortOrder.descending; + }; + + // Assign "sortable" class to associated element + $element.addClass('sortable'); + + // Add/remove "sort-primary" class depending on sort order + $scope.$watch(isPrimary, function primaryChanged(primary) { + $element.toggleClass('sort-primary', primary); + }); + + // Add/remove "sort-descending" class depending on sort order + $scope.$watch(isDescending, function descendingChanged(descending) { + $element.toggleClass('sort-descending', descending); + }); + + // Update sort order when clicked + $element[0].addEventListener('click', function clicked() { + $scope.$evalAsync(function updateSortOrder() { + sortOrder.togglePrimary(sortProperty); + }); + }); + + } // end guacSortOrder link function + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/list/directives/guacUserItem.js b/guacamole/src/main/frontend/src/app/list/directives/guacUserItem.js new file mode 100644 index 0000000..6d13cec --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/directives/guacUserItem.js @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which graphically represents an individual user. + */ +angular.module('list').directive('guacUserItem', [function guacUserItem() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The username of the user represented by this guacUserItem. + * + * @type String + */ + username : '=' + + }, + + templateUrl: 'app/list/templates/guacUserItem.html', + controller: ['$scope', '$injector', + function guacUserItemController($scope, $injector) { + + // Required types + var AuthenticationResult = $injector.get('AuthenticationResult'); + + // Required services + var $translate = $injector.get('$translate'); + + /** + * The string to display when listing the user having the provided + * username. Generally, this will be the username itself, but can + * also be an arbitrary human-readable representation of the user, + * or null if the display name is not yet determined. + * + * @type String + */ + $scope.displayName = null; + + /** + * Returns whether the username provided to this directive denotes + * a user that authenticated anonymously. + * + * @returns {Boolean} + * true if the username provided represents an anonymous user, + * false otherwise. + */ + $scope.isAnonymous = function isAnonymous() { + return $scope.username === AuthenticationResult.ANONYMOUS_USERNAME; + }; + + // Update display name whenever provided username changes + $scope.$watch('username', function updateDisplayName(username) { + + // If the user is anonymous, pull the display name for anonymous + // users from the translation service + if ($scope.isAnonymous()) { + $translate('LIST.TEXT_ANONYMOUS_USER') + .then(function retrieveAnonymousDisplayName(anonymousDisplayName) { + $scope.displayName = anonymousDisplayName; + }, angular.noop); + } + + // For all other users, use the username verbatim + else + $scope.displayName = username; + + }); + + }] // end controller + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/list/listModule.js b/guacamole/src/main/frontend/src/app/list/listModule.js new file mode 100644 index 0000000..845c8c9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/listModule.js @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for displaying, sorting, and filtering the contents of a list, split + * into multiple pages. + */ +angular.module('list', [ + 'auth' +]); diff --git a/guacamole/src/main/frontend/src/app/list/styles/filter.css b/guacamole/src/main/frontend/src/app/list/styles/filter.css new file mode 100644 index 0000000..ff4b568 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/styles/filter.css @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.filter { + margin: 0.5em 0; +} + +.filter .search-string { + background-image: url('images/magnifier.svg'); + background-repeat: no-repeat; + background-size: 1.75em; + background-position: 0.25em center; + padding: 0.5em; + padding-left: 2.25em; + width: 100%; + max-width: none; +} diff --git a/guacamole/src/main/frontend/src/app/list/styles/pager.css b/guacamole/src/main/frontend/src/app/list/styles/pager.css new file mode 100644 index 0000000..7baa665 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/styles/pager.css @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.pager { + text-align: center; + margin: 1em; +} + +.pager .page-numbers { + display: inline-block; + margin: 0; + padding: 0; +} + +.pager .first-page, +.pager .prev-page, +.pager .set-page, +.pager .next-page, +.pager .last-page { + cursor: pointer; + vertical-align: middle; +} + +.pager .first-page.disabled, +.pager .prev-page.disabled, +.pager .set-page.disabled, +.pager .next-page.disabled, +.pager .last-page.disabled { + cursor: auto; + opacity: 0.25; +} + +.pager .set-page, +.pager .more-pages { + display: inline-block; + padding: 0.25em; + text-align: center; + min-width: 1.25em; +} + +.pager .set-page { + text-decoration: underline; +} + +.pager .set-page.current { + cursor: auto; + text-decoration: none; + font-weight: bold; + background: rgba(0, 0, 0, 0.1); + border: 1px solid rgba(0, 0, 0, 0.1); + -moz-border-radius: 0.2em; + -webkit-border-radius: 0.2em; + -khtml-border-radius: 0.2em; + border-radius: 0.2em; +} + +.pager .icon.first-page { + background-image: url('images/action-icons/guac-first-page.svg'); +} + +.pager .icon.prev-page { + background-image: url('images/action-icons/guac-prev-page.svg'); +} + +.pager .icon.next-page { + background-image: url('images/action-icons/guac-next-page.svg'); +} + +.pager .icon.last-page { + background-image: url('images/action-icons/guac-last-page.svg'); +} diff --git a/guacamole/src/main/frontend/src/app/list/styles/user-item.css b/guacamole/src/main/frontend/src/app/list/styles/user-item.css new file mode 100644 index 0000000..ffedd39 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/styles/user-item.css @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.user-item.anonymous { + font-style: italic; + opacity: 0.5; +} diff --git a/guacamole/src/main/frontend/src/app/list/templates/guacFilter.html b/guacamole/src/main/frontend/src/app/list/templates/guacFilter.html new file mode 100644 index 0000000..d3025be --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/templates/guacFilter.html @@ -0,0 +1,6 @@ +
      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/list/templates/guacPager.html b/guacamole/src/main/frontend/src/app/list/templates/guacPager.html new file mode 100644 index 0000000..eac2fe8 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/templates/guacPager.html @@ -0,0 +1,25 @@ +
      + + +
      +
      + + +
      ...
      + + +
        +
      • {{pageNumber}}
      • +
      + + +
      ...
      + + +
      +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/list/templates/guacUserItem.html b/guacamole/src/main/frontend/src/app/list/templates/guacUserItem.html new file mode 100644 index 0000000..e6ea670 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/templates/guacUserItem.html @@ -0,0 +1,3 @@ +
      + {{displayName}} +
      diff --git a/guacamole/src/main/frontend/src/app/list/types/FilterPattern.js b/guacamole/src/main/frontend/src/app/list/types/FilterPattern.js new file mode 100644 index 0000000..f67b299 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/types/FilterPattern.js @@ -0,0 +1,263 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the FilterPattern class. + */ +angular.module('list').factory('FilterPattern', ['$injector', + function defineFilterPattern($injector) { + + // Required types + var FilterToken = $injector.get('FilterToken'); + var IPv4Network = $injector.get('IPv4Network'); + var IPv6Network = $injector.get('IPv6Network'); + + // Required services + var $parse = $injector.get('$parse'); + + /** + * Object which handles compilation of filtering predicates as used by + * the Angular "filter" filter. Predicates are compiled from a user- + * specified search string. + * + * @constructor + * @param {String[]} expressions + * The Angular expressions whose values are to be filtered. + */ + var FilterPattern = function FilterPattern(expressions) { + + /** + * Reference to this instance. + * + * @type FilterPattern + */ + var filterPattern = this; + + /** + * Filter predicate which simply matches everything. This function + * always returns true. + * + * @returns {Boolean} + * true. + */ + var nullPredicate = function nullPredicate() { + return true; + }; + + /** + * Array of getters corresponding to the Angular expressions provided + * to the constructor of this class. The functions returns are those + * produced by the $parse service. + * + * @type Function[] + */ + var getters = []; + + // Parse all expressions + angular.forEach(expressions, function parseExpression(expression) { + getters.push($parse(expression)); + }); + + /** + * Determines whether the given object contains properties that match + * the given string, according to the provided getters. + * + * @param {Object} object + * The object to match against. + * + * @param {String} str + * The string to match. + * + * @returns {Boolean} + * true if the object matches the given string, false otherwise. + */ + var matchesString = function matchesString(object, str) { + + // For each defined getter + for (var i=0; i < getters.length; i++) { + + // Retrieve value of current getter + var value = getters[i](object); + + // If the value matches the pattern, the whole object matches + if (String(value).toLowerCase().indexOf(str) !== -1) + return true; + + } + + // No matches found + return false; + + }; + + /** + * Determines whether the given object contains properties that match + * the given IPv4 network, according to the provided getters. + * + * @param {Object} object + * The object to match against. + * + * @param {IPv4Network} network + * The IPv4 network to match. + * + * @returns {Boolean} + * true if the object matches the given network, false otherwise. + */ + var matchesIPv4 = function matchesIPv4(object, network) { + + // For each defined getter + for (var i=0; i < getters.length; i++) { + + // Test each possible IPv4 address within the string against + // the given IPv4 network + var addresses = String(getters[i](object)).split(/[^0-9.]+/); + for (var j=0; j < addresses.length; j++) { + var value = IPv4Network.parse(addresses[j]); + if (value && network.contains(value)) + return true; + } + + } + + // No matches found + return false; + + }; + + /** + * Determines whether the given object contains properties that match + * the given IPv6 network, according to the provided getters. + * + * @param {Object} object + * The object to match against. + * + * @param {IPv6Network} network + * The IPv6 network to match. + * + * @returns {Boolean} + * true if the object matches the given network, false otherwise. + */ + var matchesIPv6 = function matchesIPv6(object, network) { + + // For each defined getter + for (var i=0; i < getters.length; i++) { + + // Test each possible IPv6 address within the string against + // the given IPv6 network + var addresses = String(getters[i](object)).split(/[^0-9A-Fa-f:]+/); + for (var j=0; j < addresses.length; j++) { + var value = IPv6Network.parse(addresses[j]); + if (value && network.contains(value)) + return true; + } + + } + + // No matches found + return false; + + }; + + + /** + * Determines whether the given object matches the given filter pattern + * token. + * + * @param {Object} object + * The object to match the token against. + * + * @param {FilterToken} token + * The token from the tokenized filter pattern to match aginst the + * given object. + * + * @returns {Boolean} + * true if the object matches the token, false otherwise. + */ + var matchesToken = function matchesToken(object, token) { + + // Match depending on token type + switch (token.type) { + + // Simple string literal + case 'LITERAL': + return matchesString(object, token.value); + + // IPv4 network address / subnet + case 'IPV4_NETWORK': + return matchesIPv4(object, token.value); + + // IPv6 network address / subnet + case 'IPV6_NETWORK': + return matchesIPv6(object, token.value); + + // Unsupported token type + default: + return false; + + } + + }; + + /** + * The current filtering predicate. + * + * @type Function + */ + this.predicate = nullPredicate; + + /** + * Compiles the given pattern string, assigning the resulting filter + * predicate. The resulting predicate will accept only objects that + * match the given pattern. + * + * @param {String} pattern + * The pattern to compile. + */ + this.compile = function compile(pattern) { + + // If no pattern provided, everything matches + if (!pattern) { + filterPattern.predicate = nullPredicate; + return; + } + + // Tokenize pattern, converting to lower case for case-insensitive matching + var tokens = FilterToken.tokenize(pattern.toLowerCase()); + + // Return predicate which matches against the value of any getter in the getters array + filterPattern.predicate = function matchesAllTokens(object) { + + // False if any token does not match + for (var i=0; i < tokens.length; i++) { + if (!matchesToken(object, tokens[i])) + return false; + } + + // True if all tokens matched + return true; + + }; + + }; + + }; + + return FilterPattern; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/list/types/FilterToken.js b/guacamole/src/main/frontend/src/app/list/types/FilterToken.js new file mode 100644 index 0000000..d512d38 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/types/FilterToken.js @@ -0,0 +1,229 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the FilterToken class. + */ +angular.module('list').factory('FilterToken', ['$injector', + function defineFilterToken($injector) { + + // Required types + var IPv4Network = $injector.get('IPv4Network'); + var IPv6Network = $injector.get('IPv6Network'); + + /** + * An arbitrary token having an associated type and value. + * + * @constructor + * @param {String} consumed + * The input string consumed to produce this token. + * + * @param {String} type + * The type of this token. Each legal type name is a property within + * FilterToken.Types. + * + * @param {Object} value + * The value of this token. The type of this value is determined by + * the token type. + */ + var FilterToken = function FilterToken(consumed, type, value) { + + /** + * The input string that was consumed to produce this token. + * + * @type String + */ + this.consumed = consumed; + + /** + * The type of this token. Each legal type name is a property within + * FilterToken.Types. + * + * @type String + */ + this.type = type; + + /** + * The value of this token. + * + * @type Object + */ + this.value = value; + + }; + + /** + * All legal token types, and corresponding functions which match them. + * Each function returns the parsed token, or null if no such token was + * found. + * + * @type Object. + */ + FilterToken.Types = { + + /** + * An IPv4 address or subnet. The value of an IPV4_NETWORK token is an + * IPv4Network. + */ + IPV4_NETWORK: function parseIPv4(str) { + + var pattern = /^\S+/; + + // Read first word via regex + var matches = pattern.exec(str); + if (!matches) + return null; + + // Validate and parse as IPv4 address + var network = IPv4Network.parse(matches[0]); + if (!network) + return null; + + return new FilterToken(matches[0], 'IPV4_NETWORK', network); + + }, + + /** + * An IPv6 address or subnet. The value of an IPV6_NETWORK token is an + * IPv6Network. + */ + IPV6_NETWORK: function parseIPv6(str) { + + var pattern = /^\S+/; + + // Read first word via regex + var matches = pattern.exec(str); + if (!matches) + return null; + + // Validate and parse as IPv6 address + var network = IPv6Network.parse(matches[0]); + if (!network) + return null; + + return new FilterToken(matches[0], 'IPV6_NETWORK', network); + + }, + + /** + * A string literal, which may be quoted. The value of a LITERAL token + * is a String. + */ + LITERAL: function parseLiteral(str) { + + var pattern = /^"([^"]*)"|^\S+/; + + // Validate against pattern + var matches = pattern.exec(str); + if (!matches) + return null; + + // If literal is quoted, parse within the quotes + if (matches[1]) + return new FilterToken(matches[0], 'LITERAL', matches[1]); + + // Otherwise, literal is unquoted + return new FilterToken(matches[0], 'LITERAL', matches[0]); + + }, + + /** + * Arbitrary contiguous whitespace. The value of a WHITESPACE token is + * a String. + */ + WHITESPACE: function parseWhitespace(str) { + + var pattern = /^\s+/; + + // Validate against pattern + var matches = pattern.exec(str); + if (!matches) + return null; + + // Generate token from matching whitespace + return new FilterToken(matches[0], 'WHITESPACE', matches[0]); + + } + + }; + + /** + * Tokenizes the given string, returning an array of tokens. Whitespace + * tokens are dropped. + * + * @param {String} str + * The string to tokenize. + * + * @returns {FilterToken[]} + * All tokens identified within the given string, in order. + */ + FilterToken.tokenize = function tokenize(str) { + + var tokens = []; + + /** + * Returns the first token on the current string, removing the token + * from that string. + * + * @returns FilterToken + * The first token on the string, or null if no tokens match. + */ + var popToken = function popToken() { + + // Attempt to find a matching token + for (var type in FilterToken.Types) { + + // Get matching function for current type + var matcher = FilterToken.Types[type]; + + // If token matches, return the matching group + var token = matcher(str); + if (token) { + str = str.substring(token.consumed.length); + return token; + } + + } + + // No match + return null; + + }; + + // Tokenize input until no input remains + while (str) { + + // Remove first token + var token = popToken(); + if (!token) + break; + + // Add token to tokens array, if not whitespace + if (token.type !== 'WHITESPACE') + tokens.push(token); + + } + + return tokens; + + }; + + return FilterToken; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/list/types/IPv4Network.js b/guacamole/src/main/frontend/src/app/list/types/IPv4Network.js new file mode 100644 index 0000000..564eb7f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/types/IPv4Network.js @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the IPv4Network class. + */ +angular.module('list').factory('IPv4Network', [ + function defineIPv4Network() { + + /** + * Represents an IPv4 network as a pairing of base address and netmask, + * both of which are in binary form. To obtain an IPv4Network from + * standard CIDR or dot-decimal notation, use IPv4Network.parse(). + * + * @constructor + * @param {Number} address + * The IPv4 address of the network in binary form. + * + * @param {Number} netmask + * The IPv4 netmask of the network in binary form. + */ + var IPv4Network = function IPv4Network(address, netmask) { + + /** + * Reference to this IPv4Network. + * + * @type IPv4Network + */ + var network = this; + + /** + * The binary address of this network. This will be a 32-bit quantity. + * + * @type Number + */ + this.address = address; + + /** + * The binary netmask of this network. This will be a 32-bit quantity. + * + * @type Number + */ + this.netmask = netmask; + + /** + * Tests whether the given network is entirely within this network, + * taking into account the base addresses and netmasks of both. + * + * @param {IPv4Network} other + * The network to test. + * + * @returns {Boolean} + * true if the other network is entirely within this network, false + * otherwise. + */ + this.contains = function contains(other) { + return network.address === (other.address & other.netmask & network.netmask); + }; + + }; + + /** + * Parses the given string as an IPv4 address or subnet, returning an + * IPv4Network object which describes that address or subnet. + * + * @param {String} str + * The string to parse. + * + * @returns {IPv4Network} + * The parsed network, or null if the given string is not valid. + */ + IPv4Network.parse = function parse(str) { + + // Regex which matches the general form of IPv4 addresses + var pattern = /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(?:\/([0-9]{1,2}))?$/; + + // Parse IPv4 address via regex + var match = pattern.exec(str); + if (!match) + return null; + + // Parse netmask, if given + var netmask = 0xFFFFFFFF; + if (match[5]) { + var bits = parseInt(match[5]); + if (bits > 0 && bits <= 32) + netmask = 0xFFFFFFFF << (32 - bits); + } + + // Read each octet onto address + var address = 0; + for (var i=1; i <= 4; i++) { + + // Validate octet range + var octet = parseInt(match[i]); + if (octet > 255) + return null; + + // Shift on octet + address = (address << 8) | octet; + + } + + return new IPv4Network(address, netmask); + + }; + + return IPv4Network; + +}]); diff --git a/guacamole/src/main/frontend/src/app/list/types/IPv6Network.js b/guacamole/src/main/frontend/src/app/list/types/IPv6Network.js new file mode 100644 index 0000000..7fa85cb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/types/IPv6Network.js @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the IPv6Network class. + */ +angular.module('list').factory('IPv6Network', [ + function defineIPv6Network() { + + /** + * Represents an IPv6 network as a pairing of base address and netmask, + * both of which are in binary form. To obtain an IPv6Network from + * standard CIDR notation, use IPv6Network.parse(). + * + * @constructor + * @param {Number[]} addressGroups + * Array of eight IPv6 address groups in binary form, each group being + * 16-bit number. + * + * @param {Number[]} netmaskGroups + * Array of eight IPv6 netmask groups in binary form, each group being + * 16-bit number. + */ + var IPv6Network = function IPv6Network(addressGroups, netmaskGroups) { + + /** + * Reference to this IPv6Network. + * + * @type IPv6Network + */ + var network = this; + + /** + * The 128-bit binary address of this network as an array of eight + * 16-bit numbers. + * + * @type Number[] + */ + this.addressGroups = addressGroups; + + /** + * The 128-bit binary netmask of this network as an array of eight + * 16-bit numbers. + * + * @type Number + */ + this.netmaskGroups = netmaskGroups; + + /** + * Tests whether the given network is entirely within this network, + * taking into account the base addresses and netmasks of both. + * + * @param {IPv6Network} other + * The network to test. + * + * @returns {Boolean} + * true if the other network is entirely within this network, false + * otherwise. + */ + this.contains = function contains(other) { + + // Test that each masked 16-bit quantity matches the address + for (var i=0; i < 8; i++) { + if (network.addressGroups[i] !== (other.addressGroups[i] + & other.netmaskGroups[i] + & network.netmaskGroups[i])) + return false; + } + + // All 16-bit numbers match + return true; + + }; + + }; + + /** + * Generates a netmask having the given number of ones on the left side. + * All other bits within the netmask will be zeroes. The resulting netmask + * will be an array of eight numbers, where each number corresponds to a + * 16-bit group of an IPv6 netmask. + * + * @param {Number} bits + * The number of ones to include on the left side of the netmask. All + * other bits will be zeroes. + * + * @returns {Number[]} + * The generated netmask, having the given number of ones. + */ + var generateNetmask = function generateNetmask(bits) { + + var netmask = []; + + // Only generate up to 128 bits + bits = Math.min(128, bits); + + // Add any contiguous 16-bit sections of ones + while (bits >= 16) { + netmask.push(0xFFFF); + bits -= 16; + } + + // Add remaining ones + if (bits > 0 && bits <= 16) + netmask.push(0xFFFF & (0xFFFF << (16 - bits))); + + // Add remaining zeroes + while (netmask.length < 8) + netmask.push(0); + + return netmask; + + }; + + /** + * Splits the given IPv6 address or partial address into its corresponding + * 16-bit groups. + * + * @param {String} str + * The IPv6 address or partial address to split. + * + * @returns Number[] + * The numeric values of all 16-bit groups within the given IPv6 + * address. + */ + var splitAddress = function splitAddress(str) { + + var address = []; + + // Split address into groups + var groups = str.split(':'); + + // Parse the numeric value of each group + angular.forEach(groups, function addGroup(group) { + var value = parseInt(group || '0', 16); + address.push(value); + }); + + return address; + + }; + + /** + * Parses the given string as an IPv6 address or subnet, returning an + * IPv6Network object which describes that address or subnet. + * + * @param {String} str + * The string to parse. + * + * @returns {IPv6Network} + * The parsed network, or null if the given string is not valid. + */ + IPv6Network.parse = function parse(str) { + + // Regex which matches the general form of IPv6 addresses + var pattern = /^([0-9a-f]{0,4}(?::[0-9a-f]{0,4}){0,7})(?:\/([0-9]{1,3}))?$/; + + // Parse rudimentary IPv6 address via regex + var match = pattern.exec(str); + if (!match) + return null; + + // Extract address and netmask from parse results + var unparsedAddress = match[1]; + var unparsedNetmask = match[2]; + + // Parse netmask + var netmask; + if (unparsedNetmask) + netmask = generateNetmask(parseInt(unparsedNetmask)); + else + netmask = generateNetmask(128); + + var address; + + // Separate based on the double-colon, if present + var doubleColon = unparsedAddress.indexOf('::'); + + // If no double colon, just split into groups + if (doubleColon === -1) + address = splitAddress(unparsedAddress); + + // Otherwise, split either side of the double colon and pad with zeroes + else { + + // Parse either side of the double colon + var leftAddress = splitAddress(unparsedAddress.substring(0, doubleColon)); + var rightAddress = splitAddress(unparsedAddress.substring(doubleColon + 2)); + + // Pad with zeroes up to address length + var remaining = 8 - leftAddress.length - rightAddress.length; + while (remaining > 0) { + leftAddress.push(0); + remaining--; + } + + address = leftAddress.concat(rightAddress); + + } + + // Validate length of address + if (address.length !== 8) + return null; + + return new IPv6Network(address, netmask); + + }; + + return IPv6Network; + +}]); diff --git a/guacamole/src/main/frontend/src/app/list/types/SortOrder.js b/guacamole/src/main/frontend/src/app/list/types/SortOrder.js new file mode 100644 index 0000000..ad3bc56 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/list/types/SortOrder.js @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the SortOrder class. + */ +angular.module('list').factory('SortOrder', [ + function defineSortOrder() { + + /** + * Maintains a sorting predicate as required by the Angular orderBy filter. + * The order of properties sorted by the predicate can be altered while + * otherwise maintaining the sort order. + * + * @constructor + * @param {String[]} predicate + * The properties to sort by, in order of precidence. + */ + var SortOrder = function SortOrder(predicate) { + + /** + * Reference to this instance. + * + * @type SortOrder + */ + var sortOrder = this; + + /** + * The current sorting predicate. + * + * @type String[] + */ + this.predicate = predicate; + + /** + * The name of the highest-precedence sorting property. + * + * @type String + */ + this.primary = predicate[0]; + + /** + * Whether the highest-precedence sorting property is sorted in + * descending order. + * + * @type Boolean + */ + this.descending = false; + + // Handle initially-descending primary properties + if (this.primary.charAt(0) === '-') { + this.primary = this.primary.substring(1); + this.descending = true; + } + + /** + * Reorders the currently-defined predicate such that the named + * property takes precidence over all others. The property will be + * sorted in ascending order unless otherwise specified. + * + * @param {String} name + * The name of the property to reorder by. + * + * @param {Boolean} [descending=false] + * Whether the property should be sorted in descending order. By + * default, all properties are sorted in ascending order. + */ + this.reorder = function reorder(name, descending) { + + // Build ascending and descending predicate components + var ascendingName = name; + var descendingName = '-' + name; + + // Remove requested property from current predicate + sortOrder.predicate = sortOrder.predicate.filter(function notRequestedProperty(current) { + return current !== ascendingName + && current !== descendingName; + }); + + // Add property to beginning of predicate + if (descending) + sortOrder.predicate.unshift(descendingName); + else + sortOrder.predicate.unshift(ascendingName); + + // Update sorted state + sortOrder.primary = name; + sortOrder.descending = !!descending; + + }; + + /** + * Returns whether the sort order is primarily determined by the given + * property. + * + * @param {String} property + * The name of the property to check. + * + * @returns {Boolean} + * true if the sort order is primarily determined by the given + * property, false otherwise. + */ + this.isSortedBy = function isSortedBy(property) { + return sortOrder.primary === property; + }; + + /** + * Sets the primary sorting property to the given property, if not already + * set. If already set, the ascending/descending sort order is toggled. + * + * @param {String} property + * The name of the property to assign as the primary sorting property. + */ + this.togglePrimary = function togglePrimary(property) { + + // Sort in ascending order by new property, if different + if (!sortOrder.isSortedBy(property)) + sortOrder.reorder(property, false); + + // Otherwise, toggle sort order + else + sortOrder.reorder(property, !sortOrder.descending); + + }; + + }; + + return SortOrder; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/locale/localeModule.js b/guacamole/src/main/frontend/src/app/locale/localeModule.js new file mode 100644 index 0000000..765eb4d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/locale/localeModule.js @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for handling common localization-related tasks. + */ +angular.module('locale', []); diff --git a/guacamole/src/main/frontend/src/app/locale/services/translationLoader.js b/guacamole/src/main/frontend/src/app/locale/services/translationLoader.js new file mode 100644 index 0000000..2be5e6a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/locale/services/translationLoader.js @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for loading translation definition files, conforming to the + * angular-translate documentation for custom translation loaders: + * + * https://github.com/angular-translate/angular-translate/wiki/Asynchronous-loading#using-custom-loader-service + */ +angular.module('locale').factory('translationLoader', ['$injector', function translationLoader($injector) { + + // Required services + var $http = $injector.get('$http'); + var $q = $injector.get('$q'); + var cacheService = $injector.get('cacheService'); + var languageService = $injector.get('languageService'); + + /** + * Satisfies a translation request for the given key by searching for the + * translation files for each key in the given array, in order. The request + * fails only if none of the files can be found. + * + * @param {Deferred} deferred + * The Deferred object to resolve or reject depending on whether at + * least one translation file can be successfully loaded. + * + * @param {String} requestedKey + * The originally-requested language key. + * + * @param {String[]} remainingKeys + * The keys of the languages to attempt to load, in order, where the + * first key in this array is the language to try within this function + * call. The first key in the array is not necessarily the originally- + * requested language key. + */ + var satisfyTranslation = function satisfyTranslation(deferred, requestedKey, remainingKeys) { + + // Get current language key + var currentKey = remainingKeys.shift(); + + // If no languages to try, "succeed" with an empty translation (force fallback) + if (!currentKey) { + deferred.resolve('{}'); + return; + } + + /** + * Continues trying possible translation files until no possibilities + * exist. + * + * @private + */ + var tryNextTranslation = function tryNextTranslation() { + satisfyTranslation(deferred, requestedKey, remainingKeys); + }; + + // Retrieve list of supported languages + languageService.getLanguages() + + // Attempt to retrieve translation if language is supported + .then(function retrievedLanguages(languages) { + + // Skip retrieval if language is not supported + if (!(currentKey in languages)) { + tryNextTranslation(); + return; + } + + // Attempt to retrieve language + $http({ + cache : cacheService.languages, + method : 'GET', + url : 'translations/' + encodeURIComponent(currentKey) + '.json' + }) + + // Resolve promise if translation retrieved successfully + .then(function translationFileRetrieved(request) { + deferred.resolve(request.data); + }, + + // Retry with remaining languages if translation file could not be + // retrieved + tryNextTranslation); + }, + + // Retry with remaining languages if translation does not exist + tryNextTranslation); + + }; + + /** + * Given a valid language key, returns all possible legal variations of + * that key. Currently, this will be the given key and the given key + * without the country code. If the key has no country code, only the + * given key will be included in the returned array. + * + * @param {String} key + * The language key to generate variations of. + * + * @returns {String[]} + * All possible variations of the given language key. + */ + var getKeyVariations = function getKeyVariations(key) { + + var underscore = key.indexOf('_'); + + // If no underscore, only one possibility + if (underscore === -1) + return [key]; + + // Otherwise, include the lack of country code as an option + return [key, key.substr(0, underscore)]; + + }; + + /** + * Custom loader function for angular-translate which loads the desired + * language file dynamically via HTTP. If the language file cannot be + * found, the fallback language is used instead. + * + * @param {Object} options + * Arbitrary options, containing at least a "key" property which + * contains the requested language key. + * + * @returns {Promise.} + * A promise which resolves to the requested translation string object. + */ + return function loadTranslationFile(options) { + + var translation = $q.defer(); + + // Satisfy the translation request using possible variations of the given key + satisfyTranslation(translation, options.key, getKeyVariations(options.key)); + + // Return promise which is resolved only after the translation file is loaded + return translation.promise; + + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/locale/services/translationStringService.js b/guacamole/src/main/frontend/src/app/locale/services/translationStringService.js new file mode 100644 index 0000000..6cd09f2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/locale/services/translationStringService.js @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for manipulating translation strings and translation table + * identifiers. + */ +angular.module('locale').factory('translationStringService', [function translationStringService() { + + var service = {}; + + /** + * Given an arbitrary identifier, returns the corresponding translation + * table identifier. Translation table identifiers are uppercase strings, + * word components separated by single underscores. For example, the + * string "Swap red/blue" would become "SWAP_RED_BLUE". + * + * @param {String} identifier + * The identifier to transform into a translation table identifier. + * + * @returns {String} + * The translation table identifier. + */ + service.canonicalize = function canonicalize(identifier) { + return identifier.replace(/[^a-zA-Z0-9]+/g, '_').toUpperCase(); + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/login/directives/login.js b/guacamole/src/main/frontend/src/app/login/directives/login.js new file mode 100644 index 0000000..6027208 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/directives/login.js @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for displaying an arbitrary login form. + */ +angular.module('login').directive('guacLogin', [function guacLogin() { + + // Login directive + var directive = { + restrict : 'E', + replace : true, + templateUrl : 'app/login/templates/login.html' + }; + + // Login directive scope + directive.scope = { + + /** + * An optional instructional message to display within the login + * dialog. + * + * @type TranslatableMessage + */ + helpText : '=', + + /** + * The login form or set of fields. This will be displayed to the user + * to capture their credentials. + * + * @type Field[] + */ + form : '=', + + /** + * A map of all field name/value pairs that have already been provided. + * If not null, the user will be prompted to continue their login + * attempt using only the fields which remain. + */ + values : '=' + + }; + + // Controller for login directive + directive.controller = ['$scope', '$injector', + function loginController($scope, $injector) { + + // Required types + var Error = $injector.get('Error'); + var Field = $injector.get('Field'); + + // Required services + var $location = $injector.get('$location'); + var $rootScope = $injector.get('$rootScope'); + var $route = $injector.get('$route'); + var authenticationService = $injector.get('authenticationService'); + var requestService = $injector.get('requestService'); + + /** + * The initial value for all login fields. Note that this value must + * not be null. If null, empty fields may not be submitted back to the + * server at all, causing the request to misrepresent true login state. + * + * For example, if a user receives an insufficient credentials error + * due to their password expiring, failing to provide that new password + * should result in the user submitting their username, original + * password, and empty new password. If only the username and original + * password are sent, the invalid password reset request will be + * indistinguishable from a normal login attempt. + * + * @constant + * @type String + */ + var DEFAULT_FIELD_VALUE = ''; + + /** + * A description of the error that occurred during login, if any. + * + * @type TranslatableMessage + */ + $scope.loginError = null; + + /** + * All form values entered by the user, as parameter name/value pairs. + * + * @type Object. + */ + $scope.enteredValues = {}; + + /** + * All form fields which have not yet been filled by the user. + * + * @type Field[] + */ + $scope.remainingFields = []; + + /** + * Whether an authentication attempt has been submitted. This will be + * set to true once credentials have been submitted and will only be + * reset to false once the attempt has been fully processed, including + * rerouting the user to the requested page if the attempt succeeded. + * + * @type Boolean + */ + $scope.submitted = false; + + /** + * The field that is most relevant to the user. + * + * @type Field + */ + $scope.relevantField = null; + + /** + * Returns whether a previous login attempt is continuing. + * + * @return {Boolean} + * true if a previous login attempt is continuing, false otherwise. + */ + $scope.isContinuation = function isContinuation() { + + // The login is continuing if any parameter values are provided + for (var name in $scope.values) + return true; + + return false; + + }; + + // Ensure provided values are included within entered values, even if + // they have no corresponding input fields + $scope.$watch('values', function resetEnteredValues(values) { + angular.extend($scope.enteredValues, values || {}); + }); + + // Update field information when form is changed + $scope.$watch('form', function resetRemainingFields(fields) { + + // If no fields are provided, then no fields remain + if (!fields) { + $scope.remainingFields = []; + return; + } + + // Filter provided fields against provided values + $scope.remainingFields = fields.filter(function isRemaining(field) { + return !(field.name in $scope.values); + }); + + // Set default values for all unset fields + angular.forEach($scope.remainingFields, function setDefault(field) { + if (!$scope.enteredValues[field.name]) + $scope.enteredValues[field.name] = DEFAULT_FIELD_VALUE; + }); + + $scope.relevantField = getRelevantField(); + + }); + + /** + * Submits the currently-specified fields to the authentication service, + * as well as any URL parameters set for the current page, preferring + * the values from the fields, and redirecting to the main view if + * successful. + */ + $scope.login = function login() { + + // Any values from URL paramters + const urlValues = $location.search(); + + // Values from the fields + const fieldValues = $scope.enteredValues; + + // All the values to be submitted in the auth attempt, preferring + // any values from fields over those in the URL + const authParams = {...urlValues, ...fieldValues}; + + authenticationService.authenticate(authParams)['catch'](requestService.IGNORE); + }; + + /** + * Returns the field most relevant to the user given the current state + * of the login process. This will normally be the first empty field. + * + * @return {Field} + * The field most relevant, null if there is no single most relevant + * field. + */ + var getRelevantField = function getRelevantField() { + + for (var i = 0; i < $scope.remainingFields.length; i++) { + var field = $scope.remainingFields[i]; + if (!$scope.enteredValues[field.name]) + return field; + } + + return null; + + }; + + // Update UI to reflect in-progress auth status (clear any previous + // errors, flag as pending) + $rootScope.$on('guacLoginPending', function loginSuccessful() { + $scope.submitted = true; + $scope.loginError = null; + }); + + // Retry route upon success (entered values will be cleared only + // after route change has succeeded as this can take time) + $rootScope.$on('guacLogin', function loginSuccessful() { + $route.reload(); + }); + + // Reset upon failure + $rootScope.$on('guacLoginFailed', function loginFailed(event, parameters, error) { + + // Initial submission is complete and has failed + $scope.submitted = false; + + // Clear out passwords if the credentials were rejected for any reason + if (error.type !== Error.Type.INSUFFICIENT_CREDENTIALS) { + + // Flag generic error for invalid login + if (error.type === Error.Type.INVALID_CREDENTIALS) + $scope.loginError = { + 'key' : 'LOGIN.ERROR_INVALID_LOGIN' + }; + + // Display error if anything else goes wrong + else + $scope.loginError = error.translatableMessage; + + // Reset all remaining fields to default values, but + // preserve any usernames + angular.forEach($scope.remainingFields, function clearEnteredValueIfPassword(field) { + if (field.type !== Field.Type.USERNAME && field.name in $scope.enteredValues) + $scope.enteredValues[field.name] = DEFAULT_FIELD_VALUE; + }); + } + + }); + + // Reset state after authentication and routing have succeeded + $rootScope.$on('$routeChangeSuccess', function routeChanged() { + $scope.enteredValues = {}; + $scope.submitted = false; + }); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/login/loginModule.js b/guacamole/src/main/frontend/src/app/login/loginModule.js new file mode 100644 index 0000000..891387e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/loginModule.js @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for the login functionality. + */ +angular.module('login', [ + 'element', + 'form', + 'navigation' +]); diff --git a/guacamole/src/main/frontend/src/app/login/styles/animation.css b/guacamole/src/main/frontend/src/app/login/styles/animation.css new file mode 100644 index 0000000..d66b3fa --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/styles/animation.css @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +@keyframes shake-head { + 0% { margin-left: 0.25em; margin-right: -0.25em; } + 25% { margin-left: -0.25em; margin-right: 0.25em; } + 50% { margin-left: 0.25em; margin-right: -0.25em; } + 75% { margin-left: -0.25em; margin-right: 0.25em; } + 100% { margin-left: 0.00em; margin-right: 0.00em; } +} + +@-webkit-keyframes shake-head { + 0% { margin-left: 0.25em; margin-right: -0.25em; } + 25% { margin-left: -0.25em; margin-right: 0.25em; } + 50% { margin-left: 0.25em; margin-right: -0.25em; } + 75% { margin-left: -0.25em; margin-right: 0.25em; } + 100% { margin-left: 0.00em; margin-right: 0.00em; } +} diff --git a/guacamole/src/main/frontend/src/app/login/styles/dialog.css b/guacamole/src/main/frontend/src/app/login/styles/dialog.css new file mode 100644 index 0000000..81ab8a9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/styles/dialog.css @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.login-ui { + animation: fadein 0.125s linear; + -moz-animation: fadein 0.125s linear; + -webkit-animation: fadein 0.125s linear; +} + +.login-ui .login-dialog-middle { + width: 100%; + display: table-cell; + vertical-align: middle; + text-align: center; +} + +.login-ui .login-dialog { + + width: 100%; + max-width: 3in; + text-align: left; + padding: 1em; + font-size: 1.25em; + + display: inline-block; +} + +.login-ui .login-dialog h1 { + margin-top: 0; + margin-bottom: 0em; + text-align: center; +} + +.login-ui .login-dialog .buttons { + text-align: right; + margin: 0; + margin-top: 1em; +} + +.login-ui .login-dialog .login-fields { + vertical-align: middle; +} + +.login-ui .login-dialog th { + text-shadow: 1px 1px white; +} + +.login-ui .login-dialog .version { + padding: 0.5em 0; +} + +.login-ui .login-dialog .version .app-name { + font-weight: bold; + text-transform: uppercase; + text-align: center; + font-size: 1.25em; +} + +.login-ui .login-dialog .version .version-number { + + position: absolute; + right: 0; + bottom: 0; + + padding: 0.25em 0.75em; + margin: 0.25em; + + -moz-border-radius: 0.5em; + -webkit-border-radius: 0.5em; + -khtml-border-radius: 0.5em; + border-radius: 0.5em; + + color: white; + background: green; + font-size: 0.5em; + font-style: italic; + opacity: 0.5; + +} + +.login-ui .login-dialog .logo { + display: block; + margin: 0.5em auto; + width: 3em; + height: 3em; + background-size: 3em 3em; + -moz-background-size: 3em 3em; + -webkit-background-size: 3em 3em; + -khtml-background-size: 3em 3em; + background-image: url("images/guac-tricolor.svg"); +} + +.login-ui.continuation .login-dialog { + border-right: none; + border-left: none; + box-shadow: none; + max-width: 6in; +} + +.login-ui.continuation .login-dialog .logo, +.login-ui.continuation .login-dialog .version { + display: none; +} + +.login-ui.error .login-dialog { + animation-name: shake-head; + animation-duration: 0.25s; + animation-timing-function: linear; + -webkit-animation-name: shake-head; + -webkit-animation-duration: 0.25s; + -webkit-animation-timing-function: linear; +} diff --git a/guacamole/src/main/frontend/src/app/login/styles/input.css b/guacamole/src/main/frontend/src/app/login/styles/input.css new file mode 100644 index 0000000..57fa2b4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/styles/input.css @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.login-ui .login-dialog .login-fields input { + display: block; + border: 1px solid rgba(0, 0, 0, 0.25); + -moz-border-radius: 0.2em; + -webkit-border-radius: 0.2em; + -khtml-border-radius: 0.2em; + font-family: Carlito, FreeSans, Helvetica, Arial, sans-serif; + border-radius: 0.2em; + width: 100%; + margin: 0; + margin-bottom: 0.5em; + padding: 0.5em 0.75em; + max-width: none; +} + +.login-ui .login-dialog .buttons input[type="submit"] { + width: 100%; + margin: 0; +} + +.login-ui.continuation .login-dialog .buttons input[type="submit"] { + width: auto; +} + +.login-ui.initial .login-dialog input.continue-login, +.login-ui.continuation .login-dialog input.login { + display: none; +} diff --git a/guacamole/src/main/frontend/src/app/login/styles/login.css b/guacamole/src/main/frontend/src/app/login/styles/login.css new file mode 100644 index 0000000..4cb07f1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/styles/login.css @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +div.login-ui { + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + display: table; + background: white; + z-index: 20; +} + +.login-ui p.login-error { + display: none; +} + +.login-ui.error p.login-error { + display: block; + + position: fixed; + left: 0; + right: 0; + top: 0; + + padding: 1em; + margin: 0.2em; + + background: #FDD; + border: 1px solid #964040; + -moz-border-radius: 0.25em; + -webkit-border-radius: 0.25em; + -khtml-border-radius: 0.25em; + text-align: center; + color: #964040; +} + +.login-ui .login-fields .form-field .password-field .toggle-password { + display: none; +} + +.login-ui .login-fields .labeled-field { + display: block; + position: relative; + z-index: 1; +} + +.login-ui .login-fields .labeled-field .field-header { + + display: block; + position: absolute; + left: 0; + right: 0; + overflow: hidden; + + z-index: -1; + margin: 0.5em; + font-size: 0.9em; + opacity: 0.5; + +} + +.login-ui .login-fields .labeled-field.empty input { + background: transparent; +} + +.login-ui .login-fields .labeled-field input:focus { + background: white; +} diff --git a/guacamole/src/main/frontend/src/app/login/templates/login.html b/guacamole/src/main/frontend/src/app/login/templates/login.html new file mode 100644 index 0000000..9a35416 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/login/templates/login.html @@ -0,0 +1,53 @@ + diff --git a/guacamole/src/main/frontend/src/app/manage/controllers/manageConnectionController.js b/guacamole/src/main/frontend/src/app/manage/controllers/manageConnectionController.js new file mode 100644 index 0000000..5635def --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/controllers/manageConnectionController.js @@ -0,0 +1,355 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for editing or creating connections. + */ +angular.module('manage').controller('manageConnectionController', ['$scope', '$injector', + function manageConnectionController($scope, $injector) { + + // Required types + var Connection = $injector.get('Connection'); + var ConnectionGroup = $injector.get('ConnectionGroup'); + var HistoryEntryWrapper = $injector.get('HistoryEntryWrapper'); + var ManagementPermissions = $injector.get('ManagementPermissions'); + var PermissionSet = $injector.get('PermissionSet'); + var Protocol = $injector.get('Protocol'); + + // Required services + var $location = $injector.get('$location'); + var $q = $injector.get('$q'); + var $routeParams = $injector.get('$routeParams'); + var $translate = $injector.get('$translate'); + var $window = $injector.get('$window'); + var authenticationService = $injector.get('authenticationService'); + var connectionService = $injector.get('connectionService'); + var connectionGroupService = $injector.get('connectionGroupService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var schemaService = $injector.get('schemaService'); + + /** + * The unique identifier of the data source containing the connection being + * edited. + * + * @type String + */ + $scope.selectedDataSource = $routeParams.dataSource; + + /** + * The identifier of the original connection from which this connection is + * being cloned. Only valid if this is a new connection. + * + * @type String + */ + var cloneSourceIdentifier = $location.search().clone; + + /** + * The identifier of the connection being edited. If a new connection is + * being created, this will not be defined. + * + * @type String + */ + var identifier = $routeParams.id; + + /** + * All known protocols. + * + * @type Object. + */ + $scope.protocols = null; + + /** + * The root connection group of the connection group hierarchy. + * + * @type ConnectionGroup + */ + $scope.rootGroup = null; + + /** + * The connection being modified. + * + * @type Connection + */ + $scope.connection = null; + + /** + * The parameter name/value pairs associated with the connection being + * modified. + * + * @type Object. + */ + $scope.parameters = null; + + /** + * The date format for use within the connection history. + * + * @type String + */ + $scope.historyDateFormat = null; + + /** + * The usage history of the connection being modified. + * + * @type HistoryEntryWrapper[] + */ + $scope.historyEntryWrappers = null; + + /** + * The management-related actions that the current user may perform on the + * connection currently being created/modified, or null if the current + * user's permissions have not yet been loaded. + * + * @type ManagementPermissions + */ + $scope.managementPermissions = null; + + /** + * All available connection attributes. This is only the set of attribute + * definitions, organized as logical groupings of attributes, not attribute + * values. + * + * @type Form[] + */ + $scope.attributes = null; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface to be + * useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.protocols !== null + && $scope.rootGroup !== null + && $scope.connection !== null + && $scope.parameters !== null + && $scope.historyDateFormat !== null + && $scope.historyEntryWrappers !== null + && $scope.managementPermissions !== null + && $scope.attributes !== null; + + }; + + /** + * Loads the data associated with the connection having the given + * identifier, preparing the interface for making modifications to that + * existing connection. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connection to + * load. + * + * @param {String} identifier + * The identifier of the connection to load. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * editing the given connection. + */ + var loadExistingConnection = function loadExistingConnection(dataSource, identifier) { + return $q.all({ + connection : connectionService.getConnection(dataSource, identifier), + historyEntries : connectionService.getConnectionHistory(dataSource, identifier), + parameters : connectionService.getConnectionParameters(dataSource, identifier) + }) + .then(function connectionDataRetrieved(values) { + + $scope.connection = values.connection; + $scope.parameters = values.parameters; + + // Wrap all history entries for sake of display + $scope.historyEntryWrappers = []; + angular.forEach(values.historyEntries, function wrapHistoryEntry(historyEntry) { + $scope.historyEntryWrappers.push(new HistoryEntryWrapper(historyEntry)); + }); + + }); + }; + + /** + * Loads the data associated with the connection having the given + * identifier, preparing the interface for cloning that existing + * connection. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connection + * to be cloned. + * + * @param {String} identifier + * The identifier of the connection being cloned. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * cloning the given connection. + */ + var loadClonedConnection = function loadClonedConnection(dataSource, identifier) { + return $q.all({ + connection : connectionService.getConnection(dataSource, identifier), + parameters : connectionService.getConnectionParameters(dataSource, identifier) + }) + .then(function connectionDataRetrieved(values) { + + $scope.connection = values.connection; + $scope.parameters = values.parameters; + + // Clear the identifier field because this connection is new + delete $scope.connection.identifier; + + // Cloned connections have no history + $scope.historyEntryWrappers = []; + + }); + }; + + /** + * Loads skeleton connection data, preparing the interface for creating a + * new connection. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * creating a new connection. + */ + var loadSkeletonConnection = function loadSkeletonConnection() { + + // Use skeleton connection object with no associated permissions, + // history, or parameters + $scope.connection = new Connection({ + protocol : 'vnc', + parentIdentifier : $location.search().parent + }); + $scope.historyEntryWrappers = []; + $scope.parameters = {}; + + return $q.resolve(); + + }; + + /** + * Loads the data required for performing the management task requested + * through the route parameters given at load time, automatically preparing + * the interface for editing an existing connection, cloning an existing + * connection, or creating an entirely new connection. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared + * for performing the requested management task. + */ + var loadRequestedConnection = function loadRequestedConnection() { + + // If we are editing an existing connection, pull its data + if (identifier) + return loadExistingConnection($scope.selectedDataSource, identifier); + + // If we are cloning an existing connection, pull its data instead + if (cloneSourceIdentifier) + return loadClonedConnection($scope.selectedDataSource, cloneSourceIdentifier); + + // If we are creating a new connection, populate skeleton connection data + return loadSkeletonConnection(); + + }; + + // Populate interface with requested data + $q.all({ + connectionData : loadRequestedConnection(), + attributes : schemaService.getConnectionAttributes($scope.selectedDataSource), + permissions : permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername()), + protocols : schemaService.getProtocols($scope.selectedDataSource), + rootGroup : connectionGroupService.getConnectionGroupTree($scope.selectedDataSource, ConnectionGroup.ROOT_IDENTIFIER, [PermissionSet.ObjectPermissionType.ADMINISTER]) + }) + .then(function dataRetrieved(values) { + + $scope.attributes = values.attributes; + $scope.protocols = values.protocols; + $scope.rootGroup = values.rootGroup; + + $scope.managementPermissions = ManagementPermissions.fromPermissionSet( + values.permissions, + PermissionSet.SystemPermissionType.CREATE_CONNECTION, + PermissionSet.hasConnectionPermission, + identifier); + + }, requestService.DIE); + + // Get history date format + $translate('MANAGE_CONNECTION.FORMAT_HISTORY_START').then(function historyDateFormatReceived(historyDateFormat) { + $scope.historyDateFormat = historyDateFormat; + }, angular.noop); + + /** + * @borrows Protocol.getNamespace + */ + $scope.getNamespace = Protocol.getNamespace; + + /** + * @borrows Protocol.getName + */ + $scope.getProtocolName = Protocol.getName; + + /** + * Cancels all pending edits, returning to the main list of connections + * within the selected data source. + */ + $scope.returnToConnectionList = function returnToConnectionList() { + $location.url('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections'); + }; + + /** + * Cancels all pending edits, opening an edit page for a new connection + * which is prepopulated with the data from the connection currently being edited. + */ + $scope.cloneConnection = function cloneConnection() { + $location.path('/manage/' + encodeURIComponent($scope.selectedDataSource) + '/connections').search('clone', identifier); + $window.scrollTo(0,0); + }; + + /** + * Saves the current connection, creating a new connection or updating the + * existing connection, returning a promise which is resolved if the save + * operation succeeds and rejected if the save operation fails. + * + * @returns {Promise} + * A promise which is resolved if the save operation succeeds and is + * rejected with an {@link Error} if the save operation fails. + */ + $scope.saveConnection = function saveConnection() { + + $scope.connection.parameters = $scope.parameters; + + // Save the connection + return connectionService.saveConnection($scope.selectedDataSource, $scope.connection); + + }; + + /** + * Deletes the current connection, returning a promise which is resolved if + * the delete operation succeeds and rejected if the delete operation fails. + * + * @returns {Promise} + * A promise which is resolved if the delete operation succeeds and is + * rejected with an {@link Error} if the delete operation fails. + */ + $scope.deleteConnection = function deleteConnection() { + return connectionService.deleteConnection($scope.selectedDataSource, $scope.connection); + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/controllers/manageConnectionGroupController.js b/guacamole/src/main/frontend/src/app/manage/controllers/manageConnectionGroupController.js new file mode 100644 index 0000000..e0029cb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/controllers/manageConnectionGroupController.js @@ -0,0 +1,296 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for editing or creating connection groups. + */ +angular.module('manage').controller('manageConnectionGroupController', ['$scope', '$injector', + function manageConnectionGroupController($scope, $injector) { + + // Required types + var ConnectionGroup = $injector.get('ConnectionGroup'); + var ManagementPermissions = $injector.get('ManagementPermissions'); + var PermissionSet = $injector.get('PermissionSet'); + + // Required services + var $location = $injector.get('$location'); + var $q = $injector.get('$q'); + var $routeParams = $injector.get('$routeParams'); + var $window = $injector.get('$window'); + var authenticationService = $injector.get('authenticationService'); + var connectionGroupService = $injector.get('connectionGroupService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var schemaService = $injector.get('schemaService'); + + /** + * The unique identifier of the data source containing the connection group + * being edited. + * + * @type String + */ + $scope.selectedDataSource = $routeParams.dataSource; + + /** + * The identifier of the original connection group from which this + * connection group is being cloned. Only valid if this is a new + * connection group. + * + * @type String + */ + var cloneSourceIdentifier = $location.search().clone; + + /** + * The identifier of the connection group being edited. If a new connection + * group is being created, this will not be defined. + * + * @type String + */ + var identifier = $routeParams.id; + + /** + * Available connection group types, as translation string / internal value + * pairs. + * + * @type Object[] + */ + $scope.types = [ + { + label: "MANAGE_CONNECTION_GROUP.NAME_TYPE_ORGANIZATIONAL", + value: ConnectionGroup.Type.ORGANIZATIONAL + }, + { + label: "MANAGE_CONNECTION_GROUP.NAME_TYPE_BALANCING", + value : ConnectionGroup.Type.BALANCING + } + ]; + + /** + * The root connection group of the connection group hierarchy. + * + * @type ConnectionGroup + */ + $scope.rootGroup = null; + + /** + * The connection group being modified. + * + * @type ConnectionGroup + */ + $scope.connectionGroup = null; + + /** + * The management-related actions that the current user may perform on the + * connection group currently being created/modified, or null if the current + * user's permissions have not yet been loaded. + * + * @type ManagementPermissions + */ + $scope.managementPermissions = null; + + /** + * All available connection group attributes. This is only the set of + * attribute definitions, organized as logical groupings of attributes, not + * attribute values. + * + * @type Form[] + */ + $scope.attributes = null; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface to be + * useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.rootGroup !== null + && $scope.connectionGroup !== null + && $scope.managementPermissions !== null + && $scope.attributes !== null; + + }; + + /** + * Loads the data associated with the connection group having the given + * identifier, preparing the interface for making modifications to that + * existing connection group. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connection + * group to load. + * + * @param {String} identifier + * The identifier of the connection group to load. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * editing the given connection group. + */ + var loadExistingConnectionGroup = function loadExistingConnectionGroup(dataSource, identifier) { + return connectionGroupService.getConnectionGroup( + dataSource, + identifier + ) + .then(function connectionGroupReceived(connectionGroup) { + $scope.connectionGroup = connectionGroup; + }); + }; + + /** + * Loads the data associated with the connection group having the given + * identifier, preparing the interface for cloning that existing + * connection group. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connection + * group to be cloned. + * + * @param {String} identifier + * The identifier of the connection group being cloned. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * cloning the given connection group. + */ + var loadClonedConnectionGroup = function loadClonedConnectionGroup(dataSource, identifier) { + return connectionGroupService.getConnectionGroup( + dataSource, + identifier + ) + .then(function connectionGroupReceived(connectionGroup) { + $scope.connectionGroup = connectionGroup; + delete $scope.connectionGroup.identifier; + }); + }; + + /** + * Loads skeleton connection group data, preparing the interface for + * creating a new connection group. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * creating a new connection group. + */ + var loadSkeletonConnectionGroup = function loadSkeletonConnectionGroup() { + + // Use skeleton connection group object with specified parent + $scope.connectionGroup = new ConnectionGroup({ + parentIdentifier : $location.search().parent + }); + + return $q.resolve(); + + }; + + /** + * Loads the data required for performing the management task requested + * through the route parameters given at load time, automatically preparing + * the interface for editing an existing connection group, cloning an + * existing connection group, or creating an entirely new connection group. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared + * for performing the requested management task. + */ + var loadRequestedConnectionGroup = function loadRequestedConnectionGroup() { + + // If we are editing an existing connection group, pull its data + if (identifier) + return loadExistingConnectionGroup($scope.selectedDataSource, identifier); + + // If we are cloning an existing connection group, pull its data + // instead + if (cloneSourceIdentifier) + return loadClonedConnectionGroup($scope.selectedDataSource, cloneSourceIdentifier); + + // If we are creating a new connection group, populate skeleton + // connection group data + return loadSkeletonConnectionGroup(); + + }; + + // Query the user's permissions for the current connection group + $q.all({ + connectionGroupData : loadRequestedConnectionGroup(), + attributes : schemaService.getConnectionGroupAttributes($scope.selectedDataSource), + permissions : permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername()), + rootGroup : connectionGroupService.getConnectionGroupTree($scope.selectedDataSource, ConnectionGroup.ROOT_IDENTIFIER, [PermissionSet.ObjectPermissionType.ADMINISTER]) + }) + .then(function connectionGroupDataRetrieved(values) { + + $scope.attributes = values.attributes; + $scope.rootGroup = values.rootGroup; + + $scope.managementPermissions = ManagementPermissions.fromPermissionSet( + values.permissions, + PermissionSet.SystemPermissionType.CREATE_CONNECTION, + PermissionSet.hasConnectionGroupPermission, + identifier); + + }, requestService.DIE); + + /** + * Cancels all pending edits, returning to the main list of connections + * within the selected data source. + */ + $scope.returnToConnectionList = function returnToConnectionList() { + $location.path('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections'); + }; + + /** + * Cancels all pending edits, opening an edit page for a new connection + * group which is prepopulated with the data from the connection group + * currently being edited. + */ + $scope.cloneConnectionGroup = function cloneConnectionGRoup() { + $location.path('/manage/' + encodeURIComponent($scope.selectedDataSource) + '/connectionGroups').search('clone', identifier); + $window.scrollTo(0,0); + }; + + /** + * Saves the current connection group, creating a new connection group or + * updating the existing connection group, returning a promise which is + * resolved if the save operation succeeds and rejected if the save + * operation fails. + * + * @returns {Promise} + * A promise which is resolved if the save operation succeeds and is + * rejected with an {@link Error} if the save operation fails. + */ + $scope.saveConnectionGroup = function saveConnectionGroup() { + return connectionGroupService.saveConnectionGroup($scope.selectedDataSource, $scope.connectionGroup); + }; + + /** + * Deletes the current connection group, returning a promise which is + * resolved if the delete operation succeeds and rejected if the delete + * operation fails. + * + * @returns {Promise} + * A promise which is resolved if the delete operation succeeds and is + * rejected with an {@link Error} if the delete operation fails. + */ + $scope.deleteConnectionGroup = function deleteConnectionGroup() { + return connectionGroupService.deleteConnectionGroup($scope.selectedDataSource, $scope.connectionGroup); + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/controllers/manageSharingProfileController.js b/guacamole/src/main/frontend/src/app/manage/controllers/manageSharingProfileController.js new file mode 100644 index 0000000..139eaf8 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/controllers/manageSharingProfileController.js @@ -0,0 +1,338 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for editing or creating sharing profiles. + */ +angular.module('manage').controller('manageSharingProfileController', ['$scope', '$injector', + function manageSharingProfileController($scope, $injector) { + + // Required types + var ManagementPermissions = $injector.get('ManagementPermissions'); + var SharingProfile = $injector.get('SharingProfile'); + var PermissionSet = $injector.get('PermissionSet'); + var Protocol = $injector.get('Protocol'); + + // Required services + var $location = $injector.get('$location'); + var $q = $injector.get('$q'); + var $routeParams = $injector.get('$routeParams'); + var $window = $injector.get('$window'); + var authenticationService = $injector.get('authenticationService'); + var connectionService = $injector.get('connectionService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var schemaService = $injector.get('schemaService'); + var sharingProfileService = $injector.get('sharingProfileService'); + + /** + * The unique identifier of the data source containing the sharing profile + * being edited. + * + * @type String + */ + $scope.selectedDataSource = $routeParams.dataSource; + + /** + * The identifier of the original sharing profile from which this sharing + * profile is being cloned. Only valid if this is a new sharing profile. + * + * @type String + */ + var cloneSourceIdentifier = $location.search().clone; + + /** + * The identifier of the sharing profile being edited. If a new sharing + * profile is being created, this will not be defined. + * + * @type String + */ + var identifier = $routeParams.id; + + /** + * Map of protocol name to corresponding Protocol object. + * + * @type Object. + */ + $scope.protocols = null; + + /** + * The sharing profile being modified. + * + * @type SharingProfile + */ + $scope.sharingProfile = null; + + /** + * The parameter name/value pairs associated with the sharing profile being + * modified. + * + * @type Object. + */ + $scope.parameters = null; + + /** + * The management-related actions that the current user may perform on the + * sharing profile currently being created/modified, or null if the current + * user's permissions have not yet been loaded. + * + * @type ManagementPermissions + */ + $scope.managementPermissions = null; + + /** + * All available sharing profile attributes. This is only the set of + * attribute definitions, organized as logical groupings of attributes, not + * attribute values. + * + * @type Form[] + */ + $scope.attributes = null; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface to be + * useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.protocols !== null + && $scope.sharingProfile !== null + && $scope.primaryConnection !== null + && $scope.parameters !== null + && $scope.managementPermissions !== null + && $scope.attributes !== null; + + }; + + /** + * Loads the data associated with the sharing profile having the given + * identifier, preparing the interface for making modifications to that + * existing sharing profile. + * + * @param {String} dataSource + * The unique identifier of the data source containing the sharing + * profile to load. + * + * @param {String} identifier + * The identifier of the sharing profile to load. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * editing the given sharing profile. + */ + var loadExistingSharingProfile = function loadExistingSharingProfile(dataSource, identifier) { + return $q.all({ + sharingProfile : sharingProfileService.getSharingProfile(dataSource, identifier), + parameters : sharingProfileService.getSharingProfileParameters(dataSource, identifier) + }) + .then(function sharingProfileDataRetrieved(values) { + + $scope.sharingProfile = values.sharingProfile; + $scope.parameters = values.parameters; + + // Load connection object for associated primary connection + return connectionService.getConnection( + dataSource, + values.sharingProfile.primaryConnectionIdentifier + ) + .then(function connectionRetrieved(connection) { + $scope.primaryConnection = connection; + }); + + }); + }; + + /** + * Loads the data associated with the sharing profile having the given + * identifier, preparing the interface for cloning that existing + * sharing profile. + * + * @param {String} dataSource + * The unique identifier of the data source containing the sharing + * profile to be cloned. + * + * @param {String} identifier + * The identifier of the sharing profile being cloned. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * cloning the given sharing profile. + */ + var loadClonedSharingProfile = function loadClonedSharingProfile(dataSource, identifier) { + return $q.all({ + sharingProfile : sharingProfileService.getSharingProfile(dataSource, identifier), + parameters : sharingProfileService.getSharingProfileParameters(dataSource, identifier) + }) + .then(function sharingProfileDataRetrieved(values) { + + $scope.sharingProfile = values.sharingProfile; + $scope.parameters = values.parameters; + + // Clear the identifier field because this sharing profile is new + delete $scope.sharingProfile.identifier; + + // Load connection object for associated primary connection + return connectionService.getConnection( + dataSource, + values.sharingProfile.primaryConnectionIdentifier + ) + .then(function connectionRetrieved(connection) { + $scope.primaryConnection = connection; + }); + + }); + }; + + /** + * Loads skeleton sharing profile data, preparing the interface for + * creating a new sharing profile. + * + * @param {String} dataSource + * The unique identifier of the data source containing the sharing + * profile to be created. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * creating a new sharing profile. + */ + var loadSkeletonSharingProfile = function loadSkeletonSharingProfile(dataSource) { + + // Use skeleton sharing profile object with no associated parameters + $scope.sharingProfile = new SharingProfile({ + primaryConnectionIdentifier : $location.search().parent + }); + $scope.parameters = {}; + + // Load connection object for associated primary connection + return connectionService.getConnection( + dataSource, + $scope.sharingProfile.primaryConnectionIdentifier + ) + .then(function connectionRetrieved(connection) { + $scope.primaryConnection = connection; + }); + + }; + + /** + * Loads the data required for performing the management task requested + * through the route parameters given at load time, automatically preparing + * the interface for editing an existing sharing profile, cloning an + * existing sharing profile, or creating an entirely new sharing profile. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared + * for performing the requested management task. + */ + var loadRequestedSharingProfile = function loadRequestedSharingProfile() { + + // If we are editing an existing sharing profile, pull its data + if (identifier) + return loadExistingSharingProfile($scope.selectedDataSource, identifier); + + // If we are cloning an existing sharing profile, pull its data instead + if (cloneSourceIdentifier) + return loadClonedSharingProfile($scope.selectedDataSource, cloneSourceIdentifier); + + // If we are creating a new sharing profile, populate skeleton sharing + // profile data + return loadSkeletonSharingProfile($scope.selectedDataSource); + + }; + + + // Query the user's permissions for the current sharing profile + $q.all({ + sharingProfileData : loadRequestedSharingProfile(), + attributes : schemaService.getSharingProfileAttributes($scope.selectedDataSource), + protocols : schemaService.getProtocols($scope.selectedDataSource), + permissions : permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername()) + }) + .then(function sharingProfileDataRetrieved(values) { + + $scope.attributes = values.attributes; + $scope.protocols = values.protocols; + + $scope.managementPermissions = ManagementPermissions.fromPermissionSet( + values.permissions, + PermissionSet.SystemPermissionType.CREATE_CONNECTION, + PermissionSet.hasConnectionPermission, + identifier); + + }, requestService.DIE); + + /** + * @borrows Protocol.getNamespace + */ + $scope.getNamespace = Protocol.getNamespace; + + /** + * Cancels all pending edits, returning to the main list of connections + * within the selected data source. + */ + $scope.returnToConnectionList = function returnToConnectionList() { + $location.url('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections'); + }; + + /** + * Cancels all pending edits, opening an edit page for a new sharing profile + * which is prepopulated with the data from the sharing profile currently + * being edited. + */ + $scope.cloneSharingProfile = function cloneSharingProfile() { + $location.path('/manage/' + encodeURIComponent($scope.selectedDataSource) + '/sharingProfiles').search('clone', identifier); + $window.scrollTo(0,0); + }; + + /** + * Saves the current sharing profile, creating a new sharing profile or + * updating the existing sharing profile, returning a promise which is + * resolved if the save operation succeeds and rejected if the save + * operation fails. + * + * @returns {Promise} + * A promise which is resolved if the save operation succeeds and is + * rejected with an {@link Error} if the save operation fails. + */ + $scope.saveSharingProfile = function saveSharingProfile() { + + $scope.sharingProfile.parameters = $scope.parameters; + + // Save the sharing profile + return sharingProfileService.saveSharingProfile($scope.selectedDataSource, $scope.sharingProfile); + + }; + + /** + * Deletes the current sharing profile, returning a promise which is + * resolved if the delete operation succeeds and rejected if the delete + * operation fails. + * + * @returns {Promise} + * A promise which is resolved if the delete operation succeeds and is + * rejected with an {@link Error} if the delete operation fails. + */ + $scope.deleteSharingProfile = function deleteSharingProfile() { + return sharingProfileService.deleteSharingProfile($scope.selectedDataSource, $scope.sharingProfile); + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/controllers/manageUserController.js b/guacamole/src/main/frontend/src/app/manage/controllers/manageUserController.js new file mode 100644 index 0000000..d1bbbb5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/controllers/manageUserController.js @@ -0,0 +1,506 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for editing users. + */ +angular.module('manage').controller('manageUserController', ['$scope', '$injector', + function manageUserController($scope, $injector) { + + // Required types + var Error = $injector.get('Error'); + var ManagementPermissions = $injector.get('ManagementPermissions'); + var PermissionFlagSet = $injector.get('PermissionFlagSet'); + var PermissionSet = $injector.get('PermissionSet'); + var User = $injector.get('User'); + + // Required services + var $location = $injector.get('$location'); + var $routeParams = $injector.get('$routeParams'); + var $q = $injector.get('$q'); + var $window = $injector.get('$window'); + var authenticationService = $injector.get('authenticationService'); + var dataSourceService = $injector.get('dataSourceService'); + var membershipService = $injector.get('membershipService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var schemaService = $injector.get('schemaService'); + var userGroupService = $injector.get('userGroupService'); + var userService = $injector.get('userService'); + + /** + * The identifiers of all data sources currently available to the + * authenticated user. + * + * @type String[] + */ + var dataSources = authenticationService.getAvailableDataSources(); + + /** + * The username of the current, authenticated user. + * + * @type String + */ + var currentUsername = authenticationService.getCurrentUsername(); + + /** + * The username of the original user from which this user is + * being cloned. Only valid if this is a new user. + * + * @type String + */ + var cloneSourceUsername = $location.search().clone; + + /** + * The username of the user being edited. If a new user is + * being created, this will not be defined. + * + * @type String + */ + var username = $routeParams.id; + + /** + * The unique identifier of the data source containing the user being + * edited. + * + * @type String + */ + $scope.dataSource = $routeParams.dataSource; + + /** + * The string value representing the user currently being edited within the + * permission flag set. Note that his may not match the user's actual + * username - it is a marker that is (1) guaranteed to be associated with + * the current user's permissions in the permission set and (2) guaranteed + * not to collide with any user that does not represent the current user + * within the permission set. + * + * @type String + */ + $scope.selfUsername = ''; + + /** + * All user accounts associated with the same username as the account being + * created or edited, as a map of data source identifier to the User object + * within that data source. + * + * @type Object. + */ + $scope.users = null; + + /** + * The user being modified. + * + * @type User + */ + $scope.user = null; + + /** + * All permissions associated with the user being modified. + * + * @type PermissionFlagSet + */ + $scope.permissionFlags = null; + + /** + * The set of permissions that will be added to the user when the user is + * saved. Permissions will only be present in this set if they are + * manually added, and not later manually removed before saving. + * + * @type PermissionSet + */ + $scope.permissionsAdded = new PermissionSet(); + + /** + * The set of permissions that will be removed from the user when the user + * is saved. Permissions will only be present in this set if they are + * manually removed, and not later manually added before saving. + * + * @type PermissionSet + */ + $scope.permissionsRemoved = new PermissionSet(); + + /** + * The identifiers of all user groups which can be manipulated (all groups + * for which the user accessing this interface has UPDATE permission), + * either through adding the current user as a member or removing the + * current user from that group. If this information has not yet been + * retrieved, this will be null. + * + * @type String[] + */ + $scope.availableGroups = null; + + /** + * The identifiers of all user groups of which the user is a member, + * taking into account any user groups which will be added/removed when + * saved. If this information has not yet been retrieved, this will be + * null. + * + * @type String[] + */ + $scope.parentGroups = null; + + /** + * The set of identifiers of all parent user groups to which the user will + * be added when saved. Parent groups will only be present in this set if + * they are manually added, and not later manually removed before saving. + * + * @type String[] + */ + $scope.parentGroupsAdded = []; + + /** + * The set of identifiers of all parent user groups from which the user + * will be removed when saved. Parent groups will only be present in this + * set if they are manually removed, and not later manually added before + * saving. + * + * @type String[] + */ + $scope.parentGroupsRemoved = []; + + /** + * For each applicable data source, the management-related actions that the + * current user may perform on the user account currently being created + * or modified, as a map of data source identifier to the + * {@link ManagementPermissions} object describing the actions available + * within that data source, or null if the current user's permissions have + * not yet been loaded. + * + * @type Object. + */ + $scope.managementPermissions = null; + + /** + * All available user attributes. This is only the set of attribute + * definitions, organized as logical groupings of attributes, not attribute + * values. + * + * @type Form[] + */ + $scope.attributes = null; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface to be + * useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.users !== null + && $scope.permissionFlags !== null + && $scope.managementPermissions !== null + && $scope.availableGroups !== null + && $scope.parentGroups !== null + && $scope.attributes !== null; + + }; + + /** + * Returns whether the current user can edit the username of the user being + * edited within the given data source. + * + * @param {String} [dataSource] + * The identifier of the data source to check. If omitted, this will + * default to the currently-selected data source. + * + * @returns {Boolean} + * true if the current user can edit the username of the user being + * edited, false otherwise. + */ + $scope.canEditUsername = function canEditUsername(dataSource) { + return !username; + }; + + /** + * Loads the data associated with the user having the given username, + * preparing the interface for making modifications to that existing user. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user to + * load. + * + * @param {String} username + * The username of the user to load. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * editing the given user. + */ + var loadExistingUser = function loadExistingUser(dataSource, username) { + return $q.all({ + users : dataSourceService.apply(userService.getUser, dataSources, username), + + // Use empty permission set if user cannot be found + permissions: + permissionService.getPermissions(dataSource, username) + ['catch'](requestService.defaultValue(new PermissionSet())), + + // Assume no parent groups if user cannot be found + parentGroups: + membershipService.getUserGroups(dataSource, username) + ['catch'](requestService.defaultValue([])) + + }) + .then(function userDataRetrieved(values) { + + $scope.users = values.users; + $scope.parentGroups = values.parentGroups; + + // Create skeleton user if user does not exist + $scope.user = values.users[dataSource] || new User({ + 'username' : username + }); + + // The current user will be associated with username of the existing + // user in the retrieved permission set + $scope.selfUsername = username; + $scope.permissionFlags = PermissionFlagSet.fromPermissionSet(values.permissions); + + }); + }; + + /** + * Loads the data associated with the user having the given username, + * preparing the interface for cloning that existing user. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user to + * be cloned. + * + * @param {String} username + * The username of the user being cloned. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * cloning the given user. + */ + var loadClonedUser = function loadClonedUser(dataSource, username) { + return $q.all({ + users : dataSourceService.apply(userService.getUser, [dataSource], username), + permissions : permissionService.getPermissions(dataSource, username), + parentGroups : membershipService.getUserGroups(dataSource, username) + }) + .then(function userDataRetrieved(values) { + + $scope.users = {}; + $scope.user = values.users[dataSource]; + $scope.parentGroups = values.parentGroups; + $scope.parentGroupsAdded = values.parentGroups; + + // The current user will be associated with cloneSourceUsername in the + // retrieved permission set + $scope.selfUsername = username; + $scope.permissionFlags = PermissionFlagSet.fromPermissionSet(values.permissions); + $scope.permissionsAdded = values.permissions; + + }); + }; + + /** + * Loads skeleton user data, preparing the interface for creating a new + * user. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * creating a new user. + */ + var loadSkeletonUser = function loadSkeletonUser() { + + // No users exist regardless of data source if there is no username + $scope.users = {}; + + // Use skeleton user object with no associated permissions + $scope.user = new User(); + $scope.parentGroups = []; + $scope.permissionFlags = new PermissionFlagSet(); + + // As no permissions are yet associated with the user, it is safe to + // use any non-empty username as a placeholder for self-referential + // permissions + $scope.selfUsername = 'SELF'; + + return $q.resolve(); + + }; + + /** + * Loads the data required for performing the management task requested + * through the route parameters given at load time, automatically preparing + * the interface for editing an existing user, cloning an existing user, or + * creating an entirely new user. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared + * for performing the requested management task. + */ + var loadRequestedUser = function loadRequestedUser() { + + // Pull user data and permissions if we are editing an existing user + if (username) + return loadExistingUser($scope.dataSource, username); + + // If we are cloning an existing user, pull his/her data instead + if (cloneSourceUsername) + return loadClonedUser($scope.dataSource, cloneSourceUsername); + + // If we are creating a new user, populate skeleton user data + return loadSkeletonUser(); + + }; + + // Populate interface with requested data + $q.all({ + userData : loadRequestedUser(), + permissions : dataSourceService.apply(permissionService.getEffectivePermissions, dataSources, currentUsername), + userGroups : userGroupService.getUserGroups($scope.dataSource, [ PermissionSet.ObjectPermissionType.UPDATE ]), + attributes : schemaService.getUserAttributes($scope.dataSource) + }) + .then(function dataReceived(values) { + + $scope.attributes = values.attributes; + + $scope.managementPermissions = {}; + angular.forEach(dataSources, function addAccountPage(dataSource) { + + // Determine whether data source contains this user + var exists = (dataSource in $scope.users); + + // Add the identifiers of all modifiable user groups + $scope.availableGroups = []; + angular.forEach(values.userGroups, function addUserGroupIdentifier(userGroup) { + $scope.availableGroups.push(userGroup.identifier); + }); + + // Calculate management actions available for this specific account + $scope.managementPermissions[dataSource] = ManagementPermissions.fromPermissionSet( + values.permissions[dataSource], + PermissionSet.SystemPermissionType.CREATE_USER, + PermissionSet.hasUserPermission, + exists ? username : null); + + }); + + }, requestService.DIE); + + /** + * Returns the URL for the page which manages the user account currently + * being edited under the given data source. The given data source need not + * be the same as the data source currently selected. + * + * @param {String} dataSource + * The unique identifier of the data source that the URL is being + * generated for. + * + * @returns {String} + * The URL for the page which manages the user account currently being + * edited under the given data source. + */ + $scope.getUserURL = function getUserURL(dataSource) { + return '/manage/' + encodeURIComponent(dataSource) + '/users/' + encodeURIComponent(username || ''); + }; + + /** + * Cancels all pending edits, returning to the main list of users. + */ + $scope.returnToUserList = function returnToUserList() { + $location.url('/settings/users'); + }; + + /** + * Cancels all pending edits, opening an edit page for a new user + * which is prepopulated with the data from the user currently being edited. + */ + $scope.cloneUser = function cloneUser() { + $location.path('/manage/' + encodeURIComponent($scope.dataSource) + '/users').search('clone', username); + $window.scrollTo(0,0); + }; + + /** + * Saves the current user, creating a new user or updating the existing + * user depending on context, returning a promise which is resolved if the + * save operation succeeds and rejected if the save operation fails. + * + * @returns {Promise} + * A promise which is resolved if the save operation succeeds and is + * rejected with an {@link Error} if the save operation fails. + */ + $scope.saveUser = function saveUser() { + + // Verify passwords match + if ($scope.passwordMatch !== $scope.user.password) { + return $q.reject(new Error({ + translatableMessage : { + key : 'MANAGE_USER.ERROR_PASSWORD_MISMATCH' + } + })); + } + + // Save or create the user, depending on whether the user exists + var saveUserPromise; + if ($scope.dataSource in $scope.users) + saveUserPromise = userService.saveUser($scope.dataSource, $scope.user); + else + saveUserPromise = userService.createUser($scope.dataSource, $scope.user); + + return saveUserPromise.then(function savedUser() { + + // Move permission flags if username differs from marker + if ($scope.selfUsername !== $scope.user.username) { + + // Rename added permission + if ($scope.permissionsAdded.userPermissions[$scope.selfUsername]) { + $scope.permissionsAdded.userPermissions[$scope.user.username] = $scope.permissionsAdded.userPermissions[$scope.selfUsername]; + delete $scope.permissionsAdded.userPermissions[$scope.selfUsername]; + } + + // Rename removed permission + if ($scope.permissionsRemoved.userPermissions[$scope.selfUsername]) { + $scope.permissionsRemoved.userPermissions[$scope.user.username] = $scope.permissionsRemoved.userPermissions[$scope.selfUsername]; + delete $scope.permissionsRemoved.userPermissions[$scope.selfUsername]; + } + + } + + // Upon success, save any changed permissions/groups + return $q.all([ + permissionService.patchPermissions($scope.dataSource, $scope.user.username, $scope.permissionsAdded, $scope.permissionsRemoved), + membershipService.patchUserGroups($scope.dataSource, $scope.user.username, $scope.parentGroupsAdded, $scope.parentGroupsRemoved) + ]); + + }); + + }; + + /** + * Deletes the current user, returning a promise which is resolved if the + * delete operation succeeds and rejected if the delete operation fails. + * + * @returns {Promise} + * A promise which is resolved if the delete operation succeeds and is + * rejected with an {@link Error} if the delete operation fails. + */ + $scope.deleteUser = function deleteUser() { + return userService.deleteUser($scope.dataSource, $scope.user); + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/controllers/manageUserGroupController.js b/guacamole/src/main/frontend/src/app/manage/controllers/manageUserGroupController.js new file mode 100644 index 0000000..b58fe28 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/controllers/manageUserGroupController.js @@ -0,0 +1,555 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for editing user groups. + */ +angular.module('manage').controller('manageUserGroupController', ['$scope', '$injector', + function manageUserGroupController($scope, $injector) { + + // Required types + var ManagementPermissions = $injector.get('ManagementPermissions'); + var PermissionFlagSet = $injector.get('PermissionFlagSet'); + var PermissionSet = $injector.get('PermissionSet'); + var UserGroup = $injector.get('UserGroup'); + + // Required services + var $location = $injector.get('$location'); + var $routeParams = $injector.get('$routeParams'); + var $q = $injector.get('$q'); + var $window = $injector.get('$window'); + var authenticationService = $injector.get('authenticationService'); + var dataSourceService = $injector.get('dataSourceService'); + var membershipService = $injector.get('membershipService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var schemaService = $injector.get('schemaService'); + var userGroupService = $injector.get('userGroupService'); + var userService = $injector.get('userService'); + + /** + * The identifiers of all data sources currently available to the + * authenticated user. + * + * @type String[] + */ + var dataSources = authenticationService.getAvailableDataSources(); + + /** + * The username of the current, authenticated user. + * + * @type String + */ + var currentUsername = authenticationService.getCurrentUsername(); + + /** + * The identifier of the original user group from which this user group is + * being cloned. Only valid if this is a new user group. + * + * @type String + */ + var cloneSourceIdentifier = $location.search().clone; + + /** + * The identifier of the user group being edited. If a new user group is + * being created, this will not be defined. + * + * @type String + */ + var identifier = $routeParams.id; + + /** + * The unique identifier of the data source containing the user group being + * edited. + * + * @type String + */ + $scope.dataSource = $routeParams.dataSource; + + /** + * All user groups associated with the same identifier as the group being + * created or edited, as a map of data source identifier to the UserGroup + * object within that data source. + * + * @type Object. + */ + $scope.userGroups = null; + + /** + * The user group being modified. + * + * @type UserGroup + */ + $scope.userGroup = null; + + /** + * All permissions associated with the user group being modified. + * + * @type PermissionFlagSet + */ + $scope.permissionFlags = null; + + /** + * The set of permissions that will be added to the user group when the + * user group is saved. Permissions will only be present in this set if they + * are manually added, and not later manually removed before saving. + * + * @type PermissionSet + */ + $scope.permissionsAdded = new PermissionSet(); + + /** + * The set of permissions that will be removed from the user group when the + * user group is saved. Permissions will only be present in this set if they + * are manually removed, and not later manually added before saving. + * + * @type PermissionSet + */ + $scope.permissionsRemoved = new PermissionSet(); + + /** + * The identifiers of all user groups which can be manipulated (all groups + * for which the user accessing this interface has UPDATE permission), + * whether that means changing the members of those groups or changing the + * groups of which those groups are members. If this information has not + * yet been retrieved, this will be null. + * + * @type String[] + */ + $scope.availableGroups = null; + + /** + * The identifiers of all users which can be manipulated (all users for + * which the user accessing this interface has UPDATE permission), either + * through adding those users as a member of the current group or removing + * those users from the current group. If this information has not yet been + * retrieved, this will be null. + * + * @type String[] + */ + $scope.availableUsers = null; + + /** + * The identifiers of all user groups of which this group is a member, + * taking into account any user groups which will be added/removed when + * saved. If this information has not yet been retrieved, this will be + * null. + * + * @type String[] + */ + $scope.parentGroups = null; + + /** + * The set of identifiers of all parent user groups to which this group + * will be added when saved. Parent groups will only be present in this set + * if they are manually added, and not later manually removed before + * saving. + * + * @type String[] + */ + $scope.parentGroupsAdded = []; + + /** + * The set of identifiers of all parent user groups from which this group + * will be removed when saved. Parent groups will only be present in this + * set if they are manually removed, and not later manually added before + * saving. + * + * @type String[] + */ + $scope.parentGroupsRemoved = []; + + /** + * The identifiers of all user groups which are members of this group, + * taking into account any user groups which will be added/removed when + * saved. If this information has not yet been retrieved, this will be + * null. + * + * @type String[] + */ + $scope.memberGroups = null; + + /** + * The set of identifiers of all member user groups which will be added to + * this group when saved. Member groups will only be present in this set if + * they are manually added, and not later manually removed before saving. + * + * @type String[] + */ + $scope.memberGroupsAdded = []; + + /** + * The set of identifiers of all member user groups which will be removed + * from this group when saved. Member groups will only be present in this + * set if they are manually removed, and not later manually added before + * saving. + * + * @type String[] + */ + $scope.memberGroupsRemoved = []; + + /** + * The identifiers of all users which are members of this group, taking + * into account any users which will be added/removed when saved. If this + * information has not yet been retrieved, this will be null. + * + * @type String[] + */ + $scope.memberUsers = null; + + /** + * The set of identifiers of all member users which will be added to this + * group when saved. Member users will only be present in this set if they + * are manually added, and not later manually removed before saving. + * + * @type String[] + */ + $scope.memberUsersAdded = []; + + /** + * The set of identifiers of all member users which will be removed from + * this group when saved. Member users will only be present in this set if + * they are manually removed, and not later manually added before saving. + * + * @type String[] + */ + $scope.memberUsersRemoved = []; + + /** + * For each applicable data source, the management-related actions that the + * current user may perform on the user group currently being created + * or modified, as a map of data source identifier to the + * {@link ManagementPermissions} object describing the actions available + * within that data source, or null if the current user's permissions have + * not yet been loaded. + * + * @type Object. + */ + $scope.managementPermissions = null; + + /** + * All available user group attributes. This is only the set of attribute + * definitions, organized as logical groupings of attributes, not attribute + * values. + * + * @type Form[] + */ + $scope.attributes = null; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user group interface to + * be useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.userGroups !== null + && $scope.permissionFlags !== null + && $scope.managementPermissions !== null + && $scope.availableGroups !== null + && $scope.availableUsers !== null + && $scope.parentGroups !== null + && $scope.memberGroups !== null + && $scope.memberUsers !== null + && $scope.attributes !== null; + + }; + + /** + * Returns whether the current user can edit the identifier of the user + * group being edited. + * + * @returns {Boolean} + * true if the current user can edit the identifier of the user group + * being edited, false otherwise. + */ + $scope.canEditIdentifier = function canEditIdentifier() { + return !identifier; + }; + + /** + * Loads the data associated with the user group having the given + * identifier, preparing the interface for making modifications to that + * existing user group. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group + * to load. + * + * @param {String} identifier + * The unique identifier of the user group to load. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * editing the given user group. + */ + var loadExistingUserGroup = function loadExistingGroup(dataSource, identifier) { + return $q.all({ + userGroups : dataSourceService.apply(userGroupService.getUserGroup, dataSources, identifier), + + // Use empty permission set if group cannot be found + permissions: + permissionService.getPermissions(dataSource, identifier, true) + ['catch'](requestService.defaultValue(new PermissionSet())), + + // Assume no parent groups if group cannot be found + parentGroups: + membershipService.getUserGroups(dataSource, identifier, true) + ['catch'](requestService.defaultValue([])), + + // Assume no member groups if group cannot be found + memberGroups: + membershipService.getMemberUserGroups(dataSource, identifier) + ['catch'](requestService.defaultValue([])), + + // Assume no member users if group cannot be found + memberUsers: + membershipService.getMemberUsers(dataSource, identifier) + ['catch'](requestService.defaultValue([])) + + }) + .then(function userGroupDataRetrieved(values) { + + $scope.userGroups = values.userGroups; + $scope.parentGroups = values.parentGroups; + $scope.memberGroups = values.memberGroups; + $scope.memberUsers = values.memberUsers; + + // Create skeleton user group if user group does not exist + $scope.userGroup = values.userGroups[dataSource] || new UserGroup({ + 'identifier' : identifier + }); + + $scope.permissionFlags = PermissionFlagSet.fromPermissionSet(values.permissions); + + }); + }; + + /** + * Loads the data associated with the user group having the given + * identifier, preparing the interface for cloning that existing user + * group. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group to + * be cloned. + * + * @param {String} identifier + * The unique identifier of the user group being cloned. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * cloning the given user group. + */ + var loadClonedUserGroup = function loadClonedUserGroup(dataSource, identifier) { + return $q.all({ + userGroups : dataSourceService.apply(userGroupService.getUserGroup, [dataSource], identifier), + permissions : permissionService.getPermissions(dataSource, identifier, true), + parentGroups : membershipService.getUserGroups(dataSource, identifier, true), + memberGroups : membershipService.getMemberUserGroups(dataSource, identifier), + memberUsers : membershipService.getMemberUsers(dataSource, identifier) + }) + .then(function userGroupDataRetrieved(values) { + + $scope.userGroups = {}; + $scope.userGroup = values.userGroups[dataSource]; + $scope.parentGroups = values.parentGroups; + $scope.parentGroupsAdded = values.parentGroups; + $scope.memberGroups = values.memberGroups; + $scope.memberGroupsAdded = values.memberGroups; + $scope.memberUsers = values.memberUsers; + $scope.memberUsersAdded = values.memberUsers; + + $scope.permissionFlags = PermissionFlagSet.fromPermissionSet(values.permissions); + $scope.permissionsAdded = values.permissions; + + }); + }; + + /** + * Loads skeleton user group data, preparing the interface for creating a + * new user group. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared for + * creating a new user group. + */ + var loadSkeletonUserGroup = function loadSkeletonUserGroup() { + + // No user groups exist regardless of data source if the user group is + // being created + $scope.userGroups = {}; + + // Use skeleton user group object with no associated permissions + $scope.userGroup = new UserGroup(); + $scope.parentGroups = []; + $scope.memberGroups = []; + $scope.memberUsers = []; + $scope.permissionFlags = new PermissionFlagSet(); + + return $q.resolve(); + + }; + + /** + * Loads the data required for performing the management task requested + * through the route parameters given at load time, automatically preparing + * the interface for editing an existing user group, cloning an existing + * user group, or creating an entirely new user group. + * + * @returns {Promise} + * A promise which is resolved when the interface has been prepared + * for performing the requested management task. + */ + var loadRequestedUserGroup = function loadRequestedUserGroup() { + + // Pull user group data and permissions if we are editing an existing + // user group + if (identifier) + return loadExistingUserGroup($scope.dataSource, identifier); + + // If we are cloning an existing user group, pull its data instead + if (cloneSourceIdentifier) + return loadClonedUserGroup($scope.dataSource, cloneSourceIdentifier); + + // If we are creating a new user group, populate skeleton user group data + return loadSkeletonUserGroup(); + + }; + + // Populate interface with requested data + $q.all({ + userGroupData : loadRequestedUserGroup(), + permissions : dataSourceService.apply(permissionService.getEffectivePermissions, dataSources, currentUsername), + userGroups : userGroupService.getUserGroups($scope.dataSource, [ PermissionSet.ObjectPermissionType.UPDATE ]), + users : userService.getUsers($scope.dataSource, [ PermissionSet.ObjectPermissionType.UPDATE ]), + attributes : schemaService.getUserGroupAttributes($scope.dataSource) + }) + .then(function dataReceived(values) { + + $scope.attributes = values.attributes; + + $scope.managementPermissions = {}; + angular.forEach(dataSources, function deriveManagementPermissions(dataSource) { + + // Determine whether data source contains this user group + var exists = (dataSource in $scope.userGroups); + + // Add the identifiers of all modifiable user groups + $scope.availableGroups = []; + angular.forEach(values.userGroups, function addUserGroupIdentifier(userGroup) { + $scope.availableGroups.push(userGroup.identifier); + }); + + // Add the identifiers of all modifiable users + $scope.availableUsers = []; + angular.forEach(values.users, function addUserIdentifier(user) { + $scope.availableUsers.push(user.username); + }); + + // Calculate management actions available for this specific group + $scope.managementPermissions[dataSource] = ManagementPermissions.fromPermissionSet( + values.permissions[dataSource], + PermissionSet.SystemPermissionType.CREATE_USER_GROUP, + PermissionSet.hasUserGroupPermission, + exists ? identifier : null); + + }); + + }, requestService.WARN); + + /** + * Returns the URL for the page which manages the user group currently + * being edited under the given data source. The given data source need not + * be the same as the data source currently selected. + * + * @param {String} dataSource + * The unique identifier of the data source that the URL is being + * generated for. + * + * @returns {String} + * The URL for the page which manages the user group currently being + * edited under the given data source. + */ + $scope.getUserGroupURL = function getUserGroupURL(dataSource) { + return '/manage/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(identifier || ''); + }; + + /** + * Cancels all pending edits, returning to the main list of user groups. + */ + $scope.returnToUserGroupList = function returnToUserGroupList() { + $location.url('/settings/userGroups'); + }; + + /** + * Cancels all pending edits, opening an edit page for a new user group + * which is prepopulated with the data from the user currently being edited. + */ + $scope.cloneUserGroup = function cloneUserGroup() { + $location.path('/manage/' + encodeURIComponent($scope.dataSource) + '/userGroups').search('clone', identifier); + $window.scrollTo(0,0); + }; + + /** + * Saves the current user group, creating a new user group or updating the + * existing user group depending on context, returning a promise which is + * resolved if the save operation succeeds and rejected if the save + * operation fails. + * + * @returns {Promise} + * A promise which is resolved if the save operation succeeds and is + * rejected with an {@link Error} if the save operation fails. + */ + $scope.saveUserGroup = function saveUserGroup() { + + // Save or create the user group, depending on whether the user group exists + var saveUserGroupPromise; + if ($scope.dataSource in $scope.userGroups) + saveUserGroupPromise = userGroupService.saveUserGroup($scope.dataSource, $scope.userGroup); + else + saveUserGroupPromise = userGroupService.createUserGroup($scope.dataSource, $scope.userGroup); + + return saveUserGroupPromise.then(function savedUserGroup() { + return $q.all([ + permissionService.patchPermissions($scope.dataSource, $scope.userGroup.identifier, $scope.permissionsAdded, $scope.permissionsRemoved, true), + membershipService.patchUserGroups($scope.dataSource, $scope.userGroup.identifier, $scope.parentGroupsAdded, $scope.parentGroupsRemoved, true), + membershipService.patchMemberUserGroups($scope.dataSource, $scope.userGroup.identifier, $scope.memberGroupsAdded, $scope.memberGroupsRemoved), + membershipService.patchMemberUsers($scope.dataSource, $scope.userGroup.identifier, $scope.memberUsersAdded, $scope.memberUsersRemoved) + ]); + }); + + }; + + /** + * Deletes the current user group, returning a promise which is resolved if + * the delete operation succeeds and rejected if the delete operation + * fails. + * + * @returns {Promise} + * A promise which is resolved if the delete operation succeeds and is + * rejected with an {@link Error} if the delete operation fails. + */ + $scope.deleteUserGroup = function deleteUserGroup() { + return userGroupService.deleteUserGroup($scope.dataSource, $scope.userGroup); + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/directives/connectionPermissionEditor.js b/guacamole/src/main/frontend/src/app/manage/directives/connectionPermissionEditor.js new file mode 100644 index 0000000..9392bb0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/directives/connectionPermissionEditor.js @@ -0,0 +1,557 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for manipulating the connection permissions granted within a + * given {@link PermissionFlagSet}, tracking the specific permissions added or + * removed within a separate pair of {@link PermissionSet} objects. + */ +angular.module('manage').directive('connectionPermissionEditor', ['$injector', + function connectionPermissionEditor($injector) { + + // Required types + var ConnectionGroup = $injector.get('ConnectionGroup'); + var GroupListItem = $injector.get('GroupListItem'); + var PermissionSet = $injector.get('PermissionSet'); + + // Required services + var connectionGroupService = $injector.get('connectionGroupService'); + var dataSourceService = $injector.get('dataSourceService'); + var requestService = $injector.get('requestService'); + + var directive = { + + // Element only + restrict: 'E', + replace: true, + + scope: { + + /** + * The unique identifier of the data source associated with the + * permissions being manipulated. + * + * @type String + */ + dataSource : '=', + + /** + * The current state of the permissions being manipulated. This + * {@link PemissionFlagSet} will be modified as changes are made + * through this permission editor. + * + * @type PermissionFlagSet + */ + permissionFlags : '=', + + /** + * The set of permissions that have been added, relative to the + * initial state of the permissions being manipulated. + * + * @type PermissionSet + */ + permissionsAdded : '=', + + /** + * The set of permissions that have been removed, relative to the + * initial state of the permissions being manipulated. + * + * @type PermissionSet + */ + permissionsRemoved : '=' + + }, + + templateUrl: 'app/manage/templates/connectionPermissionEditor.html' + + }; + + directive.controller = ['$scope', function connectionPermissionEditorController($scope) { + + /** + * A map of data source identifiers to all root connection groups + * within those data sources, regardless of the permissions granted for + * the items within those groups. As only one data source is applicable + * to any particular permission set being edited/created, this will only + * contain a single key. If the data necessary to produce this map has + * not yet been loaded, this will be null. + * + * @type Object. + */ + var allRootGroups = null; + + /** + * A map of data source identifiers to the root connection groups within + * those data sources, excluding all items which are not explicitly + * readable according to $scope.permissionFlags. As only one data + * source is applicable to any particular permission set being + * edited/created, this will only contain a single key. If the data + * necessary to produce this map has not yet been loaded, this will be + * null. + * + * @type Object. + */ + var readableRootGroups = null; + + /** + * The name of the tab within the connection permission editor which + * displays currently selected (readable) connections only. + * + * @constant + * @type String + */ + var CURRENT_CONNECTIONS = 'CURRENT_CONNECTIONS'; + + /** + * The name of the tab within the connection permission editor which + * displays all connections, regardless of whether they are readable. + * + * @constant + * @type String + */ + var ALL_CONNECTIONS = 'ALL_CONNECTIONS'; + + /** + * The names of all tabs which should be available within the + * connection permission editor, in display order. + * + * @type String[] + */ + $scope.tabs = [ + CURRENT_CONNECTIONS, + ALL_CONNECTIONS + ]; + + /** + * The name of the currently selected tab. + * + * @type String + */ + $scope.currentTab = ALL_CONNECTIONS; + + /** + * Array of all connection properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionProperties = [ + 'name', + 'protocol' + ]; + + /** + * Array of all connection group properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionGroupProperties = [ + 'name' + ]; + + /** + * Returns the root groups which should be displayed within the + * connection permission editor. + * + * @returns {Object.} + * The root groups which should be displayed within the connection + * permission editor as a map of data source identifiers to the + * root connection groups within those data sources. + */ + $scope.getRootGroups = function getRootGroups() { + return $scope.currentTab === CURRENT_CONNECTIONS ? readableRootGroups : allRootGroups; + }; + + /** + * Returns whether the given PermissionFlagSet declares explicit READ + * permission for the connection, connection group, or sharing profile + * represented by the given GroupListItem. + * + * @param {GroupListItem} item + * The GroupListItem which should be checked against the + * PermissionFlagSet. + * + * @param {PemissionFlagSet} flags + * The set of permissions which should be used to determine whether + * explicit READ permission is granted for the given item. + * + * @returns {Boolean} + * true if explicit READ permission is granted for the given item + * according to the given permission set, false otherwise. + */ + var isReadable = function isReadable(item, flags) { + + switch (item.type) { + + case GroupListItem.Type.CONNECTION: + return flags.connectionPermissions.READ[item.identifier]; + + case GroupListItem.Type.CONNECTION_GROUP: + return flags.connectionGroupPermissions.READ[item.identifier]; + + case GroupListItem.Type.SHARING_PROFILE: + return flags.sharingProfilePermissions.READ[item.identifier]; + + } + + return false; + + }; + + /** + * Expands all items within the tree descending from the given + * GroupListItem which have at least one descendant for which explicit + * READ permission is granted. The expanded state of all other items is + * left untouched. + * + * @param {GroupListItem} item + * The GroupListItem which should be conditionally expanded + * depending on whether READ permission is granted for any of its + * descendants. + * + * @param {PemissionFlagSet} flags + * The set of permissions which should be used to determine whether + * the given item and its descendants are expanded. + * + * @returns {Boolean} + * true if the given item has been expanded, false otherwise. + */ + var expandReadable = function expandReadable(item, flags) { + + // If the current item is expandable and has defined children, + // determine whether it should be expanded + if (item.expandable && item.children) { + angular.forEach(item.children, function expandReadableChild(child) { + + // The parent should be expanded by default if the child is + // expanded by default OR the permission set contains READ + // permission on the child + item.expanded |= expandReadable(child, flags) || isReadable(child, flags); + + }); + } + + return item.expanded; + + }; + + /** + * Creates a deep copy of all items within the tree descending from the + * given GroupListItem which have at least one descendant for which + * explicit READ permission is granted. Items which lack explicit READ + * permission and which have no descendants having explicit READ + * permission are omitted from the copy. + * + * @param {GroupListItem} item + * The GroupListItem which should be conditionally copied + * depending on whether READ permission is granted for any of its + * descendants. + * + * @param {PemissionFlagSet} flags + * The set of permissions which should be used to determine whether + * the given item or any of its descendants are copied. + * + * @returns {GroupListItem} + * A new GroupListItem containing a deep copy of the given item, + * omitting any items which lack explicit READ permission and whose + * descendants also lack explicit READ permission, or null if even + * the given item would not be copied. + */ + var copyReadable = function copyReadable(item, flags) { + + // Produce initial shallow copy of given item + item = new GroupListItem(item); + + // Replace children array with an array containing only readable + // children (or children with at least one readable descendant), + // flagging the current item for copying if any such children exist + if (item.children) { + + var children = []; + angular.forEach(item.children, function copyReadableChildren(child) { + + // Reduce child tree to only explicitly readable items and + // their parents + child = copyReadable(child, flags); + + // Include child only if they are explicitly readable, they + // have explicitly readable descendants, or their parent is + // readable (and thus all children are relevant) + if ((child.children && child.children.length) + || isReadable(item, flags) + || isReadable(child, flags)) + children.push(child); + + }); + + item.children = children; + + } + + return item; + + }; + + // Retrieve all connections for which we have ADMINISTER permission + dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + [$scope.dataSource], + ConnectionGroup.ROOT_IDENTIFIER, + [PermissionSet.ObjectPermissionType.ADMINISTER] + ) + .then(function connectionGroupReceived(rootGroups) { + + // Update default expanded state and the all / readable-only views + // when associated permissions change + $scope.$watchGroup(['permissionFlags'], function updateDefaultExpandedStates() { + + if (!$scope.permissionFlags) + return; + + allRootGroups = {}; + readableRootGroups = {}; + + angular.forEach(rootGroups, function addGroupListItem(rootGroup, dataSource) { + + // Convert all received ConnectionGroup objects into GroupListItems + var item = GroupListItem.fromConnectionGroup(dataSource, rootGroup); + allRootGroups[dataSource] = item; + + // Automatically expand all objects with any descendants for + // which the permission set contains READ permission + expandReadable(item, $scope.permissionFlags); + + // Create a duplicate view which contains only readable + // items + readableRootGroups[dataSource] = copyReadable(item, $scope.permissionFlags); + + }); + + // Display only readable connections by default if at least one + // readable connection exists + $scope.currentTab = !!readableRootGroups[$scope.dataSource].children.length ? CURRENT_CONNECTIONS : ALL_CONNECTIONS; + + }); + + }, requestService.DIE); + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the addition of the given connection permission. + * + * @param {String} identifier + * The identifier of the connection to add READ permission for. + */ + var addConnectionPermission = function addConnectionPermission(identifier) { + + // If permission was previously removed, simply un-remove it + if (PermissionSet.hasConnectionPermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier)) + PermissionSet.removeConnectionPermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier); + + // Otherwise, explicitly add the permission + else + PermissionSet.addConnectionPermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the removal of the given connection permission. + * + * @param {String} identifier + * The identifier of the connection to remove READ permission for. + */ + var removeConnectionPermission = function removeConnectionPermission(identifier) { + + // If permission was previously added, simply un-add it + if (PermissionSet.hasConnectionPermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier)) + PermissionSet.removeConnectionPermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier); + + // Otherwise, explicitly remove the permission + else + PermissionSet.addConnectionPermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the addition of the given connection group permission. + * + * @param {String} identifier + * The identifier of the connection group to add READ permission + * for. + */ + var addConnectionGroupPermission = function addConnectionGroupPermission(identifier) { + + // If permission was previously removed, simply un-remove it + if (PermissionSet.hasConnectionGroupPermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier)) + PermissionSet.removeConnectionGroupPermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier); + + // Otherwise, explicitly add the permission + else + PermissionSet.addConnectionGroupPermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the removal of the given connection group permission. + * + * @param {String} identifier + * The identifier of the connection group to remove READ permission + * for. + */ + var removeConnectionGroupPermission = function removeConnectionGroupPermission(identifier) { + + // If permission was previously added, simply un-add it + if (PermissionSet.hasConnectionGroupPermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier)) + PermissionSet.removeConnectionGroupPermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier); + + // Otherwise, explicitly remove the permission + else + PermissionSet.addConnectionGroupPermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the addition of the given sharing profile permission. + * + * @param {String} identifier + * The identifier of the sharing profile to add READ permission for. + */ + var addSharingProfilePermission = function addSharingProfilePermission(identifier) { + + // If permission was previously removed, simply un-remove it + if (PermissionSet.hasSharingProfilePermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier)) + PermissionSet.removeSharingProfilePermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier); + + // Otherwise, explicitly add the permission + else + PermissionSet.addSharingProfilePermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the removal of the given sharing profile permission. + * + * @param {String} identifier + * The identifier of the sharing profile to remove READ permission + * for. + */ + var removeSharingProfilePermission = function removeSharingProfilePermission(identifier) { + + // If permission was previously added, simply un-add it + if (PermissionSet.hasSharingProfilePermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier)) + PermissionSet.removeSharingProfilePermission($scope.permissionsAdded, PermissionSet.ObjectPermissionType.READ, identifier); + + // Otherwise, explicitly remove the permission + else + PermissionSet.addSharingProfilePermission($scope.permissionsRemoved, PermissionSet.ObjectPermissionType.READ, identifier); + + }; + + // Expose permission query and modification functions to group list template + $scope.groupListContext = { + + /** + * Returns the PermissionFlagSet that contains the current state of + * granted permissions. + * + * @returns {PermissionFlagSet} + * The PermissionFlagSet describing the current state of granted + * permissions for the permission set being edited. + */ + getPermissionFlags : function getPermissionFlags() { + return $scope.permissionFlags; + }, + + /** + * Notifies the controller that a change has been made to the given + * connection permission for the permission set being edited. This + * only applies to READ permissions. + * + * @param {String} identifier + * The identifier of the connection affected by the changed + * permission. + */ + connectionPermissionChanged : function connectionPermissionChanged(identifier) { + + // Determine current permission setting + var granted = $scope.permissionFlags.connectionPermissions.READ[identifier]; + + // Add/remove permission depending on flag state + if (granted) + addConnectionPermission(identifier); + else + removeConnectionPermission(identifier); + + }, + + /** + * Notifies the controller that a change has been made to the given + * connection group permission for the permission set being edited. + * This only applies to READ permissions. + * + * @param {String} identifier + * The identifier of the connection group affected by the + * changed permission. + */ + connectionGroupPermissionChanged : function connectionGroupPermissionChanged(identifier) { + + // Determine current permission setting + var granted = $scope.permissionFlags.connectionGroupPermissions.READ[identifier]; + + // Add/remove permission depending on flag state + if (granted) + addConnectionGroupPermission(identifier); + else + removeConnectionGroupPermission(identifier); + + }, + + /** + * Notifies the controller that a change has been made to the given + * sharing profile permission for the permission set being edited. + * This only applies to READ permissions. + * + * @param {String} identifier + * The identifier of the sharing profile affected by the changed + * permission. + */ + sharingProfilePermissionChanged : function sharingProfilePermissionChanged(identifier) { + + // Determine current permission setting + var granted = $scope.permissionFlags.sharingProfilePermissions.READ[identifier]; + + // Add/remove permission depending on flag state + if (granted) + addSharingProfilePermission(identifier); + else + removeSharingProfilePermission(identifier); + + } + + }; + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/directives/dataSourceTabs.js b/guacamole/src/main/frontend/src/app/manage/directives/dataSourceTabs.js new file mode 100644 index 0000000..627197b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/directives/dataSourceTabs.js @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Directive which displays a set of tabs pointing to the same object within + * different data sources, such as user accounts which span multiple data + * sources. + */ +angular.module('manage').directive('dataSourceTabs', ['$injector', + function dataSourceTabs($injector) { + + // Required types + var PageDefinition = $injector.get('PageDefinition'); + + // Required services + var translationStringService = $injector.get('translationStringService'); + + var directive = { + + restrict : 'E', + replace : true, + templateUrl : 'app/manage/templates/dataSourceTabs.html', + + scope : { + + /** + * The permissions which dictate the management actions available + * to the current user. + * + * @type Object. + */ + permissions : '=', + + /** + * A function which returns the URL of the object within a given + * data source. The relevant data source will be made available to + * the Angular expression defining this function as the + * "dataSource" variable. No other values will be made available, + * including values from the scope. + * + * @type Function + */ + url : '&' + + } + + }; + + directive.controller = ['$scope', function dataSourceTabsController($scope) { + + /** + * The set of pages which each manage the same object within different + * data sources. + * + * @type PageDefinition[] + */ + $scope.pages = null; + + // Keep pages synchronized with permissions + $scope.$watch('permissions', function permissionsChanged(permissions) { + + $scope.pages = []; + + var dataSources = _.keys($scope.permissions).sort(); + angular.forEach(dataSources, function addDataSourcePage(dataSource) { + + // Determine whether data source contains this object + var managementPermissions = permissions[dataSource]; + var exists = !!managementPermissions.identifier; + + // Data source is not relevant if the associated object does not + // exist and cannot be created + var readOnly = !managementPermissions.canSaveObject; + if (!exists && readOnly) + return; + + // Determine class name based on read-only / linked status + var className; + if (readOnly) className = 'read-only'; + else if (exists) className = 'linked'; + else className = 'unlinked'; + + // Add page entry + $scope.pages.push(new PageDefinition({ + name : translationStringService.canonicalize('DATA_SOURCE_' + dataSource) + '.NAME', + url : $scope.url({ dataSource : dataSource }), + className : className + })); + + }); + + }); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/directives/identifierSetEditor.js b/guacamole/src/main/frontend/src/app/manage/directives/identifierSetEditor.js new file mode 100644 index 0000000..d2936e7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/directives/identifierSetEditor.js @@ -0,0 +1,300 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for manipulating a set of objects sharing some common relation + * and represented by an array of their identifiers. The specific objects + * added or removed are tracked within a separate pair of arrays of + * identifiers. + */ +angular.module('manage').directive('identifierSetEditor', ['$injector', + function identifierSetEditor($injector) { + + var directive = { + + // Element only + restrict: 'E', + replace: true, + + scope: { + + /** + * The translation key of the text which should be displayed within + * the main header of the identifier set editor. + * + * @type String + */ + header : '@', + + /** + * The translation key of the text which should be displayed if no + * identifiers are currently present within the set. + * + * @type String + */ + emptyPlaceholder : '@', + + /** + * The translation key of the text which should be displayed if no + * identifiers are available to be added within the set. + * + * @type String + */ + unavailablePlaceholder : '@', + + /** + * All identifiers which are available to be added to or removed + * from the identifier set being edited. + * + * @type String[] + */ + identifiersAvailable : '=', + + /** + * The current state of the identifier set being manipulated. This + * array will be modified as changes are made through this + * identifier set editor. + * + * @type String[] + */ + identifiers : '=', + + /** + * The set of identifiers that have been added, relative to the + * initial state of the identifier set being manipulated. + * + * @type String[] + */ + identifiersAdded : '=', + + /** + * The set of identifiers that have been removed, relative to the + * initial state of the identifier set being manipulated. + * + * @type String[] + */ + identifiersRemoved : '=' + + }, + + templateUrl: 'app/manage/templates/identifierSetEditor.html' + + }; + + directive.controller = ['$scope', function identifierSetEditorController($scope) { + + /** + * Whether the full list of available identifiers should be displayed. + * Initially, only an abbreviated list of identifiers currently present + * is shown. + * + * @type Boolean + */ + $scope.expanded = false; + + /** + * Map of identifiers to boolean flags indicating whether that + * identifier is currently present (true) or absent (false). If an + * identifier is absent, it may also be absent from this map. + * + * @type Object. + */ + $scope.identifierFlags = {}; + + /** + * Map of identifiers to boolean flags indicating whether that + * identifier is editable. If an identifier is not editable, it will be + * absent from this map. + * + * @type Object. + */ + $scope.isEditable = {}; + + /** + * Adds the given identifier to the given sorted array of identifiers, + * preserving the sorted order of the array. If the identifier is + * already present, no change is made to the array. The given array + * must already be sorted in ascending order. + * + * @param {String[]} arr + * The sorted array of identifiers to add the given identifier to. + * + * @param {String} identifier + * The identifier to add to the given array. + */ + var addIdentifier = function addIdentifier(arr, identifier) { + + // Determine location that the identifier should be added to + // maintain sorted order + var index = _.sortedIndex(arr, identifier); + + // Do not add if already present + if (arr[index] === identifier) + return; + + // Insert identifier at determined location + arr.splice(index, 0, identifier); + + }; + + /** + * Removes the given identifier from the given sorted array of + * identifiers, preserving the sorted order of the array. If the + * identifier is already absent, no change is made to the array. The + * given array must already be sorted in ascending order. + * + * @param {String[]} arr + * The sorted array of identifiers to remove the given identifier + * from. + * + * @param {String} identifier + * The identifier to remove from the given array. + * + * @returns {Boolean} + * true if the identifier was present in the given array and has + * been removed, false otherwise. + */ + var removeIdentifier = function removeIdentifier(arr, identifier) { + + // Search for identifier in sorted array + var index = _.sortedIndexOf(arr, identifier); + + // Nothing to do if already absent + if (index === -1) + return false; + + // Remove identifier + arr.splice(index, 1); + return true; + + }; + + // Keep identifierFlags up to date when identifiers array is replaced + // or initially assigned + $scope.$watch('identifiers', function identifiersChanged(identifiers) { + + // Maintain identifiers in sorted order so additions and removals + // can be made more efficiently + if (identifiers) + identifiers.sort(); + + // Convert array of identifiers into set of boolean + // presence/absence flags + $scope.identifierFlags = {}; + angular.forEach(identifiers, function storeIdentifierFlag(identifier) { + $scope.identifierFlags[identifier] = true; + }); + + }); + + // An identifier is editable iff it is available to be added or removed + // from the identifier set being edited (iff it is within the + // identifiersAvailable array) + $scope.$watch('identifiersAvailable', function availableIdentifiersChanged(identifiers) { + $scope.isEditable = {}; + angular.forEach(identifiers, function storeEditableIdentifier(identifier) { + $scope.isEditable[identifier] = true; + }); + }); + + /** + * Notifies the controller that a change has been made to the flag + * denoting presence/absence of a particular identifier within the + * identifierFlags map. The identifiers, + * identifiersAdded, and identifiersRemoved + * arrays are updated accordingly. + * + * @param {String} identifier + * The identifier which has been added or removed through modifying + * its boolean flag within identifierFlags. + */ + $scope.identifierChanged = function identifierChanged(identifier) { + + // Determine status of modified identifier + var present = !!$scope.identifierFlags[identifier]; + + // Add/remove identifier from added/removed sets depending on + // change in flag state + if (present) { + + addIdentifier($scope.identifiers, identifier); + + if (!removeIdentifier($scope.identifiersRemoved, identifier)) + addIdentifier($scope.identifiersAdded, identifier); + + } + else { + + removeIdentifier($scope.identifiers, identifier); + + if (!removeIdentifier($scope.identifiersAdded, identifier)) + addIdentifier($scope.identifiersRemoved, identifier); + + } + + }; + + /** + * Removes the given identifier, updating identifierFlags, + * identifiers, identifiersAdded, and + * identifiersRemoved accordingly. + * + * @param {String} identifier + * The identifier to remove. + */ + $scope.removeIdentifier = function removeIdentifier(identifier) { + $scope.identifierFlags[identifier] = false; + $scope.identifierChanged(identifier); + }; + + /** + * Shows the full list of available identifiers. If the full list is + * already shown, this function has no effect. + */ + $scope.expand = function expand() { + $scope.expanded = true; + }; + + /** + * Hides the full list of available identifiers. If the full list is + * already hidden, this function has no effect. + */ + $scope.collapse = function collapse() { + $scope.expanded = false; + }; + + /** + * Returns whether there are absolutely no identifiers that can be + * managed using this editor. If true, the editor is effectively + * useless, as there is nothing whatsoever to display. + * + * @returns {Boolean} + * true if there are no identifiers that can be managed using this + * editor, false otherwise. + */ + $scope.isEmpty = function isEmpty() { + return _.isEmpty($scope.identifiers) + && _.isEmpty($scope.identifiersAvailable); + }; + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/directives/locationChooser.js b/guacamole/src/main/frontend/src/app/manage/directives/locationChooser.js new file mode 100644 index 0000000..d91c5d4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/directives/locationChooser.js @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * A directive for choosing the location of a connection or connection group. + */ +angular.module('manage').directive('locationChooser', [function locationChooser() { + + return { + // Element only + restrict: 'E', + replace: true, + + scope: { + + /** + * The identifier of the data source from which the given root + * connection group was retrieved. + * + * @type String + */ + dataSource : '=', + + /** + * The root connection group of the connection group hierarchy to + * display. + * + * @type ConnectionGroup + */ + rootGroup : '=', + + /** + * The unique identifier of the currently-selected connection + * group. If not specified, the root group will be used. + * + * @type String + */ + value : '=' + + }, + + templateUrl: 'app/manage/templates/locationChooser.html', + controller: ['$scope', function locationChooserController($scope) { + + /** + * Map of unique identifiers to their corresponding connection + * groups. + * + * @type Object. + */ + var connectionGroups = {}; + + /** + * Recursively traverses the given connection group and all + * children, storing each encountered connection group within the + * connectionGroups map by its identifier. + * + * @param {GroupListItem} group + * The connection group to traverse. + */ + var mapConnectionGroups = function mapConnectionGroups(group) { + + // Map given group + connectionGroups[group.identifier] = group; + + // Map all child groups + if (group.childConnectionGroups) + group.childConnectionGroups.forEach(mapConnectionGroups); + + }; + + /** + * Whether the group list menu is currently open. + * + * @type Boolean + */ + $scope.menuOpen = false; + + /** + * The human-readable name of the currently-chosen connection + * group. + * + * @type String + */ + $scope.chosenConnectionGroupName = null; + + /** + * Toggle the current state of the menu listing connection groups. + * If the menu is currently open, it will be closed. If currently + * closed, it will be opened. + */ + $scope.toggleMenu = function toggleMenu() { + $scope.menuOpen = !$scope.menuOpen; + }; + + // Update the root group map when data source or root group change + $scope.$watchGroup(['dataSource', 'rootGroup'], function updateRootGroups() { + + // Abort if the root group is not set + if (!$scope.dataSource || !$scope.rootGroup) + return null; + + // Wrap root group in map + $scope.rootGroups = {}; + $scope.rootGroups[$scope.dataSource] = $scope.rootGroup; + + }); + + // Expose selection function to group list template + $scope.groupListContext = { + + /** + * Selects the given group item. + * + * @param {GroupListItem} item + * The chosen item. + */ + chooseGroup : function chooseGroup(item) { + + // Record new parent + $scope.value = item.identifier; + $scope.chosenConnectionGroupName = item.name; + + // Close menu + $scope.menuOpen = false; + + } + + }; + + $scope.$watch('rootGroup', function setRootGroup(rootGroup) { + + connectionGroups = {}; + + if (!rootGroup) + return; + + // Map all known groups + mapConnectionGroups(rootGroup); + + // If no value is specified, default to the root identifier + if (!$scope.value || !($scope.value in connectionGroups)) + $scope.value = rootGroup.identifier; + + $scope.chosenConnectionGroupName = connectionGroups[$scope.value].name; + + }); + + }] + }; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/directives/managementButtons.js b/guacamole/src/main/frontend/src/app/manage/directives/managementButtons.js new file mode 100644 index 0000000..f44515a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/directives/managementButtons.js @@ -0,0 +1,201 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Directive which displays a set of object management buttons (save, delete, + * clone, etc.) representing the actions available to the current user in + * context of the object being edited/created. + */ +angular.module('manage').directive('managementButtons', ['$injector', + function managementButtons($injector) { + + // Required services + var guacNotification = $injector.get('guacNotification'); + + var directive = { + + restrict : 'E', + replace : true, + templateUrl : 'app/manage/templates/managementButtons.html', + + scope : { + + /** + * The translation namespace associated with all applicable + * translation strings. This directive requires at least the + * following translation strings within the given namespace: + * + * - ACTION_CANCEL + * - ACTION_CLONE + * - ACTION_DELETE + * - ACTION_SAVE + * - DIALOG_HEADER_CONFIRM_DELETE + * - TEXT_CONFIRM_DELETE + * + * @type String + */ + namespace : '@', + + /** + * The permissions which dictate the management actions available + * to the current user. + * + * @type ManagementPermissions + */ + permissions : '=', + + /** + * The function to invoke to save the arbitrary object being edited + * if the current user has permission to do so. The provided + * function MUST return a promise which is resolved if the save + * operation succeeds and is rejected with an {@link Error} if the + * save operation fails. + * + * @type Function + */ + save : '&', + + /** + * The function to invoke when the current user chooses to clone + * the object being edited. The provided function MUST perform the + * actions necessary to produce an interface which will clone the + * object. + * + * @type Function + */ + clone : '&', + + /** + * The function to invoke to delete the arbitrary object being edited + * if the current user has permission to do so. The provided + * function MUST return a promise which is resolved if the delete + * operation succeeds and is rejected with an {@link Error} if the + * delete operation fails. + * + * @type Function + */ + delete : '&', + + /** + * The function to invoke when the current user chooses to cancel + * the edit in progress, or when a save/delete operation has + * succeeded. The provided function MUST perform the actions + * necessary to return the user to a reasonable starting point. + * + * @type Function + */ + return : '&' + + } + + }; + + directive.controller = ['$scope', function managementButtonsController($scope) { + + /** + * An action to be provided along with the object sent to showStatus which + * immediately deletes the current connection. + */ + var DELETE_ACTION = { + name : $scope.namespace + '.ACTION_DELETE', + className : 'danger', + callback : function deleteCallback() { + deleteObjectImmediately(); + guacNotification.showStatus(false); + } + }; + + /** + * An action to be provided along with the object sent to showStatus which + * closes the currently-shown status dialog. + */ + var CANCEL_ACTION = { + name : $scope.namespace + '.ACTION_CANCEL', + callback : function cancelCallback() { + guacNotification.showStatus(false); + } + }; + + /** + * Invokes the provided return function to navigate the user back to + * the page they started from. + */ + var navigateBack = function navigateBack() { + $scope['return']($scope.$parent); + }; + + /** + * Invokes the provided delete function, immediately deleting the + * current object without prompting the user for confirmation. If + * deletion is successful, the user is navigated back to the page they + * started from. If the deletion fails, an error notification is + * displayed. + */ + var deleteObjectImmediately = function deleteObjectImmediately() { + $scope['delete']($scope.$parent).then(navigateBack, guacNotification.SHOW_REQUEST_ERROR); + }; + + /** + * Cancels all pending edits, returning to the page the user started + * from. + */ + $scope.cancel = navigateBack; + + /** + * Cancels all pending edits, invoking the provided clone function to + * open an edit page for a new object which is prepopulated with the + * data from the current object. + */ + $scope.cloneObject = function cloneObject () { + $scope.clone($scope.$parent); + }; + + /** + * Invokes the provided save function to save the current object. If + * saving is successful, the user is navigated back to the page they + * started from. If saving fails, an error notification is displayed. + */ + $scope.saveObject = function saveObject() { + $scope.save($scope.$parent).then(navigateBack, guacNotification.SHOW_REQUEST_ERROR); + }; + + /** + * Deletes the current object, prompting the user first to confirm that + * deletion is desired. If the user confirms that deletion is desired, + * the object is deleted through invoking the provided delete function. + * The user is automatically navigated back to the page they started + * from or given an error notification depending on whether deletion + * succeeds. + */ + $scope.deleteObject = function deleteObject() { + + // Confirm deletion request + guacNotification.showStatus({ + title : $scope.namespace + '.DIALOG_HEADER_CONFIRM_DELETE', + text : { key : $scope.namespace + '.TEXT_CONFIRM_DELETE' }, + actions : [ DELETE_ACTION, CANCEL_ACTION] + }); + + }; + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/directives/systemPermissionEditor.js b/guacamole/src/main/frontend/src/app/manage/directives/systemPermissionEditor.js new file mode 100644 index 0000000..079c0d0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/directives/systemPermissionEditor.js @@ -0,0 +1,316 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for manipulating the system permissions granted within a given + * {@link PermissionFlagSet}, tracking the specific permissions added or + * removed within a separate pair of {@link PermissionSet} objects. Optionally, + * the permission for a particular user to update themselves (change their own + * password/attributes) may also be manipulated. + */ +angular.module('manage').directive('systemPermissionEditor', ['$injector', + function systemPermissionEditor($injector) { + + // Required services + var authenticationService = $injector.get('authenticationService'); + var dataSourceService = $injector.get('dataSourceService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + + // Required types + var PermissionSet = $injector.get('PermissionSet'); + + var directive = { + + // Element only + restrict: 'E', + replace: true, + + scope: { + + /** + * The unique identifier of the data source associated with the + * permissions being manipulated. + * + * @type String + */ + dataSource : '=', + + /** + * The username of the user whose self-update permission (whether + * the user has permission to update their own user account) should + * be additionally controlled by this editor. If no such user + * permissions should be controlled, this should be left undefined. + * + * @type String + */ + username : '=', + + /** + * The current state of the permissions being manipulated. This + * {@link PemissionFlagSet} will be modified as changes are made + * through this permission editor. + * + * @type PermissionFlagSet + */ + permissionFlags : '=', + + /** + * The set of permissions that have been added, relative to the + * initial state of the permissions being manipulated. + * + * @type PermissionSet + */ + permissionsAdded : '=', + + /** + * The set of permissions that have been removed, relative to the + * initial state of the permissions being manipulated. + * + * @type PermissionSet + */ + permissionsRemoved : '=' + + }, + + templateUrl: 'app/manage/templates/systemPermissionEditor.html' + + }; + + directive.controller = ['$scope', function systemPermissionEditorController($scope) { + + /** + * The identifiers of all data sources currently available to the + * authenticated user. + * + * @type String[] + */ + var dataSources = authenticationService.getAvailableDataSources(); + + /** + * The username of the current, authenticated user. + * + * @type String + */ + var currentUsername = authenticationService.getCurrentUsername(); + + /** + * Available system permission types, as translation string / internal + * value pairs. + * + * @type Object[] + */ + $scope.systemPermissionTypes = [ + { + label: "MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + value: PermissionSet.SystemPermissionType.ADMINISTER + }, + { + label: "MANAGE_USER.FIELD_HEADER_AUDIT_SYSTEM", + value: PermissionSet.SystemPermissionType.AUDIT + }, + { + label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + value: PermissionSet.SystemPermissionType.CREATE_USER + }, + { + label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + value: PermissionSet.SystemPermissionType.CREATE_USER_GROUP + }, + { + label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + value: PermissionSet.SystemPermissionType.CREATE_CONNECTION + }, + { + label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + value: PermissionSet.SystemPermissionType.CREATE_CONNECTION_GROUP + }, + { + label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + value: PermissionSet.SystemPermissionType.CREATE_SHARING_PROFILE + } + ]; + + // Query the permissions granted to the currently-authenticated user + dataSourceService.apply( + permissionService.getEffectivePermissions, + dataSources, + currentUsername + ) + .then(function permissionsReceived(permissions) { + $scope.permissions = permissions; + }, requestService.DIE); + + /** + * Returns whether the current user has permission to change the system + * permissions granted to users. + * + * @returns {Boolean} + * true if the current user can grant or revoke system permissions + * to the permission set being edited, false otherwise. + */ + $scope.canChangeSystemPermissions = function canChangeSystemPermissions() { + + // Do not check if permissions are not yet loaded + if (!$scope.permissions) + return false; + + // Only the administrator can modify system permissions + return PermissionSet.hasSystemPermission($scope.permissions[$scope.dataSource], + PermissionSet.SystemPermissionType.ADMINISTER); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the addition of the given system permission. + * + * @param {String} type + * The system permission to add, as defined by + * PermissionSet.SystemPermissionType. + */ + var addSystemPermission = function addSystemPermission(type) { + + // If permission was previously removed, simply un-remove it + if (PermissionSet.hasSystemPermission($scope.permissionsRemoved, type)) + PermissionSet.removeSystemPermission($scope.permissionsRemoved, type); + + // Otherwise, explicitly add the permission + else + PermissionSet.addSystemPermission($scope.permissionsAdded, type); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the removal of the given system permission. + * + * @param {String} type + * The system permission to remove, as defined by + * PermissionSet.SystemPermissionType. + */ + var removeSystemPermission = function removeSystemPermission(type) { + + // If permission was previously added, simply un-add it + if (PermissionSet.hasSystemPermission($scope.permissionsAdded, type)) + PermissionSet.removeSystemPermission($scope.permissionsAdded, type); + + // Otherwise, explicitly remove the permission + else + PermissionSet.addSystemPermission($scope.permissionsRemoved, type); + + }; + + /** + * Notifies the controller that a change has been made to the given + * system permission for the permission set being edited. + * + * @param {String} type + * The system permission that was changed, as defined by + * PermissionSet.SystemPermissionType. + */ + $scope.systemPermissionChanged = function systemPermissionChanged(type) { + + // Determine current permission setting + var granted = $scope.permissionFlags.systemPermissions[type]; + + // Add/remove permission depending on flag state + if (granted) + addSystemPermission(type); + else + removeSystemPermission(type); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the addition of the given user permission. + * + * @param {String} type + * The user permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user affected by the permission being added. + */ + var addUserPermission = function addUserPermission(type, identifier) { + + // If permission was previously removed, simply un-remove it + if (PermissionSet.hasUserPermission($scope.permissionsRemoved, type, identifier)) + PermissionSet.removeUserPermission($scope.permissionsRemoved, type, identifier); + + // Otherwise, explicitly add the permission + else + PermissionSet.addUserPermission($scope.permissionsAdded, type, identifier); + + }; + + /** + * Updates the permissionsAdded and permissionsRemoved permission sets + * to reflect the removal of the given user permission. + * + * @param {String} type + * The user permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user affected by the permission being + * removed. + */ + var removeUserPermission = function removeUserPermission(type, identifier) { + + // If permission was previously added, simply un-add it + if (PermissionSet.hasUserPermission($scope.permissionsAdded, type, identifier)) + PermissionSet.removeUserPermission($scope.permissionsAdded, type, identifier); + + // Otherwise, explicitly remove the permission + else + PermissionSet.addUserPermission($scope.permissionsRemoved, type, identifier); + + }; + + /** + * Notifies the controller that a change has been made to the given user + * permission for the permission set being edited. + * + * @param {String} type + * The user permission that was changed, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user affected by the changed permission. + */ + $scope.userPermissionChanged = function userPermissionChanged(type, identifier) { + + // Determine current permission setting + var granted = $scope.permissionFlags.userPermissions[type][identifier]; + + // Add/remove permission depending on flag state + if (granted) + addUserPermission(type, identifier); + else + removeUserPermission(type, identifier); + + }; + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/manageModule.js b/guacamole/src/main/frontend/src/app/manage/manageModule.js new file mode 100644 index 0000000..3e775db --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/manageModule.js @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for the administration functionality. + */ +angular.module('manage', [ + 'form', + 'groupList', + 'list', + 'locale', + 'navigation', + 'notification', + 'rest' +]); diff --git a/guacamole/src/main/frontend/src/app/manage/styles/attributes.css b/guacamole/src/main/frontend/src/app/manage/styles/attributes.css new file mode 100644 index 0000000..2b5bc92 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/attributes.css @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* Do not stretch attributes to fit available area */ +.attributes input[type=text], +.attributes input[type=email], +.attributes input[type=password], +.attributes input[type=number] { + width: auto; +} + +.attributes .form .fields { + display: table; + margin: 1em; +} + +.attributes .form .fields .labeled-field { + display: table-row; +} + +.attributes .form .fields .field-header, +.attributes .form .fields .form-field { + display: table-cell; + padding: 0.125em; + vertical-align: top; +} + +.attributes .form .fields .field-header { + padding-right: 1em; +} + +.attributes .form h3 { + + font-size: 1.25em; + font-weight: bold; + text-transform: uppercase; + padding: 0.5em; + margin: 1em 0; + + border-bottom: 1px solid rgba(0, 0, 0, 0.125); + border-top: 1px solid rgba(0, 0, 0, 0.125); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.125); + background: rgba(0, 0, 0, 0.04); + + width: 100%; + +} diff --git a/guacamole/src/main/frontend/src/app/manage/styles/connection-parameter.css b/guacamole/src/main/frontend/src/app/manage/styles/connection-parameter.css new file mode 100644 index 0000000..c5645fb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/connection-parameter.css @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* Do not stretch connection parameters to fit available area */ +.connection-parameters input[type=text], +.connection-parameters input[type=email], +.connection-parameters input[type=password], +.connection-parameters input[type=number] { + width: auto; +} + +.connection-parameters .form .fields { + display: table; + padding-left: .5em; + border-left: 3px solid rgba(0,0,0,0.125); + width: 100%; +} + +.connection-parameters .form .fields .labeled-field { + display: table-row; +} + +.connection-parameters .form .fields .field-header, +.connection-parameters .form .fields .form-field { + display: table-cell; + padding: 0.125em; + vertical-align: top; + width: 100%; +} + +.connection-parameters .form .fields .field-header { + padding-right: 1em; + width: 0; + white-space: nowrap; +} diff --git a/guacamole/src/main/frontend/src/app/manage/styles/forms.css b/guacamole/src/main/frontend/src/app/manage/styles/forms.css new file mode 100644 index 0000000..0f3b3df --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/forms.css @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.manage table.properties th { + text-align: left; + font-weight: normal; + padding-right: 1em; +} + +.manage .action-buttons { + text-align: center; + margin-bottom: 1em; +} diff --git a/guacamole/src/main/frontend/src/app/manage/styles/locationChooser.css b/guacamole/src/main/frontend/src/app/manage/styles/locationChooser.css new file mode 100644 index 0000000..0eda66a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/locationChooser.css @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.location-chooser .dropdown { + + position: absolute; + z-index: 2; + margin-top: -1px; + + width: 3in; + max-height: 2in; + overflow: auto; + + border: 1px solid rgba(0, 0, 0, 0.5); + background: white; + + font-size: 10pt; + +} diff --git a/guacamole/src/main/frontend/src/app/manage/styles/manage-user-group.css b/guacamole/src/main/frontend/src/app/manage/styles/manage-user-group.css new file mode 100644 index 0000000..4c5adc9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/manage-user-group.css @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.manage-user-group .page-tabs .page-list li.read-only a[href], +.manage-user-group .page-tabs .page-list li.unlinked a[href], +.manage-user-group .page-tabs .page-list li.linked a[href] { + padding-right: 2.5em; + position: relative; +} + +.manage-user-group .page-tabs .page-list li.read-only a[href]:before, +.manage-user-group .page-tabs .page-list li.unlinked a[href]:before, +.manage-user-group .page-tabs .page-list li.linked a[href]:before { + content: ' '; + position: absolute; + right: 0; + bottom: 0; + top: 0; + width: 2.5em; + background-size: 1.25em; + background-repeat: no-repeat; + background-position: center; +} + +.manage-user-group .page-tabs .page-list li.read-only a[href]:before { + background-image: url('images/lock.svg'); +} + +.manage-user-group .page-tabs .page-list li.unlinked a[href]:before { + background-image: url('images/plus.svg'); +} + +.manage-user-group .page-tabs .page-list li.unlinked a[href] { + opacity: 0.5; +} + +.manage-user-group .page-tabs .page-list li.unlinked a[href]:hover, +.manage-user-group .page-tabs .page-list li.unlinked a[href].current { + opacity: 1; +} + +.manage-user-group .page-tabs .page-list li.linked a[href]:before { + background-image: url('images/checkmark.svg'); +} + +.manage-user-group .notice.read-only { + + background: #FDA; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25em; + + text-align: center; + padding: 1em; + +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/styles/manage-user.css b/guacamole/src/main/frontend/src/app/manage/styles/manage-user.css new file mode 100644 index 0000000..0afaf4e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/manage-user.css @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.manage-user .page-tabs .page-list li.read-only a[href], +.manage-user .page-tabs .page-list li.unlinked a[href], +.manage-user .page-tabs .page-list li.linked a[href] { + padding-right: 2.5em; + position: relative; +} + +.manage-user .page-tabs .page-list li.read-only a[href]:before, +.manage-user .page-tabs .page-list li.unlinked a[href]:before, +.manage-user .page-tabs .page-list li.linked a[href]:before { + content: ' '; + position: absolute; + right: 0; + bottom: 0; + top: 0; + width: 2.5em; + background-size: 1.25em; + background-repeat: no-repeat; + background-position: center; +} + +.manage-user .page-tabs .page-list li.read-only a[href]:before { + background-image: url('images/lock.svg'); +} + +.manage-user .page-tabs .page-list li.unlinked a[href]:before { + background-image: url('images/plus.svg'); +} + +.manage-user .page-tabs .page-list li.unlinked a[href] { + opacity: 0.5; +} + +.manage-user .page-tabs .page-list li.unlinked a[href]:hover, +.manage-user .page-tabs .page-list li.unlinked a[href].current { + opacity: 1; +} + +.manage-user .page-tabs .page-list li.linked a[href]:before { + background-image: url('images/checkmark.svg'); +} + +.manage-user .notice.read-only { + + background: #FDA; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25em; + + text-align: center; + padding: 1em; + +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/styles/related-objects.css b/guacamole/src/main/frontend/src/app/manage/styles/related-objects.css new file mode 100644 index 0000000..ddc85b1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/styles/related-objects.css @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.related-objects .abbreviated-related-objects { + display: table; + margin: 1em 0; +} + +.related-objects .abbreviated-related-objects ul { + display: table-cell; + vertical-align: top; +} + +.related-objects .abbreviated-related-objects ul, +.related-objects .all-related-objects ul { + padding: 0; + list-style: none; +} + +.related-objects .abbreviated-related-objects ul li { + + display: inline-block; + margin: 0.25em; + padding: 0.25em; + + border: 1px solid silver; + background: #F5F5F5; + -moz-border-radius: 0.25em; + -webkit-border-radius: 0.25em; + -khtml-border-radius: 0.25em; + border-radius: 0.25em; + +} + +.related-objects .abbreviated-related-objects ul li img.remove { + max-height: 0.75em; + max-width: 0.75em; + margin: 0 0.25em; +} + +.related-objects .abbreviated-related-objects ul li .identifier { + margin: 0 0.25em; +} + +.related-objects .abbreviated-related-objects img.expand, +.related-objects .abbreviated-related-objects img.collapse { + display: table-cell; + max-height: 1.5em; + max-width: 1.5em; + margin: 0.375em 0; +} + +.related-objects .all-related-objects { + border-top: 1px solid silver; +} + +.related-objects .abbreviated-related-objects p.no-related-objects, +.related-objects .all-related-objects p.no-objects-available { + font-style: italic; + opacity: 0.5; +} + +.related-objects .abbreviated-related-objects p.no-related-objects { + display: table-cell; + vertical-align: middle; +} diff --git a/guacamole/src/main/frontend/src/app/manage/templates/connectionGroupPermission.html b/guacamole/src/main/frontend/src/app/manage/templates/connectionGroupPermission.html new file mode 100644 index 0000000..2bc90cc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/connectionGroupPermission.html @@ -0,0 +1,13 @@ +
      + + +
      + + + + + + {{item.name}} + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/connectionPermission.html b/guacamole/src/main/frontend/src/app/manage/templates/connectionPermission.html new file mode 100644 index 0000000..e94f911 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/connectionPermission.html @@ -0,0 +1,13 @@ +
      + + +
      + + + + + + {{item.name}} + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/connectionPermissionEditor.html b/guacamole/src/main/frontend/src/app/manage/templates/connectionPermissionEditor.html new file mode 100644 index 0000000..f010fb9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/connectionPermissionEditor.html @@ -0,0 +1,22 @@ +
      +
      +

      {{'MANAGE_USER.SECTION_HEADER_CONNECTIONS' | translate}}

      + +
      + +
      + +
      +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/templates/dataSourceTabs.html b/guacamole/src/main/frontend/src/app/manage/templates/dataSourceTabs.html new file mode 100644 index 0000000..a8a0843 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/dataSourceTabs.html @@ -0,0 +1,3 @@ +
      + +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/templates/identifierSetEditor.html b/guacamole/src/main/frontend/src/app/manage/templates/identifierSetEditor.html new file mode 100644 index 0000000..e6a309a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/identifierSetEditor.html @@ -0,0 +1,47 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/templates/locationChooser.html b/guacamole/src/main/frontend/src/app/manage/templates/locationChooser.html new file mode 100644 index 0000000..068b13b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/locationChooser.html @@ -0,0 +1,17 @@ +
      + + +
      {{chosenConnectionGroupName}}
      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/locationChooserConnectionGroup.html b/guacamole/src/main/frontend/src/app/manage/templates/locationChooserConnectionGroup.html new file mode 100644 index 0000000..e49b4c0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/locationChooserConnectionGroup.html @@ -0,0 +1,4 @@ + + {{item.name}} + diff --git a/guacamole/src/main/frontend/src/app/manage/templates/manageConnection.html b/guacamole/src/main/frontend/src/app/manage/templates/manageConnection.html new file mode 100644 index 0000000..7be5d75 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/manageConnection.html @@ -0,0 +1,96 @@ + +
      + + +
      +

      {{'MANAGE_CONNECTION.SECTION_HEADER_EDIT_CONNECTION' | translate}}

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + +
      {{'MANAGE_CONNECTION.FIELD_HEADER_NAME' | translate}}
      {{'MANAGE_CONNECTION.FIELD_HEADER_LOCATION' | translate}} + +
      {{'MANAGE_CONNECTION.FIELD_HEADER_PROTOCOL' | translate}} + +
      +
      + + +
      + +
      + + +

      {{'MANAGE_CONNECTION.SECTION_HEADER_PARAMETERS' | translate}}

      +
      + +
      + + + + + + +

      {{'MANAGE_CONNECTION.SECTION_HEADER_HISTORY' | translate}}

      +
      +

      {{'MANAGE_CONNECTION.INFO_CONNECTION_NOT_USED' | translate}}

      + + + + + + + + + + + + + + + + + + + +
      {{'MANAGE_CONNECTION.TABLE_HEADER_HISTORY_USERNAME' | translate}}{{'MANAGE_CONNECTION.TABLE_HEADER_HISTORY_START' | translate}}{{'MANAGE_CONNECTION.TABLE_HEADER_HISTORY_DURATION' | translate}}{{'MANAGE_CONNECTION.TABLE_HEADER_HISTORY_REMOTEHOST' | translate}}
      {{wrapper.entry.startDate | date:historyDateFormat}}{{wrapper.entry.remoteHost}}
      + + + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/manageConnectionGroup.html b/guacamole/src/main/frontend/src/app/manage/templates/manageConnectionGroup.html new file mode 100644 index 0000000..712183d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/manageConnectionGroup.html @@ -0,0 +1,56 @@ + +
      + + +
      +

      {{'MANAGE_CONNECTION_GROUP.SECTION_HEADER_EDIT_CONNECTION_GROUP' | translate}}

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + +
      {{'MANAGE_CONNECTION_GROUP.FIELD_HEADER_NAME' | translate}}
      {{'MANAGE_CONNECTION_GROUP.FIELD_HEADER_LOCATION' | translate}} + +
      {{'MANAGE_CONNECTION_GROUP.FIELD_HEADER_TYPE' | translate}} + +
      +
      + + +
      + +
      + + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/manageSharingProfile.html b/guacamole/src/main/frontend/src/app/manage/templates/manageSharingProfile.html new file mode 100644 index 0000000..6458075 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/manageSharingProfile.html @@ -0,0 +1,45 @@ +
      + + +
      +

      {{'MANAGE_SHARING_PROFILE.SECTION_HEADER_EDIT_SHARING_PROFILE' | translate}}

      + +
      +
      + + + + + + + + + +
      {{'MANAGE_SHARING_PROFILE.FIELD_HEADER_NAME' | translate}}
      {{'MANAGE_SHARING_PROFILE.FIELD_HEADER_PRIMARY_CONNECTION' | translate}}{{primaryConnection.name}}
      +
      + + +
      + +
      + + +

      {{'MANAGE_SHARING_PROFILE.SECTION_HEADER_PARAMETERS' | translate}}

      +
      + +
      + + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/manageUser.html b/guacamole/src/main/frontend/src/app/manage/templates/manageUser.html new file mode 100644 index 0000000..d5896ec --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/manageUser.html @@ -0,0 +1,93 @@ + +
      + + +
      +

      {{'MANAGE_USER.SECTION_HEADER_EDIT_USER' | translate}}

      + +
      + + + + +
      +

      {{'MANAGE_USER.INFO_READ_ONLY' | translate}}

      +
      + + +
      + + +
      + + + + + + + + + + + + + + + + + +
      {{'MANAGE_USER.FIELD_HEADER_USERNAME' | translate}} + + {{user.username}} +
      {{'MANAGE_USER.FIELD_HEADER_PASSWORD' | translate}}
      {{'MANAGE_USER.FIELD_HEADER_PASSWORD_AGAIN' | translate}}
      {{'MANAGE_USER.FIELD_HEADER_USER_DISABLED' | translate}}
      +
      + + +
      + +
      + + + + + + + + + + + + + + + + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/manageUserGroup.html b/guacamole/src/main/frontend/src/app/manage/templates/manageUserGroup.html new file mode 100644 index 0000000..c450baa --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/manageUserGroup.html @@ -0,0 +1,105 @@ +
      + + +
      +

      {{'MANAGE_USER_GROUP.SECTION_HEADER_EDIT_USER_GROUP' | translate}}

      + +
      + + + + +
      +

      {{'MANAGE_USER_GROUP.INFO_READ_ONLY' | translate}}

      +
      + + +
      + + +
      + + + + + + + + + +
      {{'MANAGE_USER_GROUP.FIELD_HEADER_USER_GROUP_NAME' | translate}} + + {{userGroup.identifier}} +
      {{'MANAGE_USER_GROUP.FIELD_HEADER_USER_GROUP_DISABLED' | translate}}
      +
      + + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/managementButtons.html b/guacamole/src/main/frontend/src/app/manage/templates/managementButtons.html new file mode 100644 index 0000000..68e4108 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/managementButtons.html @@ -0,0 +1,6 @@ +
      + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/manage/templates/sharingProfilePermission.html b/guacamole/src/main/frontend/src/app/manage/templates/sharingProfilePermission.html new file mode 100644 index 0000000..0d16472 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/sharingProfilePermission.html @@ -0,0 +1,13 @@ + diff --git a/guacamole/src/main/frontend/src/app/manage/templates/systemPermissionEditor.html b/guacamole/src/main/frontend/src/app/manage/templates/systemPermissionEditor.html new file mode 100644 index 0000000..aa5ee47 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/templates/systemPermissionEditor.html @@ -0,0 +1,18 @@ +
      +

      {{'MANAGE_USER.SECTION_HEADER_PERMISSIONS' | translate}}

      +
      + + + + + + + + + +
      {{systemPermissionType.label | translate}}
      {{'MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD' | translate}}
      +
      +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/types/HistoryEntryWrapper.js b/guacamole/src/main/frontend/src/app/manage/types/HistoryEntryWrapper.js new file mode 100644 index 0000000..a45c2e5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/types/HistoryEntryWrapper.js @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the HistoryEntryWrapper class. + */ +angular.module('manage').factory('HistoryEntryWrapper', ['$injector', + function defineHistoryEntryWrapper($injector) { + + // Required types + var ConnectionHistoryEntry = $injector.get('ConnectionHistoryEntry'); + + /** + * Wrapper for ConnectionHistoryEntry which adds display-specific + * properties, such as the connection duration. + * + * @constructor + * @param {ConnectionHistoryEntry} historyEntry + * The history entry to wrap. + */ + var HistoryEntryWrapper = function HistoryEntryWrapper(historyEntry) { + + /** + * The wrapped ConnectionHistoryEntry. + * + * @type ConnectionHistoryEntry + */ + this.entry = historyEntry; + + /** + * An object providing value and unit properties, denoting the duration + * and its corresponding units. + * + * @type ConnectionHistoryEntry.Duration + */ + this.duration = null; + + /** + * The string to display as the duration of this history entry. If a + * duration is available, its value and unit will be exposed to any + * given translation string as the VALUE and UNIT substitution + * variables respectively. + * + * @type String + */ + this.durationText = 'MANAGE_CONNECTION.TEXT_HISTORY_DURATION'; + + // Notify if connection is active right now + if (historyEntry.active) + this.durationText = 'MANAGE_CONNECTION.INFO_CONNECTION_ACTIVE_NOW'; + + // If connection is not active, inform user if end date is not known + else if (!historyEntry.endDate) + this.durationText = 'MANAGE_CONNECTION.INFO_CONNECTION_DURATION_UNKNOWN'; + + // Set the duration if the necessary information is present + if (historyEntry.endDate && historyEntry.startDate) + this.duration = new ConnectionHistoryEntry.Duration(historyEntry.endDate - historyEntry.startDate); + + }; + + return HistoryEntryWrapper; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/manage/types/ManageableUser.js b/guacamole/src/main/frontend/src/app/manage/types/ManageableUser.js new file mode 100644 index 0000000..d6c9874 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/types/ManageableUser.js @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the ManageableUser class. + */ +angular.module('manage').factory('ManageableUser', [function defineManageableUser() { + + /** + * A pairing of an @link{User} with the identifier of its corresponding + * data source. + * + * @constructor + * @param {Object|ManageableUser} template + */ + var ManageableUser = function ManageableUser(template) { + + /** + * The unique identifier of the data source containing this user. + * + * @type String + */ + this.dataSource = template.dataSource; + + /** + * The @link{User} object represented by this ManageableUser and + * contained within the associated data source. + * + * @type User + */ + this.user = template.user; + + /** + * Return true if the underlying user account is disabled, otherwise + * return false. + * + * @returns + * True if the underlying user account is disabled, otherwise false. + */ + this.isDisabled = function isDisabled() { + return template.user.disabled; + }; + + }; + + return ManageableUser; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/types/ManageableUserGroup.js b/guacamole/src/main/frontend/src/app/manage/types/ManageableUserGroup.js new file mode 100644 index 0000000..6853fa0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/types/ManageableUserGroup.js @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the ManageableUserGroup class. + */ +angular.module('manage').factory('ManageableUserGroup', [function defineManageableUserGroup() { + + /** + * A pairing of an @link{UserGroup} with the identifier of its corresponding + * data source. + * + * @constructor + * @param {Object|ManageableUserGroup} template + */ + var ManageableUserGroup = function ManageableUserGroup(template) { + + /** + * The unique identifier of the data source containing this user. + * + * @type String + */ + this.dataSource = template.dataSource; + + /** + * The @link{UserGroup} object represented by this ManageableUserGroup + * and contained within the associated data source. + * + * @type UserGroup + */ + this.userGroup = template.userGroup; + + }; + + return ManageableUserGroup; + +}]); diff --git a/guacamole/src/main/frontend/src/app/manage/types/ManagementPermissions.js b/guacamole/src/main/frontend/src/app/manage/types/ManagementPermissions.js new file mode 100644 index 0000000..5d02a76 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/manage/types/ManagementPermissions.js @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the ManagementPermissions class. + */ +angular.module('manage').factory('ManagementPermissions', ['$injector', + function defineManagementPermissions($injector) { + + // Required types + var PermissionSet = $injector.get('PermissionSet'); + + /** + * Higher-level representation of the management-related permissions + * available to the current user on a particular, arbitrary object. + * + * @constructor + * @param {ManagementPermissions|Object} template + * An object whose properties should be copied into the new + * ManagementPermissions object. + */ + var ManagementPermissions = function ManagementPermissions(template) { + + /** + * The identifier of the associated object, or null if the object does + * not yet exist. + * + * @type String + */ + this.identifier = template.identifier || null; + + /** + * Whether the user can save the associated object. This could be + * updating an existing object, or creating a new object. + * + * @type Boolean + */ + this.canSaveObject = template.canSaveObject; + + /** + * Whether the user can clone the associated object. + * + * @type Boolean + */ + this.canCloneObject = template.canCloneObject; + + /** + * Whether the user can delete the associated object. + * + * @type Boolean + */ + this.canDeleteObject = template.canDeleteObject; + + /** + * Whether the user can change attributes which are currently + * associated with the object. + * + * @type Boolean + */ + this.canChangeAttributes = template.canChangeAttributes; + + /** + * Whether the user can change absolutely all attributes associated + * with the object, including those which are not already present. + * + * @type Boolean + */ + this.canChangeAllAttributes = template.canChangeAllAttributes; + + /** + * Whether the user can change permissions which are assigned to the + * associated object, if the object is capable of being assigned + * permissions. + * + * @type Boolean + */ + this.canChangePermissions = template.canChangePermissions; + + }; + + /** + * Creates a new {@link ManagementPermissions} which defines the high-level + * actions the current user may take for the given object. + * + * @param {PermissionSet} permissions + * The effective permissions granted to the current user within the + * data source associated with the object being managed. + * + * @param {String} createPermission + * The system permission required to create objects of the same type as + * the object being managed, as defined by + * {@link PermissionSet.SystemPermissionTypes}. + * + * @param {Function} hasObjectPermission + * The function to invoke to test whether a {@link PermissionSet} + * contains a particular object permission. The parameters accepted + * by this function must be identical to those accepted by + * {@link PermissionSet.hasUserPermission()}, + * {@link PermissionSet.hasConnectionPermission()}, etc. + * + * @param {String} [identifier] + * The identifier of the object being managed. If the object does not + * yet exist, this parameter should be omitted or set to null. + * + * @returns {ManagementPermissions} + * A new {@link ManagementPermissions} which defines the high-level + * actions the current user may take for the given object. + */ + ManagementPermissions.fromPermissionSet = function fromPermissionSet( + permissions, createPermission, hasObjectPermission, identifier) { + + var isAdmin = PermissionSet.hasSystemPermission(permissions, + PermissionSet.SystemPermissionType.ADMINISTER); + + var canCreate = PermissionSet.hasSystemPermission(permissions, createPermission); + var canAdminister = hasObjectPermission(permissions, PermissionSet.ObjectPermissionType.ADMINISTER, identifier); + var canUpdate = hasObjectPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE, identifier); + var canDelete = hasObjectPermission(permissions, PermissionSet.ObjectPermissionType.DELETE, identifier); + + var exists = !!identifier; + + return new ManagementPermissions({ + + identifier : identifier, + + // A user can save (create or update) an object if they are a + // system-level administrator, OR the object does not yet exist and + // the user has explicit permission to create such objects, OR the + // object does already exist and the user has explicit UPDATE + // permission on the object + canSaveObject : isAdmin || (!exists && canCreate) || canUpdate, + + // A user can clone an object only if the object exists, and + // only if they are a system-level administrator OR they have + // explicit permission to create such objects + canCloneObject : exists && (isAdmin || canCreate), + + // A user can delete an object only if the object exists, and + // only if they are a system-level administrator OR they have + // explicit DELETE permission on the object + canDeleteObject : exists && (isAdmin || canDelete), + + // Attributes in general (with or without existing values) can only + // be changed if the object is being created, OR the user is a + // system-level administrator, OR the user has explicit UPDATE + // permission on the object + canChangeAttributes : !exists || isAdmin || canUpdate, + + // A user can change the attributes of an object which are not + // explicitly defined on that object when the object is being + // created + canChangeAllAttributes : !exists, + + // A user can change the system permissions related to an object + // if they are a system-level admin, OR they are creating the + // object, OR they have explicit ADMINISTER permission on the + // existing object + canChangePermissions : isAdmin || !exists || canAdminister + + }); + + }; + + return ManagementPermissions; + +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/directives/guacMenu.js b/guacamole/src/main/frontend/src/app/navigation/directives/guacMenu.js new file mode 100644 index 0000000..230e902 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/directives/guacMenu.js @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides an arbitrary menu-style container. The contents + * of the directive are displayed only when the menu is open. + */ +angular.module('navigation').directive('guacMenu', [function guacMenu() { + + return { + restrict: 'E', + transclude: true, + replace: true, + scope: { + + /** + * The string which should be rendered as the menu title. + * + * @type String + */ + menuTitle : '=', + + /** + * Whether the menu should remain open while the user interacts + * with the contents of the menu. By default, the menu will close + * if the user clicks within the menu contents. + * + * @type Boolean + */ + interactive : '=' + + }, + + templateUrl: 'app/navigation/templates/guacMenu.html', + controller: ['$scope', '$injector', '$element', + function guacMenuController($scope, $injector, $element) { + + // Get required services + var $document = $injector.get('$document'); + + /** + * The outermost element of the guacMenu directive. + * + * @type Element + */ + var element = $element[0]; + + /** + * The element containing the menu contents that display when the + * menu is open. + * + * @type Element + */ + var contents = $element.find('.menu-contents')[0]; + + /** + * The main document object. + * + * @type Document + */ + var document = $document[0]; + + /** + * Whether the contents of the menu are currently shown. + * + * @type Boolean + */ + $scope.menuShown = false; + + /** + * Toggles visibility of the menu contents. + */ + $scope.toggleMenu = function toggleMenu() { + $scope.menuShown = !$scope.menuShown; + }; + + // Close menu when user clicks anywhere outside this specific menu + document.body.addEventListener('click', function clickOutsideMenu(e) { + $scope.$apply(function closeMenu() { + if (e.target !== element && !element.contains(e.target)) + $scope.menuShown = false; + }); + }, false); + + // Prevent clicks within menu contents from toggling menu visibility + // if the menu contents are intended to be interactive + contents.addEventListener('click', function clickInsideMenuContents(e) { + if ($scope.interactive) + e.stopPropagation(); + }, false); + + }] // end controller + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/directives/guacPageList.js b/guacamole/src/main/frontend/src/app/navigation/directives/guacPageList.js new file mode 100644 index 0000000..c8eb90a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/directives/guacPageList.js @@ -0,0 +1,246 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides a list of links to specific pages. + */ +angular.module('navigation').directive('guacPageList', [function guacPageList() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The array of pages to display. + * + * @type PageDefinition[] + */ + pages : '=' + + }, + + templateUrl: 'app/navigation/templates/guacPageList.html', + controller: ['$scope', '$injector', function guacPageListController($scope, $injector) { + + // Required types + var PageDefinition = $injector.get('PageDefinition'); + + // Required services + var $location = $injector.get('$location'); + + /** + * The URL of the currently-displayed page. + * + * @type String + */ + var currentURL = $location.url(); + + /** + * The names associated with the current page, if the current page + * is known. The value of this property corresponds to the value of + * PageDefinition.name. Though PageDefinition.name may be a String, + * this will always be an Array. + * + * @type String[] + */ + var currentPageName = []; + + /** + * Array of each level of the page list, where a level is defined + * by a mapping of names (translation strings) to the + * PageDefinitions corresponding to those names. + * + * @type Object.[] + */ + $scope.levels = []; + + /** + * Returns the names associated with the given page, in + * hierarchical order. If the page is only associated with a single + * name, and that name is not stored as an array, it will be still + * be returned as an array containing a single item. + * + * @param {PageDefinition} page + * The page to return the names of. + * + * @return {String[]} + * An array of all names associated with the given page, in + * hierarchical order. + */ + var getPageNames = function getPageNames(page) { + + // If already an array, simply return the name + if (angular.isArray(page.name)) + return page.name; + + // Otherwise, transform into array + return [page.name]; + + }; + + /** + * Adds the given PageDefinition to the overall set of pages + * displayed by this guacPageList, automatically updating the + * available levels ($scope.levels) and the contents of those + * levels. + * + * @param {PageDefinition} page + * The PageDefinition to add. + * + * @param {Number} weight + * The sorting weight to use for the page if it does not + * already have an associated weight. + */ + var addPage = function addPage(page, weight) { + + // Pull all names for page + var names = getPageNames(page); + + // Copy the hierarchy of this page into the displayed levels + // as far as is relevant for the currently-displayed page + for (var i = 0; i < names.length; i++) { + + // Create current level, if it doesn't yet exist + var pages = $scope.levels[i]; + if (!pages) + pages = $scope.levels[i] = {}; + + // Get the name at the current level + var name = names[i]; + + // Determine whether this page definition is part of the + // hierarchy containing the current page + var isCurrentPage = (currentPageName[i] === name); + + // Store new page if it doesn't yet exist at this level + if (!pages[name]) { + pages[name] = new PageDefinition({ + name : name, + url : isCurrentPage ? currentURL : page.url, + className : page.className, + weight : page.weight || (weight + i) + }); + } + + // If the name at this level no longer matches the + // hierarchy of the current page, do not go any deeper + if (currentPageName[i] !== name) + break; + + } + + }; + + /** + * Navigate to the given page. + * + * @param {PageDefinition} page + * The page to navigate to. + */ + $scope.navigateToPage = function navigateToPage(page) { + $location.path(page.url); + }; + + /** + * Tests whether the given page is the page currently being viewed. + * + * @param {PageDefinition} page + * The page to test. + * + * @returns {Boolean} + * true if the given page is the current page, false otherwise. + */ + $scope.isCurrentPage = function isCurrentPage(page) { + return currentURL === page.url; + }; + + /** + * Given an arbitrary map of PageDefinitions, returns an array of + * those PageDefinitions, sorted by weight. + * + * @param {Object.<*, PageDefinition>} level + * A map of PageDefinitions with arbitrary keys. The value of + * each key is ignored. + * + * @returns {PageDefinition[]} + * An array of all PageDefinitions in the given map, sorted by + * weight. + */ + $scope.getPages = function getPages(level) { + + var pages = []; + + // Convert contents of level to a flat array of pages + angular.forEach(level, function addPageFromLevel(page) { + pages.push(page); + }); + + // Sort page array by weight + pages.sort(function comparePages(a, b) { + return a.weight - b.weight; + }); + + return pages; + + }; + + // Update page levels whenever pages changes + $scope.$watch('pages', function setPages(pages) { + + // Determine current page name + currentPageName = []; + angular.forEach(pages, function findCurrentPageName(page) { + + // If page is current page, store its names + if ($scope.isCurrentPage(page)) + currentPageName = getPageNames(page); + + }); + + // Reset contents of levels + $scope.levels = []; + + // Add all page definitions + angular.forEach(pages, addPage); + + // Filter to only relevant levels + $scope.levels = $scope.levels.filter(function isRelevant(level) { + + // Determine relevancy by counting the number of pages + var pageCount = 0; + for (var name in level) { + + // Level is relevant if it has two or more pages + if (++pageCount === 2) + return true; + + } + + // Otherwise, the level is not relevant + return false; + + }); + + }); + + }] // end controller + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/directives/guacSectionTabs.js b/guacamole/src/main/frontend/src/app/navigation/directives/guacSectionTabs.js new file mode 100644 index 0000000..97c87c2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/directives/guacSectionTabs.js @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Directive which displays a set of tabs dividing a section of a page into + * logical subsections or views. The currently selected tab is communicated + * through assignment to the variable bound to the current + * attribute. No navigation occurs as a result of selecting a tab. + */ +angular.module('navigation').directive('guacSectionTabs', ['$injector', + function guacSectionTabs($injector) { + + // Required services + var translationStringService = $injector.get('translationStringService'); + + var directive = { + + restrict : 'E', + replace : true, + templateUrl : 'app/navigation/templates/guacSectionTabs.html', + + scope : { + + /** + * The translation namespace to use when producing translation + * strings for each tab. Tab translation strings will be of the + * form: + * + * NAMESPACE.SECTION_HEADER_NAME + * + * where NAMESPACE is the namespace provided to this + * attribute and NAME is one of the names within the + * array provided to the tabs attribute and + * transformed via translationStringService.canonicalize(). + */ + namespace : '@', + + /** + * The name of the currently selected tab. This name MUST be one of + * the names present in the array given via the tabs + * attribute. This directive will not automatically choose an + * initially selected tab, and a default value should be manually + * assigned to current to ensure a tab is initially + * selected. + * + * @type String + */ + current : '=', + + /** + * The unique names of all tabs which should be made available, in + * display order. These names will be assigned to the variable + * bound to the current attribute when the current + * tab changes. + * + * @type String[] + */ + tabs : '=' + + } + + }; + + directive.controller = ['$scope', function dataSourceTabsController($scope) { + + /** + * Produces the translation string for the section header representing + * the tab having the given name. The translation string will be of the + * form: + * + * NAMESPACE.SECTION_HEADER_NAME + * + * where NAMESPACE is the namespace provided to the + * directive and NAME is the given name transformed + * via translationStringService.canonicalize(). + * + * @param {String} name + * The name of the tab. + * + * @returns {String} + * The translation string which produces the translated header + * of the tab having the given name. + */ + $scope.getSectionHeader = function getSectionHeader(name) { + + // If no name, then no header + if (!name) + return ''; + + return translationStringService.canonicalize($scope.namespace || 'MISSING_NAMESPACE') + + '.SECTION_HEADER_' + translationStringService.canonicalize(name); + + }; + + /** + * Selects the tab having the given name. The name of the currently + * selected tab will be communicated outside the directive through + * $scope.current. + * + * @param {String} name + * The name of the tab to select. + */ + $scope.selectTab = function selectTab(name) { + $scope.current = name; + }; + + /** + * Returns whether the tab having the given name is currently + * selected. A tab is currently selected if its name is stored within + * $scope.current, as assigned externally or by selectTab(). + * + * @param {String} name + * The name of the tab to test. + * + * @returns {Boolean} + * true if the tab having the given name is currently selected, + * false otherwise. + */ + $scope.isSelected = function isSelected(name) { + return $scope.current === name; + }; + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/directives/guacUserMenu.js b/guacamole/src/main/frontend/src/app/navigation/directives/guacUserMenu.js new file mode 100644 index 0000000..44a2fb5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/directives/guacUserMenu.js @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which provides a user-oriented menu containing options for + * navigation and configuration. + */ +angular.module('navigation').directive('guacUserMenu', [function guacUserMenu() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * Optional array of actions which are specific to this particular + * location, as these actions may not be appropriate for other + * locations which contain the user menu. + * + * @type MenuAction[] + */ + localActions : '=' + + }, + + templateUrl: 'app/navigation/templates/guacUserMenu.html', + controller: ['$scope', '$injector', + function guacUserMenuController($scope, $injector) { + + // Required types + var User = $injector.get('User'); + + // Get required services + var $location = $injector.get('$location'); + var $route = $injector.get('$route'); + var authenticationService = $injector.get('authenticationService'); + var requestService = $injector.get('requestService'); + var userService = $injector.get('userService'); + var userPageService = $injector.get('userPageService'); + + /** + * The username of the current user. + * + * @type String + */ + $scope.username = authenticationService.getCurrentUsername(); + + /** + * The user's full name. If not yet available, or if not defined, + * this will be null. + * + * @type String + */ + $scope.fullName = null; + + /** + * A URL pointing to relevant user information such as the user's + * email address. If not yet available, or if no such URL can be + * determined, this will be null. + * + * @type String + */ + $scope.userURL = null; + + /** + * The organization, company, group, etc. that the user belongs to. + * If not yet available, or if not defined, this will be null. + * + * @type String + */ + $scope.organization = null; + + /** + * The role that the user has at the organization, company, group, + * etc. they belong to. If not yet available, or if not defined, + * this will be null. + * + * @type String + */ + $scope.role = null; + + // Display user profile attributes if available + userService.getUser(authenticationService.getDataSource(), $scope.username) + .then(function userRetrieved(user) { + + // Pull basic profile information + $scope.fullName = user.attributes[User.Attributes.FULL_NAME]; + $scope.organization = user.attributes[User.Attributes.ORGANIZATION]; + $scope.role = user.attributes[User.Attributes.ORGANIZATIONAL_ROLE]; + + // Link to email address if available + var email = user.attributes[User.Attributes.EMAIL_ADDRESS]; + $scope.userURL = email ? 'mailto:' + email : null; + + }, requestService.IGNORE); + + /** + * The available main pages for the current user. + * + * @type Page[] + */ + $scope.pages = null; + + // Retrieve the main pages from the user page service + userPageService.getMainPages() + .then(function retrievedMainPages(pages) { + $scope.pages = pages; + }); + + /** + * Returns whether the current user has authenticated anonymously. + * + * @returns {Boolean} + * true if the current user has authenticated anonymously, false + * otherwise. + */ + $scope.isAnonymous = function isAnonymous() { + return authenticationService.isAnonymous(); + }; + + /** + * Logs out the current user, redirecting them to back to the root + * after logout completes. + */ + $scope.logout = function logout() { + authenticationService.logout() + ['catch'](requestService.IGNORE); + }; + + /** + * Action which logs out the current user, redirecting them to back + * to the login screen after logout completes. + */ + var LOGOUT_ACTION = { + name : 'USER_MENU.ACTION_LOGOUT', + className : 'logout', + callback : $scope.logout + }; + + /** + * All available actions for the current user. + */ + $scope.actions = [ LOGOUT_ACTION ]; + + }] // end controller + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/navigationModule.js b/guacamole/src/main/frontend/src/app/navigation/navigationModule.js new file mode 100644 index 0000000..24c63e3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/navigationModule.js @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for generating and implementing user navigation options. + */ +angular.module('navigation', [ + 'auth', + 'form', + 'notification', + 'rest' +]); diff --git a/guacamole/src/main/frontend/src/app/navigation/services/userPageService.js b/guacamole/src/main/frontend/src/app/navigation/services/userPageService.js new file mode 100644 index 0000000..9a9f693 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/services/userPageService.js @@ -0,0 +1,488 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for generating all the important pages a user can visit. + */ +angular.module('navigation').factory('userPageService', ['$injector', + function userPageService($injector) { + + // Get required types + var ClientIdentifier = $injector.get('ClientIdentifier'); + var ConnectionGroup = $injector.get('ConnectionGroup'); + var PageDefinition = $injector.get('PageDefinition'); + var PermissionSet = $injector.get('PermissionSet'); + + // Get required services + var $q = $injector.get('$q'); + var authenticationService = $injector.get('authenticationService'); + var connectionGroupService = $injector.get('connectionGroupService'); + var dataSourceService = $injector.get('dataSourceService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var translationStringService = $injector.get('translationStringService'); + + var service = {}; + + /** + * The home page to assign to a user if they can navigate to more than one + * page. + * + * @type PageDefinition + */ + var SYSTEM_HOME_PAGE = new PageDefinition({ + name : 'USER_MENU.ACTION_NAVIGATE_HOME', + url : '/' + }); + + /** + * Returns an appropriate home page for the current user. + * + * @param {Object.} rootGroups + * A map of all root connection groups visible to the current user, + * where each key is the identifier of the corresponding data source. + * + * @param {Object.} permissions + * A map of all permissions granted to the current user, where each + * key is the identifier of the corresponding data source. + * + * @returns {PageDefinition} + * The user's home page. + */ + var generateHomePage = function generateHomePage(rootGroups, permissions) { + + var settingsPages = generateSettingsPages(permissions); + + // If user has access to settings pages, return home page and skip + // evaluation for automatic connections. The Preferences page is + // a Settings page and is always visible, and the Session management + // page is also available to all users so that they can kill their + // own session. We look for more than those two pages to determine + // if we should go to the home page. + if (settingsPages.length > 2) + return SYSTEM_HOME_PAGE; + + // If exactly one connection or balancing group is available, use + // that as the home page + var clientPages = service.getClientPages(rootGroups); + return (clientPages.length === 1) ? clientPages[0] : SYSTEM_HOME_PAGE; + + }; + + /** + * Adds to the given array all pages that the current user may use to + * access connections or balancing groups that are descendants of the given + * connection group. + * + * @param {PageDefinition[]} clientPages + * The array that pages should be added to. + * + * @param {String} dataSource + * The data source containing the given connection group. + * + * @param {ConnectionGroup} connectionGroup + * The connection group ancestor of the connection or balancing group + * descendants whose pages should be added to the given array. + */ + var addClientPages = function addClientPages(clientPages, dataSource, connectionGroup) { + + // Add pages for all child connections + angular.forEach(connectionGroup.childConnections, function addConnectionPage(connection) { + clientPages.push(new PageDefinition({ + name : connection.name, + url : '/client/' + ClientIdentifier.toString({ + dataSource : dataSource, + type : ClientIdentifier.Types.CONNECTION, + id : connection.identifier + }) + })); + }); + + // Add pages for all child balancing groups, as well as the connectable + // descendants of all balancing groups of any type + angular.forEach(connectionGroup.childConnectionGroups, function addConnectionGroupPage(connectionGroup) { + + if (connectionGroup.type === ConnectionGroup.Type.BALANCING) { + clientPages.push(new PageDefinition({ + name : connectionGroup.name, + url : '/client/' + ClientIdentifier.toString({ + dataSource : dataSource, + type : ClientIdentifier.Types.CONNECTION_GROUP, + id : connectionGroup.identifier + }) + })); + } + + addClientPages(clientPages, dataSource, connectionGroup); + + }); + + }; + + /** + * Returns a full list of all pages that the current user may use to access + * a connection or balancing group, regardless of the depth of those + * connections/groups within the connection hierarchy. + * + * @param {Object.} rootGroups + * A map of all root connection groups visible to the current user, + * where each key is the identifier of the corresponding data source. + * + * @returns {PageDefinition[]} + * A list of all pages that the current user may use to access a + * connection or balancing group. + */ + service.getClientPages = function getClientPages(rootGroups) { + + var clientPages = []; + + // Determine whether a connection or balancing group should serve as + // the home page + for (var dataSource in rootGroups) { + addClientPages(clientPages, dataSource, rootGroups[dataSource]); + } + + return clientPages; + + }; + + /** + * Returns a promise which resolves with an appropriate home page for the + * current user. The promise will not be rejected. + * + * @returns {Promise.} + * A promise which resolves with the user's default home page. + */ + service.getHomePage = function getHomePage() { + + var deferred = $q.defer(); + + // Resolve promise using home page derived from root connection groups + var getRootGroups = dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + authenticationService.getAvailableDataSources(), + ConnectionGroup.ROOT_IDENTIFIER + ); + var getPermissionSets = dataSourceService.apply( + permissionService.getEffectivePermissions, + authenticationService.getAvailableDataSources(), + authenticationService.getCurrentUsername() + ); + + $q.all({ + rootGroups : getRootGroups, + permissionsSets : getPermissionSets + }) + .then(function rootConnectionGroupsPermissionsRetrieved(data) { + deferred.resolve(generateHomePage(data.rootGroups,data.permissionsSets)); + }, requestService.DIE); + + return deferred.promise; + + }; + + /** + * Returns all settings pages that the current user can visit. This can + * include any of the various manage pages. + * + * @param {Object.} permissionSets + * A map of all permissions granted to the current user, where each + * key is the identifier of the corresponding data source. + * + * @returns {Page[]} + * An array of all settings pages that the current user can visit. + */ + var generateSettingsPages = function generateSettingsPages(permissionSets) { + + var pages = []; + + var canManageUsers = []; + var canManageUserGroups = []; + var canManageConnections = []; + var canViewConnectionRecords = []; + + // Inspect the contents of each provided permission set + angular.forEach(authenticationService.getAvailableDataSources(), function inspectPermissions(dataSource) { + + // Get permissions for current data source, skipping if non-existent + var permissions = permissionSets[dataSource]; + if (!permissions) + return; + + // Do not modify original object + permissions = angular.copy(permissions); + + // Ignore permission to update root group + PermissionSet.removeConnectionGroupPermission(permissions, + PermissionSet.ObjectPermissionType.UPDATE, + ConnectionGroup.ROOT_IDENTIFIER); + + // Ignore permission to update self + PermissionSet.removeUserPermission(permissions, + PermissionSet.ObjectPermissionType.UPDATE, + authenticationService.getCurrentUsername()); + + // Determine whether the current user needs access to the user management UI + if ( + // System permissions + PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_USER) + + // Permission to update users + || PermissionSet.hasUserPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE) + + // Permission to delete users + || PermissionSet.hasUserPermission(permissions, PermissionSet.ObjectPermissionType.DELETE) + + // Permission to administer users + || PermissionSet.hasUserPermission(permissions, PermissionSet.ObjectPermissionType.ADMINISTER) + ) { + canManageUsers.push(dataSource); + } + + // Determine whether the current user needs access to the group management UI + if ( + // System permissions + PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_USER_GROUP) + + // Permission to update user groups + || PermissionSet.hasUserGroupPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE) + + // Permission to delete user groups + || PermissionSet.hasUserGroupPermission(permissions, PermissionSet.ObjectPermissionType.DELETE) + + // Permission to administer user groups + || PermissionSet.hasUserGroupPermission(permissions, PermissionSet.ObjectPermissionType.ADMINISTER) + ) { + canManageUserGroups.push(dataSource); + } + + // Determine whether the current user needs access to the connection management UI + if ( + // System permissions + PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION) + || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION_GROUP) + + // Permission to update connections or connection groups + || PermissionSet.hasConnectionPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE) + || PermissionSet.hasConnectionGroupPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE) + + // Permission to delete connections or connection groups + || PermissionSet.hasConnectionPermission(permissions, PermissionSet.ObjectPermissionType.DELETE) + || PermissionSet.hasConnectionGroupPermission(permissions, PermissionSet.ObjectPermissionType.DELETE) + + // Permission to administer connections or connection groups + || PermissionSet.hasConnectionPermission(permissions, PermissionSet.ObjectPermissionType.ADMINISTER) + || PermissionSet.hasConnectionGroupPermission(permissions, PermissionSet.ObjectPermissionType.ADMINISTER) + ) { + canManageConnections.push(dataSource); + } + + // Determine whether the current user needs access to view connection history + if ( + // A user must be a system administrator or auditor to view connection records + PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.AUDIT) + ) { + canViewConnectionRecords.push(dataSource); + } + + }); + + // Add link to Session management (always accessible) + pages.push(new PageDefinition({ + name : 'USER_MENU.ACTION_MANAGE_SESSIONS', + url : '/settings/sessions' + })); + + // If user can view connection records, add links for connection history pages + angular.forEach(canViewConnectionRecords, function addConnectionHistoryLink(dataSource) { + pages.push(new PageDefinition({ + name : [ + 'USER_MENU.ACTION_VIEW_HISTORY', + translationStringService.canonicalize('DATA_SOURCE_' + dataSource) + '.NAME' + ], + url : '/settings/' + encodeURIComponent(dataSource) + '/history' + })); + }); + + // If user can manage users, add link to user management page + if (canManageUsers.length) { + pages.push(new PageDefinition({ + name : 'USER_MENU.ACTION_MANAGE_USERS', + url : '/settings/users' + })); + } + + // If user can manage user groups, add link to group management page + if (canManageUserGroups.length) { + pages.push(new PageDefinition({ + name : 'USER_MENU.ACTION_MANAGE_USER_GROUPS', + url : '/settings/userGroups' + })); + } + + // If user can manage connections, add links for connection management pages + angular.forEach(canManageConnections, function addConnectionManagementLink(dataSource) { + pages.push(new PageDefinition({ + name : [ + 'USER_MENU.ACTION_MANAGE_CONNECTIONS', + translationStringService.canonicalize('DATA_SOURCE_' + dataSource) + '.NAME' + ], + url : '/settings/' + encodeURIComponent(dataSource) + '/connections' + })); + }); + + // Add link to user preferences (always accessible) + pages.push(new PageDefinition({ + name : 'USER_MENU.ACTION_MANAGE_PREFERENCES', + url : '/settings/preferences' + })); + + return pages; + }; + + /** + * Returns a promise which resolves to an array of all settings pages that + * the current user can visit. This can include any of the various manage + * pages. The promise will not be rejected. + * + * @returns {Promise.} + * A promise which resolves to an array of all settings pages that the + * current user can visit. + */ + service.getSettingsPages = function getSettingsPages() { + + var deferred = $q.defer(); + + // Retrieve current permissions + dataSourceService.apply( + permissionService.getEffectivePermissions, + authenticationService.getAvailableDataSources(), + authenticationService.getCurrentUsername() + ) + + // Resolve promise using settings pages derived from permissions + .then(function permissionsRetrieved(permissions) { + deferred.resolve(generateSettingsPages(permissions)); + }, requestService.DIE); + + return deferred.promise; + + }; + + /** + * Returns all the main pages that the current user can visit. This can + * include the home page, manage pages, etc. In the case that there are no + * applicable pages of this sort, it may return a client page. + * + * @param {Object.} rootGroups + * A map of all root connection groups visible to the current user, + * where each key is the identifier of the corresponding data source. + * + * @param {Object.} permissions + * A map of all permissions granted to the current user, where each + * key is the identifier of the corresponding data source. + * + * @returns {Page[]} + * An array of all main pages that the current user can visit. + */ + var generateMainPages = function generateMainPages(rootGroups, permissions) { + + var pages = []; + + // Get home page and settings pages + var homePage = generateHomePage(rootGroups, permissions); + var settingsPages = generateSettingsPages(permissions); + + // Only include the home page in the list of main pages if the user + // can navigate elsewhere. + if (homePage === SYSTEM_HOME_PAGE || settingsPages.length) + pages.push(homePage); + + // Add generic link to the first-available settings page + if (settingsPages.length) { + pages.push(new PageDefinition({ + name : 'USER_MENU.ACTION_MANAGE_SETTINGS', + url : settingsPages[0].url + })); + } + + return pages; + }; + + /** + * Returns a promise which resolves to an array of all main pages that the + * current user can visit. This can include the home page, manage pages, + * etc. In the case that there are no applicable pages of this sort, it may + * return a client page. The promise will not be rejected. + * + * @returns {Promise.} + * A promise which resolves to an array of all main pages that the + * current user can visit. + */ + service.getMainPages = function getMainPages() { + + var deferred = $q.defer(); + + var rootGroups = null; + var permissions = null; + + /** + * Resolves the main pages retrieval promise, if possible. If + * insufficient data is available, this function does nothing. + */ + var resolveMainPages = function resolveMainPages() { + if (rootGroups && permissions) + deferred.resolve(generateMainPages(rootGroups, permissions)); + }; + + // Retrieve root group, resolving main pages if possible + dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + authenticationService.getAvailableDataSources(), + ConnectionGroup.ROOT_IDENTIFIER + ) + .then(function rootConnectionGroupsRetrieved(retrievedRootGroups) { + rootGroups = retrievedRootGroups; + resolveMainPages(); + }, requestService.DIE); + + // Retrieve current permissions + dataSourceService.apply( + permissionService.getEffectivePermissions, + authenticationService.getAvailableDataSources(), + authenticationService.getCurrentUsername() + ) + + // Resolving main pages if possible + .then(function permissionsRetrieved(retrievedPermissions) { + permissions = retrievedPermissions; + resolveMainPages(); + }, requestService.DIE); + + return deferred.promise; + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/styles/menu.css b/guacamole/src/main/frontend/src/app/navigation/styles/menu.css new file mode 100644 index 0000000..608650e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/styles/menu.css @@ -0,0 +1,161 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.menu-dropdown { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: center; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: center; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: center; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: center; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: center; + flex-direction: row; + +} + +.menu-dropdown { + position: relative; + border-left: 1px solid rgba(0,0,0,0.125); + background: rgba(0,0,0,0.04); +} + +.menu-dropdown:hover { + background: rgba(0,0,0,0.01); +} + +.menu-dropdown.open, +.menu-dropdown.open:hover { + background: rgba(0,0,0,0.3); +} + +.menu-dropdown .menu-title { + + cursor: default; + margin: 0; + padding: 0.5em; + padding-right: 2em; + + white-space: nowrap; + overflow: hidden; + width: 100%; + text-overflow: ellipsis; + + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; + +} + +.menu-dropdown .menu-indicator { + + position: absolute; + right: 0; + top: 0; + bottom: 0; + + width: 2em; + background-repeat: no-repeat; + background-size: 1em; + background-position: center center; + background-image: url('images/arrows/down.svg'); + +} + +.menu-dropdown .menu-contents { + + visibility: hidden; + + position: absolute; + top: 100%; + right: 0; + min-width: 100%; + white-space: nowrap; + + background: #EEE; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.125); + border-left: 1px solid rgba(0,0,0,0.125); + border-bottom: 1px solid rgba(0,0,0,0.125); + + z-index: 5; + +} + +.menu-dropdown .menu-contents ul { + margin: 0; + padding: 0; +} + +.menu-dropdown.open .menu-contents { + visibility: visible; +} + +.menu-dropdown .menu-contents li { + padding: 0; + list-style-type: none; +} + +.menu-dropdown .menu-contents li a { + + display: block; + cursor: pointer; + color: black; + text-decoration: none; + padding: 0.75em; + +} + +.menu-dropdown .menu-contents li a:hover { + background-color: #CDA; +} + +.menu-dropdown .menu-contents li a.current, +.menu-dropdown .menu-contents li a.current:hover { + background-color: transparent; + cursor: default; + opacity: 0.25; +} + +.menu-dropdown .menu-contents li a.danger { + color: white; + font-weight: bold; + background-color: #A43; +} + +.menu-dropdown .menu-contents li a.danger:hover { + background-color: #C54; +} diff --git a/guacamole/src/main/frontend/src/app/navigation/styles/tabs.css b/guacamole/src/main/frontend/src/app/navigation/styles/tabs.css new file mode 100644 index 0000000..3d1c8cd --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/styles/tabs.css @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.page-tabs .page-list ul, +.section-tabs ul { + margin: 0; + padding: 0; + background: rgba(0, 0, 0, 0.0125); + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.page-tabs .page-list ul + ul, +.section-tabs ul + ul { + font-size: 0.75em; +} + +.page-tabs .page-list li, +.section-tabs li { + display: inline-block; + list-style: none; +} + +.page-tabs .page-list li a[href], +.section-tabs li a { + display: block; + color: black; + text-decoration: none; + padding: 0.75em 1em; +} + +.page-tabs .page-list li a[href]:visited { + color: black; +} + +.page-tabs .page-list li a[href]:hover, +.section-tabs li a:hover { + background-color: #CDA; + cursor: pointer; +} + +.page-tabs .page-list li a[href].current, +.page-tabs .page-list li a[href].current:hover, +.section-tabs li a.current, +.section-tabs li a.current:hover { + background: rgba(0,0,0,0.3); + cursor: default; +} diff --git a/guacamole/src/main/frontend/src/app/navigation/styles/user-menu.css b/guacamole/src/main/frontend/src/app/navigation/styles/user-menu.css new file mode 100644 index 0000000..0af3f82 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/styles/user-menu.css @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.user-menu { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: row; + +} + +.user-menu .menu-dropdown .menu-title { + + font-weight: bold; + padding-left: 2em; + + background-repeat: no-repeat; + background-size: 1em; + background-position: 0.5em center; + background-image: url('images/user-icons/guac-user.svg'); + +} + +.user-menu .menu-dropdown .menu-contents li a { + + background-repeat: no-repeat; + background-size: 1em; + background-position: 0.75em center; + padding-left: 2.5em; + background-image: url('images/protocol-icons/guac-monitor.svg'); + +} + +.user-menu .menu-dropdown .menu-contents li a[href="#/"] { + background-image: url('images/action-icons/guac-home-dark.svg'); +} + +.user-menu .menu-dropdown .menu-contents li a[href="#/settings/users"], +.user-menu .menu-dropdown .menu-contents li a[href="#/settings/connections"], +.user-menu .menu-dropdown .menu-contents li a[href="#/settings/sessions"], +.user-menu .menu-dropdown .menu-contents li a[href="#/settings/preferences"] { + background-image: url('images/action-icons/guac-config-dark.svg'); +} + +.user-menu .menu-dropdown .menu-contents li a.logout { + background-image: url('images/action-icons/guac-logout-dark.svg'); +} + +.user-menu .menu-dropdown .menu-contents .profile { + margin: 1em; + padding-bottom: 1em; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + width: 2in; +} + +.user-menu .menu-dropdown .menu-contents .profile .full-name { + font-weight: bold; +} +.user-menu .menu-dropdown .menu-contents .profile .organization, +.user-menu .menu-dropdown .menu-contents .profile .organizational-role { + font-size: 0.8em; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/navigation/templates/guacMenu.html b/guacamole/src/main/frontend/src/app/navigation/templates/guacMenu.html new file mode 100644 index 0000000..f7ddee9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/templates/guacMenu.html @@ -0,0 +1,7 @@ + diff --git a/guacamole/src/main/frontend/src/app/navigation/templates/guacPageList.html b/guacamole/src/main/frontend/src/app/navigation/templates/guacPageList.html new file mode 100644 index 0000000..efadd0a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/templates/guacPageList.html @@ -0,0 +1,13 @@ + diff --git a/guacamole/src/main/frontend/src/app/navigation/templates/guacSectionTabs.html b/guacamole/src/main/frontend/src/app/navigation/templates/guacSectionTabs.html new file mode 100644 index 0000000..a028715 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/templates/guacSectionTabs.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/navigation/templates/guacUserMenu.html b/guacamole/src/main/frontend/src/app/navigation/templates/guacUserMenu.html new file mode 100644 index 0000000..9869cd6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/templates/guacUserMenu.html @@ -0,0 +1,33 @@ +
      + + + +
      + +
      {{ role }}
      +
      {{ organization }}
      +
      + + + + + + + + + + +
      +
      diff --git a/guacamole/src/main/frontend/src/app/navigation/types/ClientIdentifier.js b/guacamole/src/main/frontend/src/app/navigation/types/ClientIdentifier.js new file mode 100644 index 0000000..47af7ad --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/types/ClientIdentifier.js @@ -0,0 +1,218 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the ClientIdentifier class definition. + */ +angular.module('navigation').factory('ClientIdentifier', ['$injector', + function defineClientIdentifier($injector) { + + // Required services + var authenticationService = $injector.get('authenticationService'); + var $window = $injector.get('$window'); + + /** + * Object which uniquely identifies a particular connection or connection + * group within Guacamole. This object can be converted to/from a string to + * generate a guaranteed-unique, deterministic identifier for client URLs. + * + * @constructor + * @param {ClientIdentifier|Object} [template={}] + * The object whose properties should be copied within the new + * ClientIdentifier. + */ + var ClientIdentifier = function ClientIdentifier(template) { + + // Use empty object by default + template = template || {}; + + /** + * The identifier of the data source associated with the object to + * which the client will connect. This identifier will be the + * identifier of an AuthenticationProvider within the Guacamole web + * application. + * + * @type String + */ + this.dataSource = template.dataSource; + + /** + * The type of object to which the client will connect. Possible values + * are defined within ClientIdentifier.Types. + * + * @type String + */ + this.type = template.type; + + /** + * The unique identifier of the object to which the client will + * connect. + * + * @type String + */ + this.id = template.id; + + }; + + /** + * All possible ClientIdentifier types. + * + * @type Object. + */ + ClientIdentifier.Types = { + + /** + * The type string for a Guacamole connection. + * + * @type String + */ + CONNECTION : 'c', + + /** + * The type string for a Guacamole connection group. + * + * @type String + */ + CONNECTION_GROUP : 'g', + + /** + * The type string for an active Guacamole connection. + * + * @type String + */ + ACTIVE_CONNECTION : 'a' + + }; + + /** + * Encodes the given value as base64url, a variant of base64 defined by + * RFC 4648: https://datatracker.ietf.org/doc/html/rfc4648#section-5. + * + * The "base64url" variant is identical to standard base64 except that it + * uses "-" instead of "+", "_" instead of "/", and padding with "=" is + * optional. + * + * @param {string} value + * The string value to encode. + * + * @returns {string} + * The provided string value encoded as unpadded base64url. + */ + var base64urlEncode = function base64urlEncode(value) { + + // Translate padded standard base64 to unpadded base64url + return $window.btoa(value).replace(/[+/=]/g, + (str) => ({ + '+' : '-', + '/' : '_', + '=' : '' + })[str] + ); + + }; + + /** + * Decodes the given base64url or base64 string. The input string may + * contain "=" padding characters, but this is not required. + * + * @param {string} value + * The base64url or base64 value to decode. + * + * @returns {string} + * The result of decoding the provided base64url or base64 string. + */ + var base64urlDecode = function base64urlDecode(value) { + + // Add any missing padding (standard base64 requires input strings to + // be multiples of 4 in length, padded using '=') + value += ([ + '', + '===', + '==', + '=' + ])[value.length % 4]; + + // Translate padded base64url to padded standard base64 + return $window.atob(value.replace(/[-_]/g, + (str) => ({ + '-' : '+', + '_' : '/' + })[str] + )); + }; + + /** + * Converts the given ClientIdentifier or ClientIdentifier-like object to + * a String representation. Any object having the same properties as + * ClientIdentifier may be used, but only those properties will be taken + * into account when producing the resulting String. + * + * @param {ClientIdentifier|Object} id + * The ClientIdentifier or ClientIdentifier-like object to convert to + * a String representation. + * + * @returns {String} + * A deterministic String representation of the given ClientIdentifier + * or ClientIdentifier-like object. + */ + ClientIdentifier.toString = function toString(id) { + return base64urlEncode([ + id.id, + id.type, + id.dataSource + ].join('\0')); + }; + + /** + * Converts the given String into the corresponding ClientIdentifier. If + * the provided String is not a valid identifier, it will be interpreted + * as the identifier of a connection within the data source that + * authenticated the current user. + * + * @param {String} str + * The String to convert to a ClientIdentifier. + * + * @returns {ClientIdentifier} + * The ClientIdentifier represented by the given String. + */ + ClientIdentifier.fromString = function fromString(str) { + + try { + var values = base64urlDecode(str).split('\0'); + return new ClientIdentifier({ + id : values[0], + type : values[1], + dataSource : values[2] + }); + } + + // If the provided string is invalid, transform into a reasonable guess + catch (e) { + return new ClientIdentifier({ + id : str, + type : ClientIdentifier.Types.CONNECTION, + dataSource : authenticationService.getDataSource() || 'default' + }); + } + + }; + + return ClientIdentifier; + +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/types/MenuAction.js b/guacamole/src/main/frontend/src/app/navigation/types/MenuAction.js new file mode 100644 index 0000000..a63bae5 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/types/MenuAction.js @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the MenuAction class definition. + */ +angular.module('navigation').factory('MenuAction', [function defineMenuAction() { + + /** + * Creates a new MenuAction, which pairs an arbitrary callback with + * an action name. The name of this action will ultimately be presented to + * the user when the user when this action's associated menu is open. + * + * @constructor + * @param {String} name + * The name of this action. + * + * @param {Function} callback + * The callback to call when the user elects to perform this action. + * + * @param {String} className + * The CSS class to associate with this action, if any. + */ + var MenuAction = function MenuAction(name, callback, className) { + + /** + * Reference to this MenuAction. + * + * @type MenuAction + */ + var action = this; + + /** + * The CSS class associated with this action. + * + * @type String + */ + this.className = className; + + /** + * The name of this action. + * + * @type String + */ + this.name = name; + + /** + * The callback to call when this action is performed. + * + * @type Function + */ + this.callback = callback; + + }; + + return MenuAction; + +}]); diff --git a/guacamole/src/main/frontend/src/app/navigation/types/PageDefinition.js b/guacamole/src/main/frontend/src/app/navigation/types/PageDefinition.js new file mode 100644 index 0000000..f78129c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/navigation/types/PageDefinition.js @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the PageDefinition class definition. + */ +angular.module('navigation').factory('PageDefinition', [function definePageDefinition() { + + /** + * Creates a new PageDefinition object which pairs the URL of a page with + * an arbitrary, human-readable name. + * + * @constructor + * @param {PageDefinition|Object} template + * The object whose properties should be copied within the new + * PageDefinition. + */ + var PageDefinition = function PageDefinition(template) { + + /** + * The name of the page, which should be a translation table key. + * Alternatively, this may also be a list of names, where the final + * name represents the page and earlier names represent categorization. + * Those categorical names may be rendered hierarchically as a system + * of menus, tabs, etc. + * + * @type String|String[] + */ + this.name = template.name; + + /** + * The URL of the page. + * + * @type String + */ + this.url = template.url; + + /** + * The CSS class name to associate with this page, if any. This will be + * an empty string by default. + * + * @type String + */ + this.className = template.className || ''; + + /** + * A numeric value denoting the relative sort order when compared to + * other sibling PageDefinitions. If unspecified, sort order is + * determined by the system using the PageDefinition. + * + * @type Number + */ + this.weight = template.weight; + + }; + + return PageDefinition; + +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/directives/guacModal.js b/guacamole/src/main/frontend/src/app/notification/directives/guacModal.js new file mode 100644 index 0000000..8cc6392 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/directives/guacModal.js @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for displaying arbitrary modal content. + */ +angular.module('notification').directive('guacModal', [function guacModal() { + return { + restrict: 'E', + templateUrl: 'app/notification/templates/guacModal.html', + transclude: true + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/directives/guacNotification.js b/guacamole/src/main/frontend/src/app/notification/directives/guacNotification.js new file mode 100644 index 0000000..d3570e0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/directives/guacNotification.js @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for the guacamole client. + */ +angular.module('notification').directive('guacNotification', [function guacNotification() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The notification to display. + * + * @type Notification|Object + */ + notification : '=' + + }, + + templateUrl: 'app/notification/templates/guacNotification.html', + controller: ['$scope', '$interval', function guacNotificationController($scope, $interval) { + + // Update progress bar if end known + $scope.$watch("notification.progress.ratio", function updateProgress(ratio) { + $scope.progressPercent = ratio * 100; + }); + + $scope.$watch("notification", function resetTimeRemaining(notification) { + + var countdown = notification.countdown; + + // Clean up any existing interval + if ($scope.interval) + $interval.cancel($scope.interval); + + // Update and handle countdown, if provided + if (countdown) { + + $scope.timeRemaining = countdown.remaining; + + $scope.interval = $interval(function updateTimeRemaining() { + + // Update time remaining + $scope.timeRemaining--; + + // Call countdown callback when time remaining expires + if ($scope.timeRemaining === 0 && countdown.callback) + countdown.callback(); + + }, 1000, $scope.timeRemaining); + + } + + }); + + // Clean up interval upon destruction + $scope.$on("$destroy", function destroyNotification() { + + if ($scope.interval) + $interval.cancel($scope.interval); + + }); + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/notificationModule.js b/guacamole/src/main/frontend/src/app/notification/notificationModule.js new file mode 100644 index 0000000..15a2a46 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/notificationModule.js @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code used to display arbitrary notifications. + */ +angular.module('notification', [ + 'rest', + 'storage' +]); diff --git a/guacamole/src/main/frontend/src/app/notification/services/guacNotification.js b/guacamole/src/main/frontend/src/app/notification/services/guacNotification.js new file mode 100644 index 0000000..22eeed6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/services/guacNotification.js @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for displaying notifications and modal status dialogs. + */ +angular.module('notification').factory('guacNotification', ['$injector', + function guacNotification($injector) { + + // Required services + var $rootScope = $injector.get('$rootScope'); + var requestService = $injector.get('requestService'); + var sessionStorageFactory = $injector.get('sessionStorageFactory'); + + var service = {}; + + /** + * Getter/setter which retrieves or sets the current status notification, + * which may simply be false if no status is currently shown. + * + * @type Function + */ + var storedStatus = sessionStorageFactory.create(false); + + /** + * An action to be provided along with the object sent to showStatus which + * closes the currently-shown status dialog. + * + * @type NotificationAction + */ + service.ACKNOWLEDGE_ACTION = { + name : 'APP.ACTION_ACKNOWLEDGE', + callback : function acknowledgeCallback() { + service.showStatus(false); + } + }; + + /** + * Retrieves the current status notification, which may simply be false if + * no status is currently shown. + * + * @type Notification|Boolean + */ + service.getStatus = function getStatus() { + return storedStatus(); + }; + + /** + * Shows or hides the given notification as a modal status. If a status + * notification is currently shown, no further statuses will be shown + * until the current status is hidden. + * + * @param {Notification|Boolean|Object} status + * The status notification to show. + * + * @example + * + * // To show a status message with actions + * guacNotification.showStatus({ + * 'title' : 'Disconnected', + * 'text' : { + * 'key' : 'NAMESPACE.SOME_TRANSLATION_KEY' + * }, + * 'actions' : [{ + * 'name' : 'reconnect', + * 'callback' : function () { + * // Reconnection code goes here + * } + * }] + * }); + * + * // To hide the status message + * guacNotification.showStatus(false); + */ + service.showStatus = function showStatus(status) { + if (!storedStatus() || !status) + storedStatus(status); + }; + + /** + * Promise error callback which displays a modal notification for all + * rejections due to REST errors. The message displayed to the user within + * the notification is provided by the contents of the @link{Error} object + * within the REST response. All other rejections, such as those due to + * JavaScript errors, are logged to the browser console without displaying + * any notification. + * + * @constant + * @type Function + */ + service.SHOW_REQUEST_ERROR = requestService.createErrorCallback(function showRequestError(error) { + service.showStatus({ + className : 'error', + title : 'APP.DIALOG_HEADER_ERROR', + text : error.translatableMessage, + actions : [ service.ACKNOWLEDGE_ACTION ] + }); + }); + + // Hide status upon navigation + $rootScope.$on('$routeChangeSuccess', function() { + service.showStatus(false); + }); + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/styles/modal.css b/guacamole/src/main/frontend/src/app/notification/styles/modal.css new file mode 100644 index 0000000..dade6f2 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/styles/modal.css @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +guac-modal { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 100%; + width: 100%; + position: fixed; + left: 0; + top: 0; + z-index: 10; + overflow: hidden; +} + +guac-modal .modal-contents { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + text-align: center; +} + +guac-modal { + animation: fadein 0.125s linear; + -moz-animation: fadein 0.125s linear; + -webkit-animation: fadein 0.125s linear; +} diff --git a/guacamole/src/main/frontend/src/app/notification/styles/notification.css b/guacamole/src/main/frontend/src/app/notification/styles/notification.css new file mode 100644 index 0000000..f5b99fe --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/styles/notification.css @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.notification { + border: 1px solid rgba(0, 0, 0, 0.25); + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25); + background: white; + color: black; +} + +.notification.error { + background: #FDD; +} + +.notification .body { + margin: 0.5em; +} + +.notification .buttons { + margin: 0.5em; +} + +@keyframes notification-progress { + from {background-position: 0px 0px;} + to {background-position: 64px 0px;} +} + +@-webkit-keyframes notification-progress { + from {background-position: 0px 0px;} + to {background-position: 64px 0px;} +} + +.notification .title-bar { + font-size: 1.25em; + font-weight: bold; + + text-transform: uppercase; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.125); + background: rgba(0, 0, 0, 0.04); + + padding: 0.5em; + margin-bottom: 1em; +} + +.notification .progress .bar { + background: #A3D655; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 0; + box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.5), + inset -1px -1px 0 rgba( 0, 0, 0, 0.1), + 1px 1px 0 gray; +} + +.notification .progress { + + width: 100%; + background: #C2C2C2 url('images/progress.svg'); + background-size: 16px 16px; + -moz-background-size: 16px 16px; + -webkit-background-size: 16px 16px; + -khtml-background-size: 16px 16px; + + animation-name: notification-progress; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: infinite; + + -webkit-animation-name: notification-progress; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + + padding: 0.25em; + + border: 1px solid gray; + + position: relative; + +} + +.notification .progress .text { + position: relative; +} + +.notification .parameters { + width: 100%; +} + +.notification .parameters .fields { + display: table; + width: 100%; +} + +.notification .parameters .fields .labeled-field { + display: table-row; +} + +.notification .parameters .fields .field-header, +.notification .parameters .fields .form-field { + text-align: left; + display: table-cell; + padding: .125em; + vertical-align: top; +} + +.notification .parameters .fields .field-header { + padding-right: 1em; +} + +.notification .parameters .fields .field-header { + width: 0; +} + +.notification .parameters .fields .form-field { + width: 100%; +} + +.notification .parameters input[type=text], +.notification .parameters input[type=email], +.notification .parameters input[type=number], +.notification .parameters input[type=password], +.notification .parameters textarea { + max-width: 100%; +} diff --git a/guacamole/src/main/frontend/src/app/notification/templates/guacModal.html b/guacamole/src/main/frontend/src/app/notification/templates/guacModal.html new file mode 100644 index 0000000..57a1b5a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/templates/guacModal.html @@ -0,0 +1,3 @@ + diff --git a/guacamole/src/main/frontend/src/app/notification/templates/guacNotification.html b/guacamole/src/main/frontend/src/app/notification/templates/guacNotification.html new file mode 100644 index 0000000..b002bb0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/templates/guacNotification.html @@ -0,0 +1,44 @@ +
      + + +
      +
      {{notification.title | translate}}
      +
      + +
      + + +

      + + +
      + +
      + + +
      + + +

      + +
      + + +
      + +
      + + diff --git a/guacamole/src/main/frontend/src/app/notification/types/Notification.js b/guacamole/src/main/frontend/src/app/notification/types/Notification.js new file mode 100644 index 0000000..eee1601 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/types/Notification.js @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the Notification class definition. + */ +angular.module('notification').factory('Notification', [function defineNotification() { + + /** + * Creates a new Notification, initializing the properties of that + * Notification with the corresponding properties of the given template. + * + * @constructor + * @param {Notification|Object} [template={}] + * The object whose properties should be copied within the new + * Notification. + */ + var Notification = function Notification(template) { + + // Use empty object by default + template = template || {}; + + /** + * The CSS class to associate with the notification, if any. + * + * @type String + */ + this.className = template.className; + + /** + * The title of the notification. + * + * @type String + */ + this.title = template.title; + + /** + * The body text of the notification. + * + * @type TranslatableMessage + */ + this.text = template.text; + + /** + * The translation namespace of the translation strings that will + * be generated for all fields within the notification. This namespace + * is absolutely required if form fields will be included in the + * notification. + * + * @type String + */ + this.formNamespace = template.formNamespace; + + /** + * Optional form content to display. This may be a form, an array of + * forms, or a simple array of fields. + * + * @type Form[]|Form|Field[]|Field + */ + this.forms = template.forms; + + /** + * The object which will receive all field values. Each field value + * will be assigned to the property of this object having the same + * name. + * + * @type Object. + */ + this.formModel = template.model; + + /** + * The function to invoke when the form is submitted, if form fields + * are present within the notification. + * + * @type Function + */ + this.formSubmitCallback = template.formSubmitCallback; + + /** + * An array of all actions available to the user in response to this + * notification. + * + * @type NotificationAction[] + */ + this.actions = template.actions || []; + + /** + * The current progress state of the ongoing action associated with this + * notification. + * + * @type NotificationProgress + */ + this.progress = template.progress; + + /** + * The countdown and corresponding default action which applies to + * this notification, if any. + * + * @type NotificationCountdown + */ + this.countdown = template.countdown; + + }; + + return Notification; + +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/types/NotificationAction.js b/guacamole/src/main/frontend/src/app/notification/types/NotificationAction.js new file mode 100644 index 0000000..cc41acc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/types/NotificationAction.js @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the NotificationAction class definition. + */ +angular.module('notification').factory('NotificationAction', [function defineNotificationAction() { + + /** + * Creates a new NotificationAction, which pairs an arbitrary callback with + * an action name. The name of this action will ultimately be presented to + * the user when the user is prompted to choose among available actions. + * + * @constructor + * @param {String} name The name of this action. + * + * @param {Function} callback + * The callback to call when the user elects to perform this action. + * + * @param {String} className + * The CSS class to associate with this action, if any. + */ + var NotificationAction = function NotificationAction(name, callback, className) { + + /** + * Reference to this NotificationAction. + * + * @type NotificationAction + */ + var action = this; + + /** + * The CSS class associated with this action. + * + * @type String + */ + this.className = className; + + /** + * The name of this action. + * + * @type String + */ + this.name = name; + + /** + * The callback to call when this action is performed. + * + * @type Function + */ + this.callback = callback; + + }; + + return NotificationAction; + +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/types/NotificationCountdown.js b/guacamole/src/main/frontend/src/app/notification/types/NotificationCountdown.js new file mode 100644 index 0000000..fc60743 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/types/NotificationCountdown.js @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the NotificationCountdown class definition. + */ +angular.module('notification').factory('NotificationCountdown', [function defineNotificationCountdown() { + + /** + * Creates a new NotificationCountdown which describes an action that + * should be performed after a specific number of seconds has elapsed. + * + * @constructor + * @param {String} text The body text of the notification countdown. + * + * @param {Number} remaining + * The number of seconds remaining in the countdown. + * + * @param {Function} [callback] + * The callback to call when the countdown elapses. + */ + var NotificationCountdown = function NotificationCountdown(text, remaining, callback) { + + /** + * Reference to this NotificationCountdown. + * + * @type NotificationCountdown + */ + var countdown = this; + + /** + * The body text of the notification countdown. For the sake of i18n, + * the variable REMAINING should be applied within the translation + * string for formatting plurals, etc. + * + * @type String + */ + this.text = text; + + /** + * The number of seconds remaining in the countdown. After this number + * of seconds elapses, the callback associated with this + * NotificationCountdown will be called. + * + * @type Number + */ + this.remaining = remaining; + + /** + * The callback to call when this countdown expires. + * + * @type Function + */ + this.callback = callback; + + }; + + return NotificationCountdown; + +}]); diff --git a/guacamole/src/main/frontend/src/app/notification/types/NotificationProgress.js b/guacamole/src/main/frontend/src/app/notification/types/NotificationProgress.js new file mode 100644 index 0000000..af754ab --- /dev/null +++ b/guacamole/src/main/frontend/src/app/notification/types/NotificationProgress.js @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Provides the NotificationProgress class definition. + */ +angular.module('notification').factory('NotificationProgress', [function defineNotificationProgress() { + + /** + * Creates a new NotificationProgress which describes the current status + * of an operation, and how much of that operation remains to be performed. + * + * @constructor + * @param {String} text The text describing the operation progress. + * + * @param {Number} value + * The current state of operation progress, as an arbitrary number + * which increases as the operation continues. + * + * @param {String} [unit] + * The unit of the arbitrary value, if that value has an associated + * unit. + * + * @param {Number} [ratio] + * If known, the current status of the operation as a value between 0 + * and 1 inclusive, where 0 is not yet started, and 1 is complete. + */ + var NotificationProgress = function NotificationProgress(text, value, unit, ratio) { + + /** + * The text describing the operation progress. For the sake of i18n, + * the variable PROGRESS should be applied within the translation + * string for formatting plurals, etc., while UNIT should be used + * for the progress unit, if any. + * + * @type String + */ + this.text = text; + + /** + * The current state of operation progress, as an arbitrary number which + * increases as the operation continues. + * + * @type Number + */ + this.value = value; + + /** + * The unit of the arbitrary value, if that value has an associated + * unit. + * + * @type String + */ + this.unit = unit; + + /** + * If known, the current status of the operation as a value between 0 + * and 1 inclusive, where 0 is not yet started, and 1 is complete. + * + * @type String + */ + this.ratio = ratio; + + }; + + return NotificationProgress; + +}]); diff --git a/guacamole/src/main/frontend/src/app/osk/directives/guacOsk.js b/guacamole/src/main/frontend/src/app/osk/directives/guacOsk.js new file mode 100644 index 0000000..2236ac8 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/osk/directives/guacOsk.js @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays the Guacamole on-screen keyboard. + */ +angular.module('osk').directive('guacOsk', [function guacOsk() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The URL for the Guacamole on-screen keyboard layout to use. + * + * @type String + */ + layout : '=' + + }, + + templateUrl: 'app/osk/templates/guacOsk.html', + controller: ['$scope', '$injector', '$element', + function guacOsk($scope, $injector, $element) { + + // Required services + var $http = $injector.get('$http'); + var $rootScope = $injector.get('$rootScope'); + var cacheService = $injector.get('cacheService'); + + /** + * The current on-screen keyboard, if any. + * + * @type Guacamole.OnScreenKeyboard + */ + var keyboard = null; + + /** + * The main containing element for the entire directive. + * + * @type Element + */ + var main = $element[0]; + + // Size keyboard to same size as main element + $scope.keyboardResized = function keyboardResized() { + + // Resize keyboard, if defined + if (keyboard) + keyboard.resize(main.offsetWidth); + + }; + + // Set layout whenever URL changes + $scope.$watch("layout", function setLayout(url) { + + // Remove current keyboard + if (keyboard) { + main.removeChild(keyboard.getElement()); + keyboard = null; + } + + // Load new keyboard + if (url) { + + // Retrieve layout JSON + $http({ + cache : cacheService.languages, + method : 'GET', + url : url + }) + + // Build OSK with retrieved layout + .then(function layoutRetrieved(request) { + + var layout = request.data; + + // Abort if the layout changed while we were waiting for a response + if ($scope.layout !== url) + return; + + // Add OSK element + keyboard = new Guacamole.OnScreenKeyboard(layout); + main.appendChild(keyboard.getElement()); + + // Init size + keyboard.resize(main.offsetWidth); + + // Broadcast keydown for each key pressed + keyboard.onkeydown = function(keysym) { + $rootScope.$broadcast('guacSyntheticKeydown', keysym); + }; + + // Broadcast keydown for each key released + keyboard.onkeyup = function(keysym) { + $rootScope.$broadcast('guacSyntheticKeyup', keysym); + }; + + }, angular.noop); + + } + + }); // end layout scope watch + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/osk/oskModule.js b/guacamole/src/main/frontend/src/app/osk/oskModule.js new file mode 100644 index 0000000..ff7fc7c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/osk/oskModule.js @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for displaying the Guacamole on-screen keyboard. + */ +angular.module('osk', []); diff --git a/guacamole/src/main/frontend/src/app/osk/styles/osk.css b/guacamole/src/main/frontend/src/app/osk/styles/osk.css new file mode 100644 index 0000000..23a5a1d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/osk/styles/osk.css @@ -0,0 +1,228 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.osk { + position: relative; +} + +.guac-keyboard { + display: inline-block; + width: 100%; + + margin: 0; + padding: 0; + cursor: default; + + text-align: left; + vertical-align: middle; +} + +.guac-keyboard, +.guac-keyboard * { + overflow: hidden; + white-space: nowrap; +} + +.guac-keyboard .guac-keyboard-key-container { + display: inline-block; + margin: 0.05em; + position: relative; +} + +.guac-keyboard .guac-keyboard-key { + + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + + background: #444; + + border: 0.125em solid #666; + -moz-border-radius: 0.25em; + -webkit-border-radius: 0.25em; + -khtml-border-radius: 0.25em; + border-radius: 0.25em; + + color: white; + font-size: 40%; + font-weight: lighter; + text-align: center; + white-space: pre; + + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.25), + 1px -1px 0 rgba(0, 0, 0, 0.25), + -1px 1px 0 rgba(0, 0, 0, 0.25), + -1px -1px 0 rgba(0, 0, 0, 0.25); + +} + +.guac-keyboard .guac-keyboard-key:hover { + cursor: pointer; +} + +.guac-keyboard .guac-keyboard-key.highlight { + background: #666; + border-color: #666; +} + +/* Align some keys to the left */ +.guac-keyboard .guac-keyboard-key-caps, +.guac-keyboard .guac-keyboard-key-enter, +.guac-keyboard .guac-keyboard-key-tab, +.guac-keyboard .guac-keyboard-key-lalt, +.guac-keyboard .guac-keyboard-key-ralt, +.guac-keyboard .guac-keyboard-key-alt-gr, +.guac-keyboard .guac-keyboard-key-lctrl, +.guac-keyboard .guac-keyboard-key-rctrl, +.guac-keyboard .guac-keyboard-key-lshift, +.guac-keyboard .guac-keyboard-key-rshift { + text-align: left; + padding-left: 0.75em; +} + +/* Active shift */ +.guac-keyboard.guac-keyboard-modifier-shift .guac-keyboard-key-rshift, +.guac-keyboard.guac-keyboard-modifier-shift .guac-keyboard-key-lshift, + +/* Active ctrl */ +.guac-keyboard.guac-keyboard-modifier-control .guac-keyboard-key-rctrl, +.guac-keyboard.guac-keyboard-modifier-control .guac-keyboard-key-lctrl, + +/* Active alt */ +.guac-keyboard.guac-keyboard-modifier-alt .guac-keyboard-key-ralt, +.guac-keyboard.guac-keyboard-modifier-alt .guac-keyboard-key-lalt, + +/* Active alt-gr */ +.guac-keyboard.guac-keyboard-modifier-alt-gr .guac-keyboard-key-alt-gr, + +/* Active caps */ +.guac-keyboard.guac-keyboard-modifier-caps .guac-keyboard-key-caps, + +/* Active super */ +.guac-keyboard.guac-keyboard-modifier-super .guac-keyboard-key-super, + +/* Active latin */ +.guac-keyboard.guac-keyboard-modifier-lat .guac-keyboard-key-latin { + background: #882; + border-color: #DD4; +} + +.guac-keyboard .guac-keyboard-key.guac-keyboard-pressed { + background: #822; + border-color: #D44; +} + +.guac-keyboard .guac-keyboard-group { + line-height: 0; +} + +.guac-keyboard .guac-keyboard-group.guac-keyboard-alpha, +.guac-keyboard .guac-keyboard-group.guac-keyboard-movement, +.guac-keyboard .guac-keyboard-group.guac-keyboard-function, +.guac-keyboard .guac-keyboard-group.guac-keyboard-virtual { + display: inline-block; + text-align: center; + vertical-align: top; +} + +.guac-keyboard .guac-keyboard-group.guac-keyboard-main, +.guac-keyboard .guac-keyboard-group.guac-keyboard-top { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: row; + +} + +.guac-keyboard .guac-keyboard-group.guac-keyboard-movement, +.guac-keyboard .guac-keyboard-group.guac-keyboard-virtual { + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; +} + +.guac-keyboard .guac-keyboard-gap { + display: inline-block; +} + +/* Hide keycaps requiring modifiers which are NOT currently active. */ +.guac-keyboard:not(.guac-keyboard-modifier-caps) +.guac-keyboard-cap.guac-keyboard-requires-caps, + +.guac-keyboard:not(.guac-keyboard-modifier-shift) +.guac-keyboard-cap.guac-keyboard-requires-shift, + +.guac-keyboard:not(.guac-keyboard-modifier-alt-gr) +.guac-keyboard-cap.guac-keyboard-requires-alt-gr, + +.guac-keyboard:not(.guac-keyboard-modifier-lat) +.guac-keyboard-cap.guac-keyboard-requires-lat, + +/* Hide keycaps NOT requiring modifiers which ARE currently active, where that + modifier is used to determine which cap is displayed for the current key. */ +.guac-keyboard.guac-keyboard-modifier-shift +.guac-keyboard-key.guac-keyboard-uses-shift +.guac-keyboard-cap:not(.guac-keyboard-requires-shift), + +.guac-keyboard.guac-keyboard-modifier-caps +.guac-keyboard-key.guac-keyboard-uses-caps +.guac-keyboard-cap:not(.guac-keyboard-requires-caps), + +.guac-keyboard.guac-keyboard-modifier-alt-gr +.guac-keyboard-key.guac-keyboard-uses-alt-gr +.guac-keyboard-cap:not(.guac-keyboard-requires-alt-gr), + +.guac-keyboard.guac-keyboard-modifier-lat +.guac-keyboard-key.guac-keyboard-uses-lat +.guac-keyboard-cap:not(.guac-keyboard-requires-lat) { + + display: none; + +} + +/* Fade out keys which do not use AltGr if AltGr is active */ +.guac-keyboard.guac-keyboard-modifier-alt-gr +.guac-keyboard-key:not(.guac-keyboard-uses-alt-gr):not(.guac-keyboard-key-alt-gr) { + opacity: 0.5; +} diff --git a/guacamole/src/main/frontend/src/app/osk/templates/guacOsk.html b/guacamole/src/main/frontend/src/app/osk/templates/guacOsk.html new file mode 100644 index 0000000..344c214 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/osk/templates/guacOsk.html @@ -0,0 +1,2 @@ +
      +
      diff --git a/guacamole/src/main/frontend/src/app/player/directives/player.js b/guacamole/src/main/frontend/src/app/player/directives/player.js new file mode 100644 index 0000000..83acb68 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/directives/player.js @@ -0,0 +1,576 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* global _ */ + +/** + * Directive which plays back session recordings. This directive emits the + * following events based on state changes within the current recording: + * + * "guacPlayerLoading": + * A new recording has been selected and is now loading. + * + * "guacPlayerError": + * The current recording cannot be loaded or played due to an error. + * The recording may be unreadable (lack of permissions) or corrupt + * (protocol error). + * + * "guacPlayerProgress" + * Additional data has been loaded for the current recording and the + * recording's duration has changed. The new duration in milliseconds + * and the number of bytes loaded so far are passed to the event. + * + * "guacPlayerLoaded" + * The current recording has finished loading. + * + * "guacPlayerPlay" + * Playback of the current recording has started or has been resumed. + * + * "guacPlayerPause" + * Playback of the current recording has been paused. + * + * "guacPlayerSeek" + * The playback position of the current recording has changed. The new + * position within the recording is passed to the event as the number + * of milliseconds since the start of the recording. + */ +angular.module('player').directive('guacPlayer', ['$injector', function guacPlayer($injector) { + + // Required services + const keyEventDisplayService = $injector.get('keyEventDisplayService'); + const playerHeatmapService = $injector.get('playerHeatmapService'); + const playerTimeService = $injector.get('playerTimeService'); + + /** + * The number of milliseconds after the last detected mouse activity after + * which the associated CSS class should be removed. + * + * @type {number} + */ + const MOUSE_CLEANUP_DELAY = 4000; + + /** + * The number of milliseconds after the last detected mouse activity before + * the cleanup timer to remove the associated CSS class should be scheduled. + * + * @type {number} + */ + const MOUSE_DEBOUNCE_DELAY = 250; + + /** + * The number of milliseconds, after the debounce delay, before the mouse + * activity cleanup timer should run. + * + * @type {number} + */ + const MOUSE_CLEANUP_TIMER_DELAY = MOUSE_CLEANUP_DELAY - MOUSE_DEBOUNCE_DELAY; + + const config = { + restrict : 'E', + templateUrl : 'app/player/templates/player.html' + }; + + config.scope = { + + /** + * A Blob containing the Guacamole session recording to load. + * + * @type {!Blob|Guacamole.Tunnel} + */ + src : '=' + + }; + + config.controller = ['$scope', '$element', '$window', + function guacPlayerController($scope, $element, $window) { + + /** + * Guacamole.SessionRecording instance to be used to playback the + * session recording given via $scope.src. If the recording has not + * yet been loaded, this will be null. + * + * @type {Guacamole.SessionRecording} + */ + $scope.recording = null; + + /** + * The current playback position, in milliseconds. If a seek request is + * in progress, this will be the desired playback position of the + * pending request. + * + * @type {!number} + */ + $scope.playbackPosition = 0; + + /** + * The key of the translation string that describes the operation + * currently running in the background, or null if no such operation is + * running. + * + * @type {string} + */ + $scope.operationMessage = null; + + /** + * The current progress toward completion of the operation running in + * the background, where 0 represents no progress and 1 represents full + * completion. If no such operation is running, this value has no + * meaning. + * + * @type {!number} + */ + $scope.operationProgress = 0; + + /** + * The position within the recording of the current seek operation, in + * milliseconds. If a seek request is not in progress, this will be + * null. + * + * @type {number} + */ + $scope.seekPosition = null; + + /** + * Any batches of text typed during the recording. + * + * @type {keyEventDisplayService.TextBatch[]} + */ + $scope.textBatches = []; + + /** + * Whether or not the key log viewer should be displayed. False by + * default unless explicitly enabled by user interaction. + * + * @type {boolean} + */ + $scope.showKeyLog = false; + + /** + * The height, in pixels, of the SVG heatmap paths. Note that this is not + * necessarily the actual rendered height, just the initial size of the + * SVG path before any styling is applied. + * + * @type {!number} + */ + $scope.HEATMAP_HEIGHT = 100; + + /** + * The width, in pixels, of the SVG heatmap paths. Note that this is not + * necessarily the actual rendered width, just the initial size of the + * SVG path before any styling is applied. + * + * @type {!number} + */ + $scope.HEATMAP_WIDTH = 1000; + + /** + * The maximum number of key events per millisecond to display in the + * key event heatmap. Any key event rates exceeding this value will be + * capped at this rate to ensure that unsually large spikes don't make + * swamp the rest of the data. + * + * Note: This is 6 keys per second (events include both presses and + * releases) - equivalent to ~88 words per minute typed. + * + * @type {!number} + */ + const KEY_EVENT_RATE_CAP = 12 / 1000; + + /** + * The maximum number of frames per millisecond to display in the + * frame heatmap. Any frame rates exceeding this value will be + * capped at this rate to ensure that unsually large spikes don't make + * swamp the rest of the data. + * + * @type {!number} + */ + const FRAME_RATE_CAP = 10 / 1000; + + /** + * An SVG path describing a smoothed curve that visualizes the relative + * number of frames rendered throughout the recording - i.e. a heatmap + * of screen updates. + * + * @type {!string} + */ + $scope.frameHeatmap = ''; + + /** + * An SVG path describing a smoothed curve that visualizes the relative + * number of key events recorded throughout the recording - i.e. a + * heatmap of key events. + * + * @type {!string} + */ + $scope.keyHeatmap = ''; + + /** + * Whether a seek request is currently in progress. A seek request is + * in progress if the user is attempting to change the current playback + * position (the user is manipulating the playback position slider). + * + * @type {boolean} + */ + var pendingSeekRequest = false; + + /** + * Whether playback should be resumed (play() should be invoked on the + * recording) once the current seek request is complete. This value + * only has meaning if a seek request is pending. + * + * @type {boolean} + */ + var resumeAfterSeekRequest = false; + + /** + * A scheduled timer to clean up the mouse activity CSS class, or null + * if no timer is scheduled. + * + * @type {number} + */ + var mouseActivityTimer = null; + + /** + * The recording-relative timestamp of each frame of the recording that + * has been processed so far. + * + * @type {!number[]} + */ + var frameTimestamps = []; + + /** + * The recording-relative timestamp of each text event that has been + * processed so far. + * + * @type {!number[]} + */ + var keyTimestamps = []; + + /** + * Return true if any batches of key event logs are available for this + * recording, or false otherwise. + * + * @return + * True if any batches of key event logs are avaiable for this + * recording, or false otherwise. + */ + $scope.hasTextBatches = function hasTextBatches () { + return $scope.textBatches.length >= 0; + }; + + /** + * Toggle the visibility of the text key log viewer. + */ + $scope.toggleKeyLogView = function toggleKeyLogView() { + $scope.showKeyLog = !$scope.showKeyLog; + }; + + /** + * @borrows playerTimeService.formatTime + */ + $scope.formatTime = playerTimeService.formatTime; + + /** + * Pauses playback and decouples the position slider from current + * playback position, allowing the user to manipulate the slider + * without interference. Playback state will be resumed following a + * call to commitSeekRequest(). + */ + $scope.beginSeekRequest = function beginSeekRequest() { + + // If a recording is present, pause and save state if we haven't + // already done so + if ($scope.recording && !pendingSeekRequest) { + resumeAfterSeekRequest = $scope.recording.isPlaying(); + $scope.recording.pause(); + } + + // Flag seek request as in progress + pendingSeekRequest = true; + + }; + + /** + * Restores the playback state at the time beginSeekRequest() was + * called and resumes coupling between the playback position slider and + * actual playback position. + */ + $scope.commitSeekRequest = function commitSeekRequest() { + + // If a recording is present and there is an active seek request, + // restore the playback state at the time that request began and + // begin seeking to the requested position + if ($scope.recording && pendingSeekRequest) + $scope.seekToPlaybackPosition(); + + // Flag seek request as completed + pendingSeekRequest = false; + + }; + + /** + * Seek the recording to the specified position within the recording, + * in milliseconds. + * + * @param {Number} timestamp + * The position to seek to within the current record, + * in milliseconds. + */ + $scope.seekToTimestamp = function seekToTimestamp(timestamp) { + + // Set the timestamp and seek to it + $scope.playbackPosition = timestamp; + $scope.seekToPlaybackPosition(); + + }; + + /** + * Seek the recording to the current playback position value. + */ + $scope.seekToPlaybackPosition = function seekToPlaybackPosition() { + + $scope.seekPosition = null; + $scope.operationMessage = 'PLAYER.INFO_SEEK_IN_PROGRESS'; + $scope.operationProgress = 0; + + // Cancel seek when requested, updating playback position if + // that position changed + $scope.cancelOperation = function abortSeek() { + $scope.recording.cancel(); + $scope.playbackPosition = $scope.seekPosition || $scope.playbackPosition; + }; + + resumeAfterSeekRequest && $scope.recording.play(); + $scope.recording.seek($scope.playbackPosition, function seekComplete() { + $scope.seekPosition = null; + $scope.operationMessage = null; + $scope.$evalAsync(); + }); + }; + + /** + * Toggles the current playback state. If playback is currently paused, + * playback is resumed. If playback is currently active, playback is + * paused. If no recording has been loaded, this function has no + * effect. + */ + $scope.togglePlayback = function togglePlayback() { + if ($scope.recording) { + if ($scope.recording.isPlaying()) + $scope.recording.pause(); + else + $scope.recording.play(); + } + }; + + // Automatically load the requested session recording + $scope.$watch('src', function srcChanged(src) { + + // Reset position and seek state + pendingSeekRequest = false; + $scope.playbackPosition = 0; + + // Stop loading the current recording, if any + if ($scope.recording) { + $scope.recording.pause(); + $scope.recording.abort(); + } + + // If no recording is provided, reset to empty + if (!src) + $scope.recording = null; + + // Otherwise, begin loading the provided recording + else { + + $scope.recording = new Guacamole.SessionRecording(src); + + // Begin downloading the recording + $scope.recording.connect(); + + // Notify listeners and set any heatmap paths + // when the recording is completely loaded + $scope.recording.onload = function recordingLoaded() { + $scope.operationMessage = null; + $scope.$emit('guacPlayerLoaded'); + $scope.$evalAsync(); + + const recordingDuration = $scope.recording.getDuration(); + + // Generate heat maps for rendered frames and typed text + $scope.frameHeatmap = ( + playerHeatmapService.generateHeatmapPath( + frameTimestamps, recordingDuration, FRAME_RATE_CAP, + $scope.HEATMAP_HEIGHT, $scope.HEATMAP_WIDTH)); + $scope.keyHeatmap = ( + playerHeatmapService.generateHeatmapPath( + keyTimestamps, recordingDuration, KEY_EVENT_RATE_CAP, + $scope.HEATMAP_HEIGHT, $scope.HEATMAP_WIDTH)); + + }; + + // Notify listeners if an error occurs + $scope.recording.onerror = function recordingFailed(message) { + $scope.operationMessage = null; + $scope.$emit('guacPlayerError', message); + $scope.$evalAsync(); + }; + + // Notify listeners when additional recording data has been + // loaded + $scope.recording.onprogress = function recordingLoadProgressed(duration, current) { + $scope.operationProgress = src.size ? current / src.size : 0; + $scope.$emit('guacPlayerProgress', duration, current); + $scope.$evalAsync(); + + // Store the timestamp of the just-received frame + frameTimestamps.push(duration); + }; + + // Notify listeners when playback has started/resumed + $scope.recording.onplay = function playbackStarted() { + $scope.$emit('guacPlayerPlay'); + $scope.$evalAsync(); + }; + + // Notify listeners when playback has paused + $scope.recording.onpause = function playbackPaused() { + $scope.$emit('guacPlayerPause'); + $scope.$evalAsync(); + }; + + // Extract key events from the recording + $scope.recording.onkeyevents = function keyEventsReceived(events) { + + // Convert to a display-optimized format + $scope.textBatches = ( + keyEventDisplayService.parseEvents(events)); + + keyTimestamps = events.map(event => event.timestamp); + + }; + + // Notify listeners when current position within the recording + // has changed + $scope.recording.onseek = function positionChanged(position, current, total) { + + // Update current playback position while playing + if ($scope.recording.isPlaying()) + $scope.playbackPosition = position; + + // Update seek progress while seeking + else { + $scope.seekPosition = position; + $scope.operationProgress = current / total; + } + + $scope.$emit('guacPlayerSeek', position); + $scope.$evalAsync(); + + }; + + $scope.operationMessage = 'PLAYER.INFO_LOADING_RECORDING'; + $scope.operationProgress = 0; + + $scope.cancelOperation = function abortLoad() { + $scope.recording.abort(); + $scope.operationMessage = null; + }; + + $scope.$emit('guacPlayerLoading'); + + } + + }); + + // Clean up resources when player is destroyed + $scope.$on('$destroy', function playerDestroyed() { + $scope.recording.pause(); + $scope.recording.abort(); + mouseActivityTimer !== null && $window.clearTimeout(mouseActivityTimer); + }); + + /** + * Clean up the mouse movement class after no mouse activity has been + * detected for the appropriate time period. + */ + const scheduleCleanupTimeout = _.debounce(() => + mouseActivityTimer = $window.setTimeout(() => { + mouseActivityTimer = null; + $element.removeClass('recent-mouse-movement'); + }, MOUSE_CLEANUP_TIMER_DELAY), + + /* + * Only schedule the cleanup task after the mouse hasn't moved + * for a reasonable amount of time to ensure that the number of + * created cleanup timers remains reasonable. + */ + MOUSE_DEBOUNCE_DELAY); + + /* + * When the mouse moves inside the player, add a CSS class signifying + * recent mouse movement, to be automatically cleaned up after a period + * of time with no detected mouse movement. + */ + $element.on('mousemove', () => { + + // Clean up any existing cleanup timer + if (mouseActivityTimer !== null) { + $window.clearTimeout(mouseActivityTimer); + mouseActivityTimer = null; + } + + // Add the marker CSS class, and schedule its removal + $element.addClass('recent-mouse-movement'); + scheduleCleanupTimeout(); + + }); + + }]; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/player/directives/playerDisplay.js b/guacamole/src/main/frontend/src/app/player/directives/playerDisplay.js new file mode 100644 index 0000000..114566a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/directives/playerDisplay.js @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * Directive which contains a given Guacamole.Display, automatically scaling + * the display to fit available space. + */ +angular.module('player').directive('guacPlayerDisplay', [function guacPlayerDisplay() { + + const config = { + restrict : 'E', + templateUrl : 'app/player/templates/playerDisplay.html' + }; + + config.scope = { + + /** + * The Guacamole.Display instance which should be displayed within the + * directive. + * + * @type {Guacamole.Display} + */ + display : '=' + + }; + + config.controller = ['$scope', '$element', function guacPlayerDisplayController($scope, $element) { + + /** + * The root element of this instance of the guacPlayerDisplay + * directive. + * + * @type {Element} + */ + const element = $element.find('.guac-player-display')[0]; + + /** + * The element which serves as a container for the root element of the + * Guacamole.Display assigned to $scope.display. + * + * @type {HTMLDivElement} + */ + const container = $element.find('.guac-player-display-container')[0]; + + /** + * Rescales the Guacamole.Display currently assigned to $scope.display + * such that it exactly fits within this directive's available space. + * If no display is currently assigned or the assigned display is not + * at least 1x1 pixels in size, this function has no effect. + */ + $scope.fitDisplay = function fitDisplay() { + + // Ignore if no display is yet present + if (!$scope.display) + return; + + var displayWidth = $scope.display.getWidth(); + var displayHeight = $scope.display.getHeight(); + + // Ignore if the provided display is not at least 1x1 pixels + if (!displayWidth || !displayHeight) + return; + + // Fit display within available space + $scope.display.scale(Math.min(element.offsetWidth / displayWidth, + element.offsetHeight / displayHeight)); + + }; + + // Automatically add/remove the Guacamole.Display as $scope.display is + // updated + $scope.$watch('display', function displayChanged(display, oldDisplay) { + + // Clear out old display, if any + if (oldDisplay) { + container.innerHTML = ''; + oldDisplay.onresize = null; + } + + // If a new display is provided, add it to the container, keeping + // its scale in sync with changes to available space and display + // size + if (display) { + container.appendChild(display.getElement()); + display.onresize = $scope.fitDisplay; + $scope.fitDisplay(); + } + + }); + + }]; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/player/directives/progressIndicator.js b/guacamole/src/main/frontend/src/app/player/directives/progressIndicator.js new file mode 100644 index 0000000..8a793fa --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/directives/progressIndicator.js @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * Directive which displays an indicator showing the current progress of an + * arbitrary operation. + */ +angular.module('player').directive('guacPlayerProgressIndicator', [function guacPlayerProgressIndicator() { + + const config = { + restrict : 'E', + templateUrl : 'app/player/templates/progressIndicator.html' + }; + + config.scope = { + + /** + * A value between 0 and 1 inclusive which indicates current progress, + * where 0 represents no progress and 1 represents finished. + * + * @type {Number} + */ + progress : '=' + + }; + + config.controller = ['$scope', function guacPlayerProgressIndicatorController($scope) { + + /** + * The current progress of the operation as a percentage. This value is + * automatically updated as $scope.progress changes. + * + * @type {Number} + */ + $scope.percentage = 0; + + /** + * The CSS transform which should be applied to the bar portion of the + * progress indicator. This value is automatically updated as + * $scope.progress changes. + * + * @type {String} + */ + $scope.barTransform = null; + + // Keep percentage and bar transform up-to-date with changes to + // progress value + $scope.$watch('progress', function progressChanged(progress) { + progress = progress || 0; + $scope.percentage = Math.floor(progress * 100); + $scope.barTransform = 'rotate(' + (360 * progress - 45) + 'deg)'; + }); + + }]; + + return config; + +}]); diff --git a/guacamole/src/main/frontend/src/app/player/directives/textView.js b/guacamole/src/main/frontend/src/app/player/directives/textView.js new file mode 100644 index 0000000..6e0ea06 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/directives/textView.js @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const fuzzysort = require('fuzzysort') + +/** + * Directive which plays back session recordings. + */ +angular.module('player').directive('guacPlayerTextView', + ['$injector', function guacPlayer($injector) { + + // Required services + const playerTimeService = $injector.get('playerTimeService'); + + const config = { + restrict : 'E', + templateUrl : 'app/player/templates/textView.html' + }; + + config.scope = { + + /** + * All the batches of text extracted from this recording. + * + * @type {!keyEventDisplayService.TextBatch[]} + */ + textBatches : '=', + + /** + * A callback that accepts a timestamp, and seeks the recording to + * that provided timestamp. + * + * @type {!Function} + */ + seek: '&', + + /** + * The current position within the recording. + * + * @type {!Number} + */ + currentPosition: '=' + + }; + + config.controller = ['$scope', '$element', '$injector', + function guacPlayerController($scope, $element) { + + /** + * The phrase to search within the text batches in order to produce the + * filtered list for display. + * + * @type {String} + */ + $scope.searchPhrase = ''; + + /** + * The text batches that match the current search phrase, or all + * batches if no search phrase is set. + * + * @type {!keyEventDisplayService.TextBatch[]} + */ + $scope.filteredBatches = $scope.textBatches; + + /** + * Whether or not the key log viewer should be full-screen. False by + * default unless explicitly enabled by user interaction. + * + * @type {boolean} + */ + $scope.fullscreenKeyLog = false; + + /** + * Toggle whether the key log viewer should take up the whole screen. + */ + $scope.toggleKeyLogFullscreen = function toggleKeyLogFullscreen() { + $element.toggleClass("fullscreen"); + }; + + /** + * Filter the provided text batches using the provided search phrase to + * generate the list of filtered batches, or set to all provided + * batches if no search phrase is provided. + * + * @param {String} searchPhrase + * The phrase to search the text batches for. If no phrase is + * provided, the list of batches will not be filtered. + */ + const applyFilter = searchPhrase => { + + // If there's search phrase entered, search the text within the + // batches for it + if (searchPhrase) + $scope.filteredBatches = fuzzysort.go( + searchPhrase, $scope.textBatches, {key: 'simpleValue'}) + .map(result => result.obj); + + // Otherwise, do not filter the batches + else + $scope.filteredBatches = $scope.textBatches; + + }; + + // Reapply the current filter to the updated text batches + $scope.$watch('textBatches', () => applyFilter($scope.searchPhrase)); + + // Reapply the filter whenever the search phrase is updated + $scope.$watch('searchPhrase', applyFilter); + + /** + * @borrows playerTimeService.formatTime + */ + $scope.formatTime = playerTimeService.formatTime; + + }]; + + return config; +}]); diff --git a/guacamole/src/main/frontend/src/app/player/playerModule.js b/guacamole/src/main/frontend/src/app/player/playerModule.js new file mode 100644 index 0000000..c3bf3ea --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/playerModule.js @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * Module providing in-browser playback of session recordings. + */ +angular.module('player', [ + 'element' +]); diff --git a/guacamole/src/main/frontend/src/app/player/services/keyEventDisplayService.js b/guacamole/src/main/frontend/src/app/player/services/keyEventDisplayService.js new file mode 100644 index 0000000..6b0a7e0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/services/keyEventDisplayService.js @@ -0,0 +1,371 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * 'License'); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + /* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* global _ */ + +/** + * A service for translating parsed key events in the format produced by + * KeyEventInterpreter into display-optimized text batches. + */ +angular.module('player').factory('keyEventDisplayService', + ['$injector', function keyEventDisplayService($injector) { + + /** + * A set of all keysyms corresponding to modifier keys. + * @type{Object.} + */ + const MODIFIER_KEYS = { + 0xFE03: true, // AltGr + 0xFFE1: true, // Left Shift + 0xFFE2: true, // Right Shift + 0xFFE3: true, // Left Control + 0xFFE4: true, // Right Control, + 0xFFE7: true, // Left Meta + 0xFFE8: true, // Right Meta + 0xFFE9: true, // Left Alt + 0xFFEA: true, // Right Alt + 0xFFEB: true, // Left Super + 0xFFEC: true, // Right Super + 0xFFED: true, // Left Hyper + 0xFFEE: true // Right Super + }; + + /** + * A set of all keysyms for which the name should be printed alongside the + * value of the key itself. + * @type{Object.} + */ + const PRINT_NAME_TOO_KEYS = { + 0xFF09: true, // Tab + 0xFF0D: true, // Return + 0xFF8D: true, // Enter + }; + + /** + * A set of all keysyms corresponding to keys commonly used in shortcuts. + * @type{Object.} + */ + const SHORTCUT_KEYS = { + 0xFFE3: true, // Left Control + 0xFFE4: true, // Right Control, + 0xFFE7: true, // Left Meta + 0xFFE8: true, // Right Meta + 0xFFE9: true, // Left Alt + 0xFFEA: true, // Right Alt + 0xFFEB: true, // Left Super + 0xFFEC: true, // Right Super + 0xFFED: true, // Left Hyper + 0xFFEE: true // Right Super + } + + /** + * Format and return a key name for display. + * + * @param {*} name + * The name of the key + * + * @returns + * The formatted key name. + */ + const formatKeyName = name => ('<' + name + '>'); + + const service = {}; + + /** + * A batch of text associated with a recording. The batch consists of a + * string representation of the text that would be typed based on the key + * events in the recording, as well as a timestamp when the batch started. + * + * @constructor + * @param {TextBatch|Object} [template={}] + * The object whose properties should be copied within the new TextBatch. + */ + service.TextBatch = function TextBatch(template) { + + // Use empty object by default + template = template || {}; + + /** + * All key events for this batch, some of which may be conslidated, + * representing multiple raw events. + * + * @type {ConsolidatedKeyEvent[]} + */ + this.events = template.events || []; + + /** + * The simplified, human-readable value representing the key events for + * this batch, equivalent to concatenating the `text` field of all key + * events in the batch. + * + * @type {!String} + */ + this.simpleValue = template.simpleValue || ''; + + }; + + /** + * A granular description of an extracted key event or sequence of events. + * It may contain multiple contiguous events of the same type, meaning that all + * event(s) that were combined into this event must have had the same `typed` + * field value. A single timestamp for the first combined event will be used + * for the whole batch if consolidated. + * + * @constructor + * @param {ConsolidatedKeyEvent|Object} [template={}] + * The object whose properties should be copied within the new KeyEventBatch. + */ + service.ConsolidatedKeyEvent = function ConsolidatedKeyEvent(template) { + + // Use empty object by default + template = template || {}; + + /** + * A human-readable representation of the event(s). If a series of printable + * characters was directly typed, this will just be those character(s). + * Otherwise it will be a string describing the event(s). + * + * @type {!String} + */ + this.text = template.text; + + /** + * True if this text of this event is exactly a typed character, or false + * otherwise. + * + * @type {!boolean} + */ + this.typed = template.typed; + + /** + * The timestamp from the recording when this event occured. + * + * @type {!Number} + */ + this.timestamp = template.timestamp; + + }; + + /** + * Accepts key events in the format produced by KeyEventInterpreter and returns + * human readable text batches, seperated by at least `batchSeperation` milliseconds + * if provided. + * + * NOTE: The event processing logic and output format is based on the `guaclog` + * tool, with the addition of batching support. + * + * @param {Guacamole.KeyEventInterpreter.KeyEvent[]} [rawEvents] + * The raw key events to prepare for display. + * + * @param {number} [batchSeperation=5000] + * The minimum number of milliseconds that must elapse between subsequent + * batches of key-event-generated text. If 0 or negative, no splitting will + * occur, resulting in a single batch for all provided key events. + * + * @param {boolean} [consolidateEvents=false] + * Whether consecutive sequences of events with similar properties + * should be consolidated into a single ConsolidatedKeyEvent object for + * display performance reasons. + */ + service.parseEvents = function parseEvents( + rawEvents, batchSeperation, consolidateEvents) { + + // Default to 5 seconds if the batch seperation was not provided + if (batchSeperation === undefined || batchSeperation === null) + batchSeperation = 5000; + /** + * A map of X11 keysyms to a KeyDefinition object, if the corresponding + * key is currently pressed. If a keysym has no entry in this map at all + * it means that the key is not being pressed. Note that not all keysyms + * are necessarily tracked within this map - only those that are + * explicitly tracked. + */ + const pressedKeys = {}; + + // The timestamp of the most recent key event processed + let lastKeyEvent = 0; + + // All text batches produced from the provided raw key events + const batches = [new service.TextBatch()]; + + // Process every provided raw + _.forEach(rawEvents, event => { + + // Extract all fields from the raw event + const { definition, pressed, timestamp } = event; + const { keysym, name, value } = definition; + + // Only switch to a new batch of text if sufficient time has passed + // since the last key event + const newBatch = (batchSeperation >= 0 + && (timestamp - lastKeyEvent) >= batchSeperation); + lastKeyEvent = timestamp; + + if (newBatch) + batches.push(new service.TextBatch()); + + const currentBatch = _.last(batches); + + /** + * Either push the a new event constructed using the provided fields + * into the latest batch, or consolidate into the latest event as + * appropriate given the consolidation configuration and event type. + * + * @param {!String} text + * The text representation of the event. + * + * @param {!Boolean} typed + * Whether the text value would be literally produced by typing + * the key that produced the event. + */ + const pushEvent = (text, typed) => { + const latestEvent = _.last(currentBatch.events); + + // Only consolidate the event if configured to do so and it + // matches the type of the previous event + if (consolidateEvents && latestEvent && latestEvent.typed === typed) { + latestEvent.text += text; + currentBatch.simpleValue += text; + } + + // Otherwise, push a new event + else { + currentBatch.events.push(new service.ConsolidatedKeyEvent({ + text, typed, timestamp})); + currentBatch.simpleValue += text; + } + } + + // Track modifier state + if (MODIFIER_KEYS[keysym]) { + if (pressed) + pressedKeys[keysym] = definition; + else + delete pressedKeys[keysym]; + } + + // Append to the current typed value when a printable + // (non-modifier) key is pressed + else if (pressed) { + + // If any shorcut keys are currently pressed + if (_.some(pressedKeys, (def, key) => SHORTCUT_KEYS[key])) { + + var shortcutText = '<'; + + var firstKey = true; + + // Compose entry by inspecting the state of each tracked key. + // At least one key must be pressed when in a shortcut. + for (let pressedKeysym in pressedKeys) { + + var pressedKeyDefinition = pressedKeys[pressedKeysym]; + + // Print name of key + if (firstKey) { + shortcutText += pressedKeyDefinition.name; + firstKey = false; + } + + else + shortcutText += ('+' + pressedKeyDefinition.name); + + } + + // Finally, append the printable key to close the shortcut + shortcutText += ('+' + name + '>') + + // Add the shortcut to the current batch + pushEvent(shortcutText, false); + } + } + + // Print the key itself + else { + + var keyText; + var typed; + + // Print the value if explicitly defined + if (value !== undefined) { + + keyText = value; + typed = true; + + // If the name should be printed in addition, add it as a + // seperate event before the actual character value + if (PRINT_NAME_TOO_KEYS[keysym]) + pushEvent(formatKeyName(name), false); + + } + + // Otherwise print the name + else { + + keyText = formatKeyName(name); + + // While this is a representation for a single character, + // the key text is the name of the key, not the actual + // character itself + typed = false; + + } + + // Add the key to the current batch + pushEvent(keyText, typed); + + } + + }); + + // All processed batches with events + return batches.filter(batch => batch.events.length > 0); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/player/services/playerHeatmapService.js b/guacamole/src/main/frontend/src/app/player/services/playerHeatmapService.js new file mode 100644 index 0000000..b153d37 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/services/playerHeatmapService.js @@ -0,0 +1,264 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * 'License'); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { curveCatmullRom } from 'd3-shape'; +import { path } from 'd3-path'; + +/** + * A service for generating heat maps of activity levels per time interval, + * for session recording playback. + */ +angular.module('player').factory('playerHeatmapService', [() => { + + /** + * A default, relatively-gentle Gaussian smoothing kernel. This kernel + * should help heatmaps look a bit less jagged, while not reducing fidelity + * very much. + * + * @type {!number[]} + */ + const GAUSSIAN_KERNEL = [0.0013, 0.1573, 0.6827, 0.1573, 0.0013]; + + /** + * The number of buckets that a series of activity timestamps should be + * divided into. + * + * @type {!number} + */ + const NUM_BUCKETS = 100; + + /** + * Given a list of values to smooth out, produce a smoothed data set with + * the same length as the original provided list. + * + * @param {!number[]} values + * The list of histogram values to smooth out. + * + * @returns {!number[]} + * The smoothed value array. + */ + function smooth(values) { + + // The starting offset into the values array for each calculation + const lookBack = Math.floor(GAUSSIAN_KERNEL.length / 2); + + // Apply the smoothing kernel to each value in the provided array + return _.map(values, (value, index) => { + + // Total up the weighted values for each position in the kernel + return _.reduce(GAUSSIAN_KERNEL, (total, weight, kernelIndex) => { + + // The offset into the original values array for the kernel + const valuesOffset = kernelIndex - lookBack; + + // The position inside the original values array to be included + const valuesIndex = index + valuesOffset; + + // If the contribution to the final smoothed value would be outside + // the bounds of the array, just use the original value instead + const contribution = ((valuesIndex >= 0) && valuesIndex < values.length) + ? values[valuesIndex] : value; + + // Use the provided weight from the kernel and add to the total + return total + (contribution * weight); + + }, 0); + + }); + } + + /** + * Given an array of values, with each value representing an activity count + * during a bucket of time, generate a smooth curve, scaled to PATH_HEIGHT + * height, and PATH_WIDTH width. + * + * @param {!number[]} bucketizedData + * The bucketized counts to create an SVG path from. + * + * @param {!number} maxBucketValue + * The size of the largest value in the bucketized data. + * + * @param {!number} height + * The target height, in pixels, of the highest point in the heatmap. + * + * @param {!number} width + * The target width, in pixels, of the heatmap. + * + * @returns {!string} + * An SVG path representing a smooth curve, passing through all points + * in the provided data. + */ + function createPath(bucketizedData, maxBucketValue, height, width) { + + // Calculate scaling factor to ensure that paths are all the same heigh + const yScalingFactor = height / maxBucketValue; + + // Scale a given Y value appropriately + const scaleYValue = yValue => height - (yValue * yScalingFactor); + + // Calculate scaling factor to ensure that paths are all the same width + const xScalingFactor = width / bucketizedData.length; + + // Construct a continuous curved path + const curvedPath = path(); + const curve = curveCatmullRom(curvedPath); + + curve.lineStart(); + + // Add all the data points + for (let i = 0; i < bucketizedData.length; i++) { + + // Scale up the x value to hit the target width + const x = xScalingFactor * i; + + // Scale and invert the height for display + const y = scaleYValue(bucketizedData[i]); + + // Add the scaled point + curve.point(x, y); + + } + + // Move back to 0 to complete the path + curve.lineEnd(); + curvedPath.lineTo(width, scaleYValue(0)); + + // Generate the SVG path for this curve + const rawPathText = curvedPath.toString(); + + // The SVG path as generated by D3 starts with a move to the first data + // point. This means that when the path ends and the subpath is closed, + // it returns to the position of the first data point instead of the + // origin. To fix this, the initial move command is removed, and the + // path is amended to start at the origin. TODO: Find a better way to + // handle this. + const startAtOrigin = ( + + // Start at origin + 'M0,' + scaleYValue(0) + + + // Line to the first point in the curve, to close the shape + 'L0,' + scaleYValue(bucketizedData[0]) + + ); + + // Strip off the first move command from the path + const strippedPathText = _.replace(rawPathText, /^[^C]*/, ''); + + return startAtOrigin + strippedPathText; + } + + const service = {}; + + /** + * Given a raw array of timestamps indicating when events of a certain type + * occured during a record, generate and return a smoothed SVG path + * indicating how many events occured during each equal-length bucket. + * + * @param {!number[]} timestamps + * A raw array of timestamps, one for every relevant event. These + * must be monotonically increasing. + * + * @param {!number} duration + * The duration over which the heatmap should apply. This value may + * be greater than the maximum timestamp value, in which case the path + * will drop to 0 after the last timestamp in the provided array. + * + * @param {number} maxRate + * The maximum number of events per millisecond that should be displayed + * in the final path. Any rates over this amount will just be capped at + * this value. + * + * @param {!number} height + * The target height, in pixels, of the highest point in the heatmap. + * + * @param {!number} width + * The target width, in pixels, of the heatmap. + * + * @returns {!string} + * A smoothed, graphable SVG path representing levels of activity over + * time, as extracted from the provided timestamps. + */ + service.generateHeatmapPath = (timestamps, duration, maxRate, height, width) => { + + // The height and width must both be valid in order to create the path + if (!height || !width) { + console.warn("Heatmap height and width must be positive."); + return ''; + } + + // If no timestamps are available, no path can be created + if (!timestamps || !timestamps.length) + return ''; + + // An initially empty array containing no activity in any bucket + const buckets = new Array(NUM_BUCKETS).fill(0); + + // If no events occured, return the an empty path + if (!timestamps.length) + return ''; + + // Determine the bucket granularity + const bucketDuration = duration / NUM_BUCKETS; + + // The rate-limited maximum number of events that any bucket can have, + const maxPossibleBucketValue = Math.max(Math.floor(bucketDuration * maxRate), 1); + + // If the duration is invalid, return the still-empty array + if (duration <= 0) + return ''; + + let maxBucketValue = 0; + + // Partition the events into a count of events per bucket + let currentBucketIndex = 0; + timestamps.forEach(timestamp => { + + // If the current timestamp has passed the end of the current + // bucket, move to the appropriate bucket + if (timestamp >= (currentBucketIndex + 1) * bucketDuration) + currentBucketIndex = Math.min( + Math.floor((timestamp / bucketDuration)), NUM_BUCKETS - 1); + + // Do not record events that exceed the maximum allowable rate + if (buckets[currentBucketIndex] >= maxPossibleBucketValue) + buckets[currentBucketIndex] = maxPossibleBucketValue; + + else + // Increment the count for the current bucket + buckets[currentBucketIndex]++; + + // Keep track of the maximum value seen so far + maxBucketValue = Math.max( + maxBucketValue, buckets[currentBucketIndex]); + + }); + + // Smooth the data for better aesthetics before creating the path + const smoothed = smooth(buckets); + + // Create an SVG path based on the smoothed data + return createPath(smoothed, maxBucketValue, height, width); + + } + + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/player/services/playerTimeService.js b/guacamole/src/main/frontend/src/app/player/services/playerTimeService.js new file mode 100644 index 0000000..919c4ee --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/services/playerTimeService.js @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * 'License'); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + /* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * A service for formatting time, specifically for the recording player. + */ +angular.module('player').factory('playerTimeService', + ['$injector', function playerTimeService($injector) { + + const service = {}; + + /** + * Formats the given number as a decimal string, adding leading zeroes + * such that the string contains at least two digits. The given number + * MUST NOT be negative. + * + * @param {!number} value + * The number to format. + * + * @returns {!string} + * The decimal string representation of the given value, padded + * with leading zeroes up to a minimum length of two digits. + */ + const zeroPad = function zeroPad(value) { + return value > 9 ? value : '0' + value; + }; + + /** + * Formats the given quantity of milliseconds as days, hours, minutes, + * and whole seconds, separated by colons (DD:HH:MM:SS). Hours are + * included only if the quantity is at least one hour, and days are + * included only if the quantity is at least one day. All included + * groups are zero-padded to two digits with the exception of the + * left-most group. + * + * @param {!number} value + * The time to format, in milliseconds. + * + * @returns {!string} + * The given quantity of milliseconds formatted as "DD:HH:MM:SS". + */ + service.formatTime = function formatTime(value) { + + // Round provided value down to whole seconds + value = Math.floor((value || 0) / 1000); + + // Separate seconds into logical groups of seconds, minutes, + // hours, etc. + var groups = [ 1, 24, 60, 60 ]; + for (var i = groups.length - 1; i >= 0; i--) { + var placeValue = groups[i]; + groups[i] = zeroPad(value % placeValue); + value = Math.floor(value / placeValue); + } + + // Format groups separated by colons, stripping leading zeroes and + // groups which are entirely zeroes, leaving at least minutes and + // seconds + var formatted = groups.join(':'); + return /^[0:]*([0-9]{1,2}(?::[0-9]{2})+)$/.exec(formatted)[1]; + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/player/styles/player.css b/guacamole/src/main/frontend/src/app/player/styles/player.css new file mode 100644 index 0000000..a156681 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/styles/player.css @@ -0,0 +1,206 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +guac-player { + display: inline-block; + position: relative; +} + +guac-player .guac-player-display { + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +guac-player .guac-player-controls { + + position: absolute; + padding-bottom: 0; + left: 0; + bottom: 0; + width: 100%; + +} + +.guac-player-controls .guac-player-seek { + display: block; + width: 100%; +} + +.guac-player-controls .guac-player-play, +.guac-player-controls .guac-player-pause { + color: white; + background: transparent; + border: none; + width: 2em; + height: 2em; + min-width: 0; + padding: 0; + margin: 0; +} + +.guac-player-controls .guac-player-play:hover, +.guac-player-controls .guac-player-pause:hover { + background: rgba(255, 255, 255, 0.5); +} + +.guac-player-controls .pause-icon, +.guac-player-controls .play-icon { + display: inline-block; + width: 2em; + height: 2em; + background-size: contain; + background-position: center; + background-repeat: no-repeat; + vertical-align: middle; +} + +.guac-player-controls .play-icon { + background-image: url('images/action-icons/guac-play.svg'); +} + +.guac-player-controls .pause-icon { + background-image: url('images/action-icons/guac-pause.svg'); +} + +.guac-player-controls .guac-player-buttons { + display: flex; + flex-direction: row; + align-items: center; +} + +.guac-player-controls .guac-player-keys { + margin-left: auto; + padding-right: 0.5em; + cursor: pointer; +} + +guac-player .guac-player-status { + + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + + background: rgba(0, 0, 0, 0.5); + z-index: 1; + + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -moz-box-orient: vertical; + -moz-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + +} + +.guac-player-container { + + height: 100%; + + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + + -ms-flex-pack: space-between; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + +} + +guac-player-display { + + flex-grow: 5; + + /* Required for horizontal resizing to work */ + min-width: 0; + +} + +guac-player-text-view { + + min-width: 25em; + flex-basis: 0; + + /* Make room for the control bar at the bottom */ + height: calc(100% - 48px); + +} + +guac-player-text-view.fullscreen { + + min-width: 100%; + +} + diff --git a/guacamole/src/main/frontend/src/app/player/styles/playerDisplay.css b/guacamole/src/main/frontend/src/app/player/styles/playerDisplay.css new file mode 100644 index 0000000..c17cd4d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/styles/playerDisplay.css @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +.guac-player-display { + + position: relative; + + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + +} + +.guac-player-display .guac-player-display-container { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -moz-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; +} diff --git a/guacamole/src/main/frontend/src/app/player/styles/progressIndicator.css b/guacamole/src/main/frontend/src/app/player/styles/progressIndicator.css new file mode 100644 index 0000000..7d8c35e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/styles/progressIndicator.css @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +guac-player-progress-indicator { + + width: 128px; + height: 128px; + + position: relative; + + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + +} + +guac-player-progress-indicator .guac-player-progress-text { + font-size: 2em; + font-weight: bold; +} + +guac-player-progress-indicator .guac-player-progress-bar-container { + + position: absolute; + right: 0; + top: 0; + width: 50%; + height: 100%; + overflow: hidden; + +} + +guac-player-progress-indicator .guac-player-progress-bar-container.past-halfway { + overflow: visible; +} + +guac-player-progress-indicator .guac-player-progress-bar-container.past-halfway::before, +guac-player-progress-indicator .guac-player-progress-bar { + + position: absolute; + left: -64px; + top: 0; + width: 128px; + height: 128px; + + -webkit-border-radius: 128px; + -moz-border-radius: 128px; + border-radius: 128px; + + border: 12px solid #5AF; + border-bottom-color: transparent; + border-right-color: transparent; + +} + +guac-player-progress-indicator .guac-player-progress-bar-container.past-halfway::before { + + content: ' '; + display: block; + box-sizing: border-box; + + -webkit-transform: rotate(135deg); + -moz-transform: rotate(135deg); + -ms-transform: rotate(135deg); + -o-transform: rotate(135deg); + transform: rotate(135deg); + +} diff --git a/guacamole/src/main/frontend/src/app/player/styles/seek.css b/guacamole/src/main/frontend/src/app/player/styles/seek.css new file mode 100644 index 0000000..4b41f3a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/styles/seek.css @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* + * General (not browser-specific) + */ + +input[type="range"] { + background: transparent; + width: 100%; + margin: 0; +} + +input[type="range"]:focus { + outline: none; +} + +/* + * WebKit + */ + +input[type="range"] { + -webkit-appearance: none; +} + +input[type="range"]::-webkit-slider-runnable-track { + + border: none; + border-radius: 0; + background: #5AF; + + width: 100%; + height: 0.5em; + + cursor: pointer; + +} + +input[type="range"]::-webkit-slider-thumb { + + border: none; + border-radius: 0; + background: white; + + width: 3px; + height: 0.5em; + + -webkit-appearance: none; + cursor: pointer; + +} + +input[type="range"]:focus::-webkit-slider-runnable-track { + background: #5AF; +} + +/* + * Firefox + */ + +input[type="range"]::-moz-range-track { + + border: none; + border-radius: 0; + background: #5AF; + + width: 100%; + height: 0.5em; + + cursor: pointer; + +} + +input[type="range"]::-moz-range-thumb { + + border: none; + border-radius: 0; + background: white; + + width: 3px; + height: 0.5em; + + cursor: pointer; + +} + +/* + * Internet Explorer + */ + +input[type="range"]::-ms-track { + + width: 100%; + height: 0.5em; + margin: 0; + + border: none; + border-radius: 0; + background: transparent; + color: transparent; + + cursor: pointer; + +} + +input[type="range"]::-ms-thumb { + + border: none; + border-radius: 0; + background: white; + + width: 3px; + height: 0.5em; + margin: 0; + + cursor: pointer; + +} + +input[type="range"]::-ms-fill-lower, +input[type="range"]::-ms-fill-upper, +input[type="range"]:focus::-ms-fill-lower, +input[type="range"]:focus::-ms-fill-upper { + border: none; + border-radius: 0; + background: #5AF; +} diff --git a/guacamole/src/main/frontend/src/app/player/styles/textView.css b/guacamole/src/main/frontend/src/app/player/styles/textView.css new file mode 100644 index 0000000..0348339 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/styles/textView.css @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.text-batches { + + display: flex; + flex-direction: column; + overflow-y: scroll; + +} + +.text-batches .text-batch { + + margin-bottom: 1em; + margin-left: 0.5em; + cursor: pointer; + +} + +.text-batches .text-batch .timestamp { + + white-space: pre-wrap; + color: blue; + +} + +.guac-player-text-container { + + height: 100%; + display: flex; + flex-direction: column; + background-color: white; + color: black; +} + +.guac-player-text-container .text-controls { + + display: flex; + flex-direction: row; + align-items: center; + +} + +.guac-player-text-container .text-controls .filter { + + flex-grow: 5; + +} + +.guac-player-text-container .text-controls .fullscreen-button { + + background-image: url('images/fullscreen.svg'); + background-size: contain; + cursor: pointer; + height: 22px; + width: 22px; + margin-right: 0.25em; + +} + +.guac-player-text-container .result-count { + + font-weight: bold; + margin: 0.5em; + +} + +.guac-player-text-container .filter { + + margin: 0.25em; + +} + +.text-batches .text { + + display: block; + margin: 0; + padding: 0; + max-width: 100%; + overflow-wrap: break-word; + +} + +.text-batches .text .key-event { + + white-space: pre-wrap; + +} + +.text-batches .text .not-typed { + + font-weight: bold; + +} + +.text-batches .text .future { + + color: dimgray; + +} diff --git a/guacamole/src/main/frontend/src/app/player/templates/player.html b/guacamole/src/main/frontend/src/app/player/templates/player.html new file mode 100644 index 0000000..f002bd4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/templates/player.html @@ -0,0 +1,83 @@ +
      + + + + + + + +
      + + +
      + + + + +
      + + + + + + + + +
      + {{ 'PLAYER.INFO_FRAME_EVENTS_LEGEND' | translate }} + {{ 'PLAYER.INFO_KEY_EVENTS_LEGEND' | translate }} +
      +
      + +
      + + + + + + + + + + {{ formatTime(playbackPosition) }} / {{ formatTime(recording.getDuration()) }} + + + + {{ 'PLAYER.ACTION_SHOW_KEY_LOG' | translate }} + + + + {{ 'PLAYER.INFO_NO_KEY_LOG' | translate }} + +
      + +
      + + +
      + +

      + +
      diff --git a/guacamole/src/main/frontend/src/app/player/templates/playerDisplay.html b/guacamole/src/main/frontend/src/app/player/templates/playerDisplay.html new file mode 100644 index 0000000..606afaf --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/templates/playerDisplay.html @@ -0,0 +1,3 @@ +
      +
      +
      diff --git a/guacamole/src/main/frontend/src/app/player/templates/progressIndicator.html b/guacamole/src/main/frontend/src/app/player/templates/progressIndicator.html new file mode 100644 index 0000000..38c9768 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/templates/progressIndicator.html @@ -0,0 +1,12 @@ +
      {{ percentage }}%
      +
      +
      +
      diff --git a/guacamole/src/main/frontend/src/app/player/templates/textView.html b/guacamole/src/main/frontend/src/app/player/templates/textView.html new file mode 100644 index 0000000..4cef976 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/player/templates/textView.html @@ -0,0 +1,29 @@ +
      + +
      +
      + +
      + +
      + +
      + +
      +
      +
      {{ formatTime(batch.events[0].timestamp) }}
      +
      + {{ event.text }} +
      + +
      +
      diff --git a/guacamole/src/main/frontend/src/app/rest/restModule.js b/guacamole/src/main/frontend/src/app/rest/restModule.js new file mode 100644 index 0000000..23901c0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/restModule.js @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for code relating to communication with the REST API of the + * Guacamole web application. + */ +angular.module('rest', [ + 'auth', + 'locale' +]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/activeConnectionService.js b/guacamole/src/main/frontend/src/app/rest/services/activeConnectionService.js new file mode 100644 index 0000000..327153b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/activeConnectionService.js @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on active connections via the REST API. + */ +angular.module('rest').factory('activeConnectionService', ['$injector', + function activeConnectionService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + + var service = {}; + + /** + * Makes a request to the REST API to get a single active connection, + * returning a promise that provides the corresponding + * @link{ActiveConnection} if successful. + * + * @param {String} dataSource + * The identifier of the data source to retrieve the active connection + * from. + * + * @param {String} id + * The identifier of the active connection. + * + * @returns {Promise.} + * A promise which will resolve with a @link{ActiveConnection} upon + * success. + */ + service.getActiveConnection = function getActiveConnection(dataSource, id) { + + // Retrieve active connection + return authenticationService.request({ + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/activeConnections/' + encodeURIComponent(id) + }); + + }; + + /** + * Makes a request to the REST API to get the list of active tunnels, + * returning a promise that provides a map of @link{ActiveConnection} + * objects if successful. + * + * @param {String[]} [permissionTypes] + * The set of permissions to filter with. A user must have one or more + * of these permissions for an active connection to appear in the + * result. If null, no filtering will be performed. Valid values are + * listed within PermissionSet.ObjectType. + * + * @returns {Promise.>} + * A promise which will resolve with a map of @link{ActiveConnection} + * objects, where each key is the identifier of the corresponding + * active connection. + */ + service.getActiveConnections = function getActiveConnections(dataSource, permissionTypes) { + + // Add permission filter if specified + var httpParameters = {}; + if (permissionTypes) + httpParameters.permission = permissionTypes; + + // Retrieve tunnels + return authenticationService.request({ + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/activeConnections', + params : httpParameters + }); + + }; + + /** + * Makes a request to the REST API to delete the active connections having + * the given identifiers, effectively disconnecting them, returning a + * promise that can be used for processing the results of the call. + * + * @param {String[]} identifiers + * The identifiers of the active connections to delete. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * delete operation is successful. + */ + service.deleteActiveConnections = function deleteActiveConnections(dataSource, identifiers) { + + // Convert provided array of identifiers to a patch + var activeConnectionPatch = []; + identifiers.forEach(function addActiveConnectionPatch(identifier) { + activeConnectionPatch.push({ + op : 'remove', + path : '/' + identifier + }); + }); + + // Perform active connection deletion via PATCH + return authenticationService.request({ + method : 'PATCH', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/activeConnections', + data : activeConnectionPatch + }); + + }; + + /** + * Makes a request to the REST API to generate credentials which have + * access strictly to the given active connection, using the restrictions + * defined by the given sharing profile, returning a promise that provides + * the resulting @link{UserCredentials} object if successful. + * + * @param {String} id + * The identifier of the active connection being shared. + * + * @param {String} sharingProfile + * The identifier of the sharing profile dictating the + * semantics/restrictions which apply to the shared session. + * + * @returns {Promise.} + * A promise which will resolve with a @link{UserCredentials} object + * upon success. + */ + service.getSharingCredentials = function getSharingCredentials(dataSource, id, sharingProfile) { + + // Generate sharing credentials + return authenticationService.request({ + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + + '/activeConnections/' + encodeURIComponent(id) + + '/sharingCredentials/' + encodeURIComponent(sharingProfile) + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/cacheService.js b/guacamole/src/main/frontend/src/app/rest/services/cacheService.js new file mode 100644 index 0000000..9a32004 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/cacheService.js @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which contains all REST API response caches. + */ +angular.module('rest').factory('cacheService', ['$injector', + function cacheService($injector) { + + // Required services + var $cacheFactory = $injector.get('$cacheFactory'); + var $rootScope = $injector.get('$rootScope'); + + // Service containing all caches + var service = {}; + + /** + * Shared cache used by both connectionGroupService and + * connectionService. + * + * @type $cacheFactory.Cache + */ + service.connections = $cacheFactory('API-CONNECTIONS'); + + /** + * Cache used by languageService. + * + * @type $cacheFactory.Cache + */ + service.languages = $cacheFactory('API-LANGUAGES'); + + /** + * Cache used by patchService. + * + * @type $cacheFactory.Cache + */ + service.patches = $cacheFactory('API-PATCHES'); + + /** + * Cache used by schemaService. + * + * @type $cacheFactory.Cache + */ + service.schema = $cacheFactory('API-SCHEMA'); + + /** + * Shared cache used by userService, userGroupService, permissionService, + * and membershipService. + * + * @type $cacheFactory.Cache + */ + service.users = $cacheFactory('API-USERS'); + + /** + * Clear all caches defined in this service. + */ + service.clearCaches = function clearCaches() { + service.connections.removeAll(); + service.languages.removeAll(); + service.schema.removeAll(); + service.users.removeAll(); + }; + + // Clear caches on logout + $rootScope.$on('guacLogout', function handleLogout() { + service.clearCaches(); + }); + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/connectionGroupService.js b/guacamole/src/main/frontend/src/app/rest/services/connectionGroupService.js new file mode 100644 index 0000000..ecfdee4 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/connectionGroupService.js @@ -0,0 +1,184 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on connection groups via the REST API. + */ +angular.module('rest').factory('connectionGroupService', ['$injector', + function connectionGroupService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + // Required types + var ConnectionGroup = $injector.get('ConnectionGroup'); + + var service = {}; + + /** + * Makes a request to the REST API to get an individual connection group + * and all descendants, returning a promise that provides the corresponding + * @link{ConnectionGroup} if successful. Descendant groups and connections + * will be stored as children of that connection group. If a permission + * type is specified, the result will be filtering by that permission. + * + * @param {String} [connectionGroupID=ConnectionGroup.ROOT_IDENTIFIER] + * The ID of the connection group to retrieve. If not provided, the + * root connection group will be retrieved by default. + * + * @param {String[]} [permissionTypes] + * The set of permissions to filter with. A user must have one or more + * of these permissions for a connection to appear in the result. + * If null, no filtering will be performed. Valid values are listed + * within PermissionSet.ObjectType. + * + * @returns {Promise.ConnectionGroup} + * A promise which will resolve with a @link{ConnectionGroup} upon + * success. + */ + service.getConnectionGroupTree = function getConnectionGroupTree(dataSource, connectionGroupID, permissionTypes) { + + // Use the root connection group ID if no ID is passed in + connectionGroupID = connectionGroupID || ConnectionGroup.ROOT_IDENTIFIER; + + // Add permission filter if specified + var httpParameters = {}; + if (permissionTypes) + httpParameters.permission = permissionTypes; + + // Retrieve connection group + return authenticationService.request({ + cache : cacheService.connections, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connectionGroups/' + encodeURIComponent(connectionGroupID) + '/tree', + params : httpParameters + }); + + }; + + /** + * Makes a request to the REST API to get an individual connection group, + * returning a promise that provides the corresponding + * @link{ConnectionGroup} if successful. + * + * @param {String} [connectionGroupID=ConnectionGroup.ROOT_IDENTIFIER] + * The ID of the connection group to retrieve. If not provided, the + * root connection group will be retrieved by default. + * + * @returns {Promise.} A promise for the HTTP call. + * A promise which will resolve with a @link{ConnectionGroup} upon + * success. + */ + service.getConnectionGroup = function getConnectionGroup(dataSource, connectionGroupID) { + + // Use the root connection group ID if no ID is passed in + connectionGroupID = connectionGroupID || ConnectionGroup.ROOT_IDENTIFIER; + + // Retrieve connection group + return authenticationService.request({ + cache : cacheService.connections, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connectionGroups/' + encodeURIComponent(connectionGroupID) + }); + + }; + + /** + * Makes a request to the REST API to save a connection group, returning a + * promise that can be used for processing the results of the call. If the + * connection group is new, and thus does not yet have an associated + * identifier, the identifier will be automatically set in the provided + * connection group upon success. + * + * @param {ConnectionGroup} connectionGroup The connection group to update. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * save operation is successful. + */ + service.saveConnectionGroup = function saveConnectionGroup(dataSource, connectionGroup) { + + // If connection group is new, add it and set the identifier automatically + if (!connectionGroup.identifier) { + return authenticationService.request({ + method : 'POST', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connectionGroups', + data : connectionGroup + }) + + // Set the identifier on the new connection group and clear the cache + .then(function connectionGroupCreated(newConnectionGroup){ + connectionGroup.identifier = newConnectionGroup.identifier; + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for this + // newly created connection group + cacheService.users.removeAll(); + }); + } + + // Otherwise, update the existing connection group + else { + return authenticationService.request({ + method : 'PUT', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connectionGroups/' + encodeURIComponent(connectionGroup.identifier), + data : connectionGroup + }) + + // Clear the cache + .then(function connectionGroupUpdated(){ + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for this + // newly updated connection group + cacheService.users.removeAll(); + }); + } + + }; + + /** + * Makes a request to the REST API to delete a connection group, returning + * a promise that can be used for processing the results of the call. + * + * @param {ConnectionGroup} connectionGroup The connection group to delete. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * delete operation is successful. + */ + service.deleteConnectionGroup = function deleteConnectionGroup(dataSource, connectionGroup) { + + // Delete connection group + return authenticationService.request({ + method : 'DELETE', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connectionGroups/' + encodeURIComponent(connectionGroup.identifier) + }) + + // Clear the cache + .then(function connectionGroupDeleted(){ + cacheService.connections.removeAll(); + }); + + }; + + return service; +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/connectionService.js b/guacamole/src/main/frontend/src/app/rest/services/connectionService.js new file mode 100644 index 0000000..9d41db6 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/connectionService.js @@ -0,0 +1,226 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on connections via the REST API. + */ +angular.module('rest').factory('connectionService', ['$injector', + function connectionService($injector) { + + // Required services + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + var service = {}; + + /** + * Makes a request to the REST API to get a single connection, returning a + * promise that provides the corresponding @link{Connection} if successful. + * + * @param {String} id The ID of the connection. + * + * @returns {Promise.} + * A promise which will resolve with a @link{Connection} upon success. + * + * @example + * + * connectionService.getConnection('myConnection').then(function(connection) { + * // Do something with the connection + * }); + */ + service.getConnection = function getConnection(dataSource, id) { + + // Retrieve connection + return authenticationService.request({ + cache : cacheService.connections, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections/' + encodeURIComponent(id) + }); + + }; + + /** + * Makes a request to the REST API to get the usage history of a single + * connection, returning a promise that provides the corresponding + * array of @link{ConnectionHistoryEntry} objects if successful. + * + * @param {String} id + * The identifier of the connection. + * + * @returns {Promise.} + * A promise which will resolve with an array of + * @link{ConnectionHistoryEntry} objects upon success. + */ + service.getConnectionHistory = function getConnectionHistory(dataSource, id) { + + // Retrieve connection history + return authenticationService.request({ + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections/' + encodeURIComponent(id) + '/history' + }); + + }; + + /** + * Makes a request to the REST API to get the parameters of a single + * connection, returning a promise that provides the corresponding + * map of parameter name/value pairs if successful. + * + * @param {String} id + * The identifier of the connection. + * + * @returns {Promise.>} + * A promise which will resolve with an map of parameter name/value + * pairs upon success. + */ + service.getConnectionParameters = function getConnectionParameters(dataSource, id) { + + // Retrieve connection parameters + return authenticationService.request({ + cache : cacheService.connections, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections/' + encodeURIComponent(id) + '/parameters' + }); + + }; + + /** + * Makes a request to the REST API to save a connection, returning a + * promise that can be used for processing the results of the call. If the + * connection is new, and thus does not yet have an associated identifier, + * the identifier will be automatically set in the provided connection + * upon success. + * + * @param {Connection} connection The connection to update. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * save operation is successful. + */ + service.saveConnection = function saveConnection(dataSource, connection) { + + // If connection is new, add it and set the identifier automatically + if (!connection.identifier) { + return authenticationService.request({ + method : 'POST', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections', + data : connection + }) + + // Set the identifier on the new connection and clear the cache + .then(function connectionCreated(newConnection){ + connection.identifier = newConnection.identifier; + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for this + // newly created connection + cacheService.users.removeAll(); + }); + } + + // Otherwise, update the existing connection + else { + return authenticationService.request({ + method : 'PUT', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections/' + encodeURIComponent(connection.identifier), + data : connection + }) + + // Clear the cache + .then(function connectionUpdated(){ + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for this + // newly updated connection + cacheService.users.removeAll(); + }); + } + + }; + + /** + * Makes a request to the REST API to apply a supplied list of connection + * patches, returning a promise that can be used for processing the results + * of the call. + * + * This operation is atomic - if any errors are encountered during the + * connection patching process, the entire request will fail, and no + * changes will be persisted. + * + * @param {String} dataSource + * The identifier of the data source associated with the connections to + * be patched. + * + * @param {DirectoryPatch.[]} patches + * An array of patches to apply. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchConnections = function patchConnections(dataSource, patches) { + + // Make the PATCH request + return authenticationService.request({ + method : 'PATCH', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections', + data : patches + }) + + // Clear the cache + .then(function connectionsPatched(patchResponse){ + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for any + // newly created or replaced connections + cacheService.users.removeAll(); + + return patchResponse; + + }); + + }; + + /** + * Makes a request to the REST API to delete a connection, + * returning a promise that can be used for processing the results of the call. + * + * @param {Connection} connection The connection to delete. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * delete operation is successful. + */ + service.deleteConnection = function deleteConnection(dataSource, connection) { + + // Delete connection + return authenticationService.request({ + method : 'DELETE', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/connections/' + encodeURIComponent(connection.identifier) + }) + + // Clear the cache + .then(function connectionDeleted(){ + cacheService.connections.removeAll(); + }); + + }; + + return service; +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/dataSourceService.js b/guacamole/src/main/frontend/src/app/rest/services/dataSourceService.js new file mode 100644 index 0000000..6405394 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/dataSourceService.js @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which contains all REST API response caches. + */ +angular.module('rest').factory('dataSourceService', ['$injector', + function dataSourceService($injector) { + + // Required types + var Error = $injector.get('Error'); + + // Required services + var $q = $injector.get('$q'); + var requestService = $injector.get('requestService'); + + // Service containing all caches + var service = {}; + + /** + * Invokes the given function once for each of the given data sources, + * passing that data source as the first argument to each invocation, + * followed by any additional arguments passed to apply(). The results of + * each invocation are aggregated into a map by data source identifier, + * and handled through a single promise which is resolved or rejected + * depending on the success/failure of each resulting REST call. Any error + * results in rejection of the entire apply() operation, except 404 ("NOT + * FOUND") errors, which are ignored. + * + * @param {Function} fn + * The function to call for each of the given data sources. The data + * source identifier will be given as the first argument, followed by + * the rest of the arguments given to apply(), in order. The function + * must return a Promise which is resolved or rejected depending on the + * result of the REST call. + * + * @param {String[]} dataSources + * The array or data source identifiers against which the given + * function should be called. + * + * @param {...*} args + * Any additional arguments to pass to the given function each time it + * is called. + * + * @returns {Promise.>} + * A Promise which resolves with a map of data source identifier to + * corresponding result. The result will be the exact object or value + * provided as the resolution to the Promise returned by calls to the + * given function. + */ + service.apply = function apply(fn, dataSources) { + + var deferred = $q.defer(); + + var requests = []; + var results = {}; + + // Build array of arguments to pass to the given function + var args = []; + for (var i = 2; i < arguments.length; i++) + args.push(arguments[i]); + + // Retrieve the root group from all data sources + angular.forEach(dataSources, function invokeAgainstDataSource(dataSource) { + + // Add promise to list of pending requests + var deferredRequest = $q.defer(); + requests.push(deferredRequest.promise); + + // Retrieve root group from data source + fn.apply(this, [dataSource].concat(args)) + + // Store result on success + .then(function immediateRequestSucceeded(data) { + results[dataSource] = data; + deferredRequest.resolve(); + }, + + // Fail on any errors (except "NOT FOUND") + requestService.createErrorCallback(function immediateRequestFailed(error) { + + if (error.type === Error.Type.NOT_FOUND) + deferredRequest.resolve(); + + // Explicitly abort for all other errors + else + deferredRequest.reject(error); + + })); + + }); + + // Resolve if all requests succeed + $q.all(requests).then(function requestsSucceeded() { + deferred.resolve(results); + }, + + // Reject if at least one request fails + requestService.createErrorCallback(function requestFailed(error) { + deferred.reject(error); + })); + + return deferred.promise; + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/historyService.js b/guacamole/src/main/frontend/src/app/rest/services/historyService.js new file mode 100644 index 0000000..96291e7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/historyService.js @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on history records via the REST API. + */ +angular.module('rest').factory('historyService', ['$injector', + function historyService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + + var service = {}; + + /** + * Makes a request to the REST API to get the usage history of all + * accessible connections, returning a promise that provides the + * corresponding array of @link{ConnectionHistoryEntry} objects if + * successful. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connection + * history records to be retrieved. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {String[]} [requiredContents] + * The set of arbitrary strings to filter with. A ConnectionHistoryEntry + * must contain each of these values within the associated username, + * connection name, start date, or end date to appear in the result. If + * null, no filtering will be performed. + * + * @param {String[]} [sortPredicates] + * The set of predicates to sort against. The resulting array of + * ConnectionHistoryEntry objects will be sorted according to the + * properties and sort orders defined by each predicate. If null, the + * order of the resulting entries is undefined. Valid values are listed + * within ConnectionHistoryEntry.SortPredicate. + * + * @returns {Promise.} + * A promise which will resolve with an array of + * @link{ConnectionHistoryEntry} objects upon success. + */ + service.getConnectionHistory = function getConnectionHistory(dataSource, + requiredContents, sortPredicates) { + + var httpParameters = {}; + + // Filter according to contents if restrictions are specified + if (requiredContents) + httpParameters.contains = requiredContents; + + // Sort according to provided predicates, if any + if (sortPredicates) + httpParameters.order = sortPredicates; + + // Retrieve connection history + return authenticationService.request({ + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/history/connections', + params : httpParameters + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/languageService.js b/guacamole/src/main/frontend/src/app/rest/services/languageService.js new file mode 100644 index 0000000..8f55e2f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/languageService.js @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on language metadata via the REST API. + */ +angular.module('rest').factory('languageService', ['$injector', + function languageService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + var service = {}; + + /** + * Makes a request to the REST API to get the list of languages, returning + * a promise that provides a map of language names by language key if + * successful. + * + * @returns {Promise.>} + * A promise which will resolve with a map of language names by + * language key upon success. + */ + service.getLanguages = function getLanguages() { + + // Retrieve available languages + return authenticationService.request({ + cache : cacheService.languages, + method : 'GET', + url : 'api/languages' + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/membershipService.js b/guacamole/src/main/frontend/src/app/rest/services/membershipService.js new file mode 100644 index 0000000..60c5c97 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/membershipService.js @@ -0,0 +1,349 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on user group memberships via the REST API. + */ +angular.module('rest').factory('membershipService', ['$injector', + function membershipService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + // Required types + var RelatedObjectPatch = $injector.get('RelatedObjectPatch'); + + var service = {}; + + /** + * Creates a new array of patches which represents the given changes to an + * arbitrary set of objects sharing some common relation. + * + * @param {String[]} [identifiersToAdd] + * The identifiers of all objects which should be added to the + * relation, if any. + * + * @param {String[]} [identifiersToRemove] + * The identifiers of all objects which should be removed from the + * relation, if any. + * + * @returns {RelatedObjectPatch[]} + * A new array of patches which represents the given changes. + */ + var getRelatedObjectPatch = function getRelatedObjectPatch(identifiersToAdd, identifiersToRemove) { + + var patch = []; + + angular.forEach(identifiersToAdd, function addIdentifier(identifier) { + patch.push(new RelatedObjectPatch({ + op : RelatedObjectPatch.Operation.ADD, + value : identifier + })); + }); + + angular.forEach(identifiersToRemove, function removeIdentifier(identifier) { + patch.push(new RelatedObjectPatch({ + op : RelatedObjectPatch.Operation.REMOVE, + value : identifier + })); + }); + + return patch; + + }; + + /** + * Returns the URL for the REST resource most appropriate for accessing + * the parent user groups of the user or group having the given identifier. + * + * It is important to note that a particular data source can authenticate + * and provide user groups for a user, even if that user does not exist + * within that data source (and thus cannot be found beneath + * "api/session/data/{dataSource}/users") + * + * @param {String} dataSource + * The unique identifier of the data source containing the user or + * group whose parent user groups should be retrieved. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @param {String} identifier + * The identifier of the user or group for which the URL of the proper + * REST resource should be derived. + * + * @param {Boolean} [group] + * Whether the provided identifier refers to a user group. If false or + * omitted, the identifier given is assumed to refer to a user. + * + * @returns {String} + * The URL for the REST resource representing the parent user groups of + * the user or group having the given identifier. + */ + var getUserGroupsResourceURL = function getUserGroupsResourceURL(dataSource, identifier, group) { + + // Create base URL for data source + var base = 'api/session/data/' + encodeURIComponent(dataSource); + + // Access parent groups directly (there is no "self" for user groups + // as there is for users) + if (group) + return base + '/userGroups/' + encodeURIComponent(identifier) + '/userGroups'; + + // If the username is that of the current user, do not rely on the + // user actually existing (they may not). Access their parent groups via + // "self" rather than the collection of defined users. + if (identifier === authenticationService.getCurrentUsername()) + return base + '/self/userGroups'; + + // Otherwise, the user must exist for their parent groups to be + // accessible. Use the collection of defined users. + return base + '/users/' + encodeURIComponent(identifier) + '/userGroups'; + + }; + + /** + * Makes a request to the REST API to retrieve the identifiers of all + * parent user groups of which a given user or group is a member, returning + * a promise that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user or + * group whose parent user groups should be retrieved. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @param {String} identifier + * The identifier of the user or group to retrieve the parent user + * groups of. + * + * @param {Boolean} [group] + * Whether the provided identifier refers to a user group. If false or + * omitted, the identifier given is assumed to refer to a user. + * + * @returns {Promise.} + * A promise for the HTTP call which will resolve with an array + * containing the requested identifiers upon success. + */ + service.getUserGroups = function getUserGroups(dataSource, identifier, group) { + + // Retrieve parent groups + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : getUserGroupsResourceURL(dataSource, identifier, group) + }); + + }; + + /** + * Makes a request to the REST API to modify the parent user groups of + * which a given user or group is a member, returning a promise that can be + * used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user or + * group whose parent user groups should be modified. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @param {String} identifier + * The identifier of the user or group to modify the parent user + * groups of. + * + * @param {String[]} [addToUserGroups] + * The identifier of all parent user groups to which the given user or + * group should be added as a member, if any. + * + * @param {String[]} [removeFromUserGroups] + * The identifier of all parent user groups from which the given member + * user or group should be removed, if any. + * + * @param {Boolean} [group] + * Whether the provided identifier refers to a user group. If false or + * omitted, the identifier given is assumed to refer to a user. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchUserGroups = function patchUserGroups(dataSource, identifier, + addToUserGroups, removeFromUserGroups, group) { + + // Update parent user groups + return authenticationService.request({ + method : 'PATCH', + url : getUserGroupsResourceURL(dataSource, identifier, group), + data : getRelatedObjectPatch(addToUserGroups, removeFromUserGroups) + }) + + // Clear the cache + .then(function parentUserGroupsChanged(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to retrieve the identifiers of all + * users which are members of the given user group, returning a promise + * that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group + * whose member users should be retrieved. This identifier corresponds + * to an AuthenticationProvider within the Guacamole web application. + * + * @param {String} identifier + * The identifier of the user group to retrieve the member users of. + * + * @returns {Promise.} + * A promise for the HTTP call which will resolve with an array + * containing the requested identifiers upon success. + */ + service.getMemberUsers = function getMemberUsers(dataSource, identifier) { + + // Retrieve member users + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(identifier) + '/memberUsers' + }); + + }; + + /** + * Makes a request to the REST API to modify the member users of a given + * user group, returning a promise that can be used for processing the + * results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group + * whose member users should be modified. This identifier corresponds + * to an AuthenticationProvider within the Guacamole web application. + * + * @param {String} identifier + * The identifier of the user group to modify the member users of. + * + * @param {String[]} [usersToAdd] + * The identifier of all users to add as members of the given user + * group, if any. + * + * @param {String[]} [usersToRemove] + * The identifier of all users to remove from the given user group, + * if any. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchMemberUsers = function patchMemberUsers(dataSource, identifier, + usersToAdd, usersToRemove) { + + // Update member users + return authenticationService.request({ + method : 'PATCH', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(identifier) + '/memberUsers', + data : getRelatedObjectPatch(usersToAdd, usersToRemove) + }) + + // Clear the cache + .then(function memberUsersChanged(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to retrieve the identifiers of all + * user groups which are members of the given user group, returning a + * promise that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group + * whose member user groups should be retrieved. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @param {String} identifier + * The identifier of the user group to retrieve the member user + * groups of. + * + * @returns {Promise.} + * A promise for the HTTP call which will resolve with an array + * containing the requested identifiers upon success. + */ + service.getMemberUserGroups = function getMemberUserGroups(dataSource, identifier) { + + // Retrieve member user groups + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(identifier) + '/memberUserGroups' + }); + + }; + + /** + * Makes a request to the REST API to modify the member user groups of a + * given user group, returning a promise that can be used for processing + * the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group + * whose member user groups should be modified. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @param {String} identifier + * The identifier of the user group to modify the member user groups of. + * + * @param {String[]} [userGroupsToAdd] + * The identifier of all user groups to add as members of the given + * user group, if any. + * + * @param {String[]} [userGroupsToRemove] + * The identifier of all member user groups to remove from the given + * user group, if any. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchMemberUserGroups = function patchMemberUserGroups(dataSource, + identifier, userGroupsToAdd, userGroupsToRemove) { + + // Update member user groups + return authenticationService.request({ + method : 'PATCH', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(identifier) + '/memberUserGroups', + data : getRelatedObjectPatch(userGroupsToAdd, userGroupsToRemove) + }) + + // Clear the cache + .then(function memberUserGroupsChanged(){ + cacheService.users.removeAll(); + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/patchService.js b/guacamole/src/main/frontend/src/app/rest/services/patchService.js new file mode 100644 index 0000000..ea06e5b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/patchService.js @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on HTML patches via the REST API. + */ +angular.module('rest').factory('patchService', ['$injector', + function patchService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var cacheService = $injector.get('cacheService'); + + var service = {}; + + /** + * Makes a request to the REST API to get the list of patches, returning + * a promise that provides the array of all applicable patches if + * successful. Each patch is a string of raw HTML with meta information + * describing the patch operation stored within meta tags. + * + * @returns {Promise.} + * A promise which will resolve with an array of HTML patches upon + * success. + */ + service.getPatches = function getPatches() { + + // Retrieve all applicable HTML patches + return requestService({ + cache : cacheService.patches, + method : 'GET', + url : 'api/patches' + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/permissionService.js b/guacamole/src/main/frontend/src/app/rest/services/permissionService.js new file mode 100644 index 0000000..ac09fa1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/permissionService.js @@ -0,0 +1,345 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on user permissions via the REST API. + */ +angular.module('rest').factory('permissionService', ['$injector', + function permissionService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + // Required types + var PermissionPatch = $injector.get('PermissionPatch'); + + var service = {}; + + /** + * Returns the URL for the REST resource most appropriate for accessing + * the effective permissions of the user having the given username. + * Effective permissions differ from the permissions returned via + * getPermissions() in that permissions which are not directly granted to + * the user are included. + * + * It is important to note that a particular data source can authenticate + * and provide permissions for a user, even if that user does not exist + * within that data source (and thus cannot be found beneath + * "api/session/data/{dataSource}/users") + * + * NOTE: Unlike getPermissionsResourceURL(), + * getEffectivePermissionsResourceURL() CANNOT be applied to user groups. + * Only users have retrievable effective permissions as far as the REST API + * is concerned. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user whose + * permissions should be retrieved. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {String} username + * The username of the user for which the URL of the proper REST + * resource should be derived. + * + * @returns {String} + * The URL for the REST resource representing the user having the given + * username. + */ + var getEffectivePermissionsResourceURL = function getEffectivePermissionsResourceURL(dataSource, username) { + + // Create base URL for data source + var base = 'api/session/data/' + encodeURIComponent(dataSource); + + // If the username is that of the current user, do not rely on the + // user actually existing (they may not). Access their permissions via + // "self" rather than the collection of defined users. + if (username === authenticationService.getCurrentUsername()) + return base + '/self/effectivePermissions'; + + // Otherwise, the user must exist for their permissions to be + // accessible. Use the collection of defined users. + return base + '/users/' + encodeURIComponent(username) + '/effectivePermissions'; + + }; + + /** + * Makes a request to the REST API to get the list of effective permissions + * for a given user, returning a promise that provides an array of + * @link{Permission} objects if successful. Effective permissions differ + * from the permissions returned via getPermissions() in that permissions + * which are not directly granted to the user are included. + * + * NOTE: Unlike getPermissions(), getEffectivePermissions() CANNOT be + * applied to user groups. Only users have retrievable effective + * permissions as far as the REST API is concerned. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user whose + * permissions should be retrieved. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {String} userID + * The ID of the user to retrieve the permissions for. + * + * @returns {Promise.} + * A promise which will resolve with a @link{PermissionSet} upon + * success. + */ + service.getEffectivePermissions = function getEffectivePermissions(dataSource, userID) { + + // Retrieve user permissions + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : getEffectivePermissionsResourceURL(dataSource, userID) + }); + + }; + + /** + * Returns the URL for the REST resource most appropriate for accessing + * the permissions of the user or group having the given identifier. The + * permissions retrieved differ from effective permissions (those returned + * by getEffectivePermissions()) in that only permissions which are directly + * granted to the user or group are included. + * + * It is important to note that a particular data source can authenticate + * and provide permissions for a user, even if that user does not exist + * within that data source (and thus cannot be found beneath + * "api/session/data/{dataSource}/users") + * + * @param {String} dataSource + * The unique identifier of the data source containing the user whose + * permissions should be retrieved. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {String} identifier + * The identifier of the user or group for which the URL of the proper + * REST resource should be derived. + * + * @param {Boolean} [group] + * Whether the provided identifier refers to a user group. If false or + * omitted, the identifier given is assumed to refer to a user. + * + * @returns {String} + * The URL for the REST resource representing the user or group having + * the given identifier. + */ + var getPermissionsResourceURL = function getPermissionsResourceURL(dataSource, identifier, group) { + + // Create base URL for data source + var base = 'api/session/data/' + encodeURIComponent(dataSource); + + // Access group permissions directly (there is no "self" for user groups + // as there is for users) + if (group) + return base + '/userGroups/' + encodeURIComponent(identifier) + '/permissions'; + + // If the username is that of the current user, do not rely on the + // user actually existing (they may not). Access their permissions via + // "self" rather than the collection of defined users. + if (identifier === authenticationService.getCurrentUsername()) + return base + '/self/permissions'; + + // Otherwise, the user must exist for their permissions to be + // accessible. Use the collection of defined users. + return base + '/users/' + encodeURIComponent(identifier) + '/permissions'; + + }; + + /** + * Makes a request to the REST API to get the list of permissions for a + * given user or user group, returning a promise that provides an array of + * @link{Permission} objects if successful. The permissions retrieved + * differ from effective permissions (those returned by + * getEffectivePermissions()) in that both users and groups may be queried, + * and only permissions which are directly granted to the user or group are + * included. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user or group + * whose permissions should be retrieved. This identifier corresponds to + * an AuthenticationProvider within the Guacamole web application. + * + * @param {String} identifier + * The identifier of the user or group to retrieve the permissions for. + * + * @param {Boolean} [group] + * Whether the provided identifier refers to a user group. If false or + * omitted, the identifier given is assumed to refer to a user. + * + * @returns {Promise.} + * A promise which will resolve with a @link{PermissionSet} upon + * success. + */ + service.getPermissions = function getPermissions(dataSource, identifier, group) { + + // Retrieve user/group permissions + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : getPermissionsResourceURL(dataSource, identifier, group) + }); + + }; + + /** + * Adds patches for modifying the permissions associated with specific + * objects to the given array of patches. + * + * @param {PermissionPatch[]} patch + * The array of patches to add new patches to. + * + * @param {String} operation + * The operation to specify within each of the patches. Valid values + * for this are defined within PermissionPatch.Operation. + * + * @param {String} path + * The path of the permissions being patched. The path is a JSON path + * describing the position of the permissions within a PermissionSet. + * + * @param {Object.} permissions + * A map of object identifiers to arrays of permission type strings, + * where each type string is a value from + * PermissionSet.ObjectPermissionType. + */ + var addObjectPatchOperations = function addObjectPatchOperations(patch, operation, path, permissions) { + + // Add object permission operations to patch + for (var identifier in permissions) { + permissions[identifier].forEach(function addObjectPatch(type) { + patch.push({ + op : operation, + path : path + "/" + identifier, + value : type + }); + }); + } + + }; + + /** + * Adds patches for modifying any permission that can be stored within a + * @link{PermissionSet}. + * + * @param {PermissionPatch[]} patch + * The array of patches to add new patches to. + * + * @param {String} operation + * The operation to specify within each of the patches. Valid values + * for this are defined within PermissionPatch.Operation. + * + * @param {PermissionSet} permissions + * The set of permissions for which patches should be added. + */ + var addPatchOperations = function addPatchOperations(patch, operation, permissions) { + + // Add connection permission operations to patch + addObjectPatchOperations(patch, operation, "/connectionPermissions", + permissions.connectionPermissions); + + // Add connection group permission operations to patch + addObjectPatchOperations(patch, operation, "/connectionGroupPermissions", + permissions.connectionGroupPermissions); + + // Add sharing profile permission operations to patch + addObjectPatchOperations(patch, operation, "/sharingProfilePermissions", + permissions.sharingProfilePermissions); + + // Add active connection permission operations to patch + addObjectPatchOperations(patch, operation, "/activeConnectionPermissions", + permissions.activeConnectionPermissions); + + // Add user permission operations to patch + addObjectPatchOperations(patch, operation, "/userPermissions", + permissions.userPermissions); + + // Add user group permission operations to patch + addObjectPatchOperations(patch, operation, "/userGroupPermissions", + permissions.userGroupPermissions); + + // Add system operations to patch + permissions.systemPermissions.forEach(function addSystemPatch(type) { + patch.push({ + op : operation, + path : "/systemPermissions", + value : type + }); + }); + + }; + + /** + * Makes a request to the REST API to modify the permissions for a given + * user or group, returning a promise that can be used for processing the + * results of the call. This request affects only the permissions directly + * granted to the user or group, and may not affect permissions inherited + * through other means (effective permissions). + * + * @param {String} dataSource + * The unique identifier of the data source containing the user or group + * whose permissions should be modified. This identifier corresponds to + * an AuthenticationProvider within the Guacamole web application. + * + * @param {String} identifier + * The identifier of the user or group to modify the permissions of. + * + * @param {PermissionSet} [permissionsToAdd] + * The set of permissions to add, if any. + * + * @param {PermissionSet} [permissionsToRemove] + * The set of permissions to remove, if any. + * + * @param {Boolean} [group] + * Whether the provided identifier refers to a user group. If false or + * omitted, the identifier given is assumed to refer to a user. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchPermissions = function patchPermissions(dataSource, identifier, + permissionsToAdd, permissionsToRemove, group) { + + var permissionPatch = []; + + // Add all the add operations to the patch + addPatchOperations(permissionPatch, PermissionPatch.Operation.ADD, permissionsToAdd); + + // Add all the remove operations to the patch + addPatchOperations(permissionPatch, PermissionPatch.Operation.REMOVE, permissionsToRemove); + + // Patch user/group permissions + return authenticationService.request({ + method : 'PATCH', + url : getPermissionsResourceURL(dataSource, identifier, group), + data : permissionPatch + }) + + // Clear the cache + .then(function permissionsPatched(){ + cacheService.users.removeAll(); + }); + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/requestService.js b/guacamole/src/main/frontend/src/app/rest/services/requestService.js new file mode 100644 index 0000000..ead1332 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/requestService.js @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for converting $http promises that pass the entire response into + * promises that pass only the data from that response. + */ +angular.module('rest').factory('requestService', ['$injector', + function requestService($injector) { + + // Required services + var $http = $injector.get('$http'); + var $log = $injector.get('$log'); + var $rootScope = $injector.get('$rootScope'); + + // Required types + var Error = $injector.get('Error'); + + /** + * Given a configuration object formatted for the $http service, returns + * a promise that will resolve or reject with the data from the HTTP + * response. If the promise is rejected due to the HTTP response indicating + * failure, the promise will be rejected strictly with an instance of an + * @link{Error} object. + * + * @param {Object} object + * Configuration object for $http service call. + * + * @returns {Promise.} + * A promise that will resolve with the data from the HTTP response for + * the underlying $http call if successful, or reject with an @link{Error} + * describing the failure. + */ + var service = function wrapHttpServiceCall(object) { + return $http(object).then( + function success(response) { return response.data; }, + function failure(response) { + + // Wrap true error responses from $http within REST Error objects + if (response.data) + throw new Error(response.data); + + // Fall back to a generic internal error if the request couldn't + // even be issued (webapp is down, etc.) + else if ('data' in response) + throw new Error({ message : 'Unknown failure sending HTTP request' }); + + // The value provided is not actually a response object from + // the $http service + throw response; + + } + ); + }; + + /** + * Creates a promise error callback which invokes the given callback only + * if the promise was rejected with a REST @link{Error} object. If the + * promise is rejected without an @link{Error} object, such as when a + * JavaScript error occurs within a callback earlier in the promise chain, + * the rejection is logged without invoking the given callback. + * + * @param {Function} callback + * The callback to invoke if the promise is rejected with an + * @link{Error} object. + * + * @returns {Function} + * A function which can be provided as the error callback for a + * promise. + */ + service.createErrorCallback = function createErrorCallback(callback) { + return (function generatedErrorCallback(error) { + + // Invoke given callback ONLY if due to a legitimate REST error + if (error instanceof Error) + return callback(error); + + // Log all other errors + $log.error(error); + + }); + }; + + /** + * Creates a promise error callback which resolves the promise with the + * given default value only if the @link{Error} in the original rejection + * is a NOT_FOUND error. All other errors are passed through and must be + * handled as yet more rejections. + * + * @param {*} value + * The default value to use to resolve the promise if the promise is + * rejected with a NOT_FOUND error. + * + * @returns {Function} + * A function which can be provided as the error callback for a + * promise. + */ + service.defaultValue = function defaultValue(value) { + return service.createErrorCallback(function resolveIfNotFound(error) { + + // Return default value only if not found + if (error.type === Error.Type.NOT_FOUND) + return value; + + // Reject promise with original error otherwise + throw error; + + }); + }; + + /** + * Promise error callback which ignores all rejections due to REST errors, + * but logs all other rejections, such as those due to JavaScript errors. + * This callback should be used in favor of angular.noop in cases where + * a REST response is being handled but REST errors should be ignored. + * + * @constant + * @type Function + */ + service.IGNORE = service.createErrorCallback(angular.noop); + + /** + * Promise error callback which logs all rejections due to REST errors as + * warnings to the browser console, and logs all other rejections as + * errors. This callback should be used in favor of angular.noop or + * @link{IGNORE} if REST errors are simply not expected. + * + * @constant + * @type Function + */ + service.WARN = service.createErrorCallback(function warnRequestFailed(error) { + $log.warn(error.type, error.message || error.translatableMessage); + }); + + /** + * Promise error callback which replaces the content of the page with a + * generic error message warning that the page could not be displayed. All + * rejections are logged to the browser console as errors. This callback + * should be used in favor of @link{WARN} if REST errors will result in the + * page being unusable. + * + * @constant + * @type Function + */ + service.DIE = service.createErrorCallback(function fatalPageError(error) { + $rootScope.$broadcast('guacFatalPageError', error); + $log.error(error.type, error.message || error.translatableMessage); + }); + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/schemaService.js b/guacamole/src/main/frontend/src/app/rest/services/schemaService.js new file mode 100644 index 0000000..d6afa2b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/schemaService.js @@ -0,0 +1,228 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on metadata via the REST API. + */ +angular.module('rest').factory('schemaService', ['$injector', + function schemaService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + var service = {}; + + /** + * Makes a request to the REST API to get the list of available attributes + * for user objects, returning a promise that provides an array of + * @link{Form} objects if successful. Each element of the array describes + * a logical grouping of possible attributes. + * + * @param {String} dataSource + * The unique identifier of the data source containing the users whose + * available attributes are to be retrieved. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @returns {Promise.} + * A promise which will resolve with an array of @link{Form} + * objects, where each @link{Form} describes a logical grouping of + * possible attributes. + */ + service.getUserAttributes = function getUserAttributes(dataSource) { + + // Retrieve available user attributes + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/userAttributes' + }); + + }; + + /** + * Makes a request to the REST API to get the list of available user preference + * attributes, returning a promise that provides an array of @link{Form} objects + * if successful. Each element of the array describes a logical grouping of + * possible user preference attributes. + * + * @param {String} dataSource + * The unique identifier of the data source containing the users whose + * available user preference attributes are to be retrieved. This + * identifier corresponds to an AuthenticationProvider within the + * Guacamole web application. + * + * @returns {Promise.} + * A promise which will resolve with an array of @link{Form} + * objects, where each @link{Form} describes a logical grouping of + * possible attributes. + */ + service.getUserPreferenceAttributes = function getUserPreferenceAttributes(dataSource) { + + // Retrieve available user attributes + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/userPreferenceAttributes' + }); + + }; + + /** + * Makes a request to the REST API to get the list of available attributes + * for user group objects, returning a promise that provides an array of + * @link{Form} objects if successful. Each element of the array describes + * a logical grouping of possible attributes. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user groups + * whose available attributes are to be retrieved. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @returns {Promise.} + * A promise which will resolve with an array of @link{Form} + * objects, where each @link{Form} describes a logical grouping of + * possible attributes. + */ + service.getUserGroupAttributes = function getUserGroupAttributes(dataSource) { + + // Retrieve available user group attributes + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/userGroupAttributes' + }); + + }; + + /** + * Makes a request to the REST API to get the list of available attributes + * for connection objects, returning a promise that provides an array of + * @link{Form} objects if successful. Each element of the array describes + * a logical grouping of possible attributes. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connections + * whose available attributes are to be retrieved. This identifier + * corresponds to an AuthenticationProvider within the Guacamole web + * application. + * + * @returns {Promise.} + * A promise which will resolve with an array of @link{Form} + * objects, where each @link{Form} describes a logical grouping of + * possible attributes. + */ + service.getConnectionAttributes = function getConnectionAttributes(dataSource) { + + // Retrieve available connection attributes + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/connectionAttributes' + }); + + }; + + /** + * Makes a request to the REST API to get the list of available attributes + * for sharing profile objects, returning a promise that provides an array + * of @link{Form} objects if successful. Each element of the array describes + * a logical grouping of possible attributes. + * + * @param {String} dataSource + * The unique identifier of the data source containing the sharing + * profiles whose available attributes are to be retrieved. This + * identifier corresponds to an AuthenticationProvider within the + * Guacamole web application. + * + * @returns {Promise.} + * A promise which will resolve with an array of @link{Form} + * objects, where each @link{Form} describes a logical grouping of + * possible attributes. + */ + service.getSharingProfileAttributes = function getSharingProfileAttributes(dataSource) { + + // Retrieve available sharing profile attributes + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/sharingProfileAttributes' + }); + + }; + + /** + * Makes a request to the REST API to get the list of available attributes + * for connection group objects, returning a promise that provides an array + * of @link{Form} objects if successful. Each element of the array + * a logical grouping of possible attributes. + * + * @param {String} dataSource + * The unique identifier of the data source containing the connection + * groups whose available attributes are to be retrieved. This + * identifier corresponds to an AuthenticationProvider within the + * Guacamole web application. + * + * @returns {Promise.} + * A promise which will resolve with an array of @link{Form} + * objects, where each @link{Form} describes a logical grouping of + * possible attributes. + */ + service.getConnectionGroupAttributes = function getConnectionGroupAttributes(dataSource) { + + // Retrieve available connection group attributes + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/connectionGroupAttributes' + }); + + }; + + /** + * Makes a request to the REST API to get the list of protocols, returning + * a promise that provides a map of @link{Protocol} objects by protocol + * name if successful. + * + * @param {String} dataSource + * The unique identifier of the data source defining available + * protocols. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @returns {Promise.>} + * A promise which will resolve with a map of @link{Protocol} + * objects by protocol name upon success. + */ + service.getProtocols = function getProtocols(dataSource) { + + // Retrieve available protocols + return authenticationService.request({ + cache : cacheService.schema, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/schema/protocols' + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/sharingProfileService.js b/guacamole/src/main/frontend/src/app/rest/services/sharingProfileService.js new file mode 100644 index 0000000..57055ec --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/sharingProfileService.js @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on sharing profiles via the REST API. + */ +angular.module('rest').factory('sharingProfileService', ['$injector', + function sharingProfileService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + var service = {}; + + /** + * Makes a request to the REST API to get a single sharing profile, + * returning a promise that provides the corresponding @link{SharingProfile} + * if successful. + * + * @param {String} id The ID of the sharing profile. + * + * @returns {Promise.} + * A promise which will resolve with a @link{SharingProfile} upon + * success. + * + * @example + * + * sharingProfileService.getSharingProfile('mySharingProfile').then(function(sharingProfile) { + * // Do something with the sharing profile + * }); + */ + service.getSharingProfile = function getSharingProfile(dataSource, id) { + + // Retrieve sharing profile + return authenticationService.request({ + cache : cacheService.connections, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/sharingProfiles/' + encodeURIComponent(id) + }); + + }; + + /** + * Makes a request to the REST API to get the parameters of a single + * sharing profile, returning a promise that provides the corresponding + * map of parameter name/value pairs if successful. + * + * @param {String} id + * The identifier of the sharing profile. + * + * @returns {Promise.>} + * A promise which will resolve with an map of parameter name/value + * pairs upon success. + */ + service.getSharingProfileParameters = function getSharingProfileParameters(dataSource, id) { + + // Retrieve sharing profile parameters + return authenticationService.request({ + cache : cacheService.connections, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/sharingProfiles/' + encodeURIComponent(id) + '/parameters' + }); + + }; + + /** + * Makes a request to the REST API to save a sharing profile, returning a + * promise that can be used for processing the results of the call. If the + * sharing profile is new, and thus does not yet have an associate + * identifier, the identifier will be automatically set in the provided + * sharing profile upon success. + * + * @param {SharingProfile} sharingProfile + * The sharing profile to update. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * save operation is successful. + */ + service.saveSharingProfile = function saveSharingProfile(dataSource, sharingProfile) { + + // If sharing profile is new, add it and set the identifier automatically + if (!sharingProfile.identifier) { + return authenticationService.request({ + method : 'POST', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/sharingProfiles', + data : sharingProfile + }) + + // Set the identifier on the new sharing profile and clear the cache + .then(function sharingProfileCreated(newSharingProfile){ + sharingProfile.identifier = newSharingProfile.identifier; + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for this + // newly created sharing profile + cacheService.users.removeAll(); + }); + } + + // Otherwise, update the existing sharing profile + else { + return authenticationService.request({ + method : 'PUT', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/sharingProfiles/' + encodeURIComponent(sharingProfile.identifier), + data : sharingProfile + }) + + // Clear the cache + .then(function sharingProfileUpdated(){ + cacheService.connections.removeAll(); + + // Clear users cache to force reload of permissions for this + // newly updated sharing profile + cacheService.users.removeAll(); + }); + } + + }; + + /** + * Makes a request to the REST API to delete a sharing profile, + * returning a promise that can be used for processing the results of the call. + * + * @param {SharingProfile} sharingProfile + * The sharing profile to delete. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * delete operation is successful. + */ + service.deleteSharingProfile = function deleteSharingProfile(dataSource, sharingProfile) { + + // Delete sharing profile + return authenticationService.request({ + method : 'DELETE', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/sharingProfiles/' + encodeURIComponent(sharingProfile.identifier) + }) + + // Clear the cache + .then(function sharingProfileDeleted(){ + cacheService.connections.removeAll(); + }); + + }; + + return service; +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/tunnelService.js b/guacamole/src/main/frontend/src/app/rest/services/tunnelService.js new file mode 100644 index 0000000..2ebb08b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/tunnelService.js @@ -0,0 +1,410 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on the tunnels of in-progress connections (and their + * underlying objects) via the REST API. + */ +angular.module('rest').factory('tunnelService', ['$injector', + function tunnelService($injector) { + + // Required types + var Error = $injector.get('Error'); + + // Required services + var $q = $injector.get('$q'); + var $window = $injector.get('$window'); + var authenticationService = $injector.get('authenticationService'); + var requestService = $injector.get('requestService'); + + var service = {}; + + /** + * Reference to the window.document object. + * + * @private + * @type HTMLDocument + */ + var document = $window.document; + + /** + * The number of milliseconds to wait after a stream download has completed + * before cleaning up related DOM resources, if the browser does not + * otherwise notify us that cleanup is safe. + * + * @private + * @constant + * @type Number + */ + var DOWNLOAD_CLEANUP_WAIT = 5000; + + /** + * The maximum size a chunk may be during uploadToStream() in bytes. + * + * @private + * @constant + * @type Number + */ + const CHUNK_SIZE = 1024 * 1024 * 4; + + /** + * Makes a request to the REST API to get the list of all tunnels + * associated with in-progress connections, returning a promise that + * provides an array of their UUIDs (strings) if successful. + * + * @returns {Promise.>} + * A promise which will resolve with an array of UUID strings, uniquely + * identifying each active tunnel. + */ + service.getTunnels = function getTunnels() { + + // Retrieve tunnels + return authenticationService.request({ + method : 'GET', + url : 'api/session/tunnels' + }); + + }; + + /** + * Makes a request to the REST API to retrieve the underlying protocol of + * the connection associated with a particular tunnel, returning a promise + * that provides a @link{Protocol} object if successful. + * + * @param {String} tunnel + * The UUID of the tunnel associated with the Guacamole connection + * whose underlying protocol is being retrieved. + * + * @returns {Promise.} + * A promise which will resolve with a @link{Protocol} object upon + * success. + */ + service.getProtocol = function getProtocol(tunnel) { + + return authenticationService.request({ + method : 'GET', + url : 'api/session/tunnels/' + encodeURIComponent(tunnel) + + '/protocol' + }); + + }; + + /** + * Retrieves the set of sharing profiles that the current user can use to + * share the active connection of the given tunnel. + * + * @param {String} tunnel + * The UUID of the tunnel associated with the Guacamole connection + * whose sharing profiles are being retrieved. + * + * @returns {Promise.>} + * A promise which will resolve with a map of @link{SharingProfile} + * objects where each key is the identifier of the corresponding + * sharing profile. + */ + service.getSharingProfiles = function getSharingProfiles(tunnel) { + + // Retrieve all associated sharing profiles + return authenticationService.request({ + method : 'GET', + url : 'api/session/tunnels/' + encodeURIComponent(tunnel) + + '/activeConnection/connection/sharingProfiles' + }); + + }; + + /** + * Makes a request to the REST API to generate credentials which have + * access strictly to the active connection associated with the given + * tunnel, using the restrictions defined by the given sharing profile, + * returning a promise that provides the resulting @link{UserCredentials} + * object if successful. + * + * @param {String} tunnel + * The UUID of the tunnel associated with the Guacamole connection + * being shared. + * + * @param {String} sharingProfile + * The identifier of the connection object dictating the + * semantics/restrictions which apply to the shared session. + * + * @returns {Promise.} + * A promise which will resolve with a @link{UserCredentials} object + * upon success. + */ + service.getSharingCredentials = function getSharingCredentials(tunnel, sharingProfile) { + + // Generate sharing credentials + return authenticationService.request({ + method : 'GET', + url : 'api/session/tunnels/' + encodeURIComponent(tunnel) + + '/activeConnection/sharingCredentials/' + + encodeURIComponent(sharingProfile) + }); + + }; + + /** + * Sanitize a filename, replacing all URL path seperators with safe + * characters. + * + * @param {String} filename + * An unsanitized filename that may need cleanup. + * + * @returns {String} + * The sanitized filename. + */ + var sanitizeFilename = function sanitizeFilename(filename) { + return filename.replace(/[\\\/]+/g, '_'); + }; + + /** + * Makes a request to the REST API to retrieve the contents of a stream + * which has been created within the active Guacamole connection associated + * with the given tunnel. The contents of the stream will automatically be + * downloaded by the browser. + * + * WARNING: Like Guacamole's various reader implementations, this function + * relies on assigning an "onend" handler to the stream object for the sake + * of cleaning up resources after the stream closes. If the "onend" handler + * is overwritten after this function returns, resources may not be + * properly cleaned up. + * + * @param {String} tunnel + * The UUID of the tunnel associated with the Guacamole connection + * whose stream should be downloaded as a file. + * + * @param {Guacamole.InputStream} stream + * The stream whose contents should be downloaded. + * + * @param {String} mimetype + * The mimetype of the stream being downloaded. This is currently + * ignored, with the download forced by using + * "application/octet-stream". + * + * @param {String} filename + * The filename that should be given to the downloaded file. + */ + service.downloadStream = function downloadStream(tunnel, stream, mimetype, filename) { + + // Work-around for IE missing window.location.origin + if (!$window.location.origin) + var streamOrigin = $window.location.protocol + '//' + $window.location.hostname + ($window.location.port ? (':' + $window.location.port) : ''); + else + var streamOrigin = $window.location.origin; + + // Build download URL + var url = streamOrigin + + $window.location.pathname + + 'api/session/tunnels/' + encodeURIComponent(tunnel) + + '/streams/' + encodeURIComponent(stream.index) + + '/' + encodeURIComponent(sanitizeFilename(filename)) + + '?token=' + encodeURIComponent(authenticationService.getCurrentToken()); + + // Create temporary hidden iframe to facilitate download + var iframe = document.createElement('iframe'); + iframe.style.position = 'fixed'; + iframe.style.border = 'none'; + iframe.style.width = '1px'; + iframe.style.height = '1px'; + iframe.style.left = '-1px'; + iframe.style.top = '-1px'; + + // The iframe MUST be part of the DOM for the download to occur + document.body.appendChild(iframe); + + // Automatically remove iframe from DOM when download completes, if + // browser supports tracking of iframe downloads via the "load" event + iframe.onload = function downloadComplete() { + document.body.removeChild(iframe); + }; + + // Acknowledge (and ignore) any received blobs + stream.onblob = function acknowledgeData() { + stream.sendAck('OK', Guacamole.Status.Code.SUCCESS); + }; + + // Automatically remove iframe from DOM a few seconds after the stream + // ends, in the browser does NOT fire the "load" event for downloads + stream.onend = function downloadComplete() { + $window.setTimeout(function cleanupIframe() { + if (iframe.parentElement) { + document.body.removeChild(iframe); + } + }, DOWNLOAD_CLEANUP_WAIT); + }; + + // Begin download + iframe.src = url; + + }; + + /** + * Makes a request to the REST API to send the contents of the given file + * along a stream which has been created within the active Guacamole + * connection associated with the given tunnel. The contents of the file + * will automatically be split into individual "blob" instructions, as if + * sent by the connected Guacamole client. + * + * @param {String} tunnel + * The UUID of the tunnel associated with the Guacamole connection + * whose stream should receive the given file. + * + * @param {Guacamole.OutputStream} stream + * The stream that should receive the given file. + * + * @param {File} file + * The file that should be sent along the given stream. + * + * @param {Function} [progressCallback] + * An optional callback which, if provided, will be invoked as the + * file upload progresses. The current position within the file, in + * bytes, will be provided to the callback as the sole argument. + * + * @return {Promise} + * A promise which resolves when the upload has completed, and is + * rejected with an Error if the upload fails. The Guacamole protocol + * status code describing the failure will be included in the Error if + * available. If the status code is available, the type of the Error + * will be STREAM_ERROR. + */ + service.uploadToStream = function uploadToStream(tunnel, stream, file, + progressCallback) { + + var deferred = $q.defer(); + + // Work-around for IE missing window.location.origin + if (!$window.location.origin) + var streamOrigin = $window.location.protocol + '//' + $window.location.hostname + ($window.location.port ? (':' + $window.location.port) : ''); + else + var streamOrigin = $window.location.origin; + + // Build upload URL + var url = streamOrigin + + $window.location.pathname + + 'api/session/tunnels/' + encodeURIComponent(tunnel) + + '/streams/' + encodeURIComponent(stream.index) + + '/' + encodeURIComponent(sanitizeFilename(file.name)) + + '?token=' + encodeURIComponent(authenticationService.getCurrentToken()); + + /** + * Creates a chunk of the inputted file to be uploaded. + * + * @param {Number} offset + * The byte at which to begin the chunk. + * + * @return {File} + * The file chunk created by this function. + */ + const createChunk = (offset) => { + var chunkEnd = Math.min(offset + CHUNK_SIZE, file.size); + const chunk = file.slice(offset, chunkEnd); + return chunk; + }; + + /** + * POSTs the inputted chunks and recursively calls uploadHandler() + * until the upload is complete. + * + * @param {File} chunk + * The chunk to be uploaded to the stream. + * + * @param {Number} offset + * The byte at which the inputted chunk begins. + */ + const uploadChunk = (chunk, offset) => { + var xhr = new XMLHttpRequest(); + xhr.open('POST', url, true); + + // Invoke provided callback if upload tracking is supported. + if (progressCallback && xhr.upload) { + xhr.upload.addEventListener('progress', function updateProgress(e) { + progressCallback(e.loaded + offset); + }); + }; + + // Continue to next chunk, resolve, or reject promise as appropriate + // once upload has stopped + xhr.onreadystatechange = function uploadStatusChanged() { + + // Ignore state changes prior to completion. + if (xhr.readyState !== 4) + return; + + // Resolve if last chunk or begin next chunk if HTTP status + // code indicates success. + if (xhr.status >= 200 && xhr.status < 300) { + offset += CHUNK_SIZE; + + if (offset < file.size) + uploadHandler(offset); + else + deferred.resolve(); + } + + // Parse and reject with resulting JSON error + else if (xhr.getResponseHeader('Content-Type') === 'application/json') + deferred.reject(new Error(angular.fromJson(xhr.responseText))); + + // Warn of lack of permission of a proxy rejects the upload + else if (xhr.status >= 400 && xhr.status < 500) + deferred.reject(new Error({ + 'type': Error.Type.STREAM_ERROR, + 'statusCode': Guacamole.Status.Code.CLIENT_FORBIDDEN, + 'message': 'HTTP ' + xhr.status + })); + + // Assume internal error for all other cases + else + deferred.reject(new Error({ + 'type': Error.Type.STREAM_ERROR, + 'statusCode': Guacamole.Status.Code.INTERNAL_ERROR, + 'message': 'HTTP ' + xhr.status + })); + + }; + + // Perform upload + xhr.send(chunk); + + }; + + /** + * Handles the recursive upload process. Each time it is called, a + * chunk is made with createChunk(), starting at the offset parameter. + * The chunk is then sent by uploadChunk(), which recursively calls + * this handler until the upload process is either completed and the + * promise is resolved, or fails and the promise is rejected. + * + * @param {Number} offset + * The byte at which to begin the chunk. + */ + const uploadHandler = (offset) => { + uploadChunk(createChunk(offset), offset); + }; + + uploadHandler(0); + + return deferred.promise; + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/userGroupService.js b/guacamole/src/main/frontend/src/app/rest/services/userGroupService.js new file mode 100644 index 0000000..1476218 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/userGroupService.js @@ -0,0 +1,232 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on user groups via the REST API. + */ +angular.module('rest').factory('userGroupService', ['$injector', + function userGroupService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + var service = {}; + + /** + * Makes a request to the REST API to get the list of user groups, + * returning a promise that provides an array of @link{UserGroup} objects if + * successful. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user groups + * to be retrieved. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {String[]} [permissionTypes] + * The set of permissions to filter with. A user group must have one or + * more of these permissions for a user group to appear in the result. + * If null, no filtering will be performed. Valid values are listed + * within PermissionSet.ObjectType. + * + * @returns {Promise.>} + * A promise which will resolve with a map of @link{UserGroup} objects + * where each key is the identifier of the corresponding user group. + */ + service.getUserGroups = function getUserGroups(dataSource, permissionTypes) { + + // Add permission filter if specified + var httpParameters = {}; + if (permissionTypes) + httpParameters.permission = permissionTypes; + + // Retrieve user groups + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups', + params : httpParameters + }); + + }; + + /** + * Makes a request to the REST API to get the user group having the given + * identifier, returning a promise that provides the corresponding + * @link{UserGroup} if successful. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group to + * be retrieved. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {String} identifier + * The identifier of the user group to retrieve. + * + * @returns {Promise.} + * A promise which will resolve with a @link{UserGroup} upon success. + */ + service.getUserGroup = function getUserGroup(dataSource, identifier) { + + // Retrieve user group + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(identifier) + }); + + }; + + /** + * Makes a request to the REST API to delete a user group, returning a + * promise that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group to + * be deleted. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {UserGroup} userGroup + * The user group to delete. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * delete operation is successful. + */ + service.deleteUserGroup = function deleteUserGroup(dataSource, userGroup) { + + // Delete user group + return authenticationService.request({ + method : 'DELETE', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(userGroup.identifier) + }) + + // Clear the cache + .then(function userGroupDeleted(){ + cacheService.users.removeAll(); + }); + + + }; + + /** + * Makes a request to the REST API to create a user group, returning a promise + * that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source in which the user group + * should be created. This identifier corresponds to an + * AuthenticationProvider within the Guacamole web application. + * + * @param {UserGroup} userGroup + * The user group to create. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * create operation is successful. + */ + service.createUserGroup = function createUserGroup(dataSource, userGroup) { + + // Create user group + return authenticationService.request({ + method : 'POST', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups', + data : userGroup + }) + + // Clear the cache + .then(function userGroupCreated(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to save a user group, returning a + * promise that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user group to + * be updated. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {UserGroup} userGroup + * The user group to update. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * save operation is successful. + */ + service.saveUserGroup = function saveUserGroup(dataSource, userGroup) { + + // Update user group + return authenticationService.request({ + method : 'PUT', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups/' + encodeURIComponent(userGroup.identifier), + data : userGroup + }) + + // Clear the cache + .then(function userGroupUpdated(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to apply a supplied list of user group + * patches, returning a promise that can be used for processing the results + * of the call. + * + * This operation is atomic - if any errors are encountered during the + * connection patching process, the entire request will fail, and no + * changes will be persisted. + * + * @param {String} dataSource + * The identifier of the data source associated with the user groups to + * be patched. + * + * @param {DirectoryPatch.[]} patches + * An array of patches to apply. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchUserGroups = function patchUserGroups(dataSource, patches) { + + // Make the PATCH request + return authenticationService.request({ + method : 'PATCH', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/userGroups', + data : patches + }) + + // Clear the cache + .then(function userGroupsPatched(patchResponse){ + cacheService.users.removeAll(); + return patchResponse; + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/services/userService.js b/guacamole/src/main/frontend/src/app/rest/services/userService.js new file mode 100644 index 0000000..c1d3c35 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/services/userService.js @@ -0,0 +1,278 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for operating on users via the REST API. + */ +angular.module('rest').factory('userService', ['$injector', + function userService($injector) { + + // Required services + var requestService = $injector.get('requestService'); + var authenticationService = $injector.get('authenticationService'); + var cacheService = $injector.get('cacheService'); + + // Get required types + var UserPasswordUpdate = $injector.get("UserPasswordUpdate"); + + var service = {}; + + /** + * Makes a request to the REST API to get the list of users, + * returning a promise that provides an array of @link{User} objects if + * successful. + * + * @param {String} dataSource + * The unique identifier of the data source containing the users to be + * retrieved. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {String[]} [permissionTypes] + * The set of permissions to filter with. A user must have one or more + * of these permissions for a user to appear in the result. + * If null, no filtering will be performed. Valid values are listed + * within PermissionSet.ObjectType. + * + * @returns {Promise.>} + * A promise which will resolve with a map of @link{User} objects + * where each key is the identifier (username) of the corresponding + * user. + */ + service.getUsers = function getUsers(dataSource, permissionTypes) { + + // Add permission filter if specified + var httpParameters = {}; + if (permissionTypes) + httpParameters.permission = permissionTypes; + + // Retrieve users + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users', + params : httpParameters + }); + + }; + + /** + * Makes a request to the REST API to get the user having the given + * username, returning a promise that provides the corresponding + * @link{User} if successful. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user to be + * retrieved. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {String} username + * The username of the user to retrieve. + * + * @returns {Promise.} + * A promise which will resolve with a @link{User} upon success. + */ + service.getUser = function getUser(dataSource, username) { + + // Retrieve user + return authenticationService.request({ + cache : cacheService.users, + method : 'GET', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users/' + encodeURIComponent(username) + }); + + }; + + /** + * Makes a request to the REST API to delete a user, returning a promise + * that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user to be + * deleted. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {User} user + * The user to delete. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * delete operation is successful. + */ + service.deleteUser = function deleteUser(dataSource, user) { + + // Delete user + return authenticationService.request({ + method : 'DELETE', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users/' + encodeURIComponent(user.username) + }) + + // Clear the cache + .then(function userDeleted(){ + cacheService.users.removeAll(); + }); + + + }; + + /** + * Makes a request to the REST API to create a user, returning a promise + * that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source in which the user should be + * created. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {User} user + * The user to create. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * create operation is successful. + */ + service.createUser = function createUser(dataSource, user) { + + // Create user + return authenticationService.request({ + method : 'POST', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users', + data : user + }) + + // Clear the cache + .then(function userCreated(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to save a user, returning a promise that + * can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user to be + * updated. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {User} user + * The user to update. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * save operation is successful. + */ + service.saveUser = function saveUser(dataSource, user) { + + // Update user + return authenticationService.request({ + method : 'PUT', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users/' + encodeURIComponent(user.username), + data : user + }) + + // Clear the cache + .then(function userUpdated(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to update the password for a user, + * returning a promise that can be used for processing the results of the call. + * + * @param {String} dataSource + * The unique identifier of the data source containing the user to be + * updated. This identifier corresponds to an AuthenticationProvider + * within the Guacamole web application. + * + * @param {String} username + * The username of the user to update. + * + * @param {String} oldPassword + * The exiting password of the user to update. + * + * @param {String} newPassword + * The new password of the user to update. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * password update operation is successful. + */ + service.updateUserPassword = function updateUserPassword(dataSource, username, + oldPassword, newPassword) { + + // Update user password + return authenticationService.request({ + method : 'PUT', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users/' + encodeURIComponent(username) + '/password', + data : new UserPasswordUpdate({ + oldPassword : oldPassword, + newPassword : newPassword + }) + }) + + // Clear the cache + .then(function passwordChanged(){ + cacheService.users.removeAll(); + }); + + }; + + /** + * Makes a request to the REST API to apply a supplied list of user patches, + * returning a promise that can be used for processing the results of the + * call. + * + * This operation is atomic - if any errors are encountered during the + * connection patching process, the entire request will fail, and no + * changes will be persisted. + * + * @param {String} dataSource + * The identifier of the data source associated with the users to be + * patched. + * + * @param {DirectoryPatch.[]} patches + * An array of patches to apply. + * + * @returns {Promise} + * A promise for the HTTP call which will succeed if and only if the + * patch operation is successful. + */ + service.patchUsers = function patchUsers(dataSource, patches) { + + // Make the PATCH request + return authenticationService.request({ + method : 'PATCH', + url : 'api/session/data/' + encodeURIComponent(dataSource) + '/users', + data : patches + }) + + // Clear the cache + .then(function usersPatched(patchResponse){ + cacheService.users.removeAll(); + return patchResponse; + }); + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/ActiveConnection.js b/guacamole/src/main/frontend/src/app/rest/types/ActiveConnection.js new file mode 100644 index 0000000..dc0b140 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/ActiveConnection.js @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ActiveConnection class. + */ +angular.module('rest').factory('ActiveConnection', [function defineActiveConnection() { + + /** + * The object returned by REST API calls when representing the data + * associated with an active connection. Each active connection is + * effectively a pairing of a connection and the user currently using it, + * along with other information. + * + * @constructor + * @param {ActiveConnection|Object} [template={}] + * The object whose properties should be copied within the new + * ActiveConnection. + */ + var ActiveConnection = function ActiveConnection(template) { + + // Use empty object by default + template = template || {}; + + /** + * The identifier which uniquely identifies this specific active + * connection. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * The identifier of the connection associated with this active + * connection. + * + * @type String + */ + this.connectionIdentifier = template.connectionIdentifier; + + /** + * The time that the connection began, in seconds since + * 1970-01-01 00:00:00 UTC, if known. + * + * @type Number + */ + this.startDate = template.startDate; + + /** + * The remote host that initiated the connection, if known. + * + * @type String + */ + this.remoteHost = template.remoteHost; + + /** + * The username of the user associated with the connection, if known. + * + * @type String + */ + this.username = template.username; + + /** + * Whether this active connection may be connected to, just as a + * normal connection. + * + * @type Boolean + */ + this.connectable = template.connectable; + + }; + + return ActiveConnection; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/ActivityLog.js b/guacamole/src/main/frontend/src/app/rest/types/ActivityLog.js new file mode 100644 index 0000000..f74e53e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/ActivityLog.js @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ActivityLog class. + */ +angular.module('rest').factory('ActivityLog', [function defineActivityLog() { + + /** + * The object returned by REST API calls when representing a log or + * recording associated with a connection's usage history, such as a + * session recording or typescript. + * + * @constructor + * @param {ActivityLog|Object} [template={}] + * The object whose properties should be copied within the new + * ActivityLog. + */ + var ActivityLog = function ActivityLog(template) { + + // Use empty object by default + template = template || {}; + + /** + * The type of this ActivityLog. + * + * @type {string} + */ + this.type = template.type; + + /** + * A human-readable description of this log. + * + * @type {TranslatableMessage} + */ + this.description = template.description; + + }; + + /** + * All possible types of ActivityLog. + * + * @type {!object.} + */ + ActivityLog.Type = { + + /** + * A Guacamole session recording in the form of a Guacamole protocol + * dump. + */ + GUACAMOLE_SESSION_RECORDING : 'GUACAMOLE_SESSION_RECORDING', + + /** + * A text log from a server-side process, such as the Guacamole web + * application or guacd. + */ + SERVER_LOG : 'SERVER_LOG', + + /** + * A text session recording in the form of a standard typescript. + */ + TYPESCRIPT : 'TYPESCRIPT', + + /** + * The timing file related to a typescript. + */ + TYPESCRIPT_TIMING : 'TYPESCRIPT_TIMING' + + }; + + return ActivityLog; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/Connection.js b/guacamole/src/main/frontend/src/app/rest/types/Connection.js new file mode 100644 index 0000000..89da4e1 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/Connection.js @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the Connection class. + */ +angular.module('rest').factory('Connection', [function defineConnection() { + + /** + * The object returned by REST API calls when representing the data + * associated with a connection. + * + * @constructor + * @param {Connection|Object} [template={}] + * The object whose properties should be copied within the new + * Connection. + */ + var Connection = function Connection(template) { + + // Use empty object by default + template = template || {}; + + /** + * The unique identifier associated with this connection. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * The unique identifier of the connection group that contains this + * connection. + * + * @type String + */ + this.parentIdentifier = template.parentIdentifier; + + /** + * The human-readable name of this connection, which is not necessarily + * unique. + * + * @type String + */ + this.name = template.name; + + /** + * The name of the protocol associated with this connection, such as + * "vnc" or "rdp". + * + * @type String + */ + this.protocol = template.protocol; + + /** + * Connection configuration parameters, as dictated by the protocol in + * use, arranged as name/value pairs. This information may not be + * available until directly queried. If this information is + * unavailable, this property will be null or undefined. + * + * @type Object. + */ + this.parameters = template.parameters; + + /** + * Arbitrary name/value pairs which further describe this connection. + * The semantics and validity of these attributes are dictated by the + * extension which defines them. + * + * @type Object. + */ + this.attributes = template.attributes || {}; + + /** + * The count of currently active connections using this connection. + * This field will be returned from the REST API during a get + * operation, but manually setting this field will have no effect. + * + * @type Number + */ + this.activeConnections = template.activeConnections; + + /** + * An array of all associated sharing profiles, if known. This property + * may be null or undefined if sharing profiles have not been queried, + * and thus the sharing profiles are unknown. + * + * @type SharingProfile[] + */ + this.sharingProfiles = template.sharingProfiles; + + /** + * The time that this connection was last used, in milliseconds since + * 1970-01-01 00:00:00 UTC. If this information is unknown or + * unavailable, this will be null. + * + * @type Number + */ + this.lastActive = template.lastActive; + + }; + + return Connection; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/ConnectionGroup.js b/guacamole/src/main/frontend/src/app/rest/types/ConnectionGroup.js new file mode 100644 index 0000000..6da754c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/ConnectionGroup.js @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ConnectionGroup class. + */ +angular.module('rest').factory('ConnectionGroup', [function defineConnectionGroup() { + + /** + * The object returned by REST API calls when representing the data + * associated with a connection group. + * + * @constructor + * @param {ConnectionGroup|Object} [template={}] + * The object whose properties should be copied within the new + * ConnectionGroup. + */ + var ConnectionGroup = function ConnectionGroup(template) { + + // Use empty object by default + template = template || {}; + + /** + * The unique identifier associated with this connection group. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * The unique identifier of the connection group that contains this + * connection group. + * + * @type String + * @default ConnectionGroup.ROOT_IDENTIFIER + */ + this.parentIdentifier = template.parentIdentifier || ConnectionGroup.ROOT_IDENTIFIER; + + /** + * The human-readable name of this connection group, which is not + * necessarily unique. + * + * @type String + */ + this.name = template.name; + + /** + * The type of this connection group, which may be either + * ConnectionGroup.Type.ORGANIZATIONAL or + * ConnectionGroup.Type.BALANCING. + * + * @type String + * @default ConnectionGroup.Type.ORGANIZATIONAL + */ + this.type = template.type || ConnectionGroup.Type.ORGANIZATIONAL; + + /** + * An array of all child connections, if known. This property may be + * null or undefined if children have not been queried, and thus the + * child connections are unknown. + * + * @type Connection[] + */ + this.childConnections = template.childConnections; + + /** + * An array of all child connection groups, if known. This property may + * be null or undefined if children have not been queried, and thus the + * child connection groups are unknown. + * + * @type ConnectionGroup[] + */ + this.childConnectionGroups = template.childConnectionGroups; + + /** + * Arbitrary name/value pairs which further describe this connection + * group. The semantics and validity of these attributes are dictated + * by the extension which defines them. + * + * @type Object. + */ + this.attributes = template.attributes || {}; + + /** + * The count of currently active connections using this connection + * group. This field will be returned from the REST API during a get + * operation, but manually setting this field will have no effect. + * + * @type Number + */ + this.activeConnections = template.activeConnections; + + }; + + /** + * The reserved identifier which always represents the root connection + * group. + * + * @type String + */ + ConnectionGroup.ROOT_IDENTIFIER = "ROOT"; + + /** + * All valid connection group types. + */ + ConnectionGroup.Type = { + + /** + * The type string associated with balancing connection groups. + * + * @type String + */ + BALANCING : "BALANCING", + + /** + * The type string associated with organizational connection groups. + * + * @type String + */ + ORGANIZATIONAL : "ORGANIZATIONAL" + + }; + + return ConnectionGroup; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/ConnectionHistoryEntry.js b/guacamole/src/main/frontend/src/app/rest/types/ConnectionHistoryEntry.js new file mode 100644 index 0000000..e035efc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/ConnectionHistoryEntry.js @@ -0,0 +1,230 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the ConnectionHistoryEntry class. + */ +angular.module('rest').factory('ConnectionHistoryEntry', [function defineConnectionHistoryEntry() { + + /** + * The object returned by REST API calls when representing the data + * associated with an entry in a connection's usage history. Each history + * entry represents the time at which a particular started using a + * connection and, if applicable, the time that usage stopped. + * + * @constructor + * @param {ConnectionHistoryEntry|Object} [template={}] + * The object whose properties should be copied within the new + * ConnectionHistoryEntry. + */ + var ConnectionHistoryEntry = function ConnectionHistoryEntry(template) { + + // Use empty object by default + template = template || {}; + + /** + * An arbitrary identifier that uniquely identifies this record + * relative to other records in the same set, or null if no such unique + * identifier exists. + * + * @type {string} + */ + this.identifier = template.identifier; + + /** + * A UUID that uniquely identifies this record, or null if no such + * unique identifier exists. + * + * @type {string} + */ + this.uuid = template.uuid; + + /** + * The identifier of the connection associated with this history entry. + * + * @type String + */ + this.connectionIdentifier = template.connectionIdentifier; + + /** + * The name of the connection associated with this history entry. + * + * @type String + */ + this.connectionName = template.connectionName; + + /** + * The remote host associated with this history entry. + * + * @type String + */ + this.remoteHost = template.remoteHost; + + /** + * The time that usage began, in seconds since 1970-01-01 00:00:00 UTC. + * + * @type Number + */ + this.startDate = template.startDate; + + /** + * The time that usage ended, in seconds since 1970-01-01 00:00:00 UTC. + * The absence of an endDate does NOT necessarily indicate that the + * connection is still in use, particularly if the server was shutdown + * or restarted before the history entry could be updated. To determine + * whether a connection is still active, check the active property of + * this history entry. + * + * @type Number + */ + this.endDate = template.endDate; + + /** + * The remote host that initiated this connection, if known. + * + * @type String + */ + this.remoteHost = template.remoteHost; + + /** + * The username of the user associated with this particular usage of + * the connection. + * + * @type String + */ + this.username = template.username; + + /** + * Whether this usage of the connection is still active. Note that this + * is the only accurate way to check for connection activity; the + * absence of endDate does not necessarily imply the connection is + * active, as the history entry may simply be incomplete. + * + * @type Boolean + */ + this.active = template.active; + + /** + * Arbitrary name/value pairs which further describe this history + * entry. The semantics and validity of these attributes are dictated + * by the extension which defines them. + * + * @type {!object.} + */ + this.attributes = template.attributes; + + /** + * All logs associated and accessible via this record, stored by their + * corresponding unique names. + * + * @type {!object.} + */ + this.logs = template.logs; + + }; + + /** + * All possible predicates for sorting ConnectionHistoryEntry objects using + * the REST API. By default, each predicate indicates ascending order. To + * indicate descending order, add "-" to the beginning of the predicate. + * + * @type Object. + */ + ConnectionHistoryEntry.SortPredicate = { + + /** + * The date and time that the connection associated with the history + * entry began (connected). + */ + START_DATE : 'startDate' + + }; + + /** + * Value/unit pair representing the length of time that a connection was + * used. + * + * @constructor + * @param {Number} milliseconds + * The number of milliseconds that the associated connection was used. + */ + ConnectionHistoryEntry.Duration = function Duration(milliseconds) { + + /** + * The provided duration in seconds. + * + * @type Number + */ + var seconds = milliseconds / 1000; + + /** + * Rounds the given value to the nearest tenth. + * + * @param {Number} value The value to round. + * @returns {Number} The given value, rounded to the nearest tenth. + */ + var round = function round(value) { + return Math.round(value * 10) / 10; + }; + + // Days + if (seconds >= 86400) { + this.value = round(seconds / 86400); + this.unit = 'day'; + } + + // Hours + else if (seconds >= 3600) { + this.value = round(seconds / 3600); + this.unit = 'hour'; + } + + // Minutes + else if (seconds >= 60) { + this.value = round(seconds / 60); + this.unit = 'minute'; + } + + // Seconds + else { + + /** + * The number of seconds (or minutes, or hours, etc.) that the + * connection was used. The units associated with this value are + * represented by the unit property. + * + * @type Number + */ + this.value = round(seconds); + + /** + * The units associated with the value of this duration. Valid + * units are 'second', 'minute', 'hour', and 'day'. + * + * @type String + */ + this.unit = 'second'; + + } + + }; + + return ConnectionHistoryEntry; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatch.js b/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatch.js new file mode 100644 index 0000000..664dcdc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatch.js @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the DirectoryPatch class. + */ +angular.module('rest').factory('DirectoryPatch', [function defineDirectoryPatch() { + + /** + * The object consumed by REST API calls when representing changes to an + * arbitrary set of directory-based objects. + * @constructor + * + * @template DirectoryObject + * The directory-based object type that this DirectoryPatch will + * operate on. + * + * @param {DirectoryObject|Object} [template={}] + * The object whose properties should be copied within the new + * DirectoryPatch. + */ + var DirectoryPatch = function DirectoryPatch(template) { + + // Use empty object by default + template = template || {}; + + /** + * The operation to apply to the objects indicated by the path. Valid + * operation values are defined within DirectoryPatch.Operation. + * + * @type {String} + */ + this.op = template.op; + + /** + * The path of the objects to modify. For creation of new objects, this + * should be "/". Otherwise, it should be "/{identifier}", specifying + * the identifier of the existing object being modified. + * + * @type {String} + * @default '/' + */ + this.path = template.path || '/'; + + /** + * The object being added/replaced, or undefined if deleting. + * + * @type {DirectoryObject} + */ + this.value = template.value; + + }; + + /** + * All valid patch operations for directory-based objects. + */ + DirectoryPatch.Operation = { + + /** + * Adds the specified object to the relation. + */ + ADD : 'add', + + /** + * Replaces (updates) the specified object from the relation. + */ + REPLACE : 'replace', + + /** + * Removes the specified object from the relation. + */ + REMOVE : 'remove' + + }; + + return DirectoryPatch; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatchOutcome.js b/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatchOutcome.js new file mode 100644 index 0000000..324f1ae --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatchOutcome.js @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the DirectoryPatchOutcome class. + */ +angular.module('rest').factory('DirectoryPatchOutcome', [ + function defineDirectoryPatchOutcome() { + + /** + * An object returned by a PATCH request to a directory REST API, + * representing the outcome associated with a particular patch in the + * request. This object can indicate either a successful or unsuccessful + * response. The error field is only meaningful for unsuccessful patches. + * @constructor + * + * @param {DirectoryPatchOutcome|Object} [template={}] + * The object whose properties should be copied within the new + * DirectoryPatchOutcome. + */ + const DirectoryPatchOutcome = function DirectoryPatchOutcome(template) { + + // Use empty object by default + template = template || {}; + + /** + * The operation to apply to the objects indicated by the path. Valid + * operation values are defined within DirectoryPatch.Operation. + * + * @type {String} + */ + this.op = template.op; + + /** + * The path of the object operated on by the corresponding patch in the + * request. + * + * @type {String} + */ + this.path = template.path; + + /** + * The identifier of the object operated on by the corresponding patch + * in the request. If the object was newly created and the PATCH request + * did not fail, this will be the identifier of the newly created object. + * + * @type {String} + */ + this.identifier = template.identifier; + + /** + * The error message associated with the failure, if the patch failed to + * apply. + * + * @type {TranslatableMessage} + */ + this.error = template.error; + + }; + + return DirectoryPatchOutcome; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatchResponse.js b/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatchResponse.js new file mode 100644 index 0000000..9538c07 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/DirectoryPatchResponse.js @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the DirectoryPatchResponse class. + */ +angular.module('rest').factory('DirectoryPatchResponse', [ + function defineDirectoryPatchResponse() { + + /** + * An object returned by a PATCH request to a directory REST API, + * representing the successful response to a patch request. + * + * @param {DirectoryPatchResponse|Object} [template={}] + * The object whose properties should be copied within the new + * DirectoryPatchResponse. + */ + const DirectoryPatchResponse = function DirectoryPatchResponse(template) { + + // Use empty object by default + template = template || {}; + + /** + * An outcome for each patch in the corresponding patch request. + * + * @type {DirectoryPatchOutcome[]} + */ + this.patches = template.patches; + + }; + + return DirectoryPatchResponse; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/Error.js b/guacamole/src/main/frontend/src/app/rest/types/Error.js new file mode 100644 index 0000000..74b28eb --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/Error.js @@ -0,0 +1,154 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the Error class. + */ +angular.module('rest').factory('Error', [function defineError() { + + /** + * The object returned by REST API calls when an error occurs. + * + * @constructor + * @param {Error|Object} [template={}] + * The object whose properties should be copied within the new + * Error. + */ + var Error = function Error(template) { + + // Use empty object by default + template = template || {}; + + /** + * A human-readable message describing the error that occurred. + * + * @type String + */ + this.message = template.message; + + /** + * A message which can be translated using the translation service, + * consisting of a translation key and optional set of substitution + * variables. + * + * @type TranslatableMessage + */ + this.translatableMessage = template.translatableMessage; + + /** + * The Guacamole protocol status code associated with the error that + * occurred. This is only valid for errors of type STREAM_ERROR. + * + * @type Number + */ + this.statusCode = template.statusCode; + + /** + * The type string defining which values this parameter may contain, + * as well as what properties are applicable. Valid types are listed + * within Error.Type. + * + * @type String + * @default Error.Type.INTERNAL_ERROR + */ + this.type = template.type || Error.Type.INTERNAL_ERROR; + + /** + * Any parameters which were expected in the original request, or are + * now expected as a result of the original request, if any. If no + * such information is available, this will be null. + * + * @type Field[] + */ + this.expected = template.expected; + + /** + * The outcome for each patch that was submitted as part of the request + * that generated this error, if the request was a directory PATCH + * request. In all other cases, this will be null. + * + * @type DirectoryPatchOutcome[] + */ + this.patches = template.patches || null; + + }; + + /** + * All valid field types. + */ + Error.Type = { + + /** + * The requested operation could not be performed because the request + * itself was malformed. + * + * @type String + */ + BAD_REQUEST : 'BAD_REQUEST', + + /** + * The credentials provided were invalid. + * + * @type String + */ + INVALID_CREDENTIALS : 'INVALID_CREDENTIALS', + + /** + * The credentials provided were not necessarily invalid, but were not + * sufficient to determine validity. + * + * @type String + */ + INSUFFICIENT_CREDENTIALS : 'INSUFFICIENT_CREDENTIALS', + + /** + * An internal server error has occurred. + * + * @type String + */ + INTERNAL_ERROR : 'INTERNAL_ERROR', + + /** + * An object related to the request does not exist. + * + * @type String + */ + NOT_FOUND : 'NOT_FOUND', + + /** + * Permission was denied to perform the requested operation. + * + * @type String + */ + PERMISSION_DENIED : 'PERMISSION_DENIED', + + /** + * An error occurred within an intercepted stream, terminating that + * stream. The Guacamole protocol status code of that error will be + * stored within statusCode. + * + * @type String + */ + STREAM_ERROR : 'STREAM_ERROR' + + }; + + return Error; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/Field.js b/guacamole/src/main/frontend/src/app/rest/types/Field.js new file mode 100644 index 0000000..195db82 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/Field.js @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the Field class. + */ +angular.module('rest').factory('Field', [function defineField() { + + /** + * The object returned by REST API calls when representing the data + * associated with a field or configuration parameter. + * + * @constructor + * @param {Field|Object} [template={}] + * The object whose properties should be copied within the new + * Field. + */ + var Field = function Field(template) { + + // Use empty object by default + template = template || {}; + + /** + * The name which uniquely identifies this parameter. + * + * @type String + */ + this.name = template.name; + + /** + * The type string defining which values this parameter may contain, + * as well as what properties are applicable. Valid types are listed + * within Field.Type. + * + * @type String + * @default Field.Type.TEXT + */ + this.type = template.type || Field.Type.TEXT; + + /** + * All possible legal values for this parameter. + * + * @type String[] + */ + this.options = template.options; + + }; + + /** + * All valid field types. + */ + Field.Type = { + + /** + * The type string associated with parameters that may contain a single + * line of arbitrary text. + * + * @type String + */ + TEXT : 'TEXT', + + /** + * The type string associated with parameters that may contain an email + * address. + * + * @type String + */ + EMAIL : 'EMAIL', + + /** + * The type string associated with parameters that may contain an + * arbitrary string, where that string represents the username of the + * user authenticating with the remote desktop service. + * + * @type String + */ + USERNAME : 'USERNAME', + + /** + * The type string associated with parameters that may contain an + * arbitrary string, where that string represents the password of the + * user authenticating with the remote desktop service. + * + * @type String + */ + PASSWORD : 'PASSWORD', + + /** + * The type string associated with parameters that may contain only + * numeric values. + * + * @type String + */ + NUMERIC : 'NUMERIC', + + /** + * The type string associated with parameters that may contain only a + * single possible value, where that value enables the parameter's + * effect. It is assumed that each BOOLEAN field will provide exactly + * one possible value (option), which will be the value if that field + * is true. + * + * @type String + */ + BOOLEAN : 'BOOLEAN', + + /** + * The type string associated with parameters that may contain a + * strictly-defined set of possible values. + * + * @type String + */ + ENUM : 'ENUM', + + /** + * The type string associated with parameters that may contain any + * number of lines of arbitrary text. + * + * @type String + */ + MULTILINE : 'MULTILINE', + + /** + * The type string associated with parameters that may contain timezone + * IDs. Valid timezone IDs are dictated by Java: + * http://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html#getAvailableIDs%28%29 + * + * @type String + */ + TIMEZONE : 'TIMEZONE', + + /** + * The type string associated with parameters that may contain dates. + * The format of the date is standardized as YYYY-MM-DD, zero-padded. + * + * @type String + */ + DATE : 'DATE', + + /** + * The type string associated with parameters that may contain times. + * The format of the time is stnadardized as HH:MM:DD, zero-padded, + * 24-hour. + * + * @type String + */ + TIME : 'TIME', + + /** + * An HTTP query parameter which is expected to be embedded in the URL + * given to a user. + * + * @type String + */ + QUERY_PARAMETER : 'QUERY_PARAMETER', + + /** + * The type string associated with parameters that may contain color + * schemes accepted by the Guacamole server terminal emulator and + * protocols which leverage it. + * + * @type String + */ + TERMINAL_COLOR_SCHEME : 'TERMINAL_COLOR_SCHEME' + + }; + + return Field; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/Form.js b/guacamole/src/main/frontend/src/app/rest/types/Form.js new file mode 100644 index 0000000..215a964 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/Form.js @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the Form class. + */ +angular.module('rest').factory('Form', [function defineForm() { + + /** + * The object returned by REST API calls when representing the data + * associated with a form or set of configuration parameters. + * + * @constructor + * @param {Form|Object} [template={}] + * The object whose properties should be copied within the new + * Form. + */ + var Form = function Form(template) { + + // Use empty object by default + template = template || {}; + + /** + * The name which uniquely identifies this form, or null if this form + * has no name. + * + * @type String + */ + this.name = template.name; + + /** + * All fields contained within this form. + * + * @type Field[] + */ + this.fields = template.fields || []; + + }; + + return Form; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/PermissionFlagSet.js b/guacamole/src/main/frontend/src/app/rest/types/PermissionFlagSet.js new file mode 100644 index 0000000..f79e3b9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/PermissionFlagSet.js @@ -0,0 +1,246 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the PermissionFlagSet class. + */ +angular.module('rest').factory('PermissionFlagSet', ['PermissionSet', + function definePermissionFlagSet(PermissionSet) { + + /** + * Alternative view of a @link{PermissionSet} which allows manipulation of + * each permission through the setting (or retrieval) of boolean property + * values. + * + * @constructor + * @param {PermissionFlagSet|Object} template + * The object whose properties should be copied within the new + * PermissionFlagSet. + */ + var PermissionFlagSet = function PermissionFlagSet(template) { + + // Use empty object by default + template = template || {}; + + /** + * The granted state of each system permission, as a map of system + * permission type string to boolean value. A particular permission is + * granted if its corresponding boolean value is set to true. Valid + * permission type strings are defined within + * PermissionSet.SystemPermissionType. Permissions which are not + * granted may be set to false, but this is not required. + * + * @type Object. + */ + this.systemPermissions = template.systemPermissions || {}; + + /** + * The granted state of each permission for each connection, as a map + * of object permission type string to permission map. The permission + * map is, in turn, a map of connection identifier to boolean value. A + * particular permission is granted if its corresponding boolean value + * is set to true. Valid permission type strings are defined within + * PermissionSet.ObjectPermissionType. Permissions which are not + * granted may be set to false, but this is not required. + * + * @type Object.> + */ + this.connectionPermissions = template.connectionPermissions || { + 'READ' : {}, + 'UPDATE' : {}, + 'DELETE' : {}, + 'ADMINISTER' : {} + }; + + /** + * The granted state of each permission for each connection group, as a + * map of object permission type string to permission map. The + * permission map is, in turn, a map of connection group identifier to + * boolean value. A particular permission is granted if its + * corresponding boolean value is set to true. Valid permission type + * strings are defined within PermissionSet.ObjectPermissionType. + * Permissions which are not granted may be set to false, but this is + * not required. + * + * @type Object.> + */ + this.connectionGroupPermissions = template.connectionGroupPermissions || { + 'READ' : {}, + 'UPDATE' : {}, + 'DELETE' : {}, + 'ADMINISTER' : {} + }; + + /** + * The granted state of each permission for each sharing profile, as a + * map of object permission type string to permission map. The + * permission map is, in turn, a map of sharing profile identifier to + * boolean value. A particular permission is granted if its + * corresponding boolean value is set to true. Valid permission type + * strings are defined within PermissionSet.ObjectPermissionType. + * Permissions which are not granted may be set to false, but this is + * not required. + * + * @type Object.> + */ + this.sharingProfilePermissions = template.sharingProfilePermissions || { + 'READ' : {}, + 'UPDATE' : {}, + 'DELETE' : {}, + 'ADMINISTER' : {} + }; + + /** + * The granted state of each permission for each active connection, as + * a map of object permission type string to permission map. The + * permission map is, in turn, a map of active connection identifier to + * boolean value. A particular permission is granted if its + * corresponding boolean value is set to true. Valid permission type + * strings are defined within PermissionSet.ObjectPermissionType. + * Permissions which are not granted may be set to false, but this is + * not required. + * + * @type Object.> + */ + this.activeConnectionPermissions = template.activeConnectionPermissions || { + 'READ' : {}, + 'UPDATE' : {}, + 'DELETE' : {}, + 'ADMINISTER' : {} + }; + + /** + * The granted state of each permission for each user, as a map of + * object permission type string to permission map. The permission map + * is, in turn, a map of username to boolean value. A particular + * permission is granted if its corresponding boolean value is set to + * true. Valid permission type strings are defined within + * PermissionSet.ObjectPermissionType. Permissions which are not + * granted may be set to false, but this is not required. + * + * @type Object.> + */ + this.userPermissions = template.userPermissions || { + 'READ' : {}, + 'UPDATE' : {}, + 'DELETE' : {}, + 'ADMINISTER' : {} + }; + + /** + * The granted state of each permission for each user group, as a map of + * object permission type string to permission map. The permission map + * is, in turn, a map of group identifier to boolean value. A particular + * permission is granted if its corresponding boolean value is set to + * true. Valid permission type strings are defined within + * PermissionSet.ObjectPermissionType. Permissions which are not + * granted may be set to false, but this is not required. + * + * @type Object.> + */ + this.userGroupPermissions = template.userGroupPermissions || { + 'READ' : {}, + 'UPDATE' : {}, + 'DELETE' : {}, + 'ADMINISTER' : {} + }; + + }; + + /** + * Iterates through all permissions in the given permission map, setting + * the corresponding permission flags in the given permission flag map. + * + * @param {Object.} permMap + * Map of object identifiers to the set of granted permissions. Each + * permission is represented by a string listed within + * PermissionSet.ObjectPermissionType. + * + * @param {Object.>} flagMap + * Map of permission type strings to identifier/flag pairs representing + * whether the permission of that type is granted for the object having + * having the associated identifier. + */ + var addObjectPermissions = function addObjectPermissions(permMap, flagMap) { + + // For each defined identifier in the permission map + for (var identifier in permMap) { + + // Pull the permission array and loop through each permission + var permissions = permMap[identifier]; + permissions.forEach(function addObjectPermission(type) { + + // Get identifier/flag mapping, creating first if necessary + var objectFlags = flagMap[type] = flagMap[type] || {}; + + // Set flag for current permission + objectFlags[identifier] = true; + + }); + + } + + }; + + /** + * Creates a new PermissionFlagSet, populating it with all the permissions + * indicated as granted within the given PermissionSet. + * + * @param {PermissionSet} permissionSet + * The PermissionSet containing the permissions to be copied into a new + * PermissionFlagSet. + * + * @returns {PermissionFlagSet} + * A new PermissionFlagSet containing flags representing all granted + * permissions from the given PermissionSet. + */ + PermissionFlagSet.fromPermissionSet = function fromPermissionSet(permissionSet) { + + var permissionFlagSet = new PermissionFlagSet(); + + // Add all granted system permissions + permissionSet.systemPermissions.forEach(function addSystemPermission(type) { + permissionFlagSet.systemPermissions[type] = true; + }); + + // Add all granted connection permissions + addObjectPermissions(permissionSet.connectionPermissions, permissionFlagSet.connectionPermissions); + + // Add all granted connection group permissions + addObjectPermissions(permissionSet.connectionGroupPermissions, permissionFlagSet.connectionGroupPermissions); + + // Add all granted sharing profile permissions + addObjectPermissions(permissionSet.sharingProfilePermissions, permissionFlagSet.sharingProfilePermissions); + + // Add all granted active connection permissions + addObjectPermissions(permissionSet.activeConnectionPermissions, permissionFlagSet.activeConnectionPermissions); + + // Add all granted user permissions + addObjectPermissions(permissionSet.userPermissions, permissionFlagSet.userPermissions); + + // Add all granted user group permissions + addObjectPermissions(permissionSet.userGroupPermissions, permissionFlagSet.userGroupPermissions); + + return permissionFlagSet; + + }; + + return PermissionFlagSet; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/PermissionPatch.js b/guacamole/src/main/frontend/src/app/rest/types/PermissionPatch.js new file mode 100644 index 0000000..dda440b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/PermissionPatch.js @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the PermissionPatch class. + */ +angular.module('rest').factory('PermissionPatch', [function definePermissionPatch() { + + /** + * The object returned by REST API calls when representing changes to the + * permissions granted to a specific user. + * + * @constructor + * @param {PermissionPatch|Object} [template={}] + * The object whose properties should be copied within the new + * PermissionPatch. + */ + var PermissionPatch = function PermissionPatch(template) { + + // Use empty object by default + template = template || {}; + + /** + * The operation to apply to the permissions indicated by the path. + * Valid operation values are defined within PermissionPatch.Operation. + * + * @type String + */ + this.op = template.op; + + /** + * The path of the permissions to modify. Depending on the type of the + * permission, this will be either "/connectionPermissions/ID", + * "/connectionGroupPermissions/ID", "/userPermissions/ID", or + * "/systemPermissions", where "ID" is the identifier of the object + * to which the permissions apply, if any. + * + * @type String + */ + this.path = template.path; + + /** + * The permissions being added or removed. If the permission applies to + * an object, such as a connection or connection group, this will be a + * value from PermissionSet.ObjectPermissionType. If the permission + * applies to the system as a whole (the path is "/systemPermissions"), + * this will be a value from PermissionSet.SystemPermissionType. + * + * @type String + */ + this.value = template.value; + + }; + + /** + * All valid patch operations for permissions. Currently, only add and + * remove are supported. + */ + PermissionPatch.Operation = { + + /** + * Adds (grants) the specified permission. + */ + ADD : "add", + + /** + * Removes (revokes) the specified permission. + */ + REMOVE : "remove" + + }; + + return PermissionPatch; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/PermissionSet.js b/guacamole/src/main/frontend/src/app/rest/types/PermissionSet.js new file mode 100644 index 0000000..2a54945 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/PermissionSet.js @@ -0,0 +1,826 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the PermissionSet class. + */ +angular.module('rest').factory('PermissionSet', [function definePermissionSet() { + + /** + * The object returned by REST API calls when representing the permissions + * granted to a specific user. + * + * @constructor + * @param {PermissionSet|Object} [template={}] + * The object whose properties should be copied within the new + * PermissionSet. + */ + var PermissionSet = function PermissionSet(template) { + + // Use empty object by default + template = template || {}; + + /** + * Map of connection identifiers to the corresponding array of granted + * permissions. Each permission is represented by a string listed + * within PermissionSet.ObjectPermissionType. + * + * @type Object. + */ + this.connectionPermissions = template.connectionPermissions || {}; + + /** + * Map of connection group identifiers to the corresponding array of + * granted permissions. Each permission is represented by a string + * listed within PermissionSet.ObjectPermissionType. + * + * @type Object. + */ + this.connectionGroupPermissions = template.connectionGroupPermissions || {}; + + /** + * Map of sharing profile identifiers to the corresponding array of + * granted permissions. Each permission is represented by a string + * listed within PermissionSet.ObjectPermissionType. + * + * @type Object. + */ + this.sharingProfilePermissions = template.sharingProfilePermissions || {}; + + /** + * Map of active connection identifiers to the corresponding array of + * granted permissions. Each permission is represented by a string + * listed within PermissionSet.ObjectPermissionType. + * + * @type Object. + */ + this.activeConnectionPermissions = template.activeConnectionPermissions || {}; + + /** + * Map of user identifiers to the corresponding array of granted + * permissions. Each permission is represented by a string listed + * within PermissionSet.ObjectPermissionType. + * + * @type Object. + */ + this.userPermissions = template.userPermissions || {}; + + /** + * Map of user group identifiers to the corresponding array of granted + * permissions. Each permission is represented by a string listed + * within PermissionSet.ObjectPermissionType. + * + * @type Object. + */ + this.userGroupPermissions = template.userGroupPermissions || {}; + + /** + * Array of granted system permissions. Each permission is represented + * by a string listed within PermissionSet.SystemPermissionType. + * + * @type String[] + */ + this.systemPermissions = template.systemPermissions || []; + + }; + + /** + * Valid object permission type strings. + */ + PermissionSet.ObjectPermissionType = { + + /** + * Permission to read from the specified object. + */ + READ : "READ", + + /** + * Permission to update the specified object. + */ + UPDATE : "UPDATE", + + /** + * Permission to delete the specified object. + */ + DELETE : "DELETE", + + /** + * Permission to administer the specified object + */ + ADMINISTER : "ADMINISTER" + + }; + + /** + * Valid system permission type strings. + */ + PermissionSet.SystemPermissionType = { + + /** + * Permission to administer the entire system. + */ + ADMINISTER : "ADMINISTER", + + /** + * Permission to view connection and user records for the entire system. + */ + AUDIT : "AUDIT", + + /** + * Permission to create new users. + */ + CREATE_USER : "CREATE_USER", + + /** + * Permission to create new user groups. + */ + CREATE_USER_GROUP : "CREATE_USER_GROUP", + + /** + * Permission to create new connections. + */ + CREATE_CONNECTION : "CREATE_CONNECTION", + + /** + * Permission to create new connection groups. + */ + CREATE_CONNECTION_GROUP : "CREATE_CONNECTION_GROUP", + + /** + * Permission to create new sharing profiles. + */ + CREATE_SHARING_PROFILE : "CREATE_SHARING_PROFILE" + + }; + + /** + * Returns whether the given permission is granted for at least one + * arbitrary object, regardless of ID. + * + * @param {Object.} permMap + * The permission map to check, where each entry maps an object + * identifer to the array of granted permissions. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + var containsPermission = function containsPermission(permMap, type) { + + // Search all identifiers for given permission + for (var identifier in permMap) { + + // If permission is granted, then no further searching is necessary + if (permMap[identifier].indexOf(type) !== -1) + return true; + + } + + // No such permission exists + return false; + + }; + + /** + * Returns whether the given permission is granted for the arbitrary + * object having the given ID. If no ID is given, this function determines + * whether the permission is granted at all for any such arbitrary object. + * + * @param {Object.} permMap + * The permission map to check, where each entry maps an object + * identifer to the array of granted permissions. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} [identifier] + * The identifier of the object to which the permission applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + var hasPermission = function hasPermission(permMap, type, identifier) { + + // No permission if no permission map at all + if (!permMap) + return false; + + // If no identifier given, search ignoring the identifier + if (!identifier) + return containsPermission(permMap, type); + + // If identifier not present at all, there are no such permissions + if (!(identifier in permMap)) + return false; + + return permMap[identifier].indexOf(type) !== -1; + + }; + + /** + * Returns whether the given permission is granted for the connection + * having the given ID. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the connection to which the permission applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasConnectionPermission = function hasConnectionPermission(permSet, type, identifier) { + return hasPermission(permSet.connectionPermissions, type, identifier); + }; + + /** + * Returns whether the given permission is granted for the connection group + * having the given ID. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the connection group to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasConnectionGroupPermission = function hasConnectionGroupPermission(permSet, type, identifier) { + return hasPermission(permSet.connectionGroupPermissions, type, identifier); + }; + + /** + * Returns whether the given permission is granted for the sharing profile + * having the given ID. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the sharing profile to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasSharingProfilePermission = function hasSharingProfilePermission(permSet, type, identifier) { + return hasPermission(permSet.sharingProfilePermissions, type, identifier); + }; + + /** + * Returns whether the given permission is granted for the active + * connection having the given ID. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the active connection to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasActiveConnectionPermission = function hasActiveConnectionPermission(permSet, type, identifier) { + return hasPermission(permSet.activeConnectionPermissions, type, identifier); + }; + + /** + * Returns whether the given permission is granted for the user having the + * given ID. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user to which the permission applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasUserPermission = function hasUserPermission(permSet, type, identifier) { + return hasPermission(permSet.userPermissions, type, identifier); + }; + + /** + * Returns whether the given permission is granted for the user group having + * the given identifier. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user group to which the permission applies. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasUserGroupPermission = function hasUserGroupPermission(permSet, type, identifier) { + return hasPermission(permSet.userGroupPermissions, type, identifier); + }; + + /** + * Returns whether the given permission is granted at the system level. + * + * @param {PermissionSet|Object} permSet + * The permission set to check. + * + * @param {String} type + * The permission to search for, as defined by + * PermissionSet.SystemPermissionType. + * + * @returns {Boolean} + * true if the permission is present (granted), false otherwise. + */ + PermissionSet.hasSystemPermission = function hasSystemPermission(permSet, type) { + if (!permSet.systemPermissions) return false; + return permSet.systemPermissions.indexOf(type) !== -1; + }; + + /** + * Adds the given system permission to the given permission set, if not + * already present. If the permission is already present, this function has + * no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.SystemPermissionType. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addSystemPermission = function addSystemPermission(permSet, type) { + + permSet.systemPermissions = permSet.systemPermissions || []; + + // Add permission, if it doesn't already exist + if (permSet.systemPermissions.indexOf(type) === -1) { + permSet.systemPermissions.push(type); + return true; + } + + // Permission already present + return false; + + }; + + /** + * Removes the given system permission from the given permission set, if + * present. If the permission is not present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.SystemPermissionType. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeSystemPermission = function removeSystemPermission(permSet, type) { + + permSet.systemPermissions = permSet.systemPermissions || []; + + // Remove permission, if it exists + var permLocation = permSet.systemPermissions.indexOf(type); + if (permLocation !== -1) { + permSet.systemPermissions.splice(permLocation, 1); + return true; + } + + // Permission not present + return false; + + }; + + /** + * Adds the given permission applying to the arbitrary object with the + * given ID to the given permission set, if not already present. If the + * permission is already present, this function has no effect. + * + * @param {Object.} permMap + * The permission map to modify, where each entry maps an object + * identifer to the array of granted permissions. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the arbitrary object to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + var addObjectPermission = function addObjectPermission(permMap, type, identifier) { + + // Pull array of permissions, creating it if necessary + var permArray = permMap[identifier] = permMap[identifier] || []; + + // Add permission, if it doesn't already exist + if (permArray.indexOf(type) === -1) { + permArray.push(type); + return true; + } + + // Permission already present + return false; + + }; + + /** + * Removes the given permission applying to the arbitrary object with the + * given ID from the given permission set, if present. If the permission is + * not present, this function has no effect. + * + * @param {Object.} permMap + * The permission map to modify, where each entry maps an object + * identifer to the array of granted permissions. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the arbitrary object to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + var removeObjectPermission = function removeObjectPermission(permMap, type, identifier) { + + // Pull array of permissions + var permArray = permMap[identifier]; + + // If no permissions present at all, nothing to remove + if (!(identifier in permMap)) + return false; + + // Remove permission, if it exists + var permLocation = permArray.indexOf(type); + if (permLocation !== -1) { + permArray.splice(permLocation, 1); + return true; + } + + // Permission not present + return false; + + }; + + /** + * Adds the given connection permission applying to the connection with + * the given ID to the given permission set, if not already present. If the + * permission is already present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the connection to which the permission applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addConnectionPermission = function addConnectionPermission(permSet, type, identifier) { + permSet.connectionPermissions = permSet.connectionPermissions || {}; + return addObjectPermission(permSet.connectionPermissions, type, identifier); + }; + + /** + * Removes the given connection permission applying to the connection with + * the given ID from the given permission set, if present. If the + * permission is not present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the connection to which the permission applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeConnectionPermission = function removeConnectionPermission(permSet, type, identifier) { + permSet.connectionPermissions = permSet.connectionPermissions || {}; + return removeObjectPermission(permSet.connectionPermissions, type, identifier); + }; + + /** + * Adds the given connection group permission applying to the connection + * group with the given ID to the given permission set, if not already + * present. If the permission is already present, this function has no + * effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the connection group to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addConnectionGroupPermission = function addConnectionGroupPermission(permSet, type, identifier) { + permSet.connectionGroupPermissions = permSet.connectionGroupPermissions || {}; + return addObjectPermission(permSet.connectionGroupPermissions, type, identifier); + }; + + /** + * Removes the given connection group permission applying to the connection + * group with the given ID from the given permission set, if present. If + * the permission is not present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the connection group to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeConnectionGroupPermission = function removeConnectionGroupPermission(permSet, type, identifier) { + permSet.connectionGroupPermissions = permSet.connectionGroupPermissions || {}; + return removeObjectPermission(permSet.connectionGroupPermissions, type, identifier); + }; + + /** + * Adds the given sharing profile permission applying to the sharing profile + * with the given ID to the given permission set, if not already present. If + * the permission is already present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the sharing profile to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addSharingProfilePermission = function addSharingProfilePermission(permSet, type, identifier) { + permSet.sharingProfilePermissions = permSet.sharingProfilePermissions || {}; + return addObjectPermission(permSet.sharingProfilePermissions, type, identifier); + }; + + /** + * Removes the given sharing profile permission applying to the sharing + * profile with the given ID from the given permission set, if present. If + * the permission is not present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the sharing profile to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeSharingProfilePermission = function removeSharingProfilePermission(permSet, type, identifier) { + permSet.sharingProfilePermissions = permSet.sharingProfilePermissions || {}; + return removeObjectPermission(permSet.sharingProfilePermissions, type, identifier); + }; + + /** + * Adds the given active connection permission applying to the connection + * group with the given ID to the given permission set, if not already + * present. If the permission is already present, this function has no + * effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the active connection to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addActiveConnectionPermission = function addActiveConnectionPermission(permSet, type, identifier) { + permSet.activeConnectionPermissions = permSet.activeConnectionPermissions || {}; + return addObjectPermission(permSet.activeConnectionPermissions, type, identifier); + }; + + /** + * Removes the given active connection permission applying to the + * connection group with the given ID from the given permission set, if + * present. If the permission is not present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the active connection to which the permission + * applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeActiveConnectionPermission = function removeActiveConnectionPermission(permSet, type, identifier) { + permSet.activeConnectionPermissions = permSet.activeConnectionPermissions || {}; + return removeObjectPermission(permSet.activeConnectionPermissions, type, identifier); + }; + + /** + * Adds the given user permission applying to the user with the given ID to + * the given permission set, if not already present. If the permission is + * already present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user to which the permission applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addUserPermission = function addUserPermission(permSet, type, identifier) { + permSet.userPermissions = permSet.userPermissions || {}; + return addObjectPermission(permSet.userPermissions, type, identifier); + }; + + /** + * Removes the given user permission applying to the user with the given ID + * from the given permission set, if present. If the permission is not + * present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user to whom the permission applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeUserPermission = function removeUserPermission(permSet, type, identifier) { + permSet.userPermissions = permSet.userPermissions || {}; + return removeObjectPermission(permSet.userPermissions, type, identifier); + }; + + /** + * Adds the given user group permission applying to the user group with the + * given identifier to the given permission set, if not already present. If + * the permission is already present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to add, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user group to which the permission applies. + * + * @returns {Boolean} + * true if the permission was added, false if the permission was + * already present in the given permission set. + */ + PermissionSet.addUserGroupPermission = function addUserGroupPermission(permSet, type, identifier) { + permSet.userGroupPermissions = permSet.userGroupPermissions || {}; + return addObjectPermission(permSet.userGroupPermissions, type, identifier); + }; + + /** + * Removes the given user group permission applying to the user group with + * the given identifier from the given permission set, if present. If the + * permission is not present, this function has no effect. + * + * @param {PermissionSet} permSet + * The permission set to modify. + * + * @param {String} type + * The permission to remove, as defined by + * PermissionSet.ObjectPermissionType. + * + * @param {String} identifier + * The identifier of the user group to whom the permission applies. + * + * @returns {Boolean} + * true if the permission was removed, false if the permission was not + * present in the given permission set. + */ + PermissionSet.removeUserGroupPermission = function removeUserGroupPermission(permSet, type, identifier) { + permSet.userGroupPermissions = permSet.userGroupPermissions || {}; + return removeObjectPermission(permSet.userGroupPermissions, type, identifier); + }; + + return PermissionSet; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/Protocol.js b/guacamole/src/main/frontend/src/app/rest/types/Protocol.js new file mode 100644 index 0000000..0b86d5b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/Protocol.js @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the Protocol class. + */ +angular.module('rest').factory('Protocol', ['$injector', function defineProtocol($injector) { + + // Required services + var translationStringService = $injector.get('translationStringService'); + + /** + * The object returned by REST API calls when representing the data + * associated with a supported remote desktop protocol. + * + * @constructor + * @param {Protocol|Object} [template={}] + * The object whose properties should be copied within the new + * Protocol. + */ + var Protocol = function Protocol(template) { + + // Use empty object by default + template = template || {}; + + /** + * The name which uniquely identifies this protocol. + * + * @type String + */ + this.name = template.name; + + /** + * An array of forms describing all known parameters for a connection + * using this protocol, including their types and other information. + * + * @type Form[] + * @default [] + */ + this.connectionForms = template.connectionForms || []; + + /** + * An array of forms describing all known parameters relevant to a + * sharing profile whose primary connection uses this protocol, + * including their types, and other information. + * + * @type Form[] + * @default [] + */ + this.sharingProfileForms = template.sharingProfileForms || []; + + }; + + /** + * Returns the translation string namespace for the protocol having the + * given name. The namespace will be of the form: + * + * PROTOCOL_NAME + * + * where NAME is the protocol name transformed via + * translationStringService.canonicalize(). + * + * @param {String} protocolName + * The name of the protocol. + * + * @returns {String} + * The translation namespace for the protocol specified, or null if no + * namespace could be generated. + */ + Protocol.getNamespace = function getNamespace(protocolName) { + + // Do not generate a namespace if no protocol is selected + if (!protocolName) + return null; + + return 'PROTOCOL_' + translationStringService.canonicalize(protocolName); + + }; + + /** + * Given the internal name of a protocol, produces the translation string + * for the localized version of that protocol's name. The translation + * string will be of the form: + * + * NAMESPACE.NAME + * + * where NAMESPACE is the namespace generated from + * $scope.getNamespace(). + * + * @param {String} protocolName + * The name of the protocol. + * + * @returns {String} + * The translation string which produces the localized name of the + * protocol specified. + */ + Protocol.getName = function getProtocolName(protocolName) { + return Protocol.getNamespace(protocolName) + '.NAME'; + }; + + return Protocol; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/RelatedObjectPatch.js b/guacamole/src/main/frontend/src/app/rest/types/RelatedObjectPatch.js new file mode 100644 index 0000000..c064938 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/RelatedObjectPatch.js @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the RelatedObjectPatch class. + */ +angular.module('rest').factory('RelatedObjectPatch', [function defineRelatedObjectPatch() { + + /** + * The object returned by REST API calls when representing changes to an + * arbitrary set of objects which share some common relation. + * + * @constructor + * @param {RelatedObjectPatch|Object} [template={}] + * The object whose properties should be copied within the new + * RelatedObjectPatch. + */ + var RelatedObjectPatch = function RelatedObjectPatch(template) { + + // Use empty object by default + template = template || {}; + + /** + * The operation to apply to the objects indicated by the path. Valid + * operation values are defined within RelatedObjectPatch.Operation. + * + * @type String + */ + this.op = template.op; + + /** + * The path of the objects to modify. This will always be "/". + * + * @type String + * @default '/' + */ + this.path = template.path || '/'; + + /** + * The identifier of the object being added or removed from the + * relation. + * + * @type String + */ + this.value = template.value; + + }; + + /** + * All valid patch operations for objects sharing some common relation. + * Currently, only add and remove are supported. + */ + RelatedObjectPatch.Operation = { + + /** + * Adds the specified object to the relation. + */ + ADD : "add", + + /** + * Removes the specified object from the relation. + */ + REMOVE : "remove" + + }; + + return RelatedObjectPatch; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/SharingProfile.js b/guacamole/src/main/frontend/src/app/rest/types/SharingProfile.js new file mode 100644 index 0000000..50f1307 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/SharingProfile.js @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the SharingProfile class. + */ +angular.module('rest').factory('SharingProfile', [function defineSharingProfile() { + + /** + * The object returned by REST API calls when representing the data + * associated with a sharing profile. + * + * @constructor + * @param {SharingProfile|Object} [template={}] + * The object whose properties should be copied within the new + * SharingProfile. + */ + var SharingProfile = function SharingProfile(template) { + + // Use empty object by default + template = template || {}; + + /** + * The unique identifier associated with this sharing profile. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * The unique identifier of the connection that this sharing profile + * can be used to share. + * + * @type String + */ + this.primaryConnectionIdentifier = template.primaryConnectionIdentifier; + + /** + * The human-readable name of this sharing profile, which is not + * necessarily unique. + * + * @type String + */ + this.name = template.name; + + /** + * Connection configuration parameters, as dictated by the protocol in + * use by the primary connection, arranged as name/value pairs. This + * information may not be available until directly queried. If this + * information is unavailable, this property will be null or undefined. + * + * @type Object. + */ + this.parameters = template.parameters; + + /** + * Arbitrary name/value pairs which further describe this sharing + * profile. The semantics and validity of these attributes are dictated + * by the extension which defines them. + * + * @type Object. + */ + this.attributes = template.attributes || {}; + + }; + + return SharingProfile; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/TranslatableMessage.js b/guacamole/src/main/frontend/src/app/rest/types/TranslatableMessage.js new file mode 100644 index 0000000..4542248 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/TranslatableMessage.js @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the TranslatableMessage class. + */ +angular.module('rest').factory('TranslatableMessage', [function defineTranslatableMessage() { + + /** + * The object returned by REST API calls when representing a message which + * can be translated using the translation service, providing a translation + * key and optional set of values to be substituted into the translation + * string associated with that key. + * + * @constructor + * @param {TranslatableMessage|Object} [template={}] + * The object whose properties should be copied within the new + * TranslatableMessage. + */ + var TranslatableMessage = function TranslatableMessage(template) { + + // Use empty object by default + template = template || {}; + + /** + * The key associated with the translation string that used when + * displaying this message. + * + * @type String + */ + this.key = template.key; + + /** + * The object which should be passed through to the translation service + * for the sake of variable substitution. Each property of the provided + * object will be substituted for the variable of the same name within + * the translation string. + * + * @type Object + */ + this.variables = template.variables; + + }; + + return TranslatableMessage; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/User.js b/guacamole/src/main/frontend/src/app/rest/types/User.js new file mode 100644 index 0000000..c74d1cd --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/User.js @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the User class. + */ +angular.module('rest').factory('User', [function defineUser() { + + /** + * The object returned by REST API calls when representing the data + * associated with a user. + * + * @constructor + * @param {User|Object} [template={}] + * The object whose properties should be copied within the new + * User. + */ + var User = function User(template) { + + // Use empty object by default + template = template || {}; + + /** + * The name which uniquely identifies this user. + * + * @type String + */ + this.username = template.username; + + /** + * This user's password. Note that the REST API may not populate this + * property for the sake of security. In most cases, it's not even + * possible for the authentication layer to retrieve the user's true + * password. + * + * @type String + */ + this.password = template.password; + + /** + * The time that this user was last logged in, in milliseconds since + * 1970-01-01 00:00:00 UTC. If this information is unknown or + * unavailable, this will be null. + * + * @type Number + */ + this.lastActive = template.lastActive; + + /** + * True if this user account is disabled, otherwise false. + * + * @type boolean + */ + this.disabled = template.disabled; + + /** + * Arbitrary name/value pairs which further describe this user. The + * semantics and validity of these attributes are dictated by the + * extension which defines them. + * + * @type Object. + */ + this.attributes = template.attributes || {}; + + }; + + /** + * All standard attribute names with semantics defined by the Guacamole web + * application. Extensions may additionally define their own attributes + * with completely arbitrary names and semantics, so long as those names do + * not conflict with the names listed here. All standard attribute names + * have a "guac-" prefix to avoid such conflicts. + */ + User.Attributes = { + + /** + * The user's full name. + * + * @type String + */ + FULL_NAME : 'guac-full-name', + + /** + * The email address of the user. + * + * @type String + */ + EMAIL_ADDRESS : 'guac-email-address', + + /** + * The organization, company, group, etc. that the user belongs to. + * + * @type String + */ + ORGANIZATION : 'guac-organization', + + /** + * The role that the user has at the organization, company, group, etc. + * they belong to. + * + * @type String + */ + ORGANIZATIONAL_ROLE : 'guac-organizational-role' + + }; + + return User; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/UserCredentials.js b/guacamole/src/main/frontend/src/app/rest/types/UserCredentials.js new file mode 100644 index 0000000..dc6c75e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/UserCredentials.js @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the UserCredentials class. + */ +angular.module('rest').factory('UserCredentials', ['$injector', function defineUserCredentials($injector) { + + // Required services + var $window = $injector.get('$window'); + + // Required types + var Field = $injector.get('Field'); + + /** + * The object returned by REST API calls to define a full set of valid + * credentials, including field definitions and corresponding expected + * values. + * + * @constructor + * @param {UserCredentials|Object} [template={}] + * The object whose properties should be copied within the new + * UserCredentials. + */ + var UserCredentials = function UserCredentials(template) { + + // Use empty object by default + template = template || {}; + + /** + * Any parameters which should be provided when these credentials are + * submitted. If no such information is available, this will be null. + * + * @type Field[] + */ + this.expected = template.expected; + + /** + * A map of all field values by field name. The fields having the names + * used within this map should be defined within the @link{Field} array + * stored under the @link{expected} property. + * + * @type Object. + */ + this.values = template.values; + + }; + + /** + * Generates a query string containing all QUERY_PARAMETER fields from the + * given UserCredentials object, along with their corresponding values. The + * parameter names and values will be appropriately URL-encoded and + * separated by ampersands. + * + * @param {UserCredentials} userCredentials + * The UserCredentials to retrieve all query parameters from. + * + * @returns {String} + * A string containing all QUERY_PARAMETER fields as name/value pairs + * separated by ampersands, where each name is separated by the value + * by an equals sign. + */ + UserCredentials.getQueryParameters = function getQueryParameters(userCredentials) { + + // Build list of parameter name/value pairs + var parameters = []; + angular.forEach(userCredentials.expected, function addQueryParameter(field) { + + // Only add query parameters + if (field.type !== Field.Type.QUERY_PARAMETER) + return; + + // Pull parameter name and value + var name = field.name; + var value = userCredentials.values[name]; + + // Properly encode name/value pair + parameters.push(encodeURIComponent(name) + '=' + encodeURIComponent(value)); + + }); + + // Separate each name/value pair by an ampersand + return parameters.join('&'); + + }; + + /** + * Returns a fully-qualified, absolute URL to Guacamole prepopulated with + * any query parameters dictated by the QUERY_PARAMETER fields defined in + * the given UserCredentials. + * + * @param {UserCredentials} userCredentials + * The UserCredentials to retrieve all query parameters from. + * + * @returns {String} + * A fully-qualified, absolute URL to Guacamole prepopulated with the + * query parameters dictated by the given UserCredentials. + */ + UserCredentials.getLink = function getLink(userCredentials) { + + // Work-around for IE missing window.location.origin + if (!$window.location.origin) + var linkOrigin = $window.location.protocol + '//' + $window.location.hostname + ($window.location.port ? (':' + $window.location.port) : ''); + else + var linkOrigin = $window.location.origin; + + // Build base link + var link = linkOrigin + + $window.location.pathname + + '#/'; + + // Add any required parameters + var params = UserCredentials.getQueryParameters(userCredentials); + if (params) + link += '?' + params; + + return link; + + }; + + return UserCredentials; + +}]); diff --git a/guacamole/src/main/frontend/src/app/rest/types/UserGroup.js b/guacamole/src/main/frontend/src/app/rest/types/UserGroup.js new file mode 100644 index 0000000..e3bc7ea --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/UserGroup.js @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the UserGroup class. + */ +angular.module('rest').factory('UserGroup', [function defineUserGroup() { + + /** + * The object returned by REST API calls when representing the data + * associated with a user group. + * + * @constructor + * @param {UserGroup|Object} [template={}] + * The object whose properties should be copied within the new + * UserGroup. + */ + var UserGroup = function UserGroup(template) { + + // Use empty object by default + template = template || {}; + + /** + * The name which uniquely identifies this user group. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * True if this user group is disabled, otherwise false. + * + * @type boolean + */ + this.disabled = template.disabled; + + /** + * Arbitrary name/value pairs which further describe this user group. + * The semantics and validity of these attributes are dictated by the + * extension which defines them. + * + * @type Object. + */ + this.attributes = template.attributes || {}; + + }; + + return UserGroup; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/rest/types/UserPasswordUpdate.js b/guacamole/src/main/frontend/src/app/rest/types/UserPasswordUpdate.js new file mode 100644 index 0000000..e76e761 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/rest/types/UserPasswordUpdate.js @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the UserPasswordUpdate class. + */ +angular.module('rest').factory('UserPasswordUpdate', [function defineUserPasswordUpdate() { + + /** + * The object sent to the REST API when representing the data + * associated with a user password update. + * + * @constructor + * @param {UserPasswordUpdate|Object} [template={}] + * The object whose properties should be copied within the new + * UserPasswordUpdate. + */ + var UserPasswordUpdate = function UserPasswordUpdate(template) { + + // Use empty object by default + template = template || {}; + + /** + * This user's current password. Required for authenticating the user + * as part of to the password update operation. + * + * @type String + */ + this.oldPassword = template.oldPassword; + + /** + * The new password to set for the user. + * + * @type String + */ + this.newPassword = template.newPassword; + + }; + + return UserPasswordUpdate; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/settings/controllers/connectionHistoryPlayerController.js b/guacamole/src/main/frontend/src/app/settings/controllers/connectionHistoryPlayerController.js new file mode 100644 index 0000000..12c368b --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/controllers/connectionHistoryPlayerController.js @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for the session recording player page. + */ +angular.module('settings').controller('connectionHistoryPlayerController', ['$scope', '$injector', + function connectionHistoryPlayerController($scope, $injector) { + + // Required services + const authenticationService = $injector.get('authenticationService'); + const $routeParams = $injector.get('$routeParams'); + + /** + * The URL of the REST API resource exposing the requested session + * recording. + * + * @type {!string} + */ + const recordingURL = 'api/session/data/' + encodeURIComponent($routeParams.dataSource) + + '/history/connections/' + encodeURIComponent($routeParams.identifier) + + '/logs/' + encodeURIComponent($routeParams.name); + + /** + * The tunnel which should be used to download the Guacamole session + * recording. + * + * @type Guacamole.Tunnel + */ + $scope.tunnel = new Guacamole.StaticHTTPTunnel(recordingURL, false, { + 'Guacamole-Token' : authenticationService.getCurrentToken() + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/controllers/settingsController.js b/guacamole/src/main/frontend/src/app/settings/controllers/settingsController.js new file mode 100644 index 0000000..9961d29 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/controllers/settingsController.js @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The controller for the general settings page. + */ +angular.module('settings').controller('settingsController', ['$scope', '$injector', + function settingsController($scope, $injector) { + + // Required services + var $routeParams = $injector.get('$routeParams'); + var userPageService = $injector.get('userPageService'); + + /** + * The array of settings pages available to the current user, or null if + * not yet known. + * + * @type Page[] + */ + $scope.settingsPages = null; + + /** + * The currently-selected settings tab. This may be 'users', 'userGroups', + * 'connections', 'history', 'preferences', or 'sessions'. + * + * @type String + */ + $scope.activeTab = $routeParams.tab; + + // Retrieve settings pages + userPageService.getSettingsPages() + .then(function settingsPagesRetrieved(pages) { + $scope.settingsPages = pages; + }); + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js new file mode 100644 index 0000000..f52fc0f --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js @@ -0,0 +1,270 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for viewing connection history records. + */ +angular.module('settings').directive('guacSettingsConnectionHistory', [function guacSettingsConnectionHistory() { + + return { + // Element only + restrict: 'E', + replace: true, + + scope: { + }, + + templateUrl: 'app/settings/templates/settingsConnectionHistory.html', + controller: ['$scope', '$injector', function settingsConnectionHistoryController($scope, $injector) { + + // Get required types + var ConnectionHistoryEntryWrapper = $injector.get('ConnectionHistoryEntryWrapper'); + var FilterToken = $injector.get('FilterToken'); + var SortOrder = $injector.get('SortOrder'); + + // Get required services + var $filter = $injector.get('$filter'); + var $routeParams = $injector.get('$routeParams'); + var $translate = $injector.get('$translate'); + var csvService = $injector.get('csvService'); + var historyService = $injector.get('historyService'); + var requestService = $injector.get('requestService'); + + /** + * The identifier of the currently-selected data source. + * + * @type String + */ + $scope.dataSource = $routeParams.dataSource; + + /** + * All wrapped matching connection history entries, or null if these + * entries have not yet been retrieved. + * + * @type ConnectionHistoryEntryWrapper[] + */ + $scope.historyEntryWrappers = null; + + /** + * The search terms to use when filtering the history records. + * + * @type String + */ + $scope.searchString = ''; + + /** + * The date format for use for start/end dates. + * + * @type String + */ + $scope.dateFormat = null; + + /** + * SortOrder instance which stores the sort order of the history + * records. + * + * @type SortOrder + */ + $scope.order = new SortOrder([ + '-entry.startDate', + '-duration', + 'entry.username', + 'entry.connectionName', + 'entry.remoteHost' + ]); + + /** + * The names of sortable properties supported by the REST API that + * correspond to the properties that may be stored within + * $scope.order. + * + * @type {!Object.} + */ + const apiSortProperties = { + 'entry.startDate' : 'startDate', + '-entry.startDate' : '-startDate' + }; + + /** + * Converts the given sort predicate to a correponding array of + * sortable properties supported by the REST API. Any properties + * within the predicate that are not supported will be dropped. + * + * @param {!string[]} predicate + * The sort predicate to convert, as exposed by the predicate + * property of SortOrder. + * + * @returns {!string[]} + * A corresponding array of sortable properties, omitting any + * properties not supported by the REST API. + */ + var toAPISortPredicate = function toAPISortPredicate(predicate) { + return predicate + .map((name) => apiSortProperties[name]) + .filter((name) => !!name); + }; + + // Get session date format + $translate('SETTINGS_CONNECTION_HISTORY.FORMAT_DATE') + .then(function dateFormatReceived(retrievedDateFormat) { + + // Store received date format + $scope.dateFormat = retrievedDateFormat; + + }, angular.noop); + + /** + * Returns true if the connection history records have been loaded, + * indicating that information needed to render the page is fully + * loaded. + * + * @returns {Boolean} + * true if the history records have been loaded, false + * otherwise. + * + */ + $scope.isLoaded = function isLoaded() { + return $scope.historyEntryWrappers !== null + && $scope.dateFormat !== null; + }; + + /** + * Returns whether the search has completed but contains no history + * records. This function will return false if there are history + * records in the results OR if the search has not yet completed. + * + * @returns {Boolean} + * true if the search results have been loaded but no history + * records are present, false otherwise. + */ + $scope.isHistoryEmpty = function isHistoryEmpty() { + return $scope.isLoaded() && $scope.historyEntryWrappers.length === 0; + }; + + /** + * Query the API for the connection record history, filtered by + * searchString, and ordered by order. + */ + $scope.search = function search() { + + // Clear current results + $scope.historyEntryWrappers = null; + + // Tokenize search string + var tokens = FilterToken.tokenize($scope.searchString); + + // Transform tokens into list of required string contents + var requiredContents = []; + angular.forEach(tokens, function addRequiredContents(token) { + + // Transform depending on token type + switch (token.type) { + + // For string literals, use parsed token value + case 'LITERAL': + requiredContents.push(token.value); + + // Ignore whitespace + case 'WHITESPACE': + break; + + // For all other token types, use the relevant portion + // of the original search string + default: + requiredContents.push(token.consumed); + + } + + }); + + // Fetch history records + historyService.getConnectionHistory( + $scope.dataSource, + requiredContents, + toAPISortPredicate($scope.order.predicate) + ) + .then(function historyRetrieved(historyEntries) { + + // Wrap all history entries for sake of display + $scope.historyEntryWrappers = []; + angular.forEach(historyEntries, function wrapHistoryEntry(historyEntry) { + $scope.historyEntryWrappers.push(new ConnectionHistoryEntryWrapper($scope.dataSource, historyEntry)); + }); + + }, requestService.DIE); + + }; + + /** + * Initiates a download of a CSV version of the displayed history + * search results. + */ + $scope.downloadCSV = function downloadCSV() { + + // Translate CSV header + $translate([ + 'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_USERNAME', + 'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_STARTDATE', + 'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_DURATION', + 'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_CONNECTION_NAME', + 'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_REMOTEHOST', + 'SETTINGS_CONNECTION_HISTORY.FILENAME_HISTORY_CSV' + ]).then(function headerTranslated(translations) { + + // Initialize records with translated header row + var records = [[ + translations['SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_USERNAME'], + translations['SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_STARTDATE'], + translations['SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_DURATION'], + translations['SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_CONNECTION_NAME'], + translations['SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_REMOTEHOST'] + ]]; + + // Add rows for all history entries, using the same sort + // order as the displayed table + angular.forEach( + $filter('orderBy')( + $scope.historyEntryWrappers, + $scope.order.predicate + ), + function pushRecord(historyEntryWrapper) { + records.push([ + historyEntryWrapper.entry.username, + $filter('date')(historyEntryWrapper.entry.startDate, $scope.dateFormat), + historyEntryWrapper.duration / 1000, + historyEntryWrapper.entry.connectionName, + historyEntryWrapper.entry.remoteHost + ]); + } + ); + + // Save the result + saveAs(csvService.toBlob(records), translations['SETTINGS_CONNECTION_HISTORY.FILENAME_HISTORY_CSV']); + + }, angular.noop); + + }; + + // Initialize search results + $scope.search(); + + }] + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnections.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnections.js new file mode 100644 index 0000000..38bb343 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnections.js @@ -0,0 +1,443 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for managing all connections and connection groups in the system. + */ +angular.module('settings').directive('guacSettingsConnections', [function guacSettingsConnections() { + + return { + // Element only + restrict: 'E', + replace: true, + + scope: { + }, + + templateUrl: 'app/settings/templates/settingsConnections.html', + controller: ['$scope', '$injector', function settingsConnectionsController($scope, $injector) { + + // Required types + var ConnectionGroup = $injector.get('ConnectionGroup'); + var GroupListItem = $injector.get('GroupListItem'); + var PermissionSet = $injector.get('PermissionSet'); + + // Required services + var $location = $injector.get('$location'); + var $routeParams = $injector.get('$routeParams'); + var authenticationService = $injector.get('authenticationService'); + var connectionGroupService = $injector.get('connectionGroupService'); + var dataSourceService = $injector.get('dataSourceService'); + var guacNotification = $injector.get('guacNotification'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + + /** + * The identifier of the current user. + * + * @type String + */ + var currentUsername = authenticationService.getCurrentUsername(); + + /** + * The identifier of the currently-selected data source. + * + * @type String + */ + $scope.dataSource = $routeParams.dataSource; + + /** + * The root connection group of the connection group hierarchy. + * + * @type Object. + */ + $scope.rootGroups = null; + + /** + * All permissions associated with the current user, or null if the + * user's permissions have not yet been loaded. + * + * @type PermissionSet + */ + $scope.permissions = null; + + /** + * Array of all connection properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionProperties = [ + 'name', + 'protocol' + ]; + + /** + * Array of all connection group properties that are filterable. + * + * @type String[] + */ + $scope.filteredConnectionGroupProperties = [ + 'name' + ]; + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface + * to be useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.rootGroup !== null + && $scope.permissions !== null; + + }; + + /** + * Returns whether the current user has the ADMINISTER system + * permission (i.e. they are an administrator). + * + * @return {Boolean} + * true if the current user is an administrator. + */ + $scope.canAdminister = function canAdminister() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Return whether the current user is an administrator + return PermissionSet.hasSystemPermission( + $scope.permissions, PermissionSet.SystemPermissionType.ADMINISTER); + }; + + /** + * Returns whether the current user can create new connections + * within the current data source. + * + * @return {Boolean} + * true if the current user can create new connections within + * the current data source, false otherwise. + */ + $scope.canCreateConnections = function canCreateConnections() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Can create connections if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION)) + return true; + + // No data sources allow connection creation + return false; + + }; + + /** + * Returns whether the current user can create new connection + * groups within the current data source. + * + * @return {Boolean} + * true if the current user can create new connection groups + * within the current data source, false otherwise. + */ + $scope.canCreateConnectionGroups = function canCreateConnectionGroups() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Can create connections groups if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION_GROUP)) + return true; + + // No data sources allow connection group creation + return false; + + }; + + /** + * Returns whether the current user can create new sharing profiles + * within the current data source. + * + * @return {Boolean} + * true if the current user can create new sharing profiles + * within the current data source, false otherwise. + */ + $scope.canCreateSharingProfiles = function canCreateSharingProfiles() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Can create sharing profiles if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.CREATE_SHARING_PROFILE)) + return true; + + // Current data source does not allow sharing profile creation + return false; + + }; + + /** + * Returns whether the current user can create new connections or + * connection groups or make changes to existing connections or + * connection groups within the current data source. The + * connection management interface as a whole is useless if this + * function returns false. + * + * @return {Boolean} + * true if the current user can create new connections/groups + * or make changes to existing connections/groups within the + * current data source, false otherwise. + */ + $scope.canManageConnections = function canManageConnections() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Creating connections/groups counts as management + if ($scope.canCreateConnections() + || $scope.canCreateConnectionGroups() + || $scope.canCreateSharingProfiles()) + return true; + + // Can manage connections if granted explicit update or delete + if (PermissionSet.hasConnectionPermission($scope.permissions, PermissionSet.ObjectPermissionType.UPDATE) + || PermissionSet.hasConnectionPermission($scope.permissions, PermissionSet.ObjectPermissionType.DELETE)) + return true; + + // Can manage connections groups if granted explicit update or delete + if (PermissionSet.hasConnectionGroupPermission($scope.permissions, PermissionSet.ObjectPermissionType.UPDATE) + || PermissionSet.hasConnectionGroupPermission($scope.permissions, PermissionSet.ObjectPermissionType.DELETE)) + return true; + + // No data sources allow management of connections or groups + return false; + + }; + + /** + * Returns whether the current user can update the connection having + * the given identifier within the current data source. + * + * @param {String} identifier + * The identifier of the connection to check. + * + * @return {Boolean} + * true if the current user can update the connection having the + * given identifier within the current data source, false + * otherwise. + */ + $scope.canUpdateConnection = function canUpdateConnection(identifier) { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Can update the connection if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasConnectionPermission($scope.permissions, PermissionSet.ObjectPermissionType.UPDATE, identifier)) + return true; + + // Current data sources does not allow the connection to be updated + return false; + + }; + + /** + * Returns whether the current user can update the connection group + * having the given identifier within the current data source. + * + * @param {String} identifier + * The identifier of the connection group to check. + * + * @return {Boolean} + * true if the current user can update the connection group + * having the given identifier within the current data source, + * false otherwise. + */ + $scope.canUpdateConnectionGroup = function canUpdateConnectionGroup(identifier) { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Can update the connection if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission($scope.permissions, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasConnectionGroupPermission($scope.permissions, PermissionSet.ObjectPermissionType.UPDATE, identifier)) + return true; + + // Current data sources does not allow the connection group to be updated + return false; + + }; + + /** + * Adds connection-group-specific contextual actions to the given + * array of GroupListItems. Each contextual action will be + * represented by a new GroupListItem. + * + * @param {GroupListItem[]} items + * The array of GroupListItems to which new GroupListItems + * representing connection-group-specific contextual actions + * should be added. + * + * @param {GroupListItem} [parent] + * The GroupListItem representing the connection group which + * contains the given array of GroupListItems, if known. + */ + var addConnectionGroupActions = function addConnectionGroupActions(items, parent) { + + // Do nothing if we lack permission to modify the parent at all + if (parent && !$scope.canUpdateConnectionGroup(parent.identifier)) + return; + + // Add action for creating a child connection, if the user has + // permission to do so + if ($scope.canCreateConnections()) + items.push(new GroupListItem({ + type : 'new-connection', + dataSource : $scope.dataSource, + weight : 1, + wrappedItem : parent + })); + + // Add action for creating a child connection group, if the user + // has permission to do so + if ($scope.canCreateConnectionGroups()) + items.push(new GroupListItem({ + type : 'new-connection-group', + dataSource : $scope.dataSource, + weight : 1, + wrappedItem : parent + })); + + }; + + /** + * Adds connection-specific contextual actions to the given array of + * GroupListItems. Each contextual action will be represented by a + * new GroupListItem. + * + * @param {GroupListItem[]} items + * The array of GroupListItems to which new GroupListItems + * representing connection-specific contextual actions should + * be added. + * + * @param {GroupListItem} [parent] + * The GroupListItem representing the connection which contains + * the given array of GroupListItems, if known. + */ + var addConnectionActions = function addConnectionActions(items, parent) { + + // Do nothing if we lack permission to modify the parent at all + if (parent && !$scope.canUpdateConnection(parent.identifier)) + return; + + // Add action for creating a child sharing profile, if the user + // has permission to do so + if ($scope.canCreateSharingProfiles()) + items.push(new GroupListItem({ + type : 'new-sharing-profile', + dataSource : $scope.dataSource, + weight : 1, + wrappedItem : parent + })); + + }; + + /** + * Decorates the given GroupListItem, including all descendants, + * adding contextual actions. + * + * @param {GroupListItem} item + * The GroupListItem which should be decorated with additional + * GroupListItems representing contextual actions. + */ + var decorateItem = function decorateItem(item) { + + // If the item is a connection group, add actions specific to + // connection groups + if (item.type === GroupListItem.Type.CONNECTION_GROUP) + addConnectionGroupActions(item.children, item); + + // If the item is a connection, add actions specific to + // connections + else if (item.type === GroupListItem.Type.CONNECTION) + addConnectionActions(item.children, item); + + // Decorate all children + angular.forEach(item.children, decorateItem); + + }; + + /** + * Callback which decorates all items within the given array of + * GroupListItems, including their descendants, adding contextual + * actions. + * + * @param {GroupListItem[]} items + * The array of GroupListItems which should be decorated with + * additional GroupListItems representing contextual actions. + */ + $scope.rootItemDecorator = function rootItemDecorator(items) { + + // Decorate each root-level item + angular.forEach(items, decorateItem); + + }; + + // Retrieve current permissions + permissionService.getEffectivePermissions($scope.dataSource, currentUsername) + .then(function permissionsRetrieved(permissions) { + + // Store retrieved permissions + $scope.permissions = permissions; + + // Ignore permission to update root group + PermissionSet.removeConnectionGroupPermission($scope.permissions, PermissionSet.ObjectPermissionType.UPDATE, ConnectionGroup.ROOT_IDENTIFIER); + + // Return to home if there's nothing to do here + if (!$scope.canManageConnections()) + $location.path('/'); + + // Retrieve all connections for which we have UPDATE or DELETE permission + dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + [$scope.dataSource], + ConnectionGroup.ROOT_IDENTIFIER, + [PermissionSet.ObjectPermissionType.UPDATE, PermissionSet.ObjectPermissionType.DELETE] + ) + .then(function connectionGroupsReceived(rootGroups) { + $scope.rootGroups = rootGroups; + }, requestService.DIE); + + }, requestService.DIE); // end retrieve permissions + + }] + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsPreferences.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsPreferences.js new file mode 100644 index 0000000..347c751 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsPreferences.js @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for managing preferences local to the current user. + */ +angular.module('settings').directive('guacSettingsPreferences', [function guacSettingsPreferences() { + + return { + // Element only + restrict: 'E', + replace: true, + + scope: {}, + + templateUrl: 'app/settings/templates/settingsPreferences.html', + controller: ['$scope', '$injector', function settingsPreferencesController($scope, $injector) { + + // Get required types + const Form = $injector.get('Form'); + const PermissionSet = $injector.get('PermissionSet'); + + // Required services + const $translate = $injector.get('$translate'); + const authenticationService = $injector.get('authenticationService'); + const guacNotification = $injector.get('guacNotification'); + const permissionService = $injector.get('permissionService'); + const preferenceService = $injector.get('preferenceService'); + const requestService = $injector.get('requestService'); + const schemaService = $injector.get('schemaService'); + const userService = $injector.get('userService'); + + /** + * An action to be provided along with the object sent to + * showStatus which closes the currently-shown status dialog. + */ + var ACKNOWLEDGE_ACTION = { + name : 'SETTINGS_PREFERENCES.ACTION_ACKNOWLEDGE', + // Handle action + callback : function acknowledgeCallback() { + guacNotification.showStatus(false); + } + }; + + /** + * An action which closes the current dialog, and refreshes + * the user data on dialog close. + */ + const ACKNOWLEDGE_ACTION_RELOAD = { + name : 'SETTINGS_PREFERENCES.ACTION_ACKNOWLEDGE', + // Handle action + callback : function acknowledgeCallback() { + userService.getUser(dataSource, username) + .then(user => $scope.user = user) + .then(() => guacNotification.showStatus(false)); + } + }; + + /** + * The user being modified. + * + * @type User + */ + $scope.user = null; + + /** + * The username of the current user. + * + * @type String + */ + var username = authenticationService.getCurrentUsername(); + + /** + * The identifier of the data source which authenticated the + * current user. + * + * @type String + */ + var dataSource = authenticationService.getDataSource(); + + /** + * All currently-set preferences, or their defaults if not yet set. + * + * @type Object. + */ + $scope.preferences = preferenceService.preferences; + + /** + * All available user attributes. This is only the set of attribute + * definitions, organized as logical groupings of attributes, not attribute + * values. + * + * @type Form[] + */ + $scope.attributes = null; + + /** + * The fields which should be displayed for choosing locale + * preferences. Each field name must be a property on + * $scope.preferences. + * + * @type Field[] + */ + $scope.localeFields = [ + { 'type' : 'LANGUAGE', 'name' : 'language' }, + { 'type' : 'TIMEZONE', 'name' : 'timezone' } + ]; + + // Automatically update applied translation when language preference is changed + $scope.$watch('preferences.language', function changeLanguage(language) { + $translate.use(language); + }); + + /** + * The new password for the user. + * + * @type String + */ + $scope.newPassword = null; + + /** + * The password match for the user. The update password action will + * fail if $scope.newPassword !== $scope.passwordMatch. + * + * @type String + */ + $scope.newPasswordMatch = null; + + /** + * Whether the current user can edit themselves - i.e. update their + * password or change user preference attributes, or null if this + * is not yet known. + * + * @type Boolean + */ + $scope.canUpdateSelf = null; + + /** + * Update the current user's password to the password currently set within + * the password change dialog. + */ + $scope.updatePassword = function updatePassword() { + + // Verify passwords match + if ($scope.newPasswordMatch !== $scope.newPassword) { + guacNotification.showStatus({ + className : 'error', + title : 'SETTINGS_PREFERENCES.DIALOG_HEADER_ERROR', + text : { + key : 'SETTINGS_PREFERENCES.ERROR_PASSWORD_MISMATCH' + }, + actions : [ ACKNOWLEDGE_ACTION ] + }); + return; + } + + // Verify that the new password is not blank + if (!$scope.newPassword) { + guacNotification.showStatus({ + className : 'error', + title : 'SETTINGS_PREFERENCES.DIALOG_HEADER_ERROR', + text : { + key : 'SETTINGS_PREFERENCES.ERROR_PASSWORD_BLANK' + }, + actions : [ ACKNOWLEDGE_ACTION ] + }); + return; + } + + // Save the user with the new password + userService.updateUserPassword(dataSource, username, $scope.oldPassword, $scope.newPassword) + .then(function passwordUpdated() { + + // Clear the password fields + $scope.oldPassword = null; + $scope.newPassword = null; + $scope.newPasswordMatch = null; + + // Indicate that the password has been changed + guacNotification.showStatus({ + text : { + key : 'SETTINGS_PREFERENCES.INFO_PASSWORD_CHANGED' + }, + actions : [ ACKNOWLEDGE_ACTION ] + }); + }, guacNotification.SHOW_REQUEST_ERROR); + + }; + + // Retrieve current permissions + permissionService.getEffectivePermissions(dataSource, username) + .then(function permissionsRetrieved(permissions) { + + // Add action for updaing password or user preferences if permission is granted + $scope.canUpdateSelf = ( + + // If permission is explicitly granted + PermissionSet.hasUserPermission(permissions, + PermissionSet.ObjectPermissionType.UPDATE, username) + + // Or if implicitly granted through being an administrator + || PermissionSet.hasSystemPermission(permissions, + PermissionSet.SystemPermissionType.ADMINISTER)); + + }) + ['catch'](requestService.createErrorCallback(function permissionsFailed(error) { + $scope.canUpdateSelf = false; + })); + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface to be + * useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.canUpdateSelf !== null + && $scope.languages !== null; + + }; + + + /** + * Saves the current user, displaying an acknowledgement message if + * saving was successful, or an error if the save failed. + */ + $scope.saveUser = function saveUser() { + return userService.saveUser(dataSource, $scope.user) + .then(() => guacNotification.showStatus({ + text : { + key : 'SETTINGS_PREFERENCES.INFO_PREFERENCE_ATTRIBUTES_CHANGED' + }, + + // Reload the user on successful save in case any attributes changed + actions : [ ACKNOWLEDGE_ACTION_RELOAD ] + }), + guacNotification.SHOW_REQUEST_ERROR); + }; + + // Fetch the user record + userService.getUser(dataSource, username).then(function saveUserData(user) { + $scope.user = user; + }); + + // Fetch all user preference attribute forms defined + schemaService.getUserPreferenceAttributes(dataSource).then(function saveAttributes(attributes) { + $scope.attributes = attributes; + }); + }] + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsSessions.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsSessions.js new file mode 100644 index 0000000..30b8bde --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsSessions.js @@ -0,0 +1,416 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for managing all active Guacamole sessions. + */ +angular.module('settings').directive('guacSettingsSessions', [function guacSettingsSessions() { + + return { + // Element only + restrict: 'E', + replace: true, + + scope: { + }, + + templateUrl: 'app/settings/templates/settingsSessions.html', + controller: ['$scope', '$injector', function settingsSessionsController($scope, $injector) { + + // Required types + var ActiveConnectionWrapper = $injector.get('ActiveConnectionWrapper'); + var ClientIdentifier = $injector.get('ClientIdentifier'); + var ConnectionGroup = $injector.get('ConnectionGroup'); + var SortOrder = $injector.get('SortOrder'); + + // Required services + var $filter = $injector.get('$filter'); + var $translate = $injector.get('$translate'); + var $q = $injector.get('$q'); + var activeConnectionService = $injector.get('activeConnectionService'); + var authenticationService = $injector.get('authenticationService'); + var connectionGroupService = $injector.get('connectionGroupService'); + var dataSourceService = $injector.get('dataSourceService'); + var guacNotification = $injector.get('guacNotification'); + var requestService = $injector.get('requestService'); + + /** + * The identifiers of all data sources accessible by the current + * user. + * + * @type String[] + */ + var dataSources = authenticationService.getAvailableDataSources(); + + /** + * The ActiveConnectionWrappers of all active sessions accessible + * by the current user, or null if the active sessions have not yet + * been loaded. + * + * @type ActiveConnectionWrapper[] + */ + $scope.wrappers = null; + + /** + * SortOrder instance which maintains the sort order of the visible + * connection wrappers. + * + * @type SortOrder + */ + $scope.wrapperOrder = new SortOrder([ + 'activeConnection.username', + 'startDate', + 'activeConnection.remoteHost', + 'name' + ]); + + /** + * Array of all wrapper properties that are filterable. + * + * @type String[] + */ + $scope.filteredWrapperProperties = [ + 'activeConnection.username', + 'startDate', + 'activeConnection.remoteHost', + 'name' + ]; + + /** + * All active connections, if known, grouped by corresponding data + * source identifier, or null if active connections have not yet + * been loaded. + * + * @type Object.> + */ + var allActiveConnections = null; + + /** + * Map of all visible connections by data source identifier and + * object identifier, or null if visible connections have not yet + * been loaded. + * + * @type Object.> + */ + var allConnections = null; + + /** + * The date format for use for session-related dates. + * + * @type String + */ + var sessionDateFormat = null; + + /** + * Map of all currently-selected active connection wrappers by + * data source and identifier. + * + * @type Object.> + */ + var allSelectedWrappers = {}; + + /** + * Adds the given connection to the internal set of visible + * connections. + * + * @param {String} dataSource + * The identifier of the data source associated with the given + * connection. + * + * @param {Connection} connection + * The connection to add to the internal set of visible + * connections. + */ + var addConnection = function addConnection(dataSource, connection) { + + // Add given connection to set of visible connections + allConnections[dataSource][connection.identifier] = connection; + + }; + + /** + * Adds all descendant connections of the given connection group to + * the internal set of connections. + * + * @param {String} dataSource + * The identifier of the data source associated with the given + * connection group. + * + * @param {ConnectionGroup} connectionGroup + * The connection group whose descendant connections should be + * added to the internal set of connections. + */ + var addDescendantConnections = function addDescendantConnections(dataSource, connectionGroup) { + + // Add all child connections + angular.forEach(connectionGroup.childConnections, function addConnectionForDataSource(connection) { + addConnection(dataSource, connection); + }); + + // Add all child connection groups + angular.forEach(connectionGroup.childConnectionGroups, function addConnectionGroupForDataSource(connectionGroup) { + addDescendantConnections(dataSource, connectionGroup); + }); + + }; + + /** + * Wraps all loaded active connections, storing the resulting array + * within the scope. If required data has not yet finished loading, + * this function has no effect. + */ + var wrapAllActiveConnections = function wrapAllActiveConnections() { + + // Abort if not all required data is available + if (!allActiveConnections || !allConnections || !sessionDateFormat) + return; + + // Wrap all active connections for sake of display + $scope.wrappers = []; + angular.forEach(allActiveConnections, function wrapActiveConnections(activeConnections, dataSource) { + angular.forEach(activeConnections, function wrapActiveConnection(activeConnection, identifier) { + + // Retrieve corresponding connection + var connection = allConnections[dataSource][activeConnection.connectionIdentifier]; + + // Add wrapper + if (activeConnection.username !== null) { + $scope.wrappers.push(new ActiveConnectionWrapper({ + dataSource : dataSource, + name : connection.name, + startDate : $filter('date')(activeConnection.startDate, sessionDateFormat), + activeConnection : activeConnection + })); + } + + }); + }); + + }; + + // Retrieve all connections + dataSourceService.apply( + connectionGroupService.getConnectionGroupTree, + dataSources, + ConnectionGroup.ROOT_IDENTIFIER + ) + .then(function connectionGroupsReceived(rootGroups) { + + allConnections = {}; + + // Load connections from each received root group + angular.forEach(rootGroups, function connectionGroupReceived(rootGroup, dataSource) { + allConnections[dataSource] = {}; + addDescendantConnections(dataSource, rootGroup); + }); + + // Attempt to produce wrapped list of active connections + wrapAllActiveConnections(); + + }, requestService.DIE); + + // Query active sessions + dataSourceService.apply( + activeConnectionService.getActiveConnections, + dataSources + ) + .then(function sessionsRetrieved(retrievedActiveConnections) { + + // Store received map of active connections + allActiveConnections = retrievedActiveConnections; + + // Attempt to produce wrapped list of active connections + wrapAllActiveConnections(); + + }, requestService.DIE); + + // Get session date format + $translate('SETTINGS_SESSIONS.FORMAT_STARTDATE').then(function sessionDateFormatReceived(retrievedSessionDateFormat) { + + // Store received date format + sessionDateFormat = retrievedSessionDateFormat; + + // Attempt to produce wrapped list of active connections + wrapAllActiveConnections(); + + }, angular.noop); + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface + * to be useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + return $scope.wrappers !== null; + }; + + /** + * An action to be provided along with the object sent to + * showStatus which closes the currently-shown status dialog. + */ + var CANCEL_ACTION = { + name : "SETTINGS_SESSIONS.ACTION_CANCEL", + // Handle action + callback : function cancelCallback() { + guacNotification.showStatus(false); + } + }; + + /** + * An action to be provided along with the object sent to + * showStatus which immediately deletes the currently selected + * sessions. + */ + var DELETE_ACTION = { + name : "SETTINGS_SESSIONS.ACTION_DELETE", + className : "danger", + // Handle action + callback : function deleteCallback() { + deleteAllSessionsImmediately(); + guacNotification.showStatus(false); + } + }; + + /** + * Immediately deletes the selected sessions, without prompting the + * user for confirmation. + */ + var deleteAllSessionsImmediately = function deleteAllSessionsImmediately() { + + var deletionRequests = []; + + // Perform deletion for each relevant data source + angular.forEach(allSelectedWrappers, function deleteSessionsImmediately(selectedWrappers, dataSource) { + + // Delete sessions, if any are selected + var identifiers = Object.keys(selectedWrappers); + if (identifiers.length) + deletionRequests.push(activeConnectionService.deleteActiveConnections(dataSource, identifiers)); + + }); + + // Update interface + $q.all(deletionRequests) + .then(function activeConnectionsDeleted() { + + // Remove deleted connections from wrapper array + $scope.wrappers = $scope.wrappers.filter(function activeConnectionStillExists(wrapper) { + return !(wrapper.activeConnection.identifier in (allSelectedWrappers[wrapper.dataSource] || {})); + }); + + // Clear selection + allSelectedWrappers = {}; + + }, guacNotification.SHOW_REQUEST_ERROR); + + }; + + /** + * Delete all selected sessions, prompting the user first to + * confirm that deletion is desired. + */ + $scope.deleteSessions = function deleteSessions() { + // Confirm deletion request + guacNotification.showStatus({ + 'title' : 'SETTINGS_SESSIONS.DIALOG_HEADER_CONFIRM_DELETE', + 'text' : { + 'key' : 'SETTINGS_SESSIONS.TEXT_CONFIRM_DELETE' + }, + 'actions' : [ DELETE_ACTION, CANCEL_ACTION] + }); + }; + + /** + * Returns the relative URL of the client page which accesses the + * given active connection. If the active connection is not + * connectable, null is returned. + * + * @param {String} dataSource + * The unique identifier of the data source containing the + * active connection. + * + * @param {String} activeConnection + * The active connection to determine the relative URL of. + * + * @returns {String} + * The relative URL of the client page which accesses the given + * active connection, or null if the active connection is not + * connectable. + */ + $scope.getClientURL = function getClientURL(dataSource, activeConnection) { + + if (!activeConnection.connectable) + return null; + + return '#/client/' + encodeURIComponent(ClientIdentifier.toString({ + dataSource : dataSource, + type : ClientIdentifier.Types.ACTIVE_CONNECTION, + id : activeConnection.identifier + })); + + }; + + /** + * Returns whether the selected sessions can be deleted. + * + * @returns {Boolean} + * true if selected sessions can be deleted, false otherwise. + */ + $scope.canDeleteSessions = function canDeleteSessions() { + + // We can delete sessions if at least one is selected + for (var dataSource in allSelectedWrappers) { + for (var identifier in allSelectedWrappers[dataSource]) + return true; + } + + return false; + + }; + + /** + * Called whenever an active connection wrapper changes selected + * status. + * + * @param {ActiveConnectionWrapper} wrapper + * The wrapper whose selected status has changed. + */ + $scope.wrapperSelectionChange = function wrapperSelectionChange(wrapper) { + + // Get selection map for associated data source, creating if necessary + var selectedWrappers = allSelectedWrappers[wrapper.dataSource]; + if (!selectedWrappers) + selectedWrappers = allSelectedWrappers[wrapper.dataSource] = {}; + + // Add wrapper to map if selected + if (wrapper.checked) + selectedWrappers[wrapper.activeConnection.identifier] = wrapper; + + // Otherwise, remove wrapper from map + else + delete selectedWrappers[wrapper.activeConnection.identifier]; + + }; + + }] + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsUserGroups.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsUserGroups.js new file mode 100644 index 0000000..a8f2dd3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsUserGroups.js @@ -0,0 +1,272 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for managing all user groups in the system. + */ +angular.module('settings').directive('guacSettingsUserGroups', ['$injector', + function guacSettingsUserGroups($injector) { + + // Required types + var ManageableUserGroup = $injector.get('ManageableUserGroup'); + var PermissionSet = $injector.get('PermissionSet'); + var SortOrder = $injector.get('SortOrder'); + + // Required services + var $location = $injector.get('$location'); + var authenticationService = $injector.get('authenticationService'); + var dataSourceService = $injector.get('dataSourceService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var userGroupService = $injector.get('userGroupService'); + + var directive = { + restrict : 'E', + replace : true, + templateUrl : 'app/settings/templates/settingsUserGroups.html', + scope : {} + }; + + directive.controller = ['$scope', function settingsUserGroupsController($scope) { + + // Identifier of the current user + var currentUsername = authenticationService.getCurrentUsername(); + + /** + * The identifiers of all data sources accessible by the current + * user. + * + * @type String[] + */ + var dataSources = authenticationService.getAvailableDataSources(); + + /** + * Map of data source identifiers to all permissions associated + * with the current user within that data source, or null if the + * user's permissions have not yet been loaded. + * + * @type Object. + */ + var permissions = null; + + /** + * All visible user groups, along with their corresponding data + * sources. + * + * @type ManageableUserGroup[] + */ + $scope.manageableUserGroups = null; + + /** + * Array of all user group properties that are filterable. + * + * @type String[] + */ + $scope.filteredUserGroupProperties = [ + 'userGroup.identifier' + ]; + + /** + * SortOrder instance which stores the sort order of the listed + * user groups. + * + * @type SortOrder + */ + $scope.order = new SortOrder([ + 'userGroup.identifier' + ]); + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user group + * interface to be useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + return $scope.manageableUserGroups !== null; + }; + + /** + * Returns the identifier of the data source that should be used by + * default when creating a new user group. + * + * @return {String} + * The identifier of the data source that should be used by + * default when creating a new user group, or null if user group + * creation is not allowed. + */ + $scope.getDefaultDataSource = function getDefaultDataSource() { + + // Abort if permissions have not yet loaded + if (!permissions) + return null; + + // For each data source + var dataSources = _.keys(permissions).sort(); + for (var i = 0; i < dataSources.length; i++) { + + // Retrieve corresponding permission set + var dataSource = dataSources[i]; + var permissionSet = permissions[dataSource]; + + // Can create user groups if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission(permissionSet, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission(permissionSet, PermissionSet.SystemPermissionType.CREATE_USER_GROUP)) + return dataSource; + + } + + // No data sources allow user group creation + return null; + + }; + + /** + * Returns whether the current user can create new user groups + * within at least one data source. + * + * @return {Boolean} + * true if the current user can create new user groups within at + * least one data source, false otherwise. + */ + $scope.canCreateUserGroups = function canCreateUserGroups() { + return $scope.getDefaultDataSource() !== null; + }; + + /** + * Returns whether the current user can create new user groups or + * make changes to existing user groups within at least one data + * source. The user group management interface as a whole is useless + * if this function returns false. + * + * @return {Boolean} + * true if the current user can create new user groups or make + * changes to existing user groups within at least one data + * source, false otherwise. + */ + var canManageUserGroups = function canManageUserGroups() { + + // Abort if permissions have not yet loaded + if (!permissions) + return false; + + // Creating user groups counts as management + if ($scope.canCreateUserGroups()) + return true; + + // For each data source + for (var dataSource in permissions) { + + // Retrieve corresponding permission set + var permissionSet = permissions[dataSource]; + + // Can manage user groups if granted explicit update or delete + if (PermissionSet.hasUserGroupPermission(permissionSet, PermissionSet.ObjectPermissionType.UPDATE) + || PermissionSet.hasUserGroupPermission(permissionSet, PermissionSet.ObjectPermissionType.DELETE)) + return true; + + } + + // No data sources allow management of user groups + return false; + + }; + + /** + * Sets the displayed list of user groups. If any user groups are + * already shown within the interface, those user groups are replaced + * with the given user groups. + * + * @param {Object.} permissions + * A map of data source identifiers to all permissions associated + * with the current user within that data source. + * + * @param {Object.>} userGroups + * A map of all user groups which should be displayed, where each + * key is the data source identifier from which the user groups + * were retrieved and each value is a map of user group identifiers + * to their corresponding @link{UserGroup} objects. + */ + var setDisplayedUserGroups = function setDisplayedUserGroups(permissions, userGroups) { + + var addedUserGroups = {}; + $scope.manageableUserGroups = []; + + // For each user group in each data source + angular.forEach(dataSources, function addUserGroupList(dataSource) { + angular.forEach(userGroups[dataSource], function addUserGroup(userGroup) { + + // Do not add the same user group twice + if (addedUserGroups[userGroup.identifier]) + return; + + // Link to default creation data source if we cannot manage this user + if (!PermissionSet.hasSystemPermission(permissions[dataSource], PermissionSet.ObjectPermissionType.ADMINISTER) + && !PermissionSet.hasUserGroupPermission(permissions[dataSource], PermissionSet.ObjectPermissionType.UPDATE, userGroup.identifier) + && !PermissionSet.hasUserGroupPermission(permissions[dataSource], PermissionSet.ObjectPermissionType.DELETE, userGroup.identifier)) + dataSource = $scope.getDefaultDataSource(); + + // Add user group to overall list + addedUserGroups[userGroup.identifier] = userGroup; + $scope.manageableUserGroups.push(new ManageableUserGroup ({ + 'dataSource' : dataSource, + 'userGroup' : userGroup + })); + + }); + }); + + }; + + // Retrieve current permissions + dataSourceService.apply( + permissionService.getEffectivePermissions, + dataSources, + currentUsername + ) + .then(function permissionsRetrieved(retrievedPermissions) { + + // Store retrieved permissions + permissions = retrievedPermissions; + + // Return to home if there's nothing to do here + if (!canManageUserGroups()) + $location.path('/'); + + // If user groups can be created, list all readable user groups + if ($scope.canCreateUserGroups()) + return dataSourceService.apply(userGroupService.getUserGroups, dataSources); + + // Otherwise, list only updateable/deletable users + return dataSourceService.apply(userGroupService.getUserGroups, dataSources, [ + PermissionSet.ObjectPermissionType.UPDATE, + PermissionSet.ObjectPermissionType.DELETE + ]); + + }) + .then(function userGroupsReceived(userGroups) { + setDisplayedUserGroups(permissions, userGroups); + }, requestService.WARN); + + }]; + + return directive; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsUsers.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsUsers.js new file mode 100644 index 0000000..6b8c6e0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsUsers.js @@ -0,0 +1,291 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive for managing all users in the system. + */ +angular.module('settings').directive('guacSettingsUsers', [function guacSettingsUsers() { + + return { + // Element only + restrict: 'E', + replace: true, + + scope: { + }, + + templateUrl: 'app/settings/templates/settingsUsers.html', + controller: ['$scope', '$injector', function settingsUsersController($scope, $injector) { + + // Required types + var ManageableUser = $injector.get('ManageableUser'); + var PermissionSet = $injector.get('PermissionSet'); + var SortOrder = $injector.get('SortOrder'); + + // Required services + var $location = $injector.get('$location'); + var $translate = $injector.get('$translate'); + var authenticationService = $injector.get('authenticationService'); + var dataSourceService = $injector.get('dataSourceService'); + var permissionService = $injector.get('permissionService'); + var requestService = $injector.get('requestService'); + var userService = $injector.get('userService'); + + // Identifier of the current user + var currentUsername = authenticationService.getCurrentUsername(); + + /** + * The identifiers of all data sources accessible by the current + * user. + * + * @type String[] + */ + var dataSources = authenticationService.getAvailableDataSources(); + + /** + * All visible users, along with their corresponding data sources. + * + * @type ManageableUser[] + */ + $scope.manageableUsers = null; + + /** + * The name of the new user to create, if any, when user creation + * is requested via newUser(). + * + * @type String + */ + $scope.newUsername = ""; + + /** + * Map of data source identifiers to all permissions associated + * with the current user within that data source, or null if the + * user's permissions have not yet been loaded. + * + * @type Object. + */ + $scope.permissions = null; + + /** + * Array of all user properties that are filterable. + * + * @type String[] + */ + $scope.filteredUserProperties = [ + 'user.attributes["guac-full-name"]', + 'user.attributes["guac-organization"]', + 'user.lastActive', + 'user.username' + ]; + + /** + * The date format for use for the last active date. + * + * @type String + */ + $scope.dateFormat = null; + + /** + * SortOrder instance which stores the sort order of the listed + * users. + * + * @type SortOrder + */ + $scope.order = new SortOrder([ + 'user.username', + '-user.lastActive', + 'user.attributes["guac-organization"]', + 'user.attributes["guac-full-name"]' + ]); + + // Get session date format + $translate('SETTINGS_USERS.FORMAT_DATE') + .then(function dateFormatReceived(retrievedDateFormat) { + + // Store received date format + $scope.dateFormat = retrievedDateFormat; + + }, angular.noop); + + /** + * Returns whether critical data has completed being loaded. + * + * @returns {Boolean} + * true if enough data has been loaded for the user interface + * to be useful, false otherwise. + */ + $scope.isLoaded = function isLoaded() { + + return $scope.dateFormat !== null + && $scope.manageableUsers !== null + && $scope.permissions !== null; + + }; + + /** + * Returns the identifier of the data source that should be used by + * default when creating a new user. + * + * @return {String} + * The identifier of the data source that should be used by + * default when creating a new user, or null if user creation + * is not allowed. + */ + $scope.getDefaultDataSource = function getDefaultDataSource() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return null; + + // For each data source + var dataSources = _.keys($scope.permissions).sort(); + for (var i = 0; i < dataSources.length; i++) { + + // Retrieve corresponding permission set + var dataSource = dataSources[i]; + var permissionSet = $scope.permissions[dataSource]; + + // Can create users if adminstrator or have explicit permission + if (PermissionSet.hasSystemPermission(permissionSet, PermissionSet.SystemPermissionType.ADMINISTER) + || PermissionSet.hasSystemPermission(permissionSet, PermissionSet.SystemPermissionType.CREATE_USER)) + return dataSource; + + } + + // No data sources allow user creation + return null; + + }; + + /** + * Returns whether the current user can create new users within at + * least one data source. + * + * @return {Boolean} + * true if the current user can create new users within at + * least one data source, false otherwise. + */ + $scope.canCreateUsers = function canCreateUsers() { + return $scope.getDefaultDataSource() !== null; + }; + + /** + * Returns whether the current user can create new users or make + * changes to existing users within at least one data source. The + * user management interface as a whole is useless if this function + * returns false. + * + * @return {Boolean} + * true if the current user can create new users or make + * changes to existing users within at least one data source, + * false otherwise. + */ + var canManageUsers = function canManageUsers() { + + // Abort if permissions have not yet loaded + if (!$scope.permissions) + return false; + + // Creating users counts as management + if ($scope.canCreateUsers()) + return true; + + // For each data source + for (var dataSource in $scope.permissions) { + + // Retrieve corresponding permission set + var permissionSet = $scope.permissions[dataSource]; + + // Can manage users if granted explicit update or delete + if (PermissionSet.hasUserPermission(permissionSet, PermissionSet.ObjectPermissionType.UPDATE) + || PermissionSet.hasUserPermission(permissionSet, PermissionSet.ObjectPermissionType.DELETE)) + return true; + + } + + // No data sources allow management of users + return false; + + }; + + // Retrieve current permissions + dataSourceService.apply( + permissionService.getEffectivePermissions, + dataSources, + currentUsername + ) + .then(function permissionsRetrieved(permissions) { + + // Store retrieved permissions + $scope.permissions = permissions; + + // Return to home if there's nothing to do here + if (!canManageUsers()) + $location.path('/'); + + var userPromise; + + // If users can be created, list all readable users + if ($scope.canCreateUsers()) + userPromise = dataSourceService.apply(userService.getUsers, dataSources); + + // Otherwise, list only updateable/deletable users + else + userPromise = dataSourceService.apply(userService.getUsers, dataSources, [ + PermissionSet.ObjectPermissionType.UPDATE, + PermissionSet.ObjectPermissionType.DELETE + ]); + + userPromise.then(function usersReceived(allUsers) { + + var addedUsers = {}; + $scope.manageableUsers = []; + + // For each user in each data source + angular.forEach(dataSources, function addUserList(dataSource) { + angular.forEach(allUsers[dataSource], function addUser(user) { + + // Do not add the same user twice + if (addedUsers[user.username]) + return; + + // Link to default creation data source if we cannot manage this user + if (!PermissionSet.hasSystemPermission(permissions[dataSource], PermissionSet.ObjectPermissionType.ADMINISTER) + && !PermissionSet.hasUserPermission(permissions[dataSource], PermissionSet.ObjectPermissionType.UPDATE, user.username) + && !PermissionSet.hasUserPermission(permissions[dataSource], PermissionSet.ObjectPermissionType.DELETE, user.username)) + dataSource = $scope.getDefaultDataSource(); + + // Add user to overall list + addedUsers[user.username] = user; + $scope.manageableUsers.push(new ManageableUser ({ + 'dataSource' : dataSource, + 'user' : user + })); + + }); + }); + + }, requestService.DIE); + + }, requestService.DIE); + + }] + }; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/services/csvService.js b/guacamole/src/main/frontend/src/app/settings/services/csvService.js new file mode 100644 index 0000000..e68cf15 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/services/csvService.js @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for generating downloadable CSV links given arbitrary data. + */ +angular.module('settings').factory('csvService', [function csvService() { + + var service = {}; + + /** + * Encodes an arbitrary value for inclusion in a CSV file as an individual + * field. With the exception of null and undefined (which are both + * interpreted as equivalent to an empty string), all values are coerced to + * a string and, if non-numeric, included within double quotes. If the + * value itself includes double quotes, those quotes will be properly + * escaped. + * + * @param {*} field + * The arbitrary value to encode. + * + * @return {String} + * The provided value, coerced to a string and properly escaped for + * CSV. + */ + var encodeField = function encodeField(field) { + + // Coerce field to string + if (field === null || field === undefined) + field = ''; + else + field = '' + field; + + // Do not quote numeric fields + if (/^[0-9.]*$/.test(field)) + return field; + + // Enclose all other fields in quotes, escaping any quotes therein + return '"' + field.replace(/"/g, '""') + '"'; + + }; + + /** + * Encodes each of the provided values for inclusion in a CSV file as + * fields within the same record (in the manner specified by + * encodeField()), separated by commas. + * + * @param {*[]} fields + * An array of arbitrary values which make up the record. + * + * @return {String} + * A CSV record containing the each value in the given array. + */ + var encodeRecord = function encodeRecord(fields) { + return fields.map(encodeField).join(','); + }; + + /** + * Encodes an entire array of records as properly-formatted CSV, where each + * entry in the provided array is an array of arbitrary fields. + * + * @param {Array.<*[]>} records + * An array of all records making up the desired CSV. + * + * @return {String} + * An entire CSV containing each provided record, separated by CR+LF + * line terminators. + */ + var encodeCSV = function encodeCSV(records) { + return records.map(encodeRecord).join('\r\n'); + }; + + /** + * Creates a new Blob containing properly-formatted CSV generated from the + * given array of records, where each entry in the provided array is an + * array of arbitrary fields. + * + * @param {Array.<*[]>} records + * An array of all records making up the desired CSV. + * + * @returns {Blob} + * A new Blob containing each provided record in CSV format. + */ + service.toBlob = function toBlob(records) { + return new Blob([ encodeCSV(records) ], { type : 'text/csv' }); + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/services/preferenceService.js b/guacamole/src/main/frontend/src/app/settings/services/preferenceService.js new file mode 100644 index 0000000..f029790 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/services/preferenceService.js @@ -0,0 +1,223 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for setting and retrieving browser-local preferences. Preferences + * may be any JSON-serializable type. + */ +angular.module('settings').provider('preferenceService', ['$injector', + function preferenceServiceProvider($injector) { + + // Required providers + var localStorageServiceProvider = $injector.get('localStorageServiceProvider'); + + /** + * Reference to the provider itself. + * + * @type preferenceServiceProvider + */ + var provider = this; + + /** + * The storage key of Guacamole preferences within local storage. + * + * @type String + */ + var GUAC_PREFERENCES_STORAGE_KEY = "GUAC_PREFERENCES"; + + /** + * All valid input method type names. + * + * @type Object. + */ + var inputMethods = { + + /** + * No input method is used. Keyboard events are generated from a + * physical keyboard. + * + * @constant + * @type String + */ + NONE : 'none', + + /** + * Keyboard events will be generated from the Guacamole on-screen + * keyboard. + * + * @constant + * @type String + */ + OSK : 'osk', + + /** + * Keyboard events will be generated by inferring the keys necessary to + * produce typed text from an IME (Input Method Editor) such as the + * native on-screen keyboard of a mobile device. + * + * @constant + * @type String + */ + TEXT : 'text' + + }; + + /** + * Returns the key of the language currently in use within the browser. + * This is not necessarily the user's desired language, but is rather the + * language user by the browser's interface. + * + * @returns {String} + * The key of the language currently in use within the browser. + */ + var getDefaultLanguageKey = function getDefaultLanguageKey() { + + // Pull browser language, falling back to US English + var language = (navigator.languages && navigator.languages[0]) + || navigator.language + || navigator.browserLanguage + || 'en'; + + // Convert to format used internally + return language.replace(/-/g, '_'); + + }; + + /** + * Return the timezone detected for the current browser session + * by the JSTZ timezone library. + * + * @returns String + * The name of the currently-detected timezone in IANA zone key + * format (Olson time zone database). + */ + var getDetectedTimezone = function getDetectedTimezone() { + return jstz.determine().name(); + }; + + /** + * All currently-set preferences, as name/value pairs. Each property name + * corresponds to the name of a preference. + * + * @type Object. + */ + this.preferences = { + + /** + * Whether translation of touch to mouse events should emulate an + * absolute pointer device, or a relative pointer device. + * + * @type Boolean + */ + emulateAbsoluteMouse : true, + + /** + * The default input method. This may be any of the values defined + * within preferenceService.inputMethods. + * + * @type String + */ + inputMethod : inputMethods.NONE, + + /** + * The key of the desired display language. + * + * @type String + */ + language : getDefaultLanguageKey(), + + /** + * The number of recent connections to display. + * + * @type {!number} + */ + numberOfRecentConnections: 6, + + /** + * Whether or not to show the "Recent Connections" section. + * + * @type {!boolean} + */ + showRecentConnections : true, + + /** + * The timezone set by the user, in IANA zone key format (Olson time + * zone database). + * + * @type String + */ + timezone : getDetectedTimezone() + + }; + + // Get stored preferences from localStorage + var storedPreferences = localStorageServiceProvider.getItem(GUAC_PREFERENCES_STORAGE_KEY); + if (storedPreferences) + angular.extend(provider.preferences, storedPreferences); + + // Factory method required by provider + this.$get = ['$injector', function preferenceServiceFactory($injector) { + + // Required services + var $rootScope = $injector.get('$rootScope'); + var $window = $injector.get('$window'); + var localStorageService = $injector.get('localStorageService'); + + var service = {}; + + /** + * All valid input method type names. + * + * @type Object. + */ + service.inputMethods = inputMethods; + + /** + * All currently-set preferences, as name/value pairs. Each property name + * corresponds to the name of a preference. + * + * @type Object. + */ + service.preferences = provider.preferences; + + /** + * Persists the current values of all preferences, if possible. + */ + service.save = function save() { + localStorageService.setItem(GUAC_PREFERENCES_STORAGE_KEY, service.preferences); + }; + + // Persist settings when window is unloaded + $window.addEventListener('unload', service.save); + + // Persist settings upon navigation + $rootScope.$on('$routeChangeSuccess', function handleNavigate() { + service.save(); + }); + + // Persist settings upon logout + $rootScope.$on('guacLogout', function handleLogout() { + service.save(); + }); + + return service; + + }]; + +}]); diff --git a/guacamole/src/main/frontend/src/app/settings/settingsModule.js b/guacamole/src/main/frontend/src/app/settings/settingsModule.js new file mode 100644 index 0000000..4eeb517 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/settingsModule.js @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The module for manipulation of general settings. This is distinct from the + * "manage" module, which deals only with administrator-level system management. + */ +angular.module('settings', [ + 'groupList', + 'list', + 'navigation', + 'notification', + 'player', + 'rest', + 'storage' +]); diff --git a/guacamole/src/main/frontend/src/app/settings/styles/buttons.css b/guacamole/src/main/frontend/src/app/settings/styles/buttons.css new file mode 100644 index 0000000..294bbef --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/buttons.css @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +a.button.add-user, +a.button.add-user-group, +a.button.add-connection, +a.button.add-connection-group, +a.button.import-connections { + font-size: 0.8em; + padding-left: 1.8em; + position: relative; +} + +a.button.add-user::before, +a.button.add-user-group::before, +a.button.add-connection::before, +a.button.add-connection-group::before, +a.button.import-connections::before { + + content: ' '; + position: absolute; + width: 1.8em; + top: 0; + bottom: 0; + left: 0; + + background-repeat: no-repeat; + background-size: 1em; + background-position: 0.5em 0.45em; + +} + +a.button.add-user::before { + background-image: url('images/action-icons/guac-user-add.svg'); +} + +a.button.add-user-group::before { + background-image: url('images/action-icons/guac-user-group-add.svg'); +} + +a.button.add-connection::before { + background-image: url('images/action-icons/guac-monitor-add.svg'); +} + +a.button.add-connection-group::before { + background-image: url('images/action-icons/guac-group-add.svg'); +} + +a.button.import-connections::before { + background-image: url('images/action-icons/guac-file-import.svg'); +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/connection-list.css b/guacamole/src/main/frontend/src/app/settings/styles/connection-list.css new file mode 100644 index 0000000..efcb9dc --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/connection-list.css @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.settings.connections .connection-list .new-connection, +.settings.connections .connection-list .new-connection-group, +.settings.connections .connection-list .new-sharing-profile { + opacity: 0.5; + font-style: italic; +} + +.settings.connections .connection-list .new-connection a, +.settings.connections .connection-list .new-connection a:hover, +.settings.connections .connection-list .new-connection a:visited, +.settings.connections .connection-list .new-connection-group a, +.settings.connections .connection-list .new-connection-group a:hover, +.settings.connections .connection-list .new-connection-group a:visited, +.settings.connections .connection-list .new-sharing-profile a, +.settings.connections .connection-list .new-sharing-profile a:hover, +.settings.connections .connection-list .new-sharing-profile a:visited { + text-decoration:none; + color: black; +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/history-player.css b/guacamole/src/main/frontend/src/app/settings/styles/history-player.css new file mode 100644 index 0000000..55458dd --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/history-player.css @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * NOTE: This session recording player implementation is based on the Session + * Recording Player for Glyptodon Enterprise which is available at + * https://github.com/glyptodon/glyptodon-enterprise-player under the + * following license: + * + * Copyright (C) 2019 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +.settings.connectionHistoryPlayer { + + background: black; + color: white; + + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + padding: 0; + margin: 0; + +} + +.settings.connectionHistoryPlayer guac-player { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.settings.connectionHistoryPlayer .guac-player-help-no-recording, +.settings.connectionHistoryPlayer .guac-player-help-recording-error { + margin: 8px; + max-width: 480px; +} + +.settings.connectionHistoryPlayer .guac-player-button { + + display: inline-block; + + border: 2px solid white; + border-radius: 0; + background: black; + color: white; + font-weight: bold; + + padding: 0.5em 1em; + margin: 8px; + +} + +.settings.connectionHistoryPlayer .guac-player-controls { + padding: 0.25em; +} + +.settings.connectionHistoryPlayer .guac-player-controls { + background: rgba(0, 0, 0, 0.5); +} + +.settings.connectionHistoryPlayer .guac-player-controls { + opacity: 0; + -webkit-transition: opacity 0.25s linear 0.25s; + -moz-transition: opacity 0.25s linear 0.25s; + -o-transition: opacity 0.25s linear 0.25s; + transition: opacity 0.25s linear 0.25s; +} + +.settings.connectionHistoryPlayer .guac-player-controls:hover, +.settings.connectionHistoryPlayer guac-player.recent-mouse-movement .guac-player-controls { + opacity: 1; +} + +.settings.connectionHistoryPlayer .guac-player-controls .heat-map { + position: absolute; + width: 100%; +} + +.settings.connectionHistoryPlayer .guac-player-controls .heat-map svg { + position: absolute; + bottom: 7px; + height: 50px; + width: 100%; + z-index: 100; + pointer-events: none; + opacity: 0; + -webkit-transition: opacity 0.1s linear 0.1s; + -moz-transition: opacity 0.1s linear 0.1s; + -o-transition: opacity 0.1s linear 0.1s; + transition: opacity 0.1s linear 0.1s; +} + +.settings.connectionHistoryPlayer .guac-player-controls:hover .heat-map svg { + opacity: 1; +} + +.settings.connectionHistoryPlayer .guac-player-controls .heat-map .legend { + position: absolute; + display: flex; + flex-direction: column; + align-items: end; + bottom: 65px; + right: 10px; + z-index: 100; + background-color: rgba(0, 0, 0, 0.85); + padding-top: 3px; + padding-bottom: 3px; + padding-left: 6px; + border-radius: 5px; + opacity: 0; + -webkit-transition: opacity 0.1s linear 0.1s; + -moz-transition: opacity 0.1s linear 0.1s; + -o-transition: opacity 0.1s linear 0.1s; + transition: opacity 0.1s linear 0.1s; +} + +.settings.connectionHistoryPlayer .guac-player-controls:hover .heat-map .legend { + opacity: 1; +} + +.settings.connectionHistoryPlayer .guac-player-controls .heat-map .legend .key-events::after, +.settings.connectionHistoryPlayer .guac-player-controls .heat-map .legend .frame-events::after { + display: inline-block; + content: ''; + width: 25px; + height: 10px; + margin-left: 3px; + margin-right: 10px; + border-radius: 3px; +} + +.settings.connectionHistoryPlayer .guac-player-controls .heat-map .legend .key-events::after { + background-color: #5BA300; +} + +.settings.connectionHistoryPlayer .guac-player-controls .heat-map .legend .frame-events::after { + background-color: #888888; +} + +.settings.connectionHistoryPlayer .heat-map svg.key-events path { + + /* #5BA300 color at 50% opacity */ + fill: rgba(91, 163, 0, 0.5); +} + +.settings.connectionHistoryPlayer .heat-map svg.frame-events path { + + /* #888888 color at 75% opacity */ + fill: rgba(135, 135, 135, 0.75); +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/history.css b/guacamole/src/main/frontend/src/app/settings/styles/history.css new file mode 100644 index 0000000..d5c9dac --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/history.css @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.settings.connectionHistory .filter { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: stretch; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: stretch; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: stretch; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: stretch; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: stretch; + flex-direction: row; + +} + +.settings.connectionHistory .filter .search-string { + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; +} + +.settings.connectionHistory .filter .search-button, +.settings.connectionHistory .filter button { + + -ms-flex: 0 0 auto; + -moz-box-flex: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; + + margin-top: 0; + margin-bottom: 0; + +} + +.settings.connectionHistory .history-list { + width: 100%; +} + +.settings.connectionHistory a.history-session-recording { + color: #0000ee; +} + +.settings.connectionHistory a.history-session-recording::after { + display: inline-block; + content: ' '; + width: 1em; + height: 1em; + background-size: contain; + background-position: center; + background-repeat: no-repeat; + background-image: url('images/action-icons/guac-play-link.svg'); + vertical-align: middle; +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/input-method.css b/guacamole/src/main/frontend/src/app/settings/styles/input-method.css new file mode 100644 index 0000000..8fe6b6a --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/input-method.css @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.preferences .input-method .caption { + margin-left: 2em; + margin-right: 2em; +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/mouse-mode.css b/guacamole/src/main/frontend/src/app/settings/styles/mouse-mode.css new file mode 100644 index 0000000..7cbb21d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/mouse-mode.css @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.preferences .mouse-mode .choices { + text-align: center; +} + +.preferences .mouse-mode .choice { + display: inline-block; +} + +.preferences .mouse-mode .choice .figure { + display: inline-block; + vertical-align: middle; + width: 75%; + max-width: 320px; +} + +.preferences .mouse-mode .figure img { + display: block; + width: 100%; + max-width: 320px; + margin: 1em auto; +} + +.preferences .mouse-mode .caption { + text-align: left; +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/preferences.css b/guacamole/src/main/frontend/src/app/settings/styles/preferences.css new file mode 100644 index 0000000..dbb2330 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/preferences.css @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.preferences .form .fields { + display: table; + padding-left: 0.5em; + border-left: 3px solid rgba(0,0,0,0.125); +} + +.preferences .form .fields .labeled-field { + display: table-row; +} + +.preferences .form .fields .field-header, +.preferences .form .fields .form-field { + display: table-cell; + padding: 0.125em; + vertical-align: top; +} + +.preferences .form .fields .field-header { + padding-right: 1em; +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/sessions.css b/guacamole/src/main/frontend/src/app/settings/styles/sessions.css new file mode 100644 index 0000000..3ff22be --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/sessions.css @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.settings table.session-list { + width: 100%; +} + +.settings table.session-list tr.session:hover { + background: #CDA; +} + +.settings table.session-list .select-session { + min-width: 2em; + text-align: center; +} diff --git a/guacamole/src/main/frontend/src/app/settings/styles/settings.css b/guacamole/src/main/frontend/src/app/settings/styles/settings.css new file mode 100644 index 0000000..390a793 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/settings.css @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.settings table.properties th { + text-align: left; + font-weight: normal; + padding-right: 1em; +} + +.settings .action-buttons { + text-align: center; + margin: 1em 0; +} + +.settings .toolbar { + + /* IE10 */ + display: -ms-flexbox; + -ms-flex-align: center; + -ms-flex-direction: row; + + /* Ancient Mozilla */ + display: -moz-box; + -moz-box-align: center; + -moz-box-orient: horizontal; + + /* Ancient WebKit */ + display: -webkit-box; + -webkit-box-align: center; + -webkit-box-orient: horizontal; + + /* Old WebKit */ + display: -webkit-flex; + -webkit-align-items: center; + -webkit-flex-direction: row; + + /* W3C */ + display: flex; + align-items: center; + flex-direction: row; + +} + +.settings .toolbar .action-buttons { + margin-right: 0.25em; +} + +.settings .toolbar .filter { + -ms-flex: 1 1 auto; + -moz-box-flex: 1; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; +} + diff --git a/guacamole/src/main/frontend/src/app/settings/styles/user-group-list.css b/guacamole/src/main/frontend/src/app/settings/styles/user-group-list.css new file mode 100644 index 0000000..6f29de7 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/user-group-list.css @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.settings.user-groups table.user-group-list { + width: 100%; +} + +.settings.user-groups table.user-group-list th.user-group-name, +.settings.user-groups table.user-group-list td.user-group-name { + width: 100%; +} + +.settings.user-groups table.user-group-list tr.user-group td.user-group-name a[href] { + display: block; + padding: .5em 1em; +} + +.settings.user-groups table.user-group-list tr.user-group.disabled, +.settings.user-groups table.user-group-list tr.user-group.disabled td.user-group-name a[href] { + color: gray; + font-style: italic; +} + +.settings.user-groups table.user-group-list tr.user-group td.user-group-name { + padding: 0; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/settings/styles/user-list.css b/guacamole/src/main/frontend/src/app/settings/styles/user-list.css new file mode 100644 index 0000000..e9631a9 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/styles/user-list.css @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.settings.users table.user-list { + width: 100%; +} + +.settings.users table.user-list th.last-active, +.settings.users table.user-list td.last-active { + white-space: nowrap; +} + +.settings.users table.user-list th, +.settings.users table.user-list td { + width: 25%; +} + +.settings.users table.user-list tr.user td.username a[href] { + display: block; + padding: .5em 1em; +} + +.settings.users table.user-list tr.user.disabled, +.settings.users table.user-list tr.user.disabled td.username a[href] { + color: gray; + font-style: italic; +} + +.settings.users table.user-list tr.user td.username { + padding: 0; +} \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/settings/templates/connection.html b/guacamole/src/main/frontend/src/app/settings/templates/connection.html new file mode 100644 index 0000000..ecf5e8e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/connection.html @@ -0,0 +1,16 @@ + + + +
      + + + {{item.name}} + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/templates/connectionGroup.html b/guacamole/src/main/frontend/src/app/settings/templates/connectionGroup.html new file mode 100644 index 0000000..79e3792 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/connectionGroup.html @@ -0,0 +1,10 @@ + + + +
      + + + {{item.name}} + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/templates/newConnection.html b/guacamole/src/main/frontend/src/app/settings/templates/newConnection.html new file mode 100644 index 0000000..d5d8201 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/newConnection.html @@ -0,0 +1,4 @@ + + {{'SETTINGS_CONNECTIONS.ACTION_NEW_CONNECTION' | translate}} + diff --git a/guacamole/src/main/frontend/src/app/settings/templates/newConnectionGroup.html b/guacamole/src/main/frontend/src/app/settings/templates/newConnectionGroup.html new file mode 100644 index 0000000..bd9735c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/newConnectionGroup.html @@ -0,0 +1,4 @@ + + {{'SETTINGS_CONNECTIONS.ACTION_NEW_CONNECTION_GROUP' | translate}} + diff --git a/guacamole/src/main/frontend/src/app/settings/templates/newSharingProfile.html b/guacamole/src/main/frontend/src/app/settings/templates/newSharingProfile.html new file mode 100644 index 0000000..ef0f8ca --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/newSharingProfile.html @@ -0,0 +1,4 @@ + + {{'SETTINGS_CONNECTIONS.ACTION_NEW_SHARING_PROFILE' | translate}} + diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settings.html b/guacamole/src/main/frontend/src/app/settings/templates/settings.html new file mode 100644 index 0000000..c0986ff --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settings.html @@ -0,0 +1,21 @@ +
      + +
      +

      {{'SETTINGS.SECTION_HEADER_SETTINGS' | translate}}

      + +
      + + +
      + +
      + + + + + + + + + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsConnectionHistory.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsConnectionHistory.html new file mode 100644 index 0000000..00c5c2e --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsConnectionHistory.html @@ -0,0 +1,70 @@ +
      + + +

      {{'SETTINGS_CONNECTION_HISTORY.HELP_CONNECTION_HISTORY' | translate}}

      + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + +
      + {{'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_USERNAME' | translate}} + + {{'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_STARTDATE' | translate}} + + {{'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_DURATION' | translate}} + + {{'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_CONNECTION_NAME' | translate}} + + {{'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_REMOTEHOST' | translate}} + + {{'SETTINGS_CONNECTION_HISTORY.TABLE_HEADER_SESSION_LOGS' | translate}} +
      {{historyEntryWrapper.entry.startDate | date : dateFormat}}{{historyEntryWrapper.entry.connectionName}}{{historyEntryWrapper.entry.remoteHost}} + + {{'SETTINGS_CONNECTION_HISTORY.ACTION_VIEW_RECORDING' | translate}} + +
      + + +

      + {{'SETTINGS_CONNECTION_HISTORY.INFO_NO_HISTORY' | translate}} +

      + + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsConnectionHistoryPlayer.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsConnectionHistoryPlayer.html new file mode 100644 index 0000000..d986864 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsConnectionHistoryPlayer.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsConnections.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsConnections.html new file mode 100644 index 0000000..20f0f82 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsConnections.html @@ -0,0 +1,53 @@ + diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsPreferences.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsPreferences.html new file mode 100644 index 0000000..bf96842 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsPreferences.html @@ -0,0 +1,119 @@ +
      + + +
      +

      {{'SETTINGS_PREFERENCES.HELP_LOCALE' | translate}}

      + +
      + + +

      {{'SETTINGS_PREFERENCES.SECTION_HEADER_APPEARANCE' | translate}}

      +
      +

      {{'SETTINGS_PREFERENCES.HELP_APPEARANCE' | translate}}

      +
      + + + + + + + + + +
      {{'SETTINGS_PREFERENCES.FIELD_HEADER_SHOW_RECENT_CONNECTIONS' | translate}}
      {{'SETTINGS_PREFERENCES.FIELD_HEADER_NUMBER_RECENT_CONNECTIONS' | translate}}
      +
      +
      + + +

      {{'SETTINGS_PREFERENCES.SECTION_HEADER_UPDATE_PASSWORD' | translate}}

      +
      +

      {{'SETTINGS_PREFERENCES.HELP_UPDATE_PASSWORD' | translate}}

      + + +
      + + + + + + + + + + + + + +
      {{'SETTINGS_PREFERENCES.FIELD_HEADER_PASSWORD_OLD' | translate}}
      {{'SETTINGS_PREFERENCES.FIELD_HEADER_PASSWORD_NEW' | translate}}
      {{'SETTINGS_PREFERENCES.FIELD_HEADER_PASSWORD_NEW_AGAIN' | translate}}
      +
      + + +
      + +
      +
      + + +

      {{'SETTINGS_PREFERENCES.SECTION_HEADER_DEFAULT_INPUT_METHOD' | translate}}

      +
      +

      {{'SETTINGS_PREFERENCES.HELP_DEFAULT_INPUT_METHOD' | translate}}

      +
      + + +
      + +

      +
      + + +
      + +

      +
      + + +
      + +

      +
      + +
      +
      + + +

      {{'SETTINGS_PREFERENCES.SECTION_HEADER_DEFAULT_MOUSE_MODE' | translate}}

      +
      +

      {{'SETTINGS_PREFERENCES.HELP_DEFAULT_MOUSE_MODE' | translate}}

      +
      + + +
      + +
      + +

      +
      +
      + + +
      + +
      + +

      +
      +
      + +
      +
      + + +
      + + + + +
      + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsSessions.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsSessions.html new file mode 100644 index 0000000..a2cd9b3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsSessions.html @@ -0,0 +1,58 @@ +
      + + +

      {{'SETTINGS_SESSIONS.HELP_SESSIONS' | translate}}

      + + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      + {{'SETTINGS_SESSIONS.TABLE_HEADER_SESSION_USERNAME' | translate}} + + {{'SETTINGS_SESSIONS.TABLE_HEADER_SESSION_STARTDATE' | translate}} + + {{'SETTINGS_SESSIONS.TABLE_HEADER_SESSION_REMOTEHOST' | translate}} + + {{'SETTINGS_SESSIONS.TABLE_HEADER_SESSION_CONNECTION_NAME' | translate}} +
      + + {{wrapper.startDate}}{{wrapper.activeConnection.remoteHost}}{{wrapper.name}}
      + + +

      + {{'SETTINGS_SESSIONS.INFO_NO_SESSIONS' | translate}} +

      + + + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsUserGroups.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsUserGroups.html new file mode 100644 index 0000000..4e7cd4c --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsUserGroups.html @@ -0,0 +1,48 @@ +
      + + +

      {{'SETTINGS_USER_GROUPS.HELP_USER_GROUPS' | translate}}

      + + + + + + + + + + + + + + + + + +
      + {{'SETTINGS_USER_GROUPS.TABLE_HEADER_USER_GROUP_NAME' | translate}} +
      + +
      + {{manageableUserGroup.userGroup.identifier}} +
      +
      + + + + +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/settings/templates/settingsUsers.html b/guacamole/src/main/frontend/src/app/settings/templates/settingsUsers.html new file mode 100644 index 0000000..4a178fe --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/settingsUsers.html @@ -0,0 +1,60 @@ +
      + + +

      {{'SETTINGS_USERS.HELP_USERS' | translate}}

      + + + + + + + + + + + + + + + + + + + + + + + +
      + {{'SETTINGS_USERS.TABLE_HEADER_USERNAME' | translate}} + + {{'SETTINGS_USERS.TABLE_HEADER_ORGANIZATION' | translate}} + + {{'SETTINGS_USERS.TABLE_HEADER_FULL_NAME' | translate}} + + {{'SETTINGS_USERS.TABLE_HEADER_LAST_ACTIVE' | translate}} +
      + +
      + {{manageableUser.user.username}} +
      +
      {{manageableUser.user.attributes['guac-organization']}}{{manageableUser.user.attributes['guac-full-name']}}{{manageableUser.user.lastActive | date : dateFormat}}
      + + + + +
      \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/settings/templates/sharingProfile.html b/guacamole/src/main/frontend/src/app/settings/templates/sharingProfile.html new file mode 100644 index 0000000..6c8ae4d --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/templates/sharingProfile.html @@ -0,0 +1,10 @@ + + + +
      + + + {{item.name}} + +
      diff --git a/guacamole/src/main/frontend/src/app/settings/types/ActiveConnectionWrapper.js b/guacamole/src/main/frontend/src/app/settings/types/ActiveConnectionWrapper.js new file mode 100644 index 0000000..18e9032 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/types/ActiveConnectionWrapper.js @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the ActiveConnectionWrapper class. + */ +angular.module('settings').factory('ActiveConnectionWrapper', [ + function defineActiveConnectionWrapper() { + + /** + * Wrapper for ActiveConnection which adds display-specific + * properties, such as a checked option. + * + * @constructor + * @param {ActiveConnectionWrapper|Object} template + * The object whose properties should be copied within the new + * ActiveConnectionWrapper. + */ + var ActiveConnectionWrapper = function ActiveConnectionWrapper(template) { + + /** + * The identifier of the data source associated with the + * ActiveConnection wrapped by this ActiveConnectionWrapper. + * + * @type String + */ + this.dataSource = template.dataSource; + + /** + * The display name of this connection. + * + * @type String + */ + this.name = template.name; + + /** + * The date and time this session began, pre-formatted for display. + * + * @type String + */ + this.startDate = template.startDate; + + /** + * The wrapped ActiveConnection. + * + * @type ActiveConnection + */ + this.activeConnection = template.activeConnection; + + /** + * A flag indicating that the active connection has been selected. + * + * @type Boolean + */ + this.checked = template.checked || false; + + }; + + return ActiveConnectionWrapper; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/app/settings/types/ConnectionHistoryEntryWrapper.js b/guacamole/src/main/frontend/src/app/settings/types/ConnectionHistoryEntryWrapper.js new file mode 100644 index 0000000..e7db412 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/settings/types/ConnectionHistoryEntryWrapper.js @@ -0,0 +1,149 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A service for defining the ConnectionHistoryEntryWrapper class. + */ +angular.module('settings').factory('ConnectionHistoryEntryWrapper', ['$injector', + function defineConnectionHistoryEntryWrapper($injector) { + + // Required types + const ActivityLog = $injector.get('ActivityLog'); + const ConnectionHistoryEntry = $injector.get('ConnectionHistoryEntry'); + + // Required services + const $translate = $injector.get('$translate'); + + /** + * Wrapper for ConnectionHistoryEntry which adds display-specific + * properties, such as a duration. + * + * @constructor + * @param {ConnectionHistoryEntry} historyEntry + * The ConnectionHistoryEntry that should be wrapped. + */ + const ConnectionHistoryEntryWrapper = function ConnectionHistoryEntryWrapper(dataSource, historyEntry) { + + /** + * The wrapped ConnectionHistoryEntry. + * + * @type ConnectionHistoryEntry + */ + this.entry = historyEntry; + + /** + * The total amount of time the connection associated with the wrapped + * history record was open, in seconds. + * + * @type Number + */ + this.duration = historyEntry.endDate - historyEntry.startDate; + + /** + * An object providing value and unit properties, denoting the duration + * and its corresponding units. + * + * @type ConnectionHistoryEntry.Duration + */ + this.readableDuration = null; + + // Set the duration if the necessary information is present + if (historyEntry.endDate && historyEntry.startDate) + this.readableDuration = new ConnectionHistoryEntry.Duration(this.duration); + + /** + * The string to display as the duration of this history entry. If a + * duration is available, its value and unit will be exposed to any + * given translation string as the VALUE and UNIT substitution + * variables respectively. + * + * @type String + */ + this.readableDurationText = 'SETTINGS_CONNECTION_HISTORY.TEXT_HISTORY_DURATION'; + + // Inform user if end date is not known + if (!historyEntry.endDate) + this.readableDurationText = 'SETTINGS_CONNECTION_HISTORY.INFO_CONNECTION_DURATION_UNKNOWN'; + + /** + * The graphical session recording associated with this history entry, + * if any. If no session recordings are associated with the entry, this + * will be null. If there are multiple session recordings, this will be + * the first such recording. + * + * @type {ConnectionHistoryEntryWrapper.Log} + */ + this.sessionRecording = (function getSessionRecording() { + + var identifier = historyEntry.identifier; + if (!identifier) + return null; + + var name = _.findKey(historyEntry.logs, log => log.type === ActivityLog.Type.GUACAMOLE_SESSION_RECORDING); + if (!name) + return null; + + var log = historyEntry.logs[name]; + return new ConnectionHistoryEntryWrapper.Log({ + + url : '#/settings/' + encodeURIComponent(dataSource) + + '/recording/' + encodeURIComponent(identifier) + + '/' + encodeURIComponent(name), + + description : $translate(log.description.key, log.description.variables) + + }); + + })(); + + }; + + /** + * Representation of the ActivityLog of a ConnectionHistoryEntry which adds + * display-specific properties, such as a URL for viewing the log. + * + * @param {ConnectionHistoryEntryWrapper.Log|Object} [template={}] + * The object whose properties should be copied within the new + * ConnectionHistoryEntryWrapper.Log. + */ + ConnectionHistoryEntryWrapper.Log = function Log(template) { + + // Use empty object by default + template = template || {}; + + /** + * The relative URL for a session recording player that loads the + * session recording represented by this log. + * + * @type {!string} + */ + this.url = template.url; + + /** + * A promise that resolves with a human-readable description of the log. + * + * @type {!Promise.} + */ + this.description = template.description; + + }; + + return ConnectionHistoryEntryWrapper; + +}]); diff --git a/guacamole/src/main/frontend/src/app/storage/services/localStorageService.js b/guacamole/src/main/frontend/src/app/storage/services/localStorageService.js new file mode 100644 index 0000000..a8c6846 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/storage/services/localStorageService.js @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service for setting, removing, and retrieving localStorage keys. If access + * to localStorage is disabled, or the browser does not support localStorage, + * key values are temporarily stored in memory instead. If necessary, the same + * functionality is also available at the localStorageServiceProvider level. + */ +angular.module('storage').provider('localStorageService', [function localStorageServiceProvider() { + + /** + * Reference to this provider. + * + * @type localStorageServiceProvider + */ + var provider = this; + + /** + * Internal cache of key/value pairs stored within localStorage, updated + * lazily as keys are retrieved, updated, or removed. If localStorage is + * not actually available, then this cache will be the sole storage + * location for these key/value pairs. + * + * @type Object. + */ + var storedItems = {}; + + /** + * Stores the given value within localStorage under the given key. If access + * to localStorage is not provided/implemented by the browser, the key/value + * pair will be stored internally (in memory) only, with the stored value + * remaining retrievable via getItem() until the browser tab/window is + * closed. + * + * @param {String} key + * The arbitrary, unique key under which the value should be stored. + * + * @param {Object} value + * The object to store under the given key. This may be any object that + * can be serialized as JSON, and will automatically be serialized as + * JSON prior to storage. + */ + provider.setItem = function setItem(key, value) { + + // Store given value internally + var data = JSON.stringify(value); + storedItems[key] = data; + + // Additionally store value within localStorage if allowed + try { + if (window.localStorage) + localStorage.setItem(key, data); + } + catch (ignore) {} + + }; + + /** + * Removes the item having the given key from localStorage. If access to + * localStorage is not provided/implemented by the browser, the item is + * removed solely from internal, in-memory storage. If no such item exists, + * this function has no effect. + * + * @param {String} key + * The arbitrary, unique key of the item to remove from localStorage. + */ + provider.removeItem = function removeItem(key) { + + // Evict key from internal storage + delete storedItems[key]; + + // Remove key from localStorage if allowed + try { + if (window.localStorage) + localStorage.removeItem(key); + } + catch (ignore) {} + + }; + + /** + * Retrieves the value currently stored within localStorage for the item + * having the given key. If access to localStorage is not + * provided/implemented by the browser, the item is retrieved from + * internal, in-memory storage. The retrieved value is automatically + * deserialized from JSON prior to being returned. + * + * @param {String} key + * The arbitrary, unique key of the item to retrieve from localStorage. + * + * @returns {Object} + * The value stored within localStorage under the given key, + * automatically deserialized from JSON, or null if no such item is + * present. + */ + provider.getItem = function getItem(key) { + + // Attempt to refresh internal storage from localStorage + try { + if (window.localStorage) + storedItems[key] = localStorage.getItem(key); + } + catch (ignore) {} + + // Pull and parse value from internal storage, if present + var data = storedItems[key]; + if (data) + return JSON.parse(data); + + // No value defined for given key + return null; + + }; + + // Factory method required by provider + this.$get = ['$injector', function localStorageServiceFactory($injector) { + + // Pass through all get/set/remove calls to the provider + // implementations of the same + return { + setItem : provider.setItem, + removeItem : provider.removeItem, + getItem : provider.getItem + }; + + }]; + +}]); diff --git a/guacamole/src/main/frontend/src/app/storage/services/sessionStorageFactory.js b/guacamole/src/main/frontend/src/app/storage/services/sessionStorageFactory.js new file mode 100644 index 0000000..da53cdf --- /dev/null +++ b/guacamole/src/main/frontend/src/app/storage/services/sessionStorageFactory.js @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Factory for session-local storage. Creating session-local storage creates a + * getter/setter with semantics tied to the user's session. If a user is logged + * in, the storage is consistent. If the user logs out, the storage will not + * persist new values, and attempts to retrieve the existing value will result + * only in the default value. + */ +angular.module('storage').factory('sessionStorageFactory', ['$injector', function sessionStorageFactory($injector) { + + // Required services + var $rootScope = $injector.get('$rootScope'); + var authenticationService = $injector.get('authenticationService'); + + var service = {}; + + /** + * Creates session-local storage that uses the provided default value or + * getter to obtain new values as necessary. Beware that if the default is + * an object, the resulting getter provide deep copies for new values. + * + * @param {Function|*} [template] + * The default value for new users, or a getter which returns a newly- + * created default value. + * + * @param {Function} [destructor] + * Function which will be called just before the stored value is + * destroyed on logout, if a value is stored. + * + * @returns {Function} + * A getter/setter which returns or sets the current value of the new + * session-local storage. Newly-set values will only persist of the + * user is actually logged in. + */ + service.create = function create(template, destructor) { + + /** + * Whether new values may be stored and retrieved. + * + * @type Boolean + */ + var enabled = !!authenticationService.getCurrentToken(); + + /** + * Getter which returns the default value for this storage. + * + * @type Function + */ + var getter; + + // If getter provided, use that + if (typeof template === 'function') + getter = template; + + // Otherwise, create and maintain a deep copy (automatically cached to + // avoid "infdig" errors) + else { + var cached = angular.copy(template); + getter = function getIndependentCopy() { + + // Reset to template only if changed externally, such that + // session storage values can be safely used in scope watches + // even if not logged in + if (!_.isEqual(cached, template)) + cached = angular.copy(template); + + return cached; + + }; + } + + /** + * The current value of this storage, or undefined if not yet set. + */ + var value = undefined; + + // Reset value and allow storage when the user is logged in + $rootScope.$on('guacLogin', function userLoggedIn() { + enabled = true; + value = undefined; + }); + + // Reset value and disallow storage when the user is logged out + $rootScope.$on('guacLogout', function userLoggedOut() { + + // Call destructor before storage is teared down + if (angular.isDefined(value) && destructor) + destructor(value); + + // Destroy storage + enabled = false; + value = undefined; + + }); + + // Return getter/setter for value + return function sessionLocalGetterSetter(newValue) { + + // Only actually store/retrieve values if enabled + if (enabled) { + + // Set value if provided + if (angular.isDefined(newValue)) + value = newValue; + + // Obtain new value if unset + if (!angular.isDefined(value)) + value = getter(); + + // Return current value + return value; + + } + + // Otherwise, just pretend to store/retrieve + return angular.isDefined(newValue) ? newValue : getter(); + + }; + + }; + + return service; + +}]); diff --git a/guacamole/src/main/frontend/src/app/storage/storageModule.js b/guacamole/src/main/frontend/src/app/storage/storageModule.js new file mode 100644 index 0000000..219ffe0 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/storage/storageModule.js @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module which provides generic storage services. + */ +angular.module('storage', [ + 'auth' +]); diff --git a/guacamole/src/main/frontend/src/app/textInput/directives/guacKey.js b/guacamole/src/main/frontend/src/app/textInput/directives/guacKey.js new file mode 100644 index 0000000..45fa4b3 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/textInput/directives/guacKey.js @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays a button that controls the pressed state of a + * single keyboard key. + */ +angular.module('textInput').directive('guacKey', [function guacKey() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The text to display within the key. This will be run through the + * translation filter prior to display. + * + * @type String + */ + text : '=', + + /** + * The keysym to send within keyup and keydown events when this key + * is pressed or released. + * + * @type Number + */ + keysym : '=', + + /** + * Whether this key is sticky. Sticky keys toggle their pressed + * state with each click. + * + * @type Boolean + * @default false + */ + sticky : '=?', + + /** + * Whether this key is currently pressed. + * + * @type Boolean + * @default false + */ + pressed : '=?' + + }, + + templateUrl: 'app/textInput/templates/guacKey.html', + controller: ['$scope', '$rootScope', + function guacKey($scope, $rootScope) { + + // Not sticky by default + $scope.sticky = $scope.sticky || false; + + // Unpressed by default + $scope.pressed = $scope.pressed || false; + + /** + * Presses and releases this key, sending the corresponding keydown + * and keyup events. In the case of sticky keys, the pressed state + * is toggled, and only a single keydown/keyup event will be sent, + * depending on the current state. + * + * @param {MouseEvent} event + * The mouse event which resulted in this function being + * invoked. + */ + $scope.updateKey = function updateKey(event) { + + // If sticky, toggle pressed state + if ($scope.sticky) + $scope.pressed = !$scope.pressed; + + // For all non-sticky keys, press and release key immediately + else { + $rootScope.$broadcast('guacSyntheticKeydown', $scope.keysym); + $rootScope.$broadcast('guacSyntheticKeyup', $scope.keysym); + } + + // Prevent loss of focus due to interaction with buttons + event.preventDefault(); + + }; + + // Send keyup/keydown when pressed state is altered + $scope.$watch('pressed', function updatePressedState(isPressed, wasPressed) { + + // If the key is pressed now, send keydown + if (isPressed) + $rootScope.$broadcast('guacSyntheticKeydown', $scope.keysym); + + // If the key was pressed, but is not pressed any longer, send keyup + else if (wasPressed) + $rootScope.$broadcast('guacSyntheticKeyup', $scope.keysym); + + }); + + }] + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/textInput/directives/guacTextInput.js b/guacamole/src/main/frontend/src/app/textInput/directives/guacTextInput.js new file mode 100644 index 0000000..c1a4677 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/textInput/directives/guacTextInput.js @@ -0,0 +1,341 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which displays the Guacamole text input method. + */ +angular.module('textInput').directive('guacTextInput', [function guacTextInput() { + + return { + restrict: 'E', + replace: true, + scope: {}, + + templateUrl: 'app/textInput/templates/guacTextInput.html', + controller: ['$scope', '$rootScope', '$element', '$timeout', + function guacTextInput($scope, $rootScope, $element, $timeout) { + + /** + * The number of characters to include on either side of text input + * content, to allow the user room to use backspace and delete. + * + * @type Number + */ + var TEXT_INPUT_PADDING = 4; + + /** + * The Unicode codepoint of the character to use for padding on + * either side of text input content. + * + * @type Number + */ + var TEXT_INPUT_PADDING_CODEPOINT = 0x200B; + + /** + * Keys which should be allowed through to the client when in text + * input mode, providing corresponding key events are received. + * Keys in this set will be allowed through to the server. + * + * @type Object. + */ + var ALLOWED_KEYS = { + 0xFE03: true, /* AltGr */ + 0xFF08: true, /* Backspace */ + 0xFF09: true, /* Tab */ + 0xFF0D: true, /* Enter */ + 0xFF1B: true, /* Escape */ + 0xFF50: true, /* Home */ + 0xFF51: true, /* Left */ + 0xFF52: true, /* Up */ + 0xFF53: true, /* Right */ + 0xFF54: true, /* Down */ + 0xFF57: true, /* End */ + 0xFF64: true, /* Insert */ + 0xFFBE: true, /* F1 */ + 0xFFBF: true, /* F2 */ + 0xFFC0: true, /* F3 */ + 0xFFC1: true, /* F4 */ + 0xFFC2: true, /* F5 */ + 0xFFC3: true, /* F6 */ + 0xFFC4: true, /* F7 */ + 0xFFC5: true, /* F8 */ + 0xFFC6: true, /* F9 */ + 0xFFC7: true, /* F10 */ + 0xFFC8: true, /* F11 */ + 0xFFC9: true, /* F12 */ + 0xFFE1: true, /* Left shift */ + 0xFFE2: true, /* Right shift */ + 0xFFE3: true, /* Left ctrl */ + 0xFFE4: true, /* Right ctrl */ + 0xFFE9: true, /* Left alt */ + 0xFFEA: true, /* Right alt */ + 0xFFFF: true /* Delete */ + }; + + /** + * Recently-sent text, ordered from oldest to most recent. + * + * @type String[] + */ + $scope.sentText = []; + + /** + * Whether the "Alt" key is currently pressed within the text input + * interface. + * + * @type Boolean + */ + $scope.altPressed = false; + + /** + * Whether the "Ctrl" key is currently pressed within the text + * input interface. + * + * @type Boolean + */ + $scope.ctrlPressed = false; + + /** + * The text area input target. + * + * @type Element + */ + var target = $element.find('.target')[0]; + + /** + * Whether the text input target currently has focus. Setting this + * attribute has no effect, but any bound property will be updated + * as focus is gained or lost. + * + * @type Boolean + */ + var hasFocus = false; + + target.onfocus = function targetFocusGained() { + hasFocus = true; + resetTextInputTarget(TEXT_INPUT_PADDING); + }; + + target.onblur = function targetFocusLost() { + hasFocus = false; + }; + + /** + * Whether composition is currently active within the text input + * target element, such as when an IME is in use. + * + * @type Boolean + */ + var composingText = false; + + target.addEventListener("compositionstart", function targetComposeStart(e) { + composingText = true; + }, false); + + target.addEventListener("compositionend", function targetComposeEnd(e) { + composingText = false; + }, false); + + /** + * Translates a given Unicode codepoint into the corresponding X11 + * keysym. + * + * @param {Number} codepoint + * The Unicode codepoint to translate. + * + * @returns {Number} + * The X11 keysym that corresponds to the given Unicode + * codepoint, or null if no such keysym exists. + */ + var keysymFromCodepoint = function keysymFromCodepoint(codepoint) { + + // Keysyms for control characters + if (codepoint <= 0x1F || (codepoint >= 0x7F && codepoint <= 0x9F)) + return 0xFF00 | codepoint; + + // Keysyms for ASCII chars + if (codepoint >= 0x0000 && codepoint <= 0x00FF) + return codepoint; + + // Keysyms for Unicode + if (codepoint >= 0x0100 && codepoint <= 0x10FFFF) + return 0x01000000 | codepoint; + + return null; + + }; + + /** + * Presses and releases the key corresponding to the given keysym, + * as if typed by the user. + * + * @param {Number} keysym The keysym of the key to send. + */ + var sendKeysym = function sendKeysym(keysym) { + $rootScope.$broadcast('guacSyntheticKeydown', keysym); + $rootScope.$broadcast('guacSyntheticKeyup', keysym); + }; + + /** + * Presses and releases the key having the keysym corresponding to + * the Unicode codepoint given, as if typed by the user. + * + * @param {Number} codepoint + * The Unicode codepoint of the key to send. + */ + var sendCodepoint = function sendCodepoint(codepoint) { + + if (codepoint === 10) { + sendKeysym(0xFF0D); + releaseStickyKeys(); + return; + } + + var keysym = keysymFromCodepoint(codepoint); + if (keysym) { + sendKeysym(keysym); + releaseStickyKeys(); + } + + }; + + /** + * Translates each character within the given string to keysyms and + * sends each, in order, as if typed by the user. + * + * @param {String} content + * The string to send. + */ + var sendString = function sendString(content) { + + var sentText = ""; + + // Send each codepoint within the string + for (var i=0; i + {{text | translate}} + diff --git a/guacamole/src/main/frontend/src/app/textInput/templates/guacTextInput.html b/guacamole/src/main/frontend/src/app/textInput/templates/guacTextInput.html new file mode 100644 index 0000000..7b8b728 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/textInput/templates/guacTextInput.html @@ -0,0 +1,6 @@ +
      + + +
      {{text}}
      + +
      diff --git a/guacamole/src/main/frontend/src/app/textInput/textInputModule.js b/guacamole/src/main/frontend/src/app/textInput/textInputModule.js new file mode 100644 index 0000000..7fd3445 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/textInput/textInputModule.js @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for displaying the Guacamole text input method. + */ +angular.module('textInput', []); diff --git a/guacamole/src/main/frontend/src/app/touch/directives/guacTouchDrag.js b/guacamole/src/main/frontend/src/app/touch/directives/guacTouchDrag.js new file mode 100644 index 0000000..79ffd93 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/touch/directives/guacTouchDrag.js @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which allows handling of drag gestures on a particular element. + */ +angular.module('touch').directive('guacTouchDrag', [function guacTouchDrag() { + + return { + restrict: 'A', + + link: function linkGuacTouchDrag($scope, $element, $attrs) { + + /** + * Called during a drag gesture as the user's finger is placed upon + * the element, moves, and is lifted from the element. + * + * @event + * @param {Boolean} inProgress + * Whether the gesture is currently in progress. This will + * always be true except when the gesture has ended, at which + * point one final call will occur with this parameter set to + * false. + * + * @param {Number} startX + * The X location at which the drag gesture began. + * + * @param {Number} startY + * The Y location at which the drag gesture began. + * + * @param {Number} currentX + * The current X location of the user's finger. + * + * @param {Number} currentY + * The current Y location of the user's finger. + * + * @param {Number} deltaX + * The difference in X location relative to the start of the + * gesture. + * + * @param {Number} deltaY + * The difference in Y location relative to the start of the + * gesture. + * + * @return {Boolean} + * false if the default action of the touch event should be + * prevented, any other value otherwise. + */ + var guacTouchDrag = $scope.$eval($attrs.guacTouchDrag); + + /** + * The element which will register the drag gesture. + * + * @type Element + */ + var element = $element[0]; + + /** + * Whether a drag gesture is in progress. + * + * @type Boolean + */ + var inProgress = false; + + /** + * The starting X location of the drag gesture. + * + * @type Number + */ + var startX = null; + + /** + * The starting Y location of the drag gesture. + * + * @type Number + */ + var startY = null; + + /** + * The current X location of the drag gesture. + * + * @type Number + */ + var currentX = null; + + /** + * The current Y location of the drag gesture. + * + * @type Number + */ + var currentY = null; + + /** + * The change in X relative to drag start. + * + * @type Number + */ + var deltaX = 0; + + /** + * The change in X relative to drag start. + * + * @type Number + */ + var deltaY = 0; + + // When there is exactly one touch, monitor the change in location + element.addEventListener("touchmove", function dragTouchMove(e) { + if (e.touches.length === 1) { + + // Get touch location + var x = e.touches[0].clientX; + var y = e.touches[0].clientY; + + // Init start location and deltas if gesture is starting + if (!startX || !startY) { + startX = currentX = x; + startY = currentY = y; + deltaX = 0; + deltaY = 0; + inProgress = true; + } + + // Update deltas if gesture is in progress + else if (inProgress) { + deltaX = x - currentX; + deltaY = y - currentY; + currentX = x; + currentY = y; + } + + // Signal start/change in drag gesture + if (inProgress && guacTouchDrag) { + $scope.$apply(function dragChanged() { + if (guacTouchDrag(true, startX, startY, currentX, currentY, deltaX, deltaY) === false) + e.preventDefault(); + }); + } + + } + }, false); + + // Reset monitoring and fire end event when done + element.addEventListener("touchend", function dragTouchEnd(e) { + + if (startX && startY && e.touches.length === 0) { + + // Signal end of drag gesture + if (inProgress && guacTouchDrag) { + $scope.$apply(function dragComplete() { + if (guacTouchDrag(true, startX, startY, currentX, currentY, deltaX, deltaY) === false) + e.preventDefault(); + }); + } + + startX = currentX = null; + startY = currentY = null; + deltaX = 0; + deltaY = 0; + inProgress = false; + + } + + }, false); + + } + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/touch/directives/guacTouchPinch.js b/guacamole/src/main/frontend/src/app/touch/directives/guacTouchPinch.js new file mode 100644 index 0000000..f754001 --- /dev/null +++ b/guacamole/src/main/frontend/src/app/touch/directives/guacTouchPinch.js @@ -0,0 +1,206 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A directive which allows handling of pinch gestures (pinch-to-zoom, for + * example) on a particular element. + */ +angular.module('touch').directive('guacTouchPinch', [function guacTouchPinch() { + + return { + restrict: 'A', + + link: function linkGuacTouchPinch($scope, $element, $attrs) { + + /** + * Called when a pinch gesture begins, changes, or ends. + * + * @event + * @param {Boolean} inProgress + * Whether the gesture is currently in progress. This will + * always be true except when the gesture has ended, at which + * point one final call will occur with this parameter set to + * false. + * + * @param {Number} startLength + * The initial distance between the two touches of the + * pinch gesture, in pixels. + * + * @param {Number} currentLength + * The current distance between the two touches of the + * pinch gesture, in pixels. + * + * @param {Number} centerX + * The current X coordinate of the center of the pinch gesture. + * + * @param {Number} centerY + * The current Y coordinate of the center of the pinch gesture. + * + * @return {Boolean} + * false if the default action of the touch event should be + * prevented, any other value otherwise. + */ + var guacTouchPinch = $scope.$eval($attrs.guacTouchPinch); + + /** + * The element which will register the pinch gesture. + * + * @type Element + */ + var element = $element[0]; + + /** + * The starting pinch distance, or null if the gesture has not yet + * started. + * + * @type Number + */ + var startLength = null; + + /** + * The current pinch distance, or null if the gesture has not yet + * started. + * + * @type Number + */ + var currentLength = null; + + /** + * The X coordinate of the current center of the pinch gesture. + * + * @type Number + */ + var centerX = 0; + + /** + * The Y coordinate of the current center of the pinch gesture. + * @type Number + */ + var centerY = 0; + + /** + * Given a touch event, calculates the distance between the first + * two touches in pixels. + * + * @param {TouchEvent} e + * The touch event to use when performing distance calculation. + * + * @return {Number} + * The distance in pixels between the first two touches. + */ + var pinchDistance = function pinchDistance(e) { + + var touchA = e.touches[0]; + var touchB = e.touches[1]; + + var deltaX = touchA.clientX - touchB.clientX; + var deltaY = touchA.clientY - touchB.clientY; + + return Math.sqrt(deltaX*deltaX + deltaY*deltaY); + + }; + + /** + * Given a touch event, calculates the center between the first two + * touches in pixels, returning the X coordinate of this center. + * + * @param {TouchEvent} e + * The touch event to use when performing center calculation. + * + * @return {Number} + * The X coordinate of the center of the first two touches. + */ + var pinchCenterX = function pinchCenterX(e) { + + var touchA = e.touches[0]; + var touchB = e.touches[1]; + + return (touchA.clientX + touchB.clientX) / 2; + + }; + + /** + * Given a touch event, calculates the center between the first two + * touches in pixels, returning the Y coordinate of this center. + * + * @param {TouchEvent} e + * The touch event to use when performing center calculation. + * + * @return {Number} + * The Y coordinate of the center of the first two touches. + */ + var pinchCenterY = function pinchCenterY(e) { + + var touchA = e.touches[0]; + var touchB = e.touches[1]; + + return (touchA.clientY + touchB.clientY) / 2; + + }; + + // When there are exactly two touches, monitor the distance between + // them, firing zoom events as appropriate + element.addEventListener("touchmove", function pinchTouchMove(e) { + if (e.touches.length === 2) { + + // Calculate current zoom level + currentLength = pinchDistance(e); + + // Calculate center + centerX = pinchCenterX(e); + centerY = pinchCenterY(e); + + // Init start length if pinch is not in progress + if (!startLength) + startLength = currentLength; + + // Notify of pinch status + if (guacTouchPinch) { + $scope.$apply(function pinchChanged() { + if (guacTouchPinch(true, startLength, currentLength, centerX, centerY) === false) + e.preventDefault(); + }); + } + + } + }, false); + + // Reset monitoring and fire end event when done + element.addEventListener("touchend", function pinchTouchEnd(e) { + + if (startLength && e.touches.length < 2) { + + // Notify of pinch end + if (guacTouchPinch) { + $scope.$apply(function pinchComplete() { + if (guacTouchPinch(false, startLength, currentLength, centerX, centerY) === false) + e.preventDefault(); + }); + } + + startLength = null; + + } + + }, false); + + } + + }; +}]); diff --git a/guacamole/src/main/frontend/src/app/touch/touchModule.js b/guacamole/src/main/frontend/src/app/touch/touchModule.js new file mode 100644 index 0000000..751c9ae --- /dev/null +++ b/guacamole/src/main/frontend/src/app/touch/touchModule.js @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Module for handling common touch gestures, like panning or pinch-to-zoom. + */ +angular.module('touch', []); diff --git a/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Bold.woff b/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Bold.woff new file mode 100644 index 0000000..0afd4f5 Binary files /dev/null and b/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Bold.woff differ diff --git a/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Italic.woff b/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Italic.woff new file mode 100644 index 0000000..379b053 Binary files /dev/null and b/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Italic.woff differ diff --git a/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Regular.woff b/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Regular.woff new file mode 100644 index 0000000..b824286 Binary files /dev/null and b/guacamole/src/main/frontend/src/fonts/carlito/Carlito-Regular.woff differ diff --git a/guacamole/src/main/frontend/src/fonts/carlito/LICENSE b/guacamole/src/main/frontend/src/fonts/carlito/LICENSE new file mode 100644 index 0000000..e999b31 --- /dev/null +++ b/guacamole/src/main/frontend/src/fonts/carlito/LICENSE @@ -0,0 +1,95 @@ +Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Carlito". + +This Font Software is licensed under the SIL Open Font License, +Version 1.1 as shown below. + +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. + diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-back.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-back.svg new file mode 100644 index 0000000..34261af --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-config-dark.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-config-dark.svg new file mode 100644 index 0000000..709ec0a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-config-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-config.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-config.svg new file mode 100644 index 0000000..2db45db --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-config.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-file-import.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-file-import.svg new file mode 100644 index 0000000..4b29411 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-file-import.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-first-page.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-first-page.svg new file mode 100644 index 0000000..e61faf6 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-first-page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-group-add.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-group-add.svg new file mode 100644 index 0000000..bf7a194 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-group-add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-hide-pass.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-hide-pass.svg new file mode 100644 index 0000000..d3bf3f6 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-hide-pass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-home-dark.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-home-dark.svg new file mode 100644 index 0000000..782e09e --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-home-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-home.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-home.svg new file mode 100644 index 0000000..ca1b889 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-key.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-key.svg new file mode 100644 index 0000000..fc4c8c7 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-last-page.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-last-page.svg new file mode 100644 index 0000000..541bb8d --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-last-page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-logout-dark.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-logout-dark.svg new file mode 100644 index 0000000..748dbf5 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-logout-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-logout.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-logout.svg new file mode 100644 index 0000000..52e4da1 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-monitor-add.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-monitor-add.svg new file mode 100644 index 0000000..7d32e56 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-monitor-add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-next-page.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-next-page.svg new file mode 100644 index 0000000..2fea9b2 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-next-page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-pause.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-pause.svg new file mode 100644 index 0000000..2fbb899 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-play-link.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-play-link.svg new file mode 100644 index 0000000..5c5ced8 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-play-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-play.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-play.svg new file mode 100644 index 0000000..8aa6ccb --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-prev-page.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-prev-page.svg new file mode 100644 index 0000000..d0a5d1a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-prev-page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-show-pass.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-show-pass.svg new file mode 100644 index 0000000..d4e75ee --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-show-pass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-user-add.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-user-add.svg new file mode 100644 index 0000000..b36a25a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-user-add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/action-icons/guac-user-group-add.svg b/guacamole/src/main/frontend/src/images/action-icons/guac-user-group-add.svg new file mode 100644 index 0000000..bbefb5a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/action-icons/guac-user-group-add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/arrows/down.svg b/guacamole/src/main/frontend/src/images/arrows/down.svg new file mode 100644 index 0000000..865be43 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/arrows/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/arrows/left.svg b/guacamole/src/main/frontend/src/images/arrows/left.svg new file mode 100644 index 0000000..db04c59 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/arrows/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/arrows/right.svg b/guacamole/src/main/frontend/src/images/arrows/right.svg new file mode 100644 index 0000000..d0363a5 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/arrows/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/arrows/up.svg b/guacamole/src/main/frontend/src/images/arrows/up.svg new file mode 100644 index 0000000..28dea1b --- /dev/null +++ b/guacamole/src/main/frontend/src/images/arrows/up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/checker.svg b/guacamole/src/main/frontend/src/images/checker.svg new file mode 100644 index 0000000..56edaff --- /dev/null +++ b/guacamole/src/main/frontend/src/images/checker.svg @@ -0,0 +1 @@ + diff --git a/guacamole/src/main/frontend/src/images/checkmark.svg b/guacamole/src/main/frontend/src/images/checkmark.svg new file mode 100644 index 0000000..213d2fd --- /dev/null +++ b/guacamole/src/main/frontend/src/images/checkmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/circle-arrows.svg b/guacamole/src/main/frontend/src/images/circle-arrows.svg new file mode 100644 index 0000000..f2ce7cb --- /dev/null +++ b/guacamole/src/main/frontend/src/images/circle-arrows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/cog.svg b/guacamole/src/main/frontend/src/images/cog.svg new file mode 100644 index 0000000..ad26f0a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/cog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/drive.svg b/guacamole/src/main/frontend/src/images/drive.svg new file mode 100644 index 0000000..0f58afd --- /dev/null +++ b/guacamole/src/main/frontend/src/images/drive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/file.svg b/guacamole/src/main/frontend/src/images/file.svg new file mode 100644 index 0000000..5955b59 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/folder-closed.svg b/guacamole/src/main/frontend/src/images/folder-closed.svg new file mode 100644 index 0000000..0a57100 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/folder-closed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/folder-open.svg b/guacamole/src/main/frontend/src/images/folder-open.svg new file mode 100644 index 0000000..12c0e38 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/folder-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/folder-up.svg b/guacamole/src/main/frontend/src/images/folder-up.svg new file mode 100644 index 0000000..a7bcf92 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/folder-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/fullscreen.svg b/guacamole/src/main/frontend/src/images/fullscreen.svg new file mode 100644 index 0000000..52e77e7 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/group-icons/guac-closed.svg b/guacamole/src/main/frontend/src/images/group-icons/guac-closed.svg new file mode 100644 index 0000000..b7f253c --- /dev/null +++ b/guacamole/src/main/frontend/src/images/group-icons/guac-closed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/group-icons/guac-open.svg b/guacamole/src/main/frontend/src/images/group-icons/guac-open.svg new file mode 100644 index 0000000..9af184b --- /dev/null +++ b/guacamole/src/main/frontend/src/images/group-icons/guac-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/guac-tricolor.svg b/guacamole/src/main/frontend/src/images/guac-tricolor.svg new file mode 100644 index 0000000..0242862 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/guac-tricolor.svg @@ -0,0 +1 @@ + diff --git a/guacamole/src/main/frontend/src/images/lock.svg b/guacamole/src/main/frontend/src/images/lock.svg new file mode 100644 index 0000000..f71e950 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/logo-144.png b/guacamole/src/main/frontend/src/images/logo-144.png new file mode 100644 index 0000000..e2cb830 Binary files /dev/null and b/guacamole/src/main/frontend/src/images/logo-144.png differ diff --git a/guacamole/src/main/frontend/src/images/logo-192.png b/guacamole/src/main/frontend/src/images/logo-192.png new file mode 100644 index 0000000..d5e7f6b Binary files /dev/null and b/guacamole/src/main/frontend/src/images/logo-192.png differ diff --git a/guacamole/src/main/frontend/src/images/logo-512.png b/guacamole/src/main/frontend/src/images/logo-512.png new file mode 100644 index 0000000..5fcd201 Binary files /dev/null and b/guacamole/src/main/frontend/src/images/logo-512.png differ diff --git a/guacamole/src/main/frontend/src/images/logo-64.png b/guacamole/src/main/frontend/src/images/logo-64.png new file mode 100644 index 0000000..99aaf3e Binary files /dev/null and b/guacamole/src/main/frontend/src/images/logo-64.png differ diff --git a/guacamole/src/main/frontend/src/images/logo-vector.svg b/guacamole/src/main/frontend/src/images/logo-vector.svg new file mode 100644 index 0000000..2ec0cf1 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/logo-vector.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/magnifier.svg b/guacamole/src/main/frontend/src/images/magnifier.svg new file mode 100644 index 0000000..8027668 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/magnifier.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/mouse/blank.cur b/guacamole/src/main/frontend/src/images/mouse/blank.cur new file mode 100644 index 0000000..60b635a Binary files /dev/null and b/guacamole/src/main/frontend/src/images/mouse/blank.cur differ diff --git a/guacamole/src/main/frontend/src/images/mouse/blank.gif b/guacamole/src/main/frontend/src/images/mouse/blank.gif new file mode 100644 index 0000000..ec5c17c Binary files /dev/null and b/guacamole/src/main/frontend/src/images/mouse/blank.gif differ diff --git a/guacamole/src/main/frontend/src/images/mouse/dot.gif b/guacamole/src/main/frontend/src/images/mouse/dot.gif new file mode 100644 index 0000000..9ac8a00 Binary files /dev/null and b/guacamole/src/main/frontend/src/images/mouse/dot.gif differ diff --git a/guacamole/src/main/frontend/src/images/plus.svg b/guacamole/src/main/frontend/src/images/plus.svg new file mode 100644 index 0000000..76234d2 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/progress.svg b/guacamole/src/main/frontend/src/images/progress.svg new file mode 100644 index 0000000..b401c67 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/progress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/protocol-icons/guac-monitor.svg b/guacamole/src/main/frontend/src/images/protocol-icons/guac-monitor.svg new file mode 100644 index 0000000..54b61e9 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/protocol-icons/guac-monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/protocol-icons/guac-plug.svg b/guacamole/src/main/frontend/src/images/protocol-icons/guac-plug.svg new file mode 100644 index 0000000..b546628 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/protocol-icons/guac-plug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/protocol-icons/guac-text.svg b/guacamole/src/main/frontend/src/images/protocol-icons/guac-text.svg new file mode 100644 index 0000000..323b5d5 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/protocol-icons/guac-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/question.svg b/guacamole/src/main/frontend/src/images/question.svg new file mode 100644 index 0000000..062ccfa --- /dev/null +++ b/guacamole/src/main/frontend/src/images/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/settings/tablet-keys.svg b/guacamole/src/main/frontend/src/images/settings/tablet-keys.svg new file mode 100644 index 0000000..dbec86e --- /dev/null +++ b/guacamole/src/main/frontend/src/images/settings/tablet-keys.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/settings/touchpad.svg b/guacamole/src/main/frontend/src/images/settings/touchpad.svg new file mode 100644 index 0000000..4ee1da1 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/settings/touchpad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/settings/touchscreen.svg b/guacamole/src/main/frontend/src/images/settings/touchscreen.svg new file mode 100644 index 0000000..f617206 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/settings/touchscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/settings/zoom-in.svg b/guacamole/src/main/frontend/src/images/settings/zoom-in.svg new file mode 100644 index 0000000..8b7995b --- /dev/null +++ b/guacamole/src/main/frontend/src/images/settings/zoom-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/settings/zoom-out.svg b/guacamole/src/main/frontend/src/images/settings/zoom-out.svg new file mode 100644 index 0000000..52e6a31 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/settings/zoom-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/share-white.svg b/guacamole/src/main/frontend/src/images/share-white.svg new file mode 100644 index 0000000..51c3d3f --- /dev/null +++ b/guacamole/src/main/frontend/src/images/share-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/share.svg b/guacamole/src/main/frontend/src/images/share.svg new file mode 100644 index 0000000..349f048 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/user-icons/guac-user-group.svg b/guacamole/src/main/frontend/src/images/user-icons/guac-user-group.svg new file mode 100644 index 0000000..1af99e0 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/user-icons/guac-user-group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/user-icons/guac-user-white.svg b/guacamole/src/main/frontend/src/images/user-icons/guac-user-white.svg new file mode 100644 index 0000000..e00605f --- /dev/null +++ b/guacamole/src/main/frontend/src/images/user-icons/guac-user-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/user-icons/guac-user.svg b/guacamole/src/main/frontend/src/images/user-icons/guac-user.svg new file mode 100644 index 0000000..aea331f --- /dev/null +++ b/guacamole/src/main/frontend/src/images/user-icons/guac-user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/warning-white.svg b/guacamole/src/main/frontend/src/images/warning-white.svg new file mode 100644 index 0000000..63cc03a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/warning-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/warning.svg b/guacamole/src/main/frontend/src/images/warning.svg new file mode 100644 index 0000000..d7f725c --- /dev/null +++ b/guacamole/src/main/frontend/src/images/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/x-black.svg b/guacamole/src/main/frontend/src/images/x-black.svg new file mode 100644 index 0000000..785889a --- /dev/null +++ b/guacamole/src/main/frontend/src/images/x-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/x-red.svg b/guacamole/src/main/frontend/src/images/x-red.svg new file mode 100644 index 0000000..1015164 --- /dev/null +++ b/guacamole/src/main/frontend/src/images/x-red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/images/x.svg b/guacamole/src/main/frontend/src/images/x.svg new file mode 100644 index 0000000..ed22edd --- /dev/null +++ b/guacamole/src/main/frontend/src/images/x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/guacamole/src/main/frontend/src/index.html b/guacamole/src/main/frontend/src/index.html new file mode 100644 index 0000000..7a26c12 --- /dev/null +++ b/guacamole/src/main/frontend/src/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + <% for (var index in htmlWebpackPlugin.files.css) { %> + + <% } %> + + + + + + + + + +
      + +
      +

      +

      + +

      +
      +
      +
      + + +
      + +
      +

      +

      +
      +
      +
      + + + + + + + + +
      + + + + + + +
      +
      + + +
      + +
      + +
      + + + + + + + + + + + + + <% for (var index in htmlWebpackPlugin.files.js) { %> + + <% } %> + + + + + + + diff --git a/guacamole/src/main/frontend/src/layouts/de-de-qwertz.json b/guacamole/src/main/frontend/src/layouts/de-de-qwertz.json new file mode 100644 index 0000000..052a3a7 --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/de-de-qwertz.json @@ -0,0 +1,449 @@ +{ + + "language" : "de_DE", + "type" : "qwertz", + "width" : 23, + + "keys" : { + + "Esc" : 65307, + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + + "Space" : " ", + + "Back" : [{ + "title" : "⟵", + "keysym" : 65288 + }], + "Tab" : [{ + "title" : "Tab ↹", + "keysym" : 65289 + }], + "Enter" : [{ + "title" : "↵", + "keysym" : 65293 + }], + "Home" : [{ + "title" : "Pos 1", + "keysym" : 65360 + }], + "PgUp" : [{ + "title" : "Bild ↑", + "keysym" : 65365 + }], + "PgDn" : [{ + "title" : "Bild ↓", + "keysym" : 65366 + }], + "End" : [{ + "title" : "Ende", + "keysym" : 65367 + }], + "Ins" : [{ + "title" : "Einfg", + "keysym" : 65379 + }], + "Del" : [{ + "title" : "Entf", + "keysym" : 65535 + }], + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Strg", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Strg", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "AltGr" : [{ + "title" : "AltGr", + "modifier" : "alt-gr", + "keysym" : 65027 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + + "^" : [ + { "title" : "^", "requires" : [ ] }, + { "title" : "°", "requires" : [ "shift" ] } + ], + "1" : [ + { "title" : "1", "requires" : [ ] }, + { "title" : "!", "requires" : [ "shift" ] } + ], + "2" : [ + { "title" : "2", "requires" : [ ] }, + { "title" : "\"", "requires" : [ "shift" ] }, + { "title" : "²", "requires" : [ "alt-gr" ] } + ], + "3" : [ + { "title" : "3", "requires" : [ ] }, + { "title" : "§", "requires" : [ "shift" ] }, + { "title" : "³", "requires" : [ "alt-gr" ] } + ], + "4" : [ + { "title" : "4", "requires" : [ ] }, + { "title" : "$", "requires" : [ "shift" ] } + ], + "5" : [ + { "title" : "5", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] } + ], + "6" : [ + { "title" : "6", "requires" : [ ] }, + { "title" : "&", "requires" : [ "shift" ] } + ], + "7" : [ + { "title" : "7", "requires" : [ ] }, + { "title" : "/", "requires" : [ "shift" ] }, + { "title" : "{", "requires" : [ "alt-gr" ] } + ], + "8" : [ + { "title" : "8", "requires" : [ ] }, + { "title" : "(", "requires" : [ "shift" ] }, + { "title" : "[", "requires" : [ "alt-gr" ] } + ], + "9" : [ + { "title" : "9", "requires" : [ ] }, + { "title" : ")", "requires" : [ "shift" ] }, + { "title" : "]", "requires" : [ "alt-gr" ] } + ], + "0" : [ + { "title" : "0", "requires" : [ ] }, + { "title" : "=", "requires" : [ "shift" ] }, + { "title" : "}", "requires" : [ "alt-gr" ] } + ], + "ß" : [ + { "title" : "ß", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] }, + { "title" : "\\", "requires" : [ "alt-gr" ] } + ], + "´" : [ + { "title" : "´", "requires" : [ ] }, + { "title" : "`", "requires" : [ "shift" ] } + ], + "+" : [ + { "title" : "+", "requires" : [ ] }, + { "title" : "*", "requires" : [ "shift" ] }, + { "title" : "~", "requires" : [ "alt-gr" ] } + ], + "#" : [ + { "title" : "#", "requires" : [ ] }, + { "title" : "'", "requires" : [ "shift" ] } + ], + "<" : [ + { "title" : "<", "requires" : [ ] }, + { "title" : ">", "requires" : [ "shift" ] }, + { "title" : "|", "requires" : [ "alt-gr" ] } + ], + "," : [ + { "title" : ",", "requires" : [ ] }, + { "title" : ";", "requires" : [ "shift" ] } + ], + "." : [ + { "title" : ".", "requires" : [ ] }, + { "title" : ":", "requires" : [ "shift" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "_", "requires" : [ "shift" ] } + ], + + "q" : [ + { "title" : "q", "requires" : [ ] }, + { "title" : "Q", "requires" : [ "caps" ] }, + { "title" : "Q", "requires" : [ "shift" ] }, + { "title" : "q", "requires" : [ "caps", "shift" ] }, + { "title" : "@", "requires" : [ "alt-gr" ] } + ], + "w" : [ + { "title" : "w", "requires" : [ ] }, + { "title" : "W", "requires" : [ "caps" ] }, + { "title" : "W", "requires" : [ "shift" ] }, + { "title" : "w", "requires" : [ "caps", "shift" ] } + ], + "e" : [ + { "title" : "e", "requires" : [ ] }, + { "title" : "E", "requires" : [ "caps" ] }, + { "title" : "E", "requires" : [ "shift" ] }, + { "title" : "e", "requires" : [ "caps", "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "r" : [ + { "title" : "r", "requires" : [ ] }, + { "title" : "R", "requires" : [ "caps" ] }, + { "title" : "R", "requires" : [ "shift" ] }, + { "title" : "r", "requires" : [ "caps", "shift" ] } + ], + "t" : [ + { "title" : "t", "requires" : [ ] }, + { "title" : "T", "requires" : [ "caps" ] }, + { "title" : "T", "requires" : [ "shift" ] }, + { "title" : "t", "requires" : [ "caps", "shift" ] } + ], + "z" : [ + { "title" : "z", "requires" : [ ] }, + { "title" : "Z", "requires" : [ "caps" ] }, + { "title" : "Z", "requires" : [ "shift" ] }, + { "title" : "z", "requires" : [ "caps", "shift" ] } + ], + "u" : [ + { "title" : "u", "requires" : [ ] }, + { "title" : "U", "requires" : [ "caps" ] }, + { "title" : "U", "requires" : [ "shift" ] }, + { "title" : "u", "requires" : [ "caps", "shift" ] } + ], + "i" : [ + { "title" : "i", "requires" : [ ] }, + { "title" : "I", "requires" : [ "caps" ] }, + { "title" : "I", "requires" : [ "shift" ] }, + { "title" : "i", "requires" : [ "caps", "shift" ] } + ], + "o" : [ + { "title" : "o", "requires" : [ ] }, + { "title" : "O", "requires" : [ "caps" ] }, + { "title" : "O", "requires" : [ "shift" ] }, + { "title" : "o", "requires" : [ "caps", "shift" ] } + ], + "p" : [ + { "title" : "p", "requires" : [ ] }, + { "title" : "P", "requires" : [ "caps" ] }, + { "title" : "P", "requires" : [ "shift" ] }, + { "title" : "p", "requires" : [ "caps", "shift" ] } + ], + "ü" : [ + { "title" : "ü", "requires" : [ ] }, + { "title" : "Ü", "requires" : [ "caps" ] }, + { "title" : "Ü", "requires" : [ "shift" ] }, + { "title" : "ü", "requires" : [ "caps", "shift" ] } + ], + "a" : [ + { "title" : "a", "requires" : [ ] }, + { "title" : "A", "requires" : [ "caps" ] }, + { "title" : "A", "requires" : [ "shift" ] }, + { "title" : "a", "requires" : [ "caps", "shift" ] } + ], + "s" : [ + { "title" : "s", "requires" : [ ] }, + { "title" : "S", "requires" : [ "caps" ] }, + { "title" : "S", "requires" : [ "shift" ] }, + { "title" : "s", "requires" : [ "caps", "shift" ] } + ], + "d" : [ + { "title" : "d", "requires" : [ ] }, + { "title" : "D", "requires" : [ "caps" ] }, + { "title" : "D", "requires" : [ "shift" ] }, + { "title" : "d", "requires" : [ "caps", "shift" ] } + ], + "f" : [ + { "title" : "f", "requires" : [ ] }, + { "title" : "F", "requires" : [ "caps" ] }, + { "title" : "F", "requires" : [ "shift" ] }, + { "title" : "f", "requires" : [ "caps", "shift" ] } + ], + "g" : [ + { "title" : "g", "requires" : [ ] }, + { "title" : "G", "requires" : [ "caps" ] }, + { "title" : "G", "requires" : [ "shift" ] }, + { "title" : "g", "requires" : [ "caps", "shift" ] } + ], + "h" : [ + { "title" : "h", "requires" : [ ] }, + { "title" : "H", "requires" : [ "caps" ] }, + { "title" : "H", "requires" : [ "shift" ] }, + { "title" : "h", "requires" : [ "caps", "shift" ] } + ], + "j" : [ + { "title" : "j", "requires" : [ ] }, + { "title" : "J", "requires" : [ "caps" ] }, + { "title" : "J", "requires" : [ "shift" ] }, + { "title" : "j", "requires" : [ "caps", "shift" ] } + ], + "k" : [ + { "title" : "k", "requires" : [ ] }, + { "title" : "K", "requires" : [ "caps" ] }, + { "title" : "K", "requires" : [ "shift" ] }, + { "title" : "k", "requires" : [ "caps", "shift" ] } + ], + "l" : [ + { "title" : "l", "requires" : [ ] }, + { "title" : "L", "requires" : [ "caps" ] }, + { "title" : "L", "requires" : [ "shift" ] }, + { "title" : "l", "requires" : [ "caps", "shift" ] } + ], + "ö" : [ + { "title" : "ö", "requires" : [ ] }, + { "title" : "Ö", "requires" : [ "caps" ] }, + { "title" : "Ö", "requires" : [ "shift" ] }, + { "title" : "ö", "requires" : [ "caps", "shift" ] } + ], + "ä" : [ + { "title" : "ä", "requires" : [ ] }, + { "title" : "Ä", "requires" : [ "caps" ] }, + { "title" : "Ä", "requires" : [ "shift" ] }, + { "title" : "ä", "requires" : [ "caps", "shift" ] } + ], + "y" : [ + { "title" : "y", "requires" : [ ] }, + { "title" : "Y", "requires" : [ "caps" ] }, + { "title" : "Y", "requires" : [ "shift" ] }, + { "title" : "y", "requires" : [ "caps", "shift" ] } + ], + "x" : [ + { "title" : "x", "requires" : [ ] }, + { "title" : "X", "requires" : [ "caps" ] }, + { "title" : "X", "requires" : [ "shift" ] }, + { "title" : "x", "requires" : [ "caps", "shift" ] } + ], + "c" : [ + { "title" : "c", "requires" : [ ] }, + { "title" : "C", "requires" : [ "caps" ] }, + { "title" : "C", "requires" : [ "shift" ] }, + { "title" : "c", "requires" : [ "caps", "shift" ] } + ], + "v" : [ + { "title" : "v", "requires" : [ ] }, + { "title" : "V", "requires" : [ "caps" ] }, + { "title" : "V", "requires" : [ "shift" ] }, + { "title" : "v", "requires" : [ "caps", "shift" ] } + ], + "b" : [ + { "title" : "b", "requires" : [ ] }, + { "title" : "B", "requires" : [ "caps" ] }, + { "title" : "B", "requires" : [ "shift" ] }, + { "title" : "b", "requires" : [ "caps", "shift" ] } + ], + "n" : [ + { "title" : "n", "requires" : [ ] }, + { "title" : "N", "requires" : [ "caps" ] }, + { "title" : "N", "requires" : [ "shift" ] }, + { "title" : "n", "requires" : [ "caps", "shift" ] } + ], + "m" : [ + { "title" : "m", "requires" : [ ] }, + { "title" : "M", "requires" : [ "caps" ] }, + { "title" : "M", "requires" : [ "shift" ] }, + { "title" : "m", "requires" : [ "caps", "shift" ] }, + { "title" : "µ", "requires" : [ "alt-gr" ] } + ] + + }, + + "layout" : [ + + [ "Esc", 0.7, "F1", "F2", "F3", "F4", + 0.7, "F5", "F6", "F7", "F8", + 0.7, "F9", "F10", "F11", "F12" ], + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "^", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "ß", "´", "Back" ], + [ "Tab", "q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "ü", "+", 1, 0.6 ], + [ "Caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "ö", "ä", "#", "Enter" ], + [ "LShift", "<", "y", "x", "c", "v", "b", "n", "m", ",", ".", "-", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "AltGr", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Back" : 2, + "Tab" : 1.5, + "\\" : 1.5, + "Caps" : 1.75, + "Enter" : 1.25, + "LShift" : 2, + "RShift" : 2.1, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.1, + "AltGr" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/layouts/en-us-qwerty.json b/guacamole/src/main/frontend/src/layouts/en-us-qwerty.json new file mode 100644 index 0000000..fa9a6fe --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/en-us-qwerty.json @@ -0,0 +1,399 @@ +{ + + "language" : "en_US", + "type" : "qwerty", + "width" : 22, + + "keys" : { + + "Back" : 65288, + "Tab" : 65289, + "Enter" : 65293, + "Esc" : 65307, + "Home" : 65360, + "PgUp" : 65365, + "PgDn" : 65366, + "End" : 65367, + "Ins" : 65379, + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + "Del" : 65535, + + "Space" : " ", + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "RAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65514 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + + "`" : [ + { "title" : "`", "requires" : [ ] }, + { "title" : "~", "requires" : [ "shift" ] } + ], + "1" : [ + { "title" : "1", "requires" : [ ] }, + { "title" : "!", "requires" : [ "shift" ] } + ], + "2" : [ + { "title" : "2", "requires" : [ ] }, + { "title" : "@", "requires" : [ "shift" ] } + ], + "3" : [ + { "title" : "3", "requires" : [ ] }, + { "title" : "#", "requires" : [ "shift" ] } + ], + "4" : [ + { "title" : "4", "requires" : [ ] }, + { "title" : "$", "requires" : [ "shift" ] } + ], + "5" : [ + { "title" : "5", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] } + ], + "6" : [ + { "title" : "6", "requires" : [ ] }, + { "title" : "^", "requires" : [ "shift" ] } + ], + "7" : [ + { "title" : "7", "requires" : [ ] }, + { "title" : "&", "requires" : [ "shift" ] } + ], + "8" : [ + { "title" : "8", "requires" : [ ] }, + { "title" : "*", "requires" : [ "shift" ] } + ], + "9" : [ + { "title" : "9", "requires" : [ ] }, + { "title" : "(", "requires" : [ "shift" ] } + ], + "0" : [ + { "title" : "0", "requires" : [ ] }, + { "title" : ")", "requires" : [ "shift" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "_", "requires" : [ "shift" ] } + ], + "=" : [ + { "title" : "=", "requires" : [ ] }, + { "title" : "+", "requires" : [ "shift" ] } + ], + "," : [ + { "title" : ",", "requires" : [ ] }, + { "title" : "<", "requires" : [ "shift" ] } + ], + "." : [ + { "title" : ".", "requires" : [ ] }, + { "title" : ">", "requires" : [ "shift" ] } + ], + "/" : [ + { "title" : "/", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] } + ], + "[" : [ + { "title" : "[", "requires" : [ ] }, + { "title" : "{", "requires" : [ "shift" ] } + ], + "]" : [ + { "title" : "]", "requires" : [ ] }, + { "title" : "}", "requires" : [ "shift" ] } + ], + "\\" : [ + { "title" : "\\", "requires" : [ ] }, + { "title" : "|", "requires" : [ "shift" ] } + ], + ";" : [ + { "title" : ";", "requires" : [ ] }, + { "title" : ":", "requires" : [ "shift" ] } + ], + "'" : [ + { "title" : "'", "requires" : [ ] }, + { "title" : "\"", "requires" : [ "shift" ] } + ], + + "q" : [ + { "title" : "q", "requires" : [ ] }, + { "title" : "Q", "requires" : [ "caps" ] }, + { "title" : "Q", "requires" : [ "shift" ] }, + { "title" : "q", "requires" : [ "caps", "shift" ] } + ], + "w" : [ + { "title" : "w", "requires" : [ ] }, + { "title" : "W", "requires" : [ "caps" ] }, + { "title" : "W", "requires" : [ "shift" ] }, + { "title" : "w", "requires" : [ "caps", "shift" ] } + ], + "e" : [ + { "title" : "e", "requires" : [ ] }, + { "title" : "E", "requires" : [ "caps" ] }, + { "title" : "E", "requires" : [ "shift" ] }, + { "title" : "e", "requires" : [ "caps", "shift" ] } + ], + "r" : [ + { "title" : "r", "requires" : [ ] }, + { "title" : "R", "requires" : [ "caps" ] }, + { "title" : "R", "requires" : [ "shift" ] }, + { "title" : "r", "requires" : [ "caps", "shift" ] } + ], + "t" : [ + { "title" : "t", "requires" : [ ] }, + { "title" : "T", "requires" : [ "caps" ] }, + { "title" : "T", "requires" : [ "shift" ] }, + { "title" : "t", "requires" : [ "caps", "shift" ] } + ], + "y" : [ + { "title" : "y", "requires" : [ ] }, + { "title" : "Y", "requires" : [ "caps" ] }, + { "title" : "Y", "requires" : [ "shift" ] }, + { "title" : "y", "requires" : [ "caps", "shift" ] } + ], + "u" : [ + { "title" : "u", "requires" : [ ] }, + { "title" : "U", "requires" : [ "caps" ] }, + { "title" : "U", "requires" : [ "shift" ] }, + { "title" : "u", "requires" : [ "caps", "shift" ] } + ], + "i" : [ + { "title" : "i", "requires" : [ ] }, + { "title" : "I", "requires" : [ "caps" ] }, + { "title" : "I", "requires" : [ "shift" ] }, + { "title" : "i", "requires" : [ "caps", "shift" ] } + ], + "o" : [ + { "title" : "o", "requires" : [ ] }, + { "title" : "O", "requires" : [ "caps" ] }, + { "title" : "O", "requires" : [ "shift" ] }, + { "title" : "o", "requires" : [ "caps", "shift" ] } + ], + "p" : [ + { "title" : "p", "requires" : [ ] }, + { "title" : "P", "requires" : [ "caps" ] }, + { "title" : "P", "requires" : [ "shift" ] }, + { "title" : "p", "requires" : [ "caps", "shift" ] } + ], + "a" : [ + { "title" : "a", "requires" : [ ] }, + { "title" : "A", "requires" : [ "caps" ] }, + { "title" : "A", "requires" : [ "shift" ] }, + { "title" : "a", "requires" : [ "caps", "shift" ] } + ], + "s" : [ + { "title" : "s", "requires" : [ ] }, + { "title" : "S", "requires" : [ "caps" ] }, + { "title" : "S", "requires" : [ "shift" ] }, + { "title" : "s", "requires" : [ "caps", "shift" ] } + ], + "d" : [ + { "title" : "d", "requires" : [ ] }, + { "title" : "D", "requires" : [ "caps" ] }, + { "title" : "D", "requires" : [ "shift" ] }, + { "title" : "d", "requires" : [ "caps", "shift" ] } + ], + "f" : [ + { "title" : "f", "requires" : [ ] }, + { "title" : "F", "requires" : [ "caps" ] }, + { "title" : "F", "requires" : [ "shift" ] }, + { "title" : "f", "requires" : [ "caps", "shift" ] } + ], + "g" : [ + { "title" : "g", "requires" : [ ] }, + { "title" : "G", "requires" : [ "caps" ] }, + { "title" : "G", "requires" : [ "shift" ] }, + { "title" : "g", "requires" : [ "caps", "shift" ] } + ], + "h" : [ + { "title" : "h", "requires" : [ ] }, + { "title" : "H", "requires" : [ "caps" ] }, + { "title" : "H", "requires" : [ "shift" ] }, + { "title" : "h", "requires" : [ "caps", "shift" ] } + ], + "j" : [ + { "title" : "j", "requires" : [ ] }, + { "title" : "J", "requires" : [ "caps" ] }, + { "title" : "J", "requires" : [ "shift" ] }, + { "title" : "j", "requires" : [ "caps", "shift" ] } + ], + "k" : [ + { "title" : "k", "requires" : [ ] }, + { "title" : "K", "requires" : [ "caps" ] }, + { "title" : "K", "requires" : [ "shift" ] }, + { "title" : "k", "requires" : [ "caps", "shift" ] } + ], + "l" : [ + { "title" : "l", "requires" : [ ] }, + { "title" : "L", "requires" : [ "caps" ] }, + { "title" : "L", "requires" : [ "shift" ] }, + { "title" : "l", "requires" : [ "caps", "shift" ] } + ], + "z" : [ + { "title" : "z", "requires" : [ ] }, + { "title" : "Z", "requires" : [ "caps" ] }, + { "title" : "Z", "requires" : [ "shift" ] }, + { "title" : "z", "requires" : [ "caps", "shift" ] } + ], + "x" : [ + { "title" : "x", "requires" : [ ] }, + { "title" : "X", "requires" : [ "caps" ] }, + { "title" : "X", "requires" : [ "shift" ] }, + { "title" : "x", "requires" : [ "caps", "shift" ] } + ], + "c" : [ + { "title" : "c", "requires" : [ ] }, + { "title" : "C", "requires" : [ "caps" ] }, + { "title" : "C", "requires" : [ "shift" ] }, + { "title" : "c", "requires" : [ "caps", "shift" ] } + ], + "v" : [ + { "title" : "v", "requires" : [ ] }, + { "title" : "V", "requires" : [ "caps" ] }, + { "title" : "V", "requires" : [ "shift" ] }, + { "title" : "v", "requires" : [ "caps", "shift" ] } + ], + "b" : [ + { "title" : "b", "requires" : [ ] }, + { "title" : "B", "requires" : [ "caps" ] }, + { "title" : "B", "requires" : [ "shift" ] }, + { "title" : "b", "requires" : [ "caps", "shift" ] } + ], + "n" : [ + { "title" : "n", "requires" : [ ] }, + { "title" : "N", "requires" : [ "caps" ] }, + { "title" : "N", "requires" : [ "shift" ] }, + { "title" : "n", "requires" : [ "caps", "shift" ] } + ], + "m" : [ + { "title" : "m", "requires" : [ ] }, + { "title" : "M", "requires" : [ "caps" ] }, + { "title" : "M", "requires" : [ "shift" ] }, + { "title" : "m", "requires" : [ "caps", "shift" ] } + ] + + }, + + "layout" : [ + + [ "Esc", 0.7, "F1", "F2", "F3", "F4", + 0.7, "F5", "F6", "F7", "F8", + 0.7, "F9", "F10", "F11", "F12" ], + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "Back" ], + [ "Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\" ], + [ "Caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "Enter" ], + [ "LShift", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "RAlt", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Back" : 2, + "Tab" : 1.5, + "\\" : 1.5, + "Caps" : 1.85, + "Enter" : 2.25, + "LShift" : 2.1, + "RShift" : 3.1, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.1, + "RAlt" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/layouts/es-es-qwerty.json b/guacamole/src/main/frontend/src/layouts/es-es-qwerty.json new file mode 100644 index 0000000..e88c6cd --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/es-es-qwerty.json @@ -0,0 +1,455 @@ +{ + + "language" : "es_ES", + "type" : "qwerty", + "width" : 23, + + "keys" : { + + "Esc" : 65307, + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + + "Space" : " ", + + "Back" : [{ + "title" : "⟵", + "keysym" : 65288 + }], + "Tab" : [{ + "title" : "Tab ↹", + "keysym" : 65289 + }], + "Enter" : [{ + "title" : "↵", + "keysym" : 65293 + }], + "Home" : [{ + "title" : "Inicio", + "keysym" : 65360 + }], + "PgUp" : [{ + "title" : "RePág ↑", + "keysym" : 65365 + }], + "PgDn" : [{ + "title" : "AvPág ↓", + "keysym" : 65366 + }], + "End" : [{ + "title" : "Fin", + "keysym" : 65367 + }], + "Ins" : [{ + "title" : "Ins", + "keysym" : 65379 + }], + "Del" : [{ + "title" : "Supr", + "keysym" : 65535 + }], + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "AltGr" : [{ + "title" : "AltGr", + "modifier" : "alt-gr", + "keysym" : 65027 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + + "º" : [ + { "title" : "º", "requires" : [ ] }, + { "title" : "ª", "requires" : [ "shift" ] }, + { "title" : "\\", "requires" : [ "alt-gr" ] } + ], + "1" : [ + { "title" : "1", "requires" : [ ] }, + { "title" : "!", "requires" : [ "shift" ] }, + { "title" : "|", "requires" : [ "alt-gr" ] } + ], + "2" : [ + { "title" : "2", "requires" : [ ] }, + { "title" : "\"", "requires" : [ "shift" ] }, + { "title" : "@", "requires" : [ "alt-gr" ] } + ], + "3" : [ + { "title" : "3", "requires" : [ ] }, + { "title" : ".", "requires" : [ "shift" ] }, + { "title" : "#", "requires" : [ "alt-gr" ] } + ], + "4" : [ + { "title" : "4", "requires" : [ ] }, + { "title" : "$", "requires" : [ "shift" ] }, + { "title" : "~", "requires" : [ "alt-gr" ] } + ], + "5" : [ + { "title" : "5", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "6" : [ + { "title" : "6", "requires" : [ ] }, + { "title" : "&", "requires" : [ "shift" ] }, + { "title" : "¬", "requires" : [ "alt-gr" ] } + ], + "7" : [ + { "title" : "7", "requires" : [ ] }, + { "title" : "/", "requires" : [ "shift" ] } + ], + "8" : [ + { "title" : "8", "requires" : [ ] }, + { "title" : "(", "requires" : [ "shift" ] } + ], + "9" : [ + { "title" : "9", "requires" : [ ] }, + { "title" : ")", "requires" : [ "shift" ] } + ], + "0" : [ + { "title" : "0", "requires" : [ ] }, + { "title" : "=", "requires" : [ "shift" ] } + ], + "'" : [ + { "title" : "'", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] } + ], + "¡" : [ + { "title" : "¡", "requires" : [ ] }, + { "title" : "¿", "requires" : [ "shift" ] } + ], + + "q" : [ + { "title" : "q", "requires" : [ ] }, + { "title" : "Q", "requires" : [ "caps" ] }, + { "title" : "Q", "requires" : [ "shift" ] }, + { "title" : "q", "requires" : [ "caps", "shift" ] } + ], + "w" : [ + { "title" : "w", "requires" : [ ] }, + { "title" : "W", "requires" : [ "caps" ] }, + { "title" : "W", "requires" : [ "shift" ] }, + { "title" : "w", "requires" : [ "caps", "shift" ] } + ], + "e" : [ + { "title" : "e", "requires" : [ ] }, + { "title" : "E", "requires" : [ "caps" ] }, + { "title" : "E", "requires" : [ "shift" ] }, + { "title" : "e", "requires" : [ "caps", "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "r" : [ + { "title" : "r", "requires" : [ ] }, + { "title" : "R", "requires" : [ "caps" ] }, + { "title" : "R", "requires" : [ "shift" ] }, + { "title" : "r", "requires" : [ "caps", "shift" ] } + ], + "t" : [ + { "title" : "t", "requires" : [ ] }, + { "title" : "T", "requires" : [ "caps" ] }, + { "title" : "T", "requires" : [ "shift" ] }, + { "title" : "t", "requires" : [ "caps", "shift" ] } + ], + "y" : [ + { "title" : "y", "requires" : [ ] }, + { "title" : "Y", "requires" : [ "caps" ] }, + { "title" : "Y", "requires" : [ "shift" ] }, + { "title" : "y", "requires" : [ "caps", "shift" ] } + ], + "u" : [ + { "title" : "u", "requires" : [ ] }, + { "title" : "U", "requires" : [ "caps" ] }, + { "title" : "U", "requires" : [ "shift" ] }, + { "title" : "u", "requires" : [ "caps", "shift" ] } + ], + "i" : [ + { "title" : "i", "requires" : [ ] }, + { "title" : "I", "requires" : [ "caps" ] }, + { "title" : "I", "requires" : [ "shift" ] }, + { "title" : "i", "requires" : [ "caps", "shift" ] } + ], + "o" : [ + { "title" : "o", "requires" : [ ] }, + { "title" : "O", "requires" : [ "caps" ] }, + { "title" : "O", "requires" : [ "shift" ] }, + { "title" : "o", "requires" : [ "caps", "shift" ] } + ], + "p" : [ + { "title" : "p", "requires" : [ ] }, + { "title" : "P", "requires" : [ "caps" ] }, + { "title" : "P", "requires" : [ "shift" ] }, + { "title" : "p", "requires" : [ "caps", "shift" ] } + ], + "`" : [ + { "title" : "`", "requires" : [ ] }, + { "title" : "`", "requires" : [ "caps" ] }, + { "title" : "^", "requires" : [ "shift" ] }, + { "title" : "^", "requires" : [ "caps", "shift" ] }, + { "title" : "[", "requires" : [ "alt-gr" ] } + ], + "+" : [ + { "title" : "+", "requires" : [ ] }, + { "title" : "+", "requires" : [ "caps" ] }, + { "title" : "*", "requires" : [ "shift" ] }, + { "title" : "*", "requires" : [ "caps", "shift" ] }, + { "title" : "]", "requires" : [ "alt-gr" ] } + ], + "a" : [ + { "title" : "a", "requires" : [ ] }, + { "title" : "A", "requires" : [ "caps" ] }, + { "title" : "A", "requires" : [ "shift" ] }, + { "title" : "a", "requires" : [ "caps", "shift" ] } + ], + "s" : [ + { "title" : "s", "requires" : [ ] }, + { "title" : "S", "requires" : [ "caps" ] }, + { "title" : "S", "requires" : [ "shift" ] }, + { "title" : "s", "requires" : [ "caps", "shift" ] } + ], + "d" : [ + { "title" : "d", "requires" : [ ] }, + { "title" : "D", "requires" : [ "caps" ] }, + { "title" : "D", "requires" : [ "shift" ] }, + { "title" : "d", "requires" : [ "caps", "shift" ] } + ], + "f" : [ + { "title" : "f", "requires" : [ ] }, + { "title" : "F", "requires" : [ "caps" ] }, + { "title" : "F", "requires" : [ "shift" ] }, + { "title" : "f", "requires" : [ "caps", "shift" ] } + ], + "g" : [ + { "title" : "g", "requires" : [ ] }, + { "title" : "G", "requires" : [ "caps" ] }, + { "title" : "G", "requires" : [ "shift" ] }, + { "title" : "g", "requires" : [ "caps", "shift" ] } + ], + "h" : [ + { "title" : "h", "requires" : [ ] }, + { "title" : "H", "requires" : [ "caps" ] }, + { "title" : "H", "requires" : [ "shift" ] }, + { "title" : "h", "requires" : [ "caps", "shift" ] } + ], + "j" : [ + { "title" : "j", "requires" : [ ] }, + { "title" : "J", "requires" : [ "caps" ] }, + { "title" : "J", "requires" : [ "shift" ] }, + { "title" : "j", "requires" : [ "caps", "shift" ] } + ], + "k" : [ + { "title" : "k", "requires" : [ ] }, + { "title" : "K", "requires" : [ "caps" ] }, + { "title" : "K", "requires" : [ "shift" ] }, + { "title" : "k", "requires" : [ "caps", "shift" ] } + ], + "l" : [ + { "title" : "l", "requires" : [ ] }, + { "title" : "L", "requires" : [ "caps" ] }, + { "title" : "L", "requires" : [ "shift" ] }, + { "title" : "l", "requires" : [ "caps", "shift" ] } + ], + "ñ" : [ + { "title" : "ñ", "requires" : [ ] }, + { "title" : "Ñ", "requires" : [ "caps" ] }, + { "title" : "Ñ", "requires" : [ "shift" ] }, + { "title" : "ñ", "requires" : [ "caps", "shift" ] } + ], + "´" : [ + { "title" : "´", "requires" : [ ], "keysym" : 65105 }, + { "title" : "´", "requires" : [ "caps" ] }, + { "title" : "¨", "requires" : [ "shift" ] }, + { "title" : "¨", "requires" : [ "caps", "shift" ] }, + { "title" : "{", "requires" : [ "alt-gr" ] } + ], + "ç" : [ + { "title" : "ç", "requires" : [ ] }, + { "title" : "Ç", "requires" : [ "caps" ] }, + { "title" : "Ç", "requires" : [ "shift" ] }, + { "title" : "ç", "requires" : [ "caps", "shift" ] }, + { "title" : "}", "requires" : [ "alt-gr" ] } + ], + "<" : [ + { "title" : "<", "requires" : [ ] }, + { "title" : "<", "requires" : [ "caps" ] }, + { "title" : ">", "requires" : [ "shift" ] }, + { "title" : ">", "requires" : [ "caps", "shift" ] } + ], + + "z" : [ + { "title" : "z", "requires" : [ ] }, + { "title" : "Z", "requires" : [ "caps" ] }, + { "title" : "Z", "requires" : [ "shift" ] }, + { "title" : "z", "requires" : [ "caps", "shift" ] } + ], + "x" : [ + { "title" : "x", "requires" : [ ] }, + { "title" : "X", "requires" : [ "caps" ] }, + { "title" : "X", "requires" : [ "shift" ] }, + { "title" : "x", "requires" : [ "caps", "shift" ] } + ], + "c" : [ + { "title" : "c", "requires" : [ ] }, + { "title" : "C", "requires" : [ "caps" ] }, + { "title" : "C", "requires" : [ "shift" ] }, + { "title" : "c", "requires" : [ "caps", "shift" ] } + ], + "v" : [ + { "title" : "v", "requires" : [ ] }, + { "title" : "V", "requires" : [ "caps" ] }, + { "title" : "V", "requires" : [ "shift" ] }, + { "title" : "v", "requires" : [ "caps", "shift" ] } + ], + "b" : [ + { "title" : "b", "requires" : [ ] }, + { "title" : "B", "requires" : [ "caps" ] }, + { "title" : "B", "requires" : [ "shift" ] }, + { "title" : "b", "requires" : [ "caps", "shift" ] } + ], + "n" : [ + { "title" : "n", "requires" : [ ] }, + { "title" : "N", "requires" : [ "caps" ] }, + { "title" : "N", "requires" : [ "shift" ] }, + { "title" : "n", "requires" : [ "caps", "shift" ] } + ], + "m" : [ + { "title" : "m", "requires" : [ ] }, + { "title" : "M", "requires" : [ "caps" ] }, + { "title" : "M", "requires" : [ "shift" ] }, + { "title" : "m", "requires" : [ "caps", "shift" ] } + ], + "," : [ + { "title" : ",", "requires" : [ ] }, + { "title" : ";", "requires" : [ "shift" ] } + ], + "." : [ + { "title" : ".", "requires" : [ ] }, + { "title" : ":", "requires" : [ "shift" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "_", "requires" : [ "shift" ] } + ] + }, + + "layout" : [ + + [ "Esc", 0.8, "F1", "F2", "F3", "F4", + 0.8, "F5", "F6", "F7", "F8", + 0.8, "F9", "F10", "F11", "F12" ], + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "º", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "'", "¡", "Back" ], + [ "Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "`", "+", 1, 0.6 ], + [ "Caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "ñ", "´", "ç", "Enter" ], + [ "LShift", "<", "z", "x", "c", "v", "b", "n", "m", ",", ".", "-", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "AltGr", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Back" : 2.3, + "Tab" : 1.75, + "\\" : 1.25, + "Caps" : 1.75, + "Enter" : 1.5, + "LShift" : 2.2, + "RShift" : 2.2, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.4, + "AltGr" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/layouts/fr-fr-azerty.json b/guacamole/src/main/frontend/src/layouts/fr-fr-azerty.json new file mode 100644 index 0000000..bf3eaf3 --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/fr-fr-azerty.json @@ -0,0 +1,446 @@ +{ + + "language" : "fr_FR", + "type" : "azerty", + "width" : 22, + + "keys" : { + + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + + "Space" : " ", + + "Esc" : [{ + "title" : "Echap", + "keysym" : 65307 + }], + "Back" : [{ + "title" : "⟵", + "keysym" : 65288 + }], + "Tab" : [{ + "title" : "↹", + "keysym" : 65289 + }], + "Enter" : [{ + "title" : "Entrée", + "keysym" : 65293 + }], + "Home" : [{ + "title" : "Origine", + "keysym" : 65360 + }], + "PgUp" : [{ + "title" : "Pg préc.", + "keysym" : 65365 + }], + "PgDn" : [{ + "title" : "Pg suiv.", + "keysym" : 65366 + }], + "End" : [{ + "title" : "Fin", + "keysym" : 65367 + }], + "Ins" : [{ + "title" : "Inser", + "keysym" : 65379 + }], + "Del" : [{ + "title" : "Suppr", + "keysym" : 65535 + }], + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "AltGr" : [{ + "title" : "AltGr", + "modifier" : "alt-gr", + "keysym" : 65027 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + + "²" : [ + { "title" : "²", "requires" : [ ] } + ], + "&" : [ + { "title" : "&", "requires" : [ ] }, + { "title" : "1", "requires" : [ "shift" ] } + ], + "é" : [ + { "title" : "é", "requires" : [ ] }, + { "title" : "2", "requires" : [ "shift" ] }, + { "title" : "~", "requires" : [ "alt-gr" ] } + ], + "\"" : [ + { "title" : "\"", "requires" : [ ] }, + { "title" : "3", "requires" : [ "shift" ] }, + { "title" : "#", "requires" : [ "alt-gr" ] } + ], + "'" : [ + { "title" : "'", "requires" : [ ] }, + { "title" : "4", "requires" : [ "shift" ] }, + { "title" : "{", "requires" : [ "alt-gr" ] } + ], + "(" : [ + { "title" : "(", "requires" : [ ] }, + { "title" : "5", "requires" : [ "shift" ] }, + { "title" : "[", "requires" : [ "alt-gr" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "6", "requires" : [ "shift" ] }, + { "title" : "|", "requires" : [ "alt-gr" ] } + ], + "è" : [ + { "title" : "è", "requires" : [ ] }, + { "title" : "7", "requires" : [ "shift" ] }, + { "title" : "`", "requires" : [ "alt-gr" ] } + ], + "_" : [ + { "title" : "_", "requires" : [ ] }, + { "title" : "8", "requires" : [ "shift" ] }, + { "title" : "\\", "requires" : [ "alt-gr" ] } + ], + "ç" : [ + { "title" : "ç", "requires" : [ ] }, + { "title" : "9", "requires" : [ "shift" ] }, + { "title" : "^", "requires" : [ "alt-gr" ] } + ], + "à" : [ + { "title" : "à", "requires" : [ ] }, + { "title" : "0", "requires" : [ "shift" ] }, + { "title" : "@", "requires" : [ "alt-gr" ] } + ], + ")" : [ + { "title" : ")", "requires" : [ ] }, + { "title" : "°", "requires" : [ "shift" ] }, + { "title" : "]", "requires" : [ "alt-gr" ] } + ], + "=" : [ + { "title" : "=", "requires" : [ ] }, + { "title" : "+", "requires" : [ "shift" ] }, + { "title" : "}", "requires" : [ "alt-gr" ] } + ], + "^" : [ + { "title" : "^", "requires" : [ ] }, + { "title" : "¨", "requires" : [ "shift" ] } + ], + "$" : [ + { "title" : "$", "requires" : [ ] }, + { "title" : "£", "requires" : [ "shift" ] }, + { "title" : "¤", "requires" : [ "alt-gr" ] } + ], + "ù" : [ + { "title" : "ù", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] } + ], + "*" : [ + { "title" : "*", "requires" : [ ] }, + { "title" : "µ", "requires" : [ "shift" ] } + ], + "<" : [ + { "title" : "<", "requires" : [ ] }, + { "title" : ">", "requires" : [ "shift" ] } + ], + "," : [ + { "title" : ",", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] } + ], + ";" : [ + { "title" : ";", "requires" : [ ] }, + { "title" : ".", "requires" : [ "shift" ] } + ], + ":" : [ + { "title" : ":", "requires" : [ ] }, + { "title" : "/", "requires" : [ "shift" ] } + ], + "!" : [ + { "title" : "!", "requires" : [ ] }, + { "title" : "§", "requires" : [ "shift" ] } + ], + + "a" : [ + { "title" : "a", "requires" : [ ] }, + { "title" : "A", "requires" : [ "caps" ] }, + { "title" : "A", "requires" : [ "shift" ] }, + { "title" : "a", "requires" : [ "caps", "shift" ] } + ], + "z" : [ + { "title" : "z", "requires" : [ ] }, + { "title" : "Z", "requires" : [ "caps" ] }, + { "title" : "Z", "requires" : [ "shift" ] }, + { "title" : "z", "requires" : [ "caps", "shift" ] } + ], + "e" : [ + { "title" : "e", "requires" : [ ] }, + { "title" : "E", "requires" : [ "caps" ] }, + { "title" : "E", "requires" : [ "shift" ] }, + { "title" : "e", "requires" : [ "caps", "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "r" : [ + { "title" : "r", "requires" : [ ] }, + { "title" : "R", "requires" : [ "caps" ] }, + { "title" : "R", "requires" : [ "shift" ] }, + { "title" : "r", "requires" : [ "caps", "shift" ] } + ], + "t" : [ + { "title" : "t", "requires" : [ ] }, + { "title" : "T", "requires" : [ "caps" ] }, + { "title" : "T", "requires" : [ "shift" ] }, + { "title" : "t", "requires" : [ "caps", "shift" ] } + ], + "y" : [ + { "title" : "y", "requires" : [ ] }, + { "title" : "Y", "requires" : [ "caps" ] }, + { "title" : "Y", "requires" : [ "shift" ] }, + { "title" : "y", "requires" : [ "caps", "shift" ] } + ], + "u" : [ + { "title" : "u", "requires" : [ ] }, + { "title" : "U", "requires" : [ "caps" ] }, + { "title" : "U", "requires" : [ "shift" ] }, + { "title" : "u", "requires" : [ "caps", "shift" ] } + ], + "i" : [ + { "title" : "i", "requires" : [ ] }, + { "title" : "I", "requires" : [ "caps" ] }, + { "title" : "I", "requires" : [ "shift" ] }, + { "title" : "i", "requires" : [ "caps", "shift" ] } + ], + "o" : [ + { "title" : "o", "requires" : [ ] }, + { "title" : "O", "requires" : [ "caps" ] }, + { "title" : "O", "requires" : [ "shift" ] }, + { "title" : "o", "requires" : [ "caps", "shift" ] } + ], + "p" : [ + { "title" : "p", "requires" : [ ] }, + { "title" : "P", "requires" : [ "caps" ] }, + { "title" : "P", "requires" : [ "shift" ] }, + { "title" : "p", "requires" : [ "caps", "shift" ] } + ], + "q" : [ + { "title" : "q", "requires" : [ ] }, + { "title" : "Q", "requires" : [ "caps" ] }, + { "title" : "Q", "requires" : [ "shift" ] }, + { "title" : "q", "requires" : [ "caps", "shift" ] } + ], + "s" : [ + { "title" : "s", "requires" : [ ] }, + { "title" : "S", "requires" : [ "caps" ] }, + { "title" : "S", "requires" : [ "shift" ] }, + { "title" : "s", "requires" : [ "caps", "shift" ] } + ], + "d" : [ + { "title" : "d", "requires" : [ ] }, + { "title" : "D", "requires" : [ "caps" ] }, + { "title" : "D", "requires" : [ "shift" ] }, + { "title" : "d", "requires" : [ "caps", "shift" ] } + ], + "f" : [ + { "title" : "f", "requires" : [ ] }, + { "title" : "F", "requires" : [ "caps" ] }, + { "title" : "F", "requires" : [ "shift" ] }, + { "title" : "f", "requires" : [ "caps", "shift" ] } + ], + "g" : [ + { "title" : "g", "requires" : [ ] }, + { "title" : "G", "requires" : [ "caps" ] }, + { "title" : "G", "requires" : [ "shift" ] }, + { "title" : "g", "requires" : [ "caps", "shift" ] } + ], + "h" : [ + { "title" : "h", "requires" : [ ] }, + { "title" : "H", "requires" : [ "caps" ] }, + { "title" : "H", "requires" : [ "shift" ] }, + { "title" : "h", "requires" : [ "caps", "shift" ] } + ], + "j" : [ + { "title" : "j", "requires" : [ ] }, + { "title" : "J", "requires" : [ "caps" ] }, + { "title" : "J", "requires" : [ "shift" ] }, + { "title" : "j", "requires" : [ "caps", "shift" ] } + ], + "k" : [ + { "title" : "k", "requires" : [ ] }, + { "title" : "K", "requires" : [ "caps" ] }, + { "title" : "K", "requires" : [ "shift" ] }, + { "title" : "k", "requires" : [ "caps", "shift" ] } + ], + "l" : [ + { "title" : "l", "requires" : [ ] }, + { "title" : "L", "requires" : [ "caps" ] }, + { "title" : "L", "requires" : [ "shift" ] }, + { "title" : "l", "requires" : [ "caps", "shift" ] } + ], + "m" : [ + { "title" : "m", "requires" : [ ] }, + { "title" : "M", "requires" : [ "caps" ] }, + { "title" : "M", "requires" : [ "shift" ] }, + { "title" : "m", "requires" : [ "caps", "shift" ] } + ], + "w" : [ + { "title" : "w", "requires" : [ ] }, + { "title" : "W", "requires" : [ "caps" ] }, + { "title" : "W", "requires" : [ "shift" ] }, + { "title" : "w", "requires" : [ "caps", "shift" ] } + ], + "x" : [ + { "title" : "x", "requires" : [ ] }, + { "title" : "X", "requires" : [ "caps" ] }, + { "title" : "X", "requires" : [ "shift" ] }, + { "title" : "x", "requires" : [ "caps", "shift" ] } + ], + "c" : [ + { "title" : "c", "requires" : [ ] }, + { "title" : "C", "requires" : [ "caps" ] }, + { "title" : "C", "requires" : [ "shift" ] }, + { "title" : "c", "requires" : [ "caps", "shift" ] } + ], + "v" : [ + { "title" : "v", "requires" : [ ] }, + { "title" : "V", "requires" : [ "caps" ] }, + { "title" : "V", "requires" : [ "shift" ] }, + { "title" : "v", "requires" : [ "caps", "shift" ] } + ], + "b" : [ + { "title" : "b", "requires" : [ ] }, + { "title" : "B", "requires" : [ "caps" ] }, + { "title" : "B", "requires" : [ "shift" ] }, + { "title" : "b", "requires" : [ "caps", "shift" ] } + ], + "n" : [ + { "title" : "n", "requires" : [ ] }, + { "title" : "N", "requires" : [ "caps" ] }, + { "title" : "N", "requires" : [ "shift" ] }, + { "title" : "n", "requires" : [ "caps", "shift" ] } + ] + + }, + + "layout" : [ + + [ "Esc", 0.5, "F1", "F2", "F3", "F4", + 0.7, "F5", "F6", "F7", "F8", + 0.7, "F9", "F10", "F11", "F12" ], + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "²", "&", "é", "\"", "'", "(", "-", "è", "_", "ç", "à", ")", "=", "Back" ], + [ "Tab", "a", "z", "e", "r", "t", "y", "u", "i", "o", "p", "^", "$", 1, 0.8 ], + [ "Caps", "q", "s", "d", "f", "g", "h", "j", "k", "l", "m", "ù", "*", "Enter" ], + [ "LShift", "<", "w", "x", "c", "v", "b", "n", ",", ";", ":", "!", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "AltGr", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Esc" : 1.2, + "Back" : 2, + "Tab" : 1.3, + "Caps" : 1.3, + "Enter" : 1.7, + "LShift" : 2, + "RShift" : 2.1, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.1, + "AltGr" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/layouts/it-it-qwerty.json b/guacamole/src/main/frontend/src/layouts/it-it-qwerty.json new file mode 100644 index 0000000..4775e6f --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/it-it-qwerty.json @@ -0,0 +1,452 @@ +{ + + "language" : "it_IT", + "type" : "qwerty", + "width" : 23, + + "keys" : { + + "Esc" : 65307, + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + + "Space" : " ", + + "Back" : [{ + "title" : "⟵", + "keysym" : 65288 + }], + "Tab" : [{ + "title" : "Tab ↹", + "keysym" : 65289 + }], + "Enter" : [{ + "title" : "↵", + "keysym" : 65293 + }], + "Home" : [{ + "title" : "Home", + "keysym" : 65360 + }], + "PgUp" : [{ + "title" : "PgUp ↑", + "keysym" : 65365 + }], + "PgDn" : [{ + "title" : "PgDn ↓", + "keysym" : 65366 + }], + "End" : [{ + "title" : "End", + "keysym" : 65367 + }], + "Ins" : [{ + "title" : "Ins", + "keysym" : 65379 + }], + "Del" : [{ + "title" : "Del", + "keysym" : 65535 + }], + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "AltGr" : [{ + "title" : "AltGr", + "modifier" : "alt-gr", + "keysym" : 65027 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + + "\\" : [ + { "title" : "\\", "requires" : [ ] }, + { "title" : "|", "requires" : [ "shift" ] } + ], + "1" : [ + { "title" : "1", "requires" : [ ] }, + { "title" : "!", "requires" : [ "shift" ] } + ], + "2" : [ + { "title" : "2", "requires" : [ ] }, + { "title" : "\"", "requires" : [ "shift" ] } + ], + "3" : [ + { "title" : "3", "requires" : [ ] }, + { "title" : "£", "requires" : [ "shift" ] } + ], + "4" : [ + { "title" : "4", "requires" : [ ] }, + { "title" : "$", "requires" : [ "shift" ] } + ], + "5" : [ + { "title" : "5", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "6" : [ + { "title" : "6", "requires" : [ ] }, + { "title" : "&", "requires" : [ "shift" ] } + ], + "7" : [ + { "title" : "7", "requires" : [ ] }, + { "title" : "/", "requires" : [ "shift" ] } + ], + "8" : [ + { "title" : "8", "requires" : [ ] }, + { "title" : "(", "requires" : [ "shift" ] } + ], + "9" : [ + { "title" : "9", "requires" : [ ] }, + { "title" : ")", "requires" : [ "shift" ] } + ], + "0" : [ + { "title" : "0", "requires" : [ ] }, + { "title" : "=", "requires" : [ "shift" ] } + ], + "'" : [ + { "title" : "'", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] }, + { "title" : "`", "requires" : [ "alt-gr", "shift" ] } + ], + "ì" : [ + { "title" : "ì", "requires" : [ ] }, + { "title" : "^", "requires" : [ "shift" ] }, + { "title" : "~", "requires" : [ "alt-gr", "shift" ] } + ], + + "q" : [ + { "title" : "q", "requires" : [ ] }, + { "title" : "Q", "requires" : [ "caps" ] }, + { "title" : "Q", "requires" : [ "shift" ] }, + { "title" : "q", "requires" : [ "caps", "shift" ] } + ], + "w" : [ + { "title" : "w", "requires" : [ ] }, + { "title" : "W", "requires" : [ "caps" ] }, + { "title" : "W", "requires" : [ "shift" ] }, + { "title" : "w", "requires" : [ "caps", "shift" ] } + ], + "e" : [ + { "title" : "e", "requires" : [ ] }, + { "title" : "E", "requires" : [ "caps" ] }, + { "title" : "E", "requires" : [ "shift" ] }, + { "title" : "e", "requires" : [ "caps", "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "r" : [ + { "title" : "r", "requires" : [ ] }, + { "title" : "R", "requires" : [ "caps" ] }, + { "title" : "R", "requires" : [ "shift" ] }, + { "title" : "r", "requires" : [ "caps", "shift" ] } + ], + "t" : [ + { "title" : "t", "requires" : [ ] }, + { "title" : "T", "requires" : [ "caps" ] }, + { "title" : "T", "requires" : [ "shift" ] }, + { "title" : "t", "requires" : [ "caps", "shift" ] } + ], + "y" : [ + { "title" : "y", "requires" : [ ] }, + { "title" : "Y", "requires" : [ "caps" ] }, + { "title" : "Y", "requires" : [ "shift" ] }, + { "title" : "y", "requires" : [ "caps", "shift" ] } + ], + "u" : [ + { "title" : "u", "requires" : [ ] }, + { "title" : "U", "requires" : [ "caps" ] }, + { "title" : "U", "requires" : [ "shift" ] }, + { "title" : "u", "requires" : [ "caps", "shift" ] } + ], + "i" : [ + { "title" : "i", "requires" : [ ] }, + { "title" : "I", "requires" : [ "caps" ] }, + { "title" : "I", "requires" : [ "shift" ] }, + { "title" : "i", "requires" : [ "caps", "shift" ] } + ], + "o" : [ + { "title" : "o", "requires" : [ ] }, + { "title" : "O", "requires" : [ "caps" ] }, + { "title" : "O", "requires" : [ "shift" ] }, + { "title" : "o", "requires" : [ "caps", "shift" ] } + ], + "p" : [ + { "title" : "p", "requires" : [ ] }, + { "title" : "P", "requires" : [ "caps" ] }, + { "title" : "P", "requires" : [ "shift" ] }, + { "title" : "p", "requires" : [ "caps", "shift" ] } + ], + "è" : [ + { "title" : "è", "requires" : [ ] }, + { "title" : "è", "requires" : [ "caps" ] }, + { "title" : "é", "requires" : [ "shift" ] }, + { "title" : "é", "requires" : [ "caps", "shift" ] }, + { "title" : "[", "requires" : [ "alt-gr" ] }, + { "title" : "{", "requires" : [ "alt-gr", "shift" ] } + ], + "+" : [ + { "title" : "+", "requires" : [ ] }, + { "title" : "+", "requires" : [ "caps" ] }, + { "title" : "*", "requires" : [ "shift" ] }, + { "title" : "*", "requires" : [ "caps", "shift" ] }, + { "title" : "]", "requires" : [ "alt-gr" ] }, + { "title" : "}", "requires" : [ "alt-gr", "shift" ] } + ], + "a" : [ + { "title" : "a", "requires" : [ ] }, + { "title" : "A", "requires" : [ "caps" ] }, + { "title" : "A", "requires" : [ "shift" ] }, + { "title" : "a", "requires" : [ "caps", "shift" ] } + ], + "s" : [ + { "title" : "s", "requires" : [ ] }, + { "title" : "S", "requires" : [ "caps" ] }, + { "title" : "S", "requires" : [ "shift" ] }, + { "title" : "s", "requires" : [ "caps", "shift" ] } + ], + "d" : [ + { "title" : "d", "requires" : [ ] }, + { "title" : "D", "requires" : [ "caps" ] }, + { "title" : "D", "requires" : [ "shift" ] }, + { "title" : "d", "requires" : [ "caps", "shift" ] } + ], + "f" : [ + { "title" : "f", "requires" : [ ] }, + { "title" : "F", "requires" : [ "caps" ] }, + { "title" : "F", "requires" : [ "shift" ] }, + { "title" : "f", "requires" : [ "caps", "shift" ] } + ], + "g" : [ + { "title" : "g", "requires" : [ ] }, + { "title" : "G", "requires" : [ "caps" ] }, + { "title" : "G", "requires" : [ "shift" ] }, + { "title" : "g", "requires" : [ "caps", "shift" ] } + ], + "h" : [ + { "title" : "h", "requires" : [ ] }, + { "title" : "H", "requires" : [ "caps" ] }, + { "title" : "H", "requires" : [ "shift" ] }, + { "title" : "h", "requires" : [ "caps", "shift" ] } + ], + "j" : [ + { "title" : "j", "requires" : [ ] }, + { "title" : "J", "requires" : [ "caps" ] }, + { "title" : "J", "requires" : [ "shift" ] }, + { "title" : "j", "requires" : [ "caps", "shift" ] } + ], + "k" : [ + { "title" : "k", "requires" : [ ] }, + { "title" : "K", "requires" : [ "caps" ] }, + { "title" : "K", "requires" : [ "shift" ] }, + { "title" : "k", "requires" : [ "caps", "shift" ] } + ], + "l" : [ + { "title" : "l", "requires" : [ ] }, + { "title" : "L", "requires" : [ "caps" ] }, + { "title" : "L", "requires" : [ "shift" ] }, + { "title" : "l", "requires" : [ "caps", "shift" ] } + ], + "ò" : [ + { "title" : "ò", "requires" : [ ] }, + { "title" : "ò", "requires" : [ "caps" ] }, + { "title" : "ç", "requires" : [ "shift" ] }, + { "title" : "ç", "requires" : [ "caps", "shift" ] }, + { "title" : "@", "requires" : [ "alt-gr" ] } + ], + "à" : [ + { "title" : "à", "requires" : [ ] }, + { "title" : "à", "requires" : [ "caps" ] }, + { "title" : "°", "requires" : [ "shift" ] }, + { "title" : "°", "requires" : [ "caps", "shift" ] }, + { "title" : "#", "requires" : [ "alt-gr" ] } + ], + "ù" : [ + { "title" : "ù", "requires" : [ ] }, + { "title" : "ù", "requires" : [ "caps" ] }, + { "title" : "§", "requires" : [ "shift" ] }, + { "title" : "§", "requires" : [ "caps", "shift" ] } + ], + + "<" : [ + { "title" : "<", "requires" : [ ] }, + { "title" : ">", "requires" : [ "shift" ] } + ], + "z" : [ + { "title" : "z", "requires" : [ ] }, + { "title" : "Z", "requires" : [ "caps" ] }, + { "title" : "Z", "requires" : [ "shift" ] }, + { "title" : "z", "requires" : [ "caps", "shift" ] } + ], + "x" : [ + { "title" : "x", "requires" : [ ] }, + { "title" : "X", "requires" : [ "caps" ] }, + { "title" : "X", "requires" : [ "shift" ] }, + { "title" : "x", "requires" : [ "caps", "shift" ] } + ], + "c" : [ + { "title" : "c", "requires" : [ ] }, + { "title" : "C", "requires" : [ "caps" ] }, + { "title" : "C", "requires" : [ "shift" ] }, + { "title" : "c", "requires" : [ "caps", "shift" ] } + ], + "v" : [ + { "title" : "v", "requires" : [ ] }, + { "title" : "V", "requires" : [ "caps" ] }, + { "title" : "V", "requires" : [ "shift" ] }, + { "title" : "v", "requires" : [ "caps", "shift" ] } + ], + "b" : [ + { "title" : "b", "requires" : [ ] }, + { "title" : "B", "requires" : [ "caps" ] }, + { "title" : "B", "requires" : [ "shift" ] }, + { "title" : "b", "requires" : [ "caps", "shift" ] } + ], + "n" : [ + { "title" : "n", "requires" : [ ] }, + { "title" : "N", "requires" : [ "caps" ] }, + { "title" : "N", "requires" : [ "shift" ] }, + { "title" : "n", "requires" : [ "caps", "shift" ] } + ], + "m" : [ + { "title" : "m", "requires" : [ ] }, + { "title" : "M", "requires" : [ "caps" ] }, + { "title" : "M", "requires" : [ "shift" ] }, + { "title" : "m", "requires" : [ "caps", "shift" ] }, + { "title" : "µ", "requires" : [ "alt-gr" ] } + ], + "," : [ + { "title" : ",", "requires" : [ ] }, + { "title" : ";", "requires" : [ "shift" ] } + ], + "." : [ + { "title" : ".", "requires" : [ ] }, + { "title" : ":", "requires" : [ "shift" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "_", "requires" : [ "shift" ] } + ] + }, + + "layout" : [ + + [ "Esc", 0.8, "F1", "F2", "F3", "F4", + 0.8, "F5", "F6", "F7", "F8", + 0.8, "F9", "F10", "F11", "F12" ], + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "\\", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "'", "ì", "Back" ], + [ "Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "è", "+", 1, 0.6 ], + [ "Caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "ò", "à", "ù", "Enter" ], + [ "LShift", "<", "z", "x", "c", "v", "b", "n", "m", ",", ".", "-", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "AltGr", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Back" : 2, + "Tab" : 1.75, + "\\" : 1.25, + "Caps" : 1.75, + "Enter" : 1.5, + "LShift" : 2.2, + "RShift" : 2.2, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.4, + "AltGr" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/layouts/nl-nl-qwerty.json b/guacamole/src/main/frontend/src/layouts/nl-nl-qwerty.json new file mode 100644 index 0000000..f1e8744 --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/nl-nl-qwerty.json @@ -0,0 +1,464 @@ +{ + + "language" : "nl_NL", + "type" : "qwerty", + "width" : 23, + + "keys" : { + + "Esc" : 65307, + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + + "Space" : " ", + + "Back" : [{ + "title" : "⟵", + "keysym" : 65288 + }], + "Tab" : [{ + "title" : "Tab ↹", + "keysym" : 65289 + }], + "Enter" : [{ + "title" : "↵", + "keysym" : 65293 + }], + "Home" : [{ + "title" : "Home", + "keysym" : 65360 + }], + "PgUp" : [{ + "title" : "PgUp ↑", + "keysym" : 65365 + }], + "PgDn" : [{ + "title" : "PgDn ↓", + "keysym" : 65366 + }], + "End" : [{ + "title" : "End", + "keysym" : 65367 + }], + "Ins" : [{ + "title" : "Ins", + "keysym" : 65379 + }], + "Del" : [{ + "title" : "Del", + "keysym" : 65535 + }], + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "AltGr" : [{ + "title" : "AltGr", + "modifier" : "alt-gr", + "keysym" : 65027 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + + "@" : [ + { "title" : "@", "requires" : [ ] }, + { "title" : "§", "requires" : [ "shift" ] }, + { "title" : "¬", "requires" : [ "alt-gr" ] } + ], + "1" : [ + { "title" : "1", "requires" : [ ] }, + { "title" : "!", "requires" : [ "shift" ] }, + { "title" : "¹", "requires" : [ "alt-gr" ] } + ], + "2" : [ + { "title" : "2", "requires" : [ ] }, + { "title" : "\"", "requires" : [ "shift" ] }, + { "title" : "²", "requires" : [ "alt-gr" ] } + ], + "3" : [ + { "title" : "3", "requires" : [ ] }, + { "title" : "#", "requires" : [ "shift" ] }, + { "title" : "³", "requires" : [ "alt-gr" ] } + ], + "4" : [ + { "title" : "4", "requires" : [ ] }, + { "title" : "$", "requires" : [ "shift" ] }, + { "title" : "¼", "requires" : [ "alt-gr" ] } + ], + "5" : [ + { "title" : "5", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] }, + { "title" : "½", "requires" : [ "alt-gr" ] } + ], + "6" : [ + { "title" : "6", "requires" : [ ] }, + { "title" : "&", "requires" : [ "shift" ] }, + { "title" : "¾", "requires" : [ "alt-gr" ] } + ], + "7" : [ + { "title" : "7", "requires" : [ ] }, + { "title" : "_", "requires" : [ "shift" ] }, + { "title" : "£", "requires" : [ "alt-gr" ] } + ], + "8" : [ + { "title" : "8", "requires" : [ ] }, + { "title" : "(", "requires" : [ "shift" ] }, + { "title" : "{", "requires" : [ "alt-gr" ] } + ], + "9" : [ + { "title" : "9", "requires" : [ ] }, + { "title" : ")", "requires" : [ "shift" ] }, + { "title" : "}", "requires" : [ "alt-gr" ] } + ], + "0" : [ + { "title" : "0", "requires" : [ ] }, + { "title" : "'", "requires" : [ "shift" ] } + ], + "/" : [ + { "title" : "/", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] }, + { "title" : "\\", "requires" : [ "alt-gr" ] } + ], + "°" : [ + { "title" : "°", "requires" : [ ] }, + { "title" : "~", "requires" : [ "shift" ] }, + { "title" : "¸", "requires" : [ "alt-gr" ] } + ], + + "q" : [ + { "title" : "q", "requires" : [ ] }, + { "title" : "Q", "requires" : [ "caps" ] }, + { "title" : "Q", "requires" : [ "shift" ] }, + { "title" : "q", "requires" : [ "caps", "shift" ] } + ], + "w" : [ + { "title" : "w", "requires" : [ ] }, + { "title" : "W", "requires" : [ "caps" ] }, + { "title" : "W", "requires" : [ "shift" ] }, + { "title" : "w", "requires" : [ "caps", "shift" ] } + ], + "e" : [ + { "title" : "e", "requires" : [ ] }, + { "title" : "E", "requires" : [ "caps" ] }, + { "title" : "E", "requires" : [ "shift" ] }, + { "title" : "e", "requires" : [ "caps", "shift" ] }, + { "title" : "€", "requires" : [ "alt-gr" ] } + ], + "r" : [ + { "title" : "r", "requires" : [ ] }, + { "title" : "R", "requires" : [ "caps" ] }, + { "title" : "R", "requires" : [ "shift" ] }, + { "title" : "r", "requires" : [ "caps", "shift" ] }, + { "title" : "¶", "requires" : [ "alt-gr" ] } + ], + "t" : [ + { "title" : "t", "requires" : [ ] }, + { "title" : "T", "requires" : [ "caps" ] }, + { "title" : "T", "requires" : [ "shift" ] }, + { "title" : "t", "requires" : [ "caps", "shift" ] } + ], + "y" : [ + { "title" : "y", "requires" : [ ] }, + { "title" : "Y", "requires" : [ "caps" ] }, + { "title" : "Y", "requires" : [ "shift" ] }, + { "title" : "y", "requires" : [ "caps", "shift" ] } + ], + "u" : [ + { "title" : "u", "requires" : [ ] }, + { "title" : "U", "requires" : [ "caps" ] }, + { "title" : "U", "requires" : [ "shift" ] }, + { "title" : "u", "requires" : [ "caps", "shift" ] } + ], + "i" : [ + { "title" : "i", "requires" : [ ] }, + { "title" : "I", "requires" : [ "caps" ] }, + { "title" : "I", "requires" : [ "shift" ] }, + { "title" : "i", "requires" : [ "caps", "shift" ] } + ], + "o" : [ + { "title" : "o", "requires" : [ ] }, + { "title" : "O", "requires" : [ "caps" ] }, + { "title" : "O", "requires" : [ "shift" ] }, + { "title" : "o", "requires" : [ "caps", "shift" ] } + ], + "p" : [ + { "title" : "p", "requires" : [ ] }, + { "title" : "P", "requires" : [ "caps" ] }, + { "title" : "P", "requires" : [ "shift" ] }, + { "title" : "p", "requires" : [ "caps", "shift" ] } + ], + "¨" : [ + { "title" : "¨", "requires" : [ ] }, + { "title" : "¨", "requires" : [ "caps" ] }, + { "title" : "^", "requires" : [ "shift" ] }, + { "title" : "^", "requires" : [ "caps", "shift" ] } + ], + "*" : [ + { "title" : "*", "requires" : [ ] }, + { "title" : "*", "requires" : [ "caps" ] }, + { "title" : "|", "requires" : [ "shift" ] }, + { "title" : "|", "requires" : [ "caps", "shift" ] } + ], + "a" : [ + { "title" : "a", "requires" : [ ] }, + { "title" : "A", "requires" : [ "caps" ] }, + { "title" : "A", "requires" : [ "shift" ] }, + { "title" : "a", "requires" : [ "caps", "shift" ] } + ], + "s" : [ + { "title" : "s", "requires" : [ ] }, + { "title" : "S", "requires" : [ "caps" ] }, + { "title" : "S", "requires" : [ "shift" ] }, + { "title" : "s", "requires" : [ "caps", "shift" ] }, + { "title" : "ß", "requires" : [ "alt-gr" ] } + ], + "d" : [ + { "title" : "d", "requires" : [ ] }, + { "title" : "D", "requires" : [ "caps" ] }, + { "title" : "D", "requires" : [ "shift" ] }, + { "title" : "d", "requires" : [ "caps", "shift" ] } + ], + "f" : [ + { "title" : "f", "requires" : [ ] }, + { "title" : "F", "requires" : [ "caps" ] }, + { "title" : "F", "requires" : [ "shift" ] }, + { "title" : "f", "requires" : [ "caps", "shift" ] } + ], + "g" : [ + { "title" : "g", "requires" : [ ] }, + { "title" : "G", "requires" : [ "caps" ] }, + { "title" : "G", "requires" : [ "shift" ] }, + { "title" : "g", "requires" : [ "caps", "shift" ] } + ], + "h" : [ + { "title" : "h", "requires" : [ ] }, + { "title" : "H", "requires" : [ "caps" ] }, + { "title" : "H", "requires" : [ "shift" ] }, + { "title" : "h", "requires" : [ "caps", "shift" ] } + ], + "j" : [ + { "title" : "j", "requires" : [ ] }, + { "title" : "J", "requires" : [ "caps" ] }, + { "title" : "J", "requires" : [ "shift" ] }, + { "title" : "j", "requires" : [ "caps", "shift" ] } + ], + "k" : [ + { "title" : "k", "requires" : [ ] }, + { "title" : "K", "requires" : [ "caps" ] }, + { "title" : "K", "requires" : [ "shift" ] }, + { "title" : "k", "requires" : [ "caps", "shift" ] } + ], + "l" : [ + { "title" : "l", "requires" : [ ] }, + { "title" : "L", "requires" : [ "caps" ] }, + { "title" : "L", "requires" : [ "shift" ] }, + { "title" : "l", "requires" : [ "caps", "shift" ] } + ], + "+" : [ + { "title" : "+", "requires" : [ ] }, + { "title" : "+", "requires" : [ "caps" ] }, + { "title" : "±", "requires" : [ "shift" ] }, + { "title" : "±", "requires" : [ "caps", "shift" ] } + ], + "´" : [ + { "title" : "´", "requires" : [ ] }, + { "title" : "´", "requires" : [ "caps" ] }, + { "title" : "`", "requires" : [ "shift" ] }, + { "title" : "`", "requires" : [ "caps", "shift" ] } + ], + "<" : [ + { "title" : "<", "requires" : [ ] }, + { "title" : "<", "requires" : [ "caps" ] }, + { "title" : ">", "requires" : [ "shift" ] }, + { "title" : ">", "requires" : [ "caps", "shift" ] } + ], + + "]" : [ + { "title" : "]", "requires" : [ ] }, + { "title" : "]", "requires" : [ "caps" ] }, + { "title" : "[", "requires" : [ "shift" ] }, + { "title" : "[", "requires" : [ "caps", "shift" ] }, + { "title" : "¦", "requires" : [ "alt-gr" ] } + ], + "z" : [ + { "title" : "z", "requires" : [ ] }, + { "title" : "Z", "requires" : [ "caps" ] }, + { "title" : "Z", "requires" : [ "shift" ] }, + { "title" : "z", "requires" : [ "caps", "shift" ] }, + { "title" : "«", "requires" : [ "alt-gr" ] } + ], + "x" : [ + { "title" : "x", "requires" : [ ] }, + { "title" : "X", "requires" : [ "caps" ] }, + { "title" : "X", "requires" : [ "shift" ] }, + { "title" : "x", "requires" : [ "caps", "shift" ] }, + { "title" : "»", "requires" : [ "alt-gr" ] } + ], + "c" : [ + { "title" : "c", "requires" : [ ] }, + { "title" : "C", "requires" : [ "caps" ] }, + { "title" : "C", "requires" : [ "shift" ] }, + { "title" : "c", "requires" : [ "caps", "shift" ] }, + { "title" : "¢", "requires" : [ "alt-gr" ] } + ], + "v" : [ + { "title" : "v", "requires" : [ ] }, + { "title" : "V", "requires" : [ "caps" ] }, + { "title" : "V", "requires" : [ "shift" ] }, + { "title" : "v", "requires" : [ "caps", "shift" ] } + ], + "b" : [ + { "title" : "b", "requires" : [ ] }, + { "title" : "B", "requires" : [ "caps" ] }, + { "title" : "B", "requires" : [ "shift" ] }, + { "title" : "b", "requires" : [ "caps", "shift" ] } + ], + "n" : [ + { "title" : "n", "requires" : [ ] }, + { "title" : "N", "requires" : [ "caps" ] }, + { "title" : "N", "requires" : [ "shift" ] }, + { "title" : "n", "requires" : [ "caps", "shift" ] } + ], + "m" : [ + { "title" : "m", "requires" : [ ] }, + { "title" : "M", "requires" : [ "caps" ] }, + { "title" : "M", "requires" : [ "shift" ] }, + { "title" : "m", "requires" : [ "caps", "shift" ] }, + { "title" : "µ", "requires" : [ "alt-gr" ] } + ], + "," : [ + { "title" : ",", "requires" : [ ] }, + { "title" : ";", "requires" : [ "shift" ] } + ], + "." : [ + { "title" : ".", "requires" : [ ] }, + { "title" : ":", "requires" : [ "shift" ] }, + { "title" : "·", "requires" : [ "alt-gr" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "=", "requires" : [ "shift" ] } + ] + }, + + "layout" : [ + + [ "Esc", 0.8, "F1", "F2", "F3", "F4", + 0.8, "F5", "F6", "F7", "F8", + 0.8, "F9", "F10", "F11", "F12" ], + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "@", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "/", "°", "Back" ], + [ "Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "¨", "*", 1, 0.6 ], + [ "Caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "+", "´", "<", "Enter" ], + [ "LShift", "]", "z", "x", "c", "v", "b", "n", "m", ",", ".", "-", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "AltGr", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Back" : 2.3, + "Tab" : 1.75, + "\\" : 1.25, + "Caps" : 1.75, + "Enter" : 1.5, + "LShift" : 2.2, + "RShift" : 2.2, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.4, + "AltGr" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/layouts/ru-ru-qwerty.json b/guacamole/src/main/frontend/src/layouts/ru-ru-qwerty.json new file mode 100644 index 0000000..63fa1cf --- /dev/null +++ b/guacamole/src/main/frontend/src/layouts/ru-ru-qwerty.json @@ -0,0 +1,546 @@ +{ + + "language" : "ru_RU", + "type" : "qwerty", + "width" : 22, + + "keys" : { + + "Back" : 65288, + "Tab" : 65289, + "Enter" : 65293, + "Esc" : 65307, + "Home" : 65360, + "PgUp" : 65365, + "PgDn" : 65366, + "End" : 65367, + "Ins" : 65379, + "F1" : 65470, + "F2" : 65471, + "F3" : 65472, + "F4" : 65473, + "F5" : 65474, + "F6" : 65475, + "F7" : 65476, + "F8" : 65477, + "F9" : 65478, + "F10" : 65479, + "F11" : 65480, + "F12" : 65481, + "Del" : 65535, + + "Space" : " ", + + "Left" : [{ + "title" : "←", + "keysym" : 65361 + }], + "Up" : [{ + "title" : "↑", + "keysym" : 65362 + }], + "Right" : [{ + "title" : "→", + "keysym" : 65363 + }], + "Down" : [{ + "title" : "↓", + "keysym" : 65364 + }], + + "Menu" : [{ + "title" : "Menu", + "keysym" : 65383 + }], + "LShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65505 + }], + "RShift" : [{ + "title" : "Shift", + "modifier" : "shift", + "keysym" : 65506 + }], + "LCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65507 + }], + "RCtrl" : [{ + "title" : "Ctrl", + "modifier" : "control", + "keysym" : 65508 + }], + "Caps" : [{ + "title" : "Caps", + "modifier" : "caps", + "keysym" : 65509 + }], + "LAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65513 + }], + "RAlt" : [{ + "title" : "Alt", + "modifier" : "alt", + "keysym" : 65514 + }], + "Meta" : [{ + "title" : "Meta", + "modifier" : "meta", + "keysym" : 65511 + }], + "Latin" : [{ + "title" : "Latin", + "modifier" : "lat" + }], + + "`" : [ + { "title" : "`", "requires" : [ ] }, + { "title" : "~", "requires" : [ "shift" ] } + ], + "1" : [ + { "title" : "1", "requires" : [ ] }, + { "title" : "!", "requires" : [ "shift" ] } + ], + "2" : [ + { "title" : "2", "requires" : [ ] }, + { "title" : "@", "requires" : [ "shift" ] } + ], + "3" : [ + { "title" : "3", "requires" : [ ] }, + { "title" : "#", "requires" : [ "shift" ] } + ], + "4" : [ + { "title" : "4", "requires" : [ ] }, + { "title" : "$", "requires" : [ "shift" ] } + ], + "5" : [ + { "title" : "5", "requires" : [ ] }, + { "title" : "%", "requires" : [ "shift" ] } + ], + "6" : [ + { "title" : "6", "requires" : [ ] }, + { "title" : "^", "requires" : [ "shift" ] } + ], + "7" : [ + { "title" : "7", "requires" : [ ] }, + { "title" : "&", "requires" : [ "shift" ] } + ], + "8" : [ + { "title" : "8", "requires" : [ ] }, + { "title" : "*", "requires" : [ "shift" ] } + ], + "9" : [ + { "title" : "9", "requires" : [ ] }, + { "title" : "(", "requires" : [ "shift" ] } + ], + "0" : [ + { "title" : "0", "requires" : [ ] }, + { "title" : ")", "requires" : [ "shift" ] } + ], + "-" : [ + { "title" : "-", "requires" : [ ] }, + { "title" : "_", "requires" : [ "shift" ] } + ], + "=" : [ + { "title" : "=", "requires" : [ ] }, + { "title" : "+", "requires" : [ "shift" ] } + ], + "б" : [ + { "title" : "б", "requires" : [ ] }, + { "title" : "Б", "requires" : [ "caps" ] }, + { "title" : "Б", "requires" : [ "shift" ] }, + { "title" : "б", "requires" : [ "caps", "shift" ] }, + { "title" : ",", "requires" : [ "lat" ] }, + { "title" : "<", "requires" : [ "lat", "shift" ] } + ], + "ю" : [ + { "title" : "ю", "requires" : [ ] }, + { "title" : "Ю", "requires" : [ "caps" ] }, + { "title" : "Ю", "requires" : [ "shift" ] }, + { "title" : "ю", "requires" : [ "caps", "shift" ] }, + { "title" : ".", "requires" : [ "lat" ] }, + { "title" : ">", "requires" : [ "lat", "shift" ] } + ], + "/" : [ + { "title" : "/", "requires" : [ ] }, + { "title" : "?", "requires" : [ "shift" ] } + ], + "х" : [ + { "title" : "х", "requires" : [ ] }, + { "title" : "Х", "requires" : [ "caps" ] }, + { "title" : "Х", "requires" : [ "shift" ] }, + { "title" : "х", "requires" : [ "caps", "shift" ] }, + { "title" : "[", "requires" : [ "lat" ] }, + { "title" : "{", "requires" : [ "lat", "shift" ] } + ], + "ъ" : [ + { "title" : "ъ", "requires" : [ ] }, + { "title" : "Ъ", "requires" : [ "caps" ] }, + { "title" : "Ъ", "requires" : [ "shift" ] }, + { "title" : "ъ", "requires" : [ "caps", "shift" ] }, + { "title" : "]", "requires" : [ "lat" ] }, + { "title" : "}", "requires" : [ "lat", "shift" ] } + ], + "\\" : [ + { "title" : "\\", "requires" : [ ] }, + { "title" : "|", "requires" : [ "shift" ] } + ], + "ж" : [ + { "title" : "ж", "requires" : [ ] }, + { "title" : "Ж", "requires" : [ "caps" ] }, + { "title" : "Ж", "requires" : [ "shift" ] }, + { "title" : "ж", "requires" : [ "caps", "shift" ] }, + { "title" : ";", "requires" : [ "lat" ] }, + { "title" : ":", "requires" : [ "lat", "shift" ] } + ], + "э" : [ + { "title" : "э", "requires" : [ ] }, + { "title" : "Э", "requires" : [ "caps" ] }, + { "title" : "Э", "requires" : [ "shift" ] }, + { "title" : "э", "requires" : [ "caps", "shift" ] }, + { "title" : "'", "requires" : [ "lat" ] }, + { "title" : "\"", "requires" : [ "lat", "shift" ] } + ], + + "й" : [ + { "title" : "й", "requires" : [ ] }, + { "title" : "Й", "requires" : [ "caps" ] }, + { "title" : "Й", "requires" : [ "shift" ] }, + { "title" : "й", "requires" : [ "caps", "shift" ] }, + { "title" : "q", "requires" : [ "lat" ] }, + { "title" : "Q", "requires" : [ "lat", "caps" ] }, + { "title" : "Q", "requires" : [ "lat", "shift" ] }, + { "title" : "q", "requires" : [ "lat", "caps", "shift" ] } + ], + "ц" : [ + { "title" : "ц", "requires" : [ ] }, + { "title" : "Ц", "requires" : [ "caps" ] }, + { "title" : "Ц", "requires" : [ "shift" ] }, + { "title" : "ц", "requires" : [ "caps", "shift" ] }, + { "title" : "w", "requires" : [ "lat" ] }, + { "title" : "W", "requires" : [ "lat", "caps" ] }, + { "title" : "W", "requires" : [ "lat", "shift" ] }, + { "title" : "w", "requires" : [ "lat", "caps", "shift" ] } + ], + "у" : [ + { "title" : "у", "requires" : [ ] }, + { "title" : "У", "requires" : [ "caps" ] }, + { "title" : "У", "requires" : [ "shift" ] }, + { "title" : "у", "requires" : [ "caps", "shift" ] }, + { "title" : "e", "requires" : [ "lat" ] }, + { "title" : "E", "requires" : [ "lat", "caps" ] }, + { "title" : "E", "requires" : [ "lat", "shift" ] }, + { "title" : "e", "requires" : [ "lat", "caps", "shift" ] } + ], + "к" : [ + { "title" : "к", "requires" : [ ] }, + { "title" : "К", "requires" : [ "caps" ] }, + { "title" : "К", "requires" : [ "shift" ] }, + { "title" : "к", "requires" : [ "caps", "shift" ] }, + { "title" : "r", "requires" : [ "lat" ] }, + { "title" : "R", "requires" : [ "lat", "caps" ] }, + { "title" : "R", "requires" : [ "lat", "shift" ] }, + { "title" : "r", "requires" : [ "lat", "caps", "shift" ] } + ], + "е" : [ + { "title" : "е", "requires" : [ ] }, + { "title" : "Е", "requires" : [ "caps" ] }, + { "title" : "Е", "requires" : [ "shift" ] }, + { "title" : "е", "requires" : [ "caps", "shift" ] }, + { "title" : "t", "requires" : [ "lat" ] }, + { "title" : "T", "requires" : [ "lat", "caps" ] }, + { "title" : "T", "requires" : [ "lat", "shift" ] }, + { "title" : "t", "requires" : [ "lat", "caps", "shift" ] } + ], + "н" : [ + { "title" : "н", "requires" : [ ] }, + { "title" : "Н", "requires" : [ "caps" ] }, + { "title" : "Н", "requires" : [ "shift" ] }, + { "title" : "н", "requires" : [ "caps", "shift" ] }, + { "title" : "y", "requires" : [ "lat" ] }, + { "title" : "Y", "requires" : [ "lat", "caps" ] }, + { "title" : "Y", "requires" : [ "lat", "shift" ] }, + { "title" : "y", "requires" : [ "lat", "caps", "shift" ] } + ], + "г" : [ + { "title" : "г", "requires" : [ ] }, + { "title" : "Г", "requires" : [ "caps" ] }, + { "title" : "Г", "requires" : [ "shift" ] }, + { "title" : "г", "requires" : [ "caps", "shift" ] }, + { "title" : "u", "requires" : [ "lat" ] }, + { "title" : "U", "requires" : [ "lat", "caps" ] }, + { "title" : "U", "requires" : [ "lat", "shift" ] }, + { "title" : "u", "requires" : [ "lat", "caps", "shift" ] } + ], + "ш" : [ + { "title" : "ш", "requires" : [ ] }, + { "title" : "Ш", "requires" : [ "caps" ] }, + { "title" : "Ш", "requires" : [ "shift" ] }, + { "title" : "ш", "requires" : [ "caps", "shift" ] }, + { "title" : "i", "requires" : [ "lat" ] }, + { "title" : "I", "requires" : [ "lat", "caps" ] }, + { "title" : "I", "requires" : [ "lat", "shift" ] }, + { "title" : "i", "requires" : [ "lat", "caps", "shift" ] } + ], + "щ" : [ + { "title" : "щ", "requires" : [ ] }, + { "title" : "Щ", "requires" : [ "caps" ] }, + { "title" : "Щ", "requires" : [ "shift" ] }, + { "title" : "щ", "requires" : [ "caps", "shift" ] }, + { "title" : "o", "requires" : [ "lat" ] }, + { "title" : "O", "requires" : [ "lat", "caps" ] }, + { "title" : "O", "requires" : [ "lat", "shift" ] }, + { "title" : "o", "requires" : [ "lat", "caps", "shift" ] } + ], + "з" : [ + { "title" : "з", "requires" : [ ] }, + { "title" : "З", "requires" : [ "caps" ] }, + { "title" : "З", "requires" : [ "shift" ] }, + { "title" : "з", "requires" : [ "caps", "shift" ] }, + { "title" : "p", "requires" : [ "lat" ] }, + { "title" : "P", "requires" : [ "lat", "caps" ] }, + { "title" : "P", "requires" : [ "lat", "shift" ] }, + { "title" : "p", "requires" : [ "lat", "caps", "shift" ] } + ], + "ф" : [ + { "title" : "ф", "requires" : [ ] }, + { "title" : "Ф", "requires" : [ "caps" ] }, + { "title" : "Ф", "requires" : [ "shift" ] }, + { "title" : "ф", "requires" : [ "caps", "shift" ] }, + { "title" : "a", "requires" : [ "lat" ] }, + { "title" : "A", "requires" : [ "lat", "caps" ] }, + { "title" : "A", "requires" : [ "lat", "shift" ] }, + { "title" : "a", "requires" : [ "lat", "caps", "shift" ] } + ], + "ы" : [ + { "title" : "ы", "requires" : [ ] }, + { "title" : "Ы", "requires" : [ "caps" ] }, + { "title" : "Ы", "requires" : [ "shift" ] }, + { "title" : "ы", "requires" : [ "caps", "shift" ] }, + { "title" : "s", "requires" : [ "lat" ] }, + { "title" : "S", "requires" : [ "lat", "caps" ] }, + { "title" : "S", "requires" : [ "lat", "shift" ] }, + { "title" : "s", "requires" : [ "lat", "caps", "shift" ] } + ], + "в" : [ + { "title" : "в", "requires" : [ ] }, + { "title" : "В", "requires" : [ "caps" ] }, + { "title" : "В", "requires" : [ "shift" ] }, + { "title" : "в", "requires" : [ "caps", "shift" ] }, + { "title" : "d", "requires" : [ "lat" ] }, + { "title" : "D", "requires" : [ "lat", "caps" ] }, + { "title" : "D", "requires" : [ "lat", "shift" ] }, + { "title" : "d", "requires" : [ "lat", "caps", "shift" ] } + ], + "а" : [ + { "title" : "а", "requires" : [ ] }, + { "title" : "А", "requires" : [ "caps" ] }, + { "title" : "А", "requires" : [ "shift" ] }, + { "title" : "а", "requires" : [ "caps", "shift" ] }, + { "title" : "f", "requires" : [ "lat" ] }, + { "title" : "F", "requires" : [ "lat", "caps" ] }, + { "title" : "F", "requires" : [ "lat", "shift" ] }, + { "title" : "f", "requires" : [ "lat", "caps", "shift" ] } + ], + "п" : [ + { "title" : "п", "requires" : [ ] }, + { "title" : "П", "requires" : [ "caps" ] }, + { "title" : "П", "requires" : [ "shift" ] }, + { "title" : "п", "requires" : [ "caps", "shift" ] }, + { "title" : "g", "requires" : [ "lat" ] }, + { "title" : "G", "requires" : [ "lat", "caps" ] }, + { "title" : "G", "requires" : [ "lat", "shift" ] }, + { "title" : "g", "requires" : [ "lat", "caps", "shift" ] } + ], + "р" : [ + { "title" : "р", "requires" : [ ] }, + { "title" : "Р", "requires" : [ "caps" ] }, + { "title" : "Р", "requires" : [ "shift" ] }, + { "title" : "р", "requires" : [ "caps", "shift" ] }, + { "title" : "h", "requires" : [ "lat" ] }, + { "title" : "H", "requires" : [ "lat", "caps" ] }, + { "title" : "H", "requires" : [ "lat", "shift" ] }, + { "title" : "h", "requires" : [ "lat", "caps", "shift" ] } + ], + "о" : [ + { "title" : "о", "requires" : [ ] }, + { "title" : "О", "requires" : [ "caps" ] }, + { "title" : "О", "requires" : [ "shift" ] }, + { "title" : "о", "requires" : [ "caps", "shift" ] }, + { "title" : "j", "requires" : [ "lat" ] }, + { "title" : "J", "requires" : [ "lat", "caps" ] }, + { "title" : "J", "requires" : [ "lat", "shift" ] }, + { "title" : "j", "requires" : [ "lat", "caps", "shift" ] } + ], + "л" : [ + { "title" : "л", "requires" : [ ] }, + { "title" : "Л", "requires" : [ "caps" ] }, + { "title" : "Л", "requires" : [ "shift" ] }, + { "title" : "л", "requires" : [ "caps", "shift" ] }, + { "title" : "k", "requires" : [ "lat" ] }, + { "title" : "K", "requires" : [ "lat", "caps" ] }, + { "title" : "K", "requires" : [ "lat", "shift" ] }, + { "title" : "k", "requires" : [ "lat", "caps", "shift" ] } + ], + "д" : [ + { "title" : "д", "requires" : [ ] }, + { "title" : "Д", "requires" : [ "caps" ] }, + { "title" : "Д", "requires" : [ "shift" ] }, + { "title" : "д", "requires" : [ "caps", "shift" ] }, + { "title" : "l", "requires" : [ "lat" ] }, + { "title" : "L", "requires" : [ "lat", "caps" ] }, + { "title" : "L", "requires" : [ "lat", "shift" ] }, + { "title" : "l", "requires" : [ "lat", "caps", "shift" ] } + ], + "я" : [ + { "title" : "я", "requires" : [ ] }, + { "title" : "Я", "requires" : [ "caps" ] }, + { "title" : "Я", "requires" : [ "shift" ] }, + { "title" : "я", "requires" : [ "caps", "shift" ] }, + { "title" : "z", "requires" : [ "lat" ] }, + { "title" : "Z", "requires" : [ "lat", "caps" ] }, + { "title" : "Z", "requires" : [ "lat", "shift" ] }, + { "title" : "z", "requires" : [ "lat", "caps", "shift" ] } + ], + "ч" : [ + { "title" : "ч", "requires" : [ ] }, + { "title" : "Ч", "requires" : [ "caps" ] }, + { "title" : "Ч", "requires" : [ "shift" ] }, + { "title" : "ч", "requires" : [ "caps", "shift" ] }, + { "title" : "x", "requires" : [ "lat" ] }, + { "title" : "X", "requires" : [ "lat", "caps" ] }, + { "title" : "X", "requires" : [ "lat", "shift" ] }, + { "title" : "x", "requires" : [ "lat", "caps", "shift" ] } + ], + "с" : [ + { "title" : "с", "requires" : [ ] }, + { "title" : "С", "requires" : [ "caps" ] }, + { "title" : "С", "requires" : [ "shift" ] }, + { "title" : "с", "requires" : [ "caps", "shift" ] }, + { "title" : "c", "requires" : [ "lat" ] }, + { "title" : "C", "requires" : [ "lat", "caps" ] }, + { "title" : "C", "requires" : [ "lat", "shift" ] }, + { "title" : "c", "requires" : [ "lat", "caps", "shift" ] } + ], + "м" : [ + { "title" : "м", "requires" : [ ] }, + { "title" : "М", "requires" : [ "caps" ] }, + { "title" : "М", "requires" : [ "shift" ] }, + { "title" : "м", "requires" : [ "caps", "shift" ] }, + { "title" : "v", "requires" : [ "lat" ] }, + { "title" : "V", "requires" : [ "lat", "caps" ] }, + { "title" : "V", "requires" : [ "lat", "shift" ] }, + { "title" : "v", "requires" : [ "lat", "caps", "shift" ] } + ], + "и" : [ + { "title" : "и", "requires" : [ ] }, + { "title" : "И", "requires" : [ "caps" ] }, + { "title" : "И", "requires" : [ "shift" ] }, + { "title" : "и", "requires" : [ "caps", "shift" ] }, + { "title" : "b", "requires" : [ "lat" ] }, + { "title" : "B", "requires" : [ "lat", "caps" ] }, + { "title" : "B", "requires" : [ "lat", "shift" ] }, + { "title" : "b", "requires" : [ "lat", "caps", "shift" ] } + ], + "т" : [ + { "title" : "т", "requires" : [ ] }, + { "title" : "Т", "requires" : [ "caps" ] }, + { "title" : "Т", "requires" : [ "shift" ] }, + { "title" : "т", "requires" : [ "caps", "shift" ] }, + { "title" : "n", "requires" : [ "lat" ] }, + { "title" : "N", "requires" : [ "lat", "caps" ] }, + { "title" : "N", "requires" : [ "lat", "shift" ] }, + { "title" : "n", "requires" : [ "lat", "caps", "shift" ] } + ], + "ь" : [ + { "title" : "ь", "requires" : [ ] }, + { "title" : "Ь", "requires" : [ "caps" ] }, + { "title" : "Ь", "requires" : [ "shift" ] }, + { "title" : "ь", "requires" : [ "caps", "shift" ] }, + { "title" : "m", "requires" : [ "lat" ] }, + { "title" : "M", "requires" : [ "lat", "caps" ] }, + { "title" : "M", "requires" : [ "lat", "shift" ] }, + { "title" : "m", "requires" : [ "lat", "caps", "shift" ] } + ] + + }, + + "layout" : [ + + { + "top" : { + "function": [ + + [ "Esc", 0.7, "F1", "F2", "F3", "F4", + 0.7, "F5", "F6", "F7", "F8", + 0.7, "F9", "F10", "F11", "F12" ] + + ], + + "virtual": [ + + [ "Latin" ] + + ] + } + }, + + [ 0.1 ], + + { + "main" : { + "alpha" : [ + + [ "`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "Back" ], + [ "Tab", "й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ", "\\" ], + [ "Caps", "ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э", "Enter" ], + [ "LShift", "я", "ч", "с", "м", "и", "т", "ь", "б", "ю", "/", "RShift" ], + [ "LCtrl", "Meta", "LAlt", "Space", "RAlt", "Menu", "RCtrl" ] + + ], + + "movement" : [ + [ "Ins", "Home", "PgUp" ], + [ "Del", "End", "PgDn" ], + [ 1.1 ], + [ "Up" ], + [ "Left", "Down", "Right" ] + ] + } + } + + ], + + "keyWidths" : { + + "Back" : 2, + "Tab" : 1.5, + "\\" : 1.5, + "Caps" : 1.85, + "Enter" : 2.25, + "LShift" : 2.1, + "RShift" : 3.1, + + "LCtrl" : 1.6, + "Meta" : 1.6, + "LAlt" : 1.6, + "Space" : 6.1, + "RAlt" : 1.6, + "Menu" : 1.6, + "RCtrl" : 1.6, + + "Latin": 1.6, + "Ins" : 1.6, + "Home" : 1.6, + "PgUp" : 1.6, + "Del" : 1.6, + "End" : 1.6, + "PgDn" : 1.6 + + } + +} diff --git a/guacamole/src/main/frontend/src/manifest.json b/guacamole/src/main/frontend/src/manifest.json new file mode 100644 index 0000000..8ec7653 --- /dev/null +++ b/guacamole/src/main/frontend/src/manifest.json @@ -0,0 +1,24 @@ +{ + "name": "Guacamole", + "short_name": "Guacamole", + "description": "Guacamole", + "start_url": ".", + "display": "standalone", + "icons": [ + { + "src": "./images/logo-vector.svg", + "type": "image/svg+xml", + "sizes": "512x512" + }, + { + "src": "./images/logo-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "./images/logo-192.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} diff --git a/guacamole/src/main/frontend/src/relocateParameters.js b/guacamole/src/main/frontend/src/relocateParameters.js new file mode 100644 index 0000000..f3d0e00 --- /dev/null +++ b/guacamole/src/main/frontend/src/relocateParameters.js @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Reformats the URL of the current page such that normal query parameters will + * be received by AngularJS. If possible, this reformatting operation will be + * performed using the HTML5 History API, thus avoiding reloading the page. + * + * For example, if a user visits the following URL: + * + * http://example.org/some/application/?foo=bar + * + * this script will reformat the URL as: + * + * http://example.org/some/application/#/?foo=bar + * + * If the URL does not contain query parameters, or the query parameters are + * already in a format which AngularJS can read, then the URL is left + * untouched. + * + * If query parameters are present both in the normal non-Angular format AND + * within the URL fragment identifier, the query parameters are merged such + * that AngularJS can read all parameters. + * + * @private + * @param {Location} location + * The Location object representing the URL of the current page. + */ +(function relocateParameters(location){ + + /** + * The default path, including leading '#' character, which should be used + * if the URL of the current page has no fragment identifier. + * + * @constant + * @type String + */ + var DEFAULT_ANGULAR_PATH = '#/'; + + /** + * The query parameters within the URL of the current page, including the + * leading '?' character. + * + * @type String + */ + var parameters = location.search; + + /** + * The base URL of the current page, containing only the protocol, hostname, + * and path. Query parameters and the fragment, if any, are excluded. + * + * @type String + */ + var baseUrl = location.origin + location.pathname; + + /** + * The Angular-specific path within the fragment identifier of the URL of + * the current page, including the leading '#' character of the fragment + * identifier. If no fragment identifier is present, the deafult path will + * be used. + * + * @type String + */ + var angularUrl = location.hash || DEFAULT_ANGULAR_PATH; + + /** + * Appends the given parameter string to the given URL. The URL may already + * contain parameters. + * + * @param {String} url + * The URL that the given parameters should be appended to, which may + * already contain parameters. + * + * @param {String} parameters + * The parameters which should be appended to the given URL, including + * leading '?' character. + * + * @returns {String} + * A properly-formatted URL consisting of the given URL and additional + * parameters. + */ + var appendParameters = function appendParameters(url, parameters) { + + // If URL already contains parameters, replace the leading '?' with an + // '&' prior to appending more parameters + if (url.indexOf('?') !== -1) + return url + '&' + parameters.substring(1); + + // Otherwise, the provided parameters already contains the necessary + // '?' character - just append + return url + parameters; + + }; + + // If non-Angular query parameters are present, reformat the URL such that + // they are after the path and thus visible to Angular + if (parameters) { + + // Reformat the URL such that query parameters are after Angular's path + var reformattedUrl = appendParameters(baseUrl + angularUrl, parameters); + + // Simply rewrite the visible URL if the HTML5 History API is supported + if (window.history && history.replaceState) + history.replaceState(null, document.title, reformattedUrl); + + // Otherwise, redirect to the reformatted URL + else + location.href = reformattedUrl; + + } + +})(window.location); diff --git a/guacamole/src/main/frontend/src/translations/ca.json b/guacamole/src/main/frontend/src/translations/ca.json new file mode 100644 index 0000000..224702e --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/ca.json @@ -0,0 +1,989 @@ +{ + + "NAME" : "Catalan", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "D'acord", + "ACTION_CANCEL" : "Cancel·la", + "ACTION_CLEAR" : "Neteja", + "ACTION_CLONE" : "Clona", + "ACTION_CONTINUE" : "Continua", + "ACTION_DELETE" : "Suprimeix", + "ACTION_DELETE_SESSIONS" : "Mata Sessions", + "ACTION_DOWNLOAD" : "Descarrega", + "ACTION_IMPORT" : "Importa", + "ACTION_LOGIN" : "Inicia sessió", + "ACTION_LOGIN_AGAIN" : "Torna a iniciar", + "ACTION_LOGOUT" : "Tanca la sessió", + "ACTION_MANAGE_CONNECTIONS" : "Connexions", + "ACTION_MANAGE_PREFERENCES" : "Preferències", + "ACTION_MANAGE_SETTINGS" : "Configuració", + "ACTION_MANAGE_SESSIONS" : "Sessions actives", + "ACTION_MANAGE_USERS" : "Usuaris", + "ACTION_MANAGE_USER_GROUPS" : "Grups", + "ACTION_NAVIGATE_BACK" : "Enrera", + "ACTION_NAVIGATE_HOME" : "Inici", + "ACTION_PAUSE" : "Pausa", + "ACTION_PLAY" : "Reprodueix", + "ACTION_SAVE" : "Desa", + "ACTION_SEARCH" : "Cerca", + "ACTION_SHARE" : "Comparteix", + "ACTION_UPDATE_PASSWORD" : "Actualitza la contrasenya", + "ACTION_VIEW_HISTORY" : "Historial", + "ACTION_VIEW_RECORDING" : "Veure", + + "DIALOG_HEADER_ERROR" : "Error", + + "ERROR_PAGE_UNAVAILABLE" : "S'ha produït un error i aquesta acció no es pot completar. Si el problema continua, aviseu l'administrador del sistema o comproveu els registres del vostre sistema.", + "ERROR_PASSWORD_BLANK" : "La vostra contrasenya no pot estar en blanc.", + "ERROR_PASSWORD_MISMATCH" : "Les contrasenyes proporcionades no coincideixen.", + "ERROR_SINGLE_FILE_ONLY" : "Penjeu un sol fitxer cada vegada.", + + "FIELD_HEADER_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Torneu a escriure la contrasenya:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtre", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Actualment en ús per {USERS} {USERS, plural, one{usuari} other{usrris}}.", + "INFO_LOGGED_OUT" : "Us heu desconnectat.", + + "TEXT_ANONYMOUS_USER" : "Anònim", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{segon} other{segons}}} minute{{VALUE, plural, one{minut} other{minuts}}} hour{{VALUE, plural, one{hora} other{hores}}} day{{VALUE, plural, one{dia} other{dies}}} other{}}" + + }, + + "CLIENT" : { + + "ACTION_DISCONNECT" : "Desconnecta", + "ACTION_RECONNECT" : "Torneu a connectar", + "ACTION_SHOW_CLIPBOARD" : "Feu clic per veure les dades del porta-retalls.", + "ACTION_UPLOAD_FILES" : "Carregueu fitxers", + + "DIALOG_HEADER_CONNECTING" : "Connectant", + "DIALOG_HEADER_CONNECTION_ERROR" : "Error de connexió", + "DIALOG_HEADER_DISCONNECTED" : "Desconnectat", + + "ERROR_CLIENT_201" : "Aquesta connexió s'ha tancat perquè el servidor està ocupat. Espereu uns minuts i torna-ho a provar.", + "ERROR_CLIENT_202" : "El servidor Guacamole ha tancat la connexió perquè l'escriptori remot triga massa temps a respondre. Intenteu-ho de nou o poseu-vos en contacte amb l'administrador del vostre sistema.", + "ERROR_CLIENT_203" : "El servidor d'escriptori remot ha trobat un error i ha tancat la connexió. Intenteu-ho de nou o poseu-vos en contacte amb l'administrador del vostre sistema.", + "ERROR_CLIENT_207" : "El servidor d'escriptori remot actualment no es pot aconseguir. Si el problema continua, aviseu l'administrador del sistema o comproveu els registres del sistema.", + "ERROR_CLIENT_208" : "Actualment el servidor d'escriptori remot no està disponible. Si el problema continua, aviseu l'administrador del sistema o comproveu els registres del vostre sistema.", + "ERROR_CLIENT_209" : "El servidor d'escriptori remot ha tancat la connexió perquè entra en conflicte amb una altra connexió. Torneu-ho a provar més endavant.", + "ERROR_CLIENT_20A" : "El servidor d'escriptori remot ha tancat la connexió perquè sembla que no està activat. Si no és desitjat o inesperat, aviseu l'administrador del sistema o comproveu la configuració del vostre sistema.", + "ERROR_CLIENT_20B" : "El servidor d'escriptori remot ha tancat força la connexió. Si aquesta no és desitjada o inesperada, notifiqueu l'administrador del sistema o comproveu els registres del sistema.", + "ERROR_CLIENT_301" : "Ha fallat la sessió. Torneu-vos a connectar i torneu-ho a provar.", + "ERROR_CLIENT_303" : "El servidor d'escriptori remot ha denegat l'accés a aquesta connexió. Si necessiteu accés, sol·liciteu a l'administrador del sistema que li concedeixi accés o verifiqueu la configuració del sistema.", + "ERROR_CLIENT_308" : "El servidor de Guacamole ha tancat la connexió perquè no hi ha resposta del navegador durant el temps suficient perquè sembli que es trobava desconnectat. Això és generalment causat per problemes de xarxa, com ara un senyal sense fils o simplement una velocitat de xarxa molt lenta. a la xarxa i torneu-ho a provar. ", + "ERROR_CLIENT_31D" : "El servidor Guacamole denega l'accés a aquesta connexió perquè heu exhaurit el límit per a l'ús de la connexió simultània per part d'un usuari individual. Tanqueu una o més connexions i torneu-ho a provar.", + "ERROR_CLIENT_DEFAULT" : "S'ha produït un error intern al servidor Guacamole i s'ha acabat la connexió. Si el problema continua, aviseu l'administrador del sistema o comproveu els registres del sistema.", + + "ERROR_TUNNEL_201" : "El servidor Guacamole ha rebutjat aquest intent de connexió perquè hi ha massa connexions actives. Espereu uns minuts i torna-ho a provar.", + "ERROR_TUNNEL_202" : "La connexió s'ha tancat perquè el servidor triga massa temps a respondre. Això sol ser causat per problemes de xarxa, com ara un senyal sense fils o una velocitat de xarxa lenta. Comproveu la connexió de xarxa i intenteu de nou o poseu-vos en contacte amb l'administrador del sistema. ", + "ERROR_TUNNEL_203" : "El servidor ha trobat un error i ha tancat la connexió. Intenteu-ho de nou o poseu-vos en contacte amb l'administrador del vostre sistema.", + "ERROR_TUNNEL_204" : "La connexió sol·licitada no existeix. Comproveu el nom de la connexió i proveu-ho de nou.", + "ERROR_TUNNEL_205" : "Actualment aquesta connexió està en ús i no es permet l'accés simultani a aquesta connexió. Torneu-ho a provar més endavant.", + "ERROR_TUNNEL_207" : "El servidor Guacamole no es pot accedir actualment. Comproveu la vostra xarxa i torneu-ho a provar.", + "ERROR_TUNNEL_208" : "El servidor Guacamole no accepta connexions. Comproveu la vostra xarxa i proveu-la de nou.", + "ERROR_TUNNEL_301" : "No teniu permís per accedir a aquesta connexió perquè no esteu registrat. Inicieu la sessió i torneu-ho a provar.", + "ERROR_TUNNEL_303" : "No teniu permís per accedir a aquesta connexió. Si necessiteu accés, sol·liciteu a l'administrador del sistema que us inclogui la llista d'usuaris permesos o comproveu la vostra configuració del sistema.", + "ERROR_TUNNEL_308" : "El servidor de Guacamole ha tancat la connexió perquè no hi ha hagut resposta del seu navegador durant el temps suficient com perquè sembli estar desconnectat. Això generalment és causat per problemes de xarxa, com un senyal sense fils irregular o simplement velocitats de xarxa molt lentes. comprovi la seva xarxa i intenti novament .", + "ERROR_TUNNEL_31D" : "El servidor Guacamole denega l'accés a aquesta connexió perquè heu exhaurit el límit per a l'ús de la connexió simultània per part d'un usuari individual. Tanqueu una o més connexions i torneu-ho a provar.", + "ERROR_TUNNEL_DEFAULT" : "S'ha produït un error intern al servidor Guacamole i s'ha acabat la connexió. Si el problema continua, aviseu l'administrador del sistema o comproveu els registres del sistema.", + + "ERROR_UPLOAD_100" : "La transferència de fitxers no és compatible o no està habilitada. Poseu-vos en contacte amb l'administrador del sistema o comproveu els registres del vostre sistema.", + "ERROR_UPLOAD_201" : "Actualment s'estan transferint massa fitxers. Espereu que es completin les transferències existents i, després, torneu-ho a provar.", + "ERROR_UPLOAD_202" : "No es pot transferir el fitxer perquè el servidor d'escriptori remot triga massa temps a respondre. Torneu-ho a provar o poseu-vos en contacte amb l'administrador del vostre sistema.", + "ERROR_UPLOAD_203" : "El servidor d'escriptori remot ha trobat un error durant la transferència. Intenteu-ho de nou o poseu-vos en contacte amb l'administrador del vostre sistema.", + "ERROR_UPLOAD_204" : "La destinació per a la transferència de fitxers no existeix. Comproveu que la destinació existeix i torneu-ho a provar.", + "ERROR_UPLOAD_205" : "La destinació per a la transferència de fitxers està bloquejada. Espereu qualsevol finalització de les tasques en curs i torneu-ho a provar.", + "ERROR_UPLOAD_301" : "No teniu permís per carregar aquest fitxer perquè no esteu registrat. Inicieu la sessió i torneu-ho a provar.", + "ERROR_UPLOAD_303" : "No teniu permís per carregar aquest fitxer. Si necessiteu accés, consulteu la configuració del sistema o consulteu-lo amb l'administrador del vostre sistema.", + "ERROR_UPLOAD_308" : "La transferència de fitxers s'ha aturat. Això és habitualment causat per problemes de xarxa, com ara un senyal sense fils o una velocitat de xarxa molt lenta.", + "ERROR_UPLOAD_31D" : "Actualment s'estan transferint massa fitxers. Espereu que es completin les transferències existents i, després, torneu-ho a provar.", + "ERROR_UPLOAD_DEFAULT" : "S'ha produït un error intern al servidor Guacamole i s'ha acabat la connexió. Si el problema continua, aviseu l'administrador del sistema o comproveu els registres del sistema.", + + "HELP_CLIPBOARD" : "Aquí apareixerà un text copiat/tallat dins de Guacamole. Els canvis al text següent afectaran el porta-retalls remot.", + "HELP_INPUT_METHOD_NONE" : "No s'utilitza cap mètode d'entrada. S'accepta l'entrada de teclat des d'un teclat físic connectat.", + "HELP_INPUT_METHOD_OSK" : "Mostra i accepta l'entrada del teclat integrat de Guacamole a la pantalla. El teclat a la pantalla permet escriure combinacions de tecles que, d'una altra manera, poden ser impossibles (com ara Ctrl-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Permet escriure text i emula esdeveniments del teclat en funció del text mecanografiat. Això és necessari per a dispositius com ara telèfons mòbils que no tinguin un teclat físic.", + "HELP_MOUSE_MODE" : "Determina el comportament del ratolí remot respecte als tocs.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Toqueu per fer clic. El clic es produeix a la ubicació del toc.", + "HELP_MOUSE_MODE_RELATIVE" : "Arrossegueu per moure el punter del ratolí i toqueu per fer clic. El clic es produeix a la ubicació del punter.", + "HELP_SHARE_LINK" : "La connexió actual s'està compartint i qualsevol usuari pot accedir amb els següents {LINKS, plural, one{enllaç} other{enllaços}}:", + + "INFO_ANONYMOUS_USER_COUNT" : "Anònim{COUNT, plural, one{} other{s (#)}}", + "INFO_CONNECTION_SHARED" : "Aquesta connexió es comparteix ara.", + "INFO_NO_FILE_TRANSFERS" : "No hi ha transferències de fitxers.", + "INFO_USER_COUNT" : "{USERNAME}{COUNT, plural, one{} other{ (#)}}", + + "NAME_INPUT_METHOD_NONE" : "Cap", + "NAME_INPUT_METHOD_OSK" : "Teclat a la pantalla", + "NAME_INPUT_METHOD_TEXT" : "Entrada de text", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Pantalla tàctil", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIENT_MESSAGES" : "Missatges", + "SECTION_HEADER_CLIPBOARD" : "Porta-retalls", + "SECTION_HEADER_DEVICES" : "Dispositius", + "SECTION_HEADER_DISPLAY" : "Pantalla", + "SECTION_HEADER_FILE_TRANSFERS" : "Transferències de fitxers", + "SECTION_HEADER_INPUT_METHOD" : "Mètode d'entrada", + "SECTION_HEADER_MOUSE_MODE" : "Mode d'emulació del ratolí", + + "TEXT_ANONYMOUS_USER_JOINED" : "Un usuari anònim s'ha afegit a la connexió.", + "TEXT_ANONYMOUS_USER_LEFT" : "Un usuari anònim ha sortit de la connexió.", + "TEXT_CLIENT_STATUS_IDLE" : "Ociós.", + "TEXT_CLIENT_STATUS_CONNECTING" : "S'està connectant a Guacamole ...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Heu estat desconnectats.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "La connexió de xarxa al servidor Guacamole sembla inestable.", + "TEXT_CLIENT_STATUS_WAITING" : "Connectat a Guacamole. Esperant resposta ...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + "TEXT_RECONNECT_COUNTDOWN" : "Re-conectant en {REMAINING} {REMAINING, plural, one{segon} other{segons}}...", + "TEXT_USER_JOINED" : "{USERNAME} s'ha afegit a la connexió.", + "TEXT_USER_LEFT" : "{USERNAME} ha sortit de la connexió.", + "TEXT_ZOOM_AUTO_FIT" : "S'adapta automàticament a la finestra del navegador", + + "URL_OSK_LAYOUT" : "layouts/es-es-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_HIDE_DETAILS" : "Amaga", + "ACTION_SHOW_DETAILS" : "Mostra", + + "FIELD_HEADER_BACKGROUND" : "Background", + "FIELD_HEADER_FOREGROUND" : "Foreground", + + "FIELD_OPTION_CUSTOM" : "Personalitzat ...", + + "SECTION_HEADER_DETAILS" : "Detalls:" + + }, + + "IMPORT": { + + "ACTION_BROWSE" : "Navega pels fitxers", + "ACTION_VIEW_FORMAT_HELP" : "Veure l'ajuda de format", + "ACTION_IMPORT_CONNECTIONS" : "Importa connexions", + + "DIALOG_HEADER_SUCCESS" : "Fet", + + "ERROR_AMBIGUOUS_CSV_HEADER" : "La capçalera \"{HEADER}\" del CSV és ambigua, pot ser o bé un atribut de connexió o un paràmetre", + "ERROR_AMBIGUOUS_PARENT_GROUP" : "No es pot especificar el grup i el parentIdentifier alhora", + "ERROR_ARRAY_REQUIRED" : "El fitxer ha de contenir un llistat de connexions", + "ERROR_DETECTED_INVALID_TYPE" : "Tipus de fitxer no suportat. Assegureu-vos que és un fitxer CSV, JSON o YAML vàlid.", + "ERROR_DUPLICATE_CONNECTION_IN_FILE" : "Nom de connexió \"{NAME}\" duplicat a \"{PATH}\" al fitxer d'importació", + "ERROR_DUPLICATE_CSV_HEADER" : "Capçalera duplicada al CSV: {HEADER}", + "ERROR_EMPTY_FILE" : "El fitxer està buit", + "ERROR_INVALID_CSV_HEADER" : "La capçalera \"{HEADER}\" del CSV no és vàlida, no és ni un atribut ni un paràmetre", + "ERROR_INVALID_MIME_TYPE" : "Tipus de fitxer no suportat: \"{TYPE}\"", + "ERROR_INVALID_GROUP" : "No s'ha trobat cap grup que coincideixi amb \"{GROUP}\"", + "ERROR_INVALID_GROUP_IDENTIFIER" : "No s'ha trobat cap grup de connexió amb l'identificador \"{IDENTIFIER}\"", + "ERROR_INVALID_GROUP_TYPE" : "El grup no és vàlid - ha de ser una cadena de text.", + "ERROR_INVALID_PROTOCOL" : "El protocol no és vàlid \"{PROTOCOL}\"", + "ERROR_INVALID_USER_GROUPS_TYPE" : "El grup d'usuari no és vàlid - ha de ser un array d'identificadors de grup d'usuari.", + "ERROR_INVALID_USERS_TYPE" : "Usuaris no vàlids - ha de ser un array d'identificadors d'usuari.", + "ERROR_NO_FILE_SUPPLIED" : "Seleccioneu un fitxer per importar", + "ERROR_PARSE_FAILURE_CSV" : "Assegureu-vos que heu pujat un fitxer CSV vàlid. L'anàlisi ha fallat amb el següent error \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_JSON" : "Assegureu-vos que heu pujat un fitxer JSON vàlid. L'anàlisi ha fallat amb el següent error \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_YAML" : "Assegureu-vos que heu pujat un fitxer YAML vàlid. L'anàlisi ha fallat amb el següent error \"{ERROR}\". ", + "ERROR_REJECT_UPDATE_CONNECTION" : "La connexió \"{NAME}\" ja existeix a \"{PATH}\"", + "ERROR_REQUIRED_NAME_CONNECTION" : "El nom de connexió és obligatori", + "ERROR_REQUIRED_PROTOCOL_CONNECTION" : "El protocol de connexió és obligatori", + "ERROR_REQUIRED_NAME_FILE" : "No s'ha trobat el nom de la connexió al fitxer", + "ERROR_REQUIRED_PROTOCOL_FILE" : "No s'ha trobat el protocol de connexió al fitxer", + + "FIELD_HEADER_EXISTING_CONNECTION_MODE" : "Substituir/Actualitzar les connexions existents", + "FIELD_HEADER_EXISTING_PERMISSION_MODE" : "Reinicia els permisos", + + "HELP_CSV_DESCRIPTION" : "Un fitxer CSV d'importació de connexions ha de tenir un registre de connexió per línia. Cada columna especificarà un camp de la connexió. Com a mínim cal especificar el nom de la connexió i el protocol.", + "HELP_CSV_EXAMPLE" : "name,protocol,username,password,hostname,group,users,groups,guacd-encryption (attribute)\nconn1,vnc,alice,pass1,conn1.web.com,ROOT,guac user 1;guac user 2,Connection 1 Users,none\nconn2,rdp,bob,pass2,conn2.web.com,ROOT/Parent Group,guac user 1,,ssl\nconn3,ssh,carol,pass3,conn3.web.com,ROOT/Parent Group/Child Group,guac user 2;guac user 3,,\nconn4,kubernetes,,,,,,,", + "HELP_CSV_MORE_DETAILS" : "La capçalera per cada fila especifica el camp de connexió. L'ID del grup de connexió on la connexió s'ha d'importar pot ser especificada directament amb \"parentIdentifier\", o el camí al grup pare es pot especificar utilitzant \"group\" tal com es mostra més avall. En la majoria de casos, no hi ha d'haver conflicte entre els camps, però si cal, un sufixe \" (attribute)\" o \" (parameter)\" es pot afegir per desambiguar. Les llistes d'usuaris o identificadors de grup d'usuaris s'ha de separar amb punt i comes.¹", + "HELP_FILE_TYPE_HEADER" : "Tipus de fitxers", + "HELP_JSON_DESCRIPTION" : "Un fitxer JSON d'importació de connexions conté una llista d'objectes de connexió. Com a mínim cal especificar el nom de la connexió i el protocol en cada objecte de connexió.", + "HELP_JSON_EXAMPLE" : "[\n \\{\n \"name\": \"conn1\",\n \"protocol\": \"vnc\",\n \"parameters\": \\{ \"username\": \"alice\", \"password\": \"pass1\", \"hostname\": \"conn1.web.com\" \\},\n \"parentIdentifier\": \"ROOT\",\n \"users\": [ \"guac user 1\", \"guac user 2\" ],\n \"groups\": [ \"Connection 1 Users\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn2\",\n \"protocol\": \"rdp\",\n \"parameters\": \\{ \"username\": \"bob\", \"password\": \"pass2\", \"hostname\": \"conn2.web.com\" \\},\n \"group\": \"ROOT/Parent Group\",\n \"users\": [ \"guac user 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn3\",\n \"protocol\": \"ssh\",\n \"parameters\": \\{ \"username\": \"carol\", \"password\": \"pass3\", \"hostname\": \"conn3.web.com\" \\},\n \"group\": \"ROOT/Parent Group/Child Group\",\n \"users\": [ \"guac user 2\", \"guac user 3\" ]\n \\},\n \\{\n \"name\": \"conn4\",\n \"protocol\": \"kubernetes\"\n \\}\n]", + "HELP_SEMICOLON_FOOTNOTE" : "Si cal, els punt i coma es poden escapar utilitzant una contrabarra, per exemple. \"first\\\\;last\"", + "HELP_UPLOAD_DROP_TITLE" : "Arrossegueu un fitxer aquí", + "HELP_UPLOAD_FILE_TYPES" : "CSV, JSON, o YAML", + "HELP_YAML_DESCRIPTION" : "Un fitxer YAML d'importació de connexions és una llista d'objectes de connexió amb exactament la mateixa estructura que el format JSON.", + "HELP_YAML_EXAMPLE" : "---\n - name: conn1\n protocol: vnc\n parameters:\n username: alice\n password: pass1\n hostname: conn1.web.com\n group: ROOT\n users:\n - guac user 1\n - guac user 2\n groups:\n - Connection 1 Users\n attributes:\n guacd-encryption: none\n - name: conn2\n protocol: rdp\n parameters:\n username: bob\n password: pass2\n hostname: conn2.web.com\n group: ROOT/Parent Group\n users:\n - guac user 1\n attributes:\n guacd-encryption: none\n - name: conn3\n protocol: ssh\n parameters:\n username: carol\n password: pass3\n hostname: conn3.web.com\n group: ROOT/Parent Group/Child Group\n users:\n - guac user 2\n - guac user 3\n - name: conn4\n protocol: kubernetes", + + "INFO_CONNECTIONS_IMPORTED_SUCCESS" : "{NUMBER} {NUMBER, plural, one{connexió importada} other{connexions importades}} correctament.", + + "SECTION_HEADER_CONNECTION_IMPORT" : "Importa una connexió", + "SECTION_HEADER_CSV" : "Format CSV", + "SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE" : "Format de fitxer d'importació de connexions", + "SECTION_HEADER_JSON" : "Format JSON", + "SECTION_HEADER_YAML" : "Format YAML", + + "TABLE_HEADER_ERRORS" : "Errors", + "TABLE_HEADER_GROUP" : "Grup", + "TABLE_HEADER_NAME" : "Nom", + "TABLE_HEADER_PROTOCOL" : "Protocol", + "TABLE_HEADER_ROW_NUMBER" : "Fila #" + }, + + "DATA_SOURCE_DEFAULT" : { + + "NAME" : "Default (XML)" + + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Feu clic per mostrar la contrasenya", + "HELP_HIDE_PASSWORD" : "Feu clic per amagar la contrasenya" + + }, + + "HOME" : { + + "INFO_NO_RECENT_CONNECTIONS" : "No hi ha connexions recents.", + + "PASSWORD_CHANGED" : "S'ha canviat la contrasenya.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Totes les connexions", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Connexions recents" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anònim" + + }, + + "LOGIN": { + + "ERROR_INVALID_LOGIN" : "Accés incorrecte", + + "FIELD_HEADER_USERNAME" : "Nom d'usuari", + "FIELD_HEADER_PASSWORD" : "Contrasenya" + + }, + + "MANAGE_CONNECTION" : { + + + "DIALOG_HEADER_CONFIRM_DELETE" : "Suprimir la connexió", + + "FIELD_HEADER_LOCATION" : "Ubicació:", + "FIELD_HEADER_NAME" : "Nom:", + "FIELD_HEADER_PROTOCOL" : "Protocol:", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Actiu ara", + "INFO_CONNECTION_NOT_USED" : "Aquesta connexió encara no s'ha utilitzat.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Edició de connexió", + "SECTION_HEADER_HISTORY" : "Historial d'ús", + "SECTION_HEADER_PARAMETERS" : "Paràmetres", + + "TABLE_HEADER_HISTORY_USERNAME" : "Nom d'usuari", + "TABLE_HEADER_HISTORY_START" : "L'hora d'inici", + "TABLE_HEADER_HISTORY_DURATION" : "Durada", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Servidor Remot", + + "TEXT_CONFIRM_DELETE" : "No es poden restaurar les connexions un cop s'hagin suprimit. Esteu segur que voleu suprimir aquesta connexió?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "DIALOG_HEADER_CONFIRM_DELETE" : "Suprimeix el grup de connexió", + + "FIELD_HEADER_LOCATION" : "Ubicació:", + "FIELD_HEADER_NAME" : "Nom:", + "FIELD_HEADER_TYPE" : "Tipus:", + + "NAME_TYPE_BALANCING" : "Balanceig", + "NAME_TYPE_ORGANIZATIONAL" : "Organitzatiu", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Edita el grup de connexió", + + "TEXT_CONFIRM_DELETE" : "No es poden restaurar els grups de connexió un cop suprimits. Esteu segur que voleu suprimir aquest grup de connexió?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "DIALOG_HEADER_CONFIRM_DELETE" : "Eliminar el perfil compartit", + + "FIELD_HEADER_NAME" : "Nom:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Connexió primària:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Edita el perfil de compartir", + "SECTION_HEADER_PARAMETERS" : "Paràmetres", + + "TEXT_CONFIRM_DELETE" : "Els perfils per compartir no es poden restaurar un cop s'hagin suprimit. Esteu segur que voleu suprimir aquest perfil compartit?" + + }, + + "MANAGE_USER" : { + + + "DIALOG_HEADER_CONFIRM_DELETE" : "Eliminar l'usuari", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administrar el sistema:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Canviar la pròpia contrasenya:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Crear usuaris nous:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Crear grups d'usuaris nous:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Crear noves connexions:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Crear grups de connexió nous:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Crear nous perfils per compartir:", + "FIELD_HEADER_USER_DISABLED" : "Inici de sessió desactivat:", + "FIELD_HEADER_USERNAME" : "Nom d'usuari:", + + "HELP_NO_USER_GROUPS" : "Actualment, aquest usuari no pertany a cap grup. Amplieu aquesta secció per afegir-lo a grups.", + + "INFO_READ_ONLY" : "Ho sentim, però aquest compte d'usuari no es pot modificar.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "No hi ha grups disponibles.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Totes les connexions", + "SECTION_HEADER_CONNECTIONS" : "Connexions", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Connexions actuals", + "SECTION_HEADER_EDIT_USER" : "Edició d'usuari", + "SECTION_HEADER_PERMISSIONS" : "Permisos", + "SECTION_HEADER_USER_GROUPS" : "Grups", + + "TEXT_CONFIRM_DELETE" : "Els usuaris no es poden restaurar un cop se'ls ha suprimit. Segur que voleu suprimir aquest usuari?" + + }, + + "MANAGE_USER_GROUP" : { + + + "DIALOG_HEADER_CONFIRM_DELETE" : "Suprimeix el grup", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Desactivat:", + "FIELD_HEADER_USER_GROUP_NAME" : "Nom del grup:", + + "HELP_NO_USER_GROUPS" : "Actualment aquest grup no pertany a cap grup. Amplieu aquesta secció per afegir grups.", + "HELP_NO_MEMBER_USER_GROUPS" : "Actualment aquest grup no conté cap grup. Amplieu aquesta secció per afegir grups.", + "HELP_NO_MEMBER_USERS" : "Actualment aquest grup no conté cap usuari. Amplieu aquesta secció per afegir-ne usuaris.", + + "INFO_READ_ONLY" : "Ho sentim, però no es pot editar aquest grup.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "No hi ha usuaris disponibles.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Edició de grup", + "SECTION_HEADER_MEMBER_USERS" : "Usuaris membres", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Grups membres", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Grups pare", + + "TEXT_CONFIRM_DELETE" : "No es poden restaurar els grups després que se'ls hagi suprimit. Esteu segur que voleu suprimir aquest grup?" + + }, + + "PLAYER" : { + + "ACTION_SHOW_KEY_LOG" : "Registre de tecleig", + + "INFO_LOADING_RECORDING" : "L'enregistrament s'està carregant. Espereu...", + "INFO_NO_KEY_LOG" : "Registre de tecleig no disponible", + "INFO_NUMBER_OF_RESULTS" : "{RESULTS} {RESULTS, plural, one{coincidència} other{coincidències}}", + "INFO_SEEK_IN_PROGRESS" : "Saltant a la posició demanada. Espereu...", + + "FIELD_PLACEHOLDER_TEXT_BATCH_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "La tecla de retrocés envia:", + "FIELD_HEADER_CA_CERT" : "Certificat d'autoritat de certificació:", + "FIELD_HEADER_CLIENT_CERT" : "Certificat de client:", + "FIELD_HEADER_CLIENT_KEY" : "Clau del client:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de colors:", + "FIELD_HEADER_CONTAINER" : "Nom del contenidor:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crea automàticament la ruta de gravació:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Crea automàticament la ruta de typescript:", + "FIELD_HEADER_DISABLE_COPY" : "Desactiva la còpia des del terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactiva l'enganxament del client:", + "FIELD_HEADER_EXEC_COMMAND" : "Comanda (exec):", + "FIELD_HEADER_FONT_NAME" : "Nom del tipus de lletra:", + "FIELD_HEADER_FONT_SIZE" : "Mida de la lletra:", + "FIELD_HEADER_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_IGNORE_CERT" : "Ignora el certificat del servidor:", + "FIELD_HEADER_NAMESPACE" : "Espai de noms:", + "FIELD_HEADER_POD" : "Nom del pod:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Només Lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclou el ratolí:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclou els gràfics/fluxos:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclou els esdeveniments de teclat:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de la gravació:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de gravació:", + "FIELD_HEADER_SCROLLBACK" : "Mida màxima de desplaçament:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nom Typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ruta Typescript :", + "FIELD_HEADER_USE_SSL" : "Usa SSL/TLS", + + "FIELD_OPTION_BACKSPACE_8" : "Espai enrere (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Eliminar (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Negre sobre blanc", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sobre negre", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verd sobre negre", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanc sobre negre", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticació", + "SECTION_HEADER_BEHAVIOR" : "Comportament del terminal", + "SECTION_HEADER_CLIPBOARD" : "Porta-retalls", + "SECTION_HEADER_CONTAINER" : "Contenidor", + "SECTION_HEADER_DISPLAY" : "Pantalla", + "SECTION_HEADER_RECORDING" : "Gravació de la pantalla", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (registre de sessió de text)", + "SECTION_HEADER_NETWORK" : "Xarxa" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Nom del client:", + "FIELD_HEADER_COLOR_DEPTH" : "Profunditat del color:", + "FIELD_HEADER_CONSOLE" : "Administrador de la consola:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Suport de l'àudio a la consola:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Crea automàticament la unitat:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crea automàticament la ruta de gravació:", + "FIELD_HEADER_DISABLE_AUDIO" : "Desactiva l'àudio:", + "FIELD_HEADER_DISABLE_AUTH" : "Desactiva l'autenticació:", + "FIELD_HEADER_DISABLE_COPY" : "Desactiva la còpia des de l'escriptori remot:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Desactiva la baixada de fitxers:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactiva l’enganxament del client:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Desactiva la càrrega de fitxers:", + "FIELD_HEADER_DOMAIN" : "Domini:", + "FIELD_HEADER_DPI" : "Resolució (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Nom de la unitat:", + "FIELD_HEADER_DRIVE_PATH" : "Ruta de la unitat:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Habilita l'entrada d'àudio (micròfon):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Habilita la composició d'escriptori (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Habilita la unitat:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Habilita el suavització de tipus de lletra (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Habilita l'arrossegament de la finestra completa:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Habilita animacions de menús:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Desactiva la memòria cau de mapa de bits:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Desactiva la memòria cau fora de pantalla:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Desactiva la memòria cau del glif:", + "FIELD_HEADER_DISABLE_GFX" : "Desactiva l'extensió Graphics Pipeline:", + "FIELD_HEADER_ENABLE_PRINTING" : "Habilita la impressió:", + "FIELD_HEADER_ENABLE_SFTP" : "Activa SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Activa els temes:", + "FIELD_HEADER_ENABLE_TOUCH" : "Activa el multi-touch:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Habilita el fons de pantalla:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Force lossless compression:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domini:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_HEIGHT" : "Alçada:", + "FIELD_HEADER_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_IGNORE_CERT" : "Ignora el certificat del servidor:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Programa inicial:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Informació del balanç de càrrega/cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "Finals de línia:", + "FIELD_HEADER_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRINTER_NAME" : "Nom de la impressora redirigit:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "BLOB de preconnexió BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "Identificador de font RDP: ", + "FIELD_HEADER_READ_ONLY" : "Només Lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclou el ratolí:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclou els gràfics/fluxos:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Exclou els esdeveniments tàctils:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclou els esdeveniments de teclat:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de la gravació:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de gravació:", + "FIELD_HEADER_RESIZE_METHOD" : "Mètode de redimensionament:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Paràmetres:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Directori de treball:", + "FIELD_HEADER_REMOTE_APP" : "Programa:", + "FIELD_HEADER_SECURITY" : "Mode de seguretat:", + "FIELD_HEADER_SERVER_LAYOUT" : "Disposició del teclat:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Directori de càrrega per defecte:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desactiva la baixada de fitxers:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Clau d'amfitrió pública (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Interval de manteniment SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Frase d'accés:", + "FIELD_HEADER_SFTP_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Clau privada:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Directori arrel del navegador de fitxers:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desactiva la càrrega de fitxers:", + "FIELD_HEADER_SFTP_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_STATIC_CHANNELS" : "Noms de canals estàtics:", + "FIELD_HEADER_TIMEZONE" : "Fus horari:", + "FIELD_HEADER_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_WIDTH" : "Amplada:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adreça de difusió del paquet WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adreça MAC de l'amfitrió remot:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquet WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP pel paquet WoL: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'espera de l'arrencada d'amfitrió:", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "Deixa-ho tal com és", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Color baix (16 bits)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Veritable color (24 bits)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Veritable color (32 bits)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 colors", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Actualizació de pantalla\" canal virtual (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Torna a connectar", + + "FIELD_OPTION_SECURITY_ANY" : "Qualsevol", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Network Level Authentication)", + "FIELD_OPTION_SECURITY_RDP" : "RDP encryption", + "FIELD_OPTION_SECURITY_TLS" : "TLS encryption", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Txec (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Danès (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Suís alemany (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Alemany (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "Anglès del Regne Unit (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "Anglès dels Estats Units (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Espanyol (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latino Americano (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Francès de Bèlgica (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Francès del Canadà (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Francès de Suïssa (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Francès (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Hungarian (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italià (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japonès (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Noruec (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polonès (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portuguès brasiler (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portuguès (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Romanès (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Suec (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Q-Turc (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticació", + "SECTION_HEADER_BASIC_PARAMETERS" : "Configuració bàsica", + "SECTION_HEADER_CLIPBOARD" : "Porta-retalls", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Redirecció del dispositiu", + "SECTION_HEADER_DISPLAY" : "Pantalla", + "SECTION_HEADER_GATEWAY" : "Passarel·la d'escriptori remota", + "SECTION_HEADER_LOAD_BALANCING" : "Balanceig de càrrega", + "SECTION_HEADER_NETWORK" : "Xarxa", + "SECTION_HEADER_PERFORMANCE" : "Rendiment", + "SECTION_HEADER_PRECONNECTION_PDU" : "Pre connexió PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Gravació de la pantalla", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "La tecla de retrocés envia:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de colors:", + "FIELD_HEADER_COMMAND" : "Executa l'ordre:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crea automàticament la ruta de gravació:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Creeu automàticament la ruta de mecanografia:", + "FIELD_HEADER_DISABLE_COPY" : "Desactiva la còpia des del terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactiva l'enganxament del client:", + "FIELD_HEADER_FONT_NAME" : "Nom del tipus de lletra:", + "FIELD_HEADER_FONT_SIZE" : "Mida de la lletra:", + "FIELD_HEADER_ENABLE_SFTP" : "Activa SFTP:", + "FIELD_HEADER_HOST_KEY" : "Clau d'amfitrió pública (Base64):", + "FIELD_HEADER_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_LOCALE" : "Language/Locale ($LANG):", + "FIELD_HEADER_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_PASSPHRASE" : "Frase d'accés:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Clau privada:", + "FIELD_HEADER_SCROLLBACK" : "Mida màxima de desplaçament:", + "FIELD_HEADER_READ_ONLY" : "Només lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclou el ratolí:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclou els gràfics/fluxos:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclou els esdeveniments de teclat:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de la gravació:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de gravació:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Interval de 'keepalive' del servidor:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desactiva la baixada de fitxers:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Directori arrel del navegador de fitxers:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desactiva la càrrega de fitxers:", + "FIELD_HEADER_TERMINAL_TYPE" : "Tipus de terminal:", + "FIELD_HEADER_TIMEZONE" : "Zona horària ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nom Typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ruta Typescript:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adreça de difusió del paquet WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adreça MAC de l'amfitrió remot:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'espera de l'arrencada d'amfitrió:", + + + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Negre sobre blanc", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sobre negre", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verd sobre negre", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanc sobre negre", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticació", + "SECTION_HEADER_BEHAVIOR" : "Comportament del terminal", + "SECTION_HEADER_CLIPBOARD" : "Porta-retalls", + "SECTION_HEADER_DISPLAY" : "Pantalla", + "SECTION_HEADER_NETWORK" : "Xarxa", + "SECTION_HEADER_RECORDING" : "Gravació de la pantalla", + "SECTION_HEADER_SESSION" : "Sessió / Entorn", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Gravació de sessió de text)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Backspace envia tecles:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de colors:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crea automàticament la ruta de gravació:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Crea automàticament la ruta del typescript:", + "FIELD_HEADER_DISABLE_COPY" : "Desactiva la còpia des del terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactiva l'enganxament del client:", + "FIELD_HEADER_FONT_NAME" : "Nom del tipus de lletra:", + "FIELD_HEADER_FONT_SIZE" : "Mida de la lletra:", + "FIELD_HEADER_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Expressió regular de fallida d'inici de sessió:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Expressió regular d'exit d'inici de sessió:", + "FIELD_HEADER_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_USERNAME_REGEX" : "Expressió regular del nom d'usuari:", + "FIELD_HEADER_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_PASSWORD_REGEX" : "Expressió regular de contrasenya:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Només lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclou el ratolí:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclou els gràfics/fluxos:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclou els esdeveniments de teclat:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de la gravació:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de gravació:", + "FIELD_HEADER_SCROLLBACK" : "Mida màxima de desplaçament:", + "FIELD_HEADER_TERMINAL_TYPE" : "Tipus de terminal:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nom de Typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ruta de Typescript:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adreça de difusió del paquet WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adreça MAC de l'amfitrió remot:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'espera de l'arrencada d'amfitrió:", + + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Negre sobre blanc", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sobre negre", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verd sobre negre", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanc sobre negre", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticació", + "SECTION_HEADER_BEHAVIOR" : "Comportament del terminal", + "SECTION_HEADER_CLIPBOARD" : "Porta-retalls", + "SECTION_HEADER_DISPLAY" : "Pantalla", + "SECTION_HEADER_RECORDING" : "Gravació de la pantalla", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Gravació de sessió de text)", + "SECTION_HEADER_NETWORK" : "Xarxa", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Nom del servidor d'àudio:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Codificació:", + "FIELD_HEADER_COLOR_DEPTH" : "Profunditat del color:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crea automàticament la ruta de gravació:", + "FIELD_HEADER_CURSOR" : "Cursor:", + "FIELD_HEADER_DEST_HOST" : "Amfitrió de destinació:", + "FIELD_HEADER_DEST_PORT" : "Port de destinació:", + "FIELD_HEADER_DISABLE_COPY" : "Desactiva la còpia des de l'escriptori remot:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactiva l'enganxament del client:", + "FIELD_HEADER_ENABLE_AUDIO" : "Habilita l'àudio:", + "FIELD_HEADER_ENABLE_SFTP" : "Activa SFTP:", + "FIELD_HEADER_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Només lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclou el ratolí:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclou els gràfics/fluxos:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclou els esdeveniments de teclat:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de la gravació:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de gravació:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Directori de càrrega per defecte:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desactiva la baixada de fitxers:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Clau d'amfitrió pública (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nom de l'amfitrió:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Interval de keepalive SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Frase d'accés:", + "FIELD_HEADER_SFTP_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Clau privada:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Directori arrel del navegador de fitxers:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desactiva la càrrega de fitxers:", + "FIELD_HEADER_SFTP_USERNAME" : "Nom d'usuari:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Canvia components vermells/blaus:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adreça de difusió del paquet WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adreça MAC de l'amfitrió remot:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'espera de l'arrencada d'amfitrió:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 colors", + "FIELD_OPTION_COLOR_DEPTH_16" : "Color baix (16 bits)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Veritable color (24 bits)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Veritable color (32 bits)", + + "FIELD_OPTION_CURSOR_LOCAL" : "Local", + "FIELD_OPTION_CURSOR_REMOTE" : "Remot", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Àudio", + "SECTION_HEADER_AUTHENTICATION" : "Autenticació", + "SECTION_HEADER_CLIPBOARD" : "Porta-retalls", + "SECTION_HEADER_DISPLAY" : "Pantalla", + "SECTION_HEADER_NETWORK" : "Xarxa", + "SECTION_HEADER_RECORDING" : "Gravació de la pantalla", + "SECTION_HEADER_REPEATER" : "Repetidor VNC", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Configuració" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "FILENAME_HISTORY_CSV" : "history.csv", + + "HELP_CONNECTION_HISTORY" : "Aquí es llisten els registres d'historial de connexions anteriors i es poden ordenar fent clic a les capçaleres de columna. Per cercar registres específics, introduïu una cadena de filtre i feu clic a \"Cerca\". Només s'enumeraran els registres que coincideixin amb la cadena de filtre proporcionada.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "No hi ha registres coincidents", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nom de la connexió", + "TABLE_HEADER_SESSION_DURATION" : "Durada", + "TABLE_HEADER_SESSION_LOGS" : "Registres", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Amfitrió remot", + "TABLE_HEADER_SESSION_STARTDATE" : "Hora d'inici", + "TABLE_HEADER_SESSION_USERNAME" : "Nom d'usuari", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_NEW_CONNECTION" : "Nova connexió", + "ACTION_NEW_CONNECTION_GROUP" : "Nou grup", + "ACTION_NEW_SHARING_PROFILE" : "Nou perfil per compartir", + + "HELP_CONNECTIONS" : "Feu clic o toqueu una connexió per gestionar aquesta connexió. Segons el vostre nivell d'accés, es poden afegir i suprimir connexions i es poden canviar les seves propietats (protocol, nom d'amfitrió, port, etc.).", + + "SECTION_HEADER_CONNECTIONS" : "Connexions" + + }, + + "SETTINGS_PREFERENCES" : { + + "FIELD_HEADER_LANGUAGE" : "Llenguatge de visualització:", + "FIELD_HEADER_PASSWORD" : "Contrasenya:", + "FIELD_HEADER_PASSWORD_OLD" : "Contrasenya actual:", + "FIELD_HEADER_PASSWORD_NEW" : "Nova contrasenya:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirmar nova contrasenya:", + "FIELD_HEADER_TIMEZONE" : "Fus horari:", + "FIELD_HEADER_USERNAME" : "Nom d'usuari:", + + "HELP_DEFAULT_INPUT_METHOD" : "El mètode d'introducció predeterminat determina com Guacamole rep els esdeveniments del teclat. Canviar aquesta configuració pot ser necessària quan s'utilitza un dispositiu mòbil o quan s'escriu a través d'un IME. Aquesta configuració es pot substituir de manera per connexió dins del menú Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "El mode d'emulació predeterminat del ratolí determina com es comportarà el ratolí remot en les noves connexions pel que fa als tocs. Aquesta configuració es pot substituir de manera per connexió al menú Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Les opcions que apareixen a continuació estan relacionades amb la configuració regional de l'usuari i tindran un impacte sobre la visualització de diverses parts de la interfície.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Si voleu canviar la vostra contrasenya, introduïu la vostra contrasenya actual i la contrasenya desitjada a continuació, i feu clic a \"Actualitza la contrasenya\". El canvi entrarà en vigor immediatament.", + + "INFO_PASSWORD_CHANGED" : "S'ha canviat la contrasenya.", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "S'han guardat els canvis a la configuració.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Mètode d'introducció per defecte", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Mode d'emulació del ratolí predeterminat", + "SECTION_HEADER_UPDATE_PASSWORD" : "Canvi de contrasenya" + + }, + + "SETTINGS_USERS" : { + + "ACTION_NEW_USER" : "Nou usuari", + + "HELP_USERS" : "Feu clic o toqueu un usuari per gestionar aquest usuari. En funció del vostre nivell d'accés, es poden afegir i eliminar els usuaris i es poden canviar les seves contrasenyes.", + + "SECTION_HEADER_USERS" : "Usuaris", + + "TABLE_HEADER_FULL_NAME" : "Nom complet", + "TABLE_HEADER_LAST_ACTIVE" : "Darrer actiu", + "TABLE_HEADER_ORGANIZATION" : "Organització", + "TABLE_HEADER_USERNAME" : "Nom d'usuari" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_NEW_USER_GROUP" : "Grup nou", + + "HELP_USER_GROUPS" : "Feu clic o toqueu un grup següent per gestionar aquest grup. En funció del vostre nivell d'accés, es poden afegir i suprimir grups i es poden canviar els usuaris i grups.", + + "SECTION_HEADER_USER_GROUPS" : "Grups", + + "TABLE_HEADER_USER_GROUP_NAME" : "Nom del grup" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_DELETE" : "Tanca sessions", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Tancar sessions", + + "HELP_SESSIONS" : "Aquesta pàgina s'omple amb les connexions actualment actives. Les connexions enumerades i la possibilitat de tancar-les depèn del nivell d'accés. Si voleu tancar una o més sessions, marqueu la casella que hi ha al costat de les sessions i feu clic a \"Tanca sessions\". Tancant una sessió es desconnectarà immediatament l'usuari de la connexió associada.", + + "INFO_NO_SESSIONS" : "No hi ha sessions actives", + + "SECTION_HEADER_SESSIONS" : "Sessions actives", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nom de la connexió", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Amfitrió remot", + "TABLE_HEADER_SESSION_STARTDATE" : "Actiu des de", + "TABLE_HEADER_SESSION_USERNAME" : "Nom d'usuari", + + "TEXT_CONFIRM_DELETE" : "Esteu segur que voleu matar totes les sessions seleccionades? Els usuaris que utilitzin aquestes sessions seran desconnectats immediatament." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Correu electrònic:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Nom complet:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organització:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Rol:" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/cs.json b/guacamole/src/main/frontend/src/translations/cs.json new file mode 100644 index 0000000..a465f71 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/cs.json @@ -0,0 +1,1142 @@ +{ + + "NAME" : "Čeština", + + "APP" : { + + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Zrušit", + "ACTION_CLEAR" : "Vyčistit", + "ACTION_CLONE" : "Klonovat", + "ACTION_CONTINUE" : "Pokračovat", + "ACTION_DELETE" : "Smazat", + "ACTION_DELETE_SESSIONS" : "Ukončit sezení", + "ACTION_DOWNLOAD" : "Stáhnout", + "ACTION_IMPORT" : "Importovat", + "ACTION_LOGIN" : "Přihlásit", + "ACTION_LOGIN_AGAIN" : "Znovu přihlásit", + "ACTION_LOGOUT" : "Odhlásit", + "ACTION_MANAGE_CONNECTIONS" : "Připojení", + "ACTION_MANAGE_PREFERENCES" : "Vlastnosti", + "ACTION_MANAGE_SETTINGS" : "Nastavení", + "ACTION_MANAGE_SESSIONS" : "Aktivní sezení", + "ACTION_MANAGE_USERS" : "Uživatelé", + "ACTION_MANAGE_USER_GROUPS" : "Skupiny", + "ACTION_NAVIGATE_BACK" : "Zpět", + "ACTION_NAVIGATE_HOME" : "Domů", + "ACTION_PAUSE" : "Pozastavit", + "ACTION_PLAY" : "Přehrát", + "ACTION_SAVE" : "Uložit", + "ACTION_SEARCH" : "Hledat", + "ACTION_SHARE" : "Sdílet", + "ACTION_UPDATE_PASSWORD" : "Změnit heslo", + "ACTION_VIEW_HISTORY" : "Historie", + "ACTION_VIEW_RECORDING" : "Zobrazit", + + "DIALOG_HEADER_ERROR" : "Chyba", + + "ERROR_PAGE_UNAVAILABLE" : "Došlo k chybě a tuto akci nelze dokončit. Pokud problém přetrvává, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + "ERROR_PASSWORD_BLANK" : "Heslo nesmí být prázdné.", + "ERROR_PASSWORD_MISMATCH" : "Hesla nesouhlasí.", + "ERROR_SINGLE_FILE_ONLY" : "Nahrajte prosím vždy pouze jeden soubor", + + "FIELD_HEADER_PASSWORD" : "Heslo:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Heslo znovu:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtr", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "V současné době používá {USERS} {USERS, plural, one{uživatel} other{uživatelů}}.", + "INFO_LOGGED_OUT" : "Byli jste odhlášeni.", + + "TEXT_ANONYMOUS_USER" : "Anonymní uživatel", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{sekundu} other{sekund}}} minute{{VALUE, plural, one{minutu} other{minut}}} hour{{VALUE, plural, one{hodinu} other{hodin}}} day{{VALUE, plural, one{den} other{dnů}}} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_CLIENT_MESSAGES" : "Vyčistit", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Vyčistit", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Odpojit", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Znovu připojit", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_SHOW_CLIPBOARD" : "Kliknutím zobrazíte obsah schránky.", + "ACTION_UPLOAD_FILES" : "Nahrát soubory", + + "DIALOG_HEADER_CONNECTING" : "Připojování", + "DIALOG_HEADER_CONNECTION_ERROR" : "Chyba připojení", + "DIALOG_HEADER_DISCONNECTED" : "Odpojeno", + + "ERROR_CLIENT_201" : "Synchronizační server je zaneprázdněn, zkuste to prosím znovu později.", + "ERROR_CLIENT_202" : "Guacamole server zavřel spojení protože vzdálený počítač příliš dlouho neodpovídal. Zkuste to prosím později, nebo kontaktujte správce.", + "ERROR_CLIENT_203" : "Chyba vzdáleného serveru, spojení bylo uzavřeno. Zkuste to prosím později, nebo kontaktujte správce.", + "ERROR_CLIENT_207" : "Server vzdálené plochy je aktuálně nedostupný. Pokud problém přetrvává, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + "ERROR_CLIENT_208" : "Server vzdálené plochy není aktuálně k dispozici. Pokud problém přetrvává, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + "ERROR_CLIENT_209" : "Server vzdálené plochy ukončil připojení, protože je v konfliktu s jiným připojením. Prosím zkuste to znovu později.", + "ERROR_CLIENT_20A" : "Server vzdálené plochy ukončil připojení, protože se zdálo být neaktivní. Pokud je to nežádoucí nebo neočekávané, informujte prosím správce systému nebo zkontrolujte nastavení systému.", + "ERROR_CLIENT_20B" : "Server vzdálené plochy násilně uzavřel připojení. Pokud je to nežádoucí nebo neočekávané, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + "ERROR_CLIENT_301" : "Přihlášení selhalo. Připojte se a zkuste to znovu.", + "ERROR_CLIENT_303" : "Server vzdálené plochy odepřel přístup k tomuto připojení. Pokud potřebujete přístup, požádejte správce systému, aby vám umožnil přístup, nebo zkontrolujte nastavení systému.", + "ERROR_CLIENT_308" : "Server Guacamole ukončil spojení, protože z vašeho prohlížeče nebyla dostatečně dlouhá odezva, aby se zdálo, že je stále připojen. To je obvykle způsobeno problémy se sítí, jako je například nekvalitní bezdrátový signál, nebo jednoduše velmi pomalá síťová rychlost. Zkontrolujte síť a zkuste to znovu.", + "ERROR_CLIENT_31D" : "Server Guacamole odepřel přístup k tomuto připojení, protože jste vyčerpali limit pro vícenásobné připojení tímto uživatelem. Zavřete jedno nebo více připojení a zkuste to znovu.", + "ERROR_CLIENT_DEFAULT" : "V rámci serveru Guacamole došlo k interní chybě a připojení bylo ukončeno. Pokud problém přetrvává, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + + "ERROR_TUNNEL_201" : "Server Guacamole odmítl tento pokus o připojení, protože existuje příliš mnoho aktivních připojení. Počkejte prosím několik minut a zkuste to znovu.", + "ERROR_TUNNEL_202" : "Připojení bylo uzavřeno, protože serveru trvalo příliš dlouho, než odpověděl. To je obvykle způsobeno problémy se sítí, jako je například nekvalitní bezdrátový signál nebo pomalé připojení k síti. Zkontrolujte síťové připojení a zkuste to znovu nebo se obraťte na správce systému.", + "ERROR_TUNNEL_203" : "Server zjistil chybu a připojení ukončil. Zkuste to prosím znovu nebo se obraťte na správce systému.", + "ERROR_TUNNEL_204" : "Požadované připojení neexistuje. Zkontrolujte název připojení a zkuste to znovu.", + "ERROR_TUNNEL_205" : "Toto připojení je právě používáno a vícenásobný přístup k tomuto připojení není povolen. Prosím zkuste to znovu později.", + "ERROR_TUNNEL_207" : "Server Guacamole není v současné době dostupný. Zkontrolujte síť a zkuste to znovu", + "ERROR_TUNNEL_208" : "Server Guacamole nepřijímá připojení. Zkontrolujte síť a zkuste to znovu.", + "ERROR_TUNNEL_301" : "Nemáte oprávnění k přístupu k tomuto připojení, protože nejste přihlášeni. Přihlaste se a zkuste to znovu.", + "ERROR_TUNNEL_303" : "Nemáte oprávnění k přístupu k tomuto připojení. Pokud potřebujete přístup, požádejte správce systému, aby vás přidal do seznamu povolených uživatelů nebo zkontrolujte nastavení systému.", + "ERROR_TUNNEL_308" : "Server Guacamole ukončil spojení, protože z vašeho prohlížeče nebyla dostatečně dlouhá odezva, aby se zdálo, že je stále připojen. To je obvykle způsobeno problémy se sítí, jako je například nekvalitní bezdrátový signál, nebo jednoduše velmi pomalá síťová rychlost. Zkontrolujte síť a zkuste to znovu.", + "ERROR_TUNNEL_31D" : "Server Guacamole odepřel přístup k tomuto připojení, protože jste vyčerpali limit pro vícenásobné připojení tímto uživatelem. Zavřete jedno nebo více připojení a zkuste to znovu.", + "ERROR_TUNNEL_DEFAULT" : "V rámci serveru Guacamole došlo k interní chybě a připojení bylo ukončeno. Pokud problém přetrvává, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + + "ERROR_UPLOAD_100" : "Přenos souborů není podporován nebo není povolen. Obraťte se na správce systému nebo zkontrolujte systémové protokoly.", + "ERROR_UPLOAD_201" : "V současné době se přenáší příliš mnoho souborů. Počkejte prosím na dokončení probíhajících přenosů a akci opakujte.", + "ERROR_UPLOAD_202" : "Soubor nelze přenést, protože serveru vzdálené plochy trvá příliš dlouho, než odpoví. Zkuste to prosím znovu nebo se obraťte na správce systému.", + "ERROR_UPLOAD_203" : "Server vzdálené plochy zaznamenal chybu během přenosu. Zkuste to prosím znovu nebo se obraťte na správce systému.", + "ERROR_UPLOAD_204" : "Cíl pro přenos souborů neexistuje. Zkontrolujte, zda cíl existuje a zkuste to znovu.", + "ERROR_UPLOAD_205" : "Cíl přenosu souborů je aktuálně uzamčen. Počkejte prosím na dokončení probíhajících úkolů a zkuste to znovu.", + "ERROR_UPLOAD_301" : "Nemáte oprávnění nahrát tento soubor, protože nejste přihlášeni. Přihlaste se a zkuste to znovu.", + "ERROR_UPLOAD_303" : "Nemáte oprávnění k nahrání tohoto souboru. Pokud potřebujete přístup, zkontrolujte nastavení systému nebo se obraťte na správce systému.", + "ERROR_UPLOAD_308" : "Přenos souboru se zastavil. To je obvykle způsobeno problémy se sítí, jako je například nekvalitní bezdrátový signál, nebo jednoduše velmi pomalé připojení k síťi. Zkontrolujte síť a zkuste to znovu.", + "ERROR_UPLOAD_31D" : "V současné době se přenáší příliš mnoho souborů. Počkejte prosím na dokončení probíhajících přenosů a akci opakujte.", + "ERROR_UPLOAD_DEFAULT" : "V rámci serveru Guacamole došlo k interní chybě a připojení bylo ukončeno. Pokud problém přetrvává, informujte prosím správce systému nebo zkontrolujte systémové protokoly.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Zde se zobrazí text zkopírovaný / oříznutý v Guacamole. Změny níže uvedeného textu ovlivní vzdálenou schránku.", + "HELP_INPUT_METHOD_NONE" : "Není použita žádná metoda vstupu. Vstup z klávesnice je přijímán z připojené fyzické klávesnice.", + "HELP_INPUT_METHOD_OSK" : "Zobrazte a přijměte vstup z vestavěné klávesnice Guacamole na obrazovce. Klávesnice na obrazovce umožňuje zadávat kombinace kláves, které jinak mohou být nemožné (například Ctrl-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Povolit psaní textu a emulovat události klávesnice na základě zadaného textu. To je nezbytné pro zařízení, jako jsou mobilní telefony, které nemají fyzickou klávesnici.", + "HELP_MOUSE_MODE" : "Určuje, jak se bude vzdálená myš chovat s ohledem na dotyky.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Tap to click. Kliknutí nastane v místě dotyku.", + "HELP_MOUSE_MODE_RELATIVE" : "Přetažením myši posuňte ukazatel myši a klepněte na tlačítko. Kliknutí nastane v místě ukazatele.", + "HELP_SHARE_LINK" : "Aktuální připojení je sdíleno a může k němu přistupovat kdokoli s následujícím {LINKS, plural, one{odkazem} other{odkazy}}:", + + "INFO_ANONYMOUS_USER_COUNT" : "Anonymní{COUNT, plural, one{} other{ (#)}}", + "INFO_CONNECTION_SHARED" : "Toto připojení je nyní sdíleno.", + "INFO_NO_FILE_TRANSFERS" : "Žádné přenosy souborů.", + "INFO_USER_COUNT" : "{USERNAME}{COUNT, plural, one{} other{ (#)}}", + + "NAME_INPUT_METHOD_NONE" : "Žádné", + "NAME_INPUT_METHOD_OSK" : "Klávesnice na obrazovce", + "NAME_INPUT_METHOD_TEXT" : "Textový vstup", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Dotyková obrazovka", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIENT_MESSAGES" : "Zprávy", + "SECTION_HEADER_CLIPBOARD" : "Schránka", + "SECTION_HEADER_DEVICES" : "Zařízení", + "SECTION_HEADER_DISPLAY" : "Zobrazení", + "SECTION_HEADER_FILE_TRANSFERS" : "Přenos souborů", + "SECTION_HEADER_INPUT_METHOD" : "Metoda vstupu", + + "SECTION_HEADER_MOUSE_MODE" : "Mód emulace myši", + + "TEXT_ANONYMOUS_USER_JOINED" : "K připojení se připojil anonymní uživatel.", + "TEXT_ANONYMOUS_USER_LEFT" : "Anonymní uživatel opustil připojení.", + "TEXT_ZOOM_AUTO_FIT" : "Automaticky přizpůsobit prohlížeč oknu", + "TEXT_CLIENT_STATUS_IDLE" : "Nečinný", + "TEXT_CLIENT_STATUS_CONNECTING" : "Připojuji ke Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Byl jste odpojen.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "Síťové spojení ke Guacamole serveru se zdá nestabilní.", + "TEXT_CLIENT_STATUS_WAITING" : "Připojen ke Guacamole. Čekání na odpověď...", + "TEXT_USER_JOINED" : "{USERNAME} se připojil ke spojení.", + "TEXT_USER_LEFT" : "{USERNAME} opustil spojení.", + "TEXT_RECONNECT_COUNTDOWN" : "Znovu připojuji {REMAINING} {REMAINING, plural, one{sekundu} other{sekund}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Skrýt", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Zobrazit", + + "FIELD_HEADER_BACKGROUND" : "Pozadí", + "FIELD_HEADER_FOREGROUND" : "Popředí", + + "FIELD_OPTION_CUSTOM" : "Vlastní...", + + "SECTION_HEADER_DETAILS" : "Detaily:" + + }, + + "IMPORT": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_BROWSE" : "Vyhledejte soubor", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR" : "@:APP.ACTION_CLEAR", + "ACTION_VIEW_FORMAT_HELP" : "Zobrazit tipy formátů", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_IMPORT_CONNECTIONS" : "Importovat připojení", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + "DIALOG_HEADER_SUCCESS" : "Úspěch", + + "ERROR_AMBIGUOUS_CSV_HEADER" : "Nejednoznačné záhlaví CSV \"{HEADER}\", může být buď atribut nebo parametr připojení", + "ERROR_AMBIGUOUS_PARENT_GROUP" : "Skupina a parentIdentifier nesmí být zadány současně", + "ERROR_ARRAY_REQUIRED" : "Zadaný soubor musí obsahovat seznam připojení", + "ERROR_DETECTED_INVALID_TYPE" : "Nepodporovaný typ souboru. Ujistěte se, že je soubor platný CSV, JSON nebo YAML.", + "ERROR_DUPLICATE_CONNECTION_IN_FILE" : "Duplicitní připojení \"{NAME}\" v \"{PATH}\" v souboru importu", + "ERROR_DUPLICATE_CSV_HEADER" : "Duplicitní záhlaví CSV: {HEADER}", + "ERROR_EMPTY_FILE" : "Zadaný soubor je prázdný", + "ERROR_INVALID_CSV_HEADER" : "Neplatné záhlaví CSV \"{HEADER}\" není atribut ani parametr", + "ERROR_INVALID_MIME_TYPE" : "Nepodporovaný typ souboru: \"{TYPE}\"", + "ERROR_INVALID_GROUP" : "Nebyla nalezena žádná skupina odpovídající \"{GROUP}\"", + "ERROR_INVALID_GROUP_IDENTIFIER" : "Nebyla nalezena žádná skupina připojení s identifikátorem \"{IDENTIFIER}\"", + "ERROR_INVALID_GROUP_TYPE" : "Neplatná skupina – musí být zadán řetězec.", + "ERROR_INVALID_PROTOCOL" : "Neplatný protokol \"{PROTOCOL}\"", + "ERROR_INVALID_USER_GROUPS_TYPE" : "Neplatné skupiny uživatelů – musí se jednat o pole identifikátorů skupiny uživatelů.", + "ERROR_INVALID_USERS_TYPE" : "Neplatní uživatelé – musí se jednat o pole identifikátorů uživatelů.", + "ERROR_NO_FILE_SUPPLIED" : "Vyberte soubor k importu", + "ERROR_PARSE_FAILURE_CSV" : "Ujistěte se, že je váš soubor platný CSV. Analýza se nezdařila s chybou \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_JSON" : "Ujistěte se, že váš soubor je platný JSON. Analýza se nezdařila s chybou \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_YAML" : "Ujistěte se, že váš soubor je platný YAML. Analýza se nezdařila s chybou \"{ERROR}\". ", + "ERROR_REJECT_UPDATE_CONNECTION" : "Připojení \"{NAME}\" již existuje v \"{PATH}\"", + "ERROR_REQUIRED_NAME_CONNECTION" : "Název připojení je povinný parametr", + "ERROR_REQUIRED_PROTOCOL_CONNECTION" : "Protokol připojení je povinný parametr", + "ERROR_REQUIRED_NAME_FILE" : "V zadaném souboru nebyl nalezen žádný název připojení", + "ERROR_REQUIRED_PROTOCOL_FILE" : "V zadaném souboru nebyl nalezen žádný protokol připojení", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FIELD_HEADER_EXISTING_CONNECTION_MODE" : "Nahradit/aktualizovat stávající připojení", + "FIELD_HEADER_EXISTING_PERMISSION_MODE" : "Obnovit oprávnění", + + "HELP_CSV_DESCRIPTION" : "Soubor CSV pro import připojení má jeden záznam připojení na řádek. Každý sloupec bude specifikovat pole připojení. Minimálně musí být specifikován název připojení a protokol.", + "HELP_CSV_EXAMPLE" : "name,protocol,username,password,hostname,group,users,groups,guacd-encryption (attribute)\nprip1,vnc,alice,heslo1,prip1.web.com,ROOT,guac uživatel 1;guac uživatel 2,Uživatelé Připojení 1,none\nprip2,rdp,bob,heslo2,prip2.web.com,ROOT/Nadřazená skupina,guac uživatel 1,,ssl\nprip3,ssh,karolina,heslo3,prip3.web.com,ROOT/Nadřazená skupina/Podřízená skupina,guac uživatel 2;guac uživatel 3,,\nprip4,kubernetes,,,,,,,", + "HELP_CSV_MORE_DETAILS" : "V záhlaví CSV každého řádku je uvedeno pole připojení. ID skupiny připojení, do které má být připojení importováno, lze přímo zadat pomocí parametru \"parentIdentifier\" nebo lze cestu k nadřazené skupině zadat pomocí parametru \"group\", jak je uvedeno níže. Ve většině případů by mezi poli neměl být žádný konflikt, ale v případě potřeby lze pro jednoznačnost přidat příponu \" (attribute)\" nebo \" (parameter)\". Seznamy identifikátorů uživatelů nebo skupin uživatelů musí být odděleny středníkem.¹", + "HELP_FILE_TYPE_DESCRIPTION" : "Pro import připojení jsou podporovány tři typy souborů: CSV, JSON a YAML. Pro každý typ souboru mohou být zadána stejná data. Musí obsahovat název připojení a protokol. Volitelně lze také zadat umístění skupiny připojení, seznam uživatelů a/nebo skupiny uživatelů pro udělení přístupu, parametry připojení nebo protokoly připojení. Všichni uživatelé nebo skupiny uživatelů, kteří v aktuálním zdroji dat neexistují, budou automaticky vytvořeni. Upozorňujeme, že žádná existující oprávnění připojení nebudou odebrána pro aktualizovaná připojení, pokud není zaškrtnuto políčko \"Obnovit oprávnění\".", + "HELP_FILE_TYPE_HEADER" : "Typy souborů", + "HELP_JSON_DESCRIPTION" : "Soubor JSON pro import připojení je seznam objektů připojení. V každém objektu připojení musí být uvedeno minimálně jméno připojení a protokol.", + "HELP_JSON_EXAMPLE" : "[\n \\{\n \"name\": \"prip1\",\n \"protocol\": \"vnc\",\n \"parameters\": \\{ \"username\": \"alice\", \"password\": \"heslo1\", \"hostname\": \"prip1.web.com\" \\},\n \"parentIdentifier\": \"ROOT\",\n \"users\": [ \"guac uživatel 1\", \"guac uživatel 2\" ],\n \"groups\": [ \"Uživatelé Připojení 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"prip2\",\n \"protocol\": \"rdp\",\n \"parameters\": \\{ \"username\": \"bob\", \"password\": \"heslo2\", \"hostname\": \"prip2.web.com\" \\},\n \"group\": \"ROOT/Nadřazená skupina\",\n \"users\": [ \"guac uživatel 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"prip3\",\n \"protocol\": \"ssh\",\n \"parameters\": \\{ \"username\": \"karolina\", \"password\": \"heslo3\", \"hostname\": \"prip3.web.com\" \\},\n \"group\": \"ROOT/Nadřazená skupina/Podřízená skupina\",\n \"users\": [ \"guac uživatel 2\", \"guac uživatel 3\" ]\n \\},\n \\{\n \"name\": \"prip4\",\n \"protocol\": \"kubernetes\"\n \\}\n]", + "HELP_JSON_MORE_DETAILS" : "ID skupiny připojení, do které má být připojení importováno, lze přímo zadat pomocí pole \"parentIdentifier\" nebo lze cestu k nadřazené skupině zadat pomocí pole \"group\", jak je uvedeno níže. Pro každé připojení lze zadat pole identifikátorů uživatelů a skupin uživatelů, kterým chcete udělit přístup.", + "HELP_EXISTING_CONNECTION_MODE" : "Zcela nahradit/aktualizovat existující připojení, pokud jejich názvy a nadřazené skupiny připojení odpovídají hodnotám v poskytnutém souboru. Pokud není zaškrtnuto, pokus o import připojení se stejným názvem a nadřazenou skupinou připojení jako existující připojení bude považován za chybu.", + "HELP_EXISTING_PERMISSION_MODE" : "Úplně resetujte oprávnění udělená pro všechna připojení v poskytnutém souboru za oprávnění určená v tomto souboru. Pokud nejsou zadána žádná oprávnění, všechna příslušná oprávnění k připojení budou odvolána. Pokud není zaškrtnuto, stávající oprávnění zůstanou zachována a všechna oprávnění uvedená v souboru budou přidána.", + "HELP_SEMICOLON_FOOTNOTE" : "Pokud jsou přítomny středníky, mohou být escapovány zpětným lomítkem, např. \"první\\\\;poslední\"", + "HELP_UPLOAD_DROP_TITLE" : "Sem přetáhněte soubor", + "HELP_UPLOAD_FILE_TYPES" : "CSV, JSON, nebo YAML", + "HELP_YAML_DESCRIPTION" : "Soubor YAML pro import připojení je seznam objektů připojení se zcela stejnou strukturou jako formát JSON.", + "HELP_YAML_EXAMPLE" : "---\n - name: prip1\n protocol: vnc\n parameters:\n username: alice\n password: heslo1\n hostname: prip1.web.com\n group: ROOT\n users:\n - guac uživatel 1\n - guac uživatel 2\n groups:\n - Uživatelé Připojení 1\n attributes:\n guacd-encryption: none\n - name: prip2\n protocol: rdp\n parameters:\n username: bob\n password: heslo2\n hostname: prip2.web.com\n group: ROOT/Nadřazená skupina\n users:\n - guac uživatel 1\n attributes:\n guacd-encryption: none\n - name: prip3\n protocol: ssh\n parameters:\n username: karolina\n password: heslo3\n hostname: prip3.web.com\n group: ROOT/Nadřazená skupina/Podřízená skupina\n users:\n - guac uživatel 2\n - guac uživatel 3\n - name: prip4\n protocol: kubernetes", + + "INFO_CONNECTIONS_IMPORTED_SUCCESS" : "{NUMBER} {NUMBER, plural, one{připojení} other{připojení}} úspěšně importováno.", + + "SECTION_HEADER_CONNECTION_IMPORT" : "Import připojení", + "SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE" : "Formát souboru importu připojení", + "SECTION_HEADER_CSV" : "Formát CSV", + "SECTION_HEADER_JSON" : "Formát JSON", + "SECTION_HEADER_YAML" : "Formát YAML", + + "TABLE_HEADER_ERRORS" : "Chyby", + "TABLE_HEADER_GROUP" : "Skupina", + "TABLE_HEADER_NAME" : "Jméno", + "TABLE_HEADER_PROTOCOL" : "Protokol", + "TABLE_HEADER_ROW_NUMBER" : "Řádek #" + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Výchozí (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Klikněte pro zobrazní hesla", + "HELP_HIDE_PASSWORD" : "Klikněte pro skrytí hesla" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Žádná nedávná spojení.", + + "PASSWORD_CHANGED" : "Heslo bylo změněno.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Všechna spojení", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Nedávná spojení" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anonymní uživatel" + + }, + + "LOGIN" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Neplatné přihlašovací jméno", + + "FIELD_HEADER_USERNAME" : "Uživatelské jméno", + "FIELD_HEADER_PASSWORD" : "Heslo" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Smazat spojení", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Oblast:", + "FIELD_HEADER_NAME" : "Jméno:", + "FIELD_HEADER_PROTOCOL" : "Protokol:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Nyní aktivní", + "INFO_CONNECTION_NOT_USED" : "Toto spojení ještě nebylo použito.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Upravit spojení", + "SECTION_HEADER_HISTORY" : "Historie využítí", + "SECTION_HEADER_PARAMETERS" : "Parametry", + + "TABLE_HEADER_HISTORY_USERNAME" : "Uživatelské jméno", + "TABLE_HEADER_HISTORY_START" : "Počáteční čas", + "TABLE_HEADER_HISTORY_DURATION" : "Doba", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Vzdálený host", + + "TEXT_CONFIRM_DELETE" : "Spojení nemůže být obnoveno poté, co je smazáno. Opravdu chcete smazat toto spojení?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Smazat skupinu spojení", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Lokace:", + "FIELD_HEADER_NAME" : "Jméno:", + "FIELD_HEADER_TYPE" : "Typ:", + + "NAME_TYPE_BALANCING" : "Vyvažování", + "NAME_TYPE_ORGANIZATIONAL" : "Organizační", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Upravit skupinu spojení", + + "TEXT_CONFIRM_DELETE" : "Skupiny spojení nelze obnovit po jejich odstranění. Opravdu chcete odstranit tuto skupinu připojení?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Odstranit profil sdílení", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Jméno:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Primární spojení:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Upravit sdílený profil", + "SECTION_HEADER_PARAMETERS" : "Parametry", + + "TEXT_CONFIRM_DELETE" : "Po smazání nelze obnovit profily sdílení. Opravdu chcete smazat tento profil sdílení?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Smazat uživatele", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Spravovat systém:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Změnit vlastní heslo:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Vytvořit nové uživatele:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Vytvořit novou uživatelskou skupinu:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Vytvořit nové spojení:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Vytvořit nové skupiny připojení:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Vytvořit nový sdílený profil:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USERNAME" : "Uživatelské jméno:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Tento uživatel momentálně nepatří do žádné skupiny. Rozbalte tuto sekci, abyste mohli přidát skupiny.", + + "INFO_READ_ONLY" : "Omlouváme se, ale tento uživatelský účet nelze upravovat.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "Nejsou k dispozici žádné skupiny.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Všechna připojení", + "SECTION_HEADER_CONNECTIONS" : "Připojení", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Aktuální připojení", + "SECTION_HEADER_EDIT_USER" : "Upravit uživatele", + "SECTION_HEADER_PERMISSIONS" : "Oprávnění", + "SECTION_HEADER_USER_GROUPS" : "Skupiny", + + "TEXT_CONFIRM_DELETE" : "Po odstranění nelze uživatele obnovit. Opravdu chcete tohoto uživatele smazat?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Smazat skupinu", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_NAME" : "Jméno skupiny:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Tato skupina momentálně nepatří do žádné skupiny. Rozbalením této sekce ji přidáte do skupiny.", + "HELP_NO_MEMBER_USER_GROUPS" : "Tato skupina v současné době neobsahuje žádné skupiny. Rozbalením této sekce ji přidáte do skupiny.", + "HELP_NO_MEMBER_USERS" : "Tato skupina v současné době neobsahuje žádné uživatele. Rozbalením této sekce přidáte uživatele.", + + "INFO_READ_ONLY" : "Je nám líto, ale tuto skupinu nelze upravovat.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "Žádní uživatelé nejsou k dispozici.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Upravit skupinu", + "SECTION_HEADER_MEMBER_USERS" : "Členský uživatel", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Členské skupiny", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Rodičovské skupiny", + + "TEXT_CONFIRM_DELETE" : "Skupiny nelze po jejich odstranění obnovit. Chcete opravdu smazat tuto skupinu?" + + }, + + "PLAYER" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_PAUSE" : "@:APP.ACTION_PAUSE", + "ACTION_PLAY" : "@:APP.ACTION_PLAY", + + "INFO_LOADING_RECORDING" : "Vaše nahrávka se nyní načítá. Čekejte prosím...", + "INFO_SEEK_IN_PROGRESS" : "Hledání požadované pozice. Čekejte prosím..." + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Klávesa Zpět odešle:", + "FIELD_HEADER_CA_CERT" : "Certifikát certifikační autority:", + "FIELD_HEADER_CLIENT_CERT" : "Klientský certifikát:", + "FIELD_HEADER_CLIENT_KEY" : "Klientský klíč:", + "FIELD_HEADER_COLOR_SCHEME" : "Barevné schéma:", + "FIELD_HEADER_CONTAINER" : "Jméno kontejneru:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automaticky vytvořit cestu k záznamu:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automaticky vytvořit cestu ke strojopisu:", + "FIELD_HEADER_DISABLE_COPY" : "Zakázat kopírování ze vzdáleného terminálu:", + "FIELD_HEADER_DISABLE_PASTE" : "Zakázat vkládání z klienta:", + "FIELD_HEADER_EXEC_COMMAND" : "Příkaz (exec):", + "FIELD_HEADER_FONT_NAME" : "Jméno fontu:", + "FIELD_HEADER_FONT_SIZE" : "Velikost fontu:", + "FIELD_HEADER_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorovat serverový certifikát:", + "FIELD_HEADER_NAMESPACE" : "Obor názvů:", + "FIELD_HEADER_POD" : "Jméno podu:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Pouze ke čtení:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Vyloučit myš:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Vyloučit grafiku/streamování:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Zahrnout události kláves:", + "FIELD_HEADER_RECORDING_NAME" : "Jméno záznamu:", + "FIELD_HEADER_RECORDING_PATH" : "Cesta k záznamu:", + "FIELD_HEADER_SCROLLBACK" : "Maximální délka historie:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Jméno strojopisu:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Cesta ke strojopisu:", + "FIELD_HEADER_USE_SSL" : "Použít SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Zpět (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Smazat (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Černá na bílé", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Šedá na černé", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Zelená na černé", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Bílá na černé", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Ověřování", + "SECTION_HEADER_BEHAVIOR" : "Chování terminálu", + "SECTION_HEADER_CLIPBOARD" : "Schránka", + "SECTION_HEADER_CONTAINER" : "Kontejner", + "SECTION_HEADER_DISPLAY" : "Zobrazení", + "SECTION_HEADER_RECORDING" : "Záznam obrazovky", + "SECTION_HEADER_TYPESCRIPT" : "Strojopis (textový záznam sezení)", + "SECTION_HEADER_NETWORK" : "Síť" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Jméno klienta:", + "FIELD_HEADER_COLOR_DEPTH" : "Barevná hloubka:", + "FIELD_HEADER_CONSOLE" : "Konzola pro správu:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Podpora zvuku v konzole:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Automaticky vytvořit disk:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automaticky vytvořit cestu k záznamu:", + "FIELD_HEADER_DISABLE_AUDIO" : "Zakázat zvuk:", + "FIELD_HEADER_DISABLE_AUTH" : "Zakázat ověřování:", + "FIELD_HEADER_DISABLE_COPY" : "Zakázat kopírování ze vzdálené plochy:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Zakázat stahování souborů:", + "FIELD_HEADER_DISABLE_PASTE" : "Zakázat vkládání z klienta:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Zakázat nahrávání souborů:", + "FIELD_HEADER_DOMAIN" : "Doména:", + "FIELD_HEADER_DPI" : "Rozlišení (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Název jednotky:", + "FIELD_HEADER_DRIVE_PATH" : "Cesta na disku:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Povolit zvukový vstup (mikrofon):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Povolit kompozici pracovní plochy (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Povolit jednotku:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Povolit vyhlazení písma (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Povolit přetažení celého okna:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Povolit animace nabídky:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Zakázat ukládání do mezipaměti bitmap:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Zakázat ukládání do mezipaměti mimo obrazovku:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Zakázat ukládání do mezipaměti glyfů:", + "FIELD_HEADER_DISABLE_GFX" : "Zakázat rozšíření Graphics Pipeline:", + "FIELD_HEADER_ENABLE_PRINTING" : "Povolit tisk:", + "FIELD_HEADER_ENABLE_SFTP" : "Povolit SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Povolit motivy:", + "FIELD_HEADER_ENABLE_TOUCH" : "Povolit vícedotykové ovládání:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Povolit tapetu:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Vynutit bezeztrátovou kompresi:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Doména:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Heslo:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_HEIGHT" : "Výška:", + "FIELD_HEADER_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorovat serverový certifikát:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Úvodní program:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Vyvážení zátěže info/cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "Konce řádků:", + "FIELD_HEADER_PASSWORD" : "Heslo:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRINTER_NAME" : "Název přesměrované tiskárny:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Preconnection BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "Zdrojové ID RDP:", + "FIELD_HEADER_READ_ONLY" : "Pouze ke čtení:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Vyloučit myš:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Vyloučit grafiku/strímování:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Vyloučit dotykové události:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Zahrnout klíčové události:", + "FIELD_HEADER_RECORDING_NAME" : "Název záznamu:", + "FIELD_HEADER_RECORDING_PATH" : "Cesta pro záznam:", + "FIELD_HEADER_RESIZE_METHOD" : "Metoda změny velikosti:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parametry:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Pracovní adresář:", + "FIELD_HEADER_REMOTE_APP" : "Program:", + "FIELD_HEADER_SECURITY" : "Bezpečnostní mód:", + "FIELD_HEADER_SERVER_LAYOUT" : "Rozložení klávesnice:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Výchozí složka pro uložení záznamu:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Zakázat stahování souborů:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Veřejný klíč hosta (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Interval udržování SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Přístupová fráze:", + "FIELD_HEADER_SFTP_PASSWORD" : "Heslo:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Privátní klíč:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Souborový prohlížeč kořenové složky:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Zakázat nahrávání souborů:", + "FIELD_HEADER_SFTP_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_STATIC_CHANNELS" : "Názvy statických kanálů:", + "FIELD_HEADER_TIMEZONE" : "Časová zóna:", + "FIELD_HEADER_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_WIDTH" : "Šířka:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Vysílací adresa pro paket WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC adresa vzdáleného hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Odeslat paket WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port pro paket WoL: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Doba čekání na spuštění hostitele:", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_EMPTY" : "", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "Zachovat tak, jak je", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Nízké barvy (16-bitů)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Opravdové barvy (24-bitů)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Opravdové barvy (32-bitů)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 barev", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Aktualizace zobrazení\" virtuální kanál (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Znovu připojit", + + "FIELD_OPTION_SECURITY_ANY" : "Jakýkoliv", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Ověřování na úrovni sítě)", + "FIELD_OPTION_SECURITY_RDP" : "Šifrování RDP", + "FIELD_OPTION_SECURITY_TLS" : "Šifrování TLS", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Čeština (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Dánština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Švícarská Němčina (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Němčina (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "UK Angličtina (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US Angličtina (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Španělština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Standardní Angličtina (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Belgická Francouzština (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Kanadská francouzština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Švícarská Francouzština (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Francouzština (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Maďarština (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japonština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Norština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portugalská Brazilština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portugalština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Rumunština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Švédština (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turečtina (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Ověřování", + "SECTION_HEADER_BASIC_PARAMETERS" : "Základní nastavení", + "SECTION_HEADER_CLIPBOARD" : "Schránka", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Přesměrování zařízení", + "SECTION_HEADER_DISPLAY" : "Zobrazení", + "SECTION_HEADER_GATEWAY" : "Brána vzdálené plochy", + "SECTION_HEADER_LOAD_BALANCING" : "Rozložení zátěže", + "SECTION_HEADER_NETWORK" : "Síť", + "SECTION_HEADER_PERFORMANCE" : "Výkon", + "SECTION_HEADER_PRECONNECTION_PDU" : "Preconnection PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Záznam obrazovky", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Klávesa Zpět odešle:", + "FIELD_HEADER_COLOR_SCHEME" : "Barva:", + "FIELD_HEADER_COMMAND" : "Provést příkaz:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automaticky vytvořit cestu pro uložení záznamu:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automaticky vytvořit cestu ke strojopisu:", + "FIELD_HEADER_DISABLE_COPY" : "Zakázat kopírování ze vzdáleného terminálu:", + "FIELD_HEADER_DISABLE_PASTE" : "Zakázat vkládání z klienta:", + "FIELD_HEADER_FONT_NAME" : "Typ fontu:", + "FIELD_HEADER_FONT_SIZE" : "Velikost písma:", + "FIELD_HEADER_ENABLE_SFTP" : "Povolit SFTP:", + "FIELD_HEADER_HOST_KEY" : "Veřejný klíč hosta (Base64):", + "FIELD_HEADER_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_LOCALE" : "Jazyk/Lokalizace ($LANG):", + "FIELD_HEADER_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_PASSWORD" : "Heslo:", + "FIELD_HEADER_PASSPHRASE" : "Přístupová fráze:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Privátní klíč:", + "FIELD_HEADER_SCROLLBACK" : "Maximální délka historie:", + "FIELD_HEADER_READ_ONLY" : "Pouze ke čtení:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Vynechat myš:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Vynechat grafiku/streamování:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Zahrnout události kláves:", + "FIELD_HEADER_RECORDING_NAME" : "Název záznamu:", + "FIELD_HEADER_RECORDING_PATH" : "Cesta pro záznam:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Serverový keepalive interval:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Zakázat stahování souborů:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Souborový prohlížeč kořenové složky:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Zakázat nahrávání souborů:", + "FIELD_HEADER_TERMINAL_TYPE" : "Typ terminálu:", + "FIELD_HEADER_TIMEZONE" : "Časová zóna ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Jméno strojopisu:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Cesta ke strojopisu:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Vysílací adresa pro paket WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC adresa vzdáleného hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Odeslat paket WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port pro paket WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Doba čekání na spuštění hostitele:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Zpět (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Smazat (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Černá na bílé", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Šedá na černé", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Zelená na černé", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Bílá na černé", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Ověřování", + "SECTION_HEADER_BEHAVIOR" : "Chování terminálu", + "SECTION_HEADER_CLIPBOARD" : "Schránka", + "SECTION_HEADER_DISPLAY" : "Zobrazení", + "SECTION_HEADER_NETWORK" : "Síť", + "SECTION_HEADER_RECORDING" : "Záznam obrazovky", + "SECTION_HEADER_SESSION" : "Sezení / prostředí", + "SECTION_HEADER_TYPESCRIPT" : "Strojopis (textový záznam sezení)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Klávesa Zpět odešle:", + "FIELD_HEADER_COLOR_SCHEME" : "Barevné schéma:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automaticky vytvořit cestu pro uložení záznamu:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automaticky vytvořit cestu ke strojopisu:", + "FIELD_HEADER_DISABLE_COPY" : "Zakázat kopírování z terminálu:", + "FIELD_HEADER_DISABLE_PASTE" : "Zakázat vkládání z klienta:", + "FIELD_HEADER_FONT_NAME" : "Jméno fontu:", + "FIELD_HEADER_FONT_SIZE" : "Velikost fontu:", + "FIELD_HEADER_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Přihlášení se nezdařilo regulární výraz:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Přihlášení bylo úspěšné regulární výraz:", + "FIELD_HEADER_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_USERNAME_REGEX" : "Uživatelské jméno regulární výraz:", + "FIELD_HEADER_PASSWORD" : "Heslo:", + "FIELD_HEADER_PASSWORD_REGEX" : "Heslo regulární výraz:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Pouze ke čtení:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Vyloučit myš:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Vyloučit grafiku/streamování:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Zahrnout klíčové události:", + "FIELD_HEADER_RECORDING_NAME" : "Název záznamu:", + "FIELD_HEADER_RECORDING_PATH" : "Cesta pro záznam:", + "FIELD_HEADER_SCROLLBACK" : "Maximální délka historie:", + "FIELD_HEADER_TERMINAL_TYPE" : "Typ terminálu:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Jméno strojopisu:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Cesta ke strojopisu:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Vysílací adresa pro paket WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC adresa vzdáleného hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Odeslat paket WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port pro paket WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Doba čekání na spuštění hostitele:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Zpět (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Smazat (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Černá na bílé", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Šedá na černé", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Zelená na černé", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Bílá na černé", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Ověřování", + "SECTION_HEADER_BEHAVIOR" : "Chování terminálu", + "SECTION_HEADER_CLIPBOARD" : "Schránka", + "SECTION_HEADER_DISPLAY" : "Zobrazení", + "SECTION_HEADER_RECORDING" : "Záznam obrazovky", + "SECTION_HEADER_TYPESCRIPT" : "Strojopis (textový záznam sezení)", + "SECTION_HEADER_NETWORK" : "Síť", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Název zvukového serveru:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Kódovávání:", + "FIELD_HEADER_COLOR_DEPTH" : "Hloubka barev:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automaticky vytvořit cestu pro uložení záznamu:", + "FIELD_HEADER_CURSOR" : "Kurzor:", + "FIELD_HEADER_DEST_HOST" : "Cílový host:", + "FIELD_HEADER_DEST_PORT" : "Vzdálený port:", + "FIELD_HEADER_DISABLE_COPY" : "Zakázat kopírování ze vzdálené plochy:", + "FIELD_HEADER_DISABLE_PASTE" : "Zakázat vkládání z klienta:", + "FIELD_HEADER_ENABLE_AUDIO" : "Zapnout audio:", + "FIELD_HEADER_ENABLE_SFTP" : "Povolit SFTP:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Vynutit bezeztrátovou kompresi:", + "FIELD_HEADER_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_PASSWORD" : "Heslo:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Pouze čtení:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Vynechat myš:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Vynechat grafiku/stremování:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Zahrnout události kláves:", + "FIELD_HEADER_RECORDING_NAME" : "Název záznamu:", + "FIELD_HEADER_RECORDING_PATH" : "Cesta pro záznam:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Výchozí složka pro uložení záznamu:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Zakázat stahování souborů:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Veřejný klíč hosta (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Jméno hostitele:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Interval udržování SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Přístupová fráze:", + "FIELD_HEADER_SFTP_PASSWORD" : "Heslo:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Privátní klíč:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Souborový prohlížeč kořenové složky:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Zakázat nahrávání souborů:", + "FIELD_HEADER_SFTP_USERNAME" : "Uživatelské jméno:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Přehodit červené/modré komponenty:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Vysílací adresa pro paket WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC adresa vzdáleného hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Odeslat paket WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port pro paket WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Doba čekání na spuštění hostitele:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 barev", + "FIELD_OPTION_COLOR_DEPTH_16" : "Nízké barvy (16-bitů)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Opravdové barvy (24-bitů)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Opravdové barvy (32-bitů)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Místní", + "FIELD_OPTION_CURSOR_REMOTE" : "Vzdálený", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Zvuk", + "SECTION_HEADER_AUTHENTICATION" : "Ověřování", + "SECTION_HEADER_CLIPBOARD" : "Schránka", + "SECTION_HEADER_DISPLAY" : "Zobrazení", + "SECTION_HEADER_NETWORK" : "Síť", + "SECTION_HEADER_RECORDING" : "Záznam obrazovky", + "SECTION_HEADER_REPEATER" : "VNC opakovač", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Nastavení" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + "ACTION_VIEW_RECORDING" : "@:APP.ACTION_VIEW_RECORDING", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Zde jsou uvedeny záznamy o historii připojení a lze je třídit kliknutím na záhlaví sloupců. Chcete-li vyhledat konkrétní záznamy, zadejte řetězec filtrů a klikněte na tlačítko Hledat. Zobrazí se pouze záznamy, které odpovídají zadanému řetězci filtrů.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Žádné shodné záznamy", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Název připojení", + "TABLE_HEADER_SESSION_DURATION" : "Doba trvání", + "TABLE_HEADER_SESSION_LOGS" : "Protokoly", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Vzdálený host", + "TABLE_HEADER_SESSION_STARTDATE" : "Doba spuštění", + "TABLE_HEADER_SESSION_USERNAME" : "Uživatelské jméno", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_NEW_CONNECTION" : "Nové připojení", + "ACTION_NEW_CONNECTION_GROUP" : "Nový skupina", + "ACTION_NEW_SHARING_PROFILE" : "Nový sdílený profil", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Toto připojení můžete spravovat klepnutím nebo klepnutím na níže uvedené připojení. V závislosti na vaší úrovni přístupu lze přidávat a mazat připojení a měnit jejich vlastnosti (protokol, název hostitele, port atd.).", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Připojení" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Jazyk zobrazení:", + "FIELD_HEADER_PASSWORD" : "Heslo:", + "FIELD_HEADER_PASSWORD_OLD" : "Aktuální heslo:", + "FIELD_HEADER_PASSWORD_NEW" : "Nové heslo:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Potvrďte nové heslo:", + "FIELD_HEADER_TIMEZONE" : "Časové pásmo:", + "FIELD_HEADER_USERNAME" : "Uživatelské jméno:", + + "HELP_DEFAULT_INPUT_METHOD" : "Výchozí metoda vstupu určuje, jak Guacamole přijímá události klávesnice. Změna tohoto nastavení může být nezbytná při používání mobilního zařízení nebo při psaní přes IME. Toto nastavení může být přepsáno na základě připojení v rámci nabídky Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "Výchozí režim emulace myši určuje, jak se bude vzdálená myš chovat v nových spojeních s ohledem na dotyky. Toto nastavení může být přepsáno na základě připojení v rámci nabídky Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Níže uvedené možnosti se vztahují k místu uživatele a ovlivní způsob zobrazení různých částí rozhraní.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Pokud chcete změnit heslo, zadejte své aktuální heslo a níže požadované nové heslo a klikněte na tlačítko „Aktualizovat heslo“. Změna se projeví okamžitě.", + + "INFO_PASSWORD_CHANGED" : "Heslo bylo změněno.", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "Uživatelská nastavení uložena.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Výchozí metoda vstupu", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Výchozí mód emulace myši", + "SECTION_HEADER_UPDATE_PASSWORD" : "Změnit heslo" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Nový uživatel", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Chcete-li spravovat daného uživatele, klepněte na něj nebo klepněte na něj. V závislosti na úrovni přístupu mohou být uživatelé přidáváni a mazáni a jejich hesla mohou být změněna.", + + "SECTION_HEADER_USERS" : "Uživatel", + + "TABLE_HEADER_FULL_NAME" : "Celé jméno", + "TABLE_HEADER_LAST_ACTIVE" : "Naposledy aktivní", + "TABLE_HEADER_ORGANIZATION" : "Organizace", + "TABLE_HEADER_USERNAME" : "Uživatelské jméno" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Nová skupina", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Chcete-li tuto skupinu spravovat, klepněte na ni nebo klepněte na ni. V závislosti na úrovni přístupu lze skupiny přidávat a mazat a jejich členské uživatele a skupiny lze měnit.", + + "SECTION_HEADER_USER_GROUPS" : "Skupiny", + + "TABLE_HEADER_USER_GROUP_NAME" : "Jméno skupiny" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Ukončit sezení", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Ukončit sezení", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Tato stránka bude naplněna aktuálně aktivními připojeními. Uvedená připojení a schopnost zabít tato připojení závisí na úrovni přístupu. Pokud chcete zabít jednu nebo více relací, zaškrtněte políčko vedle těchto relací a klepněte na tlačítko \"Zabít relace\". Zabití relace okamžitě odpojí uživatele od přidruženého připojení.", + + "INFO_NO_SESSIONS" : "Žádné aktivní sezení", + + "SECTION_HEADER_SESSIONS" : "Aktivní sezení", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Název připojení", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Vzdálený host", + "TABLE_HEADER_SESSION_STARTDATE" : "Aktivní od", + "TABLE_HEADER_SESSION_USERNAME" : "Uživatelské jméno", + + "TEXT_CONFIRM_DELETE" : "Jste si jisti, že chcete ukončit vybrané připojení? Uživatelé využívající toto připojení budou okamžitě odpojeni." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Emailová adresa:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Celé jméno:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organizace:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Role:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/de.json b/guacamole/src/main/frontend/src/translations/de.json new file mode 100644 index 0000000..2047bb7 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/de.json @@ -0,0 +1,1133 @@ +{ + + "NAME" : "Deutsch", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Abbruch", + "ACTION_CLEAR" : "Bereinigen", + "ACTION_CLONE" : "Kopieren", + "ACTION_CONTINUE" : "Weiter", + "ACTION_DELETE" : "Löschen", + "ACTION_DELETE_SESSIONS" : "Sitzung beenden", + "ACTION_DOWNLOAD" : "Download", + "ACTION_IMPORT" : "Import", + "ACTION_LOGIN" : "Anmelden", + "ACTION_LOGIN_AGAIN" : "Neuanmelden", + "ACTION_LOGOUT" : "Abmelden", + "ACTION_MANAGE_CONNECTIONS" : "Verbindungen", + "ACTION_MANAGE_PREFERENCES" : "Einstellungen", + "ACTION_MANAGE_SETTINGS" : "Einstellungen", + "ACTION_MANAGE_SESSIONS" : "Aktive Sitzungen", + "ACTION_MANAGE_USERS" : "Benutzer", + "ACTION_MANAGE_USER_GROUPS" : "Gruppen", + "ACTION_NAVIGATE_BACK" : "Zurück", + "ACTION_NAVIGATE_HOME" : "Startseite", + "ACTION_PAUSE" : "Pause", + "ACTION_PLAY" : "Abspielen", + "ACTION_SAVE" : "Speichern", + "ACTION_SEARCH" : "Suche", + "ACTION_SHARE" : "Teilen", + "ACTION_UPDATE_PASSWORD" : "Passwort aktualisieren", + "ACTION_VIEW_HISTORY" : "Verlauf", + "ACTION_VIEW_RECORDING" : "Ansicht", + + "DIALOG_HEADER_ERROR" : "Fehler", + + "ERROR_PAGE_UNAVAILABLE" : "Ein Fehler ist aufgetreten und die gewünschte Aktion kann nicht fortgesetzt werden. Bitte informieren Sie ihren Systemadministrator oder prüfen Sie die Logdateien, falls das Problem bestehen bleiben sollte.", + "ERROR_PASSWORD_BLANK" : "Das Passwort darf nicht leer sein.", + "ERROR_PASSWORD_MISMATCH" : "Die Passwörter stimmen nicht überein.", + "ERROR_SINGLE_FILE_ONLY" : "Bitte nur eine Datei zeitgleich hochladen", + + "FIELD_HEADER_PASSWORD" : "Passwort:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Wiederhole Passwort:", + + "FIELD_PLACEHOLDER_FILTER" : "Filter", + + "FORMAT_DATE_TIME_PRECISE" : "dd-MM-yyyy HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "In Benutzung durch {USERS} Benutzer.", + "INFO_LOGGED_OUT" : "Sie wurden ausgeloggt.", + + "TEXT_ANONYMOUS_USER" : "Anonymer Benutzer", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{Sekunde} other{Sekunden}}} minute{{VALUE, plural, one{Minute} other{Minuten}}} hour{{VALUE, plural, one{Stunde} other{Stunden}}} day{{VALUE, plural, one{Tag} other{Tage}}} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_CLIENT_MESSAGES" : "@:APP.ACTION_CLEAR", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Entferne abgeschlossene Übertragungen", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Trennen", + "ACTION_FULLSCREEN" : "Vollbild", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Neu verbinden", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_SHOW_CLIPBOARD" : "Klicken um Zwischenablage anzuzeigen.", + "ACTION_UPLOAD_FILES" : "Dateien hochladen", + + "DIALOG_HEADER_CONNECTING" : "Verbinden", + "DIALOG_HEADER_CONNECTION_ERROR" : "Verbindungsfehler", + "DIALOG_HEADER_DISCONNECTED" : "Verbindung getrennt", + + "ERROR_CLIENT_201" : "Aufgrund hoher Serverauslastung wurde diese Verbindung zurückgesetzt. Versuchen Sie es in wenigen Minuten erneut.", + "ERROR_CLIENT_202" : "Der Verbindungsaufbau wurde durch den Guacamole Server abgebrochen da der entfernte Computer nicht reagiert. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_CLIENT_203" : "Der entfernte Computer hat einen Fehler hervorgerufen und die Verbindung geschlossen. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_CLIENT_207" : "Der entfernte Computer ist gegenwärtig nicht erreichbar. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_CLIENT_208" : "Der entfernte Computer ist gegenwärtig nicht verfügbar. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_CLIENT_209" : "Der entfernte Computer hat die Verbindung geschlossen, da sie mit einer anderen Verbindung in Konflikt steht. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_CLIENT_20A" : "Der entfernte Computer hat die Verbindung geschlossen, da sie als inaktiv erkannt wurde. Bitte kontaktieren Sie Ihren Systemadministrator oder prüfen Sie Ihre Verbindungseinstellungen.", + "ERROR_CLIENT_20B" : "Der entfernte Computer hat die Verbindung geschlossen. Bitte kontaktieren Sie Ihren Systemadministrator oder prüfen Sie die Systemlogs falls dieses Verhalten unerwünscht oder unerwartet sein sollte.", + "ERROR_CLIENT_301" : "Anmeldung Fehlgeschlagen. Bitte versuchen Sie es erneut.", + "ERROR_CLIENT_303" : "Sie haben keine Berechtigung auf diese Verbindung zuzugreifen. Wenn Sie diese Berechtigung benötigen, bitten Sie den Systemadministrator diese Berechtigung hinzuzufügen oder prüfen Sie Ihre Systemeinstellungen.", + "ERROR_CLIENT_308" : "Die Verbindung wurde durch den Guacamole Server geschlossen da keine aktive Interkommunikation mit dem Browser besteht. Dies wird gewöhnlich durch Netzwerkprobleme verursacht, wie eine schlechte drahtlose Verbindung oder eine sehr langsame Netzwerkverbindung. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut..", + "ERROR_CLIENT_31D" : "Der Zugang zu dieser Verbindung wurde durch den Guacamole Server verweigert, da die maximale Anzahl der gleichzeitigen Zugriffe für diese Verbindung für einen einzelnen Benutzer erreicht wurde.", + "ERROR_CLIENT_DEFAULT" : "Die Verbindung wurde aufgrund eines internen Fehlers im Guacamole Server beendet. Sollte dieses Problem weiterhin bestehen informieren Sie den Systemadministrator oder überprüfen Sie die Protokolle.", + + "ERROR_TUNNEL_201" : "Der Verbindungsversuch wurde aufgrund zu vieler bestehender Verbindungen durch den Guacamole Server zurückgewiesen. Versuchen Sie es in wenigen Minuten erneut.", + "ERROR_TUNNEL_202" : "Die Verbindung zum Server wurde aufgrund hoher Latenz geschlossen. Dies wird gewöhnlich durch Netzwerkprobleme verursacht, wie eine schlechte drahtlose Verbindung oder eine sehr langsame Netzwerkverbindung. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.", + "ERROR_TUNNEL_203" : "Die Verbindung wurde aufgrund eines internen Fehlers beendet. Versuche Sie es noch einmal oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_TUNNEL_204" : "Die angeforderte Verbindung existiert nicht. Bitte überprüfen Sie den Verbindungsnamen und versuchen Sie es erneut.", + "ERROR_TUNNEL_205" : "Diese Verbindung ist in Verwendung, ein konkurrierender Zugriff ist nicht gestattet. Versuche Sie es bitte später erneut.", + "ERROR_TUNNEL_207" : "Der Guacamole Server ist gegenwärtig nicht erreichbar. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_TUNNEL_208" : "Der Guacamole Server ist gegenwärtig nicht verfügbar. Versuchen Sie die Aktion erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_TUNNEL_301" : "Sie haben keine Zugriffsberechtigung für diese Verbindung. Bitte melden Sie sich an und versuchen es erneut.", + "ERROR_TUNNEL_303" : "Sie haben keine Zugriffsberechtigung für diese Verbindung. Wenn Sie diese Berechtigung benötigen, bitten Sie den Systemadministrator diese Berechtigung hinzuzufügen oder prüfen Sie Ihre Systemeinstellungen.", + "ERROR_TUNNEL_308" : "Die Verbindung wurde durch den Guacamole Server geschlossen da keine aktive Interkommunikation mit dem Browser besteht. Dies wird gewöhnlich durch Netzwerkprobleme verursacht, wie eine schlechte drahtlose Verbindung oder eine sehr langsame Netzwerkverbindung. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.", + "ERROR_TUNNEL_31D" : "Der Zugang zu dieser Verbindung wurde durch den Guacamole Server verweigert, da die maximale Anzahl der gleichzeitigen Zugriffe für einen einzelnen Benutzer erreicht wurde. Bitte schliessen Sie eine oder mehrere Verbindungen und versuchen Sie es erneut.", + "ERROR_TUNNEL_DEFAULT" : "Die Verbindung wurde aufgrund eines internen Fehlers im Guacamole Server beendet. Sollte dieses Problem weiterhin bestehen informieren Sie Ihren Systemadministrator oder überprüfen Sie die Protokolle.", + + "ERROR_UPLOAD_100" : "Dateiübertragungen werden entweder nicht unterstützt oder sind nicht aktiviert. Bitte kontaktieren Sie Ihren Systemadministrator oder überprüfen die Protokolle.", + "ERROR_UPLOAD_201" : "Die maximale Anzahl gleichzeitiger Dateiübertragungen ist erreicht. Bitte warten Sie bis laufende Dateiübertragungen abgeschlossen sind und versuchen Sie es dann erneut.", + "ERROR_UPLOAD_202" : "Die Dateiübertragung konnte nicht gestartet werden da der entfernte Computer nicht reagiert. Bitte versuchen Sie es erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_UPLOAD_203" : "Der entfernte Computer hat bei der Übertragungen einen Fehler verursacht. Bitte versuchen Sie es erneut oder kontaktieren Ihren Systemadministrator.", + "ERROR_UPLOAD_204" : "Das Übertragungsziel existiert nicht. Bitte überprüfen Sie ob der Zielort wirklich existiert und versuchen Sie es dann erneut oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_UPLOAD_205" : "Das Übertragungsziel ist zur Zeit gesperrt. Bitte warten Sie bis alle laufenden Prozesse beendet wurden und versuchen Sie es dann erneut.", + "ERROR_UPLOAD_301" : "Es besteht ohne Anmeldung keine Berechtigung zur Dateiübertragung. Bitte melden Sie sich an und versuchen Sie es erneut.", + "ERROR_UPLOAD_303" : "Es besteht keine Berechtigung zur Dateiübertragung. Wenn Sie diese Berechtigung benötigen überprüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Systemadministrator.", + "ERROR_UPLOAD_308" : "Die Dateiübertragung weist keinen Fortschritt auf. Dies wird gewöhnlich durch Netzwerkprobleme verursacht, wie eine schlechte drahtlose Verbindung oder eine sehr langsame Netzwerkverbindung. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.", + "ERROR_UPLOAD_31D" : "Die maximale Anzahl gleichzeitiger Dateiübertragungen erreicht. Bitte warten Sie bis eine oder mehrere laufende Dateiübertragungen abgeschlossen sind und versuche Sie es dann erneut.", + "ERROR_UPLOAD_DEFAULT" : "Die Verbindung wurde aufgrund eines internen Fehlers im Guacamole Server beendet. Sollte dieses Problem weiterhin bestehen informieren Sie Ihren Systemadministrator oder überprüfen Sie die Protokolle.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Kopierter oder ausgeschnittener Text aus Guacamole wird hier angezeigt. Änderungen am Text werden direkt auf die entfernte Zwischenablage angewandt.", + "HELP_INPUT_METHOD_NONE" : "Keine Eingabemethode in Verwendung. Tastatureingaben werden von der Hardwaretastatur akzeptiert.", + "HELP_INPUT_METHOD_OSK" : "Bildschirmeingaben und die eingebettete Guacamole Bildschirmtastatur werden akzeptiert. Die Bildschirmtastatur gestattet Tastenkombinationen die ansonsten unmöglich sind (z.B.: Strg-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Gestattet Eingaben von Text und emuliert Tastaturkombinationen basierend auf den eingegebenen Text. Dies wird benötigt für Geräte ohne Hardwaretastatur.", + "HELP_MOUSE_MODE" : "Beeinflusst, wie sich die entfernte Maus bei Touchpadberührungen verhält.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Tippen Sie auf die Zielposition, der Klick erfolgt am Ort der Berührung des Touchscreen's.", + "HELP_MOUSE_MODE_RELATIVE" : "Den Mauszeiger zur Zielposition bewegen und klicken. Der Klick erfolgt an der Position des Mauszeigers.", + "HELP_SHARE_LINK" : "Die aktuelle Verbindung wird gegenwärtig geteilt und kann von jeder Person über den folgenden Link erreicht werden:", + + "INFO_ANONYMOUS_USER_COUNT" : "Anonym{COUNT, plural, one{} other{ (#)}}", + "INFO_CONNECTION_SHARED" : "Diese Verbindung wird nun geteilt.", + "INFO_NO_FILE_TRANSFERS" : "Keine Dateiübertragungen.", + "INFO_USER_COUNT" : "{USERNAME}{COUNT, plural, one{} other{ (#)}}", + + "NAME_INPUT_METHOD_NONE" : "Keine", + "NAME_INPUT_METHOD_OSK" : "Bildschirmtastatur", + "NAME_INPUT_METHOD_TEXT" : "Texteingabe", + "NAME_KEY_CTRL" : "Strg", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Touchscreen", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIENT_MESSAGES" : "Nachrichten", + "SECTION_HEADER_CLIPBOARD" : "Zwischenablage", + "SECTION_HEADER_DEVICES" : "Geräte", + "SECTION_HEADER_DISPLAY" : "Anzeige", + "SECTION_HEADER_FILE_TRANSFERS" : "Dateiübertragung", + "SECTION_HEADER_INPUT_METHOD" : "Eingabemethode", + + "SECTION_HEADER_MOUSE_MODE" : "Mausemulationsmodus", + + "TEXT_ANONYMOUS_USER_JOINED" : "Ein unbekannter Benutzer ist der Verbindung beigetreten.", + "TEXT_ANONYMOUS_USER_LEFT" : "Ein unbekannter Benutzer hat die Verbindung verlassen.", + "TEXT_ZOOM_AUTO_FIT" : "Autoanpassung Fenstergröße", + "TEXT_CLIENT_STATUS_IDLE" : "Inaktiv.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Verbindungsaufbau zu Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Verbindung wurde getrennt.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "Die Verbindung zum Guacamole-Server ist nicht stabil.", + "TEXT_CLIENT_STATUS_WAITING" : "Verbindungsaufbau zu Guacamole. Bitte warten...", + "TEXT_USER_JOINED" : "{USERNAME} ist der Verbindung beigetreten.", + "TEXT_USER_LEFT" : "{USERNAME} hat die Verbindung verlassen.", + "TEXT_RECONNECT_COUNTDOWN" : "Neuverbindung in {REMAINING} {REMAINING, plural, one{Sekunde} other{Sekunden}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/de-de-qwertz.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Ausblenden", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Anzeigen", + + "FIELD_HEADER_BACKGROUND" : "Hintergrund", + "FIELD_HEADER_FOREGROUND" : "Vordergrund", + + "FIELD_OPTION_CUSTOM" : "Benutzerdefiniert...", + + "SECTION_HEADER_DETAILS" : "Details:" + + }, + + "IMPORT": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_BROWSE" : "Datei auswählen", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR" : "@:APP.ACTION_CLEAR", + "ACTION_VIEW_FORMAT_HELP" : "Formatierungshinweise anzeigen", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_IMPORT_CONNECTIONS" : "Verbindungen importieren", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + "DIALOG_HEADER_SUCCESS" : "Erfolgreich", + + "ERROR_AMBIGUOUS_CSV_HEADER" : "Mehrdeutige CSV Kopfzeile \"{HEADER}\" könnte ein Verbindungsattribute oder Parameter sein", + "ERROR_AMBIGUOUS_PARENT_GROUP" : "group und parentIdentifier können nicht zeitgleich verwendet werden", + "ERROR_ARRAY_REQUIRED" : "Die verwendete Datei muss eine Liste an Verbindungen beinhalten", + "ERROR_DETECTED_INVALID_TYPE" : "Nicht unterstüzter Dateityp. Die Datei muss CSV, JSON, oder YAML sein.", + "ERROR_DUPLICATE_CONNECTION_IN_FILE" : "Doppelte Verbindung \"{NAME}\" bei \"{PATH}\" in der Import Datei", + "ERROR_DUPLICATE_CSV_HEADER" : "Doppelte CSV Kopfzeile: {HEADER}", + "ERROR_EMPTY_FILE" : "Die verwendete Datei ist leer", + "ERROR_INVALID_CSV_HEADER" : "Ungültige CSV Kopfzeile \"{HEADER}\" ist weder ein Attribute noch ein Parameter", + "ERROR_INVALID_MIME_TYPE" : "Nicht unterstüzter Dateityp: \"{TYPE}\"", + "ERROR_INVALID_GROUP" : "Keine passende Gruppe \"{GROUP}\" gefunden", + "ERROR_INVALID_GROUP_IDENTIFIER" : "Keine passende Verbindungsgruppe \"{IDENTIFIER}\" gefunden", + "ERROR_INVALID_GROUP_TYPE" : "Ungültige Gruppe - Muss string sein.", + "ERROR_INVALID_PROTOCOL" : "Ungültiges Protokoll \"{PROTOCOL}\"", + "ERROR_INVALID_USER_GROUPS_TYPE" : "Ungültige Benutzergruppen - muss eine Liste mit Gruppen-IDs sein.", + "ERROR_INVALID_USERS_TYPE" : "Ungültige Benutzer - muss eine Liste mit Benutzer-IDs sein.", + "ERROR_NO_FILE_SUPPLIED" : "Bitte eine Datei zum importieren auswählen", + "ERROR_PARSE_FAILURE_CSV" : "Bitte prüfen, ob die Datei eine gültige CSV ist. Folgender Verarbeitungfehler ist aufgetreten \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_JSON" : "Bitte prüfen, ob die Datei eine gültige JSON ist. Folgender Verarbeitungfehler ist aufgetreten \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_YAML" : "Bitte prüfen, ob die Datei eine gültige YML ist. Folgender Verarbeitungfehler ist aufgetreten \"{ERROR}\". ", + "ERROR_REJECT_UPDATE_CONNECTION" : "Verbindung \"{NAME}\" bereits vorhanden bei \"{PATH}\"", + "ERROR_REQUIRED_NAME_CONNECTION" : "Der Verbindungsname wird benötigt", + "ERROR_REQUIRED_PROTOCOL_CONNECTION" : "Das Verbindungsprotokoll wird benötigt", + "ERROR_REQUIRED_NAME_FILE" : "Kein Verbindungsnamen gefunden in der verwendeten Datei", + "ERROR_REQUIRED_PROTOCOL_FILE" : "Kein Verbindungsprotokoll gefunden in der verwendeten Datei", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FIELD_HEADER_EXISTING_CONNECTION_MODE" : "Vorhandene Verbindungen ersetzen/aktualisieren", + "FIELD_HEADER_EXISTING_PERMISSION_MODE" : "Berechtigungen zurücksetzen", + + "HELP_CSV_DESCRIPTION" : "Eine CSV-Verbindungsimportdatei verfügt über einen Verbindungsdatensatz pro Zeile. Jede Spalte gibt ein Verbindungsfeld an. Es müssen mindestens der Verbindungsname und das Protokoll angegeben werden.", + "HELP_CSV_EXAMPLE" : "name,protocol,username,password,hostname,group,users,groups,guacd-encryption (attribute)\nconn1,vnc,alice,pass1,conn1.web.com,ROOT,guac user 1;guac user 2,Connection 1 Users,none\nconn2,rdp,bob,pass2,conn2.web.com,ROOT/Parent Group,guac user 1,,ssl\nconn3,ssh,carol,pass3,conn3.web.com,ROOT/Parent Group/Child Group,guac user 2;guac user 3,,\nconn4,kubernetes,,,,,,,", + "HELP_CSV_MORE_DETAILS" : "Die CSV Kopfzeile gibt das Verbindungsfeld für jede Zeile an. Die Verbindungsgruppen-ID, in welche die Verbindung importiert werden soll, kann direkt mit „parentIdentifier“ angegeben werden oder der Pfad zur übergeordneten Gruppe kann mit „group“ angegeben werden, wie unten gezeigt. In den meisten Fällen sollte es keinen Konflikt zwischen Feldern geben, aber bei Bedarf kann zur eindeutigen Unterscheidung das Suffix „(Attribut)“ oder „(Parameter)“ hinzugefügt werden. Listen mit Benutzer- oder Benutzergruppen-IDs müssen durch Semikolons getrennt sein.¹", + "HELP_FILE_TYPE_DESCRIPTION" : "Für den Verbindungsimport werden drei Dateitypen unterstützt: CSV, JSON und YAML. Für jeden Dateityp können die gleichen Daten angegeben werden. Dies muss den Verbindungsnamen und das Protokoll enthalten. Optional können auch ein Verbindungsgruppenstandort, eine Liste von Benutzern und/oder Benutzergruppen, denen Zugriff gewährt werden soll, Verbindungsparameter oder Verbindungsprotokolle angegeben werden. Alle Benutzer oder Benutzergruppen, die in der aktuellen Datenquelle nicht vorhanden sind, werden automatisch erstellt. Beachten Sie, dass vorhandene Verbindungsberechtigungen für aktualisierte Verbindungen nicht entfernt werden, es sei denn, „Berechtigungen zurücksetzen“ ist aktiviert.", + "HELP_FILE_TYPE_HEADER" : "Dateitypen", + "HELP_JSON_DESCRIPTION" : "Eine JSON-Verbindungsimportdatei ist eine Liste von Verbindungsobjekten. In jedem Verbindungsobjekt müssen mindestens der Verbindungsname und das Protokoll angegeben werden.", + "HELP_JSON_EXAMPLE" : "[\n \\{\n \"name\": \"conn1\",\n \"protocol\": \"vnc\",\n \"parameters\": \\{ \"username\": \"alice\", \"password\": \"pass1\", \"hostname\": \"conn1.web.com\" \\},\n \"parentIdentifier\": \"ROOT\",\n \"users\": [ \"guac user 1\", \"guac user 2\" ],\n \"groups\": [ \"Connection 1 Users\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn2\",\n \"protocol\": \"rdp\",\n \"parameters\": \\{ \"username\": \"bob\", \"password\": \"pass2\", \"hostname\": \"conn2.web.com\" \\},\n \"group\": \"ROOT/Parent Group\",\n \"users\": [ \"guac user 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn3\",\n \"protocol\": \"ssh\",\n \"parameters\": \\{ \"username\": \"carol\", \"password\": \"pass3\", \"hostname\": \"conn3.web.com\" \\},\n \"group\": \"ROOT/Parent Group/Child Group\",\n \"users\": [ \"guac user 2\", \"guac user 3\" ]\n \\},\n \\{\n \"name\": \"conn4\",\n \"protocol\": \"kubernetes\"\n \\}\n]", + "HELP_JSON_MORE_DETAILS" : "Die Verbindungsgruppen-ID, in welche die Verbindung importiert werden soll, kann direkt mit einem Feld „parentIdentifier“ angegeben werden oder der Pfad zur übergeordneten Gruppe kann wie unten gezeigt mit einem Feld „group“ angegeben werden. Pro Verbindung kann ein Array von Benutzer- und Benutzergruppen-IDs angegeben werden, denen Zugriff gewährt werden soll.", + "HELP_EXISTING_CONNECTION_MODE" : "Vorhandene Verbindungen vollständig ersetzen/aktualisieren, wenn ihre Namen und übergeordneten Verbindungsgruppen mit den Werten in der bereitgestellten Datei übereinstimmen. Wenn diese Option deaktiviert ist, wird der Versuch, eine Verbindung mit demselben Namen und derselben übergeordneten Verbindungsgruppe wie eine vorhandene Verbindung zu importieren, als Fehler gewertet.", + "HELP_EXISTING_PERMISSION_MODE" : "Setzen Sie die für alle Verbindungen in der bereitgestellten Datei gewährten Berechtigungen vollständig auf die in dieser Datei angegebenen Berechtigungen zurück. Wenn keine Berechtigungen angegeben werden, werden alle relevanten Verbindungsberechtigungen widerrufen. Wenn diese Option deaktiviert ist, bleiben vorhandene Berechtigungen erhalten und alle in der Datei angegebenen Berechtigungen werden hinzugefügt.", + "HELP_SEMICOLON_FOOTNOTE" : "Falls vorhanden, können Semikolons mit einem Backslash maskiert werden, z.B. \"first\\\\;last\"", + "HELP_UPLOAD_DROP_TITLE" : "Datei hier hinziehen", + "HELP_UPLOAD_FILE_TYPES" : "CSV, JSON, oder YAML", + "HELP_YAML_DESCRIPTION" : "Eine YAML-Verbindungsimportdatei ist eine Liste von Verbindungsobjekten mit genau der gleichen Struktur wie das JSON-Format.", + "HELP_YAML_EXAMPLE" : "---\n - name: conn1\n protocol: vnc\n parameters:\n username: alice\n password: pass1\n hostname: conn1.web.com\n group: ROOT\n users:\n - guac user 1\n - guac user 2\n groups:\n - Connection 1 Users\n attributes:\n guacd-encryption: none\n - name: conn2\n protocol: rdp\n parameters:\n username: bob\n password: pass2\n hostname: conn2.web.com\n group: ROOT/Parent Group\n users:\n - guac user 1\n attributes:\n guacd-encryption: none\n - name: conn3\n protocol: ssh\n parameters:\n username: carol\n password: pass3\n hostname: conn3.web.com\n group: ROOT/Parent Group/Child Group\n users:\n - guac user 2\n - guac user 3\n - name: conn4\n protocol: kubernetes", + + "INFO_CONNECTIONS_IMPORTED_SUCCESS" : "{NUMBER} {NUMBER, plural, one{connection} other{connections}} erfolgreich importiert.", + + "SECTION_HEADER_CONNECTION_IMPORT" : "Verbindungsimport", + "SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE" : "Dateiformat für Verbindungsimport", + "SECTION_HEADER_CSV" : "CSV Format", + "SECTION_HEADER_JSON" : "JSON Format", + "SECTION_HEADER_YAML" : "YAML Format", + + "TABLE_HEADER_ERRORS" : "Fehler", + "TABLE_HEADER_GROUP" : "Gruppe", + "TABLE_HEADER_NAME" : "Name", + "TABLE_HEADER_PROTOCOL" : "Protokol", + "TABLE_HEADER_ROW_NUMBER" : "Zeile #" + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Standard (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Passwort anzeigen", + "HELP_HIDE_PASSWORD" : "Passwort ausblenden" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Keine aktiven Verbindungen.", + + "PASSWORD_CHANGED" : "Passwort geändert.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Alle Verbindungen", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Letzte Verbindungen" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anonymer Benutzer" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Anmeldungefehler", + + "FIELD_HEADER_USERNAME" : "Benutzername", + "FIELD_HEADER_PASSWORD" : "Passwort" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Verbindung löschen", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Standort:", + "FIELD_HEADER_NAME" : "Name:", + "FIELD_HEADER_PROTOCOL" : "Protokoll:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Aktivieren", + "INFO_CONNECTION_NOT_USED" : "Diese Verbindung wurde bisher nicht verwendet.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Bearbeite Verbindung", + "SECTION_HEADER_HISTORY" : "Verlauf", + "SECTION_HEADER_PARAMETERS" : "Parameter", + + "TABLE_HEADER_HISTORY_USERNAME" : "Benutzername", + "TABLE_HEADER_HISTORY_START" : "Beginn", + "TABLE_HEADER_HISTORY_DURATION" : "Dauer", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Entfernter Host", + + "TEXT_CONFIRM_DELETE" : "Dieser Löschvorgang ist unumkehrbar. Soll diese Verbindung wirklich gelöscht werden?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Lösche Verbindungsgruppe", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Standort:", + "FIELD_HEADER_NAME" : "Name:", + "FIELD_HEADER_TYPE" : "Typ:", + + "NAME_TYPE_BALANCING" : "Balancing", + "NAME_TYPE_ORGANIZATIONAL" : "Organisation", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Ändere Verbindungsgruppe", + + "TEXT_CONFIRM_DELETE" : "Dieser Löschvorgang ist unumkehrbar. Möchten Sie diese Verbindungsgruppe wirklich löschen?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Verteil-Profil löschen", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Name:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Primäre Verbindung:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Verteil-Profil ändern", + "SECTION_HEADER_PARAMETERS" : "Parameter", + + "TEXT_CONFIRM_DELETE" : "Dieser Löschvorgang ist unumkehrbar. Möchten Sie dieses Verteil-Profil wirklich löschen?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Lösche Benutzer", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administration:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Eigenes Passwort ändern:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Neuen Benutzer erstellen:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Neue Benutzergruppe erstellen:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Neue Verbindung erstellen:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Neue Verbindungsgruppe erstellen:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Neues Verteil-Profil erstellen:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Login deaktiviert:", + "FIELD_HEADER_USERNAME" : "Benutzername:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Dieser Benutzer gehört aktuell keiner Benutzergruppe an. Erweitern Sie diesen Abschnitt, um eine neue Benutzergruppe zu erstellen.", + + "INFO_READ_ONLY" : "Dieser Benutzer kann nicht bearbeitet werden.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "Keine Benutzergruppen verfügbar.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Alle Verbindungen", + "SECTION_HEADER_CONNECTIONS" : "Verbindungen", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Aktuelle Verbindungen", + "SECTION_HEADER_EDIT_USER" : "Benutzer bearbeiten", + "SECTION_HEADER_PERMISSIONS" : "Berechtigungen", + "SECTION_HEADER_USER_GROUPS" : "Benutzergruppen", + + "TEXT_CONFIRM_DELETE" : "Dieser Löschvorgang ist unumkehrbar. Möchten Sie diesen Benutzer wirklich löschen?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Benutzergrupperuppe löschen", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Deaktiviert:", + "FIELD_HEADER_USER_GROUP_NAME" : "Name der Benutzergruppe:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Diese Benutzergruppe gehört keiner Benutzergruppe an. Erweitern Sie diesen Abschnitt um eine neue Benutzergruppe hinzuzufügen.", + "HELP_NO_MEMBER_USER_GROUPS" : "Dieser Benutzergruppe gehört keine Benutzergruppe an. Erweitern Sie diesen Abschnitt um eine neue Benutzergruppe hinzuzufügen.", + "HELP_NO_MEMBER_USERS" : "Dieser Benutzergruppe gehört kein Benutzer an. Erweitern Sie diesen Abschnitt um einen neuen Benutzer hinzuzufügen.", + + "INFO_READ_ONLY" : "Diese Benutzergruppe kann nicht bearbeitet werden.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "Keine Benutzer verfügbar.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Gruppe bearbeiten", + "SECTION_HEADER_MEMBER_USERS" : "Mitglieder einer Benutzergruppe", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Benutzergruppen", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Übergeordnete Benutzergruppen", + + "TEXT_CONFIRM_DELETE" : "Dieser Löschvorgang ist unumkehrbar. Möchten Sie diese Benutzergruppe wirklich löschen?" + + }, + + "PLAYER" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_PAUSE" : "@:APP.ACTION_PAUSE", + "ACTION_PLAY" : "@:APP.ACTION_PLAY", + "ACTION_SHOW_KEY_LOG" : "Tastenanschlag-Protokoll", + + "INFO_LOADING_RECORDING" : "Aufnahme wird geladen. Bitte warten...", + "INFO_NO_KEY_LOG" : "Tastenanschlag-Protokoll nicht vorhanden", + "INFO_NUMBER_OF_RESULTS" : "{RESULTS} {RESULTS, plural, one{Match} other{Matches}}", + "INFO_SEEK_IN_PROGRESS" : "Spule zu gewünschten Stelle. Bitte warten...", + + "FIELD_PLACEHOLDER_TEXT_BATCH_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Rücktaste sendet:", + "FIELD_HEADER_CA_CERT" : "Zertifikate der Zertifizierungsstelle:", + "FIELD_HEADER_CLIENT_CERT" : "Client Zertifikat:", + "FIELD_HEADER_CLIENT_KEY" : "Client Schlüssel:", + "FIELD_HEADER_COLOR_SCHEME" : "Farbschema:", + "FIELD_HEADER_CONTAINER" : "Container Name:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Aufname-Pfad automatisch erstellen:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Typescript-Pfad automatisch erstellen:", + "FIELD_HEADER_DISABLE_COPY" : "Kopieren deaktivieren:", + "FIELD_HEADER_DISABLE_PASTE" : "Einfügen deaktivieren:", + "FIELD_HEADER_EXEC_COMMAND" : "Befehl ausführen (exec):", + "FIELD_HEADER_FONT_NAME" : "Schriftname:", + "FIELD_HEADER_FONT_SIZE" : "Schriftgröße:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_IGNORE_CERT" : "Server-Zertifikate ignorieren:", + "FIELD_HEADER_NAMESPACE" : "Namespace:", + "FIELD_HEADER_POD" : "Pod Name:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Schreibgeschützt:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Maus auschließen:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Grafik/Streams ausschließen:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Tasten-Ereignisse einschließen:", + "FIELD_HEADER_RECORDING_NAME" : "Aufnahme-Name:", + "FIELD_HEADER_RECORDING_PATH" : "Aufnahme-Pfad:", + "FIELD_HEADER_SCROLLBACK" : "Maximale Scrollback Größe:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript Name:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript Pfad:", + "FIELD_HEADER_USE_SSL" : "SSL/TLS verwenden", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Rücktaste (Strg-H)", + "FIELD_OPTION_BACKSPACE_127" : "Löschen (Strg-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Schwarz auf Weiß", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grau auf Schwarz", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Grün auf Schwarz", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Weiß auf Schwarz", + + "SECTION_HEADER_AUTHENTICATION" : "Authentifizierung", + "SECTION_HEADER_BEHAVIOR" : "Konsolenverhalten", + "SECTION_HEADER_CLIPBOARD" : "Zwischenablage", + "SECTION_HEADER_CONTAINER" : "Container", + "SECTION_HEADER_DISPLAY" : "Bildschirm", + "SECTION_HEADER_RECORDING" : "Monitor-Aufnahme", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Text Session Aufnahme)", + "SECTION_HEADER_NETWORK" : "Netzwerk" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CERT_TOFU" : "Vertraue Host Zertifikat bei erster Verwendung:", + "FIELD_HEADER_CERT_FINGERPRINTS" : "Fingerprints bekannter Host Zertifikate:", + "FIELD_HEADER_CLIENT_NAME" : "Client name:", + "FIELD_HEADER_COLOR_DEPTH" : "Farbtiefe:", + "FIELD_HEADER_CONSOLE" : "Mit Konsole verbinden (Windows 2003 / 2003 R2):", + "FIELD_HEADER_CONSOLE_AUDIO" : "Audiounterstützung Konsole:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Austauschlaufwerk automatisch erstellen:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Aufzeichnungspfad automatisch erstellen:", + "FIELD_HEADER_DISABLE_AUDIO" : "Audio deaktivieren:", + "FIELD_HEADER_DISABLE_AUTH" : "Authentifizierung deaktivieren:", + "FIELD_HEADER_DISABLE_COPY" : "Kopieren deaktivieren:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Dateidownload deaktivieren:", + "FIELD_HEADER_DISABLE_PASTE" : "Einfügen deaktivieren:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Dateiupload deaktivieren:", + "FIELD_HEADER_DOMAIN" : "Domäne:", + "FIELD_HEADER_DPI" : "Auflösung (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Laufwerksname:", + "FIELD_HEADER_DRIVE_PATH" : "Laufwerkspfad:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Audioeingänge (Mikrofon) aktivieren:", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Desktop Gestaltung (Aero) aktivieren:", + "FIELD_HEADER_ENABLE_DRIVE" : "Austauschlaufwerk aktivieren:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Schriftartglättung (ClearType) aktivieren:", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Fensterziehen aktivieren:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Menüanimationen aktivieren:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Bitmap-Zwischenspeicherung deaktivieren:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Offscreen-Caching deaktivieren:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Glyph-Caching deaktivieren:", + "FIELD_HEADER_DISABLE_GFX" : "Grafik-Pipline-Erweiterung deaktivieren:", + "FIELD_HEADER_ENABLE_PRINTING" : "Druckunterstützung aktivieren:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP aktivieren:", + "FIELD_HEADER_ENABLE_THEMING" : "Themen-Unterstützung aktivieren:", + "FIELD_HEADER_ENABLE_TOUCH" : "Multi-Touch-Unterstützung aktivieren:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Desktophintergrund aktivieren:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Verlustlose Kompression erzweingen:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domäne:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Hostname:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Passwort:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Benutzername:", + "FIELD_HEADER_HEIGHT" : "Höhe:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_IGNORE_CERT" : "Serverzertifikat ignorieren:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Startprogramme:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Lastverteilungs-Info/Cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "Zeilenende:", + "FIELD_HEADER_PASSWORD" : "Passwort:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRINTER_NAME" : "Name des weitergeleiteten Druckers:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Vorverbindungs-BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP-Quell-ID:", + "FIELD_HEADER_READ_ONLY" : "Nur-Lesen:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Mausaufzeichnung deaktivieren:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Aufzeichnung der Anzeige deaktivieren:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Touch-Ereignisse deaktivieren:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Tastendrücke aufzeichnen:", + "FIELD_HEADER_RECORDING_NAME" : "Aufzeichnungsname:", + "FIELD_HEADER_RECORDING_PATH" : "Aufzeichnungspfad:", + "FIELD_HEADER_RESIZE_METHOD" : "Grössenänderungs-Methode:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parameter:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Arbeitsverzeichnis der Remote-Applikation:", + "FIELD_HEADER_REMOTE_APP" : "Remote-Applikation:", + "FIELD_HEADER_SECURITY" : "Sicherheitsmodus:", + "FIELD_HEADER_SERVER_LAYOUT" : "Tastaturlayout:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Standardverzeichnis:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Dateidownload deaktivieren:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Öffentlicher Schlüssel des Host (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Hostname:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive Intervall:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Passwort:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Privater Schlüssel:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "SFTP-Wurzelverzeichnis:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Dateiupload deaktivieren:", + "FIELD_HEADER_SFTP_USERNAME" : "Benutzername¨:", + "FIELD_HEADER_STATIC_CHANNELS" : "Statische Kanäle:", + "FIELD_HEADER_TIMEZONE" : "Zeitzone:", + "FIELD_HEADER_USERNAME" : "Benutzername:", + "FIELD_HEADER_WIDTH" : "Breite:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast Adresse für WoL-Paket:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC Adresse des Remote Hosts:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL Paket senden:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP-Port für WoL Paket: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Wartezeit für Host-Boot:", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_EMPTY" : "", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "Belassen", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Hohe Farbtiefe (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Echtfarben (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Echtfarben (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 Farben", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Display Update\" virtual channel (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Erneut verbinden", + + "FIELD_OPTION_SECURITY_ANY" : "Jede", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Netzwerkebene Authentifizierung)", + "FIELD_OPTION_SECURITY_RDP" : "RDP Verschlüsselung", + "FIELD_OPTION_SECURITY_TLS" : "TLS Verschlüsselung", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Tschechisch (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Dänisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Deutsch (Schweiz) (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Deutsch (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "Englisch (GB) (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "Englisch (US) (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Spanisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latein-Amerikanisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Französisch (Belgien) (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Französisch (Kanada) (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Französisch (Schweiz) (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Französisch (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Ungarisch (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italienisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japanisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Norwegisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polnisches (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portugiesisch (BR) (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portugiesisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Rumänisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Schwedisch (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Türkisch (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Authentifizierung", + "SECTION_HEADER_BASIC_PARAMETERS" : "Basiseinstellungen", + "SECTION_HEADER_CLIPBOARD" : "Zwischenablage", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Geräteumleitung", + "SECTION_HEADER_DISPLAY" : "Bildschirm", + "SECTION_HEADER_GATEWAY" : "Remote Desktop Gateway", + "SECTION_HEADER_LOAD_BALANCING" : "Lastverteilung", + "SECTION_HEADER_NETWORK" : "Netzwerk", + "SECTION_HEADER_PERFORMANCE" : "Geschwindigkeit", + "SECTION_HEADER_PRECONNECTION_PDU" : "Preconnection PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Bildschirmaufzeichnung", + "SECTION_HEADER_REMOTEAPP" : "Entferntes Programm", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Rücktaste:", + "FIELD_HEADER_COLOR_SCHEME" : "Farbschema:", + "FIELD_HEADER_COMMAND" : "Befehl ausführen:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Bildschirmaufzeichnungspfad automatisch erzeugen:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Textaufzeichnungspfad automatisch erzeugen:", + "FIELD_HEADER_DISABLE_COPY" : "Kopieren deaktivieren:", + "FIELD_HEADER_DISABLE_PASTE" : "Einfügen deaktivieren:", + "FIELD_HEADER_FONT_NAME" : "Schriftart:", + "FIELD_HEADER_FONT_SIZE" : "Schriftgröße:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP aktivieren:", + "FIELD_HEADER_HOST_KEY" : "Öffentlicher Schlüssel des Hosts (Base64):", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_LOCALE" : "Sprache ($LANG):", + "FIELD_HEADER_USERNAME" : "Benutzername:", + "FIELD_HEADER_PASSWORD" : "Passwort:", + "FIELD_HEADER_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Privater Schlüssel:", + "FIELD_HEADER_SCROLLBACK" : "Maximaler Scrollback:", + "FIELD_HEADER_READ_ONLY" : "Nur-Lesen:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Mausaufzeichnung deaktivieren:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Aufzeichnung der Anzeige deaktivieren:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Tastendrücke aufzeichnen:", + "FIELD_HEADER_RECORDING_NAME" : "Aufzeichnungsname:", + "FIELD_HEADER_RECORDING_PATH" : "Aufzeichnungspfad:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Server keepalive Intervall:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Dateidownload deaktivieren:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "SFTP-Wurzelverzeichnis:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Dateiupload deaktivieren:", + "FIELD_HEADER_TERMINAL_TYPE" : "Terminaltyp:", + "FIELD_HEADER_TIMEZONE" : "Zeitzone ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Textaufzeichnungsname:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Textaufzeichnungspfad:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast Adresse für WoL-Paket:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC Adresse des Remote Hosts:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL Paket senden:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP-Port für WoL Paket: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Wartezeit für Host-Boot:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Rücktaste (Strg-H)", + "FIELD_OPTION_BACKSPACE_127" : "Löschtaste (Strg-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Schwarz auf Weiß", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grau auf Schwarz", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Grün auf Schwarz", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Weiß auf Schwarz", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Authentifizierung", + "SECTION_HEADER_BEHAVIOR" : "Terminalverhalten", + "SECTION_HEADER_CLIPBOARD" : "Zwischenablage", + "SECTION_HEADER_DISPLAY" : "Bildschirm", + "SECTION_HEADER_NETWORK" : "Netzwerk", + "SECTION_HEADER_RECORDING" : "Bildschirmaufzeichnung", + "SECTION_HEADER_SESSION" : "Sitzung / Umgebung", + "SECTION_HEADER_TYPESCRIPT" : "Textaufzeichnung", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Rücktaste:", + "FIELD_HEADER_COLOR_SCHEME" : "Farbschema:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Bildschirmaufzeichnungspfad automatisch erzeugen:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Textaufzeichnungspfad automatisch erzeugen:", + "FIELD_HEADER_DISABLE_COPY" : "Kopieren deaktivieren:", + "FIELD_HEADER_DISABLE_PASTE" : "Einfügen deaktivieren:", + "FIELD_HEADER_FONT_NAME" : "Schriftart:", + "FIELD_HEADER_FONT_SIZE" : "Schriftgröße:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Regulärer Ausdruck für Anmeldefehler:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Regulärer Ausdruck für erfolgreiche Anmeldungen:", + "FIELD_HEADER_USERNAME" : "Benutzername:", + "FIELD_HEADER_USERNAME_REGEX" : "Regulärer Ausdruck für Benutzername:", + "FIELD_HEADER_PASSWORD" : "Passwort:", + "FIELD_HEADER_PASSWORD_REGEX" : "Regulärer Ausdruck für Passwort:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Nur-Lesen:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Mausaufzeichnung deaktivieren:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Aufzeichnung der Anzeige deaktivieren:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Tastendrücke aufzeichnen:", + "FIELD_HEADER_RECORDING_NAME" : "Aufzeichnungsname:", + "FIELD_HEADER_RECORDING_PATH" : "Aufzeichnungspfad:", + "FIELD_HEADER_SCROLLBACK" : "Maximaler Scrollback:", + "FIELD_HEADER_TERMINAL_TYPE" : "Terminaltyp:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Textaufzeichnungsname:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Textaufzeichnungspfad:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast Adresse für WoL-Paket:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC Adresse des Remote Hosts:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL Paket senden:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP-Port für WoL Paket: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Wartezeit für Host-Boot:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Rücktaste (Strg-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Strg-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Schwarz auf Weiß", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grau auf Schwarz", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Grün auf Schwarz", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Weiß auf Schwarz", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Authentifizierung", + "SECTION_HEADER_BEHAVIOR" : "Terminalverhalten", + "SECTION_HEADER_CLIPBOARD" : "Zwischenablage", + "SECTION_HEADER_DISPLAY" : "Bildschirm", + "SECTION_HEADER_RECORDING" : "Bildschirmaufzeichnung", + "SECTION_HEADER_TYPESCRIPT" : "Textaufzeichnung", + "SECTION_HEADER_NETWORK" : "Netzwerk", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Audioservername:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Codierung:", + "FIELD_HEADER_COLOR_DEPTH" : "Farbtiefe:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Aufzeichnungspfad automatisch erzeugen:", + "FIELD_HEADER_CURSOR" : "Cursor:", + "FIELD_HEADER_DEST_HOST" : "Ziel Host:", + "FIELD_HEADER_DEST_PORT" : "Ziel Port:", + "FIELD_HEADER_DISABLE_COPY" : "Kopieren deaktivieren:", + "FIELD_HEADER_DISABLE_PASTE" : "Einfügen deaktivieren:", + "FIELD_HEADER_ENABLE_AUDIO" : "Audio aktivieren:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP aktivieren:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Verlustlose Kompression erzwingen:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_USERNAME" : "Benutzername:", + "FIELD_HEADER_PASSWORD" : "Passwort:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Nur-Lesen:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Mausbewegungen nicht aufzeichnen:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Aufzeichnung der Anzeige deaktivieren:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Tastendrücke aufzeichnen:", + "FIELD_HEADER_RECORDING_NAME" : "Aufzeichnungsname:", + "FIELD_HEADER_RECORDING_PATH" : "Aufzeichnungspfad:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Standard Uploadverzeichnis:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Dateidownload deaktivieren:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Öffentlicher Schlüssel des Host (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Hostname:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive Intervall:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Passwort:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Privater Schlüssel:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "SFTP-Wurzelverzeichnis:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Hochladen deaktivieren:", + "FIELD_HEADER_SFTP_USERNAME" : "Benutzername:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Vertausche rot/blau Komponenten:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast Adresse für WoL-Paket:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC Adresse des Remote Hosts:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL Paket senden:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP-Port für WoL Paket: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Wartezeit für Host-Boot:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 Farben", + "FIELD_OPTION_COLOR_DEPTH_16" : "Hohe Farbtiefe (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Echtfarben (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Echtfarben (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Lokal", + "FIELD_OPTION_CURSOR_REMOTE" : "Entfernt", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Audio", + "SECTION_HEADER_AUTHENTICATION" : "Authentifizierung", + "SECTION_HEADER_CLIPBOARD" : "Zwischenablage", + "SECTION_HEADER_DISPLAY" : "Bildschirm", + "SECTION_HEADER_NETWORK" : "Netzwerk", + "SECTION_HEADER_RECORDING" : "Bildschirmaufzeichnung", + "SECTION_HEADER_REPEATER" : "VNC Repeater", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Einstellungen" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + "ACTION_VIEW_RECORDING" : "@:APP.ACTION_VIEW_RECORDING", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Die letzten Verbindungen werden hier historisch aufgelistet und können durch Klicken auf die Spaltenüberschriften sortiert werden. Zum Aufsuchen von bestimmten Datensätzen, geben Sie eine Filterzeichenfolge ein und klicken Sie auf \"Suchen\". Nur Datensätze, die die vorgesehenen Filterzeichenfolge entsprechen, werden aufgelistet.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Keine passenden Datensätze", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Verbindungsname", + "TABLE_HEADER_SESSION_DURATION" : "Verbindungsdauer", + "TABLE_HEADER_SESSION_LOGS" : "Protokolle", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Entfernter Host", + "TABLE_HEADER_SESSION_STARTDATE" : "Sitzung aktiv seit", + "TABLE_HEADER_SESSION_USERNAME" : "Benutzername", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_NEW_CONNECTION" : "Neue Verbindung", + "ACTION_NEW_CONNECTION_GROUP" : "Neue Verbindungsgruppe", + "ACTION_NEW_SHARING_PROFILE" : "Neues Verteil-Profil", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Klicken Sie auf eine Verbindung um diese zu verwalten. Abhängig von Ihrer Zugriffsebene können Verbindungen hinzugefügt, gelöscht oder Parameter (Protokoll, Hostname, Port, etc.) geändert werden.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Verbindungen" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Anzeigesprache:", + "FIELD_HEADER_PASSWORD" : "Passwort:", + "FIELD_HEADER_PASSWORD_OLD" : "Aktuelles Passwort:", + "FIELD_HEADER_PASSWORD_NEW" : "Neues Passwort:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Passwort wiederholen:", + "FIELD_HEADER_TIMEZONE" : "Zeitzone:", + "FIELD_HEADER_USERNAME" : "Benutzername:", + + "HELP_DEFAULT_INPUT_METHOD" : "Die Standardeingabemethode bestimmt wie Tastaturereignisse an Guacamole weitergeleitet werden. Eine Änderung dieser Einstellung kann erforderlich sein, wenn ein mobiles Gerät verwendet wird oder bei der Eingabe durch einen IME. Dieses Verhalten kann im Menü innerhalb der Guacamole Verbindung geändert werden.", + "HELP_DEFAULT_MOUSE_MODE" : "Der Standard Mausemulationsmodus bestimmt wie sich die entfernte Maus bei Touchpad Berührungen verhält. Dieses Verhalten kann im Menü innerhalb der Guacamole Verbindung geändert werden.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Um die Spracheinstellungen von Guacamole zu ändern, wählen Sie eine der verfügbaren Sprachen.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Wenn Sie das Passwort ändern wollen, geben Sie das aktuelle und das gewünschte Passwort ein und klicken Sie auf \"Ändere Passwort\". Die Änderung wird sofort wirksam.", + + "INFO_PASSWORD_CHANGED" : "Passwort geändert.", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "Benutzereinstellungen gespeichert.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Standard Eingabemethode", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Standard Mausemulationsmodus", + "SECTION_HEADER_UPDATE_PASSWORD" : "Passwort ändern" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Neuer Benutzer", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Klicken Sie auf einen der unten stehenden Benutzer, um diesen zu modifizieren. Je nach Berechtigungsstufe können Sie Benutzer hinzufügen, bearbeiten, löschen oder die Passwörter ändern.", + + "SECTION_HEADER_USERS" : "Benutzer", + + "TABLE_HEADER_FULL_NAME" : "Voller Name", + "TABLE_HEADER_LAST_ACTIVE" : "Zuletzt aktiv", + "TABLE_HEADER_ORGANIZATION" : "Organisation", + "TABLE_HEADER_USERNAME" : "Benutzername" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Neue Gruppe", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Klicken Sie auf eine der unten stehenden Gruppen, um diese zu modifizieren. Je nach Berechtigungsstufe können Sie Gruppen und deren Mitglieder hinzufügen, bearbeiten oder löschen.", + + "SECTION_HEADER_USER_GROUPS" : "Gruppen", + + "TABLE_HEADER_USER_GROUP_NAME" : "Gruppenname" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Beende Sitzung", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Beende Sitzung", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Diese Seite wird mit derzeit aktiven Verbindungen gefüllt. Die aufgelisteten Verbindungen und die Möglichkeit, diese Verbindungen zu beenden, hängen von Ihrer Zugriffsebene ab. Wenn Sie eine oder mehrere Sitzungen beenden wollen, wählen Sie diese Sitzung durch Aktivierung der nebenstehende Box und klicken auf \"Beende Sitzung\". Beendung einer Sitzung trennt den Benutzer von dessen Verbindung unverzüglich.", + + "INFO_NO_SESSIONS" : "Keine aktiven Sitzungen", + + "SECTION_HEADER_SESSIONS" : "Aktive Sitzungen", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Verbindungsname", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Entfernter Host", + "TABLE_HEADER_SESSION_STARTDATE" : "Sitzung aktiv seit", + "TABLE_HEADER_SESSION_USERNAME" : "Benutzername", + + "TEXT_CONFIRM_DELETE" : "Sind Sie sicher, dass alle ausgewählten Sitzungen beendet werden sollen? Die Benutzer dieser Sitzungen werden unverzüglich getrennt." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "E-Mailadresse:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Voller Name:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organisation:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Rolle:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/en.json b/guacamole/src/main/frontend/src/translations/en.json new file mode 100644 index 0000000..ef21734 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/en.json @@ -0,0 +1,1241 @@ +{ + + "NAME" : "English", + + "APP" : { + + "NAME" : "Apache Guacamole", + "VERSION" : "${project.version}", + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Cancel", + "ACTION_CLEAR" : "Clear", + "ACTION_CLONE" : "Clone", + "ACTION_CONTINUE" : "Continue", + "ACTION_DELETE" : "Delete", + "ACTION_DELETE_SESSIONS" : "Kill Sessions", + "ACTION_DOWNLOAD" : "Download", + "ACTION_IMPORT" : "Import", + "ACTION_LOGIN" : "Login", + "ACTION_LOGIN_AGAIN" : "Re-login", + "ACTION_LOGOUT" : "Logout", + "ACTION_MANAGE_CONNECTIONS" : "Connections", + "ACTION_MANAGE_PREFERENCES" : "Preferences", + "ACTION_MANAGE_SETTINGS" : "Settings", + "ACTION_MANAGE_SESSIONS" : "Active Sessions", + "ACTION_MANAGE_USERS" : "Users", + "ACTION_MANAGE_USER_GROUPS" : "Groups", + "ACTION_NAVIGATE_BACK" : "Back", + "ACTION_NAVIGATE_HOME" : "Home", + "ACTION_PAUSE" : "Pause", + "ACTION_PLAY" : "Play", + "ACTION_SAVE" : "Save", + "ACTION_SEARCH" : "Search", + "ACTION_SHARE" : "Share", + "ACTION_UPDATE_PASSWORD" : "Update Password", + "ACTION_VIEW_HISTORY" : "History", + "ACTION_VIEW_RECORDING" : "View", + + "DIALOG_HEADER_ERROR" : "Error", + + "ERROR_PAGE_UNAVAILABLE" : "An error has occurred and this action cannot be completed. If the problem persists, please notify your system administrator or check your system logs.", + "ERROR_PASSWORD_BLANK" : "Your password cannot be blank.", + "ERROR_PASSWORD_MISMATCH" : "The provided passwords do not match.", + "ERROR_SINGLE_FILE_ONLY" : "Please upload only a single file at a time", + + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Re-enter Password:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "Allow writing to existing recording file:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "Allow writing to existing typescript file:", + + "FIELD_PLACEHOLDER_FILTER" : "Filter", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Currently in use by {USERS} {USERS, plural, one{user} other{users}}.", + "INFO_LOGGED_OUT" : "You have been logged out.", + + "TEXT_ANONYMOUS_USER" : "Anonymous", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{second} other{seconds}}} minute{{VALUE, plural, one{minute} other{minutes}}} hour{{VALUE, plural, one{hour} other{hours}}} day{{VALUE, plural, one{day} other{days}}} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_CLIENT_MESSAGES" : "@:APP.ACTION_CLEAR", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "@:APP.ACTION_CLEAR", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Disconnect", + "ACTION_FULLSCREEN" : "Fullscreen", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Reconnect", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_SHOW_CLIPBOARD" : "Click to view clipboard contents.", + "ACTION_UPLOAD_FILES" : "Upload Files", + + "DIALOG_HEADER_CONNECTING" : "Connecting", + "DIALOG_HEADER_CONNECTION_ERROR" : "Connection Error", + "DIALOG_HEADER_DISCONNECTED" : "Disconnected", + + "ERROR_CLIENT_201" : "This connection has been closed because the server is busy. Please wait a few minutes and try again.", + "ERROR_CLIENT_202" : "The Guacamole server has closed the connection because the remote desktop is taking too long to respond. Please try again or contact your system administrator.", + "ERROR_CLIENT_203" : "The remote desktop server encountered an error and has closed the connection. Please try again or contact your system administrator.", + "ERROR_CLIENT_207" : "The remote desktop server is currently unreachable. If the problem persists, please notify your system administrator, or check your system logs.", + "ERROR_CLIENT_208" : "The remote desktop server is currently unavailable. If the problem persists, please notify your system administrator, or check your system logs.", + "ERROR_CLIENT_209" : "The remote desktop server has closed the connection because it conflicts with another connection. Please try again later.", + "ERROR_CLIENT_20A" : "The remote desktop server has closed the connection because it appeared to be inactive. If this is undesired or unexpected, please notify your system administrator, or check your system settings.", + "ERROR_CLIENT_20B" : "The remote desktop server has forcibly closed the connection. If this is undesired or unexpected, please notify your system administrator, or check your system logs.", + "ERROR_CLIENT_301" : "Log in failed. Please reconnect and try again.", + "ERROR_CLIENT_303" : "The remote desktop server has denied access to this connection. If you require access, please ask your system administrator to grant your account access, or check your system settings.", + "ERROR_CLIENT_308" : "The Guacamole server has closed the connection because there has been no response from your browser for long enough that it appeared to be disconnected. This is commonly caused by network problems, such as spotty wireless signal, or simply very slow network speeds. Please check your network and try again.", + "ERROR_CLIENT_31D" : "The Guacamole server is denying access to this connection because you have exhausted the limit for simultaneous connection use by an individual user. Please close one or more connections and try again.", + "ERROR_CLIENT_DEFAULT" : "An internal error has occurred within the Guacamole server, and the connection has been terminated. If the problem persists, please notify your system administrator, or check your system logs.", + + "ERROR_TUNNEL_201" : "The Guacamole server has rejected this connection attempt because there are too many active connections. Please wait a few minutes and try again.", + "ERROR_TUNNEL_202" : "The connection has been closed because the server is taking too long to respond. This is usually caused by network problems, such as a spotty wireless signal, or slow network speeds. Please check your network connection and try again or contact your system administrator.", + "ERROR_TUNNEL_203" : "The server encountered an error and has closed the connection. Please try again or contact your system administrator.", + "ERROR_TUNNEL_204" : "The requested connection does not exist. Please check the connection name and try again.", + "ERROR_TUNNEL_205" : "This connection is currently in use, and concurrent access to this connection is not allowed. Please try again later.", + "ERROR_TUNNEL_207" : "The Guacamole server is not currently reachable. Please check your network and try again.", + "ERROR_TUNNEL_208" : "The Guacamole server is not accepting connections. Please check your network and try again.", + "ERROR_TUNNEL_301" : "You do not have permission to access this connection because you are not logged in. Please log in and try again.", + "ERROR_TUNNEL_303" : "You do not have permission to access this connection. If you require access, please ask your system administrator to add you the list of allowed users, or check your system settings.", + "ERROR_TUNNEL_308" : "The Guacamole server has closed the connection because there has been no response from your browser for long enough that it appeared to be disconnected. This is commonly caused by network problems, such as spotty wireless signal, or simply very slow network speeds. Please check your network and try again.", + "ERROR_TUNNEL_31D" : "The Guacamole server is denying access to this connection because you have exhausted the limit for simultaneous connection use by an individual user. Please close one or more connections and try again.", + "ERROR_TUNNEL_DEFAULT" : "An internal error has occurred within the Guacamole server, and the connection has been terminated. If the problem persists, please notify your system administrator, or check your system logs.", + + "ERROR_UPLOAD_100" : "File transfer is either not supported or not enabled. Please contact your system administrator, or check your system logs.", + "ERROR_UPLOAD_201" : "Too many files are currently being transferred. Please wait for existing transfers to complete, and then try again.", + "ERROR_UPLOAD_202" : "The file cannot be transferred because the remote desktop server is taking too long to respond. Please try again or contact your system administrator.", + "ERROR_UPLOAD_203" : "The remote desktop server encountered an error during transfer. Please try again or contact your system administrator.", + "ERROR_UPLOAD_204" : "The destination for the file transfer does not exist. Please check that the destination exists and try again.", + "ERROR_UPLOAD_205" : "The destination for the file transfer is currently locked. Please wait for any in-progress tasks to complete and try again.", + "ERROR_UPLOAD_301" : "You do not have permission to upload this file because you are not logged in. Please log in and try again.", + "ERROR_UPLOAD_303" : "You do not have permission to upload this file. If you require access, please check your system settings, or check with your system administrator.", + "ERROR_UPLOAD_308" : "The file transfer has stalled. This is commonly caused by network problems, such as spotty wireless signal, or simply very slow network speeds. Please check your network and try again.", + "ERROR_UPLOAD_31D" : "Too many files are currently being transferred. Please wait for existing transfers to complete, and then try again.", + "ERROR_UPLOAD_DEFAULT" : "An internal error has occurred within the Guacamole server, and the connection has been terminated. If the problem persists, please notify your system administrator, or check your system logs.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Text copied/cut within Guacamole will appear here. Changes to the text below will affect the remote clipboard.", + "HELP_INPUT_METHOD_NONE" : "No input method is used. Keyboard input is accepted from a connected, physical keyboard.", + "HELP_INPUT_METHOD_OSK" : "Display and accept input from the built-in Guacamole on-screen keyboard. The on-screen keyboard allows typing of key combinations that may otherwise be impossible (such as Ctrl-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Allow typing of text, and emulate keyboard events based on the typed text. This is necessary for devices such as mobile phones that lack a physical keyboard.", + "HELP_MOUSE_MODE" : "Determines how the remote mouse behaves with respect to touches.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Tap to click. The click occurs at the location of the touch.", + "HELP_MOUSE_MODE_RELATIVE" : "Drag to move the mouse pointer and tap to click. The click occurs at the location of the pointer.", + "HELP_SHARE_LINK" : "The current connection is being shared, and can be accessed by anyone with the following {LINKS, plural, one{link} other{links}}:", + + "INFO_ANONYMOUS_USER_COUNT" : "Anonymous{COUNT, plural, one{} other{ (#)}}", + "INFO_CONNECTION_SHARED" : "This connection is now shared.", + "INFO_NO_FILE_TRANSFERS" : "No file transfers.", + "INFO_USER_COUNT" : "{USERNAME}{COUNT, plural, one{} other{ (#)}}", + + "NAME_INPUT_METHOD_NONE" : "None", + "NAME_INPUT_METHOD_OSK" : "On-screen keyboard", + "NAME_INPUT_METHOD_TEXT" : "Text input", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Touchscreen", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIENT_MESSAGES" : "Messages", + "SECTION_HEADER_CLIPBOARD" : "Clipboard", + "SECTION_HEADER_DEVICES" : "Devices", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_FILE_TRANSFERS" : "File Transfers", + "SECTION_HEADER_INPUT_METHOD" : "Input method", + + "SECTION_HEADER_MOUSE_MODE" : "Mouse emulation mode", + + "TEXT_ANONYMOUS_USER_JOINED" : "An anonymous user has joined the connection.", + "TEXT_ANONYMOUS_USER_LEFT" : "An anonymous user has left the connection.", + "TEXT_ZOOM_AUTO_FIT" : "Automatically fit to browser window", + "TEXT_CLIENT_STATUS_IDLE" : "Idle.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Connecting to Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "You have been disconnected.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "The network connection to the Guacamole server appears unstable.", + "TEXT_CLIENT_STATUS_WAITING" : "Connected to Guacamole. Waiting for response...", + "TEXT_USER_JOINED" : "{USERNAME} has joined the connection.", + "TEXT_USER_LEFT" : "{USERNAME} has left the connection.", + "TEXT_RECONNECT_COUNTDOWN" : "Reconnecting in {REMAINING} {REMAINING, plural, one{second} other{seconds}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Hide", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Show", + + "FIELD_HEADER_BACKGROUND" : "Background", + "FIELD_HEADER_FOREGROUND" : "Foreground", + + "FIELD_OPTION_CUSTOM" : "Custom...", + + "SECTION_HEADER_DETAILS" : "Details:" + + }, + + "IMPORT": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_BROWSE" : "Browse for File", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR" : "@:APP.ACTION_CLEAR", + "ACTION_VIEW_FORMAT_HELP" : "View Format Tips", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_IMPORT_CONNECTIONS" : "Import Connections", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + "DIALOG_HEADER_SUCCESS" : "Success", + + "ERROR_AMBIGUOUS_CSV_HEADER" : "Ambiguous CSV Header \"{HEADER}\" could be either a connection attribute or parameter", + "ERROR_AMBIGUOUS_PARENT_GROUP" : "Both group and parentIdentifier may be not specified at the same time", + "ERROR_ARRAY_REQUIRED" : "The provided file must contain a list of connections", + "ERROR_DETECTED_INVALID_TYPE" : "Unsupported file type. Please make sure the file is valid CSV, JSON, or YAML.", + "ERROR_DUPLICATE_CONNECTION_IN_FILE" : "Duplicated connection \"{NAME}\" at \"{PATH}\" in import file", + "ERROR_DUPLICATE_CSV_HEADER" : "Duplicate CSV Header: {HEADER}", + "ERROR_EMPTY_FILE" : "The provided file is empty", + "ERROR_INVALID_CSV_HEADER" : "Invalid CSV Header \"{HEADER}\" is neither an attribute or parameter", + "ERROR_INVALID_MIME_TYPE" : "Unsupported file type: \"{TYPE}\"", + "ERROR_INVALID_GROUP" : "No group matching \"{GROUP}\" found", + "ERROR_INVALID_GROUP_IDENTIFIER" : "No connection group with identifier \"{IDENTIFIER}\" found", + "ERROR_INVALID_GROUP_TYPE" : "Invalid group - must be a string.", + "ERROR_INVALID_PROTOCOL" : "Invalid protocol \"{PROTOCOL}\"", + "ERROR_INVALID_USER_GROUPS_TYPE" : "Invalid user groups - must be an array of user group identifiers.", + "ERROR_INVALID_USERS_TYPE" : "Invalid users - must be an array of user identifiers.", + "ERROR_NO_FILE_SUPPLIED" : "Please select a file to import", + "ERROR_PARSE_FAILURE_CSV" : "Please make sure your file is valid CSV. Parsing failed with error \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_JSON" : "Please make sure your file is valid JSON. Parsing failed with error \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_YAML" : "Please make sure your file is valid YAML. Parsing failed with error \"{ERROR}\". ", + "ERROR_REJECT_UPDATE_CONNECTION" : "Connection \"{NAME}\" already exists at \"{PATH}\"", + "ERROR_REQUIRED_NAME_CONNECTION" : "The connection name is required", + "ERROR_REQUIRED_PROTOCOL_CONNECTION" : "The connection protocol is required", + "ERROR_REQUIRED_NAME_FILE" : "No connection name found in the provided file", + "ERROR_REQUIRED_PROTOCOL_FILE" : "No connection protocol found in the provided file", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FIELD_HEADER_EXISTING_CONNECTION_MODE" : "Replace/Update existing connections", + "FIELD_HEADER_EXISTING_PERMISSION_MODE" : "Reset permissions", + + "HELP_CSV_DESCRIPTION" : "A connection import CSV file has one connection record per row. Each column will specify a connection field. At minimum the connection name and protocol must be specified.", + "HELP_CSV_EXAMPLE" : "name,protocol,username,password,hostname,group,users,groups,guacd-encryption (attribute)\nconn1,vnc,alice,pass1,conn1.web.com,ROOT,guac user 1;guac user 2,Connection 1 Users,none\nconn2,rdp,bob,pass2,conn2.web.com,ROOT/Parent Group,guac user 1,,ssl\nconn3,ssh,carol,pass3,conn3.web.com,ROOT/Parent Group/Child Group,guac user 2;guac user 3,,\nconn4,kubernetes,,,,,,,", + "HELP_CSV_MORE_DETAILS" : "The CSV header for each row specifies the connection field. The connection group ID that the connection should be imported into may be directly specified with \"parentIdentifier\", or the path to the parent group may be specified using \"group\" as shown below. In most cases, there should be no conflict between fields, but if needed, an \" (attribute)\" or \" (parameter)\" suffix may be added to disambiguate. Lists of user or user group identifiers must be semicolon-separated.¹", + "HELP_FILE_TYPE_DESCRIPTION" : "Three file types are supported for connection import: CSV, JSON, and YAML. The same data may be specified by each file type. This must include the connection name and protocol. Optionally, a connection group location, a list of users and/or user groups to grant access, connection parameters, or connection protocols may also be specified. Any users or user groups that do not exist in the current data source will be automatically created. Note that any existing connection permissions will not be removed for updated connections, unless \"Reset permissions\" is checked.", + "HELP_FILE_TYPE_HEADER" : "File Types", + "HELP_JSON_DESCRIPTION" : "A connection import JSON file is a list of connection objects. At minimum the connection name and protocol must be specified in each connection object.", + "HELP_JSON_EXAMPLE" : "[\n \\{\n \"name\": \"conn1\",\n \"protocol\": \"vnc\",\n \"parameters\": \\{ \"username\": \"alice\", \"password\": \"pass1\", \"hostname\": \"conn1.web.com\" \\},\n \"parentIdentifier\": \"ROOT\",\n \"users\": [ \"guac user 1\", \"guac user 2\" ],\n \"groups\": [ \"Connection 1 Users\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn2\",\n \"protocol\": \"rdp\",\n \"parameters\": \\{ \"username\": \"bob\", \"password\": \"pass2\", \"hostname\": \"conn2.web.com\" \\},\n \"group\": \"ROOT/Parent Group\",\n \"users\": [ \"guac user 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn3\",\n \"protocol\": \"ssh\",\n \"parameters\": \\{ \"username\": \"carol\", \"password\": \"pass3\", \"hostname\": \"conn3.web.com\" \\},\n \"group\": \"ROOT/Parent Group/Child Group\",\n \"users\": [ \"guac user 2\", \"guac user 3\" ]\n \\},\n \\{\n \"name\": \"conn4\",\n \"protocol\": \"kubernetes\"\n \\}\n]", + "HELP_JSON_MORE_DETAILS" : "The connection group ID that the connection should be imported into may be directly specified with a \"parentIdentifier\" field, or the path to the parent group may be specified using a \"group\" field as shown below. An array of user and user group identifiers to grant access to may be specified per connection.", + "HELP_EXISTING_CONNECTION_MODE" : "Entirely replace/update existing connections if their names and parent connection groups match the values in the provided file. If unchecked, attempting to import a connection with the same name and parent connection group of an existing connection will be considered an error.", + "HELP_EXISTING_PERMISSION_MODE" : "Fully reset the permissions granted for all connections in the provided file to the permissions specified in that file. If no permissions are specified, all relevant connection permissions will be revoked. If unchecked, existing permissions are preserved, and any permissions specified in the file will be added.", + "HELP_SEMICOLON_FOOTNOTE" : "If present, semicolons can be escaped with a backslash, e.g. \"first\\\\;last\"", + "HELP_UPLOAD_DROP_TITLE" : "Drop a File Here", + "HELP_UPLOAD_FILE_TYPES" : "CSV, JSON, or YAML", + "HELP_YAML_DESCRIPTION" : "A connection import YAML file is a list of connection objects with exactly the same structure as the JSON format.", + "HELP_YAML_EXAMPLE" : "---\n - name: conn1\n protocol: vnc\n parameters:\n username: alice\n password: pass1\n hostname: conn1.web.com\n group: ROOT\n users:\n - guac user 1\n - guac user 2\n groups:\n - Connection 1 Users\n attributes:\n guacd-encryption: none\n - name: conn2\n protocol: rdp\n parameters:\n username: bob\n password: pass2\n hostname: conn2.web.com\n group: ROOT/Parent Group\n users:\n - guac user 1\n attributes:\n guacd-encryption: none\n - name: conn3\n protocol: ssh\n parameters:\n username: carol\n password: pass3\n hostname: conn3.web.com\n group: ROOT/Parent Group/Child Group\n users:\n - guac user 2\n - guac user 3\n - name: conn4\n protocol: kubernetes", + + "INFO_CONNECTIONS_IMPORTED_SUCCESS" : "{NUMBER} {NUMBER, plural, one{connection} other{connections}} imported successfully.", + + "SECTION_HEADER_CONNECTION_IMPORT" : "Connection Import", + "SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE" : "Connection Import File Format", + "SECTION_HEADER_CSV" : "CSV Format", + "SECTION_HEADER_JSON" : "JSON Format", + "SECTION_HEADER_YAML" : "YAML Format", + + "TABLE_HEADER_ERRORS" : "Errors", + "TABLE_HEADER_GROUP" : "Group", + "TABLE_HEADER_NAME" : "Name", + "TABLE_HEADER_PROTOCOL" : "Protocol", + "TABLE_HEADER_ROW_NUMBER" : "Row #" + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Default (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Click to show password", + "HELP_HIDE_PASSWORD" : "Click to hide password" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "No recent connections.", + + "PASSWORD_CHANGED" : "Password changed.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "All Connections", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Recent Connections" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anonymous" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Invalid Login", + + "FIELD_HEADER_USERNAME" : "Username", + "FIELD_HEADER_PASSWORD" : "Password" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Delete Connection", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Location:", + "FIELD_HEADER_NAME" : "Name:", + "FIELD_HEADER_PROTOCOL" : "Protocol:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Active Now", + "INFO_CONNECTION_NOT_USED" : "This connection has not yet been used.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Edit Connection", + "SECTION_HEADER_HISTORY" : "Usage History", + "SECTION_HEADER_PARAMETERS" : "Parameters", + + "TABLE_HEADER_HISTORY_USERNAME" : "Username", + "TABLE_HEADER_HISTORY_START" : "Start Time", + "TABLE_HEADER_HISTORY_DURATION" : "Duration", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Remote Host", + + "TEXT_CONFIRM_DELETE" : "Connections cannot be restored after they have been deleted. Are you sure you want to delete this connection?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Delete Connection Group", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Location:", + "FIELD_HEADER_NAME" : "Name:", + "FIELD_HEADER_TYPE" : "Type:", + + "NAME_TYPE_BALANCING" : "Balancing", + "NAME_TYPE_ORGANIZATIONAL" : "Organizational", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Edit Connection Group", + + "TEXT_CONFIRM_DELETE" : "Connection groups cannot be restored after they have been deleted. Are you sure you want to delete this connection group?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Delete Sharing Profile", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Name:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Primary Connection:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Edit Sharing Profile", + "SECTION_HEADER_PARAMETERS" : "Parameters", + + "TEXT_CONFIRM_DELETE" : "Sharing profiles cannot be restored after they have been deleted. Are you sure you want to delete this sharing profile?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Delete User", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administer system:", + "FIELD_HEADER_AUDIT_SYSTEM" : "Audit system:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Change own password:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Create new users:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Create new user groups:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Create new connections:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Create new connection groups:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Create new sharing profiles:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Login disabled:", + "FIELD_HEADER_USERNAME" : "Username:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "This user does not currently belong to any groups. Expand this section to add groups.", + + "INFO_READ_ONLY" : "Sorry, but this user account cannot be edited.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "No groups available.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "All Connections", + "SECTION_HEADER_CONNECTIONS" : "Connections", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Current Connections", + "SECTION_HEADER_EDIT_USER" : "Edit User", + "SECTION_HEADER_PERMISSIONS" : "Permissions", + "SECTION_HEADER_USER_GROUPS" : "Groups", + + "TEXT_CONFIRM_DELETE" : "Users cannot be restored after they have been deleted. Are you sure you want to delete this user?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Delete Group", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_AUDIT_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_AUDIT_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Disabled:", + "FIELD_HEADER_USER_GROUP_NAME" : "Group name:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "This group does not currently belong to any groups. Expand this section to add groups.", + "HELP_NO_MEMBER_USER_GROUPS" : "This group does not currently contain any groups. Expand this section to add groups.", + "HELP_NO_MEMBER_USERS" : "This group does not currently contain any users. Expand this section to add users.", + + "INFO_READ_ONLY" : "Sorry, but this group cannot be edited.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "No users available.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Edit Group", + "SECTION_HEADER_MEMBER_USERS" : "Member Users", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Member Groups", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Parent Groups", + + "TEXT_CONFIRM_DELETE" : "Groups cannot be restored after they have been deleted. Are you sure you want to delete this group?" + + }, + + "PLAYER" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_PAUSE" : "@:APP.ACTION_PAUSE", + "ACTION_PLAY" : "@:APP.ACTION_PLAY", + "ACTION_SHOW_KEY_LOG" : "Keystroke Log", + + "INFO_FRAME_EVENTS_LEGEND" : "On-screen Activity", + "INFO_KEY_EVENTS_LEGEND" : "Keyboard Activity", + "INFO_LOADING_RECORDING" : "Your recording is now being loaded. Please wait...", + "INFO_NO_KEY_LOG" : "Keystroke Log Unavailable", + "INFO_NUMBER_OF_RESULTS" : "{RESULTS} {RESULTS, plural, one{Match} other{Matches}}", + "INFO_SEEK_IN_PROGRESS" : "Seeking to the requested position. Please wait...", + + "FIELD_PLACEHOLDER_TEXT_BATCH_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Backspace key sends:", + "FIELD_HEADER_CA_CERT" : "Certificate authority certificate:", + "FIELD_HEADER_CLIENT_CERT" : "Client certificate:", + "FIELD_HEADER_CLIENT_KEY" : "Client key:", + "FIELD_HEADER_CLIPBOARD_BUFFER_SIZE" : "Clipboard data size limit:", + "FIELD_HEADER_COLOR_SCHEME" : "Color scheme:", + "FIELD_HEADER_CONTAINER" : "Container name:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatically create recording path:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatically create typescript path:", + "FIELD_HEADER_DISABLE_COPY" : "Disable copying from terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Disable pasting from client:", + "FIELD_HEADER_EXEC_COMMAND" : "Command (exec):", + "FIELD_HEADER_FONT_NAME" : "Font name:", + "FIELD_HEADER_FONT_SIZE" : "Font size:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_IGNORE_CERT" : "Ignore server certificate:", + "FIELD_HEADER_NAMESPACE" : "Namespace:", + "FIELD_HEADER_POD" : "Pod name:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Read-only:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclude mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclude graphics/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Include key events:", + "FIELD_HEADER_RECORDING_NAME" : "Recording name:", + "FIELD_HEADER_RECORDING_PATH" : "Recording path:", + "FIELD_HEADER_SCROLLBACK" : "Maximum scrollback size:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript name:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript path:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "@:APP.FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING", + "FIELD_HEADER_USE_SSL" : "Use SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_262144" : "256KB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_1048576" : "1MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_10485760" : "10MB", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Black on white", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gray on black", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Green on black", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "White on black", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Authentication", + "SECTION_HEADER_BEHAVIOR" : "Terminal behavior", + "SECTION_HEADER_CLIPBOARD" : "Clipboard", + "SECTION_HEADER_CONTAINER" : "Container", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_RECORDING" : "Screen Recording", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Text Session Recording)", + "SECTION_HEADER_NETWORK" : "Network" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CERT_TOFU" : "Trust host certificate on first use:", + "FIELD_HEADER_CERT_FINGERPRINTS" : "Fingerprints of trusted host certificates:", + "FIELD_HEADER_CLIENT_NAME" : "Client name:", + "FIELD_HEADER_CLIPBOARD_BUFFER_SIZE" : "Clipboard data size limit:", + "FIELD_HEADER_COLOR_DEPTH" : "Color depth:", + "FIELD_HEADER_CONSOLE" : "Administrator console:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Support audio in console:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Automatically create drive:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatically create recording path:", + "FIELD_HEADER_DISABLE_AUDIO" : "Disable audio:", + "FIELD_HEADER_DISABLE_AUTH" : "Disable authentication:", + "FIELD_HEADER_DISABLE_COPY" : "Disable copying from remote desktop:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Disable file download:", + "FIELD_HEADER_DISABLE_PASTE" : "Disable pasting from client:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Disable file upload:", + "FIELD_HEADER_DOMAIN" : "Domain:", + "FIELD_HEADER_DPI" : "Resolution (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Drive name:", + "FIELD_HEADER_DRIVE_PATH" : "Drive path:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Enable audio input (microphone):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Enable desktop composition (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Enable drive:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Enable font smoothing (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Enable full-window drag:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Enable menu animations:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Disable bitmap caching:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Disable off-screen caching:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Disable glyph caching:", + "FIELD_HEADER_DISABLE_GFX" : "Disable Graphics Pipeline Extension:", + "FIELD_HEADER_ENABLE_PRINTING" : "Enable printing:", + "FIELD_HEADER_ENABLE_SFTP" : "Enable SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Enable theming:", + "FIELD_HEADER_ENABLE_TOUCH" : "Enable multi-touch:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Enable wallpaper:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Force lossless compression:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domain:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Hostname:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Password:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Username:", + "FIELD_HEADER_HEIGHT" : "Height:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_IGNORE_CERT" : "Ignore server certificate:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Initial program:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Load balance info/cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "Line endings:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRINTER_NAME" : "Redirected printer name:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Preconnection BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP source ID:", + "FIELD_HEADER_READ_ONLY" : "Read-only:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclude mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclude graphics/streams:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Exclude touch events:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Include key events:", + "FIELD_HEADER_RECORDING_NAME" : "Recording name:", + "FIELD_HEADER_RECORDING_PATH" : "Recording path:", + "FIELD_HEADER_RESIZE_METHOD" : "Resize method:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parameters:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Working directory:", + "FIELD_HEADER_REMOTE_APP" : "Program:", + "FIELD_HEADER_SECURITY" : "Security mode:", + "FIELD_HEADER_SERVER_LAYOUT" : "Keyboard layout:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Default upload directory:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Disable file download:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Disable file upload:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Public host key (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Hostname:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive interval:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Password:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Private key:", + "FIELD_HEADER_SFTP_PUBLIC_KEY" : "Public key:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "File browser root directory:", + "FIELD_HEADER_SFTP_TIMEOUT" : "SFTP connection timeout:", + "FIELD_HEADER_SFTP_USERNAME" : "Username:", + "FIELD_HEADER_STATIC_CHANNELS" : "Static channel names:", + "FIELD_HEADER_TIMEOUT" : "Connection timeout", + "FIELD_HEADER_TIMEZONE" : "Time zone:", + "FIELD_HEADER_USERNAME" : "Username:", + "FIELD_HEADER_WIDTH" : "Width:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast address for WoL packet:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC address of the remote host:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Send WoL packet:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port for WoL packet: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "Host boot wait time:", + + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_262144" : "256KB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_1048576" : "1MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_10485760" : "10MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_52428800" : "50MB", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_EMPTY" : "", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "Preserve as-is", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Display Update\" virtual channel (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Reconnect", + + "FIELD_OPTION_SECURITY_ANY" : "Any", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Network Level Authentication)", + "FIELD_OPTION_SECURITY_RDP" : "RDP encryption", + "FIELD_OPTION_SECURITY_TLS" : "TLS encryption", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Czech (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Danish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Swiss German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "UK English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Spanish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latin American (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Belgian French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Canadian French (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Swiss French (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Hungarian (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japanese (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Norwegian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portuguese Brazilian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portuguese (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Romanian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Swedish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turkish-Q (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Authentication", + "SECTION_HEADER_BASIC_PARAMETERS" : "Basic Settings", + "SECTION_HEADER_CLIPBOARD" : "Clipboard", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Device Redirection", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_GATEWAY" : "Remote Desktop Gateway", + "SECTION_HEADER_LOAD_BALANCING" : "Load Balancing", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_PERFORMANCE" : "Performance", + "SECTION_HEADER_PRECONNECTION_PDU" : "Preconnection PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Screen Recording", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Backspace key sends:", + "FIELD_HEADER_CLIPBOARD_BUFFER_SIZE" : "Clipboard data size limit:", + "FIELD_HEADER_COLOR_SCHEME" : "Color scheme:", + "FIELD_HEADER_COMMAND" : "Execute command:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatically create recording path:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatically create typescript path:", + "FIELD_HEADER_DISABLE_COPY" : "Disable copying from terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Disable pasting from client:", + "FIELD_HEADER_FONT_NAME" : "Font name:", + "FIELD_HEADER_FONT_SIZE" : "Font size:", + "FIELD_HEADER_ENABLE_SFTP" : "Enable SFTP:", + "FIELD_HEADER_HOST_KEY" : "Public host key (Base64):", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_LOCALE" : "Language/Locale ($LANG):", + "FIELD_HEADER_USERNAME" : "Username:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Private key:", + "FIELD_HEADER_PUBLIC_KEY" : "Public key:", + "FIELD_HEADER_SCROLLBACK" : "Maximum scrollback size:", + "FIELD_HEADER_READ_ONLY" : "Read-only:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclude mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclude graphics/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Include key events:", + "FIELD_HEADER_RECORDING_NAME" : "Recording name:", + "FIELD_HEADER_RECORDING_PATH" : "Recording path:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Server keepalive interval:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Disable file download:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "File browser root directory:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Disable file upload:", + "FIELD_HEADER_TERMINAL_TYPE" : "Terminal type:", + "FIELD_HEADER_TIMEOUT" : "Connection timeout:", + "FIELD_HEADER_TIMEZONE" : "Time zone ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript name:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript path:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "@:APP.FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast address for WoL packet:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC address of the remote host:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Send WoL packet:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port for WoL packet:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Host boot wait time:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_262144" : "256KB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_1048576" : "1MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_10485760" : "10MB", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Black on white", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gray on black", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Green on black", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "White on black", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Authentication", + "SECTION_HEADER_BEHAVIOR" : "Terminal behavior", + "SECTION_HEADER_CLIPBOARD" : "Clipboard", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_RECORDING" : "Screen Recording", + "SECTION_HEADER_SESSION" : "Session / Environment", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Text Session Recording)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Backspace key sends:", + "FIELD_HEADER_CLIPBOARD_BUFFER_SIZE" : "Clipboard data size limit:", + "FIELD_HEADER_COLOR_SCHEME" : "Color scheme:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatically create recording path:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatically create typescript path:", + "FIELD_HEADER_DISABLE_COPY" : "Disable copying from terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Disable pasting from client:", + "FIELD_HEADER_FONT_NAME" : "Font name:", + "FIELD_HEADER_FONT_SIZE" : "Font size:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Login failure regular expression:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Login success regular expression:", + "FIELD_HEADER_USERNAME" : "Username:", + "FIELD_HEADER_USERNAME_REGEX" : "Username regular expression:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSWORD_REGEX" : "Password regular expression:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Read-only:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclude mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclude graphics/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Include key events:", + "FIELD_HEADER_RECORDING_NAME" : "Recording name:", + "FIELD_HEADER_RECORDING_PATH" : "Recording path:", + "FIELD_HEADER_SCROLLBACK" : "Maximum scrollback size:", + "FIELD_HEADER_TERMINAL_TYPE" : "Terminal type:", + "FIELD_HEADER_TIMEOUT" : "Connection timeout:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript name:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript path:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "@:APP.FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast address for WoL packet:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC address of the remote host:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Send WoL packet:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port for WoL packet:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Host boot wait time:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_262144" : "256KB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_1048576" : "1MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_10485760" : "10MB", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Black on white", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gray on black", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Green on black", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "White on black", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Authentication", + "SECTION_HEADER_BEHAVIOR" : "Terminal behavior", + "SECTION_HEADER_CLIPBOARD" : "Clipboard", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_RECORDING" : "Screen Recording", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Text Session Recording)", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Audio server name:", + "FIELD_HEADER_CLIPBOARD_BUFFER_SIZE" : "Clipboard data size limit:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Encoding:", + "FIELD_HEADER_COLOR_DEPTH" : "Color depth:", + "FIELD_HEADER_COMPRESS_LEVEL" : "Compression level:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatically create recording path:", + "FIELD_HEADER_CURSOR" : "Cursor:", + "FIELD_HEADER_DEST_HOST" : "Destination host:", + "FIELD_HEADER_DEST_PORT" : "Destination port:", + "FIELD_HEADER_DISABLE_COPY" : "Disable copying from remote desktop:", + "FIELD_HEADER_DISABLE_DISPLAY_RESIZE" : "Disable resize of remote display:", + "FIELD_HEADER_DISABLE_PASTE" : "Disable pasting from client:", + "FIELD_HEADER_DISABLE_SERVER_INPUT" : "Disable server input when client is connected:", + "FIELD_HEADER_ENABLE_AUDIO" : "Enable audio:", + "FIELD_HEADER_ENABLE_SFTP" : "Enable SFTP:", + "FIELD_HEADER_ENCODINGS" : "Display encodings:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Force lossless compression:", + "FIELD_HEADER_HOSTNAME" : "Hostname:", + "FIELD_HEADER_USERNAME" : "Username:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_QUALITY_LEVEL" : "Display quality:", + "FIELD_HEADER_READ_ONLY" : "Read-only:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclude mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclude graphics/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Include key events:", + "FIELD_HEADER_RECORDING_NAME" : "Recording name:", + "FIELD_HEADER_RECORDING_PATH" : "Recording path:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Default upload directory:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Disable file download:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Disable file upload:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Public host key (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Hostname:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive interval:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Password:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Private key:", + "FIELD_HEADER_SFTP_PUBLIC_KEY" : "Public key:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "File browser root directory:", + "FIELD_HEADER_SFTP_TIMEOUT" : "SFTP connection timeout:", + "FIELD_HEADER_SFTP_USERNAME" : "Username:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Swap red/blue components:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Broadcast address for WoL packet:", + "FIELD_HEADER_WOL_MAC_ADDR" : "MAC address of the remote host:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Send WoL packet:", + "FIELD_HEADER_WOL_UDP_PORT" : "UDP port for WoL packet:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Host boot wait time:", + + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_262144" : "256KB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_1048576" : "1MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_10485760" : "10MB", + "FIELD_OPTION_CLIPBOARD_BUFFER_SIZE_52428800" : "50MB", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_COMPRESS_LEVEL_0" : "0", + "FIELD_OPTION_COMPRESS_LEVEL_1" : "1", + "FIELD_OPTION_COMPRESS_LEVEL_2" : "2", + "FIELD_OPTION_COMPRESS_LEVEL_3" : "3", + "FIELD_OPTION_COMPRESS_LEVEL_4" : "4", + "FIELD_OPTION_COMPRESS_LEVEL_5" : "5", + "FIELD_OPTION_COMPRESS_LEVEL_6" : "6", + "FIELD_OPTION_COMPRESS_LEVEL_7" : "7", + "FIELD_OPTION_COMPRESS_LEVEL_8" : "8", + "FIELD_OPTION_COMPRESS_LEVEL_9" : "9", + "FIELD_OPTION_COMPRESS_LEVEL_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Local", + "FIELD_OPTION_CURSOR_REMOTE" : "Remote", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "FIELD_OPTION_QUALITY_LEVEL_0" : "0", + "FIELD_OPTION_QUALITY_LEVEL_1" : "1", + "FIELD_OPTION_QUALITY_LEVEL_2" : "2", + "FIELD_OPTION_QUALITY_LEVEL_3" : "3", + "FIELD_OPTION_QUALITY_LEVEL_4" : "4", + "FIELD_OPTION_QUALITY_LEVEL_5" : "5", + "FIELD_OPTION_QUALITY_LEVEL_6" : "6", + "FIELD_OPTION_QUALITY_LEVEL_7" : "7", + "FIELD_OPTION_QUALITY_LEVEL_8" : "8", + "FIELD_OPTION_QUALITY_LEVEL_9" : "9", + "FIELD_OPTION_QUALITY_LEVEL_EMPTY" : "", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Audio", + "SECTION_HEADER_AUTHENTICATION" : "Authentication", + "SECTION_HEADER_CLIPBOARD" : "Clipboard", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_RECORDING" : "Screen Recording", + "SECTION_HEADER_REPEATER" : "VNC Repeater", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Settings" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + "ACTION_VIEW_RECORDING" : "@:APP.ACTION_VIEW_RECORDING", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "History records for past connections are listed here and can be sorted by clicking the column headers. To search for specific records, enter a filter string and click \"Search\". Only records which match the provided filter string will be listed.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "No matching records", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Connection name", + "TABLE_HEADER_SESSION_DURATION" : "Duration", + "TABLE_HEADER_SESSION_LOGS" : "Logs", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Remote host", + "TABLE_HEADER_SESSION_STARTDATE" : "Start time", + "TABLE_HEADER_SESSION_USERNAME" : "Username", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_NEW_CONNECTION" : "New Connection", + "ACTION_NEW_CONNECTION_GROUP" : "New Group", + "ACTION_NEW_SHARING_PROFILE" : "New Sharing Profile", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Click or tap on a connection below to manage that connection. Depending on your access level, connections can be added and deleted, and their properties (protocol, hostname, port, etc.) can be changed.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Connections" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Display language:", + "FIELD_HEADER_NUMBER_RECENT_CONNECTIONS" : "Number of Recent Connections to show:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSWORD_OLD" : "Current Password:", + "FIELD_HEADER_PASSWORD_NEW" : "New Password:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirm New Password:", + "FIELD_HEADER_SHOW_RECENT_CONNECTIONS" : "Display Recent Connections:", + "FIELD_HEADER_TIMEZONE" : "Timezone:", + "FIELD_HEADER_USERNAME" : "Username:", + + "HELP_APPEARANCE" : "Here you can enable or disable whether the \"Recent Connections\" section is shown on the home screen, and adjust the number of recent connections included.", + "HELP_DEFAULT_INPUT_METHOD" : "The default input method determines how keyboard events are received by Guacamole. Changing this setting may be necessary when using a mobile device, or when typing through an IME. This setting can be overridden on a per-connection basis within the Guacamole menu.", + "HELP_DEFAULT_MOUSE_MODE" : "The default mouse emulation mode determines how the remote mouse will behave in new connections with respect to touches. This setting can be overridden on a per-connection basis within the Guacamole menu.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Options below are related to the locale of the user and will impact how various parts of the interface are displayed.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "If you wish to change your password, enter your current password and the desired new password below, and click \"Update Password\". The change will take effect immediately.", + + "INFO_PASSWORD_CHANGED" : "Password changed.", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "User settings saved.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_APPEARANCE" : "Appearance", + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Default Input Method", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Default Mouse Emulation Mode", + "SECTION_HEADER_UPDATE_PASSWORD" : "Change Password" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "New User", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Click or tap on a user below to manage that user. Depending on your access level, users can be added and deleted, and their passwords can be changed.", + + "SECTION_HEADER_USERS" : "Users", + + "TABLE_HEADER_FULL_NAME" : "Full name", + "TABLE_HEADER_LAST_ACTIVE" : "Last active", + "TABLE_HEADER_ORGANIZATION" : "Organization", + "TABLE_HEADER_USERNAME" : "Username" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "New Group", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Click or tap on a group below to manage that group. Depending on your access level, groups can be added and deleted, and their member users and groups can be changed.", + + "SECTION_HEADER_USER_GROUPS" : "Groups", + + "TABLE_HEADER_USER_GROUP_NAME" : "Group Name" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Kill Sessions", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Kill Sessions", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "This page will be populated with currently-active connections. The connections listed and the ability to kill those connections is dependent upon your access level. If you wish to kill one or more sessions, check the box next to those sessions and click \"Kill Sessions\". Killing a session will immediately disconnect the user from the associated connection.", + + "INFO_NO_SESSIONS" : "No active sessions", + + "SECTION_HEADER_SESSIONS" : "Active Sessions", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Connection name", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Remote host", + "TABLE_HEADER_SESSION_STARTDATE" : "Active since", + "TABLE_HEADER_SESSION_USERNAME" : "Username", + + "TEXT_CONFIRM_DELETE" : "Are you sure you want to kill all selected sessions? The users using these sessions will be immediately disconnected." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Email address:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Full name:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organization:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Role:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/es.json b/guacamole/src/main/frontend/src/translations/es.json new file mode 100644 index 0000000..c4f8dbe --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/es.json @@ -0,0 +1,1022 @@ +{ + + "NAME" : "Spanish", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Cancelar", + "ACTION_CLONE" : "Clonar", + "ACTION_CONTINUE" : "Continuar", + "ACTION_DELETE" : "Borrar", + "ACTION_DELETE_SESSIONS" : "Finalizar Sesiones", + "ACTION_DOWNLOAD" : "Descargar", + "ACTION_LOGIN" : "Iniciar Sesión", + "ACTION_LOGOUT" : "Cerrar Sesión", + "ACTION_MANAGE_CONNECTIONS" : "Conexiones", + "ACTION_MANAGE_PREFERENCES" : "Preferencias", + "ACTION_MANAGE_SETTINGS" : "Configuración", + "ACTION_MANAGE_SESSIONS" : "Sesiones Activas", + "ACTION_MANAGE_USERS" : "Usuarios", + "ACTION_MANAGE_USER_GROUPS" : "Grupos de Usuarios", + "ACTION_NAVIGATE_BACK" : "Atrás", + "ACTION_NAVIGATE_HOME" : "Inicio", + "ACTION_SAVE" : "Guardar", + "ACTION_SEARCH" : "Buscar", + "ACTION_SHARE" : "Compartir", + "ACTION_UPDATE_PASSWORD" : "Actualizar Contraseña", + "ACTION_VIEW_HISTORY" : "Historial", + + "DIALOG_HEADER_ERROR" : "Error", + + "ERROR_PAGE_UNAVAILABLE" : "Ha ocurrido un error y esta acción no se puede completar. Si el problema persiste, notifique al administrador del sistema o verifique los registros del sistema.", + "ERROR_PASSWORD_BLANK" : "La contraseña no puede estar en blanco.", + "ERROR_PASSWORD_MISMATCH" : "Las contraseñas no coinciden.", + + "FIELD_HEADER_PASSWORD" : "Contraseña:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Validar Contraseña:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtros", + + "FORMAT_DATE_TIME_PRECISE" : "dd-MM-yyyy HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Actualmente en uso por {USERS} {USERS, plural, one{user} other{users}}.", + + "TEXT_ANONYMOUS_USER" : "Anónimo", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{second} other{seconds}}} minute{{VALUE, plural, one{minute} other{minutes}}} hour{{VALUE, plural, one{hour} other{hours}}} day{{VALUE, plural, one{day} other{days}}} other{}}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Limpiar", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Disconnect", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Reconectar", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_UPLOAD_FILES" : "Subir ficheros", + + "DIALOG_HEADER_CONNECTING" : "Conectando", + "DIALOG_HEADER_CONNECTION_ERROR" : "Error de conexión", + "DIALOG_HEADER_DISCONNECTED" : "Desconectado", + + "ERROR_CLIENT_201" : "Esta conexión se ha cerrado porque el servidor esta ocupado. Por favor espera unos minutos e intenta de nuevo.", + "ERROR_CLIENT_202" : "El servidor Guacamole ha cerrado la conexión porque el escritorio remoto está tardando mucho en responder. Por favor intente de nuevo o contacte al administrador del sistema.", + "ERROR_CLIENT_203" : "El servidor de escritorio remoto encontró un error y ha cerrado la conexión. Por favor, intente de nuevo o contacte al administrador del sistema.", + "ERROR_CLIENT_207" : "El servidor de escritorio remoto no está disponible actualmente. Si el problema persiste, por favor notifique al administrador o verifique los registros del sistema.", + "ERROR_CLIENT_208" : "El servidor de escritorio remoto no está disponible actualmente. Si el problema persiste, por favor notifique al administrador o verifique los registros del sistema.", + "ERROR_CLIENT_209" : "El servidor de escritorio remoto ha cerrado la conexión porque hay conflicto con otra conexión. Por favor intenta de nuevo mas tarde.", + "ERROR_CLIENT_20A" : "El servidor de escritorio remoto ha cerrado la conexión porque parece estar inactivo. Si esto fué inesperado, notifíquelo al administrador o verifique la configuración del sistema.", + "ERROR_CLIENT_20B" : "El servidor de escritorio remoto ha forzado el cierre de la conexión. Si esto fué inesperado, notifíquelo al administrador o verifique la configuración del sistema.", + "ERROR_CLIENT_301" : "Inicio fallido. Por favor vuelva a conectar e intente de nuevo.", + "ERROR_CLIENT_303" : "El servidor de escritorio remoto ha denegado el acceso a esta conexión. Si necesita acceso, por favor solicítelo a un administrador para que permita el acceso de su cuenta, o verifique la configuración del sistema.", + "ERROR_CLIENT_308" : "El servidor Guacamole ha cerrado la conexión porque no ha habido respuesta del navegador por tiempo suficiente como para asumir que está desconectado. Normalmente esto es debido a problemas de red, como señal inalámbrica irregular, o simplemente velocidades de red muy lentas. Por favor revisa tu red e intente de nuevo.", + "ERROR_CLIENT_31D" : "El servidor Guacamole está denegando el acceso a esta conexión porque ha agotado el límite de conexiones simultaneas por usuario. Por favor cierre una o mas conexiones e intente de nuevo.", + "ERROR_CLIENT_DEFAULT" : "Ha ocurrido un error interno en el servidor Guacamole y la conexión ha finalizado. Si el problema persiste, por favor notifíquelo al administrador o verifique los registros del sistema.", + + "ERROR_TUNNEL_201" : "El servidor Guacamole ha rechazado este intento de conexión porque hay muchas conexiones activas. Por favor espere unos minutos e intente de nuevo.", + "ERROR_TUNNEL_202" : "Se ha cerrado la conexión porque el servidor está tardando mucho en responder. Normalmente esto es debido a problemas de red, como señal inalámbrica irregular, o simplemente velocidades de red muy lentas. Por favor revisa tu red e intenta de nuevo.", + "ERROR_TUNNEL_203" : "El servidor encontró un error y ha cerrado la conexión. Por favor intente de nuevo o contacte al administrador del sistema.", + "ERROR_TUNNEL_204" : "La conexión solicitada no existe. Por favor verifique el nombre de conexión e intente de nuevo.", + "ERROR_TUNNEL_205" : "Esta conexión esta actualmente en uso y el acceso concurrente a la misma no está permitido. Por favor intente de nuevo mas tarde.", + "ERROR_TUNNEL_207" : "El servidor Guacamole no esta disponible actualmente. Por favor verifique la configuración de red e intente de nuevo.", + "ERROR_TUNNEL_208" : "El servidor Guacamole no está aceptando conexiones. Por favor verifique la conexión a red e intente de nuevo.", + "ERROR_TUNNEL_301" : "No tiene permiso para acceder a esta conexión porque no ha iniciado sesión. Por favor incie sesión e intente de nuevo.", + "ERROR_TUNNEL_303" : "No tiene permiso para acceder a esta conexión. Si requiere acceso, por favor solicite al administrador que le agregue a la lista de usuarios permitidos o verifique la configuración del sistema.", + "ERROR_TUNNEL_308" : "El servidor Guacamole ha cerrado la conexión porque ho ha habido respuesta desde el navegador por tiempo suficiente como para asumir que está desconectado. Normalmente esto es debido a problemas de red, como señal inalámbrica irregular, o simplemente velocidades de red muy lentas. Por favor revisa tu red e intente de nuevo.", + "ERROR_TUNNEL_31D" : "El servidor Guacamole esta denegando el acceso a esta conexión porque ha agotado el límite de conexiones simultaneas por usuario. Por favor cierre una o mas conexiones e intente de nuevo.", + "ERROR_TUNNEL_DEFAULT" : "Ha ocurrido un error interno en el servidor Guacamole y la conexión ha finalizado. Si el problema persiste, por favor notifíquelo al administrador o verifique los registros del sistema.", + + "ERROR_UPLOAD_100" : "La transferencia de ficheros no está habilitada o soportada. Por favor contacte al administrador o verifique los registros del sistema.", + "ERROR_UPLOAD_201" : "Se estan transfiriendo muchos ficheros actualmente. Por favor espere a que se completen las transferencias existentes e intente de nuevo.", + "ERROR_UPLOAD_202" : "El fichero no se puede transferir porque el servidor de escritorio remoto está tardando demasiado en responder. Por favor intente de nuevo o contacte con el administrador del sistema.", + "ERROR_UPLOAD_203" : "El servidor de escritorio remoto encontró un error durante la transferencia. Por favor intente denuevo o contacte con el administrador del sistema.", + "ERROR_UPLOAD_204" : "El destino para la transferencia de fichero no existe. Por favor verifique que exista el destino e intente de nuevo.", + "ERROR_UPLOAD_205" : "El destino para la transferencia de fichero está bloqueado. Por favor espere a que finalicen las tareas en progreso e intente de nuevo.", + "ERROR_UPLOAD_301" : "No tiene permiso para subir este fichero porque no ha iniciado sesión. Por favor inicie sesión e intente de nuevo.", + "ERROR_UPLOAD_303" : "No tiene permiso para subir este fichero. Si necesita acceso, por favor verifique la configuración del sistema o contacte con el administrador del sistema.", + "ERROR_UPLOAD_308" : "La transferencia de ficheros se ha parado. Normalmente esto es debido a problemas de red, como señal inalámbrica irregular, o simplemente velocidades de red muy lentas. Por favor revisa tu red e intente de nuevo.", + "ERROR_UPLOAD_31D" : "Se estan transfiriendo muchos ficheros actualmente. Por favor espere a que finalicen las transferencias de fichero existentes e intente de nuevo.", + "ERROR_UPLOAD_DEFAULT" : "Ha ocurrido un error interno en el servidor Guacamole y la conexión ha finalizado. Si el problema persiste, por favor notifíquelo al administrador o verifique los registros del sistema.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Aquí aparecerá el texto copiado/cortado en Guacamole. Los cambios en el texto de abajo afectaran al portapapeles remoto.", + "HELP_INPUT_METHOD_NONE" : "No se está usando un método de entrada. La entrada de teclado se acepta desde un teclado físico conectado.", + "HELP_INPUT_METHOD_OSK" : "Muestra y acepta entrada desde el teclado en pantalla incorporado de Guacamole. El teclado en pantalla permite escribir combinaciones que serían imposible de otro modo (como Ctrl-Alt-Sup).", + "HELP_INPUT_METHOD_TEXT" : "Permite escribir texto y emular eventos de teclado basados en el texto escrito. Este modo es necesario para dispositivos como teléfonos móviles que no tienen teclado físico.", + "HELP_MOUSE_MODE" : "Determina el comportamiento del ratón remoto respecto a los toques.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Toque para clic. El clic ocurre en la ubicación del toque.", + "HELP_MOUSE_MODE_RELATIVE" : "Arrastre para mover el puntero del ratón y toque para hacer clic. El clic ocurre en la ubicación del puntero.", + "HELP_SHARE_LINK" : "Se está compartiendo la conexión actual y puede acceder a la misma cualquiera con el siguiente {LINKS, plural, one{link} other{links}}:", + + "INFO_CONNECTION_SHARED" : "Esta conexión está compartida.", + "INFO_NO_FILE_TRANSFERS" : "No hay transferencia de ficheros.", + + "NAME_INPUT_METHOD_NONE" : "Ninguno", + "NAME_INPUT_METHOD_OSK" : "Teclado en pantalla", + "NAME_INPUT_METHOD_TEXT" : "Entrada de Texto", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Pantalla táctil", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIPBOARD" : "Portapapeles", + "SECTION_HEADER_DEVICES" : "Dispositivos", + "SECTION_HEADER_DISPLAY" : "Monitor", + "SECTION_HEADER_FILE_TRANSFERS" : "Transferencia de ficheros", + "SECTION_HEADER_INPUT_METHOD" : "Método de entrada", + "SECTION_HEADER_MOUSE_MODE" : "Modo de emulación de ratón", + + "TEXT_ZOOM_AUTO_FIT" : "Ajustar automáticamente a la ventana del navegador", + "TEXT_CLIENT_STATUS_IDLE" : "Inactivo.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Conectando a Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Ha sido desconectado.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "La conexión al servidor Guacamole es inestable.", + "TEXT_CLIENT_STATUS_WAITING" : "Conectado a Guacamole. Esperando respuesta...", + "TEXT_RECONNECT_COUNTDOWN" : "Reconectando en {REMAINING} {REMAINING, plural, one{second} other{seconds}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/es-es-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Ocultar", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Mostrar", + + "FIELD_HEADER_BACKGROUND" : "Fondo", + "FIELD_HEADER_FOREGROUND" : "Primer plano", + + "FIELD_OPTION_CUSTOM" : "Custom...", + + "SECTION_HEADER_DETAILS" : "Details:" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Default (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "DD--MM-YYYY", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Clic para mostrar contraseña", + "HELP_HIDE_PASSWORD" : "Clic para esconder contraseña" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Sin conexiones recientes.", + + "PASSWORD_CHANGED" : "Contraseña cambiada.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Todas las conexiones", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Conexiones Recientes" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anónimo" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Inicio de sesión inválido", + + "FIELD_HEADER_USERNAME" : "Usuario", + "FIELD_HEADER_PASSWORD" : "Contraseña" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Borrar conexión", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Ubicación:", + "FIELD_HEADER_NAME" : "Nombre:", + "FIELD_HEADER_PROTOCOL" : "Protocolo:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Activo Ahora", + "INFO_CONNECTION_NOT_USED" : "Esta conexión no se ha usado todavía.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Editar Conexión", + "SECTION_HEADER_HISTORY" : "Historial de uso", + "SECTION_HEADER_PARAMETERS" : "Parámetros", + + "TABLE_HEADER_HISTORY_USERNAME" : "Usuario", + "TABLE_HEADER_HISTORY_START" : "Activo Desde", + "TABLE_HEADER_HISTORY_DURATION" : "Duración", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Host Remoto", + + "TEXT_CONFIRM_DELETE" : "Las conexiones no se pueden restaurar despues de haberlas eliminado. ¿Está seguro que quiere eliminar esta conexión?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Borrar Grupo de conexiones", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Ubicación:", + "FIELD_HEADER_NAME" : "Nombre:", + "FIELD_HEADER_TYPE" : "Tipo:", + + "NAME_TYPE_BALANCING" : "Balanceo", + "NAME_TYPE_ORGANIZATIONAL" : "Organizativo", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Editar Grupo de conexiones", + + "TEXT_CONFIRM_DELETE" : "Los Grupos de conexiones no se pueden restaurar despues de haberlos eliminado. ¿Esta seguro que quiere borrar este grupo de conexiones?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Eliminar perfil de compartir", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Nombre:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Conexión primaria:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Editar perfil de compartir", + "SECTION_HEADER_PARAMETERS" : "Parámetros", + + "TEXT_CONFIRM_DELETE" : "El perfil de compartir no se podrá restaurar después de eliminarlo. ¿Está seguro de que desea eliminar este perfil de compartir?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Eliminar Usuario", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administrar sistema:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Cambiar contraseña:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Crear nuevos usuarios:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Crear nuevos grupo de usuarios:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Crear nuevas conexiones:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Crear nuevos grupos de conexión:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Crear nuevos perfiles de compartir:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Inicio de sesión deshabilitado:", + "FIELD_HEADER_USERNAME" : "Nombre de usuario:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Este usuario no pertenece actualmente a ningún grupo. Expanda esta sección para agregar grupos.", + + "INFO_READ_ONLY" : "Lo siento, pero esta cuenta de usuario no puede ser editada.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "No hay grupos disponibles.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Todas las conexiones", + "SECTION_HEADER_CONNECTIONS" : "Conexiones", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Conexiones actuales", + "SECTION_HEADER_EDIT_USER" : "Editar Usuario", + "SECTION_HEADER_PERMISSIONS" : "Permisos", + "SECTION_HEADER_USER_GROUPS" : "Groups", + + "TEXT_CONFIRM_DELETE" : "Los usuarios no se pueden restaurar despues de haberlos eliminado. ¿Esta seguro de querer eliminar este usuario?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Eliminar grupo", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Deshabilitado:", + "FIELD_HEADER_USER_GROUP_NAME" : "Nombre del grupo:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Este grupo no pertenece actualmente a ningún grupo. Expanda esta sección para agregar grupos.", + "HELP_NO_MEMBER_USER_GROUPS" : "Este grupo no contiene actualmente ningun grupo. Expanda esta sección para agregar grupos.", + "HELP_NO_MEMBER_USERS" : "Este grupo no contiene actualmente ningun usuario. Expanda esta sección para agregar usuarios.", + + "INFO_READ_ONLY" : "Lo siento, este grupo no se puede editar.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "No hay usuarios disponibles.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Editar grupo", + "SECTION_HEADER_MEMBER_USERS" : "Usuarios asociados", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Grupos asociados", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Grupo principal", + + "TEXT_CONFIRM_DELETE" : "Los grupos no se pueden restaurar despues de haberlos eliminado. ¿Esta seguro de querer eliminar este grupo?" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "La tecla de retroceso envía:", + "FIELD_HEADER_CA_CERT" : "Autoridad de certificación:", + "FIELD_HEADER_CLIENT_CERT" : "Certificado Cliente:", + "FIELD_HEADER_CLIENT_KEY" : "Clave Cliente:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de Color:", + "FIELD_HEADER_CONTAINER" : "Nombre de contenedor:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crear automáticamente la ruta de grabación:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Crear automáticamente la ruta de transcripción:", + "FIELD_HEADER_DISABLE_COPY" : "Desactivar copia desde el terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactivar pegar desde el cliente:", + "FIELD_HEADER_EXEC_COMMAND" : "Commando (exec):", + "FIELD_HEADER_FONT_NAME" : "Nombre de fuente:", + "FIELD_HEADER_FONT_SIZE" : "Tamaño de fuente:", + "FIELD_HEADER_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorar certificado de servidor:", + "FIELD_HEADER_NAMESPACE" : "Namespace:", + "FIELD_HEADER_POD" : "Nombre de Pod:", + "FIELD_HEADER_PORT" : "Puerto:", + "FIELD_HEADER_READ_ONLY" : "Solo Lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir ratón:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir pulsaciones de teclas:", + "FIELD_HEADER_RECORDING_NAME" : "Nombre de grabación:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de grabación:", + "FIELD_HEADER_SCROLLBACK" : "Tamaño máximo de desplazamiento:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nombre de transcripción:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ruta de transcripción:", + "FIELD_HEADER_USE_SSL" : "Usar SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Retroceso (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Borrar (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Negro sobre blanco", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sobre negro", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verde sobre negro", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanco sobre negro", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticación", + "SECTION_HEADER_BEHAVIOR" : "Comportamiento del terminal", + "SECTION_HEADER_CLIPBOARD" : "Portapapeles", + "SECTION_HEADER_CONTAINER" : "Contenedor", + "SECTION_HEADER_DISPLAY" : "Monitor", + "SECTION_HEADER_RECORDING" : "Grabación de Pantalla", + "SECTION_HEADER_TYPESCRIPT" : "Transcripción (Grabación de texto de la sesión)", + "SECTION_HEADER_NETWORK" : "Red" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Nombre de Cliente:", + "FIELD_HEADER_COLOR_DEPTH" : "Profundidad color:", + "FIELD_HEADER_CONSOLE" : "Consola de Administración:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Soporte de audio en consola:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Crear unidad automáticamente:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crear ruta de grabación automáticamente:", + "FIELD_HEADER_DISABLE_AUDIO" : "Desactivar audio:", + "FIELD_HEADER_DISABLE_AUTH" : "Desactivar autenticación:", + "FIELD_HEADER_DISABLE_COPY" : "Desactivar copia desde escritorio remoto:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Desactivar descarga de ficheros:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactivar pegar desde cliente:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Desactivar subida de ficheros:", + "FIELD_HEADER_DOMAIN" : "Dominio:", + "FIELD_HEADER_DPI" : "Resolución (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Unidad:", + "FIELD_HEADER_DRIVE_PATH" : "Ruta Unidad:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Activar entrada de audio (Microfono):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Activar composición de escritorio (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Activar unidad:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Activar suavizado de fuente (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Activar arrastre de ventana completa:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Activar animaciones de menú:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Desactivar caché bitmap:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Desactivar caché off-screen:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Desactivar caché glyph:", + "FIELD_HEADER_ENABLE_PRINTING" : "Activar impresión:", + "FIELD_HEADER_ENABLE_SFTP" : "Activar SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Activar temas:", + "FIELD_HEADER_ENABLE_TOUCH" : "Activar multi-touch:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Activar Fondo de pantalla:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Forzar compresión sin pérdida:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Dominio:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Contraseña:", + "FIELD_HEADER_GATEWAY_PORT" : "Puerto:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Usuario:", + "FIELD_HEADER_HEIGHT" : "Altura:", + "FIELD_HEADER_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorar certificado del servidor:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Programa de Inicio:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Información de carga balanceada info/cookie:", + "FIELD_HEADER_PASSWORD" : "Contraseña:", + "FIELD_HEADER_PORT" : "Puerto:", + "FIELD_HEADER_PRINTER_NAME" : "Nombre de impresora redireccionada:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Preconexión BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP ID origen:", + "FIELD_HEADER_READ_ONLY" : "Solo lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir ratón:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Excluir eventos táctiles:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir pulsaciones de teclas:", + "FIELD_HEADER_RECORDING_NAME" : "Nombre grabación:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta grabación:", + "FIELD_HEADER_RESIZE_METHOD" : "Método de redimensión:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parametros:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Directorio de trabajo:", + "FIELD_HEADER_REMOTE_APP" : "Programa:", + "FIELD_HEADER_SECURITY" : "Modo seguridad:", + "FIELD_HEADER_SERVER_LAYOUT" : "Disposición teclado:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Directorio de subida por defecto:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desactivar descarga de ficheros:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Clave pública de host (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Intervalo Keepalive SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Frase de paso:", + "FIELD_HEADER_SFTP_PASSWORD" : "Contraseña:", + "FIELD_HEADER_SFTP_PORT" : "Puerto:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Llave Privada:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Directorio raiz del navegador de ficheros:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desactivar subida de ficheros:", + "FIELD_HEADER_SFTP_USERNAME" : "Usuario:", + "FIELD_HEADER_STATIC_CHANNELS" : "Nombres de Canales estáticos:", + "FIELD_HEADER_TIMEZONE" : "Zora horaria:", + "FIELD_HEADER_USERNAME" : "Usuario:", + "FIELD_HEADER_WIDTH" : "Ancho:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Dirección Broadcast para paquete WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Dirección MAC del host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquete WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tiempo espera arranque host:", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Color verdadero (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 colores", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Actualizar pantalla\" canal virtual (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Reconectar", + + "FIELD_OPTION_SECURITY_ANY" : "Cualquier", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Autenticación de nivel de red)", + "FIELD_OPTION_SECURITY_RDP" : "Encriptación RDP", + "FIELD_OPTION_SECURITY_TLS" : "Encriptación TLS", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Checo (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Danés (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Alemán Suizo (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Alemán (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "Inglés UK (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "Inglés US (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Español (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latin American (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Francés Belga (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Francés Suizo (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Francés (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Húngaro (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italiano (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japones (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polaco (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portugués Brazileño (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portugués (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Rumano (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Sueco (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turco-Q (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticación", + "SECTION_HEADER_BASIC_PARAMETERS" : "Configuración básica", + "SECTION_HEADER_CLIPBOARD" : "Portapapeles", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Redirección dispositivo", + "SECTION_HEADER_DISPLAY" : "Visualización", + "SECTION_HEADER_GATEWAY" : "Puerta de enlace remota", + "SECTION_HEADER_LOAD_BALANCING" : "Balanceo de carga", + "SECTION_HEADER_NETWORK" : "Red", + "SECTION_HEADER_PERFORMANCE" : "Rendimiento", + "SECTION_HEADER_PRECONNECTION_PDU" : "Preconexión PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Grabación de pantalla", + "SECTION_HEADER_REMOTEAPP" : "Aplicación remota", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Tecla retroceso envía:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de color:", + "FIELD_HEADER_COMMAND" : "Ejecutar comando:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crear ruta de grabación automáticamente:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Crear ruta de transcripción automáticamente:", + "FIELD_HEADER_DISABLE_COPY" : "Desactivar copia desde el terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactivar pegar desde el cliente:", + "FIELD_HEADER_FONT_NAME" : "Nombre de Fuente:", + "FIELD_HEADER_FONT_SIZE" : "Tamaño de Fuente:", + "FIELD_HEADER_ENABLE_SFTP" : "Habilitar SFTP:", + "FIELD_HEADER_HOST_KEY" : "Clave pública host (Base64):", + "FIELD_HEADER_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_LOCALE" : "Idioma/Especificación local ($LANG):", + "FIELD_HEADER_USERNAME" : "Usuario:", + "FIELD_HEADER_PASSWORD" : "Contraseña:", + "FIELD_HEADER_PASSPHRASE" : "Frase de paso:", + "FIELD_HEADER_PORT" : "Puerto:", + "FIELD_HEADER_PRIVATE_KEY" : "Llave Privada:", + "FIELD_HEADER_READ_ONLY" : "Solo Lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir ratón:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir pulsaciones de teclas:", + "FIELD_HEADER_RECORDING_NAME" : "Nombre de grabación:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta de grabación:", + "FIELD_HEADER_SCROLLBACK" : "Tamaño máximo de desplazamiento:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Intervalo keepalive servidor:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desactivar descarga de ficheros:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Directorio raiz del navegador de ficheros:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desactivar subida de ficheros:", + "FIELD_HEADER_TERMINAL_TYPE" : "Tipo de terminal:", + "FIELD_HEADER_TIMEZONE" : "Zona horaria ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nombre transcripción:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ruta transcripción:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Dirección broadcast para paquete WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Dirección MAC del host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquete WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tiempo espera arranque host:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Retroceso (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Borrar (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Negro sobre blanco", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sobre negro", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verde sobre negro", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanco sobre negro", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticación", + "SECTION_HEADER_BEHAVIOR" : "Comportamiento del terminal", + "SECTION_HEADER_CLIPBOARD" : "Portapapeles", + "SECTION_HEADER_DISPLAY" : "Mostrar", + "SECTION_HEADER_NETWORK" : "Red", + "SECTION_HEADER_RECORDING" : "Grabación de pantalla", + "SECTION_HEADER_SESSION" : "Sesión / Entorno", + "SECTION_HEADER_TYPESCRIPT" : "Script de Escritura (Grabación sesión texto)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Tecla de retroceso envía:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de color:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crear automáticamente ruta de grabación:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Crear automáticamente ruta de transcripción:", + "FIELD_HEADER_DISABLE_COPY" : "Desactivar copia desde el terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactivar pegar desde el cliente:", + "FIELD_HEADER_FONT_NAME" : "Nombre Fuente:", + "FIELD_HEADER_FONT_SIZE" : "Tamaño Fuente:", + "FIELD_HEADER_HOSTNAME" : "Nombre Host:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Expresión regular de inicio de sesión fallido:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Expresión regular de inicio de sesión correcto:", + "FIELD_HEADER_USERNAME" : "Usuario:", + "FIELD_HEADER_USERNAME_REGEX" : "Expresión regular nombre de usuario:", + "FIELD_HEADER_PASSWORD" : "Contraseña:", + "FIELD_HEADER_PASSWORD_REGEX" : "Contraseña expresión regular:", + "FIELD_HEADER_PORT" : "Puerto:", + "FIELD_HEADER_READ_ONLY" : "Solo Lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir ratón:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir pulsaciones de teclas:", + "FIELD_HEADER_RECORDING_NAME" : "Nombre grabación:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta grabación:", + "FIELD_HEADER_SCROLLBACK" : "Tamaño máximo de desplazamiento:", + "FIELD_HEADER_TERMINAL_TYPE" : "Tipo de terminal:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nombre transcripción:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ruta transcripción:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Dirección broadcast para paquete WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Dirección MAC de host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquete WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tiempo espera arranque host:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Retroceso (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Borrar (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Negro sobre blanco", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sobre negro", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verde sobre negro", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanco sobre negro", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticación", + "SECTION_HEADER_BEHAVIOR" : "Comportamiento del Terminal", + "SECTION_HEADER_CLIPBOARD" : "Portapapeles", + "SECTION_HEADER_DISPLAY" : "Mostrar", + "SECTION_HEADER_RECORDING" : "Grabación pantalla", + "SECTION_HEADER_TYPESCRIPT" : "Transcripción (Próxima sesión de grabación)", + "SECTION_HEADER_NETWORK" : "Red", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Nombre servidor Audio:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Codificación:", + "FIELD_HEADER_COLOR_DEPTH" : "Profundidad color:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Crear ruta de grabación automáticamente:", + "FIELD_HEADER_CURSOR" : "Cursor:", + "FIELD_HEADER_DEST_HOST" : "Host Destino:", + "FIELD_HEADER_DEST_PORT" : "Puerto Destino:", + "FIELD_HEADER_DISABLE_COPY" : "Desactivar copiar desde escritorio remoto:", + "FIELD_HEADER_DISABLE_PASTE" : "Desactivar pegar desde cliente:", + "FIELD_HEADER_ENABLE_AUDIO" : "Habilitar audio:", + "FIELD_HEADER_ENABLE_SFTP" : "Habilitar SFTP:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Forzar compresión sin pérdida:", + "FIELD_HEADER_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_USERNAME" : "Usuario:", + "FIELD_HEADER_PASSWORD" : "Contraseña:", + "FIELD_HEADER_PORT" : "Puerto:", + "FIELD_HEADER_READ_ONLY" : "Solo Lectura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir ratón:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir pulsaciones de teclas:", + "FIELD_HEADER_RECORDING_NAME" : "Nombre grabación:", + "FIELD_HEADER_RECORDING_PATH" : "Ruta grabación:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Directorio de subida por defecto:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desactivar descarga de ficheros:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Clave pública de host (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nombre de Host:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Intervalo keepalive SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Frase de contraseña:", + "FIELD_HEADER_SFTP_PASSWORD" : "Contraseña:", + "FIELD_HEADER_SFTP_PORT" : "Puerto:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Clave privada:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Directorio raiz del navegador de ficheros:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desactivar subida de ficheros:", + "FIELD_HEADER_SFTP_USERNAME" : "Usuario:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Invertir componentes rojo/azul:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Dirección broadcast para paquete WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Dirección MAC del host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar paquete WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tiempo espera arranque host:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 colores", + "FIELD_OPTION_COLOR_DEPTH_16" : "Color bajo(16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Color verdadero (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Color verdadero (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Local", + "FIELD_OPTION_CURSOR_REMOTE" : "Remoto", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Audio", + "SECTION_HEADER_AUTHENTICATION" : "Autenticación", + "SECTION_HEADER_CLIPBOARD" : "Portapapeles", + "SECTION_HEADER_DISPLAY" : "Monitor", + "SECTION_HEADER_NETWORK" : "Red", + "SECTION_HEADER_RECORDING" : "Grabación pantalla", + "SECTION_HEADER_REPEATER" : "Repetidor VNC", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Configuraciones" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Aquí se detalla el historial de las últimas conexiones y se pueden ordernar haciendo clic en los encabezados de la columna. Para buscar un registro específico, introduzca la cadena de texto a filtrar y haga clic en \"Buscar\". Solo se listaran los registros que coincidan con el filtro introducido.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "No hay registros coincidentes", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nombre de conexión", + "TABLE_HEADER_SESSION_DURATION" : "Duración", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Host Remoto", + "TABLE_HEADER_SESSION_STARTDATE" : "Activo Desde", + "TABLE_HEADER_SESSION_USERNAME" : "Usuario", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Nueva Conexión", + "ACTION_NEW_CONNECTION_GROUP" : "Nuevo Grupo", + "ACTION_NEW_SHARING_PROFILE" : "Nuevo perfil de compartir", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Haga clic o toque en una de las conexiones de abajo para gestionar esa conexión. Dependiendo de su nivel de acceso, podrá añadir/borrar conexiones y cambiar sus propiedades (Protocolo, Nombre de Host, Puerto, etc.) .", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Conexiones" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Idioma para mostrar:", + "FIELD_HEADER_PASSWORD" : "Contraseña:", + "FIELD_HEADER_PASSWORD_OLD" : "Contraseña actual:", + "FIELD_HEADER_PASSWORD_NEW" : "Nueva Contraseña:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirmar Nueva contraseña:", + "FIELD_HEADER_TIMEZONE" : "Zona horaria:", + "FIELD_HEADER_USERNAME" : "Usuario:", + + "HELP_DEFAULT_INPUT_METHOD" : "El método de entrada por defecto determina como se reciben en Guacamole los eventos de teclado. Es posible que sea necesario cambiar esta configuración cuando se usa un dispositivo móvil, o cuando se escribe a través de un método de entrada. Esta configuración se puede cambiar tambien en cada conexión desde el menú de Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "El modo de emulación de ratón por defecto determina como se comportará el ratón remoto en nuevas conexiones con respecto a los toques. Esta configuración se puede cambiar tambien en cada conexión desde el menú de Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Las siguientes opciones están relacionadas con la configuración regional del usuario e impactarán en cómo se muestran varias partes de la interfaz.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Si quiere cambiar su contraseña, introduzca abajo su contraseña actual y la nueva contraseña deseada y haga clic en \"Actualizar Contraseña\". El cambio será efectivo inmediatamente.", + + "INFO_PASSWORD_CHANGED" : "Contraseña Cambiada.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Método de entrada por defecto", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Modo de emulación de ratón por Defecto", + "SECTION_HEADER_UPDATE_PASSWORD" : "Cambiar Contraseña" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Nuevo Usuario", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Haga Clic o toque un usuario de la lista inferior para gestionar ese usuario. Dependiendo de su nivel de acceso, podrá añadir/borrar usuarios y cambiar sus contraseñas.", + + "SECTION_HEADER_USERS" : "Usuarios", + + "TABLE_HEADER_FULL_NAME" : "Nombre completo", + "TABLE_HEADER_LAST_ACTIVE" : "ültima conexión", + "TABLE_HEADER_ORGANIZATION" : "Organización", + "TABLE_HEADER_USERNAME" : "Usuario" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Nuevo Grupo", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Haga clic o toque un grupo de la lista inferior para gestionar ese grupo. Dependiendo de su nivel de acceso, podrá agregar/borrar grupos y cambiar los miembros y grupos del mismo.", + + "SECTION_HEADER_USER_GROUPS" : "Grupos", + + "TABLE_HEADER_USER_GROUP_NAME" : "Nombre de Grupo" + + }, + + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Finalizar Sesiones", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Finalizar Sesiones", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "En esta página se mostrarán las conexiones que estan activas actualmente. Las conexiones enumeradas y la capacidad de eliminar esas conexiones dependen de su nivel de acceso. Si quiere finalizar una o mas sesiones, marque la casilla correspondiente a esa/s sesión/es y haga clic en \"Finalizar Sesiones\". Si finaliza una sesión desconectará inmediatamente al usuario de la conexión asociada.", + + "INFO_NO_SESSIONS" : "No hay sesiones activas", + + "SECTION_HEADER_SESSIONS" : "Sesiones Activas", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nombre Conexión", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Host Remoto", + "TABLE_HEADER_SESSION_STARTDATE" : "Activo desde", + "TABLE_HEADER_SESSION_USERNAME" : "Usuario", + + "TEXT_CONFIRM_DELETE" : "¿Está seguro que quiere finalizar las sesiones seleccionadas? Los usuarios que estan usando estas sesiones serán desconectados inmediatamente." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Correo electrónico:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Nombre completo:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organización:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Puesto:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/fr.json b/guacamole/src/main/frontend/src/translations/fr.json new file mode 100644 index 0000000..b8915c6 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/fr.json @@ -0,0 +1,1180 @@ +{ + + "NAME" : "Français", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "Confirmer", + "ACTION_CANCEL" : "Annuler", + "ACTION_CLEAR" : "Effacer", + "ACTION_CLONE" : "Cloner", + "ACTION_CONTINUE" : "Continuer", + "ACTION_DELETE" : "Supprimer", + "ACTION_DELETE_SESSIONS" : "Fermer les Sessions", + "ACTION_DOWNLOAD" : "Télécharger", + "ACTION_IMPORT" : "Importer", + "ACTION_LOGIN" : "Se connecter", + "ACTION_LOGIN_AGAIN" : "Se re-connecter", + "ACTION_LOGOUT" : "Se déconnecter", + "ACTION_MANAGE_CONNECTIONS" : "Connexions", + "ACTION_MANAGE_PREFERENCES" : "Préférences", + "ACTION_MANAGE_SETTINGS" : "Paramètres", + "ACTION_MANAGE_SESSIONS" : "Sessions Actives", + "ACTION_MANAGE_USERS" : "Utilisateurs", + "ACTION_MANAGE_USER_GROUPS" : "Groupes", + "ACTION_NAVIGATE_BACK" : "Retour", + "ACTION_NAVIGATE_HOME" : "Accueil", + "ACTION_PAUSE" : "Pause", + "ACTION_PLAY" : "Lecture", + "ACTION_SAVE" : "Enregistrer", + "ACTION_SEARCH" : "Rechercher", + "ACTION_SHARE" : "Partager", + "ACTION_UPDATE_PASSWORD" : "Mettre à jour mot de passe", + "ACTION_VIEW_HISTORY" : "Historique", + "ACTION_VIEW_RECORDING" : "Voir", + + "DIALOG_HEADER_ERROR" : "Erreur", + + "ERROR_PAGE_UNAVAILABLE" : "Une erreur est survenue et cette action ne pourra pas être achevée. Si le problème persiste, merci de contacter votre administrateur ou regarder les journaux système.", + "ERROR_PASSWORD_BLANK" : "Votre mot de passe ne peut pas être vide.", + "ERROR_PASSWORD_MISMATCH" : "Le mot de passe ne correspond pas.", + "ERROR_SINGLE_FILE_ONLY" : "Veuillez télécharger un seul fichier à la fois.", + + "FIELD_HEADER_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Répéter mot de passe:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "Autoriser l'écriture dans le fichier d'enregistrement existant:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "Autoriser l'écriture dans le fichier TypeScript existant:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtre", + + "FORMAT_DATE_TIME_PRECISE" : "dd-MM-yyyy HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Actuellement utilisé par {USERS} {USERS, plural, one{utilisateur} other{utilisateurs}}.", + "INFO_LOGGED_OUT" : "Vous avez été déconnecté.", + + "TEXT_ANONYMOUS_USER" : "Anonyme", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{seconde} other{secondes}}} minute{{VALUE, plural, one{minute} other{minutes}}} hour{{VALUE, plural, one{heure} other{heures}}} day{{VALUE, plural, one{jour} other{jours}}} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_CLIENT_MESSAGES" : "@:APP.ACTION_CLEAR", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "@:APP.ACTION_CLEAR", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Déconnecter", + "ACTION_FULLSCREEN" : "Plein écran", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Reconnecter", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_SHOW_CLIPBOARD" : "Cliquez pour afficher le contenu du presse-papiers.", + "ACTION_UPLOAD_FILES" : "Envoyer Fichiers", + + "DIALOG_HEADER_CONNECTING" : "Connexion", + "DIALOG_HEADER_CONNECTION_ERROR" : "Erreur de connexion", + "DIALOG_HEADER_DISCONNECTED" : "Déconnecté", + + "ERROR_CLIENT_201" : "Cette connexion a été fermée car le serveur est occupé. Merci d'attendre quelques minutes et de réessayer.", + "ERROR_CLIENT_202" : "Le serveur Guacamole a fermé cette connexion car l'ordinateur distant a mis trop de temps à répondre. Merci de réessayer ou de contacter l'administrateur.", + "ERROR_CLIENT_203" : "Le serveur distant a rencontré une erreur et a fermé la connexion. Merci de réessayer ou de contacter l'administrateur.", + "ERROR_CLIENT_207" : "Le server distant est inaccessible. Si le problème persiste, merci de notifier l'administrateur ou de regarder les journaux système.", + "ERROR_CLIENT_208" : "Le server distant est indisponible. Si le problème persiste, merci de notifier l'administrateur ou de regarder les journaux système.", + "ERROR_CLIENT_209" : "Le serveur distant a fermé la connexion car elle est en conflit avec une autre. Merci de réessayer plus tard.", + "ERROR_CLIENT_20A" : "Le serveur distant a fermé la connexion car elle semblait être inactive. Si cela est inattendu, merci de notifier l'administrateur ou verifier vos paramètres système.", + "ERROR_CLIENT_20B" : "Le serveur distant a forcé la fermeture de la connexion. Si cela est inattendu, merci de notifier l'administrateur ou de regarder les journaux système.", + "ERROR_CLIENT_301" : "Connexion echouée. Merci de réessayer.", + "ERROR_CLIENT_303" : "Vous ne disposez pas des permissions pour accéder à cette connexion. Si vous avez besoin de ces droits demandez à l'administrateur qu'il vous ajoute à la lise des utilisateurs autorisés, ou de vérifier les paramètres système.", + "ERROR_CLIENT_308" : "Le serveur Guacamole a fermé la connexion car il n'y avait pas de réponse de votre navigateur Internet et qu'il l'a considéré comme déconnecté. Cela se produit à cause de problèmes réseaux (mauvais signal Wi-Fi ou réseau très lent). Merci de vérifier votre réseau et de réessayer.", + "ERROR_CLIENT_31D" : "Le serveur Guacamole interdit les connexions car vous avez dépassé la limite de connexion simultanée par utilisateur. Merci de fermer une ou plusieurs connexions et de réessayer.", + "ERROR_CLIENT_DEFAULT" : "Une erreur interne est apparue dans le serveur Guacamole et la connexion a été fermée. Si le problème persiste, merci de notifier l'administrateur ou de regarder les journaux système.", + + "ERROR_TUNNEL_201" : "Le serveur Guacamole a rejeté cette tentative de connexion car il y a trop de connexions ouvertes. Merci d'attendre quelques minutes et de réessayer.", + "ERROR_TUNNEL_202" : "La connexion a été fermée car le serveur met trop de temps à répondre. En général, il s'agit de problème réseau comme un réseau Wi-Fi trop lent ou un réseau très lent. Merci de vérifier votre réseau ou de contacter l'administrateur.", + "ERROR_TUNNEL_203" : "Le serveur a rencontré une erreur et a fermé la connexion. Merci de réessayer ou de contacter l'administrateur.", + "ERROR_TUNNEL_204" : "Le connexion demandée n'existe pas. Merci de vérifier le nom et de réessayer.", + "ERROR_TUNNEL_205" : "Cette connexion est actuellement utilisée et les connexions multiples ne sont pas autorisées. Merci de réessayer plus tard.", + "ERROR_TUNNEL_207" : "Le serveur Guacamole n'est pas actuellement accessible. Veuillez vérifier votre réseau et réessayer.", + "ERROR_TUNNEL_208" : "Le serveur Guacamole n'accepte pas les connexions. Veuillez vérifier votre réseau et réessayer.", + "ERROR_TUNNEL_301" : "Vous n'avez pas le droit d'accéder à cette connexion car vous n'êtes pas connecté. Merci de vous connecter et de réessayer.", + "ERROR_TUNNEL_303" : "Vous n'avez pas le droit d'accéder à cette connexion. Si vous souhaitez y avoir accès, merci de demander à l'administrateur de vous ajouter dans la liste des utilisateurs autorisés ou de vérifier les paramètres système.", + "ERROR_TUNNEL_308" : "Le serveur Guacamole a fermé la connexion car il n'y avait pas de réponse de votre navigateur Internet et qu'il l'a considéré comme déconnecté. Cela se produit à cause de problèmes réseaux (mauvais signal Wi-Fi ou réseau très lent). Merci de vérifier votre réseau et de réessayer.", + "ERROR_TUNNEL_31D" : "Le serveur Guacamole interdit cette connexion car vous avez dépassé la limite de connexions simultanées par utilisateur. Merci de fermer une ou plusieurs connexions et de réessayer.", + "ERROR_TUNNEL_DEFAULT" : "Une erreur interne est apparue dans le serveur Guacamole et la connexion a été fermée. Si le problème persiste, merci de notifier l'administrateur ou de regarder les journaux système.", + + "ERROR_UPLOAD_100" : "Le transfert de fichier n'est pas activé ou supporté. Merci de contacter l'administrateur ou de vérifier les journaux système.", + "ERROR_UPLOAD_201" : "Trop de fichiers sont transférés. Merci d'attendre que les transferts en cours se terminent et réessayer.", + "ERROR_UPLOAD_202" : "Le fichier ne peut être transféré car le serveur distant met trop de temps à répondre. Merci de réessayer ou de contacter votre administrateur.", + "ERROR_UPLOAD_203" : "Le serveur distant a rencontré une erreur durant le transfert. Merci de réessayer et de contacter l'administrateur.", + "ERROR_UPLOAD_204" : "La destination du transfert de fichier n'existe pas. Merci de vérifier que la destination existe et de réessayer.", + "ERROR_UPLOAD_205" : "La destination du transfert de fichier est actuellement verrouillée. Merci de patienter la fin des tâches en cours et de réessayer.", + "ERROR_UPLOAD_301" : "Vous n'avez pas la permission d'envoyer ce fichier car vous n'êtes pas connecté. Merci de vous connecter et de réessayer.", + "ERROR_UPLOAD_303" : "Vous n'avez pas la permission d'envoyer le fichier. Si vous avez besoin de cet accès, merci de vérifier vos paramètres système ou de valider avec votre administrateur.", + "ERROR_UPLOAD_308" : "Le transfert de fichier s'est bloqué. En général, il s'agit d'un problème réseau comme un signal Wi-Fi faible ou un réseau très lent. Merci de vérifier votre réseau et de réessayer.", + "ERROR_UPLOAD_31D" : "Trop de fichiers sont actuellement transférés. Merci d'attendre que les transferts en cours soient terminés et de réessayer plus tard.", + "ERROR_UPLOAD_DEFAULT" : "Une erreur interne est apparue dans le serveur Guacamole et la connexion a été fermée. Si le problème persiste, merci de notifier l'administrateur ou de regarder les journaux système.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Texte copié/coupé dans Guacamole apparaîtra ici. Changer le texte ci-dessous affectera le presse-papiers distant.", + "HELP_INPUT_METHOD_NONE" : "Aucune méthode de saisie utilisée. Clavier accepté depuis un clavier physique connecté.", + "HELP_INPUT_METHOD_OSK" : "Affiche et utilise la saisie du clavier virtuel intégré dans Guacamole. Le clavier virtuel permet d'utiliser des combinaisons de touches autrement impossibles (comme Ctrl-Alt-Supp).", + "HELP_INPUT_METHOD_TEXT" : "Affiche et utilise la saisie du clavier virtuel intégré dans Guacamole. Ceci est nécessaire pour les périphériques mobiles ne disposant pas de clavier physique.", + "HELP_MOUSE_MODE" : "Détermine comment la souris distante se comporte selon les événements.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Appuyer pour cliquer. Le clic s'effectue à l'endroit de l'appui.", + "HELP_MOUSE_MODE_RELATIVE" : "Glisser pour déplacer le pointeur de la souris et appuyer pour cliquer. Le clic s'effectue à l'endroit du pointeur.", + "HELP_SHARE_LINK" : "La connexion actuelle est en cours de partage et est accessible à toute personne possédant {LINKS, plural, one{le lien suivant} other{les liens suivants}}:", + + "INFO_ANONYMOUS_USER_COUNT" : "Anonyme{COUNT, plural, one{} other{s (#)}}", + "INFO_CONNECTION_SHARED" : "Cette connexion est partagée maintenant.", + "INFO_NO_FILE_TRANSFERS" : "Pas de transfert de fichier.", + "INFO_USER_COUNT" : "{USERNAME}{COUNT, plural, one{} other{ (#)}}", + + "NAME_INPUT_METHOD_NONE" : "Aucune", + "NAME_INPUT_METHOD_OSK" : "Clavier virtuel", + "NAME_INPUT_METHOD_TEXT" : "Clavier", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Echap", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Écran tactile", + "NAME_MOUSE_MODE_RELATIVE" : "Pavé tactile", + + "SECTION_HEADER_CLIENT_MESSAGES" : "Messages", + "SECTION_HEADER_CLIPBOARD" : "Presse-papiers", + "SECTION_HEADER_DEVICES" : "Appareils", + "SECTION_HEADER_DISPLAY" : "Affichage", + "SECTION_HEADER_FILE_TRANSFERS" : "Transferts de fichiers", + "SECTION_HEADER_INPUT_METHOD" : "Méthode de saisie", + + "SECTION_HEADER_MOUSE_MODE" : "Mode d'émulation de la souris", + + "TEXT_ANONYMOUS_USER_JOINED" : "Un utilisateur anonyme a rejoint la connexion.", + "TEXT_ANONYMOUS_USER_LEFT" : "Un utilisateur anonyme a quitté la connexion.", + "TEXT_ZOOM_AUTO_FIT" : "Adapté à la fenêtre du navigateur", + "TEXT_CLIENT_STATUS_IDLE" : "Inactif.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Connexion à Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Vous avez été deconnecté.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "La connexion réseau au serveur Guacamole est instable.", + "TEXT_CLIENT_STATUS_WAITING" : "Connecté à Guacamole. En attente de réponse...", + "TEXT_USER_JOINED" : "{USERNAME} a rejoint la connexion.", + "TEXT_USER_LEFT" : "{USERNAME} a quitté la connexion.", + "TEXT_RECONNECT_COUNTDOWN" : "Reconnexion dans {REMAINING} {REMAINING, plural, one{seconde} other{secondes}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/fr-fr-azerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Masquer", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Afficher", + + "FIELD_HEADER_BACKGROUND" : "Fond", + "FIELD_HEADER_FOREGROUND" : "Avant-plan", + + "FIELD_OPTION_CUSTOM" : "Personnaliser...", + + "SECTION_HEADER_DETAILS" : "Détails:" + + }, + + "IMPORT": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_BROWSE" : "Parcourir les fichiers", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR" : "@:APP.ACTION_CLEAR", + "ACTION_VIEW_FORMAT_HELP" : "Voir les conseils de format", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_IMPORT_CONNECTIONS" : "Importer les connexions", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + "DIALOG_HEADER_SUCCESS" : "Succès", + + "ERROR_AMBIGUOUS_CSV_HEADER" : "L'en-tête CSV ambigu \"{HEADER}\" peut être soit un attribut de connexion, soit un paramètre", + "ERROR_AMBIGUOUS_PARENT_GROUP" : "Le groupe et le parentIdentifier peuvent ne pas être spécifiés en même temps", + "ERROR_ARRAY_REQUIRED" : "Le fichier fourni doit contenir une liste de connexions", + "ERROR_DETECTED_INVALID_TYPE" : "Type de fichier non pris en charge. Assurez-vous que le fichier est un CSV, JSON ou YAML valide.", + "ERROR_DUPLICATE_CONNECTION_IN_FILE" : "Connexion en double \"{NAME}\" à \"{PATH}\" dans le fichier d'importation", + "ERROR_DUPLICATE_CSV_HEADER" : "En-tête CSV en double : {HEADER}", + "ERROR_EMPTY_FILE" : "Le fichier fourni est vide", + "ERROR_INVALID_CSV_HEADER" : "En-tête CSV invalide \"{HEADER}\", ni un attribut ni un paramètre de connexion", + "ERROR_INVALID_MIME_TYPE" : "Type de fichier non pris en charge : \"{TYPE}\"", + "ERROR_INVALID_GROUP" : "Aucun groupe correspondant à \"{GROUP}\" trouvé", + "ERROR_INVALID_GROUP_IDENTIFIER" : "Aucun groupe de connexion avec l'identifiant \"{IDENTIFIER}\" trouvé", + "ERROR_INVALID_GROUP_TYPE" : "Groupe invalide - doit être une chaîne de caractères.", + "ERROR_INVALID_PROTOCOL" : "Protocole invalide \"{PROTOCOL}\"", + "ERROR_INVALID_USER_GROUPS_TYPE" : "Groupes d'utilisateurs invalides - doit être un tableau d'identifiants de groupe d'utilisateurs.", + "ERROR_INVALID_USERS_TYPE" : "Utilisateurs invalides - doit être un tableau d'identifiants d'utilisateurs.", + "ERROR_NO_FILE_SUPPLIED" : "Veuillez sélectionner un fichier à importer", + "ERROR_PARSE_FAILURE_CSV" : "Assurez-vous que votre fichier CSV est valide. L'analyse a échoué avec l'erreur \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_JSON" : "Assurez-vous que votre fichier JSON est valide. L'analyse a échoué avec l'erreur \"{ERROR}\". ", + "ERROR_PARSE_FAILURE_YAML" : "Assurez-vous que votre fichier YAML est valide. L'analyse a échoué avec l'erreur \"{ERROR}\". ", + "ERROR_REJECT_UPDATE_CONNECTION" : "La connexion \"{NAME}\" existe déjà à \"{PATH}\"", + "ERROR_REQUIRED_NAME_CONNECTION" : "Le nom de la connexion est requis", + "ERROR_REQUIRED_PROTOCOL_CONNECTION" : "Le protocole de connexion est requis", + "ERROR_REQUIRED_NAME_FILE" : "Aucun nom de connexion trouvé dans le fichier fourni", + "ERROR_REQUIRED_PROTOCOL_FILE" : "Aucun protocole de connexion trouvé dans le fichier fourni", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FIELD_HEADER_EXISTING_CONNECTION_MODE" : "Remplacer/Mettre à jour les connexions existantes", + "FIELD_HEADER_EXISTING_PERMISSION_MODE" : "Réinitialiser les permissions", + + "HELP_CSV_DESCRIPTION" : "Un fichier CSV d'importation de connexion a un enregistrement de connexion par ligne. Chaque colonne spécifie un champ de connexion. Au minimum, le nom de la connexion et le protocole doivent être spécifiés.", + "HELP_CSV_EXAMPLE" : "name,protocol,username,password,hostname,group,users,groups,guacd-encryption (attribute)\nconn1,vnc,alice,pass1,conn1.web.com,ROOT,guac user 1;guac user 2,Connection 1 Users,none\nconn2,rdp,bob,pass2,conn2.web.com,ROOT/Parent Group,guac user 1,,ssl\nconn3,ssh,carol,pass3,conn3.web.com,ROOT/Parent Group/Child Group,guac user 2;guac user 3,,\nconn4,kubernetes,,,,,,,", + "HELP_CSV_MORE_DETAILS" : "L'en-tête CSV de chaque ligne spécifie le champ de connexion. L'identifiant de groupe de connexion dans lequel la connexion doit être importée peut être directement spécifié avec \"parentIdentifier\", ou le chemin vers le groupe parent peut être spécifié en utilisant \"group\" comme indiqué ci-dessous. Dans la plupart des cas, il ne devrait pas y avoir de conflit entre les champs, mais si nécessaire, un suffixe \" (attribute)\" ou \" (parameter)\" peut être ajouté pour dissocier. Les listes d'identifiants d'utilisateur ou de groupe d'utilisateurs doivent être séparées par des points-virgules.¹", + "HELP_FILE_TYPE_DESCRIPTION" : "Trois types de fichiers sont pris en charge pour l'importation de connexions : CSV, JSON et YAML. Les mêmes données peuvent être spécifiées par chaque type de fichier. Cela doit inclure le nom de la connexion et le protocole. Facultativement, un emplacement de groupe de connexion, une liste d'utilisateurs et/ou de groupes d'utilisateurs auxquels accorder l'accès, des paramètres de connexion ou des protocoles de connexion peuvent également être spécifiés. Tous les utilisateurs ou groupes d'utilisateurs qui n'existent pas dans la source de données actuelle seront automatiquement créés. Notez que toutes les permissions de connexion existantes ne seront pas supprimées pour les connexions mises à jour, sauf si \"Réinitialiser les permissions\" est coché.", + "HELP_FILE_TYPE_HEADER" : "Types de fichiers", + "HELP_JSON_DESCRIPTION" : "Un fichier JSON d'importation de connexion est une liste d'objets de connexion. Au minimum, le nom de la connexion et le protocole doivent être spécifiés dans chaque objet de connexion.", + "HELP_JSON_EXAMPLE" : "[\n \\{\n \"name\": \"conn1\",\n \"protocol\": \"vnc\",\n \"parameters\": \\{ \"username\": \"alice\", \"password\": \"pass1\", \"hostname\": \"conn1.web.com\" \\},\n \"parentIdentifier\": \"ROOT\",\n \"users\": [ \"guac user 1\", \"guac user 2\" ],\n \"groups\": [ \"Connection 1 Users\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn2\",\n \"protocol\": \"rdp\",\n \"parameters\": \\{ \"username\": \"bob\", \"password\": \"pass2\", \"hostname\": \"conn2.web.com\" \\},\n \"group\": \"ROOT/Parent Group\",\n \"users\": [ \"guac user 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn3\",\n \"protocol\": \"ssh\",\n \"parameters\": \\{ \"username\": \"carol\", \"password\": \"pass3\", \"hostname\": \"conn3.web.com\" \\},\n \"group\": \"ROOT/Parent Group/Child Group\",\n \"users\": [ \"guac user 2\", \"guac user 3\" ]\n \\},\n \\{\n \"name\": \"conn4\",\n \"protocol\": \"kubernetes\"\n \\}\n]", + "HELP_JSON_MORE_DETAILS" : "L'identifiant de groupe de connexion dans lequel la connexion doit être importée peut être directement spécifié avec un champ \"parentIdentifier\", ou le chemin vers le groupe parent peut être spécifié en utilisant un champ \"group\" comme indiqué ci-dessous. Un tableau d'identifiants d'utilisateurs et de groupes d'utilisateurs auxquels accorder l'accès peut être spécifié par connexion.", + "HELP_EXISTING_CONNECTION_MODE" : "Remplacer/Mettre à jour entièrement les connexions existantes si leurs noms et groupes de connexion parent correspondent aux valeurs dans le fichier fourni. Si non coché, tenter d'importer une connexion avec le même nom et le même groupe de connexion parent d'une connexion existante sera considéré comme une erreur.", + "HELP_EXISTING_PERMISSION_MODE" : "Réinitialiser entièrement les permissions accordées pour toutes les connexions dans le fichier fourni aux permissions spécifiées dans ce fichier. Si aucune permission n'est spécifiée, toutes les permissions de connexion pertinentes seront révoquées. Si non coché, les permissions existantes sont préservées, et toutes les permissions spécifiées dans le fichier seront ajoutées.", + "HELP_SEMICOLON_FOOTNOTE" : "Si présent, les points-virgules peuvent être échappés avec un backslash, par exemple \"first\\\\;last\"", + "HELP_UPLOAD_DROP_TITLE" : "Déposez un fichier ici", + "HELP_UPLOAD_FILE_TYPES" : "CSV, JSON ou YAML", + "HELP_YAML_DESCRIPTION" : "Un fichier YAML d'importation de connexion est une liste d'objets de connexion avec exactement la même structure que le format JSON.", + "HELP_YAML_EXAMPLE" : "---\n - name: conn1\n protocol: vnc\n parameters:\n username: alice\n password: pass1\n hostname: conn1.web.com\n group: ROOT\n users:\n - guac user 1\n - guac user 2\n groups:\n - Connection 1 Users\n attributes:\n guacd-encryption: none\n - name: conn2\n protocol: rdp\n parameters:\n username: bob\n password: pass2\n hostname: conn2.web.com\n group: ROOT/Parent Group\n users:\n - guac user 1\n attributes:\n guacd-encryption: none\n - name: conn3\n protocol: ssh\n parameters:\n username: carol\n password: pass3\n hostname: conn3.web.com\n group: ROOT/Parent Group/Child Group\n users:\n - guac user 2\n - guac user 3\n - name: conn4\n protocol: kubernetes", + + "INFO_CONNECTIONS_IMPORTED_SUCCESS" : "{NUMBER} {NUMBER, plural, one{connexion} other{connexions}} importée(s) avec succès.", + + "SECTION_HEADER_CONNECTION_IMPORT" : "Importation de connexion", + "SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE" : "Format de fichier d'importation de connexion", + "SECTION_HEADER_CSV" : "Format CSV", + "SECTION_HEADER_JSON" : "Format JSON", + "SECTION_HEADER_YAML" : "Format YAML", + + "TABLE_HEADER_ERRORS" : "Erreurs", + "TABLE_HEADER_GROUP" : "Groupe", + "TABLE_HEADER_NAME" : "Nom", + "TABLE_HEADER_PROTOCOL" : "Protocole", + "TABLE_HEADER_ROW_NUMBER" : "Ligne #" + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Standard (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "AAAA-MM-JJ", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Cliquer pour afficher le mot de passe", + "HELP_HIDE_PASSWORD" : "Cliquer pour masquer le mot de passe" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Pas de connexion récente.", + + "PASSWORD_CHANGED" : "Mot de passe changé.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Toutes les Connexions", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Connexions récentes" + + }, + + "LIST": { + + "TEXT_ANONYMOUS_USER" : "Anonyme" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Identifiant Incorrect", + + "FIELD_HEADER_USERNAME" : "Identifiant", + "FIELD_HEADER_PASSWORD" : "Mot de passe" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Supprimer Connexion", + "DIALOG_HEADER_ERROR" : "Erreur", + + "FIELD_HEADER_LOCATION" : "Lieu:", + "FIELD_HEADER_NAME" : "Nom:", + "FIELD_HEADER_PROTOCOL" : "Protocole:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Active", + "INFO_CONNECTION_NOT_USED" : "Cette connexion n'a jamais été utilisée.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Modifier Connexion", + "SECTION_HEADER_HISTORY" : "Historique d'utilisation", + "SECTION_HEADER_PARAMETERS" : "Paramètres", + + "TABLE_HEADER_HISTORY_USERNAME" : "Identifiant", + "TABLE_HEADER_HISTORY_START" : "Heure de début", + "TABLE_HEADER_HISTORY_DURATION" : "Durée", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Hôte distant", + + "TEXT_CONFIRM_DELETE" : "Les connexions ne pourront être restaurées une fois supprimées. Êtes-vous certains de vouloir supprimer cette connexion ?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Supprimer Groupe de Connexion", + "DIALOG_HEADER_ERROR" : "Erreur", + + "FIELD_HEADER_LOCATION" : "Lieu:", + "FIELD_HEADER_NAME" : "Nom:", + "FIELD_HEADER_TYPE" : "Type:", + + "NAME_TYPE_BALANCING" : "Répartition", + "NAME_TYPE_ORGANIZATIONAL" : "Organizationel", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Modifier Groupe de Connexion", + + "TEXT_CONFIRM_DELETE" : "Les groupes de connexions ne pourront être restaurés une fois supprimés. Êtes-vous certains de vouloir supprimer ce groupe de connexion ?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Supprimer le Profil de Partage", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Nom:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Connexion Primaire:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Modifier le Profil de Partage", + "SECTION_HEADER_PARAMETERS" : "Paramètres", + + "TEXT_CONFIRM_DELETE" : "Les profils de partage ne peuvent pas être restaurés une fois supprimés. Êtes-vous certains de vouloir supprimer ce profil de partage ?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Supprimer Utilisateur", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administration du système:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Modifier son propre mot de passe:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Créer de nouveaux utilisateurs:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Créer de nouveaux groupes d'utilisateurs:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Créer de nouvelles connexions:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Créer de nouveaux groupes de connexion:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Créer de nouveaux profils de partage:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Connexion désactivée:", + "FIELD_HEADER_USERNAME" : "Identifiant:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Cet utilisateur n'appartient à aucun groupe. Développer cette section pour ajouter des groupes..", + + "INFO_READ_ONLY" : "Désolé, mais ce compte ne peut pas être modifié.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "Pas de groupes disponibles.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Toutes les Connexions", + "SECTION_HEADER_CONNECTIONS" : "Connexions", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Connexions en cours", + "SECTION_HEADER_EDIT_USER" : "Modifier Utilisateur", + "SECTION_HEADER_PERMISSIONS" : "Permissions", + "SECTION_HEADER_USER_GROUPS" : "Groupes", + + "TEXT_CONFIRM_DELETE" : "Les utilisateurs ne pourront être restaurés une fois supprimés. Êtes-vous certains de vouloir supprimer cet utilisateur?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Supprimer Groupe", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Désactivé:", + "FIELD_HEADER_USER_GROUP_NAME" : "Nom Groupe:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Ce groupe n'appartient actuellement à aucun groupe. Développez cette section pour ajouter des groupes.", + "HELP_NO_MEMBER_USER_GROUPS" : "Ce groupe n'appartient actuellement à aucun groupe. Développez cette section pour ajouter des groupes.", + "HELP_NO_MEMBER_USERS" : "Ce groupe ne contient actuellement aucun utilisateur. Développez cette section pour ajouter des utilisateurs.", + + "INFO_READ_ONLY" : "Désolé, mais ce groupe ne peut pas être modifié.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "Pas d'utilisateur disponible.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Modifier Groupe", + "SECTION_HEADER_MEMBER_USERS" : "Utilisateurs Membre", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Groupes Membre", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Groupes Parent", + + "TEXT_CONFIRM_DELETE" : "Les groupes ne peuvent pas être restaurés après leur suppression. Êtes-vous certains de vouloir supprimer ce groupe ?" + + }, + + "PLAYER" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_PAUSE" : "@:APP.ACTION_PAUSE", + "ACTION_PLAY" : "@:APP.ACTION_PLAY", + "ACTION_SHOW_KEY_LOG" : "Journal des frappes", + + "INFO_FRAME_EVENTS_LEGEND" : "Activité à l'écran", + "INFO_KEY_EVENTS_LEGEND" : "Activité du clavier", + "INFO_LOADING_RECORDING" : "Votre enregistrement est en cours de chargement. Veuillez patienter...", + "INFO_NO_KEY_LOG" : "Journal des frappes non disponible", + "INFO_NUMBER_OF_RESULTS" : "{RESULTS} {RESULTS, plural, one{Résultat} other{Résultats}}", + "INFO_SEEK_IN_PROGRESS" : "Recherche de la position demandée. Veuillez patienter...", + + "FIELD_PLACEHOLDER_TEXT_BATCH_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Touche Retour Arrière envoyée:", + "FIELD_HEADER_CA_CERT" : "Certificat d'autorité de certification:", + "FIELD_HEADER_CLIENT_CERT" : "Certificat client:", + "FIELD_HEADER_CLIENT_KEY" : "Clé du certificat client:", + "FIELD_HEADER_COLOR_SCHEME" : "Palette de couleur:", + "FIELD_HEADER_CONTAINER" : "Nom du conteneur:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Créer automatiquement le chemin d'enregistrement:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Créer automatiquement le chemin typescript:", + "FIELD_HEADER_DISABLE_COPY" : "Désactiver copier depuis le terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Désactiver coller depuis le terminal:", + "FIELD_HEADER_EXEC_COMMAND" : "Commande (exec):", + "FIELD_HEADER_FONT_NAME" : "Nom police:", + "FIELD_HEADER_FONT_SIZE" : "Taille police:", + "FIELD_HEADER_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorer le certificat serveur:", + "FIELD_HEADER_NAMESPACE" : "Espace de noms:", + "FIELD_HEADER_POD" : "Nom du pod:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Lecture seule:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclure la souris:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclure les graphiques/flux:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclure les évenements clavier:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de l'enregistrement:", + "FIELD_HEADER_RECORDING_PATH" : "Chemin de l,enregistrement:", + "FIELD_HEADER_SCROLLBACK" : "Taille maximum du défilement arrière:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nom Typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Chemin Typescript:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "@:APP.FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING", + "FIELD_HEADER_USE_SSL" : "Utiliser SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Retour Arrière (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Suppr. (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Noir sur blanc", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sur noir", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Vert sur noir", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanc sur noir", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Authentification", + "SECTION_HEADER_BEHAVIOR" : "Comportement Terminal", + "SECTION_HEADER_CLIPBOARD" : "Presse-papiers", + "SECTION_HEADER_CONTAINER" : "Conteneur", + "SECTION_HEADER_DISPLAY" : "Affichage", + "SECTION_HEADER_RECORDING" : "Enregistrement Ecran", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Enregistrement Session Texte)", + "SECTION_HEADER_NETWORK" : "Réseau" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CERT_TOFU" : "Faire confiance au certificat de l'hôte lors de la première utilisation:", + "FIELD_HEADER_CERT_FINGERPRINTS" : "Empreintes des certificats d'hôte de confiance:", + "FIELD_HEADER_CLIENT_NAME" : "Nom du Client:", + "FIELD_HEADER_COLOR_DEPTH" : "Qualité couleur:", + "FIELD_HEADER_CONSOLE" : "Console Administrateur:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Support son en console:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Créer automatiquement le chemin du lecteur:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Créer automatiquement un chemin d'enregistrement:", + "FIELD_HEADER_DISABLE_AUDIO" : "Désactiver son:", + "FIELD_HEADER_DISABLE_AUTH" : "Désactiver l'authentification:", + "FIELD_HEADER_DISABLE_COPY" : "Désactiver la copie depuis l'ordinateur distant:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Désactiver le téléchargement de fichier:", + "FIELD_HEADER_DISABLE_PASTE" : "Désactiver coller à partir du client:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Désactiver l'envoi de fichier:", + "FIELD_HEADER_DOMAIN" : "Nom de domaine:", + "FIELD_HEADER_DPI" : "Résolution (ppp):", + "FIELD_HEADER_DRIVE_NAME" : "Nom du lecteur:", + "FIELD_HEADER_DRIVE_PATH" : "Chemin du lecteur:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Activer l'entrée audio (microphone):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Activer la composition du bureau (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Activer lecteur réseau:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Activer le lissage des polices (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Activer pleine fenêtre de glisser:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Activer les animations de menu:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Désactiver le cache bitmap:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Désactiver le cache hors écran :", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Désactiver le cache glyph:", + "FIELD_HEADER_DISABLE_GFX" : "Désactiver l'extension du pipeline graphique:", + "FIELD_HEADER_ENABLE_PRINTING" : "Activer imprimante:", + "FIELD_HEADER_ENABLE_SFTP" : "Activer SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Activer thématisation:", + "FIELD_HEADER_ENABLE_TOUCH" : "Activer le multitouch:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Activer fond d'écran:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Forcer la compression sans perte:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Nom de domaine:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Identifiant:", + "FIELD_HEADER_HEIGHT" : "Hauteur:", + "FIELD_HEADER_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorer le certificat du serveur:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Programme de démarrage:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Equilibrage de charge info/cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "Caractères de fin de ligne:", + "FIELD_HEADER_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRINTER_NAME" : "Nom de l'imprimante redirigée:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Préconnexion BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "Source RDP ID:", + "FIELD_HEADER_READ_ONLY" : "Lecture seule:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclure la souris:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclure les graphiques/flux:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Exclure les événements tactiles:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclure les événements clavier:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de l'enregistrement:", + "FIELD_HEADER_RECORDING_PATH" : "Chemin de l'enregistrement:", + "FIELD_HEADER_RESIZE_METHOD" : "Méthode de redimensionnement:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Paramètres:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Répertoire de travail:", + "FIELD_HEADER_REMOTE_APP" : "Programme:", + "FIELD_HEADER_SECURITY" : "Mode de Sécurité:", + "FIELD_HEADER_SERVER_LAYOUT" : "Agencement clavier:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Répertoire d'upload par défaut:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Désactiver le téléchargement de fichier:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Désactiver l'envoi de fichier:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Clé publique de l'hôte (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Intervalle keepalive SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Phrase secrète:", + "FIELD_HEADER_SFTP_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Clé privée:", + "FIELD_HEADER_SFTP_PUBLIC_KEY" : "Clé publique:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Dossier racine de l'explorateur de fichier:", + "FIELD_HEADER_SFTP_TIMEOUT" : "Délai d'expiration de la connexion SFTP:", + "FIELD_HEADER_SFTP_USERNAME" : "Identifiant:", + "FIELD_HEADER_STATIC_CHANNELS" : "Noms des canaux statiques:", + "FIELD_HEADER_TIMEOUT" : "Délai d'expiration de la connexion", + "FIELD_HEADER_TIMEZONE" : "Fuseau horaire:", + "FIELD_HEADER_USERNAME" : "Identifiant:", + "FIELD_HEADER_WIDTH" : "Largeur:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adresse de diffusion pour les paquets WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adresse MAC de l'hôte distant:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Envoi de paquets WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP pour le paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'attente du démarage de l'hôte:", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_EMPTY" : "", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "Préserver tel quel", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Faibles couleurs (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Vraies couleurs (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Vraies couleurs (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 couleurs", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Afficher Mise à jour\" canal virtuel (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Reconnecter", + + "FIELD_OPTION_SECURITY_ANY" : "Négotiation automatique", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Network Level Authentication)", + "FIELD_OPTION_SECURITY_RDP" : "Chiffrement RDP", + "FIELD_OPTION_SECURITY_TLS" : "Chiffrement TLS", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Tchèque (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Danois (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Suisse Allemand (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Allemand (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "Anglais UK (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "Anglais US (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Enspagnol (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latino-Américain (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Français Belge (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Français Canada (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Français Suisse (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Français (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Hongrois (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italien (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japonais (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Norvégien (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polonais (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portugais Brésilien (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portugais (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Roumaine (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Suédois (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turque (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Authentification", + "SECTION_HEADER_BASIC_PARAMETERS" : "Paramètres de base", + "SECTION_HEADER_CLIPBOARD" : "Presse-papiers", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Redirection Périphérique", + "SECTION_HEADER_DISPLAY" : "Affichage", + "SECTION_HEADER_GATEWAY" : "Passerelle du bureau à distance", + "SECTION_HEADER_LOAD_BALANCING" : "Equilibrage de charge", + "SECTION_HEADER_NETWORK" : "Réseau", + "SECTION_HEADER_PERFORMANCE" : "Performance", + "SECTION_HEADER_PRECONNECTION_PDU" : "Préconnexion PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Enregistrement écran", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Touche Retour Arrière envoyée:", + "FIELD_HEADER_COLOR_SCHEME" : "Palette de couleurs:", + "FIELD_HEADER_COMMAND" : "Exécuter une commande:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Créer automatiquement le chemin d'enregistrement:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Créer automatiquement le chemin typescript :", + "FIELD_HEADER_DISABLE_COPY" : "Désactiver copier depuis le terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Désactiver coller depuis le terminal:", + "FIELD_HEADER_FONT_NAME" : "Nom police:", + "FIELD_HEADER_FONT_SIZE" : "Taille police:", + "FIELD_HEADER_ENABLE_SFTP" : "Activer SFTP:", + "FIELD_HEADER_HOST_KEY" : "Clé publique de l'hôte (Base64):", + "FIELD_HEADER_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_LOCALE" : "Langue/Locale ($LANG):", + "FIELD_HEADER_USERNAME" : "Identifiant:", + "FIELD_HEADER_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_PASSPHRASE" : "Phrase secrète:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Clé privée:", + "FIELD_HEADER_PUBLIC_KEY" : "Clé publique:", + "FIELD_HEADER_SCROLLBACK" : "Taille maximum du défilement arrière:", + "FIELD_HEADER_READ_ONLY" : "Lecture seule:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclure la souris:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclure les graphiques/flux:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclure les événements clavier:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de l'enregistrement:", + "FIELD_HEADER_RECORDING_PATH" : "Chemin de l'enregistrement:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Intervalle keepalive Serveur:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Désactiver le téléchargement de fichier:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Dossier racine de l'explorateur de fichier:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Désactiver l'envoi de fichier:", + "FIELD_HEADER_TERMINAL_TYPE" : "Type du terminal:", + "FIELD_HEADER_TIMEOUT" : "Délai d'expiration de la connexion:", + "FIELD_HEADER_TIMEZONE" : "Fuseau horaire ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nom Typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Chemin Typescript:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "@:APP.FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adresse de diffusion pour les paquets WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adresse MAC de l'hôte distant:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Envoi de paquets WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP pour le paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'attente du démarage de l'hôte:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Retour Arrière (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Suppr. (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Noir sur blanc", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sur noir", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Vert sur noir", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanc sur noir", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Authentification", + "SECTION_HEADER_BEHAVIOR" : "Comportement Terminal", + "SECTION_HEADER_CLIPBOARD" : "Presse-papiers", + "SECTION_HEADER_DISPLAY" : "Affichage", + "SECTION_HEADER_NETWORK" : "Réseau", + "SECTION_HEADER_RECORDING" : "Enregistrement Ecran", + "SECTION_HEADER_SESSION" : "Session / Environnement", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Enregistrement session Texte)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Touche Retour Arrière envoyée:", + "FIELD_HEADER_COLOR_SCHEME" : "Palette de couleurs:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Créer automatiquement le chemin d'enregistrement:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Créer automatiquement le chemin typescript:", + "FIELD_HEADER_DISABLE_COPY" : "Désactiver copier depuis le terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Désactiver coller depuis le terminal:", + "FIELD_HEADER_FONT_NAME" : "Nom police:", + "FIELD_HEADER_FONT_SIZE" : "Taille police:", + "FIELD_HEADER_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Expression régulière Échec de connexion:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Expression régulière Connexion réussie:", + "FIELD_HEADER_USERNAME" : "Identifiant:", + "FIELD_HEADER_USERNAME_REGEX" : "Expression régulière Identifiant:", + "FIELD_HEADER_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_PASSWORD_REGEX" : "Expression régulière Mot de passe:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Lecture seule:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclure la souris:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclure les graphiques/flux:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclure les événements clavier:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de l'enregistrement:", + "FIELD_HEADER_RECORDING_PATH" : "Chemin de l'enregistrement:", + "FIELD_HEADER_SCROLLBACK" : "Taille maximum du défilement arrière:", + "FIELD_HEADER_TERMINAL_TYPE" : "Type de terminal:", + "FIELD_HEADER_TIMEOUT" : "Délai d'expiration de la connexion:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nom Typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Chemin Typescript:", + "FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING" : "@:APP.FIELD_HEADER_TYPESCRIPT_WRITE_EXISTING", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adresse de diffusion pour les paquets WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adresse MAC de l'hôte distant:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Envoi de paquets WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP pour le paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'attente du démarage de l'hôte:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Retour Arrière (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Suppr. (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Noir sur blanc", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Gris sur noir", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Vert sur noir", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Blanc sur noir", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Authentification", + "SECTION_HEADER_BEHAVIOR" : "Comportement Terminal", + "SECTION_HEADER_CLIPBOARD" : "Presse-papiers", + "SECTION_HEADER_DISPLAY" : "Affichage", + "SECTION_HEADER_RECORDING" : "Enregistrement Ecran", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Enregistrement session Texte)", + "SECTION_HEADER_NETWORK" : "Réseau", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Serveur de son:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Encodage:", + "FIELD_HEADER_COLOR_DEPTH" : "Qualité couleur:", + "FIELD_HEADER_COMPRESS_LEVEL" : "Niveau de compression:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Créer automatiquement un chemin d'enregistrement:", + "FIELD_HEADER_CURSOR" : "Curseur:", + "FIELD_HEADER_DEST_HOST" : "Hôte distant:", + "FIELD_HEADER_DEST_PORT" : "Port distant:", + "FIELD_HEADER_DISABLE_COPY" : "Désactiver la copie depuis l'ordinateur distant:", + "FIELD_HEADER_DISABLE_DISPLAY_RESIZE" : "Désactiver le redimensionnement de l'affichage distant:", + "FIELD_HEADER_DISABLE_PASTE" : "Désactiver coller à partir du client:", + "FIELD_HEADER_DISABLE_SERVER_INPUT" : "Désactiver l'entrée du serveur lorsque le client est connecté:", + "FIELD_HEADER_ENABLE_AUDIO" : "Activer son:", + "FIELD_HEADER_ENABLE_SFTP" : "Activer SFTP:", + "FIELD_HEADER_ENCODINGS" : "Encodages de l'affichage:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Forcer la compression sans perte:", + "FIELD_HEADER_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_USERNAME" : "Identifiant:", + "FIELD_HEADER_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_QUALITY_LEVEL" : "Qualité d'affichage:", + "FIELD_HEADER_READ_ONLY" : "Lecture seule:", + "FIELD_HEADER_RECORDING_WRITE_EXISTING" : "@:APP.FIELD_HEADER_RECORDING_WRITE_EXISTING", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Exclure la souris:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Exclure les graphiques/flux:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Inclure les événements clavier:", + "FIELD_HEADER_RECORDING_NAME" : "Nom de l'enregistrement:", + "FIELD_HEADER_RECORDING_PATH" : "Chemin de l'enregistrement:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Répertoire d'upload par défaut:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Désactiver le téléchargement de fichier:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Désactiver l'envoi de fichier:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Clé publique de l'hôte (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nom d'hôte:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Intervale keepalive SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Phrase secrète:", + "FIELD_HEADER_SFTP_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Clé privée:", + "FIELD_HEADER_SFTP_PUBLIC_KEY" : "Clé publique:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Dossier racine de l'explorateur de fichier:", + "FIELD_HEADER_SFTP_TIMEOUT" : "Délai d'expiration de la connexion SFTP:", + "FIELD_HEADER_SFTP_USERNAME" : "Identifiant:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Inverser composantes rouges et bleues:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adresse de diffusion pour les paquets WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adresse MAC de l'hôte distant:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Envoi de paquets WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP pour le paquet WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Temps d'attente du démarage de l'hôte:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 couleurs", + "FIELD_OPTION_COLOR_DEPTH_16" : "Faibles couleurs (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Vraies couleurs (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Vraies couleurs (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Local", + "FIELD_OPTION_CURSOR_REMOTE" : "Distant", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Son", + "SECTION_HEADER_AUTHENTICATION" : "Authentification", + "SECTION_HEADER_CLIPBOARD" : "Presse-papiers", + "SECTION_HEADER_DISPLAY" : "Affichage", + "SECTION_HEADER_NETWORK" : "Réseau", + "SECTION_HEADER_RECORDING" : "Enregistrement Ecran", + "SECTION_HEADER_REPEATER" : "Répétiteur VNC", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Paramètres" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + "ACTION_VIEW_RECORDING" : "@:APP.ACTION_VIEW_RECORDING", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "L'historique des dernières connexions est répertorié ici et peut être trié en cliquant sur l'en-tête des colonnes. Pour rechercher des enregistrements spécifiques, entrez un filtre et cliquez sur \"Rechercher\". Seuls les enregistrements correspondant au filtre renseigné seront listés.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Aucun enregistrement correspondant", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nom de connexion", + "TABLE_HEADER_SESSION_DURATION" : "Durée", + "TABLE_HEADER_SESSION_LOGS" : "Journaux", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Hôte distant", + "TABLE_HEADER_SESSION_STARTDATE" : "Heure de début", + "TABLE_HEADER_SESSION_USERNAME" : "Identifiant", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_NEW_CONNECTION" : "Nouvelle Connexion", + "ACTION_NEW_CONNECTION_GROUP" : "Nouveau Groupe", + "ACTION_NEW_SHARING_PROFILE" : "Nouveau Profil de Partage", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Cliquer ou appuyer sur une connexion en dessous pour la gérer. Selon vos permissions, les connexions peuvent être ajoutées, supprimées, leur propriétés (protocole, nom d'hôte, port, etc) changées.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Connexions" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "Votre mot de passe ne peut être vide.", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Langue affichée:", + "FIELD_HEADER_NUMBER_RECENT_CONNECTIONS" : "Nombre de connexions récentes à afficher:", + "FIELD_HEADER_PASSWORD" : "Mot de passe:", + "FIELD_HEADER_PASSWORD_OLD" : "Mot de passe actuel:", + "FIELD_HEADER_PASSWORD_NEW" : "Nouveau mot de passe:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirmer nouveau mot de passe:", + "FIELD_HEADER_SHOW_RECENT_CONNECTIONS" : "Afficher les connexions récentes:", + "FIELD_HEADER_TIMEZONE" : "Fuseau horaire:", + "FIELD_HEADER_USERNAME" : "Identifiant:", + + "HELP_APPEARANCE" : "Vous pouvez ici activer ou désactiver les connexions récentes sur la page d'accueil de Guacamole, et ajuster le nombre de connexions récentes qui seront affichées.", + "HELP_DEFAULT_INPUT_METHOD" : "La méthode de saisie par défaut détermine comment les événements clavier sont reçus par Guacamole. Modifier ce paramètre peut être nécessaire lors de l'utilisation d'un appareil mobile. Ce paramètre peut être remplacé pour chaque connexion dans le menu de Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "Le mode d'émulation de la souris par défaut détermine le comportement de la souris distante dans de nouvelles connexions par rapport aux touches. Ce paramètre peut être remplacé pour chaque connexion dans le menu Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Les options ci-dessous sont liées à la localisation de l'utilisateur et auront un impact sur l'affichage de différentes parties de l'interface.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Si vous souhaitez changer votre mot de passe, saisissez votre mot de passe actuel ainsi que le nouveau mot de passe souhaité ci-dessous, puis cliquez sur \"Mettre à jour Mot de passe\". Le changement prendra effet immédiatement.", + + "INFO_PASSWORD_CHANGED" : "Mot de passe modifié.", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "Paramètres utilisateur enregistrés.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_APPEARANCE" : "Apparence", + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Méthode de saisie par défaut", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Mode d'émulation de la souris par défaut", + "SECTION_HEADER_UPDATE_PASSWORD" : "Modifier Mot de passe" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Nouvel Utilisateur", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Cliquez ou appuyez sur un utilisateur en dessous pour le gérer. Selon vos permissions, les utilisateurs peuvent être ajoutés, supprimés et leur mot de passe changé.", + + "SECTION_HEADER_USERS" : "Utilisateur", + + "TABLE_HEADER_FULL_NAME" : "Nom", + "TABLE_HEADER_LAST_ACTIVE" : "Dernier actif", + "TABLE_HEADER_ORGANIZATION" : "Organisation", + "TABLE_HEADER_USERNAME" : "Identifiant" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Nouveau Groupe", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Cliquez ou appuyez sur un groupe ci-dessous pour gérer ce groupe. En fonction de votre niveau d'accès, des groupes peuvent être ajoutés et supprimés, ainsi que leurs utilisateurs et groupes membres.", + + "SECTION_HEADER_USER_GROUPS" : "Groupes", + + "TABLE_HEADER_USER_GROUP_NAME" : "Nom Groupe" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Fermer Sessions", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Fermer Sessions", + "DIALOG_HEADER_ERROR" : "Erreur", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Cette page sera remplie avec des connexions actuellement actives. Les connexions répertoriées et la possibilité de supprimer ces connexions dépendent de votre niveau d'accès. Si vous souhaitez en fermer une ou plusieurs, sélectionnez les et cliquez sur \"Fermer Sessions\". La fermeture d'une session déconnectera immédiatement l'utilisateur.", + + "INFO_NO_SESSIONS" : "Pas de session ouverte", + + "SECTION_HEADER_SESSIONS" : "Sessions Actives", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nom de connexion", + "TABLE_HEADER_SESSION_STARTDATE" : "Heure de début", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Hôte distant", + "TABLE_HEADER_SESSION_USERNAME" : "Identifiant", + + "TEXT_CONFIRM_DELETE" : "Êtes-vous certains de vouloir fermer toutes les connexions sélectionnées ? Les utilisateurs utilisant ces sessions seront immédiatement déconnectés." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Adresse Mail:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Nom:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organisation:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Rôle:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/it.json b/guacamole/src/main/frontend/src/translations/it.json new file mode 100644 index 0000000..2b4be1b --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/it.json @@ -0,0 +1,604 @@ +{ + + "NAME" : "Italiano", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Annulla", + "ACTION_CLONE" : "Clona", + "ACTION_CONTINUE" : "Continua", + "ACTION_DELETE" : "Cancella", + "ACTION_DELETE_SESSIONS" : "Termina Sessione", + "ACTION_LOGIN" : "Entra", + "ACTION_LOGOUT" : "Esci", + "ACTION_MANAGE_CONNECTIONS" : "Connessioni", + "ACTION_MANAGE_PREFERENCES" : "Preferenze", + "ACTION_MANAGE_SETTINGS" : "Opzioni", + "ACTION_MANAGE_SESSIONS" : "Sessioni Attive", + "ACTION_MANAGE_USERS" : "Utenti", + "ACTION_NAVIGATE_BACK" : "Indietro", + "ACTION_NAVIGATE_HOME" : "Home", + "ACTION_SAVE" : "Salva", + "ACTION_UPDATE_PASSWORD" : "Aggiorna Password", + + "DIALOG_HEADER_ERROR" : "Errore", + + "ERROR_PASSWORD_BLANK" : "La password non può essere vuota.", + "ERROR_PASSWORD_MISMATCH" : "Le password inserite sono diverse!", + + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Re-inserisci la password:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtro", + + "FORMAT_DATE_TIME_PRECISE" : "dd-MM-yyyy HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Ora utilizzato da {USERS} {USERS, plural, one{user} other{users}}." + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Pulisci i trasferimenti completati", + "ACTION_DISCONNECT" : "Disconnetti", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Riconnetti", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_UPLOAD_FILES" : "Carica un file", + + "DIALOG_HEADER_CONNECTING" : "Connessione in corso", + "DIALOG_HEADER_CONNECTION_ERROR" : "Errore di Connessione", + "DIALOG_HEADER_DISCONNECTED" : "Disconnesso", + + "ERROR_CLIENT_201" : "La connessione è stata chiusa perchè il server è sovraccarico. Attendi qualche minuto e riprova a collegarti.", + "ERROR_CLIENT_202" : "Il server Guacamole ha chiuso la connessione perchè il desktop remoto risponde troppo lentamente. Per favore riprova o contatta il tuo amministratore di sistema.", + "ERROR_CLIENT_203" : "Il desktop remoto ha riscontrato un errore ed ha chiuso la connessione. Per favore riprova o contatta il tuo amministratore di sistema.", + "ERROR_CLIENT_205" : "Questa connessione è stata chiusa a causa di un conflitto con un'altra connessione. Riprova tra qualche minuto.", + "ERROR_CLIENT_301" : "Autenticazione fallita. Prova ad effettaure nuovamente la connessione.", + "ERROR_CLIENT_303" : "Non hai i permessi per accedere a questa connessione. Se ne hai bisogno, chiedi ai tuoi amministratori di sistema di aggiungerti agli utenti abilitati.", + "ERROR_CLIENT_308" : "Il server Guacamole ha chiuso la connessione perchè il tuo browser non ha risposto per troppo tempo e sembrava essersi disconnesso. Solitamente la causa è un problema di rete, ad esempio un segnale wifi instabile o una connesisone molto lenta. Controlla la tua rete e riprova.", + "ERROR_CLIENT_31D" : "Il server Guacamole rifiuta l'accesso alla connessione perchè hai raggiunto il limite massimo di connessioni simultanee per singolo utente. Chiudi una o più connessioni e riprova.", + "ERROR_CLIENT_DEFAULT" : "Si è verificato un errore interno sul server Guacamole, la connessione è stata terminata. Se il problema persiste avvisa il tuo amministratore di sistema o controlla i file di log.", + + "ERROR_TUNNEL_201" : "Il server Guacamole ha rifiutato questa connessione perchè ci sono troppe connessioni attive. Attendi qualche minuto e riprova.", + "ERROR_TUNNEL_202" : "La connessione è stata chiusa dal server perché ci vuole troppo tempo per rispondere. Solitamente la causa è un problema di rete, ad esempio un segnale wifi instabile o una connesisone molto lenta. Controlla la tua rete e riprova.", + "ERROR_TUNNEL_203" : "Si è verificato un errore sul server e la connessione è stata chiusa. Riprova o contatta il tuo amministratore di sistema.", + "ERROR_TUNNEL_204" : "La connessione richiesta non esiste. Controlla il nome della connessione e riprova. Grazie.", + "ERROR_TUNNEL_205" : "Questa connessione è già in uso, non sono possibili accessi concorrenti. Riprova più tardi. Grazie.", + "ERROR_TUNNEL_301" : "Non hai i permessi per accedere a questa connessione perchè non hai effettuato il login. Inserisci nome utente e password e riprova.", + "ERROR_TUNNEL_303" : "Non hai i permessi per accedere a questa connessione. Se ne hai bisogno, chiedi ai tuoi amministratori di sistema di aggiungerti agli utenti abilitati.", + "ERROR_TUNNEL_308" : "Il server Guacamole ha chiuso la connessione perchè il tuo browser non ha risposto per troppo tempo e sembrava essersi disconnesso. Solitamente la causa è un problema di rete, ad esempio un segnale wifi instabile o una connesisone molto lenta. Controlla la tua rete e riprova.", + "ERROR_TUNNEL_31D" : "Il server Guacamole rifiuta l'accesso alla connessione perchè hai raggiunto il limite massimo di connessioni simultanee per singolo utente. Chiudi una o più connessioni e riprova. Grazie.", + "ERROR_TUNNEL_DEFAULT" : "Si è verificato un errore interno sul server Guacamole, e la connessione è stata terminata. Se il problema persiste avvisa il tuo amministratore di sistema o controlla i file di log.", + + "ERROR_UPLOAD_100" : "Il trasferimento di file non è supportato o non è attivo. Contatta il tuo amministratore di sistema.", + "ERROR_UPLOAD_201" : "Ci sono troppi file in coda per il trasferimento. Attendi che siano completati i trasferimenti in atto e riprova.", + "ERROR_UPLOAD_202" : "Trasferimento annullato: il desktop remoto risponde troppo lentamente. Per favore riprova o contatta il tuo amministratore di sistema.", + "ERROR_UPLOAD_203" : "Il desktop remoto ha incontrato un errore durante il trasferimento. Per favore riprova o contatta il tuo amministratore di sistema.", + "ERROR_UPLOAD_204" : "La destinazione del file non esiste. Controlla che la destinazione esista e riprova.", + "ERROR_UPLOAD_205" : "La destinazione del file è bloccata. Per favore attendi che ogni processo in corso sia terminato e riprova.", + "ERROR_UPLOAD_301" : "Non hai i permessi per caricare i file perchè non hai fatto il login. Inserisci nome utente e password e riprova.", + "ERROR_UPLOAD_303" : "Non hai i permessi per caricare i file. Se ti serve questa funzionalità contatta il tuo amministratore di sistema.", + "ERROR_UPLOAD_308" : "Il trasferimento di file si è fermato. Solitamente la causa è un problema di rete, ad esempio un segnale wifi instabile o una connesisone molto lenta. Controlla la tua rete e riprova.", + "ERROR_UPLOAD_31D" : "Ci sono troppi file in coda per il trasferimento. Attendi che siano completati i trasferimenti in atto e riprova.", + "ERROR_UPLOAD_DEFAULT" : "Si è verificato un errore sul server e la connessione è stata chiusa. Riprova o contatta il tuo amministratore di sistema.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Il testo copiato/tagliato appare qui. I cambiamenti effettuati al testo qui sotto saranno riportati negli appunti remoti.", + "HELP_INPUT_METHOD_NONE" : "Non c'è nessun metodo di immissione. L'input da tastiera è accettato da una tastiera fisica connessa.", + "HELP_INPUT_METHOD_OSK" : "Mostra e accetta input dalla tastiera su schermo. La tastiera su schermo ti permette di scrivere combinazioni di tasti altrimenti impossibli (ad esempio Ctrl-Alt-Canc).", + "HELP_INPUT_METHOD_TEXT" : "Abilita la battitura di testo ed emula gli eventi da tastiera basati sul testo battuto. Questo è necessario per tablet e smartphone che non hanno una tastiera fisica.", + "HELP_MOUSE_MODE" : "Determina come si deve comportare il mouse remoto in base al touch.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Tap to click. Il click è sostituito dal tocco.", + "HELP_MOUSE_MODE_RELATIVE" : "Trascina il dito per muovere il puntatore del mouse e fai tap al posto del click. Il click sarà effettuato dove si trova il puntatore.", + + "INFO_NO_FILE_TRANSFERS" : "Nessun trasferimento di file.", + + "NAME_INPUT_METHOD_NONE" : "Nessuno", + "NAME_INPUT_METHOD_OSK" : "Tastiera su schermo", + "NAME_INPUT_METHOD_TEXT" : "Inserimento Testo", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Touchscreen", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIPBOARD" : "Appunti", + "SECTION_HEADER_DEVICES" : "Dispositivi", + "SECTION_HEADER_DISPLAY" : "Schermo", + "SECTION_HEADER_FILE_TRANSFERS" : "Trasferimento file", + "SECTION_HEADER_INPUT_METHOD" : "Metodo di input", + "SECTION_HEADER_MOUSE_MODE" : "Modalità di emulazione del mouse", + + "TEXT_ZOOM_AUTO_FIT" : "Automatically fit to browser window", + "TEXT_CLIENT_STATUS_IDLE" : "Inattivo.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Connessione in corso a Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Sei stato disconnesso.", + "TEXT_CLIENT_STATUS_WAITING" : "Connesso a Guacamole. Attendi una risposta...", + "TEXT_RECONNECT_COUNTDOWN" : "Riconnessione in {REMAINING} {REMAINING, plural, one{second} other{seconds}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/it-it-qwerty.json" + + }, + + "FORM" : { + + "HELP_SHOW_PASSWORD" : "Fare clic per mostrare la password", + "HELP_HIDE_PASSWORD" : "Fare clic per nascondere la password" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Nessuna connessione recente.", + + "PASSWORD_CHANGED" : "Password modificata.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Tutte le Connessioni", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Connessioni Recenti" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Nome utente e/o password errati.", + + "FIELD_HEADER_USERNAME" : "Nome utente", + "FIELD_HEADER_PASSWORD" : "Password" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Elimina connessione", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Posizione:", + "FIELD_HEADER_NAME" : "Nome:", + "FIELD_HEADER_PROTOCOL" : "Protocollo:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Attiva adesso", + "INFO_CONNECTION_NOT_USED" : "Questa connessione non è mai stata usata.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Modifica Connessione", + "SECTION_HEADER_HISTORY" : "Cronologia di utilizzo", + "SECTION_HEADER_PARAMETERS" : "Parametri", + + "TABLE_HEADER_HISTORY_USERNAME" : "Nome utente", + "TABLE_HEADER_HISTORY_START" : "Ora di inizio", + "TABLE_HEADER_HISTORY_DURATION" : "Durata", + + "TEXT_CONFIRM_DELETE" : "Le Connessioni non possono essere ripristinate dopo la loro eliminazione. Sei sicuro di volere eliminare questa connessione?" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Elimina Gruppo di Connesisoni", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Posizione:", + "FIELD_HEADER_NAME" : "Nome:", + "FIELD_HEADER_TYPE" : "Tipo:", + + "NAME_TYPE_BALANCING" : "Bilanciamento", + "NAME_TYPE_ORGANIZATIONAL" : "Organizzazione", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Modifica Gruppo di Connessioni", + + "TEXT_CONFIRM_DELETE" : "Un Gruppo di Connessioni non può essere ripristinato dopo l'eliminazione. Sei sicuro di volere eliminare questa gruppo?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Nome:", + + "SECTION_HEADER_PARAMETERS" : "Parametri" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Elimina utente", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Amministartore di sistema:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Cambia la tua password:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Crea un utente:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Crea una connessione:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Crea un ruppo di connessioni:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USERNAME" : "Nome utente:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "SECTION_HEADER_CONNECTIONS" : "Connessioni", + "SECTION_HEADER_EDIT_USER" : "Modifica Utente", + "SECTION_HEADER_PERMISSIONS" : "Permessi", + + "TEXT_CONFIRM_DELETE" : "L'utente non può essere ripristinato dopo l'eliminazione. Sei sicuro di volere eliminare l'utente?" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_COLOR_DEPTH" : "Profondità di colore:", + "FIELD_HEADER_CONSOLE" : "Console amministratore:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Supporta l'audio nella console:", + "FIELD_HEADER_CLIENT_NAME" : "Client name:", + "FIELD_HEADER_DISABLE_AUDIO" : "Disattiva audio:", + "FIELD_HEADER_DISABLE_AUTH" : "Disabilita autenticazione:", + "FIELD_HEADER_DOMAIN" : "Dominio:", + "FIELD_HEADER_DPI" : "Risoluzione (DPI):", + "FIELD_HEADER_DRIVE_PATH" : "Drive path:", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Abilita composizione desktop (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Abilita drive:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Abilita l'arrotondamento dei caratteri (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Abilita il trascinamento della finestra intera:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Abilita le animazioni del menu:", + "FIELD_HEADER_ENABLE_PRINTING" : "Abilita la stampa:", + "FIELD_HEADER_ENABLE_SFTP" : "Abilita SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Abilita temi:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Abilita sfondo:", + "FIELD_HEADER_HEIGHT" : "Altezza:", + "FIELD_HEADER_HOSTNAME" : "Nome host:", + "FIELD_HEADER_IGNORE_CERT" : "Ignora certificato server:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Programma iniziale:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parametri:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Directory di lavoro:", + "FIELD_HEADER_REMOTE_APP" : "Programma:", + "FIELD_HEADER_SECURITY" : "Modalità di sicurezza:", + "FIELD_HEADER_SERVER_LAYOUT" : "Layout della tastiera:", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nome host:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Password:", + "FIELD_HEADER_SFTP_PORT" : "Porta:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Chiave privata:", + "FIELD_HEADER_SFTP_USERNAME" : "Nome utente:", + "FIELD_HEADER_STATIC_CHANNELS" : "Nomi dei canali statici:", + "FIELD_HEADER_USERNAME" : "Nome utente:", + "FIELD_HEADER_WIDTH" : "Larghezza:", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_SECURITY_ANY" : "Qualsiasi", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Network Level Authentication)", + "FIELD_OPTION_SECURITY_RDP" : "RDP encryption", + "FIELD_OPTION_SECURITY_TLS" : "TLS encryption", + + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italiana (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polacca (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Rumeno (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Swedish (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticazione", + "SECTION_HEADER_BASIC_PARAMETERS" : "Impostazioni di base", + "SECTION_HEADER_CLIPBOARD" : "Appunti", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Reindirizzamento del dispositivo", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_PERFORMANCE" : "Prestazione", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_FONT_NAME" : "Nome carattere:", + "FIELD_HEADER_FONT_SIZE" : "Dimensione del carattere:", + "FIELD_HEADER_ENABLE_SFTP" : "Abilita SFTP:", + "FIELD_HEADER_HOSTNAME" : "Nome host:", + "FIELD_HEADER_USERNAME" : "Nome utente:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_PRIVATE_KEY" : "Chiave privata:", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticazione", + "SECTION_HEADER_CLIPBOARD" : "Appunti", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_FONT_NAME" : "Nome carattere:", + "FIELD_HEADER_FONT_SIZE" : "Dimensione del carattere:", + "FIELD_HEADER_HOSTNAME" : "Nome host:", + "FIELD_HEADER_USERNAME" : "Nome utente:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSWORD_REGEX" : "Espressione regolare della password:", + "FIELD_HEADER_PORT" : "Porta:", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticazione", + "SECTION_HEADER_CLIPBOARD" : "Appunti", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_NETWORK" : "Network" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Nome del server audio:", + "FIELD_HEADER_COLOR_DEPTH" : "Profondità di colore:", + "FIELD_HEADER_CURSOR" : "Cursore:", + "FIELD_HEADER_DEST_HOST" : "Host di destinazione:", + "FIELD_HEADER_DEST_PORT" : "Porto di destinazione:", + "FIELD_HEADER_ENABLE_AUDIO" : "Abilita audio:", + "FIELD_HEADER_ENABLE_SFTP" : "Abilita SFTP:", + "FIELD_HEADER_HOSTNAME" : "Nome host:", + "FIELD_HEADER_USERNAME" : "Nome utente:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_READ_ONLY" : "Sola lettura:", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nome host:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passphrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Password:", + "FIELD_HEADER_SFTP_PORT" : "Porta:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Chiave privata:", + "FIELD_HEADER_SFTP_USERNAME" : "Nome utente:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Scambia componenti rosso/blu:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Locale", + "FIELD_OPTION_CURSOR_REMOTE" : "Remoto", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Audio", + "SECTION_HEADER_AUTHENTICATION" : "Autenticazione", + "SECTION_HEADER_CLIPBOARD" : "Appunti", + "SECTION_HEADER_DISPLAY" : "Display", + "SECTION_HEADER_NETWORK" : "Network", + "SECTION_HEADER_REPEATER" : "VNC Repeater", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Impostazioni" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Nuova Connessione", + "ACTION_NEW_CONNECTION_GROUP" : "Nuovo Gruppo", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Fai click o tap sulla connessione qui sotto per gestire quella connessione. In base al tuo livello di accesso, le connessioni possono essere create, eliminate, e le relative proprietà (protocol, hostname, port, etc.) possono essere cambiate.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Connessioni" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nome della connessione", + "TABLE_HEADER_SESSION_STARTDATE" : "Ora di inizio", + "TABLE_HEADER_SESSION_DURATION" : "Durata", + "TABLE_HEADER_SESSION_USERNAME" : "Nome utente" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Lingua dell'interfaccia:", + "FIELD_HEADER_PASSWORD" : "Password:", + "FIELD_HEADER_PASSWORD_OLD" : "Password Attuale:", + "FIELD_HEADER_PASSWORD_NEW" : "Nuova Password:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Conferma Nuova Password:", + "FIELD_HEADER_USERNAME" : "Nome utente", + + "HELP_DEFAULT_INPUT_METHOD" : "Il metodo di input predefinito determina come gli eventi della tastiera vengono ricevuti da Guacamole. La modifica di questa impostazione potrebbe essere necessaria quando si utilizza un dispositivo mobile o quando si digita un IME. Questa impostazione può essere ignorata in base alla connessione all'interno del menu Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "La modalità di emulazione del mouse predefinita determina come si comporterà il mouse remoto nelle nuove connessioni rispetto ai tocchi. Questa impostazione può essere ignorata in base alla connessione all'interno del menu Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LANGUAGE" : "Seleziona una lingua diversa di seguito per cambiare la lingua di tutto il testo all'interno di Guacamole. Le scelte disponibili dipenderanno dalle lingue installate.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Se desideri cambiare la tua password, inserisci la tua password attuale e sotto scrivi quella che desideri come nuova password, clicca \"Modifica Password\". La modifica avrà effetto immediato.", + + "INFO_PASSWORD_CHANGED" : "Password Modificata.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Metodo di immissione predefinito", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Modalità di emulazione del mouse predefinita", + "SECTION_HEADER_UPDATE_PASSWORD" : "Modifica Password" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Nuovo utente", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Fare clic o toccare un utente di seguito per gestire quell'utente. A seconda del livello di accesso, gli utenti possono essere aggiunti ed eliminati e le loro password possono essere modificate.", + + "SECTION_HEADER_USERS" : "Utenti", + + "TABLE_HEADER_USERNAME" : "Nome utente" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Termina Sessione", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Termina Sessione", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Questa pagina verrà popolata con connessioni attualmente attive. Le connessioni elencate e la possibilità di terminare tali connessioni dipende dal tuo livello di accesso. Se desideri terminare una o più sessioni, seleziona la casella accanto a quelle sessioni e fai clic su \"Termina sessione \". Terminando una sessione si disconnetterà immediatamente l'utente dalla connessione associata.", + + "INFO_NO_SESSIONS" : "Nessuna sessione attiva", + + "SECTION_HEADER_SESSIONS" : "Sessioni Attive", + + "TABLE_HEADER_SESSION_USERNAME" : "Nome utente", + "TABLE_HEADER_SESSION_STARTDATE" : "Attivo da", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Host remoto", + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nome della connessione", + + "TEXT_CONFIRM_DELETE" : "Sei sicuro di voler terminare la sessione selezionata? L'utente che sta utilizzando questa sessione sarà immediatamente disconnesso." + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/ja.json b/guacamole/src/main/frontend/src/translations/ja.json new file mode 100644 index 0000000..73a55e0 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/ja.json @@ -0,0 +1,846 @@ +{ + + "NAME" : "日本語", + + "APP" : { + + "ACTION_CANCEL" : "キャンセル", + "ACTION_CLONE" : "コピー", + "ACTION_CONTINUE" : "次へ", + "ACTION_DELETE" : "削除", + "ACTION_DELETE_SESSIONS" : "セッションの切断", + "ACTION_DOWNLOAD" : "ダウンロード", + "ACTION_LOGIN" : "ログイン", + "ACTION_LOGOUT" : "ログアウト", + "ACTION_MANAGE_CONNECTIONS" : "接続", + "ACTION_MANAGE_PREFERENCES" : "ユーザ設定", + "ACTION_MANAGE_SETTINGS" : "設定", + "ACTION_MANAGE_SESSIONS" : "アクティブなセッション", + "ACTION_MANAGE_USERS" : "ユーザ", + "ACTION_MANAGE_USER_GROUPS" : "グループ", + "ACTION_NAVIGATE_BACK" : "戻る", + "ACTION_NAVIGATE_HOME" : "ホーム", + "ACTION_SAVE" : "保存", + "ACTION_SEARCH" : "検索", + "ACTION_SHARE" : "シェア", + "ACTION_UPDATE_PASSWORD" : "パスワードの更新", + "ACTION_VIEW_HISTORY" : "履歴", + + "DIALOG_HEADER_ERROR" : "エラー", + + "ERROR_PAGE_UNAVAILABLE" : "エラーが発生したため、この操作を完了できませんでした。問題が解決しない場合は、システム管理者に連絡するか、システムログを確認してください。", + + "ERROR_PASSWORD_BLANK" : "パスワードが入力されていません。", + "ERROR_PASSWORD_MISMATCH" : "パスワードが一致しません。", + + "FIELD_HEADER_PASSWORD" : "パスワード:", + "FIELD_HEADER_PASSWORD_AGAIN" : "パスワード確認:", + + "FIELD_PLACEHOLDER_FILTER" : "フィルタ", + + "INFO_ACTIVE_USER_COUNT" : "現在以下のユーザが利用中です。 {USERS} {USERS, plural, one{user} other{users}}.", + + "TEXT_ANONYMOUS_USER" : "匿名ユーザ" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "クリア", + "ACTION_DISCONNECT" : "切断", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "再接続", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_SHOW_CLIPBOARD" : "クリックをしてコピー/カットされたテキストが表示されます。", + "ACTION_UPLOAD_FILES" : "ファイルアップロード", + + "DIALOG_HEADER_CONNECTING" : "接続", + "DIALOG_HEADER_CONNECTION_ERROR" : "接続エラー", + "DIALOG_HEADER_DISCONNECTED" : "切断", + + "ERROR_CLIENT_201": "サーバーがビジー状態のため、この接続は切断されました。数分待ってからもう一度お試しください。", + "ERROR_CLIENT_202": "リモートデスクトップの応答に時間がかかりすぎるため、Guacamoleサーバが接続を切断しました。再試行するか、システム管理者に連絡してください。", + "ERROR_CLIENT_203": "リモートデスクトップサーバーでエラーが発生し、接続を切断しました。再試行するかシステム管理者に連絡してください。", + "ERROR_CLIENT_207": "現在リモートデスクトップサーバーにアクセスできません。問題が解決しない場合、システム管理者に連絡するか、システムログを確認してください。", + "ERROR_CLIENT_208": "リモートデスクトップサーバーは現在利用できません。問題が解決しない場合、システム管理者に連絡するか、システムログを確認してください。", + "ERROR_CLIENT_209": "リモートデスクトップサーバーが他の接続と競合しています。後でもう一度やり直してください。", + "ERROR_CLIENT_20A": "リモートデスクトップサーバーが停止しているため接続を閉じました。システム管理者に連絡するか、システム設定を確認してください。", + "ERROR_CLIENT_20B": "リモートデスクトップサーバーが強制的に接続を切断しました。システム管理者に連絡するか、システムログを確認してください。", + "ERROR_CLIENT_301": "ログインに失敗しました。再接続してからもう一度お試しください。", + "ERROR_CLIENT_303": "リモートデスクトップサーバーがこの接続へのアクセスを拒否しました。アクセスが必要な場合は、システム管理者にアカウントのアクセスを許可を依頼するか、システム設定を確認してください。", + "ERROR_CLIENT_308": "ブラウザからの応答が十分でないため、Guacamoleサーバーが接続を切断しました。これは一般的にネットワークの問題が原因です。ネットワークの状態を確認して、もう一度やり直してください。 ", + "ERROR_CLIENT_31D": "同時接続の使用制限に達したため、Guacamoleサーバーはこの接続へのアクセスを拒否しています。1つ以上の接続を閉じてからやり直してください。", + "ERROR_CLIENT_DEFAULT": "Guacamoleサーバ内で内部エラーが発生し、接続が終了しました。問題が解決しない場合、システム管理者に連絡するか、システムログを確認してください。", + + "ERROR_TUNNEL_201": "アクティブな接続が多すぎるため、Guacamoleサーバーはこの接続を拒否しました。数分待ってからもう一度お試しください。", + "ERROR_TUNNEL_202": "サーバーの応答に時間がかかりすぎるため、接続が切断されました。通常はネットワーク問題によって引き起こされます。", + "ERROR_TUNNEL_203": "サーバーでエラーが発生し、接続を切断しました。再試行するかシステム管理者に連絡してください。", + "ERROR_TUNNEL_204": "指定された接続は存在しません。接続名を確認してもう一度やり直してください。", + "ERROR_TUNNEL_205": "この接続は現在使用中です。同時アクセスは許可されていません。後ほどやり直してください。", + "ERROR_TUNNEL_207": "現在Guacamoleサーバーにアクセスできません。ネットワークの状態を確認してもう一度やり直してください。", + "ERROR_TUNNEL_208": "Guacamoleサーバーは接続を受け付けていません。ネットワークの状態を確認してもう一度やり直してください。", + "ERROR_TUNNEL_301": "あなたはログインしていないため、この接続にアクセスする権限がありません。ログインしてからやり直してください。", + "ERROR_TUNNEL_303": "この接続にアクセスする権限がありません。アクセスが必要な場合は、システム管理者に許可を依頼するか、システム設定を確認してください。", + "ERROR_TUNNEL_308": "ブラウザからの応答がないため、Guacamoleサーバーが接続を切断しました。一般的にネットワークの問題が原因です。ネットワークの状態を確認して、もう一度やり直してください。 ", + "ERROR_TUNNEL_31D": "同時接続の使用制限に達したため、Guacamoleサーバーはこの接続へのアクセスを拒否しています。1つ以上の接続を閉じてからやり直してください。", + "ERROR_TUNNEL_DEFAULT": "Guacamoleサーバー内で内部エラーが発生し、接続が終了しました。問題が解決しない場合、システム管理者に連絡するか、システムログを確認してください。", + + "ERROR_UPLOAD_100": "ファイル転送がサポートされていないか有効になっていません。システム管理者に連絡するか、システムログを確認してください。", + "ERROR_UPLOAD_201": "現在転送中のファイルが多すぎます。転送が完了するのを待ってからやり直してください。", + "ERROR_UPLOAD_202": "リモートデスクトップサーバーの応答に時間がかかりすぎるため、ファイルを転送できません。やりなおすかシステム管理者に連絡してください。", + "ERROR_UPLOAD_203": "転送中にリモートデスクトップサーバーでエラーが発生しました。もう一度やり直すか、システム管理者に連絡してください。", + "ERROR_UPLOAD_204": "ファイル転送先が存在しません。宛先が存在することを確認してやり直してください。", + "ERROR_UPLOAD_205": "ファイル転送先は現在ロックされています。進行中のタスクが完了するのを待ってからやり直してください。 ", + "ERROR_UPLOAD_301": "あなたはログインしていないため、このファイルをアップロードする権限がありません。ログインしてからやり直してください。", + "ERROR_UPLOAD_303": "このファイルをアップロードする権限がありません。アクセスが必要な場合は、システム設定を確認するか、システム管理者に確認してください。", + "ERROR_UPLOAD_308": "ファイル転送が停止しています。これは一般的にネットワーク速度が非常に遅いなどのネットワークの問題が原因で発生します。", + "ERROR_UPLOAD_31D": "現在転送中のファイルが多すぎます。転送が完了するのを待ってからやり直してください。", + "ERROR_UPLOAD_DEFAULT": "Guacamoleサーバ内で内部エラーが発生し、接続が終了しました。それでも問題が解決しない場合、システム管理者に連絡するか、システムログを確認してください。", + + "HELP_CLIPBOARD": "Guacamole内でコピー/カットされたテキストがここに表示されます。以下のテキストを変更するとリモートクリップボードに影響します。 ", + "HELP_INPUT_METHOD_NONE": "入力方法は指定されていません。キーボード入力は接続された物理的なキーボードから受け付けられます。 ", + "HELP_INPUT_METHOD_OSK": "内蔵のGuacamoleオンスクリーンキーボードからの入力を表示し、受け入れます。オンスクリーンキーボードを使用すると、不可能な場合もあるキーの組み合わせを入力できます(Ctrl-Alt-Delなど)。", + "HELP_INPUT_METHOD_TEXT": "テキストの入力を許可し、入力されたテキストに基づいてキーボードイベントをエミュレートします。これはスマートフォンのような物理的なキーボードがない機器に必要です。 ", + "HELP_MOUSE_MODE": "タッチに対するリモートマウスの動作を決定します。 ", + "HELP_MOUSE_MODE_ABSOLUTE": "タッチによってクリックを行います。タッチの位置でクリックしたとみなされます。 ", + "HELP_MOUSE_MODE_RELATIVE": "マウスポインタをドラッグしてからクリックします。マウスポインタの位置でクリックしたとみなされます。 ", + "HELP_SHARE_LINK": "現在の接続は共有されており、次の{LINKS、multiple、one {link} other {links}}を持つ人なら誰でもアクセスできます:", + + "INFO_CONNECTION_SHARED": "この接続は現在共有されています。", + "INFO_NO_FILE_TRANSFERS": "ファイル転送はありません。", + + + "NAME_INPUT_METHOD_NONE" : "なし", + "NAME_INPUT_METHOD_OSK" : "オンスクリーンキーボード", + "NAME_INPUT_METHOD_TEXT" : "テキストインプット", + "NAME_MOUSE_MODE_ABSOLUTE" : "タッチスクリーン", + "NAME_MOUSE_MODE_RELATIVE" : "タッチパッド", + + "SECTION_HEADER_CLIPBOARD" : "クリップボード", + "SECTION_HEADER_DEVICES" : "デバイス", + "SECTION_HEADER_DISPLAY" : "ディスプレイ", + "SECTION_HEADER_FILE_TRANSFERS" : "ファイル転送", + "SECTION_HEADER_INPUT_METHOD" : "インプットメソッド", + "SECTION_HEADER_MOUSE_MODE" : "マウスエミュレートモード", + + "TEXT_ZOOM_AUTO_FIT" : "自動的にブラウザのサイズに合わせる", + "TEXT_CLIENT_STATUS_IDLE" : "アイドル状態.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Guacamoleサーバに接続しています...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "切断されました。", + "TEXT_CLIENT_STATUS_UNSTABLE" : "Guacamoleサーバへのネットワーク接続が不安定です。", + "TEXT_CLIENT_STATUS_WAITING" : "Guacamoleサーバに接続しました。応答を待っています", + "TEXT_RECONNECT_COUNTDOWN" : "再接続しています... {REMAINING} {REMAINING, plural, one{second} other{seconds}}..." + + }, + + "FORM" : { + + "HELP_SHOW_PASSWORD" : "パスワードを見る", + "HELP_HIDE_PASSWORD" : "パスワードを隠す" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "最近の接続情報はありません。", + + "PASSWORD_CHANGED" : "パスワードが変更されました。", + + "SECTION_HEADER_ALL_CONNECTIONS" : "全ての接続情報", + "SECTION_HEADER_RECENT_CONNECTIONS" : "最近の接続情報" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "匿名" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "不正なログインです。", + + "FIELD_HEADER_USERNAME" : "ユーザ名", + "FIELD_HEADER_PASSWORD" : "パスワード" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "接続の削除", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "ロケーション:", + "FIELD_HEADER_NAME" : "名前:", + "FIELD_HEADER_PROTOCOL" : "プロトコル:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "アクティブにする", + "INFO_CONNECTION_NOT_USED" : "この接続はまだ使用されていません。", + + "SECTION_HEADER_EDIT_CONNECTION" : "接続の編集", + "SECTION_HEADER_HISTORY" : "使用履歴", + "SECTION_HEADER_PARAMETERS" : "パラメータ", + + "TABLE_HEADER_HISTORY_USERNAME" : "ユーザ名", + "TABLE_HEADER_HISTORY_START" : "開始時間", + "TABLE_HEADER_HISTORY_DURATION" : "期間", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "接続元", + + "TEXT_CONFIRM_DELETE" : "削除した接続は元に戻せません。この接続を削除してもよろしいですか?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "接続グループの削除", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "ロケーション:", + "FIELD_HEADER_NAME" : "名前:", + "FIELD_HEADER_TYPE" : "タイプ:", + + "NAME_TYPE_BALANCING" : "バランシング", + "NAME_TYPE_ORGANIZATIONAL" : "組織", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "接続グループの編集", + + "TEXT_CONFIRM_DELETE" : "接続グループを削除した後に復元することはできません。この接続グループを削除してもよろしいですか?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "共有プロファイルの削除", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "名前:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "プライマリ接続:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "共有プロファイルの編集", + "SECTION_HEADER_PARAMETERS" : "パラメータ", + + "TEXT_CONFIRM_DELETE" : "削除した共有プロファイルは復元できません。この共有プロファイルを削除してもよろしいですか?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "ユーザ削除", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "システム管理者:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "自身のパスワードの変更:", + "FIELD_HEADER_CREATE_NEW_USERS" : "ユーザの作成:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "ユーザグループの作成:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "接続の作成:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "接続グループの作成:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "共有プロファイルの作成:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "ログインの無効化:", + "FIELD_HEADER_USERNAME" : "ユーザ名:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "このユーザーは現在どのグループにも属していません。このセクションを展開してグループを追加してください。", + + "INFO_READ_ONLY" : "このユーザは編集できません。", + "INFO_NO_USER_GROUPS_AVAILABLE" : "利用可能なグループがありません。", + + "SECTION_HEADER_ALL_CONNECTIONS" : "すべての接続", + "SECTION_HEADER_CONNECTIONS" : "接続", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "現在の接続", + "SECTION_HEADER_EDIT_USER" : "ユーザの編集", + "SECTION_HEADER_PERMISSIONS" : "権限", + "SECTION_HEADER_USER_GROUPS" : "グループ", + + "TEXT_CONFIRM_DELETE" : "削除したユーザーは元に戻せません。このユーザーを削除してもよろしいですか?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "グループの削除", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "グループの無効化:", + "FIELD_HEADER_USER_GROUP_NAME" : "グループ名:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "このグループは現在どのグループにも属していません。グループを追加するにはこのセクションを展開してください。", + "HELP_NO_MEMBER_USER_GROUPS" : "このグループには現在グループが含まれていません。このセクションを展開してグループを追加してください。", + "HELP_NO_MEMBER_USERS" : "このグループには現在ユーザーが含まれていません。ユーザーを追加するにはこのセクションを展開してください。", + + "INFO_READ_ONLY" : "このグループは編集できません", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "利用可能なユーザがいません。", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "グループ編集", + "SECTION_HEADER_MEMBER_USERS" : "メンバーユーザ", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "メンバーグループ", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "親グループ", + + "TEXT_CONFIRM_DELETE" : "削除したグループは復元できません。このグループを削除してもよろしいですか?" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Backspaceキーの送信:", + "FIELD_HEADER_CA_CERT" : "認証局証明書:", + "FIELD_HEADER_CLIENT_CERT" : "クライアント証明書:", + "FIELD_HEADER_CLIENT_KEY" : "クライアントの秘密鍵:", + "FIELD_HEADER_COLOR_SCHEME" : "カラースキーマ:", + "FIELD_HEADER_CONTAINER" : "コンテナ名:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "ログの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "タイプスクリプトの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_DISABLE_COPY" : "端末からのコピーを無効化:", + "FIELD_HEADER_DISABLE_PASTE" : "クライアントからの貼り付けを無効化:", + "FIELD_HEADER_FONT_NAME" : "フォント名:", + "FIELD_HEADER_FONT_SIZE" : "フォントサイズ:", + "FIELD_HEADER_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_IGNORE_CERT" : "サーバ証明書を無視:", + "FIELD_HEADER_NAMESPACE" : "名前空間:", + "FIELD_HEADER_POD" : "ポッド名:", + "FIELD_HEADER_PORT" : "ポート:", + "FIELD_HEADER_READ_ONLY" : "読み取り専用:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "マウス動作の除外:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "画像/ストリームの除外:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "キーイベントの取得:", + "FIELD_HEADER_RECORDING_NAME" : "ログファイル名:", + "FIELD_HEADER_RECORDING_PATH" : "ログ保存ディレクトリ:", + "FIELD_HEADER_SCROLLBACK" : "スクロールバックサイズの最大値:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "タイプスクリプト名:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "タイプスクリプトの保存ディレクトリ:", + "FIELD_HEADER_USE_SSL" : "SSL/TLS の利用", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "認証", + "SECTION_HEADER_BEHAVIOR" : "ターミナルのふるまい", + "SECTION_HEADER_CLIPBOARD" : "クリップボード", + "SECTION_HEADER_CONTAINER" : "コンテナ", + "SECTION_HEADER_DISPLAY" : "ディスプレイ", + "SECTION_HEADER_RECORDING" : "スクリーンレコーディング", + "SECTION_HEADER_TYPESCRIPT" : "タイプスクリプト (テキストの記録)", + "SECTION_HEADER_NETWORK" : "ネットワーク" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "クライアント名:", + "FIELD_HEADER_COLOR_DEPTH" : "カラー深度:", + "FIELD_HEADER_CONSOLE" : "管理者コンソール:", + "FIELD_HEADER_CONSOLE_AUDIO" : "コンソールでの音声サポート:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "ドライブの自動作成:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "ログの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_DISABLE_AUDIO" : "オーディオの無効化:", + "FIELD_HEADER_DISABLE_AUTH" : "認証の無効化:", + "FIELD_HEADER_DISABLE_COPY" : "リモートデスクトップからのコピーを無効化:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "ファイルのダウンロードを無効化:", + "FIELD_HEADER_DISABLE_PASTE" : "クライアントからの貼り付けを無効化:", + "FIELD_HEADER_DISABLE_UPLOAD" : "ファイルのアップロードを無効化:", + "FIELD_HEADER_DOMAIN" : "ドメイン:", + "FIELD_HEADER_DPI" : "解像度 (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "ドライブ名:", + "FIELD_HEADER_DRIVE_PATH" : "ドライブパス:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "入力オーディオ(マイク)の有効化:", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "デスクトップコンポジション(Aero)の有効化:", + "FIELD_HEADER_ENABLE_DRIVE" : "ドライブの有効化:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "クリアタイプフォントの有効化:", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "フルウィンドウドラッグの有効化:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "メニューアニメーションの有効化:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "ビットマップキャッシュの無効化:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "オフスクリーンキャッシュの無効化:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "グリフキャッシュの無効化:", + "FIELD_HEADER_ENABLE_PRINTING" : "印刷の有効化:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTPの有効化:", + "FIELD_HEADER_ENABLE_THEMING" : "テーマの有効化:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "壁紙の有効化:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "ドメイン:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "パスワード:", + "FIELD_HEADER_GATEWAY_PORT" : "ポート:", + "FIELD_HEADER_GATEWAY_USERNAME" : "ユーザ名:", + "FIELD_HEADER_HEIGHT" : "高さ:", + "FIELD_HEADER_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_IGNORE_CERT" : "サーバ証明書を無視する:", + "FIELD_HEADER_INITIAL_PROGRAM" : "初期化プログラム:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "ロードバランス情報/クッキー:", + "FIELD_HEADER_PASSWORD" : "パスワード:", + "FIELD_HEADER_PORT" : "ポート:", + "FIELD_HEADER_PRINTER_NAME" : "リダイレクトされたプリンタ名:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "事前接続BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDPソースID:", + "FIELD_HEADER_READ_ONLY" : "読み取り専用:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "マウス動作の除外:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "画像/ストリームの除外:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "キーイベントの取得:", + "FIELD_HEADER_RECORDING_NAME" : "ログファイル名:", + "FIELD_HEADER_RECORDING_PATH" : "ログ保存ディレクトリ:", + "FIELD_HEADER_RESIZE_METHOD" : "サイズ変更方法:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "パラメータ:", + "FIELD_HEADER_REMOTE_APP_DIR" : "作業ディレクトリ:", + "FIELD_HEADER_REMOTE_APP" : "プログラム:", + "FIELD_HEADER_SECURITY" : "セキュリティモード:", + "FIELD_HEADER_SERVER_LAYOUT" : "キーボードレイアウト:", + "FIELD_HEADER_SFTP_DIRECTORY" : "デフォルトアップロードディレクトリ:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "ファイルのダウンロードを無効化:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "ファイルのアップロードを無効化:", + "FIELD_HEADER_SFTP_HOST_KEY" : "パブリックホストキー (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTPキープアライブ間隔:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "パスフレーズ:", + "FIELD_HEADER_SFTP_PASSWORD" : "パスワード:", + "FIELD_HEADER_SFTP_PORT" : "ポート:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "秘密鍵:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "ファイルブラウザのルートディレクトリ:", + "FIELD_HEADER_SFTP_USERNAME" : "ユーザ名:", + "FIELD_HEADER_STATIC_CHANNELS" : "静的チャンネル名:", + "FIELD_HEADER_TIMEZONE" : "タイムゾーン:", + "FIELD_HEADER_USERNAME" : "ユーザ名:", + "FIELD_HEADER_WIDTH" : "幅:", + + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoLパケットを送信するブロードキャストアドレス:", + "FIELD_HEADER_WOL_MAC_ADDR" : "WoLパケットで使用するMACアドレス:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoLパケットの送信を有効化:", + "FIELD_HEADER_WOL_WAIT_TIME" : "WoLパケット送信後の接続までの待機時間:", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Lowカラー (16ビット)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Trueカラー (24ビット)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Trueカラー (32ビット)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256カラー", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"ディスプレイアップデート\" 仮想チャンネル (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "再接続", + + "SECTION_HEADER_AUTHENTICATION" : "認証", + "SECTION_HEADER_BASIC_PARAMETERS" : "基本設定", + "SECTION_HEADER_CLIPBOARD" : "クリップボード", + "SECTION_HEADER_DEVICE_REDIRECTION" : "デバイスリダイレクト", + "SECTION_HEADER_DISPLAY" : "ディスプレイ", + "SECTION_HEADER_GATEWAY" : "リモートデスクトップゲートウェイ", + "SECTION_HEADER_LOAD_BALANCING" : "ロードバラシング", + "SECTION_HEADER_NETWORK" : "ネットワーク", + "SECTION_HEADER_PERFORMANCE" : "パフォーマンス", + "SECTION_HEADER_PRECONNECTION_PDU" : "事前接続 PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "スクリーンレコーディング", + "SECTION_HEADER_REMOTEAPP" : "リモートアプリケーション" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Backspaceキーの送信:", + "FIELD_HEADER_COLOR_SCHEME" : "カラースキーマ:", + "FIELD_HEADER_COMMAND" : "コマンドの実行:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "ログの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "タイプスクリプトの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_DISABLE_COPY" : "端末からのコピーを無効化:", + "FIELD_HEADER_DISABLE_PASTE" : "クライアントからの貼り付けを無効化:", + "FIELD_HEADER_FONT_NAME" : "フォント名:", + "FIELD_HEADER_FONT_SIZE" : "フォントサイズ:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTPの有効化:", + "FIELD_HEADER_HOST_KEY" : "公開鍵(Base64):", + "FIELD_HEADER_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_LOCALE" : "言語/ロケール ($LANG):", + "FIELD_HEADER_USERNAME" : "ユーザ名:", + "FIELD_HEADER_PASSWORD" : "パスワード:", + "FIELD_HEADER_PASSPHRASE" : "パスフレーズ:", + "FIELD_HEADER_PORT" : "ポート:", + "FIELD_HEADER_PRIVATE_KEY" : "秘密鍵:", + "FIELD_HEADER_SCROLLBACK" : "スクロールバックサイズの最大値:", + "FIELD_HEADER_READ_ONLY" : "読み取り専用:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "マウス動作の除外:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "画像/ストリームの除外:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "キーイベントの取得:", + "FIELD_HEADER_RECORDING_NAME" : "ログファイル名:", + "FIELD_HEADER_RECORDING_PATH" : "ログ保存ディレクトリ", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "キープアライブ間隔:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "ファイルのダウンロードを無効化:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "ファイルのアップロードを無効化:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "ファイルブラウザのルートディレクトリ:", + "FIELD_HEADER_TERMINAL_TYPE" : "ターミナルタイプ:", + "FIELD_HEADER_TIMEZONE" : "タイムゾーン ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "タイプスクリプト名:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "タイプスクリプトの保存ディレクトリ:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoLパケットを送信するブロードキャストアドレス:", + "FIELD_HEADER_WOL_MAC_ADDR" : "WoLパケットで使用するMACアドレス:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoLパケットの送信を有効化:", + "FIELD_HEADER_WOL_WAIT_TIME" : "WoLパケット送信後の接続までの待機時間:", + + "SECTION_HEADER_AUTHENTICATION" : "認証", + "SECTION_HEADER_BEHAVIOR" : "ターミナルのふるまい", + "SECTION_HEADER_CLIPBOARD" : "クリップボード", + "SECTION_HEADER_DISPLAY" : "ディスプレイ", + "SECTION_HEADER_NETWORK" : "ネットワーク", + "SECTION_HEADER_RECORDING" : "スクリーンレコーディング", + "SECTION_HEADER_SESSION" : "セッション / 環境", + "SECTION_HEADER_TYPESCRIPT" : "タイプスクリプト (テキストの記録)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Backspaceキーの送信:", + "FIELD_HEADER_COLOR_SCHEME" : "カラースキーマ:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "ログの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "タイプスクリプトの保存ディレクトリを自動的に作成する:", + "FIELD_HEADER_DISABLE_COPY" : "端末からのコピーを無効化:", + "FIELD_HEADER_DISABLE_PASTE" : "クライアントからの貼り付けを無効化:", + "FIELD_HEADER_FONT_NAME" : "フォント名:", + "FIELD_HEADER_FONT_SIZE" : "フォントサイズ:", + "FIELD_HEADER_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "ログイン失敗正規表現:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "ログイン成功正規表現:", + "FIELD_HEADER_USERNAME" : "ユーザ名:", + "FIELD_HEADER_USERNAME_REGEX" : "ユーザ名正規表現:", + "FIELD_HEADER_PASSWORD" : "パスワード:", + "FIELD_HEADER_PASSWORD_REGEX" : "パスワード正規表現:", + "FIELD_HEADER_PORT" : "ポート:", + "FIELD_HEADER_READ_ONLY" : "読み取り専用:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "マウス動作の除外:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "画像/ストリームの除外:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "キーイベントの取得:", + "FIELD_HEADER_RECORDING_NAME" : "ログファイル名:", + "FIELD_HEADER_RECORDING_PATH" : "ログ保存ディレクトリ:", + "FIELD_HEADER_SCROLLBACK" : "スクロールバックサイズの最大値:", + "FIELD_HEADER_TERMINAL_TYPE" : "ターミナルタイプ:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "タイプスクリプト名:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "タイプスクリプト保存ディレクトリ:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoLパケットを送信するブロードキャストアドレス:", + "FIELD_HEADER_WOL_MAC_ADDR" : "WoLパケットで使用するMACアドレス:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoLパケットの送信を有効化:", + "FIELD_HEADER_WOL_WAIT_TIME" : "WoLパケット送信後の接続までの待機時間:", + + "SECTION_HEADER_AUTHENTICATION" : "認証", + "SECTION_HEADER_BEHAVIOR" : "ターミナルのふるまい", + "SECTION_HEADER_CLIPBOARD" : "クリップボード", + "SECTION_HEADER_DISPLAY" : "ディスプレイ", + "SECTION_HEADER_RECORDING" : "スクリーンレコーディング", + "SECTION_HEADER_TYPESCRIPT" : "タイプスクリプト (テキストの記録)", + "SECTION_HEADER_NETWORK" : "ネットワーク" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "オーディオサーバ名:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "エンコード:", + "FIELD_HEADER_COLOR_DEPTH" : "カラー深度:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "ログの保存ディレクトリを自動的に作成する::", + "FIELD_HEADER_CURSOR" : "カーソル:", + "FIELD_HEADER_DEST_HOST" : "宛先ホスト:", + "FIELD_HEADER_DEST_PORT" : "宛先ポート:", + "FIELD_HEADER_DISABLE_COPY" : "リモートデスクトップからのコピーを無効化:", + "FIELD_HEADER_DISABLE_PASTE" : "クライアントからの貼り付けを無効化:", + "FIELD_HEADER_ENABLE_AUDIO" : "オーディオの有効化:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTPの有効化:", + "FIELD_HEADER_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_USERNAME" : "ユーザ名:", + "FIELD_HEADER_PASSWORD" : "パスワード:", + "FIELD_HEADER_PORT" : "ポート:", + "FIELD_HEADER_READ_ONLY" : "読み取り専用:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "マウス動作の除外:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "画像/ストリームの除外:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "キーイベントの取得:", + "FIELD_HEADER_RECORDING_NAME" : "ログファイル名:", + "FIELD_HEADER_RECORDING_PATH" : "ログ保存ディレクトリ:", + "FIELD_HEADER_SFTP_DIRECTORY" : "デフォルトアップロードディレクトリ:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "ファイルのダウンロードを無効化:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "ファイルのアップロードを無効化:", + "FIELD_HEADER_SFTP_HOST_KEY" : "公開鍵 (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "ホスト名:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTPキープアライブ間隔:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "パスフレーズ:", + "FIELD_HEADER_SFTP_PASSWORD" : "パスワード:", + "FIELD_HEADER_SFTP_PORT" : "ポート:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "秘密鍵:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "ファイルブラウザのルートディレクトリ:", + "FIELD_HEADER_SFTP_USERNAME" : "ユーザ名:", + "FIELD_HEADER_SWAP_RED_BLUE" : "レッド・ブルー コンポーネントスワップ:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoLパケットを送信するブロードキャストアドレス:", + "FIELD_HEADER_WOL_MAC_ADDR" : "WoLパケットで使用するMACアドレス:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoLパケットの送信を有効化:", + "FIELD_HEADER_WOL_WAIT_TIME" : "WoLパケット送信後の接続までの待機時間:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256カラー", + "FIELD_OPTION_COLOR_DEPTH_16" : "Lowカラー (16ビット)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Trueカラー (24ビット)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Trueカラー (32ビット)", + + "FIELD_OPTION_CURSOR_LOCAL" : "ローカル", + "FIELD_OPTION_CURSOR_REMOTE" : "リモート", + + "SECTION_HEADER_AUDIO" : "オーティオ", + "SECTION_HEADER_AUTHENTICATION" : "認証", + "SECTION_HEADER_CLIPBOARD" : "クリップボード", + "SECTION_HEADER_DISPLAY" : "ディスプレイ", + "SECTION_HEADER_NETWORK" : "ネットワーク", + "SECTION_HEADER_RECORDING" : "スクリーンレコーディング", + "SECTION_HEADER_REPEATER" : "VNCリピーター" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "設定" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "過去の接続履歴はここに表示されています。列の見出しをクリックしてソートすることができます。特定のレコードを検索するにはフィルタに検索キーワードを入力して、検索ボタンをクリックしてください。", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "一致するレコードがありません。", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "接続名", + "TABLE_HEADER_SESSION_DURATION" : "期間", + "TABLE_HEADER_SESSION_REMOTEHOST" : "接続元", + "TABLE_HEADER_SESSION_STARTDATE" : "開始時間", + "TABLE_HEADER_SESSION_USERNAME" : "ユーザ名", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "接続の追加", + "ACTION_NEW_CONNECTION_GROUP" : "グループの追加", + "ACTION_NEW_SHARING_PROFILE" : "共有プロファイルの追加", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "接続をクリックまたはタップすることで、管理画面が表示されます。権限に応じて接続のプロパティが変更できます。", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "接続" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "表示言語:", + "FIELD_HEADER_PASSWORD" : "パスワード:", + "FIELD_HEADER_PASSWORD_OLD" : "現在のパスワード:", + "FIELD_HEADER_PASSWORD_NEW" : "新しいパスワード:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "新しいパスワード(確認):", + "FIELD_HEADER_TIMEZONE" : "タイムゾーン:", + "FIELD_HEADER_USERNAME" : "ユーザ名:", + + "HELP_DEFAULT_INPUT_METHOD" : "デフォルトの入力メソッドは、Guacamoleがどのようにキーボード入力を受け取るかを設定します。この設定の変更は、モバイルデバイスまたはIMEを通して入力を行う際に必要です。", + "HELP_DEFAULT_MOUSE_MODE" : "デフォルトのマウスエミュレーションモードは、タッチに関して新しい接続でリモートマウスがどのように動作するかを決定します。この設定は、Guacamoleメニュー内で接続ごとに上書きすることができます。", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Guacamoleの言語を変更するには、下の言語を選択してください。選択可能な言語は、インストールされている言語によって異なります。", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "パスワードを変更する場合は、下に現在のパスワードと新しいパスワードを入力して、[パスワードの更新]をクリックしてください。変更はすぐに有効になります。", + + "INFO_PASSWORD_CHANGED" : "パスワードが変更されました。", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "デフォルトの入力方法", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "デフォルトのマウスエミュレーションモード", + "SECTION_HEADER_UPDATE_PASSWORD" : "パスワード変更" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "ユーザ追加", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "ユーザをクリックまたはタップすることで、ユーザを管理できます。権限に応じてユーザ情報の変更を行うことができます。", + + "SECTION_HEADER_USERS" : "ユーザ", + + "TABLE_HEADER_FULL_NAME" : "フルネーム", + "TABLE_HEADER_LAST_ACTIVE" : "最後にアクティブになった時期", + "TABLE_HEADER_ORGANIZATION" : "組織", + "TABLE_HEADER_USERNAME" : "ユーザ名" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "グループ追加", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "グループをクリックまたはタップすることで、グループを管理できます。権限に応じてグループ情報の変更を行うことができます。", + + "SECTION_HEADER_USER_GROUPS" : "グループ", + + "TABLE_HEADER_USER_GROUP_NAME" : "グループ名" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "強制切断", + + "DIALOG_HEADER_CONFIRM_DELETE" : "セッションの強制切断", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Guacamoleのアクティブなセッションが全て表示されています。 もしセッションを強制切断したい場合、 チェックボックスにチェックを入れて、強制切断ボタンをクリックしてください。", + + "INFO_NO_SESSIONS" : "アクティブセッションはありません", + + "SECTION_HEADER_SESSIONS" : "アクティブセッション", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "接続名", + "TABLE_HEADER_SESSION_REMOTEHOST" : "接続元", + "TABLE_HEADER_SESSION_USERNAME" : "ユーザ名", + + "TEXT_CONFIRM_DELETE" : "選択したすべてのセッションを強制終了しますか?これらのセッションを使用しているユーザーは直ちに切断されます。" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "メールアドレス:", + "FIELD_HEADER_GUAC_FULL_NAME" : "名前:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "組織:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "役職/役割:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/ko.json b/guacamole/src/main/frontend/src/translations/ko.json new file mode 100644 index 0000000..e5c4da5 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/ko.json @@ -0,0 +1,997 @@ +{ + + "NAME" : "한국어", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "확인", + "ACTION_CANCEL" : "취소", + "ACTION_CLONE" : "복제", + "ACTION_CONTINUE" : "계속", + "ACTION_DELETE" : "삭제", + "ACTION_DELETE_SESSIONS" : "세션 종료", + "ACTION_DOWNLOAD" : "다운로드", + "ACTION_LOGIN" : "로그인", + "ACTION_LOGOUT" : "로그아웃", + "ACTION_MANAGE_CONNECTIONS" : "연결", + "ACTION_MANAGE_PREFERENCES" : "기본 설정", + "ACTION_MANAGE_SETTINGS" : "세팅", + "ACTION_MANAGE_SESSIONS" : "활성화된 세션", + "ACTION_MANAGE_USERS" : "사용자", + "ACTION_MANAGE_USER_GROUPS" : "그룹", + "ACTION_NAVIGATE_BACK" : "뒤로가기", + "ACTION_NAVIGATE_HOME" : "홈", + "ACTION_SAVE" : "저장", + "ACTION_SEARCH" : "검색", + "ACTION_SHARE" : "공유", + "ACTION_UPDATE_PASSWORD" : "패스워드 업데이트", + "ACTION_VIEW_HISTORY" : "히스토리", + + "DIALOG_HEADER_ERROR" : "에러", + + "ERROR_PAGE_UNAVAILABLE" : "에러가 발생해 동작이 완료될 수 없습니다. 문제가 계속되면, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + "ERROR_PASSWORD_BLANK" : "패스워드는 공백이 될 수 없습니다.", + "ERROR_PASSWORD_MISMATCH" : "패스워드가 일치하지 않습니다.", + + "FIELD_HEADER_PASSWORD" : "패스워드:", + "FIELD_HEADER_PASSWORD_AGAIN" : "패스워드 재입력:", + + "FIELD_PLACEHOLDER_FILTER" : "필터", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "현재 {USERS} 사용자에 의해 사용중입니다.}.", + + "TEXT_ANONYMOUS_USER" : "익명", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{초} minute{분} hour{시} day{일} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "지우기", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "연결 해제", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "다시 연결", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_UPLOAD_FILES" : "파일 업로드", + + "DIALOG_HEADER_CONNECTING" : "연결 중", + "DIALOG_HEADER_CONNECTION_ERROR" : "연결 오류", + "DIALOG_HEADER_DISCONNECTED" : "연결 끊김", + + "ERROR_CLIENT_201" : "서버 사용량이 많아 연결이 종료되었습니다. 몇 분 후에 다시 시도하십시요.", + "ERROR_CLIENT_202" : "원격 데스크톱이 응답하는데 너무 오래걸려서 Guacamole 서버가 연결을 닫았습니다. 다시 시도하거나 시스템 관리자에게 문의하십시오.", + "ERROR_CLIENT_203" : "원격 데스크톱 서버에 오류가 발생해서 연결을 닫았습니다. 다시 시도하거나 시스템 관리자에게 문의하십시오.", + "ERROR_CLIENT_207" : "원격 데스크톱 서버에 현재 연결할 수 없습니다. 문제가 지속되면, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + "ERROR_CLIENT_208" : "원격 데스크톱 서버를 현재 사용 할 수 없습니다. 문제가 지속되면, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + "ERROR_CLIENT_209" : "다른 연결과 충돌해서 원격 데스크톱 서버가 연결을 닫았습니다. 나중에 다시 시도하십시오.", + "ERROR_CLIENT_20A" : "원격 데스크톱이 비활성화 상태로 보이기 때문에 서버 연결을 닫았습니다. 원치 않거나 예기치 않은 경우, 시스템 관리자에게 문의하거나 시스템 세팅을 확인하십시오.", + "ERROR_CLIENT_20B" : "원격 데스크톱 서버가 강제로 연결을 끊었습니다. 원치 않거나 예기치 않은 경우, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + "ERROR_CLIENT_301" : "로그인이 실패했습니다. 다시 연결한 다음 다시 시도하십시오", + "ERROR_CLIENT_303" : "원격 데스크톱 서버가 이 연결에 대한 액세스를 거부했습니다. 액세스 권한이 필요하면, 시스템 관리자에게 계정 액세스 권한을 부여하도록 요청하거나 시스템 설정을 확인하십시오.", + "ERROR_CLIENT_308" : "브라우저에서 연결이 끊긴 것처럼 보일 정도로 오랫동안 응답이 없었기 때문에 Guacamole 서버가 연결을 닫았습니다. 이는 보통 불안정한 무선 신호나 단지 네트워크의 느린 속도같은 네트워크 문제로 일어납니다. 네트워크 상태를 확인 후에 다시 시도 하십시오.", + "ERROR_CLIENT_31D" : "개별 사용자의 동시 연결 사용 제한을 초과했기 때문에 Guacamole 서버가 이 연결에 대한 액세스를 거부했습니다. 하나 이상의 연결을 닫고 다시 시도 하십시오.", + "ERROR_CLIENT_DEFAULT" : "Guacamole 서버 내에서 내부 오류가 발생해서 연결이 종료되었습니다. 문제가 지속되면, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + + "ERROR_TUNNEL_201" : "활성 연결이 너무 많기 때문에 Guacamole 서버에서 이 연결 시도를 거부했습니다. 잠시 후에 다시 시도하십시오", + "ERROR_TUNNEL_202" : "서버 응답시간이 너무 길어 연결을 닫았습니다. 이것은 보통 불안정한 무선 신호나, 네트워크의 느린 속도같은 네트워크의 문제입니다. 네트워크 연결을 확인해 주시거나 시스템 관리자에게 문의하십시오.", + "ERROR_TUNNEL_203" : "서버에 오류가 발생해서 연결을 닫았습니다. 다시 시도하거나 시스템 관리자에게 문의하십시오.", + "ERROR_TUNNEL_204" : "요청한 연결이 존재하지 않습니다. 연결 이름을 확인하고 다시 시도하십시오", + "ERROR_TUNNEL_205" : "이 연결은 현재 사용 중이며 이 연결에 대한 동시 액세스가 허용되지 않습니다. 나중에 다시 시도하십시오.", + "ERROR_TUNNEL_207" : "Guacamole 서버에 현재 접근할 수 없습니다. 네트워크 상태를 확인 후에 다시 시도하십시오.", + "ERROR_TUNNEL_208" : "Guacamole 서버가 연결을 허용하지 않습니다. 네트워크 상태를 확인 후에 다시 시도하십시오.", + "ERROR_TUNNEL_301" : "로그인하지 않았기 때문에, 이 연결에 접근할 수 있는 권한이 없습니다. 로그인 후에 다시 시도하십시오.", + "ERROR_TUNNEL_303" : "이 연결에 접근할 수 있는 권한이 없습니다. 접근 권한이 필요하다면, 허가 사용자 목록에 당신을 추가하도록 시스템 관리자에게 요청하거나 시스템 설정을 확인하십시오.", + "ERROR_TUNNEL_308" : "브라우저에서 연결이 끊긴 것처럼 보일 정도로 오랫동안 응답이 없었기 때문에 Guacamole server가 연결을 닫았습니다. 이는 보통 불안정한 무선 신호나 단지 네트워크의 느린 속도같은 네트워크 문제로 일어납니다. 네트워크 상태를 확인 후에 다시 시도 하십시오", + "ERROR_TUNNEL_31D" : "개별 사용자의 동시 연결 사용 제한을 초과했기 때문에 Guacamole server가 이 연결에 대한 액세스를 거부하고 있습니다. 하나 이상의 연결을 닫고 다시 시도하십시오.", + "ERROR_TUNNEL_DEFAULT" : "Guacamole 서버 내에서 내부 오류가 발생해서 연결이 종료되었습니다. 문제가 지속되면, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "ERROR_UPLOAD_100" : "파일 전송이 지원되지 않거나 활성화되지 않았습니다. 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + "ERROR_UPLOAD_201" : "현재 너무 많은 파일이 전송되고 있습니다. 기존 전송이 완료될 때까지 기다린 후 다시 시도하십시오.", + "ERROR_UPLOAD_202" : "원격 데스크톱 서버가 응답하는 데 너무 오래 걸리기 때문에 파일을 전송할 수 없습니다. 다시 시도하거나 시스템 관리자에게 문의하십시오.", + "ERROR_UPLOAD_203" : "전송하는 동안 원격 데스크톱 서버에 오류가 발생했습니다. 다시 시도하거나 시스템 관리자에게 문의하십시오.", + "ERROR_UPLOAD_204" : "파일 전송 대상이 없습니다. 대상이 있는지 확인하고 다시 시도하십시오.", + "ERROR_UPLOAD_205" : "파일 전송 대상이 현재 잠겨 있습니다. 진행 중인 작업이 완료될 때까지 기다린 후 다시 시도하십시오.", + "ERROR_UPLOAD_301" : "로그인하지 않았기 때문에 이 파일을 업로드할 권한이 없습니다. 로그인 한 후 다시 시도하십시오.", + "ERROR_UPLOAD_303" : "이 파일을 업로드 할 권한이 없습니다. 액세스가 필요한 경우 시스템 설정을 확인하거나 시스템 관리자에게 확인하십시오.", + "ERROR_UPLOAD_308" : "파일 전송이 중단되었습니다. 이는 일반적으로 무선 신호가 불안정하거나 네트워크 속도가 매우 느린 것과 같은 네트워크 문제로 인해 발생합니다. 네트워크를 확인하고 다시 시도하십시오.", + "ERROR_UPLOAD_31D" : "현재 너무 많은 파일이 전송되고 있습니다. 기존 전송이 완료될 때까지 기다린 후 다시 시도하십시오.", + "ERROR_UPLOAD_DEFAULT" : "Guacamole 서버 내에서 내부 오류가 발생해서 연결이 종료되었습니다. 문제가 지속되면, 시스템 관리자에게 문의하거나 시스템 로그를 확인하십시오.", + + + "HELP_CLIPBOARD" : "Guacamole에서 복사하거나 잘라낸 텍스트가 여기에 표시됩니다. 텍스트 변경 사항은 원격 클립보드에 직접 적용됩니다.", + "HELP_INPUT_METHOD_NONE" : "사용중인 입력 방법이 없습니다. 키보드 입력은 연결된 물리적 키보드에서 받아들여집니다.", + "HELP_INPUT_METHOD_OSK" : "내장된 Guacamole 화상 키보드의 입력을 표시하고 허용합니다. 화상 키보드는 다른 방법으로는 불가능할 수 있는 키 조합을 입력할 수 있습니다. (Ctrl-Alt-Del 등)", + "HELP_INPUT_METHOD_TEXT" : "텍스트 입력을 허용하고, 입력된 텍스트를 바탕으로 키보드 이벤트를 에뮬레이트 합니다. 이것은 물리적 키보드가 없는 휴대폰과 같은 장치에 필요합니다.", + "HELP_MOUSE_MODE" : "터치와 관련하여 원격 마우스가 어떻게 동작하는지 결정합니다.", + "HELP_MOUSE_MODE_ABSOLUTE" : "탭하여 클릭합니다. 클릭은 터치 위치에서 발생합니다.", + "HELP_MOUSE_MODE_RELATIVE" : "드래그하여 마우스 포인터를 움직이고 탭하여 클릭합니다. 클릭은 마우스 포인터 위치에서 발생합니다.", + "HELP_SHARE_LINK" : "현재 연결이 공유되고 있으며, 다음 링크를 가진 사람이라면 누구나 접근할 수 있습니다:", + "INFO_CONNECTION_SHARED" : "이 연결은 이제 공유됩니다.", + "INFO_NO_FILE_TRANSFERS" : "파일 전송이 없습니다.", + + "NAME_INPUT_METHOD_NONE" : "없음", + "NAME_INPUT_METHOD_OSK" : "화상 키보드", + "NAME_INPUT_METHOD_TEXT" : "텍스트 입력", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "터치 스크린", + "NAME_MOUSE_MODE_RELATIVE" : "터치 패드", + + "SECTION_HEADER_CLIPBOARD" : "클립보드", + "SECTION_HEADER_DEVICES" : "장치", + "SECTION_HEADER_DISPLAY" : "디스플레이", + "SECTION_HEADER_FILE_TRANSFERS" : "파일 전송", + "SECTION_HEADER_INPUT_METHOD" : "입력 방법", + "SECTION_HEADER_MOUSE_MODE" : "마우스 에뮬레이션 모드", + + "TEXT_ZOOM_AUTO_FIT" : "브라우저 창에 자동으로 맞춤", + "TEXT_CLIENT_STATUS_IDLE" : "유휴 상태.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Guacamole에 연결 중...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "연결이 끊어졌습니다.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "Guacamole 서버에 대한 네트워크 연결이 불안정합니다.", + "TEXT_CLIENT_STATUS_WAITING" : "Guacamole에 연결됐습니다. 응답을 기다리는 중...", + "TEXT_RECONNECT_COUNTDOWN" : "다시 연결하는 중 {REMAINING}초...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}" + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "숨기기", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "표시", + + "FIELD_HEADER_BACKGROUND" : "배경색", + "FIELD_HEADER_FOREGROUND" : "전경색", + + "FIELD_OPTION_CUSTOM" : "사용자 지정...", + + "SECTION_HEADER_DETAILS" : "세부 정보:" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "기본 (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "클릭하여 패스워드 표시", + "HELP_HIDE_PASSWORD" : "클릭하여 패스워드 숨기기" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "최근 연결이 없습니다.", + + "PASSWORD_CHANGED" : "패스워드가 변경되었습니다.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "모든 연결", + "SECTION_HEADER_RECENT_CONNECTIONS" : "최근 연결" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "익명" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "잘못된 로그인", + + "FIELD_HEADER_USERNAME" : "사용자 이름", + "FIELD_HEADER_PASSWORD" : "패스워드" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "연결 삭제", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "위치:", + "FIELD_HEADER_NAME" : "이름:", + "FIELD_HEADER_PROTOCOL" : "프로토콜:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "현재 활성화", + "INFO_CONNECTION_NOT_USED" : "이 연결은 아직 사용되지 않았습니다.", + + "SECTION_HEADER_EDIT_CONNECTION" : "연결 편집", + "SECTION_HEADER_HISTORY" : "사용 기록", + "SECTION_HEADER_PARAMETERS" : "매개변수", + "TABLE_HEADER_HISTORY_USERNAME" : "사용자 이름", + "TABLE_HEADER_HISTORY_START" : "시작 시간", + "TABLE_HEADER_HISTORY_DURATION" : "기간", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "원격 호스트", + + "TEXT_CONFIRM_DELETE" : "연결을 삭제한 후에는 복원할 수 없습니다. 이 연결을 삭제하겠습니까?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "연결 그룹 삭제", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "위치:", + "FIELD_HEADER_NAME" : "이름:", + "FIELD_HEADER_TYPE" : "타입:", + + "NAME_TYPE_BALANCING" : "부하 분산", + "NAME_TYPE_ORGANIZATIONAL" : "조직", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "연결 그룹 편집", + + "TEXT_CONFIRM_DELETE" : "연결 그룹을 삭제한 후에는 복원할 수 없습니다. 이 연결 그룹을 삭제하겠습니까?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "공유 프로필 삭제", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "이름:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "기본 연결:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "공유 프로필 편집", + "SECTION_HEADER_PARAMETERS" : "매개 변수", + + "TEXT_CONFIRM_DELETE" : "공유 프로필을 삭제한 후에는 복원할 수 없습니다. 이 공유 프로필을 삭제하겠습니까?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "사용자 삭제", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "관리자 시스템", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "자신의 패스워드 변경:", + "FIELD_HEADER_CREATE_NEW_USERS" : "새로운 사용자 생성:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "새로운 사용자 그룹 생성:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "새로운 연결 생성", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "새로운 연결 그룹 생성:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "새로운 공유 프로파일 생성", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "로그인 비활성화:", + "FIELD_HEADER_USERNAME" : "사용자 이름:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "이 사용자는 현재 어떤 그룹에도 속하지 않습니다. 그룹을 추가하려면이 섹션을 확장하십시오.", + + "INFO_READ_ONLY" : "죄송합니다.이 사용자 계정은 수정할 수 없습니다.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "사용 가능한 그룹이 없습니다.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "모든 연결", + "SECTION_HEADER_CONNECTIONS" : "연결", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "현재 연결", + "SECTION_HEADER_EDIT_USER" : "사용자 편집", + "SECTION_HEADER_PERMISSIONS" : "권한", + "SECTION_HEADER_USER_GROUPS" : "그룹", + + "TEXT_CONFIRM_DELETE" : "사용자를 삭제한 후에는 복원 할 수 없습니다. 이 사용자를 삭제 하시겠습니까?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "그룹 삭제", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_USER_GROUP_DISABLED" : "비활성화:", + "FIELD_HEADER_USER_GROUP_NAME" : "그룹 이름:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "이 그룹은 현재 어떤 그룹에도 소속되지 않았습니다. 이 섹션을 확장하여 그룹을 추가하십시오.", + "HELP_NO_MEMBER_USER_GROUPS" : "이 그룹은 현재 어떤 그룹도 포함하고 있지 않습니다. 이 섹션을 확장하여 그룹을 추가하십시오.", + "HELP_NO_MEMBER_USERS" : "이 그룹은 어떤 사용자도 포함 하고 있지 않습니다. 이 섹션을 확장하여 사용자를 추가하십시오. ", + + "INFO_READ_ONLY" : "이 그룹은 편집할 수 없습니다.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "사용가능한 사용자가 없습니다.", + + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "그룹 편집", + "SECTION_HEADER_MEMBER_USERS" : "맴버 사용자", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "맴버 그룹", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "상위 그룹", + + "TEXT_CONFIRM_DELETE" : "그룹을 삭제한 후에는 복원 할 수 없습니다. 이 그룹을 삭제 하시겠습니까?" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Backspace 키 전송:", + "FIELD_HEADER_CA_CERT" : "인증 기관 인증서:", + "FIELD_HEADER_CLIENT_CERT" : "클라이언트 인증서:", + "FIELD_HEADER_CLIENT_KEY" : "클라이언트 키:", + "FIELD_HEADER_COLOR_SCHEME" : "색상 구성표:", + "FIELD_HEADER_CONTAINER" : "컨테이너 이름 :", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "자동으로 레코드 경로 생성 :", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "자동으로 typescript 경로 생성 :", + "FIELD_HEADER_DISABLE_COPY" : "터미널에서 복사 비활성화:", + "FIELD_HEADER_DISABLE_PASTE" : "클라이언트에서 붙여넣기 비활성화:", + "FIELD_HEADER_EXEC_COMMAND" : "명령어 (exec):", + "FIELD_HEADER_FONT_NAME" : "글꼴 이름 :", + "FIELD_HEADER_FONT_SIZE" : "글꼴 크기 :", + "FIELD_HEADER_HOSTNAME" : "호스트 이름 :", + "FIELD_HEADER_IGNORE_CERT" : "서버 인증서 무시 :", + "FIELD_HEADER_NAMESPACE" : "네임 스페이스 :", + "FIELD_HEADER_POD" : "파드 (Pod) 이름:", + "FIELD_HEADER_PORT" : "포트:", + "FIELD_HEADER_READ_ONLY" : "읽기 전용:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "마우스 제외:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "그래픽/스트림 제외:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "키 이벤트 포함:", + "FIELD_HEADER_RECORDING_NAME" : "레코드 이름:", + "FIELD_HEADER_RECORDING_PATH" : "레코드 경로:", + "FIELD_HEADER_SCROLLBACK" : "스크롤 백 (scrollback) 최대 크기:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript 이름:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript 경로:", + "FIELD_HEADER_USE_SSL" : "SSL/TLS 사용", + + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "흰색 바탕에 검정색", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "검은색 바탕에 회색", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "검은색 바탕에 녹색", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "검은색 바탕에 흰색", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + + "NAME" : "Kubernetes", + "SECTION_HEADER_AUTHENTICATION" : "인증", + "SECTION_HEADER_BEHAVIOR" : "터미널 동작", + "SECTION_HEADER_CLIPBOARD" : "클립보드", + "SECTION_HEADER_CONTAINER" : "컨테이너", + "SECTION_HEADER_DISPLAY" : "디스플레이", + "SECTION_HEADER_RECORDING" : "스크린 레코드", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (텍스트 세션 레코드)", + "SECTION_HEADER_NETWORK" : "네트워크" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "클라이언트 이름:", + "FIELD_HEADER_COLOR_DEPTH" : "색심도:", + "FIELD_HEADER_CONSOLE" : "관리자 콘솔:", + "FIELD_HEADER_CONSOLE_AUDIO" : "콘솔 내 오디오 지원:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "드라이브 자동 생성:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "레코드 경로 자동 생성:", + "FIELD_HEADER_DISABLE_AUDIO" : "오디오 비활성화:", + "FIELD_HEADER_DISABLE_AUTH" : "인증 비활성화:", + "FIELD_HEADER_DISABLE_COPY" : "원격 데스크톱으로 부터의 복사 비활성화:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "파일 다운로드 비활성화:", + "FIELD_HEADER_DISABLE_PASTE" : "클라이언트로 부터의 붙여넣기 비활성화:", + "FIELD_HEADER_DISABLE_UPLOAD" : "파일 업로드 비활성화:", + "FIELD_HEADER_DOMAIN" : "도메인:", + "FIELD_HEADER_DPI" : "해상도 (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "드라이브 이름:", + "FIELD_HEADER_DRIVE_PATH" : "드라이브 주소:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "오디오 입력 활성화 (마이크):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "바탕화면 구성 활성화 (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "드라이브 활성화:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "글꼴 다듬기 활성화 (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "전체 창 끌기 활성화:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "메뉴 에니메이션 활성화:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "비트맵 캐싱 비활성화:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "화면 밖 캐싱 비활성화:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "문자 모양 캐싱 비활성화:", + "FIELD_HEADER_ENABLE_PRINTING" : "프린팅 활성화:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP 활성화:", + "FIELD_HEADER_ENABLE_THEMING" : "테마 활성화:", + "FIELD_HEADER_ENABLE_TOUCH" : "멀티 터치 활성화:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "바탕화면 활성화:", + "FIELD_HEADER_FORCE_LOSSLESS" : "무손실 압축 강제:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "도메인:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "패스워드:", + "FIELD_HEADER_GATEWAY_PORT" : "포트:", + "FIELD_HEADER_GATEWAY_USERNAME" : "사용자 이름:", + "FIELD_HEADER_HEIGHT" : "높이:", + "FIELD_HEADER_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_IGNORE_CERT" : "서버 인증서 무시:", + "FIELD_HEADER_INITIAL_PROGRAM" : "시작 프로그램:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "부하분산 정보/쿠키:", + "FIELD_HEADER_PASSWORD" : "패스워드:", + "FIELD_HEADER_PORT" : "포트:", + "FIELD_HEADER_PRINTER_NAME" : "리디렉션 프린터 문서:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Preconnection BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP 소스 ID:", + "FIELD_HEADER_READ_ONLY" : "읽기 전용:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "마우스 제외:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "그래픽/스트림 제외:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "키 이벤트 포함:", + "FIELD_HEADER_RECORDING_NAME" : "레코드 이름:", + "FIELD_HEADER_RECORDING_PATH" : "레코드 경로:", + "FIELD_HEADER_RESIZE_METHOD" : "Resize 메서드:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "매개 변수:", + "FIELD_HEADER_REMOTE_APP_DIR" : "작업 디렉터리:", + "FIELD_HEADER_REMOTE_APP" : "프로그램:", + "FIELD_HEADER_SECURITY" : "안전 모드:", + "FIELD_HEADER_SERVER_LAYOUT" : "자판 배열:", + "FIELD_HEADER_SFTP_DIRECTORY" : "기본 업로드 디렉토리:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "파일 다운로드 비활성화:", + "FIELD_HEADER_SFTP_HOST_KEY" : "호스트 공개 키 (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive 간격:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "암호 (Passphrase):", + "FIELD_HEADER_SFTP_PASSWORD" : "암호 (Password):", + "FIELD_HEADER_SFTP_PORT" : "포트:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "개인 키:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "루트 디렉토리 파일 브라우저:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "파일 업로드 비활성화:", + "FIELD_HEADER_SFTP_USERNAME" : "사용자 이름:", + "FIELD_HEADER_STATIC_CHANNELS" : "스태틱 채널 이름:", + "FIELD_HEADER_TIMEZONE" : "시간대:", + "FIELD_HEADER_USERNAME" : "사용자 이름:", + "FIELD_HEADER_WIDTH" : "너비:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 패킷의 브로드케스트 주소:", + "FIELD_HEADER_WOL_MAC_ADDR" : "원격 호스트 MAC 어드레스", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL 패킷 전송:", + "FIELD_HEADER_WOL_WAIT_TIME" : "호스트 부트 대기 시간:", + + + "FIELD_OPTION_COLOR_DEPTH_16" : "로우 컬러 (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "트루 컬러 (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "트루 컬러 (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"디스플레이 업데이트\" 가상 채널 (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "다시 연결", + + "FIELD_OPTION_SECURITY_ANY" : "Any", + "FIELD_OPTION_SECURITY_NLA" : "NLA (네트워크 수준 인증)", + "FIELD_OPTION_SECURITY_RDP" : "RDP 암호화", + "FIELD_OPTION_SECURITY_TLS" : "TLS 암호화", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Czech (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Danish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Swiss German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "UK English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Spanish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latin American (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Belgian French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Swiss French (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Hungarian (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japanese (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portuguese Brazilian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portuguese (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Swedish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turkish-Q (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "인증", + "SECTION_HEADER_BASIC_PARAMETERS" : "기본 설정", + "SECTION_HEADER_CLIPBOARD" : "클립보드", + "SECTION_HEADER_DEVICE_REDIRECTION" : "디바이스 리디렉션", + "SECTION_HEADER_DISPLAY" : "디스플레이", + "SECTION_HEADER_GATEWAY" : "원격 데스크톱 게이트웨이", + "SECTION_HEADER_LOAD_BALANCING" : "부하 분산 (Load Balancing)", + "SECTION_HEADER_NETWORK" : "네트워크", + "SECTION_HEADER_PERFORMANCE" : "성능", + "SECTION_HEADER_PRECONNECTION_PDU" : "Preconnection PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "스크린 레코드", + "SECTION_HEADER_REMOTEAPP" : "리모트 앱", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : " 키가 보내는 문자:", + "FIELD_HEADER_COLOR_SCHEME" : "색상 구성표:", + "FIELD_HEADER_COMMAND" : "명령 실행:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "레코드 경로 자동 생성:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Typescript 경로 자동 생성:", + "FIELD_HEADER_DISABLE_COPY" : "터미널에서 복사 비활성화:", + "FIELD_HEADER_DISABLE_PASTE" : "클라이언트에서 붙여넣기 비활성화:", + "FIELD_HEADER_FONT_NAME" : "글꼴 이름:", + "FIELD_HEADER_FONT_SIZE" : "글꼴 크기:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP 활성화:", + "FIELD_HEADER_HOST_KEY" : "공개 호스트 키 (Base64):", + "FIELD_HEADER_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_LOCALE" : "언어/지역 ($LANG):", + "FIELD_HEADER_USERNAME" : "사용자 이름:", + "FIELD_HEADER_PASSWORD" : "암호 (Password):", + "FIELD_HEADER_PASSPHRASE" : "암호 (Passphrase):", + "FIELD_HEADER_PORT" : "포트:", + "FIELD_HEADER_PRIVATE_KEY" : "개인 키 (Private Key):", + "FIELD_HEADER_SCROLLBACK" : "최대 스크롤 백 사이즈:", + "FIELD_HEADER_READ_ONLY" : "읽기 전용:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "마우스 제외:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "그래픽/스트림 제외:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "키 이벤트 포함:", + "FIELD_HEADER_RECORDING_NAME" : "레코드 이름:", + "FIELD_HEADER_RECORDING_PATH" : "레코드 경로:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "서버 keepalive 간격:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "파일 다운로드 비활성화:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "루트 디렉토리 파일 브라우저:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "파일 업로드 비활성화:", + "FIELD_HEADER_TERMINAL_TYPE" : "터미널 타입:", + "FIELD_HEADER_TIMEZONE" : "시간대 ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript 이름:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript 경로:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 패킷의 브로드케스트 주소:", + "FIELD_HEADER_WOL_MAC_ADDR" : "원격 호스트 MAC 어드레스:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL 패킷 전송:", + "FIELD_HEADER_WOL_WAIT_TIME" : "호스트 부트 대기 시간:", + + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "흰색 바탕에 검정색", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "검은색 바탕에 회색", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "검은색 바탕에 녹색", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "검은색 바탕에 흰색", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "인증", + "SECTION_HEADER_BEHAVIOR" : "터미널 동작", + "SECTION_HEADER_CLIPBOARD" : "클립보드", + "SECTION_HEADER_DISPLAY" : "디스플레이", + "SECTION_HEADER_NETWORK" : "네트워크", + "SECTION_HEADER_RECORDING" : "스크린 레코드", + "SECTION_HEADER_SESSION" : "세션 / 환경", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (텍스트 세션 레코드)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + "FIELD_HEADER_BACKSPACE" : "Backspace 키 전송:", + "FIELD_HEADER_COLOR_SCHEME" : "색상 구성표:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "레코드 경로 자동 생성:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Typescript 경로 자동 생성:", + "FIELD_HEADER_DISABLE_COPY" : "터미널에서 복사 비활성화:", + "FIELD_HEADER_DISABLE_PASTE" : "클라이언트에서 붙여넣기 비활성화:", + "FIELD_HEADER_FONT_NAME" : "글꼴 이름:", + "FIELD_HEADER_FONT_SIZE" : "글꼴 크기:", + "FIELD_HEADER_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "로그인 실패 정규식:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "로그인 성공 정규식:", + "FIELD_HEADER_USERNAME" : "사용자 이름:", + "FIELD_HEADER_USERNAME_REGEX" : "사용자 이름 정규식:", + "FIELD_HEADER_PASSWORD" : "패스워드:", + "FIELD_HEADER_PASSWORD_REGEX" : "패스워드 정규식:", + "FIELD_HEADER_PORT" : "포트:", + "FIELD_HEADER_READ_ONLY" : "읽기 전용:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "마우스 제외:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "그래픽/스트림 제외:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "키 이벤트 포함:", + "FIELD_HEADER_RECORDING_NAME" : "레코드 이름:", + "FIELD_HEADER_RECORDING_PATH" : "레코드 경로:", + "FIELD_HEADER_SCROLLBACK" : "스크롤 백 (scrollback) 최대 크기:", + "FIELD_HEADER_TERMINAL_TYPE" : "터미널 타입:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript 이름:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript 경로:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 패킷의 브로드캐스트 주소:", + "FIELD_HEADER_WOL_MAC_ADDR" : "원격 호스트 MAC 주소:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL 패킷 전송:", + "FIELD_HEADER_WOL_WAIT_TIME" : "호스트 부트 대기 시간:", + + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "흰색 바탕에 검정색", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "검은색 바탕에 회색", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "검은색 바탕에 녹색", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "검은색 바탕에 흰색", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "인증", + "SECTION_HEADER_BEHAVIOR" : "터미널 동작", + "SECTION_HEADER_CLIPBOARD" : "클립보드", + "SECTION_HEADER_DISPLAY" : "디스플레이", + "SECTION_HEADER_RECORDING" : "스크린 레코드", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (텍스트 세션 레코드)", + "SECTION_HEADER_NETWORK" : "네트워크", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + "FIELD_HEADER_AUDIO_SERVERNAME" : "오디오 서버 이름:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "인코딩:", + "FIELD_HEADER_COLOR_DEPTH" : "색심도:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "레코드 경로 자동 생성:", + "FIELD_HEADER_CURSOR" : "커서:", + "FIELD_HEADER_DEST_HOST" : "대상 호스트:", + "FIELD_HEADER_DEST_PORT" : "대상 포트:", + "FIELD_HEADER_DISABLE_COPY" : "데스크톱에서 복사 비활성화:", + "FIELD_HEADER_DISABLE_PASTE" : "클라이언트에서 붙여넣기 비활성화:", + "FIELD_HEADER_ENABLE_AUDIO" : "오디오 활성화:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP 활성화:", + "FIELD_HEADER_FORCE_LOSSLESS" : "무손실 압축 강제:", + "FIELD_HEADER_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_USERNAME" : "사용자 이름:", + "FIELD_HEADER_PASSWORD" : "패스워드:", + "FIELD_HEADER_PORT" : "포트:", + "FIELD_HEADER_READ_ONLY" : "읽기 전용:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "마우스 제외:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "그래픽/스트림 제외:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "키 이벤트 포함:", + "FIELD_HEADER_RECORDING_NAME" : "레코드 이름:", + "FIELD_HEADER_RECORDING_PATH" : "레코드 경로:", + "FIELD_HEADER_SFTP_DIRECTORY" : "기본 업로드 디렉터리:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "파일 다운로드 비활성화:", + "FIELD_HEADER_SFTP_HOST_KEY" : "공개 호스트 키 (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "호스트 이름:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP 유지 간격:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "암호 (Passphrase):", + "FIELD_HEADER_SFTP_PASSWORD" : "암호 (Password):", + "FIELD_HEADER_SFTP_PORT" : "포트:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "개인 키:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "파일 브라우저 루트 디렉터리:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "파일 업로드 비활성화:", + "FIELD_HEADER_SFTP_USERNAME" : "사용자 이름:", + "FIELD_HEADER_SWAP_RED_BLUE" : "red/blue 컴포넌트 스왑:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 패킷 브로드캐스트 주소:", + "FIELD_HEADER_WOL_MAC_ADDR" : "원격 호스트 MAC 주소:", + "FIELD_HEADER_WOL_SEND_PACKET" : "WoL 패킷 전송:", + "FIELD_HEADER_WOL_WAIT_TIME" : "호스트 부트 대기 시간:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_16" : "로우 컬러 (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "트루 컬러 (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "트루 컬러 (32-bit)", + + "FIELD_OPTION_CURSOR_LOCAL" : "로컬", + "FIELD_OPTION_CURSOR_REMOTE" : "원격", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "오디오", + "SECTION_HEADER_AUTHENTICATION" : "인증", + "SECTION_HEADER_CLIPBOARD" : "클립보드", + "SECTION_HEADER_DISPLAY" : "디스플레이", + "SECTION_HEADER_NETWORK" : "네트워크", + "SECTION_HEADER_RECORDING" : "스크린 레코드", + "SECTION_HEADER_REPEATER" : "VNC 리피터", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "설정" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "과거 연결 기록은 여기에 나열되며 열 헤더 (column header)를 클릭하여 정렬할 수 있습니다. 특정 기록을 검색하려면, 필터 문자열을 입력하고 \"검색\"을 클릭하십시오. 제공된 필터 문자열과 일치하는 기록만 나열됩니다.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "일치하는 기록 없음", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "연결 이름", + "TABLE_HEADER_SESSION_DURATION" : "기간", + "TABLE_HEADER_SESSION_REMOTEHOST" : "원격 호스트", + "TABLE_HEADER_SESSION_STARTDATE" : "시작 시간", + "TABLE_HEADER_SESSION_USERNAME" : "사용자 이름", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "새 연결", + "ACTION_NEW_CONNECTION_GROUP" : "새 그룹", + "ACTION_NEW_SHARING_PROFILE" : "새 공유 프로필", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "아래 연결을 클릭하거나 탭하여 해당 연결을 관리합니다. 엑세스 레벨에 따라 연결을 추가하고 삭제할 수 있으며, 속성 (프로토콜, 호스트 이름, 포트 등)을 변경할 수 있습니다.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "연결" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "표시 언어:", + "FIELD_HEADER_PASSWORD" : "패스워드:", + "FIELD_HEADER_PASSWORD_OLD" : "현재 패스워드:", + "FIELD_HEADER_PASSWORD_NEW" : "새 패스워드:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "새 패스워드 확인:", + "FIELD_HEADER_TIMEZONE" : "시간대:", + "FIELD_HEADER_USERNAME" : "사용자 이름:", + + "HELP_DEFAULT_INPUT_METHOD" : "기본 입력 방법은 키보드 이벤트가 Guacamole에 의해 수신되는 방법을 결정합니다. 모바일 장치를 사용하거나 IME를 통해 입력할 때 이 설정을 변경해야 할 수도 있습니다. 이 세팅은 Guacamole 메뉴 내에서 연결마다 재정의할 수 있습니다.", + "HELP_DEFAULT_MOUSE_MODE" : "기본 마우스 에뮬레이션 방법은 원격 마우스가 터치와 관련해서 새 연결에서 어떻게 작동할지 결정합니다. 이 세팅은 Guacamole 메뉴 내에서 연결마다 재정의할 수 있습니다.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "아래의 옵션은 사용자의 지역과 관련이 있으며 인터페이스의 여러 부분이 표시되는 방법에 영향을 줄 것입니다.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "패스워드를 변경하려면 현재 패스워드와 새 패스워드를 아래에 입력하고, \"패스워드 변경\"을 클릭하십시오. 변경사항은 즉시 적용될 것입니다.", + + "INFO_PASSWORD_CHANGED" : "패스워드가 변경되었습니다.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "기본 입력 방법", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "기본 마우스 에뮬레이션 방법", + "SECTION_HEADER_UPDATE_PASSWORD" : "패스워드 변경" + + }, + + "SETTINGS_USERS" : { + + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "새 사용자", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "아래 사용자를 클릭하거나 탭하여 해당 사용자를 관리합니다. 엑세스 레벨에 따라 사용자를 추가하고 삭제할 수 있으며, 패스워드를 변경할 수 있습니다.", + + "SECTION_HEADER_USERS" : "사용자", + + "TABLE_HEADER_FULL_NAME" : "전체 이름", + "TABLE_HEADER_LAST_ACTIVE" : "마지막 활성", + "TABLE_HEADER_ORGANIZATION" : "조직", + "TABLE_HEADER_USERNAME" : "사용자 이름" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "새 그룹", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "아래 그룹을 클릭하거나 탭하여 해당 그룹을 관리합니다. 엑세스 레벨에 따라 그룹을 추가하고 삭제할 수 있으며, 구성원 사용자들과 그룹을 변경할 수 있습니다.", + + "SECTION_HEADER_USER_GROUPS" : "그룹", + + "TABLE_HEADER_USER_GROUP_NAME" : "그룹 이름" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "세션 종료", + + "DIALOG_HEADER_CONFIRM_DELETE" : "세션 종료", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "이 페이지는 현재 활성화된 연결로 이루어져 있습니다. 세션을 하나 이상 종료하려면, 해당 세션 옆의 체크 박스를 선택하고 \"세션 종료\"를 클릭하십시오. 세션을 종료하면 관련된 사용자의 연결이 즉시 끊어질 것입니다.", + + "INFO_NO_SESSIONS" : "활성 세션 없음", + + "SECTION_HEADER_SESSIONS" : "활성 세션", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "연결 이름", + "TABLE_HEADER_SESSION_REMOTEHOST" : "원격 호스트", + "TABLE_HEADER_SESSION_STARTDATE" : "활성화된 시간", + "TABLE_HEADER_SESSION_USERNAME" : "사용자 이름", + + "TEXT_CONFIRM_DELETE" : "선택한 세션을 모두 종료하시겠습니까? 이 세션을 사용 중인 사용자의 연결이 즉시 끊어질 것입니다." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "이메일 주소:", + "FIELD_HEADER_GUAC_FULL_NAME" : "전체 이름:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "조직:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "역할:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/nl.json b/guacamole/src/main/frontend/src/translations/nl.json new file mode 100644 index 0000000..ef03dc3 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/nl.json @@ -0,0 +1,692 @@ +{ + + "NAME" : "Nederlands", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Annuleer", + "ACTION_CLONE" : "Kloon", + "ACTION_CONTINUE" : "Verder", + "ACTION_DELETE" : "Verwijder", + "ACTION_DELETE_SESSIONS" : "Verwijder Sessies", + "ACTION_LOGIN" : "Inloggen", + "ACTION_LOGOUT" : "Uitloggen", + "ACTION_MANAGE_CONNECTIONS" : "Verbindingen", + "ACTION_MANAGE_PREFERENCES" : "Voorkeuren", + "ACTION_MANAGE_SETTINGS" : "Instellingen", + "ACTION_MANAGE_SESSIONS" : "Actieve Sessies", + "ACTION_MANAGE_USERS" : "Gebruikers", + "ACTION_NAVIGATE_BACK" : "Terug", + "ACTION_NAVIGATE_HOME" : "Home", + "ACTION_SAVE" : "Opslaan", + "ACTION_SEARCH" : "Zoeken", + "ACTION_UPDATE_PASSWORD" : "Wijzig Wachtwoord", + "ACTION_VIEW_HISTORY" : "Gebruikgeschiedenis", + + "DIALOG_HEADER_ERROR" : "Fout", + + "ERROR_PASSWORD_BLANK" : "Uw wachtwoord mag niet leeg zijn.", + "ERROR_PASSWORD_MISMATCH" : "De opgegeven wachtwoorden komen niet overeen.", + + "FIELD_HEADER_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Nogmaals uw wachtwoord:", + + "FIELD_PLACEHOLDER_FILTER" : "Filter", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Op dit moment in gebruik door {USERS} {USERS, plural, one{gebruiker} other{gebruikers}}.", + + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{seconde} other{seconden}}} minute{{VALUE, plural, one{minuut} other{minuten}}} hour{{VALUE, plural, one{uur} other{uren}}} day{{VALUE, plural, one{dag} other{dagen}}} other{}}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Wis lijst", + "ACTION_DISCONNECT" : "Verbreek Verbinding", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Verbind Opnieuw", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_UPLOAD_FILES" : "Upload Bestanden", + + "DIALOG_HEADER_CONNECTING" : "Aan Het Verbinden", + "DIALOG_HEADER_CONNECTION_ERROR" : "Verbindingsfout", + "DIALOG_HEADER_DISCONNECTED" : "Niet Verbonden", + + "ERROR_CLIENT_201" : "Deze verbinding is gesloten omdat de server druk is. Wacht een paar minuten en probeer het opnieuw.", + "ERROR_CLIENT_202" : "De Guacamole server heeft de verbinding gesloten omdat het externe bureaublad te lang niet heeft gereageerd. Probeer het altublieft opnieuw of neem contact op met uw systeembeheerder.", + "ERROR_CLIENT_203" : "Er is een fout opgetreden bij de externe bureaublad server en heeft de verbinding gesloten. Probeer het alstublieft opnieuw of neem contact op met uw systeembeheerder.", + "ERROR_CLIENT_205" : "Deze verbinding is beeindigd omdat het conflicteerd met een andere verbinding. Probeer het alstublieft later nog eens.", + "ERROR_CLIENT_301" : "Inloggen is mislukt. Verbind opnieuw en probeer het nog eens.", + "ERROR_CLIENT_303" : "U heeft geen toestemming om deze verbinding tot stand te brengen. Heeft u toegang nodig, vraag dan aan uw systeembeheerder om u toe te voegen aan de lijst van geauthoriseerde gebruikers of controleer uw systeem instellingen.", + "ERROR_CLIENT_308" : "De Guacamole server heeft de sessie gesloten omdat uw browser zo lang niet heeft gereageerd dat het er op leek dat uw verbinding verbroken was. Dit komt in de regel door netwerk problemen zoals een slecht draadloos signaal of een erg langzame netwerk snelheid. Controleer uw netwerk en probeer het opnieuw.", + "ERROR_CLIENT_31D" : "De Guacamole server geeft geen toegang tot deze verbinding omdat u de limiet heeft bereikt van het aantal toegestane gelijktijdige verbindingen door een individuele gebruiker. Sluit u alstublieft een of meer verbindingen en probeer het opnieuw.", + "ERROR_CLIENT_DEFAULT" : "Een interne fout is opgetreden op de Guacamole server en de connectie is beeindigd. Als dit probleem zich voor blijft doen, neem dan contact op met uw systeembeheerder of controleer uw systeem logs.", + + "ERROR_TUNNEL_201" : "De Guacamole server heeft deze verbinding geweigerd omdat er al te veel actieve verbindingen zijn. Wacht u alstublieft een paar minuten en probeer het opnieuw.", + "ERROR_TUNNEL_202" : "De verbinding is gesloten omdat de server niet op tijd reageerd. Dit komt in de regel door netwerk problemen zoals een slecht draadloos signaal of langzame netwerk snelheden. Controleer alstublieft uw netwerk verbinding en probeer het opnieuw of neem contact op met uw systeembeheerde.", + "ERROR_TUNNEL_203" : "Er heeft een fout plaats gevonden op de server en deze heeft de verbinding gesloten. Probeert u het nog eens of neem contact op met uw systeembeheerder.", + "ERROR_TUNNEL_204" : "De gevraagde verbinding bestaat niet. Controleert u altublieft de verbindingsnaam en probeer het nog eens.", + "ERROR_TUNNEL_205" : "Deze verbinding is op dit moment in gebruik en gelijktijdige toegang is niet toegestaan. Probeert u het later nog eens.", + "ERROR_TUNNEL_301" : "U heeft geen toestemming deze verbinding te gebruiken omdat u niet ingelogd bent. Log eerst in en probeer het nog eens.", + "ERROR_TUNNEL_303" : "U heeft geen toestemming deze verbinding te gebruiken. Als u toegang nodig heeft, vraag dan aan de systeembeheerder om u toe te voegen aan de lijst van geauthoriseerde gebruikers of controleer uw systeem instellingen.", + "ERROR_TUNNEL_308" : "De Guacamole server heeft de sessie gesloten omdat uw browser zo lang niet heeft gereageerd dat het er op leek dat uw verbinding verbroken was. Dit komt in de regel door netwerk problemen zoals een slecht draadloos signaal of een erg langzame netwerk snelheid. Controleer uw netwerk en probeer het opnieuw.", + "ERROR_TUNNEL_31D" : "De Guacamole server geeft geen toegang tot deze verbinding omdat u de limiet heeft bereikt van het aantal toegestane gelijktijdige verbindingen door een individuele gebruiker. Sluit u alstublieft een of meer verbindingen en probeer het opnieuw.", + "ERROR_TUNNEL_DEFAULT" : "Een interne fout is opgetreden op de Guacamole server en de connectie is beeindigd. Als dit probleem zich voor blijft doen, neem dan contact op met uw systeembeheerder of controleer uw systeem logs.", + + "ERROR_UPLOAD_100" : "Bestandsoverdracht is ofwel niet ondersteund of niet ingeschakeld. Neem contact op met uw systeembeheerder of kijk in uw systeem logs.", + "ERROR_UPLOAD_201" : "Er worden momenteel te veel bestanden overdragen. Gelieve te wachten tot de bestaande bestandsoverdracht is voltooid, en probeer het opnieuw.", + "ERROR_UPLOAD_202" : "Het bestand kan niet worden overgedragen, omdat de extern bureaublad server te lang niet reageert. Probeer het opnieuw of neem contact op met uw systeembeheerder.", + "ERROR_UPLOAD_203" : "Er is een fout opgetreden op de extern bureaublad server tijdens de overdracht. Probeer het opnieuw of neem contact op met uw systeembeheerder.", + "ERROR_UPLOAD_204" : "De bestemming voor de overdracht van bestanden bestaat niet. Controleer of de bestemming bestaat en probeer het opnieuw.", + "ERROR_UPLOAD_205" : "De bestemming voor de overdracht van bestanden is momenteel vergrendeld. Gelieve te wachten tot alle taken zijn voltooid en probeer het opnieuw.", + "ERROR_UPLOAD_301" : "U heeft geen toestemming om dit bestand te uploaden, omdat u niet ingelogd bent. Gelieve in te loggen en probeer het opnieuw.", + "ERROR_UPLOAD_303" : "U heeft geen toestemming om dit bestand te uploaden. Als u toegang nodig heeft, controleer dan uw systeeminstellingen of neem contact op met uw systeembeheerder.", + "ERROR_UPLOAD_308" : "De bestandsoverdracht is vastgelopen. Dit wordt meestal veroorzaakt door netwerkproblemen, zoals een instabiel draadloos signaal of gewoon een erg trage netwerkverbinding. Controleer uw netwerk en probeer het opnieuw.", + "ERROR_UPLOAD_31D" : "Er worden momenteel te veel bestanden overdragen. Gelieve te wachten tot de bestaande bestandsoverdracht is voltooid, en probeer het opnieuw.", + "ERROR_UPLOAD_DEFAULT" : "Er is een interne fout opgetreden op de Guacamole server, en de verbinding is beëindigd. Als het probleem aanhoudt, neem dan contact op met uw systeembeheerder of kijk in uw systeem logs.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Tekst gekopieerd / geknipt binnen Guacamole zal hier verschijnen. Wijzigingen in onderstaande tekst zal externe klembord beïnvloeden.", + "HELP_INPUT_METHOD_NONE" : "Geen invoer methode gebruiken. Toetsenbord invoer wordt geaccepteerd van een aangesloten, fysiek toetsenbord.", + "HELP_INPUT_METHOD_OSK" : "Weergave en accepteren van invoer via het ingebouwde Guacamole on-screen toetsenbord. Dit toetsenbord op het scherm maakt toetscombinaties mogelijk die anders onmogelijk zijn (zoals Ctrl-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Laat het typen van tekst en het emuleren toetsenbord gebeurtenissen toe gebaseerd op de getypte tekst. Dit is nodig voor apparaten zoals mobiele telefoons die geen fysiek toetsenbord hebben.", + "HELP_MOUSE_MODE" : "Bepaalt hoe de muis met aanraak-klikken omgaat.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Tik om te klikken. De klik vindt plaats op de locatie van de tik.", + "HELP_MOUSE_MODE_RELATIVE" : "Sleep om de aanwijzer te bewegen en tik om te klikken. De klik vindt plaats op de locatie van de aanwijzer.", + + "INFO_NO_FILE_TRANSFERS" : "Geen bestandsoverdrachten.", + + "NAME_INPUT_METHOD_NONE" : "Geen", + "NAME_INPUT_METHOD_OSK" : "Scherm toetsenbord", + "NAME_INPUT_METHOD_TEXT" : "Text invoer", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Aanraakscherm", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIPBOARD" : "Klembord", + "SECTION_HEADER_DEVICES" : "Apparaten", + "SECTION_HEADER_DISPLAY" : "Scherm", + "SECTION_HEADER_FILE_TRANSFERS" : "Bestandsoverdrachten", + "SECTION_HEADER_INPUT_METHOD" : "Invoer methode", + "SECTION_HEADER_MOUSE_MODE" : "Muis emulatie modus", + + "TEXT_ZOOM_AUTO_FIT" : "Automatisch aan browser venster aanpassen", + "TEXT_CLIENT_STATUS_IDLE" : "Inactief.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Verbinden met Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "De verbinding is verbroken.", + "TEXT_CLIENT_STATUS_WAITING" : "Verbonden met Guacamole. Aan het wachten op reactie...", + "TEXT_RECONNECT_COUNTDOWN" : "Opnieuw verbinden over {REMAINING} {REMAINING, plural, one{seconde} other{seconden}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/nl-nl-qwerty.json" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Standaard (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Klik om wachtwoord te tonen", + "HELP_HIDE_PASSWORD" : "Klik om wachtwoord te verbergen" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Geen recente verbindingen.", + + "PASSWORD_CHANGED" : "Wachtwoord gewijzigd.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Alle Verbindingen", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Recente Verbindingen" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Ongeldige Login", + + "FIELD_HEADER_USERNAME" : "Gebruikersnaam", + "FIELD_HEADER_PASSWORD" : "Wachtwoord" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Verwijder Verbinding", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Locatie:", + "FIELD_HEADER_NAME" : "Naam:", + "FIELD_HEADER_PROTOCOL" : "Protocol:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Nu Actief", + "INFO_CONNECTION_NOT_USED" : "Deze verbinding is nog niet gebruikt.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Bewerk Verbinding", + "SECTION_HEADER_HISTORY" : "Gebruikgeschiedenis", + "SECTION_HEADER_PARAMETERS" : "Parameters", + + "TABLE_HEADER_HISTORY_USERNAME" : "Gebruikersnaam", + "TABLE_HEADER_HISTORY_START" : "Starttijd", + "TABLE_HEADER_HISTORY_DURATION" : "Tijdsduur", + + "TEXT_CONFIRM_DELETE" : "Verbindingen kunnen niet worden hersteld nadat ze zijn verwijderd. Weet u zeker dat u deze verbinding wilt verwijderen?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Verwijder Verbindingsgroep", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Locatie:", + "FIELD_HEADER_NAME" : "Naam:", + "FIELD_HEADER_TYPE" : "Soort:", + + "NAME_TYPE_BALANCING" : "Verdeling", + "NAME_TYPE_ORGANIZATIONAL" : "Organizatorisch", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Bewerk Verbindingsgroep", + + "TEXT_CONFIRM_DELETE" : "Verbindingsgroepen kunnen niet worden hersteld nadat ze zijn verwijderd. Weet u zeker dat u deze verbindingsgroep wilt verwijderen?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Naam:", + + "SECTION_HEADER_PARAMETERS" : "Parameters" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Verwijder Gebruiker", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Systeem Beheer:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Wijzigen eigen wachtwoord:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Nieuwe gebruikers aanmaken:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Nieuwe verbindingen aanmaken:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Nieuwe verbindingsgroepen aanmaken:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USERNAME" : "Gebruikersnaam:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_READ_ONLY" : "Sorry, maar dit gebruikers account kan niet gewijzigd worden", + + "SECTION_HEADER_CONNECTIONS" : "Verbindingen", + "SECTION_HEADER_EDIT_USER" : "Bewerk Gebruiker", + "SECTION_HEADER_PERMISSIONS" : "Rechten", + + "TEXT_CONFIRM_DELETE" : "Gebruikers kunnen niet worden hersteld nadat ze zijn verwijderd. Weet u zeker dat u deze gebruiker wilt verwijderen?" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Client naam:", + "FIELD_HEADER_COLOR_DEPTH" : "Kleurdiepte:", + "FIELD_HEADER_CONSOLE" : "Administrator console:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Support audio in console:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Automatisch genereren station:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatisch genereren opname map:", + "FIELD_HEADER_DISABLE_AUDIO" : "Uitschakelen geluid:", + "FIELD_HEADER_DISABLE_AUTH" : "Uitschakelen authenticatie:", + "FIELD_HEADER_DOMAIN" : "Domein:", + "FIELD_HEADER_DPI" : "Resolutie (DPI):", + "FIELD_HEADER_DRIVE_PATH" : "Station map:", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Inschakelen bureaublad compositie (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Inschakelen station:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Inschakelen font smoothing (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Inschakelen verslepen compleet venster:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Inschakelen menu animaties:", + "FIELD_HEADER_ENABLE_PRINTING" : "Printen mogelijk maken:", + "FIELD_HEADER_ENABLE_SFTP" : "Inschakelen SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Inschakelen thema's:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Inschakelen achtergrond:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domein:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Password:", + "FIELD_HEADER_GATEWAY_PORT" : "Poort:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_HEIGHT" : "Hoogte:", + "FIELD_HEADER_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_IGNORE_CERT" : "Negeer server certificaat:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Eerste programma:", + "FIELD_HEADER_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_PORT" : "Poort:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Voor te bereiden BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP bron ID:", + "FIELD_HEADER_READ_ONLY" : "Alleen lezen:", + "FIELD_HEADER_RECORDING_NAME" : "Opname naam:", + "FIELD_HEADER_RECORDING_PATH" : "Opname map:", + "FIELD_HEADER_RESIZE_METHOD" : "Schaal methode:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parameters:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Werk map:", + "FIELD_HEADER_REMOTE_APP" : "Programma:", + "FIELD_HEADER_SECURITY" : "Beveiligings modus:", + "FIELD_HEADER_SERVER_LAYOUT" : "Toetsenbord lay-out:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Standaard upload map:", + "FIELD_HEADER_SFTP_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Wachtwoordzin:", + "FIELD_HEADER_SFTP_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_SFTP_PORT" : "Poort:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Persoonlijke sleutel:", + "FIELD_HEADER_SFTP_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_STATIC_CHANNELS" : "Vaste kanaalnamen:", + "FIELD_HEADER_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_WIDTH" : "Breedte:", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Minder Kleuren (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Echte Kleuren (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Echte Kleuren (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 kleuren", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Ververs scherm\" virtueel kanaal (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Verbind opnieuw", + + "FIELD_OPTION_SECURITY_ANY" : "Ieder", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Network Level Authentication)", + "FIELD_OPTION_SECURITY_RDP" : "RDP encryptie", + "FIELD_OPTION_SECURITY_TLS" : "TLS encryptie", + + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Duits (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "Amerikaans Engels (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Frans (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italiaans (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japans (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Poolse (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Zweeds (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Authenticatie", + "SECTION_HEADER_BASIC_PARAMETERS" : "Basis Instellingen", + "SECTION_HEADER_CLIPBOARD" : "Klembord", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Apparaat Verbindingen", + "SECTION_HEADER_DISPLAY" : "Scherm", + "SECTION_HEADER_NETWORK" : "Netwerk", + "SECTION_HEADER_PERFORMANCE" : "Prestatie instellingen", + "SECTION_HEADER_PRECONNECTION_PDU" : "Voor te bereiden PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Scherm Opname", + "SECTION_HEADER_REMOTEAPP" : "ExterneApp", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_COLOR_SCHEME" : "Kleuren combinatie:", + "FIELD_HEADER_COMMAND" : "Uitvoeren opdracht:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatisch genereren opname map:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatisch genereren typescript map:", + "FIELD_HEADER_FONT_NAME" : "Fontnaam:", + "FIELD_HEADER_FONT_SIZE" : "Fontgrootte:", + "FIELD_HEADER_ENABLE_SFTP" : "SFTP mogelijk maken:", + "FIELD_HEADER_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_PASSPHRASE" : "Wachtwoordzin:", + "FIELD_HEADER_PORT" : "Poort:", + "FIELD_HEADER_PRIVATE_KEY" : "Persoonlijke sleutel:", + "FIELD_HEADER_READ_ONLY" : "Alleen lezen:", + "FIELD_HEADER_RECORDING_NAME" : "Opname naam:", + "FIELD_HEADER_RECORDING_PATH" : "Opname map:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript naam:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript map:", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Zwart op wit", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grijs op zwart", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Groen op zwart", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Wit op zwart", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Authenticatie", + "SECTION_HEADER_CLIPBOARD" : "Klembord", + "SECTION_HEADER_DISPLAY" : "Scherm", + "SECTION_HEADER_NETWORK" : "Netwerk", + "SECTION_HEADER_RECORDING" : "Scherm Opname", + "SECTION_HEADER_SESSION" : "Sessie / Omgeving", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Tekst sessie opname)", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_COLOR_SCHEME" : "Kleuren combinatie:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatisch genereren opname map:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatisch genereren typescript map:", + "FIELD_HEADER_FONT_NAME" : "Fontnaam:", + "FIELD_HEADER_FONT_SIZE" : "Fontgrootte:", + "FIELD_HEADER_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_PASSWORD_REGEX" : "Wachtwoord reguliere expressie:", + "FIELD_HEADER_PORT" : "Poort:", + "FIELD_HEADER_READ_ONLY" : "Alleen lezen:", + "FIELD_HEADER_RECORDING_NAME" : "Opname naam:", + "FIELD_HEADER_RECORDING_PATH" : "Opname map:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript naam:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript map:", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Zwart op wit", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grijs op zwart", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Groen op zwart", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Wit op zwart", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Authenticatie", + "SECTION_HEADER_CLIPBOARD" : "Klembord", + "SECTION_HEADER_DISPLAY" : "Scherm", + "SECTION_HEADER_RECORDING" : "Scherm Opname", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Tekst Sessie Opname)", + "SECTION_HEADER_NETWORK" : "Netwerk" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Audio server naam:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Encodering:", + "FIELD_HEADER_COLOR_DEPTH" : "Kleurdiepte:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatisch genereren opname map:", + "FIELD_HEADER_CURSOR" : "Cursor:", + "FIELD_HEADER_DEST_HOST" : "Externe server:", + "FIELD_HEADER_DEST_PORT" : "Externe poort:", + "FIELD_HEADER_ENABLE_AUDIO" : "Inschakelen geluid:", + "FIELD_HEADER_ENABLE_SFTP" : "Inschakelen SFTP:", + "FIELD_HEADER_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_PORT" : "Poort:", + "FIELD_HEADER_READ_ONLY" : "Alleen lezen:", + "FIELD_HEADER_RECORDING_NAME" : "Opname naam:", + "FIELD_HEADER_RECORDING_PATH" : "Opname map:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Standaard upload map:", + "FIELD_HEADER_SFTP_HOSTNAME" : "Servernaam:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Wachtwoordzin:", + "FIELD_HEADER_SFTP_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_SFTP_PORT" : "Poort:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Persoonlijke sleutel:", + "FIELD_HEADER_SFTP_USERNAME" : "Gebruikersnaam:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Verwissel rood/blauw componenten:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 kleuren", + "FIELD_OPTION_COLOR_DEPTH_16" : "Minder kleuren (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Echte kleuren (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Echte kleuren (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Lokaal", + "FIELD_OPTION_CURSOR_REMOTE" : "Extern", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Geluid", + "SECTION_HEADER_AUTHENTICATION" : "Authenticatie", + "SECTION_HEADER_CLIPBOARD" : "Klembord", + "SECTION_HEADER_DISPLAY" : "Scherm", + "SECTION_HEADER_NETWORK" : "Netwerk", + "SECTION_HEADER_RECORDING" : "Scherm Opname", + "SECTION_HEADER_REPEATER" : "VNC Repeater", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Instellingen" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "De gebruikgeschiedenis van verbindingen wordt hier onder getoond en kan gesorteerd worden door op de titel van de kolom te klikken. Voer een zoekterm in en klik op \"Zoeken\", om op specifieke resultaten te zoeken. Alleen de resultaten die voldoen aan de zoekterm zullen dan getoond worden.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Geen resultaten gevonden", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Verbindingsnaam", + "TABLE_HEADER_SESSION_DURATION" : "Tijdsduur", + "TABLE_HEADER_SESSION_STARTDATE" : "Starttijd", + "TABLE_HEADER_SESSION_USERNAME" : "Gebruikersnaam", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Nieuwe Verbinding", + "ACTION_NEW_CONNECTION_GROUP" : "Nieuwe Verbindingsgroep", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Klik of tik op een verbinding hieronder om die verbinding te beheren. Afhankelijk van uw toegangsniveau kunnen verbindingen worden toegevoegd en verwijderd en hun eigenschappen (protocol, hostname, port, etc.) worden gewijzigd. ", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Verbindingen" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Taal Keuze:", + "FIELD_HEADER_PASSWORD" : "Wachtwoord:", + "FIELD_HEADER_PASSWORD_OLD" : "Huidig Wachtwoord:", + "FIELD_HEADER_PASSWORD_NEW" : "Nieuw Wachtwoord:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Bevestig Nieuw Wachtwoord:", + "FIELD_HEADER_USERNAME" : "Gebruikersnaam:", + + "HELP_DEFAULT_INPUT_METHOD" : "De standaard invoer methode bepaalt hoe toetsenbord gebeurtenissen ontvangen worden door Guacamole. Het veranderen van deze instelling kan nodig zijn bij gebruik van een mobiel apparaat of wanneer er via een IME getypt wordt. Deze instelling kan per verbinding worden overschreven via het Guacamole menu.", + "HELP_DEFAULT_MOUSE_MODE" : "De standaard muis emulatie modus bepaalt hoe de externe muis in nieuwe verbindingen omgaat met touch. Deze instelling kan per verbinding worden overschreven via het Guacamole menu.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LANGUAGE" : "Selecteer onderstaand een andere taal om alle text in Guacamole hieraan aan te passen. De beschikbare keuzes zijn afhankelijk van welke talen er geinstalleerd zijn.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Als u uw wachtwoord wilt wijzigen, voer dan uw huidige wachtwoord en uw nieuwe wachtwoord hieronder in en klik op \"Wijzig Wachtwoord\". Deze wijziging zal meteen actief zijn.", + + "INFO_PASSWORD_CHANGED" : "Wachtwoord gewijzigd.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Standaard Invoer Methode", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Standaard Muis Emulatie Modus", + "SECTION_HEADER_UPDATE_PASSWORD" : "Wijzig Wachtwoord" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Nieuwe Gebruiker", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Klik of tik op een van de onderstaande gebruikers om die te beheren. Afhankelijk van uw toegangsniveau kunnen gebruikers worden toegevoegd, verwijderd en hun wachtwoorden gewijzigd.", + + "SECTION_HEADER_USERS" : "Gebruikers", + + "TABLE_HEADER_USERNAME" : "Gebruikersnaam" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Beeindig Sessies", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Beeindig Sessie", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Deze pagina wordt gevuld met momenteel actieve verbindingen. De vermelde verbindingen en de mogelijkheid om die verbindingen te doden, zijn afhankelijk van uw toegangsniveau. Als u een of meerdere sessies wilt beeindigen, vink die sessie(s) dan aan en klik op \"Beeindig Sessies\". Door het verbreken van een sessie verliest de gebruiker ogenblikkelijk het contact met die sessie(s).", + + "INFO_NO_SESSIONS" : "Geen actieve sessies", + + "SECTION_HEADER_SESSIONS" : "Actieve Sessies", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Verbindingnaam", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Servernaam", + "TABLE_HEADER_SESSION_STARTDATE" : "Actief sinds", + "TABLE_HEADER_SESSION_USERNAME" : "Gebruikersnaam", + + "TEXT_CONFIRM_DELETE" : "Weet u zeker dat u alle geselecteerde sessies wilt beeindigen? De gebruikers van deze sessies zullen ogenblikkelijk hun verbinding met deze sessies verliezen." + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/no.json b/guacamole/src/main/frontend/src/translations/no.json new file mode 100644 index 0000000..2ddd389 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/no.json @@ -0,0 +1,673 @@ +{ + + "NAME" : "Norsk Bokmål", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Avbryt", + "ACTION_CLONE" : "Klone", + "ACTION_CONTINUE" : "Fortsett", + "ACTION_DELETE" : "Slett", + "ACTION_DELETE_SESSIONS" : "Avslutt Sesjoner", + "ACTION_LOGIN" : "Logg inn", + "ACTION_LOGOUT" : "Logg ut", + "ACTION_MANAGE_CONNECTIONS" : "Forbindelser", + "ACTION_MANAGE_PREFERENCES" : "Mine valg", + "ACTION_MANAGE_SETTINGS" : "Innstillinger", + "ACTION_MANAGE_SESSIONS" : "Aktive Sesjoner", + "ACTION_MANAGE_USERS" : "Brukere", + "ACTION_NAVIGATE_BACK" : "Tilbake", + "ACTION_NAVIGATE_HOME" : "Hjem", + "ACTION_SAVE" : "Lagre", + "ACTION_SEARCH" : "Søk", + "ACTION_UPDATE_PASSWORD" : "Oppdater Passord", + "ACTION_VIEW_HISTORY" : "Historie", + + "DIALOG_HEADER_ERROR" : "Feil", + + "ERROR_PASSWORD_BLANK" : "Passordet ditt kan ikke være blankt.", + "ERROR_PASSWORD_MISMATCH" : "Passordene er ikke like.", + + "FIELD_HEADER_PASSWORD" : "Passord:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Gjenta Passord:", + + "FIELD_PLACEHOLDER_FILTER" : "Filter", + + "FORMAT_DATE_TIME_PRECISE" : "ååå-mm-dd TT:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Blir brukt av {USERS} {USERS, plural, one{user} other{users}}.", + + "NAME" : "Guacamole ${project.version}", + + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{second} other{seconds}}} minute{{VALUE, plural, one{minute} other{minutes}}} hour{{VALUE, plural, one{hour} other{hours}}} day{{VALUE, plural, one{day} other{days}}} other{}}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Tøm", + "ACTION_DISCONNECT" : "Koble fra", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Koble til på nytt", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_UPLOAD_FILES" : "Last Opp Filer", + + "DIALOG_HEADER_CONNECTING" : "Kobler til", + "DIALOG_HEADER_CONNECTION_ERROR" : "Feil ved tilkobling", + "DIALOG_HEADER_DISCONNECTED" : "Frakoblet", + + "ERROR_CLIENT_201" : "Denne tilkoblingen har blitt lukket fordi server er opptatt. Vent noen minutter og prøv igjen.", + "ERROR_CLIENT_202" : "Guacamole har lukket forbindelsen fordi serveren bruker for lang tid på å svare. Prøv igjen eller kontakt systemansvarlig.", + "ERROR_CLIENT_203" : "Det har oppstått en feil på terminalserveren og forbindelsen er lukket. Prøv igjen eller kontakt systemansvarlig.", + "ERROR_CLIENT_205" : "Denne forbindelsen er lukket fordi den er i konflikt med en annen forbindelse. Prøv igjen senere.", + "ERROR_CLIENT_301" : "Innlogging feilet. Koble til på nytt og prøv igjen.", + "ERROR_CLIENT_303" : "Du har ikke tilgang til denne forbindelsen. Kontakt systemansvarlig eller sjekk dine systeminnstillinger dersom du trenger tilgang.", + "ERROR_CLIENT_308" : "Guacamole har lukket forbindelsen fordi nettleseren din ikke har svart og virker frakoblet. Dette kommer ofte av nettverksproblemer som f.eks. ustabilt wifi-signal eller tregt nettverk. Sjekk tilkoblingen din og prøv igjen.", + "ERROR_CLIENT_31D" : "Guacamole nekter tilgang til denne forbindelsen fordi du har brukt opp maks antall samtidige forbindelser for en bruker. Avslutt en eller flere forbindelser og prøv igjen.", + "ERROR_CLIENT_DEFAULT" : "Det har oppstått en intern feil i Guacamole og forbindelsen er terminert. Kontakt systemansvarlig dersom problemet fortsetter eller sjekk systemlogger.", + + "ERROR_TUNNEL_201" : "Guacamole har avvist oppkoblingen fordi det er for mange aktive forbindelser. Vent noen minutter og prøv igjen.", + "ERROR_TUNNEL_202" : "Forbindelsen er lukket fordi server bruker for lang tid på å svare. Dette kommer ofte av nettverksproblemer som f.eks. ustabilt wifi-signal eller tregt nettverk. Sjekk tilkoblingen din og prøv igjen eller kontakt systemadministrator.", + "ERROR_TUNNEL_203" : "Serveren støtte på en feil og har lukket forbindelsen. Prøv igjen eller kontakt systemadministrator.", + "ERROR_TUNNEL_204" : "Den etterspurte tilkoblingen eksisterer ikke. Sjekk navnet på tilkoblingen og prøv igjen.", + "ERROR_TUNNEL_205" : "Denne tilkoblingen er i bruk og flere forbindelser til denne tilkoblingen er ikke lov. Prøv igjen senere.", + "ERROR_TUNNEL_301" : "Du har ikke tilgang til denne tilkoblingen fordi du er ikke pålogget. Logg inn og prøv igjen.", + "ERROR_TUNNEL_303" : "Du har ikke tilgang til denne tilkoblingen. Be systemadministrator legge deg til i listen over godkjente brukere dersom du skal ha tilgang eller sjekk systeminstillingene dine.", + "ERROR_TUNNEL_308" : "Guacamole har lukket forbindelsen fordi nettleseren din ikke svarer og virker frakoblet. Dette kommer ofte av nettverksproblemer som f.eks. ustabilt wifi-signal eller tregt nettverk. Sjekk tilkoblingen din og prøv igjen.", + "ERROR_TUNNEL_31D" : "Guacamole nekter tilgang til denne forbindelsen fordi du har brukt opp maks antall samtidige forbindelser for en bruker. Avslutt en eller flere forbindelser og prøv igjen.", + "ERROR_TUNNEL_DEFAULT" : "En intern feil har oppstått i Guacamole og forbindelsen er terminert. Kontakt systemadministrator dersom problemet fortsetter eller sjekk systemloggene dine.", + + "ERROR_UPLOAD_100" : "Filoverføring er enten ikke støttet eller ikke aktivert. Kontakt systemadministrator eller sjekk systemlogger.", + "ERROR_UPLOAD_201" : "For mange filer blir overført. Vent til aktive overføringer fullfører og prøv igjen.", + "ERROR_UPLOAD_202" : "Filen kan ikke overføres fordi terminalserveren bruker for lang tid på å svare. Prøv igjen eller kontakt systemadministrator.", + "ERROR_UPLOAD_203" : "Det oppstod en feil på terminalserveren under overføring. Prøv igjen eller kontakt systemansvarlig.", + "ERROR_UPLOAD_204" : "Målmappen for filoverføringen eksisterer ikke. Sjekk målmappe og prøv igjen.", + "ERROR_UPLOAD_205" : "Målet til filoverføringen er låst. Vent til aktive jobber fullfører og prøv igjen.", + "ERROR_UPLOAD_301" : "Du har ikke tillatelse til å laste opp denne filen fordi du er ikke logget inn. Logg inn og prøv igjen.", + "ERROR_UPLOAD_303" : "Du har ikke tillatelse til å laste opp denne filen. Sjekk systeminnstillingene dine eller kontakt systemadministrator dersom du skal ha tilgang.", + "ERROR_UPLOAD_308" : "Filoverføringen har stoppet. Dette kommer ofte av nettverksproblemer som f.eks. ustabilt wifi-signal eller tregt nettverk. Sjekk tilkoblingen din og prøv igjen.", + "ERROR_UPLOAD_31D" : "For mange filer blir overført. Vent til aktive overføringer fullfører og prøv igjen.", + "ERROR_UPLOAD_DEFAULT" : "En intern feil har oppstått i Guacamole og forbindelsen er terminert. Kontakt systemadministrator dersom problemet fortsetter eller sjekk systemloggene dine.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Tekst som er kopiert eller klippet i Guacamole vises her. Endringer i teksten under vil påvirke den eksterne utklippstavlen.", + "HELP_INPUT_METHOD_NONE" : "Ingen innenhet er brukt. Tastetrykk fra et fysisk tilkoblet tastatur blir akseptert.", + "HELP_INPUT_METHOD_OSK" : "Vis og aksepter tastetrykk fra det innebygde skjermtastaturet i Guacamole. Skjermtastaturet tillater tasting av tastekombinasjoner som ellers kan være umulig (f.eks. Ctrl-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Tillat tasting av tekst og emuler hendinger basert på tastet tekst. Dette er nødvendig for enheter som mobiltelefoner som mangler fysisk tastatur.", + "HELP_MOUSE_MODE" : "Bestemmer hvordan den fjernstyrte musen reagerer på berøringer.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Trykk for å klikke. Klikket oppstår der man berører.", + "HELP_MOUSE_MODE_RELATIVE" : "Dra for å flytte musemarkøren og trykk for å klikke. Klikket oppstår på plasseringen til musepekeren.", + + "INFO_NO_FILE_TRANSFERS" : "Ingen filoverføringer.", + + "NAME_INPUT_METHOD_NONE" : "Ingen", + "NAME_INPUT_METHOD_OSK" : "Skjermtastatur", + "NAME_INPUT_METHOD_TEXT" : "Inntasting", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Touch-skjerm", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIPBOARD" : "Utklippstavle", + "SECTION_HEADER_DEVICES" : "Enheter", + "SECTION_HEADER_DISPLAY" : "Skjerm", + "SECTION_HEADER_FILE_TRANSFERS" : "Filoverføringer", + "SECTION_HEADER_INPUT_METHOD" : "Standard Innenhet", + "SECTION_HEADER_MOUSE_MODE" : "Metode for musemulering", + + "TEXT_ZOOM_AUTO_FIT" : "Skaler automatisk til nettleservindu.", + "TEXT_CLIENT_STATUS_IDLE" : "Passiv.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Kobler til Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Du er frakoblet.", + "TEXT_CLIENT_STATUS_WAITING" : "Tilkoblet Guacamole. Venter på svar...", + "TEXT_RECONNECT_COUNTDOWN" : "Kobler til på nytt om {REMAINING} {REMAINING, plural, one{second} other{seconds}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Default (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Klikk for å vise passord", + "HELP_HIDE_PASSWORD" : "Klikk for å skjule passord" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Ingen nylige tilkoblinger.", + + "PASSWORD_CHANGED" : "Passord endret.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Alle tilkoblinger", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Nylige tilkoblinger" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Ugyldig Pålogging", + + "FIELD_HEADER_USERNAME" : "Brukernavn", + "FIELD_HEADER_PASSWORD" : "Passord" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Slett tilkobling", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Lokasjon:", + "FIELD_HEADER_NAME" : "Navn:", + "FIELD_HEADER_PROTOCOL" : "Protokoll:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Aktiv Nå", + "INFO_CONNECTION_NOT_USED" : "Denne tilkoblingen har ikke blitt brukt enda.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Rediger Tilkobling", + "SECTION_HEADER_HISTORY" : "Brukslogg", + "SECTION_HEADER_PARAMETERS" : "Parametre", + + "TABLE_HEADER_HISTORY_USERNAME" : "Brukernavn", + "TABLE_HEADER_HISTORY_START" : "Starttid", + "TABLE_HEADER_HISTORY_DURATION" : "Varighet", + + "TEXT_CONFIRM_DELETE" : "Tilkoblinger kan ikke gjennopprettes etter at de er slettet. Er du sikker på at du vil slette denne tilkoblingen?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Slett Tilkoblingsgruppe", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Lokasjon:", + "FIELD_HEADER_NAME" : "Navn:", + "FIELD_HEADER_TYPE" : "Type:", + + "NAME_TYPE_BALANCING" : "Balansert", + "NAME_TYPE_ORGANIZATIONAL" : "Organisasjon", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Rediger Tilkoblingsgruppe", + + "TEXT_CONFIRM_DELETE" : "Tilkoblingsgrupper kan ikke gjennopprettes etter at de er slettet. Er du sikker på at du vil slette denne tilkoblingsgruppen?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Slett Bruker", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administrer systemet:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Endre eget passord:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Opprett ny bruker:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Opprett ny tilkobling:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Opprett ny tilkoblingsgruppe:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USERNAME" : "Brukernavn:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_READ_ONLY" : "Beklager, denne brukerkontoen kan ikke redigeres.", + + "SECTION_HEADER_CONNECTIONS" : "Tilkoblinger", + "SECTION_HEADER_EDIT_USER" : "Rediger Bruker", + "SECTION_HEADER_PERMISSIONS" : "Tillatelser", + + "TEXT_CONFIRM_DELETE" : "Brukere kan ikke gjenopprettes etter at de er slettet. Er du sikker på du vil slette denne brukeren?" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Klientnavn:", + "FIELD_HEADER_COLOR_DEPTH" : "Fargedybde:", + "FIELD_HEADER_CONSOLE" : "Administratorkonsoll:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Støtte for lyd i konsoll:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Opprett disk automatisk:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Opprett sti for opptak automatisk:", + "FIELD_HEADER_DISABLE_AUDIO" : "Deaktiver lyd:", + "FIELD_HEADER_DISABLE_AUTH" : "Deaktiver autentisering:", + "FIELD_HEADER_DOMAIN" : "Domene:", + "FIELD_HEADER_DPI" : "Oppløsning (DPI):", + "FIELD_HEADER_DRIVE_PATH" : "Sti til disk:", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Aktiver skrivebordssammensetning (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Aktiver disk:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Aktiver fontutjevning (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Vis innhold i vindu ved flytting:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Aktiver menyanimasjoner:", + "FIELD_HEADER_ENABLE_PRINTING" : "Aktiver utskrift:", + "FIELD_HEADER_ENABLE_SFTP" : "Aktiver SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Aktiver tema:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Ativer bakgrunnsbilde:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domene:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Vertsnavn:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Passord:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Brukernavn:", + "FIELD_HEADER_HEIGHT" : "Høyde:", + "FIELD_HEADER_HOSTNAME" : "Vertsnavn:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorer serversertifikat:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Oppstartsprogram:", + "FIELD_HEADER_PASSWORD" : "Passord:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Pre-tilkoblings BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP kilde-ID:", + "FIELD_HEADER_RECORDING_NAME" : "Navn på opptak:", + "FIELD_HEADER_RECORDING_PATH" : "Sti for opptak:", + "FIELD_HEADER_RESIZE_METHOD" : "Metode for reskalering:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parameter:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Arbeidsmappe:", + "FIELD_HEADER_REMOTE_APP" : "Program:", + "FIELD_HEADER_SECURITY" : "Sikkerhetsmodus:", + "FIELD_HEADER_SERVER_LAYOUT" : "Tastaturutforming:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Standard mappe for opplasting:", + "FIELD_HEADER_SFTP_HOSTNAME" : "Vertsnavn:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passfrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Passord:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Privat nøkkel:", + "FIELD_HEADER_SFTP_USERNAME" : "Brukernavn:", + "FIELD_HEADER_STATIC_CHANNELS" : "Statiske kanalnavn:", + "FIELD_HEADER_USERNAME" : "Brukernavn:", + "FIELD_HEADER_WIDTH" : "Bredde:", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Tusener av farger (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Ekte farger (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Ekte farger (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 farger", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Display Update\" virtual channel (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Koble til på nytt", + + "FIELD_OPTION_SECURITY_ANY" : "Alle", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Network Level Authentication)", + "FIELD_OPTION_SECURITY_RDP" : "RDP kryptering", + "FIELD_OPTION_SECURITY_TLS" : "TLS kryptering", + + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Tysk (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US Engelsk (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Fransk (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italiensk (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japansk (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polsk (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Svensk (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Autentisering", + "SECTION_HEADER_BASIC_PARAMETERS" : "Grunnleggende Innstillinger", + "SECTION_HEADER_CLIPBOARD" : "Utklippstavle", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Enhet omdirigering", + "SECTION_HEADER_DISPLAY" : "Skjerm", + "SECTION_HEADER_NETWORK" : "Nettverk", + "SECTION_HEADER_PERFORMANCE" : "Ytelse", + "SECTION_HEADER_PRECONNECTION_PDU" : "Pre-tilkobling PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Skjermopptak", + "SECTION_HEADER_REMOTEAPP" : "Eksternt Program", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_COLOR_SCHEME" : "Fargeskjema:", + "FIELD_HEADER_COMMAND" : "Kjør kommando:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Opprett sti for opptak automatisk:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Opprett sti for typescript automatisk:", + "FIELD_HEADER_FONT_NAME" : "Fontnavn:", + "FIELD_HEADER_FONT_SIZE" : "Fontstørrelse:", + "FIELD_HEADER_ENABLE_SFTP" : "Aktiver SFTP:", + "FIELD_HEADER_HOSTNAME" : "Servernavn:", + "FIELD_HEADER_USERNAME" : "Brukernavn:", + "FIELD_HEADER_PASSWORD" : "Passord:", + "FIELD_HEADER_PASSPHRASE" : "Passfrase:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Privat nøkkel:", + "FIELD_HEADER_RECORDING_NAME" : "Navm på opptak:", + "FIELD_HEADER_RECORDING_PATH" : "Sti til opptak:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript navn:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript sti:", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Svart på hvit", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grå på svart", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Grønn på svart", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Hvit på svart", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Autentisering", + "SECTION_HEADER_CLIPBOARD" : "Utklippstavle", + "SECTION_HEADER_DISPLAY" : "Skjerm", + "SECTION_HEADER_NETWORK" : "Nettverk", + "SECTION_HEADER_RECORDING" : "Skjermopptak", + "SECTION_HEADER_SESSION" : "Sesjon / Miljø", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Opptak av tekstsesjon)", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_COLOR_SCHEME" : "Fargeskjema:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Opprett sti for opptak automatisk:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Opprett sti for typescript automatisk:", + "FIELD_HEADER_FONT_NAME" : "Fontnavn:", + "FIELD_HEADER_FONT_SIZE" : "Fontstørrelse:", + "FIELD_HEADER_HOSTNAME" : "Servernavn:", + "FIELD_HEADER_USERNAME" : "Brukernavn:", + "FIELD_HEADER_PASSWORD" : "Passord:", + "FIELD_HEADER_PASSWORD_REGEX" : "Passord regulært uttrykk:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_RECORDING_NAME" : "Navn på opptak:", + "FIELD_HEADER_RECORDING_PATH" : "Sti til opptak:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript navn:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript sti:", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Svart på hvit", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Grå på svart", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Grønn på svart", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Hvit på svart", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Autentisering", + "SECTION_HEADER_CLIPBOARD" : "Utklippstavle", + "SECTION_HEADER_DISPLAY" : "Skjerm", + "SECTION_HEADER_RECORDING" : "Skjermopptak", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (Opptak av tekstsesjon)", + "SECTION_HEADER_NETWORK" : "Nettverk" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Lydserver:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Koding:", + "FIELD_HEADER_COLOR_DEPTH" : "Fargedybde:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Opprett sti for opptak automatisk:", + "FIELD_HEADER_CURSOR" : "Peker:", + "FIELD_HEADER_DEST_HOST" : "Målserver:", + "FIELD_HEADER_DEST_PORT" : "Målport:", + "FIELD_HEADER_ENABLE_AUDIO" : "Aktiver lyd:", + "FIELD_HEADER_ENABLE_SFTP" : "Aktiver SFTP:", + "FIELD_HEADER_HOSTNAME" : "Servernavn:", + "FIELD_HEADER_USERNAME" : "Brukernavn:", + "FIELD_HEADER_PASSWORD" : "Passord:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Skrivebeskyttet:", + "FIELD_HEADER_RECORDING_NAME" : "Navn på opptak:", + "FIELD_HEADER_RECORDING_PATH" : "Sti til opptak:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Standard mappe for opplasting:", + "FIELD_HEADER_SFTP_HOSTNAME" : "Servernavn:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Passfrase:", + "FIELD_HEADER_SFTP_PASSWORD" : "Passord:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Privat nøkkel:", + "FIELD_HEADER_SFTP_USERNAME" : "Brukernavn:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Bytt røde/blå komponenter:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 farger", + "FIELD_OPTION_COLOR_DEPTH_16" : "Tusener av farger (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "Ekte farger (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "Ekte farger (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Lokal", + "FIELD_OPTION_CURSOR_REMOTE" : "Ekstern", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Lyd", + "SECTION_HEADER_AUTHENTICATION" : "Autentisering", + "SECTION_HEADER_CLIPBOARD" : "Utklippstavle", + "SECTION_HEADER_DISPLAY" : "Skjerm", + "SECTION_HEADER_NETWORK" : "Nettverk", + "SECTION_HEADER_RECORDING" : "Skjermopptak", + "SECTION_HEADER_REPEATER" : "VNC Repeater", + "SECTION_HEADER_SFTP" : "SFTP" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Innstillinger" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Tidligere forbindelser er listet her historisk og kan sorteres ved å klikke kolonneoverskriftene. For å lete etter spesifikke poster kan du legge inn en filtreringstekst og klikke \"Søk\". Bare poster som passer filtreringsteksten vil bli listet opp.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Ingen poster funnet", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Navn på tilkobling", + "TABLE_HEADER_SESSION_DURATION" : "Varighet", + "TABLE_HEADER_SESSION_STARTDATE" : "Starttidspunkt", + "TABLE_HEADER_SESSION_USERNAME" : "Brukernavn", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Ny Forbindelse", + "ACTION_NEW_CONNECTION_GROUP" : "Ny Gruppe", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Klikk eller berør en forbindelse under for å administrere forbindelsen. Avhengig av ditt tilgangsnivå kan forbindelser opprettes, slettes og egenskaper (protokoll, server, port, m.m.) kan endres.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Forbindelser" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Visningsspråk:", + "FIELD_HEADER_PASSWORD" : "Passord:", + "FIELD_HEADER_PASSWORD_OLD" : "Nåværende Passord:", + "FIELD_HEADER_PASSWORD_NEW" : "Nytt Passord:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Verifiser Nytt Passord:", + "FIELD_HEADER_USERNAME" : "Brukernavn:", + + "HELP_DEFAULT_INPUT_METHOD" : "Standard inndatametode bestemmer hvordan tastetrykk mottas av Guacamole. Det kan være nødvendig å endre på dette når du bruker mobile enheter eller IME. Denne instillingen kan overstyres på hver forbindelse i Guacamolemenyen.", + "HELP_DEFAULT_MOUSE_MODE" : "Standard musemulering bestemmer hvordan den eksterne musen vil oppføre seg med hensyn til berøringer. Denne instillingen kan overstyres på hver forbindelse i Guacamolemenyen.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LANGUAGE" : "Velg et språk under for å endre språket på all tekst i Guacamole. Tilgjengelige valg er avhengig av hvilke språk som er installert.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Skriv inn ditt gamle passord og det nye passordet under dersom du ønsker å endre passord. Klikk \"Oppdater Passord\". Endringen trer i kraft umiddelbart.", + + "INFO_PASSWORD_CHANGED" : "Passord endret.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Standard Innenhet", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Standard Metode For Musemulering", + "SECTION_HEADER_UPDATE_PASSWORD" : "Endre Passord" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Ny Bruker", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Klikk på en bruker under for å administrere den brukeren. Avhengig av din tilgang kan brukere legges til, slettes og passordet kan endres.", + + "SECTION_HEADER_USERS" : "Brukere", + + "TABLE_HEADER_USERNAME" : "Brukernavn" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Avbryt sesjoner", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Avbryt Sesjoner", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Denne siden vil bli fylt med nåværende aktive forbindelser. Tilkoblingene oppført og evnen til å drepe disse tilkoblingene er avhengig av tilgangsnivået ditt. Dersom du ønsker å avbryte en eller flere sesjoner haker du av boksen ved siden av sesjonen og klikker \"Avbryt sesjoner\". Avbrytes en sesjon vil brukeren umiddelbart kobles av den aktuelle sesjonen.", + + "INFO_NO_SESSIONS" : "Ingen aktive sesjoner", + + "SECTION_HEADER_SESSIONS" : "Aktive Sesjoner", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Navn på forbindelse", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Server", + "TABLE_HEADER_SESSION_STARTDATE" : "Aktiv siden", + "TABLE_HEADER_SESSION_USERNAME" : "Brukernavn", + + "TEXT_CONFIRM_DELETE" : "Er du sikker på at du vil avslutte valgte sesjoner? Brukere av disse sesjonene vil bli frakoblet umiddelbart." + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/pl.json b/guacamole/src/main/frontend/src/translations/pl.json new file mode 100644 index 0000000..a01724d --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/pl.json @@ -0,0 +1,1058 @@ +{ + + "NAME" : "Polski", + + "APP" : { + + "NAME" : "Apache Guacamole", + "VERSION" : "${project.version}", + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Anuluj", + "ACTION_CLONE" : "Klonuj", + "ACTION_CONTINUE" : "Kontynuuj", + "ACTION_DELETE" : "Usuń", + "ACTION_DELETE_SESSIONS" : "Zakończ Sesję", + "ACTION_DOWNLOAD" : "Pobierz", + "ACTION_LOGIN" : "Zaloguj", + "ACTION_LOGIN_AGAIN" : "Zaloguj Ponownie", + "ACTION_LOGOUT" : "Wyloguj", + "ACTION_MANAGE_CONNECTIONS" : "Połączenia", + "ACTION_MANAGE_PREFERENCES" : "Preferencje", + "ACTION_MANAGE_SETTINGS" : "Ustawienia", + "ACTION_MANAGE_SESSIONS" : "Aktywne Sesje", + "ACTION_MANAGE_USERS" : "Użytkownicy", + "ACTION_MANAGE_USER_GROUPS" : "Grupy", + "ACTION_NAVIGATE_BACK" : "Wstecz", + "ACTION_NAVIGATE_HOME" : "Główna", + "ACTION_PAUSE" : "Pauza", + "ACTION_PLAY" : "Odtwórz", + "ACTION_SAVE" : "Zapisz", + "ACTION_SEARCH" : "Szukaj", + "ACTION_SHARE" : "Udostępnij", + "ACTION_UPDATE_PASSWORD" : "Zmień Hasło", + "ACTION_VIEW_HISTORY" : "Historia", + "ACTION_VIEW_RECORDING" : "Obejrzyj", + + "DIALOG_HEADER_ERROR" : "Błąd", + + "ERROR_PAGE_UNAVAILABLE" : "Wystąpił błąd i ta akcja nie może zostać zakończona. Jeśli problem nie zniknie, powiadom administratora systemu.", + "ERROR_PASSWORD_BLANK" : "Hasło nie może być puste.", + "ERROR_PASSWORD_MISMATCH" : "Podane hasła nie pasują do siebie.", + + "FIELD_HEADER_PASSWORD" : "Hasło:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Powtórz Hasło:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtruj", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Aktualnie w użyciu przez {USERS} {USERS, plural, one{użytkownika} other{użytkowników}}.", + "INFO_LOGGED_OUT" : "Zostałeś wylogowany.", + + "TEXT_ANONYMOUS_USER" : "Anonimowy", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{sekunda} other{sekund(-y)}}} minute{{VALUE, plural, one{minuta} other{minut(y)}}} hour{{VALUE, plural, one{godzina} other{godzin(y)}}} day{{VALUE, plural, one{dzień} other{dni}}} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Wyczyść", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Rozłącz", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Połącz Ponownie", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_UPLOAD_FILES" : "Wyślij Pliki", + + "DIALOG_HEADER_CONNECTING" : "Łączenie", + "DIALOG_HEADER_CONNECTION_ERROR" : "Błąd Połączenia", + "DIALOG_HEADER_DISCONNECTED" : "Rozłączono", + + "ERROR_CLIENT_201" : "Połączenie zostało zamknięte, ponieważ serwer jest zajęty. Odczekaj kilka minut i spróbuj ponownie.", + "ERROR_CLIENT_202" : "Serwer Guacamole zamknął połączenie, ponieważ zdalny pulpit nie odpowiada przez zbyt długi czas. Spróbuj ponownie lub skontaktuj się z administratorem.", + "ERROR_CLIENT_203" : "Serwer zdalnego pulpitu napotkał błąd i zamknął połączenie. Spróbuj ponownie lub skontaktuj się z administratorem.", + "ERROR_CLIENT_207" : "Serwer zdalnego pulpitu jest aktualnie nieosiągalny. Jeśli problem nie zniknie powiadom administratora systemu lub sprawdź log systemu.", + "ERROR_CLIENT_208" : "Serwer zdalnego pulpitu jest aktualnie nieosiągalny. Jeśli problem nie zniknie powiadom administratora systemu lub sprawdź log systemu.", + "ERROR_CLIENT_209" : "Serwer zdalnego pulpitu zamknął połączenie, ponieważ koliduje z innym połączeniem. Spróbuj ponownie później.", + "ERROR_CLIENT_20A" : "Serwer zdalnego pulpitu zamknął połączenie, ponieważ wydaje się być nieaktywne. Jeśli nie jest to pożądane zachowanie powiadom administratora systemu lub sprawdź ustawienia.", + "ERROR_CLIENT_20B" : "Serwer zdalnego pulpitu wymusił zamknięcie połączenia. Jeśli nie jest to pożądane zachowanie powiadom administratora systemu lub sprawdź log systemu.", + "ERROR_CLIENT_301" : "Logowanie nieudane. Spróbuj ponownie.", + "ERROR_CLIENT_303" : "Serwer zdalnego pulpitu nie zezwolił na połączenie. Poproś administratora systemu o nadanie uprawnień dla Twojego konta lub sprawdź ustawienia.", + "ERROR_CLIENT_308" : "Serwer Guacamole zamknął połączenie, ponieważ nie otrzymał odpowiedzi od Twojej przeglądarki przez zbyt długi czas. Zazwyczaj jest to spowodowane niską szybkością i jakością połączenia. Sprawdź swoje ustawienia sieci i spróbuj ponownie.", + "ERROR_CLIENT_31D" : "Serwer Guacamole nie zezwolił na połączenie, ponieważ wykorzystałeś limit jednoczesnych połączeń dla pojedynczego użytkownika. Zamknij jedno lub kilka połączeń i spróbuj ponownie.", + "ERROR_CLIENT_DEFAULT" : "Wystąpił błąd wewnętrzny serwera Guacamole i połączenie zostało zakończone. Jeśli problem nie zniknie, powiadom administratora systemu lub sprawdź log systemu.", + + "ERROR_TUNNEL_201" : "Serwer Guacamole odrzucił tę próbę połączenia, ponieważ istnieje zbyt wiele aktywnych połączeń. Poczekaj kilka minut i spróbuj ponownie.", + "ERROR_TUNNEL_202" : "Połączenie zostało zamknięte, ponieważ serwer nie odpowiada przez zbyt długo czas. Zazwyczaj spowodowane jest to niską szybkością i jakością połączenia. Sprawdź swoje ustawienia sieci i spróbuj ponownie lub poinformuj administratora systemu.", + "ERROR_TUNNEL_203" : "Serwer napotkał błąd i zamknął połączenie. Spróbuj ponownie lub skontaktuj się z administratorem systemu", + "ERROR_TUNNEL_204" : "Żądane połączenie nie istnieje. Sprawdź nazwę połączenia i spróbuj ponownie", + "ERROR_TUNNEL_205" : "To połączenie jest aktualnie w użyciu oraz jednoczesny dostęp dla tego połączenia nie jest dozwolony. Spróbuj ponownie później.", + "ERROR_TUNNEL_207" : "Serwer Guacamole jest aktualnie nieosiągalny. Sprawdź swoją sieć i spróbuj ponownie.", + "ERROR_TUNNEL_208" : "Serwer Guacamole nie akceptuje połączeń. Sprawdź swoją sieć i spróbuj ponownie.", + "ERROR_TUNNEL_301" : "Nie masz dostępu do tego połączenia, ponieważ nie jesteś zalogowany. Zaloguj się i spróbuj ponownie.", + "ERROR_TUNNEL_303" : "Nie masz uprawnień do tego połączenia. Jeśli potrzebujesz uprawnień poproś administratora systemu o dodanie Cię do listy użytkowników z zezwoleniem lub sprawdź ustawienia systemu. ", + "ERROR_TUNNEL_308" : "Serwer Guacamole zamknął połączenie, ponieważ nie otrzymał odpowiedzi od Twojej przeglądarki przez zbyt długi czas. Zazwyczaj jest to spowodowane niską szybkością i jakością połączenia. Sprawdź swoje ustawienia sieci i spróbuj ponownie.", + "ERROR_TUNNEL_31D" : "Serwer Guacamole nie zezwolił na połączenie, ponieważ wykorzystałeś limit jednoczesnych połączeń dla pojedynczego użytkownika. Zamknij jedno lub kilka połączeń i spróbuj ponownie.", + "ERROR_TUNNEL_DEFAULT" : "Wystąpił błąd wewnętrzny serwera Guacamole i połączenie zostało zakończone. Jeśli problem nie zniknie, powiadom administratora systemu lub sprawdź log systemu.", + + "ERROR_UPLOAD_100" : "Transfer plików jest nie wspierany lub wyłączony. Skontaktuj się z administratorem systemu lub sprawdź log systemu.", + "ERROR_UPLOAD_201" : "Zbyt wiele plików jest aktualnie transferowanych. Poczekaj na zakończenie trwających transferów i spróbuj ponownie.", + "ERROR_UPLOAD_202" : "Plik nie może zostać przesłany, ponieważ Serwer zdalnego pulpitu nie odpowiada przez zbyt długi czas. Spróbuj ponownie lub skontaktuj się z administratorem systemu", + "ERROR_UPLOAD_203" : "Serwer zdalnego pulpitu napotkał na błąd podczas transferu. Spróbuj ponownie lub skontaktuj się z administratorem systemu", + "ERROR_UPLOAD_204" : "Docelowa ścieżka transferu pliku nie istnieje. Upewnij się, że ścieżka docelowa istnieje i spróbuj ponownie.", + "ERROR_UPLOAD_205" : "Lokalizacja docelowa dla transferu pliku jest aktualnie zablokowana. Poczekaj na zakończenie trwający zadań i spróbuj ponownie.", + "ERROR_UPLOAD_301" : "Nie masz uprawnień do przesłania tego pliku, ponieważ jest nie zalogowany. Zaloguj się i spróbuj ponownie.", + "ERROR_UPLOAD_303" : "Nie masz uprawnień do przesłania tego pliku. Jeśli potrzebujesz dostępu sprawdź ustawienia systemu lub skontaktuj się z administratorem systemu.", + "ERROR_UPLOAD_308" : "Transfer pliku utknął w martwym punkcie. Zazwyczaj jest to spowodowane niską szybkością i jakością połączenia. Sprawdź swoje ustawienia sieci i spróbuj ponownie.", + "ERROR_UPLOAD_31D" : "Zbyt wiele plików jest aktualnie transferowanych. Poczekaj na zakończenie trwających transferów i spróbuj ponownie.", + "ERROR_UPLOAD_DEFAULT" : "Wystąpił błąd wewnętrzny serwera Guacamole i połączenie zostało zakończone. Jeśli problem nie zniknie, powiadom administratora systemu lub sprawdź log systemu.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Tekst skopiowany/wycięty wewnątrz serwera Guacamole pojawi się tutaj. Zmiany dokonane w tym miejscu będą miały wpływ na zawartość zdalnego schowka", + "HELP_INPUT_METHOD_NONE" : "Żadna metoda wejścia nie jest w użyciu. Wejście klawiatury jest akceptowane z podłączonej fizycznej klawiatury.", + "HELP_INPUT_METHOD_OSK" : "Wyświetl i zaakceptuj dane wejściowe z wbudowanej klawiatury ekranowej Guacamole. Klawiatura ekranowa umożliwia wpisywanie kombinacji klawiszy, które w innym przypadku byłyby niemożliwe (takich jak Ctrl-Alt-Del)", + "HELP_INPUT_METHOD_TEXT" : "Zezwalaj na pisanie tekstu i emuluj zdarzenia klawiatury na podstawie wpisanego tekstu. Jest to konieczne w przypadku urządzeń takich jak telefony komórkowe, które nie mają fizycznej klawiatury.", + "HELP_MOUSE_MODE" : "Określa zachowanie zdalnej myszy w odniesieniu do dotknięć.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Dotknij, aby kliknąć. Kliknięcie następuje w miejscu dotknięcia.", + "HELP_MOUSE_MODE_RELATIVE" : "Przeciągnij, aby przesunąć wskaźnik myszy i dotknij, aby kliknąć. Kliknięcie następuje w miejscu, w którym znajduje się wskaźnik.", + "HELP_SHARE_LINK" : "Aktualne połączenie jest udostępniane, dostęp może uzyskać każdy posiadający {LINKS, plural, one{link} other{linki}}:", + + "INFO_CONNECTION_SHARED" : "To połączenie jest teraz udostępniane.", + "INFO_NO_FILE_TRANSFERS" : "Brak transferów plików.", + + "NAME_INPUT_METHOD_NONE" : "Brak", + "NAME_INPUT_METHOD_OSK" : "Klawiatura ekranowa", + "NAME_INPUT_METHOD_TEXT" : "Pole tekstowe", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Ekran dotykowy", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIPBOARD" : "Schowek", + "SECTION_HEADER_DEVICES" : "Urządzenia", + "SECTION_HEADER_DISPLAY" : "Wyświetlanie", + "SECTION_HEADER_FILE_TRANSFERS" : "Transfer Plików", + "SECTION_HEADER_INPUT_METHOD" : "Metoda wejścia", + "SECTION_HEADER_MOUSE_MODE" : "Tryb emulacji myszy", + + "TEXT_ZOOM_AUTO_FIT" : "Automatycznie dopasuj do okna przeglądarki", + "TEXT_CLIENT_STATUS_IDLE" : "Bezczynne.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Łączenie z Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Zostałeś rozłączony.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "Połączenie sieciowe z serwerem Guacamole wydaje się być niestabilne.", + "TEXT_CLIENT_STATUS_WAITING" : "Połączono z Guacamole. Czekanie na odpowiedź...", + "TEXT_RECONNECT_COUNTDOWN" : "Ponowne połączenie za {REMAINING} {REMAINING, plural, one{sekundę} other{sekund(-y)}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Ukryj", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Pokaż", + + "FIELD_HEADER_BACKGROUND" : "Drugi plan", + "FIELD_HEADER_FOREGROUND" : "Pierwszy plan", + + "FIELD_OPTION_CUSTOM" : "Niestandardowy...", + + "SECTION_HEADER_DETAILS" : "Szczegóły:" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Domyślny (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Naciśnij aby pokazać hasło", + "HELP_HIDE_PASSWORD" : "Naciśnij aby ukryć hasło" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Brak ostatnich połączeń.", + + "PASSWORD_CHANGED" : "Hasło zmienione.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Wszystkie połączenia", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Ostatnie połączenia" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anonimowy" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Niepoprawny Login", + + "FIELD_HEADER_USERNAME" : "Użytkownik", + "FIELD_HEADER_PASSWORD" : "Hasło" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Usuń Połączenie", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Lokalizacja:", + "FIELD_HEADER_NAME" : "Nazwa:", + "FIELD_HEADER_PROTOCOL" : "Protokół:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Aktywne Teraz", + "INFO_CONNECTION_NOT_USED" : "To połączenie nie zostało jeszcze użyte.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Edytuj Połączenie", + "SECTION_HEADER_HISTORY" : "Historia Użycia", + "SECTION_HEADER_PARAMETERS" : "Parametry", + + "TABLE_HEADER_HISTORY_USERNAME" : "Użytkownik", + "TABLE_HEADER_HISTORY_START" : "Czas Rozpoczęcia", + "TABLE_HEADER_HISTORY_DURATION" : "Czas Trwania", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Zdalny Host", + + "TEXT_CONFIRM_DELETE" : "Połączenia nie mogą zostać przywrócone po ich usunięciu. Czy na pewno chcesz usunąć to połączenie?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Usuń Grupę Połączeń", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Lokalizacja:", + "FIELD_HEADER_NAME" : "Nazwa:", + "FIELD_HEADER_TYPE" : "Typ:", + + "NAME_TYPE_BALANCING" : "Równoważący obciążenie", + "NAME_TYPE_ORGANIZATIONAL" : "Organizacyjny", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Edytuj Grupę Połączeń", + + "TEXT_CONFIRM_DELETE" : "Grupy połączeń nie mogą zostać przywrócone po tym jak zostaną usunięte. Czy na pewno chcesz usunąć tę grupę połączeń?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Usuń Profil Udostępniania", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Nazwa:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Podstawowe Połączenie:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Edytuj Profil Udostępniania", + "SECTION_HEADER_PARAMETERS" : "Parametry", + + "TEXT_CONFIRM_DELETE" : "Profile udostępniania nie mogą zostać przywrócone po tym jak zostaną usunięte. Czy na pewno chcesz usunąć ten profil udostępniania?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Usuń Użytkownika", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administracja systemem:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Zmiana własnego hasła:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Tworzenie nowych użytkowników:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Tworzenie nowych grup użytkowników:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Tworzenie nowych połączeń:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Tworzenie nowych grup połączeń:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Tworzenie nowych profili udostępniania:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Logowanie zablokowane:", + "FIELD_HEADER_USERNAME" : "Nazwa użytkownika:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Ten użytkownik nie należy obecnie do żadnej grupy. Rozwiń tę sekcje aby dodać do grupy.", + + "INFO_READ_ONLY" : "Ten użytkownik nie może być edytowany", + "INFO_NO_USER_GROUPS_AVAILABLE" : "Brak dostępnych grup.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Wszystkie Połączenia", + "SECTION_HEADER_CONNECTIONS" : "Połączenia", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Obecne Połączenia", + "SECTION_HEADER_EDIT_USER" : "Edytuj Użytkownika", + "SECTION_HEADER_PERMISSIONS" : "Uprawnienia", + "SECTION_HEADER_USER_GROUPS" : "Grupy", + + "TEXT_CONFIRM_DELETE" : "Użytkownicy nie mogą zostać przywróceni po tym jak zostaną usunięci. Czy na pewno chcesz usunąć tego użytkownika?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Usuń grupę", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_DISABLED" : "Wyłączona:", + "FIELD_HEADER_USER_GROUP_NAME" : "Nazwa grupy:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "To grupa nie należy do żadnej grupy. Rozwiń tę sekcje aby dodać do grupy.", + "HELP_NO_MEMBER_USER_GROUPS" : "Ta grupa nie zawiera żadnych grup. Rozwiń tę sekcje aby dodać grupy.", + "HELP_NO_MEMBER_USERS" : "Ta grupa nie zawiera żadnych użytkowników. Rozwiń tę sekcje aby dodać użytkowników do grupy.", + + "INFO_READ_ONLY" : "Ta grupa nie może być edytowana", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "Brak dostępnych użytkowników.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Edytuj Grupę", + "SECTION_HEADER_MEMBER_USERS" : "Należący użytkownicy", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Należące grupy", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Grupy nadrzędne", + + "TEXT_CONFIRM_DELETE" : "Grupy nie mogą zostać przywrócone po tym jak zostaną usunięte. Czy na pewno chcesz usunąć tę grupę?" + + }, + + "PLAYER" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_PAUSE" : "@:APP.ACTION_PAUSE", + "ACTION_PLAY" : "@:APP.ACTION_PLAY", + + "INFO_LOADING_RECORDING" : "Twoje nagranie jest właśnie ładowane. Proszę czekać...", + "INFO_SEEK_IN_PROGRESS" : "Szukanie żądanej pozycji. Proszę czekać..." + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Klawisz Backspace wysyła:", + "FIELD_HEADER_CA_CERT" : "Certyfikat CA:", + "FIELD_HEADER_CLIENT_CERT" : "Certyfikat klienta:", + "FIELD_HEADER_CLIENT_KEY" : "Klucz klienta:", + "FIELD_HEADER_COLOR_SCHEME" : "Schemat kolorów:", + "FIELD_HEADER_CONTAINER" : "Nazwa kontenera:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatycznie utwórz ścieżkę nagrywania:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatycznie utwórz ścieżkę maszynopisu:", + "FIELD_HEADER_DISABLE_COPY" : "Wyłącz kopiowanie z terminala:", + "FIELD_HEADER_DISABLE_PASTE" : "Wyłącz wklejanie z klienta:", + "FIELD_HEADER_EXEC_COMMAND" : "Komenda (exec):", + "FIELD_HEADER_FONT_NAME" : "Nazwa czcionki:", + "FIELD_HEADER_FONT_SIZE" : "Rozmiar czcionki:", + "FIELD_HEADER_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_IGNORE_CERT" : "Ignoruj certyfikat serwera:", + "FIELD_HEADER_NAMESPACE" : "Przestrzeń nazw:", + "FIELD_HEADER_POD" : "Nazwa pod'a:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Tylko do odczytu:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Wyklucz mysz:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Wyklucz grafiki/strumienie:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Dołącz zdarzenia klawiszy:", + "FIELD_HEADER_RECORDING_NAME" : "Nazwa nagrania:", + "FIELD_HEADER_RECORDING_PATH" : "Ścieżka nagrania:", + "FIELD_HEADER_SCROLLBACK" : "Maksymalny rozmiar przewijania:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nazwa maszynopisu:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ścieżka maszynopisu:", + "FIELD_HEADER_USE_SSL" : "Użyj SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Czarny na białym", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Szary na czarnym", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Zielony na czarnym", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Biały na czarnym", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Uwierzytelnianie", + "SECTION_HEADER_BEHAVIOR" : "Zachowanie terminala", + "SECTION_HEADER_CLIPBOARD" : "Schowek", + "SECTION_HEADER_CONTAINER" : "Kontener", + "SECTION_HEADER_DISPLAY" : "Wyświetlanie", + "SECTION_HEADER_RECORDING" : "Nagrywanie Ekranu", + "SECTION_HEADER_TYPESCRIPT" : "Maszynopis (Tekstowe nagranie sesji)", + "SECTION_HEADER_NETWORK" : "Sieć" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Nazwa klienta:", + "FIELD_HEADER_COLOR_DEPTH" : "Głębia kolorów:", + "FIELD_HEADER_CONSOLE" : "Konsola administratora:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Wspieraj dźwięk w konsoli:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Automatycznie utwórz dysk:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatycznie utwórz ścieżkę nagrywania:", + "FIELD_HEADER_DISABLE_AUDIO" : "Wyłącz dźwięk:", + "FIELD_HEADER_DISABLE_AUTH" : "Wyłącz uwierzytelnianie:", + "FIELD_HEADER_DISABLE_COPY" : "Wyłącz kopiowanie ze zdalnego pulpitu:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Wyłącz pobieranie plików:", + "FIELD_HEADER_DISABLE_PASTE" : "Wyłącz wklejanie z klienta:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Wyłącz przesyłanie plików:", + "FIELD_HEADER_DOMAIN" : "Domena:", + "FIELD_HEADER_DPI" : "Rozdzielczość (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Nazwa dysku:", + "FIELD_HEADER_DRIVE_PATH" : "Ścieżka dysku:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Włącz wejście dźwięku (mikrofon):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Włącz kompozycje pulpitu (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Włącz dysk:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Włącz wygładzanie czcionek (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Włącz przeciąganie w pełnym oknie:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Włącz animacje menu:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Wyłącz bitmap caching:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Wyłącz off-screen caching:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Wyłącz glyph caching:", + "FIELD_HEADER_DISABLE_GFX" : "Wyłącz Rozszerzenie Potoku Graficznego:", + "FIELD_HEADER_ENABLE_PRINTING" : "Włącz drukowanie:", + "FIELD_HEADER_ENABLE_SFTP" : "Włącz SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Włącz motyw:", + "FIELD_HEADER_ENABLE_TOUCH" : "Włącz multi-touch:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Włącz tapetę:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Wymuś bezstratną kompresję:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domena:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Nazwa hosta:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Hasło:", + "FIELD_HEADER_GATEWAY_PORT" : "Port:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Użytkownik:", + "FIELD_HEADER_HEIGHT" : "Wysokość:", + "FIELD_HEADER_HOSTNAME" : "Nazwa hosta:", + "FIELD_HEADER_IGNORE_CERT" : "Ignoruj certyfikat serwera:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Program początkowy:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Load balance info/cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "Zakończenie linii:", + "FIELD_HEADER_PASSWORD" : "Hasło:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRINTER_NAME" : "Nazwa przekierowanej drukarki:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Preconnection BLOB (VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "Źródłowe ID RDP:", + "FIELD_HEADER_READ_ONLY" : "Tylko do odczytu:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Wyklucz mysz:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Wyklucz grafiki/strumienie:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "Wyklucz zdarzenia dotykowe:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Dołącz zdarzenia klawiszy:", + "FIELD_HEADER_RECORDING_NAME" : "Nazwa nagrania:", + "FIELD_HEADER_RECORDING_PATH" : "Ścieżka nagrania:", + "FIELD_HEADER_RESIZE_METHOD" : "Metoda zmiany rozmiaru:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parametry:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Katalog roboczy:", + "FIELD_HEADER_REMOTE_APP" : "Program:", + "FIELD_HEADER_SECURITY" : "Tryb bezpieczeństwa:", + "FIELD_HEADER_SERVER_LAYOUT" : "Układ klawiatury:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Domyślny katalog dla przesyłania:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Wyłącz pobieranie plików:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Publiczny klucz hosta (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Interwał utrzymania aktywności (keepalive) SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Hasło klucza:", + "FIELD_HEADER_SFTP_PASSWORD" : "Hasło:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Klucz prywatny:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Katalog nadrzędny przeglądarki plików:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Wyłącz przesyłanie plików:", + "FIELD_HEADER_SFTP_USERNAME" : "Użytkownik:", + "FIELD_HEADER_STATIC_CHANNELS" : "Nazwy statycznych kanałów:", + "FIELD_HEADER_TIMEZONE" : "Strefa czasowa:", + "FIELD_HEADER_USERNAME" : "Użytkownik:", + "FIELD_HEADER_WIDTH" : "Szerokość:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adres rozgłoszeniowy (broadcast) dla pakietu WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adres MAC zdalnego hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Wyślij pakiet WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP dla pakietu WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Czas oczekiwania na rozruch hosta:", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_EMPTY" : "", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "Zachowaj tak, jak jest", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Aktualizacja Wyświetlania\" kanał wirtualny (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Połącz Ponownie", + + "FIELD_OPTION_SECURITY_ANY" : "Dowolny", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Uwierzytelnianie Na Poziomie Sieci)", + "FIELD_OPTION_SECURITY_RDP" : "szyfrowanie RDP", + "FIELD_OPTION_SECURITY_TLS" : "szyfrowanie TLS", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Czeski (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Duński (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Szwajcarski Niemiecki (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Niemiecki (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "UK Angielski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US Angielski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Hiszpański (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latynoamerykański (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Belgijski Francuski (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Kanadyjski Francuski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Szwajcarski Francuski (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Francuski (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Węgierski (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Włoski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japoński (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Norweski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portugalski Brazylijski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portugalski (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Szwecki (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turecki-Q (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Uwierzytelnianie", + "SECTION_HEADER_BASIC_PARAMETERS" : "Ustawienia Podstawowe", + "SECTION_HEADER_CLIPBOARD" : "Schowek", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Przekierowanie Urządzeń", + "SECTION_HEADER_DISPLAY" : "Wyświetlanie", + "SECTION_HEADER_GATEWAY" : "Remote Desktop Gateway", + "SECTION_HEADER_LOAD_BALANCING" : "Load Balancing", + "SECTION_HEADER_NETWORK" : "Sieć", + "SECTION_HEADER_PERFORMANCE" : "Wydajność", + "SECTION_HEADER_PRECONNECTION_PDU" : "Wstępne połączenie PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Nagrywanie Ekranu", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Klawisz Backspace wysyła:", + "FIELD_HEADER_COLOR_SCHEME" : "Schemat kolorów:", + "FIELD_HEADER_COMMAND" : "Wykonaj polecenie:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatycznie utwórz ścieżkę nagrywania:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatycznie utwórz ścieżkę maszynopisu:", + "FIELD_HEADER_DISABLE_COPY" : "Wyłącz kopiowanie z terminala:", + "FIELD_HEADER_DISABLE_PASTE" : "Wyłącz wklejanie z klienta:", + "FIELD_HEADER_FONT_NAME" : "Nazwa czcionki:", + "FIELD_HEADER_FONT_SIZE" : "Rozmiar czcionki:", + "FIELD_HEADER_ENABLE_SFTP" : "Włącz SFTP:", + "FIELD_HEADER_HOST_KEY" : "Publiczny klucz hosta (Base64):", + "FIELD_HEADER_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_LOCALE" : "Język/Ustawienia regionalne ($LANG):", + "FIELD_HEADER_USERNAME" : "Użytkownik:", + "FIELD_HEADER_PASSWORD" : "Hasło:", + "FIELD_HEADER_PASSPHRASE" : "Hasło klucza:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_PRIVATE_KEY" : "Klucz prywatny:", + "FIELD_HEADER_SCROLLBACK" : "Maksymalny rozmiar przewijania:", + "FIELD_HEADER_READ_ONLY" : "Tylko do odczytu:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Wyklucz mysz:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Wyklucz grafiki/strumienie:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Dołącz zdarzenia klawiszy:", + "FIELD_HEADER_RECORDING_NAME" : "Nazwa nagrania:", + "FIELD_HEADER_RECORDING_PATH" : "Ścieżka nagrania:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Interwał utrzymywania aktywności serwera (keepalive):", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Wyłącz pobieranie plików:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Katalog nadrzędny przeglądarki plików:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Wyłącz przesyłanie plików:", + "FIELD_HEADER_TERMINAL_TYPE" : "Typ terminala:", + "FIELD_HEADER_TIMEZONE" : "Strefa czasowa ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nazwa maszynopisu:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ścieżka maszynopisu:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adres rozgłoszeniowy (broadcast) dla pakietu WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adres MAC zdalnego hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Wyślij pakiet WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP dla pakietu WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Czas oczekiwania na rozruch hosta:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Czarny na białym", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Szary na czarnym", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Zielony na czarnym", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Biały na czarnym", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Uwierzytelnianie", + "SECTION_HEADER_BEHAVIOR" : "Zachowanie Terminala", + "SECTION_HEADER_CLIPBOARD" : "Schowek", + "SECTION_HEADER_DISPLAY" : "Wyświetlanie", + "SECTION_HEADER_NETWORK" : "Sieć", + "SECTION_HEADER_RECORDING" : "Nagrywanie Ekranu", + "SECTION_HEADER_SESSION" : "Sesja / Środowisko", + "SECTION_HEADER_TYPESCRIPT" : "Maszynopis (Tekstowe Nagranie Sesji)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Klawisz Backspace wysyła:", + "FIELD_HEADER_COLOR_SCHEME" : "Schemat kolorów:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatycznie utwórz ścieżkę nagrywania:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Automatycznie utwórz ścieżkę maszynopisu:", + "FIELD_HEADER_DISABLE_COPY" : "Wyłącz kopiowanie z terminala:", + "FIELD_HEADER_DISABLE_PASTE" : "Wyłącz wklejanie z klienta:", + "FIELD_HEADER_FONT_NAME" : "Nazwa czcionki:", + "FIELD_HEADER_FONT_SIZE" : "Rozmiar czcionki:", + "FIELD_HEADER_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Wyrażenie regularne nieudanego logowania:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Wyrażenie regularne udanego logowania:", + "FIELD_HEADER_USERNAME" : "Użytkownik:", + "FIELD_HEADER_USERNAME_REGEX" : "Wyrażenie regularne użytkownika:", + "FIELD_HEADER_PASSWORD" : "Hasło:", + "FIELD_HEADER_PASSWORD_REGEX" : "Wyrażenie regularne hasła", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Tylko do odczytu:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Wyklucz mysz:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Wyklucz grafiki/strumienie:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Dołącz wciśnięcia klawiszy:", + "FIELD_HEADER_RECORDING_NAME" : "Nazwa nagrania:", + "FIELD_HEADER_RECORDING_PATH" : "Ścieżka nagrania:", + "FIELD_HEADER_SCROLLBACK" : "Maksymalny rozmiar przewijania:", + "FIELD_HEADER_TERMINAL_TYPE" : "Typ terminala:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nazwa maszynopisu:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Ścieżka maszynopisu:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adres rozgłoszeniowy (broadcast) dla pakietu WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adres MAC zdalnego hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Wyślij pakiet WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP dla pakietu WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Czas oczekiwania na rozruch hosta:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Czarny na białym", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Szary na czarnym", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Zielony na czarnym", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Biały na czarnym", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Uwierzytelnianie", + "SECTION_HEADER_BEHAVIOR" : "Zachowanie Terminala", + "SECTION_HEADER_CLIPBOARD" : "Schowek", + "SECTION_HEADER_DISPLAY" : "Wyświetlanie", + "SECTION_HEADER_RECORDING" : "Nagrywanie Ekranu", + "SECTION_HEADER_TYPESCRIPT" : "Maszynopis (Tekstowe Nagranie Sesji)", + "SECTION_HEADER_NETWORK" : "Sieć", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Nazwa serwera audio:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Kodowanie:", + "FIELD_HEADER_COLOR_DEPTH" : "Głębia kolorów:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Automatycznie utwórz ścieżkę nagrywania:", + "FIELD_HEADER_CURSOR" : "Kursor:", + "FIELD_HEADER_DEST_HOST" : "Docelowy host:", + "FIELD_HEADER_DEST_PORT" : "Docelowy port:", + "FIELD_HEADER_DISABLE_COPY" : "Wyłącz kopiowanie ze zdalnego pulpitu:", + "FIELD_HEADER_DISABLE_PASTE" : "Wyłącz wklejanie z klienta:", + "FIELD_HEADER_ENABLE_AUDIO" : "Włącz dźwięk:", + "FIELD_HEADER_ENABLE_SFTP" : "Włącz SFTP:", + "FIELD_HEADER_FORCE_LOSSLESS" : "Wymuś bezstratną kompresję:", + "FIELD_HEADER_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_USERNAME" : "Użytkownik:", + "FIELD_HEADER_PASSWORD" : "Hasło:", + "FIELD_HEADER_PORT" : "Port:", + "FIELD_HEADER_READ_ONLY" : "Tylko do odczytu:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Wyklucz mysz:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Wyklucz grafiki/strumienie:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Dołącz zdarzenia klawiszy:", + "FIELD_HEADER_RECORDING_NAME" : "Nazwa nagrania:", + "FIELD_HEADER_RECORDING_PATH" : "Ścieżka nagrania:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Domyślny katalog przesyłania:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Wyłącz pobieranie plików:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Publiczny klucz hosta (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nazwa Hosta:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Interwał utrzymania aktywności (keepalive) SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Hasło klucza:", + "FIELD_HEADER_SFTP_PASSWORD" : "Hasło:", + "FIELD_HEADER_SFTP_PORT" : "Port:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Klucz prywatny:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Katalog nadrzędny przeglądarki plików:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Wyłącz przesyłanie plików:", + "FIELD_HEADER_SFTP_USERNAME" : "Użytkownik:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Zamień czerwone/niebieskie komponenty:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Adres rozgłoszeniowy (broadcast) dla pakietu WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Adres MAC zdalnego hosta:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Wyślij pakiet WoL:", + "FIELD_HEADER_WOL_UDP_PORT" : "Port UDP dla pakietu WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Czas oczekiwania na rozruch hosta:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Lokalny", + "FIELD_OPTION_CURSOR_REMOTE" : "Zdalny", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Dźwięk", + "SECTION_HEADER_AUTHENTICATION" : "Uwierzytelnianie", + "SECTION_HEADER_CLIPBOARD" : "Schowek", + "SECTION_HEADER_DISPLAY" : "Wyświetlanie", + "SECTION_HEADER_NETWORK" : "Sieć", + "SECTION_HEADER_RECORDING" : "Nagrywanie Ekranu", + "SECTION_HEADER_REPEATER" : "Przekaźnik VNC", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Ustawienia" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + "ACTION_VIEW_RECORDING" : "@:APP.ACTION_VIEW_RECORDING", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Rekordy historii poprzednich połączeń są wylistowane tutaj i można je sortować klikając nagłówki kolumn. Aby wyszukać określone rekordy wprowadź ciąg filtru i kliknij \"Szukaj\". Tylko rekordy pasujące do podanego filtru zostaną wyświetlone.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Brak pasujących rekordów", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nazwa połączenia", + "TABLE_HEADER_SESSION_DURATION" : "Czas trwania", + "TABLE_HEADER_SESSION_LOGS" : "Logi", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Zdalny host", + "TABLE_HEADER_SESSION_STARTDATE" : "Czas rozpoczęcia", + "TABLE_HEADER_SESSION_USERNAME" : "Użytkownik", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Nowe Połączenie", + "ACTION_NEW_CONNECTION_GROUP" : "Nowa Grupa", + "ACTION_NEW_SHARING_PROFILE" : "Nowy Profil Udostępniania", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Kliknij lub naciśnij połączenie poniżej, aby nim zarządzać. W zależności od poziomu dostępu, połączenia mogą być dodawane i usuwane, a ich właściwości (protokół, nazwa hosta, port itp.) mogą być zmieniane.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Połączenia" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Język:", + "FIELD_HEADER_PASSWORD" : "Hasło:", + "FIELD_HEADER_PASSWORD_OLD" : "Obecne Hasło:", + "FIELD_HEADER_PASSWORD_NEW" : "Nowe Hasło:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Powtórz Nowe Hasło:", + "FIELD_HEADER_TIMEZONE" : "Strefa Czasowa:", + "FIELD_HEADER_USERNAME" : "Użytkownik:", + + "HELP_DEFAULT_INPUT_METHOD" : "Domyślna metoda wprowadzania określa sposób odbierania zdarzeń klawiatury przez Guacamole. Zmiana tego ustawienia może być konieczna w przypadku korzystania z urządzenia mobilnego lub pisania w edytorze IME. To ustawienie można zmienić dla każdego połączenia w menu Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "Domyślny tryb emulacji myszy określa, jak zdalna mysz będzie się zachowywać w nowych połączeniach w odniesieniu do dotknięć. To ustawienie można zmienić dla każdego połączenia w menu Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Poniższe opcje są związane z ustawieniami regionalnymi użytkownika i wpłyną na sposób wyświetlania różnych części interfejsu", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Jeśli chcesz zmienić swoje hasło, wprowadź poniżej obecne hasło i żądane nowe hasło, a następnie kliknij \"Zmień Hasło\". Zmiana będzie miała efekt natychmiastowy.", + + "INFO_PASSWORD_CHANGED" : "Hasło zmienione.", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "Ustawienia użytkownika zapisane.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Domyślna Metoda Wprowadzania", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Domyślny Tryb Emulacji Myszy", + "SECTION_HEADER_UPDATE_PASSWORD" : "Zmień Hasło" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Nowy Użytkownik", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Kliknij lub dotknij użytkownika poniżej, aby nim zarządzać. W zależności od Twojego poziomu dostępu, użytkowników można dodawać i usuwać, a także zmieniać ich hasła.", + + "SECTION_HEADER_USERS" : "Użytkownicy", + + "TABLE_HEADER_FULL_NAME" : "Imię i Nazwisko", + "TABLE_HEADER_LAST_ACTIVE" : "Ostatnio aktywny", + "TABLE_HEADER_ORGANIZATION" : "Organizacja", + "TABLE_HEADER_USERNAME" : "Nazwa użytkownika" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Nowa Grupa", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Kliknij lub naciśnij grupę poniżej, aby nią zarządzać. W zależności od Twojego poziomu dostępu, grupy mogą być dodawane i usuwane, a ich użytkownicy i grupy mogą być edytowane.", + + "SECTION_HEADER_USER_GROUPS" : "Grupy", + + "TABLE_HEADER_USER_GROUP_NAME" : "Nazwa Grupy" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Zakończ sesję", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Zakończ Sesję", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Ta strona zostanie wypełniona aktualnie aktywnymi połączeniami. Lista połączeń i możliwość ich zakończenia zależy od Twojego poziomu dostępu. Jeśli chcesz zakończyć jedną lub więcej sesji, zaznacz pola obok tych sesji i kliknij \"Zakończ sesję\". Zakończenie sesji spowoduje natychmiastowe rozłączenie użytkownika z powiązanym połączeniem.", + + + "INFO_NO_SESSIONS" : "Brak aktywnych połączeń", + + "SECTION_HEADER_SESSIONS" : "Aktywne Połączenia", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nazwa połączenia", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Zdalny host", + "TABLE_HEADER_SESSION_STARTDATE" : "Aktywne od", + "TABLE_HEADER_SESSION_USERNAME" : "Użytkownik", + + "TEXT_CONFIRM_DELETE" : "Czy na pewno chcesz zakończyć wszystkie wybrane sesje? Użytkownicy korzystający z tych sesji zostaną natychmiast rozłączeni." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Adres email:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Imię i Nazwisko:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organizacja:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Rola:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/pt.json b/guacamole/src/main/frontend/src/translations/pt.json new file mode 100644 index 0000000..bfd95e9 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/pt.json @@ -0,0 +1,1017 @@ +{ + + "NAME" : "Português", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "OK", + "ACTION_CANCEL" : "Cancelar", + "ACTION_CLONE" : "Clonar", + "ACTION_CONTINUE" : "Continuar", + "ACTION_DELETE" : "Apagar", + "ACTION_DELETE_SESSIONS" : "Fechar sessões", + "ACTION_DOWNLOAD" : "Download", + "ACTION_LOGIN" : "Entrar", + "ACTION_LOGOUT" : "Sair", + "ACTION_MANAGE_CONNECTIONS" : "Conexões", + "ACTION_MANAGE_PREFERENCES" : "Preferências", + "ACTION_MANAGE_SETTINGS" : "Configurações", + "ACTION_MANAGE_SESSIONS" : "Sessões Ativas", + "ACTION_MANAGE_USERS" : "Usuários", + "ACTION_MANAGE_USER_GROUPS" : "Grupos", + "ACTION_NAVIGATE_BACK" : "Voltar", + "ACTION_NAVIGATE_HOME" : "Principal", + "ACTION_SAVE" : "Salvar", + "ACTION_SEARCH" : "Procurar", + "ACTION_SHARE" : "Compartilhar", + "ACTION_UPDATE_PASSWORD" : "Alterar senha", + "ACTION_VIEW_HISTORY" : "Histórico", + + "DIALOG_HEADER_ERROR" : "Erro", + + "ERROR_PAGE_UNAVAILABLE" : "Um erro ocorreu e esta ação não pode ser completada. Se o problema persistir, por favor contacte o administrador do sistema ou verifique os logs do sistema.", + "ERROR_PASSWORD_BLANK" : "Sua senha não pode ficar em branco.", + "ERROR_PASSWORD_MISMATCH" : "As senhas são diferentes.", + + "FIELD_HEADER_PASSWORD" : "Senha:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Repita a senha:", + + "FIELD_PLACEHOLDER_FILTER" : "Filtro", + + "FORMAT_DATE_TIME_PRECISE" : "dd/MM/yyyy HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Atualmente em uso por {USERS} {USERS, plural, one{usuário} other{usuários}}.", + + "TEXT_ANONYMOUS_USER" : "Anônimo", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{segundo} other{segundos}}} minute{{VALUE, plural, one{minuto} other{minutos}}} hour{{VALUE, plural, one{hora} other{horas}}} day{{VALUE, plural, one{dia} other{dias}}} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Limpar", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "Desconectar", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Reconectar", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_UPLOAD_FILES" : "Enviar Arquivos", + + "DIALOG_HEADER_CONNECTING" : "Conectando", + "DIALOG_HEADER_CONNECTION_ERROR" : "Erro na conexão", + "DIALOG_HEADER_DISCONNECTED" : "Desconectado", + + "ERROR_CLIENT_201" : "Essa conexão foi fechada porque o servidor está ocupado. Por favor aguarde alguns minutos e tente novamente.", + "ERROR_CLIENT_202" : "O Servidor Guacamole fechou a sessão porque a estação remota estava levando muito tempo para responder. Por favor tente novamente ou contate o administrador do sistema.", + "ERROR_CLIENT_203" : "A estação remota encontrou um erro e fechou a conexão. Por favor, tente novamente mais tarde ou contate o administrador do sistema.", + "ERROR_CLIENT_207" : "A estação remota não pode ser encontrada. Caso o problema persista, por favor notifique o administrador do sistema, ou verifique os logs do sistema.", + "ERROR_CLIENT_208" : "A estação remota não está disponível no momento. Caso o problema persista, por favor notifique o administrador do sistema, ou verifique os logs do sistema.", + "ERROR_CLIENT_209" : "A estação remota encerrou a conexão devido a conflitos com outra conexão. Por favor tente novamente mais tarde.", + "ERROR_CLIENT_20A" : "A estação remota encerrou a conexão pois a mesma parecia estar inativa. Caso isto seja inexperado ou indesejável, por favor notifique o administrador do sistema, ou verifique os logs do sistema.", + "ERROR_CLIENT_20B" : "A estação remota encerrou a conexão forçadamente. Caso isto seja inexperado ou indesejável, por favor notifique o administrador do sistema, ou verifique os logs do sistema.", + "ERROR_CLIENT_301" : "Erro de autenticação. Por favor reconecte e tente novamente.", + "ERROR_CLIENT_303" : "A estação remota negou o acesso a esta conexão. Se você precisa deste acesso, por favor peça ao administrador do sistema, ou verifique as configurações do sistema.", + "ERROR_CLIENT_308" : "O servidor do Guacamole encerrou a conexão porque não houve resposta do seu navegador por tempo suficiente para parecer desconectado. Normalmente isso ocorre por problemas na rede, como sinal de wifi irregular, ou simplesmente velocidades de rede muito lentas. Por favor verifique sua rede e tente novamente.", + "ERROR_CLIENT_31D" : "O servidor do Guacamole está negando acesso a esta conexão porque você esgotou o limite de uso de conexões simultâneas para um único usuário. Por favor, feche uma ou mais conexões e tente novamente.", + "ERROR_CLIENT_DEFAULT" : "Um erro interno ocorreu no servidor do Guacamole e a conexão foi finalizada. Se o problema persistir, por favor informe o administrador do sistema, ou verifique os logs do sistema.", + + "ERROR_TUNNEL_201" : "O servidor de Guacamole rejeitou essa tentativa de conexão porque há muitas conexões ativas. Por favor, aguarde alguns minutos e tente novamente.", + "ERROR_TUNNEL_202" : "A conexão foi encerrada porque o servidor está demorando muito par responder. Normalmente isso ocorre por problemas na rede, como sinal de wifi irregular, ou simplesmente velocidades de rede muito lentas. Por favor verifique sua rede e tente novamente ou contate o administrador do sistema.", + "ERROR_TUNNEL_203" : "O servidor encontrou um erro e encerrou a conexão. Por favor, tente novamente ou informe o administrador do sistema.", + "ERROR_TUNNEL_204" : "A conexão solicitada não existe. Por favor, verifique o nome da conexão e tente novamente.", + "ERROR_TUNNEL_205" : "Essa conexão está atualmente em uso e o acesso concorrente a ela não é permitido. Por favor, tente mais tarde.", + "ERROR_TUNNEL_207" : "O servidor de Guacamole não está acessível neste momento. Por favor, verifique a sua rede e tente novamente.", + "ERROR_TUNNEL_208" : "O servidor de Guacamole não está aceitando conexões. Por favor, verifique a sua rede e tente novamente.", + "ERROR_TUNNEL_301" : "Você não tem permissão para acessar essa conexão porque você não está logado. Por favor, logue-se e tente novamente.", + "ERROR_TUNNEL_303" : "Você não tem permissão para acessar essa conexão. Se você precisa do acesso, por favor solicite ao administrador do sistema a inclusão do seu usuário da lista de usuários permitidos, ou verifique as configurações do sistema.", + "ERROR_TUNNEL_308" : "O servidor do Guacamole encerrou a conexão porque não houve resposta do seu navegador por tempo suficiente para parecer desconectado. Normalmente isso ocorre por problemas na rede, como sinal de wifi irregular, ou simplesmente velocidades de rede muito lentas. Por favor verifique sua rede e tente novamente.", + "ERROR_TUNNEL_31D" : "O servidor do Guacamole está negando acesso a esta conexão porque você esgotou o limite de uso de conexões simultâneas para um único usuário. Por favor feche uma ou mais conexões e tente novamente.", + "ERROR_TUNNEL_DEFAULT" : "Um erro interno ocorreu no servidor do Guacamole e a conexão foi finalizada. Se o problema persistir, por favor informe o administrador do sistema, ou verifique os logs do sistema.", + + "ERROR_UPLOAD_100" : "A transferência de arquivos não é suportada ou não foi habilitada. Por favor contate o administrador do sistema ou verifique os logs do sistema", + "ERROR_UPLOAD_201" : "Muitos arquivos estão sendo transferidos ao mesmo tempo. Por favor aguarde que as transferências atuais terminem e tente novamente.", + "ERROR_UPLOAD_202" : "O arquivo não pode ser transferido porque o servidor remoto está levando muito tempo para responder. Por favor tente mais tarde ou contate administrador do sistema.", + "ERROR_UPLOAD_203" : "A estação remota encontrou erro durante a transferência. Por favort tente novamente ou contate administrador do sistema.", + "ERROR_UPLOAD_204" : "O destino da transferência de arquivo não existe. Por favor verifique se o destino existe e tente novamente.", + "ERROR_UPLOAD_205" : "O destino da transferência de arquivo está bloqueado. Por favor aguarde as tarefas em curso terminarem e tente noavmente.", + "ERROR_UPLOAD_301" : "Você não tem permissão para enviar este arquivo porque não está logado. Por favor logue-se e tente novamente.", + "ERROR_UPLOAD_303" : "Você não tem permissão para enviar este arquivo. Se já solicitou esta permisssão verifique as configurações de sistema, ou contate o administrador do sistema.", + "ERROR_UPLOAD_308" : "A transferência do arquivo está parada. Normalmente isso ocorre por problemas na rede, como sinal de wifi irregular, ou simplesmente velocidades de rede muito lentas. Por favor verifique sua rede e tente novamente.", + "ERROR_UPLOAD_31D" : "Muitos arquivos estão sendo transferidos ao mesmo tempo. Por favor aguarde que as transferências atuais terminem e tente novamente.", + "ERROR_UPLOAD_DEFAULT" : "Um erro interno ocorreu no servidor do Guacamole e a conexão foi finalizada. Se o problema persistir, por favor informe o administrador do sistema, ou verifique os logs do sistema.", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "Texto copiado/cortado dentro do Guacamole será mostrado aqui. Mudanças no text abaixo afetarão a área de transferência remota.", + "HELP_INPUT_METHOD_NONE" : "Nenhum método de entrada está sendo usado. A entrada do teclado é aceita a partir de um teclado físico conectado.", + "HELP_INPUT_METHOD_OSK" : "Mostrar e aceitar entrada de dados a partir do teclado virtual integrado do Guacamole. O teclado virtual possibilita digitar combinações de teclas que, de outra forma, seriam impossíveis (como Ctrl-Alt-Del).", + "HELP_INPUT_METHOD_TEXT" : "Permite digitação do texto e emulaçao dos eventos de teclado baseado no texto digitado. Isto é necessário para dispositivos como telefones celulares que não possuem teclado físico.", + "HELP_MOUSE_MODE" : "Determina como o mouse remoto se comportará em ralção aos toques.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Toque para clicar. O clique ocorre no local do toque.", + "HELP_MOUSE_MODE_RELATIVE" : "Arraste para mover o ponteiro do mouse e toque para clicar. O clique ocorre no local em que o mouse aponta.", + "HELP_SHARE_LINK" : "A conexão atual está sendo compartilhada e pode ser acessado com qualquer um que possuir o seguinte {LINKS, plural, one{link} other{links}}:", + + "INFO_CONNECTION_SHARED" : "Está conexão agora está compartilhada.", + "INFO_NO_FILE_TRANSFERS" : "Nenhuma transferência de arquivo.", + + "NAME_INPUT_METHOD_NONE" : "Nenhum", + "NAME_INPUT_METHOD_OSK" : "Teclado virtual", + "NAME_INPUT_METHOD_TEXT" : "Entrada de texto", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "Tela de toque", + "NAME_MOUSE_MODE_RELATIVE" : "Touchpad", + + "SECTION_HEADER_CLIPBOARD" : "Área de transferência", + "SECTION_HEADER_DEVICES" : "Aparelhos", + "SECTION_HEADER_DISPLAY" : "Tela", + "SECTION_HEADER_FILE_TRANSFERS" : "Transferências de Arquivos", + "SECTION_HEADER_INPUT_METHOD" : "Método de entrada", + "SECTION_HEADER_MOUSE_MODE" : "Modo de emulação do mouse", + + "TEXT_ZOOM_AUTO_FIT" : "Ajustar automaticamente à janela do navegador", + "TEXT_CLIENT_STATUS_IDLE" : "Ocioso.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Conectando ao Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Você foi desconectado.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "A conexão de rede ao servidor do Guacamole parece instável.", + "TEXT_CLIENT_STATUS_WAITING" : "Conectado ao Guacamole. Aguardando resposta...", + "TEXT_RECONNECT_COUNTDOWN" : "Reconectando em {REMAINING} {REMAINING, plural, one{second} other{seconds}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Ocultar", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Mostrar", + + "FIELD_HEADER_BACKGROUND" : "Fundo", + "FIELD_HEADER_FOREGROUND" : "Primeiro plano", + + "FIELD_OPTION_CUSTOM" : "Customizar...", + + "SECTION_HEADER_DETAILS" : "Detalhes:" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "Default (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "DD/MM/YYYY", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Clique para mostrar a senha", + "HELP_HIDE_PASSWORD" : "Clique para ocultar a senha" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Nenhuma conexão recente.", + + "PASSWORD_CHANGED" : "Senha alterada.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Todas as Conexões", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Conexões Recentes" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anônimo" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Autenticação Inválida", + + "FIELD_HEADER_USERNAME" : "Usuário", + "FIELD_HEADER_PASSWORD" : "Senha" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Remover conexão", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Localização:", + "FIELD_HEADER_NAME" : "Nome:", + "FIELD_HEADER_PROTOCOL" : "Protocolo:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Ativa agora", + "INFO_CONNECTION_NOT_USED" : "Essa conexão ainda não foi utilizada.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Editar Conexão", + "SECTION_HEADER_HISTORY" : "Histórico de Uso", + "SECTION_HEADER_PARAMETERS" : "Parâmetros", + + "TABLE_HEADER_HISTORY_USERNAME" : "Usuário", + "TABLE_HEADER_HISTORY_START" : "Hora de Início", + "TABLE_HEADER_HISTORY_DURATION" : "Duração", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Estação Remota", + + "TEXT_CONFIRM_DELETE" : "Conexões não podem ser restauradas depois de removidas. Tem certeza que deseja remover esta conexão?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Delete Connection Group", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Localização:", + "FIELD_HEADER_NAME" : "Nome:", + "FIELD_HEADER_TYPE" : "Tipo:", + + "NAME_TYPE_BALANCING" : "Balanceamento", + "NAME_TYPE_ORGANIZATIONAL" : "Organização", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Editar Grupo de Conexão", + + "TEXT_CONFIRM_DELETE" : "Grupos de conexão não podem ser restaurados depois de removidos. Tem certeza que deseja remover este grupo de conexão?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Remover Perfil de Compartilhamento", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Nome:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Conexão Primária:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Editar Perfil de Compartilhamento", + "SECTION_HEADER_PARAMETERS" : "Parâmetros", + + "TEXT_CONFIRM_DELETE" : "Perfis de compartilhamento não podem ser restaurados depois de removidos. Tem certeza que deseja remover este perfil de compartilhamento?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Remover Usuário", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Administrar o sistema:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Alterar a própria senha:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Criar novos usuários:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Criar novos grupos de usuário:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Criar novas conexões:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Criar novos grupos de conexão:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Criar novos perfis de compartilhamento:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Login desativado:", + "FIELD_HEADER_USERNAME" : "Usuário:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Este usuário não pertence a nenhum grupo no momento. Expanda esta seção para adicionar grupos.", + + "INFO_READ_ONLY" : "Desculpe, mas esta conta de usuário não pode ser editada.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "Nenhum grupo disponível.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Todas as Conexões", + "SECTION_HEADER_CONNECTIONS" : "Conexões", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Conexões Atuais", + "SECTION_HEADER_EDIT_USER" : "Editar Usuário", + "SECTION_HEADER_PERMISSIONS" : "Permissões", + "SECTION_HEADER_USER_GROUPS" : "Grupos", + + "TEXT_CONFIRM_DELETE" : "Usuários não podem ser restaurados depois de removidos. Tem certeza que deseja remover este usuário?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Remover Grupo", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Desativado:", + "FIELD_HEADER_USER_GROUP_NAME" : "Nome do grupo:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Este grupo não pertence a nenhum outro grupo atualmente. Expanda esta seção para adicionar grupos.", + "HELP_NO_MEMBER_USER_GROUPS" : "Este grupo não contém nenhum outro grupo atualmente. Expanda esta seção para adicionar grupos.", + "HELP_NO_MEMBER_USERS" : "Este grupo não contém nenhum usuário atualmente. Expanda esta seção para adicionar usuários.", + + "INFO_READ_ONLY" : "Desculpe, mas este grupo não pode ser editado.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "Nenhum usuário disponível.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Editar Grupo", + "SECTION_HEADER_MEMBER_USERS" : "Usuários Membros", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Grupos Membros", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Grupos Pai", + + "TEXT_CONFIRM_DELETE" : "Grupos não podem ser restaurados depois de removidos. Tem certeza que deseja remover este grupos?" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Tecla de Backspace envia:", + "FIELD_HEADER_CA_CERT" : "Certificar autoridade certificadora:", + "FIELD_HEADER_CLIENT_CERT" : "Certificado do client:", + "FIELD_HEADER_CLIENT_KEY" : "Chave do cliente:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de cor:", + "FIELD_HEADER_CONTAINER" : "Nome do container:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Criar caminho de gravação automaticamente:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Criar caminho de transcrição automaticamente:", + "FIELD_HEADER_DISABLE_COPY" : "Desabilitar copiar do terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desabilitar colar do cliente:", + "FIELD_HEADER_FONT_NAME" : "Nome da fonte:", + "FIELD_HEADER_FONT_SIZE" : "Tamanho da fonte:", + "FIELD_HEADER_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorar certificado do servidor:", + "FIELD_HEADER_NAMESPACE" : "Namespace:", + "FIELD_HEADER_POD" : "Nome do pod:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_READ_ONLY" : "Apenas-leitura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir eventos chave:", + "FIELD_HEADER_RECORDING_NAME" : "Nome da gravação:", + "FIELD_HEADER_RECORDING_PATH" : "Caminho da gravação:", + "FIELD_HEADER_SCROLLBACK" : "Tamanho máximo de retrocesso:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nome da transcrição:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Caminho da transcrição:", + "FIELD_HEADER_USE_SSL" : "Usar SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Preto sobre branco", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Cinza sobre preto", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verde sobre preto", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Branco sobre preto", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticação", + "SECTION_HEADER_BEHAVIOR" : "Comportamento do terminal", + "SECTION_HEADER_CLIPBOARD" : "Área de Transferência", + "SECTION_HEADER_CONTAINER" : "Container", + "SECTION_HEADER_DISPLAY" : "Tela", + "SECTION_HEADER_RECORDING" : "Gravação da Tela", + "SECTION_HEADER_TYPESCRIPT" : "Transcrição (Gravação do Texto da Sessão)", + "SECTION_HEADER_NETWORK" : "Rede" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Nome do cliente:", + "FIELD_HEADER_COLOR_DEPTH" : "Profundidade de cores:", + "FIELD_HEADER_CONSOLE" : "Console de administração:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Suportar audio no console:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Criar unidade automaticamente:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Criar caminho de gravação automaticamente:", + "FIELD_HEADER_DISABLE_AUDIO" : "Desabilitar áudio:", + "FIELD_HEADER_DISABLE_AUTH" : "Desabilitar autenticação:", + "FIELD_HEADER_DISABLE_COPY" : "Desabilitar copiar da estação remota:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "Desabilitar recebimento de arquivos:", + "FIELD_HEADER_DISABLE_PASTE" : "Desabilitar colar do cliente:", + "FIELD_HEADER_DISABLE_UPLOAD" : "Desabilitar envio de arquivos:", + "FIELD_HEADER_DOMAIN" : "Domínio:", + "FIELD_HEADER_DPI" : "Resolução (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Nome da unidade:", + "FIELD_HEADER_DRIVE_PATH" : "Caminho da unidade:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Habilitar entrada de áudio (microfone):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Habilitar composição do desktop (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Habilitar unidade:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Habilitar suavização de fonte (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Habilitar arrastar a janela inteira:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Habilitar animação de menus:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Desabilitar cache de bitmap:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Desabilitar cache off-screen:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Desabilitar cache de glyph:", + "FIELD_HEADER_ENABLE_PRINTING" : "Habilitar impressão:", + "FIELD_HEADER_ENABLE_SFTP" : "Habilitar SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Habilitar tema:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Habilitar papel de parede:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Domínio:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Senha:", + "FIELD_HEADER_GATEWAY_PORT" : "Porta:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Usuário:", + "FIELD_HEADER_HEIGHT" : "Altura:", + "FIELD_HEADER_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_IGNORE_CERT" : "Ignorar certificado do servidor:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Programa inicial:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Info/cookie de balanceamento de carga:", + "FIELD_HEADER_PASSWORD" : "Senha:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_PRINTER_NAME" : "Nome da impressora redirecionada:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "BLOB (VM ID) de pré-conexão:", + "FIELD_HEADER_PRECONNECTION_ID" : "ID de origem do RDP:", + "FIELD_HEADER_READ_ONLY" : "Apenas-leitura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir eventos chave:", + "FIELD_HEADER_RECORDING_NAME" : "Nome da gravação:", + "FIELD_HEADER_RECORDING_PATH" : "Caminho da gravação:", + "FIELD_HEADER_RESIZE_METHOD" : "Método de redimensionamento:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Parâmetros:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Diretório de trabalho:", + "FIELD_HEADER_REMOTE_APP" : "Programa:", + "FIELD_HEADER_SECURITY" : "Modo de segurança:", + "FIELD_HEADER_SERVER_LAYOUT" : "Layout do teclado:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Diretório padrão de envios:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desabilitar recebimento de arquivos:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Chave pública (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Intervalo de keepalive do SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Frase-senha:", + "FIELD_HEADER_SFTP_PASSWORD" : "Senha:", + "FIELD_HEADER_SFTP_PORT" : "Porta:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Chave privada:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Diretório raíz da escolha de arquivos:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desabilitar envio de arquivos:", + "FIELD_HEADER_SFTP_USERNAME" : "Usuário:", + "FIELD_HEADER_STATIC_CHANNELS" : "Nomes dos canais estáticoss:", + "FIELD_HEADER_TIMEZONE" : "Fuso Horário:", + "FIELD_HEADER_USERNAME" : "Usuário:", + "FIELD_HEADER_WIDTH" : "Largura:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Endereço de broadcast para pacotes WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Endereço MAC do host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar pacote WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tempo de espera da inicialização do host:", + + + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "\"Atualização de Tela\" canal virtual (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Reconectar", + + "FIELD_OPTION_SECURITY_ANY" : "Qualquer Um", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA (Autenticação a Nível de Rede)", + "FIELD_OPTION_SECURITY_RDP" : "Encriptação RDP", + "FIELD_OPTION_SECURITY_TLS" : "Encriptação TLS", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Tcheco (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Dinamarquês (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Alemão-Suiço (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "Alemão (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "Inglês UK (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "Inglês US (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Espanhol (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "América Latina (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Francês Belga (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Francês Suiço (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "Francês (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Húngaro (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italiano (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japonês (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polonês (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Português Brasileiro (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Português (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Sueco (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turco-Q (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticação", + "SECTION_HEADER_BASIC_PARAMETERS" : "Configuração básica", + "SECTION_HEADER_CLIPBOARD" : "Área de Transferência", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Redirecionamento de dispositivo", + "SECTION_HEADER_DISPLAY" : "Tela", + "SECTION_HEADER_GATEWAY" : "Gateway de Desktop Remoto", + "SECTION_HEADER_LOAD_BALANCING" : "Balanceamento de Carga", + "SECTION_HEADER_NETWORK" : "Rede", + "SECTION_HEADER_PERFORMANCE" : "Performance", + "SECTION_HEADER_PRECONNECTION_PDU" : "Pré-conexão PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "Gravação de Tela", + "SECTION_HEADER_REMOTEAPP" : "App Remoto", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Tecla de Backspace envia:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de cor:", + "FIELD_HEADER_COMMAND" : "Executar comando:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Criar caminho de gravação automaticamente:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Criar caminho de transcrição automaticamente:", + "FIELD_HEADER_DISABLE_COPY" : "Desabilitar copiar do terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desabilitar colar do cliente:", + "FIELD_HEADER_FONT_NAME" : "Nome da fonte:", + "FIELD_HEADER_FONT_SIZE" : "Tamanho da fonte:", + "FIELD_HEADER_ENABLE_SFTP" : "Habilitar SFTP:", + "FIELD_HEADER_HOST_KEY" : "Chave pública (Base64):", + "FIELD_HEADER_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_LOCALE" : "Idioma/Locale ($LANG):", + "FIELD_HEADER_USERNAME" : "Usuário:", + "FIELD_HEADER_PASSWORD" : "Senha:", + "FIELD_HEADER_PASSPHRASE" : "Frase-senha:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_PRIVATE_KEY" : "Chave privada:", + "FIELD_HEADER_SCROLLBACK" : "Tamanho máximo de retrocesso:", + "FIELD_HEADER_READ_ONLY" : "Apenas-leitura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir eventos chave:", + "FIELD_HEADER_RECORDING_NAME" : "Nome da gravação:", + "FIELD_HEADER_RECORDING_PATH" : "Caminho da gravação:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Intervalo de keepalive do servidor:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desabilitar recebimento de arquivos:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Diretório raíz de escolha de arquivo:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desabilitar envio de arquivos:", + "FIELD_HEADER_TERMINAL_TYPE" : "Tipo de terminal:", + "FIELD_HEADER_TIMEZONE" : "Fuso Horário ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nome da Transcrição:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Caminho da Transcrição:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Endereço de broadcast para pacotes WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Endereço MAC do host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar pacote WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tempo de espera de inicialização do host:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Preto sobre branco", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Cinza sobre preto", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verde sobre preto", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Branco sobre preto", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticação", + "SECTION_HEADER_BEHAVIOR" : "Comportamento do terminal", + "SECTION_HEADER_CLIPBOARD" : "Área de Transferência", + "SECTION_HEADER_DISPLAY" : "Tela", + "SECTION_HEADER_NETWORK" : "Rede", + "SECTION_HEADER_RECORDING" : "Gravação de Tela", + "SECTION_HEADER_SESSION" : "Sessão / Ambiente", + "SECTION_HEADER_TYPESCRIPT" : "Transcrição (Gravação do Texto da Sessão)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Tecla de Backspace envia:", + "FIELD_HEADER_COLOR_SCHEME" : "Esquema de cor:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Criar caminho de gravação automaticamente:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Criar caminho de transcrição automaticamente:", + "FIELD_HEADER_DISABLE_COPY" : "Desabilitar copiar do terminal:", + "FIELD_HEADER_DISABLE_PASTE" : "Desabilitar colar do cliente:", + "FIELD_HEADER_FONT_NAME" : "Nome da fonte:", + "FIELD_HEADER_FONT_SIZE" : "Tamanho da fonte:", + "FIELD_HEADER_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Expressão regular para falha de login:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Expressão regular para login realizado com sucesso:", + "FIELD_HEADER_USERNAME" : "Usuário:", + "FIELD_HEADER_USERNAME_REGEX" : "Expressão regular de usuário:", + "FIELD_HEADER_PASSWORD" : "Senha:", + "FIELD_HEADER_PASSWORD_REGEX" : "Expressão regular de senha:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_READ_ONLY" : "Apenas-leitura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Incluir eventos chave:", + "FIELD_HEADER_RECORDING_NAME" : "Nome da gravação:", + "FIELD_HEADER_RECORDING_PATH" : "Caminho da gravação:", + "FIELD_HEADER_SCROLLBACK" : "Tamanho máximo de retrocesso:", + "FIELD_HEADER_TERMINAL_TYPE" : "Tipo de terminal: ", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Nome da transcrição:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Caminho da transcrição:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Endereço de broadcast para pacotes WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Endereço MAC do host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar pacote WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tempo de espera de inicialização do host:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "Backspace (Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "Delete (Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Preto sobre branco", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Cinza sobre preto", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Verde sobre preto", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Branco sobre preto", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "Autenticação", + "SECTION_HEADER_BEHAVIOR" : "Comportamento do terminal", + "SECTION_HEADER_CLIPBOARD" : "Área de Transferência", + "SECTION_HEADER_DISPLAY" : "Tela", + "SECTION_HEADER_RECORDING" : "Gravação de Tela", + "SECTION_HEADER_TYPESCRIPT" : "Transcrição (Gravação do Texto da Sessão)", + "SECTION_HEADER_NETWORK" : "Rede", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Nome do servidor de áudio:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Codificação:", + "FIELD_HEADER_COLOR_DEPTH" : "Profundidade de cores:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Criar caminho de gravação automaticamente:", + "FIELD_HEADER_CURSOR" : "Cursor:", + "FIELD_HEADER_DEST_HOST" : "Host de destino:", + "FIELD_HEADER_DEST_PORT" : "Porta de destino:", + "FIELD_HEADER_DISABLE_COPY" : "Desabilitar copiar da estação remota:", + "FIELD_HEADER_DISABLE_PASTE" : "Desabilitar colar do cliente:", + "FIELD_HEADER_ENABLE_AUDIO" : "Habilitar áudio:", + "FIELD_HEADER_ENABLE_SFTP" : "Habilitar SFTP:", + "FIELD_HEADER_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_USERNAME" : "Usuário:", + "FIELD_HEADER_PASSWORD" : "Senha:", + "FIELD_HEADER_PORT" : "Porta:", + "FIELD_HEADER_READ_ONLY" : "Apenas-leitura:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Excluir mouse:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Excluir gráficos/streams:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Excluir eventos chave:", + "FIELD_HEADER_RECORDING_NAME" : "Nome da gravação:", + "FIELD_HEADER_RECORDING_PATH" : "Caminho da gravação:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Diretório padrão de envio:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "Desabilitar recebimento de arquivos:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Chave pública (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Nome do host:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Intervalo de keepalive do SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Frase-senha:", + "FIELD_HEADER_SFTP_PASSWORD" : "Senha:", + "FIELD_HEADER_SFTP_PORT" : "Porta:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Chave privada:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Diretório raíz da escolha de arquivos:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "Desabilitar envio de arquivos:", + "FIELD_HEADER_SFTP_USERNAME" : "Usuário:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Trocar componentes vermelho/azul:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "Endereço de broadcast para pacotes WoL:", + "FIELD_HEADER_WOL_MAC_ADDR" : "Endereço MAC do host remoto:", + "FIELD_HEADER_WOL_SEND_PACKET" : "Enviar pacote WoL:", + "FIELD_HEADER_WOL_WAIT_TIME" : "Tempo de espera de inicialização do host:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 color", + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-bit)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-bit)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-bit)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "Local", + "FIELD_OPTION_CURSOR_REMOTE" : "Remoto", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "Áudio", + "SECTION_HEADER_AUTHENTICATION" : "Autenticação", + "SECTION_HEADER_CLIPBOARD" : "Área de Transferência", + "SECTION_HEADER_DISPLAY" : "Tela", + "SECTION_HEADER_NETWORK" : "Rede", + "SECTION_HEADER_RECORDING" : "Gravação de Tela", + "SECTION_HEADER_REPEATER" : "Repetidor VNC", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "Wake-on-LAN (WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Configurações" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "history.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Os registros históricos das conexões são mostrados aqui e podem ser reordenadas clicando nos títulos das colunas. Para buscar por registros específicos, digite algo e clique em \"Procurar\". Apenas registros que correspondem ao filtro fornecido serão listados.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Nenhum registro correspondente", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nome da conexão", + "TABLE_HEADER_SESSION_DURATION" : "Duração", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Host remoto", + "TABLE_HEADER_SESSION_STARTDATE" : "Horário de início", + "TABLE_HEADER_SESSION_USERNAME" : "Usuário", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Nova conexão", + "ACTION_NEW_CONNECTION_GROUP" : "Novo grupo", + "ACTION_NEW_SHARING_PROFILE" : "Novo Perfil Compartilhado", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Clique na conexão abaixo para gerenciar a conexão. Dependendo do seu nível de acesso, conexões podem ser adicionadas e removidas, bem como suas propriedades (protocolo, nome do host, porta, etc) podem ser alteradas.", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Conexões" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Idioma:", + "FIELD_HEADER_PASSWORD" : "Senha:", + "FIELD_HEADER_PASSWORD_OLD" : "Senha Atual:", + "FIELD_HEADER_PASSWORD_NEW" : "Nova Senha:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirme a Nova Senha:", + "FIELD_HEADER_TIMEZONE" : "Fuso Horário:", + "FIELD_HEADER_USERNAME" : "Usuário:", + + "HELP_DEFAULT_INPUT_METHOD" : "O método de entrada padrão determina como os eventos do teclado serão recebidos pelo Guacamole. Mudar este parâmetro pode ser necessário para utilização de um dispositivo móvel, ou ao digitar através de um IME (método de entrada). Esta configuração pode ser substituída em cada conexão através do menu do Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "O modo de emulação padrão do mouse determina como o mouse remoto vai se comportar em novas conexões em relação aos toques. Esta configuração pode ser substituída em cada conexão através do menu do Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "As opções abaixo estão relacionadas ao idioma e localização do usuário e terão impacto sobre como várias partes da interface são exibidas", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Se você deseja alterar a sua senha, informe a senha atual e a nova senha abaixo, e clique em \"Alterar Senha\". A mudança terá efeito imediato.", + + "INFO_PASSWORD_CHANGED" : "Senha alterada.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Método de Entrada Padrão", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Modo de Emulação de Mouse Padrão", + "SECTION_HEADER_UPDATE_PASSWORD" : "Alterar Senha" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Novo Usuário", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Clique em um usuário abaixo para gerenciá-lo. Dependendo do seu nível de acesso, usuários podem ser adicionados e removidos, e suas senhas podem ser alteradas.", + + "SECTION_HEADER_USERS" : "Usuários", + + "TABLE_HEADER_FULL_NAME" : "Nome completo", + "TABLE_HEADER_LAST_ACTIVE" : "Última atividade", + "TABLE_HEADER_ORGANIZATION" : "Organização", + "TABLE_HEADER_USERNAME" : "Usuário" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Novo Grupo", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Clique em um grupo abaixo para gerenciá-lo. Dependendo do seu nível de acesso, grupos podem ser adicionados ou removidos, e seus usuários e grupos membros podem ser modificados.", + + "SECTION_HEADER_USER_GROUPS" : "Grupos", + + "TABLE_HEADER_USER_GROUP_NAME" : "Nome do Grupo" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Encerrar Sessões", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Encerrar Sessões", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Esta página será preenchida com conexões ativas no momento. As conexões listadas e a capacidade de encerrar estas conexões dependem do seu nível de acesso. Se você deseja encerrar uma ou mais sessões, marque a caixa ao lado destas sessões e clique em \"Encerrar Sessões\". Encerrar uma sessão desconectará imediatamente o usuário da conexão associada.", + + "INFO_NO_SESSIONS" : "Nenhuma sessão ativa", + + "SECTION_HEADER_SESSIONS" : "Sessões Ativas", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Nome da conexão", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Host remoto", + "TABLE_HEADER_SESSION_STARTDATE" : "Ativo desde", + "TABLE_HEADER_SESSION_USERNAME" : "Usuário", + + "TEXT_CONFIRM_DELETE" : "Você tem certeza que quer encerrar as sessões selecionadas? Usuários que estão utilizando estas sessões serão imediatamente desconectados." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Endereço de E-mail:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Nome completo:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Organização:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Função:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/ru.json b/guacamole/src/main/frontend/src/translations/ru.json new file mode 100644 index 0000000..a086f73 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/ru.json @@ -0,0 +1,844 @@ +{ + + "NAME" : "Русский", + + "APP" : { + + "ACTION_ACKNOWLEDGE" : "ОК", + "ACTION_CANCEL" : "Отмена", + "ACTION_CLONE" : "Клонировать", + "ACTION_CONTINUE" : "Продолжить", + "ACTION_DELETE" : "Удалить", + "ACTION_DELETE_SESSIONS" : "Завершить сессии", + "ACTION_DOWNLOAD" : "Скачать", + "ACTION_LOGIN" : "Вход", + "ACTION_LOGOUT" : "Выход", + "ACTION_MANAGE_CONNECTIONS" : "Подключения", + "ACTION_MANAGE_PREFERENCES" : "Настройки", + "ACTION_MANAGE_SETTINGS" : "Опции", + "ACTION_MANAGE_SESSIONS" : "Активные сессии", + "ACTION_MANAGE_USERS" : "Пользователи", + "ACTION_MANAGE_USER_GROUPS" : "Группы", + "ACTION_NAVIGATE_BACK" : "Назад", + "ACTION_NAVIGATE_HOME" : "Главная", + "ACTION_SAVE" : "Сохранить", + "ACTION_SEARCH" : "Искать", + "ACTION_SHARE" : "Расшарить", + "ACTION_UPDATE_PASSWORD" : "Обновить пароль", + "ACTION_VIEW_HISTORY" : "История", + + "DIALOG_HEADER_ERROR" : "Ошибка", + + "ERROR_PAGE_UNAVAILABLE" : "Произошла ошибка, действие не может быть завершено. Если проблема будет повторяться, обратитесь к системному администратору или проверьте системные журналы.", + "ERROR_PASSWORD_BLANK" : "Пароль не может быть пустым.", + "ERROR_PASSWORD_MISMATCH" : "Указанные пароли не совпадают.", + + "FIELD_HEADER_PASSWORD" : "Пароль:", + "FIELD_HEADER_PASSWORD_AGAIN" : "Повтор пароля:", + + "FIELD_PLACEHOLDER_FILTER" : "Фильтр", + + "FORMAT_DATE_TIME_PRECISE" : "dd.MM.yyyy HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "Сейчас в системе {USERS} {USERS, plural, one{пользователь} few{пользователя} many{пользователей} other{пользователя}}.", + + "TEXT_ANONYMOUS_USER" : "Аноним", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{секунда} few{секуны} many{секунд} other{секуны}}} minute{{VALUE, plural, one{минута} few{минуты} many{минут} other{минуты}}} hour{{VALUE, plural, one{час} few{часа} many{часов} other{часа}}} day{{VALUE, plural, one{день} few{дня} many{дней} other{дня}}} other{}}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "Очистить", + "ACTION_DISCONNECT" : "Отключиться", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "Переподключиться", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_UPLOAD_FILES" : "Загрузка файлов", + + "DIALOG_HEADER_CONNECTING" : "Подключение", + "DIALOG_HEADER_CONNECTION_ERROR" : "Ошибка подключения", + "DIALOG_HEADER_DISCONNECTED" : "Отключено", + + "ERROR_CLIENT_201" : "Соединение было закрыто, так как сервер перегружен. Пожалуйста, попробуйте повторить попытку позднее.", + "ERROR_CLIENT_202" : "Сервер Guacamole закрыл соединение, так как удаленный рабочий стол долго не отвечает. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + "ERROR_CLIENT_203" : "На сервере удаленных рабочих столов произошла ошибка и соединение было закрыто. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + "ERROR_CLIENT_207" : "Сервер удаленных рабочих столов недосягаем. Если проблема сохранится, свяжитесь с системным администратором или проверьте логи.", + "ERROR_CLIENT_208" : "Сервер удаленных рабочих столов недоступен. Если проблема сохранится, свяжитесь с системным администратором или проверьте логи.", + "ERROR_CLIENT_209" : "Сервер удаленных рабочих столов закрыл соединение, так как оно конфликтует с другим соединением. Пожалуйста, попробуйте повторить попытку позднее.", + "ERROR_CLIENT_20A" : "Сервер удаленных рабочих столов закрыл соединение, так как оно долгое время было неактивно. Если это нежелательное поведение, обратитесь к системному администратору или проверьте настройки.", + "ERROR_CLIENT_20B" : "Сервер удаленных рабочих столов закрыл соединение принудительно. Если это нежелательное поведение, обратитесь к системному администратору или проверьте настройки.", + "ERROR_CLIENT_301" : "Не удалось выполнить вход. Пожалуйста, переподключитесь и повторите попытку.", + "ERROR_CLIENT_303" : "Сервер удаленных рабочих столов запретил доступ к этому соединению. Для получения доступа, пожалуйста, обратитесь к администратору.", + "ERROR_CLIENT_308" : "Сервер Guacamole закрыл соединение, так как браузер не ответил в течение отведенного времени. Такое бывает в случае возникновения проблем с доступом в сеть, связанных со слабым беспроводным сигналом или низкими скоростями передачи данных. Пожалуйста, проверьте ваше сетевое подключение и повторите попытку снова.", + "ERROR_CLIENT_31D" : "Сервер Guacamole отклонил доступ к соединению, так как вы превысили максимальное количество одновременных подключений. Пожалуйста, закройте ненужные соединения и повторите попытку.", + "ERROR_CLIENT_DEFAULT" : "Соединение было прервано из-за внутренней ошибки сервера Guacamole. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + + "ERROR_TUNNEL_201" : "Сервер Guacamole отклонил соединение, так как уже открыто слишком много соединений. Пожалуйста, попробуйте повторить попытку позднее.", + "ERROR_TUNNEL_202" : "Соединение было закрыто, так как сервер долго не отвечает. Такое бывает в случае возникновения проблем с доступом в сеть, связанных со слабым беспроводным сигналом или низкими скоростями передачи данных. Пожалуйста, проверьте ваше сетевое подключение и повторите попытку снова.", + "ERROR_TUNNEL_203" : "На сервере произошла ошибка и соединение было закрыто. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + "ERROR_TUNNEL_204" : "Соединение не существует. Проверьте, пожалуйста, название соединения.", + "ERROR_TUNNEL_205" : "Соединение в настоящий момент занято и доступ к этому соединению не разрешен. Пожалуйста, попробуйте повторить попытку позднее.", + "ERROR_TUNNEL_207" : "Сервер Guacamole на данный момент недоступен. Пожалуйста, проверьте ваше сетевое подключение и повторите попытку снова.", + "ERROR_TUNNEL_208" : "Сервер Guacamole не принимает соединения. Пожалуйста, проверьте ваше сетевое подключение и повторите попытку снова.", + "ERROR_TUNNEL_301" : "У вас нет разрешения для доступа к этому соединению, так как вы не выполнили вход. Пожалуйста, выполните вход и повторите попытку.", + "ERROR_TUNNEL_303" : "У вас нет разрешения для доступа к этому соединению. Для получения доступа, пожалуйста, обратитесь к администратору.", + "ERROR_TUNNEL_308" : "Сервер Guacamole закрыл соединение, так как браузер не ответил в течение отведенного времени. Такое бывает в случае возникновения проблем с доступом в сеть, связанных со слабым беспроводным сигналом или низкими скоростями передачи данных. Пожалуйста, проверьте ваше сетевое подключение и повторите попытку снова.", + "ERROR_TUNNEL_31D" : "Сервер Guacamole отклонил доступ к соединению, так как вы превысили максимальное количество одновременных подключений. Пожалуйста, закройте несколько установленных соединений и повторите попытку.", + "ERROR_TUNNEL_DEFAULT" : "Соединение было прервано из-за внутренней ошибки сервера Guacamole. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + + "ERROR_UPLOAD_100" : "Передача файлов либо не поддерживается, либо выключена. Пожалуйста, обратитесь к администратору или проверьте логи.", + "ERROR_UPLOAD_201" : "Слишком много задач передачи файлов уже активно. Подождите завершения текущих задач и повторите попытку снова.", + "ERROR_UPLOAD_202" : "Файл не может быть передан, так как удаленный рабочий стол не отвечает. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + "ERROR_UPLOAD_203" : "Произошла ошибка при передаче файла. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + "ERROR_UPLOAD_204" : "Место назначения для передаваемого файла не существует. Пожалуйста, проверьте правильность указания места назначения и повторите попытку снова.", + "ERROR_UPLOAD_205" : "Место назначения для передаваемого файла заблокировано. Пожалуйста, дождитесь завершения других передач и повторите попытку снова.", + "ERROR_UPLOAD_301" : "У вас нет разрешения на загрузку файла, так как вы не выполнили вход. Пожалуйста, выполните вход и повторите попытку передачи файла.", + "ERROR_UPLOAD_303" : "У вас нет разрешения на загрузку файла. Для получения разрешения проверьте настройки или обратитесь к администратору.", + "ERROR_UPLOAD_308" : "Передача файла зависла. Такое бывает в случае возникновения проблем с доступом в сеть, связанных со слабым беспроводным сигналом или низкими скоростями передачи данных. Пожалуйста, проверьте ваше сетевое подключение и повторите попытку снова.", + "ERROR_UPLOAD_31D" : "Слишком много файлов уже передается в настоящий момент. Подождите завершения текущих передач и повторите попытку снова.", + "ERROR_UPLOAD_DEFAULT" : "Соединение было прервано из-за внутренней ошибки сервера Guacamole. Пожалуйста, попробуйте повторить попытку позднее или обратитесь к администратору.", + + "HELP_CLIPBOARD" : "Текст, скопированный или вырезанный внутри сеанса, появится в этом поле. Изменение текста в этом поле также отобразится в буфере обмена удаленного рабочего стола.", + "HELP_INPUT_METHOD_NONE" : "Никакой метод ввода не используется. Ввод разрешен только для физической клавиатуры.", + "HELP_INPUT_METHOD_OSK" : "Отображать и принимать ввод со встроенной экранной клавиатуры. Экранная клавиатура позволяет вводить любые комбинации, недоступные в других режимах (например Alt-Ctrl-Del).", + "HELP_INPUT_METHOD_TEXT" : "Разрешить ввод текста, эмулировать события клавиатуры в зависимости от нажатых клавиш. Это необходимо для устройств без физической клавиатуры (смартфоны, планшеты).", + "HELP_MOUSE_MODE" : "Определяет поведение курсора мыши при прикосновении.", + "HELP_MOUSE_MODE_ABSOLUTE" : "Прикоснитесь, чтобы сделать клик. Клик происходит в точке прикосновения к экрану.", + "HELP_MOUSE_MODE_RELATIVE" : "Потяните, чтобы перемещать курсор. Прикоснитесь, чтобы сделать клик. Клик происходит в точке нахождения курсора.", + "HELP_SHARE_LINK" : "Это соединение расшарено и доступно всем по следующ{LINKS, plural, one{ей ссылке} other{им ссылкам}}:", + + "INFO_CONNECTION_SHARED" : "Это соединение теперь расшарено.", + "INFO_NO_FILE_TRANSFERS" : "Нет загрузок.", + + "NAME_INPUT_METHOD_NONE" : "Нет", + "NAME_INPUT_METHOD_OSK" : "Экранная клавиатура", + "NAME_INPUT_METHOD_TEXT" : "Ввод текста", + "NAME_MOUSE_MODE_ABSOLUTE" : "Тачскрин", + "NAME_MOUSE_MODE_RELATIVE" : "Тачпад", + + "SECTION_HEADER_CLIPBOARD" : "Буфер обмена", + "SECTION_HEADER_DEVICES" : "Устройства", + "SECTION_HEADER_DISPLAY" : "Экран", + "SECTION_HEADER_FILE_TRANSFERS" : "Загрузки файлов", + "SECTION_HEADER_INPUT_METHOD" : "Метод ввода", + "SECTION_HEADER_MOUSE_MODE" : "Режим эмуляции мыши", + + "TEXT_ZOOM_AUTO_FIT" : "Автоматически умещать в браузере", + "TEXT_CLIENT_STATUS_IDLE" : "Бездействие.", + "TEXT_CLIENT_STATUS_CONNECTING" : "Подключение к Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "Вы были отключены.", + "TEXT_CLIENT_STATUS_UNSTABLE" : "Сетевое соединение с сервером Guacamole нестабильно.", + "TEXT_CLIENT_STATUS_WAITING" : "Подключено к Guacamole. Ожидание ответа...", + "TEXT_RECONNECT_COUNTDOWN" : "Переподключение через {REMAINING} {REMAINING, plural, one{секунду} few{секунды} many{секунд} other{секунды}}...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/ru-ru-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "Спрятать", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "Показать", + + "FIELD_HEADER_BACKGROUND" : "Цвет фона", + "FIELD_HEADER_FOREGROUND" : "Основной цвет", + + "FIELD_OPTION_CUSTOM" : "Выбрать...", + + "SECTION_HEADER_DETAILS" : "Подробно:" + + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "По умолчанию (XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "DD.MM.YYYY", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "Нажмите, чтобы показать пароль", + "HELP_HIDE_PASSWORD" : "Нажмите, чтобы спрятать пароль" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "Нет недавних подключений.", + + "PASSWORD_CHANGED" : "Пароль был изменен.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Все подключения", + "SECTION_HEADER_RECENT_CONNECTIONS" : "Недавние подключения" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "@:APP.TEXT_ANONYMOUS_USER" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "Неверные данные для входа", + + "FIELD_HEADER_USERNAME" : "Имя пользователя", + "FIELD_HEADER_PASSWORD" : "Пароль" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Удалить подключение", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Размещение:", + "FIELD_HEADER_NAME" : "Название:", + "FIELD_HEADER_PROTOCOL" : "Протокол:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "Активно", + "INFO_CONNECTION_NOT_USED" : "Это подключение еще не использовалось.", + + "SECTION_HEADER_EDIT_CONNECTION" : "Редактирование подключения", + "SECTION_HEADER_HISTORY" : "История использования", + "SECTION_HEADER_PARAMETERS" : "Настройки", + + "TABLE_HEADER_HISTORY_USERNAME" : "Имя пользователя", + "TABLE_HEADER_HISTORY_START" : "Время начала", + "TABLE_HEADER_HISTORY_DURATION" : "Продолжительность", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "Удаленный узел", + + "TEXT_CONFIRM_DELETE" : "Подключения не могут быть восстановлены после удаления. Вы уверены, что хотите удалить подключение?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Удалить группу подключений", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "Размещение:", + "FIELD_HEADER_NAME" : "Название:", + "FIELD_HEADER_TYPE" : "Тип:", + + "NAME_TYPE_BALANCING" : "Балансирующая", + "NAME_TYPE_ORGANIZATIONAL" : "Структурная", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "Редактирование группы подключений", + + "TEXT_CONFIRM_DELETE" : "Группы подключений не могут быть восстановлены после удаления. Вы уверены, что хотите удалить группу подключений?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Удалить профиль расшаривания", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "Название:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "Изначальное подключение:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "Редактирование профиля расшаривания", + "SECTION_HEADER_PARAMETERS" : "Настройки", + + "TEXT_CONFIRM_DELETE" : "Профили расшаривания не могут быть восстановлены после удаления. Вы уверены, что хотите удалить профиль расшаривания?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Удалить пользователя", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "Администрирование системы:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "Изменение собственного пароля:", + "FIELD_HEADER_CREATE_NEW_USERS" : "Создание нового пользователя:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "Создание новой группы пользователей:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "Создание нового подключения:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "Создание новой группы подключений:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "Создание нового профиля расшаривания:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "Аккаунт отключен:", + "FIELD_HEADER_USERNAME" : "Имя пользователя:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Этот пользователь еще не сопоставлен ни с одной группой. Раскройте эту секцию для добавления групп.", + + "INFO_READ_ONLY" : "Извините, этот пользователь не может быть изменен.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "Нет доступных групп.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "Все подключения", + "SECTION_HEADER_CONNECTIONS" : "Подключения", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "Текущие подключения", + "SECTION_HEADER_EDIT_USER" : "Редактирование пользователя", + "SECTION_HEADER_PERMISSIONS" : "Разрешения", + "SECTION_HEADER_USER_GROUPS" : "Группы", + + "TEXT_CONFIRM_DELETE" : "Пользователи не могут быть восстановлены после удаления. Вы уверены, что хотите удалить пользователя?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Удалить группу", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "Группа отключена:", + "FIELD_HEADER_USER_GROUP_NAME" : "Название:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "Эта группа еще не сопоставлена ни с одной группой. Раскройте эту секцию для добавления групп.", + "HELP_NO_MEMBER_USER_GROUPS" : "Эта группа еще не содержит ни одной группы. Раскройте эту секцию для добавления групп.", + "HELP_NO_MEMBER_USERS" : "Эта группа еще не содержит ни одного пользователя. Раскройте эту секцию для добавления пользователей.", + + "INFO_READ_ONLY" : "Извините, эта группа не может быть изменена.", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "Нет доступных пользователей.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "Редактирование группы", + "SECTION_HEADER_MEMBER_USERS" : "Пользователи в группе", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "Дочерние группы", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "Родительские группы", + + "TEXT_CONFIRM_DELETE" : "Группы не могут быть восстановлены после удаления. Вы уверены, что хотите удалить группу?" + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "Клавиша Backspace посылает:", + "FIELD_HEADER_CA_CERT" : "Сертификат центра сертификации (CA):", + "FIELD_HEADER_CLIENT_CERT" : "Сертификат клиента:", + "FIELD_HEADER_CLIENT_KEY" : "Ключ клиента:", + "FIELD_HEADER_COLOR_SCHEME" : "Цветовая схема:", + "FIELD_HEADER_CONTAINER" : "Название контейнера:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Автоматически создавать путь для записи:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Автоматически создавать путь typescript:", + "FIELD_HEADER_FONT_NAME" : "Шрифт:", + "FIELD_HEADER_FONT_SIZE" : "Размер шрифта:", + "FIELD_HEADER_HOSTNAME" : "Сервер:", + "FIELD_HEADER_IGNORE_CERT" : "Игнорировать сертификат сервера:", + "FIELD_HEADER_NAMESPACE" : "Пространство имен:", + "FIELD_HEADER_POD" : "Название пода:", + "FIELD_HEADER_PORT" : "Порт:", + "FIELD_HEADER_READ_ONLY" : "Только просмотр:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Исключить мышь:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Исключить графику/потоки:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Включить события клавиатуры:", + "FIELD_HEADER_RECORDING_NAME" : "Название записи:", + "FIELD_HEADER_RECORDING_PATH" : "Путь для записи:", + "FIELD_HEADER_SCROLLBACK" : "Размер буфера прокрутки:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Название typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Путь typescript:", + "FIELD_HEADER_USE_SSL" : "Использовать SSL/TLS", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Черное на белом", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Серое на черном", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Зеленое на черном", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Белое на черном", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "Аутентификация", + "SECTION_HEADER_BEHAVIOR" : "Поведение терминала", + "SECTION_HEADER_CONTAINER" : "Контейнер", + "SECTION_HEADER_DISPLAY" : "Экран", + "SECTION_HEADER_RECORDING" : "Запись экрана", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (запись текстовой сессии)", + "SECTION_HEADER_NETWORK" : "Сеть" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "Имя клиента:", + "FIELD_HEADER_COLOR_DEPTH" : "Глубина цвета:", + "FIELD_HEADER_CONSOLE" : "Консоль администратора:", + "FIELD_HEADER_CONSOLE_AUDIO" : "Поддержка звука в консоли:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "Автоматически создавать путь для диска:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Автоматически создавать путь для записи:", + "FIELD_HEADER_DISABLE_AUDIO" : "Отключить звук:", + "FIELD_HEADER_DISABLE_AUTH" : "Отключить аутентификацию:", + "FIELD_HEADER_DISABLE_COPY" : "Отключить копирование в буфер обмена:", + "FIELD_HEADER_DISABLE_PASTE" : "Отключить вставку из буфера обмена:", + "FIELD_HEADER_DOMAIN" : "Домен:", + "FIELD_HEADER_DPI" : "Разрешение экрана (DPI):", + "FIELD_HEADER_DRIVE_NAME" : "Название диска:", + "FIELD_HEADER_DRIVE_PATH" : "Путь для диска:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "Включить звуковой вход (микрофон):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "Включить композитор рабочего стола (Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "Включить диск:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "Включить сглаживание шрифтов (ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "Включить отображение содержимого окна при перетаскивании:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "Включить анимации меню:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "Отключить кеширование битмапов:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "Отключить кеширование скрытых элементов:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "Отключить кеширование глифов:", + "FIELD_HEADER_ENABLE_PRINTING" : "Включить печать:", + "FIELD_HEADER_ENABLE_SFTP" : "Включить SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "Включить темы:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "Включить обои:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "Домен:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "Сервер:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "Пароль:", + "FIELD_HEADER_GATEWAY_PORT" : "Порт:", + "FIELD_HEADER_GATEWAY_USERNAME" : "Имя пользователя:", + "FIELD_HEADER_HEIGHT" : "Высота:", + "FIELD_HEADER_HOSTNAME" : "Сервер:", + "FIELD_HEADER_IGNORE_CERT" : "Игнорировать сертификат сервера:", + "FIELD_HEADER_INITIAL_PROGRAM" : "Запуск программ при подключении:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "Информация о балансировке нагрузки:", + "FIELD_HEADER_PASSWORD" : "Пароль:", + "FIELD_HEADER_PORT" : "Порт:", + "FIELD_HEADER_PRINTER_NAME" : "Название принтера:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "Данные BLOB (HyperV VM ID):", + "FIELD_HEADER_PRECONNECTION_ID" : "Данные RDP ID:", + "FIELD_HEADER_READ_ONLY" : "Только просмотр:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Исключить мышь:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Исключить графику/потоки:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Включить события клавиатуры:", + "FIELD_HEADER_RECORDING_NAME" : "Название записи:", + "FIELD_HEADER_RECORDING_PATH" : "Путь для записи:", + "FIELD_HEADER_RESIZE_METHOD" : "Метод изменения размера стола:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "Параметры RemoteApp:", + "FIELD_HEADER_REMOTE_APP_DIR" : "Рабочий каталог RemoteApp:", + "FIELD_HEADER_REMOTE_APP" : "Программа RemoteApp:", + "FIELD_HEADER_SECURITY" : "Режим безопасности:", + "FIELD_HEADER_SERVER_LAYOUT" : "Раскладка клавиатуры:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Директория загрузки по умолчанию:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Публичный ключ сервера (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Сервер:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Интервал keepalive для SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Секретная фраза:", + "FIELD_HEADER_SFTP_PASSWORD" : "Пароль:", + "FIELD_HEADER_SFTP_PORT" : "Порт:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Приватный ключ:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Директория просмотра по умолчанию:", + "FIELD_HEADER_SFTP_USERNAME" : "Имя пользователя:", + "FIELD_HEADER_STATIC_CHANNELS" : "Названия статических каналов:", + "FIELD_HEADER_TIMEZONE" : "Часовой пояс:", + "FIELD_HEADER_USERNAME" : "Имя пользователя:", + "FIELD_HEADER_WIDTH" : "Ширина:", + + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-бит)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-бит)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-бит)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 цветов", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "Виртуальный канал \"Display Update\" (RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "Переподключение", + + "FIELD_OPTION_SECURITY_ANY" : "Любой", + "FIELD_OPTION_SECURITY_NLA" : "NLA (аутентификация уровня сети)", + "FIELD_OPTION_SECURITY_RDP" : "RDP-шифрование", + "FIELD_OPTION_SECURITY_TLS" : "TLS-шифрование", + + "SECTION_HEADER_AUTHENTICATION" : "Аутентификация", + "SECTION_HEADER_BASIC_PARAMETERS" : "Основные настройки", + "SECTION_HEADER_DEVICE_REDIRECTION" : "Перенаправление устройств", + "SECTION_HEADER_DISPLAY" : "Экран", + "SECTION_HEADER_GATEWAY" : "Шлюз удаленных рабочих столов", + "SECTION_HEADER_LOAD_BALANCING" : "Балансировщик нагрузки", + "SECTION_HEADER_NETWORK" : "Сеть", + "SECTION_HEADER_PERFORMANCE" : "Производительность", + "SECTION_HEADER_PRECONNECTION_PDU" : "Предварительные данные подключения (Hyper-V)", + "SECTION_HEADER_RECORDING" : "Запись экрана" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "Клавиша Backspace посылает:", + "FIELD_HEADER_COLOR_SCHEME" : "Цветовая схема:", + "FIELD_HEADER_COMMAND" : "Команда для выполнения:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Автоматически создавать путь для записи:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Автоматически создавать путь typescript:", + "FIELD_HEADER_DISABLE_COPY" : "Отключить копирование в буфер обмена:", + "FIELD_HEADER_DISABLE_PASTE" : "Отключить вставку из буфера обмена:", + "FIELD_HEADER_FONT_NAME" : "Шрифт:", + "FIELD_HEADER_FONT_SIZE" : "Размер шрифта:", + "FIELD_HEADER_ENABLE_SFTP" : "Включить SFTP:", + "FIELD_HEADER_HOST_KEY" : "Публичный ключ сервера (Base64):", + "FIELD_HEADER_HOSTNAME" : "Сервер:", + "FIELD_HEADER_LOCALE" : "Language/Locale ($LANG):", + "FIELD_HEADER_USERNAME" : "Имя пользователя:", + "FIELD_HEADER_PASSWORD" : "Пароль:", + "FIELD_HEADER_PASSPHRASE" : "Секретная фраза:", + "FIELD_HEADER_PORT" : "Порт:", + "FIELD_HEADER_PRIVATE_KEY" : "Приватный ключ:", + "FIELD_HEADER_SCROLLBACK" : "Размер буфера прокрутки:", + "FIELD_HEADER_READ_ONLY" : "Только просмотр:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Исключить мышь:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Исключить графику/потоки:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Включить события клавиатуры:", + "FIELD_HEADER_RECORDING_NAME" : "Название записи:", + "FIELD_HEADER_RECORDING_PATH" : "Путь для записи:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "Интервал keepalive для сервера:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Директория просмотра по умолчанию:", + "FIELD_HEADER_TERMINAL_TYPE" : "Тип терминала:", + "FIELD_HEADER_TIMEZONE" : "Часовой пояс ($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Название typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Путь typescript:", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Черное на белом", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Серое на черном", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Зеленое на черном", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Белое на черном", + + "SECTION_HEADER_AUTHENTICATION" : "Аутентификация", + "SECTION_HEADER_BEHAVIOR" : "Поведение терминала", + "SECTION_HEADER_DISPLAY" : "Экран", + "SECTION_HEADER_NETWORK" : "Сеть", + "SECTION_HEADER_RECORDING" : "Запись экрана", + "SECTION_HEADER_SESSION" : "Сессия / среда:", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (запись текстовой сессии)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "Клавиша Backspace посылает:", + "FIELD_HEADER_COLOR_SCHEME" : "Цветовая схема:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Автоматически создавать путь для записи:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "Автоматически создавать путь typescript:", + "FIELD_HEADER_DISABLE_COPY" : "Отключить копирование в буфер обмена:", + "FIELD_HEADER_DISABLE_PASTE" : "Отключить вставку из буфера обмена:", + "FIELD_HEADER_FONT_NAME" : "Шрифт:", + "FIELD_HEADER_FONT_SIZE" : "Размер шрифта:", + "FIELD_HEADER_HOSTNAME" : "Сервер:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "Regex определения отказа во входе:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "Regex определения успешного входа:", + "FIELD_HEADER_USERNAME" : "Имя пользователя:", + "FIELD_HEADER_USERNAME_REGEX" : "Regex определения запроса имени пользователя:", + "FIELD_HEADER_PASSWORD" : "Пароль:", + "FIELD_HEADER_PASSWORD_REGEX" : "Regex определения запроса пароля:", + "FIELD_HEADER_PORT" : "Порт:", + "FIELD_HEADER_READ_ONLY" : "Только просмотр:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Исключить мышь:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Исключить графику/потоки:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Включить события клавиатуры:", + "FIELD_HEADER_RECORDING_NAME" : "Название записи:", + "FIELD_HEADER_RECORDING_PATH" : "Путь для записи:", + "FIELD_HEADER_SCROLLBACK" : "Размер буфера прокрутки:", + "FIELD_HEADER_TERMINAL_TYPE" : "Тип терминала:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Название typescript:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Путь typescript:", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "Черное на белом", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "Серое на черном", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "Зеленое на черном", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "Белое на черном", + + "SECTION_HEADER_AUTHENTICATION" : "Аутентификация", + "SECTION_HEADER_BEHAVIOR" : "Поведение терминала", + "SECTION_HEADER_DISPLAY" : "Экран", + "SECTION_HEADER_RECORDING" : "Запись экрана", + "SECTION_HEADER_TYPESCRIPT" : "Typescript (запись текстовой сессии)", + "SECTION_HEADER_NETWORK" : "Сеть" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "Название аудио-сервера:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "Кодировка:", + "FIELD_HEADER_COLOR_DEPTH" : "Глубина цвета:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "Автоматически создавать путь для записи:", + "FIELD_HEADER_CURSOR" : "Курсор:", + "FIELD_HEADER_DEST_HOST" : "Сервер назначения:", + "FIELD_HEADER_DEST_PORT" : "Порт назначения:", + "FIELD_HEADER_DISABLE_COPY" : "Отключить копирование в буфер обмена:", + "FIELD_HEADER_DISABLE_PASTE" : "Отключить вставку из буфера обмена:", + "FIELD_HEADER_ENABLE_AUDIO" : "Включить звук:", + "FIELD_HEADER_ENABLE_SFTP" : "Включить SFTP:", + "FIELD_HEADER_HOSTNAME" : "Сервер:", + "FIELD_HEADER_PASSWORD" : "Пароль:", + "FIELD_HEADER_PORT" : "Порт:", + "FIELD_HEADER_READ_ONLY" : "Только просмотр:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "Исключить мышь:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "Исключить графику/потоки:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "Включить события клавиатуры:", + "FIELD_HEADER_RECORDING_NAME" : "Название записи:", + "FIELD_HEADER_RECORDING_PATH" : "Путь для записи:", + "FIELD_HEADER_SFTP_DIRECTORY" : "Директория загрузки по умолчанию:", + "FIELD_HEADER_SFTP_HOST_KEY" : "Публичный ключ сервера (Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "Сервер:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "Интервал keepalive для SFTP:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "Секретная фраза:", + "FIELD_HEADER_SFTP_PASSWORD" : "Пароль:", + "FIELD_HEADER_SFTP_PORT" : "Порт:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "Приватный ключ:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "Директория просмотра по умолчанию:", + "FIELD_HEADER_SFTP_USERNAME" : "Имя пользователя:", + "FIELD_HEADER_SWAP_RED_BLUE" : "Поменять синий и красный компоненты:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 цветов", + "FIELD_OPTION_COLOR_DEPTH_16" : "Low color (16-бит)", + "FIELD_OPTION_COLOR_DEPTH_24" : "True color (24-бит)", + "FIELD_OPTION_COLOR_DEPTH_32" : "True color (32-бит)", + + "FIELD_OPTION_CURSOR_LOCAL" : "Локальный", + "FIELD_OPTION_CURSOR_REMOTE" : "Удаленный", + + "SECTION_HEADER_AUDIO" : "Аудио", + "SECTION_HEADER_AUTHENTICATION" : "Аутентификация", + "SECTION_HEADER_CLIPBOARD" : "Буфер обмена", + "SECTION_HEADER_DISPLAY" : "Экран", + "SECTION_HEADER_NETWORK" : "Сеть", + "SECTION_HEADER_RECORDING" : "Запись экрана" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "Настройки" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "Здесь отображается журнал предыдущих подключений, который можно отсортировать, кликнув на заголовке колонки. Для поиска конкретных записей введите нужные данные и нажмите «Поиск». Тогда будут отображаться только записи, соответствующие данным для поиска.", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "Подходящих записей нет", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Название подключения", + "TABLE_HEADER_SESSION_DURATION" : "Продолжительность", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Удаленный узел", + "TABLE_HEADER_SESSION_STARTDATE" : "Время начала", + "TABLE_HEADER_SESSION_USERNAME" : "Имя пользователя", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_CONNECTION" : "Новое подключение", + "ACTION_NEW_CONNECTION_GROUP" : "Новая группа", + "ACTION_NEW_SHARING_PROFILE" : "Новый профиль расшаривания", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "Нажмите на подключение, чтобы управлять им. В зависимости от прав доступа возможно добавление и удаление подключений, а также изменение их свойств (протокол, название сервера, порт и т.д.).", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "Подключения" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "Язык:", + "FIELD_HEADER_PASSWORD" : "Пароль:", + "FIELD_HEADER_PASSWORD_OLD" : "Текущий пароль:", + "FIELD_HEADER_PASSWORD_NEW" : "Новый пароль:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Повтор нового пароля:", + "FIELD_HEADER_TIMEZONE" : "Часовой пояс:", + "FIELD_HEADER_USERNAME" : "Имя пользователя:", + + "HELP_DEFAULT_INPUT_METHOD" : "Режим ввода по умолчанию определяет, каким образом нажатия на клавиатуру будут передаваться Guacamole. Изменение данной настройки может быть полезным при работе с мобильных устройств или при вводе через IME. Данная настройка может быть сделана для каждого подключения через основное меню Guacamole.", + "HELP_DEFAULT_MOUSE_MODE" : "Режим эмуляции мыши по умолчанию определяет, каким образом мышь на удаленном сервере будет реагировать на прикосновения для новых подключений. Данная настройка может быть переопределена для каждого подключения через основное меню Guacamole.", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "Ниже вы можете выбрать язык и установить другие настройки локали, влияющие на отображение интерфейса пользователя.", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "Если вы хотите изменить пароль, укажите ваш текущий пароль и дважды укажите новый. Затем нажмите «Обновить пароль». Изменения вступят в силу моментально.", + + "INFO_PASSWORD_CHANGED" : "Пароль успешно изменен.", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Метод ввода по умолчанию", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Режим эмуляции мыши по умолчанию", + "SECTION_HEADER_UPDATE_PASSWORD" : "Изменить пароль" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "Создать пользователя", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "Нажмите на пользователя, чтобы управлять им. В зависимости от прав доступа возможно добавление и удаление пользователей, а также изменение паролей.", + + "SECTION_HEADER_USERS" : "Пользователи", + + "TABLE_HEADER_FULL_NAME" : "Полное имя", + "TABLE_HEADER_LAST_ACTIVE" : "Был активен", + "TABLE_HEADER_ORGANIZATION" : "Организация", + "TABLE_HEADER_USERNAME" : "Имя пользователя" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "Создать группу", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "Нажмите на группу, чтобы управлять ей. В зависимости от прав доступа возможно добавление и удаление групп, а также изменение членства других групп и пользователей.", + + "SECTION_HEADER_USER_GROUPS" : "Группы", + + "TABLE_HEADER_USER_GROUP_NAME" : "Название группы" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "Завершить сессии", + + "DIALOG_HEADER_CONFIRM_DELETE" : "Завершение сессий", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "Здесь показаны текущие активные сессии Guacamole. Отображаемые сессии и возможность их завершения зависит от ваших прав доступа. Если вы хотите завершить одну или несколько сессий, выберите нужные и нажмите «Завершить сессии». Принудительное завершение сессий приведет к немедленному отключению пользователей.", + + "INFO_NO_SESSIONS" : "Нет активных сессий", + + "SECTION_HEADER_SESSIONS" : "Активные сессии", + + "TABLE_HEADER_SESSION_USERNAME" : "Имя пользователя", + "TABLE_HEADER_SESSION_STARTDATE" : "Активен с", + "TABLE_HEADER_SESSION_REMOTEHOST" : "Удаленный узел", + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "Название подключения", + + "TEXT_CONFIRM_DELETE" : "Вы уверены, что хотите завершить все выбранные сессии? Пользователи, работающие в этих сессиях, будут немедленно отключены." + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "Адрес электронной почты:", + "FIELD_HEADER_GUAC_FULL_NAME" : "Полное имя:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "Организация:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "Роль:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/translations/zh.json b/guacamole/src/main/frontend/src/translations/zh.json new file mode 100644 index 0000000..86d84a9 --- /dev/null +++ b/guacamole/src/main/frontend/src/translations/zh.json @@ -0,0 +1,1139 @@ +{ + + "NAME" : "简体中文", + + "APP" : { + + "NAME" : "Apache Guacamole", + + "ACTION_ACKNOWLEDGE" : "确定", + "ACTION_CANCEL" : "取消", + "ACTION_CLEAR" : "清除", + "ACTION_CLONE" : "克隆", + "ACTION_CONTINUE" : "继续", + "ACTION_DELETE" : "删除", + "ACTION_DELETE_SESSIONS" : "删除会话", + "ACTION_DOWNLOAD" : "下载", + "ACTION_IMPORT" : "导入", + "ACTION_LOGIN" : "登录", + "ACTION_LOGIN_AGAIN" : "重新登录", + "ACTION_LOGOUT" : "登出", + "ACTION_MANAGE_CONNECTIONS" : "连接", + "ACTION_MANAGE_PREFERENCES" : "偏好", + "ACTION_MANAGE_SETTINGS" : "设置", + "ACTION_MANAGE_SESSIONS" : "活动会话", + "ACTION_MANAGE_USERS" : "用户", + "ACTION_MANAGE_USER_GROUPS" : "用户组", + "ACTION_NAVIGATE_BACK" : "返回", + "ACTION_NAVIGATE_HOME" : "首页", + "ACTION_PAUSE" : "暂停", + "ACTION_PLAY" : "播放", + "ACTION_SAVE" : "保存", + "ACTION_SEARCH" : "搜索", + "ACTION_SHARE" : "共享", + "ACTION_UPDATE_PASSWORD" : "更新密码", + "ACTION_VIEW_HISTORY" : "历史", + "ACTION_VIEW_RECORDING" : "查看", + + "DIALOG_HEADER_ERROR" : "错误", + + "ERROR_PAGE_UNAVAILABLE" : "发生错误,此操作无法完成。 如果问题仍然存在,请通知系统管理员或检查系统日志。", + "ERROR_PASSWORD_BLANK" : "密码不能为空。", + "ERROR_PASSWORD_MISMATCH" : "输入的密码不匹配。", + "ERROR_SINGLE_FILE_ONLY" : "请一次只上传一个文件", + + "FIELD_HEADER_PASSWORD" : "密码:", + "FIELD_HEADER_PASSWORD_AGAIN" : "重输密码:", + + "FIELD_PLACEHOLDER_FILTER" : "过滤", + + "FORMAT_DATE_TIME_PRECISE" : "yyyy-MM-dd HH:mm:ss", + + "INFO_ACTIVE_USER_COUNT" : "正在被 {USERS} 个用户使用。", + "INFO_LOGGED_OUT" : "您已登出。", + + "TEXT_ANONYMOUS_USER" : "匿名用户", + "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{秒} minute{分} hour{小时} day{天} other{}}", + "TEXT_UNTRANSLATED" : "{MESSAGE}" + + }, + + "CLIENT" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR_CLIENT_MESSAGES" : "@:APP.ACTION_CLEAR", + "ACTION_CLEAR_COMPLETED_TRANSFERS" : "@:APP.ACTION_CLEAR", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_DISCONNECT" : "断开连接", + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_NAVIGATE_BACK" : "@:APP.ACTION_NAVIGATE_BACK", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_RECONNECT" : "重新连接", + "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", + "ACTION_SHARE" : "@:APP.ACTION_SHARE", + "ACTION_SHOW_CLIPBOARD" : "点击以查看剪贴板内容。", + "ACTION_UPLOAD_FILES" : "上传文件", + + "DIALOG_HEADER_CONNECTING" : "正在连接", + "DIALOG_HEADER_CONNECTION_ERROR" : "连接出错", + "DIALOG_HEADER_DISCONNECTED" : "已断开连接", + + "ERROR_CLIENT_201" : "因服务器繁忙,本连接已被关闭。请稍等几分钟后再尝试。", + "ERROR_CLIENT_202" : "因远程桌面太久没有应答,Guacamole 服务器关闭了本连接。请重试或联系您的系统管理员。", + "ERROR_CLIENT_203" : "远程桌面服务器因为发生错误而关闭了本连接。请重试或联系您的系统管理员。", + "ERROR_CLIENT_207" : "联系不上远程桌面服务器。如果问题持续,请通知您的系统管理员,或检查您的系统日志。", + "ERROR_CLIENT_208" : "远程桌面服务器不在线。如果问题持续,请通知您的系统管理员,或检查您的系统日志。", + "ERROR_CLIENT_209" : "因与另一个连接冲突,远程桌面服务器关闭了本连接。请稍后重试。", + "ERROR_CLIENT_20A" : "因长时间没有活动,远程桌面服务器关闭了本连接。如果这不是期望的设置,请通知您的系统管理员,或检查您的系统设置。", + "ERROR_CLIENT_20B" : "远程桌面服务器强制关闭了本连接。如果这不是预期的情况,请通知您的系统管理员,或检查您的系统日志。", + "ERROR_CLIENT_301" : "登录失败。请重新连接后再重试。", + "ERROR_CLIENT_303" : "远程桌面服务器拒绝了本连接。如果需要使用本连接,请联系您的系统管理员开放权限,或者检查您的系统设置。", + "ERROR_CLIENT_308" : "因为您的浏览器长时间没有应答,Guacamole 服务器关闭了本连接。这通常是因为网络问题(如不稳定的无线连接或网速太慢等)而导致的。请先检查您的网络连接再重试。", + "ERROR_CLIENT_31D" : "因为您已超出了单一用户可同时使用的连接数量,Guacamole 服务器拒绝了本连接。请先关闭至少一个连接再重试。", + "ERROR_CLIENT_DEFAULT" : "本连接因为 Guacamole 服务器出现了内部错误而被终止。如果问题持续,请通知您的系统管理员,或检查您的系统日志。", + + "ERROR_TUNNEL_201" : "因为正在使用的活动连接太多,Guacamole 服务器拒绝了本连接。请稍后再重试。", + "ERROR_TUNNEL_202" : "因服务器太久没有应答,本连接已被关闭。这通常是因为网络问题(如不稳定的无线连接或网速太慢等)而导致的。请先检查您的网络连接再重试,或者联系您的系统管理员。", + "ERROR_TUNNEL_203" : "服务器出错并关闭了本连接。请重试,或联系您的系统管理员。", + "ERROR_TUNNEL_204" : "请求的连接不存在。请先检查连接的名字再重试。", + "ERROR_TUNNEL_205" : "本连接正在使用中,并且不允许共享连接。请稍后重试。", + "ERROR_TUNNEL_207" : "联系不上 Guacamole 服务器。请先检查您的网络连接再重试。", + "ERROR_TUNNEL_208" : "Guacamole 服务器不接受连接请求。请先检查您的网络连接再重试。", + "ERROR_TUNNEL_301" : "您还未登录,所以没有使用此连接的权限。请先登录再重试。", + "ERROR_TUNNEL_303" : "您没有使用此连接的权限。如果您的确需要使用此连接,请联系您的系统管理员开通权限,或检查您的系统设置。", + "ERROR_TUNNEL_308" : "因为您的浏览器长时间没有应答,Guacamole 服务器关闭了本连接。这通常是因为网络问题(如不稳定的无线连接或网速太慢等)而导致的。请先检查您的网络连接再重试。", + "ERROR_TUNNEL_31D" : "因为您已超出了单一用户可同时使用的连接数量,Guacamole 服务器拒绝了本连接。请先关闭至少一个连接再重试。", + "ERROR_TUNNEL_DEFAULT" : "本连接因为 Guacamole 服务器出现了内部错误而被终止。如果问题持续,请通知您的系统管理员,或检查您的系统日志。", + + "ERROR_UPLOAD_100" : "不支持或不允许使用文件传输。请联系您的系统管理员,或检查您的系统日志。", + "ERROR_UPLOAD_201" : "正在同时传输太多文件。请等待当前的文件传输任务完成后,再重试。", + "ERROR_UPLOAD_202" : "因远程桌面服务器太久没有应答,文件不能传输。请重试或联系您的系统管理员。", + "ERROR_UPLOAD_203" : "远程桌面服务器在文件传输时出错。请重试或联系您的系统管理员。", + "ERROR_UPLOAD_204" : "文件传输的接收目录不存在。请先检查接收目录再重试。", + "ERROR_UPLOAD_205" : "文件传输的接收目录正被锁定。请等待正在进行的操作完成后,再重试。", + "ERROR_UPLOAD_301" : "您还未登录,所以没有上传此文件的权限。请先登录再重试。", + "ERROR_UPLOAD_303" : "您没有上传此文件的权限。如果您需要权限,请检查您的系统设置,或联系您的系统管理员。", + "ERROR_UPLOAD_308" : "文件传输已停止。这通常是因为网络问题(如不稳定的无线连接或网速太慢等)而导致的。请先检查您的网络连接再重试。", + "ERROR_UPLOAD_31D" : "正在同时传输太多文件。请等待当前的传输任务完成后,再重试。", + "ERROR_UPLOAD_DEFAULT" : "本连接因为 Guacamole 服务器出现了内部错误而被终止。如果问题持续,请通知您的系统管理员,或检查您的系统日志。", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CLIPBOARD" : "复制/剪切的文本将出现在这里。对下面文本内容所作的修改将会影响远程电脑上的剪贴板。", + "HELP_INPUT_METHOD_NONE" : "没有选择任何输入方式。将从连接的物理键盘接受键盘输入。", + "HELP_INPUT_METHOD_OSK" : "显示并从内建的 Guacamole 屏幕键盘接受输入。屏幕键盘可以输入平常无法输入的按键组合(如 Ctrl-Alt-Del 等)。", + "HELP_INPUT_METHOD_TEXT" : "允许输入文本,并根据所输入的文本模拟键盘事件。可用于没有物理键盘的设备,如手机等。", + "HELP_MOUSE_MODE" : "设置远程电脑上的鼠标对触控行为的反应。", + "HELP_MOUSE_MODE_ABSOLUTE" : "点击时立即触发按键。在点击的位置触发鼠标按键事件。", + "HELP_MOUSE_MODE_RELATIVE" : "拖拽时移动鼠标,再点击时触发按键。在鼠标当前所在的位置触发按键事件。", + "HELP_SHARE_LINK" : "正在共享当前连接,并可被使用以下链接的任何人使用:", + + "INFO_ANONYMOUS_USER_COUNT" : "匿名用户{COUNT, plural, one{} other{ (#)}}", + "INFO_CONNECTION_SHARED" : "此连接已被共享。", + "INFO_NO_FILE_TRANSFERS" : "无文件传输任务。", + "INFO_USER_COUNT" : "{USERNAME}{COUNT, plural, one{} other{ (#)}}", + + "NAME_INPUT_METHOD_NONE" : "无", + "NAME_INPUT_METHOD_OSK" : "屏幕键盘", + "NAME_INPUT_METHOD_TEXT" : "文本输入", + "NAME_KEY_CTRL" : "Ctrl", + "NAME_KEY_ALT" : "Alt", + "NAME_KEY_ESC" : "Esc", + "NAME_KEY_TAB" : "Tab", + "NAME_MOUSE_MODE_ABSOLUTE" : "触摸屏", + "NAME_MOUSE_MODE_RELATIVE" : "触控板", + + "SECTION_HEADER_CLIENT_MESSAGES" : "消息", + "SECTION_HEADER_CLIPBOARD" : "剪贴板", + "SECTION_HEADER_DEVICES" : "设备", + "SECTION_HEADER_DISPLAY" : "显示", + "SECTION_HEADER_FILE_TRANSFERS" : "文件传输", + "SECTION_HEADER_INPUT_METHOD" : "输入方式", + + "SECTION_HEADER_MOUSE_MODE" : "模拟鼠标模式", + + "TEXT_ANONYMOUS_USER_JOINED" : "有一名匿名用户已加入连接。", + "TEXT_ANONYMOUS_USER_LEFT" : "有一名匿名用户断开了连接。", + "TEXT_ZOOM_AUTO_FIT" : "自适应浏览器窗口大小", + "TEXT_CLIENT_STATUS_IDLE" : "空闲。", + "TEXT_CLIENT_STATUS_CONNECTING" : "正在连接 Guacamole...", + "TEXT_CLIENT_STATUS_DISCONNECTED" : "您的连接已断开。", + "TEXT_CLIENT_STATUS_UNSTABLE" : "到 Guacamole 服务器的网络连接似乎不太稳定。", + "TEXT_CLIENT_STATUS_WAITING" : "已连接到 Guacamole。正在等待应答...", + "TEXT_USER_JOINED" : "用户 {USERNAME} 已加入连接。", + "TEXT_USER_LEFT" : "用户 {USERNAME} 断开了连接。", + "TEXT_RECONNECT_COUNTDOWN" : "在 {REMAINING} 秒后重连...", + "TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}", + + "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json" + + }, + + "COLOR_SCHEME" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_HIDE_DETAILS" : "隐藏", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_SHOW_DETAILS" : "显示", + + "FIELD_HEADER_BACKGROUND" : "背景色", + "FIELD_HEADER_FOREGROUND" : "前景色", + + "FIELD_OPTION_CUSTOM" : "自定义...", + + "SECTION_HEADER_DETAILS" : "详情:" + + }, + + "IMPORT": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_BROWSE" : "浏览文件", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLEAR" : "@:APP.ACTION_CLEAR", + "ACTION_VIEW_FORMAT_HELP" : "查看帮助", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_IMPORT_CONNECTIONS" : "导入连接", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + "DIALOG_HEADER_SUCCESS" : "成功", + + "ERROR_AMBIGUOUS_CSV_HEADER" : "存在冲突的 CSV 列名: \"{HEADER}\" ,可能是一个连接属性或者参数", + "ERROR_AMBIGUOUS_PARENT_GROUP" : "连接组以其父连接组不能同时设置", + "ERROR_ARRAY_REQUIRED" : "上传的文件必须包含有效的连接数据", + "ERROR_DETECTED_INVALID_TYPE" : "不支持的文件类型。请确认您上传的文件是合法的 CSV,JSON 或者 YAML 文件。", + "ERROR_DUPLICATE_CONNECTION_IN_FILE" : "在导入的文件中发现了重复的连接: \"{NAME}\" 位于 \"{PATH}\"", + "ERROR_DUPLICATE_CSV_HEADER" : "重复的 CSV 列名: {HEADER}", + "ERROR_EMPTY_FILE" : "上传的文件内容为空", + "ERROR_INVALID_CSV_HEADER" : "非法的 CSV 列名: \"{HEADER}\" 不是一个可识别的属性或者参数。", + "ERROR_INVALID_MIME_TYPE" : "不支持的文件类型: \"{TYPE}\"", + "ERROR_INVALID_GROUP" : "未找到名称为: \"{GROUP}\" 的连接组", + "ERROR_INVALID_GROUP_IDENTIFIER" : "未找到能识别为: \"{IDENTIFIER}\" 的连接组", + "ERROR_NO_FILE_SUPPLIED" : "请选择一个文件", + "ERROR_PARSE_FAILURE_CSV" : "请确保您上传的是合法的 CSV 文件。解析错误: \"{ERROR}\" 。", + "ERROR_PARSE_FAILURE_JSON" : "请确保您上传的是合法的 JSON 文件。解析错误: \"{ERROR}\" 。", + "ERROR_PARSE_FAILURE_YAML" : "请确保您上传的是合法的 YAML 文件。解析错误: \"{ERROR}\" 。", + "ERROR_REJECT_UPDATE_CONNECTION" : "连接 \"{NAME}\" 已存在于 \"{PATH}\"", + "ERROR_REQUIRED_NAME" : "在提供的文件中未找到连接名称", + "ERROR_REQUIRED_PROTOCOL" : "在提供的文件中未找到协议", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FIELD_HEADER_EXISTING_CONNECTION_MODE" : "替换/更新已存在的连接", + "FIELD_HEADER_EXISTING_PERMISSION_MODE" : "重置权限", + + "HELP_CSV_DESCRIPTION" : "当导入的文件格式为 CSV 时,一行记录为一条连接数据。每列为一个配置条目。每条记录至少需要提供连接名称以及协议。", + "HELP_CSV_EXAMPLE" : "name,protocol,hostname,group,users,groups,guacd-encryption (attribute)\nconn1,vnc,conn1.web.com,ROOT,guac user 1;guac user 2,Connection 1 Users,none\nconn2,rdp,conn2.web.com,ROOT/Parent Group,guac user 1,,ssl\nconn3,ssh,conn3.web.com,ROOT/Parent Group/Child Group,guac user 2;guac user 3,,\nconn4,kubernetes,,,,,", + "HELP_CSV_MORE_DETAILS" : "CSV 列名与连接中的属性一一对应。需要导入的连接组信息可以通过 \"parentIdentifier\" 属性直接设定,或者通过 \"group\" 属性进行指定。在大多数场合下,属性之间不应当存在冲突。但如过这种情况发生时,在列名后加入 \" (attribute)\" 或者 \" (parameter)\" 即可避免混淆。用户或者用户组必须使用分号进行分隔。¹", + "HELP_FILE_TYPE_DESCRIPTION" : "目前系统支持三种文件格式:CSV,JSON 或者 YAML。文件格式之间支持的属性相同,即至少需要连接名称以及协议。当然,连接组,哪些用户或者用户组有权限使用,连接参数等属性均可以被指定。不存在的用户或者用户组会被自动创建。注意,任何已存在的连接权限并不会根据导入的数据被清除,除非您勾选了“重置权限”选框。", + "HELP_FILE_TYPE_HEADER" : "文件格式", + "HELP_JSON_DESCRIPTION" : "当导入的文件格式为 JSON 时,每条记录至少需要提供连接名称以及协议。", + "HELP_JSON_EXAMPLE" : "[\n \\{\n \"name\": \"conn1\",\n \"protocol\": \"vnc\",\n \"parameters\": \\{ \"hostname\": \"conn1.web.com\" \\},\n \"parentIdentifier\": \"ROOT\",\n \"users\": [ \"guac user 1\", \"guac user 2\" ],\n \"groups\": [ \"Connection 1 Users\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn2\",\n \"protocol\": \"rdp\",\n \"parameters\": \\{ \"hostname\": \"conn2.web.com\" \\},\n \"group\": \"ROOT/Parent Group\",\n \"users\": [ \"guac user 1\" ],\n \"attributes\": \\{ \"guacd-encryption\": \"none\" \\}\n \\},\n \\{\n \"name\": \"conn3\",\n \"protocol\": \"ssh\",\n \"parameters\": \\{ \"hostname\": \"conn3.web.com\" \\},\n \"group\": \"ROOT/Parent Group/Child Group\",\n \"users\": [ \"guac user 2\", \"guac user 3\" ]\n \\},\n \\{\n \"name\": \"conn4\",\n \"protocol\": \"kubernetes\"\n \\}\n]", + "HELP_JSON_MORE_DETAILS" : "需要被导入的连接组信息可以通过 \"parentIdentifier\" 属性直接指定,或者通过 \"group\" 属性进行指定。每条连接信息均可单独设置用户以及用户组的访问权限", + "HELP_EXISTING_CONNECTION_MODE" : "如果提供文件中的信息匹配,将完全替换/更新已存在的连接信息。如果未勾选,尝试导入已存在的连接将会导致导入时发生错误。", + "HELP_EXISTING_PERMISSION_MODE" : "根据提供文件中的设定完全重置权限。如果没有权限设定信息,所有已设定的连接权限将会被撤销。如果未勾选,已存在的权限会被保留,任何新权限设定会被自动添加。", + "HELP_SEMICOLON_FOOTNOTE" : "如果需要,您可以通过反斜杠来转义分号,比如: \"first\\\\;last\"", + "HELP_UPLOAD_DROP_TITLE" : "拖拽文件", + "HELP_UPLOAD_FILE_TYPES" : "CSV,JSON 或者 YAML", + "HELP_YAML_DESCRIPTION" : "当导入的文件格式为 YAML 时,其数据结构必须与使用 JSON 格式时保持一致。", + "HELP_YAML_EXAMPLE" : "---\n - name: conn1\n protocol: vnc\n parameters:\n hostname: conn1.web.com\n group: ROOT\n users:\n - guac user 1\n - guac user 2\n groups:\n - Connection 1 Users\n attributes:\n guacd-encryption: none\n - name: conn2\n protocol: rdp\n parameters:\n hostname: conn2.web.com\n group: ROOT/Parent Group\n users:\n - guac user 1\n attributes:\n guacd-encryption: none\n - name: conn3\n protocol: ssh\n parameters:\n hostname: conn3.web.com\n group: ROOT/Parent Group/Child Group\n users:\n - guac user 2\n - guac user 3\n - name: conn4\n protocol: kubernetes", + + "INFO_CONNECTIONS_IMPORTED_SUCCESS" : "{NUMBER} 条连接已成功导入。", + + "SECTION_HEADER_CONNECTION_IMPORT" : "导入连接", + "SECTION_HEADER_HELP_CONNECTION_IMPORT_FILE" : "导入连接文件格式", + "SECTION_HEADER_CSV" : "CSV 格式", + "SECTION_HEADER_JSON" : "JSON 格式", + "SECTION_HEADER_YAML" : "YAML 格式", + + "TABLE_HEADER_ERRORS" : "错误", + "TABLE_HEADER_GROUP" : "分组", + "TABLE_HEADER_NAME" : "名称", + "TABLE_HEADER_PROTOCOL" : "协议", + "TABLE_HEADER_ROW_NUMBER" : "行 #" + }, + + "DATA_SOURCE_DEFAULT" : { + "NAME" : "默认(XML)" + }, + + "FORM" : { + + "FIELD_PLACEHOLDER_DATE" : "YYYY-MM-DD", + "FIELD_PLACEHOLDER_TIME" : "HH:MM:SS", + + "HELP_SHOW_PASSWORD" : "点击显示密码", + "HELP_HIDE_PASSWORD" : "点击隐藏密码" + + }, + + "HOME" : { + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "INFO_NO_RECENT_CONNECTIONS" : "无最近使用过的连接。", + + "PASSWORD_CHANGED" : "密码已修改。", + + "SECTION_HEADER_ALL_CONNECTIONS" : "全部连接", + "SECTION_HEADER_RECENT_CONNECTIONS" : "最近使用过的连接" + + }, + + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "匿名用户" + + }, + + "LOGIN": { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE", + "ACTION_LOGIN" : "@:APP.ACTION_LOGIN", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_INVALID_LOGIN" : "非法登录", + + "FIELD_HEADER_USERNAME" : "用户名", + "FIELD_HEADER_PASSWORD" : "密码" + + }, + + "MANAGE_CONNECTION" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "删除连接", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "位置:", + "FIELD_HEADER_NAME" : "名称:", + "FIELD_HEADER_PROTOCOL" : "协议:", + + "FORMAT_HISTORY_START" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_CONNECTION_ACTIVE_NOW" : "活动中", + "INFO_CONNECTION_NOT_USED" : "此连接未被使用过。", + + "SECTION_HEADER_EDIT_CONNECTION" : "编辑连接", + "SECTION_HEADER_HISTORY" : "使用历史", + "SECTION_HEADER_PARAMETERS" : "参数", + + "TABLE_HEADER_HISTORY_USERNAME" : "用户名", + "TABLE_HEADER_HISTORY_START" : "开始时间", + "TABLE_HEADER_HISTORY_DURATION" : "持续时间", + "TABLE_HEADER_HISTORY_REMOTEHOST" : "远程主机", + + "TEXT_CONFIRM_DELETE" : "连接被删除后将无法恢复。确定要删除这个连接吗?", + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "MANAGE_CONNECTION_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "删除连接组", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_LOCATION" : "位置:", + "FIELD_HEADER_NAME" : "名字:", + "FIELD_HEADER_TYPE" : "类型:", + + "NAME_TYPE_BALANCING" : "负载平衡", + "NAME_TYPE_ORGANIZATIONAL" : "组织架构", + + "SECTION_HEADER_EDIT_CONNECTION_GROUP" : "编辑连接组", + + "TEXT_CONFIRM_DELETE" : "将不能恢复已被删除的连接组。确定要删除这个连接组吗?" + + }, + + "MANAGE_SHARING_PROFILE" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "删除共享设定", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_NAME" : "名字:", + "FIELD_HEADER_PRIMARY_CONNECTION" : "主连接:", + + "SECTION_HEADER_EDIT_SHARING_PROFILE" : "编辑共享设定", + "SECTION_HEADER_PARAMETERS" : "参数", + + "TEXT_CONFIRM_DELETE" : "将不能恢复已被删除的共享设定。确定要删除这个共享设定吗?" + + }, + + "MANAGE_USER" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "删除用户", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "授权管理系统:", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "修改自己的密码:", + "FIELD_HEADER_CREATE_NEW_USERS" : "新建用户:", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "新建用户组:", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "新建连接:", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "新建连接组:", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "新建共享设定:", + "FIELD_HEADER_PASSWORD" : "@:APP.FIELD_HEADER_PASSWORD", + "FIELD_HEADER_PASSWORD_AGAIN" : "@:APP.FIELD_HEADER_PASSWORD_AGAIN", + "FIELD_HEADER_USER_DISABLED" : "已禁用登录:", + "FIELD_HEADER_USERNAME" : "用户名:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "该用户当前不属于任何组。 展开此部分以添加组。", + + "INFO_READ_ONLY" : "对不起,不能编辑此用户的账户。", + "INFO_NO_USER_GROUPS_AVAILABLE" : "没用可用的用户组.", + + "SECTION_HEADER_ALL_CONNECTIONS" : "全部连接", + "SECTION_HEADER_CONNECTIONS" : "连接", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "当前连接", + "SECTION_HEADER_EDIT_USER" : "编辑用户", + "SECTION_HEADER_PERMISSIONS" : "使用权限", + "SECTION_HEADER_USER_GROUPS" : "用户组", + + "TEXT_CONFIRM_DELETE" : "将不能恢复已被删除的用户。确定要删除这个用户吗?" + + }, + + "MANAGE_USER_GROUP" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_CLONE" : "@:APP.ACTION_CLONE", + "ACTION_DELETE" : "@:APP.ACTION_DELETE", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + + "DIALOG_HEADER_CONFIRM_DELETE" : "删除用户组", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_HEADER_ADMINISTER_SYSTEM" : "@:MANAGE_USER.FIELD_HEADER_ADMINISTER_SYSTEM", + "FIELD_HEADER_CHANGE_OWN_PASSWORD" : "@:MANAGE_USER.FIELD_HEADER_CHANGE_OWN_PASSWORD", + "FIELD_HEADER_CREATE_NEW_USERS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS", + "FIELD_HEADER_CREATE_NEW_USER_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS", + "FIELD_HEADER_CREATE_NEW_CONNECTIONS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS", + "FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTION_GROUPS", + "FIELD_HEADER_CREATE_NEW_SHARING_PROFILES" : "@:MANAGE_USER.FIELD_HEADER_CREATE_NEW_SHARING_PROFILES", + "FIELD_HEADER_USER_GROUP_DISABLED" : "禁用:", + "FIELD_HEADER_USER_GROUP_NAME" : "用户组名称:", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_NO_USER_GROUPS" : "该组当前不属于任何组。展开此部分以添加组。", + "HELP_NO_MEMBER_USER_GROUPS" : "该组当前不包含任何组。展开此部分以添加组。", + "HELP_NO_MEMBER_USERS" : "该组当前不包含任何用户。展开此部分以添加用户。", + + "INFO_READ_ONLY" : "抱歉,无法编辑此用户组。", + "INFO_NO_USER_GROUPS_AVAILABLE" : "@:MANAGE_USER.INFO_NO_USER_GROUPS_AVAILABLE", + "INFO_NO_USERS_AVAILABLE" : "没有可用的用户。", + + "SECTION_HEADER_ALL_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_ALL_CONNECTIONS", + "SECTION_HEADER_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CONNECTIONS", + "SECTION_HEADER_CURRENT_CONNECTIONS" : "@:MANAGE_USER.SECTION_HEADER_CURRENT_CONNECTIONS", + "SECTION_HEADER_EDIT_USER_GROUP" : "编辑用户组", + "SECTION_HEADER_MEMBER_USERS" : "成员用户", + "SECTION_HEADER_MEMBER_USER_GROUPS" : "成员用户组", + "SECTION_HEADER_PERMISSIONS" : "@:MANAGE_USER.SECTION_HEADER_PERMISSIONS", + "SECTION_HEADER_USER_GROUPS" : "父用户组", + + "TEXT_CONFIRM_DELETE" : "删除用户组后将无法还原。确定要删除该用户组吗?" + + }, + + "PLAYER" : { + + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_PAUSE" : "@:APP.ACTION_PAUSE", + "ACTION_PLAY" : "@:APP.ACTION_PLAY", + + "INFO_LOADING_RECORDING" : "录像已载入。请稍候...", + "INFO_SEEK_IN_PROGRESS" : "正在跳转到指定位置。请稍候..." + + }, + + "PROTOCOL_KUBERNETES" : { + + "FIELD_HEADER_BACKSPACE" : "发送退格键:", + "FIELD_HEADER_CA_CERT" : "证书颁发机构证书:", + "FIELD_HEADER_CLIENT_CERT" : "客户证书:", + "FIELD_HEADER_CLIENT_KEY" : "客户端密钥:", + "FIELD_HEADER_COLOR_SCHEME" : "配色方案:", + "FIELD_HEADER_CONTAINER" : "容器名称:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "自动建立录像目录:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "自动建立 Typescript 目录:", + "FIELD_HEADER_DISABLE_COPY" : "禁用从终端复制:", + "FIELD_HEADER_DISABLE_PASTE" : "禁用从客户端粘贴:", + "FIELD_HEADER_EXEC_COMMAND" : "命令(exec):", + "FIELD_HEADER_FONT_NAME" : "字体名:", + "FIELD_HEADER_FONT_SIZE" : "字体大小:", + "FIELD_HEADER_HOSTNAME" : "主机名:", + "FIELD_HEADER_IGNORE_CERT" : "忽略服务器证书:", + "FIELD_HEADER_NAMESPACE" : "命名空间:", + "FIELD_HEADER_POD" : "Pod 名称:", + "FIELD_HEADER_PORT" : "端口:", + "FIELD_HEADER_READ_ONLY" : "只读:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "排除鼠标:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "排除图像/数据流:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "包含按键事件:", + "FIELD_HEADER_RECORDING_NAME" : "录像名:", + "FIELD_HEADER_RECORDING_PATH" : "录像路径:", + "FIELD_HEADER_SCROLLBACK" : "最大回滚尺寸:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript 名称:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript 路径:", + "FIELD_HEADER_USE_SSL" : "使用 SSL/TLS", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "退格键(Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "删除键(Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "白底黑字", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "黑底灰字", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "黑底绿字", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "黑底白字", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "NAME" : "Kubernetes", + + "SECTION_HEADER_AUTHENTICATION" : "认证方式", + "SECTION_HEADER_BEHAVIOR" : "终端行为", + "SECTION_HEADER_CLIPBOARD" : "剪贴板", + "SECTION_HEADER_CONTAINER" : "容器", + "SECTION_HEADER_DISPLAY" : "显示", + "SECTION_HEADER_RECORDING" : "屏幕录制", + "SECTION_HEADER_TYPESCRIPT" : "Typescript(文本会话录制)", + "SECTION_HEADER_NETWORK" : "网络" + + }, + + "PROTOCOL_RDP" : { + + "FIELD_HEADER_CLIENT_NAME" : "客户端:", + "FIELD_HEADER_COLOR_DEPTH" : "色彩深度:", + "FIELD_HEADER_CONSOLE" : "管理员控制台:", + "FIELD_HEADER_CONSOLE_AUDIO" : "在控制台内支持音频:", + "FIELD_HEADER_CREATE_DRIVE_PATH" : "自动建立虚拟盘:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "自动建立录像目录:", + "FIELD_HEADER_DISABLE_AUDIO" : "禁用音频:", + "FIELD_HEADER_DISABLE_AUTH" : "禁用认证:", + "FIELD_HEADER_DISABLE_COPY" : "禁用从远程桌面复制:", + "FIELD_HEADER_DISABLE_DOWNLOAD" : "禁用文件下载:", + "FIELD_HEADER_DISABLE_PASTE" : "禁用从客户端粘贴:", + "FIELD_HEADER_DISABLE_UPLOAD" : "禁用文件上传:", + "FIELD_HEADER_DOMAIN" : "域:", + "FIELD_HEADER_DPI" : "分辨率(DPI):", + "FIELD_HEADER_DRIVE_NAME" : "驱动器名称:", + "FIELD_HEADER_DRIVE_PATH" : "虚拟盘路径:", + "FIELD_HEADER_ENABLE_AUDIO_INPUT" : "启用音频输入(话筒):", + "FIELD_HEADER_ENABLE_DESKTOP_COMPOSITION" : "启用桌面合成效果(Aero):", + "FIELD_HEADER_ENABLE_DRIVE" : "启用虚拟驱动器:", + "FIELD_HEADER_ENABLE_FONT_SMOOTHING" : "启用字体平滑(ClearType):", + "FIELD_HEADER_ENABLE_FULL_WINDOW_DRAG" : "启用全窗口拖拽:", + "FIELD_HEADER_ENABLE_MENU_ANIMATIONS" : "启用菜单动画:", + "FIELD_HEADER_DISABLE_BITMAP_CACHING" : "禁用位图缓存:", + "FIELD_HEADER_DISABLE_OFFSCREEN_CACHING" : "禁用离屏缓存:", + "FIELD_HEADER_DISABLE_GLYPH_CACHING" : "禁用字形缓存:", + "FIELD_HEADER_DISABLE_GFX" : "禁用图形管线拓展:", + "FIELD_HEADER_ENABLE_PRINTING" : "启用打印功能:", + "FIELD_HEADER_ENABLE_SFTP" : "启用SFTP:", + "FIELD_HEADER_ENABLE_THEMING" : "启用桌面主题:", + "FIELD_HEADER_ENABLE_TOUCH" : "启用多点触控:", + "FIELD_HEADER_ENABLE_WALLPAPER" : "启用桌面墙纸:", + "FIELD_HEADER_FORCE_LOSSLESS" : "强制无损压缩:", + "FIELD_HEADER_GATEWAY_DOMAIN" : "域:", + "FIELD_HEADER_GATEWAY_HOSTNAME" : "主机名:", + "FIELD_HEADER_GATEWAY_PASSWORD" : "密码:", + "FIELD_HEADER_GATEWAY_PORT" : "端口:", + "FIELD_HEADER_GATEWAY_USERNAME" : "用户名:", + "FIELD_HEADER_HEIGHT" : "高度:", + "FIELD_HEADER_HOSTNAME" : "主机名:", + "FIELD_HEADER_IGNORE_CERT" : "忽略服务器证书:", + "FIELD_HEADER_INITIAL_PROGRAM" : "初始程序:", + "FIELD_HEADER_LOAD_BALANCE_INFO" : "负载平衡信息/Cookie:", + "FIELD_HEADER_NORMALIZE_CLIPBOARD" : "换行符:", + "FIELD_HEADER_PASSWORD" : "密码:", + "FIELD_HEADER_PORT" : "端口:", + "FIELD_HEADER_PRINTER_NAME" : "重定向的打印机名称:", + "FIELD_HEADER_PRECONNECTION_BLOB" : "预连接 BLOB(VM 标识):", + "FIELD_HEADER_PRECONNECTION_ID" : "RDP 源标识:", + "FIELD_HEADER_READ_ONLY" : "只读:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "排除鼠标:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "排除图像/数据流:", + "FIELD_HEADER_RECORDING_EXCLUDE_TOUCH" : "排除触摸事件:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "包含按键事件:", + "FIELD_HEADER_RECORDING_NAME" : "录像名:", + "FIELD_HEADER_RECORDING_PATH" : "录像路径:", + "FIELD_HEADER_RESIZE_METHOD" : "缩放方法:", + "FIELD_HEADER_REMOTE_APP_ARGS" : "参数:", + "FIELD_HEADER_REMOTE_APP_DIR" : "工作目录:", + "FIELD_HEADER_REMOTE_APP" : "程序:", + "FIELD_HEADER_SECURITY" : "安全模式:", + "FIELD_HEADER_SERVER_LAYOUT" : "键盘布局:", + "FIELD_HEADER_SFTP_DIRECTORY" : "缺省文件上传目录:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "禁用文件下载:", + "FIELD_HEADER_SFTP_HOST_KEY" : "公钥(Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "主机名:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive 时间间隔:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "口令:", + "FIELD_HEADER_SFTP_PASSWORD" : "密码:", + "FIELD_HEADER_SFTP_PORT" : "端口:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "私钥:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "文件浏览器根目录:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "禁用文件上传:", + "FIELD_HEADER_SFTP_USERNAME" : "用户名:", + "FIELD_HEADER_STATIC_CHANNELS" : "静态通道名:", + "FIELD_HEADER_TIMEZONE" : "时区:", + "FIELD_HEADER_USERNAME" : "用户名:", + "FIELD_HEADER_WIDTH" : "宽度:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 数据包广播地址:", + "FIELD_HEADER_WOL_MAC_ADDR" : "远程主机 MAC 地址:", + "FIELD_HEADER_WOL_SEND_PACKET" : "发送 WoL 数据包:", + "FIELD_HEADER_WOL_UDP_PORT" : "WoL 数据包 UDP 端口: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "主机启动等待时间:", + + "FIELD_OPTION_NORMALIZE_CLIPBOARD_EMPTY" : "", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_PRESERVE" : "保持原样", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_UNIX" : "Linux/Mac/Unix (LF)", + "FIELD_OPTION_NORMALIZE_CLIPBOARD_WINDOWS" : "Windows (CRLF)", + + "FIELD_OPTION_COLOR_DEPTH_16" : "低彩色(16 位)", + "FIELD_OPTION_COLOR_DEPTH_24" : "真彩色(24 位)", + "FIELD_OPTION_COLOR_DEPTH_32" : "真彩色(32 位)", + "FIELD_OPTION_COLOR_DEPTH_8" : "256 色", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_RESIZE_METHOD_DISPLAY_UPDATE" : "“显示更新”虚拟通道(RDP 8.1+)", + "FIELD_OPTION_RESIZE_METHOD_EMPTY" : "", + "FIELD_OPTION_RESIZE_METHOD_RECONNECT" : "重新连接", + + "FIELD_OPTION_SECURITY_ANY" : "任意", + "FIELD_OPTION_SECURITY_EMPTY" : "", + "FIELD_OPTION_SECURITY_NLA" : "NLA(网络级别认证)", + "FIELD_OPTION_SECURITY_RDP" : "RDP 加密", + "FIELD_OPTION_SECURITY_TLS" : "TLS 加密", + "FIELD_OPTION_SECURITY_VMCONNECT" : "Hyper-V / VMConnect", + + "FIELD_OPTION_SERVER_LAYOUT_CS_CZ_QWERTZ" : "Czech (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DA_DK_QWERTY" : "Danish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_DE_CH_QWERTZ" : "Swiss German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_DE_DE_QWERTZ" : "German (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_EMPTY" : "", + "FIELD_OPTION_SERVER_LAYOUT_EN_GB_QWERTY" : "UK English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_EN_US_QWERTY" : "US English (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_ES_QWERTY" : "Spanish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_ES_LATAM_QWERTY" : "Latin American (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FAILSAFE" : "Unicode", + "FIELD_OPTION_SERVER_LAYOUT_FR_BE_AZERTY" : "Belgian French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CA_QWERTY" : "Canadian French (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_FR_CH_QWERTZ" : "Swiss French (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_FR_FR_AZERTY" : "French (Azerty)", + "FIELD_OPTION_SERVER_LAYOUT_HU_HU_QWERTZ" : "Hungarian (Qwertz)", + "FIELD_OPTION_SERVER_LAYOUT_IT_IT_QWERTY" : "Italian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_JA_JP_QWERTY" : "Japanese (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_NO_NO_QWERTY" : "Norwegian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PL_PL_QWERTY" : "Polish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_BR_QWERTY" : "Portuguese Brazilian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_PT_PT_QWERTY" : "Portuguese (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_RO_RO_QWERTY" : "Romanian (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_SV_SE_QWERTY" : "Swedish (Qwerty)", + "FIELD_OPTION_SERVER_LAYOUT_TR_TR_QWERTY" : "Turkish-Q (Qwerty)", + + "NAME" : "RDP", + + "SECTION_HEADER_AUTHENTICATION" : "认证", + "SECTION_HEADER_BASIC_PARAMETERS" : "基础设置", + "SECTION_HEADER_CLIPBOARD" : "剪贴板", + "SECTION_HEADER_DEVICE_REDIRECTION" : "设备重定向", + "SECTION_HEADER_DISPLAY" : "显示", + "SECTION_HEADER_GATEWAY" : "远程桌面网关", + "SECTION_HEADER_LOAD_BALANCING" : "负载平衡", + "SECTION_HEADER_NETWORK" : "网络", + "SECTION_HEADER_PERFORMANCE" : "性能", + "SECTION_HEADER_PRECONNECTION_PDU" : "预连接 PDU / Hyper-V", + "SECTION_HEADER_RECORDING" : "屏幕录像", + "SECTION_HEADER_REMOTEAPP" : "RemoteApp", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "网络唤醒(WoL)" + + }, + + "PROTOCOL_SSH" : { + + "FIELD_HEADER_BACKSPACE" : "退格键发送:", + "FIELD_HEADER_COLOR_SCHEME" : "配色方案:", + "FIELD_HEADER_COMMAND" : "运行命令:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "自动建立录像目录:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "自动建立 Typescript 目录:", + "FIELD_HEADER_DISABLE_COPY" : "禁用从终端复制:", + "FIELD_HEADER_DISABLE_PASTE" : "禁用从客户端粘贴:", + "FIELD_HEADER_FONT_NAME" : "字体名:", + "FIELD_HEADER_FONT_SIZE" : "字体大小:", + "FIELD_HEADER_ENABLE_SFTP" : "启用SFTP:", + "FIELD_HEADER_HOST_KEY" : "公钥(Base64):", + "FIELD_HEADER_HOSTNAME" : "主机名:", + "FIELD_HEADER_LOCALE" : "语言/地区($LANG):", + "FIELD_HEADER_USERNAME" : "用户名:", + "FIELD_HEADER_PASSWORD" : "密码:", + "FIELD_HEADER_PASSPHRASE" : "口令:", + "FIELD_HEADER_PORT" : "端口:", + "FIELD_HEADER_PRIVATE_KEY" : "私钥:", + "FIELD_HEADER_SCROLLBACK" : "最大回滚尺寸:", + "FIELD_HEADER_READ_ONLY" : "只读:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "排除鼠标:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "排除图像/数据流:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "包含按键事件:", + "FIELD_HEADER_RECORDING_NAME" : "录像名:", + "FIELD_HEADER_RECORDING_PATH" : "录像路径:", + "FIELD_HEADER_SERVER_ALIVE_INTERVAL" : "服务器 keepalive 时间间隔:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "禁用文件下载:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "文件浏览器根目录:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "禁用文件上传:", + "FIELD_HEADER_TERMINAL_TYPE" : "终端类型:", + "FIELD_HEADER_TIMEZONE" : "时区($TZ):", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript 名称:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript 路径:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 数据包广播地址:", + "FIELD_HEADER_WOL_MAC_ADDR" : "远程主机 MAC 地址:", + "FIELD_HEADER_WOL_SEND_PACKET" : "发送 WoL 数据包:", + "FIELD_HEADER_WOL_UDP_PORT" : "WoL 数据包 UDP 端口: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "主机启动等待时间:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "退格键(Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "删除键(Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "白底黑字", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "黑底灰字", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "黑底绿字", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "黑底白字", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "SSH", + + "SECTION_HEADER_AUTHENTICATION" : "认证", + "SECTION_HEADER_BEHAVIOR" : "终端行为", + "SECTION_HEADER_CLIPBOARD" : "剪贴板", + "SECTION_HEADER_DISPLAY" : "显示", + "SECTION_HEADER_NETWORK" : "网络", + "SECTION_HEADER_RECORDING" : "屏幕录像", + "SECTION_HEADER_SESSION" : "会话 / 环境", + "SECTION_HEADER_TYPESCRIPT" : "Typescript(文本会话录像)", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "网络唤醒(WoL)" + + }, + + "PROTOCOL_TELNET" : { + + "FIELD_HEADER_BACKSPACE" : "发送退格键:", + "FIELD_HEADER_COLOR_SCHEME" : "配色方案:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "自动创建记录路径:", + "FIELD_HEADER_CREATE_TYPESCRIPT_PATH" : "自动创建 Typescript 路径:", + "FIELD_HEADER_DISABLE_COPY" : "禁止从终端复制:", + "FIELD_HEADER_DISABLE_PASTE" : "禁用从客户端粘贴:", + "FIELD_HEADER_FONT_NAME" : "字体名称:", + "FIELD_HEADER_FONT_SIZE" : "字体大小:", + "FIELD_HEADER_HOSTNAME" : "主机名:", + "FIELD_HEADER_LOGIN_FAILURE_REGEX" : "登录失败的正则表达式:", + "FIELD_HEADER_LOGIN_SUCCESS_REGEX" : "登录成功的正则表达式:", + "FIELD_HEADER_USERNAME" : "用户名:", + "FIELD_HEADER_USERNAME_REGEX" : "用户名正则表达式:", + "FIELD_HEADER_PASSWORD" : "密码:", + "FIELD_HEADER_PASSWORD_REGEX" : "密码正则表达式:", + "FIELD_HEADER_PORT" : "端口:", + "FIELD_HEADER_READ_ONLY" : "只读:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "排除鼠标:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "排除图形/流:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "包含关键事件:", + "FIELD_HEADER_RECORDING_NAME" : "记录名称:", + "FIELD_HEADER_RECORDING_PATH" : "记录路径:", + "FIELD_HEADER_SCROLLBACK" : "最大回滚尺寸:", + "FIELD_HEADER_TERMINAL_TYPE" : "终端类型:", + "FIELD_HEADER_TYPESCRIPT_NAME" : "Typescript 名称:", + "FIELD_HEADER_TYPESCRIPT_PATH" : "Typescript 路径:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 数据包广播地址:", + "FIELD_HEADER_WOL_MAC_ADDR" : "远程主机 MAC 地址:", + "FIELD_HEADER_WOL_SEND_PACKET" : "发送 WoL 数据包:", + "FIELD_HEADER_WOL_UDP_PORT" : "WoL 数据包 UDP 端口:", + "FIELD_HEADER_WOL_WAIT_TIME" : "主机启动等待时间:", + + "FIELD_OPTION_BACKSPACE_EMPTY" : "", + "FIELD_OPTION_BACKSPACE_8" : "退格键(Ctrl-H)", + "FIELD_OPTION_BACKSPACE_127" : "删除键(Ctrl-?)", + + "FIELD_OPTION_COLOR_SCHEME_BLACK_WHITE" : "白底黑字", + "FIELD_OPTION_COLOR_SCHEME_EMPTY" : "", + "FIELD_OPTION_COLOR_SCHEME_GRAY_BLACK" : "黑底灰字", + "FIELD_OPTION_COLOR_SCHEME_GREEN_BLACK" : "黑底绿字", + "FIELD_OPTION_COLOR_SCHEME_WHITE_BLACK" : "黑底白字", + + "FIELD_OPTION_FONT_SIZE_8" : "8", + "FIELD_OPTION_FONT_SIZE_9" : "9", + "FIELD_OPTION_FONT_SIZE_10" : "10", + "FIELD_OPTION_FONT_SIZE_11" : "11", + "FIELD_OPTION_FONT_SIZE_12" : "12", + "FIELD_OPTION_FONT_SIZE_14" : "14", + "FIELD_OPTION_FONT_SIZE_18" : "18", + "FIELD_OPTION_FONT_SIZE_24" : "24", + "FIELD_OPTION_FONT_SIZE_30" : "30", + "FIELD_OPTION_FONT_SIZE_36" : "36", + "FIELD_OPTION_FONT_SIZE_48" : "48", + "FIELD_OPTION_FONT_SIZE_60" : "60", + "FIELD_OPTION_FONT_SIZE_72" : "72", + "FIELD_OPTION_FONT_SIZE_96" : "96", + "FIELD_OPTION_FONT_SIZE_EMPTY" : "", + + "FIELD_OPTION_TERMINAL_TYPE_ANSI" : "ansi", + "FIELD_OPTION_TERMINAL_TYPE_EMPTY" : "", + "FIELD_OPTION_TERMINAL_TYPE_LINUX" : "linux", + "FIELD_OPTION_TERMINAL_TYPE_VT100" : "vt100", + "FIELD_OPTION_TERMINAL_TYPE_VT220" : "vt220", + "FIELD_OPTION_TERMINAL_TYPE_XTERM" : "xterm", + "FIELD_OPTION_TERMINAL_TYPE_XTERM_256COLOR" : "xterm-256color", + + "NAME" : "Telnet", + + "SECTION_HEADER_AUTHENTICATION" : "认证", + "SECTION_HEADER_BEHAVIOR" : "终端行为", + "SECTION_HEADER_CLIPBOARD" : "剪贴板", + "SECTION_HEADER_DISPLAY" : "显示", + "SECTION_HEADER_RECORDING" : "屏幕录像", + "SECTION_HEADER_TYPESCRIPT" : "Typescript(文本会话录像)", + "SECTION_HEADER_NETWORK" : "网络", + "SECTION_HEADER_WOL" : "网络唤醒(WoL)" + + }, + + "PROTOCOL_VNC" : { + + "FIELD_HEADER_AUDIO_SERVERNAME" : "音频服务器名:", + "FIELD_HEADER_CLIPBOARD_ENCODING" : "编码:", + "FIELD_HEADER_COLOR_DEPTH" : "色彩深度:", + "FIELD_HEADER_CREATE_RECORDING_PATH" : "自动建立录像目录:", + "FIELD_HEADER_CURSOR" : "光标:", + "FIELD_HEADER_DEST_HOST" : "目标主机:", + "FIELD_HEADER_DEST_PORT" : "目标端口:", + "FIELD_HEADER_DISABLE_COPY" : "禁用从远程桌面复制:", + "FIELD_HEADER_DISABLE_PASTE" : "禁用从客户端粘贴:", + "FIELD_HEADER_ENABLE_AUDIO" : "启用音频:", + "FIELD_HEADER_ENABLE_SFTP" : "启用 SFTP:", + "FIELD_HEADER_FORCE_LOSSLESS" : "强制无损压缩:", + "FIELD_HEADER_HOSTNAME" : "主机名:", + "FIELD_HEADER_USERNAME" : "用户名:", + "FIELD_HEADER_PASSWORD" : "密码:", + "FIELD_HEADER_PORT" : "端口:", + "FIELD_HEADER_READ_ONLY" : "只读:", + "FIELD_HEADER_RECORDING_EXCLUDE_MOUSE" : "排除鼠标:", + "FIELD_HEADER_RECORDING_EXCLUDE_OUTPUT" : "排除图像/数据流:", + "FIELD_HEADER_RECORDING_INCLUDE_KEYS" : "包含按键事件:", + "FIELD_HEADER_RECORDING_NAME" : "录像名:", + "FIELD_HEADER_RECORDING_PATH" : "录像路径:", + "FIELD_HEADER_SFTP_DIRECTORY" : "缺省文件上传目录:", + "FIELD_HEADER_SFTP_DISABLE_DOWNLOAD" : "禁用文件下载:", + "FIELD_HEADER_SFTP_HOST_KEY" : "公钥(Base64):", + "FIELD_HEADER_SFTP_HOSTNAME" : "主机名:", + "FIELD_HEADER_SFTP_SERVER_ALIVE_INTERVAL" : "SFTP keepalive 时间间隔:", + "FIELD_HEADER_SFTP_PASSPHRASE" : "口令:", + "FIELD_HEADER_SFTP_PASSWORD" : "密码:", + "FIELD_HEADER_SFTP_PORT" : "端口:", + "FIELD_HEADER_SFTP_PRIVATE_KEY" : "私钥:", + "FIELD_HEADER_SFTP_ROOT_DIRECTORY" : "文件浏览器根目录:", + "FIELD_HEADER_SFTP_DISABLE_UPLOAD" : "禁用文件上传:", + "FIELD_HEADER_SFTP_USERNAME" : "用户名:", + "FIELD_HEADER_SWAP_RED_BLUE" : "交换红/蓝成分:", + "FIELD_HEADER_WOL_BROADCAST_ADDR" : "WoL 数据包广播地址:", + "FIELD_HEADER_WOL_MAC_ADDR" : "远程主机 MAC 地址:", + "FIELD_HEADER_WOL_SEND_PACKET" : "发送 WoL 数据包:", + "FIELD_HEADER_WOL_UDP_PORT" : "WoL 数据包 UDP 端口: ", + "FIELD_HEADER_WOL_WAIT_TIME" : "主机启动等待时间:", + + "FIELD_OPTION_COLOR_DEPTH_8" : "256 色", + "FIELD_OPTION_COLOR_DEPTH_16" : "低彩色(16 位)", + "FIELD_OPTION_COLOR_DEPTH_24" : "真彩色(24 位)", + "FIELD_OPTION_COLOR_DEPTH_32" : "真彩色(32 位)", + "FIELD_OPTION_COLOR_DEPTH_EMPTY" : "", + + "FIELD_OPTION_CURSOR_EMPTY" : "", + "FIELD_OPTION_CURSOR_LOCAL" : "本地", + "FIELD_OPTION_CURSOR_REMOTE" : "远程", + + "FIELD_OPTION_CLIPBOARD_ENCODING_CP1252" : "CP1252", + "FIELD_OPTION_CLIPBOARD_ENCODING_EMPTY" : "", + "FIELD_OPTION_CLIPBOARD_ENCODING_ISO8859_1" : "ISO 8859-1", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_8" : "UTF-8", + "FIELD_OPTION_CLIPBOARD_ENCODING_UTF_16" : "UTF-16", + + "NAME" : "VNC", + + "SECTION_HEADER_AUDIO" : "音频", + "SECTION_HEADER_AUTHENTICATION" : "认证", + "SECTION_HEADER_CLIPBOARD" : "剪贴板", + "SECTION_HEADER_DISPLAY" : "显示", + "SECTION_HEADER_NETWORK" : "网络", + "SECTION_HEADER_RECORDING" : "屏幕录像", + "SECTION_HEADER_REPEATER" : "VNC 中继", + "SECTION_HEADER_SFTP" : "SFTP", + "SECTION_HEADER_WOL" : "网络唤醒(WoL)" + + }, + + "SETTINGS" : { + + "SECTION_HEADER_SETTINGS" : "设置" + + }, + + "SETTINGS_CONNECTION_HISTORY" : { + + "ACTION_DOWNLOAD" : "@:APP.ACTION_DOWNLOAD", + "ACTION_SEARCH" : "@:APP.ACTION_SEARCH", + "ACTION_VIEW_RECORDING" : "@:APP.ACTION_VIEW_RECORDING", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FILENAME_HISTORY_CSV" : "连接历史.csv", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_CONNECTION_HISTORY" : "下表中是过往的连接历史,可以点击列头来进行排序。如需搜索特定的记录,输入一个过滤字符串并点击“搜索”。列表中将只显示符合过滤条件的记录。", + + "INFO_CONNECTION_DURATION_UNKNOWN" : "--", + "INFO_NO_HISTORY" : "无符合条件的记录", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "连接名", + "TABLE_HEADER_SESSION_DURATION" : "持续时间", + "TABLE_HEADER_SESSION_LOGS" : "日志", + "TABLE_HEADER_SESSION_REMOTEHOST" : "远程主机", + "TABLE_HEADER_SESSION_STARTDATE" : "起始时间", + "TABLE_HEADER_SESSION_USERNAME" : "用户名", + + "TEXT_HISTORY_DURATION" : "@:APP.TEXT_HISTORY_DURATION" + + }, + + "SETTINGS_CONNECTIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_IMPORT" : "@:APP.ACTION_IMPORT", + "ACTION_NEW_CONNECTION" : "新建连接", + "ACTION_NEW_CONNECTION_GROUP" : "新建连接组", + "ACTION_NEW_SHARING_PROFILE" : "新建共享设定", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "HELP_CONNECTIONS" : "点击下列连接,以管理该连接。基于您的权限,可以新建和删除连接,或修改连接的属性(如协议、主机名、端口等)。", + + "INFO_ACTIVE_USER_COUNT" : "@:APP.INFO_ACTIVE_USER_COUNT", + + "SECTION_HEADER_CONNECTIONS" : "连接" + + }, + + "SETTINGS_PREFERENCES" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_SAVE" : "@:APP.ACTION_SAVE", + "ACTION_UPDATE_PASSWORD" : "@:APP.ACTION_UPDATE_PASSWORD", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK", + "ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH", + + "FIELD_HEADER_LANGUAGE" : "界面语言:", + "FIELD_HEADER_PASSWORD" : "密码:", + "FIELD_HEADER_PASSWORD_OLD" : "当前密码:", + "FIELD_HEADER_PASSWORD_NEW" : "新密码:", + "FIELD_HEADER_PASSWORD_NEW_AGAIN" : "确认新密码:", + "FIELD_HEADER_TIMEZONE" : "时区:", + "FIELD_HEADER_USERNAME" : "用户名:", + + "HELP_DEFAULT_INPUT_METHOD" : "默认输入法决定了 Guacamole 如何接收键盘事件。当使用移动设备或使用 IME 输入时,有可能需要更改设置。本设置可在 Guacamole 菜单内被单个连接的设定覆盖。", + "HELP_DEFAULT_MOUSE_MODE" : "默认鼠标模拟方式决定了新连接内的远程鼠标如何响应屏幕触控。本设置可在 Guacamole 菜单内被单个连接的设定覆盖。", + "HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE", + "HELP_INPUT_METHOD_OSK" : "@:CLIENT.HELP_INPUT_METHOD_OSK", + "HELP_INPUT_METHOD_TEXT" : "@:CLIENT.HELP_INPUT_METHOD_TEXT", + "HELP_LOCALE" : "以下选项与用户的语言环境有关,并将影响界面各部分的显示方式。", + "HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE", + "HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE", + "HELP_UPDATE_PASSWORD" : "如需改变密码,请在下面输入您的当前密码与希望使用的新密码,并点击“更新密码” 。密码的改动会立即生效。", + + "INFO_PASSWORD_CHANGED" : "密码已更改。", + "INFO_PREFERENCE_ATTRIBUTES_CHANGED" : "用户设定已保存。", + + "NAME_INPUT_METHOD_NONE" : "@:CLIENT.NAME_INPUT_METHOD_NONE", + "NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK", + "NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT", + + "SECTION_HEADER_DEFAULT_INPUT_METHOD" : "缺省输入法", + "SECTION_HEADER_DEFAULT_MOUSE_MODE" : "缺省鼠标模拟方式", + "SECTION_HEADER_UPDATE_PASSWORD" : "更改密码" + + }, + + "SETTINGS_USERS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER" : "新用户", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USERS" : "点击下面的用户以管理该用户。基于您的权限,可以新增和删除用户,也可以更改他们的密码。", + + "SECTION_HEADER_USERS" : "用户", + + "TABLE_HEADER_FULL_NAME" : "全名", + "TABLE_HEADER_LAST_ACTIVE" : "最近活动", + "TABLE_HEADER_ORGANIZATION" : "组织", + "TABLE_HEADER_USERNAME" : "用户名" + + }, + + "SETTINGS_USER_GROUPS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_NEW_USER_GROUP" : "新建用户组", + + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_USER_GROUPS" : "单击或触摸下面的组以管理该组。 根据您的访问级别,可以添加和删除组,还可以更改其成员用户和用户组。", + + "SECTION_HEADER_USER_GROUPS" : "用户组", + + "TABLE_HEADER_USER_GROUP_NAME" : "用户组名称" + + }, + + "SETTINGS_SESSIONS" : { + + "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE", + "ACTION_CANCEL" : "@:APP.ACTION_CANCEL", + "ACTION_DELETE" : "终止会话", + + "DIALOG_HEADER_CONFIRM_DELETE" : "终止会话", + "DIALOG_HEADER_ERROR" : "@:APP.DIALOG_HEADER_ERROR", + + "FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER", + + "FORMAT_STARTDATE" : "@:APP.FORMAT_DATE_TIME_PRECISE", + + "HELP_SESSIONS" : "该页面将填充当前活动的连接。 列出的连接和终止连接的能力取决于您的访问级别。如需终止一个或多个会话,勾选目标会话并点击“终止会话”。终止会话会立即断开对应用户的连接。", + + "INFO_NO_SESSIONS" : "无活动会话", + + "SECTION_HEADER_SESSIONS" : "活动会话", + + "TABLE_HEADER_SESSION_CONNECTION_NAME" : "连接名", + "TABLE_HEADER_SESSION_REMOTEHOST" : "远程主机", + "TABLE_HEADER_SESSION_STARTDATE" : "开始时间", + "TABLE_HEADER_SESSION_USERNAME" : "用户名", + + "TEXT_CONFIRM_DELETE" : "确定要终止所选定的会话?对应的用户会被立即断开连接。" + + }, + + "USER_ATTRIBUTES" : { + + "FIELD_HEADER_GUAC_EMAIL_ADDRESS" : "电邮地址:", + "FIELD_HEADER_GUAC_FULL_NAME" : "全名:", + "FIELD_HEADER_GUAC_ORGANIZATION" : "组织:", + "FIELD_HEADER_GUAC_ORGANIZATIONAL_ROLE" : "职位:" + + }, + + "USER_MENU" : { + + "ACTION_LOGOUT" : "@:APP.ACTION_LOGOUT", + "ACTION_MANAGE_CONNECTIONS" : "@:APP.ACTION_MANAGE_CONNECTIONS", + "ACTION_MANAGE_PREFERENCES" : "@:APP.ACTION_MANAGE_PREFERENCES", + "ACTION_MANAGE_SESSIONS" : "@:APP.ACTION_MANAGE_SESSIONS", + "ACTION_MANAGE_SETTINGS" : "@:APP.ACTION_MANAGE_SETTINGS", + "ACTION_MANAGE_USERS" : "@:APP.ACTION_MANAGE_USERS", + "ACTION_MANAGE_USER_GROUPS" : "@:APP.ACTION_MANAGE_USER_GROUPS", + "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", + "ACTION_VIEW_HISTORY" : "@:APP.ACTION_VIEW_HISTORY" + + } + +} diff --git a/guacamole/src/main/frontend/src/verifyCachedVersion.js b/guacamole/src/main/frontend/src/verifyCachedVersion.js new file mode 100644 index 0000000..db9e144 --- /dev/null +++ b/guacamole/src/main/frontend/src/verifyCachedVersion.js @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Automatically reloads the current page and clears relevant browser cache if + * the build that produced index.html is different/older than the build that + * produced the JavaScript loaded by index.html. + * + * @private + * @param {Location} location + * The Location object representing the URL of the current page. + * + * @param {Storate} [sessionStorage] + * The Storage object that should optionally be used to avoid reloading the + * current page in a loop if it proves impossible to clear cache. + */ +(function verifyCachedVersion(location, sessionStorage) { + + /** + * The meta element containing the build identifier of the Guacamole build + * that produced index.html. + * + * @private + * @type {HTMLMetaElement} + */ + var buildMeta = document.head.querySelector('meta[name=build]'); + + // Verify that index.html came from the same build as this JavaScript file, + // forcing a reload if out-of-date + if (!buildMeta || buildMeta.content !== '${guacamole.build.identifier}') { + + if (sessionStorage) { + + // Bail out if we have already tried to automatically refresh the + // cache but were unsuccessful + if (sessionStorage.getItem('reloadedFor') === '${guacamole.build.identifier}') { + console.warn('The version of Guacamole cached by your ' + + 'browser does not match the version of Guacamole on the ' + + 'server. To avoid unexpected errors, please clear your ' + + 'browser cache.'); + return; + } + + sessionStorage.setItem('reloadedFor', '${guacamole.build.identifier}'); + + } + + // Force refresh of cache by issuing an HTTP request with headers that + // request revalidation of cached content + var xhr = new XMLHttpRequest(); + xhr.open('GET', '', true); + xhr.setRequestHeader('Cache-Control', 'no-cache'); + xhr.setRequestHeader('Pragma', 'no-cache'); + + xhr.onreadystatechange = function readyStateChanged() { + + // Reload current page when ready (this call to reload MAY be + // sufficient in itself to clear cache, but this is not + // guaranteed by any standard) + if (xhr.readyState === XMLHttpRequest.DONE) + location.reload(true); + + }; + + xhr.send(); + + } + +})(window.location, window.sessionStorage); diff --git a/guacamole/src/main/frontend/webpack.config.js b/guacamole/src/main/frontend/webpack.config.js new file mode 100644 index 0000000..9a96799 --- /dev/null +++ b/guacamole/src/main/frontend/webpack.config.js @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const AngularTemplateCacheWebpackPlugin = require('angular-templatecache-webpack-plugin'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const ClosureWebpackPlugin = require('closure-webpack-plugin'); +const CopyPlugin = require('copy-webpack-plugin'); +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); +const DependencyListPlugin = require('./plugins/dependency-list-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const webpack = require('webpack'); + +module.exports = { + + bail: true, + mode: 'production', + stats: 'minimal', + + output: { + path: __dirname + '/dist', + filename: 'guacamole.[contenthash].js', + }, + + // Generate source maps + devtool: 'source-map', + + // Entry point for the Guacamole webapp is the "index" AngularJS module + entry: './src/app/index/indexModule.js', + + module: { + rules: [ + + // NOTE: This is required in order to parse ES2020 language features, + // like the optional chaining and nullish coalescing operators. It + // specifically needs to operate on the node-modules directory since + // Webpack 4 cannot handle such language features. + { + test: /\.js$/i, + use: { + loader: 'babel-loader', + options: { + presets: [ + ['@babel/preset-env'] + ] + } + } + }, + + // Automatically extract imported CSS for later reference within separate CSS file + { + test: /\.css$/i, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + import: false, + url: false + } + } + ] + }, + + /* + * Necessary to be able to use angular 1 with webpack as explained in https://github.com/webpack/webpack/issues/2049 + */ + { + test: require.resolve('angular'), + loader: 'exports-loader', + options: { + type: 'commonjs', + exports: 'single window.angular' + } + } + + ] + }, + optimization: { + minimizer: [ + + // Minify using Google Closure Compiler + new ClosureWebpackPlugin({ mode: 'STANDARD' }, { + languageIn: 'ECMASCRIPT_2020', + languageOut: 'ECMASCRIPT5', + compilationLevel: 'SIMPLE' + }), + + new CssMinimizerPlugin() + + ], + splitChunks: { + cacheGroups: { + + // Bundle CSS as one file + styles: { + name: 'styles', + test: /\.css$/, + chunks: 'all', + enforce: true + } + + } + } + }, + plugins: [ + + new AngularTemplateCacheWebpackPlugin({ + module: 'templates-main', + root: 'app/', + source: 'src/app/**/*.html', + standalone: true + }), + + // Automatically clean out dist/ directory + new CleanWebpackPlugin(), + + // Copy static files to dist/ + new CopyPlugin([ + { from: 'app/**/*' }, + { from: 'fonts/**/*' }, + { from: 'images/**/*' }, + { from: 'layouts/**/*' }, + { from: 'manifest.json' }, + { from: 'translations/**/*' }, + { from: 'verifyCachedVersion.js' } + ], { + context: 'src/' + }), + + // Copy core libraries for global inclusion + new CopyPlugin([ + { from: 'angular/angular.min.js' }, + { from: 'blob-polyfill/Blob.js' }, + { from: 'datalist-polyfill/datalist-polyfill.min.js' }, + { from: 'jquery/dist/jquery.min.js' }, + { from: 'lodash/lodash.min.js' } + ], { + context: 'node_modules/' + }), + + // Generate index.html from template + new HtmlWebpackPlugin({ + inject: false, + template: 'src/index.html' + }), + + // Extract CSS from Webpack bundle as separate file + new MiniCssExtractPlugin({ + filename: 'guacamole.[contenthash].css', + chunkFilename: '[id].guacamole.[contenthash].css' + }), + + // List all bundled node modules for sake of automatic LICENSE file + // generation / sanity checks + new DependencyListPlugin(), + + // Automatically require used modules + new webpack.ProvidePlugin({ + jstz: 'jstz', + Pickr: '@simonwep/pickr', + saveAs: 'file-saver' + }) + + ], + resolve: { + + // Include Node modules and base source tree within search path for + // import/resolve + modules: [ + 'src', + 'node_modules' + ] + + } + +}; + diff --git a/guacamole/src/main/java/org/apache/guacamole/CacheRevalidationFilter.java b/guacamole/src/main/java/org/apache/guacamole/CacheRevalidationFilter.java new file mode 100644 index 0000000..38dd403 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/CacheRevalidationFilter.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +/** + * Filter that sets the HTTP response headers necessary to request that the + * browser always revalidate its cached copy of the response before using that + * cached copy. + */ +public class CacheRevalidationFilter implements Filter { + + @Override + public void init(FilterConfig config) throws ServletException { + // No configuration + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.addHeader("Cache-Control", "no-cache"); + httpResponse.addHeader("Pragma", "no-cache"); + + chain.doFilter(request, response); + + } + + @Override + public void destroy() { + // Nothing to clean up + } + + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/EnvironmentModule.java b/guacamole/src/main/java/org/apache/guacamole/EnvironmentModule.java new file mode 100644 index 0000000..e79ba82 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/EnvironmentModule.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.environment.Environment; + +/** + * Guice module which binds the base Guacamole server environment. + */ +public class EnvironmentModule extends AbstractModule { + + /** + * The Guacamole server environment. + */ + private final Environment environment; + + /** + * Creates a new EnvironmentModule which will bind the given environment + * for future injection. + * + * @param environment + * The environment to bind. + */ + public EnvironmentModule(Environment environment) { + this.environment = environment; + } + + @Override + protected void configure() { + + // Bind environment + bind(Environment.class).toInstance(environment); + + } + +} + diff --git a/guacamole/src/main/java/org/apache/guacamole/GuacamoleApplication.java b/guacamole/src/main/java/org/apache/guacamole/GuacamoleApplication.java new file mode 100644 index 0000000..7f3e460 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/GuacamoleApplication.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import com.google.inject.Injector; +import javax.inject.Inject; +import javax.servlet.ServletContext; +import javax.ws.rs.ApplicationPath; +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.jvnet.hk2.guice.bridge.api.GuiceBridge; +import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge; +import org.slf4j.bridge.SLF4JBridgeHandler; + +/** + * JAX-RS Application which serves as the root definition of the Guacamole + * REST API. The HK2 dependency injection used by Jersey is automatically + * bridged to Guice, allowing injections managed by Guice to be injected within + * classes served by Jersey. + */ +@ApplicationPath("/*") +public class GuacamoleApplication extends ResourceConfig { + + /** + * Creates a new GuacamoleApplication which defines the Guacamole REST API, + * automatically configuring Jersey's HK2 dependency injection to + * additionally pull services from a Guice injector. + * + * @param servletContext + * The ServletContext which has already associated with a Guice + * injector via a GuacamoleServletContextListener. + * + * @param serviceLocator + * The HK2 service locator (injector). + */ + @Inject + public GuacamoleApplication(ServletContext servletContext, + ServiceLocator serviceLocator) { + + // Bridge Jersey logging (java.util.logging) to SLF4J + SLF4JBridgeHandler.removeHandlersForRootLogger(); + SLF4JBridgeHandler.install(); + + // Bridge HK2 service locator with Guice injector + Injector guiceInjector = (Injector) servletContext.getAttribute(GuacamoleServletContextListener.GUICE_INJECTOR); + GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); + GuiceIntoHK2Bridge bridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); + bridge.bridgeGuiceInjector(guiceInjector); + + // Automatically scan for REST resources + packages("org.apache.guacamole.rest"); + + // Use Jackson for JSON + register(JacksonFeature.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/GuacamoleServletContextListener.java b/guacamole/src/main/java/org/apache/guacamole/GuacamoleServletContextListener.java new file mode 100644 index 0000000..d8e3f3d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/GuacamoleServletContextListener.java @@ -0,0 +1,334 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import com.google.common.collect.Lists; +import org.apache.guacamole.tunnel.TunnelModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Stage; +import com.google.inject.servlet.GuiceServletContextListener; +import java.io.File; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import javax.inject.Inject; +import javax.servlet.ServletContextEvent; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.extension.ExtensionModule; +import org.apache.guacamole.log.LogModule; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.event.ApplicationShutdownEvent; +import org.apache.guacamole.net.event.ApplicationStartedEvent; +import org.apache.guacamole.properties.BooleanGuacamoleProperty; +import org.apache.guacamole.properties.FileGuacamoleProperties; +import org.apache.guacamole.rest.RESTServiceModule; +import org.apache.guacamole.rest.auth.HashTokenSessionMap; +import org.apache.guacamole.rest.auth.TokenSessionMap; +import org.apache.guacamole.rest.event.ListenerService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A ServletContextListener to listen for initialization of the servlet context + * in order to set up dependency injection. + * + * NOTE: Guacamole's REST API uses Jersey 2.x which does not natively support + * dependency injection using Guice. It DOES support dependency injection using + * HK2, which supports bi-directional bridging with Guice. + * + * The overall process is thus: + * + * 1. Application initialization proceeds using GuacamoleServletContextListener, + * a subclass of GuiceServletContextListener, with all HTTP requests being + * routed through GuiceFilter which serves as the absolute root. + * + * 2. GuacamoleServletContextListener prepares the Guice injector, storing the + * injector within the ServletContext such that it can later be bridged with + * HK2. + * + * 3. Several of the modules used to prepare the Guice injector are + * ServletModule subclasses, which define HTTP request paths that GuiceFilter + * should route to specific servlets. One of these paths is "/api/*" (the + * root of the REST API) which is routed to Jersey's ServletContainer servlet + * (the root of Jersey's JAX-RS implementation). + * + * 4. Configuration information passed to Jersey's ServletContainer tells Jersey + * to use the GuacamoleApplication class (a subclass of ResourceConfig) to + * define the rest of the resources and any other configuration. + * + * 5. When Jersey creates its instance of GuacamoleApplication, the + * initialization process of GuacamoleApplication pulls the Guice injector + * from the ServletContext, completes the HK2 bridging, and configures Jersey + * to automatically locate and inject all REST services. + */ +public class GuacamoleServletContextListener extends GuiceServletContextListener { + + /** + * The name of the ServletContext attribute which will contain a reference + * to the Guice injector once the contextInitialized() event has been + * handled. + */ + public static final String GUICE_INJECTOR = "GUAC_GUICE_INJECTOR"; + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(GuacamoleServletContextListener.class); + + /** + * A property that determines whether environment variables are evaluated + * to supply properties not specified in guacamole.properties. + */ + private static final BooleanGuacamoleProperty ENABLE_ENVIRONMENT_PROPERTIES = + new BooleanGuacamoleProperty() { + @Override + public String getName() { + return "enable-environment-properties"; + } + }; + + /** + * A property that determines whether environment variables of the form + * "*_FILE" are evaluated to supply properties not specified in + * guacamole.properties nor in environment variables. + */ + private static final BooleanGuacamoleProperty ENABLE_FILE_ENVIRONMENT_PROPERTIES = + new BooleanGuacamoleProperty() { + @Override + public String getName() { + return "enable-file-environment-properties"; + } + }; + + /** + * The Guacamole server environment. + */ + private Environment environment; + + /** + * Singleton instance of a TokenSessionMap. + */ + private TokenSessionMap sessionMap; + + /** + * List of all authentication providers from all loaded extensions. + */ + @Inject + private List authProviders; + + /** + * All temporary files that should be deleted upon application shutdown, in + * reverse order of desired deletion. This will typically simply be the + * order that each file was created. + */ + @Inject + private List temporaryFiles; + + /** + * Service for dispatching events to registered listeners. + */ + @Inject + private ListenerService listenerService; + + /** + * Internal reference to the Guice injector that was lazily created when + * getInjector() was first invoked. + */ + private final AtomicReference guiceInjector = new AtomicReference<>(); + + @Override + public void contextInitialized(ServletContextEvent servletContextEvent) { + + environment = LocalEnvironment.getInstance(); + + // Read configuration information from GUACAMOLE_HOME/guacamole.properties + try { + File guacProperties = new File(environment.getGuacamoleHome(), "guacamole.properties"); + environment.addGuacamoleProperties(new FileGuacamoleProperties(guacProperties)); + logger.info("Read configuration parameters from \"{}\".", guacProperties); + } + catch (GuacamoleException e) { + logger.error("Unable to read guacamole.properties: {}", e.getMessage()); + logger.debug("Error reading guacamole.properties.", e); + } + + // For any values not defined in GUACAMOLE_HOME/guacamole.properties, + // read from system environment if "enable-environment-properties" is + // set to "true" + try { + if (environment.getProperty(ENABLE_ENVIRONMENT_PROPERTIES, false)) { + environment.addGuacamoleProperties(new SystemEnvironmentGuacamoleProperties()); + logger.info("Additional configuration parameters may be read " + + "from environment variables."); + } + } + catch (GuacamoleException e) { + logger.error("Unable to configure support for environment properties: {}", e.getMessage()); + logger.debug("Error reading \"{}\" property from guacamole.properties.", ENABLE_ENVIRONMENT_PROPERTIES.getName(), e); + } + + // For any values not defined in GUACAMOLE_HOME/guacamole.properties + // nor in the system environment, read from files pointed to by + // corresponding "*_FILE" variables in the system environment if + // "enable-file-environment-properties" is set to "true" + try { + if (environment.getProperty(ENABLE_FILE_ENVIRONMENT_PROPERTIES, false)) { + environment.addGuacamoleProperties(new SystemFileEnvironmentGuacamoleProperties()); + logger.info("Additional configuration parameters may be read " + + "from files pointed to by \"*_FILE\" environment " + + "variables."); + } + } + catch (GuacamoleException e) { + logger.error("Unable to configure support for file environment properties: {}", e.getMessage()); + logger.debug("Error reading \"{}\" property from guacamole.properties.", ENABLE_FILE_ENVIRONMENT_PROPERTIES.getName(), e); + } + + // Now that at least the main guacamole.properties source of + // configuration information is available, initialize the session map + sessionMap = new HashTokenSessionMap(environment); + + // NOTE: The superclass implementation of contextInitialized() is + // expected to invoke getInjector(), hence the need to call AFTER + // setting up the environment and session map + super.contextInitialized(servletContextEvent); + + // Inject any annotated members of this class + Injector injector = getInjector(); + injector.injectMembers(this); + + // Store reference to injector for use by Jersey and HK2 bridge + servletContextEvent.getServletContext().setAttribute(GUICE_INJECTOR, injector); + + // Inform any listeners that application startup has completed + try { + listenerService.handleEvent(new ApplicationStartedEvent() { + // The application startup event currently has no content + }); + } + catch (GuacamoleException e) { + logger.error("An extension listening for application startup failed: {}", e.getMessage()); + logger.debug("Extension failed internally while handling the application startup event.", e); + } + + } + + @Override + protected Injector getInjector() { + return guiceInjector.updateAndGet((current) -> { + + // Use existing injector if already created + if (current != null) + return current; + + // Create new injector if necessary + Injector injector = + + // Ensure environment and logging are configured FIRST ... + Guice.createInjector(Stage.PRODUCTION, + new EnvironmentModule(environment), + new LogModule(environment) + ) + + // ... before attempting configuration of any other modules + // (logging within the constructors of other modules may + // otherwise default to including messages from the "debug" + // level, regardless of how the application log level is + // actually configured) + .createChildInjector( + new ExtensionModule(environment), + new RESTServiceModule(sessionMap), + new TunnelModule() + ); + + return injector; + + }); + } + + /** + * Deletes the given temporary file/directory, if possible. If the deletion + * operation fails, a warning is logged noting the failure. If the given + * file is a directory, it will only be deleted if empty. + * + * @param temp + * The temporary file to delete. + */ + private void deleteTemporaryFile(File temp) { + if (!temp.delete()) { + logger.warn("Temporary file/directory \"{}\" could not be " + + "deleted. The file may remain until the JVM exits, or " + + "may need to be manually deleted.", temp); + } + else + logger.debug("Deleted temporary file/directory \"{}\".", temp); + } + + @Override + public void contextDestroyed(ServletContextEvent servletContextEvent) { + try { + + // Clean up reference to Guice injector + servletContextEvent.getServletContext().removeAttribute(GUICE_INJECTOR); + + // Shutdown TokenSessionMap, invalidating all sessions (logging all + // users out) + if (sessionMap != null) + sessionMap.shutdown(); + + // Unload authentication for all extensions + if (authProviders != null) { + for (AuthenticationProvider authProvider : authProviders) + authProvider.shutdown(); + } + + // Inform any listeners that application shutdown has completed + try { + listenerService.handleEvent(new ApplicationShutdownEvent() { + // The application shutdown event currently has no content + }); + } + catch (GuacamoleException e) { + logger.error("An extension listening for application shutdown failed: {}", e.getMessage()); + logger.debug("Extension failed internally while handling the application shutdown event.", e); + } + + } + finally { + + // NOTE: This temporary file cleanup must happen AFTER firing the + // ApplicationShutdownEvent, or an extension that relies on a .jar + // file among those temporary files might fail internally when + // attempting to process the event. + + // Regardless of what may succeed/fail here, always attempt to + // clean up ALL temporary files + if (temporaryFiles != null) + Lists.reverse(temporaryFiles).stream().forEachOrdered(this::deleteTemporaryFile); + + } + + // Continue any Guice-specific cleanup + super.contextDestroyed(servletContextEvent); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/GuacamoleSession.java b/guacamole/src/main/java/org/apache/guacamole/GuacamoleSession.java new file mode 100644 index 0000000..5bf0371 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/GuacamoleSession.java @@ -0,0 +1,329 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.event.UserSessionInvalidatedEvent; +import org.apache.guacamole.rest.auth.DecoratedUserContext; +import org.apache.guacamole.rest.event.ListenerService; +import org.apache.guacamole.tunnel.UserTunnel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Contains Guacamole-specific user information which is tied to the current + * session, such as the UserContext and current clipboard state. + */ +public class GuacamoleSession { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(GuacamoleSession.class); + + /** + * The user associated with this session. + */ + private AuthenticatedUser authenticatedUser; + + /** + * All UserContexts associated with this session. Each + * AuthenticationProvider may provide its own UserContext. + */ + private List userContexts; + + /** + * All currently-active tunnels, indexed by tunnel UUID. + */ + private final Map tunnels = new ConcurrentHashMap<>(); + + /** + * Service for dispatching events to registered event listeners. + */ + private final ListenerService listenerService; + + /** + * The last time this session was accessed. + */ + private long lastAccessedTime; + + /** + * Creates a new Guacamole session associated with the given + * AuthenticatedUser and UserContexts. + * + * @param listenerService + * The service to use to notify registered event listeners when this + * session is invalidated. + * + * @param authenticatedUser + * The authenticated user to associate this session with. + * + * @param userContexts + * The List of UserContexts to associate with this session. + * + * @throws GuacamoleException + * If an error prevents the session from being created. + */ + public GuacamoleSession(ListenerService listenerService, + AuthenticatedUser authenticatedUser, + List userContexts) + throws GuacamoleException { + this.lastAccessedTime = System.currentTimeMillis(); + this.listenerService = listenerService; + this.authenticatedUser = authenticatedUser; + this.userContexts = userContexts; + } + + /** + * Returns the authenticated user associated with this session. Invoking + * this function automatically updates this session's last access time. + * + * @return + * The authenticated user associated with this session. + */ + public AuthenticatedUser getAuthenticatedUser() { + this.access(); + return authenticatedUser; + } + + /** + * Replaces the authenticated user associated with this session with the + * given authenticated user. Invoking this function automatically updates + * this session's last access time. + * + * @param authenticatedUser + * The authenticated user to associated with this session. + */ + public void setAuthenticatedUser(AuthenticatedUser authenticatedUser) { + this.access(); + this.authenticatedUser = authenticatedUser; + } + + /** + * Returns a list of all UserContexts associated with this session. Each + * AuthenticationProvider currently loaded by Guacamole may provide its own + * UserContext for any successfully-authenticated user. Invoking this + * function automatically updates this session's last access time. + * + * @return + * An unmodifiable list of all UserContexts associated with this + * session. + */ + public List getUserContexts() { + this.access(); + return Collections.unmodifiableList(userContexts); + } + + /** + * Returns true if all user contexts associated with this session are + * valid, or false if any user context is not valid. If a session is not + * valid, it may no longer be used, and invalidate() should be invoked. + * Invoking this function does not affect the last access time of this + * session. + * + * @return + * true if all user contexts associated with this session are + * valid, or false if any user context is not valid. + */ + public boolean isValid() { + + // Immediately return false if any user context is not valid + return !userContexts.stream().anyMatch( + userContext -> !userContext.isValid()); + } + + /** + * Returns the UserContext associated with this session that originated + * from the AuthenticationProvider with the given identifier. If no such + * UserContext exists, an exception is thrown. Invoking this function + * automatically updates this session's last access time. + * + * @param authProviderIdentifier + * The unique identifier of the AuthenticationProvider that created the + * UserContext being retrieved. + * + * @return + * The UserContext that was created by the AuthenticationProvider + * having the given identifier. + * + * @throws GuacamoleException + * If no such UserContext exists. + */ + public DecoratedUserContext getUserContext(String authProviderIdentifier) + throws GuacamoleException { + + // Locate and return the UserContext associated with the + // AuthenticationProvider having the given identifier, if any + for (DecoratedUserContext userContext : getUserContexts()) { + + // Get AuthenticationProvider associated with current UserContext + AuthenticationProvider authProvider = userContext.getAuthenticationProvider(); + + // If AuthenticationProvider identifier matches, done + if (authProvider.getIdentifier().equals(authProviderIdentifier)) + return userContext; + + } + + throw new GuacamoleResourceNotFoundException("Session not associated " + + "with authentication provider \"" + authProviderIdentifier + "\"."); + + + } + + /** + * Replaces all UserContexts associated with this session with the given + * List of UserContexts. Invoking this function automatically updates this + * session's last access time. + * + * @param userContexts + * The List of UserContexts to associate with this session. + */ + public void setUserContexts(List userContexts) { + this.access(); + this.userContexts = userContexts; + } + + /** + * Returns whether this session has any associated active tunnels. Invoking + * this function does not affect the last access time of this session. + * + * @return + * true if this session has any associated active tunnels, false + * otherwise. + */ + public boolean hasTunnels() { + return !tunnels.isEmpty(); + } + + /** + * Returns a map of all active tunnels associated with this session, where + * each key is the String representation of the tunnel's UUID. Changes to + * this map immediately affect the set of tunnels associated with this + * session. A tunnel need not be present here to be used by the user + * associated with this session, but tunnels not in this set will not + * be taken into account when determining whether a session is in use. + * Invoking this function automatically updates this session's last access + * time. + * + * @return + * A map of all active tunnels associated with this session. + */ + public Map getTunnels() { + this.access(); + return tunnels; + } + + /** + * Associates the given tunnel with this session, such that it is taken + * into account when determining session activity. + * + * @param tunnel The tunnel to associate with this session. + */ + public void addTunnel(UserTunnel tunnel) { + this.access(); + tunnels.put(tunnel.getUUID().toString(), tunnel); + } + + /** + * Disassociates the tunnel having the given UUID from this session. + * Invoking this function automatically updates this session's last access + * time. + * + * @param uuid + * The UUID of the tunnel to disassociate from this session. + * + * @return + * true if the tunnel existed and was removed, false otherwise. + */ + public boolean removeTunnel(String uuid) { + this.access(); + return tunnels.remove(uuid) != null; + } + + /** + * Updates this session, marking it as accessed. + */ + public void access() { + lastAccessedTime = System.currentTimeMillis(); + } + + /** + * Returns the time this session was last accessed, as the number of + * milliseconds since midnight January 1, 1970 GMT. Session access must + * be explicitly marked through calls to the access() function. Invoking + * this function does not affect the last access time of this session. + * + * @return The time this session was last accessed. + */ + public long getLastAccessedTime() { + return lastAccessedTime; + } + + /** + * Closes all associated tunnels and prevents any further use of this + * session. + */ + public void invalidate() { + + // Close all associated tunnels, if possible + for (GuacamoleTunnel tunnel : tunnels.values()) { + try { + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close tunnel.", e); + } + } + + // Invalidate all user contextx + for (UserContext userContext : userContexts) + userContext.invalidate(); + + // Invalidate the authenticated user object + authenticatedUser.invalidate(); + + // Advise any registered listeners that the user's session is now + // invalidated + try { + listenerService.handleEvent(new UserSessionInvalidatedEvent() { + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + }); + } + catch (GuacamoleException e) { + logger.error("An extension listening for session invalidation failed: {}", e.getMessage()); + logger.debug("Extension failed internally while handling the session invalidation event.", e); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/SystemEnvironmentGuacamoleProperties.java b/guacamole/src/main/java/org/apache/guacamole/SystemEnvironmentGuacamoleProperties.java new file mode 100644 index 0000000..7ad2fd4 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/SystemEnvironmentGuacamoleProperties.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import org.apache.guacamole.properties.GuacamoleProperties; +import org.apache.guacamole.token.TokenName; + +/** + * GuacamoleProperties implementation which reads all properties from + * environment variables. The name of the environment variable corresponding to + * any particular property is determined using + * {@link TokenName#canonicalize(java.lang.String)}. + */ +public class SystemEnvironmentGuacamoleProperties implements GuacamoleProperties { + + @Override + public String getProperty(String name) { + return System.getenv(TokenName.canonicalize(name)); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/SystemFileEnvironmentGuacamoleProperties.java b/guacamole/src/main/java/org/apache/guacamole/SystemFileEnvironmentGuacamoleProperties.java new file mode 100644 index 0000000..8b08252 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/SystemFileEnvironmentGuacamoleProperties.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole; + +import com.google.common.io.Files; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import org.apache.guacamole.properties.GuacamoleProperties; +import org.apache.guacamole.token.TokenName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * GuacamoleProperties implementation which reads all properties from files + * whose filenames are stored in environment variables. The name of the + * environment variable corresponding to the filename is determined from the + * original property using {@link TokenName#canonicalize(java.lang.String)} + * with an additional "_FILE" suffix. + */ +public class SystemFileEnvironmentGuacamoleProperties implements GuacamoleProperties { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(SystemFileEnvironmentGuacamoleProperties.class); + + @Override + public String getProperty(String name) { + + String filename = System.getenv(TokenName.canonicalize(name) + "_FILE"); + if (filename != null) { + try { + return Files.asCharSource(new File(filename), StandardCharsets.UTF_8).read(); + } + catch (IOException e) { + logger.error("Property \"{}\" could not be read from file \"{}\": {}", name, filename, e.getMessage()); + logger.debug("Error reading property value from file.", e); + } + } + + return null; + + } + +} + diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/Authorization.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/Authorization.java new file mode 100644 index 0000000..0605b80 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/Authorization.java @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.TreeMap; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * Mapping of username/password pair to configuration set. In addition to basic + * storage of the username, password, and configurations, this class also + * provides password validation functions. + */ +public class Authorization { + + /** + * All supported password encodings. + */ + public static enum Encoding { + + /** + * Plain-text password (not hashed at all). + */ + PLAIN_TEXT, + + /** + * Password hashed with MD5. + */ + MD5, + + /** + * Passwords hashed with SHA256. + */ + SHA_256 + + } + + /** + * The username being authorized. + */ + private String username; + + /** + * The password corresponding to the username being authorized, which may + * be hashed. + */ + private String password; + + /** + * The encoding used when the password was hashed. + */ + private Encoding encoding = Encoding.PLAIN_TEXT; + + /** + * Map of all authorized configurations, indexed by configuration name. + */ + private Map configs = new + TreeMap(); + + /** + * Lookup table of hex bytes characters by value. + */ + private static final char HEX_CHARS[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + /** + * Produces a String containing the bytes provided in hexadecimal notation. + * + * @param bytes The bytes to convert into hex. + * @return A String containing the hex representation of the given bytes. + */ + private static String getHexString(byte[] bytes) { + + // If null byte array given, return null + if (bytes == null) + return null; + + // Create string builder for holding the hex representation, + // pre-calculating the exact length + StringBuilder hex = new StringBuilder(2 * bytes.length); + + // Convert each byte into a pair of hex digits + for (byte b : bytes) { + hex.append(HEX_CHARS[(b & 0xF0) >> 4]) + .append(HEX_CHARS[ b & 0x0F ]); + } + + // Return the string produced + return hex.toString(); + + } + + /** + * Returns the username associated with this authorization. + * + * @return The username associated with this authorization. + */ + public String getUsername() { + return username; + } + + /** + * Sets the username associated with this authorization. + * + * @param username The username to associate with this authorization. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Returns the password associated with this authorization, which may be + * encoded or hashed. + * + * @return The password associated with this authorization. + */ + public String getPassword() { + return password; + } + + /** + * Sets the password associated with this authorization, which must be + * encoded using the encoding specified with setEncoding(). By default, + * passwords are plain text. + * + * @param password Sets the password associated with this authorization. + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * Returns the encoding used to hash the password, if any. + * + * @return The encoding used to hash the password. + */ + public Encoding getEncoding() { + return encoding; + } + + /** + * Sets the encoding which will be used to hash the password or when + * comparing a given password for validation. + * + * @param encoding The encoding to use for password hashing. + */ + public void setEncoding(Encoding encoding) { + this.encoding = encoding; + } + + /** + * Returns whether a given username/password pair is authorized based on + * the stored username and password. The password given must be plain text. + * It will be hashed as necessary to perform the validation. + * + * @param username The username to validate. + * @param password The password to validate. + * @return true if the username/password pair given is authorized, false + * otherwise. + */ + public boolean validate(String username, String password) { + + // If username matches + if (username != null && password != null + && username.equals(this.username)) { + + switch (encoding) { + + // If plain text, just compare + case PLAIN_TEXT: + + // Compare plaintext + return password.equals(this.password); + + // If hased with MD5, hash password and compare + case MD5: + + // Compare hashed password + try { + MessageDigest digest = MessageDigest.getInstance("MD5"); + String hashedPassword = getHexString(digest.digest(password.getBytes("UTF-8"))); + return hashedPassword.equals(this.password.toUpperCase()); + } + catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("Unexpected lack of UTF-8 support.", e); + } + catch (NoSuchAlgorithmException e) { + throw new UnsupportedOperationException("Unexpected lack of MD5 support.", e); + } + + case SHA_256: + + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + String hashedPassword = getHexString(digest.digest(password.getBytes("UTF-8"))); + return hashedPassword.equals(this.password.toUpperCase()); + } + catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("Unexpected lack of UTF-8 support.", e); + } + catch (NoSuchAlgorithmException e) { + throw new UnsupportedOperationException("Unexpected lack of SHA-256 support.", e); + } + } + + } // end validation check + + return false; + + } + + /** + * Returns the GuacamoleConfiguration having the given name and associated + * with the username/password pair stored within this authorization. + * + * @param name The name of the GuacamoleConfiguration to return. + * @return The GuacamoleConfiguration having the given name, or null if no + * such GuacamoleConfiguration exists. + */ + public GuacamoleConfiguration getConfiguration(String name) { + return configs.get(name); + } + + /** + * Adds the given GuacamoleConfiguration to the set of stored configurations + * under the given name. + * + * @param name The name to associate this GuacamoleConfiguration with. + * @param config The GuacamoleConfiguration to store. + */ + public void addConfiguration(String name, GuacamoleConfiguration config) { + configs.put(name, config); + } + + /** + * Returns a Map of all stored GuacamoleConfigurations associated with the + * username/password pair stored within this authorization, indexed by + * configuration name. + * + * @return A Map of all stored GuacamoleConfigurations. + */ + public Map getConfigurations() { + return configs; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/AuthorizeTagHandler.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/AuthorizeTagHandler.java new file mode 100644 index 0000000..ca3fb6b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/AuthorizeTagHandler.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import org.apache.guacamole.xml.TagHandler; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * TagHandler for the "authorize" element. + */ +public class AuthorizeTagHandler implements TagHandler { + + /** + * The Authorization corresponding to the "authorize" tag being handled + * by this tag handler. The data of this Authorization will be populated + * as the tag is parsed. + */ + private Authorization authorization = new Authorization(); + + /** + * The default GuacamoleConfiguration to use if "param" or "protocol" + * tags occur outside a "connection" tag. + */ + private GuacamoleConfiguration default_config = null; + + /** + * The UserMapping this authorization belongs to. + */ + private UserMapping parent; + + /** + * Creates a new AuthorizeTagHandler that parses an Authorization owned + * by the given UserMapping. + * + * @param parent The UserMapping that owns the Authorization this handler + * will parse. + */ + public AuthorizeTagHandler(UserMapping parent) { + this.parent = parent; + } + + @Override + public void init(Attributes attributes) throws SAXException { + + // Init username and password + authorization.setUsername(attributes.getValue("username")); + authorization.setPassword(attributes.getValue("password")); + + // Get encoding + String encoding = attributes.getValue("encoding"); + if (encoding != null) { + + // If "md5", use MD5 encoding + if (encoding.equals("md5")) + authorization.setEncoding(Authorization.Encoding.MD5); + + // If "sha256" use SHA-256 hash + else if (encoding.equals("sha256")) + authorization.setEncoding(Authorization.Encoding.SHA_256); + + // If "plain", use plain text + else if (encoding.equals("plain")) + authorization.setEncoding(Authorization.Encoding.PLAIN_TEXT); + + // Otherwise, bad encoding + else + throw new SAXException( + "Invalid encoding: '" + encoding + "'"); + + } + + parent.addAuthorization(this.asAuthorization()); + + } + + @Override + public TagHandler childElement(String localName) throws SAXException { + + // "connection" tag + if (localName.equals("connection")) + return new ConnectionTagHandler(authorization); + + // "param" tag + if (localName.equals("param")) { + + // Create default config if it doesn't exist + if (default_config == null) { + default_config = new GuacamoleConfiguration(); + authorization.addConfiguration("DEFAULT", default_config); + } + + return new ParamTagHandler(default_config); + } + + // "protocol" tag + if (localName.equals("protocol")) { + + // Create default config if it doesn't exist + if (default_config == null) { + default_config = new GuacamoleConfiguration(); + authorization.addConfiguration("DEFAULT", default_config); + } + + return new ProtocolTagHandler(default_config); + } + + return null; + + } + + @Override + public void complete(String textContent) throws SAXException { + // Do nothing + } + + /** + * Returns an Authorization backed by the data of this authorize tag + * handler. This Authorization is guaranteed to at least have the username, + * password, and encoding available. Any associated configurations will be + * added dynamically as the authorize tag is parsed. + * + * @return An Authorization backed by the data of this authorize tag + * handler. + */ + public Authorization asAuthorization() { + return authorization; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/ConnectionTagHandler.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/ConnectionTagHandler.java new file mode 100644 index 0000000..0793a9c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/ConnectionTagHandler.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import org.apache.guacamole.xml.TagHandler; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * TagHandler for the "connection" element. + */ +public class ConnectionTagHandler implements TagHandler { + + /** + * The GuacamoleConfiguration backing this tag handler. + */ + private GuacamoleConfiguration config = new GuacamoleConfiguration(); + + /** + * The name associated with the connection being parsed. + */ + private String name; + + /** + * The Authorization this connection belongs to. + */ + private Authorization parent; + + /** + * Creates a new ConnectionTagHandler that parses a Connection owned by + * the given Authorization. + * + * @param parent The Authorization that will own this Connection once + * parsed. + */ + public ConnectionTagHandler(Authorization parent) { + this.parent = parent; + } + + @Override + public void init(Attributes attributes) throws SAXException { + name = attributes.getValue("name"); + parent.addConfiguration(name, this.asGuacamoleConfiguration()); + } + + @Override + public TagHandler childElement(String localName) throws SAXException { + + if (localName.equals("param")) + return new ParamTagHandler(config); + + if (localName.equals("protocol")) + return new ProtocolTagHandler(config); + + return null; + + } + + @Override + public void complete(String textContent) throws SAXException { + // Do nothing + } + + /** + * Returns a GuacamoleConfiguration whose contents are populated from data + * within this connection element and child elements. This + * GuacamoleConfiguration will continue to be modified as the user mapping + * is parsed. + * + * @return A GuacamoleConfiguration whose contents are populated from data + * within this connection element. + */ + public GuacamoleConfiguration asGuacamoleConfiguration() { + return config; + } + + /** + * Returns the name associated with this connection. + * + * @return The name associated with this connection. + */ + public String getName() { + return name; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/FileAuthenticationProvider.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/FileAuthenticationProvider.java new file mode 100644 index 0000000..3099b3b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/FileAuthenticationProvider.java @@ -0,0 +1,180 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.simple.SimpleAuthenticationProvider; +import org.apache.guacamole.xml.DocumentHandler; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.SAXException; + +/** + * Authenticates users against a static list of username/password pairs. + * Each username/password may be associated with multiple configurations. + * This list is stored in an XML file which is reread if modified. + */ +public class FileAuthenticationProvider extends SimpleAuthenticationProvider { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(FileAuthenticationProvider.class); + + /** + * The time the user mapping file was last modified. If the file has never + * been read, and thus no modification time exists, this will be + * Long.MIN_VALUE. + */ + private long lastModified = Long.MIN_VALUE; + + /** + * The parsed UserMapping read when the user mapping file was last parsed. + */ + private UserMapping cachedUserMapping; + + /** + * Guacamole server environment. + */ + private final Environment environment = LocalEnvironment.getInstance(); + + /** + * The filename to use for the user mapping. + */ + public static final String USER_MAPPING_FILENAME = "user-mapping.xml"; + + @Override + public String getIdentifier() { + return "default"; + } + + /** + * Returns a UserMapping containing all authorization data given within + * GUACAMOLE_HOME/user-mapping.xml. If the XML file has been modified or has + * not yet been read, this function may reread the file. + * + * @return + * A UserMapping containing all authorization data within the user + * mapping XML file, or null if the file cannot be found/parsed. + */ + private UserMapping getUserMapping() { + + // Read user mapping from GUACAMOLE_HOME/user-mapping.xml + File userMappingFile = new File(environment.getGuacamoleHome(), USER_MAPPING_FILENAME); + + // Abort if user mapping does not exist + if (!userMappingFile.exists()) { + logger.debug("User mapping file \"{}\" does not exist and will not be read.", userMappingFile); + return null; + } + + // Refresh user mapping if file has changed + if (lastModified < userMappingFile.lastModified()) { + + logger.debug("Reading user mapping file: \"{}\"", userMappingFile); + + // Set up XML parser + SAXParser parser; + try { + parser = SAXParserFactory.newInstance().newSAXParser(); + } + catch (ParserConfigurationException e) { + logger.error("Unable to create XML parser for reading \"{}\": {}", USER_MAPPING_FILENAME, e.getMessage()); + logger.debug("An instance of SAXParser could not be created.", e); + return null; + } + catch (SAXException e) { + logger.error("Unable to create XML parser for reading \"{}\": {}", USER_MAPPING_FILENAME, e.getMessage()); + logger.debug("An instance of SAXParser could not be created.", e); + return null; + } + + // Parse document + try { + + // Get handler for root element + UserMappingTagHandler userMappingHandler = + new UserMappingTagHandler(); + + // Set up document handler + DocumentHandler contentHandler = new DocumentHandler( + "user-mapping", userMappingHandler); + + // Read and parse file + parser.parse(userMappingFile, contentHandler); + + // Store mod time and user mapping + lastModified = userMappingFile.lastModified(); + cachedUserMapping = userMappingHandler.asUserMapping(); + + } + + // If the file is unreadable, return no mapping + catch (IOException e) { + logger.warn("Unable to read user mapping file \"{}\": {}", userMappingFile, e.getMessage()); + logger.debug("Error reading user mapping file.", e); + return null; + } + + // If the file cannot be parsed, return no mapping + catch (SAXException e) { + logger.warn("User mapping file \"{}\" is not valid: {}", userMappingFile, e.getMessage()); + logger.debug("Error parsing user mapping file.", e); + return null; + } + + } + + // Return (possibly cached) user mapping + return cachedUserMapping; + + } + + @Override + public Map + getAuthorizedConfigurations(Credentials credentials) + throws GuacamoleException { + + // Abort authorization if no user mapping exists + UserMapping userMapping = getUserMapping(); + if (userMapping == null) + return null; + + // Validate and return info for given user and pass + Authorization auth = userMapping.getAuthorization(credentials.getUsername()); + if (auth != null && auth.validate(credentials.getUsername(), credentials.getPassword())) + return auth.getConfigurations(); + + // Unauthorized + return null; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/ParamTagHandler.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/ParamTagHandler.java new file mode 100644 index 0000000..0c894c9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/ParamTagHandler.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import org.apache.guacamole.xml.TagHandler; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * TagHandler for the "param" element. + */ +public class ParamTagHandler implements TagHandler { + + /** + * The GuacamoleConfiguration which will be populated with data from + * the tag handled by this tag handler. + */ + private GuacamoleConfiguration config; + + /** + * The name of the parameter. + */ + private String name; + + /** + * Creates a new handler for an "param" tag having the given + * attributes. + * + * @param config The GuacamoleConfiguration to update with the data parsed + * from the "protocol" tag. + */ + public ParamTagHandler(GuacamoleConfiguration config) { + this.config = config; + } + + @Override + public void init(Attributes attributes) throws SAXException { + this.name = attributes.getValue("name"); + } + + @Override + public TagHandler childElement(String localName) throws SAXException { + throw new SAXException("The 'param' tag can contain no elements."); + } + + @Override + public void complete(String textContent) throws SAXException { + config.setParameter(name, textContent); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/ProtocolTagHandler.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/ProtocolTagHandler.java new file mode 100644 index 0000000..ed58d40 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/ProtocolTagHandler.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import org.apache.guacamole.xml.TagHandler; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * TagHandler for the "protocol" element. + */ +public class ProtocolTagHandler implements TagHandler { + + /** + * The GuacamoleConfiguration which will be populated with data from + * the tag handled by this tag handler. + */ + private GuacamoleConfiguration config; + + /** + * Creates a new handler for a "protocol" tag having the given + * attributes. + * + * @param config The GuacamoleConfiguration to update with the data parsed + * from the "protocol" tag. + * @throws SAXException If the attributes given are not valid. + */ + public ProtocolTagHandler(GuacamoleConfiguration config) throws SAXException { + this.config = config; + } + + @Override + public void init(Attributes attributes) throws SAXException { + // Do nothing + } + + @Override + public TagHandler childElement(String localName) throws SAXException { + throw new SAXException("The 'protocol' tag can contain no elements."); + } + + @Override + public void complete(String textContent) throws SAXException { + config.setProtocol(textContent); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/UserMapping.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/UserMapping.java new file mode 100644 index 0000000..086eb1c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/UserMapping.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import java.util.HashMap; +import java.util.Map; + +/** + * Mapping of all usernames to corresponding authorizations. + */ +public class UserMapping { + + /** + * All authorizations, indexed by username. + */ + private Map authorizations = + new HashMap(); + + /** + * Adds the given authorization to the user mapping. + * + * @param authorization The authorization to add to the user mapping. + */ + public void addAuthorization(Authorization authorization) { + authorizations.put(authorization.getUsername(), authorization); + } + + /** + * Returns the authorization corresponding to the user having the given + * username, if any. + * + * @param username The username to find the authorization for. + * @return The authorization corresponding to the user having the given + * username, or null if no such authorization exists. + */ + public Authorization getAuthorization(String username) { + return authorizations.get(username); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/UserMappingTagHandler.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/UserMappingTagHandler.java new file mode 100644 index 0000000..804e2df --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/UserMappingTagHandler.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.auth.file; + +import org.apache.guacamole.xml.TagHandler; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * TagHandler for the "user-mapping" element. + */ +public class UserMappingTagHandler implements TagHandler { + + /** + * The UserMapping which will contain all data parsed by this tag handler. + */ + private UserMapping user_mapping = new UserMapping(); + + @Override + public void init(Attributes attributes) throws SAXException { + // Do nothing + } + + @Override + public TagHandler childElement(String localName) throws SAXException { + + // Start parsing of authorize tags, add to list of all authorizations + if (localName.equals("authorize")) + return new AuthorizeTagHandler(user_mapping); + + return null; + + } + + @Override + public void complete(String textContent) throws SAXException { + // Do nothing + } + + /** + * Returns a user mapping containing all authorizations and configurations + * parsed so far. This user mapping will be backed by the data being parsed, + * thus any additional authorizations or configurations will be available + * in the object returned by this function even after this function has + * returned, once the data corresponding to those authorizations or + * configurations has been parsed. + * + * @return A user mapping containing all authorizations and configurations + * parsed so far. + */ + public UserMapping asUserMapping() { + return user_mapping; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/auth/file/package-info.java b/guacamole/src/main/java/org/apache/guacamole/auth/file/package-info.java new file mode 100644 index 0000000..7189576 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/auth/file/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which drive the default, file-based authentication of the Guacamole + * web application. + */ +package org.apache.guacamole.auth.file; + diff --git a/guacamole/src/main/java/org/apache/guacamole/event/AffectedObject.java b/guacamole/src/main/java/org/apache/guacamole/event/AffectedObject.java new file mode 100644 index 0000000..c08b4ed --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/event/AffectedObject.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.event; + +import org.apache.guacamole.net.auth.Nameable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.guacamole.net.event.IdentifiableObjectEvent; + +/** + * Loggable representation of the object affected by an operation. + */ +public class AffectedObject implements LoggableDetail { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(AffectedObject.class); + + /** + * The event representing the requested operation. + */ + private final IdentifiableObjectEvent event; + + /** + * Creates a new AffectedObject representing the object affected by the + * operation described by the given event. + * + * @param event + * The event representing the operation. + */ + public AffectedObject(IdentifiableObjectEvent event) { + this.event = event; + } + + @Override + public String toString() { + + Object object = event.getObject(); + String identifier = event.getObjectIdentifier(); + String dataSource = event.getAuthenticationProvider().getIdentifier(); + + String objectType; + String name = null; // Not all objects have names + + // Obtain name of object (if applicable and available) + if (object instanceof Nameable) { + try { + name = ((Nameable) object).getName(); + } + catch (RuntimeException | Error e) { + logger.debug("Name of object \"{}\" could not be retrieved.", identifier, e); + } + } + + // Determine type of object + switch (event.getDirectoryType()) { + + // Active connections + case ACTIVE_CONNECTION: + objectType = "active connection"; + break; + + // Connections + case CONNECTION: + objectType = "connection"; + break; + + // Connection groups + case CONNECTION_GROUP: + objectType = "connection group"; + break; + + // Sharing profiles + case SHARING_PROFILE: + objectType = "sharing profile"; + break; + + // Users + case USER: + + if (identifier != null && identifier.equals(event.getAuthenticatedUser().getIdentifier())) + return "their own user account within \"" + dataSource + "\""; + + objectType = "user"; + break; + + // User groups + case USER_GROUP: + objectType = "user group"; + break; + + // Unknown + default: + objectType = (object != null) ? object.getClass().toString() : "an unknown object"; + + } + + // Describe at least the type of the object and its identifier, + // including the name of the object, as well, if available + if (identifier != null) { + if (name != null) + return objectType + " \"" + identifier + "\" within \"" + dataSource + "\" (currently named \"" + name + "\")"; + else + return objectType + " \"" + identifier + "\" within \"" + dataSource + "\""; + } + else + return objectType + " within \"" + dataSource + "\""; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/event/EventLoggingListener.java b/guacamole/src/main/java/org/apache/guacamole/event/EventLoggingListener.java new file mode 100644 index 0000000..16bee6a --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/event/EventLoggingListener.java @@ -0,0 +1,248 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.event; + +import javax.annotation.Nonnull; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.event.ApplicationShutdownEvent; +import org.apache.guacamole.net.event.ApplicationStartedEvent; +import org.apache.guacamole.net.event.AuthenticationFailureEvent; +import org.apache.guacamole.net.event.AuthenticationRequestReceivedEvent; +import org.apache.guacamole.net.event.AuthenticationSuccessEvent; +import org.apache.guacamole.net.event.DirectoryEvent; +import org.apache.guacamole.net.event.DirectoryFailureEvent; +import org.apache.guacamole.net.event.DirectorySuccessEvent; +import org.apache.guacamole.net.event.IdentifiableObjectEvent; +import org.apache.guacamole.net.event.UserSessionInvalidatedEvent; +import org.apache.guacamole.net.event.listener.Listener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Listener that records each event that occurs in the logs, such as changes + * made to objects via the REST API. + */ +public class EventLoggingListener implements Listener { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(EventLoggingListener.class); + + /** + * Returns whether the given event affects the password of a User object. + * + * @param event + * The event to check. + * + * @return + * true if a user's password is specifically set or modified by the + * given event, false otherwise. + */ + private boolean isPasswordAffected(IdentifiableObjectEvent event) { + + Identifiable object = event.getObject(); + if (!(object instanceof User)) + return false; + + return ((User) object).getPassword() != null; + + } + + /** + * Logs that an operation was performed on an object within a Directory + * successfully. + * + * @param event + * The event describing the operation successfully performed on the + * object. + */ + private void logSuccess(DirectorySuccessEvent event) { + DirectoryEvent.Operation op = event.getOperation(); + switch (op) { + + case GET: + logger.debug("{} successfully accessed/retrieved {}", new RequestingUser(event), new AffectedObject(event)); + break; + + case ADD: + if (isPasswordAffected(event)) + logger.info("{} successfully created {}, setting their password", new RequestingUser(event), new AffectedObject(event)); + else + logger.info("{} successfully created {}", new RequestingUser(event), new AffectedObject(event)); + break; + + case UPDATE: + if (isPasswordAffected(event)) + logger.info("{} successfully updated {}, changing their password", new RequestingUser(event), new AffectedObject(event)); + else + logger.info("{} successfully updated {}", new RequestingUser(event), new AffectedObject(event)); + break; + + case REMOVE: + logger.info("{} successfully deleted {}", new RequestingUser(event), new AffectedObject(event)); + break; + + default: + logger.warn("DirectoryEvent operation type has no corresponding log message implemented: {}", op); + logger.info("{} successfully performed an unknown action on {} {}", new RequestingUser(event), new AffectedObject(event)); + + } + } + + /** + * Logs that an operation failed to be performed on an object within a + * Directory. + * + * @param event + * The event describing the operation that failed. + */ + private void logFailure(DirectoryFailureEvent event) { + DirectoryEvent.Operation op = event.getOperation(); + switch (op) { + + case GET: + if (event.getFailure() instanceof GuacamoleResourceNotFoundException) + logger.debug("{} failed to access/retrieve {}: {}", new RequestingUser(event), new AffectedObject(event), new Failure(event)); + else + logger.info("{} failed to access/retrieve {}: {}", new RequestingUser(event), new AffectedObject(event), new Failure(event)); + break; + + case ADD: + logger.info("{} failed to create {}: {}", new RequestingUser(event), new AffectedObject(event), new Failure(event)); + break; + + case UPDATE: + logger.info("{} failed to update {}: {}", new RequestingUser(event), new AffectedObject(event), new Failure(event)); + break; + + case REMOVE: + logger.info("{} failed to delete {}: {}", new RequestingUser(event), new AffectedObject(event), new Failure(event)); + break; + + default: + logger.warn("DirectoryEvent operation type has no corresponding log message implemented: {}", op); + logger.info("{} failed to perform an unknown action on {}: {}", new RequestingUser(event), new AffectedObject(event), new Failure(event)); + + } + } + + /** + * Logs that authentication succeeded for a user. + * + * @param event + * The event describing the authentication attempt that succeeded. + */ + private void logSuccess(AuthenticationSuccessEvent event) { + if (!event.isExistingSession()) + logger.info("{} successfully authenticated from {}", + new RequestingUser(event), + new RemoteAddress(event.getCredentials())); + else + logger.debug("{} successfully re-authenticated their existing " + + "session from {}", new RequestingUser(event), + new RemoteAddress(event.getCredentials())); + } + + /** + * Logs that authentication failed for a user. + * + * @param event + * The event describing the authentication attempt that failed. + */ + private void logFailure(AuthenticationFailureEvent event) { + + AuthenticationProvider authProvider = event.getAuthenticationProvider(); + + Credentials creds = event.getCredentials(); + String username = creds.getUsername(); + + if (creds.isEmpty()) + logger.debug("Empty authentication attempt (login screen " + + "initialization) from {} failed: {}", + new RemoteAddress(creds), new Failure(event)); + else if (username == null || username.isEmpty()) + logger.debug("Anonymous authentication attempt from {} failed: {}", + new RemoteAddress(creds), new Failure(event)); + else if (event.getFailure() instanceof GuacamoleInsufficientCredentialsException) { + if (authProvider != null) + logger.debug("Authentication attempt from {} for user \"{}\" " + + "requires additional credentials to continue: {} " + + "(requested by \"{}\")", new RemoteAddress(creds), + username, new Failure(event), authProvider.getIdentifier()); + else + logger.debug("Authentication attempt from {} for user \"{}\" " + + "requires additional credentials to continue: {}", + new RemoteAddress(creds), username, new Failure(event)); + } + else { + if (authProvider != null) + logger.warn("Authentication attempt from {} for user \"{}\" " + + "failed: {} (rejected by \"{}\")", new RemoteAddress(creds), + username, new Failure(event), authProvider.getIdentifier()); + else + logger.warn("Authentication attempt from {} for user \"{}\" " + + "failed: {}", new RemoteAddress(creds), username, + new Failure(event)); + } + + } + + @Override + public void handleEvent(@Nonnull Object event) throws GuacamoleException { + + // General object creation/modification/deletion + if (event instanceof DirectorySuccessEvent) + logSuccess((DirectorySuccessEvent) event); + else if (event instanceof DirectoryFailureEvent) + logFailure((DirectoryFailureEvent) event); + + // Login / logout / session expiration + else if (event instanceof AuthenticationSuccessEvent) + logSuccess((AuthenticationSuccessEvent) event); + else if (event instanceof AuthenticationFailureEvent) + logFailure((AuthenticationFailureEvent) event); + else if (event instanceof UserSessionInvalidatedEvent) + logger.info("{} has logged out, or their session has expired or " + + "been terminated.", new RequestingUser((UserSessionInvalidatedEvent) event)); + else if (event instanceof AuthenticationRequestReceivedEvent) + logger.trace("Authentication request received from {}", + new RemoteAddress(((AuthenticationRequestReceivedEvent) event).getCredentials())); + + // Application startup/shutdown + else if (event instanceof ApplicationStartedEvent) + logger.info("The Apache Guacamole web application has started."); + else if (event instanceof ApplicationShutdownEvent) + logger.info("The Apache Guacamole web application has shut down."); + + // Unknown events + else + logger.debug("Ignoring unknown/unimplemented event type: {}", + event.getClass()); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/event/Failure.java b/guacamole/src/main/java/org/apache/guacamole/event/Failure.java new file mode 100644 index 0000000..10b3c96 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/event/Failure.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.event; + +import org.apache.guacamole.net.event.FailureEvent; + +/** + * Loggable representation of a failure that occurred. + */ +public class Failure implements LoggableDetail { + + /** + * The event representing the failure. + */ + private final FailureEvent event; + + /** + * Creates a new Failure representing the failure described by the given + * event. + * + * @param event + * The event representing the failure. + */ + public Failure(FailureEvent event) { + this.event = event; + } + + @Override + public String toString() { + + Throwable failure = event.getFailure(); + if (failure == null) + return "unknown error (no specific failure recorded)"; + + return failure.getMessage(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/event/LoggableDetail.java b/guacamole/src/main/java/org/apache/guacamole/event/LoggableDetail.java new file mode 100644 index 0000000..909412e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/event/LoggableDetail.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.event; + +/** + * Provides a {@link #toString()} implementation that returns a human-readable + * string that is intended to be logged and which describes a particular detail + * of an event. + */ +public interface LoggableDetail { + + /** + * {@inheritDoc} + *

      + * A LoggableDetail implementation of toString() is required to return a + * string that is human-readable, describes a detail of a provided event, + * and that is intended to be logged. + */ + @Override + String toString(); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/event/RemoteAddress.java b/guacamole/src/main/java/org/apache/guacamole/event/RemoteAddress.java new file mode 100644 index 0000000..324a568 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/event/RemoteAddress.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.event; + +import java.util.regex.Pattern; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Loggable representation of the remote address of a user, including any + * intervening proxies noted by "X-Forwarded-For". This representation takes + * into account the fact that "X-Forwarded-For" may come from an untrusted + * source, logging such addresses within square brackets alongside the trusted + * source IP. + */ +public class RemoteAddress implements LoggableDetail { + + /** + * Regular expression which matches any IPv4 address. + */ + private static final String IPV4_ADDRESS_REGEX = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})"; + + /** + * Regular expression which matches any IPv6 address. + */ + private static final String IPV6_ADDRESS_REGEX = "([0-9a-fA-F]*(:[0-9a-fA-F]*){0,7})"; + + /** + * Regular expression which matches any IP address, regardless of version. + */ + private static final String IP_ADDRESS_REGEX = "(" + IPV4_ADDRESS_REGEX + "|" + IPV6_ADDRESS_REGEX + ")"; + + /** + * Regular expression which matches any Port Number. + */ + private static final String PORT_NUMBER_REGEX = "(:[0-9]{1,5})?"; + + /** + * Pattern which matches valid values of the de-facto standard + * "X-Forwarded-For" header. + */ + private static final Pattern X_FORWARDED_FOR = Pattern.compile("^" + IP_ADDRESS_REGEX + PORT_NUMBER_REGEX + "(, " + IP_ADDRESS_REGEX + PORT_NUMBER_REGEX + ")*$"); + + /** + * The credentials supplied by the user when they authenticated. + */ + private final Credentials creds; + + /** + * Creates a new RemoteAddress representing the source address of the HTTP + * request that provided the given Credentials. + * + * @param creds + * The Credentials associated with the request whose source address + * should be represented by this RemoteAddress. + */ + public RemoteAddress(Credentials creds) { + this.creds = creds; + } + + @Override + public String toString() { + + String remoteAddress = creds.getRemoteAddress(); + + // Log X-Forwarded-For, if present and valid + String header = creds.getHeader("X-Forwarded-For"); + if (header != null && X_FORWARDED_FOR.matcher(header).matches()) + return "[" + header + ", " + remoteAddress + "]"; + + // If header absent or invalid, just use source IP + return remoteAddress; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/event/RequestingUser.java b/guacamole/src/main/java/org/apache/guacamole/event/RequestingUser.java new file mode 100644 index 0000000..bcc14f4 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/event/RequestingUser.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.event; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.event.UserEvent; + +/** + * Loggable representation of the user that requested an operation. + */ +public class RequestingUser implements LoggableDetail { + + /** + * The event representing the requested operation. + */ + private final UserEvent event; + + /** + * Creates a new RequestingUser that represents the user that requested the + * operation described by the given event. + * + * @param event + * The event representing the requested operation. + */ + public RequestingUser(UserEvent event) { + this.event = event; + } + + @Override + public String toString() { + + AuthenticatedUser user = event.getAuthenticatedUser(); + String identifier = user.getIdentifier(); + + if (AuthenticatedUser.ANONYMOUS_IDENTIFIER.equals(identifier)) + return "Anonymous user (authenticated by \"" + user.getAuthenticationProvider().getIdentifier() + "\")"; + + return "User \"" + identifier + "\" (authenticated by \"" + user.getAuthenticationProvider().getIdentifier() + "\")"; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java new file mode 100644 index 0000000..b89b2ad --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java @@ -0,0 +1,340 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import java.util.Set; +import java.util.UUID; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides a safe wrapper around an AuthenticationProvider subclass, such that + * authentication attempts can cleanly fail, and errors can be properly logged, + * even if the AuthenticationProvider cannot be instantiated. + */ +public class AuthenticationProviderFacade implements AuthenticationProvider { + + /** + * Logger for this class. + */ + private Logger logger = LoggerFactory.getLogger(AuthenticationProviderFacade.class); + + /** + * The underlying authentication provider, or null if the authentication + * provider could not be instantiated. + */ + private final AuthenticationProvider authProvider; + + /** + * The set of identifiers of all authentication providers whose internal + * failures should be tolerated during the authentication process. If the + * identifier of this authentication provider is within this set, errors + * during authentication will result in the authentication provider being + * ignored for that authentication attempt. By default, errors during + * authentication halt the authentication process entirely. + */ + private final Set tolerateFailures; + + /** + * The identifier to provide for the underlying authentication provider if + * the authentication provider could not be loaded. + */ + private final String facadeIdentifier = UUID.randomUUID().toString(); + + /** + * Creates a new AuthenticationProviderFacade which delegates all function + * calls to an instance of the given AuthenticationProvider subclass. If + * an instance of the given class cannot be created, creation of this + * facade will still succeed, but its use will result in errors being + * logged, and all authentication attempts will fail. + * + * @param authProviderClass + * The AuthenticationProvider subclass to instantiate. + * + * @param tolerateFailures + * The set of identifiers of all authentication providers whose + * internal failures should be tolerated during the authentication + * process. If the identifier of this authentication provider is within + * this set, errors during authentication will result in the + * authentication provider being ignored for that authentication + * attempt. By default, errors during authentication halt the + * authentication process entirely. + */ + public AuthenticationProviderFacade( + Class authProviderClass, + Set tolerateFailures) { + this.tolerateFailures = tolerateFailures; + this.authProvider = ProviderFactory.newInstance("authentication provider", + authProviderClass); + } + + @Override + public String getIdentifier() { + + // Ignore auth attempts if no auth provider could be loaded + if (authProvider == null) { + logger.warn("The authentication system could not be loaded. Please check for errors earlier in the logs."); + return facadeIdentifier; + } + + // Delegate to underlying auth provider + return authProvider.getIdentifier(); + + } + + @Override + public Object getResource() throws GuacamoleException { + + // Ignore auth attempts if no auth provider could be loaded + if (authProvider == null) { + logger.warn("The authentication system could not be loaded. Please check for errors earlier in the logs."); + return null; + } + + // Delegate to underlying auth provider + return authProvider.getResource(); + + } + + @Override + public Credentials updateCredentials(Credentials credentials) throws GuacamoleException { + + // Do nothing if underlying auth provider could not be loaded + if (authProvider == null) + return credentials; + + // Delegate to underlying auth provider + return authProvider.updateCredentials(credentials); + + } + + /** + * Returns whether this authentication provider should tolerate internal + * failures during the authentication process, allowing other + * authentication providers to continue operating as if this authentication + * provider simply is not present. + * + * @return + * true if this authentication provider should tolerate internal + * failures during the authentication process, false otherwise. + */ + private boolean isFailureTolerated() { + return tolerateFailures.contains(getIdentifier()); + } + + /** + * Logs a warning that this authentication provider is being skipped due to + * an internal error. If debug-level logging is enabled, the full details + * of the internal error are also logged. + * + * @param e + * The internal error that occurred which has resulted in this + * authentication provider being skipped. + */ + private void warnAuthProviderSkipped(Throwable e) { + + logger.warn("The \"{}\" authentication provider has been skipped due " + + "to an internal error. If this is unexpected or you are the " + + "developer of this authentication provider, you may wish to " + + "enable debug-level logging: {}", + getIdentifier(), e.getMessage()); + + logger.debug("Authentication provider skipped due to an internal failure.", e); + + } + + /** + * Logs a warning that the authentication process will be entirely aborted + * due to an internal error, advising the administrator to set the + * "skip-if-unavailable" property if error encountered is expected and + * should be tolerated. + */ + private void warnAuthAborted() { + String identifier = getIdentifier(); + logger.warn("The \"{}\" authentication provider has encountered an " + + "internal error which will halt the authentication " + + "process. If this is unexpected or you are the developer of " + + "this authentication provider, you may wish to enable " + + "debug-level logging. If this is expected and you wish to " + + "ignore such failures in the future, please set \"{}: {}\" " + + "within your guacamole.properties.", + identifier, ExtensionModule.SKIP_IF_UNAVAILABLE.getName(), + identifier); + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + // Ignore auth attempts if no auth provider could be loaded + if (authProvider == null) { + logger.warn("Authentication attempt ignored because the relevant " + + "authentication provider could not be loaded. Please " + + "check for errors earlier in the logs."); + return null; + } + + // Delegate to underlying auth provider + try { + return authProvider.authenticateUser(credentials); + } + + // Pass through client exceptions untouched, including credential + // exceptions, as these are not internal failures + catch (GuacamoleClientException e) { + throw e; + } + + // Pass through all other exceptions (aborting authentication entirely) + // only if not configured to ignore such failures + catch (GuacamoleException | RuntimeException | Error e) { + + // Skip using this authentication provider if configured to ignore + // internal failures during auth + if (isFailureTolerated()) { + warnAuthProviderSkipped(e); + return null; + } + + warnAuthAborted(); + throw e; + + } + + } + + @Override + public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // Ignore auth attempts if no auth provider could be loaded + if (authProvider == null) { + logger.warn("Reauthentication attempt ignored because the relevant " + + "authentication provider could not be loaded. Please " + + "check for errors earlier in the logs."); + return null; + } + + // Delegate to underlying auth provider + return authProvider.updateAuthenticatedUser(authenticatedUser, credentials); + + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + // Ignore auth attempts if no auth provider could be loaded + if (authProvider == null) { + logger.warn("User data retrieval attempt ignored because the " + + "relevant authentication provider could not be loaded. " + + "Please check for errors earlier in the logs."); + return null; + } + + // Delegate to underlying auth provider + try { + return authProvider.getUserContext(authenticatedUser); + } + + // Pass through client exceptions untouched, including credential + // exceptions, as these are not internal failures + catch (GuacamoleClientException e) { + throw e; + } + + // Pass through all other exceptions (aborting authentication entirely) + // only if not configured to ignore such failures + catch (GuacamoleException | RuntimeException | Error e) { + + // Skip using this authentication provider if configured to ignore + // internal failures during auth + if (isFailureTolerated()) { + warnAuthProviderSkipped(e); + return null; + } + + warnAuthAborted(); + throw e; + + } + + } + + @Override + public UserContext updateUserContext(UserContext context, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleException { + + // Ignore auth attempts if no auth provider could be loaded + if (authProvider == null) { + logger.warn("User data refresh attempt ignored because the " + + "relevant authentication provider could not be loaded. " + + "Please check for errors earlier in the logs."); + return null; + } + + // Delegate to underlying auth provider + return authProvider.updateUserContext(context, authenticatedUser, credentials); + + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // Do nothing if underlying auth provider could not be loaded + if (authProvider == null) + return context; + + // Delegate to underlying auth provider + return authProvider.decorate(context, authenticatedUser, credentials); + + } + + @Override + public UserContext redecorate(UserContext decorated, UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // Do nothing if underlying auth provider could not be loaded + if (authProvider == null) + return context; + + // Delegate to underlying auth provider + return authProvider.redecorate(decorated, context, + authenticatedUser, credentials); + + } + + @Override + public void shutdown() { + if (authProvider != null) + authProvider.shutdown(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/DirectoryClassLoader.java b/guacamole/src/main/java/org/apache/guacamole/extension/DirectoryClassLoader.java new file mode 100644 index 0000000..83ad9be --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/DirectoryClassLoader.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import java.io.File; +import java.io.FilenameFilter; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; + +/** + * A ClassLoader implementation which finds classes within .jar files within a + * given directory. + */ +public class DirectoryClassLoader extends URLClassLoader { + + /** + * Returns all .jar files within the given directory as an array of URLs. + * + * @param dir + * The directory to retrieve all .jar files from. + * + * @return + * An array of the URLs of all .jar files within the given directory. + * + * @throws GuacamoleException + * If the given file is not a directory, or the contents of the given + * directory cannot be read. + */ + private static URL[] getJarURLs(File dir) throws GuacamoleException { + + // Validate directory is indeed a directory + if (!dir.isDirectory()) + throw new GuacamoleException(dir + " is not a directory."); + + // Get list of URLs for all .jar's in the lib directory + Collection jarURLs = new ArrayList(); + File[] files = dir.listFiles(new FilenameFilter() { + + @Override + public boolean accept(File dir, String name) { + + // If it ends with .jar, accept the file + return name.endsWith(".jar"); + + } + + }); + + // Verify directory was successfully read + if (files == null) + throw new GuacamoleException("Unable to read contents of directory " + dir); + + // Add the URL for each .jar to the jar URL list + for (File file : files) { + + try { + jarURLs.add(file.toURI().toURL()); + } + catch (MalformedURLException e) { + throw new GuacamoleException(e); + } + + } + + // Set delegate classloader to new URLClassLoader which loads from the .jars found above. + URL[] urls = new URL[jarURLs.size()]; + return jarURLs.toArray(urls); + + } + + /** + * Creates a new DirectoryClassLoader configured to load .jar files from + * the given directory. + * + * @param dir + * The directory from which .jar files should be read. + * + * @throws GuacamoleException + * If the given file is not a directory, or the contents of the given + * directory cannot be read. + */ + + public DirectoryClassLoader(File dir) throws GuacamoleException { + super(getJarURLs(dir), DirectoryClassLoader.class.getClassLoader()); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java b/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java new file mode 100644 index 0000000..be67a38 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java @@ -0,0 +1,600 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; +import org.apache.guacamole.net.event.listener.Listener; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.resource.ClassPathResource; +import org.apache.guacamole.resource.Resource; + +/** + * A Guacamole extension, which may provide custom authentication, static + * files, theming/branding, etc. + */ +public class Extension { + + /** + * The Jackson parser for parsing the language JSON files. + */ + private static final ObjectMapper mapper = new ObjectMapper(); + + /** + * The name of the manifest file that describes the contents of a + * Guacamole extension. + */ + private static final String MANIFEST_NAME = "guac-manifest.json"; + + /** + * The extension .jar file. + */ + private final File file; + + /** + * The parsed manifest file of this extension, describing the location of + * resources within the extension. + */ + private final ExtensionManifest manifest; + + /** + * The classloader to use when reading resources from this extension, + * including classes and static files. + */ + private final ClassLoader classLoader; + + /** + * Map of all JavaScript resources defined within the extension, where each + * key is the path to that resource within the extension. + */ + private final Map javaScriptResources; + + /** + * Map of all CSS resources defined within the extension, where each key is + * the path to that resource within the extension. + */ + private final Map cssResources; + + /** + * Map of all HTML patch resources defined within the extension, where each + * key is the path to that resource within the extension. + */ + private final Map htmlResources; + + /** + * Map of all translation resources defined within the extension, where + * each key is the path to that resource within the extension. + */ + private final Map translationResources; + + /** + * Map of all resources defined within the extension which are not already + * associated as JavaScript, CSS, or translation resources, where each key + * is the path to that resource within the extension. + */ + private final Map staticResources; + + /** + * The collection of all AuthenticationProvider classes defined within the + * extension. + */ + private final Collection> authenticationProviderClasses; + + /** + * The collection of all Listener classes defined within the extension. + */ + private final Collection> listenerClasses; + + /** + * The resource for the small favicon for the extension. If provided, this + * will replace the default Guacamole icon. + */ + private final Resource smallIcon; + + /** + * The resource foe the large favicon for the extension. If provided, this + * will replace the default Guacamole icon. + */ + private final Resource largeIcon; + + /** + * Returns a new map of all resources corresponding to the collection of + * paths provided. Each resource will be associated with the given + * mimetype, and stored in the map using its path as the key. + * + * @param mimetype + * The mimetype to associate with each resource. + * + * @param paths + * The paths corresponding to the resources desired. + * + * @return + * A new, unmodifiable map of resources corresponding to the + * collection of paths provided, where the key of each entry in the + * map is the path for the resource stored in that entry. + */ + private Map getClassPathResources(String mimetype, Collection paths) { + + // If no paths are provided, just return an empty map + if (paths == null) + return Collections.emptyMap(); + + // Add classpath resource for each path provided + Map resources = new LinkedHashMap<>(paths.size()); + for (String path : paths) + resources.put(path, new ClassPathResource(classLoader, mimetype, path)); + + // Callers should not rely on modifying the result + return Collections.unmodifiableMap(resources); + + } + + /** + * Returns a new map of all resources corresponding to the map of resource + * paths provided. Each resource will be associated with the mimetype + * stored in the given map using its path as the key. + * + * @param resourceTypes + * A map of all paths to their corresponding mimetypes. + * + * @return + * A new, unmodifiable map of resources corresponding to the + * collection of paths provided, where the key of each entry in the + * map is the path for the resource stored in that entry. + */ + private Map getClassPathResources(Map resourceTypes) { + + // If no paths are provided, just return an empty map + if (resourceTypes == null) + return Collections.emptyMap(); + + // Add classpath resource for each path/mimetype pair provided + Map resources = new LinkedHashMap<>(resourceTypes.size()); + for (Map.Entry resource : resourceTypes.entrySet()) { + + // Get path and mimetype from entry + String path = resource.getKey(); + String mimetype = resource.getValue(); + + // Store as path/resource pair + resources.put(path, new ClassPathResource(classLoader, mimetype, path)); + + } + + // Callers should not rely on modifying the result + return Collections.unmodifiableMap(resources); + + } + + /** + * Retrieve the AuthenticationProvider subclass having the given name. If + * the class having the given name does not exist or isn't actually a + * subclass of AuthenticationProvider, an exception will be thrown. + * + * @param name + * The name of the AuthenticationProvider class to retrieve. + * + * @return + * The subclass of AuthenticationProvider having the given name. + * + * @throws GuacamoleException + * If no such class exists, or if the class with the given name is not + * a subclass of AuthenticationProvider. + */ + @SuppressWarnings("unchecked") // We check this ourselves with isAssignableFrom() + private Class getAuthenticationProviderClass(String name) + throws GuacamoleException { + + try { + + // Get authentication provider class + Class authenticationProviderClass = classLoader.loadClass(name); + + // Verify the located class is actually a subclass of AuthenticationProvider + if (!AuthenticationProvider.class.isAssignableFrom(authenticationProviderClass)) + throw new GuacamoleServerException("Authentication providers MUST extend the AuthenticationProvider class."); + + // Return located class + return (Class) authenticationProviderClass; + + } + catch (ClassNotFoundException e) { + throw new GuacamoleException("Authentication provider class not found.", e); + } + catch (LinkageError e) { + throw new GuacamoleException("Authentication provider class cannot be loaded (wrong version of API?).", e); + } + + } + + /** + * Returns a new collection of all AuthenticationProvider subclasses having + * the given names. If any class does not exist or isn't actually a + * subclass of AuthenticationProvider, an exception will be thrown, and + * no further AuthenticationProvider classes will be loaded. + * + * @param names + * The names of the AuthenticationProvider classes to retrieve. + * + * @return + * A new collection of all AuthenticationProvider subclasses having the + * given names. + * + * @throws GuacamoleException + * If any given class does not exist, or if any given class is not a + * subclass of AuthenticationProvider. + */ + private Collection> getAuthenticationProviderClasses(Collection names) + throws GuacamoleException { + + // If no classnames are provided, just return an empty list + if (names == null) + return Collections.>emptyList(); + + // Define all auth provider classes + Collection> classes = new ArrayList>(names.size()); + for (String name : names) + classes.add(getAuthenticationProviderClass(name)); + + // Callers should not rely on modifying the result + return Collections.unmodifiableCollection(classes); + + } + + /** + * Retrieve the Listener subclass having the given name. If + * the class having the given name does not exist or isn't actually a + * subclass of Listener, an exception will be thrown. + * + * @param name + * The name of the Listener class to retrieve. + * + * @return + * The subclass of Listener having the given name. + * + * @throws GuacamoleException + * If no such class exists, or if the class with the given name is not + * a subclass of Listener. + */ + @SuppressWarnings("unchecked") // We check this ourselves with isAssignableFrom() + private Class getListenerClass(String name) + throws GuacamoleException { + + try { + + // Get listener class + Class listenerClass = classLoader.loadClass(name); + + // Verify the located class is actually a subclass of Listener + if (!Listener.class.isAssignableFrom(listenerClass)) + throw new GuacamoleServerException("Listeners MUST implement a Listener subclass."); + + // Return located class + return (Class) listenerClass; + + } + catch (ClassNotFoundException e) { + throw new GuacamoleException("Listener class not found.", e); + } + catch (LinkageError e) { + throw new GuacamoleException("Listener class cannot be loaded (wrong version of API?).", e); + } + + } + + /** + * Returns a new collection of all Listener subclasses having the given names. + * If any class does not exist or isn't actually subclass of Listener, an + * exception will be thrown, an no further Listener classes will be loaded. + * + * @param names + * The names of the AuthenticationProvider classes to retrieve. + * + * @return + * A new collection of all AuthenticationProvider subclasses having the + * given names. + * + * @throws GuacamoleException + * If any given class does not exist, or if any given class is not a + * subclass of AuthenticationProvider. + */ + private Collection> getListenerClasses(Collection names) + throws GuacamoleException { + + // If no classnames are provided, just return an empty list + if (names == null) + return Collections.>emptyList(); + + // Define all auth provider classes + Collection> classes = new ArrayList>(names.size()); + for (String name : names) + classes.add(getListenerClass(name)); + + // Callers should not rely on modifying the result + return Collections.unmodifiableCollection(classes); + } + + + /** + * Loads the given file as an extension, which must be a .jar containing + * a guac-manifest.json file describing its contents. + * + * @param parent + * The classloader to use as the parent for the isolated classloader of + * this extension. + * + * @param file + * The file to load as an extension. + * + * @param temporaryFiles + * A modifiable List that should be populated with all temporary files + * created for this extension. These files should be deleted on + * application shutdown in reverse order. + * + * @throws GuacamoleException + * If the provided file is not a .jar file, does not contain the + * guac-manifest.json, or if guac-manifest.json is invalid and cannot + * be parsed. + */ + public Extension(final ClassLoader parent, final File file, + final List temporaryFiles) throws GuacamoleException { + + // Associate extension abstraction with original file + this.file = file; + + try { + + // Open extension + ZipFile extension = new ZipFile(file); + + try { + + // Retrieve extension manifest + ZipEntry manifestEntry = extension.getEntry(MANIFEST_NAME); + if (manifestEntry == null) + throw new GuacamoleServerException("Extension " + file.getName() + " is missing " + MANIFEST_NAME); + + // Parse manifest + manifest = mapper.readValue(extension.getInputStream(manifestEntry), ExtensionManifest.class); + if (manifest == null) + throw new GuacamoleServerException("Contents of " + MANIFEST_NAME + " must be a valid JSON object."); + + } + + // Always close zip file, if possible + finally { + extension.close(); + } + + // Create isolated classloader for this extension + classLoader = new ExtensionClassLoader(file, temporaryFiles, parent); + + } + + // Abort load if not a valid zip file + catch (ZipException e) { + throw new GuacamoleServerException("Extension is not a valid zip file: " + file.getName(), e); + } + + // Abort if manifest cannot be parsed (invalid JSON) + catch (JsonParseException e) { + throw new GuacamoleServerException(MANIFEST_NAME + " is not valid JSON: " + file.getName(), e); + } + + // Abort if zip file cannot be read at all due to I/O errors + catch (IOException e) { + throw new GuacamoleServerException("Unable to read extension: " + file.getName(), e); + } + + // Define static resources + cssResources = getClassPathResources("text/css", manifest.getCSSPaths()); + javaScriptResources = getClassPathResources("text/javascript", manifest.getJavaScriptPaths()); + htmlResources = getClassPathResources("text/html", manifest.getHTMLPaths()); + translationResources = getClassPathResources("application/json", manifest.getTranslationPaths()); + staticResources = getClassPathResources(manifest.getResourceTypes()); + + // Define authentication providers + authenticationProviderClasses = getAuthenticationProviderClasses(manifest.getAuthProviders()); + + // Define listeners + listenerClasses = getListenerClasses(manifest.getListeners()); + + // Get small icon resource if provided + if (manifest.getSmallIcon() != null) + smallIcon = new ClassPathResource(classLoader, "image/png", manifest.getSmallIcon()); + else + smallIcon = null; + + // Get large icon resource if provided + if (manifest.getLargeIcon() != null) + largeIcon = new ClassPathResource(classLoader, "image/png", manifest.getLargeIcon()); + else + largeIcon = null; + } + + /** + * Returns the .jar file containing this Guacamole extension. + * + * @return + * The extension .jar file. + */ + public File getFile() { + return file; + } + + /** + * Returns the version of the Guacamole web application for which this + * extension was built. + * + * @return + * The version of the Guacamole web application for which this + * extension was built. + */ + public String getGuacamoleVersion() { + return manifest.getGuacamoleVersion(); + } + + /** + * Returns the name of this extension, as declared in the extension's + * manifest. + * + * @return + * The name of this extension. + */ + public String getName() { + return manifest.getName(); + } + + /** + * Returns the namespace of this extension, as declared in the extension's + * manifest. + * + * @return + * The namespace of this extension. + */ + public String getNamespace() { + return manifest.getNamespace(); + } + + /** + * Returns a map of all declared JavaScript resources associated with this + * extension, where the key of each entry in the map is the path to that + * resource within the extension .jar. JavaScript resources are declared + * within the extension manifest. + * + * @return + * All declared JavaScript resources associated with this extension. + */ + public Map getJavaScriptResources() { + return javaScriptResources; + } + + /** + * Returns a map of all declared CSS resources associated with this + * extension, where the key of each entry in the map is the path to that + * resource within the extension .jar. CSS resources are declared within + * the extension manifest. + * + * @return + * All declared CSS resources associated with this extension. + */ + public Map getCSSResources() { + return cssResources; + } + + /** + * Returns a map of all declared HTML patch resources associated with this + * extension, where the key of each entry in the map is the path to that + * resource within the extension .jar. HTML patch resources are declared + * within the extension manifest. + * + * @return + * All declared HTML patch resources associated with this extension. + */ + public Map getHTMLResources() { + return htmlResources; + } + + /** + * Returns a map of all declared translation resources associated with this + * extension, where the key of each entry in the map is the path to that + * resource within the extension .jar. Translation resources are declared + * within the extension manifest. + * + * @return + * All declared translation resources associated with this extension. + */ + public Map getTranslationResources() { + return translationResources; + } + + /** + * Returns a map of all declared resources associated with this extension, + * where these resources are not already associated as JavaScript, CSS, or + * translation resources. The key of each entry in the map is the path to + * that resource within the extension .jar. Static resources are declared + * within the extension manifest. + * + * @return + * All declared static resources associated with this extension. + */ + public Map getStaticResources() { + return staticResources; + } + + /** + * Returns all declared authentication providers classes associated with + * this extension. Authentication providers are declared within the + * extension manifest. + * + * @return + * All declared authentication provider classes with this extension. + */ + public Collection> getAuthenticationProviderClasses() { + return authenticationProviderClasses; + } + + /** + * Returns all declared listener classes associated wit this extension. Listeners are + * declared within the extension manifest. + * + * @return + * All declared listener classes with this extension. + */ + public Collection> getListenerClasses() { + return listenerClasses; + } + + /** + * Returns the resource for the small favicon for the extension. If + * provided, this will replace the default Guacamole icon. + * + * @return + * The resource for the small favicon. + */ + public Resource getSmallIcon() { + return smallIcon; + } + + /** + * Returns the resource for the large favicon for the extension. If + * provided, this will replace the default Guacamole icon. + * + * @return + * The resource for the large favicon. + */ + public Resource getLargeIcon() { + return largeIcon; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java new file mode 100644 index 0000000..6473aa2 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java @@ -0,0 +1,291 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ClassLoader implementation which prioritizes the classes defined within a + * given extension .jar file. Unlike the standard URLClassLoader, classes + * within the parent ClassLoader are only used if they are not defined within + * the given .jar. If classes are defined in both the parent and the extension + * .jar, the versions defined within the extension .jar are used. + */ +public class ExtensionClassLoader extends URLClassLoader { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ExtensionClassLoader.class); + + /** + * The prefix that should be given to the temporary directory containing + * all library .jar files that were bundled with the extension. + */ + private static final String EXTENSION_TEMP_DIR_PREFIX = "guac-extension-lib-"; + + /** + * The prefix that should be given to any files created for temporary + * storage of a library .jar file that was bundled with the extension. + */ + private static final String EXTENSION_TEMP_LIB_PREFIX = "bundled-"; + + /** + * The ClassLoader to use if class resolution through the extension .jar + * fails. + */ + private final ClassLoader parent; + + /** + * Returns the URL that refers to the given file. If the given file refers + * to a directory, an exception is thrown. + * + * @param file + * The file to determine the URL of. + * + * @return + * A URL that refers to the given file. + * + * @throws GuacamoleException + * If the given file refers to a directory. + */ + private static URL getFileURL(File file) throws GuacamoleException { + + // Validate extension-related file is indeed a file + if (!file.isFile()) + throw new GuacamoleServerException("\"" + file + "\" is not a file."); + + try { + return file.toURI().toURL(); + } + catch (MalformedURLException e) { + throw new GuacamoleServerException(e); + } + + } + + /** + * Copies all bytes of data from a file within a .jar to a destination + * file. + * + * @param jar + * The JarFile containing the file to be copied. + * + * @param source + * The JarEntry representing the file to be copied within the given + * JarFile. + * + * @param dest + * The destination file that the data should be copied to. + * + * @throws IOException + * If an error occurs reading from the source .jar or writing to the + * destination file. + */ + private static void copyEntryToFile(JarFile jar, JarEntry source, File dest) + throws IOException { + + int length; + byte[] buffer = new byte[8192]; + + try (InputStream input = jar.getInputStream(source)) { + try (OutputStream output = new FileOutputStream(dest)) { + + while ((length = input.read(buffer)) > 0) { + output.write(buffer, 0, length); + } + + } + } + + } + + /** + * Returns the URLs for the .jar files relevant to the given extension .jar + * file. Unless the extension bundles additional Java libraries, only the + * URL of the extension .jar will be returned. If additional Java libraries + * are bundled within the extension, URLs for those libraries will be + * included, as well. Temporary directories and/or files will be created as + * necessary to house bundled libraries. Only .jar files located directly + * within the root of the main extension .jar are considered. + * + * @param extension + * The extension .jar file to generate URLs for. + * + * @param temporaryFiles + * A modifiable List that should be populated with all temporary files + * created for the given extension. These files should be deleted on + * application shutdown in reverse order. + * + * @return + * An array of all URLs relevant to the given extension .jar. + * + * @throws GuacamoleException + * If the given file is not actually a file, the contents of the file + * cannot be read, or any necessary temporary files/directories cannot + * be created. + */ + private static URL[] getExtensionURLs(File extension, + List temporaryFiles) throws GuacamoleException { + + try (JarFile extensionJar = new JarFile(extension)) { + + // Include extension itself within classpath + List urls = new ArrayList<>(); + urls.add(getFileURL(extension)); + + Path extensionTempLibDir = null; + + // Iterate through all entries (files) within the extension .jar, + // adding any nested .jar files within the archive root to the + // classpath + Enumeration entries = extensionJar.entries(); + while (entries.hasMoreElements()) { + + JarEntry entry = entries.nextElement(); + String name = entry.getName(); + + // Consider only .jar files located in root of archive + if (entry.isDirectory() ||! name.endsWith(".jar") || name.indexOf('/') != -1) + continue; + + // Create temporary directory for housing this extension's + // bundled .jar files, if not already created + try { + if (extensionTempLibDir == null) { + extensionTempLibDir = Files.createTempDirectory(EXTENSION_TEMP_DIR_PREFIX); + temporaryFiles.add(extensionTempLibDir.toFile()); + extensionTempLibDir.toFile().deleteOnExit(); + } + } + catch (IOException e) { + throw new GuacamoleServerException("Temporary directory " + + "for libraries bundled with extension \"" + + extension + "\" could not be created.", e); + } + + // Create temporary file to hold the contents of the current + // bundled .jar + File tempLibrary; + try { + tempLibrary = Files.createTempFile(extensionTempLibDir, EXTENSION_TEMP_LIB_PREFIX, ".jar").toFile(); + temporaryFiles.add(tempLibrary); + tempLibrary.deleteOnExit(); + } + catch (IOException e) { + throw new GuacamoleServerException("Temporary file " + + "for library \"" + name + "\" bundled with " + + "extension \"" + extension + "\" could not be " + + "created.", e); + } + + // Copy contents of bundled .jar to temporary file + try { + copyEntryToFile(extensionJar, entry, tempLibrary); + } + catch (IOException e) { + throw new GuacamoleServerException("Contents of library " + + "\"" + name + "\" bundled with extension \"" + + extension + "\" could not be copied to a " + + "temporary file.", e); + } + + // Add temporary .jar file to classpath + urls.add(getFileURL(tempLibrary)); + + } + + if (extensionTempLibDir != null) + logger.debug("Libraries bundled within extension \"{}\" have been " + + "copied to temporary directory \"{}\".", extension, extensionTempLibDir); + + return urls.toArray(new URL[0]); + + } + catch (IOException e) { + throw new GuacamoleServerException("Contents of extension \"" + + extension + "\" cannot be read.", e); + } + + } + + /** + * Creates a new ExtensionClassLoader configured to load classes from the + * given extension .jar. If a necessary class cannot be found within the + * .jar, the given parent ClassLoader is used. Calling this function + * multiple times will not affect previously-returned instances of + * ExtensionClassLoader. + * + * @param extension + * The extension .jar file from which classes should be loaded. + * + * @param temporaryFiles + * A modifiable List that should be populated with all temporary files + * created for the given extension. These files should be deleted on + * application shutdown in reverse order. + * + * @param parent + * The ClassLoader to use if class resolution through the extension + * .jar fails. + * + * @throws GuacamoleException + * If the given file is not actually a file, or the contents of the + * file cannot be read. + */ + public ExtensionClassLoader(File extension, List temporaryFiles, + ClassLoader parent) throws GuacamoleException { + super(getExtensionURLs(extension, temporaryFiles), null); + this.parent = parent; + } + + @Override + protected Class findClass(String string) throws ClassNotFoundException { + + // Search only within the given URLs + try { + return super.findClass(string); + } + + // Search parent classloader ONLY if not found within given URLs + catch (ClassNotFoundException e) { + return parent.loadClass(string); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionManifest.java b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionManifest.java new file mode 100644 index 0000000..b30c5dd --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionManifest.java @@ -0,0 +1,433 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collection; +import java.util.Map; + +/** + * Java representation of the JSON manifest contained within every Guacamole + * extension, identifying an extension and describing its contents. + */ +public class ExtensionManifest { + + /** + * The version of Guacamole for which this extension was built. + * Compatibility rules built into the web application will guard against + * incompatible extensions being loaded. + */ + private String guacamoleVersion; + + /** + * The name of the extension associated with this manifest. The extension + * name is human-readable, and used for display purposes only. + */ + private String name; + + /** + * The namespace of the extension associated with this manifest. The + * extension namespace is required for internal use, and is used wherever + * extension-specific files or resources need to be isolated from those of + * other extensions. + */ + private String namespace; + + /** + * The paths of all JavaScript resources within the .jar of the extension + * associated with this manifest. + */ + private Collection javaScriptPaths; + + /** + * The paths of all CSS resources within the .jar of the extension + * associated with this manifest. + */ + private Collection cssPaths; + + /** + * The paths of all HTML patch resources within the .jar of the extension + * associated with this manifest. + */ + private Collection htmlPaths; + + /** + * The paths of all translation JSON files within this extension, if any. + */ + private Collection translationPaths; + + /** + * The mimetypes of all resources within this extension which are not + * already declared as JavaScript, CSS, or translation resources, if any. + * The key of each entry is the resource path, while the value is the + * corresponding mimetype. + */ + private Map resourceTypes; + + /** + * The names of all authentication provider classes within this extension, + * if any. + */ + private Collection authProviders; + + /** + * The names of all listener classes within this extension, if any. + */ + private Collection listeners; + + /** + * The path to the small favicon. If provided, this will replace the default + * Guacamole icon. + */ + private String smallIcon; + + /** + * The path to the large favicon. If provided, this will replace the default + * Guacamole icon. + */ + private String largeIcon; + + /** + * Returns the version of the Guacamole web application for which the + * extension was built, such as "0.9.7". + * + * @return + * The version of the Guacamole web application for which the extension + * was built. + */ + public String getGuacamoleVersion() { + return guacamoleVersion; + } + + /** + * Sets the version of the Guacamole web application for which the + * extension was built, such as "0.9.7". + * + * @param guacamoleVersion + * The version of the Guacamole web application for which the extension + * was built. + */ + public void setGuacamoleVersion(String guacamoleVersion) { + this.guacamoleVersion = guacamoleVersion; + } + + /** + * Returns the name of the extension associated with this manifest. The + * name is human-readable, for display purposes only, and is defined within + * the manifest by the "name" property. + * + * @return + * The name of the extension associated with this manifest. + */ + public String getName() { + return name; + } + + /** + * Sets the name of the extension associated with this manifest. The name + * is human-readable, for display purposes only, and is defined within the + * manifest by the "name" property. + * + * @param name + * The name of the extension associated with this manifest. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the namespace of the extension associated with this manifest. + * The namespace is required for internal use, and is used wherever + * extension-specific files or resources need to be isolated from those of + * other extensions. It is defined within the manifest by the "namespace" + * property. + * + * @return + * The namespace of the extension associated with this manifest. + */ + public String getNamespace() { + return namespace; + } + + /** + * Sets the namespace of the extension associated with this manifest. The + * namespace is required for internal use, and is used wherever extension- + * specific files or resources need to be isolated from those of other + * extensions. It is defined within the manifest by the "namespace" + * property. + * + * @param namespace + * The namespace of the extension associated with this manifest. + */ + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + /** + * Returns the paths to all JavaScript resources within the extension. + * These paths are defined within the manifest by the "js" property as an + * array of strings, where each string is a path relative to the root of + * the extension .jar. + * + * @return + * A collection of paths to all JavaScript resources within the + * extension. + */ + @JsonProperty("js") + public Collection getJavaScriptPaths() { + return javaScriptPaths; + } + + /** + * Sets the paths to all JavaScript resources within the extension. These + * paths are defined within the manifest by the "js" property as an array + * of strings, where each string is a path relative to the root of the + * extension .jar. + * + * @param javaScriptPaths + * A collection of paths to all JavaScript resources within the + * extension. + */ + @JsonProperty("js") + public void setJavaScriptPaths(Collection javaScriptPaths) { + this.javaScriptPaths = javaScriptPaths; + } + + /** + * Returns the paths to all CSS resources within the extension. These paths + * are defined within the manifest by the "js" property as an array of + * strings, where each string is a path relative to the root of the + * extension .jar. + * + * @return + * A collection of paths to all CSS resources within the extension. + */ + @JsonProperty("css") + public Collection getCSSPaths() { + return cssPaths; + } + + /** + * Sets the paths to all CSS resources within the extension. These paths + * are defined within the manifest by the "js" property as an array of + * strings, where each string is a path relative to the root of the + * extension .jar. + * + * @param cssPaths + * A collection of paths to all CSS resources within the extension. + */ + @JsonProperty("css") + public void setCSSPaths(Collection cssPaths) { + this.cssPaths = cssPaths; + } + + /** + * Returns the paths to all HTML patch resources within the extension. These + * paths are defined within the manifest by the "html" property as an array + * of strings, where each string is a path relative to the root of the + * extension .jar. + * + * @return + * A collection of paths to all HTML patch resources within the + * extension. + */ + @JsonProperty("html") + public Collection getHTMLPaths() { + return htmlPaths; + } + + /** + * Sets the paths to all HTML patch resources within the extension. These + * paths are defined within the manifest by the "html" property as an array + * of strings, where each string is a path relative to the root of the + * extension .jar. + * + * @param htmlPatchPaths + * A collection of paths to all HTML patch resources within the + * extension. + */ + @JsonProperty("html") + public void setHTMLPaths(Collection htmlPatchPaths) { + this.htmlPaths = htmlPatchPaths; + } + + /** + * Returns the paths to all translation resources within the extension. + * These paths are defined within the manifest by the "translations" + * property as an array of strings, where each string is a path relative to + * the root of the extension .jar. + * + * @return + * A collection of paths to all translation resources within the + * extension. + */ + @JsonProperty("translations") + public Collection getTranslationPaths() { + return translationPaths; + } + + /** + * Sets the paths to all translation resources within the extension. These + * paths are defined within the manifest by the "translations" property as + * an array of strings, where each string is a path relative to the root of + * the extension .jar. + * + * @param translationPaths + * A collection of paths to all translation resources within the + * extension. + */ + @JsonProperty("translations") + public void setTranslationPaths(Collection translationPaths) { + this.translationPaths = translationPaths; + } + + /** + * Returns a map of all resources to their corresponding mimetypes, for all + * resources not already declared as JavaScript, CSS, or translation + * resources. These paths and corresponding types are defined within the + * manifest by the "resources" property as an object, where each property + * name is a path relative to the root of the extension .jar, and each + * value is a mimetype. + * + * @return + * A map of all resources within the extension to their corresponding + * mimetypes. + */ + @JsonProperty("resources") + public Map getResourceTypes() { + return resourceTypes; + } + + /** + * Sets the map of all resources to their corresponding mimetypes, for all + * resources not already declared as JavaScript, CSS, or translation + * resources. These paths and corresponding types are defined within the + * manifest by the "resources" property as an object, where each property + * name is a path relative to the root of the extension .jar, and each + * value is a mimetype. + * + * @param resourceTypes + * A map of all resources within the extension to their corresponding + * mimetypes. + */ + @JsonProperty("resources") + public void setResourceTypes(Map resourceTypes) { + this.resourceTypes = resourceTypes; + } + + /** + * Returns the classnames of all authentication provider classes within the + * extension. These classnames are defined within the manifest by the + * "authProviders" property as an array of strings, where each string is an + * authentication provider classname. + * + * @return + * A collection of classnames of all authentication providers within + * the extension. + */ + public Collection getAuthProviders() { + return authProviders; + } + + /** + * Sets the classnames of all authentication provider classes within the + * extension. These classnames are defined within the manifest by the + * "authProviders" property as an array of strings, where each string is an + * authentication provider classname. + * + * @param authProviders + * A collection of classnames of all authentication providers within + * the extension. + */ + public void setAuthProviders(Collection authProviders) { + this.authProviders = authProviders; + } + + /** + * Returns the classnames of all listener classes within the extension. + * These classnames are defined within the manifest by the "listeners" + * property as an array of strings, where each string is a listener + * class name. + * + * @return + * A collection of classnames for all listeners within the extension. + */ + public Collection getListeners() { + return listeners; + } + + /** + * Sets the classnames of all listener classes within the extension. + * These classnames are defined within the manifest by the "listeners" + * property as an array of strings, where each string is a listener + * class name. + * + * @param listeners + * A collection of classnames for all listeners within the extension. + */ + public void setListeners(Collection listeners) { + this.listeners = listeners; + } + + /** + * Returns the path to the small favicon, relative to the root of the + * extension. + * + * @return + * The path to the small favicon. + */ + public String getSmallIcon() { + return smallIcon; + } + + /** + * Sets the path to the small favicon. This will replace the default + * Guacamole icon. + * + * @param smallIcon + * The path to the small favicon. + */ + public void setSmallIcon(String smallIcon) { + this.smallIcon = smallIcon; + } + + /** + * Returns the path to the large favicon, relative to the root of the + * extension. + * + * @return + * The path to the large favicon. + */ + public String getLargeIcon() { + return largeIcon; + } + + /** + * Sets the path to the large favicon. This will replace the default + * Guacamole icon. + * + * @param largeIcon + * The path to the large favicon. + */ + public void setLargeIcon(String largeIcon) { + this.largeIcon = largeIcon; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java new file mode 100644 index 0000000..c4744e2 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java @@ -0,0 +1,661 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import com.google.inject.Provides; +import com.google.inject.servlet.ServletModule; +import java.io.File; +import java.io.FileFilter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.auth.file.FileAuthenticationProvider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.event.EventLoggingListener; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.event.listener.Listener; +import org.apache.guacamole.properties.StringSetProperty; +import org.apache.guacamole.resource.Resource; +import org.apache.guacamole.resource.ResourceServlet; +import org.apache.guacamole.resource.SequenceResource; +import org.apache.guacamole.resource.WebApplicationResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A Guice Module which loads all extensions within the + * GUACAMOLE_HOME/extensions directory, if any. + */ +public class ExtensionModule extends ServletModule { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(ExtensionModule.class); + + /** + * The version strings of all Guacamole versions whose extensions are + * compatible with this release. + */ + private static final List ALLOWED_GUACAMOLE_VERSIONS = + Collections.unmodifiableList(Arrays.asList( + "*", + "1.0.0", + "1.1.0", + "1.2.0", + "1.3.0", + "1.4.0", + "1.5.0", + "1.5.1", + "1.5.2", + "1.5.3", + "1.5.4", + "1.5.5", + "1.6.0" + )); + + /** + * The name of the directory within GUACAMOLE_HOME containing any .jars + * which should be included in the classpath of all extensions. + */ + private static final String LIB_DIRECTORY = "lib"; + + /** + * The name of the directory within GUACAMOLE_HOME containing all + * extensions. + */ + private static final String EXTENSIONS_DIRECTORY = "extensions"; + + /** + * The string that the filenames of all extensions must end with to be + * recognized as extensions. + */ + private static final String EXTENSION_SUFFIX = ".jar"; + + /** + * A comma-separated list of the identifiers of all authentication + * providers whose internal failures should be tolerated during the + * authentication process. If an authentication provider within this list + * encounters an internal error during the authentication process, it will + * simply be skipped, allowing other authentication providers to continue + * trying to authenticate the user. Internal errors within authentication + * providers that are not within this list will halt the authentication + * process entirely. + */ + public static final StringSetProperty SKIP_IF_UNAVAILABLE = new StringSetProperty() { + + @Override + public String getName() { + return "skip-if-unavailable"; + } + + }; + + /** + * A comma-separated list of the namespaces of all extensions that should + * be loaded in a specific order. The special value "*" can be used in + * lieu of a namespace to represent all extensions that are not listed. All + * extensions explicitly listed will be sorted in the order given, while + * all extensions not explicitly listed will be sorted by their filenames. + */ + public static final ExtensionOrderProperty EXTENSION_PRIORITY = new ExtensionOrderProperty() { + + @Override + public String getName() { + return "extension-priority"; + } + + }; + + /** + * The Guacamole server environment. + */ + private final Environment environment; + + /** + * All currently-bound authentication providers, if any. + */ + private final List boundAuthenticationProviders = + new ArrayList(); + + /** + * All currently-bound authentication providers, if any. + */ + private final List boundListeners = + new ArrayList(); + + /** + * All temporary files that should be deleted upon application shutdown, in + * reverse order of desired deletion. This will typically simply be the + * order that each file was created. + */ + private final List temporaryFiles = new ArrayList<>(); + + /** + * Service for adding and retrieving language resources. + */ + private final LanguageResourceService languageResourceService; + + /** + * Service for adding and retrieving HTML patch resources. + */ + private final PatchResourceService patchResourceService; + + /** + * Returns the classloader that should be used as the parent classloader + * for all extensions. If the GUACAMOLE_HOME/lib directory exists, this + * will be a classloader that loads classes from within the .jar files in + * that directory. Lacking the GUACAMOLE_HOME/lib directory, this will + * simply be the classloader associated with the ExtensionModule class. + * + * @return + * The classloader that should be used as the parent classloader for + * all extensions. + * + * @throws GuacamoleException + * If an error occurs while retrieving the classloader. + */ + private ClassLoader getParentClassLoader() throws GuacamoleException { + + // Retrieve lib directory + File libDir = new File(environment.getGuacamoleHome(), LIB_DIRECTORY); + + // If lib directory does not exist, use default class loader + if (!libDir.isDirectory()) + return ExtensionModule.class.getClassLoader(); + + // Return classloader which loads classes from all .jars within the lib directory + return new DirectoryClassLoader(libDir); + + } + + /** + * Creates a module which loads all extensions within the + * GUACAMOLE_HOME/extensions directory. + * + * @param environment + * The environment to use when configuring authentication. + */ + public ExtensionModule(Environment environment) { + this.environment = environment; + this.languageResourceService = new LanguageResourceService(environment); + this.patchResourceService = new PatchResourceService(); + } + + /** + * Binds the given AuthenticationProvider class such that any service + * requiring access to the AuthenticationProvider can obtain it via + * injection, along with any other bound AuthenticationProviders. + * + * @param authenticationProvider + * The AuthenticationProvider class to bind. + * + * @param tolerateFailures + * The set of identifiers of all authentication providers whose + * internal failures should be tolerated during the authentication + * process. If the identifier of an authentication provider is within + * this set, errors during authentication will result in the + * authentication provider being ignored for that authentication + * attempt, with the authentication process proceeding as if that + * authentication provider were not present. By default, errors during + * authentication halt the authentication process entirely. + */ + private void bindAuthenticationProvider( + Class authenticationProvider, + Set tolerateFailures) { + + // Bind authentication provider + logger.debug("[{}] Binding AuthenticationProvider \"{}\".", + boundAuthenticationProviders.size(), authenticationProvider.getName()); + boundAuthenticationProviders.add(new AuthenticationProviderFacade( + authenticationProvider, tolerateFailures)); + + } + + /** + * Binds each of the given AuthenticationProvider classes such that any + * service requiring access to the AuthenticationProvider can obtain it via + * injection. + * + * @param authProviders + * The AuthenticationProvider classes to bind. + * + * @param tolerateFailures + * The set of identifiers of all authentication providers whose + * internal failures should be tolerated during the authentication + * process. If the identifier of an authentication provider is within + * this set, errors during authentication will result in the + * authentication provider being ignored for that authentication + * attempt, with the authentication process proceeding as if that + * authentication provider were not present. By default, errors during + * authentication halt the authentication process entirely. + */ + private void bindAuthenticationProviders( + Collection> authProviders, + Set tolerateFailures) { + + // Bind each authentication provider within extension + for (Class authenticationProvider : authProviders) + bindAuthenticationProvider(authenticationProvider, tolerateFailures); + + } + + /** + * Returns a list of all currently-bound AuthenticationProvider instances. + * + * @return + * A List of all currently-bound AuthenticationProvider. The List is + * not modifiable. + */ + @Provides + public List getAuthenticationProviders() { + return Collections.unmodifiableList(boundAuthenticationProviders); + } + + /** + * Returns a list of all temporary files that should be deleted upon + * application shutdown, in reverse order of desired deletion. This will + * typically simply be the order that each file was created. + * + * @return + * A List of all temporary files that should be deleted upon + * application shutdown. The List is not modifiable. + */ + @Provides + public List getTemporaryFiles() { + return Collections.unmodifiableList(temporaryFiles); + } + + /** + * Binds the given provider class such that a listener is bound for each + * listener interface implemented by the provider and such that all bound + * listener instances can be obtained via injection. + * + * @param providerClass + * The listener class to bind. + */ + private void bindListener(Class providerClass) { + + logger.debug("[{}] Binding listener \"{}\".", + boundListeners.size(), providerClass.getName()); + boundListeners.addAll(ListenerFactory.createListeners(providerClass)); + + } + + /** + * Binds each of the given Listener classes such that any + * service requiring access to the Listener can obtain it via + * injection. + * + * @param listeners + * The Listener classes to bind. + */ + private void bindListeners(Collection> listeners) { + + // Bind each listener within extension + for (Class listener : listeners) + bindListener(listener); + } + + /** + * Returns a list of all currently-bound Listener instances. + * + * @return + * A List of all currently-bound Listener instances. The List is + * not modifiable. + */ + @Provides + public List getListeners() { + return Collections.unmodifiableList(boundListeners); + } + + /** + * Serves each of the given resources as a language resource. Language + * resources are served from within the "/translations" directory as JSON + * files, where the name of each JSON file is the language key. + * + * @param resources + * A map of all language resources to serve, where the key of each + * entry in the language key from which the name of the JSON file will + * be derived. + */ + private void serveLanguageResources(Map resources) { + + // Add all resources to language resource service + for (Map.Entry translationResource : resources.entrySet()) { + + // Get path and resource from path/resource pair + String path = translationResource.getKey(); + Resource resource = translationResource.getValue(); + + // Derive key from path + String languageKey = languageResourceService.getLanguageKey(path); + if (languageKey == null) { + logger.warn("Invalid language file name: \"{}\"", path); + continue; + } + + // Add language resource + languageResourceService.addLanguageResource(languageKey, resource); + + } + + } + + /** + * Serves each of the given resources under the given prefix. The path of + * each resource relative to the prefix is the key of its entry within the + * map. + * + * @param prefix + * The prefix under which each resource should be served. + * + * @param resources + * A map of all resources to serve, where the key of each entry in the + * map is the desired path of that resource relative to the prefix. + */ + private void serveStaticResources(String prefix, Map resources) { + + // Add all resources under given prefix + for (Map.Entry staticResource : resources.entrySet()) { + + // Get path and resource from path/resource pair + String path = staticResource.getKey(); + Resource resource = staticResource.getValue(); + + // Serve within namespace-derived path + serve(prefix + path).with(new ResourceServlet(resource)); + + } + + } + + /** + * Returns whether the given version of Guacamole is compatible with this + * version of Guacamole as far as extensions are concerned. + * + * @param guacamoleVersion + * The version of Guacamole the extension was built for. + * + * @return + * true if the given version of Guacamole is compatible with this + * version of Guacamole, false otherwise. + */ + private boolean isCompatible(String guacamoleVersion) { + return ALLOWED_GUACAMOLE_VERSIONS.contains(guacamoleVersion); + } + + /** + * Returns the set of identifiers of all authentication providers whose + * internal failures should be tolerated during the authentication process. + * If the identifier of an authentication provider is within this set, + * errors during authentication will result in the authentication provider + * being ignored for that authentication attempt, with the authentication + * process proceeding as if that authentication provider were not present. + * By default, errors during authentication halt the authentication process + * entirely. + * + * @return + * The set of identifiers of all authentication providers whose + * internal failures should be tolerated during the authentication + * process. + */ + private Set getToleratedAuthenticationProviders() { + + // Parse list of auth providers whose internal failures should be + // tolerated + try { + return environment.getProperty(SKIP_IF_UNAVAILABLE, Collections.emptySet()); + } + + // Use empty set by default if property cannot be parsed + catch (GuacamoleException e) { + logger.warn("The list of authentication providers specified via the \"{}\" property could not be parsed: {}", SKIP_IF_UNAVAILABLE.getName(), e.getMessage()); + logger.debug("Unable to parse \"{}\" property.", SKIP_IF_UNAVAILABLE.getName(), e); + return Collections.emptySet(); + } + + } + + /** + * Returns a comparator that sorts extensions by their desired load order, + * as dictated by the "extension-priority" property and their filenames. + * + * @return + * A comparator that sorts extensions by their desired load order. + */ + private Comparator getExtensionLoadOrder() { + + // Parse desired sort order of extensions + try { + return environment.getProperty(EXTENSION_PRIORITY, ExtensionOrderProperty.DEFAULT_COMPARATOR); + } + + // Sort by filename if the desired order cannot be read + catch (GuacamoleException e) { + logger.warn("The list of extensions specified via the \"{}\" property could not be parsed: {}", EXTENSION_PRIORITY.getName(), e.getMessage()); + logger.debug("Unable to parse \"{}\" property.", EXTENSION_PRIORITY.getName(), e); + return ExtensionOrderProperty.DEFAULT_COMPARATOR; + } + + } + + /** + * Returns a list of all installed extensions in the order they should be + * loaded. Extension load order is dictated by the "extension-priority" + * property and by extension filename. Each extension within + * GUACAMOLE_HOME/extensions is read and validated, but not fully loaded. + * It is the responsibility of the caller to continue the load process with + * the extensions in the returned list. + * + * @return + * A list of all installed extensions, ordered by load priority. + */ + private List getExtensions() { + + // Retrieve and validate extensions directory + File extensionsDir = new File(environment.getGuacamoleHome(), EXTENSIONS_DIRECTORY); + if (!extensionsDir.isDirectory()) + return Collections.emptyList(); + + // Retrieve list of all extension files within extensions directory + File[] extensionFiles = extensionsDir.listFiles(new FileFilter() { + + @Override + public boolean accept(File file) { + return file.isFile() && file.getName().endsWith(EXTENSION_SUFFIX); + } + + }); + + // Verify contents are accessible + if (extensionFiles == null) { + logger.warn("Although GUACAMOLE_HOME/" + EXTENSIONS_DIRECTORY + " exists, its contents cannot be read."); + return Collections.emptyList(); + } + + // Read (but do not fully load) each extension within the extension + // directory + List extensions = new ArrayList<>(extensionFiles.length); + for (File extensionFile : extensionFiles) { + + logger.debug("Reading extension: \"{}\"", extensionFile.getName()); + + try { + + // Load extension from file + Extension extension = new Extension(getParentClassLoader(), extensionFile, temporaryFiles); + + // Validate Guacamole version of extension + if (!isCompatible(extension.getGuacamoleVersion())) { + logger.debug("Declared Guacamole version \"{}\" of extension \"{}\" is not compatible with this version of Guacamole.", + extension.getGuacamoleVersion(), extensionFile.getName()); + throw new GuacamoleServerException("Extension \"" + extension.getName() + "\" is not " + + "compatible with this version of Guacamole."); + } + + extensions.add(extension); + + } + catch (GuacamoleException e) { + logger.error("Extension \"{}\" could not be loaded: {}", extensionFile.getName(), e.getMessage()); + logger.debug("Unable to load extension.", e); + } + + } + + extensions.sort(getExtensionLoadOrder()); + return extensions; + + } + + /** + * Loads all extensions within the GUACAMOLE_HOME/extensions directory, if + * any, adding their static resource to the given resource collections. + * + * @param javaScriptResources + * A modifiable collection of static JavaScript resources which may + * receive new JavaScript resources from extensions. + * + * @param cssResources + * A modifiable collection of static CSS resources which may receive + * new CSS resources from extensions. + * + * @param toleratedAuthProviders + * The set of identifiers of all authentication providers whose + * internal failures should be tolerated during the authentication + * process. If the identifier of an authentication provider is within + * this set, errors during authentication will result in the + * authentication provider being ignored for that authentication + * attempt, with the authentication process proceeding as if that + * authentication provider were not present. By default, errors during + * authentication halt the authentication process entirely. + */ + private void loadExtensions(Collection javaScriptResources, + Collection cssResources, + Set toleratedAuthProviders) { + + // Advise of current extension load order and how the order may be + // changed + List extensions = getExtensions(); + if (extensions.size() > 1) { + logger.info("Multiple extensions are installed and will be " + + "loaded in order of decreasing priority:"); + + for (Extension extension : extensions) { + logger.info(" - [{}] \"{}\" ({})", extension.getNamespace(), + extension.getName(), extension.getFile()); + } + + logger.info("To change this order, set the \"{}\" property or " + + "rename the extension files. The default priority of " + + "extensions is dictated by the sort order of their " + + "filenames.", EXTENSION_PRIORITY.getName()); + } + + // Load all extensions + for (Extension extension : extensions) { + + // Add any JavaScript / CSS resources + javaScriptResources.addAll(extension.getJavaScriptResources().values()); + cssResources.addAll(extension.getCSSResources().values()); + + // Attempt to load all authentication providers + bindAuthenticationProviders(extension.getAuthenticationProviderClasses(), toleratedAuthProviders); + + // Attempt to load all listeners + bindListeners(extension.getListenerClasses()); + + // Add any translation resources + serveLanguageResources(extension.getTranslationResources()); + + // Add all HTML patch resources + patchResourceService.addPatchResources(extension.getHTMLResources().values()); + + // Add all static resources under namespace-derived prefix + String staticResourcePrefix = "/app/ext/" + extension.getNamespace() + "/"; + serveStaticResources(staticResourcePrefix, extension.getStaticResources()); + + // Serve up the small favicon if provided + if(extension.getSmallIcon() != null) + serve("/images/logo-64.png").with(new ResourceServlet(extension.getSmallIcon())); + + // Serve up the large favicon if provided + if(extension.getLargeIcon()!= null) + serve("/images/logo-144.png").with(new ResourceServlet(extension.getLargeIcon())); + + // Log successful loading of extension by name + logger.info("Extension \"{}\" ({}) loaded.", extension.getName(), extension.getNamespace()); + + } + + } + + @Override + protected void configureServlets() { + + // Bind resource services + bind(LanguageResourceService.class).toInstance(languageResourceService); + bind(PatchResourceService.class).toInstance(patchResourceService); + + // Load initial language resources from servlet context + languageResourceService.addLanguageResources(getServletContext()); + + // Init JavaScript and CSS resources from extensions + Collection javaScriptResources = new ArrayList(); + Collection cssResources = new ArrayList(); + + // Veriffy that the possibly-cached index.html matches the current build + javaScriptResources.add(new WebApplicationResource(getServletContext(), "/verifyCachedVersion.js")); + + // Load all extensions + final Set toleratedAuthProviders = getToleratedAuthenticationProviders(); + loadExtensions(javaScriptResources, cssResources, toleratedAuthProviders); + + // Always bind default file-driven auth and event logging last + bindAuthenticationProvider(FileAuthenticationProvider.class, toleratedAuthProviders); + bindListener(EventLoggingListener.class); + + // Dynamically generate app.js and app.css from extensions + serve("/app.js").with(new ResourceServlet(new SequenceResource(javaScriptResources))); + serve("/app.css").with(new ResourceServlet(new SequenceResource(cssResources))); + + // Dynamically serve all language resources + for (Map.Entry entry : languageResourceService.getLanguageResources().entrySet()) { + + // Get language key/resource pair + String languageKey = entry.getKey(); + Resource resource = entry.getValue(); + + // Serve resource within /translations + serve("/translations/" + languageKey + ".json").with(new ResourceServlet(resource)); + + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionOrderProperty.java b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionOrderProperty.java new file mode 100644 index 0000000..4f520dc --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionOrderProperty.java @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.properties.GuacamoleProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A GuacamoleProperty that defines the order of Guacamole extensions. The + * property value is a comma-separated list of extension namespaces, with "*" + * used to represent all extensions that aren't listed. For example, a value + * like "saml, *, ldap" would order SAML support first and LDAP support last, + * with all other extensions loaded between the two in filename order. For + * values without "*", all other extensions are implicitly after all extensions + * that are explicitly listed. + */ +public abstract class ExtensionOrderProperty implements GuacamoleProperty> { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ExtensionOrderProperty.class); + + /** + * A pattern which matches against the delimiters between values. This is + * currently simply a comma and any following whitespace. Parts of the + * input string which match this pattern will not be included in the parsed + * result. + */ + private static final Pattern DELIMITER_PATTERN = Pattern.compile(",\\s*"); + + /** + * Static comparator instance that sorts extensions by their filenames + * alone. + */ + public static final Comparator DEFAULT_COMPARATOR = new ExtensionComparator(); + + /** + * Comparator that sorts extensions in order of priority, as dictated by a + * list of the extensions that should be ordered first or last. All + * extensions not explicitly listed will instead be sorted by filename. + */ + private static class ExtensionComparator implements Comparator { + + /** + * The string value representing the set of all extensions not + * explicitly listed. + */ + private final String OTHER_EXTENSIONS = "*"; + + /** + * The relative priorities of all extensions. Any extension not listed + * within this map should be sorted with the priority value stored in + * {@link #defaultPriority}. + */ + private final Map extensionPriority; + + /** + * The relative priority that should be used for all extensions not + * explicitly listed within {@link #extensionPriority}. + */ + private final int defaultPriority; + + /** + * Creates a new ExtensionComparator that sorts all extensions by their + * filenames only. + */ + public ExtensionComparator() { + defaultPriority = 0; + extensionPriority = Collections.emptyMap(); + } + + /** + * Creates a new ExtensionComparator that ensures each of the given + * extensions are sorted in the relative order listed, with any + * extensions not explicitly listed sorted by filename. + * + * @param name + * The name of the property defining the provided list of + * extensions. + * + * @param extensions + * The namespaces of the extensions in the order they should be + * sorted, with the special value "*" functioning as a + * placeholder for all extensions that are not explicitly listed. + */ + public ExtensionComparator(String name, String... extensions) { + + extensionPriority = new HashMap<>(extensions.length); + + for (int priority = 0; priority < extensions.length; priority++) { + String extension = extensions[priority]; + if (extensionPriority.putIfAbsent(extension, priority) != null) + logger.warn("The value \"{}\" was specified multiple " + + "times for property \"{}\". Only the first " + + "occurrence of this value will have any effect.", + extension, name); + } + + Integer otherExtensionPriority = extensionPriority.remove(OTHER_EXTENSIONS); + if (otherExtensionPriority != null) + defaultPriority = otherExtensionPriority; + else + defaultPriority = extensions.length; + + } + + @Override + public int compare(Extension extA, Extension extB) { + + int priorityA = extensionPriority.getOrDefault(extA.getNamespace(), defaultPriority); + int priorityB = extensionPriority.getOrDefault(extB.getNamespace(), defaultPriority); + + // Sort by explicit priority first + if (priorityA != priorityB) + return priorityA - priorityB; + + // Sort all extensions without explicit priorities by their + // filenames (no extensions will have the same priority except + // those that aren't explicitly listed) + return extA.getFile().compareTo(extB.getFile()); + + } + + } + + @Override + public Comparator parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + // Split string into a set of individual values + return new ExtensionComparator(getName(), DELIMITER_PATTERN.split(value)); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java b/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java new file mode 100644 index 0000000..3cb2acb --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java @@ -0,0 +1,450 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.servlet.ServletContext; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.StringSetProperty; +import org.apache.guacamole.resource.ByteArrayResource; +import org.apache.guacamole.resource.Resource; +import org.apache.guacamole.resource.WebApplicationResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service which provides access to all built-in languages as resources, and + * allows other resources to be added or overlaid against existing resources. + */ +public class LanguageResourceService { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(LanguageResourceService.class); + + /** + * The path to the translation folder within the webapp. + */ + private static final String TRANSLATION_PATH = "/translations"; + + /** + * The JSON property for the human readable display name. + */ + private static final String LANGUAGE_DISPLAY_NAME_KEY = "NAME"; + + /** + * The Jackson parser for parsing the language JSON files. + */ + private static final ObjectMapper mapper = new ObjectMapper(); + + /** + * The regular expression to use for parsing the language key from the + * filename. + */ + private static final Pattern LANGUAGE_KEY_PATTERN = Pattern.compile(".*/([a-z]+(_[A-Z]+)?)\\.json"); + + /** + * Comma-separated list of all allowed languages, where each language is + * represented by a language key, such as "en" or "en_US". If specified, + * only languages within this list will be listed as available by the REST + * service. + */ + public final StringSetProperty ALLOWED_LANGUAGES = new StringSetProperty() { + + @Override + public String getName() { return "allowed-languages"; } + + }; + + /** + * The set of all language keys which are explicitly listed as allowed + * within guacamole.properties, or null if all defined languages should be + * allowed. + */ + private final Set allowedLanguages; + + /** + * Map of all language resources by language key. Language keys are + * language and country code pairs, separated by an underscore, like + * "en_US". The country code and underscore SHOULD be omitted in the case + * that only one dialect of that language is defined, or in the case of the + * most universal or well-supported of all supported dialects of that + * language. + */ + private final Map resources = new HashMap(); + + /** + * Creates a new service for tracking and parsing available translations + * which reads its configuration from the given environment. + * + * @param environment + * The environment from which the configuration properties of this + * service should be read. + */ + public LanguageResourceService(Environment environment) { + + Set parsedAllowedLanguages; + + // Parse list of available languages from properties + try { + parsedAllowedLanguages = environment.getProperty(ALLOWED_LANGUAGES); + logger.debug("Available languages will be restricted to: {}", parsedAllowedLanguages); + } + + // Warn of failure to parse + catch (GuacamoleException e) { + parsedAllowedLanguages = null; + logger.error("Unable to parse list of allowed languages: {}", e.getMessage()); + logger.debug("Error parsing list of allowed languages.", e); + } + + this.allowedLanguages = parsedAllowedLanguages; + + } + + /** + * Derives a language key from the filename within the given path, if + * possible. If the filename is not a valid language key, null is returned. + * + * @param path + * The path containing the filename to derive the language key from. + * + * @return + * The derived language key, or null if the filename is not a valid + * language key. + */ + public String getLanguageKey(String path) { + + // Parse language key from filename + Matcher languageKeyMatcher = LANGUAGE_KEY_PATTERN.matcher(path); + if (!languageKeyMatcher.matches()) + return null; + + // Return parsed key + return languageKeyMatcher.group(1); + + } + + /** + * Merges the given JSON objects. Any leaf node in overlay will overwrite + * the corresponding path in original. + * + * @param original + * The original JSON object to which changes should be applied. + * + * @param overlay + * The JSON object containing changes that should be applied. + * + * @return + * The newly constructed JSON object that is the result of merging + * original and overlay. + */ + private JsonNode mergeTranslations(JsonNode original, JsonNode overlay) { + + // If we are at a leaf node, the result of merging is simply the overlay + if (!overlay.isObject() || original == null) + return overlay; + + // Create mutable copy of original + ObjectNode newNode = JsonNodeFactory.instance.objectNode(); + Iterator fieldNames = original.fieldNames(); + while (fieldNames.hasNext()) { + String fieldName = fieldNames.next(); + newNode.set(fieldName, original.get(fieldName)); + } + + // Merge each field + fieldNames = overlay.fieldNames(); + while (fieldNames.hasNext()) { + String fieldName = fieldNames.next(); + newNode.set(fieldName, mergeTranslations(original.get(fieldName), overlay.get(fieldName))); + } + + return newNode; + + } + + /** + * Parses the given language resource, returning the resulting JsonNode. + * If the resource cannot be read because it does not exist, null is + * returned. + * + * @param resource + * The language resource to parse. Language resources must have the + * mimetype "application/json". + * + * @return + * A JsonNode representing the root of the parsed JSON tree, or null if + * the given resource does not exist. + * + * @throws IOException + * If an error occurs while parsing the resource as JSON. + */ + private JsonNode parseLanguageResource(Resource resource) throws IOException { + + // Get resource stream + InputStream stream = resource.asStream(); + if (stream == null) + return null; + + // Parse JSON tree + try { + JsonNode tree = mapper.readTree(stream); + return tree; + } + + // Ensure stream is always closed + finally { + stream.close(); + } + + } + + /** + * Returns whether a language having the given key should be allowed to be + * loaded. If language availability restrictions are imposed through + * guacamole.properties, this may return false in some cases. By default, + * this function will always return true. Note that just because a language + * key is allowed to be loaded does not imply that the language key is + * valid. + * + * @param languageKey + * The language key of the language to test. + * + * @return + * true if the given language key should be allowed to be loaded, false + * otherwise. + */ + private boolean isLanguageAllowed(String languageKey) { + + // If no list is provided, all languages are implicitly available + if (allowedLanguages == null) + return true; + + return allowedLanguages.contains(languageKey); + + } + + /** + * Adds or overlays the given language resource, which need not exist in + * the ServletContext. If a language resource is already defined for the + * given language key, the strings from the given resource will be overlaid + * on top of the existing strings, augmenting or overriding the available + * strings for that language. + * + * @param key + * The language key of the resource being added. Language keys are + * pairs consisting of a language code followed by an underscore and + * country code, such as "en_US". + * + * @param resource + * The language resource to add. This resource must have the mimetype + * "application/json". + */ + public void addLanguageResource(String key, Resource resource) { + + // Skip loading of language if not allowed + if (!isLanguageAllowed(key)) { + logger.debug("OMITTING language: \"{}\"", key); + return; + } + + // Merge language resources if already defined + Resource existing = resources.get(key); + if (existing != null) { + + try { + + // Read the original language resource + JsonNode existingTree = parseLanguageResource(existing); + if (existingTree == null) { + logger.warn("Base language resource \"{}\" does not exist.", key); + return; + } + + // Read new language resource + JsonNode resourceTree = parseLanguageResource(resource); + if (resourceTree == null) { + logger.warn("Overlay language resource \"{}\" does not exist.", key); + return; + } + + // Merge the language resources + JsonNode mergedTree = mergeTranslations(existingTree, resourceTree); + resources.put(key, new ByteArrayResource("application/json", mapper.writeValueAsBytes(mergedTree))); + + logger.debug("Merged strings with existing language: \"{}\"", key); + + } + catch (IOException e) { + logger.error("Unable to merge language resource \"{}\": {}", key, e.getMessage()); + logger.debug("Error merging language resource.", e); + } + + } + + // Otherwise, add new language resource + else { + resources.put(key, resource); + logger.debug("Added language: \"{}\"", key); + } + + } + + /** + * Adds or overlays all languages defined within the /translations + * directory of the given ServletContext. If no such language files exist, + * nothing is done. If a language is already defined, the strings from the + * will be overlaid on top of the existing strings, augmenting or + * overriding the available strings for that language. The language key + * for each language file is derived from the filename. + * + * @param context + * The ServletContext from which language files should be loaded. + */ + public void addLanguageResources(ServletContext context) { + + // Get the paths of all the translation files + Set resourcePaths = context.getResourcePaths(TRANSLATION_PATH); + + // If no translation files found, nothing to add + if (resourcePaths == null) + return; + + // Iterate through all the found language files and add them to the map + for (Object resourcePathObject : resourcePaths) { + + // Each resource path is guaranteed to be a string + String resourcePath = (String) resourcePathObject; + + // Parse language key from path + String languageKey = getLanguageKey(resourcePath); + if (languageKey == null) { + logger.warn("Invalid language file name: \"{}\"", resourcePath); + continue; + } + + // Add/overlay new resource + addLanguageResource( + languageKey, + new WebApplicationResource(context, "application/json", resourcePath) + ); + + } + + } + + /** + * Returns a set of all unique language keys currently associated with + * language resources stored in this service. The returned set cannot be + * modified. + * + * @return + * A set of all unique language keys currently associated with this + * service. + */ + public Set getLanguageKeys() { + return Collections.unmodifiableSet(resources.keySet()); + } + + /** + * Returns a map of all languages currently associated with this service, + * where the key of each map entry is the language key. The returned map + * cannot be modified. + * + * @return + * A map of all languages currently associated with this service. + */ + public Map getLanguageResources() { + return Collections.unmodifiableMap(resources); + } + + /** + * Returns a mapping of all language keys to their corresponding human- + * readable language names. If an error occurs while parsing a language + * resource, its key/name pair will simply be omitted. The returned map + * cannot be modified. + * + * @return + * A map of all language keys and their corresponding human-readable + * names. + */ + public Map getLanguageNames() { + + Map languageNames = new HashMap(); + + // For each language key/resource pair + for (Map.Entry entry : resources.entrySet()) { + + // Get language key and resource + String languageKey = entry.getKey(); + Resource resource = entry.getValue(); + + // Get stream for resource + InputStream resourceStream = resource.asStream(); + if (resourceStream == null) { + logger.warn("Expected language resource does not exist: \"{}\".", languageKey); + continue; + } + + // Get name node of language + try { + JsonNode tree = mapper.readTree(resourceStream); + JsonNode nameNode = tree.get(LANGUAGE_DISPLAY_NAME_KEY); + + // Attempt to read language name from node + String languageName; + if (nameNode == null || (languageName = nameNode.textValue()) == null) { + logger.warn("Root-level \"" + LANGUAGE_DISPLAY_NAME_KEY + "\" string missing or invalid in language \"{}\"", languageKey); + languageName = languageKey; + } + + // Add language key/name pair to map + languageNames.put(languageKey, languageName); + + } + + // Continue with next language if unable to read + catch (IOException e) { + logger.warn("Unable to read language resource \"{}\".", languageKey); + logger.debug("Error reading language resource.", e); + } + + } + + return Collections.unmodifiableMap(languageNames); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ListenerFactory.java b/guacamole/src/main/java/org/apache/guacamole/extension/ListenerFactory.java new file mode 100644 index 0000000..8aa6bab --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ListenerFactory.java @@ -0,0 +1,278 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.event.AuthenticationFailureEvent; +import org.apache.guacamole.net.event.AuthenticationSuccessEvent; +import org.apache.guacamole.net.event.TunnelCloseEvent; +import org.apache.guacamole.net.event.TunnelConnectEvent; +import org.apache.guacamole.net.event.listener.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * A factory that reflectively instantiates Listener objects for a given + * provider class. + */ +class ListenerFactory { + + /** + * Creates all listeners represented by an instance of the given provider class. + *

      + * If a provider class implements the simple Listener interface, that is the + * only listener type that will be returned. Otherwise, a list of Listener + * objects that adapt the legacy listener interfaces will be returned. + * + * @param providerClass + * A class that represents a listener. + * + * @return + * The list of listeners represented by the given provider class. + */ + static List createListeners(Class providerClass) { + + Object provider = ProviderFactory.newInstance("listener", providerClass); + + if (provider instanceof Listener) { + return Collections.singletonList((Listener) provider); + } + + return createListenerAdapters(provider); + + } + + /** + * Creates a list of adapters for the given object, based on the legacy + * listener interfaces it implements. + * + * @param provider + * An object that implements zero or more legacy listener interfaces. + * + * @return + * The list of listeners represented by the given provider class. + */ + @SuppressWarnings("deprecation") + private static List createListenerAdapters(Object provider) { + + final List listeners = new ArrayList(); + + if (provider instanceof AuthenticationSuccessListener) { + listeners.add(new AuthenticationSuccessListenerAdapter( + (AuthenticationSuccessListener) provider)); + } + + if (provider instanceof AuthenticationFailureListener) { + listeners.add(new AuthenticationFailureListenerAdapter( + (AuthenticationFailureListener) provider)); + } + + if (provider instanceof TunnelConnectListener) { + listeners.add(new TunnelConnectListenerAdapter( + (TunnelConnectListener) provider)); + } + + if (provider instanceof TunnelCloseListener) { + listeners.add(new TunnelCloseListenerAdapter( + (TunnelCloseListener) provider)); + } + + return listeners; + + } + + /** + * An adapter the allows an AuthenticationSuccessListener to be used + * as an ordinary Listener. + */ + @SuppressWarnings("deprecation") + private static class AuthenticationSuccessListenerAdapter implements Listener { + + /** + * The delegate listener for this adapter. + */ + private final AuthenticationSuccessListener delegate; + + /** + * Constructs a new adapter that delivers events to the given delegate. + * + * @param delegate + * The delegate listener. + */ + AuthenticationSuccessListenerAdapter(AuthenticationSuccessListener delegate) { + this.delegate = delegate; + } + + /** + * Handles an AuthenticationSuccessEvent by passing the event to the delegate + * listener. If the delegate returns false, the adapter throws a GuacamoleException + * to veto the authentication success event. All other event types are ignored. + * + * @param event + * An object that describes the event that occurred. + * + * @throws GuacamoleException + * If thrown by the delegate listener. + */ + @Override + public void handleEvent(Object event) throws GuacamoleException { + if (event instanceof AuthenticationSuccessEvent) { + if (!delegate.authenticationSucceeded((AuthenticationSuccessEvent) event)) { + throw new GuacamoleSecurityException( + "listener vetoed successful authentication"); + } + } + } + + } + + /** + * An adapter the allows an AuthenticationFailureListener to be used + * as an ordinary Listener. + */ + @SuppressWarnings("deprecation") + private static class AuthenticationFailureListenerAdapter implements Listener { + + /** + * The delegate listener for this adapter. + */ + private final AuthenticationFailureListener delegate; + + /** + * Constructs a new adapter that delivers events to the given delegate. + * + * @param delegate + * The delegate listener. + */ + AuthenticationFailureListenerAdapter(AuthenticationFailureListener delegate) { + this.delegate = delegate; + } + + /** + * Handles an AuthenticationFailureEvent by passing the event to the delegate + * listener. All other event types are ignored. + * + * @param event + * An object that describes the event that occurred. + * + * @throws GuacamoleException + * If thrown by the delegate listener. + */ + @Override + public void handleEvent(Object event) throws GuacamoleException { + if (event instanceof AuthenticationFailureEvent) { + delegate.authenticationFailed((AuthenticationFailureEvent) event); + } + } + + } + + /** + * An adapter the allows a TunnelConnectListener to be used as an ordinary + * Listener. + */ + @SuppressWarnings("deprecation") + private static class TunnelConnectListenerAdapter implements Listener { + + /** + * The delegate listener for this adapter. + */ + private final TunnelConnectListener delegate; + + /** + * Constructs a new adapter that delivers events to the given delegate. + * + * @param delegate + * The delegate listener. + */ + TunnelConnectListenerAdapter(TunnelConnectListener delegate) { + this.delegate = delegate; + } + + /** + * Handles a TunnelConnectEvent by passing the event to the delegate listener. + * If the delegate returns false, the adapter throws a GuacamoleException + * to veto the tunnel connect event. All other event types are ignored. + * + * @param event + * An object that describes the event that occurred. + * + * @throws GuacamoleException + * If thrown by the delegate listener. + */ + @Override + public void handleEvent(Object event) throws GuacamoleException { + if (event instanceof TunnelConnectEvent) { + if (!delegate.tunnelConnected((TunnelConnectEvent) event)) { + throw new GuacamoleException("listener vetoed tunnel connection"); + } + } + } + + } + + /** + * An adapter the allows a TunnelCloseListener to be used as an ordinary + * Listener. + */ + @SuppressWarnings("deprecation") + private static class TunnelCloseListenerAdapter implements Listener { + + /** + * The delegate listener for this adapter. + */ + private final TunnelCloseListener delegate; + + /** + * Constructs a new adapter that delivers events to the given delegate. + * + * @param delegate + * The delegate listener. + */ + TunnelCloseListenerAdapter(TunnelCloseListener delegate) { + this.delegate = delegate; + } + + /** + * Handles a TunnelCloseEvent by passing the event to the delegate listener. + * If the delegate returns false, the adapter throws a GuacamoleException + * to veto the tunnel connect event. All other event types are ignored. + * + * @param event + * An object that describes the event that occurred. + * + * @throws GuacamoleException + * If thrown by the delegate listener. + */ + @Override + public void handleEvent(Object event) throws GuacamoleException { + if (event instanceof TunnelCloseEvent) { + if (!delegate.tunnelClosed((TunnelCloseEvent) event)) { + throw new GuacamoleException("listener vetoed tunnel close request"); + } + } + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/PatchResourceService.java b/guacamole/src/main/java/org/apache/guacamole/extension/PatchResourceService.java new file mode 100644 index 0000000..03791ef --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/PatchResourceService.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.apache.guacamole.resource.Resource; + +/** + * Service which provides access to all HTML patches as resources, and allows + * other patch resources to be added. + */ +public class PatchResourceService { + + /** + * A list of all HTML patch resources currently defined, in the order they + * should be applied. + */ + private final List resources = new ArrayList(); + + /** + * Adds the given HTML patch resource such that it will apply to the + * Guacamole UI. The patch will be applied by the JavaScript side of the + * web application in the order that addPatchResource() is invoked. + * + * @param resource + * The HTML patch resource to add. This resource must have the mimetype + * "text/html". + */ + public void addPatchResource(Resource resource) { + resources.add(resource); + } + + /** + * Adds the given HTML patch resources such that they will apply to the + * Guacamole UI. The patches will be applied by the JavaScript side of the + * web application in the order provided. + * + * @param resources + * The HTML patch resources to add. Each resource must have the + * mimetype "text/html". + */ + public void addPatchResources(Collection resources) { + for (Resource resource : resources) + addPatchResource(resource); + } + + /** + * Returns a list of all HTML patches currently associated with this + * service, in the order they should be applied. The returned list cannot + * be modified. + * + * @return + * A list of all HTML patches currently associated with this service. + */ + public List getPatchResources() { + return Collections.unmodifiableList(resources); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java b/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java new file mode 100644 index 0000000..01fda57 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.extension; + +import org.apache.guacamole.GuacamoleException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; + +/** + * A utility for creating provider instances and logging unexpected outcomes + * with sufficient detail to allow debugging. + */ +class ProviderFactory { + + /** + * Logger used to log unexpected outcomes. + */ + private static final Logger logger = LoggerFactory.getLogger(ProviderFactory.class); + + /** + * Creates an instance of the specified provider class using the no-arg constructor. + * + * @param typeName + * The provider type name used for log messages; e.g. "authentication provider". + * + * @param providerClass + * The provider class to instantiate. + * + * @param + * The provider type. + * + * @return + * A provider instance or null if no instance was created due to error. + */ + static T newInstance(String typeName, Class providerClass) { + T instance = null; + + try { + // Attempt to instantiate the provider + instance = providerClass.getConstructor().newInstance(); + } + catch (NoSuchMethodException e) { + logger.error("The {} extension in use is not properly defined. " + + "Please contact the developers of the extension or, if you " + + "are the developer, turn on debug-level logging.", typeName); + logger.debug("{} is missing a default constructor.", + providerClass.getName(), e); + } + catch (SecurityException e) { + logger.error("The Java security manager is preventing extensions " + + "from being loaded. Please check the configuration of Java or your " + + "servlet container."); + logger.debug("Creation of {} disallowed by security manager.", + providerClass.getName(), e); + } + catch (InstantiationException e) { + logger.error("The {} extension in use is not properly defined. " + + "Please contact the developers of the extension or, if you " + + "are the developer, turn on debug-level logging.", typeName); + logger.debug("{} cannot be instantiated.", providerClass.getName(), e); + } + catch (IllegalAccessException e) { + logger.error("The {} extension in use is not properly defined. " + + "Please contact the developers of the extension or, if you " + + "are the developer, turn on debug-level logging."); + logger.debug("Default constructor of {} is not public.", typeName, e); + } + catch (IllegalArgumentException e) { + logger.error("The {} extension in use is not properly defined. " + + "Please contact the developers of the extension or, if you " + + "are the developer, turn on debug-level logging.", typeName); + logger.debug("Default constructor of {} cannot accept zero arguments.", + providerClass.getName(), e); + } + catch (InvocationTargetException e) { + // Obtain causing error - create relatively-informative stub error if cause is unknown + Throwable cause = e.getCause(); + if (cause == null) + cause = new GuacamoleException("Error encountered during initialization."); + + logger.error("{} extension failed to start: {}", typeName, cause.getMessage()); + logger.debug("{} instantiation failed.", providerClass.getName(), e); + } + + return instance; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/package-info.java b/guacamole/src/main/java/org/apache/guacamole/extension/package-info.java new file mode 100644 index 0000000..1d40ffd --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/extension/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which represent and facilitate the loading of extensions to the + * Guacamole web application. + */ +package org.apache.guacamole.extension; diff --git a/guacamole/src/main/java/org/apache/guacamole/log/LogLevel.java b/guacamole/src/main/java/org/apache/guacamole/log/LogLevel.java new file mode 100644 index 0000000..27bf0fe --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/log/LogLevel.java @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.log; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import org.apache.guacamole.properties.EnumGuacamoleProperty.PropertyValue; + +/** + * All log levels supported by the Apache Guacamole web application. Each log + * level describes a different level of verbosity for the log messages included + * in web application logs. + */ +public enum LogLevel { + + /** + * Errors that are fatal in the context of the operation being logged. + */ + @PropertyValue("error") + ERROR("error"), + + /** + * Non-fatal conditions that may indicate the presence of a problem. + */ + @PropertyValue("warning") + @PropertyValue("warn") + WARNING("warning"), + + /** + * Informational messages of general interest to users or administrators. + */ + @PropertyValue("info") + INFO("info"), + + /** + * Informational messages that are useful for debugging, but are generally + * not useful to users or administrators. It is expected that debug-level + * messages, while verbose, will not affect performance. + */ + @PropertyValue("debug") + DEBUG("debug"), + + /** + * Informational messages that may be useful for debugging, but which are + * so low-level that they may affect performance. + */ + @PropertyValue("trace") + TRACE("trace"); + + /** + * Format string whose sole format argument is a String containing the + * name of the log level. As this configuration will be fed to Logback, the + * name used must be a name acceptable by Logback. + */ + private static final String LOGBACK_XML_TEMPLATE = + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " %%d{HH:mm:ss.SSS} [%%thread] %%-5level %%logger{36} - %%msg%%n\n" + + " \n" + + " \n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n" + + "\n"; + + /** + * The name that should be used to refer to this log level in the context + * of configuring Guacamole. This name should be both descriptive and + * acceptable as the value of the "log-level" property. + */ + private final String canonicalName; + + /** + * The raw contents of the "logback.xml" that configures Logback to log + * messages at this level, encoded as UTF-8. + */ + private final byte[] logbackConfig; + + /** + * Creates a new LogLevel with the given names. The pair of names provided + * correspond to the name used within Guacamole's configuration and the + * name used within Logback's configuration. + * + * @param canonicalName + * The name that should be used for this log level when configuring + * Guacamole to log at this level using the "log-level" property. + * + * @param logbackLogLevel + * The name that would be provided to Logback to log at this level if + * manually configuring Logback using "logback.xml". + */ + private LogLevel(String canonicalName, String logbackLogLevel) { + this.canonicalName = canonicalName; + this.logbackConfig = String.format(LOGBACK_XML_TEMPLATE, logbackLogLevel).getBytes(StandardCharsets.UTF_8); + } + + /** + * Creates a new LogLevel with the given name. The provided name corresponds + * to both the name used within Guacamole's configuration and the name used + * within Logback's configuration. + * + * @param logLevel + * The name that should be used for this log level when configuring + * Guacamole to log at this level using the "log-level" property AND + * when manually configuring Logback to log at this level using a + * "logback.xml" configuration file. + */ + private LogLevel(String logLevel) { + this(logLevel, logLevel); + } + + /** + * Returns a name that may be used to refer to this log level when + * configuring Guacamole using the "log-level" property. + * + * @return + * A name that may be used to refer to this log level when + * configuring Guacamole using the "log-level" property. + */ + public String getCanonicalName() { + return canonicalName; + } + + /** + * Returns a new InputStream that streams the contents of an XML + * configuration file that can be provided to Logback to configure logging + * at this log level. + * + * @return + * A a new InputStream that streams the contents of an XML + * configuration file that can be provided to Logback to configure + * logging at this log level. + */ + public InputStream getLogbackConfiguration() { + return new ByteArrayInputStream(logbackConfig); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/log/LogModule.java b/guacamole/src/main/java/org/apache/guacamole/log/LogModule.java new file mode 100644 index 0000000..a9e4ac3 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/log/LogModule.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.log; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.util.StatusPrinter; +import com.google.inject.AbstractModule; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.EnumGuacamoleProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Initializes the logging subsystem. + */ +public class LogModule extends AbstractModule { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(LogModule.class); + + /** + * The Guacamole server environment. + */ + private final Environment environment; + + /** + * Property that specifies the highest level of verbosity that Guacamole + * should use for the messages in its logs. + */ + private static final EnumGuacamoleProperty LOG_LEVEL = new EnumGuacamoleProperty(LogLevel.class) { + + @Override + public String getName() { + return "log-level"; + } + + }; + + /** + * Creates a new LogModule which uses the given environment to determine + * the logging configuration. + * + * @param environment + * The environment to use when configuring logging. + */ + public LogModule(Environment environment) { + this.environment = environment; + } + + /** + * Returns an InputStream that streams the contents of the "logback.xml" + * file that Logback should read to configure logging to Guacamole. If the + * user provided their own "logback.xml" within GUACAMOLE_HOME, this will + * be an InputStream that reads the contents of that file. The required + * "logback.xml" will otherwise be dynamically generated based on the value + * of the "log-level" property. + * + * @return + * An InputStream that streams the contents of the "logback.xml" file + * that Logback should read to configure logging to Guacamole. + */ + private InputStream getLogbackConfiguration() { + + // Check for custom logback.xml + File logbackFile = new File(environment.getGuacamoleHome(), "logback.xml"); + if (logbackFile.exists()) { + try { + logger.info("Loading logback configuration from \"{}\".", logbackFile); + return new FileInputStream(logbackFile); + } + catch (FileNotFoundException e) { + logger.info("Logback configuration could not be read " + + "from \"{}\": {}", logbackFile, e.getMessage()); + } + } + + // Default to generating an internal logback.xml based on a simple + // "log-level" property + LogLevel level; + try { + level = environment.getProperty(LOG_LEVEL, LogLevel.INFO); + logger.info("Logging will be at the \"{}\" level.", level.getCanonicalName()); + } + catch (GuacamoleException e) { + level = LogLevel.INFO; + logger.error("Falling back to \"{}\" log level: {}", level.getCanonicalName(), e.getMessage()); + } + + return level.getLogbackConfiguration(); + + } + + @Override + protected void configure() { + + try (InputStream logbackConfiguration = getLogbackConfiguration()) { + + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + context.reset(); + + // Initialize logback + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(context); + configurator.doConfigure(logbackConfiguration); + + // Dump any errors that occur during logback init + StatusPrinter.printInCaseOfErrorsOrWarnings(context); + + } + catch (JoranException e) { + logger.error("Initialization of logback failed: {}", e.getMessage()); + logger.debug("Unable to load logback configuration.", e); + } + catch (IOException e) { + logger.warn("Logback configuration file could not be cleanly closed: {}", e.getMessage()); + logger.debug("Failed to close logback configuration file.", e); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/net/auth/Connectable.java b/guacamole/src/main/java/org/apache/guacamole/net/auth/Connectable.java new file mode 100644 index 0000000..e09baa1 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/net/auth/Connectable.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Internal, ABI-compatible version of the Connectable interface from + * guacamole-ext which defines fallback defaults for older versions of the API. + * As this interface will take precedence in the servlet container's + * classloader over the definition from guacamole-ext, this allows backwards + * compatibility with the 1.0.0 API while keeping the actual API definition + * within guacamole-ext strict. + * + *

      For this to work, this interface definition MUST be 100% + * ABI-compatible with the Connectable interface defined by guacamole-ext in + * 1.0.0 and onward. + */ +public interface Connectable { + + /** + * Establishes a connection to guacd using the information associated with + * this object. The connection will be provided the given client + * information. + * + *

      This definition is the legacy connect() definition from 1.0.0 and + * older. It is redefined here for the sake of ABI compatibility with + * 1.0.0 but is deprecated within guacamole-ext. + * + * @deprecated + * This definition exists solely for binary compatibility. It should + * never be used by new code. New implementations should instead use + * the current version of connect() as defined by guacamole-ext. + * + * @param info + * Information associated with the connecting client. + * + * @return + * A fully-established GuacamoleTunnel. + * + * @throws GuacamoleException + * If an error occurs while connecting to guacd, or if permission to + * connect is denied. + */ + @Deprecated + default GuacamoleTunnel connect(GuacamoleClientInformation info) + throws GuacamoleException { + + // Pass through usages of the old API to the new API + return this.connect(info, Collections.emptyMap()); + + } + + /** + * {@inheritDoc} + * + *

      This definition is the current version of connect() as defined by + * guacamole-ext. + * + *

      A default implementation which invokes the old, deprecated + * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation)} + * is provided solely for compatibility with extensions which implement only + * the old version of this function. This default implementation is useful + * only for extensions relying on the older API and will be removed when + * support for that version of the API is removed. + * + * @see + * The definition of getActiveConnections() in the current version of + * the Connectable interface, as defined by guacamole-ext. + */ + default GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + + // Allow old implementations of Connectable to continue to work + return this.connect(info); + + } + + /** + * {@inheritDoc} + * + * @see + * The definition of getActiveConnections() in the current version of + * the Connectable interface, as defined by guacamole-ext. + */ + int getActiveConnections(); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/package-info.java b/guacamole/src/main/java/org/apache/guacamole/package-info.java new file mode 100644 index 0000000..a1284f9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes specific to the general-purpose web application implemented by + * the Guacamole project using the Guacamole APIs. + */ +package org.apache.guacamole; + diff --git a/guacamole/src/main/java/org/apache/guacamole/properties/StringSetProperty.java b/guacamole/src/main/java/org/apache/guacamole/properties/StringSetProperty.java new file mode 100644 index 0000000..1478184 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/properties/StringSetProperty.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.properties; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.properties.GuacamoleProperty; + +/** + * A GuacamoleProperty whose value is a Set of unique Strings. The string value + * parsed to produce this set is a comma-delimited list. Duplicate values are + * ignored, as is any whitespace following delimiters. To maintain + * compatibility with the behavior of Java properties in general, only + * whitespace at the beginning of each value is ignored; trailing whitespace + * becomes part of the value. + */ +public abstract class StringSetProperty implements GuacamoleProperty> { + + /** + * A pattern which matches against the delimiters between values. This is + * currently simply a comma and any following whitespace. Parts of the + * input string which match this pattern will not be included in the parsed + * result. + */ + private static final Pattern DELIMITER_PATTERN = Pattern.compile(",\\s*"); + + @Override + public Set parseValue(String values) throws GuacamoleException { + + // If no property provided, return null. + if (values == null) + return null; + + // Split string into a set of individual values + List valueList = Arrays.asList(DELIMITER_PATTERN.split(values)); + return new HashSet(valueList); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/properties/package-info.java b/guacamole/src/main/java/org/apache/guacamole/properties/package-info.java new file mode 100644 index 0000000..5506ebe --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/properties/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the properties which the Guacamole web application + * (and stock parts of it) read from guacamole.properties. + */ +package org.apache.guacamole.properties; + diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/AbstractResource.java b/guacamole/src/main/java/org/apache/guacamole/resource/AbstractResource.java new file mode 100644 index 0000000..194dc3e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/AbstractResource.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +/** + * Base abstract resource implementation which provides an associated mimetype, + * and modification time. Classes which extend AbstractResource must provide + * their own InputStream, however. + */ +public abstract class AbstractResource implements Resource { + + /** + * The mimetype of this resource. + */ + private final String mimetype; + + /** + * The time this resource was last modified, in milliseconds since midnight + * of January 1, 1970 UTC. + */ + private final long lastModified; + + /** + * Initializes this AbstractResource with the given mimetype and + * modification time. + * + * @param mimetype + * The mimetype of this resource. + * + * @param lastModified + * The time this resource was last modified, in milliseconds since + * midnight of January 1, 1970 UTC. + */ + public AbstractResource(String mimetype, long lastModified) { + this.mimetype = mimetype; + this.lastModified = lastModified; + } + + /** + * Initializes this AbstractResource with the given mimetype. The + * modification time of the resource is set to the current system time. + * + * @param mimetype + * The mimetype of this resource. + */ + public AbstractResource(String mimetype) { + this(mimetype, System.currentTimeMillis()); + } + + @Override + public long getLastModified() { + return lastModified; + } + + @Override + public String getMimeType() { + return mimetype; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/ByteArrayResource.java b/guacamole/src/main/java/org/apache/guacamole/resource/ByteArrayResource.java new file mode 100644 index 0000000..712285b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/ByteArrayResource.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * A resource which contains a defined byte array. + */ +public class ByteArrayResource extends AbstractResource { + + /** + * The bytes contained by this resource. + */ + private final byte[] bytes; + + /** + * Creates a new ByteArrayResource which provides access to the given byte + * array. Changes to the given byte array will affect this resource even + * after the resource is created. Changing the byte array while an input + * stream from this resource is in use has undefined behavior. + * + * @param mimetype + * The mimetype of the resource. + * + * @param bytes + * The bytes that this resource should contain. + */ + public ByteArrayResource(String mimetype, byte[] bytes) { + super(mimetype); + this.bytes = bytes; + } + + @Override + public InputStream asStream() { + return new ByteArrayInputStream(bytes); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/ClassPathResource.java b/guacamole/src/main/java/org/apache/guacamole/resource/ClassPathResource.java new file mode 100644 index 0000000..bd53522 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/ClassPathResource.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +import java.io.InputStream; + +/** + * A resource which is located within the classpath of an arbitrary + * ClassLoader. + */ +public class ClassPathResource extends AbstractResource { + + /** + * The classloader to use when reading this resource. + */ + private final ClassLoader classLoader; + + /** + * The path of this resource relative to the classloader. + */ + private final String path; + + /** + * Creates a new ClassPathResource which uses the given ClassLoader to + * read the resource having the given path. + * + * @param classLoader + * The ClassLoader to use when reading the resource. + * + * @param mimetype + * The mimetype of the resource. + * + * @param path + * The path of the resource relative to the given ClassLoader. + */ + public ClassPathResource(ClassLoader classLoader, String mimetype, String path) { + super(mimetype); + this.classLoader = classLoader; + this.path = path; + } + + /** + * Creates a new ClassPathResource which uses the ClassLoader associated + * with the ClassPathResource class to read the resource having the given + * path. + * + * @param mimetype + * The mimetype of the resource. + * + * @param path + * The path of the resource relative to the ClassLoader associated + * with the ClassPathResource class. + */ + public ClassPathResource(String mimetype, String path) { + this(ClassPathResource.class.getClassLoader(), mimetype, path); + } + + @Override + public InputStream asStream() { + return classLoader.getResourceAsStream(path); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/Resource.java b/guacamole/src/main/java/org/apache/guacamole/resource/Resource.java new file mode 100644 index 0000000..3643483 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/Resource.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +import java.io.InputStream; + +/** + * An arbitrary resource that can be served to a user via HTTP. Resources are + * anonymous but have a defined mimetype and corresponding input stream. + */ +public interface Resource { + + /** + * Returns the mimetype of this resource. This function MUST always return + * a value. If the type is unknown, return "application/octet-stream". + * + * @return + * The mimetype of this resource. + */ + String getMimeType(); + + /** + * Returns the time the resource was last modified in milliseconds since + * midnight of January 1, 1970 UTC. + * + * @return + * The time the resource was last modified, in milliseconds. + */ + long getLastModified(); + + /** + * Returns an InputStream which reads the contents of this resource, + * starting with the first byte. Reading from the returned InputStream will + * not affect reads from other InputStreams returned by other calls to + * asStream(). The returned InputStream must be manually closed when no + * longer needed. If the resource is unexpectedly unavailable, this will + * return null. + * + * @return + * An InputStream which reads the contents of this resource, starting + * with the first byte, or null if the resource is unavailable. + */ + InputStream asStream(); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/ResourceServlet.java b/guacamole/src/main/java/org/apache/guacamole/resource/ResourceServlet.java new file mode 100644 index 0000000..c61687e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/ResourceServlet.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Servlet which serves a given resource for all HTTP GET requests. The HEAD + * method is correctly supported, and HTTP 304 ("Not Modified") responses will + * be properly returned for GET requests depending on the last time the + * resource was modified. + */ +public class ResourceServlet extends HttpServlet { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ResourceServlet.class); + + /** + * The size of the buffer to use when transferring data from the input + * stream of a resource to the output stream of a request. + */ + private static final int BUFFER_SIZE = 10240; + + /** + * The resource to serve for every GET request. + */ + private final Resource resource; + + /** + * Creates a new ResourceServlet which serves the given Resource for all + * HTTP GET requests. + * + * @param resource + * The Resource to serve. + */ + public ResourceServlet(Resource resource) { + this.resource = resource; + } + + @Override + protected void doHead(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // Request that the browser revalidate cached data + response.addHeader("Cache-Control", "no-cache"); + response.addHeader("Pragma", "no-cache"); + + // Set last modified and content type headers + response.addDateHeader("Last-Modified", resource.getLastModified()); + response.setContentType(resource.getMimeType()); + + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // Get input stream from resource + InputStream input = resource.asStream(); + + // If resource does not exist, return not found + if (input == null) { + logger.debug("Resource does not exist: \"{}\"", request.getServletPath()); + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + try { + + // Write headers + doHead(request, response); + + // If not modified since "If-Modified-Since" header, return not modified + long ifModifiedSince = request.getDateHeader("If-Modified-Since"); + if (resource.getLastModified() - ifModifiedSince < 1000) { + logger.debug("Resource not modified: \"{}\"", request.getServletPath()); + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + return; + } + + int length; + byte[] buffer = new byte[BUFFER_SIZE]; + + // Write resource to response body + OutputStream output = response.getOutputStream(); + while ((length = input.read(buffer)) != -1) + output.write(buffer, 0, length); + + } + + // Ensure input stream is always closed + finally { + input.close(); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/SequenceResource.java b/guacamole/src/main/java/org/apache/guacamole/resource/SequenceResource.java new file mode 100644 index 0000000..6f0a7d6 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/SequenceResource.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +import java.io.InputStream; +import java.io.SequenceInputStream; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Iterator; + +/** + * A resource which is the logical concatenation of other resources. + */ +public class SequenceResource extends AbstractResource { + + /** + * The resources to be concatenated. + */ + private final Iterable resources; + + /** + * Returns the mimetype of the first resource in the given Iterable, or + * "application/octet-stream" if no resources are provided. + * + * @param resources + * The resources from which the mimetype should be retrieved. + * + * @return + * The mimetype of the first resource, or "application/octet-stream" + * if no resources were provided. + */ + private static String getMimeType(Iterable resources) { + + // If no resources, just assume application/octet-stream + Iterator resourceIterator = resources.iterator(); + if (!resourceIterator.hasNext()) + return "application/octet-stream"; + + // Return mimetype of first resource + return resourceIterator.next().getMimeType(); + + } + + /** + * Creates a new SequenceResource as the logical concatenation of the + * given resources. Each resource is concatenated in iteration order as + * needed when reading from the input stream of the SequenceResource. + * + * @param mimetype + * The mimetype of the resource. + * + * @param resources + * The resources to concatenate within the InputStream of this + * SequenceResource. + */ + public SequenceResource(String mimetype, Iterable resources) { + super(mimetype); + this.resources = resources; + } + + /** + * Creates a new SequenceResource as the logical concatenation of the + * given resources. Each resource is concatenated in iteration order as + * needed when reading from the input stream of the SequenceResource. The + * mimetype of the resulting concatenation is derived from the first + * resource. + * + * @param resources + * The resources to concatenate within the InputStream of this + * SequenceResource. + */ + public SequenceResource(Iterable resources) { + super(getMimeType(resources)); + this.resources = resources; + } + + /** + * Creates a new SequenceResource as the logical concatenation of the + * given resources. Each resource is concatenated in iteration order as + * needed when reading from the input stream of the SequenceResource. + * + * @param mimetype + * The mimetype of the resource. + * + * @param resources + * The resources to concatenate within the InputStream of this + * SequenceResource. + */ + public SequenceResource(String mimetype, Resource... resources) { + this(mimetype, Arrays.asList(resources)); + } + + /** + * Creates a new SequenceResource as the logical concatenation of the + * given resources. Each resource is concatenated in iteration order as + * needed when reading from the input stream of the SequenceResource. The + * mimetype of the resulting concatenation is derived from the first + * resource. + * + * @param resources + * The resources to concatenate within the InputStream of this + * SequenceResource. + */ + public SequenceResource(Resource... resources) { + this(Arrays.asList(resources)); + } + + @Override + public InputStream asStream() { + return new SequenceInputStream(new Enumeration() { + + /** + * Iterator over all resources associated with this + * SequenceResource. + */ + private final Iterator resourceIterator = resources.iterator(); + + @Override + public boolean hasMoreElements() { + return resourceIterator.hasNext(); + } + + @Override + public InputStream nextElement() { + return resourceIterator.next().asStream(); + } + + }); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/WebApplicationResource.java b/guacamole/src/main/java/org/apache/guacamole/resource/WebApplicationResource.java new file mode 100644 index 0000000..bf38521 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/WebApplicationResource.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.resource; + +import java.io.InputStream; +import javax.servlet.ServletContext; + +/** + * A resource which is located within the classpath associated with another + * class. + */ +public class WebApplicationResource extends AbstractResource { + + /** + * The servlet context to use when reading the resource and, if necessary, + * when determining the mimetype of the resource. + */ + private final ServletContext context; + + /** + * The path of this resource relative to the ServletContext. + */ + private final String path; + + /** + * Derives a mimetype from the filename within the given path using the + * given ServletContext, if possible. + * + * @param context + * The ServletContext to use to derive the mimetype. + * + * @param path + * The path to derive the mimetype from. + * + * @return + * An appropriate mimetype based on the name of the file in the path, + * or "application/octet-stream" if no mimetype could be determined. + */ + private static String getMimeType(ServletContext context, String path) { + + // If mimetype is known, use defined mimetype + String mimetype = context.getMimeType(path); + if (mimetype != null) + return mimetype; + + // Otherwise, default to application/octet-stream + return "application/octet-stream"; + + } + + /** + * Creates a new WebApplicationResource which serves the resource at the + * given path relative to the given ServletContext. Rather than deriving + * the mimetype of the resource from the filename within the path, the + * mimetype given is used. + * + * @param context + * The ServletContext to use when reading the resource. + * + * @param mimetype + * The mimetype of the resource. + * + * @param path + * The path of the resource relative to the given ServletContext. + */ + public WebApplicationResource(ServletContext context, String mimetype, String path) { + super(mimetype); + this.context = context; + this.path = path; + } + + /** + * Creates a new WebApplicationResource which serves the resource at the + * given path relative to the given ServletContext. The mimetype of the + * resource is automatically determined based on the filename within the + * path. + * + * @param context + * The ServletContext to use when reading the resource and deriving the + * mimetype. + * + * @param path + * The path of the resource relative to the given ServletContext. + */ + public WebApplicationResource(ServletContext context, String path) { + this(context, getMimeType(context, path), path); + } + + @Override + public InputStream asStream() { + return context.getResourceAsStream(path); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/resource/package-info.java b/guacamole/src/main/java/org/apache/guacamole/resource/package-info.java new file mode 100644 index 0000000..287e3df --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/resource/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which describe and provide access to arbitrary resources, such as + * the contents of the classpath of a classloader, or files within the web + * application itself. + */ +package org.apache.guacamole.resource; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/APIError.java b/guacamole/src/main/java/org/apache/guacamole/rest/APIError.java new file mode 100644 index 0000000..b4ee59f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/APIError.java @@ -0,0 +1,293 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.language.Translatable; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.credentials.GuacamoleCredentialsException; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.rest.jsonpatch.APIPatchFailureException; +import org.apache.guacamole.rest.jsonpatch.APIPatchOutcome; +import org.apache.guacamole.tunnel.GuacamoleStreamException; + +/** + * Describes an error that occurred within a REST endpoint. + */ +public class APIError { + + /** + * The translation key of the generic translation string which should be + * used to display arbitrary messages which otherwise have no translation + * string. + */ + private static final String UNTRANSLATED_MESSAGE_KEY = "APP.TEXT_UNTRANSLATED"; + + /** + * The name of the placeholder within the translation string associated with + * UNTRANSLATED_MESSAGE_KEY that should receive the raw, untranslated text. + */ + private static final String UNTRANSLATED_MESSAGE_VARIABLE_NAME = "MESSAGE"; + + /** + * The human-readable error message. + */ + private final String message; + + /** + * A translatable message representing the error that occurred. + */ + private final TranslatableMessage translatableMessage; + + /** + * The associated Guacamole protocol status code. + */ + private final Integer statusCode; + + /** + * All expected request parameters, if any, as a collection of fields. + */ + private final Collection expected; + + /** + * The outcome of each patch in the associated request, if this was a + * JSON Patch request. Otherwise null. + */ + private List patches = null; + + /** + * The type of error that occurred. + */ + private final Type type; + + /** + * All possible types of REST API errors. + */ + public enum Type { + + /** + * The requested operation could not be performed because the request + * itself was malformed. + */ + BAD_REQUEST, + + /** + * The credentials provided were invalid. + */ + INVALID_CREDENTIALS, + + /** + * The credentials provided were not necessarily invalid, but were not + * sufficient to determine validity. + */ + INSUFFICIENT_CREDENTIALS, + + /** + * An internal server error has occurred. + */ + INTERNAL_ERROR, + + /** + * An object related to the request does not exist. + */ + NOT_FOUND, + + /** + * Permission was denied to perform the requested operation. + */ + PERMISSION_DENIED, + + /** + * An error occurred within an intercepted stream, terminating that + * stream. The Guacamole protocol status code of that error can be + * retrieved with getStatusCode(). + */ + STREAM_ERROR; + + /** + * Returns the REST API error type which corresponds to the type of the + * given exception. + * + * @param exception + * The exception to use to derive the API error type. + * + * @return + * The API error type which corresponds to the type of the given + * exception. + */ + public static Type fromGuacamoleException(GuacamoleException exception) { + + // Additional credentials are needed + if (exception instanceof GuacamoleInsufficientCredentialsException) + return INSUFFICIENT_CREDENTIALS; + + // The provided credentials are wrong + if (exception instanceof GuacamoleInvalidCredentialsException) + return INVALID_CREDENTIALS; + + // Generic permission denied + if (exception instanceof GuacamoleSecurityException) + return PERMISSION_DENIED; + + // Arbitrary resource not found + if (exception instanceof GuacamoleResourceNotFoundException) + return NOT_FOUND; + + // Arbitrary bad requests + if (exception instanceof GuacamoleClientException) + return BAD_REQUEST; + + // Errors from intercepted streams + if (exception instanceof GuacamoleStreamException) + return STREAM_ERROR; + + // All other errors + return INTERNAL_ERROR; + + } + + } + + /** + * Creates a new APIError which exposes the details of the given + * GuacamoleException. If the given GuacamoleException implements + * Translatable, then its translation string and values will be exposed as + * well. + * + * @param exception + * The GuacamoleException from which the details of the new APIError + * should be derived. + */ + public APIError(GuacamoleException exception) { + + // Build base REST service error + this.type = Type.fromGuacamoleException(exception); + this.message = exception.getMessage(); + + // Add expected credentials if applicable + if (exception instanceof GuacamoleCredentialsException) { + GuacamoleCredentialsException credentialsException = (GuacamoleCredentialsException) exception; + this.expected = credentialsException.getCredentialsInfo().getFields(); + } + else + this.expected = null; + + // Add stream status code if applicable + if (exception instanceof GuacamoleStreamException) { + GuacamoleStreamException streamException = (GuacamoleStreamException) exception; + this.statusCode = streamException.getStatus().getGuacamoleStatusCode(); + } + else + this.statusCode = null; + + // Pull translatable message and values if available + if (exception instanceof Translatable) { + Translatable translatable = (Translatable) exception; + this.translatableMessage = translatable.getTranslatableMessage(); + } + + // Use generic translation string if message is not translated + else + this.translatableMessage = new TranslatableMessage(UNTRANSLATED_MESSAGE_KEY, + Collections.singletonMap(UNTRANSLATED_MESSAGE_VARIABLE_NAME, this.message)); + + if (exception instanceof APIPatchFailureException) + this.patches = ((APIPatchFailureException) exception).getPatches(); + + } + + /** + * Returns the type of error that occurred. + * + * @return + * The type of error that occurred. + */ + public Type getType() { + return type; + } + + /** + * Returns the Guacamole protocol status code associated with the error + * that occurred. This is only valid for errors of type STREAM_ERROR. + * + * @return + * The Guacamole protocol status code associated with the error that + * occurred. If the error is not of type STREAM_ERROR, this will be + * null. + */ + public Integer getStatusCode() { + return statusCode; + } + + /** + * Returns a collection of all required parameters, where each parameter is + * represented by a field. + * + * @return + * A collection of all required parameters. + */ + public Collection getExpected() { + return expected; + } + + /** + * Return the outcome for every patch in the request, if the request was + * a JSON patch request. Otherwise, null. + * + * @return + * The outcome for every patch if responding to a JSON Patch request, + * otherwise null. + */ + public List getPatches() { + return patches; + } + + /** + * Returns a human-readable error message describing the error that + * occurred. + * + * @return + * A human-readable error message. + */ + public String getMessage() { + return message; + } + + /** + * Returns a translatable message describing the error that occurred. If no + * translatable message is associated with the error, this will be null. + * + * @return + * A translatable message describing the error that occurred, or null + * if there is no such message defined. + */ + public TranslatableMessage getTranslatableMessage() { + return translatableMessage; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/APIException.java b/guacamole/src/main/java/org/apache/guacamole/rest/APIException.java new file mode 100644 index 0000000..e37b106 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/APIException.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.apache.guacamole.GuacamoleException; + +/** + * An exception which exposes a given error within the API layer. When thrown + * within the context of the REST API, an appropriate HTTP status code will be + * set for the failing response, and the details of the error will be exposed in + * the body of the response as an APIError structure. + */ +public class APIException extends WebApplicationException { + + /** + * Construct a new APIException based on the given GuacamoleException. The + * details of the GuacamoleException relevant to the REST API will be + * exposed via an APIError. + * + * @param exception + * The GuacamoleException that occurred. + */ + public APIException(GuacamoleException exception) { + super(Response.status(exception.getHttpStatusCode()) + .type(MediaType.APPLICATION_JSON) + .entity(new APIError(exception)) + .build()); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java b/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java new file mode 100644 index 0000000..e3a2df4 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.ws.rs.core.MultivaluedMap; + +/** + * Wrapper for HttpServletRequest which uses a given MultivaluedMap to provide + * the values of all request parameters. + */ +public class APIRequest extends HttpServletRequestWrapper { + + /** + * Map of all request parameter names to their corresponding values. + */ + private final Map parameters; + + /** + * The hostname of the client that initiated the request. + */ + private final String remoteHost; + + /** + * The ip address of the client that initiated the request. + */ + private final String remoteAddr; + + /** + * Wraps the given HttpServletRequest, using the given MultivaluedMap to + * provide all request parameters. All HttpServletRequest functions which + * do not deal with parameter names and values are delegated to the wrapped + * request. + * + * @param request + * The HttpServletRequest to wrap. + * + * @param parameters + * All request parameters. + */ + public APIRequest(HttpServletRequest request, + MultivaluedMap parameters) { + + super(request); + + // Grab the remote host info + this.remoteHost = request.getRemoteHost(); + + // Grab the remote ip info + this.remoteAddr = request.getRemoteAddr(); + + // Copy parameters from given MultivaluedMap + this.parameters = new HashMap(parameters.size()); + for (Map.Entry> entry : parameters.entrySet()) { + + // Get parameter name and all corresponding values + String name = entry.getKey(); + List values = entry.getValue(); + + // Add parameters to map + this.parameters.put(name, values.toArray(new String[values.size()])); + + } + + } + + @Override + public String[] getParameterValues(String name) { + return parameters.get(name); + } + + @Override + public Enumeration getParameterNames() { + return Collections.enumeration(parameters.keySet()); + } + + @Override + public Map getParameterMap() { + return Collections.unmodifiableMap(parameters); + } + + @Override + public String getParameter(String name) { + + // If no such parameter exists, just return null + String[] values = getParameterValues(name); + if (values == null) + return null; + + // Otherwise, return first value + return values[0]; + + } + + @Override + public String getRemoteHost() { + return this.remoteHost; + } + + @Override + public String getRemoteAddr() { + return this.remoteAddr; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/LimitedRequestInputStream.java b/guacamole/src/main/java/org/apache/guacamole/rest/LimitedRequestInputStream.java new file mode 100644 index 0000000..840ef19 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/LimitedRequestInputStream.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import java.io.IOException; +import java.io.InputStream; +import org.apache.guacamole.GuacamoleClientOverrunException; + +/** + * InputStream implementation which limits the body of REST API requests to + * a particular maximum size. If an attempt is made to read from a REST API + * request which exceeds this limit, the read attempt will be aborted by + * throwing an APIException. + */ +public class LimitedRequestInputStream extends InputStream { + + /** + * The InputStream being limited. + */ + private final InputStream stream; + + /** + * The maximum number of bytes to allow to be read or skipped. + */ + private final long maxLength; + + /** + * The total number of bytes that have been read or skipped from the stream + * thus far. + */ + private long bytesRead = 0; + + /** + * Wraps the given InputStream, ensuring that the overall number of bytes + * read or skipped does not exceed the given maximum length. + * + * @param stream + * The InputStream to limit. + * + * @param maxLength + * The maximum number of bytes to allow to be read or skipped. + */ + public LimitedRequestInputStream(InputStream stream, long maxLength) { + this.stream = stream; + this.maxLength = maxLength; + } + + /** + * Immediately verifies that the stream length limit has not been exceeded. + * If the length limit has been exceeded, an APIException is thrown + * indicating that the request body is too large. + * + * @throws APIException + * If the length limit has been exceeded. + */ + private synchronized void recheckLength() throws APIException { + if (bytesRead > maxLength) + throw new APIException(new GuacamoleClientOverrunException("Request body/entity too large.")); + } + + /** + * Updates the current number of bytes read based on the return value of a + * read-like operation such as read() or skip(). If the maximum stream + * length is exceeded as a result of the read, an APIException indicating + * this is thrown. + * + * NOTE: To avoid unnecessary read operations, recheckLength() should be + * manually called before performing any read operation. This function will + * perform the same checks, but can inherently only do so AFTER the read + * operation has occurred. + * + * @param change + * The number of bytes that have been read or skipped, or -1 if the + * read-like operation has failed (and no bytes have been read). + * + * @return + * The provided number of bytes read/skipped. + * + * @throws APIException + * If the read-like operation that occurred has caused the stream + * length to exceed its maximum. + */ + private synchronized long limitedRead(long change) throws APIException { + + if (change != -1) { + bytesRead += change; + recheckLength(); + } + + return change; + + } + + @Override + public void close() throws IOException { + stream.close(); + } + + @Override + public int available() throws IOException { + return stream.available(); + } + + @Override + public long skip(long l) throws IOException { + recheckLength(); + return limitedRead(stream.skip(l)); + } + + @Override + public int read(byte[] bytes, int i, int i1) throws IOException { + recheckLength(); + return (int) limitedRead(stream.read(bytes, i, i1)); + } + + @Override + public int read(byte[] bytes) throws IOException { + recheckLength(); + return (int) limitedRead(stream.read(bytes)); + } + + @Override + public int read() throws IOException { + + recheckLength(); + + int value = stream.read(); + if (value != -1) + limitedRead(1); + + return value; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/RESTExceptionMapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/RESTExceptionMapper.java new file mode 100644 index 0000000..ecb99a4 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/RESTExceptionMapper.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnauthorizedException; +import org.apache.guacamole.rest.auth.AuthenticationService; +import org.glassfish.jersey.server.ContainerRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A class that maps GuacamoleExceptions in a way that returns a + * custom response to the user via JSON rather than allowing the default + * web application error handling to take place. + */ +@Provider +@Singleton +public class RESTExceptionMapper implements ExceptionMapper { + + /** + * The logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(RESTExceptionMapper.class); + + /** + * The ContainerRequest representing the HTTP request that resulted in the + * Throwable being intercepted. Despite this class being a Singleton, this + * object will always be scoped with the current request for the Throwable + * that is being processed by this class. + */ + @Context + private ContainerRequest request; + + /** + * The authentication service associated with the currently active session. + */ + @Inject + private AuthenticationService authenticationService; + + @Override + public Response toResponse(Throwable t) { + + // Pass WebApplicationException responses through untouched + if (t instanceof WebApplicationException) + return ((WebApplicationException) t).getResponse(); + + // Ensure any associated session is invalidated if unauthorized + if (t instanceof GuacamoleUnauthorizedException) { + String token = authenticationService.getAuthenticationToken(request); + if (authenticationService.destroyGuacamoleSession(token)) + logger.debug("Implicitly invalidated session for token \"{}\"", token); + } + + // Translate GuacamoleException subclasses to HTTP error codes + if (t instanceof GuacamoleException) { + + // Always log the human-readable details of GuacacamoleExceptions + // for the benefit of the administrator + if (t instanceof GuacamoleClientException) + logger.debug("Client request rejected: {}", t.getMessage()); + else { + logger.error("Request could not be processed: {}", t.getMessage()); + logger.debug("Processing of request aborted by extension.", t); + } + + return Response + .status(((GuacamoleException) t).getHttpStatusCode()) + .entity(new APIError((GuacamoleException) t)) + .type(MediaType.APPLICATION_JSON) + .build(); + } + + // Wrap unchecked exceptions + String message = t.getMessage(); + if (message != null) + logger.error("Unexpected internal error: {}", message); + else + logger.error("An internal error occurred, but did not contain " + + "an error message. Enable debug-level logging for " + + "details."); + + logger.debug("Unexpected error in REST endpoint.", t); + + return Response + .status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new APIError( + new GuacamoleException("Unexpected internal error", t))) + .type(MediaType.APPLICATION_JSON) + .build(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java new file mode 100644 index 0000000..a89398e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import com.google.inject.Scopes; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import com.google.inject.servlet.ServletModule; +import java.util.Collections; +import org.apache.guacamole.rest.event.ListenerService; +import org.apache.guacamole.rest.session.UserContextResourceFactory; +import org.apache.guacamole.GuacamoleApplication; +import org.apache.guacamole.rest.activeconnection.ActiveConnectionModule; +import org.apache.guacamole.rest.auth.AuthTokenGenerator; +import org.apache.guacamole.rest.auth.AuthenticationService; +import org.apache.guacamole.rest.auth.DecorationService; +import org.apache.guacamole.rest.auth.SecureRandomAuthTokenGenerator; +import org.apache.guacamole.rest.auth.TokenSessionMap; +import org.apache.guacamole.rest.connection.ConnectionModule; +import org.apache.guacamole.rest.connectiongroup.ConnectionGroupModule; +import org.apache.guacamole.rest.session.SessionResourceFactory; +import org.apache.guacamole.rest.sharingprofile.SharingProfileModule; +import org.apache.guacamole.rest.tunnel.TunnelCollectionResourceFactory; +import org.apache.guacamole.rest.tunnel.TunnelResourceFactory; +import org.apache.guacamole.rest.user.UserModule; +import org.apache.guacamole.rest.usergroup.UserGroupModule; +import org.glassfish.jersey.servlet.ServletContainer; +import org.glassfish.jersey.servlet.ServletProperties; + +/** + * A Guice Module to set up the servlet mappings and authentication-specific + * dependency injection for the Guacamole REST API. + */ +public class RESTServiceModule extends ServletModule { + + /** + * Singleton instance of TokenSessionMap. + */ + private final TokenSessionMap tokenSessionMap; + + /** + * Creates a module which handles binding of REST services and related + * authentication objects, including the singleton TokenSessionMap. + * + * @param tokenSessionMap + * An instance of TokenSessionMap to inject as a singleton wherever + * needed. + */ + public RESTServiceModule(TokenSessionMap tokenSessionMap) { + this.tokenSessionMap = tokenSessionMap; + } + + @Override + protected void configureServlets() { + + // Bind session map + bind(TokenSessionMap.class).toInstance(tokenSessionMap); + + // Bind low-level services + bind(ListenerService.class); + bind(AuthenticationService.class); + bind(AuthTokenGenerator.class).to(SecureRandomAuthTokenGenerator.class); + bind(DecorationService.class); + + // Root-level resources + install(new FactoryModuleBuilder().build(SessionResourceFactory.class)); + install(new FactoryModuleBuilder().build(TunnelCollectionResourceFactory.class)); + install(new FactoryModuleBuilder().build(TunnelResourceFactory.class)); + install(new FactoryModuleBuilder().build(UserContextResourceFactory.class)); + + // Resources below root + install(new ActiveConnectionModule()); + install(new ConnectionModule()); + install(new ConnectionGroupModule()); + install(new SharingProfileModule()); + install(new UserModule()); + install(new UserGroupModule()); + + // Serve REST services using Jersey 2.x + bind(ServletContainer.class).in(Scopes.SINGLETON); + serve("/api/*").with(ServletContainer.class, Collections.singletonMap( + ServletProperties.JAXRS_APPLICATION_CLASS, + GuacamoleApplication.class.getName() + )); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java b/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java new file mode 100644 index 0000000..e003f17 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ResourceInfo; +import javax.ws.rs.core.Context; +import javax.ws.rs.ext.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.properties.LongGuacamoleProperty; + +/** + * Filter which restricts REST API requests to a particular maximum size. + */ +@Singleton +@Provider +public class RequestSizeFilter implements ContainerRequestFilter { + + /** + * Informs the RequestSizeFilter to NOT enforce its request size limits on + * requests serviced by the annotated method. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public static @interface DoNotLimit {} + + /** + * The default maximum number of bytes to accept within the entity body of + * any particular REST request. + */ + private static final long DEFAULT_MAX_REQUEST_SIZE = 2097152; + + /** + * The maximum number of bytes to accept within the entity body of any + * particular REST request. If not specified, requests will be limited to + * 2 MB by default. Specifying 0 disables request size limitations. + */ + private final LongGuacamoleProperty API_MAX_REQUEST_SIZE = new LongGuacamoleProperty() { + + @Override + public String getName() { return "api-max-request-size"; } + + }; + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * Information describing the resource that was requested. + */ + @Context + private ResourceInfo resourceInfo; + + @Override + public void filter(ContainerRequestContext context) throws IOException { + + // Retrieve configured request size limits + final long maxRequestSize; + try { + maxRequestSize = environment.getProperty(API_MAX_REQUEST_SIZE, DEFAULT_MAX_REQUEST_SIZE); + } + catch (GuacamoleException e) { + throw new APIException(e); + } + + // Ignore request size if limit is disabled + if (maxRequestSize == 0 || resourceInfo.getResourceMethod().isAnnotationPresent(DoNotLimit.class)) + return; + + // Restrict maximum size of requests which have an input stream + // available to be limited + InputStream stream = context.getEntityStream(); + if (stream != null) + context.setEntityStream(new LimitedRequestInputStream(stream, maxRequestSize)); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/TokenParam.java b/guacamole/src/main/java/org/apache/guacamole/rest/TokenParam.java new file mode 100644 index 0000000..53c9722 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/TokenParam.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation which automatically maps the authentication token used by + * Guacamole's REST API, regardless of whether that token is received via an + * HTTP header or via a query parameter. + */ +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface TokenParam {} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/TokenParamProvider.java b/guacamole/src/main/java/org/apache/guacamole/rest/TokenParamProvider.java new file mode 100644 index 0000000..b0da961 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/TokenParamProvider.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest; + +import java.util.function.Function; +import javax.inject.Inject; +import javax.ws.rs.ext.Provider; +import org.apache.guacamole.rest.auth.AuthenticationService; +import org.glassfish.jersey.server.ContainerRequest; +import org.glassfish.jersey.server.model.Parameter; +import org.glassfish.jersey.server.spi.internal.ValueParamProvider; + +/** + * Provider which automatically maps Guacamole authentication tokens received + * via REST API requests to parameters that have been annotated with the + * @TokenParam annotation. + */ +@Provider +public class TokenParamProvider implements ValueParamProvider { + + /** + * Service for authenticating users and working with the resulting + * authentication tokens. + */ + @Inject + private AuthenticationService authenticationService; + + @Override + public Function getValueProvider(Parameter parameter) { + + if (parameter.getAnnotation(TokenParam.class) == null) + return null; + + return (request) -> authenticationService.getAuthenticationToken(request); + + } + + @Override + public PriorityType getPriority() { + return Priority.HIGH; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java new file mode 100644 index 0000000..1634378 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.activeconnection; + +import java.util.Date; +import org.apache.guacamole.net.auth.ActiveConnection; + +/** + * Information related to active connections which may be exposed through the + * REST endpoints. + */ +public class APIActiveConnection { + + /** + * The identifier of the active connection itself. + */ + private final String identifier; + + /** + * The identifier of the connection associated with this + * active connection. + */ + private final String connectionIdentifier; + + /** + * The date and time the connection began. + */ + private final Date startDate; + + /** + * The host from which the connection originated, if known. + */ + private final String remoteHost; + + /** + * The name of the user who used or is using the connection. + */ + private final String username; + + /** + * Whether this active connection may be connected to. + */ + private final boolean connectable; + + /** + * Creates a new APIActiveConnection, copying the information from the given + * active connection. + * + * @param connection + * The active connection to copy data from. + */ + public APIActiveConnection(ActiveConnection connection) { + this.identifier = connection.getIdentifier(); + this.connectionIdentifier = connection.getConnectionIdentifier(); + this.startDate = connection.getStartDate(); + this.remoteHost = connection.getRemoteHost(); + this.username = connection.getUsername(); + this.connectable = connection.isConnectable(); + } + + /** + * Returns the identifier of the connection associated with this tunnel. + * + * @return + * The identifier of the connection associated with this tunnel. + */ + public String getConnectionIdentifier() { + return connectionIdentifier; + } + + /** + * Returns the date and time the connection began. + * + * @return + * The date and time the connection began. + */ + public Date getStartDate() { + return startDate; + } + + /** + * Returns the remote host from which this connection originated. + * + * @return + * The remote host from which this connection originated. + */ + public String getRemoteHost() { + return remoteHost; + } + + /** + * Returns the name of the user who used or is using the connection at the + * times given by this tunnel. + * + * @return + * The name of the user who used or is using the associated connection. + */ + public String getUsername() { + return username; + } + + /** + * Returns the identifier of the active connection itself. This is + * distinct from the connection identifier, and uniquely identifies a + * specific use of a connection. + * + * @return + * The identifier of the active connection. + */ + public String getIdentifier() { + return identifier; + } + + /*** + * Returns whether this active connection may be connected to, just as a + * normal connection. + * + * @return + * true if this active connection may be connected to, false otherwise. + */ + public boolean isConnectable() { + return connectable; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIUserCredentials.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIUserCredentials.java new file mode 100644 index 0000000..b517101 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIUserCredentials.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.activeconnection; + +import java.util.Collection; +import java.util.Map; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.net.auth.credentials.UserCredentials; + +/** + * The object returned by REST API calls to define a full set of valid + * credentials, including field definitions and corresponding expected + * values. + */ +public class APIUserCredentials { + + /** + * All expected request parameters, if any, as a collection of fields. + */ + private final Collection expected; + + /** + * A map of all field values by field name. + */ + private final Map values; + + /** + * Creates a new APIUserCredentials object whose required parameters and + * corresponding values are defined by the given UserCredentials. + * + * @param userCredentials + * The UserCredentials which defines the parameters and corresponding + * values of this APIUserCredentials. + */ + public APIUserCredentials(UserCredentials userCredentials) { + this.expected = userCredentials.getFields(); + this.values = userCredentials.getValues(); + } + + /** + * Returns a collection of all required parameters, where each parameter is + * represented by a field. + * + * @return + * A collection of all required parameters. + */ + public Collection getExpected() { + return expected; + } + + /** + * Returns a map of all field values by field name. The fields having the + * names used within this map should be defined within the collection of + * required parameters returned by getExpected(). + * + * @return + * A map of all field values by field name. + */ + public Map getValues() { + return values; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionDirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionDirectoryResource.java new file mode 100644 index 0000000..88319f0 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionDirectoryResource.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.activeconnection; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * A REST resource which abstracts the operations available on a Directory of + * ActiveConnections. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ActiveConnectionDirectoryResource + extends DirectoryResource { + + /** + * Creates a new ActiveConnectionDirectoryResource which exposes the + * operations and subresources available for the given ActiveConnection + * Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory being exposed. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * ActiveConnections. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing ActiveConnections. + */ + @AssistedInject + public ActiveConnectionDirectoryResource( + @Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + super(authenticatedUser, userContext, ActiveConnection.class, directory, translator, resourceFactory); + } + + @Override + protected ObjectPermissionSet getObjectPermissions(Permissions permissions) + throws GuacamoleException { + return permissions.getActiveConnectionPermissions(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionModule.java new file mode 100644 index 0000000..6b1094d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionModule.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.activeconnection; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import com.google.inject.TypeLiteral; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * Guice Module which configures injections required for handling + * ActiveConnection resources via the REST API. + */ +public class ActiveConnectionModule extends AbstractModule { + + @Override + protected void configure() { + + // Create the required DirectoryResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + ActiveConnectionDirectoryResource.class + ) + .build(new TypeLiteral>() {})); + + // Create the required DirectoryObjectResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + ActiveConnectionResource.class + ) + .build(new TypeLiteral>() {})); + + // Bind translator for converting between ActiveConnection and APIActiveConnection + bind(new TypeLiteral>() {}) + .to(ActiveConnectionObjectTranslator.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java new file mode 100644 index 0000000..712a82f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.activeconnection; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * Translator which converts between ActiveConnection objects and + * APIActiveConnection objects. As ActiveConnection objects are read-only, only + * toExternalObject() is implemented here. + */ +public class ActiveConnectionObjectTranslator + extends DirectoryObjectTranslator { + + @Override + public APIActiveConnection toExternalObject(ActiveConnection object) + throws GuacamoleException { + return new APIActiveConnection(object); + } + + @Override + public ActiveConnection toInternalObject(APIActiveConnection object) + throws GuacamoleException { + + // ActiveConnection objects are read-only + throw new GuacamoleUnsupportedException("Active connection records are read-only."); + + } + + @Override + public void applyExternalChanges(ActiveConnection existingObject, + APIActiveConnection object) throws GuacamoleException { + + // Modification not supported for ActiveConnection + throw new GuacamoleUnsupportedException("Active connection records are read-only."); + + } + + @Override + public void filterExternalObject(UserContext context, + APIActiveConnection object) throws GuacamoleException { + // Nothing to filter on ActiveConnections (no attributes) + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java new file mode 100644 index 0000000..59afe18 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.activeconnection; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.connection.APIConnection; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; + +/** + * A REST resource which abstracts the operations available on an existing + * ActiveConnection. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ActiveConnectionResource + extends DirectoryObjectResource { + + /** + * A factory which can be used to create instances of resources representing + * Connection. + */ + @Inject + private DirectoryResourceFactory + connectionDirectoryResourceFactory; + + /** + * Creates a new ActiveConnectionResource which exposes the operations and + * subresources available for the given ActiveConnection. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory which contains the given ActiveConnection. + * + * @param activeConnection + * The ActiveConnection that this ActiveConnectionResource should + * represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * ActiveConnections. + */ + @AssistedInject + public ActiveConnectionResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + @Assisted ActiveConnection activeConnection, + DirectoryObjectTranslator translator) { + super(authenticatedUser, userContext, ActiveConnection.class, directory, activeConnection, translator); + } + + /** + * Retrieves a resource representing the Connection object that is being + * actively used. + * + * @return + * A resource representing the Connection object that is being actively + * used. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Connection. + */ + @Path("connection") + public DirectoryObjectResource getConnection() + throws GuacamoleException { + + UserContext userContext = getUserContext(); + ActiveConnection activeConnection = getInternalObject(); + + // Return the underlying connection as a resource + return connectionDirectoryResourceFactory + .create(getAuthenticatedUser(), userContext, userContext.getConnectionDirectory()) + .getObjectResource(activeConnection.getConnectionIdentifier()); + + } + + /** + * Retrieves a set of credentials which can be POSTed by another user to the + * "/api/tokens" endpoint to obtain access strictly to this connection. The + * retrieved credentials may be purpose-generated and temporary. + * + * @param sharingProfileIdentifier The identifier of the sharing connection + * defining the semantics of the shared session. + * + * @return The set of credentials which should be used to access strictly + * this connection. + * + * @throws GuacamoleException If an error occurs while retrieving the + * sharing credentials for this connection. + */ + @GET + @Path("sharingCredentials/{sharingProfile}") + public APIUserCredentials getSharingCredentials( + @PathParam("sharingProfile") String sharingProfileIdentifier) + throws GuacamoleException { + + // Generate and return sharing credentials for the active connection + return new APIUserCredentials(getInternalObject().getSharingCredentials(sharingProfileIdentifier)); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/package-info.java new file mode 100644 index 0000000..f5483db --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the manipulation of active connections via the Guacamole + * REST API. + */ +package org.apache.guacamole.rest.activeconnection; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/APIAuthenticationResponse.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/APIAuthenticationResponse.java new file mode 100644 index 0000000..ee28701 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/APIAuthenticationResponse.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +/** + * A simple object to represent an auth token/username pair in the API. + */ +public class APIAuthenticationResponse { + + /** + * The auth token. + */ + private final String authToken; + + + /** + * The username of the user that authenticated. + */ + private final String username; + + /** + * The unique identifier of the data source from which this user account + * came. Although this user account may exist across several data sources + * (AuthenticationProviders), this will be the unique identifier of the + * AuthenticationProvider that authenticated this user for the current + * session. + */ + private final String dataSource; + + /** + * Returns the unique authentication token which identifies the current + * session. + * + * @return + * The user's authentication token. + */ + public String getAuthToken() { + return authToken; + } + + /** + * Returns the user identified by the authentication token associated with + * the current session. + * + * @return + * The user identified by this authentication token. + */ + public String getUsername() { + return username; + } + + /** + * Returns the unique identifier of the data source associated with the user + * account associated with this auth token. + * + * @return + * The unique identifier of the data source associated with the user + * account associated with this auth token. + */ + public String getDataSource() { + return dataSource; + } + + /** + * Create a new APIAuthToken Object with the given auth token. + * + * @param dataSource + * The unique identifier of the AuthenticationProvider which + * authenticated the user. + * + * @param authToken + * The auth token to create the new APIAuthToken with. + * + * @param username + * The username of the user owning the given token. + */ + public APIAuthenticationResponse(String dataSource, String authToken, String username) { + this.dataSource = dataSource; + this.authToken = authToken; + this.username = username; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/APIAuthenticationResult.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/APIAuthenticationResult.java new file mode 100644 index 0000000..2f50823 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/APIAuthenticationResult.java @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import java.util.Collections; +import java.util.List; + +/** + * A simple object which describes the result of an authentication operation, + * including the resulting token. + */ +public class APIAuthenticationResult { + + /** + * The unique token generated for the user that authenticated. + */ + private final String authToken; + + /** + * The username of the user that authenticated. + */ + private final String username; + + /** + * The unique identifier of the data source from which this user account + * came. Although this user account may exist across several data sources + * (AuthenticationProviders), this will be the unique identifier of the + * AuthenticationProvider that authenticated this user for the current + * session. + */ + private final String dataSource; + + /** + * The identifiers of all data sources available to this user. + */ + private final List availableDataSources; + + /** + * Returns the unique authentication token which identifies the current + * session. + * + * @return + * The user's authentication token. + */ + public String getAuthToken() { + return authToken; + } + + /** + * Returns the user identified by the authentication token associated with + * the current session. + * + * @return + * The user identified by this authentication token. + */ + public String getUsername() { + return username; + } + + /** + * Returns the unique identifier of the data source associated with the user + * account associated with the current session. + * + * @return + * The unique identifier of the data source associated with the user + * account associated with the current session. + */ + public String getDataSource() { + return dataSource; + } + + /** + * Returns the identifiers of all data sources available to the user + * associated with the current session. + * + * @return + * The identifiers of all data sources available to the user associated + * with the current session. + */ + public List getAvailableDataSources() { + return availableDataSources; + } + + /** + * Create a new APIAuthenticationResult object containing the given data. + * + * @param authToken + * The unique token generated for the user that authenticated, to be + * used for the duration of their session. + * + * @param username + * The username of the user owning the given token. + * + * @param dataSource + * The unique identifier of the AuthenticationProvider which + * authenticated the user. + * + * @param availableDataSources + * The unique identifier of all AuthenticationProviders to which the + * user now has access. + */ + public APIAuthenticationResult(String authToken, String username, + String dataSource, List availableDataSources) { + this.authToken = authToken; + this.username = username; + this.dataSource = dataSource; + this.availableDataSources = Collections.unmodifiableList(availableDataSources); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthTokenGenerator.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthTokenGenerator.java new file mode 100644 index 0000000..22f9902 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthTokenGenerator.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +/** + * Generates an auth token for an authenticated user. + */ +public interface AuthTokenGenerator { + + /** + * Get a new auth token. + * + * @return A new auth token. + */ + public String getToken(); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java new file mode 100644 index 0000000..5a0e4c5 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java @@ -0,0 +1,550 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleUnauthorizedException; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.credentials.GuacamoleCredentialsException; +import org.apache.guacamole.net.auth.credentials.GuacamoleInsufficientCredentialsException; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.net.event.AuthenticationFailureEvent; +import org.apache.guacamole.net.event.AuthenticationRequestReceivedEvent; +import org.apache.guacamole.net.event.AuthenticationSuccessEvent; +import org.apache.guacamole.rest.event.ListenerService; +import org.glassfish.jersey.server.ContainerRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.inject.Singleton; + +/** + * A service for performing authentication checks in REST endpoints. + */ +@Singleton +public class AuthenticationService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(AuthenticationService.class); + + /** + * All configured authentication providers which can be used to + * authenticate users or retrieve data associated with authenticated users. + */ + @Inject + private List authProviders; + + /** + * The map of auth tokens to sessions for the REST endpoints. + */ + @Inject + private TokenSessionMap tokenSessionMap; + + /** + * A generator for creating new auth tokens. + */ + @Inject + private AuthTokenGenerator authTokenGenerator; + + /** + * Service for applying or reapplying layers of decoration. + */ + @Inject + private DecorationService decorationService; + + /** + * The service to use to notify registered authentication listeners. + */ + @Inject + private ListenerService listenerService; + + /** + * The name of the HTTP header that may contain the authentication token + * used by the Guacamole REST API. + */ + public static final String TOKEN_HEADER_NAME = "Guacamole-Token"; + + /** + * The name of the query parameter that may contain the authentication + * token used by the Guacamole REST API. + */ + public static final String TOKEN_PARAMETER_NAME = "token"; + + /** + * Attempts authentication against all AuthenticationProviders, in order, + * using the provided credentials. The first authentication failure takes + * priority, but remaining AuthenticationProviders are attempted. If any + * AuthenticationProvider succeeds, the resulting AuthenticatedUser is + * returned, and no further AuthenticationProviders are tried. + * + * @param credentials + * The credentials to use for authentication. + * + * @return + * The AuthenticatedUser given by the highest-priority + * AuthenticationProvider for which the given credentials are valid. + * + * @throws GuacamoleAuthenticationProcessException + * If the given credentials are not valid for any + * AuthenticationProvider, or if an error occurs while authenticating + * the user. + */ + private AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleAuthenticationProcessException { + + AuthenticationProvider failedAuthProvider = null; + GuacamoleCredentialsException authFailure = null; + + // Attempt authentication against each AuthenticationProvider + for (AuthenticationProvider authProvider : authProviders) { + + // Attempt authentication + try { + AuthenticatedUser authenticatedUser = authProvider.authenticateUser(credentials); + if (authenticatedUser != null) + return authenticatedUser; + } + + // Insufficient credentials should take precedence + catch (GuacamoleInsufficientCredentialsException e) { + if (authFailure == null || authFailure instanceof GuacamoleInvalidCredentialsException) { + failedAuthProvider = authProvider; + authFailure = e; + } + } + + // Catch other credentials exceptions and assign the first one + catch (GuacamoleCredentialsException e) { + if (authFailure == null) { + failedAuthProvider = authProvider; + authFailure = e; + } + } + + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication was aborted.", authProvider, e); + } + + } + + throw new GuacamoleAuthenticationProcessException("User authentication " + + "failed.", failedAuthProvider, authFailure); + + } + + /** + * Re-authenticates the given AuthenticatedUser against the + * AuthenticationProvider that originally created it, using the given + * Credentials. + * + * @param authenticatedUser + * The AuthenticatedUser to re-authenticate. + * + * @param credentials + * The Credentials to use to re-authenticate the user. + * + * @return + * A AuthenticatedUser which may have been updated due to re- + * authentication. + * + * @throws GuacamoleAuthenticationProcessException + * If an error prevents the user from being re-authenticated. + */ + private AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Get original AuthenticationProvider + AuthenticationProvider authProvider = authenticatedUser.getAuthenticationProvider(); + + try { + + // Re-authenticate the AuthenticatedUser against the original AuthenticationProvider only + authenticatedUser = authProvider.updateAuthenticatedUser(authenticatedUser, credentials); + if (authenticatedUser == null) + throw new GuacamoleSecurityException("User re-authentication failed."); + + return authenticatedUser; + + } + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User re-authentication failed.", authProvider, e); + } + + } + + /** + * Returns the AuthenticatedUser associated with the given session and + * credentials, performing a fresh authentication and creating a new + * AuthenticatedUser if necessary. + * + * @param existingSession + * The current GuacamoleSession, or null if no session exists yet. + * + * @param credentials + * The Credentials to use to authenticate the user. + * + * @return + * The AuthenticatedUser associated with the given session and + * credentials. + * + * @throws GuacamoleAuthenticationProcessException + * If an error occurs while authenticating or re-authenticating the + * user. + */ + private AuthenticatedUser getAuthenticatedUser(GuacamoleSession existingSession, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Re-authenticate user if session exists + if (existingSession != null) { + AuthenticatedUser updatedUser = updateAuthenticatedUser( + existingSession.getAuthenticatedUser(), credentials); + return updatedUser; + } + + // Otherwise, attempt authentication as a new user + AuthenticatedUser authenticatedUser = AuthenticationService.this.authenticateUser(credentials); + return authenticatedUser; + + } + + /** + * Returns all UserContexts associated with the given AuthenticatedUser, + * updating existing UserContexts, if any. If no UserContexts are yet + * associated with the given AuthenticatedUser, new UserContexts are + * generated by polling each available AuthenticationProvider. + * + * @param existingSession + * The current GuacamoleSession, or null if no session exists yet. + * + * @param authenticatedUser + * The AuthenticatedUser that has successfully authenticated or re- + * authenticated. + * + * @param credentials + * The Credentials provided by the user in the most recent + * authentication attempt. + * + * @return + * A List of all UserContexts associated with the given + * AuthenticatedUser. + * + * @throws GuacamoleAuthenticationProcessException + * If an error occurs while creating or updating any UserContext. + */ + private List getUserContexts(GuacamoleSession existingSession, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleAuthenticationProcessException { + + List userContexts = new ArrayList<>(authProviders.size()); + + // If UserContexts already exist, update them and add to the list + if (existingSession != null) { + + // Update all old user contexts + List oldUserContexts = existingSession.getUserContexts(); + for (DecoratedUserContext userContext : oldUserContexts) { + + UserContext oldUserContext = userContext.getUndecoratedUserContext(); + + // Update existing UserContext + AuthenticationProvider authProvider = oldUserContext.getAuthenticationProvider(); + UserContext updatedUserContext; + try { + updatedUserContext = authProvider.updateUserContext(oldUserContext, authenticatedUser, credentials); + } + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication aborted during UserContext update.", + authProvider, e); + } + + // Add to available data, if successful + if (updatedUserContext != null) + userContexts.add(decorationService.redecorate(userContext, + updatedUserContext, authenticatedUser, credentials)); + + // If unsuccessful, log that this happened, as it may be a bug + else + logger.debug("AuthenticationProvider \"{}\" retroactively destroyed its UserContext.", + authProvider.getClass().getName()); + + } + + } + + // Otherwise, create new UserContexts from available AuthenticationProviders + else { + + // Get UserContexts from each available AuthenticationProvider + for (AuthenticationProvider authProvider : authProviders) { + + // Generate new UserContext + UserContext userContext; + try { + userContext = authProvider.getUserContext(authenticatedUser); + } + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication aborted during initial " + + "UserContext creation.", authProvider, e); + } + + // Add to available data, if successful + if (userContext != null) + userContexts.add(decorationService.decorate(userContext, + authenticatedUser, credentials)); + + } + + } + + return userContexts; + + } + + /** + * Authenticates a user using the given credentials and optional + * authentication token, returning the authentication token associated with + * the user's Guacamole session, which may be newly generated. If an + * existing token is provided, the authentication procedure will attempt to + * update or reuse the provided token, but it is possible that a new token + * will be returned. Note that this function CANNOT return null. + * + * @param credentials + * The credentials to use when authenticating the user. + * + * @param token + * The authentication token to use if attempting to re-authenticate an + * existing session, or null to request a new token. + * + * @return + * The authentication token associated with the newly created or + * existing session. + * + * @throws GuacamoleException + * If the authentication or re-authentication attempt fails. + */ + public String authenticate(Credentials credentials, String token) + throws GuacamoleException { + + String authToken; + try { + + // Allow extensions to make updated to credentials prior to + // actual authentication (NOTE: We do this here instead of in a + // separate function to ensure that failure events accurately + // represent the credentials that failed when a chain of credential + // updates is involved) + for (AuthenticationProvider authProvider : authProviders) { + try { + credentials = authProvider.updateCredentials(credentials); + } + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication aborted during credential " + + "update/revision.", authProvider, e); + } + } + + // Fire pre-authentication event before ANY authn/authz occurs at all + final Credentials updatedCredentials = credentials; + listenerService.handleEvent((AuthenticationRequestReceivedEvent) () -> updatedCredentials); + + // Pull existing session if token provided + GuacamoleSession existingSession; + if (token != null) + existingSession = tokenSessionMap.get(token); + else + existingSession = null; + + // Get up-to-date AuthenticatedUser and associated UserContexts + AuthenticatedUser authenticatedUser = getAuthenticatedUser(existingSession, updatedCredentials); + List userContexts = getUserContexts(existingSession, authenticatedUser, updatedCredentials); + + // Update existing session, if it exists + if (existingSession != null) { + authToken = token; + existingSession.setAuthenticatedUser(authenticatedUser); + existingSession.setUserContexts(userContexts); + } + + // If no existing session, generate a new token/session pair + else { + authToken = authTokenGenerator.getToken(); + tokenSessionMap.put(authToken, new GuacamoleSession(listenerService, authenticatedUser, userContexts)); + } + + // Report authentication success + try { + listenerService.handleEvent(new AuthenticationSuccessEvent(authenticatedUser, + existingSession != null)); + } + catch (GuacamoleException e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication aborted by event listener.", null, e); + } + + } + + // Log and rethrow any authentication errors + catch (GuacamoleAuthenticationProcessException e) { + + // NOTE: The credentials referenced here are intentionally NOT the + // final updatedCredentials reference (though they may often be + // equivalent) to ensure that failure events accurately represent + // the credentials that failed if that failure occurs in the middle + // of a chain of credential updates via updateCredentials() + listenerService.handleEvent(new AuthenticationFailureEvent(credentials, + e.getAuthenticationProvider(), e.getCause())); + + // Rethrow exception + e.rethrowCause(); + + // This line SHOULD be unreachable unless a bug causes + // rethrowCause() to not actually rethrow the underlying failure + Throwable cause = e.getCause(); + if (cause != null) { + logger.warn("An underlying internal error was not correctly rethrown by rethrowCause(): {}", cause.getMessage()); + logger.debug("Internal error not rethrown by rethrowCause().", cause); + } + else + logger.warn("An underlying internal error was not correctly rethrown by rethrowCause()."); + + throw e.getCauseAsGuacamoleException(); + + } + + return authToken; + + } + + /** + * Finds the Guacamole session for a given auth token, if the auth token + * represents a currently logged in user. Throws an unauthorized error + * otherwise. + * + * @param authToken The auth token to check against the map of logged in users. + * @return The session that corresponds to the provided auth token. + * @throws GuacamoleException If the auth token does not correspond to any + * logged in user. + */ + public GuacamoleSession getGuacamoleSession(String authToken) + throws GuacamoleException { + + // Try to get the session from the map of logged in users. + GuacamoleSession session = tokenSessionMap.get(authToken); + + // Authentication failed. + if (session == null) + throw new GuacamoleUnauthorizedException("Permission Denied."); + + return session; + + } + + /** + * Invalidates a specific authentication token and its corresponding + * Guacamole session, effectively logging out the associated user. If the + * authentication token is not valid, this function has no effect. + * + * @param authToken + * The token being invalidated. + * + * @return + * true if the given authentication token was valid and the + * corresponding Guacamole session was destroyed, false if the given + * authentication token was not valid and no action was taken. + */ + public boolean destroyGuacamoleSession(String authToken) { + + // Remove corresponding GuacamoleSession if the token is valid + GuacamoleSession session = tokenSessionMap.remove(authToken); + if (session == null) + return false; + + // Invalidate the removed session + session.invalidate(); + return true; + + } + + /** + * Returns all UserContexts associated with a given auth token, if the auth + * token represents a currently logged in user. Throws an unauthorized + * error otherwise. + * + * @param authToken + * The auth token to check against the map of logged in users. + * + * @return + * A List of all UserContexts associated with the provided auth token. + * + * @throws GuacamoleException + * If the auth token does not correspond to any logged in user. + */ + public List getUserContexts(String authToken) + throws GuacamoleException { + return getGuacamoleSession(authToken).getUserContexts(); + } + + /** + * Returns the authentication token sent within the given request, if + * present, or null if otherwise. Authentication tokens may be sent via + * the "Guacamole-Token" header or the "token" query parameter. If both + * the header and a parameter are used, the header is given priority. + * + * @param request + * The HTTP request to retrieve the authentication token from. + * + * @return + * The authentication token within the given request, or null if no + * token is present. + */ + public String getAuthenticationToken(ContainerRequest request) { + + // Give priority to token within HTTP header + String token = request.getHeaderString(TOKEN_HEADER_NAME); + if (token != null && !token.isEmpty()) + return token; + + // If no token was provided via HTTP headers, fall back to using + // query parameters + token = request.getUriInfo().getQueryParameters().getFirst(TOKEN_PARAMETER_NAME); + if (token != null && !token.isEmpty()) + return token; + + return null; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/DecoratedUserContext.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/DecoratedUserContext.java new file mode 100644 index 0000000..2be283a --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/DecoratedUserContext.java @@ -0,0 +1,376 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.DelegatingUserContext; +import org.apache.guacamole.net.auth.UserContext; + +/** + * A UserContext which has been decorated by an AuthenticationProvider through + * invoking decorate() or redecorate(). + */ +public class DecoratedUserContext extends DelegatingUserContext { + + /** + * The original, undecorated UserContext. + */ + private final UserContext undecoratedUserContext; + + /** + * The AuthenticationProvider which applied this layer of decoration. + */ + private final AuthenticationProvider decoratingAuthenticationProvider; + + /** + * The DecoratedUserContext which applies the layer of decoration + * immediately beneath this DecoratedUserContext. If no further decoration + * has been applied, this will be null. + */ + private final DecoratedUserContext decoratedUserContext; + + /** + * Decorates a newly-created UserContext (as would be returned by + * getUserContext()), invoking the decorate() function of the given + * AuthenticationProvider to apply an additional layer of decoration. If the + * AuthenticationProvider originated the given UserContext, this function + * has no effect. + * + * @param authProvider + * The AuthenticationProvider which should be used to decorate the + * given UserContext. + * + * @param userContext + * The UserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @return + * A UserContext instance which has been decorated (wrapped) by the + * given AuthenticationProvider, or the original UserContext if the + * given AuthenticationProvider originated the UserContext. + * + * @throws GuacamoleAuthenticationProcessException + * If the given AuthenticationProvider fails while decorating the + * UserContext. + */ + private static UserContext decorate(AuthenticationProvider authProvider, + UserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Skip the AuthenticationProvider which produced the UserContext + // being decorated + if (authProvider != userContext.getAuthenticationProvider()) { + + // Apply layer of wrapping around UserContext + UserContext decorated; + try { + decorated = authProvider.decorate(userContext, + authenticatedUser, credentials); + } + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication aborted by decorating UserContext.", + authProvider, e); + } + + // Do not allow misbehaving extensions to wipe out the + // UserContext entirely + if (decorated != null) + return decorated; + + } + + return userContext; + + } + + /** + * Redecorates an updated UserContext (as would be returned by + * updateUserContext()), invoking the redecorate() function of the given + * AuthenticationProvider to apply an additional layer of decoration. If the + * AuthenticationProvider originated the given UserContext, this function + * has no effect. + * + * @param decorated + * The DecoratedUserContext associated with an older version of the + * given UserContext. + * + * @param userContext + * The new version of the UserContext which should be decorated. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @return + * A UserContext instance which has been decorated (wrapped) by the + * given AuthenticationProvider, or the original UserContext if the + * given AuthenticationProvider originated the UserContext. + * + * @throws GuacamoleAuthenticationProcessException + * If the given AuthenticationProvider fails while decorating the + * UserContext. + */ + private static UserContext redecorate(DecoratedUserContext decorated, + UserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + AuthenticationProvider authProvider = decorated.getDecoratingAuthenticationProvider(); + + // Skip the AuthenticationProvider which produced the UserContext + // being decorated + if (authProvider != userContext.getAuthenticationProvider()) { + + // Apply next layer of wrapping around UserContext + UserContext redecorated; + try { + redecorated = authProvider.redecorate(decorated.getDelegateUserContext(), + userContext, authenticatedUser, credentials); + } + catch (GuacamoleException | RuntimeException | Error e) { + throw new GuacamoleAuthenticationProcessException("User " + + "authentication aborted by redecorating UserContext.", + authProvider, e); + } + + // Do not allow misbehaving extensions to wipe out the + // UserContext entirely + if (redecorated != null) + return redecorated; + + } + + return userContext; + + } + + /** + * Creates a new DecoratedUserContext, invoking the decorate() function of + * the given AuthenticationProvider to decorate the provided, undecorated + * UserContext. If the AuthenticationProvider originated the given + * UserContext, then the given UserContext is wrapped without any + * decoration. + * + * @param authProvider + * The AuthenticationProvider which should be used to decorate the + * given UserContext. + * + * @param userContext + * The undecorated UserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @throws GuacamoleAuthenticationProcessException + * If any of the given AuthenticationProviders fails while decorating + * the UserContext. + */ + public DecoratedUserContext(AuthenticationProvider authProvider, + UserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Wrap the result of invoking decorate() on the given AuthenticationProvider + super(decorate(authProvider, userContext, authenticatedUser, credentials)); + this.decoratingAuthenticationProvider = authProvider; + + // The wrapped UserContext is undecorated + this.undecoratedUserContext = userContext; + this.decoratedUserContext = null; + + } + + /** + * Creates a new DecoratedUserContext, invoking the decorate() function + * of the given AuthenticationProvider to apply an additional layer of + * decoration to a DecoratedUserContext. If the AuthenticationProvider + * originated the given UserContext, then the given UserContext is wrapped + * without any decoration. + * + * @param authProvider + * The AuthenticationProvider which should be used to decorate the + * given UserContext. + * + * @param userContext + * The DecoratedUserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @throws GuacamoleAuthenticationProcessException + * If any of the given AuthenticationProviders fails while decorating + * the UserContext. + */ + public DecoratedUserContext(AuthenticationProvider authProvider, + DecoratedUserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Wrap the result of invoking decorate() on the given AuthenticationProvider + super(decorate(authProvider, userContext, authenticatedUser, credentials)); + this.decoratingAuthenticationProvider = authProvider; + + // The wrapped UserContext has at least one layer of decoration + this.undecoratedUserContext = userContext.getUndecoratedUserContext(); + this.decoratedUserContext = userContext; + + } + + /** + * Creates a new DecoratedUserContext, invoking the redecorate() function + * of the given AuthenticationProvider to reapply decoration to the provided, + * undecorated UserContext, which has been updated relative to a past version + * which was decorated. If the AuthenticationProvider originated the given + * UserContext, then the given UserContext is wrapped without any decoration. + * + * @param decorated + * The DecoratedUserContext associated with the older version of the + * given UserContext. + * + * @param userContext + * The undecorated UserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @throws GuacamoleAuthenticationProcessException + * If any of the given AuthenticationProviders fails while decorating + * the UserContext. + */ + public DecoratedUserContext(DecoratedUserContext decorated, + UserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Wrap the result of invoking redecorate() on the given AuthenticationProvider + super(redecorate(decorated, userContext, authenticatedUser, credentials)); + this.decoratingAuthenticationProvider = decorated.getDecoratingAuthenticationProvider(); + + // The wrapped UserContext is undecorated + this.undecoratedUserContext = userContext; + this.decoratedUserContext = null; + + } + + /** + * Creates a new DecoratedUserContext, invoking the redecorate() function + * of the given AuthenticationProvider to reapply decoration to a + * DecoratedUserContext which already has at least one layer of decoration + * applied, and which is associated with a UserContext which was updated + * relative to a past version which was decorated. If the + * AuthenticationProvider originated the given UserContext, then the given + * UserContext is wrapped without any decoration. + * + * @param decorated + * The DecoratedUserContext associated with the older version of the + * UserContext wrapped within one or more layers of decoration. + * + * @param userContext + * The DecoratedUserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @throws GuacamoleAuthenticationProcessException + * If any of the given AuthenticationProviders fails while decorating + * the UserContext. + */ + public DecoratedUserContext(DecoratedUserContext decorated, + DecoratedUserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // Wrap the result of invoking redecorate() on the given AuthenticationProvider + super(redecorate(decorated, userContext, authenticatedUser, credentials)); + this.decoratingAuthenticationProvider = decorated.getDecoratingAuthenticationProvider(); + + // The wrapped UserContext has at least one layer of decoration + this.undecoratedUserContext = userContext.getUndecoratedUserContext(); + this.decoratedUserContext = userContext; + + } + + /** + * Returns the original UserContext with absolutely no layers of decoration + * applied. + * + * @return + * The original, undecorated UserContext. + */ + public UserContext getUndecoratedUserContext() { + return undecoratedUserContext; + } + + /** + * Returns the AuthenticationProvider which applied the layer of decoration + * represented by this DecoratedUserContext. + * + * @return + * The AuthenticationProvider which applied this layer of decoration. + */ + public AuthenticationProvider getDecoratingAuthenticationProvider() { + return decoratingAuthenticationProvider; + } + + /** + * Returns the DecoratedUserContext representing the next layer of + * decoration, itself decorated by this DecoratedUserContext. If no further + * layers of decoration exist, this will be null. + * + * @return + * The DecoratedUserContext which applies the layer of decoration + * immediately beneath this DecoratedUserContext, or null if no further + * decoration has been applied. + */ + public DecoratedUserContext getDecoratedUserContext() { + return decoratedUserContext; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/DecorationService.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/DecorationService.java new file mode 100644 index 0000000..0b7fc12 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/DecorationService.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import java.util.Iterator; +import java.util.List; +import javax.inject.Inject; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; + +/** + * A service for applying or reapplying layers of decoration to UserContexts. + * The semantics of UserContext decoration/redecoration is defined by the + * AuthenticationProvider interface. + */ +public class DecorationService { + + /** + * All configured authentication providers which can be used to + * authenticate users or retrieve data associated with authenticated users. + */ + @Inject + private List authProviders; + + /** + * Creates a new DecoratedUserContext, invoking the decorate() function + * of all AuthenticationProviders to decorate the provided UserContext. + * Decoration by each AuthenticationProvider will occur in the order that + * the AuthenticationProviders were loaded. Only AuthenticationProviders + * which did not originate the given UserContext will be used. + * + * @param userContext + * The UserContext to decorate. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @return + * A new DecoratedUserContext which has been decorated by all + * AuthenticationProviders. + * + * @throws GuacamoleAuthenticationProcessException + * If any AuthenticationProvider fails while decorating the UserContext. + */ + public DecoratedUserContext decorate(UserContext userContext, + AuthenticatedUser authenticatedUser, Credentials credentials) + throws GuacamoleAuthenticationProcessException { + + // Get first AuthenticationProvider in list + Iterator current = authProviders.iterator(); + if (!current.hasNext()) + return null; + + // Use first AuthenticationProvider to produce the root-level + // decorated UserContext + DecoratedUserContext decorated = new DecoratedUserContext(current.next(), + userContext, authenticatedUser, credentials); + + // Repeatedly wrap the decorated UserContext with additional layers of + // decoration for each remaining AuthenticationProvider + while (current.hasNext()) { + decorated = new DecoratedUserContext(current.next(), decorated, + authenticatedUser, credentials); + } + + return decorated; + + } + + /** + * Creates a new DecoratedUserContext, invoking the redecorate() function + * of all AuthenticationProviders to reapply decoration. Decoration by each + * AuthenticationProvider will occur in the order that the AuthenticationProviders + * were loaded. Only AuthenticationProviders which did not originate the given + * UserContext will be used. + * + * @param decorated + * The DecoratedUserContext associated with an older version of the + * given UserContext. + * + * @param userContext + * The new version of the UserContext which should be decorated. + * + * @param authenticatedUser + * The AuthenticatedUser identifying the user associated with the given + * UserContext. + * + * @param credentials + * The credentials associated with the request which produced the given + * UserContext. + * + * @return + * A new DecoratedUserContext which has been decorated by all + * AuthenticationProviders. + * + * @throws GuacamoleAuthenticationProcessException + * If any AuthenticationProvider fails while decorating the UserContext. + */ + public DecoratedUserContext redecorate(DecoratedUserContext decorated, + UserContext userContext, AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleAuthenticationProcessException { + + // If the given DecoratedUserContext contains further decorated layers, + // redecorate those first + DecoratedUserContext next = decorated.getDecoratedUserContext(); + if (next != null) { + return new DecoratedUserContext(decorated, + redecorate(next, userContext, authenticatedUser, credentials), + authenticatedUser, credentials); + } + + // If only one layer of decoration is present, simply redecorate that + // layer + return new DecoratedUserContext(decorated, userContext, + authenticatedUser, credentials); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/GuacamoleAuthenticationProcessException.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/GuacamoleAuthenticationProcessException.java new file mode 100644 index 0000000..bec73f0 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/GuacamoleAuthenticationProcessException.java @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import java.io.Serializable; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * An exception that occurs during Guacamole's authentication and authorization + * process, possibly associated with a specific AuthenticationProvider. + */ +public class GuacamoleAuthenticationProcessException extends GuacamoleException { + + /** + * Internal identifier unique to this version of + * GuacamoleAuthenticationProcessException, as required by Java's + * {@link Serializable} interface. + */ + private static final long serialVersionUID = 1L; + + /** + * The AuthenticationProvider that caused the failure, or null if there is + * no such specific AuthenticationProvider involved in this failure. + */ + private final transient AuthenticationProvider authProvider; + + /** + * A GuacamoleException representation of the failure that occurred. If + * the cause provided when this GuacamoleAuthenticationProcessException + * was created was a GuacamoleException, this will just be that exception. + * Otherwise, this will be a GuacamoleServerException wrapping the cause + * or a generic GuacamoleInvalidCredentialsException requesting a + * username/password if there is no specific cause at all. + */ + private final GuacamoleException guacCause; + + /** + * Converts the given Throwable to a GuacamoleException representing the + * failure that occurred. If the Throwable already is a GuacamoleException, + * this will just be that Throwable. For all other cases, a new + * GuacamoleException will be created that best represents the provided + * failure. If no failure is provided at all, a generic + * GuacamoleInvalidCredentialsException requesting a username/password is + * created. + * + * @param message + * A human-readable message describing the failure that occurred. + * + * @param cause + * The Throwable cause of the failure that occurred, if any, or null if + * the cause is not known to be a specific Throwable. + * + * @return + * A GuacamoleException representation of the message and cause + * provided. + */ + private static GuacamoleException toGuacamoleException(String message, + Throwable cause) { + + // Create generic invalid username/password exception if we have no + // specific cause + if (cause == null) + return new GuacamoleInvalidCredentialsException( + "Permission Denied.", + CredentialsInfo.USERNAME_PASSWORD + ); + + // If the specific cause is already a GuacamoleException, there's + // nothing for us to do here + if (cause instanceof GuacamoleException) + return (GuacamoleException) cause; + + // Wrap all other Throwables as generic internal errors + return new GuacamoleServerException(message, cause); + + } + + /** + * Creates a new GuacamoleAuthenticationProcessException with the given + * message, associated AuthenticationProvider, and cause. + * + * @param message + * A human readable description of the exception that occurred. + * + * @param authProvider + * The AuthenticationProvider that caused the failure, or null if there + * is no such specific AuthenticationProvider involved in this failure. + * + * @param cause + * The cause of this exception, or null if the cause is unknown or + * there is no such cause. + */ + public GuacamoleAuthenticationProcessException(String message, + AuthenticationProvider authProvider, Throwable cause) { + super(message, cause); + this.authProvider = authProvider; + this.guacCause = toGuacamoleException(message, cause); + } + + /** + * Returns the AuthenticationProvider that caused the failure, if any. If + * there is no specific AuthenticationProvider involved in this failure, + * including if the failure is due to multiple AuthenticationProviders, + * this will be null. + * + * @return + * The AuthenticationProvider that caused the failure, or null if there + * is no such specific AuthenticationProvider involved in this failure. + */ + public AuthenticationProvider getAuthenticationProvider() { + return authProvider; + } + + /** + * Returns a GuacamoleException that represents the user-facing cause of + * this exception. A GuacamoleException will be returned by this function + * in all cases, including if no specific cause was given. + * + * @return + * A GuacamoleException that represents the user-facing cause of this + * exception. + */ + public GuacamoleException getCauseAsGuacamoleException() { + return guacCause; + } + + /** + * Rethrows the original GuacamoleException wrapped within this + * GuacamoleAuthenticationProcessException. If there is no such exception, + * and the cause of this failure is an unchecked RuntimeException or Error, + * that unchecked exception/error is rethrown as-is. + * + * @throws GuacamoleException + * If the underlying cause of this exception is a checked + * GuacamoleException subclass. + * + * @throws RuntimeException + * If the underlying cause of this exception is an unchecked + * RuntimeException. + * + * @throws Error + * If the underlying cause of this exception is an unchecked Error. + */ + public void rethrowCause() throws GuacamoleException, RuntimeException, Error { + + // Rethrow any unchecked exceptions/errors as-is + Throwable cause = getCause(); + if (cause instanceof RuntimeException) + throw (RuntimeException) cause; + if (cause instanceof Error) + throw (Error) cause; + + // Pass through all other exceptions as normal GuacamoleException + // subclassses + throw getCauseAsGuacamoleException(); + + } + + @Override + public GuacamoleStatus getStatus() { + return getCauseAsGuacamoleException().getStatus(); + } + + @Override + public int getHttpStatusCode() { + return getCauseAsGuacamoleException().getHttpStatusCode(); + } + + @Override + public int getWebSocketCode() { + return getCauseAsGuacamoleException().getWebSocketCode(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/HashTokenSessionMap.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/HashTokenSessionMap.java new file mode 100644 index 0000000..cabbb78 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/HashTokenSessionMap.java @@ -0,0 +1,248 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A HashMap-based implementation of the TokenSessionMap with support for + * session timeouts. + */ +public class HashTokenSessionMap implements TokenSessionMap { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(HashTokenSessionMap.class); + + /** + * Executor service which runs the period session eviction task. + */ + private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + + /** + * Keeps track of the authToken to GuacamoleSession mapping. + */ + private final ConcurrentMap sessionMap = + new ConcurrentHashMap(); + + /** + * The session timeout for the Guacamole REST API, in minutes. + */ + private final IntegerGuacamoleProperty API_SESSION_TIMEOUT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "api-session-timeout"; } + + }; + + /** + * Create a new HashTokenSessionMap configured using the given environment. + * + * @param environment + * The environment to use when configuring the token session map. + */ + public HashTokenSessionMap(Environment environment) { + + int sessionTimeoutValue; + + // Read session timeout from guacamole.properties + try { + sessionTimeoutValue = environment.getProperty(API_SESSION_TIMEOUT, 60); + } + catch (GuacamoleException e) { + logger.error("Unable to read guacamole.properties: {}", e.getMessage()); + logger.debug("Error while reading session timeout value.", e); + sessionTimeoutValue = 60; + } + + // Check for expired sessions every minute + logger.info("Sessions will expire after {} minutes of inactivity.", sessionTimeoutValue); + executor.scheduleAtFixedRate(new SessionEvictionTask(sessionTimeoutValue * 60000l), 1, 1, TimeUnit.MINUTES); + + } + + /** + * Task which iterates through all active sessions, evicting those sessions + * which are beyond the session timeout, or are marked as invalid by an + * extension. + */ + private class SessionEvictionTask implements Runnable { + + /** + * The maximum allowed age of any session, in milliseconds. + */ + private final long sessionTimeout; + + /** + * Creates a new task which automatically evicts sessions which are + * older than the specified timeout, or are marked as invalid by an + * extension. + * + * @param sessionTimeout The maximum age of any session, in + * milliseconds. + */ + public SessionEvictionTask(long sessionTimeout) { + this.sessionTimeout = sessionTimeout; + } + + /** + * Iterates through all active sessions, evicting those sessions which + * are beyond the session timeout, or are marked as invalid. Internal + * errors which would otherwise stop the session eviction process are + * caught, logged, and the process is allowed to proceed. + */ + private void evictExpiredOrInvalidSessions() { + + // Get start time of session check time + long sessionCheckStart = System.currentTimeMillis(); + + logger.debug("Checking for expired or invalid sessions..."); + + // For each session, remove sesions which have expired + Iterator> entries = sessionMap.entrySet().iterator(); + while (entries.hasNext()) { + + Map.Entry entry = entries.next(); + GuacamoleSession session = entry.getValue(); + + try { + + // Invalidate any sessions which have been flagged as invalid by extensions + if (!session.isValid()) { + logger.debug( + "Session \"{}\" has been invalidated by an extension.", + entry.getKey()); + entries.remove(); + session.invalidate(); + } + + // Do not expire sessions which are active + if (session.hasTunnels()) + continue; + + // Get elapsed time since last access + long age = sessionCheckStart - session.getLastAccessedTime(); + + // If session is too old, evict it and check the next one + if (age >= sessionTimeout) { + logger.debug("Session \"{}\" has timed out.", entry.getKey()); + entries.remove(); + session.invalidate(); + } + + } + catch (Throwable t) { + logger.error("An unexpected internal error prevented a " + + "session from being invalidated. This should " + + "NOT happen and is likely a bug. Depending on " + + "the nature of the failure, the session may " + + "still be valid.", t); + } + + } + + // Log completion and duration + logger.debug("Session check completed in {} ms.", + System.currentTimeMillis() - sessionCheckStart); + + } + + @Override + public void run() { + + // The evictExpiredOrInvalidSessions() function should already + // automatically handle and log all unexpected internal errors, + // but wrap the entire call in a try/catch plus additional logging + // to ensure that absolutely no errors can result in the entire + // thread dying + try { + evictExpiredOrInvalidSessions(); + } + catch (Throwable t) { + logger.error("An unexpected internal error prevented the " + + "session eviction task from completing " + + "successfully. This should NOT happen and is likely " + + "a bug. Sessions that should have expired may " + + "remain valid.", t); + } + + } + + } + + @Override + public GuacamoleSession get(String authToken) { + + // There are no null auth tokens + if (authToken == null) + return null; + + // Return the GuacamoleSession having the given auth token (NOTE: We + // do not update the access time here, as it is necessary to be able + // to retrieve and check the session without causing that session to + // be marked as active. Instead, those updates occur as needed when + // functions within the GuacamoleSession are invoked.) + return sessionMap.get(authToken); + + } + + @Override + public void put(String authToken, GuacamoleSession session) { + sessionMap.put(authToken, session); + } + + @Override + public GuacamoleSession remove(String authToken) { + + // There are no null auth tokens + if (authToken == null) + return null; + + // Attempt to retrieve only if non-null + return sessionMap.remove(authToken); + + } + + @Override + public void shutdown() { + + // Terminate the automatic session invalidation thread + executor.shutdownNow(); + + // Forcibly invalidate any remaining sessions + sessionMap.values().stream().forEach(GuacamoleSession::invalidate); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/SecureRandomAuthTokenGenerator.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/SecureRandomAuthTokenGenerator.java new file mode 100644 index 0000000..09a6340 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/SecureRandomAuthTokenGenerator.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import com.google.common.io.BaseEncoding; +import java.security.SecureRandom; + +/** + * An implementation of the AuthTokenGenerator based around SecureRandom. + */ +public class SecureRandomAuthTokenGenerator implements AuthTokenGenerator { + + /** + * Instance of SecureRandom for generating the auth token. + */ + private final SecureRandom secureRandom = new SecureRandom(); + + @Override + public String getToken() { + byte[] bytes = new byte[32]; + secureRandom.nextBytes(bytes); + + return BaseEncoding.base16().encode(bytes); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/TokenRESTService.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/TokenRESTService.java new file mode 100644 index 0000000..427af7f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/TokenRESTService.java @@ -0,0 +1,219 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import com.google.common.io.BaseEncoding; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.DELETE; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.rest.APIRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A service for managing auth tokens via the Guacamole REST API. + */ +@Path("/tokens") +@Produces(MediaType.APPLICATION_JSON) +public class TokenRESTService { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(TokenRESTService.class); + + /** + * Service for authenticating users and managing their Guacamole sessions. + */ + @Inject + private AuthenticationService authenticationService; + + /** + * Returns the credentials associated with the given request, using the + * provided username and password. + * + * @param request + * The request to use to derive the credentials. + * + * @param username + * The username to associate with the credentials, or null if the + * username should be derived from the request. + * + * @param password + * The password to associate with the credentials, or null if the + * password should be derived from the request. + * + * @return + * A new Credentials object whose contents have been derived from the + * given request, along with the provided username and password. + */ + private Credentials getCredentials(HttpServletRequest request, + String username, String password) { + + // If no username/password given, try Authorization header + if (username == null && password == null) { + + String authorization = request.getHeader("Authorization"); + if (authorization != null && authorization.startsWith("Basic ")) { + + try { + + // Decode base64 authorization + String basicBase64 = authorization.substring(6); + String basicCredentials = new String( + BaseEncoding.base64().decode(basicBase64), "UTF-8"); + + // Pull username/password from auth data + int colon = basicCredentials.indexOf(':'); + if (colon != -1) { + username = basicCredentials.substring(0, colon); + password = basicCredentials.substring(colon + 1); + } + else + logger.debug("Invalid HTTP Basic \"Authorization\" header received."); + + } + + // UTF-8 support is required by the Java specification + catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("Unexpected lack of UTF-8 support.", e); + } + + } + + } // end Authorization header fallback + + // Build credentials + return new Credentials(username, password, request); + + } + + /** + * Authenticates a user, generates an auth token, associates that auth token + * with the user's UserContext for use by further requests. If an existing + * token is provided, the authentication procedure will attempt to update + * or reuse the provided token. + * + * @param username + * The username of the user who is to be authenticated. + * + * @param password + * The password of the user who is to be authenticated. + * + * @param token + * An optional existing auth token for the user who is to be + * authenticated. + * + * @param consumedRequest + * The HttpServletRequest associated with the login attempt. The + * parameters of this request may not be accessible, as the request may + * have been fully consumed by JAX-RS. + * + * @param parameters + * A MultivaluedMap containing all parameters from the given HTTP + * request. All request parameters must be made available through this + * map, even if those parameters are no longer accessible within the + * now-fully-consumed HTTP request. + * + * @return + * An authentication response object containing the possible-new auth + * token, as well as other related data. + * + * @throws GuacamoleException + * If an error prevents successful authentication. + */ + @POST + public APIAuthenticationResult createToken(@FormParam("username") String username, + @FormParam("password") String password, + @FormParam("token") String token, + @Context HttpServletRequest consumedRequest, + MultivaluedMap parameters) + throws GuacamoleException { + + // Reconstitute the HTTP request with the map of parameters + HttpServletRequest request = new APIRequest(consumedRequest, parameters); + + // Build credentials from request + Credentials credentials = getCredentials(request, username, password); + + // Create/update session producing possibly-new token + token = authenticationService.authenticate(credentials, token); + + // Pull corresponding session + GuacamoleSession session = authenticationService.getGuacamoleSession(token); + if (session == null) + throw new GuacamoleResourceNotFoundException("No such token."); + + // Build list of all available auth providers + List userContexts = session.getUserContexts(); + List authProviderIdentifiers = new ArrayList(userContexts.size()); + for (UserContext userContext : userContexts) + authProviderIdentifiers.add(userContext.getAuthenticationProvider().getIdentifier()); + + // Return possibly-new auth token + AuthenticatedUser authenticatedUser = session.getAuthenticatedUser(); + return new APIAuthenticationResult( + token, + authenticatedUser.getIdentifier(), + authenticatedUser.getAuthenticationProvider().getIdentifier(), + authProviderIdentifiers + ); + + } + + /** + * Invalidates a specific auth token, effectively logging out the associated + * user. + * + * @param authToken + * The token being invalidated. + * + * @throws GuacamoleException + * If the specified token does not exist. + */ + @DELETE + @Path("/{token}") + public void invalidateToken(@PathParam("token") String authToken) + throws GuacamoleException { + + // Invalidate session, if it exists + if (!authenticationService.destroyGuacamoleSession(authToken)) + throw new GuacamoleResourceNotFoundException("No such token."); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/TokenSessionMap.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/TokenSessionMap.java new file mode 100644 index 0000000..3175239 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/TokenSessionMap.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.auth; + +import org.apache.guacamole.GuacamoleSession; + +/** + * Represents a mapping of auth token to Guacamole session for the REST + * authentication system. + */ +public interface TokenSessionMap { + + /** + * Registers that a user has just logged in with the specified authToken and + * GuacamoleSession. + * + * @param authToken The authentication token for the logged in user. + * @param session The GuacamoleSession for the logged in user. + */ + public void put(String authToken, GuacamoleSession session); + + /** + * Get the GuacamoleSession for a logged in user. If the auth token does not + * represent a user who is currently logged in, returns null. + * + * @param authToken The authentication token for the logged in user. + * @return The GuacamoleSession for the given auth token, if the auth token + * represents a currently logged in user, null otherwise. + */ + public GuacamoleSession get(String authToken); + + /** + * Removes the GuacamoleSession associated with the given auth token. + * + * @param authToken The token to remove. + * @return The GuacamoleSession for the given auth token, if the auth token + * represents a currently logged in user, null otherwise. + */ + public GuacamoleSession remove(String authToken); + + /** + * Shuts down this session map, disallowing future sessions and reclaiming + * any resources. + */ + public void shutdown(); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/package-info.java new file mode 100644 index 0000000..cc8de1b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the authentication aspect of the Guacamole REST API. + */ +package org.apache.guacamole.rest.auth; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java new file mode 100644 index 0000000..f1e521b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java @@ -0,0 +1,292 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connection; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.rest.sharingprofile.APISharingProfile; + +/** + * A simple connection to expose through the REST endpoints. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value=Include.NON_NULL) +public class APIConnection { + + /** + * The name of this connection. + */ + private String name; + + /** + * The identifier of this connection. + */ + private String identifier; + + /** + * The identifier of the parent connection group for this connection. + */ + private String parentIdentifier; + + /** + * The protocol of this connection. + */ + private String protocol; + + /** + * Map of all associated parameter values, indexed by parameter name. + */ + private Map parameters; + + /** + * Map of all associated attributes by attribute identifier. + */ + private Map attributes; + + /** + * All associated sharing profiles. If sharing profiles are not being + * queried, this may be omitted. + */ + private Collection sharingProfiles; + + /** + * The count of currently active connections using this connection. + */ + private int activeConnections; + + /** + * The date and time that this connection was last used, or null if this + * connection has never been used or this information is unavailable. + */ + private Date lastActive; + + /** + * Create an empty APIConnection. + */ + public APIConnection() {} + + /** + * Create an APIConnection from a Connection record. Parameters for the + * connection will not be included. + * + * @param connection The connection to create this APIConnection from. + * @throws GuacamoleException If a problem is encountered while + * instantiating this new APIConnection. + */ + public APIConnection(Connection connection) + throws GuacamoleException { + + // Set connection information + this.name = connection.getName(); + this.identifier = connection.getIdentifier(); + this.parentIdentifier = connection.getParentIdentifier(); + this.activeConnections = connection.getActiveConnections(); + this.lastActive = connection.getLastActive(); + + // Set protocol from configuration + GuacamoleConfiguration configuration = connection.getConfiguration(); + this.protocol = configuration.getProtocol(); + + // Associate any attributes + this.attributes = connection.getAttributes(); + + } + + /** + * Returns the name of this connection. + * @return The name of this connection. + */ + public String getName() { + return name; + } + + /** + * Set the name of this connection. + * @param name The name of this connection. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the unique identifier for this connection. + * @return The unique identifier for this connection. + */ + public String getIdentifier() { + return identifier; + } + + /** + * Sets the unique identifier for this connection. + * @param identifier The unique identifier for this connection. + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + /** + * Returns the unique identifier for this connection. + * @return The unique identifier for this connection. + */ + public String getParentIdentifier() { + return parentIdentifier; + } + + /** + * Sets the parent connection group identifier for this connection. + * @param parentIdentifier The parent connection group identifier + * for this connection. + */ + public void setParentIdentifier(String parentIdentifier) { + this.parentIdentifier = parentIdentifier; + } + + /** + * Returns the parameter map for this connection. + * @return The parameter map for this connection. + */ + public Map getParameters() { + return parameters; + } + + /** + * Sets the parameter map for this connection. + * @param parameters The parameter map for this connection. + */ + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + /** + * Returns the protocol for this connection. + * @return The protocol for this connection. + */ + public String getProtocol() { + return protocol; + } + + /** + * Sets the protocol for this connection. + * @param protocol protocol for this connection. + */ + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + /** + * Returns the number of currently active connections using this + * connection. + * + * @return + * The number of currently active usages of this connection. + */ + public int getActiveConnections() { + return activeConnections; + } + + /** + * Set the number of currently active connections using this connection. + * + * @param activeConnections + * The number of currently active usages of this connection. + */ + public void setActiveUsers(int activeConnections) { + this.activeConnections = activeConnections; + } + + /** + * Returns a map of all attributes associated with this connection. Each + * entry key is the attribute identifier, while each value is the attribute + * value itself. + * + * @return + * The attribute map for this connection. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Sets the map of all attributes associated with this connection. Each + * entry key is the attribute identifier, while each value is the attribute + * value itself. + * + * @param attributes + * The attribute map for this connection. + */ + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + /** + * Returns a collection of all associated sharing profiles, or null if + * sharing profiles have not been queried. + * + * @return + * A collection of all associated sharing profiles, or null if sharing + * profiles have not been queried. + */ + public Collection getSharingProfiles() { + return sharingProfiles; + } + + /** + * Sets the collection of all associated sharing profiles to the given + * collection, which may be null if sharing profiles have not been queried. + * + * @param sharingProfiles + * The collection containing all sharing profiles associated with this + * connection, or null if sharing profiles have not been queried. + */ + public void setSharingProfiles(Collection sharingProfiles) { + this.sharingProfiles = sharingProfiles; + } + + /** + * Returns the date and time that this connection was last used, or null if + * this connection has never been used or this information is unavailable. + * + * @return + * The date and time that this connection was last used, or null if this + * connection has never been used or this information is unavailable. + */ + public Date getLastActive() { + return lastActive; + } + + /** + * Sets the date and time that this connection was last used. + * + * @param lastActive + * The date and time that this connection was last used, or null if this + * connection has never been used or this information is unavailable. + */ + public void setLastActive(Date lastActive) { + this.lastActive = lastActive; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java new file mode 100644 index 0000000..6b407b4 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connection; + +import java.util.Date; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.protocol.GuacamoleConfiguration; + +/** + * A wrapper to make an APIConnection look like a Connection. Useful where a + * org.apache.guacamole.net.auth.Connection is required. + */ +public class APIConnectionWrapper implements Connection { + + /** + * The wrapped APIConnection. + */ + private final APIConnection apiConnection; + + /** + * Creates a new APIConnectionWrapper which wraps the given APIConnection + * as a Connection. + * + * @param apiConnection + * The APIConnection to wrap. + */ + public APIConnectionWrapper(APIConnection apiConnection) { + this.apiConnection = apiConnection; + } + + @Override + public String getName() { + return apiConnection.getName(); + } + + @Override + public void setName(String name) { + apiConnection.setName(name); + } + + @Override + public String getIdentifier() { + return apiConnection.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + apiConnection.setIdentifier(identifier); + } + + @Override + public String getParentIdentifier() { + return apiConnection.getParentIdentifier(); + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + apiConnection.setParentIdentifier(parentIdentifier); + } + + @Override + public int getActiveConnections() { + return apiConnection.getActiveConnections(); + } + + @Override + public GuacamoleConfiguration getConfiguration() { + + // Create the GuacamoleConfiguration with current protocol + GuacamoleConfiguration configuration = new GuacamoleConfiguration(); + configuration.setProtocol(apiConnection.getProtocol()); + + // Add parameters, if available + Map parameters = apiConnection.getParameters(); + if (parameters != null) + configuration.setParameters(parameters); + + return configuration; + } + + @Override + public void setConfiguration(GuacamoleConfiguration config) { + + // Set protocol and parameters + apiConnection.setProtocol(config.getProtocol()); + apiConnection.setParameters(config.getParameters()); + + } + + @Override + public Map getAttributes() { + return apiConnection.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + apiConnection.setAttributes(attributes); + } + + @Override + public Set getSharingProfileIdentifiers() throws GuacamoleException { + throw new GuacamoleUnsupportedException("Operation not supported."); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + throw new GuacamoleUnsupportedException("Operation not supported."); + } + + @Override + public Date getLastActive() { + return null; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionDirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionDirectoryResource.java new file mode 100644 index 0000000..612e055 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionDirectoryResource.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connection; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * A REST resource which abstracts the operations available on a Directory of + * Connections. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ConnectionDirectoryResource + extends DirectoryResource { + + /** + * Creates a new ConnectionDirectoryResource which exposes the operations + * and subresources available for the given Connection Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory being exposed. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * Connections. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing Connections. + */ + @AssistedInject + public ConnectionDirectoryResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, @Assisted Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + super(authenticatedUser, userContext, Connection.class, directory, translator, resourceFactory); + } + + @Override + protected ObjectPermissionSet getObjectPermissions(Permissions permissions) + throws GuacamoleException { + return permissions.getConnectionPermissions(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionModule.java new file mode 100644 index 0000000..333c34e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionModule.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connection; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import com.google.inject.TypeLiteral; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * Guice Module which configures injections required for handling Connection + * resources via the REST API. + */ +public class ConnectionModule extends AbstractModule { + + @Override + protected void configure() { + + // Create the required DirectoryResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + ConnectionDirectoryResource.class + ) + .build(new TypeLiteral>() {})); + + // Create the required DirectoryObjectResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + ConnectionResource.class + ) + .build(new TypeLiteral>() {})); + + // Bind translator for converting between Connection and APIConnection + bind(new TypeLiteral>() {}) + .to(ConnectionObjectTranslator.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java new file mode 100644 index 0000000..416fb4a --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connection; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * Translator which converts between Connection objects and APIConnection + * objects. + */ +public class ConnectionObjectTranslator + extends DirectoryObjectTranslator { + + @Override + public APIConnection toExternalObject(Connection object) + throws GuacamoleException { + return new APIConnection(object); + } + + @Override + public Connection toInternalObject(APIConnection object) { + return new APIConnectionWrapper(object); + } + + @Override + public void applyExternalChanges(Connection existingObject, + APIConnection object) { + + // Build updated configuration + GuacamoleConfiguration config = new GuacamoleConfiguration(); + config.setProtocol(object.getProtocol()); + config.setParameters(object.getParameters()); + + // Update the connection + existingObject.setConfiguration(config); + existingObject.setParentIdentifier(object.getParentIdentifier()); + existingObject.setName(object.getName()); + existingObject.setAttributes(object.getAttributes()); + + } + + @Override + public void filterExternalObject(UserContext userContext, + APIConnection object) throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes( + userContext.getConnectionAttributes(), object.getAttributes())); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java new file mode 100644 index 0000000..484543b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java @@ -0,0 +1,215 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connection; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import java.util.Map; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.rest.directory.DirectoryView; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; +import org.apache.guacamole.protocol.GuacamoleConfiguration; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import org.apache.guacamole.rest.history.ConnectionHistoryResource; +import org.apache.guacamole.rest.sharingprofile.APISharingProfile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A REST resource which abstracts the operations available on an existing + * Connection. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ConnectionResource extends DirectoryObjectResource { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ConnectionResource.class); + + /** + * A factory which can be used to create instances of resources representing + * SharingProfiles. + */ + @Inject + private DirectoryResourceFactory + sharingProfileDirectoryResourceFactory; + + /** + * Creates a new ConnectionResource which exposes the operations and + * subresources available for the given Connection. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory which contains the given Connection. + * + * @param connection + * The Connection that this ConnectionResource should represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles the type of + * object given. + */ + @AssistedInject + public ConnectionResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + @Assisted Connection connection, + DirectoryObjectTranslator translator) { + super(authenticatedUser, userContext, Connection.class, directory, connection, translator); + } + + /** + * Retrieves the parameters associated with a single connection. + * + * @return + * A map of parameter name/value pairs. + * + * @throws GuacamoleException + * If an error occurs while retrieving the connection parameters. + */ + @GET + @Path("parameters") + public Map getConnectionParameters() + throws GuacamoleException { + + Connection connection = getInternalObject(); + + // Pull effective permissions + Permissions effective = getUserContext().self().getEffectivePermissions(); + + // Retrieve permission sets + SystemPermissionSet systemPermissions = effective.getSystemPermissions(); + ObjectPermissionSet connectionPermissions = effective.getConnectionPermissions(); + + // Deny access if adminstrative or update permission is missing + String identifier = connection.getIdentifier(); + if (!systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER) + && !connectionPermissions.hasPermission(ObjectPermission.Type.UPDATE, identifier)) + throw new GuacamoleSecurityException("Permission to read connection parameters denied."); + + // Retrieve connection configuration + GuacamoleConfiguration config = connection.getConfiguration(); + + // Return parameter map + return config.getParameters(); + + } + + /** + * Retrieves the usage history of a single connection. + * + * @return + * A list of connection records, describing the start and end times of + * various usages of this connection. + * + * @throws GuacamoleException + * If an error occurs while retrieving the connection history. + */ + @SuppressWarnings("deprecation") + @Path("history") + public ConnectionHistoryResource getConnectionHistory() + throws GuacamoleException { + + Connection connection = getInternalObject(); + + // Try the current getConnectionHistory() method, first, for connection history. + try { + return new ConnectionHistoryResource(connection.getConnectionHistory() + .sort(ActivityRecordSet.SortableProperty.START_DATE, true)); + } + catch (GuacamoleUnsupportedException e) { + logger.debug("Call to getConnectionHistory() is unsupported, falling back to getHistory().", e); + } + + // Fall back to the deprecated getHistory() method. + try { + return new ConnectionHistoryResource(new SimpleActivityRecordSet<>(connection.getHistory())); + } + catch (GuacamoleUnsupportedException e) { + logger.debug("Call to getHistory() is unsupported, no connection history records will be returned.", e); + } + + // If all fails, return an empty connection history set. + return new ConnectionHistoryResource(new SimpleActivityRecordSet<>()); + + } + + /** + * Returns a resource which provides read-only access to the subset of + * SharingProfiles that the current user can use to share this connection. + * + * @return + * A resource which provides read-only access to the subset of + * SharingProfiles that the current user can use to share this + * connection. + * + * @throws GuacamoleException + * If the SharingProfiles associated with this connection cannot be + * retrieved. + */ + @Path("sharingProfiles") + public DirectoryResource + getSharingProfileDirectoryResource() throws GuacamoleException { + + UserContext userContext = getUserContext(); + Connection connection = getInternalObject(); + + // Produce subset of all SharingProfiles, containing only those which + // are associated with this connection + Directory sharingProfiles = new DirectoryView<>( + userContext.getSharingProfileDirectory(), + connection.getSharingProfileIdentifiers() + ); + + // Return a new resource which provides access to only those SharingProfiles + return sharingProfileDirectoryResourceFactory.create(getAuthenticatedUser(), userContext, sharingProfiles); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/package-info.java new file mode 100644 index 0000000..b5c5bd9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the connection manipulation aspect of the Guacamole REST API. + */ +package org.apache.guacamole.rest.connection; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/APIConnectionGroup.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/APIConnectionGroup.java new file mode 100644 index 0000000..3ab1f42 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/APIConnectionGroup.java @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Collection; +import java.util.Map; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.ConnectionGroup.Type; +import org.apache.guacamole.rest.connection.APIConnection; + +/** + * A simple connection group to expose through the REST endpoints. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value=Include.NON_NULL) +public class APIConnectionGroup { + + /** + * The identifier of the root connection group. + */ + public static final String ROOT_IDENTIFIER = "ROOT"; + + /** + * The name of this connection group. + */ + private String name; + + /** + * The identifier of this connection group. + */ + private String identifier; + + /** + * The identifier of the parent connection group for this connection group. + */ + private String parentIdentifier; + + /** + * The type of this connection group. + */ + private Type type; + + /** + * The count of currently active connections using this connection group. + */ + private int activeConnections; + + /** + * All child connection groups. If children are not being queried, this may + * be omitted. + */ + private Collection childConnectionGroups; + + /** + * All child connections. If children are not being queried, this may be + * omitted. + */ + private Collection childConnections; + + /** + * Map of all associated attributes by attribute identifier. + */ + private Map attributes; + + /** + * Create an empty APIConnectionGroup. + */ + public APIConnectionGroup() {} + + /** + * Create a new APIConnectionGroup from the given ConnectionGroup record. + * + * @param connectionGroup The ConnectionGroup record to initialize this + * APIConnectionGroup from. + */ + public APIConnectionGroup(ConnectionGroup connectionGroup) { + + // Set connection group information + this.identifier = connectionGroup.getIdentifier(); + this.parentIdentifier = connectionGroup.getParentIdentifier(); + this.name = connectionGroup.getName(); + this.type = connectionGroup.getType(); + this.activeConnections = connectionGroup.getActiveConnections(); + + // Associate any attributes + this.attributes = connectionGroup.getAttributes(); + + } + + /** + * Returns the name of this connection group. + * @return The name of this connection group. + */ + public String getName() { + return name; + } + + /** + * Set the name of this connection group. + * @param name The name of this connection group. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the identifier of this connection group. + * @return The identifier of this connection group. + */ + public String getIdentifier() { + return identifier; + } + + /** + * Set the identifier of this connection group. + * @param identifier The identifier of this connection group. + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + /** + * Returns the unique identifier for this connection group. + * @return The unique identifier for this connection group. + */ + public String getParentIdentifier() { + return parentIdentifier; + } + /** + * Sets the parent connection group identifier for this connection group. + * @param parentIdentifier The parent connection group identifier + * for this connection group. + */ + public void setParentIdentifier(String parentIdentifier) { + this.parentIdentifier = parentIdentifier; + } + + /** + * Returns the type of this connection group. + * @return The type of this connection group. + */ + public Type getType() { + return type; + } + + /** + * Set the type of this connection group. + * @param type The Type of this connection group. + */ + public void setType(Type type) { + this.type = type; + } + + /** + * Returns a collection of all child connection groups, or null if children + * have not been queried. + * + * @return + * A collection of all child connection groups, or null if children + * have not been queried. + */ + public Collection getChildConnectionGroups() { + return childConnectionGroups; + } + + /** + * Sets the collection of all child connection groups to the given + * collection, which may be null if children have not been queried. + * + * @param childConnectionGroups + * The collection containing all child connection groups of this + * connection group, or null if children have not been queried. + */ + public void setChildConnectionGroups(Collection childConnectionGroups) { + this.childConnectionGroups = childConnectionGroups; + } + + /** + * Returns a collection of all child connections, or null if children have + * not been queried. + * + * @return + * A collection of all child connections, or null if children have not + * been queried. + */ + public Collection getChildConnections() { + return childConnections; + } + + /** + * Sets the collection of all child connections to the given collection, + * which may be null if children have not been queried. + * + * @param childConnections + * The collection containing all child connections of this connection + * group, or null if children have not been queried. + */ + public void setChildConnections(Collection childConnections) { + this.childConnections = childConnections; + } + + /** + * Returns the number of currently active connections using this + * connection group. + * + * @return + * The number of currently active usages of this connection group. + */ + public int getActiveConnections() { + return activeConnections; + } + + /** + * Set the number of currently active connections using this connection + * group. + * + * @param activeConnections + * The number of currently active usages of this connection group. + */ + public void setActiveUsers(int activeConnections) { + this.activeConnections = activeConnections; + } + + /** + * Returns a map of all attributes associated with this connection group. + * Each entry key is the attribute identifier, while each value is the + * attribute value itself. + * + * @return + * The attribute map for this connection group. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Sets the map of all attributes associated with this connection group. + * Each entry key is the attribute identifier, while each value is the + * attribute value itself. + * + * @param attributes + * The attribute map for this connection group. + */ + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/APIConnectionGroupWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/APIConnectionGroupWrapper.java new file mode 100644 index 0000000..552b787 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/APIConnectionGroupWrapper.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * A wrapper to make an APIConnection look like a ConnectionGroup. + * Useful where a org.apache.guacamole.net.auth.ConnectionGroup is required. + */ +public class APIConnectionGroupWrapper implements ConnectionGroup { + + /** + * The wrapped APIConnectionGroup. + */ + private final APIConnectionGroup apiConnectionGroup; + + /** + * Create a new APIConnectionGroupWrapper to wrap the given + * APIConnectionGroup as a ConnectionGroup. + * @param apiConnectionGroup the APIConnectionGroup to wrap. + */ + public APIConnectionGroupWrapper(APIConnectionGroup apiConnectionGroup) { + this.apiConnectionGroup = apiConnectionGroup; + } + + @Override + public String getName() { + return apiConnectionGroup.getName(); + } + + @Override + public void setName(String name) { + apiConnectionGroup.setName(name); + } + + @Override + public String getIdentifier() { + return apiConnectionGroup.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + apiConnectionGroup.setIdentifier(identifier); + } + + @Override + public String getParentIdentifier() { + return apiConnectionGroup.getParentIdentifier(); + } + + @Override + public void setParentIdentifier(String parentIdentifier) { + apiConnectionGroup.setParentIdentifier(parentIdentifier); + } + + @Override + public void setType(Type type) { + apiConnectionGroup.setType(type); + } + + @Override + public Type getType() { + return apiConnectionGroup.getType(); + } + + @Override + public int getActiveConnections() { + return apiConnectionGroup.getActiveConnections(); + } + + @Override + public Set getConnectionIdentifiers() { + throw new UnsupportedOperationException("Operation not supported."); + } + + @Override + public Set getConnectionGroupIdentifiers() { + throw new UnsupportedOperationException("Operation not supported."); + } + + @Override + public Map getAttributes() { + return apiConnectionGroup.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + apiConnectionGroup.setAttributes(attributes); + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map tokens) throws GuacamoleException { + throw new UnsupportedOperationException("Operation not supported."); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupDirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupDirectoryResource.java new file mode 100644 index 0000000..adf4278 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupDirectoryResource.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * A REST resource which abstracts the operations available on a Directory of + * ConnectionGroups. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ConnectionGroupDirectoryResource + extends DirectoryResource { + + /** + * Creates a new ConnectionGroupDirectoryResource which exposes the + * operations and subresources available for the given ConnectionGroup + * Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory being exposed. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * ConnectionGroups. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing ConnectionGroups. + */ + @AssistedInject + public ConnectionGroupDirectoryResource( + @Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + super(authenticatedUser, userContext, ConnectionGroup.class, directory, translator, resourceFactory); + } + + @Override + public DirectoryObjectResource + getObjectResource(String identifier) throws GuacamoleException { + + UserContext userContext = getUserContext(); + + // Use root group if identifier is the standard root identifier + if (identifier != null && identifier.equals(APIConnectionGroup.ROOT_IDENTIFIER)) + return getResourceFactory().create(getAuthenticatedUser(), userContext, getDirectory(), + userContext.getRootConnectionGroup()); + + return super.getObjectResource(identifier); + + } + + @Override + protected ObjectPermissionSet getObjectPermissions(Permissions permissions) + throws GuacamoleException { + return permissions.getConnectionGroupPermissions(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupModule.java new file mode 100644 index 0000000..d73817a --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupModule.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import com.google.inject.TypeLiteral; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * Guice Module which configures injections required for handling + * ConnectionGroup resources via the REST API. + */ +public class ConnectionGroupModule extends AbstractModule { + + @Override + protected void configure() { + + // Create the required DirectoryResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + ConnectionGroupDirectoryResource.class + ) + .build(new TypeLiteral>() {})); + + // Create the required DirectoryObjectResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + ConnectionGroupResource.class + ) + .build(new TypeLiteral>() {})); + + // Bind translator for converting between ConnectionGroup and APIConnectionGroup + bind(new TypeLiteral>() {}) + .to(ConnectionGroupObjectTranslator.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java new file mode 100644 index 0000000..3c0ed38 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * Translator which converts between ConnectionGroup objects and + * APIConnectionGroup objects. + */ +public class ConnectionGroupObjectTranslator + extends DirectoryObjectTranslator { + + @Override + public APIConnectionGroup toExternalObject(ConnectionGroup object) + throws GuacamoleException { + return new APIConnectionGroup(object); + } + + @Override + public ConnectionGroup toInternalObject(APIConnectionGroup object) { + return new APIConnectionGroupWrapper(object); + } + + @Override + public void applyExternalChanges(ConnectionGroup existingObject, + APIConnectionGroup object) { + + // Update the connection group + existingObject.setName(object.getName()); + existingObject.setParentIdentifier(object.getParentIdentifier()); + existingObject.setType(object.getType()); + existingObject.setAttributes(object.getAttributes()); + + } + + @Override + public void filterExternalObject(UserContext userContext, + APIConnectionGroup object) throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes( + userContext.getConnectionGroupAttributes(), + object.getAttributes())); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java new file mode 100644 index 0000000..22f41b0 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import java.util.List; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * A REST resource which abstracts the operations available on an existing + * ConnectionGroup. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ConnectionGroupResource + extends DirectoryObjectResource { + + /** + * Creates a new ConnectionGroupResource which exposes the operations and + * subresources available for the given ConnectionGroup. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory which contains the given ConnectionGroup. + * + * @param connectionGroup + * The ConnectionGroup that this ConnectionGroupResource should + * represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles the type of + * object given. + */ + @AssistedInject + public ConnectionGroupResource( + @Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + @Assisted ConnectionGroup connectionGroup, + DirectoryObjectTranslator translator) { + super(authenticatedUser, userContext, ConnectionGroup.class, directory, connectionGroup, translator); + } + + /** + * Returns the current connection group along with all descendants. + * + * @param permissions + * If specified and non-empty, limit the returned list to only those + * connections for which the current user has any of the given + * permissions. Otherwise, all visible connections are returned. + * ConnectionGroups are unaffected by this parameter. + * + * @return + * The current connection group, including all descendants. + * + * @throws GuacamoleException + * If a problem is encountered while retrieving the connection group or + * its descendants. + */ + @GET + @Path("tree") + public APIConnectionGroup getConnectionGroupTree( + @QueryParam("permission") List permissions) + throws GuacamoleException { + + // Retrieve the requested tree, filtering by the given permissions + ConnectionGroupTree tree = new ConnectionGroupTree(getUserContext(), + getInternalObject(), permissions); + + // Return tree as a connection group + return tree.getRootAPIConnectionGroup(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupTree.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupTree.java new file mode 100644 index 0000000..1a3cb5f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupTree.java @@ -0,0 +1,386 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.connectiongroup; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.connection.APIConnection; +import org.apache.guacamole.rest.sharingprofile.APISharingProfile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides access to the entire tree of connection groups, their + * connections, and any associated sharing profiles. + */ +public class ConnectionGroupTree { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(ConnectionGroupTree.class); + + /** + * The root connection group as an APIConnectionGroup. + */ + private final APIConnectionGroup rootAPIGroup; + + /** + * All connection permissions granted to the user obtaining this tree. + */ + private final ObjectPermissionSet connectionPermissions; + + /** + * All sharing profile permissions granted to the user obtaining this tree. + */ + private final ObjectPermissionSet sharingProfilePermissions; + + /** + * The directory of all connections visible to the user obtaining this tree. + */ + private final Directory connectionDirectory; + + /** + * The directory of all connection groups visible to the user obtaining this + * tree. + */ + private final Directory connectionGroupDirectory; + + /** + * The directory of all sharing profiles visible to the user obtaining this + * tree. + */ + private final Directory sharingProfileDirectory; + + /** + * All connection groups that have been retrieved, stored by their + * identifiers. + */ + private final Map retrievedGroups = + new HashMap(); + + /** + * All connections that have been retrieved, stored by their identifiers. + */ + private final Map retrievedConnections = + new HashMap(); + + /** + * Adds each of the provided connections to the current tree as children + * of their respective parents. The parent connection groups must already + * be added. + * + * @param connections + * The connections to add to the tree. + * + * @throws GuacamoleException + * If an error occurs while adding the connection to the tree. + */ + private void addConnections(Collection connections) + throws GuacamoleException { + + // Add each connection to the tree + for (Connection connection : connections) { + + // Retrieve the connection's parent group + APIConnectionGroup parent = retrievedGroups.get(connection.getParentIdentifier()); + if (parent != null) { + + Collection children = parent.getChildConnections(); + + // Create child collection if it does not yet exist + if (children == null) { + children = new ArrayList(); + parent.setChildConnections(children); + } + + // Add child + APIConnection apiConnection = new APIConnection(connection); + retrievedConnections.put(connection.getIdentifier(), apiConnection); + children.add(apiConnection); + + } + + // Warn of internal consistency issues + else + logger.debug("Connection \"{}\" cannot be added to the tree: parent \"{}\" does not actually exist.", + connection.getIdentifier(), + connection.getParentIdentifier()); + + } // end for each connection + + } + + /** + * Adds each of the provided connection groups to the current tree as + * children of their respective parents. The parent connection groups must + * already be added. + * + * @param connectionGroups + * The connection groups to add to the tree. + */ + private void addConnectionGroups(Collection connectionGroups) { + + // Add each connection group to the tree + for (ConnectionGroup connectionGroup : connectionGroups) { + + // Retrieve the connection group's parent group + APIConnectionGroup parent = retrievedGroups.get(connectionGroup.getParentIdentifier()); + if (parent != null) { + + Collection children = parent.getChildConnectionGroups(); + + // Create child collection if it does not yet exist + if (children == null) { + children = new ArrayList(); + parent.setChildConnectionGroups(children); + } + + // Add child + APIConnectionGroup apiConnectionGroup = new APIConnectionGroup(connectionGroup); + retrievedGroups.put(connectionGroup.getIdentifier(), apiConnectionGroup); + children.add(apiConnectionGroup); + + } + + // Warn of internal consistency issues + else + logger.debug("Connection group \"{}\" cannot be added to the tree: parent \"{}\" does not actually exist.", + connectionGroup.getIdentifier(), + connectionGroup.getParentIdentifier()); + + } // end for each connection group + + } + + /** + * Adds each of the provided sharing profiles to the current tree as + * children of their respective primary connections. The primary connections + * must already be added. + * + * @param sharingProfiles + * The sharing profiles to add to the tree. + * + * @throws GuacamoleException + * If an error occurs while adding the sharing profiles to the tree. + */ + private void addSharingProfiles(Collection sharingProfiles) + throws GuacamoleException { + + // Add each sharing profile to the tree + for (SharingProfile sharingProfile : sharingProfiles) { + + // Retrieve the sharing profile's associated connection + String primaryConnectionIdentifier = sharingProfile.getPrimaryConnectionIdentifier(); + APIConnection primaryConnection = retrievedConnections.get(primaryConnectionIdentifier); + + // Add the sharing profile as a child of the primary connection + if (primaryConnection != null) { + + Collection children = primaryConnection.getSharingProfiles(); + + // Create child collection if it does not yet exist + if (children == null) { + children = new ArrayList(); + primaryConnection.setSharingProfiles(children); + } + + // Add child + children.add(new APISharingProfile(sharingProfile)); + + } + + // Warn of internal consistency issues + else + logger.debug("Sharing profile \"{}\" cannot be added to the " + + "tree: primary connection \"{}\" does not actually " + + "exist.", sharingProfile.getIdentifier(), + primaryConnectionIdentifier); + + } // end for each sharing profile + + } + + /** + * Adds all descendants of the given parent groups to their corresponding + * parents already stored under root. + * + * @param parents + * The parents whose descendants should be added to the tree. + * + * @param permissions + * If specified and non-empty, limit added connections to only + * connections for which the current user has any of the given + * permissions. Otherwise, all visible connections are added. + * Connection groups are unaffected by this parameter. + * + * @throws GuacamoleException + * If an error occurs while retrieving the descendants. + */ + private void addConnectionGroupDescendants(Collection parents, + List permissions) + throws GuacamoleException { + + // If no parents, nothing to do + if (parents.isEmpty()) + return; + + Collection childConnectionIdentifiers = new ArrayList(); + Collection childConnectionGroupIdentifiers = new ArrayList(); + + // Build lists of identifiers for retrieval + for (ConnectionGroup parent : parents) { + childConnectionIdentifiers.addAll(parent.getConnectionIdentifiers()); + childConnectionGroupIdentifiers.addAll(parent.getConnectionGroupIdentifiers()); + } + + // Filter identifiers based on permissions, if requested + if (permissions != null && !permissions.isEmpty()) + childConnectionIdentifiers = connectionPermissions.getAccessibleObjects( + permissions, childConnectionIdentifiers); + + // Retrieve child connections + if (!childConnectionIdentifiers.isEmpty()) { + Collection childConnections = connectionDirectory.getAll(childConnectionIdentifiers); + addConnections(childConnections); + addConnectionDescendants(childConnections, permissions); + } + + // Retrieve child connection groups + if (!childConnectionGroupIdentifiers.isEmpty()) { + Collection childConnectionGroups = connectionGroupDirectory.getAll(childConnectionGroupIdentifiers); + addConnectionGroups(childConnectionGroups); + addConnectionGroupDescendants(childConnectionGroups, permissions); + } + + } + + /** + * Adds all descendant sharing profiles of the given connections to their + * corresponding primary connections already stored under root. + * + * @param connections + * The connections whose descendant sharing profiles should be added to + * the tree. + * + * @param permissions + * If specified and non-empty, limit added sharing profiles to only + * those for which the current user has any of the given + * permissions. Otherwise, all visible sharing profiles are added. + * + * @throws GuacamoleException + * If an error occurs while retrieving the descendants. + */ + private void addConnectionDescendants(Collection connections, + List permissions) + throws GuacamoleException { + + // If no connections, nothing to do + if (connections.isEmpty()) + return; + + // Build lists of sharing profile identifiers for retrieval + Collection identifiers = new ArrayList(); + for (Connection connection : connections) + identifiers.addAll(connection.getSharingProfileIdentifiers()); + + // Filter identifiers based on permissions, if requested + if (permissions != null && !permissions.isEmpty()) + identifiers = sharingProfilePermissions.getAccessibleObjects( + permissions, identifiers); + + // Retrieve and add all associated sharing profiles + if (!identifiers.isEmpty()) { + Collection sharingProfiles = sharingProfileDirectory.getAll(identifiers); + addSharingProfiles(sharingProfiles); + } + + } + + /** + * Creates a new connection group tree using the given connection group as + * the tree root. + * + * @param userContext + * The context of the user obtaining the connection group tree. + * + * @param root + * The connection group to use as the root of this connection group + * tree. + * + * @param permissions + * If specified and non-empty, limit the contents of the tree to only + * those connections for which the current user has any of the given + * permissions. Otherwise, all visible connections are returned. + * Connection groups are unaffected by this parameter. + * + * @throws GuacamoleException + * If an error occurs while retrieving the tree of connection groups + * and their descendants. + */ + public ConnectionGroupTree(UserContext userContext, ConnectionGroup root, + List permissions) throws GuacamoleException { + + // Store root of tree + this.rootAPIGroup = new APIConnectionGroup(root); + retrievedGroups.put(root.getIdentifier(), this.rootAPIGroup); + + // Store user's current permissions + Permissions effective = userContext.self().getEffectivePermissions(); + this.connectionPermissions = effective.getConnectionPermissions(); + this.sharingProfilePermissions = effective.getSharingProfilePermissions(); + + // Store required directories + this.connectionDirectory = userContext.getConnectionDirectory(); + this.connectionGroupDirectory = userContext.getConnectionGroupDirectory(); + this.sharingProfileDirectory = userContext.getSharingProfileDirectory(); + + // Add all descendants + addConnectionGroupDescendants(Collections.singleton(root), permissions); + + } + + /** + * Returns the entire connection group tree as an APIConnectionGroup. The + * returned APIConnectionGroup is the root group and will contain all + * descendant connection groups and connections, arranged hierarchically. + * + * @return + * The root connection group, containing the entire connection group + * tree and all connections. + */ + public APIConnectionGroup getRootAPIConnectionGroup() { + return rootAPIGroup; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/package-info.java new file mode 100644 index 0000000..023e92d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the connection group manipulation aspect + * of the Guacamole REST API. + */ +package org.apache.guacamole.rest.connectiongroup; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java new file mode 100644 index 0000000..8ed36fe --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java @@ -0,0 +1,348 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.directory; + +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.event.DirectoryEvent; +import org.apache.guacamole.net.event.DirectoryFailureEvent; +import org.apache.guacamole.net.event.DirectorySuccessEvent; +import org.apache.guacamole.rest.event.ListenerService; + +/** + * A REST resource which abstracts the operations available on an existing + * Guacamole object that is contained within a Directory, such as modification, + * deletion, or individual retrieval. + * + * @param + * The type of object that this DirectoryObjectResource represents. To + * avoid coupling the REST API too tightly to the extension API, these + * objects are not directly serialized or deserialized when handling REST + * requests. + * + * @param + * The type of object used in interchange (ie: serialized/deserialized as + * JSON) between REST clients and this DirectoryObjectResource to + * represent the InternalType. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public abstract class DirectoryObjectResource { + + /** + * The user that is accessing this resource. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * The UserContext associated with the Directory containing the object + * represented by this DirectoryObjectResource. + */ + private final UserContext userContext; + + /** + * The type of object represented by this DirectoryObjectResource. + */ + private final Class internalType; + + /** + * The Directory which contains the object represented by this + * DirectoryObjectResource. + */ + private final Directory directory; + + /** + * The object represented by this DirectoryObjectResource. + */ + private final InternalType object; + + /** + * A DirectoryObjectTranslator implementation which handles the type of + * objects represented by this DirectoryObjectResource. + */ + private final DirectoryObjectTranslator translator; + + /** + * Service for dispatching events to registered listeners. + */ + @Inject + private ListenerService listenerService; + + /** + * Creates a new DirectoryObjectResource which exposes the operations + * available for the given object. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param internalType + * The type of object that this DirectoryObjectResource should + * represent. + * + * @param directory + * The Directory which contains the given object. + * + * @param object + * The object that this DirectoryObjectResource should represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles the type of + * object given. + */ + public DirectoryObjectResource(AuthenticatedUser authenticatedUser, + UserContext userContext, Class internalType, + Directory directory, InternalType object, + DirectoryObjectTranslator translator) { + this.authenticatedUser = authenticatedUser; + this.userContext = userContext; + this.directory = directory; + this.internalType = internalType; + this.object = object; + this.translator = translator; + } + + /** + * Notifies all registered listeners that the given operation has succeeded + * against the object represented by this resource. + * + * @param operation + * The operation that was performed. + * + * @throws GuacamoleException + * If a listener throws a GuacamoleException from its event handler. + */ + protected void fireDirectorySuccessEvent(DirectoryEvent.Operation operation) + throws GuacamoleException { + listenerService.handleEvent(new DirectorySuccessEvent() { + + @Override + public Directory.Type getDirectoryType() { + return Directory.Type.of(internalType); + } + + @Override + public DirectoryEvent.Operation getOperation() { + return operation; + } + + @Override + public String getObjectIdentifier() { + return object.getIdentifier(); + } + + @Override + public InternalType getObject() { + return object; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return userContext.getAuthenticationProvider(); + } + + }); + } + + /** + * Notifies all registered listeners that the given operation has failed + * against the object represented by this resource. + * + * @param operation + * The operation that failed. + * + * @param failure + * The failure that occurred. + * + * @throws GuacamoleException + * If a listener throws a GuacamoleException from its event handler. + */ + protected void fireDirectoryFailureEvent(DirectoryEvent.Operation operation, + Throwable failure) throws GuacamoleException { + listenerService.handleEvent(new DirectoryFailureEvent() { + + @Override + public Directory.Type getDirectoryType() { + return Directory.Type.of(internalType); + } + + @Override + public DirectoryEvent.Operation getOperation() { + return operation; + } + + @Override + public String getObjectIdentifier() { + return object.getIdentifier(); + } + + @Override + public InternalType getObject() { + return object; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return userContext.getAuthenticationProvider(); + } + + @Override + public Throwable getFailure() { + return failure; + } + + }); + } + + /** + * Returns the user accessing this resource. + * + * @return + * The user accessing this resource. + */ + protected AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + /** + * Returns the UserContext providing the Directory that contains the object + * exposed by this resource. + * + * @return + * The UserContext providing the Directory that contains the object + * exposed by this resource. + */ + protected UserContext getUserContext() { + return userContext; + } + + /** + * Returns the Directory containing the object exposed by this resource. + * + * @return + * The Directory containing the object exposed by this resource. + */ + protected Directory getDirectory() { + return directory; + } + + /** + * Returns the object exposed by this resource. + * + * @return + * The object exposed by this resource. + */ + protected InternalType getInternalObject() { + return object; + } + + /** + * Returns the object represented by this DirectoryObjectResource, in a + * format intended for interchange. + * + * @return + * The object that this DirectoryObjectResource represents, in a format + * intended for interchange. + * + * @throws GuacamoleException + * If an error is encountered while retrieving the object. + */ + @GET + public ExternalType getObject() throws GuacamoleException { + return translator.toExternalObject(object); + } + + /** + * Updates an existing object. The changes to be made to the corresponding + * object within the directory indicated by the provided data. + * + * @param modifiedObject + * The data to update the corresponding object with. + * + * @throws GuacamoleException + * If an error occurs while updating the object. + */ + @PUT + public void updateObject(ExternalType modifiedObject) throws GuacamoleException { + + // Validate that data was provided + if (modifiedObject == null) + throw new GuacamoleClientException("Data must be submitted when updating objects."); + + // Filter/sanitize object contents + translator.filterExternalObject(userContext, modifiedObject); + + // Perform update + translator.applyExternalChanges(object, modifiedObject); + + try { + directory.update(object); + fireDirectorySuccessEvent(DirectoryEvent.Operation.UPDATE); + } + catch (GuacamoleException | RuntimeException | Error e) { + fireDirectoryFailureEvent(DirectoryEvent.Operation.UPDATE, e); + throw e; + } + + } + + /** + * Removes this object from the containing directory. + * + * @throws GuacamoleException + * If an error occurs while removing the object. + */ + @DELETE + public void deleteObject() throws GuacamoleException { + try { + directory.remove(object.getIdentifier()); + fireDirectorySuccessEvent(DirectoryEvent.Operation.REMOVE); + } + catch (GuacamoleException | RuntimeException | Error e) { + fireDirectoryFailureEvent(DirectoryEvent.Operation.REMOVE, e); + throw e; + } + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResourceFactory.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResourceFactory.java new file mode 100644 index 0000000..423cb74 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResourceFactory.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.directory; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Factory which creates DirectoryObjectResource instances exposing objects of + * a particular type. + * + * @param + * The type of object exposed by the DirectoryObjectResource instances + * created by this DirectoryResourceFactory. + * + * @param + * The type of object used in interchange (ie: serialized or deserialized + * as JSON) between REST clients and resources when representing the + * InternalType. + */ +public interface DirectoryObjectResourceFactory { + + /** + * Creates a new DirectoryObjectResource which exposes the given object. + * + * @param authenticatedUser + * The user that is accessing the resource. + * + * @param userContext + * The UserContext which contains the given Directory. + * + * @param directory + * The Directory which contains the object being exposed. + * + * @param object + * The object which should be exposed by the created + * DirectoryObjectResource. + * + * @return + * A new DirectoryObjectResource which exposes the given object. + */ + DirectoryObjectResource + create(AuthenticatedUser authenticatedUser, UserContext userContext, + Directory directory, InternalType object); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectTranslator.java new file mode 100644 index 0000000..b8af563 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectTranslator.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.directory; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.Field; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Provides bidirectional conversion between REST-specific objects and the + * internal objects defined by the Guacamole extension API. + * + * @param + * The type of object converted by this DirectoryObjectTranslator which is + * not necessarily intended for use in interchange. + * + * @param + * The type of object used in interchange (ie: serialized or + * deserialized as JSON) between REST clients and resource implementations + * when representing the InternalType. + */ +public abstract class DirectoryObjectTranslator { + + /** + * Converts the given object to an object which is intended to be used in + * interchange. + * + * @param object + * The object to convert for the sake of interchange. + * + * @return + * A new object containing the same data as the given internal object, + * but intended for use in interchange. + * + * @throws GuacamoleException + * If the provided object cannot be converted for any reason. + */ + public abstract ExternalType toExternalObject(InternalType object) + throws GuacamoleException; + + /** + * Converts the given object to an object which is intended to be used + * within the Guacamole extension API. + * + * @param object + * An object of the type intended for use in interchange, such as that + * produced by toExternalObject() or received from a user via REST. + * + * @return + * A new object containing the same data as the given external object, + * but intended for use within the Guacamole extension API. + * + * @throws GuacamoleException + * If the provided object cannot be converted for any reason. + */ + public abstract InternalType toInternalObject(ExternalType object) + throws GuacamoleException; + + /** + * Overlays the changes indicated by the given external object, modifying + * the given existing object from the Guacamole extension API. + * + * @param existingObject + * The existing object from the Guacamole extension API which should be + * modified. + * + * @param object + * The external object representing the modifications to the existing + * internal object. + * + * @throws GuacamoleException + * If the provided modifications cannot be applied for any reason. + */ + public abstract void applyExternalChanges(InternalType existingObject, + ExternalType object) throws GuacamoleException; + + /** + * Applies filtering to the contents of the given external object which + * came from an untrusted source. Implementations MUST sanitize the + * contents of the external object as necessary to guarantee that the + * object conforms to declared schema, such as the attributes declared for + * each object type at the UserContext level. + * + * @param userContext + * The UserContext associated with the object being filtered. + * + * @param object + * The object to modify such that it strictly conforms to the declared + * schema. + * + * @throws GuacamoleException + * If the object cannot be filtered due to an error. + */ + public abstract void filterExternalObject(UserContext userContext, + ExternalType object) throws GuacamoleException; + + /** + * Filters the given map of attribute name/value pairs, producing a new + * map containing only attributes defined as fields within the given schema. + * + * @param schema + * The schema whose fields should be used to filter the given map of + * attributes. + * + * @param attributes + * The map of attribute name/value pairs to filter. + * + * @return + * A new map containing only the attributes defined as fields within + * the given schema. + */ + public Map filterAttributes(Collection

      schema, + Map attributes) { + + Map filtered = new HashMap(); + + // Grab all attribute value strictly for defined fields + for (Form form : schema) { + for (Field field : form.getFields()) { + + // Pull the associated attribute value from given map + String attributeName = field.getName(); + String attributeValue = attributes.get(attributeName); + + // Include attribute value within filtered map only if + // defined or present within provided map + if (attributeValue != null || + attributes.containsKey(attributeName)) + filtered.put(attributeName, attributeValue); + + } + } + + return filtered; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java new file mode 100644 index 0000000..7b83424 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java @@ -0,0 +1,872 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.directory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PATCH; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.language.Translatable; +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.AtomicDirectoryOperation; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; +import org.apache.guacamole.net.event.DirectoryEvent; +import org.apache.guacamole.net.event.DirectoryFailureEvent; +import org.apache.guacamole.net.event.DirectorySuccessEvent; +import org.apache.guacamole.rest.APIError; +import org.apache.guacamole.rest.event.ListenerService; +import org.apache.guacamole.rest.jsonpatch.APIPatch; +import org.apache.guacamole.rest.jsonpatch.APIPatchError; +import org.apache.guacamole.rest.jsonpatch.APIPatchFailureException; +import org.apache.guacamole.rest.jsonpatch.APIPatchOutcome; +import org.apache.guacamole.rest.jsonpatch.APIPatchResponse; + +/** + * A REST resource which abstracts the operations available on all Guacamole + * Directory implementations, such as the creation of new objects, or listing + * of existing objects. A DirectoryResource functions as the parent of any + * number of child DirectoryObjectResources, which are created with the factory + * provided at the time of this object's construction. + * + * @param + * The type of object contained within the Directory that this + * DirectoryResource exposes. To avoid coupling the REST API too tightly to + * the extension API, these objects are not directly serialized or + * deserialized when handling REST requests. + * + * @param + * The type of object used in interchange (ie: serialized/deserialized as + * JSON) between REST clients and this DirectoryResource when representing + * the InternalType. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public abstract class DirectoryResource { + + /** + * The user that is accessing this resource. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * The UserContext associated with the Directory being exposed by this + * DirectoryResource. + */ + private final UserContext userContext; + + /** + * The type of object contained within the Directory exposed by this + * DirectoryResource. + */ + private final Class internalType; + + /** + * The Directory being exposed by this DirectoryResource. + */ + private final Directory directory; + + /** + * A DirectoryObjectTranslator implementation which handles the type of + * objects contained within the Directory exposed by this DirectoryResource. + */ + private final DirectoryObjectTranslator translator; + + /** + * A factory which can be used to create instances of resources representing + * individual objects contained within the Directory exposed by this + * DirectoryResource. + */ + private final DirectoryObjectResourceFactory resourceFactory; + + /** + * Service for dispatching events to registered listeners. + */ + @Inject + private ListenerService listenerService; + + /** + * Creates a new DirectoryResource which exposes the operations available + * for the given Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param internalType + * The type of object contained within the given Directory. + * + * @param directory + * The Directory being exposed by this DirectoryResource. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles the type of + * objects contained within the given Directory. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing individual objects contained within the given Directory. + */ + public DirectoryResource(AuthenticatedUser authenticatedUser, + UserContext userContext, Class internalType, + Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + this.authenticatedUser = authenticatedUser; + this.userContext = userContext; + this.directory = directory; + this.internalType = internalType; + this.translator = translator; + this.resourceFactory = resourceFactory; + } + + /** + * Returns the ObjectPermissionSet defined within the given Permissions + * that represents the permissions affecting objects available within this + * DirectoryResource. + * + * @param permissions + * The Permissions object from which the ObjectPermissionSet should be + * retrieved. + * + * @return + * The ObjectPermissionSet defined within the given Permissions object + * that represents the permissions affecting objects available within + * this DirectoryResource. + * + * @throws GuacamoleException + * If an error prevents retrieval of permissions. + */ + protected abstract ObjectPermissionSet getObjectPermissions( + Permissions permissions) throws GuacamoleException; + + /** + * Notifies all registered listeners that the given operation has succeeded + * against the object having the given identifier within the Directory + * represented by this resource. + * + * @param operation + * The operation that was performed. + * + * @param identifier + * The identifier of the object affected by the operation. + * + * @param object + * The specific object affected by the operation, if available. If not + * available, this may be null. + * + * @throws GuacamoleException + * If a listener throws a GuacamoleException from its event handler. + */ + protected void fireDirectorySuccessEvent(DirectoryEvent.Operation operation, + String identifier, InternalType object) + throws GuacamoleException { + listenerService.handleEvent(new DirectorySuccessEvent() { + + @Override + public Directory.Type getDirectoryType() { + return Directory.Type.of(internalType); + } + + @Override + public DirectoryEvent.Operation getOperation() { + return operation; + } + + @Override + public String getObjectIdentifier() { + return identifier; + } + + @Override + public InternalType getObject() { + return object; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return userContext.getAuthenticationProvider(); + } + + }); + } + + /** + * Notifies all registered listeners that the given operation has failed + * against the object having the given identifier within the Directory + * represented by this resource. + * + * @param operation + * The operation that failed. + * + * @param identifier + * The identifier of the object that would have been affected by the + * operation had it succeeded. + * + * @param object + * The specific object would have been affected by the operation, if + * available, had it succeeded, including any changes that were + * intended to be applied to the object. If not available, this may be + * null. + * + * @param failure + * The failure that occurred. + * + * @throws GuacamoleException + * If a listener throws a GuacamoleException from its event handler. + */ + protected void fireDirectoryFailureEvent(DirectoryEvent.Operation operation, + String identifier, InternalType object, Throwable failure) + throws GuacamoleException { + listenerService.handleEvent(new DirectoryFailureEvent() { + + @Override + public Directory.Type getDirectoryType() { + return Directory.Type.of(internalType); + } + + @Override + public DirectoryEvent.Operation getOperation() { + return operation; + } + + @Override + public String getObjectIdentifier() { + return identifier; + } + + @Override + public InternalType getObject() { + return object; + } + + @Override + public AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + @Override + public AuthenticationProvider getAuthenticationProvider() { + return userContext.getAuthenticationProvider(); + } + + @Override + public Throwable getFailure() { + return failure; + } + + }); + } + + /** + * Returns the user accessing this resource. + * + * @return + * The user accessing this resource. + */ + protected AuthenticatedUser getAuthenticatedUser() { + return authenticatedUser; + } + + /** + * Returns the UserContext providing the Directory exposed by this + * resource. + * + * @return + * The UserContext providing the Directory exposed by this resource. + */ + protected UserContext getUserContext() { + return userContext; + } + + /** + * Returns the Directory exposed by this resource. + * + * @return + * The Directory exposed by this resource. + */ + protected Directory getDirectory() { + return directory; + } + + /** + * Returns a factory that can be used to create instances of resources + * representing individual objects contained within the Directory exposed + * by this resource. + * + * @return + * A factory that can be used to create instances of resources + * representing individual objects contained within the Directory + * exposed by this resource. + */ + public DirectoryObjectResourceFactory getResourceFactory() { + return resourceFactory; + } + + /** + * Filter and sanitize the provided external object, translate to the + * internal type, and return the translated internal object. + * + * @param object + * The external object to filter and translate. + * + * @return + * The filtered and translated internal object. + * + * @throws GuacamoleException + * If an error occurs while filtering or translating the external + * object. + */ + private InternalType filterAndTranslate(ExternalType object) + throws GuacamoleException { + + // Filter and sanitize the external object + translator.filterExternalObject(userContext, object); + + // Translate to the internal type + return translator.toInternalObject(object); + } + + /** + * Returns a map of all objects available within this DirectoryResource, + * filtering the returned map by the given permission, if specified. + * + * @param permissions + * The set of permissions to filter with. A user must have one or more + * of these permissions for the affected objects to appear in the + * result. If null, no filtering will be performed. + * + * @return + * A map of all visible objects. If a permission was specified, this + * map will contain only those objects for which the current user has + * that permission. + * + * @throws GuacamoleException + * If an error is encountered while retrieving the objects. + */ + @GET + public Map getObjects( + @QueryParam("permission") List permissions) + throws GuacamoleException { + + // An admin user has access to all objects + Permissions effective = userContext.self().getEffectivePermissions(); + SystemPermissionSet systemPermissions = effective.getSystemPermissions(); + boolean isAdmin = systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER); + + // Filter objects, if requested + Collection identifiers = directory.getIdentifiers(); + if (!isAdmin && permissions != null && !permissions.isEmpty()) { + ObjectPermissionSet objectPermissions = getObjectPermissions(effective); + identifiers = objectPermissions.getAccessibleObjects(permissions, identifiers); + } + + // Translate each retrieved object into the corresponding external object + Map apiObjects = new HashMap(); + for (InternalType object : directory.getAll(identifiers)) + apiObjects.put(object.getIdentifier(), translator.toExternalObject(object)); + + return apiObjects; + + } + + /** + * Retrieve and return the object having the given identifier from the + * directory, throwing a GuacamoleResourceNotFoundException and firing a + * directory GET failure event if no object exists with the given identifier + * in the directory. + * + * @param identifier + * The identifier of the object to retrieve from the directory. + * + * @param directory + * The directory to fetch the object from. If null, the directory + * associated with this DirectoryResource instance will be used. + * + * @return + * The object from the directory with the provided identifier. + * + * @throws GuacamoleException + * If no object with the provided identifier exists within the + * directory, or if any other error occurs while attempting to retrieve + * the object. + */ + @Nonnull + private InternalType getObjectByIdentifier( + String identifier, @Nullable Directory directory) + throws GuacamoleException { + + // Use the directory associated with this instance if not otherwise + // specified + if (directory == null) + directory = this.directory; + + // Retrieve the object having the given identifier + InternalType object; + try { + object = directory.get(identifier); + if (object == null) + throw new GuacamoleResourceNotFoundException( + "Not found: \"" + identifier + "\""); + } + catch (GuacamoleException | RuntimeException | Error e) { + fireDirectoryFailureEvent( + DirectoryEvent.Operation.GET, identifier, null, e); + throw e; + } + + // Return the object; it is guaranteed to be non-null at this point + return object; + } + + /** + * If the provided throwable is a known Guacamole-specific type, create and + * return a APIPatchError with an error message extracted from the error. + * If the provided throwable is not a known type, null will be returned. + * + * @param op + * The operation being attempted when the error occurred. + * + * @param identifier + * The identifier of the object in question, if any. + * + * @param path + * The path for the patch that was being applied when the error occurred. + * + * @param t + * The error that occurred while attempting to apply the patch. + * + * @return + * A APIPatchError with an error message extracted from the provided + * throwable - if it's a known type, otherwise null. + */ + @Nullable + private APIPatchError createPatchFailure( + @Nonnull APIPatch.Operation op, @Nullable String identifier, + @Nonnull String path, @Nonnull Throwable t) { + + /* + * If the failure is a translatable type, use the translation directly + * in the patch error. + */ + if (t instanceof Translatable) + return new APIPatchError( + op, identifier, path, + ((Translatable) t).getTranslatableMessage()); + + /* + * If the failure represents a known Guacamole exception but is not + * translateable, create a patch error containing the raw untranslated + * exception message. + */ + if (t instanceof GuacamoleException) { + + // Create a translated message that will fall + // through to the untranslated message + TranslatableMessage message = new TranslatableMessage( + "APP.TEXT_UNTRANSLATED", Collections.singletonMap( + "MESSAGE", ((GuacamoleException) t).getMessage())); + + return new APIPatchError(op, identifier, path, message); + } + + // The error is not a known type - no patch error can be generated + return null; + } + + /** + * Applies the given object patches, updating the underlying directory + * accordingly. This operation supports addition, replacement, and removal of + * objects through the "add", "replace", or "remove" patch operations. The + * path of each patch operation is of the form "/ID" where ID is the + * identifier of the object being modified. In the case of object creation, + * the identifier is ignored, as the identifier will be automatically + * provided. This operation is atomic. + * + * @param patches + * The patches to apply for this request. + * + * @throws GuacamoleException + * If an error occurs while adding, replacing, or removing objects. + * + * @return + * A response describing the outcome of each patch. Only the identifier + * of each patched object will be included in the response, not the + * full object. + */ + @PATCH + public APIPatchResponse patchObjects(List> patches) + throws GuacamoleException { + + // An outcome for each patch included in the request. This list + // may include both success and failure responses, though the + // presence of any failure would indicated that the entire + // request has failed and no changes have been made. + List patchOutcomes = new ArrayList<>(); + + // Perform all requested operations atomically + directory.tryAtomically(new AtomicDirectoryOperation() { + + @Override + public void executeOperation(boolean atomic, Directory directory) + throws GuacamoleException { + + // If the underlying directory implentation does not support + // atomic operations, abort the patch operation. This REST + // endpoint requires that operations be performed atomically. + if (!atomic) + throw new GuacamoleUnsupportedException( + "The extension providing this directory does not " + + "support Atomic Operations. The patch cannot be " + + "executed."); + + // Keep a list of all objects that have been successfully + // added, replaced, or removed + Collection addedObjects = new ArrayList<>(); + Collection replacedObjects = new ArrayList<>(); + Collection removedIdentifiers = new ArrayList<>(); + + // A list of all responses associated with the successful + // creation of new objects + List creationSuccesses = new ArrayList<>(); + + // True if any operation in the patch failed. Any failure will + // fail the request, though won't result in immediate stoppage + // since more errors may yet be uncovered. + boolean failed = false; + + // Apply each operation specified within the patch + for (APIPatch patch : patches) { + + // Retrieve and validate path + String path = patch.getPath(); + if (!path.startsWith("/")) + throw new GuacamoleClientException("Patch paths must start with \"/\"."); + + APIPatch.Operation op = patch.getOp(); + + if (op == APIPatch.Operation.add) { + + // Filter/sanitize object contents + InternalType internal = filterAndTranslate(patch.getValue()); + + try { + + // Attempt to add the new object + directory.add(internal); + + // Add the object to the list if addition was successful + addedObjects.add(internal); + + // Add a success outcome describing the object creation + APIPatchOutcome response = new APIPatchOutcome( + op, internal.getIdentifier(), path); + patchOutcomes.add(response); + creationSuccesses.add(response); + + } + + catch (GuacamoleException | RuntimeException | Error e) { + failed = true; + fireDirectoryFailureEvent( + DirectoryEvent.Operation.ADD, + internal.getIdentifier(), internal, e); + + // Attempt to generate an API Patch error using the + // caught exception + APIPatchError patchError = createPatchFailure( + op, null, path, e); + + if (patchError != null) + patchOutcomes.add(patchError); + + // If an unexpected failure occurs, fall through to + // the standard API error handling + else + throw e; + + } + + } + + else if (op == APIPatch.Operation.replace) { + + // The identifier of the object to be replaced + String identifier = path.substring(1); + + InternalType original = null; + + try { + + // Fetch the object to be updated from the atomic + // directory instance. If no object is found, a + // directory GET failure event will be logged, and + // the update attempt will be aborted. + original = getObjectByIdentifier(identifier, directory); + + // Apply the changes to the original object + translator.applyExternalChanges( + original, patch.getValue()); + + // Update the directory + directory.update(original); + + replacedObjects.add(original); + + // Add a success outcome describing the replacement + APIPatchOutcome response = new APIPatchOutcome( + op, identifier, path); + patchOutcomes.add(response); + + } + + catch (GuacamoleException | RuntimeException | Error e) { + failed = true; + fireDirectoryFailureEvent( + DirectoryEvent.Operation.UPDATE, + identifier, original, e); + + // Attempt to generate an API Patch error using the + // caught exception + APIPatchError patchError = createPatchFailure( + op, identifier, path, e); + + if (patchError != null) + patchOutcomes.add(patchError); + + // If an unexpected failure occurs, fall through to + // the standard API error handling + else + throw e; + + } + } + + else if (op == APIPatch.Operation.remove) { + + String identifier = path.substring(1); + + try { + + // Attempt to remove the object + directory.remove(identifier); + + // Add the object to the list if the removal was successful + removedIdentifiers.add(identifier); + + // Add a success outcome describing the object removal + APIPatchOutcome response = new APIPatchOutcome( + op, identifier, path); + patchOutcomes.add(response); + creationSuccesses.add(response); + } + catch (GuacamoleException | RuntimeException | Error e) { + failed = true; + fireDirectoryFailureEvent( + DirectoryEvent.Operation.REMOVE, + identifier, null, e); + + // Attempt to generate an API Patch error using the + // caught exception + APIPatchError patchError = createPatchFailure( + op, identifier, path, e); + + if (patchError != null) + patchOutcomes.add(patchError); + + // If an unexpected failure occurs, fall through to + // the standard API error handling + else + throw e; + } + } + + else { + throw new GuacamoleUnsupportedException( + "Unsupported patch operation \"" + op + "\". " + + "Only add, replace, and remove are supported."); + } + + + } + + // If any operation failed + if (failed) { + + // Any identifiers for objects created during this request + // will no longer be valid, since the creation of those + // objects will be rolled back. + creationSuccesses.forEach( + response -> response.clearIdentifier()); + + // Return an error response, including any failures that + // caused the failure of any patch in the request + throw new APIPatchFailureException( + "The provided patches failed to apply.", patchOutcomes); + + } + + // Fire directory success events for each created object + Iterator addedIterator = addedObjects.iterator(); + while (addedIterator.hasNext()) { + + InternalType internal = addedIterator.next(); + fireDirectorySuccessEvent( + DirectoryEvent.Operation.ADD, + internal.getIdentifier(), internal); + + } + + // Fire directory success events for each updated object + Iterator updatedIterator = replacedObjects.iterator(); + while (updatedIterator.hasNext()) { + + InternalType internal = updatedIterator.next(); + fireDirectorySuccessEvent( + DirectoryEvent.Operation.UPDATE, + internal.getIdentifier(), internal); + + } + + // Fire directory success events for each removed object + Iterator removedIterator = removedIdentifiers.iterator(); + while (removedIterator.hasNext()) { + + String identifier = removedIterator.next(); + fireDirectorySuccessEvent( + DirectoryEvent.Operation.REMOVE, + identifier, null); + + } + + } + + }); + + // Return a list of outcomes, one for each patch in the request + return new APIPatchResponse(patchOutcomes); + + } + + /** + * Creates a new object within the underlying Directory, returning the + * object that was created. The identifier of the created object will be + * populated, if applicable. + * + * @param object + * The object to create. + * + * @return + * The object that was created. + * + * @throws GuacamoleException + * If an error occurs while adding the object to the underlying + * directory. + */ + @POST + public ExternalType createObject(ExternalType object) + throws GuacamoleException { + + // Validate that data was provided + if (object == null) + throw new GuacamoleClientException("Data must be submitted when creating objects."); + + // Filter/sanitize object contents + InternalType internal = filterAndTranslate(object); + + // Create the new object within the directory + try { + directory.add(internal); + fireDirectorySuccessEvent(DirectoryEvent.Operation.ADD, internal.getIdentifier(), internal); + return object; + } + catch (GuacamoleException | RuntimeException | Error e) { + fireDirectoryFailureEvent(DirectoryEvent.Operation.ADD, internal.getIdentifier(), internal, e); + throw e; + } + + } + + /** + * Retrieves an individual object, returning a DirectoryObjectResource + * implementation which exposes operations available on that object. + * + * @param identifier + * The identifier of the object to retrieve. + * + * @return + * A DirectoryObjectResource exposing operations available on the + * object having the given identifier. + * + * @throws GuacamoleException + * If an error occurs while retrieving the object. + */ + @Path("{identifier}") + public DirectoryObjectResource + getObjectResource(@PathParam("identifier") String identifier) + throws GuacamoleException { + + // Fetch the object to be updated. If no object is found, a directory + // GET failure event will be logged. If no exception is thrown, the + // object is guaranteed to exist + InternalType object = getObjectByIdentifier(identifier, null); + + // Return a resource which provides access to the retrieved object + DirectoryObjectResource resource = resourceFactory.create(authenticatedUser, userContext, directory, object); + fireDirectorySuccessEvent(DirectoryEvent.Operation.GET, identifier, object); + return resource; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResourceFactory.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResourceFactory.java new file mode 100644 index 0000000..c28294b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResourceFactory.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.directory; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Factory which creates DirectoryResource instances exposing Directory + * objects of a particular type. + * + * @param + * The type of object contained within the Directory objects exposed by the + * DirectoryResource instances created by this DirectoryResourceFactory. + * + * @param + * The type of object used in interchange (ie: serialized or deserialized + * as JSON) between REST clients and resources when representing the + * InternalType. + */ +public interface DirectoryResourceFactory { + + /** + * Creates a new DirectoryResource which exposes the given Directory. + * + * @param authenticatedUser + * The user that is accessing the resource. + * + * @param userContext + * The UserContext from which the given Directory was obtained. + * + * @param directory + * The Directory which should be exposed by the created + * DirectoryResource. + * + * @return + * A new DirectoryResource which exposes the given Directory. + */ + DirectoryResource + create(AuthenticatedUser authenticatedUser, UserContext userContext, + Directory directory); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryView.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryView.java new file mode 100644 index 0000000..3acf29e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryView.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.directory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Identifiable; + +/** + * Directory implementation which represents a read-only subset of another + * existing Directory. Access is provided only to a limited set of objects, + * determined by the set of identifiers provided when the DirectoryView is + * created. + * + * @param + * The type of objects accessible through this DirectoryView. + */ +public class DirectoryView + implements Directory { + + /** + * The Directory from which the given set of objects will be retrieved. + */ + private final Directory directory; + + /** + * The set of identifiers representing the restricted set of objects that + * this DirectoryView should provide access to. + */ + private final Set identifiers; + + /** + * Creates a new DirectoryView which provides access to a read-only subset + * of the objects in the given Directory. Only objects whose identifiers + * are within the provided set will be accessible. + * + * @param directory + * The Directory of which this DirectoryView represents a subset. + * + * @param identifiers + * The identifiers of all objects which should be accessible through + * this DirectoryView. Objects which do not have identifiers within + * the provided set will be inaccessible. + */ + public DirectoryView(Directory directory, + Set identifiers) { + this.directory = directory; + this.identifiers = identifiers; + } + + @Override + public ObjectType get(String identifier) throws GuacamoleException { + + // Attempt to retrieve the requested object ONLY if it's within the + // originally-specified subset + if (!identifiers.contains(identifier)) + return null; + + // Delegate to underlying directory + return directory.get(identifier); + + } + + @Override + public Collection getAll(Collection identifiers) + throws GuacamoleException { + + // Reduce requested identifiers to only those which occur within the + // originally-specified subset + identifiers = new ArrayList(identifiers); + identifiers.retainAll(this.identifiers); + + // Delegate to underlying directory + return directory.getAll(identifiers); + + } + + @Override + public Set getIdentifiers() throws GuacamoleException { + return identifiers; + } + + @Override + public void add(ObjectType object) throws GuacamoleException { + throw new GuacamoleUnsupportedException("Directory view is read-only"); + } + + @Override + public void update(ObjectType object) throws GuacamoleException { + throw new GuacamoleUnsupportedException("Directory view is read-only"); + } + + @Override + public void remove(String identifier) throws GuacamoleException { + throw new GuacamoleUnsupportedException("Directory view is read-only"); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/package-info.java new file mode 100644 index 0000000..5283e87 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Base classes providing support for exposing and manipulating Directory + * objects and their contents via the Guacamole REST API. + */ +package org.apache.guacamole.rest.directory; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/event/ListenerService.java b/guacamole/src/main/java/org/apache/guacamole/rest/event/ListenerService.java new file mode 100644 index 0000000..a2b645b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/event/ListenerService.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.event; + +import java.util.List; +import javax.inject.Inject; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.event.listener.Listener; + +/** + * A service used to notify listeners registered by extensions when events of + * interest occur. + */ +public class ListenerService implements Listener { + + /** + * The collection of registered listeners. + */ + @Inject + private List listeners; + + /** + * Notifies registered listeners than an event has occurred. Notification continues + * until a given listener throws a GuacamoleException or other runtime exception, or + * until all listeners have been notified. + * + * @param event + * An object that describes the event that has occurred. + * + * @throws GuacamoleException + * If a registered listener throws a GuacamoleException. + */ + @Override + public void handleEvent(Object event) throws GuacamoleException { + for (final Listener listener : listeners) { + listener.handleEvent(event); + } + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java b/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java new file mode 100644 index 0000000..49a3e87 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.extension; + +import java.util.List; +import javax.inject.Inject; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.net.auth.AuthenticationProvider; + +/** + * A REST service which provides access to extension-specific REST resources, + * each exposed by the identifier of that extension's AuthenticationProvider. + */ +@Path("/ext") +public class ExtensionRESTService { + + /** + * All configured authentication providers. + */ + @Inject + private List authProviders; + + /** + * Returns the AuthenticationProvider having the given identifier. If no + * such AuthenticationProvider has been loaded, null is returned. + * + * @param identifier + * The identifier of the AuthenticationProvider to locate. + * + * @return + * The AuthenticationProvider having the given identifier, or null if + * no such AuthenticationProvider is loaded. + */ + private AuthenticationProvider getAuthenticationProvider(String identifier) { + + // Iterate through all installed AuthenticationProviders, searching for + // the given identifier + for (AuthenticationProvider authProvider : authProviders) { + if (authProvider.getIdentifier().equals(identifier)) + return authProvider; + } + + // No such AuthenticationProvider found + return null; + + } + + /** + * Returns the arbitrary REST resource exposed by the AuthenticationProvider + * having the given identifier. + * + * @param identifier + * The identifier of the AuthenticationProvider whose REST resource + * should be retrieved. + * + * @return + * The arbitrary REST resource exposed by the AuthenticationProvider + * having the given identifier. + * + * @throws GuacamoleException + * If no such resource could be found, or if an error occurs while + * retrieving that resource. + */ + @Path("{identifier}") + public Object getExtensionResource(@PathParam("identifier") String identifier) + throws GuacamoleException { + + // Retrieve authentication provider having given identifier + AuthenticationProvider authProvider = getAuthenticationProvider(identifier); + if (authProvider != null) { + + // Pull resource from authentication provider + Object resource = authProvider.getResource(); + if (resource != null) + return resource; + + } + + // AuthenticationProvider-specific resource could not be found + throw new GuacamoleResourceNotFoundException("No such resource."); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java new file mode 100644 index 0000000..4e86a4c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the arbitrary REST services exposed by extensions. + */ +package org.apache.guacamole.rest.extension; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityLog.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityLog.java new file mode 100644 index 0000000..385f6f8 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityLog.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.net.auth.ActivityLog; + +/** + * A activity log which may be exposed through the REST endpoints. + */ +public class APIActivityLog { + + /** + * The type of this ActivityLog. + */ + private final ActivityLog.Type type; + + /** + * A human-readable description of this log. + */ + private final TranslatableMessage description; + + /** + * Creates a new APIActivityLog, copying the data from the given activity + * log. + * + * @param log + * The log to copy data from. + */ + public APIActivityLog(ActivityLog log) { + this.type = log.getType(); + this.description = log.getDescription(); + } + + /** + * Returns the type of this activity log. The type of an activity log + * dictates how its content should be interpreted or exposed, however the + * content of a log is not directly exposed by this class. + * + * @return + * The type of this activity log. + */ + public ActivityLog.Type getType() { + return type; + } + + /** + * Returns a human-readable message that describes this log. + * + * @return + * A human-readable message that describes this log. + */ + public TranslatableMessage getDescription() { + return description; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java new file mode 100644 index 0000000..0825c50 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java @@ -0,0 +1,215 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import java.util.Date; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +import org.apache.guacamole.net.auth.ActivityRecord; + +/** + * A activity record which may be exposed through the REST endpoints. + */ +public class APIActivityRecord { + + /** + * The date and time the activity began. + */ + private final Date startDate; + + /** + * The date and time the activity ended, or null if the activity is + * still in progress or if the end time is unknown. + */ + private final Date endDate; + + /** + * The hostname or IP address of the remote host that performed the + * activity associated with this record, if known. + */ + private final String remoteHost; + + /** + * The name of the user who performed or is performing the activity + * associated with this record. + */ + private final String username; + + /** + * Whether the activity is still in progress. + */ + private final boolean active; + + /** + * The unique identifier assigned to this record, or null if this record + * has no such identifier. + */ + private final String identifier; + + /** + * A UUID that uniquely identifies this record, or null if no such unique + * identifier exists. + */ + private final UUID uuid; + + /** + * A map of all attribute identifiers to their corresponding values, for + * all attributes associated with this record. + */ + private final Map attributes; + + /** + * A map of all logs associated and accessible via this record, associated + * with their corresponding unique names. + */ + private final Map logs; + + /** + * Creates a new APIActivityRecord, copying the data from the given activity + * record. + * + * @param record + * The record to copy data from. + */ + public APIActivityRecord(ActivityRecord record) { + + this.startDate = record.getStartDate(); + this.endDate = record.getEndDate(); + this.remoteHost = record.getRemoteHost(); + this.username = record.getUsername(); + this.active = record.isActive(); + this.identifier = record.getIdentifier(); + this.uuid = record.getUUID(); + this.attributes = record.getAttributes(); + + this.logs = record.getLogs().entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + (entry) -> new APIActivityLog(entry.getValue()) + )); + + } + + /** + * Returns the date and time the activity began. + * + * @return + * The date and time the activity began. + */ + public Date getStartDate() { + return startDate; + } + + /** + * Returns the date and time the activity ended, if applicable. + * + * @return + * The date and time the activity ended, or null if the activity is + * still in progress or if the end time is unknown. + */ + public Date getEndDate() { + return endDate; + } + + /** + * Returns the hostname or IP address of the remote host that performed the + * activity associated with this record, if known. + * + * @return + * The hostname or IP address of the remote host that performed the + * activity associated with this record, or null if the remote host is + * unknown. + */ + public String getRemoteHost() { + return remoteHost; + } + + /** + * Returns the name of the user who performed or is performing the activity + * associated with this record. + * + * @return + * The name of the user who performed or is performing the activity + * associated with this record. + */ + public String getUsername() { + return username; + } + + /** + * Returns whether the activity associated with this record is still in + * progress. + * + * @return + * true if the activity associated with this record is still in + * progress, false otherwise. + */ + public boolean isActive() { + return active; + } + + /** + * Returns the unique identifier assigned to this record, if any. If this + * record is not uniquely identifiable, this may be null. + * + * @return + * The unique identifier assigned to this record, or null if this + * record has no such identifier. + */ + public String getIdentifier() { + return identifier; + } + + /** + * Returns a UUID that uniquely identifies this record. If not implemented + * by the extension exposing this history record, this may be null. + * + * @return + * A UUID that uniquely identifies this record, or null if no such + * unique identifier exists. + */ + public UUID getUUID() { + return uuid; + } + + /** + * Returns all attributes associated with this record. + * + * @return + * A map of all attribute identifiers to their corresponding values, + * for all attributes associated with this record. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Returns a Map of logs related to this record and accessible by the + * current user, such as Guacamole session recordings. Each log is + * associated with a corresponding, arbitrary, unique name. + * + * @return + * A Map of logs related to this record. + */ + public Map getLogs() { + return logs; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java new file mode 100644 index 0000000..9d17fbf --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import org.apache.guacamole.net.auth.ConnectionRecord; + +/** + * A connection record which may be exposed through the REST endpoints. + */ +public class APIConnectionRecord extends APIActivityRecord { + + /** + * The identifier of the connection associated with this record. + */ + private final String connectionIdentifier; + + /** + * The identifier of the connection associated with this record. + */ + private final String connectionName; + + /** + * The identifier of the sharing profile associated with this record. + */ + private final String sharingProfileIdentifier; + + /** + * The identifier of the sharing profile associated with this record. + */ + private final String sharingProfileName; + + /** + * Creates a new APIConnectionRecord, copying the data from the given + * record. + * + * @param record + * The record to copy data from. + */ + public APIConnectionRecord(ConnectionRecord record) { + super(record); + this.connectionIdentifier = record.getConnectionIdentifier(); + this.connectionName = record.getConnectionName(); + this.sharingProfileIdentifier = record.getSharingProfileIdentifier(); + this.sharingProfileName = record.getSharingProfileName(); + } + + /** + * Returns the identifier of the connection associated with this + * record. + * + * @return + * The identifier of the connection associated with this record. + */ + public String getConnectionIdentifier() { + return connectionIdentifier; + } + + /** + * Returns the name of the connection associated with this record. + * + * @return + * The name of the connection associated with this record. + */ + public String getConnectionName() { + return connectionName; + } + + /** + * Returns the identifier of the sharing profile associated with this + * record. If the connection was not being used via a sharing profile, this + * will be null. + * + * @return + * The identifier of the sharing profile associated with this record, + * or null if no sharing profile was used. + */ + public String getSharingProfileIdentifier() { + return sharingProfileIdentifier; + } + + /** + * Returns the name of the sharing profile associated with this record. If + * the connection was not being used via a sharing profile, this will be + * null. + * + * @return + * The name of the sharing profile associated with this record, or null + * if no sharing profile was used. + */ + public String getSharingProfileName() { + return sharingProfileName; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java new file mode 100644 index 0000000..0fea582 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import javax.ws.rs.core.Response; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.rest.APIException; + +/** + * A sort predicate which species the property to use when sorting activity + * records, along with the sort order. + */ +public class APISortPredicate { + + /** + * The prefix which will be included before the name of a sortable property + * to indicate that the sort order is descending, not ascending. + */ + public static final String DESCENDING_PREFIX = "-"; + + /** + * All possible property name strings and their corresponding + * ActivityRecordSet.SortableProperty values. + */ + public enum SortableProperty { + + /** + * The date that the activity associated with the activity record + * began. + */ + startDate(ActivityRecordSet.SortableProperty.START_DATE); + + /** + * The ActivityRecordSet.SortableProperty that this property name + * string represents. + */ + public final ActivityRecordSet.SortableProperty recordProperty; + + /** + * Creates a new SortableProperty which associates the property name + * string (identical to its own name) with the given + * ActivityRecordSet.SortableProperty value. + * + * @param recordProperty + * The ActivityRecordSet.SortableProperty value to associate with + * the new SortableProperty. + */ + SortableProperty(ActivityRecordSet.SortableProperty recordProperty) { + this.recordProperty = recordProperty; + } + + } + + /** + * The property to use when sorting ActivityRecords. + */ + private ActivityRecordSet.SortableProperty property; + + /** + * Whether the requested sort order is descending (true) or ascending + * (false). + */ + private boolean descending; + + /** + * Parses the given string value, determining the requested sort property + * and ordering. Possible values consist of any valid property name, and + * may include an optional prefix to denote descending sort order. Each + * possible property name is enumerated by the SortableValue enum. + * + * @param value + * The sort predicate string to parse, which must consist ONLY of a + * valid property name, possibly preceded by the DESCENDING_PREFIX. + * + * @throws APIException + * If the provided sort predicate string is invalid. + */ + public APISortPredicate(String value) + throws APIException { + + // Parse whether sort order is descending + if (value.startsWith(DESCENDING_PREFIX)) { + descending = true; + value = value.substring(DESCENDING_PREFIX.length()); + } + + // Parse sorting property into ActivityRecordSet.SortableProperty + try { + this.property = SortableProperty.valueOf(value).recordProperty; + } + + // Bail out if sort property is not valid + catch (IllegalArgumentException e) { + throw new APIException(new GuacamoleClientException(String.format("Invalid sort property: \"%s\"", value))); + } + + } + + /** + * Returns the SortableProperty defined by ActivityRecordSet which + * represents the property requested. + * + * @return + * The ActivityRecordSet.SortableProperty which refers to the same + * property as the string originally provided when this + * APISortPredicate was created. + */ + public ActivityRecordSet.SortableProperty getProperty() { + return property; + } + + /** + * Returns whether the requested sort order is descending. + * + * @return + * true if the sort order is descending, false if the sort order is + * ascending. + */ + public boolean isDescending() { + return descending; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityLogResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityLogResource.java new file mode 100644 index 0000000..e311884 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityLogResource.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import javax.ws.rs.GET; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActivityLog; + +/** + * A REST resource which exposes the contents of a given ActivityLog. + */ +public class ActivityLogResource { + + /** + * The ActivityLog whose contents are being exposed. + */ + private final ActivityLog log; + + /** + * Creates a new ActivityLogResource which exposes the records within the + * given ActivityLog. + * + * @param log + * The ActivityLog whose contents should be exposed. + */ + public ActivityLogResource(ActivityLog log) { + this.log = log; + } + + /** + * Returns the raw contents of the underlying ActivityLog. If the size of + * the ActivityLog is known, this size is included as the "Content-Length" + * of the response. + * + * @return + * A Response containing the raw contents of the underlying + * ActivityLog. + * + * @throws GuacamoleException + * If an error prevents retrieving the content of the log or its size. + */ + @GET + public Response getContents() throws GuacamoleException { + + // Build base response exposing the raw contents of the underlying log + ResponseBuilder response = Response.ok(log.getContent(), + log.getType().getContentType()); + + // Include size, if known + long size = log.getSize(); + if (size >= 0) + response.header("Content-Length", size); + + return response.build(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityRecordResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityRecordResource.java new file mode 100644 index 0000000..5b5faf4 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityRecordResource.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import java.util.function.Function; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.net.auth.ActivityLog; +import org.apache.guacamole.net.auth.ActivityRecord; + +/** + * A REST resource which exposes a single ActivityRecord, allowing any + * associated and accessible logs to be retrieved. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ActivityRecordResource { + + /** + * The ActivityRecord being exposed. + */ + private final ActivityRecord record; + + /** + * The REST API object representing the ActivityRecord being exposed. + */ + private final APIActivityRecord externalRecord; + + /** + * Creates a new ActivityRecordResource which exposes the given record. + * + * @param record + * The ActivityRecord that should be exposed. + * + * @param externalRecord + * The REST API object representing the ActivityRecord being exposed. + */ + public ActivityRecordResource(ActivityRecord record, + APIActivityRecord externalRecord) { + this.record = record; + this.externalRecord = externalRecord; + } + + /** + * Returns the record represented by this ActivityRecordResource, in a + * format intended for interchange. + * + * @return + * The record that this ActivityRecordResource represents, in a format + * intended for interchange. + */ + @GET + public APIActivityRecord getRecord() { + return externalRecord; + } + + /** + * Returns an ActivityLogResource representing the log associated with the + * underlying ActivityRecord and having the given name. If no such log + * can be retrieved, either because it does not exist or the current user + * does not have access, an exception is thrown. + * + * @param logName + * The unique name of the log to retrieve. + * + * @return + * An ActivityLogResource representing the log having the given name. + * + * @throws GuacamoleException + * If no such log can be retrieved. + */ + @Path("logs/{name}") + public ActivityLogResource getLog(@PathParam("name") String logName) + throws GuacamoleException { + + ActivityLog log = record.getLogs().get(logName); + if (log != null) + return new ActivityLogResource(log); + + throw new GuacamoleResourceNotFoundException("No such log."); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityRecordSetResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityRecordSetResource.java new file mode 100644 index 0000000..b6fdc49 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/ActivityRecordSetResource.java @@ -0,0 +1,202 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import java.util.ArrayList; +import java.util.List; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.ActivityRecordSet; + +/** + * A REST resource which abstracts the operations available on an + * ActivityRecordSet, such as the connection or user history available via the + * UserContext. + * + * @param + * The type of ActivityRecord that is contained + * within the ActivityRecordSet represented by this resource. To avoid + * coupling the REST API too tightly to the extension API, these objects + * are not directly serialized or deserialized when handling REST requests. + * + * @param + * The type of object used in interchange (ie: serialized/deserialized as + * JSON) between REST clients and this resource to represent the + * InternalRecordType. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public abstract class ActivityRecordSetResource { + + /** + * The maximum number of history records to return in any one response. + */ + private static final int MAXIMUM_HISTORY_SIZE = 1000; + + /** + * The ActivityRecordSet whose records are being exposed. + */ + private ActivityRecordSet history; + + /** + * Creates a new ActivityRecordSetResource which exposes the records within + * the given ActivityRecordSet. + * + * @param history + * The ActivityRecordSet whose records should be exposed. + */ + public ActivityRecordSetResource(ActivityRecordSet history) { + this.history = history; + } + + /** + * Converts the given internal record object to a record object which is + * decoupled from the extension API and is intended to be used in + * interchange via the REST API. + * + * @param record + * The record to convert for the sake of interchange. + * + * @return + * A new record object containing the same data as the given internal + * record, but intended for use in interchange. + */ + protected abstract ExternalRecordType toExternalRecord(InternalRecordType record); + + /** + * Applies the given search and sorting criteria to the ActivityRecordSet + * exposed by this ActivityRecordSetResource. The ActivityRecordSet stored + * as {@link #history} is modified as a result of this call. + * + * @param requiredContents + * The set of strings that each must occur somewhere within the + * returned records, whether within the associated username, + * the name of some associated object (such as a connection), or any + * associated date. If non-empty, any record not matching each of the + * strings within the collection will be excluded from the results. + * + * @param sortPredicates + * A list of predicates to apply while sorting the resulting records, + * describing the properties involved and the sort order for those + * properties. + * + * @throws GuacamoleException + * If an error occurs while applying the given filter criteria or + * sort predicates. + */ + private void applyCriteria(List requiredContents, + List sortPredicates) throws GuacamoleException { + + // Restrict to records which contain the specified strings + for (String required : requiredContents) { + if (!required.isEmpty()) + history = history.contains(required); + } + + // Sort according to specified ordering + for (APISortPredicate predicate : sortPredicates) + history = history.sort(predicate.getProperty(), predicate.isDescending()); + + // Limit to maximum result size + history = history.limit(MAXIMUM_HISTORY_SIZE); + + } + + /** + * Retrieves the list of activity records stored within the underlying + * ActivityRecordSet which match the given, arbitrary criteria. If + * specified, the returned records will also be sorted according to the + * given sort predicates. + * + * @param requiredContents + * The set of strings that each must occur somewhere within the + * returned records, whether within the associated username, + * the name of some associated object (such as a connection), or any + * associated date. If non-empty, any record not matching each of the + * strings within the collection will be excluded from the results. + * + * @param sortPredicates + * A list of predicates to apply while sorting the resulting records, + * describing the properties involved and the sort order for those + * properties. + * + * @return + * The list of records which match the provided criteria, optionally + * sorted as specified. + * + * @throws GuacamoleException + * If an error occurs while applying the given filter criteria or + * sort predicates. + */ + @GET + public List getRecords( + @QueryParam("contains") List requiredContents, + @QueryParam("order") List sortPredicates) + throws GuacamoleException { + + // Apply search/sort criteria + applyCriteria(requiredContents, sortPredicates); + + // Convert record set to collection of API records + List apiRecords = new ArrayList<>(); + for (InternalRecordType record : history.asCollection()) + apiRecords.add(toExternalRecord(record)); + + // Return the converted history + return apiRecords; + + } + + /** + * Retrieves record having the given identifier from among the set of + * activity records stored within the underlying ActivityRecordSet. + * + * @param identifier + * The unique identifier of the record to retrieve. + * + * @return + * A resource representing the record having the given identifier. + * + * @throws GuacamoleException + * If an error occurs while locating the requested record, or if the + * requested record cannot be found. + */ + @Path("{identifier}") + public ActivityRecordResource getRecord(@PathParam("identifier") String identifier) + throws GuacamoleException { + + InternalRecordType record = history.get(identifier); + if (record == null) + throw new GuacamoleResourceNotFoundException("Not found: \"" + identifier + "\""); + + return new ActivityRecordResource(record, toExternalRecord(record)); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/ConnectionHistoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/ConnectionHistoryResource.java new file mode 100644 index 0000000..42e8a85 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/ConnectionHistoryResource.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.ConnectionRecord; + +/** + * A REST resource for retrieving and managing the history records of Guacamole + * connections. Connection history records describe the start/end times of each + * usage of a connection (when a user connects and disconnects), as well as the + * specific user that connected/disconnected. + */ +public class ConnectionHistoryResource extends ActivityRecordSetResource { + + /** + * Creates a new ConnectionHistoryResource which exposes the connection + * history records of the given ActivityRecordSet. + * + * @param history + * The ActivityRecordSet whose records should be exposed. + */ + public ConnectionHistoryResource(ActivityRecordSet history) { + super(history); + } + + @Override + protected APIConnectionRecord toExternalRecord(ConnectionRecord record) { + return new APIConnectionRecord(record); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java new file mode 100644 index 0000000..704988c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; + +/** + * A REST resource for retrieving and managing the history records of Guacamole + * objects. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class HistoryResource { + + /** + * The UserContext whose associated connection history is being exposed. + */ + private final UserContext userContext; + + /** + * Creates a new HistoryResource which exposes the connection history + * associated with the given UserContext. + * + * @param userContext + * The UserContext whose connection history should be exposed. + */ + public HistoryResource(UserContext userContext) { + this.userContext = userContext; + } + + /** + * Retrieves the usage history for all connections. Filtering may be + * applied via the returned ConnectionHistoryResource. + * + * @return + * A resource which exposes connection records that may optionally be + * filtered, each record describing the start and end times that a + * particular connection was used. + * + * @throws GuacamoleException + * If an error occurs while retrieving the connection history. + */ + @Path("connections") + public ConnectionHistoryResource getConnectionHistory() throws GuacamoleException { + try { + return new ConnectionHistoryResource(userContext.getConnectionHistory()); + } + catch (GuacamoleUnsupportedException e) { + return new ConnectionHistoryResource(new SimpleActivityRecordSet<>()); + } + } + + /** + * Retrieves the login history for all users. Filtering may be applied via + * the returned UserHistoryResource. + * + * @return + * A resource which exposes user records that may optionally be + * filtered, each record describing the start and end times of a user + * session. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user history. + */ + @Path("users") + public UserHistoryResource getUserHistory() throws GuacamoleException { + try { + return new UserHistoryResource(userContext.getUserHistory()); + } + catch (GuacamoleUnsupportedException e) { + return new UserHistoryResource(new SimpleActivityRecordSet<>()); + } + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/UserHistoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/UserHistoryResource.java new file mode 100644 index 0000000..6324873 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/UserHistoryResource.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.history; + +import org.apache.guacamole.net.auth.ActivityRecord; +import org.apache.guacamole.net.auth.ActivityRecordSet; + +/** + * A REST resource for retrieving and managing the history records of Guacamole + * user sessions. User session history records describe the start/end times of + * individual user sessions (when specific users logged in and out). + */ +public class UserHistoryResource extends ActivityRecordSetResource { + + /** + * Creates a new UserHistoryResource which exposes the user session history + * records of the given ActivityRecordSet. + * + * @param history + * The ActivityRecordSet whose records should be exposed. + */ + public UserHistoryResource(ActivityRecordSet history) { + super(history); + } + + @Override + protected APIActivityRecord toExternalRecord(ActivityRecord record) { + return new APIActivityRecord(record); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/package-info.java new file mode 100644 index 0000000..87f6d3c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to retrieval or maintenance of history records using the + * Guacamole REST API. + */ +package org.apache.guacamole.rest.history; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/identifier/RelatedObjectSetPatch.java b/guacamole/src/main/java/org/apache/guacamole/rest/identifier/RelatedObjectSetPatch.java new file mode 100644 index 0000000..b580748 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/identifier/RelatedObjectSetPatch.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.identifier; + +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.RelatedObjectSet; + +/** + * A set of changes to be applied to a RelatedObjectSet, describing the + * objects being added and/or removed. + */ +public class RelatedObjectSetPatch { + + /** + * A set containing the identifiers of all objects being added. + */ + private final Set addedObjects = new HashSet(); + + /** + * A set containing the identifiers of all objects being removed. + */ + private final Set removedObjects = new HashSet(); + + /** + * Queues the object having the given identifier for addition to the + * underlying RelatedObjectSet. The add operation will be performed only + * when apply() is called. + * + * @param identifier + * The identifier of the object to add. + */ + public void addObject(String identifier) { + addedObjects.add(identifier); + } + + /** + * Queues the object having the given identifier for removal from the + * underlying RelatedObjectSet. The remove operation will be performed only + * when apply() is called. + * + * @param identifier + * The identifier of the object to remove. + */ + public void removeObject(String identifier) { + removedObjects.add(identifier); + } + + /** + * Applies all queued changes to the given RelatedObjectSet. + * + * @param objects + * The RelatedObjectSet to add and/or remove objects from. + * + * @throws GuacamoleException + * If any add or remove operation is disallowed by the underlying + * RelatedObjectSet. + */ + public void apply(RelatedObjectSet objects) throws GuacamoleException { + + // Add any added identifiers + if (!addedObjects.isEmpty()) + objects.addObjects(addedObjects); + + // Remove any removed identifiers + if (!removedObjects.isEmpty()) + objects.removeObjects(removedObjects); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/identifier/RelatedObjectSetResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/identifier/RelatedObjectSetResource.java new file mode 100644 index 0000000..7703be3 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/identifier/RelatedObjectSetResource.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.identifier; + +import java.util.List; +import java.util.Set; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PATCH; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.RelatedObjectSet; +import org.apache.guacamole.rest.jsonpatch.APIPatch; + +/** + * A REST resource which abstracts the operations available on arbitrary sets + * of objects which share some common relation. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class RelatedObjectSetResource { + + /** + * The path of any operation within a JSON patch which adds/removes an + * object from the associated set. + */ + private static final String OBJECT_PATH = "/"; + + /** + * The set of objects represented by this RelatedObjectSetResource. + */ + private final RelatedObjectSet objects; + + /** + * Creates a new RelatedObjectSetResource which exposes the operations and + * subresources available for the given RelatedObjectSet. + * + * @param objects + * The RelatedObjectSet exposed by this RelatedObjectSetResource. + */ + public RelatedObjectSetResource(RelatedObjectSet objects) { + this.objects = objects; + } + + /** + * Returns the identifiers of all objects within RelatedObjectSet exposed by + * this RelatedObjectSetResource. + * + * @return + * The identifiers of all objects within RelatedObjectSet exposed by + * this RelatedObjectSetResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the objects within the set, or + * if objects cannot be retrieved due to lack of permissions to do so. + */ + @GET + public Set getObjects() throws GuacamoleException { + return objects.getObjects(); + } + + /** + * Updates the given RelatedObjectSetPatch by queuing an add or remove + * operation for the object having the given identifier based on the given + * patch operation. + * + * @param operation + * The patch operation to perform. + * + * @param relatedObjectSetPatch + * The RelatedObjectSetPatch being modified. + * + * @param identifier + * The identifier of the object being added or removed from the set. + * + * @throws GuacamoleException + * If the requested patch operation is not supported. + */ + private void updateRelatedObjectSet(APIPatch.Operation operation, + RelatedObjectSetPatch relatedObjectSetPatch, String identifier) + throws GuacamoleException { + + // Add or remove object based on operation + switch (operation) { + + // Add object + case add: + relatedObjectSetPatch.addObject(identifier); + break; + + // Remove object + case remove: + relatedObjectSetPatch.removeObject(identifier); + break; + + // Unsupported patch operation + default: + throw new GuacamoleClientException("Unsupported patch operation: \"" + operation + "\""); + + } + + } + + /** + * Applies a given list of patches to the RelatedObjectSet exposed by this + * RelatedObjectSetResource. Each patch specifies either + * an "add" or a "remove" operation for a particular object represented + * by its identifier. The path of each operation MUST be "/", with the + * identifier of the object being provided within the value of the patch. + * + * @param patches + * The patches to apply for this request. + * + * @throws GuacamoleException + * If an error is encountered while modifying the contents of the + * RelatedObjectSet. + */ + @PATCH + public void patchObjects(List> patches) + throws GuacamoleException { + + // Apply all patch operations individually + RelatedObjectSetPatch objectPatch = new RelatedObjectSetPatch(); + for (APIPatch patch : patches) { + + String path = patch.getPath(); + + // Add/remove objects from set + if (path.equals(OBJECT_PATH)) { + String identifier = patch.getValue(); + updateRelatedObjectSet(patch.getOp(), objectPatch, identifier); + } + + // Otherwise, the path is not supported + else + throw new GuacamoleClientException("Unsupported patch path: \"" + path + "\""); + + } // end for each patch operation + + // Save changes + objectPatch.apply(objects); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/identifier/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/identifier/package-info.java new file mode 100644 index 0000000..4681bac --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/identifier/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to manipulating arbitrary sets of unique identifiers using + * the Guacamole REST API. + */ +package org.apache.guacamole.rest.identifier; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatch.java b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatch.java new file mode 100644 index 0000000..9f92685 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatch.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.jsonpatch; + +/** + * An object for representing an entry within the body of a + * JSON PATCH request. See https://tools.ietf.org/html/rfc6902 + * + * @param + * The type of object being patched. + */ +public class APIPatch { + + /** + * The possible operations for a PATCH request. + */ + public enum Operation { + add, remove, test, copy, replace, move + } + + /** + * The operation to perform for this patch. + */ + private Operation op; + + /** + * The value for this patch. + */ + private T value; + + /** + * The path for this patch. + */ + private String path; + + /** + * Returns the operation for this patch. + * @return the operation for this patch. + */ + public Operation getOp() { + return op; + } + + /** + * Set the operation for this patch. + * @param op The operation for this patch. + */ + public void setOp(Operation op) { + this.op = op; + } + + /** + * Returns the value of this patch. + * @return The value of this patch. + */ + public T getValue() { + return value; + } + + /** + * Sets the value of this patch. + * @param value The value of this patch. + */ + public void setValue(T value) { + this.value = value; + } + + /** + * Returns the path for this patch. + * @return The path for this patch. + */ + public String getPath() { + return path; + } + + /** + * Set the path for this patch. + * @param path The path for this patch. + */ + public void setPath(String path) { + this.path = path; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchError.java b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchError.java new file mode 100644 index 0000000..45dcd5b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchError.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.jsonpatch; + +import org.apache.guacamole.language.TranslatableMessage; +import org.apache.guacamole.rest.jsonpatch.APIPatch.Operation; + +/** + * A failure outcome associated with a particular patch within a JSON Patch + * request. This status indicates that a particular patch failed to apply, + * and includes the error describing the failure, along with the operation and + * path from the original patch, and the identifier of the object + * referenced by the original patch. + */ +public class APIPatchError extends APIPatchOutcome { + + /** + * The error associated with the submitted patch. + */ + private final TranslatableMessage error; + + /** + * Create a failure status associated with a submitted patch from a JSON + * patch API request. + * + * @param op + * The operation requested by the failed patch. + * + * @param identifier + * The identifier of the object associated with the failed patch. If + * the patch failed to create a new object, this will be null. + * + * @param path + * The patch from the failed patch. + * + * @param error + * The error message associated with the failure that prevented the + * patch from applying. + */ + public APIPatchError( + Operation op, String identifier, String path, + TranslatableMessage error) { + super(op, identifier, path); + this.error = error; + } + + /** + * Return the error associated with the patch failure. + * + * @return + * The error associated with the patch failure. + */ + public TranslatableMessage getError() { + return error; + } +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchFailureException.java b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchFailureException.java new file mode 100644 index 0000000..e77be6d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchFailureException.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.jsonpatch; + +import java.util.List; + +import org.apache.guacamole.GuacamoleClientException; + +/** + * An exception describing a failure to apply the patches from a JSON Patch + * request. A list of outcomes is included, one for each patch in the request. + */ +public class APIPatchFailureException extends GuacamoleClientException { + + /** + * A list of outcomes, each one corresponding to a patch in the request + * corresponding to this response. This may include a mix of successes and + * failures. Any failure will result in a failure of the entire request + * since JSON Patch requests are handled atomically. + */ + public final List patches; + + /** + * Create a new patch request failure with the provided list of outcomes + * for individual patches. + * + * @param message + * A human-readable message describing the overall request failure. + * + * @param patches + * A list of patch outcomes, one for each patch in the request + * associated with this response. + */ + public APIPatchFailureException( + String message, List patches) { + + super(message); + this.patches = patches; + } + + /** + * Return the outcome for each patch in the request corresponding to this + * response. + */ + public List getPatches() { + return patches; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchOutcome.java b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchOutcome.java new file mode 100644 index 0000000..f40d53f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchOutcome.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.jsonpatch; + +import org.apache.guacamole.rest.jsonpatch.APIPatch.Operation; + +/** + * A successful outcome associated with a particular patch within a JSON Patch + * request. The outcome contains the operation requested by the original patch, + * the path from the original patch, and the identifier of the object corresponding + * to the value from the original patch. + * + * The purpose of this class is to present a relatively lightweight outcome for + * the user who submitted the Patch request. Rather than including the full + * contents of the value, only the identifier is included, allowing the user to + * determine the identifier of any newly-created objects as part of the request. + */ +public class APIPatchOutcome { + + /** + * The requested operation for the patch corresponding to this outcome. + */ + private final Operation op; + + /** + * The identifier for the value in patch corresponding to this outcome. + * If the value in the patch was null, this identifier should also be null. + */ + private String identifier; + + /** + * The path for the patch corresponding to this outcome. + */ + private final String path; + + /** + * Create an outcome associated with a submitted patch, as part of a JSON + * patch API request. + * + * @param op + * The requested operation for the patch corresponding to this outcome. + * + * @param identifier + * The identifier for the value in patch corresponding to this outcome. + * + * @param path + * The path for the patch corresponding to this outcome. + */ + public APIPatchOutcome(Operation op, String identifier, String path) { + this.op = op; + this.identifier = identifier; + this.path = path; + } + + /** + * Clear the identifier associated with this patch outcome. This must + * be done when an identifier in a outcome refers to a temporary object + * that was rolled back during processing of a request. + */ + public void clearIdentifier() { + this.identifier = null; + } + + /** + * Returns the requested operation for the patch corresponding to this + * outcome. + * + * @return + * The requested operation for the patch corresponding to this outcome. + */ + public Operation getOp() { + return op; + } + + /** + * Returns the path for the patch corresponding to this outcome. + * + * @return + * The path for the patch corresponding to this outcome. + */ + public String getPath() { + return path; + } + + /** + * Returns the identifier for the value in patch corresponding to this + * outcome, or null if the value in the patch was null. + * + * @return + * The identifier for the value in patch corresponding to this + * outcome, or null if the value was null. + */ + public String getIdentifier() { + return identifier; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchResponse.java b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchResponse.java new file mode 100644 index 0000000..21096a2 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/APIPatchResponse.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.jsonpatch; + +import java.util.List; + +/** + * A REST response describing the successful application of a JSON PATCH + * request to a directory. This consists of a list of outcomes, one for each + * patch within the request, in the same order. + */ +public class APIPatchResponse { + + /** + * A list of outcomes, each one corresponding to a patch in the request + * corresponding to this response. + */ + public final List patches; + + /** + * Create a new patch response with the provided list of outcomes for + * individual patches. + * + * @param patches + * A list of patch outcomes, one for each patch in the request + * associated with this response. + */ + public APIPatchResponse(List patches) { + this.patches = patches; + } + + /** + * Return the outcome for each patch in the request corresponding to this + * response. + */ + public List getPatches() { + return patches; + } +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/package-info.java new file mode 100644 index 0000000..b5f824f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/jsonpatch/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to JSON Patch HTTP requests or responses. + * See https://www.rfc-editor.org/rfc/rfc6902. + */ +package org.apache.guacamole.rest.jsonpatch; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/language/LanguageRESTService.java b/guacamole/src/main/java/org/apache/guacamole/rest/language/LanguageRESTService.java new file mode 100644 index 0000000..4fccbae --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/language/LanguageRESTService.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.language; + +import java.util.Map; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.extension.LanguageResourceService; + + +/** + * A REST Service for handling the listing of languages. + */ +@Path("/languages") +@Produces(MediaType.APPLICATION_JSON) +public class LanguageRESTService { + + /** + * Service for retrieving information regarding available language + * resources. + */ + @Inject + private LanguageResourceService languageResourceService; + + /** + * Returns a map of all available language keys to their corresponding + * human-readable names. + * + * @return + * A map of languages defined in the system, of language key to + * display name. + */ + @GET + public Map getLanguages() { + return languageResourceService.getLanguageNames(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/language/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/language/package-info.java new file mode 100644 index 0000000..c26481b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/language/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the language retrieval aspect of the Guacamole REST API. + */ +package org.apache.guacamole.rest.language; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/package-info.java new file mode 100644 index 0000000..36c4f05 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the basic Guacamole REST API. + */ +package org.apache.guacamole.rest; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/patch/PatchRESTService.java b/guacamole/src/main/java/org/apache/guacamole/rest/patch/PatchRESTService.java new file mode 100644 index 0000000..115b37c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/patch/PatchRESTService.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.patch; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.extension.PatchResourceService; +import org.apache.guacamole.resource.Resource; + +/** + * A REST Service for handling the listing of HTML patches. + */ +@Path("/patches") +@Produces(MediaType.APPLICATION_JSON) +public class PatchRESTService { + + /** + * Service for retrieving information regarding available HTML patch + * resources. + */ + @Inject + private PatchResourceService patchResourceService; + + /** + * Reads the entire contents of the given resource as a String. The + * resource is assumed to be encoded in UTF-8. + * + * @param resource + * The resource to read as a new String. + * + * @return + * A new String containing the contents of the given resource. + * + * @throws IOException + * If an I/O error prevents reading the resource. + */ + private String readResourceAsString(Resource resource) throws IOException { + + StringBuilder contents = new StringBuilder(); + + // Read entire resource into StringBuilder one chunk at a time + Reader reader = new InputStreamReader(resource.asStream(), "UTF-8"); + try { + + char buffer[] = new char[8192]; + int length; + + while ((length = reader.read(buffer)) != -1) { + contents.append(buffer, 0, length); + } + + } + + // Ensure resource is always closed + finally { + reader.close(); + } + + return contents.toString(); + + } + + /** + * Returns a list of all available HTML patches, in the order they should + * be applied. Each patch is raw HTML containing additional meta tags + * describing how and where the patch should be applied. + * + * @return + * A list of all HTML patches defined in the system, in the order they + * should be applied. + * + * @throws GuacamoleException + * If an error occurs preventing any HTML patch from being read. + */ + @GET + public List getPatches() throws GuacamoleException { + + try { + + // Allocate a list of equal size to the total number of patches + List resources = patchResourceService.getPatchResources(); + List patches = new ArrayList(resources.size()); + + // Convert each patch resource to a string + for (Resource resource : resources) { + patches.add(readResourceAsString(resource)); + } + + // Return all patches in string form + return patches; + + } + + // Bail out entirely on error + catch (IOException e) { + throw new GuacamoleServerException("Unable to read HTML patches.", e); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/patch/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/patch/package-info.java new file mode 100644 index 0000000..afc8878 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/patch/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the HTML patch retrieval aspect of the Guacamole REST API. + */ +package org.apache.guacamole.rest.patch; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/permission/APIPermissionSet.java b/guacamole/src/main/java/org/apache/guacamole/rest/permission/APIPermissionSet.java new file mode 100644 index 0000000..c5b1116 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/permission/APIPermissionSet.java @@ -0,0 +1,365 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.permission; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * The set of permissions which are granted to a specific user or user group, + * organized by object type and, if applicable, identifier. This object can be + * constructed with arbitrary permissions present, or manipulated after creation + * through the manipulation or replacement of its collections of permissions, + * but is otherwise not intended for internal use as a data structure for + * permissions. Its primary purpose is as a hierarchical format for exchanging + * granted permissions with REST clients. + */ +public class APIPermissionSet { + + /** + * Map of connection ID to the set of granted permissions. + */ + private Map> connectionPermissions = + new HashMap>(); + + /** + * Map of connection group ID to the set of granted permissions. + */ + private Map> connectionGroupPermissions = + new HashMap>(); + + /** + * Map of sharing profile ID to the set of granted permissions. + */ + private Map> sharingProfilePermissions = + new HashMap>(); + + /** + * Map of active connection ID to the set of granted permissions. + */ + private Map> activeConnectionPermissions = + new HashMap>(); + + /** + * Map of user ID to the set of granted permissions. + */ + private Map> userPermissions = + new HashMap>(); + + /** + * Map of user group ID to the set of granted permissions. + */ + private Map> userGroupPermissions = + new HashMap>(); + + /** + * Set of all granted system-level permissions. + */ + private Set systemPermissions = + EnumSet.noneOf(SystemPermission.Type.class); + + /** + * Creates a new permission set which contains no granted permissions. Any + * permissions must be added by manipulating or replacing the applicable + * permission collection. + */ + public APIPermissionSet() { + } + + /** + * Adds the system permissions from the given SystemPermissionSet to the + * Set of system permissions provided. + * + * @param permissions + * The Set to add system permissions to. + * + * @param permSet + * The SystemPermissionSet containing the system permissions to add. + * + * @throws GuacamoleException + * If an error occurs while retrieving system permissions from the + * SystemPermissionSet. + */ + private void addSystemPermissions(Set permissions, + SystemPermissionSet permSet) throws GuacamoleException { + + // Add all provided system permissions + for (SystemPermission permission : permSet.getPermissions()) + permissions.add(permission.getType()); + + } + + /** + * Adds the object permissions from the given ObjectPermissionSet to the + * Map of object permissions provided. + * + * @param permissions + * The Map to add object permissions to. + * + * @param permSet + * The ObjectPermissionSet containing the object permissions to add. + * + * @throws GuacamoleException + * If an error occurs while retrieving object permissions from the + * ObjectPermissionSet. + */ + private void addObjectPermissions(Map> permissions, + ObjectPermissionSet permSet) throws GuacamoleException { + + // Add all provided object permissions + for (ObjectPermission permission : permSet.getPermissions()) { + + // Get associated set of permissions + String identifier = permission.getObjectIdentifier(); + Set objectPermissions = permissions.get(identifier); + + // Create new set if none yet exists + if (objectPermissions == null) + permissions.put(identifier, EnumSet.of(permission.getType())); + + // Otherwise add to existing set + else + objectPermissions.add(permission.getType()); + + } + + } + + /** + * Creates a new permission set containing all permissions currently + * granted within the given Permissions object. + * + * @param permissions + * The permissions that should be stored within this permission set. + * + * @throws GuacamoleException + * If an error occurs while retrieving the permissions. + */ + public APIPermissionSet(Permissions permissions) throws GuacamoleException { + + // Add all permissions from the provided user + addSystemPermissions(systemPermissions, permissions.getSystemPermissions()); + addObjectPermissions(connectionPermissions, permissions.getConnectionPermissions()); + addObjectPermissions(connectionGroupPermissions, permissions.getConnectionGroupPermissions()); + addObjectPermissions(sharingProfilePermissions, permissions.getSharingProfilePermissions()); + addObjectPermissions(activeConnectionPermissions, permissions.getActiveConnectionPermissions()); + addObjectPermissions(userPermissions, permissions.getUserPermissions()); + addObjectPermissions(userGroupPermissions, permissions.getUserGroupPermissions()); + + } + + /** + * Returns a map of connection IDs to the set of permissions granted for + * that connection. If no permissions are granted to a particular + * connection, its ID will not be present as a key in the map. This map is + * mutable, and changes to this map will affect the permission set + * directly. + * + * @return + * A map of connection IDs to the set of permissions granted for that + * connection. + */ + public Map> getConnectionPermissions() { + return connectionPermissions; + } + + /** + * Returns a map of connection group IDs to the set of permissions granted + * for that connection group. If no permissions are granted to a particular + * connection group, its ID will not be present as a key in the map. This + * map is mutable, and changes to this map will affect the permission set + * directly. + * + * @return + * A map of connection group IDs to the set of permissions granted for + * that connection group. + */ + public Map> getConnectionGroupPermissions() { + return connectionGroupPermissions; + } + + /** + * Returns a map of sharing profile identifiers to the set of permissions + * granted for that sharing profile. If no permissions are granted to a + * particular sharing profile, its identifier will not be present as a key + * in the map. This map is mutable, and changes to this map will affect the + * permission set directly. + * + * @return + * A map of sharing profile identifiers to the set of permissions + * granted for that sharing profile. + */ + public Map> getSharingProfilePermissions() { + return sharingProfilePermissions; + } + + /** + * Returns a map of active connection IDs to the set of permissions granted + * for that active connection. If no permissions are granted to a particular + * active connection, its ID will not be present as a key in the map. This + * map is mutable, and changes to this map will affect the permission set + * directly. + * + * @return + * A map of active connection IDs to the set of permissions granted for + * that active connection. + */ + public Map> getActiveConnectionPermissions() { + return activeConnectionPermissions; + } + + /** + * Returns a map of user IDs to the set of permissions granted for that + * user. If no permissions are granted for a particular user, its ID will + * not be present as a key in the map. This map is mutable, and changes to + * to this map will affect the permission set directly. + * + * @return + * A map of user IDs to the set of permissions granted for that user. + */ + public Map> getUserPermissions() { + return userPermissions; + } + + /** + * Returns a map of user group IDs to the set of permissions granted for + * that user group. If no permissions are granted for a particular user + * group, its ID will not be present as a key in the map. This map is + * mutable, and changes to to this map will affect the permission set + * directly. + * + * @return + * A map of user IDs to the set of permissions granted for that user. + */ + public Map> getUserGroupPermissions() { + return userGroupPermissions; + } + + /** + * Returns the set of granted system-level permissions. If no permissions + * are granted at the system level, this will be an empty set. This set is + * mutable, and changes to this set will affect the permission set + * directly. + * + * @return + * The set of granted system-level permissions. + */ + public Set getSystemPermissions() { + return systemPermissions; + } + + /** + * Replaces the current map of connection permissions with the given map, + * which must map connection ID to its corresponding set of granted + * permissions. If a connection has no permissions, its ID must not be + * present as a key in the map. + * + * @param connectionPermissions + * The map which must replace the currently-stored map of permissions. + */ + public void setConnectionPermissions(Map> connectionPermissions) { + this.connectionPermissions = connectionPermissions; + } + + /** + * Replaces the current map of connection group permissions with the given + * map, which must map connection group ID to its corresponding set of + * granted permissions. If a connection group has no permissions, its ID + * must not be present as a key in the map. + * + * @param connectionGroupPermissions + * The map which must replace the currently-stored map of permissions. + */ + public void setConnectionGroupPermissions(Map> connectionGroupPermissions) { + this.connectionGroupPermissions = connectionGroupPermissions; + } + + /** + * Replaces the current map of sharing profile permissions with the given + * map, which must map each sharing profile identifier to its corresponding + * set of granted permissions. If a sharing profile has no permissions, its + * identifier must not be present as a key in the map. + * + * @param sharingProfilePermissions + * The map which must replace the currently-stored map of permissions. + */ + public void setSharingProfilePermissions(Map> sharingProfilePermissions) { + this.sharingProfilePermissions = sharingProfilePermissions; + } + + /** + * Replaces the current map of active connection permissions with the give + * map, which must map active connection ID to its corresponding set of + * granted permissions. If an active connection has no permissions, its ID + * must not be present as a key in the map. + * + * @param activeConnectionPermissions + * The map which must replace the currently-stored map of permissions. + */ + public void setActiveConnectionPermissions(Map> activeConnectionPermissions) { + this.activeConnectionPermissions = activeConnectionPermissions; + } + + /** + * Replaces the current map of user permissions with the given map, which + * must map user ID to its corresponding set of granted permissions. If a + * user has no permissions, its ID must not be present as a key in the map. + * + * @param userPermissions + * The map which must replace the currently-stored map of permissions. + */ + public void setUserPermissions(Map> userPermissions) { + this.userPermissions = userPermissions; + } + + /** + * Replaces the current map of user group permissions with the given map, + * which must map user group ID to its corresponding set of granted + * permissions. If a user group has no permissions, its ID must not be + * present as a key in the map. + * + * @param userGroupPermissions + * The map which must replace the currently-stored map of permissions. + */ + public void setUserGroupPermissions(Map> userGroupPermissions) { + this.userGroupPermissions = userGroupPermissions; + } + + /** + * Replaces the current set of system-level permissions with the given set. + * If no system-level permissions are granted, the empty set must be + * specified. + * + * @param systemPermissions + * The set which must replace the currently-stored set of permissions. + */ + public void setSystemPermissions(Set systemPermissions) { + this.systemPermissions = systemPermissions; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/permission/PermissionSetPatch.java b/guacamole/src/main/java/org/apache/guacamole/rest/permission/PermissionSetPatch.java new file mode 100644 index 0000000..c159e32 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/permission/PermissionSetPatch.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.permission; + +import java.util.HashSet; +import java.util.Set; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.permission.Permission; +import org.apache.guacamole.net.auth.permission.PermissionSet; + +/** + * A set of changes to be applied to a PermissionSet, describing the set of + * permissions being added and removed. + * + * @param + * The type of permissions being added and removed. + */ +public class PermissionSetPatch { + + /** + * The set of all permissions being added. + */ + private final Set addedPermissions = + new HashSet(); + + /** + * The set of all permissions being removed. + */ + private final Set removedPermissions = + new HashSet(); + + /** + * Queues the given permission to be added. The add operation will be + * performed only when apply() is called. + * + * @param permission + * The permission to add. + */ + public void addPermission(PermissionType permission) { + addedPermissions.add(permission); + } + + /** + * Queues the given permission to be removed. The remove operation will be + * performed only when apply() is called. + * + * @param permission + * The permission to remove. + */ + public void removePermission(PermissionType permission) { + removedPermissions.add(permission); + } + + /** + * Applies all queued changes to the given permission set. + * + * @param permissionSet + * The permission set to add and remove permissions from. + * + * @throws GuacamoleException + * If an error occurs while manipulating the permissions of the given + * permission set. + */ + public void apply(PermissionSet permissionSet) + throws GuacamoleException { + + // Add any added permissions + if (!addedPermissions.isEmpty()) + permissionSet.addPermissions(addedPermissions); + + // Remove any removed permissions + if (!removedPermissions.isEmpty()) + permissionSet.removePermissions(removedPermissions); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/permission/PermissionSetResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/permission/PermissionSetResource.java new file mode 100644 index 0000000..62f4d0e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/permission/PermissionSetResource.java @@ -0,0 +1,305 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.permission; + +import java.util.List; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PATCH; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.Permission; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.rest.jsonpatch.APIPatch; + +/** + * A REST resource which abstracts the operations available on the permissions + * granted to an existing User or UserGroup. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class PermissionSetResource { + + /** + * The prefix of any path within an operation of a JSON patch which modifies + * the permissions of a user or user group regarding a specific connection. + */ + private static final String CONNECTION_PERMISSION_PATCH_PATH_PREFIX = "/connectionPermissions/"; + + /** + * The prefix of any path within an operation of a JSON patch which modifies + * the permissions of a user or user group regarding a specific connection + * group. + */ + private static final String CONNECTION_GROUP_PERMISSION_PATCH_PATH_PREFIX = "/connectionGroupPermissions/"; + + /** + * The prefix of any path within an operation of a JSON patch which modifies + * the permissions of a user or user group regarding a specific sharing + * profile. + */ + private static final String SHARING_PROFILE_PERMISSION_PATCH_PATH_PREFIX = "/sharingProfilePermissions/"; + + /** + * The prefix of any path within an operation of a JSON patch which modifies + * the permissions of a user or user group regarding a specific active + * connection. + */ + private static final String ACTIVE_CONNECTION_PERMISSION_PATCH_PATH_PREFIX = "/activeConnectionPermissions/"; + + /** + * The prefix of any path within an operation of a JSON patch which modifies + * the permissions of a user or user group regarding a specific user. + */ + private static final String USER_PERMISSION_PATCH_PATH_PREFIX = "/userPermissions/"; + + /** + * The prefix of any path within an operation of a JSON patch which modifies + * the permissions of a user or user group regarding a specific user group. + */ + private static final String USER_GROUP_PERMISSION_PATCH_PATH_PREFIX = "/userGroupPermissions/"; + + /** + * The path of any operation within a JSON patch which modifies the + * permissions of a user or user group regarding the entire system. + */ + private static final String SYSTEM_PERMISSION_PATCH_PATH = "/systemPermissions"; + + /** + * The permissions represented by this PermissionSetResource. + */ + private final Permissions permissions; + + /** + * Creates a new PermissionSetResource which exposes the operations and + * subresources available for the given Permissions object. + * + * @param permissions + * The permissions that should be represented by this + * PermissionSetResource. + */ + public PermissionSetResource(Permissions permissions) { + this.permissions = permissions; + } + + /** + * Gets a list of all permissions granted to the user or user group + * associated with this PermissionSetResource. + * + * @return + * A list of all permissions granted to the user or user group + * associated with this PermissionSetResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving permissions. + */ + @GET + public APIPermissionSet getPermissions() throws GuacamoleException { + return new APIPermissionSet(permissions); + } + + /** + * Updates the given permission set patch by queuing an add or remove + * operation for the given permission based on the given patch operation. + * + * @param + * The type of permission stored within the permission set. + * + * @param operation + * The patch operation to perform. + * + * @param permissionSetPatch + * The permission set patch being modified. + * + * @param permission + * The permission being added or removed from the set. + * + * @throws GuacamoleException + * If the requested patch operation is not supported. + */ + private void updatePermissionSet( + APIPatch.Operation operation, + PermissionSetPatch permissionSetPatch, + PermissionType permission) throws GuacamoleException { + + // Add or remove permission based on operation + switch (operation) { + + // Add permission + case add: + permissionSetPatch.addPermission(permission); + break; + + // Remove permission + case remove: + permissionSetPatch.removePermission(permission); + break; + + // Unsupported patch operation + default: + throw new GuacamoleClientException("Unsupported patch operation: \"" + operation + "\""); + + } + + } + + /** + * Applies a given list of permission patches. Each patch specifies either + * an "add" or a "remove" operation for a permission type, represented by + * a string. Valid permission types depend on the path of each patch + * operation, as the path dictates the permission being modified, such as + * "/connectionPermissions/42" or "/systemPermissions". + * + * @param patches + * The permission patches to apply for this request. + * + * @throws GuacamoleException + * If a problem is encountered while modifying permissions. + */ + @PATCH + public void patchPermissions(List> patches) + throws GuacamoleException { + + // Permission patches for all types of permissions + PermissionSetPatch connectionPermissionPatch = new PermissionSetPatch(); + PermissionSetPatch connectionGroupPermissionPatch = new PermissionSetPatch(); + PermissionSetPatch sharingProfilePermissionPatch = new PermissionSetPatch(); + PermissionSetPatch activeConnectionPermissionPatch = new PermissionSetPatch(); + PermissionSetPatch userPermissionPatch = new PermissionSetPatch(); + PermissionSetPatch userGroupPermissionPatch = new PermissionSetPatch(); + PermissionSetPatch systemPermissionPatch = new PermissionSetPatch(); + + // Apply all patch operations individually + for (APIPatch patch : patches) { + + String path = patch.getPath(); + + // Create connection permission if path has connection prefix + if (path.startsWith(CONNECTION_PERMISSION_PATCH_PATH_PREFIX)) { + + // Get identifier and type from patch operation + String identifier = path.substring(CONNECTION_PERMISSION_PATCH_PATH_PREFIX.length()); + ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + ObjectPermission permission = new ObjectPermission(type, identifier); + updatePermissionSet(patch.getOp(), connectionPermissionPatch, permission); + + } + + // Create connection group permission if path has connection group prefix + else if (path.startsWith(CONNECTION_GROUP_PERMISSION_PATCH_PATH_PREFIX)) { + + // Get identifier and type from patch operation + String identifier = path.substring(CONNECTION_GROUP_PERMISSION_PATCH_PATH_PREFIX.length()); + ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + ObjectPermission permission = new ObjectPermission(type, identifier); + updatePermissionSet(patch.getOp(), connectionGroupPermissionPatch, permission); + + } + + // Create sharing profile permission if path has sharing profile prefix + else if (path.startsWith(SHARING_PROFILE_PERMISSION_PATCH_PATH_PREFIX)) { + + // Get identifier and type from patch operation + String identifier = path.substring(SHARING_PROFILE_PERMISSION_PATCH_PATH_PREFIX.length()); + ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + ObjectPermission permission = new ObjectPermission(type, identifier); + updatePermissionSet(patch.getOp(), sharingProfilePermissionPatch, permission); + + } + + // Create active connection permission if path has active connection prefix + else if (path.startsWith(ACTIVE_CONNECTION_PERMISSION_PATCH_PATH_PREFIX)) { + + // Get identifier and type from patch operation + String identifier = path.substring(ACTIVE_CONNECTION_PERMISSION_PATCH_PATH_PREFIX.length()); + ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + ObjectPermission permission = new ObjectPermission(type, identifier); + updatePermissionSet(patch.getOp(), activeConnectionPermissionPatch, permission); + + } + + // Create user permission if path has user prefix + else if (path.startsWith(USER_PERMISSION_PATCH_PATH_PREFIX)) { + + // Get identifier and type from patch operation + String identifier = path.substring(USER_PERMISSION_PATCH_PATH_PREFIX.length()); + ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + ObjectPermission permission = new ObjectPermission(type, identifier); + updatePermissionSet(patch.getOp(), userPermissionPatch, permission); + + } + + // Create user group permission if path has user group prefix + else if (path.startsWith(USER_GROUP_PERMISSION_PATCH_PATH_PREFIX)) { + + // Get identifier and type from patch operation + String identifier = path.substring(USER_GROUP_PERMISSION_PATCH_PATH_PREFIX.length()); + ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + ObjectPermission permission = new ObjectPermission(type, identifier); + updatePermissionSet(patch.getOp(), userGroupPermissionPatch, permission); + + } + + // Create system permission if path is system path + else if (path.equals(SYSTEM_PERMISSION_PATCH_PATH)) { + + // Get identifier and type from patch operation + SystemPermission.Type type = SystemPermission.Type.valueOf(patch.getValue()); + + // Create and update corresponding permission + SystemPermission permission = new SystemPermission(type); + updatePermissionSet(patch.getOp(), systemPermissionPatch, permission); + + } + + // Otherwise, the path is not supported + else + throw new GuacamoleClientException("Unsupported patch path: \"" + path + "\""); + + } // end for each patch operation + + // Save the permission changes + connectionPermissionPatch.apply(permissions.getConnectionPermissions()); + connectionGroupPermissionPatch.apply(permissions.getConnectionGroupPermissions()); + sharingProfilePermissionPatch.apply(permissions.getSharingProfilePermissions()); + activeConnectionPermissionPatch.apply(permissions.getActiveConnectionPermissions()); + userPermissionPatch.apply(permissions.getUserPermissions()); + userGroupPermissionPatch.apply(permissions.getUserGroupPermissions()); + systemPermissionPatch.apply(permissions.getSystemPermissions()); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/permission/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/permission/package-info.java new file mode 100644 index 0000000..1c1ec59 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/permission/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the permission manipulation aspect of the Guacamole REST API. + */ +package org.apache.guacamole.rest.permission; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/schema/SchemaResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/schema/SchemaResource.java new file mode 100644 index 0000000..a7ed08d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/schema/SchemaResource.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.schema; + +import java.util.Collection; +import java.util.Map; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.environment.LocalEnvironment; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.protocols.ProtocolInfo; + +/** + * A REST resource which provides access to descriptions of the properties, + * attributes, etc. of objects within a particular UserContext. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SchemaResource { + + /** + * The UserContext whose schema is exposed by this SchemaResource. + */ + private final UserContext userContext; + + /** + * Creates a new SchemaResource which exposes meta information describing + * the kind of data within the given UserContext. + * + * @param userContext + * The UserContext whose schema should be exposed by this + * SchemaResource. + */ + public SchemaResource(UserContext userContext) { + this.userContext = userContext; + } + + /** + * Retrieves the possible attributes of a user object. + * + * @return + * A collection of forms which describe the possible attributes of a + * user object. + * + * @throws GuacamoleException + * If an error occurs while retrieving the possible attributes. + */ + @GET + @Path("userAttributes") + public Collection getUserAttributes() throws GuacamoleException { + + // Retrieve all possible user attributes + return userContext.getUserAttributes(); + + } + + /** + * Retrieves the possible user preference attributes of a user object. + * + * @return + * A collection of forms which describe the possible preference attributes of a + * user object. + * + * @throws GuacamoleException + * If an error occurs while retrieving the possible attributes. + */ + @GET + @Path("userPreferenceAttributes") + public Collection getUserPreferenceAttributes() + throws GuacamoleException { + + // Retrieve all possible user preference attributes + return userContext.getUserPreferenceAttributes(); + + } + + /** + * Retrieves the possible attributes of a user group object. + * + * @return + * A collection of forms which describe the possible attributes of a + * user group object. + * + * @throws GuacamoleException + * If an error occurs while retrieving the possible attributes. + */ + @GET + @Path("userGroupAttributes") + public Collection getUserGroupAttributes() throws GuacamoleException { + + // Retrieve all possible user group attributes + return userContext.getUserGroupAttributes(); + + } + + /** + * Retrieves the possible attributes of a connection object. + * + * @return + * A collection of forms which describe the possible attributes of a + * connection object. + * + * @throws GuacamoleException + * If an error occurs while retrieving the possible attributes. + */ + @GET + @Path("connectionAttributes") + public Collection getConnectionAttributes() + throws GuacamoleException { + + // Retrieve all possible connection attributes + return userContext.getConnectionAttributes(); + + } + + /** + * Retrieves the possible attributes of a sharing profile object. + * + * @return + * A collection of forms which describe the possible attributes of a + * sharing profile object. + * + * @throws GuacamoleException + * If an error occurs while retrieving the possible attributes. + */ + @GET + @Path("sharingProfileAttributes") + public Collection getSharingProfileAttributes() + throws GuacamoleException { + + // Retrieve all possible sharing profile attributes + return userContext.getSharingProfileAttributes(); + + } + + /** + * Retrieves the possible attributes of a connection group object. + * + * @return + * A collection of forms which describe the possible attributes of a + * connection group object. + * + * @throws GuacamoleException + * If an error occurs while retrieving the possible attributes. + */ + @GET + @Path("connectionGroupAttributes") + public Collection getConnectionGroupAttributes() + throws GuacamoleException { + + // Retrieve all possible connection group attributes + return userContext.getConnectionGroupAttributes(); + + } + + /** + * Gets a map of protocols defined in the system - protocol name to protocol. + * + * @return + * A map of protocol information, where each key is the unique name + * associated with that protocol. + * + * @throws GuacamoleException + * If an error occurs while retrieving the available protocols. + */ + @GET + @Path("protocols") + public Map getProtocols() throws GuacamoleException { + + // Get and return a map of all protocols. + Environment env = LocalEnvironment.getInstance(); + return env.getProtocols(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/schema/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/schema/package-info.java new file mode 100644 index 0000000..cc0e40b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/schema/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the self-description of the Guacamole REST API, such as + * the attributes or parameters applicable to specific objects. + */ +package org.apache.guacamole.rest.schema; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionRESTService.java b/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionRESTService.java new file mode 100644 index 0000000..90974d1 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionRESTService.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.session; + +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.rest.TokenParam; +import org.apache.guacamole.rest.auth.AuthenticationService; + +/** + * A REST service which exposes all data associated with Guacamole users' + * sessions. + */ +@Path("/session") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SessionRESTService { + + /** + * A service for authenticating users from auth tokens. + */ + @Inject + private AuthenticationService authenticationService; + + /** + * Factory for creating SessionResources which expose a given + * GuacamoleSession. + */ + @Inject + private SessionResourceFactory sessionResourceFactory; + + /** + * Retrieves a resource representing the GuacamoleSession associated with + * the given authentication token. + * + * @param authToken + * The authentication token that is used to authenticate the user + * having the session being exposed. + * + * @return + * A resource representing the GuacamoleSession associated with the + * given authentication token. + * + * @throws GuacamoleException + * If the authentication token is invalid. + */ + @Path("/") + public SessionResource getSessionResource(@TokenParam String authToken) + throws GuacamoleException { + + // Return a resource exposing the retrieved session + GuacamoleSession session = authenticationService.getGuacamoleSession(authToken); + return sessionResourceFactory.create(authToken, session); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionResource.java new file mode 100644 index 0000000..adf8ed6 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionResource.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.session; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.HEAD; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.auth.AuthenticationService; +import org.apache.guacamole.rest.tunnel.TunnelCollectionResource; +import org.apache.guacamole.rest.tunnel.TunnelCollectionResourceFactory; + +/** + * A REST resource which exposes all data associated with a Guacamole user's + * session via the underlying UserContexts. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SessionResource { + + /** + * The GuacamoleSession being exposed by this SessionResource. + */ + private final GuacamoleSession session; + + /** + * The authentication token associated with the GuacamoleSession being + * exposed by this SessionResource. + */ + private final String token; + + /** + * Service for authenticating users and managing their Guacamole sessions. + */ + @Inject + private AuthenticationService authenticationService; + + /** + * Factory for creating UserContextResources which expose a given + * UserContext. + */ + @Inject + private UserContextResourceFactory userContextResourceFactory; + + /** + * Factory for creating instances of resources which represent the + * collection of tunnels within a GuacamoleSession. + */ + @Inject + private TunnelCollectionResourceFactory tunnelCollectionResourceFactory; + + /** + * Creates a new SessionResource which exposes the data within the given + * GuacamoleSession. + * + * @param token + * The authentication token associated with the given session. + * + * @param session + * The GuacamoleSession which should be exposed through this + * SessionResource. + */ + @AssistedInject + public SessionResource(@Assisted String token, @Assisted GuacamoleSession session) { + this.token = token; + this.session = session; + } + + /** + * Retrieves a resource representing the UserContext associated with the + * AuthenticationProvider having the given identifier. + * + * @param authProviderIdentifier + * The unique identifier of the AuthenticationProvider associated with + * the UserContext being retrieved. + * + * @return + * A resource representing the UserContext associated with the + * AuthenticationProvider having the given identifier. + * + * @throws GuacamoleException + * If the AuthenticationProvider identifier is invalid. + */ + @Path("data/{dataSource}") + public UserContextResource getUserContextResource( + @PathParam("dataSource") String authProviderIdentifier) + throws GuacamoleException { + + // Pull UserContext defined by the given auth provider identifier + UserContext userContext = session.getUserContext(authProviderIdentifier); + + // Return a resource exposing the retrieved UserContext + return userContextResourceFactory.create(session.getAuthenticatedUser(), userContext); + + } + + /** + * Returns the arbitrary REST resource exposed by the UserContext + * associated with the AuthenticationProvider having the given identifier. + * + * @param authProviderIdentifier + * The unique identifier of the AuthenticationProvider associated with + * the UserContext whose arbitrary REST service is being retrieved. + * + * @return + * The arbitrary REST resource exposed by the UserContext exposed by + * this UserContextresource. + * + * @throws GuacamoleException + * If no such resource could be found, or if an error occurs while + * retrieving that resource. + */ + @Path("ext/{dataSource}") + public Object getExtensionResource( + @PathParam("dataSource") String authProviderIdentifier) + throws GuacamoleException { + + // Pull UserContext defined by the given auth provider identifier + UserContext userContext = session.getUserContext(authProviderIdentifier); + + // Pull resource from user context + Object resource = userContext.getResource(); + if (resource != null) + return resource; + + // UserContext-specific resource could not be found + throw new GuacamoleResourceNotFoundException("No such resource."); + + } + + /** + * Retrieves a resource representing all tunnels associated with session + * exposed by this SessionResource. + * + * @return + * A resource representing all tunnels associated with the + * AuthenticationProvider having the given identifier. + */ + @Path("tunnels") + public TunnelCollectionResource getTunnelCollectionResource() { + return tunnelCollectionResourceFactory.create(session); + } + + /** + * Invalidates the GuacamoleSession exposed by this SessionResource, + * including the associated authentication token. + * + * @throws GuacamoleException + * If the authentication token originally provided when this + * SessionResource was created no longer exists. + */ + @DELETE + public void invalidate() throws GuacamoleException { + + // Invalidate session, if it exists + if (!authenticationService.destroyGuacamoleSession(token)) + throw new GuacamoleResourceNotFoundException("No such token."); + + } + + /** + * Tests whether this session resource represented a valid session at the + * time it was created. This function always succeeds. It is possible for + * an HTTP request aimed at this operation to fail, but that failure occurs + * further up the chain when locating the session. + */ + @HEAD + public void checkValidity() { + // Do nothing + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionResourceFactory.java b/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionResourceFactory.java new file mode 100644 index 0000000..462eebe --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/session/SessionResourceFactory.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.session; + +import org.apache.guacamole.GuacamoleSession; + +/** + * Factory which creates resources that expose the contents of a given + * GuacamoleSession. + */ +public interface SessionResourceFactory { + + /** + * Creates a new SessionResource which exposes the contents of the + * given GuacamoleSession. + * + * @param token + * The authentication token associated with the given session. + * + * @param session + * The GuacamoleSession whose contents should be exposed. + * + * @return + * A new SessionResource which exposes the contents of the given + * GuacamoleSession. + */ + SessionResource create(String token, GuacamoleSession session); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java new file mode 100644 index 0000000..b696259 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java @@ -0,0 +1,294 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.session; + +import org.apache.guacamole.rest.directory.DirectoryResource; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.rest.activeconnection.APIActiveConnection; +import org.apache.guacamole.rest.connection.APIConnection; +import org.apache.guacamole.rest.connectiongroup.APIConnectionGroup; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.history.HistoryResource; +import org.apache.guacamole.rest.schema.SchemaResource; +import org.apache.guacamole.rest.sharingprofile.APISharingProfile; +import org.apache.guacamole.rest.user.APIUser; +import org.apache.guacamole.rest.usergroup.APIUserGroup; + +/** + * A REST resource which exposes the contents of a particular UserContext. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class UserContextResource { + + /** + * The UserContext being exposed through this resource. + */ + private final UserContext userContext; + + /** + * The user that is accessing this resource. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * Factory for creating DirectoryObjectResources which expose a given User. + */ + @Inject + private DirectoryObjectResourceFactory userResourceFactory; + + /** + * Factory for creating DirectoryResources which expose a given + * ActiveConnection Directory. + */ + @Inject + private DirectoryResourceFactory + activeConnectionDirectoryResourceFactory; + + /** + * Factory for creating DirectoryResources which expose a given + * Connection Directory. + */ + @Inject + private DirectoryResourceFactory + connectionDirectoryResourceFactory; + + /** + * Factory for creating DirectoryResources which expose a given + * ConnectionGroup Directory. + */ + @Inject + private DirectoryResourceFactory + connectionGroupDirectoryResourceFactory; + + /** + * Factory for creating DirectoryResources which expose a given + * SharingProfile Directory. + */ + @Inject + private DirectoryResourceFactory + sharingProfileDirectoryResourceFactory; + + /** + * Factory for creating DirectoryResources which expose a given + * User Directory. + */ + @Inject + private DirectoryResourceFactory userDirectoryResourceFactory; + + /** + * Factory for creating DirectoryResources which expose a given + * UserGroup Directory. + */ + @Inject + private DirectoryResourceFactory userGroupDirectoryResourceFactory; + + /** + * Creates a new UserContextResource which exposes the data within the + * given UserContext. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext which should be exposed through this + * UserContextResource. + */ + @AssistedInject + public UserContextResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext) { + this.authenticatedUser = authenticatedUser; + this.userContext = userContext; + } + + /** + * Returns a new resource which represents the User whose access rights + * control the operations of the UserContext exposed by this + * UserContextResource. + * + * @return + * A new resource which represents the User whose access rights + * control the operations of the UserContext exposed by this + * UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the User. + */ + @Path("self") + public DirectoryObjectResource getSelfResource() + throws GuacamoleException { + return userResourceFactory.create(authenticatedUser, userContext, + userContext.getUserDirectory(), userContext.self()); + } + + /** + * Returns a new resource which represents the ActiveConnection Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the ActiveConnection Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the ActiveConnection Directory. + */ + @Path("activeConnections") + public DirectoryResource + getActiveConnectionDirectoryResource() throws GuacamoleException { + return activeConnectionDirectoryResourceFactory.create(authenticatedUser, + userContext, userContext.getActiveConnectionDirectory()); + } + + /** + * Returns a new resource which represents the Connection Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the Connection Directory contained + * within the UserContext exposed by this UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the Connection Directory. + */ + @Path("connections") + public DirectoryResource getConnectionDirectoryResource() + throws GuacamoleException { + return connectionDirectoryResourceFactory.create(authenticatedUser, + userContext, userContext.getConnectionDirectory()); + } + + /** + * Returns a new resource which represents the ConnectionGroup Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the ConnectionGroup Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the ConnectionGroup Directory. + */ + @Path("connectionGroups") + public DirectoryResource getConnectionGroupDirectoryResource() + throws GuacamoleException { + return connectionGroupDirectoryResourceFactory.create(authenticatedUser, + userContext, userContext.getConnectionGroupDirectory()); + } + + /** + * Returns a new resource which represents the SharingProfile Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the SharingProfile Directory + * contained within the UserContext exposed by this UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the SharingProfile Directory. + */ + @Path("sharingProfiles") + public DirectoryResource + getSharingProfileDirectoryResource() throws GuacamoleException { + return sharingProfileDirectoryResourceFactory.create(authenticatedUser, + userContext, userContext.getSharingProfileDirectory()); + } + + /** + * Returns a new resource which represents the User Directory contained + * within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the User Directory contained within + * the UserContext exposed by this UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the User Directory. + */ + @Path("users") + public DirectoryResource getUserDirectoryResource() + throws GuacamoleException { + return userDirectoryResourceFactory.create(authenticatedUser, + userContext, userContext.getUserDirectory()); + } + + /** + * Returns a new resource which represents the UserGroup Directory contained + * within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the UserGroup Directory contained + * within the UserContext exposed by this UserContextResource. + * + * @throws GuacamoleException + * If an error occurs while retrieving the UserGroup Directory. + */ + @Path("userGroups") + public DirectoryResource getUserGroupDirectoryResource() + throws GuacamoleException { + return userGroupDirectoryResourceFactory.create(authenticatedUser, + userContext, userContext.getUserGroupDirectory()); + } + + /** + * Returns a new resource which represents historical data contained + * within the UserContext exposed by this UserContextResource. + * + * @return + * A new resource which represents the historical data contained within + * the UserContext exposed by this UserContextResource. + */ + @Path("history") + public HistoryResource getHistoryResource() { + return new HistoryResource(userContext); + } + + /** + * Returns a new resource which represents meta information describing the + * kind of data which within the UserContext exposed by this + * UserContextResource. + * + * @return + * A new resource which represents the meta information describing the + * kind of data within the UserContext exposed by this + * UserContextResource. + */ + @Path("schema") + public SchemaResource getSchemaResource() { + return new SchemaResource(userContext); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResourceFactory.java b/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResourceFactory.java new file mode 100644 index 0000000..c969a63 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResourceFactory.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.session; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Factory which creates resources that expose the contents of a given + * UserContext. + */ +public interface UserContextResourceFactory { + + /** + * Creates a new UserContextResource which exposes the contents of the + * given UserContext. + * + * @param authenticatedUser + * The user that is accessing the resource. + * + * @param userContext + * The UserContext whose contents should be exposed. + * + * @return + * A new UserContextResource which exposes the contents of the given + * UserContext. + */ + UserContextResource create(AuthenticatedUser authenticatedUser, + UserContext userContext); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/session/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/session/package-info.java new file mode 100644 index 0000000..118ee2e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/session/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which expose the absolute root of the data available to a Guacamole + * user's session. + */ +package org.apache.guacamole.rest.session; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/APISharingProfile.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/APISharingProfile.java new file mode 100644 index 0000000..04c61af --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/APISharingProfile.java @@ -0,0 +1,208 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.sharingprofile; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Map; +import org.apache.guacamole.net.auth.SharingProfile; + +/** + * The external representation used by the REST API for sharing profiles. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value=Include.NON_NULL) +public class APISharingProfile { + + /** + * The human-readable name of this sharing profile. + */ + private String name; + + /** + * The unique string which identifies this sharing profile within its + * containing directory. + */ + private String identifier; + + /** + * The identifier of the primary connection that this sharing profile + * can be used to share. + */ + private String primaryConnectionIdentifier; + + /** + * Map of all associated connection parameter values which apply when the + * sharing profile is used, indexed by parameter name. + */ + private Map parameters; + + /** + * Map of all associated attributes by attribute identifier. + */ + private Map attributes; + + /** + * Creates an empty, uninitialized APISharingProfile. The properties of the + * created APISharingProfile will need to be set individually as necessary + * via their corresponding setters. + */ + public APISharingProfile() {} + + /** + * Creates a new APISharingProfile with its data populated from that of an + * existing SharingProfile. As the connection parameters of the + * SharingProfile are potentially sensitive, they will not be included in + * the new APISharingProfile. + * + * @param sharingProfile + * The sharing profile to use to populate the data of the new + * APISharingProfile. + */ + public APISharingProfile(SharingProfile sharingProfile) { + + // Set main information + this.name = sharingProfile.getName(); + this.identifier = sharingProfile.getIdentifier(); + this.primaryConnectionIdentifier = sharingProfile.getPrimaryConnectionIdentifier(); + + // Associate any attributes + this.attributes = sharingProfile.getAttributes(); + + } + + /** + * Returns the human-readable name of this sharing profile. + * + * @return + * The human-readable name of this sharing profile. + */ + public String getName() { + return name; + } + + /** + * Set the human-readable name of this sharing profile. + * + * @param name + * The human-readable name of this sharing profile. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the unique string which identifies this sharing profile within + * its containing directory. + * + * @return + * The unique string which identifies this sharing profile within its + * containing directory. + */ + public String getIdentifier() { + return identifier; + } + + /** + * Sets the unique string which identifies this sharing profile within + * its containing directory. + * + * @param identifier + * The unique string which identifies this sharing profile within its + * containing directory. + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + /** + * Returns the identifier of the primary connection that this sharing + * profile can be used to share. + * + * @return + * The identifier of the primary connection that this sharing profile + * can be used to share. + */ + public String getPrimaryConnectionIdentifier() { + return primaryConnectionIdentifier; + } + + /** + * Sets the identifier of the primary connection that this sharing profile + * can be used to share. + * + * @param primaryConnectionIdentifier + * The identifier of the primary connection that this sharing profile + * can be used to share. + */ + public void setPrimaryConnectionIdentifier(String primaryConnectionIdentifier) { + this.primaryConnectionIdentifier = primaryConnectionIdentifier; + } + + /** + * Returns a map of all associated connection parameter values which apply + * when the sharing profile is used, indexed by parameter name. + * + * @return + * A map of all associated connection parameter values which apply when + * the sharing profile is used, indexed by parameter name. + */ + public Map getParameters() { + return parameters; + } + + /** + * Sets the map of all associated connection parameter values which apply + * when the sharing profile is used, indexed by parameter name. + * + * @param parameters + * The map of all associated connection parameter values which apply + * when the sharing profile is used, indexed by parameter name. + */ + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + /** + * Returns a map of all attributes associated with this sharing profile. + * Each entry key is the attribute identifier, while each value is the + * attribute value itself. + * + * @return + * The attribute map for this sharing profile. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Sets the map of all attributes associated with this sharing profile. Each + * entry key is the attribute identifier, while each value is the attribute + * value itself. + * + * @param attributes + * The attribute map for this sharing profile. + */ + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/APISharingProfileWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/APISharingProfileWrapper.java new file mode 100644 index 0000000..8bca157 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/APISharingProfileWrapper.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.sharingprofile; + +import java.util.Map; +import org.apache.guacamole.net.auth.SharingProfile; + +/** + * Wrapper for APISharingProfile which provides a SharingProfile interface. + * Changes to the underlying APISharingProfile are reflected immediately in the + * values exposed by the SharingProfile interface, and changes made through the + * SharingProfile interface immediately affect the underlying APISharingProfile. + */ +public class APISharingProfileWrapper implements SharingProfile { + + /** + * The wrapped APISharingProfile. + */ + private final APISharingProfile apiSharingProfile; + + /** + * Creates a new APISharingProfileWrapper which is backed by the given + * APISharingProfile. + * + * @param apiSharingProfile + * The APISharingProfile to wrap. + */ + public APISharingProfileWrapper(APISharingProfile apiSharingProfile) { + this.apiSharingProfile = apiSharingProfile; + } + + @Override + public String getName() { + return apiSharingProfile.getName(); + } + + @Override + public void setName(String name) { + apiSharingProfile.setName(name); + } + + @Override + public String getIdentifier() { + return apiSharingProfile.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + apiSharingProfile.setIdentifier(identifier); + } + + @Override + public String getPrimaryConnectionIdentifier() { + return apiSharingProfile.getPrimaryConnectionIdentifier(); + } + + @Override + public void setPrimaryConnectionIdentifier(String primaryConnectionIdentifier) { + apiSharingProfile.setPrimaryConnectionIdentifier(primaryConnectionIdentifier); + } + + @Override + public Map getParameters() { + return apiSharingProfile.getParameters(); + } + + @Override + public void setParameters(Map parameters) { + apiSharingProfile.setParameters(parameters); + } + + @Override + public Map getAttributes() { + return apiSharingProfile.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + apiSharingProfile.setAttributes(attributes); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileDirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileDirectoryResource.java new file mode 100644 index 0000000..16ae295 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileDirectoryResource.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.sharingprofile; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * A REST resource which abstracts the operations available on a Directory of + * SharingProfiles. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SharingProfileDirectoryResource + extends DirectoryResource { + + /** + * Creates a new SharingProfileDirectoryResource which exposes the + * operations and subresources available for the given SharingProfile + * Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory being exposed. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * SharingProfiles. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing SharingProfiles. + */ + @AssistedInject + public SharingProfileDirectoryResource( + @Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + super(authenticatedUser, userContext, SharingProfile.class, directory, translator, resourceFactory); + } + + @Override + protected ObjectPermissionSet getObjectPermissions(Permissions permissions) + throws GuacamoleException { + return permissions.getSharingProfilePermissions(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileModule.java new file mode 100644 index 0000000..6822593 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileModule.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.sharingprofile; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import com.google.inject.TypeLiteral; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; + +/** + * Guice Module which configures injections required for handling SharingProfile + * resources via the REST API. + */ +public class SharingProfileModule extends AbstractModule { + + @Override + protected void configure() { + + // Create the required DirectoryResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + SharingProfileDirectoryResource.class + ) + .build(new TypeLiteral>() {})); + + // Create the required DirectoryObjectResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + SharingProfileResource.class + ) + .build(new TypeLiteral>() {})); + + // Bind translator for converting between SharingProfile and APISharingProfile + bind(new TypeLiteral>() {}) + .to(SharingProfileObjectTranslator.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileObjectTranslator.java new file mode 100644 index 0000000..601f219 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileObjectTranslator.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.sharingprofile; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * Translator which converts between SharingProfile objects and + * APISharingProfile objects. + */ +public class SharingProfileObjectTranslator + extends DirectoryObjectTranslator { + + @Override + public APISharingProfile toExternalObject(SharingProfile object) + throws GuacamoleException { + return new APISharingProfile(object); + } + + @Override + public SharingProfile toInternalObject(APISharingProfile object) { + return new APISharingProfileWrapper(object); + } + + @Override + public void applyExternalChanges(SharingProfile existingObject, + APISharingProfile object) { + + // Update the sharing profile + existingObject.setPrimaryConnectionIdentifier(object.getPrimaryConnectionIdentifier()); + existingObject.setName(object.getName()); + existingObject.setParameters(object.getParameters()); + existingObject.setAttributes(object.getAttributes()); + + } + + @Override + public void filterExternalObject(UserContext userContext, + APISharingProfile object) throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes( + userContext.getSharingProfileAttributes(), + object.getAttributes())); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java new file mode 100644 index 0000000..46daac9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.sharingprofile; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import java.util.Map; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.SharingProfile; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermission; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermission; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * A REST resource which abstracts the operations available on an existing + * SharingProfile. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SharingProfileResource + extends DirectoryObjectResource { + + /** + * Creates a new SharingProfileResource which exposes the operations and + * subresources available for the given SharingProfile. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory which contains the given SharingProfile. + * + * @param sharingProfile + * The SharingProfile that this SharingProfileResource should represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles the type of + * object given. + */ + @AssistedInject + public SharingProfileResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + @Assisted SharingProfile sharingProfile, + DirectoryObjectTranslator translator) { + super(authenticatedUser, userContext, SharingProfile.class, directory, sharingProfile, translator); + } + + /** + * Retrieves the connection parameters associated with the SharingProfile + * exposed by this SharingProfile resource. + * + * @return + * A map of parameter name/value pairs. + * + * @throws GuacamoleException + * If an error occurs while retrieving the connection parameters of the + * SharingProfile. + */ + @GET + @Path("parameters") + public Map getParameters() + throws GuacamoleException { + + SharingProfile sharingProfile = getInternalObject(); + + // Pull effective permissions + Permissions effective = getUserContext().self().getEffectivePermissions(); + + // Retrieve permission sets + SystemPermissionSet systemPermissions = effective.getSystemPermissions(); + ObjectPermissionSet sharingProfilePermissions = effective.getSharingProfilePermissions(); + + // Deny access if adminstrative or update permission is missing + String identifier = sharingProfile.getIdentifier(); + if (!systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER) + && !sharingProfilePermissions.hasPermission(ObjectPermission.Type.UPDATE, identifier)) + throw new GuacamoleSecurityException("Permission to read sharing profile parameters denied."); + + // Return parameter map + return sharingProfile.getParameters(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/package-info.java new file mode 100644 index 0000000..53a76f7 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to retrieving or manipulating sharing profiles using the + * Guacamole REST API. + */ +package org.apache.guacamole.rest.sharingprofile; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java new file mode 100644 index 0000000..c33255e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.tunnel; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.StreamingOutput; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.rest.RequestSizeFilter; +import org.apache.guacamole.tunnel.StreamInterceptingTunnel; + +/** + * A REST resource providing access to a Guacamole protocol-level stream + * within a tunnel. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class StreamResource { + + /** + * The tunnel whose stream is exposed through this StreamResource. + */ + private final StreamInterceptingTunnel tunnel; + + /** + * The index of the stream being exposed. + */ + private final int streamIndex; + + /** + * The media type of the data within the stream being exposed. + */ + private final String mediaType; + + /** + * Creates a new StreamResource which provides access to the given + * stream. + * + * @param tunnel + * The tunnel whose stream is being exposed. + * + * @param streamIndex + * The index of the stream to expose via this StreamResource. + * + * @param mediaType + * The media type of the data within the stream. + */ + public StreamResource(StreamInterceptingTunnel tunnel, int streamIndex, + String mediaType) { + this.tunnel = tunnel; + this.streamIndex = streamIndex; + this.mediaType = mediaType; + } + + /** + * Intercepts and returns the entire contents the stream represented by + * this StreamResource. + * + * @return + * A response through which the entire contents of the intercepted + * stream will be sent. + */ + @GET + public Response getStreamContents() { + + // Intercept all output + StreamingOutput stream = new StreamingOutput() { + + @Override + public void write(OutputStream output) throws IOException { + try { + tunnel.interceptStream(streamIndex, output); + } + catch (GuacamoleException e) { + throw new IOException(e); + } + } + + }; + + // Begin successful response + ResponseBuilder responseBuilder = Response.ok(stream, mediaType); + + // Set Content-Disposition header for "application/octet-stream" + if (mediaType.equals(MediaType.APPLICATION_OCTET_STREAM)) + responseBuilder.header("Content-Disposition", "attachment"); + + return responseBuilder.build(); + + } + + /** + * Intercepts the stream represented by this StreamResource, sending the + * contents of the given InputStream over that stream as "blob" + * instructions. + * + * @param data + * An InputStream containing the data to be sent over the intercepted + * stream. + * + * @throws GuacamoleException + * If the intercepted stream closes with an error. + */ + @POST + @Consumes(MediaType.WILDCARD) + @RequestSizeFilter.DoNotLimit + public void setStreamContents(InputStream data) throws GuacamoleException { + + // Send input over stream + tunnel.interceptStream(streamIndex, data); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelCollectionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelCollectionResource.java new file mode 100644 index 0000000..770469c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelCollectionResource.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.tunnel; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import java.util.Map; +import java.util.Set; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.tunnel.UserTunnel; + +/** + * A REST resource which exposes the active tunnels of a Guacamole session. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class TunnelCollectionResource { + + /** + * The GuacamoleSession containing the tunnels exposed by this resource. + */ + private final GuacamoleSession session; + + /** + * Factory for creating instances of resources which represent tunnels. + */ + @Inject + private TunnelResourceFactory tunnelResourceFactory; + + /** + * Creates a new TunnelCollectionResource which exposes the active tunnels + * of the given GuacamoleSession. + * + * @param session + * The GuacamoleSession whose tunnels should be exposed by this + * resource. + */ + @AssistedInject + public TunnelCollectionResource(@Assisted GuacamoleSession session) { + this.session = session; + } + + /** + * Returns the UUIDs of all tunnels exposed by this + * TunnelCollectionResource. + * + * @return + * A set containing the UUIDs of all tunnels exposed by this + * TunnelCollectionResource. + */ + @GET + public Set getTunnelUUIDs() { + return session.getTunnels().keySet(); + } + + /** + * Retrieves the tunnel having the given UUID, returning a TunnelResource + * representing that tunnel. If no such tunnel exists, an exception will be + * thrown. + * + * @param tunnelUUID + * The UUID of the tunnel to return via a TunnelResource. + * + * @return + * A TunnelResource which represents the tunnel having the given UUID. + * + * @throws GuacamoleException + * If no such tunnel exists. + */ + @Path("{tunnel}") + public TunnelResource getTunnel(@PathParam("tunnel") String tunnelUUID) + throws GuacamoleException { + + Map tunnels = session.getTunnels(); + + // Pull tunnel with given UUID + final UserTunnel tunnel = tunnels.get(tunnelUUID); + if (tunnel == null) + throw new GuacamoleResourceNotFoundException("No such tunnel."); + + // Return corresponding tunnel resource + return tunnelResourceFactory.create(session.getAuthenticatedUser(), tunnel); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelCollectionResourceFactory.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelCollectionResourceFactory.java new file mode 100644 index 0000000..49954bb --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelCollectionResourceFactory.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.tunnel; + +import org.apache.guacamole.GuacamoleSession; + +/** + * Factory which creates resources that expose the collection of tunnels + * contained within a given GuacamoleSession. + */ +public interface TunnelCollectionResourceFactory { + + /** + * Creates a new TunnelCollectionResource which exposes the collection of + * tunnels stored within the given GuacamoleSession. + * + * @param session + * The GuacamoleSession whose collection of tunnels should be exposed. + * + * @return + * A new TunnelCollectionResource which exposes the collection of + * tunnels stored within the given GuacamoleSession. + */ + TunnelCollectionResource create(GuacamoleSession session); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelResource.java new file mode 100644 index 0000000..7107ab2 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelResource.java @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.tunnel; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.environment.Environment; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.protocols.ProtocolInfo; +import org.apache.guacamole.rest.activeconnection.APIActiveConnection; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.tunnel.UserTunnel; + +/** + * A REST resource which abstracts the operations available for an individual + * tunnel. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class TunnelResource { + + /** + * The media type to send as the content type of stream contents if no + * other media type is specified. + */ + private static final String DEFAULT_MEDIA_TYPE = MediaType.APPLICATION_OCTET_STREAM; + + /** + * The user that is accessing this resource. + */ + private final AuthenticatedUser authenticatedUser; + + /** + * The tunnel that this TunnelResource represents. + */ + private final UserTunnel tunnel; + + /** + * The Guacamole server environment. + */ + @Inject + private Environment environment; + + /** + * A factory which can be used to create instances of resources representing + * ActiveConnections. + */ + @Inject + private DirectoryObjectResourceFactory + activeConnectionResourceFactory; + + /** + * Creates a new TunnelResource which exposes the operations and + * subresources available for the given tunnel. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param tunnel + * The tunnel that this TunnelResource should represent. + */ + @AssistedInject + public TunnelResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserTunnel tunnel) { + this.authenticatedUser = authenticatedUser; + this.tunnel = tunnel; + } + + /** + * Retrieves a resource representing the ActiveConnection object associated + * with this tunnel. + * + * @return + * A resource representing the ActiveConnection object associated with + * this tunnel. + * + * @throws GuacamoleException + * If an error occurs while retrieving the ActiveConnection. + */ + @Path("activeConnection") + public DirectoryObjectResource + getActiveConnection() throws GuacamoleException { + + // Pull the UserContext from the tunnel + UserContext userContext = tunnel.getUserContext(); + + // Fail if the active connection cannot be found + ActiveConnection activeConnection = tunnel.getActiveConnection(); + if (activeConnection == null) + throw new GuacamoleResourceNotFoundException("No readable active connection for tunnel."); + + // Return the associated ActiveConnection as a resource + return activeConnectionResourceFactory.create(authenticatedUser, userContext, + userContext.getActiveConnectionDirectory(), activeConnection); + + } + + /** + * Retrieves the underlying protocol used by the connection associated with + * this tunnel. If possible, the parameters available for that protocol are + * retrieved, as well. + * + * @return + * A ProtocolInfo object describing the protocol used by the connection + * associated with this tunnel. + * + * @throws GuacamoleException + * If the protocol used by the connection associated with this tunnel + * cannot be determined. + */ + @GET + @Path("protocol") + public ProtocolInfo getProtocol() throws GuacamoleException { + + // Pull protocol name from underlying socket + String protocol = tunnel.getSocket().getProtocol(); + if (protocol == null) + throw new GuacamoleResourceNotFoundException("Protocol of tunnel is not known/exposed."); + + // If there is no such protocol defined, provide as much info as is + // known (just the name) + ProtocolInfo info = environment.getProtocol(protocol); + if (info == null) + return new ProtocolInfo(protocol); + + // All protocol information for this tunnel is known + return info; + + } + + /** + * Intercepts and returns the entire contents of a specific stream. + * + * @param streamIndex + * The index of the stream to intercept. + * + * @param mediaType + * The media type (mimetype) of the data within the stream. + * + * @param filename + * The filename to use for the sake of identifying the data returned. + * + * @return + * A response through which the entire contents of the intercepted + * stream will be sent. + * + * @throws GuacamoleException + * If the session associated with the given auth token cannot be + * retrieved, or if no such tunnel exists. + */ + @Path("streams/{index}/{filename}") + public StreamResource getStream(@PathParam("index") final int streamIndex, + @QueryParam("type") @DefaultValue(DEFAULT_MEDIA_TYPE) String mediaType, + @PathParam("filename") String filename) + throws GuacamoleException { + + return new StreamResource(tunnel, streamIndex, mediaType); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelResourceFactory.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelResourceFactory.java new file mode 100644 index 0000000..9efdf9c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/TunnelResourceFactory.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.tunnel; + +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.tunnel.UserTunnel; + +/** + * Factory which creates resources that expose the contents of a given + * tunnel. + */ +public interface TunnelResourceFactory { + + /** + * Creates a new TunnelResource which exposes the contents of the + * given tunnel. + * + * @param authenticatedUser + * The user that is accessing the resource. + * + * @param tunnel + * The tunnel whose contents should be exposed. + * + * @return + * A new TunnelResource which exposes the contents of the given tunnel. + */ + TunnelResource create(AuthenticatedUser authenticatedUser, UserTunnel tunnel); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/package-info.java new file mode 100644 index 0000000..d4f07a7 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the manipulation of Guacamole tunnels and underlying + * streams. + */ +package org.apache.guacamole.rest.tunnel; diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java new file mode 100644 index 0000000..06f1de1 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.user; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.net.auth.User; + +/** + * A simple User to expose through the REST endpoints. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value=Include.NON_NULL) +public class APIUser { + + /** + * The username of this user. + */ + private String username; + + /** + * The password of this user. + */ + private String password; + + /** + * Boolean value indicating whether or not this user account is disabled. + */ + private boolean disabled; + + /** + * Map of all associated attributes by attribute identifier. + */ + private Map attributes; + + /** + * The date and time that this user was last logged in, or null if this user + * has never logged in or this information is unavailable. + */ + private Date lastActive; + + /** + * Construct a new empty APIUser. + */ + public APIUser() {} + + /** + * Construct a new APIUser from the provided User. + * + * @param user + * The User to construct the APIUser from. + */ + public APIUser(User user) { + + // Set user information + this.username = user.getIdentifier(); + this.password = user.getPassword(); + this.lastActive = user.getLastActive(); + this.disabled = user.isDisabled(); + + // Associate any attributes + this.attributes = user.getAttributes(); + + } + + /** + * Returns the username for this user. + * + * @return + * The username for this user. + */ + public String getUsername() { + return username; + } + + /** + * Set the username for this user. + * + * @param username + * The username for this user. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Returns the password for this user. + * + * @return + * The password for this user. + */ + public String getPassword() { + return password; + } + + /** + * Set the password for this user. + * + * @param password + * The password for this user. + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * Returns true if this user account is disabled, otherwise false. + * + * @return + * True if this user account is disabled, otherwise false. + */ + public boolean isDisabled() { + return disabled; + } + + /** + * Sets the disabled status of this user account, disabling the account + * if set to true. + * + * @param disabled + * True if this user account should be disabled. + */ + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + /** + * Returns a map of all attributes associated with this user. Each entry + * key is the attribute identifier, while each value is the attribute + * value itself. + * + * @return + * The attribute map for this user. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Sets the map of all attributes associated with this user. Each entry key + * is the attribute identifier, while each value is the attribute value + * itself. + * + * @param attributes + * The attribute map for this user. + */ + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + /** + * Returns the date and time that this user was last logged in, or null if + * this user has never logged in or this information is unavailable. + * + * @return + * The date and time that this user was last logged in, or null if this + * user has never logged in or this information is unavailable. + */ + public Date getLastActive() { + return lastActive; + } + + /** + * Sets the date and time that this user was last logged in. + * + * @param lastActive + * The date and time that this user was last logged in, or null if this + * user has never logged in or this information is unavailable. + */ + public void setLastActive(Date lastActive) { + this.lastActive = lastActive; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserPasswordUpdate.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserPasswordUpdate.java new file mode 100644 index 0000000..d888823 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserPasswordUpdate.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.guacamole.rest.user; + +/** + * All the information necessary for the password update operation on a user. + */ +public class APIUserPasswordUpdate { + + /** + * The old (current) password of this user. + */ + private String oldPassword; + + /** + * The new password of this user. + */ + private String newPassword; + + /** + * Returns the old password for this user. This password must match the + * user's current password for the password update operation to succeed. + * + * @return + * The old password for this user. + */ + public String getOldPassword() { + return oldPassword; + } + + /** + * Set the old password for this user. This password must match the + * user's current password for the password update operation to succeed. + * + * @param oldPassword + * The old password for this user. + */ + public void setOldPassword(String oldPassword) { + this.oldPassword = oldPassword; + } + + /** + * Returns the new password that will be assigned to this user. + * + * @return + * The new password for this user. + */ + public String getNewPassword() { + return newPassword; + } + + /** + * Set the new password that will be assigned to this user. + * + * @param newPassword + * The new password for this user. + */ + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java new file mode 100644 index 0000000..f48a9cf --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java @@ -0,0 +1,149 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.user; + +import java.util.Date; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.RelatedObjectSet; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * A wrapper to make an APIUser look like a User. Useful where an + * org.apache.guacamole.net.auth.User is required. As a simple wrapper for + * APIUser, access to permissions is not provided. Any attempt to access or + * manipulate permissions on an APIUserWrapper will result in an exception. + */ +public class APIUserWrapper implements User { + + /** + * The wrapped APIUser. + */ + private final APIUser apiUser; + + /** + * Wrap a given APIUser to expose as a User. + * @param apiUser The APIUser to wrap. + */ + public APIUserWrapper(APIUser apiUser) { + this.apiUser = apiUser; + } + + @Override + public String getIdentifier() { + return apiUser.getUsername(); + } + + @Override + public void setIdentifier(String username) { + apiUser.setUsername(username); + } + + @Override + public String getPassword() { + return apiUser.getPassword(); + } + + @Override + public void setPassword(String password) { + apiUser.setPassword(password); + } + + @Override + public boolean isDisabled() { + return apiUser.isDisabled(); + } + + @Override + public void setDisabled(boolean disabled) { + apiUser.setDisabled(disabled); + } + + @Override + public Map getAttributes() { + return apiUser.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + apiUser.setAttributes(attributes); + } + + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public Permissions getEffectivePermissions() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserWrapper does not provide group access."); + } + + @Override + public Date getLastActive() { + return null; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserDirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserDirectoryResource.java new file mode 100644 index 0000000..0918ca8 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserDirectoryResource.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.user; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * A REST resource which abstracts the operations available on a Directory of + * Users. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class UserDirectoryResource extends DirectoryResource { + + /** + * Creates a new UserDirectoryResource which exposes the operations and + * subresources available for the given User Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory being exposed. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * Users. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing Users. + */ + @AssistedInject + public UserDirectoryResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + super(authenticatedUser, userContext, User.class, directory, translator, resourceFactory); + } + + @Override + protected ObjectPermissionSet getObjectPermissions(Permissions permissions) + throws GuacamoleException { + return permissions.getUserPermissions(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserModule.java new file mode 100644 index 0000000..35af01c --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserModule.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.user; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import com.google.inject.TypeLiteral; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * Guice Module which configures injections required for handling User resources + * via the REST API. + */ +public class UserModule extends AbstractModule { + + @Override + protected void configure() { + + // Create the required DirectoryResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + UserDirectoryResource.class + ) + .build(new TypeLiteral>() {})); + + // Create the required DirectoryObjectResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + UserResource.class + ) + .build(new TypeLiteral>() {})); + + // Bind translator for converting between User and APIUser + bind(new TypeLiteral>() {}) + .to(UserObjectTranslator.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java new file mode 100644 index 0000000..f1a595b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.user; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * Translator which converts between User objects and APIUser objects. + */ +public class UserObjectTranslator + extends DirectoryObjectTranslator { + + @Override + public APIUser toExternalObject(User object) + throws GuacamoleException { + return new APIUser(object); + } + + @Override + public User toInternalObject(APIUser object) + throws GuacamoleException { + return new APIUserWrapper(object); + } + + @Override + public void applyExternalChanges(User existingObject, + APIUser object) throws GuacamoleException { + + // Do not update the user password if no password was provided + if (object.getPassword() != null) + existingObject.setPassword(object.getPassword()); + + // Update disabled status + existingObject.setDisabled(object.isDisabled()); + + // Update user attributes + existingObject.setAttributes(object.getAttributes()); + + } + + @Override + public void filterExternalObject(UserContext userContext, APIUser object) + throws GuacamoleException { + + // If a user is editing themselves ... + if (object.getUsername().equals(userContext.self().getIdentifier())) { + + // ... they may only edit preference attributes + object.setAttributes(filterAttributes(userContext.getUserPreferenceAttributes(), + object.getAttributes())); + + } + + else { + + // In all other cases, filter object attributes by defined schema + object.setAttributes(filterAttributes(userContext.getUserAttributes(), + object.getAttributes())); + + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java new file mode 100644 index 0000000..91600f7 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java @@ -0,0 +1,254 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.user; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleSecurityException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.credentials.GuacamoleCredentialsException; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; +import org.apache.guacamole.net.event.DirectoryEvent; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.history.UserHistoryResource; +import org.apache.guacamole.rest.identifier.RelatedObjectSetResource; +import org.apache.guacamole.rest.permission.APIPermissionSet; +import org.apache.guacamole.rest.permission.PermissionSetResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A REST resource which abstracts the operations available on an existing + * User. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class UserResource + extends DirectoryObjectResource { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(UserResource.class); + + /** + * Creates a new UserResource which exposes the operations and subresources + * available for the given User. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory which contains the given User. + * + * @param user + * The User that this UserResource should represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles Users. + */ + @AssistedInject + public UserResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + @Assisted User user, + DirectoryObjectTranslator translator) { + super(authenticatedUser, userContext, User.class, directory, user, translator); + } + + /** + * Retrieves the login (session) history of a single user. + * + * @return + * A list of activity records, describing the start and end times of + * this user's sessions. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user history. + */ + @SuppressWarnings("deprecation") + @Path("history") + public UserHistoryResource getUserHistory() + throws GuacamoleException { + + User user = getInternalObject(); + + // First try to retrieve history using the current getUserHistory() method. + try { + return new UserHistoryResource(user.getUserHistory()); + } + catch (GuacamoleUnsupportedException e) { + logger.debug("Call to getUserHistory() is unsupported, falling back to deprecated method getHistory().", e); + } + + // Fall back to deprecated getHistory() method. + try { + return new UserHistoryResource(new SimpleActivityRecordSet<>(user.getHistory())); + } + catch (GuacamoleUnsupportedException e) { + logger.debug("Call to getHistory() is unsupported, no user history records will be returned.", e); + } + + // If both are unimplemented, return an empty history set. + return new UserHistoryResource(new SimpleActivityRecordSet<>()); + + } + + @Override + public void updateObject(APIUser modifiedObject) throws GuacamoleException { + + // A user may not use this endpoint to update their password + try { + User currentUser = getUserContext().self(); + if ( + currentUser.getIdentifier().equals(modifiedObject.getUsername()) + && modifiedObject.getPassword() != null) { + throw new GuacamoleSecurityException( + "Permission denied. The password update endpoint must" + + " be used to change the current user's password."); + } + } + catch (GuacamoleException | RuntimeException | Error e) { + fireDirectoryFailureEvent(DirectoryEvent.Operation.UPDATE, e); + throw e; + } + + super.updateObject(modifiedObject); + + } + + /** + * Updates the password for an individual existing user. + * + * @param userPasswordUpdate + * The object containing the old password for the user, as well as the + * new password to set for that user. + * + * @param request + * The HttpServletRequest associated with the password update attempt. + * + * @throws GuacamoleException + * If an error occurs while updating the user's password. + */ + @PUT + @Path("password") + public void updatePassword(APIUserPasswordUpdate userPasswordUpdate, + @Context HttpServletRequest request) throws GuacamoleException { + + User user = getInternalObject(); + + // Build credentials + Credentials credentials = new Credentials(user.getIdentifier(), + userPasswordUpdate.getOldPassword(), request); + + // Verify that the old password was correct + try { + AuthenticationProvider authProvider = getUserContext().getAuthenticationProvider(); + if (authProvider.authenticateUser(credentials) == null) + throw new GuacamoleSecurityException("Permission denied."); + } + + // Pass through any credentials exceptions as simple permission denied + catch (GuacamoleCredentialsException e) { + throw new GuacamoleSecurityException("Permission denied."); + } + + // Set password to the newly provided one + try { + user.setPassword(userPasswordUpdate.getNewPassword()); + getDirectory().update(user); + fireDirectorySuccessEvent(DirectoryEvent.Operation.UPDATE); + } + catch (GuacamoleException | RuntimeException | Error e) { + fireDirectoryFailureEvent(DirectoryEvent.Operation.UPDATE, e); + throw e; + } + + } + + /** + * Returns a resource which abstracts operations available on the overall + * permissions granted directly to the User represented by this + * UserResource. + * + * @return + * A resource which representing the permissions granted to the User + * represented by this UserResource. + */ + @Path("permissions") + public PermissionSetResource getPermissions() { + return new PermissionSetResource(getInternalObject()); + } + + /** + * Returns a read-only view of the permissions effectively granted to this + * user, including permissions which may be inherited or implied. + * + * @return + * A read-only view of the permissions effectively granted to this + * user. + * + * @throws GuacamoleException + * If the effective permissions for this user cannot be retrieved. + */ + @GET + @Path("effectivePermissions") + public APIPermissionSet getEffectivePermissions() throws GuacamoleException { + return new APIPermissionSet(getInternalObject().getEffectivePermissions()); + } + + /** + * Returns a resource which abstracts operations available on the set of + * user groups of which the User represented by this UserResource is a + * member. + * + * @return + * A resource which represents the set of user groups of which the + * User represented by this UserResource is a member. + * + * @throws GuacamoleException + * If the group membership for this user cannot be retrieved. + */ + @Path("userGroups") + public RelatedObjectSetResource getUserGroups() throws GuacamoleException { + return new RelatedObjectSetResource(getInternalObject().getUserGroups()); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/package-info.java new file mode 100644 index 0000000..4f3acd7 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to the user manipulation aspect of the Guacamole REST API. + */ +package org.apache.guacamole.rest.user; + diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/APIUserGroup.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/APIUserGroup.java new file mode 100644 index 0000000..547fb1f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/APIUserGroup.java @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.usergroup; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Map; +import org.apache.guacamole.net.auth.UserGroup; + +/** + * A simple UserGroup to expose through the REST endpoints. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value=Include.NON_NULL) +public class APIUserGroup { + + /** + * The identifier of this user group. + */ + private String identifier; + + /** + * Boolean value indicating if this UserGroup is disabled. + */ + private boolean disabled; + + /** + * Map of all associated attributes by attribute identifier. + */ + private Map attributes; + + /** + * Construct a new empty APIUserGroup. + */ + public APIUserGroup() {} + + /** + * Construct a new APIUserGroup from the provided UserGroup. + * + * @param group + * The UserGroup to construct the APIUserGroup from. + */ + public APIUserGroup(UserGroup group) { + this.identifier = group.getIdentifier(); + this.disabled = group.isDisabled(); + this.attributes = group.getAttributes(); + } + + /** + * Returns the unique string which identifies this group relative to other + * groups. + * + * @return + * The unique string which identifies this group. + */ + public String getIdentifier() { + return identifier; + } + + /** + * Sets the unique string which identifies this group relative to other + * groups. + * + * @param identifier + * The unique string which identifies this group. + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + /** + * Return true if this user group is disabled, otherwise false. + * + * @return + * True if this user group is disabled, otherwise false. + */ + public boolean isDisabled() { + return disabled; + } + + /** + * Sets whether or not this user group is disabled to the parameter + * provided. + * + * @param disabled + * True if the user group should be disabled, otherwise false. + */ + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + /** + * Returns a map of all attributes associated with this user group. Each + * entry key is the attribute identifier, while each value is the attribute + * value itself. + * + * @return + * The attribute map for this user group. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Sets the map of all attributes associated with this user group. Each + * entry key is the attribute identifier, while each value is the attribute + * value itself. + * + * @param attributes + * The attribute map for this user group. + */ + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/APIUserGroupWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/APIUserGroupWrapper.java new file mode 100644 index 0000000..c195e87 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/APIUserGroupWrapper.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.usergroup; + +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.RelatedObjectSet; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.net.auth.permission.SystemPermissionSet; + +/** + * A wrapper to make an APIUserGroup look like a UserGroup. Useful where an + * org.apache.guacamole.net.auth.UserGroup is required. As a simple wrapper for + * APIUserGroup, access to permissions, groups, and members is not provided. + * Any attempt to access or manipulate permissions or group membership via an + * APIUserGroupWrapper will result in an exception. + */ +public class APIUserGroupWrapper implements UserGroup { + + /** + * The wrapped APIUserGroup. + */ + private final APIUserGroup apiUserGroup; + + /** + * Creates a new APIUserGroupWrapper which wraps the given APIUserGroup, + * exposing its properties through the UserGroup interface. + * + * @param apiUserGroup + * The APIUserGroup to wrap. + */ + public APIUserGroupWrapper(APIUserGroup apiUserGroup) { + this.apiUserGroup = apiUserGroup; + } + + @Override + public String getIdentifier() { + return apiUserGroup.getIdentifier(); + } + + @Override + public void setIdentifier(String identifier) { + apiUserGroup.setIdentifier(identifier); + } + + @Override + public boolean isDisabled() { + return apiUserGroup.isDisabled(); + } + + @Override + public void setDisabled(boolean disabled) { + apiUserGroup.setDisabled(disabled); + } + + @Override + public Map getAttributes() { + return apiUserGroup.getAttributes(); + } + + @Override + public void setAttributes(Map attributes) { + apiUserGroup.setAttributes(attributes); + } + + @Override + public SystemPermissionSet getSystemPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getConnectionPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getConnectionGroupPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getSharingProfilePermissions() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getUserPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getUserGroupPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public ObjectPermissionSet getActiveConnectionPermissions() + throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide permission access."); + } + + @Override + public RelatedObjectSet getUserGroups() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide group access."); + } + + @Override + public RelatedObjectSet getMemberUsers() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide member access."); + } + + @Override + public RelatedObjectSet getMemberUserGroups() throws GuacamoleException { + throw new GuacamoleUnsupportedException("APIUserGroupWrapper does not provide member access."); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupDirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupDirectoryResource.java new file mode 100644 index 0000000..44327a2 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupDirectoryResource.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.usergroup; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.Permissions; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * A REST resource which abstracts the operations available on a Directory of + * UserGroups. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class UserGroupDirectoryResource extends DirectoryResource { + + /** + * Creates a new UserGroupDirectoryResource which exposes the operations + * and subresources available for the given UserGroup Directory. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory being exposed. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles + * UserGroups. + * + * @param resourceFactory + * A factory which can be used to create instances of resources + * representing UserGroups. + */ + @AssistedInject + public UserGroupDirectoryResource( + @Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + DirectoryObjectTranslator translator, + DirectoryObjectResourceFactory resourceFactory) { + super(authenticatedUser, userContext, UserGroup.class, directory, translator, resourceFactory); + } + + @Override + protected ObjectPermissionSet getObjectPermissions(Permissions permissions) + throws GuacamoleException { + return permissions.getUserGroupPermissions(); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupModule.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupModule.java new file mode 100644 index 0000000..3e81a2d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupModule.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.usergroup; + +import com.google.inject.AbstractModule; +import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import com.google.inject.TypeLiteral; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; + +/** + * Guice Module which configures injections required for handling UserGroup + * resources via the REST API. + */ +public class UserGroupModule extends AbstractModule { + + @Override + protected void configure() { + + // Create the required DirectoryResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + UserGroupDirectoryResource.class + ) + .build(new TypeLiteral>() {})); + + // Create the required DirectoryObjectResourceFactory implementation + install(new FactoryModuleBuilder() + .implement( + new TypeLiteral>() {}, + UserGroupResource.class + ) + .build(new TypeLiteral>() {})); + + // Bind translator for converting between UserGroup and APIUserGroup + bind(new TypeLiteral>() {}) + .to(UserGroupObjectTranslator.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupObjectTranslator.java new file mode 100644 index 0000000..a947b8f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupObjectTranslator.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.usergroup; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; + +/** + * Translator which converts between UserGroup objects and APIUserGroup + * objects. + */ +public class UserGroupObjectTranslator + extends DirectoryObjectTranslator { + + @Override + public APIUserGroup toExternalObject(UserGroup object) + throws GuacamoleException { + return new APIUserGroup(object); + } + + @Override + public UserGroup toInternalObject(APIUserGroup object) + throws GuacamoleException { + return new APIUserGroupWrapper(object); + } + + @Override + public void applyExternalChanges(UserGroup existingObject, + APIUserGroup object) throws GuacamoleException { + + // Update disabled status + existingObject.setDisabled(object.isDisabled()); + + // Update user attributes + existingObject.setAttributes(object.getAttributes()); + + } + + @Override + public void filterExternalObject(UserContext userContext, APIUserGroup object) + throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes(userContext.getUserGroupAttributes(), + object.getAttributes())); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupResource.java new file mode 100644 index 0000000..6994484 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/UserGroupResource.java @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.rest.usergroup; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.UserGroup; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.rest.directory.DirectoryObjectResource; +import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.identifier.RelatedObjectSetResource; +import org.apache.guacamole.rest.permission.PermissionSetResource; + +/** + * A REST resource which abstracts the operations available on an existing + * UserGroup. + */ +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class UserGroupResource + extends DirectoryObjectResource { + + /** + * Creates a new UserGroupResource which exposes the operations and + * subresources available for the given UserGroup. + * + * @param authenticatedUser + * The user that is accessing this resource. + * + * @param userContext + * The UserContext associated with the given Directory. + * + * @param directory + * The Directory which contains the given UserGroup. + * + * @param userGroup + * The UserGroup that this UserGroupResource should represent. + * + * @param translator + * A DirectoryObjectTranslator implementation which handles Users. + */ + @AssistedInject + public UserGroupResource(@Assisted AuthenticatedUser authenticatedUser, + @Assisted UserContext userContext, + @Assisted Directory directory, + @Assisted UserGroup userGroup, + DirectoryObjectTranslator translator) { + super(authenticatedUser, userContext, UserGroup.class, directory, userGroup, translator); + } + + /** + * Returns a resource which abstracts operations available on the set of + * user groups of which the UserGroup represented by this UserGroupResource + * is a member. + * + * @return + * A resource which represents the set of user groups of which the + * UserGroup represented by this UserGroupResource is a member. + * + * @throws GuacamoleException + * If the group membership for this user group cannot be retrieved. + */ + @Path("userGroups") + public RelatedObjectSetResource getUserGroups() throws GuacamoleException { + return new RelatedObjectSetResource(getInternalObject().getUserGroups()); + } + + /** + * Returns a resource which abstracts operations available on the set of + * users which are members of the UserGroup represented by this + * UserGroupResource. + * + * @return + * A resource which represents the set of users which are members of + * the UserGroup represented by this UserGroupResource. + * + * @throws GuacamoleException + * If the members of this user group cannot be retrieved. + */ + @Path("memberUsers") + public RelatedObjectSetResource getMemberUsers() throws GuacamoleException { + return new RelatedObjectSetResource(getInternalObject().getMemberUsers()); + } + + /** + * Returns a resource which abstracts operations available on the set of + * user groups which are members of the UserGroup represented by this + * UserGroupResource. + * + * @return + * A resource which represents the set of user groups which are + * members of the UserGroup represented by this UserGroupResource. + * + * @throws GuacamoleException + * If the members of this user group cannot be retrieved. + */ + @Path("memberUserGroups") + public RelatedObjectSetResource getMemberUserGroups() throws GuacamoleException { + return new RelatedObjectSetResource(getInternalObject().getMemberUserGroups()); + } + + /** + * Returns a resource which abstracts operations available on the overall + * permissions granted directly to the UserGroup represented by this + * UserGroupResource. + * + * @return + * A resource which represents the permissions granted to the + * UserGroup represented by this UserGroupResource. + */ + @Path("permissions") + public PermissionSetResource getPermissions() { + return new PermissionSetResource(getInternalObject()); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/package-info.java b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/package-info.java new file mode 100644 index 0000000..06ab479 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/rest/usergroup/package-info.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes related to manipulating user groups via the Guacamole REST API. + */ +package org.apache.guacamole.rest.usergroup; diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/GuacamoleStreamException.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/GuacamoleStreamException.java new file mode 100644 index 0000000..b6069d3 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/GuacamoleStreamException.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import org.apache.guacamole.GuacamoleServerException; +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * A generic exception thrown when an intercepted Guacamole stream has closed + * with an error condition. Guacamole streams report errors using the "ack" + * instruction, which provides a status code and human-readable message. + */ +public class GuacamoleStreamException extends GuacamoleServerException { + + /** + * The error condition reported by the intercepted Guacamole stream. + */ + private final GuacamoleStatus status; + + /** + * Creates a new GuacamoleStreamException representing an error returned by + * an intercepted stream. + * + * @param status + * The status code of the error condition reported by the intercepted + * Guacamole stream. + * + * @param message + * The human readable description of the error that occurred, as + * provided by the stream. + */ + public GuacamoleStreamException(GuacamoleStatus status, String message) { + super(message); + this.status = status; + } + + @Override + public GuacamoleStatus getStatus() { + return status; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/InputStreamInterceptingFilter.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/InputStreamInterceptingFilter.java new file mode 100644 index 0000000..6f725bf --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/InputStreamInterceptingFilter.java @@ -0,0 +1,213 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import com.google.common.io.BaseEncoding; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.protocol.GuacamoleStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Filter which selectively intercepts "ack" instructions, automatically reading + * from or closing the stream given with interceptStream(). The required "blob" + * and "end" instructions denoting the content and boundary of the stream are + * sent automatically. + */ +public class InputStreamInterceptingFilter + extends StreamInterceptingFilter { + + /** + * Logger for this class. + */ + private static final Logger logger = + LoggerFactory.getLogger(InputStreamInterceptingFilter.class); + + /** + * Creates a new InputStreamInterceptingFilter which selectively intercepts + * "ack" instructions. The required "blob" and "end" instructions will + * automatically be sent over the given tunnel based on the content of + * provided InputStreams. + * + * @param tunnel + * The GuacamoleTunnel over which any required "blob" and "end" + * instructions should be sent. + */ + public InputStreamInterceptingFilter(GuacamoleTunnel tunnel) { + super(tunnel); + } + + /** + * Injects a "blob" instruction into the outbound Guacamole protocol + * stream, as if sent by the connected client. "blob" instructions are used + * to send chunks of data along a stream. + * + * @param index + * The index of the stream that this "blob" instruction relates to. + * + * @param blob + * The chunk of data to send within the "blob" instruction. + */ + private void sendBlob(String index, byte[] blob) { + + // Send "blob" containing provided data + sendInstruction(new GuacamoleInstruction("blob", index, + BaseEncoding.base64().encode(blob))); + + } + + /** + * Injects an "end" instruction into the outbound Guacamole protocol + * stream, as if sent by the connected client. "end" instructions are used + * to signal the end of a stream. + * + * @param index + * The index of the stream that this "end" instruction relates to. + */ + private void sendEnd(String index) { + sendInstruction(new GuacamoleInstruction("end", index)); + } + + /** + * Reads the next chunk of data from the InputStream associated with an + * intercepted stream, sending that data as a "blob" instruction over the + * GuacamoleTunnel associated with this filter. + * + * @param stream + * The stream from which the next chunk of data should be read. + */ + private void readNextBlob(InterceptedStream stream) { + + // Read blob from stream if it exists + try { + + // Read raw data from input stream + byte[] blob = new byte[6048]; + int length = stream.getStream().read(blob); + + // End stream if no more data + if (length == -1) { + + // Close stream + closeInterceptedStream(stream); + + return; + + } + + // Inject corresponding "blob" instruction + sendBlob(stream.getIndex(), Arrays.copyOf(blob, length)); + + } + + // Terminate stream if it cannot be read + catch (IOException e) { + + logger.debug("Unable to read data of intercepted input stream.", e); + + // Close stream, send end if the stream is still valid + if (closeInterceptedStream(stream)) + sendEnd(stream.getIndex()); + + } + + } + + /** + * Handles a single "ack" instruction, sending yet more blobs or closing the + * stream depending on whether the "ack" indicates success or failure. If no + * InputStream is associated with the stream index within the "ack" + * instruction, the instruction is ignored. + * + * @param instruction + * The "ack" instruction being handled. + */ + private void handleAck(GuacamoleInstruction instruction) { + + // Verify all required arguments are present + List args = instruction.getArgs(); + if (args.size() < 3) + return; + + // Pull associated stream + String index = args.get(0); + InterceptedStream stream = getInterceptedStream(index); + if (stream == null) + return; + + // Pull status code + String status = args.get(2); + + // Terminate stream if an error is encountered + if (!status.equals("0")) { + + // Parse status code as integer + int code; + try { + code = Integer.parseInt(status); + } + + // Assume internal error if parsing fails + catch (NumberFormatException e) { + logger.debug("Translating invalid status code \"{}\" to SERVER_ERROR.", status); + code = GuacamoleStatus.SERVER_ERROR.getGuacamoleStatusCode(); + } + + // Flag error and close stream + stream.setStreamError(code, args.get(1)); + closeInterceptedStream(stream); + return; + + } + + // Send next blob + readNextBlob(stream); + + } + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Intercept "ack" instructions for in-progress streams + if (instruction.getOpcode().equals("ack")) + handleAck(instruction); + + // Pass instruction through untouched + return instruction; + + } + + @Override + protected void handleInterceptedStream(InterceptedStream stream) { + + // Read the first blob. Note that future blobs will be read in response + // to received "ack" instructions. + readNextBlob(stream); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/InterceptedStream.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/InterceptedStream.java new file mode 100644 index 0000000..01f5e41 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/InterceptedStream.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.io.Closeable; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.protocol.GuacamoleStatus; + +/** + * A simple pairing of the index of an intercepted Guacamole stream with the + * stream-type object which will produce or consume the data sent over the + * intercepted Guacamole stream. + * + * @param + * The type of object which will produce or consume the data sent over the + * intercepted Guacamole stream. Usually, this will be either InputStream + * or OutputStream. + */ +public class InterceptedStream { + + /** + * The index of the Guacamole stream being intercepted. + */ + private final String index; + + /** + * The stream which will produce or consume the data sent over the + * intercepted Guacamole stream. + */ + private final T stream; + + /** + * The exception which prevented the stream from completing successfully, + * if any. If the stream completed successfully, or has not encountered any + * exception yet, this will be null. + */ + private GuacamoleException streamError = null; + + /** + * Creates a new InterceptedStream which associated the given Guacamole + * stream index with the given stream object. + * + * @param index + * The index of the Guacamole stream being intercepted. + * + * @param stream + * The stream which will produce or consume the data sent over the + * intercepted Guacamole stream. + */ + public InterceptedStream(String index, T stream) { + this.index = index; + this.stream = stream; + } + + /** + * Returns the index of the Guacamole stream being intercepted. + * + * @return + * The index of the Guacamole stream being intercepted. + */ + public String getIndex() { + return index; + } + + /** + * Returns the stream which will produce or consume the data sent over the + * intercepted Guacamole stream. + * + * @return + * The stream which will produce or consume the data sent over the + * intercepted Guacamole stream. + */ + public T getStream() { + return stream; + } + + /** + * Reports that this InterceptedStream did not complete successfully due to + * the given GuacamoleException, which could not be thrown at the time due + * to asynchronous handling of the stream contents. + * + * @param streamError + * The exception which prevented the stream from completing + * successfully. + */ + public void setStreamError(GuacamoleException streamError) { + this.streamError = streamError; + } + + /** + * Reports that this InterceptedStream did not complete successfully due to + * an error described by the given status code and human-readable message. + * The error reported by this call can later be retrieved as a + * GuacamoleStreamException by calling getStreamError(). + * + * @param code + * The Guacamole protocol status code which described the error that + * occurred. This should be taken directly from the "ack" instruction + * that reported the error witin the intercepted stream. + * + * @param message + * A human-readable message describing the error that occurred. This + * should be taken directly from the "ack" instruction that reported + * the error witin the intercepted stream. + */ + public void setStreamError(int code, String message) { + + // Map status code to GuacamoleStatus, assuming SERVER_ERROR by default + GuacamoleStatus status = GuacamoleStatus.fromGuacamoleStatusCode(code); + if (status == null) + status = GuacamoleStatus.SERVER_ERROR; + + // Associate stream with corresponding GuacamoleStreamException + setStreamError(new GuacamoleStreamException(status, message)); + + } + + /** + * Returns whether an error has prevented this InterceptedStream from + * completing successfully. This will return false if the stream has + * completed successfully OR if the stream simply has not yet completed. + * + * @return + * true if an error has prevented this InterceptedStream from + * completing successfully, false otherwise. + */ + public boolean hasStreamError() { + return streamError != null; + } + + /** + * Returns a GuacamoleException which describes why this InterceptedStream + * did not complete successfully. + * + * @return + * An exception describing the error that prevented the stream from + * completing successfully, or null if no such error has occurred. + */ + public GuacamoleException getStreamError() { + return streamError; + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/InterceptedStreamMap.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/InterceptedStreamMap.java new file mode 100644 index 0000000..6ddfdf9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/InterceptedStreamMap.java @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.io.Closeable; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Map-like storage for intercepted Guacamole streams. + * + * @param + * The type of object which will produce or consume the data sent over the + * intercepted Guacamole stream. Usually, this will be either InputStream + * or OutputStream. + */ +public class InterceptedStreamMap { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(InterceptedStreamMap.class); + + /** + * The maximum number of milliseconds to wait for notification that a + * stream has closed before explicitly checking for closure ourselves. + */ + private static final long STREAM_WAIT_TIMEOUT = 1000; + + /** + * Mapping of the indexes of all streams whose associated "blob" and "end" + * instructions should be intercepted. + */ + private final ConcurrentMap> streams = + new ConcurrentHashMap>(); + + /** + * Closes the given stream, logging any errors that occur during closure. + * The monitor of the stream is notified via a single call to notify() once + * the attempt to close has been made. + * + * @param stream + * The stream to close and notify. + */ + private void close(T stream) { + + // Attempt to close stream + try { + stream.close(); + } + catch (IOException e) { + logger.warn("Unable to close intercepted stream: {}", e.getMessage()); + logger.debug("I/O error prevented closure of intercepted stream.", e); + } + + // Notify waiting threads that the stream has ended + synchronized (stream) { + stream.notify(); + } + + } + + /** + * Closes the stream object associated with the stream having the given + * index, if any, removing it from the map, logging any errors that occur + * during closure, and unblocking any in-progress calls to waitFor() for + * that stream. If no such stream exists within this map, then this + * function has no effect. + * + * @param index + * The index of the stream whose associated stream object should be + * closed. + * + * @return + * The stream associated with the given index, if the stream was stored + * within this map, or null if no such stream exists. + */ + public InterceptedStream close(String index) { + + // Remove associated stream + InterceptedStream stream = streams.remove(index); + if (stream == null) + return null; + + // Close stream if it exists + close(stream.getStream()); + return stream; + + } + + /** + * Closes the given stream, logging any errors that occur during closure, + * and unblocking any in-progress calls to waitFor() for the given stream. + * If the given stream is stored within this map, it will also be removed. + * + * @param stream + * The stream to close. + * + * @return + * true if the given stream was stored within this map, false + * otherwise. + */ + public boolean close(InterceptedStream stream) { + + // Remove stream if present + boolean wasRemoved = streams.remove(stream.getIndex(), stream); + + // Close provided stream + close(stream.getStream()); + + return wasRemoved; + + } + + /** + * Removes and closes all streams stored within this map, logging any errors + * that occur during closure, and unblocking any in-progress calls to + * waitFor(). + */ + public void closeAll() { + + // Close any active streams + for (InterceptedStream stream : streams.values()) + close(stream.getStream()); + + // Remove now-useless references + streams.clear(); + + } + + /** + * Blocks until the given stream is closed, or until another stream with + * the same index replaces it. + * + * @param stream + * The stream to wait for. + */ + public void waitFor(InterceptedStream stream) { + + T underlyingStream = stream.getStream(); + + // Wait for stream to close + synchronized (underlyingStream) { + while (streams.get(stream.getIndex()) == stream) { + try { + underlyingStream.wait(STREAM_WAIT_TIMEOUT); + } + catch (InterruptedException e) { + // Ignore + } + } + } + + } + + /** + * Returns the stream stored in this map under the given index. + * + * @param index + * The index of the stream to return. + * + * @return + * The stream having the given index, or null if no such stream is + * stored within this map. + */ + public InterceptedStream get(String index) { + return streams.get(index); + } + + /** + * Adds the given stream to this map, storing it under its associated + * index. If another stream already exists within this map having the same + * index, that stream will be closed and replaced. + * + * @param stream + * The stream to store within this map. + */ + public void put(InterceptedStream stream) { + + // Add given stream to map + InterceptedStream oldStream = + streams.put(stream.getIndex(), stream); + + // If a previous stream DID exist, close it + if (oldStream != null) + close(oldStream.getStream()); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/OutputStreamInterceptingFilter.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/OutputStreamInterceptingFilter.java new file mode 100644 index 0000000..99cf153 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/OutputStreamInterceptingFilter.java @@ -0,0 +1,230 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import com.google.common.io.BaseEncoding; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.protocol.GuacamoleStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Filter which selectively intercepts "blob" and "end" instructions, + * automatically writing to or closing the stream given with + * interceptStream(). The required "ack" responses to received blobs are + * sent automatically. + */ +public class OutputStreamInterceptingFilter + extends StreamInterceptingFilter { + + /** + * Logger for this class. + */ + private static final Logger logger = + LoggerFactory.getLogger(OutputStreamInterceptingFilter.class); + + /** + * Whether this OutputStreamInterceptingFilter should respond to received + * blobs with "ack" messages on behalf of the client. If false, blobs will + * still be handled by this filter, but empty blobs will be sent to the + * client, forcing the client to respond on its own. + */ + private boolean acknowledgeBlobs = true; + + /** + * Creates a new OutputStreamInterceptingFilter which selectively intercepts + * "blob" and "end" instructions. The required "ack" responses will + * automatically be sent over the given tunnel. + * + * @param tunnel + * The GuacamoleTunnel over which any required "ack" instructions + * should be sent. + */ + public OutputStreamInterceptingFilter(GuacamoleTunnel tunnel) { + super(tunnel); + } + + /** + * Injects an "ack" instruction into the outbound Guacamole protocol + * stream, as if sent by the connected client. "ack" instructions are used + * to acknowledge the receipt of a stream and its subsequent blobs, and are + * the only means of communicating success/failure status. + * + * @param index + * The index of the stream that this "ack" instruction relates to. + * + * @param message + * An arbitrary human-readable message to include within the "ack" + * instruction. + * + * @param status + * The status of the stream operation being acknowledged via the "ack" + * instruction. Error statuses will implicitly close the stream via + * closeStream(). + */ + private void sendAck(String index, String message, GuacamoleStatus status) { + + // Error "ack" instructions implicitly close the stream + if (status != GuacamoleStatus.SUCCESS) + closeInterceptedStream(index); + + sendInstruction(new GuacamoleInstruction("ack", index, message, + Integer.toString(status.getGuacamoleStatusCode()))); + + } + + /** + * Handles a single "blob" instruction, decoding its base64 data, + * sending that data to the associated OutputStream, and ultimately + * dropping the "blob" instruction such that the client never receives + * it. If no OutputStream is associated with the stream index within + * the "blob" instruction, the instruction is passed through untouched. + * + * @param instruction + * The "blob" instruction being handled. + * + * @return + * The originally-provided "blob" instruction, if that instruction + * should be passed through to the client, or null if the "blob" + * instruction should be dropped. + */ + private GuacamoleInstruction handleBlob(GuacamoleInstruction instruction) { + + // Verify all required arguments are present + List args = instruction.getArgs(); + if (args.size() < 2) + return instruction; + + // Pull associated stream + String index = args.get(0); + InterceptedStream stream = getInterceptedStream(index); + if (stream == null) + return instruction; + + // Decode blob + byte[] blob; + try { + String data = args.get(1); + blob = BaseEncoding.base64().decode(data); + } + catch (IllegalArgumentException e) { + logger.warn("Received base64 data for intercepted stream was invalid."); + logger.debug("Decoding base64 data for intercepted stream failed.", e); + return null; + } + + try { + + // Attempt to write data to stream + stream.getStream().write(blob); + + // Force client to respond with their own "ack" if we need to + // confirm that they are not falling behind with respect to the + // graphical session + if (!acknowledgeBlobs) { + acknowledgeBlobs = true; + return new GuacamoleInstruction("blob", index, ""); + } + + // Otherwise, acknowledge the blob on the client's behalf + sendAck(index, "OK", GuacamoleStatus.SUCCESS); + + } + catch (IOException e) { + sendAck(index, "FAIL", GuacamoleStatus.SERVER_ERROR); + logger.debug("Write failed for intercepted stream.", e); + } + + // Instruction was handled purely internally + return null; + + } + + /** + * Handles a single "end" instruction, closing the associated + * OutputStream. If no OutputStream is associated with the stream index + * within the "end" instruction, this function has no effect. + * + * @param instruction + * The "end" instruction being handled. + */ + private void handleEnd(GuacamoleInstruction instruction) { + + // Verify all required arguments are present + List args = instruction.getArgs(); + if (args.size() < 1) + return; + + // Terminate stream + closeInterceptedStream(args.get(0)); + + } + + /** + * Handles a single "sync" instruction, updating internal tracking of + * client render state. + * + * @param instruction + * The "sync" instruction being handled. + */ + private void handleSync(GuacamoleInstruction instruction) { + acknowledgeBlobs = false; + } + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Intercept "blob" instructions for in-progress streams + if (instruction.getOpcode().equals("blob")) + return handleBlob(instruction); + + // Intercept "end" instructions for in-progress streams + if (instruction.getOpcode().equals("end")) { + handleEnd(instruction); + return instruction; + } + + // Monitor "sync" instructions to ensure the client does not starve + // from lack of graphical updates + if (instruction.getOpcode().equals("sync")) { + handleSync(instruction); + return instruction; + } + + // Pass instruction through untouched + return instruction; + + } + + @Override + protected void handleInterceptedStream(InterceptedStream stream) { + + // Acknowledge that the stream is ready to receive data + sendAck(stream.getIndex(), "OK", GuacamoleStatus.SUCCESS); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/StandardTokenMap.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/StandardTokenMap.java new file mode 100644 index 0000000..3392861 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/StandardTokenMap.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Credentials; + +/** + * Map which is automatically populated with the name/value pairs of all + * standardized tokens available for a particular AuthenticatedUser. + */ +public class StandardTokenMap extends HashMap { + + /** + * The name of the token containing the user's username. + */ + public static final String USERNAME_TOKEN = "GUAC_USERNAME"; + + /** + * The name of the token containing the user's password. + */ + public static final String PASSWORD_TOKEN = "GUAC_PASSWORD"; + + /** + * The name of the token containing the hostname/address of the machine the + * user authenticated from. + */ + public static final String CLIENT_HOSTNAME_TOKEN = "GUAC_CLIENT_HOSTNAME"; + + /** + * The name of the token containing the IP address of the machine the user + * authenticated from. + */ + public static final String CLIENT_ADDRESS_TOKEN = "GUAC_CLIENT_ADDRESS"; + + /** + * The name of the token containing the current date (server-local time). + */ + public static final String DATE_TOKEN = "GUAC_DATE"; + + /** + * The name of the token containing the current time (server-local time). + */ + public static final String TIME_TOKEN = "GUAC_TIME"; + + /** + * The date format that should be used for the date token. This format must + * be compatible with Java's SimpleDateFormat. + */ + private static final String DATE_FORMAT = "yyyyMMdd"; + + /** + * The date format that should be used for the time token. This format must + * be compatible with Java's SimpleDateFormat. + */ + private static final String TIME_FORMAT = "HHmmss"; + + /** + * Creates a new StandardTokenMap which is pre-populated with the + * name/value pairs of all standardized tokens available for the given + * AuthenticatedUser. + * + * @param authenticatedUser + * The AuthenticatedUser to generate standard tokens for. + */ + public StandardTokenMap(AuthenticatedUser authenticatedUser) { + + // Add date/time tokens (server-local time) + Date currentTime = new Date(); + put(DATE_TOKEN, new SimpleDateFormat(DATE_FORMAT).format(currentTime)); + put(TIME_TOKEN, new SimpleDateFormat(TIME_FORMAT).format(currentTime)); + + Credentials credentials = authenticatedUser.getCredentials(); + + // Add username token + String username = credentials.getUsername(); + if (username != null) + put(USERNAME_TOKEN, username); + + // Default to the authenticated user's username for the GUAC_USERNAME + // token + else + put(USERNAME_TOKEN, authenticatedUser.getIdentifier()); + + // Add password token + String password = credentials.getPassword(); + if (password != null) + put(PASSWORD_TOKEN, password); + + // Add client hostname token + String hostname = credentials.getRemoteHostname(); + if (hostname != null) + put(CLIENT_HOSTNAME_TOKEN, hostname); + + // Add client address token + String address = credentials.getRemoteAddress(); + if (address != null) + put(CLIENT_ADDRESS_TOKEN, address); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/StreamInterceptingFilter.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/StreamInterceptingFilter.java new file mode 100644 index 0000000..30c24c1 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/StreamInterceptingFilter.java @@ -0,0 +1,217 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.io.Closeable; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleFilter; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Filter which selectively intercepts stream-related instructions, + * automatically writing to, reading from, or closing the stream given with + * interceptStream(). Any instructions required by the Guacamole protocol to be + * sent in response to intercepted instructions will be sent automatically. + * + * @param + * The type of object which will produce or consume the data sent over the + * intercepted Guacamole stream. Usually, this will be either InputStream + * or OutputStream. + */ +public abstract class StreamInterceptingFilter + implements GuacamoleFilter { + + /** + * Logger for this class. + */ + private static final Logger logger = + LoggerFactory.getLogger(StreamInterceptingFilter.class); + + /** + * Mapping of the all streams whose related instructions should be + * intercepted. + */ + private final InterceptedStreamMap streams = new InterceptedStreamMap(); + + /** + * The tunnel over which any required instructions should be sent. + */ + private final GuacamoleTunnel tunnel; + + /** + * Creates a new StreamInterceptingFilter which selectively intercepts + * stream-related instructions. Any instructions required by the Guacamole + * protocol to be sent in response to intercepted instructions will be sent + * automatically over the given tunnel. + * + * @param tunnel + * The GuacamoleTunnel over which any required instructions should be + * sent. + */ + public StreamInterceptingFilter(GuacamoleTunnel tunnel) { + this.tunnel = tunnel; + } + + /** + * Injects an arbitrary Guacamole instruction into the outbound Guacamole + * protocol stream (GuacamoleWriter) of the tunnel associated with this + * StreamInterceptingFilter, as if the instruction was sent by the connected + * client. + * + * @param instruction + * The Guacamole instruction to inject. + */ + protected void sendInstruction(GuacamoleInstruction instruction) { + + // Temporarily acquire writer to send "ack" instruction + GuacamoleWriter writer = tunnel.acquireWriter(); + + // Send successful "ack" + try { + writer.writeInstruction(instruction); + } + catch (GuacamoleException e) { + logger.debug("Unable to send \"{}\" for intercepted stream.", + instruction.getOpcode(), e); + } + + // Done writing + tunnel.releaseWriter(); + + } + + /** + * Returns the stream having the given index and currently being intercepted + * by this filter. + * + * @param index + * The index of the stream to return. + * + * @return + * The stream having the given index, or null if no such stream is + * being intercepted. + */ + protected InterceptedStream getInterceptedStream(String index) { + return streams.get(index); + } + + /** + * Closes the stream having the given index and currently being intercepted + * by this filter, if any. If no such stream is being intercepted, then this + * function has no effect. + * + * @param index + * The index of the stream to close. + * + * @return + * The stream associated with the given index, if the stream is being + * intercepted, or null if no such stream exists. + */ + protected InterceptedStream closeInterceptedStream(String index) { + return streams.close(index); + } + + /** + * Closes the given stream. + * + * @param stream + * The stream to close. + * + * @return + * true if the given stream was being intercepted, false otherwise. + */ + protected boolean closeInterceptedStream(InterceptedStream stream) { + return streams.close(stream); + } + + /** + * Closes all streams being intercepted by this filter. + */ + public void closeAllInterceptedStreams() { + streams.closeAll(); + } + + /** + * Begins handling the data of the given intercepted stream. This function + * will automatically be invoked by interceptStream() for any valid stream. + * It is not required that this function block until all data is handled; + * interceptStream() will do this automatically. Implementations are free + * to use asynchronous approaches to data handling. + * + * @param stream + * The stream being intercepted. + */ + protected abstract void handleInterceptedStream(InterceptedStream stream); + + /** + * Intercept the stream having the given index, producing or consuming its + * data as appropriate. The given stream object will automatically be closed + * when the stream ends. If there is no stream having the given index, then + * the stream object will be closed immediately. This function will block + * until all data has been handled and the stream is ended. + * + * @param index + * The index of the stream to intercept. + * + * @param stream + * The stream object which will produce or consume all data for the + * stream having the given index. + * + * @throws GuacamoleException + * If an error occurs while intercepting the stream, or if the stream + * itself reports an error. + */ + public void interceptStream(int index, T stream) throws GuacamoleException { + + InterceptedStream interceptedStream; + String indexString = Integer.toString(index); + + // Atomically verify tunnel is open and add the given stream + synchronized (tunnel) { + + // Do nothing if tunnel is not open + if (!tunnel.isOpen()) + return; + + // Wrap stream + interceptedStream = new InterceptedStream(indexString, stream); + + // Replace any existing stream + streams.put(interceptedStream); + + } + + // Produce/consume all stream data + handleInterceptedStream(interceptedStream); + + // Wait for stream to close + streams.waitFor(interceptedStream); + + // Throw any asynchronously-provided exception + if (interceptedStream.hasStreamError()) + throw interceptedStream.getStreamError(); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/StreamInterceptingTunnel.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/StreamInterceptingTunnel.java new file mode 100644 index 0000000..d4ba00e --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/StreamInterceptingTunnel.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.net.DelegatingGuacamoleTunnel; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.FilteredGuacamoleReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * GuacamoleTunnel implementation which provides for producing or consuming the + * contents of in-progress streams, rerouting blobs to a provided OutputStream + * or from a provided InputStream. Interception of streams is requested on a per + * stream basis and lasts only for the duration of that stream. + */ +public class StreamInterceptingTunnel extends DelegatingGuacamoleTunnel { + + /** + * Logger for this class. + */ + private static final Logger logger = + LoggerFactory.getLogger(StreamInterceptingTunnel.class); + + /** + * Creates a new StreamInterceptingTunnel which wraps the given tunnel, + * reading and intercepting stream-related instructions as necessary to + * fulfill calls to interceptStream(). + * + * @param tunnel + * The tunnel whose stream-related instruction should be intercepted if + * interceptStream() is invoked. + */ + public StreamInterceptingTunnel(GuacamoleTunnel tunnel) { + super(tunnel); + } + + /** + * The filter to use for providing stream data from InputStreams. + */ + private final InputStreamInterceptingFilter inputStreamFilter = + new InputStreamInterceptingFilter(this); + + /** + * The filter to use for rerouting received stream data to OutputStreams. + */ + private final OutputStreamInterceptingFilter outputStreamFilter = + new OutputStreamInterceptingFilter(this); + + /** + * Intercept all data received along the stream having the given index, + * writing that data to the given OutputStream. The OutputStream will + * automatically be closed when the stream ends. If there is no such + * stream, then the OutputStream will be closed immediately. This function + * will block until all received data has been written to the OutputStream + * and the OutputStream has been closed. + * + * @param index + * The index of the stream to intercept. + * + * @param stream + * The OutputStream to write all intercepted data to. + * + * @throws GuacamoleException + * If an error occurs while intercepting the stream, or if the stream + * itself reports an error. + */ + public void interceptStream(int index, OutputStream stream) + throws GuacamoleException { + + // Log beginning of intercepted stream + logger.debug("Intercepting output stream #{} of tunnel \"{}\".", + index, getUUID()); + + try { + outputStreamFilter.interceptStream(index, new BufferedOutputStream(stream)); + } + + // Log end of intercepted stream + finally { + logger.debug("Intercepted output stream #{} of tunnel \"{}\" ended.", + index, getUUID()); + } + + } + + /** + * Intercept the given stream, continuously writing the contents of the + * given InputStream as blobs. The stream will automatically end when + * when the end of the InputStream is reached. If there is no such + * stream, then the InputStream will be closed immediately. This function + * will block until all data from the InputStream has been written to the + * given stream. + * + * @param index + * The index of the stream to intercept. + * + * @param stream + * The InputStream to read all blobs data from. + * + * @throws GuacamoleException + * If an error occurs while intercepting the stream, or if the stream + * itself reports an error. + */ + public void interceptStream(int index, InputStream stream) + throws GuacamoleException { + + // Log beginning of intercepted stream + logger.debug("Intercepting input stream #{} of tunnel \"{}\".", + index, getUUID()); + + try { + inputStreamFilter.interceptStream(index, new BufferedInputStream(stream)); + } + + // Log end of intercepted stream + finally { + logger.debug("Intercepted input stream #{} of tunnel \"{}\" ended.", + index, getUUID()); + } + + } + + @Override + public GuacamoleReader acquireReader() { + + GuacamoleReader reader = super.acquireReader(); + + // Filter both input and output streams + reader = new FilteredGuacamoleReader(reader, inputStreamFilter); + reader = new FilteredGuacamoleReader(reader, outputStreamFilter); + + return reader; + + } + + @Override + public synchronized void close() throws GuacamoleException { + + // Close first, such that no further streams can be added via + // interceptStream() + try { + super.close(); + } + + // Close all intercepted streams + finally { + inputStreamFilter.closeAllInterceptedStreams(); + outputStreamFilter.closeAllInterceptedStreams(); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelLoader.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelLoader.java new file mode 100644 index 0000000..e8701b6 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelLoader.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import com.google.inject.Module; + +/** + * Generic means of loading a tunnel without adding explicit dependencies within + * the main ServletModule, as not all servlet containers may have the classes + * required by all tunnel implementations. + */ +public interface TunnelLoader extends Module { + + /** + * Checks whether this type of tunnel is supported by the servlet container. + * + * @return true if this type of tunnel is supported and can be loaded + * without errors, false otherwise. + */ + public boolean isSupported(); + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelModule.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelModule.java new file mode 100644 index 0000000..218b007 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelModule.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import org.apache.guacamole.tunnel.http.RestrictedGuacamoleHTTPTunnelServlet; +import com.google.inject.servlet.ServletModule; +import java.lang.reflect.InvocationTargetException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Module which loads tunnel implementations. + */ +public class TunnelModule extends ServletModule { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(TunnelModule.class); + + /** + * Classnames of all implementation-specific WebSocket tunnel modules. + */ + private static final String[] WEBSOCKET_MODULES = { + "org.apache.guacamole.tunnel.websocket.WebSocketTunnelModule", + "org.apache.guacamole.tunnel.websocket.jetty8.WebSocketTunnelModule", + "org.apache.guacamole.tunnel.websocket.jetty9.WebSocketTunnelModule", + "org.apache.guacamole.tunnel.websocket.tomcat.WebSocketTunnelModule" + }; + + private boolean loadWebSocketModule(String classname) { + + try { + + // Attempt to find WebSocket module + Class module = Class.forName(classname); + + // Create loader + TunnelLoader loader = (TunnelLoader) module.getConstructor().newInstance(); + + // Install module, if supported + if (loader.isSupported()) { + install(loader); + return true; + } + + } + + // If no such class or constructor, etc., then this particular + // WebSocket support is not present + catch (ClassNotFoundException e) {} + catch (NoClassDefFoundError e) {} + catch (NoSuchMethodException e) {} + + // Log errors which indicate bugs + catch (InstantiationException e) { + logger.debug("Error instantiating WebSocket module.", e); + } + catch (IllegalAccessException e) { + logger.debug("Error instantiating WebSocket module.", e); + } + catch (InvocationTargetException e) { + logger.debug("Error instantiating WebSocket module.", e); + } + + // Load attempt failed + return false; + + } + + @Override + protected void configureServlets() { + + bind(TunnelRequestService.class); + + // Set up HTTP tunnel + serve("/tunnel").with(RestrictedGuacamoleHTTPTunnelServlet.class); + + // Try to load each WebSocket tunnel in sequence + for (String classname : WEBSOCKET_MODULES) { + if (loadWebSocketModule(classname)) { + logger.debug("WebSocket module loaded: {}", classname); + return; + } + } + + // Warn of lack of WebSocket + logger.info("WebSocket support NOT present. Only HTTP will be used."); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequest.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequest.java new file mode 100644 index 0000000..fe58e18 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequest.java @@ -0,0 +1,342 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.util.List; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleException; + +/** + * A request object which provides only the functions absolutely required to + * retrieve and connect to a tunnel. + */ +public abstract class TunnelRequest { + + /** + * The name of the request parameter containing the user's authentication + * token. + */ + public static final String AUTH_TOKEN_PARAMETER = "token"; + + /** + * The name of the parameter containing the identifier of the + * AuthenticationProvider associated with the UserContext containing the + * object to which a tunnel is being requested. + */ + public static final String AUTH_PROVIDER_IDENTIFIER_PARAMETER = "GUAC_DATA_SOURCE"; + + /** + * The name of the parameter specifying the type of object to which a + * tunnel is being requested. Currently, this may be "c" for a Guacamole + * connection, or "g" for a Guacamole connection group. + */ + public static final String TYPE_PARAMETER = "GUAC_TYPE"; + + /** + * The name of the parameter containing the unique identifier of the object + * to which a tunnel is being requested. + */ + public static final String IDENTIFIER_PARAMETER = "GUAC_ID"; + + /** + * The name of the parameter containing the desired display width, in + * pixels. + */ + public static final String WIDTH_PARAMETER = "GUAC_WIDTH"; + + /** + * The name of the parameter containing the desired display height, in + * pixels. + */ + public static final String HEIGHT_PARAMETER = "GUAC_HEIGHT"; + + /** + * The name of the parameter containing the desired display resolution, in + * DPI. + */ + public static final String DPI_PARAMETER = "GUAC_DPI"; + + /** + * The name of the parameter specifying one supported audio mimetype. This + * will normally appear multiple times within a single tunnel request - + * once for each mimetype. + */ + public static final String AUDIO_PARAMETER = "GUAC_AUDIO"; + + /** + * The name of the parameter specifying one supported video mimetype. This + * will normally appear multiple times within a single tunnel request - + * once for each mimetype. + */ + public static final String VIDEO_PARAMETER = "GUAC_VIDEO"; + + /** + * The name of the parameter specifying one supported image mimetype. This + * will normally appear multiple times within a single tunnel request - + * once for each mimetype. + */ + public static final String IMAGE_PARAMETER = "GUAC_IMAGE"; + + /** + * The name of the parameter specifying the timezone of the client. + */ + public static final String TIMEZONE_PARAMETER = "GUAC_TIMEZONE"; + + /** + * Returns the value of the parameter having the given name. + * + * @param name + * The name of the parameter to return. + * + * @return + * The value of the parameter having the given name, or null if no such + * parameter was specified. + */ + public abstract String getParameter(String name); + + /** + * Returns a list of all values specified for the given parameter. + * + * @param name + * The name of the parameter to return. + * + * @return + * All values of the parameter having the given name , or null if no + * such parameter was specified. + */ + public abstract List getParameterValues(String name); + + /** + * Returns the value of the parameter having the given name, throwing an + * exception if the parameter is missing. + * + * @param name + * The name of the parameter to return. + * + * @return + * The value of the parameter having the given name. + * + * @throws GuacamoleException + * If the parameter is not present in the request. + */ + public String getRequiredParameter(String name) throws GuacamoleException { + + // Pull requested parameter, aborting if absent + String value = getParameter(name); + if (value == null) + throw new GuacamoleClientException("Parameter \"" + name + "\" is required."); + + return value; + + } + + /** + * Returns the integer value of the parameter having the given name, + * throwing an exception if the parameter cannot be parsed. + * + * @param name + * The name of the parameter to return. + * + * @return + * The integer value of the parameter having the given name, or null if + * the parameter is missing. + * + * @throws GuacamoleException + * If the parameter is not a valid integer. + */ + public Integer getIntegerParameter(String name) throws GuacamoleException { + + // Pull requested parameter + String value = getParameter(name); + if (value == null) + return null; + + // Attempt to parse as an integer + try { + return Integer.parseInt(value); + } + + // Rethrow any parsing error as a GuacamoleClientException + catch (NumberFormatException e) { + throw new GuacamoleClientException("Parameter \"" + name + "\" must be a valid integer.", e); + } + + } + + /** + * Returns the authentication token associated with this tunnel request. + * + * @return + * The authentication token associated with this tunnel request, or + * null if no authentication token is present. + */ + public String getAuthenticationToken() { + return getParameter(AUTH_TOKEN_PARAMETER); + } + + /** + * Returns the identifier of the AuthenticationProvider associated with the + * UserContext from which the connection or connection group is to be + * retrieved when the tunnel is created. In the context of the REST API and + * the JavaScript side of the web application, this is referred to as the + * data source identifier. + * + * @return + * The identifier of the AuthenticationProvider associated with the + * UserContext from which the connection or connection group is to be + * retrieved when the tunnel is created. + * + * @throws GuacamoleException + * If the identifier was not present in the request. + */ + public String getAuthenticationProviderIdentifier() + throws GuacamoleException { + return getRequiredParameter(AUTH_PROVIDER_IDENTIFIER_PARAMETER); + } + + /** + * Returns the type of object for which the tunnel is being requested. + * + * @return + * The type of object for which the tunnel is being requested. + * + * @throws GuacamoleException + * If the type was not present in the request, or if the type requested + * is in the wrong format. + */ + public TunnelRequestType getType() throws GuacamoleException { + + TunnelRequestType type = TunnelRequestType.parseType(getRequiredParameter(TYPE_PARAMETER)); + if (type != null) + return type; + + throw new GuacamoleClientException("Illegal identifier - unknown type."); + + } + + /** + * Returns the identifier of the destination of the tunnel being requested. + * As there are multiple types of destination objects available, and within + * multiple data sources, the associated object type and data source are + * also necessary to determine what this identifier refers to. + * + * @return + * The identifier of the destination of the tunnel being requested. + * + * @throws GuacamoleException + * If the identifier was not present in the request. + */ + public String getIdentifier() throws GuacamoleException { + return getRequiredParameter(IDENTIFIER_PARAMETER); + } + + /** + * Returns the display width desired for the Guacamole session over the + * tunnel being requested. + * + * @return + * The display width desired for the Guacamole session over the tunnel + * being requested, or null if no width was given. + * + * @throws GuacamoleException + * If the width specified was not a valid integer. + */ + public Integer getWidth() throws GuacamoleException { + return getIntegerParameter(WIDTH_PARAMETER); + } + + /** + * Returns the display height desired for the Guacamole session over the + * tunnel being requested. + * + * @return + * The display height desired for the Guacamole session over the tunnel + * being requested, or null if no width was given. + * + * @throws GuacamoleException + * If the height specified was not a valid integer. + */ + public Integer getHeight() throws GuacamoleException { + return getIntegerParameter(HEIGHT_PARAMETER); + } + + /** + * Returns the display resolution desired for the Guacamole session over + * the tunnel being requested, in DPI. + * + * @return + * The display resolution desired for the Guacamole session over the + * tunnel being requested, or null if no resolution was given. + * + * @throws GuacamoleException + * If the resolution specified was not a valid integer. + */ + public Integer getDPI() throws GuacamoleException { + return getIntegerParameter(DPI_PARAMETER); + } + + /** + * Returns a list of all audio mimetypes declared as supported within the + * tunnel request. + * + * @return + * A list of all audio mimetypes declared as supported within the + * tunnel request, or null if no mimetypes were specified. + */ + public List getAudioMimetypes() { + return getParameterValues(AUDIO_PARAMETER); + } + + /** + * Returns a list of all video mimetypes declared as supported within the + * tunnel request. + * + * @return + * A list of all video mimetypes declared as supported within the + * tunnel request, or null if no mimetypes were specified. + */ + public List getVideoMimetypes() { + return getParameterValues(VIDEO_PARAMETER); + } + + /** + * Returns a list of all image mimetypes declared as supported within the + * tunnel request. + * + * @return + * A list of all image mimetypes declared as supported within the + * tunnel request, or null if no mimetypes were specified. + */ + public List getImageMimetypes() { + return getParameterValues(IMAGE_PARAMETER); + } + + /** + * Returns the tz database value of the timezone declared by the client + * within the tunnel request. + * + * @return + * The tz database value of the timezone parameter as reported by + * the client. + */ + public String getTimezone() { + return getParameter(TIMEZONE_PARAMETER); + } +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequestService.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequestService.java new file mode 100644 index 0000000..1dd567a --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequestService.java @@ -0,0 +1,377 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.util.List; +import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.GuacamoleResourceNotFoundException; +import org.apache.guacamole.GuacamoleSession; +import org.apache.guacamole.GuacamoleUnauthorizedException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.Connectable; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.event.TunnelCloseEvent; +import org.apache.guacamole.net.event.TunnelConnectEvent; +import org.apache.guacamole.rest.auth.AuthenticationService; +import org.apache.guacamole.protocol.GuacamoleClientInformation; +import org.apache.guacamole.rest.event.ListenerService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utility class that takes a standard request from the Guacamole JavaScript + * client and produces the corresponding GuacamoleTunnel. The implementation + * of this utility is specific to the form of request used by the upstream + * Guacamole web application, and is not necessarily useful to applications + * that use purely the Guacamole API. + */ +@Singleton +public class TunnelRequestService { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(TunnelRequestService.class); + + /** + * A service for authenticating users from auth tokens. + */ + @Inject + private AuthenticationService authenticationService; + + /** + * A service for notifying listeners about tunnel connect/closed events. + */ + @Inject + private ListenerService listenerService; + + /** + * Notifies bound listeners that a new tunnel has been connected. + * Listeners may veto a connected tunnel by throwing any GuacamoleException. + * + * @param authenticatedUser + * The AuthenticatedUser associated with the user for whom the tunnel + * is being created. + * + * @param credentials + * Credentials that authenticate the user. + * + * @param tunnel + * The tunnel that was connected. + * + * @throws GuacamoleException + * If thrown by a listener or if any listener vetoes the connected tunnel. + */ + private void fireTunnelConnectEvent(AuthenticatedUser authenticatedUser, + Credentials credentials, GuacamoleTunnel tunnel) throws GuacamoleException { + listenerService.handleEvent(new TunnelConnectEvent(authenticatedUser, + credentials, tunnel)); + } + + /** + * Notifies bound listeners that a tunnel is to be closed. + * Listeners are allowed to veto a request to close a tunnel by throwing any + * GuacamoleException. + * + * @param authenticatedUser + * The AuthenticatedUser associated with the user for whom the tunnel + * is being closed. + * + * @param credentials + * Credentials that authenticate the user. + * + * @param tunnel + * The tunnel that was connected. + * + * @throws GuacamoleException + * If thrown by a listener. + */ + private void fireTunnelClosedEvent(AuthenticatedUser authenticatedUser, + Credentials credentials, GuacamoleTunnel tunnel) + throws GuacamoleException { + listenerService.handleEvent(new TunnelCloseEvent(authenticatedUser, + credentials, tunnel)); + } + + /** + * Reads and returns the client information provided within the given + * request. + * + * @param request + * The request describing tunnel to create. + * + * @return GuacamoleClientInformation + * An object containing information about the client sending the tunnel + * request. + * + * @throws GuacamoleException + * If the parameters of the tunnel request are invalid. + */ + protected GuacamoleClientInformation getClientInformation(TunnelRequest request) + throws GuacamoleException { + + // Get client information + GuacamoleClientInformation info = new GuacamoleClientInformation(); + + // Set width if provided + Integer width = request.getWidth(); + if (width != null) + info.setOptimalScreenWidth(width); + + // Set height if provided + Integer height = request.getHeight(); + if (height != null) + info.setOptimalScreenHeight(height); + + // Set resolution if provided + Integer dpi = request.getDPI(); + if (dpi != null) + info.setOptimalResolution(dpi); + + // Add audio mimetypes + List audioMimetypes = request.getAudioMimetypes(); + if (audioMimetypes != null) + info.getAudioMimetypes().addAll(audioMimetypes); + + // Add video mimetypes + List videoMimetypes = request.getVideoMimetypes(); + if (videoMimetypes != null) + info.getVideoMimetypes().addAll(videoMimetypes); + + // Add image mimetypes + List imageMimetypes = request.getImageMimetypes(); + if (imageMimetypes != null) + info.getImageMimetypes().addAll(imageMimetypes); + + // Set timezone if provided + String timezone = request.getTimezone(); + if (timezone != null && !timezone.isEmpty()) + info.setTimezone(timezone); + + return info; + } + + /** + * Creates a new tunnel using which is connected to the connection or + * connection group identifier by the given ID. Client information + * is specified in the {@code info} parameter. + * + * @param context + * The UserContext associated with the user for whom the tunnel is + * being created. + * + * @param type + * The type of object being connected to (connection or group). + * + * @param id + * The id of the connection or group being connected to. + * + * @param info + * Information describing the connected Guacamole client. + * + * @param tokens + * A Map containing the token names and corresponding values to be + * applied as parameter tokens when establishing the connection. + * + * @return + * A new tunnel, connected as required by the request. + * + * @throws GuacamoleException + * If an error occurs while creating the tunnel. + */ + protected GuacamoleTunnel createConnectedTunnel(UserContext context, + final TunnelRequestType type, String id, + GuacamoleClientInformation info, Map tokens) + throws GuacamoleException { + + // Retrieve requested destination object + Connectable connectable = type.getConnectable(context, id); + if (connectable == null) + throw new GuacamoleResourceNotFoundException("Requested tunnel " + + "destination does not exist."); + + // Connect tunnel to destination + GuacamoleTunnel tunnel = connectable.connect(info, tokens); + logger.info("User \"{}\" connected to {} \"{}\".", + context.self().getIdentifier(), type.NAME, id); + return tunnel; + + } + + /** + * Associates the given tunnel with the given session, returning a wrapped + * version of the same tunnel which automatically handles closure and + * removal from the session. + * + * @param tunnel + * The connected tunnel to wrap and monitor. + * + * @param authToken + * The authentication token associated with the given session. If + * provided, this token will be automatically invalidated (and the + * corresponding session destroyed) if tunnel errors imply that the + * user is no longer authorized. + * + * @param session + * The Guacamole session to associate the tunnel with. + * + * @param context + * The UserContext associated with the user for whom the tunnel is + * being created. + * + * @param type + * The type of object being connected to (connection or group). + * + * @param id + * The id of the connection or group being connected to. + * + * @return + * A new tunnel, associated with the given session, which delegates all + * functionality to the given tunnel while monitoring and automatically + * handling closure. + * + * @throws GuacamoleException + * If an error occurs while obtaining the tunnel. + */ + protected GuacamoleTunnel createAssociatedTunnel(final GuacamoleTunnel tunnel, + final String authToken, final GuacamoleSession session, + final UserContext context, final TunnelRequestType type, + final String id) throws GuacamoleException { + + // Monitor tunnel closure and data + UserTunnel monitoredTunnel = new UserTunnel(context, tunnel) { + + /** + * The time the connection began, measured in milliseconds since + * midnight, January 1, 1970 UTC. + */ + private final long connectionStartTime = System.currentTimeMillis(); + + @Override + public void close() throws GuacamoleException { + + // Notify listeners to allow close request to be vetoed + AuthenticatedUser authenticatedUser = session.getAuthenticatedUser(); + fireTunnelClosedEvent(authenticatedUser, + authenticatedUser.getCredentials(), tunnel); + + long connectionEndTime = System.currentTimeMillis(); + long duration = connectionEndTime - connectionStartTime; + + logger.info("User \"{}\" disconnected from {} \"{}\". Duration: {} milliseconds", + session.getAuthenticatedUser().getIdentifier(), + type.NAME, id, duration); + + try { + + // Close and clean up tunnel + session.removeTunnel(getUUID().toString()); + super.close(); + + } + + // Ensure any associated session is invalidated if unauthorized + catch (GuacamoleUnauthorizedException e) { + + // If there is an associated auth token, invalidate it + if (authenticationService.destroyGuacamoleSession(authToken)) + logger.debug("Implicitly invalidated session for token \"{}\".", authToken); + + // Continue with exception processing + throw e; + + } + + } + + }; + + // Associate tunnel with session + session.addTunnel(monitoredTunnel); + return monitoredTunnel; + + } + + /** + * Creates a new tunnel using the parameters and credentials present in + * the given request. + * + * @param request + * The request describing the tunnel to create. + * + * @return + * The created tunnel, or null if the tunnel could not be created. + * + * @throws GuacamoleException + * If an error occurs while creating the tunnel. + */ + public GuacamoleTunnel createTunnel(TunnelRequest request) + throws GuacamoleException { + + // Parse request parameters + String authToken = request.getAuthenticationToken(); + String id = request.getIdentifier(); + TunnelRequestType type = request.getType(); + String authProviderIdentifier = request.getAuthenticationProviderIdentifier(); + GuacamoleClientInformation info = getClientInformation(request); + + GuacamoleSession session = authenticationService.getGuacamoleSession(authToken); + AuthenticatedUser authenticatedUser = session.getAuthenticatedUser(); + UserContext userContext = session.getUserContext(authProviderIdentifier); + + // Attempt to get the user's name and set it for the tunnel client. + String name = authenticatedUser.getIdentifier(); + if (name != null) + info.setName(name); + + try { + + // Create connected tunnel using provided connection ID and client information + GuacamoleTunnel tunnel = createConnectedTunnel(userContext, type, + id, info, new StandardTokenMap(authenticatedUser)); + + // Notify listeners to allow connection to be vetoed + fireTunnelConnectEvent(authenticatedUser, authenticatedUser.getCredentials(), tunnel); + + // Associate tunnel with session + return createAssociatedTunnel(tunnel, authToken, session, userContext, type, id); + + } + + // Ensure any associated session is invalidated if unauthorized + catch (GuacamoleUnauthorizedException e) { + + // If there is an associated auth token, invalidate it + if (authenticationService.destroyGuacamoleSession(authToken)) + logger.debug("Implicitly invalidated session for token \"{}\".", authToken); + + // Continue with exception processing + throw e; + + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequestType.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequestType.java new file mode 100644 index 0000000..2c98708 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/TunnelRequestType.java @@ -0,0 +1,154 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.Connectable; +import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.UserContext; + +/** + * All supported object types that can be used as the destination of a tunnel. + * + * @see TunnelRequest#TYPE_PARAMETER + * @see TunnelRequest#getType() + */ +public enum TunnelRequestType { + + /** + * A Guacamole connection. + */ + CONNECTION("c", "connection") { + + @Override + public Connection getConnectable(UserContext userContext, + String identifier) throws GuacamoleException { + return userContext.getConnectionDirectory().get(identifier); + } + + }, + + /** + * A Guacamole connection group. + */ + CONNECTION_GROUP("g", "connection group") { + + @Override + public ConnectionGroup getConnectable(UserContext userContext, + String identifier) throws GuacamoleException { + return userContext.getConnectionGroupDirectory().get(identifier); + } + + }, + + /** + * An active Guacamole connection. + */ + ACTIVE_CONNECTION("a", "active connection") { + + @Override + public ActiveConnection getConnectable(UserContext userContext, + String identifier) throws GuacamoleException { + return userContext.getActiveConnectionDirectory().get(identifier); + } + + }; + + /** + * The parameter value which denotes a destination object of this type + * within a tunnel request. + * + * @see TunnelRequest#TYPE_PARAMETER + * @see TunnelRequest#getType() + */ + public final String PARAMETER_VALUE; + + /** + * A human-readable, descriptive name of the type of destination object. + */ + public final String NAME; + + /** + * Defines a tunnel request type having the given corresponding parameter + * value and human-readable name. + * + * @param value + * The parameter value which denotes a destination object of this + * type. + * + * @param name + * A human-readable, descriptive name of the type of destination + * object. + */ + private TunnelRequestType(String value, String name) { + PARAMETER_VALUE = value; + NAME = name; + } + + /** + * Retrieves the object having the given identifier from the given + * UserContext, where the type of object retrieved is the type of object + * represented by this tunnel request type. + * + * @param userContext + * The UserContext to retrieve the object from. + * + * @param identifier + * The identifier of the object to retrieve. + * + * @return + * The object having the given identifier, or null if no such object + * exists. + * + * @throws GuacamoleException + * If an error occurs retrieving the requested object, or if permission + * to retrieve the object is denied. + */ + public abstract Connectable getConnectable(UserContext userContext, + String identifier) throws GuacamoleException; + + /** + * Parses the given tunnel request type string, returning the + * TunnelRequestType which matches that string, as declared by + * {@link #PARAMETER_VALUE}. If no such type exists, null is returned. + * + * @param type + * The type string to parse. + * + * @return + * The TunnelRequestType which specifies the given string as its + * {@link #PARAMETER_VALUE}, or null if no such type exists. + */ + public static TunnelRequestType parseType(String type) { + + // Locate type with given parameter value + for (TunnelRequestType possibleType : values()) { + if (type.equals(possibleType.PARAMETER_VALUE)) + return possibleType; + } + + // No such type + return null; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/UserTunnel.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/UserTunnel.java new file mode 100644 index 0000000..3a100b9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/UserTunnel.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel; + +import java.util.Collection; +import java.util.UUID; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.net.auth.UserContext; + +/** + * Tunnel implementation which associates a given tunnel with the UserContext of + * the user that created it. + */ +public class UserTunnel extends StreamInterceptingTunnel { + + /** + * The UserContext associated with the user for whom this tunnel was + * created. This UserContext MUST be from the AuthenticationProvider that + * created this tunnel. + */ + private final UserContext userContext; + + /** + * Creates a new UserTunnel which wraps the given tunnel, associating it + * with the given UserContext. The UserContext MUST be from the + * AuthenticationProvider that created this tunnel, and MUST be associated + * with the user for whom this tunnel was created. + * + * @param userContext + * The UserContext associated with the user for whom this tunnel was + * created. This UserContext MUST be from the AuthenticationProvider + * that created this tunnel. + * + * @param tunnel + * The tunnel whose stream-related instruction should be intercepted if + * interceptStream() is invoked. + */ + public UserTunnel(UserContext userContext, GuacamoleTunnel tunnel) { + super(tunnel); + this.userContext = userContext; + } + + /** + * Returns the UserContext of the user for whom this tunnel was created. + * This UserContext will be the UserContext from the AuthenticationProvider + * that created this tunnel. + * + * @return + * The UserContext of the user for whom this tunnel was created. + */ + public UserContext getUserContext() { + return userContext; + } + + /** + * Returns the ActiveConnection object associated with this tunnel within + * the AuthenticationProvider and UserContext which created the tunnel. If + * the AuthenticationProvider is not tracking active connections, or this + * tunnel is no longer active, this will be null. + * + * @return + * The ActiveConnection object associated with this tunnel, or null if + * this tunnel is no longer active or the AuthenticationProvider which + * created the tunnel is not tracking active connections. + * + * @throws GuacamoleException + * If an error occurs which prevents retrieval of the user's current + * active connections. + */ + public ActiveConnection getActiveConnection() throws GuacamoleException { + + // Pull the UUID of the current tunnel + UUID uuid = getUUID(); + + // Get the directory of active connections + Directory activeConnectionDirectory = userContext.getActiveConnectionDirectory(); + Collection activeConnectionIdentifiers = activeConnectionDirectory.getIdentifiers(); + + // Search all connections for a tunnel which matches this tunnel + for (ActiveConnection activeConnection : activeConnectionDirectory.getAll(activeConnectionIdentifiers)) { + + // If we lack access, continue with next tunnel + GuacamoleTunnel tunnel = activeConnection.getTunnel(); + if (tunnel == null) + continue; + + // Tunnels are equivalent if they have the same UUID + if (uuid.equals(tunnel.getUUID())) + return activeConnection; + + } + + // No active connection associated with this tunnel + return null; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/http/HTTPTunnelRequest.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/http/HTTPTunnelRequest.java new file mode 100644 index 0000000..48de10b --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/http/HTTPTunnelRequest.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.http; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import org.apache.guacamole.tunnel.TunnelRequest; + +/** + * HTTP-specific implementation of TunnelRequest. + */ +public class HTTPTunnelRequest extends TunnelRequest { + + /** + * A copy of the parameters obtained from the HttpServletRequest used to + * construct the HTTPTunnelRequest. + */ + private final Map> parameterMap = + new HashMap>(); + + /** + * Creates a HTTPTunnelRequest which copies and exposes the parameters + * from the given HttpServletRequest. + * + * @param request + * The HttpServletRequest to copy parameter values from. + */ + @SuppressWarnings("unchecked") // getParameterMap() is defined as returning Map + public HTTPTunnelRequest(HttpServletRequest request) { + + // For each parameter + for (Map.Entry mapEntry : ((Map) + request.getParameterMap()).entrySet()) { + + // Get parameter name and corresponding values + String parameterName = mapEntry.getKey(); + List parameterValues = Arrays.asList(mapEntry.getValue()); + + // Store copy of all values in our own map + parameterMap.put( + parameterName, + new ArrayList(parameterValues) + ); + + } + + } + + @Override + public String getParameter(String name) { + List values = getParameterValues(name); + + // Return the first value from the list if available + if (values != null && !values.isEmpty()) + return values.get(0); + + return null; + } + + @Override + public List getParameterValues(String name) { + return parameterMap.get(name); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/http/RestrictedGuacamoleHTTPTunnelServlet.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/http/RestrictedGuacamoleHTTPTunnelServlet.java new file mode 100644 index 0000000..39f4a25 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/http/RestrictedGuacamoleHTTPTunnelServlet.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.http; + +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.servlet.http.HttpServletRequest; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.tunnel.TunnelRequestService; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.servlet.GuacamoleHTTPTunnelServlet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Connects users to a tunnel associated with the authorized connection + * having the given ID. + */ +@Singleton +public class RestrictedGuacamoleHTTPTunnelServlet extends GuacamoleHTTPTunnelServlet { + + /** + * Service for handling tunnel requests. + */ + @Inject + private TunnelRequestService tunnelRequestService; + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(RestrictedGuacamoleHTTPTunnelServlet.class); + + @Override + protected GuacamoleTunnel doConnect(HttpServletRequest request) throws GuacamoleException { + + // Attempt to create HTTP tunnel + GuacamoleTunnel tunnel = tunnelRequestService.createTunnel(new HTTPTunnelRequest(request)); + + // If successful, warn of lack of WebSocket + logger.info("Using HTTP tunnel (not WebSocket). Performance may be sub-optimal."); + + return tunnel; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/http/package-info.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/http/package-info.java new file mode 100644 index 0000000..b791d9a --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/http/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which leverage Guacamole's built-in HTTP tunnel implementation. + */ +package org.apache.guacamole.tunnel.http; + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/package-info.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/package-info.java new file mode 100644 index 0000000..77b1604 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Classes which are common to all tunnel implementations. + */ +package org.apache.guacamole.tunnel; + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/RestrictedGuacamoleWebSocketTunnelEndpoint.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/RestrictedGuacamoleWebSocketTunnelEndpoint.java new file mode 100644 index 0000000..5f6e807 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/RestrictedGuacamoleWebSocketTunnelEndpoint.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket; + +import com.google.inject.Provider; +import java.util.Map; +import javax.websocket.EndpointConfig; +import javax.websocket.HandshakeResponse; +import javax.websocket.Session; +import javax.websocket.server.HandshakeRequest; +import javax.websocket.server.ServerEndpointConfig; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.tunnel.TunnelRequest; +import org.apache.guacamole.tunnel.TunnelRequestService; +import org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint; + +/** + * Tunnel implementation which uses WebSocket as a tunnel backend, rather than + * HTTP, properly parsing connection IDs included in the connection request. + */ +public class RestrictedGuacamoleWebSocketTunnelEndpoint extends GuacamoleWebSocketTunnelEndpoint { + + /** + * Unique string which shall be used to store the TunnelRequest + * associated with a WebSocket connection. + */ + private static final String TUNNEL_REQUEST_PROPERTY = "WS_GUAC_TUNNEL_REQUEST"; + + /** + * Unique string which shall be used to store the TunnelRequestService to + * be used for processing TunnelRequests. + */ + private static final String TUNNEL_REQUEST_SERVICE_PROPERTY = "WS_GUAC_TUNNEL_REQUEST_SERVICE"; + + /** + * Configurator implementation which stores the requested GuacamoleTunnel + * within the user properties. The GuacamoleTunnel will be later retrieved + * during the connection process. + */ + public static class Configurator extends ServerEndpointConfig.Configurator { + + /** + * Provider which provides instances of a service for handling + * tunnel requests. + */ + private final Provider tunnelRequestServiceProvider; + + /** + * Creates a new Configurator which uses the given tunnel request + * service provider to retrieve the necessary service to handle new + * connections requests. + * + * @param tunnelRequestServiceProvider + * The tunnel request service provider to use for all new + * connections. + */ + public Configurator(Provider tunnelRequestServiceProvider) { + this.tunnelRequestServiceProvider = tunnelRequestServiceProvider; + } + + @Override + public void modifyHandshake(ServerEndpointConfig config, + HandshakeRequest request, HandshakeResponse response) { + + super.modifyHandshake(config, request, response); + + // Store tunnel request and tunnel request service for retrieval + // upon WebSocket open + Map userProperties = config.getUserProperties(); + userProperties.clear(); + userProperties.put(TUNNEL_REQUEST_PROPERTY, new WebSocketTunnelRequest(request)); + userProperties.put(TUNNEL_REQUEST_SERVICE_PROPERTY, tunnelRequestServiceProvider.get()); + + } + + } + + @Override + protected GuacamoleTunnel createTunnel(Session session, + EndpointConfig config) throws GuacamoleException { + + Map userProperties = config.getUserProperties(); + + // Get original tunnel request + TunnelRequest tunnelRequest = (TunnelRequest) userProperties.get(TUNNEL_REQUEST_PROPERTY); + if (tunnelRequest == null) + return null; + + // Get tunnel request service + TunnelRequestService tunnelRequestService = (TunnelRequestService) userProperties.get(TUNNEL_REQUEST_SERVICE_PROPERTY); + if (tunnelRequestService == null) + return null; + + // Create and return tunnel + return tunnelRequestService.createTunnel(tunnelRequest); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/WebSocketTunnelModule.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/WebSocketTunnelModule.java new file mode 100644 index 0000000..423b815 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/WebSocketTunnelModule.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket; + +import com.google.inject.Provider; +import com.google.inject.servlet.ServletModule; +import java.util.Arrays; +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import org.apache.guacamole.tunnel.TunnelLoader; +import org.apache.guacamole.tunnel.TunnelRequestService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Loads the JSR-356 WebSocket tunnel implementation. + */ +public class WebSocketTunnelModule extends ServletModule implements TunnelLoader { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(WebSocketTunnelModule.class); + + @Override + public boolean isSupported() { + + try { + + // Attempt to find WebSocket servlet + Class.forName("javax.websocket.Endpoint"); + + // Support found + return true; + + } + + // If no such servlet class, this particular WebSocket support + // is not present + catch (ClassNotFoundException e) {} + catch (NoClassDefFoundError e) {} + + // Support not found + return false; + + } + + @Override + public void configureServlets() { + + logger.info("Loading JSR-356 WebSocket support..."); + + // Get container + ServerContainer container = (ServerContainer) getServletContext().getAttribute("javax.websocket.server.ServerContainer"); + if (container == null) { + logger.warn("ServerContainer attribute required by JSR-356 is missing. Cannot load JSR-356 WebSocket support."); + return; + } + + Provider tunnelRequestServiceProvider = getProvider(TunnelRequestService.class); + + // Build configuration for WebSocket tunnel + ServerEndpointConfig config = + ServerEndpointConfig.Builder.create(RestrictedGuacamoleWebSocketTunnelEndpoint.class, "/websocket-tunnel") + .configurator(new RestrictedGuacamoleWebSocketTunnelEndpoint.Configurator(tunnelRequestServiceProvider)) + .subprotocols(Arrays.asList(new String[]{"guacamole"})) + .build(); + + try { + + // Add configuration to container + container.addEndpoint(config); + + } + catch (DeploymentException e) { + logger.error("Unable to deploy WebSocket tunnel.", e); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/WebSocketTunnelRequest.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/WebSocketTunnelRequest.java new file mode 100644 index 0000000..5f0ad02 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/WebSocketTunnelRequest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket; + +import java.util.List; +import java.util.Map; +import javax.websocket.server.HandshakeRequest; +import org.apache.guacamole.tunnel.TunnelRequest; + +/** + * WebSocket-specific implementation of TunnelRequest. + */ +public class WebSocketTunnelRequest extends TunnelRequest { + + /** + * All parameters passed via HTTP to the WebSocket handshake. + */ + private final Map> handshakeParameters; + + /** + * Creates a TunnelRequest implementation which delegates parameter and + * session retrieval to the given HandshakeRequest. + * + * @param request The HandshakeRequest to wrap. + */ + public WebSocketTunnelRequest(HandshakeRequest request) { + this.handshakeParameters = request.getParameterMap(); + } + + @Override + public String getParameter(String name) { + + // Pull list of values, if present + List values = getParameterValues(name); + if (values == null || values.isEmpty()) + return null; + + // Return first parameter value arbitrarily + return values.get(0); + + } + + @Override + public List getParameterValues(String name) { + return handshakeParameters.get(name); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java new file mode 100644 index 0000000..304e1dd --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java @@ -0,0 +1,366 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty8; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.eclipse.jetty.websocket.WebSocket; +import org.eclipse.jetty.websocket.WebSocket.Connection; +import org.eclipse.jetty.websocket.WebSocketServlet; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.protocol.FilteredGuacamoleWriter; +import org.apache.guacamole.protocol.GuacamoleFilter; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.tunnel.http.HTTPTunnelRequest; +import org.apache.guacamole.tunnel.TunnelRequest; +import org.apache.guacamole.protocol.GuacamoleStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A WebSocketServlet partial re-implementation of GuacamoleTunnelServlet. + */ +public abstract class GuacamoleWebSocketTunnelServlet extends WebSocketServlet { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(GuacamoleWebSocketTunnelServlet.class); + + /** + * The default, minimum buffer size for instructions. + */ + private static final int BUFFER_SIZE = 8192; + + /** + * The opcode of the instruction used to indicate a connection stability + * test ping request or response. Note that this instruction is + * encapsulated within an internal tunnel instruction (with the opcode + * being the empty string), thus this will actually be the value of the + * first element of the received instruction. + */ + private static final String PING_OPCODE = "ping"; + + /** + * Sends the given numeric Guacamole and WebSocket status + * on the given WebSocket connection and closes the + * connection. + * + * @param connection + * The WebSocket connection to close. + * + * @param guacamoleStatusCode + * The numeric Guacamole Status code to send. + * + * @param webSocketCode + * The numeric WebSocket status code to send. + */ + private static void closeConnection(Connection connection, + int guacamoleStatusCode, int webSocketCode) { + + connection.close(webSocketCode, + Integer.toString(guacamoleStatusCode)); + + } + + /** + * Sends the given status on the given WebSocket connection + * and closes the connection. + * + * @param connection + * The WebSocket connection to close. + * + * @param guacStatus + * The status to send. + */ + private static void closeConnection(Connection connection, + GuacamoleStatus guacStatus) { + + closeConnection(connection, guacStatus.getGuacamoleStatusCode(), + guacStatus.getWebSocketCode()); + + } + + @Override + public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) { + + final TunnelRequest tunnelRequest = new HTTPTunnelRequest(request); + + // Return new WebSocket which communicates through tunnel + return new WebSocket.OnTextMessage() { + + /** + * The GuacamoleTunnel associated with the connected WebSocket. If + * the WebSocket has not yet been connected, this will be null. + */ + private GuacamoleTunnel tunnel = null; + + /** + * The active WebSocket connection. This value will always be + * non-null if tunnel is non-null. + */ + private Connection connection = null; + + /** + * Sends a Guacamole instruction along the outbound WebSocket + * connection to the connected Guacamole client. If an instruction + * is already in the process of being sent by another thread, this + * function will block until in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from + * being sent. + */ + private void sendInstruction(String instruction) + throws IOException { + + // NOTE: Synchronization on the non-final remote field here is + // intentional. The outbound websocket connection is only + // sensitive to simultaneous attempts to send messages with + // respect to itself. If the connection changes, then + // synchronization need only be performed in context of the new + // connection + synchronized (connection) { + connection.sendMessage(instruction); + } + + } + + /** + * Sends a Guacamole instruction along the outbound WebSocket + * connection to the connected Guacamole client. If an instruction + * is already in the process of being sent by another thread, this + * function will block until in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from being + * sent. + */ + private void sendInstruction(GuacamoleInstruction instruction) + throws IOException { + sendInstruction(instruction.toString()); + } + + @Override + public void onMessage(String string) { + + // Ignore inbound messages if there is no associated tunnel + if (tunnel == null) + return; + + // Filter received instructions, handling tunnel-internal + // instructions without passing through to guacd + GuacamoleWriter writer = new FilteredGuacamoleWriter(tunnel.acquireWriter(), new GuacamoleFilter() { + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Filter out all tunnel-internal instructions + if (instruction.getOpcode().equals(GuacamoleTunnel.INTERNAL_DATA_OPCODE)) { + + // Respond to ping requests + List args = instruction.getArgs(); + if (args.size() >= 2 && args.get(0).equals(PING_OPCODE)) { + + try { + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + PING_OPCODE, args.get(1) + )); + } + catch (IOException e) { + logger.debug("Unable to send \"ping\" response for WebSocket tunnel.", e); + } + + } + + return null; + + } + + // Pass through all non-internal instructions untouched + return instruction; + + } + + }); + + // Write message received + try { + writer.write(string.toCharArray()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + } + catch (GuacamoleException e) { + logger.debug("WebSocket tunnel write failed.", e); + } + + tunnel.releaseWriter(); + + } + + @Override + public void onOpen(final Connection connection) { + + // Store websocket connection for future use via sendInstruction() + this.connection = connection; + + try { + tunnel = doConnect(tunnelRequest); + } + catch (GuacamoleException e) { + logger.error("Creation of WebSocket tunnel to guacd failed: {}", e.getMessage()); + logger.debug("Error connecting WebSocket tunnel.", e); + closeConnection(connection, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + return; + } + + // Do not start connection if tunnel does not exist + if (tunnel == null) { + closeConnection(connection, GuacamoleStatus.RESOURCE_NOT_FOUND); + return; + } + + Thread readThread = new Thread() { + + @Override + public void run() { + + StringBuilder buffer = new StringBuilder(BUFFER_SIZE); + GuacamoleReader reader = tunnel.acquireReader(); + char[] readMessage; + + try { + + // Send tunnel UUID + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + tunnel.getUUID().toString() + )); + + try { + + // Attempt to read + while ((readMessage = reader.read()) != null) { + + // Buffer message + buffer.append(readMessage); + + // Flush if we expect to wait or buffer is getting full + if (!reader.available() || buffer.length() >= BUFFER_SIZE) { + sendInstruction(buffer.toString()); + buffer.setLength(0); + } + + } + + // No more data + closeConnection(connection, GuacamoleStatus.SUCCESS); + + } + + // Catch any thrown guacamole exception and attempt + // to pass within the WebSocket connection, logging + // each error appropriately. + catch (GuacamoleClientException e) { + logger.info("WebSocket connection terminated: {}", e.getMessage()); + logger.debug("WebSocket connection terminated due to client error.", e); + closeConnection(connection, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + closeConnection(connection, GuacamoleStatus.SUCCESS); + } + catch (GuacamoleException e) { + logger.error("Connection to guacd terminated abnormally: {}", e.getMessage()); + logger.debug("Internal error during connection to guacd.", e); + closeConnection(connection, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + + } + catch (IOException e) { + logger.debug("WebSocket tunnel read failed due to I/O error.", e); + closeConnection(connection, GuacamoleStatus.SERVER_ERROR); + } + + } + + }; + + readThread.start(); + + } + + @Override + public void onClose(int i, String string) { + try { + if (tunnel != null) + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close connection to guacd.", e); + } + } + + }; + + } + + /** + * Called whenever the JavaScript Guacamole client makes a connection + * request. It it up to the implementor of this function to define what + * conditions must be met for a tunnel to be configured and returned as a + * result of this connection request (whether some sort of credentials must + * be specified, for example). + * + * @param request + * The TunnelRequest associated with the connection request received. + * Any parameters specified along with the connection request can be + * read from this object. + * + * @return + * A newly constructed GuacamoleTunnel if successful, null otherwise. + * + * @throws GuacamoleException + * If an error occurs while constructing the GuacamoleTunnel, or if the + * conditions required for connection are not met. + */ + protected abstract GuacamoleTunnel doConnect(TunnelRequest request) + throws GuacamoleException; + +} + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/RestrictedGuacamoleWebSocketTunnelServlet.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/RestrictedGuacamoleWebSocketTunnelServlet.java new file mode 100644 index 0000000..b9e2d3d --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/RestrictedGuacamoleWebSocketTunnelServlet.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty8; + +import javax.inject.Inject; +import javax.inject.Singleton; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.tunnel.TunnelRequestService; +import org.apache.guacamole.tunnel.TunnelRequest; + +/** + * Tunnel servlet implementation which uses WebSocket as a tunnel backend, + * rather than HTTP, properly parsing connection IDs included in the connection + * request. + */ +@Singleton +public class RestrictedGuacamoleWebSocketTunnelServlet extends GuacamoleWebSocketTunnelServlet { + + /** + * Service for handling tunnel requests. + */ + @Inject + private TunnelRequestService tunnelRequestService; + + @Override + protected GuacamoleTunnel doConnect(TunnelRequest request) + throws GuacamoleException { + return tunnelRequestService.createTunnel(request); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/WebSocketTunnelModule.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/WebSocketTunnelModule.java new file mode 100644 index 0000000..3dd7bf1 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/WebSocketTunnelModule.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty8; + +import com.google.inject.servlet.ServletModule; +import org.apache.guacamole.tunnel.TunnelLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Loads the Jetty 8 WebSocket tunnel implementation. + */ +public class WebSocketTunnelModule extends ServletModule implements TunnelLoader { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(WebSocketTunnelModule.class); + + @Override + public boolean isSupported() { + + try { + + // Attempt to find WebSocket servlet + Class.forName("org.apache.guacamole.tunnel.websocket.jetty8.RestrictedGuacamoleWebSocketTunnelServlet"); + + // Support found + return true; + + } + + // If no such servlet class, this particular WebSocket support + // is not present + catch (ClassNotFoundException e) {} + catch (NoClassDefFoundError e) {} + + // Support not found + return false; + + } + + @Override + public void configureServlets() { + + logger.info("Loading Jetty 8 WebSocket support..."); + serve("/websocket-tunnel").with(RestrictedGuacamoleWebSocketTunnelServlet.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/package-info.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/package-info.java new file mode 100644 index 0000000..6f9f698 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Jetty 8 WebSocket tunnel implementation. The classes here require Jetty 8. + */ +package org.apache.guacamole.tunnel.websocket.jetty8; + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java new file mode 100644 index 0000000..6422f57 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java @@ -0,0 +1,372 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty9; + +import java.io.IOException; +import java.util.List; +import org.eclipse.jetty.websocket.api.CloseStatus; +import org.eclipse.jetty.websocket.api.RemoteEndpoint; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.WebSocketListener; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.FilteredGuacamoleWriter; +import org.apache.guacamole.protocol.GuacamoleFilter; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.protocol.GuacamoleStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * WebSocket listener implementation which provides a Guacamole tunnel + */ +public abstract class GuacamoleWebSocketTunnelListener implements WebSocketListener { + + /** + * The default, minimum buffer size for instructions. + */ + private static final int BUFFER_SIZE = 8192; + + /** + * The opcode of the instruction used to indicate a connection stability + * test ping request or response. Note that this instruction is + * encapsulated within an internal tunnel instruction (with the opcode + * being the empty string), thus this will actually be the value of the + * first element of the received instruction. + */ + private static final String PING_OPCODE = "ping"; + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(RestrictedGuacamoleWebSocketTunnelServlet.class); + + /** + * The underlying GuacamoleTunnel. WebSocket reads/writes will be handled + * as reads/writes to this tunnel. This value may be null if no connection + * has been established. + */ + private GuacamoleTunnel tunnel; + + /** + * Remote (client) side of this connection. This value will always be + * non-null if tunnel is non-null. + */ + private RemoteEndpoint remote; + + /** + * Sends the given numeric Guacamole and WebSocket status + * codes on the given WebSocket connection and closes the + * connection. + * + * @param session + * The outbound WebSocket connection to close. + * + * @param guacamoleStatusCode + * The numeric Guacamole status code to send. + * + * @param webSocketCode + * The numeric WebSocket status code to send. + */ + private void closeConnection(Session session, int guacamoleStatusCode, + int webSocketCode) { + + try { + String message = Integer.toString(guacamoleStatusCode); + session.close(new CloseStatus(webSocketCode, message)); + } + catch (IOException e) { + logger.debug("Unable to close WebSocket connection.", e); + } + + } + + /** + * Sends the given status on the given WebSocket connection + * and closes the connection. + * + * @param session + * The outbound WebSocket connection to close. + * + * @param guacStatus + * The status to send. + */ + private void closeConnection(Session session, + GuacamoleStatus guacStatus) { + + closeConnection(session, guacStatus.getGuacamoleStatusCode(), + guacStatus.getWebSocketCode()); + + } + + /** + * Sends a Guacamole instruction along the outbound WebSocket connection to + * the connected Guacamole client. If an instruction is already in the + * process of being sent by another thread, this function will block until + * in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from being + * sent. + */ + private void sendInstruction(String instruction) + throws IOException { + + // NOTE: Synchronization on the non-final remote field here is + // intentional. The remote (the outbound websocket connection) is only + // sensitive to simultaneous attempts to send messages with respect to + // itself. If the remote changes, then the outbound websocket + // connection has changed, and synchronization need only be performed + // in context of the new remote. + synchronized (remote) { + remote.sendString(instruction); + } + + } + + /** + * Sends a Guacamole instruction along the outbound WebSocket connection to + * the connected Guacamole client. If an instruction is already in the + * process of being sent by another thread, this function will block until + * in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from being + * sent. + */ + private void sendInstruction(GuacamoleInstruction instruction) + throws IOException { + sendInstruction(instruction.toString()); + } + + /** + * Returns a new tunnel for the given session. How this tunnel is created + * or retrieved is implementation-dependent. + * + * @param session The session associated with the active WebSocket + * connection. + * @return A connected tunnel, or null if no such tunnel exists. + * @throws GuacamoleException If an error occurs while retrieving the + * tunnel, or if access to the tunnel is denied. + */ + protected abstract GuacamoleTunnel createTunnel(Session session) + throws GuacamoleException; + + @Override + public void onWebSocketConnect(final Session session) { + + // Store underlying remote for future use via sendInstruction() + remote = session.getRemote(); + + try { + + // Get tunnel + tunnel = createTunnel(session); + if (tunnel == null) { + closeConnection(session, GuacamoleStatus.RESOURCE_NOT_FOUND); + return; + } + + } + catch (GuacamoleException e) { + logger.error("Creation of WebSocket tunnel to guacd failed: {}", e.getMessage()); + logger.debug("Error connecting WebSocket tunnel.", e); + closeConnection(session, e.getStatus().getGuacamoleStatusCode(), e.getWebSocketCode()); + return; + } + + // Prepare read transfer thread + Thread readThread = new Thread() { + + @Override + public void run() { + + StringBuilder buffer = new StringBuilder(BUFFER_SIZE); + GuacamoleReader reader = tunnel.acquireReader(); + char[] readMessage; + + try { + + // Send tunnel UUID + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + tunnel.getUUID().toString() + )); + + try { + + // Attempt to read + while ((readMessage = reader.read()) != null) { + + // Buffer message + buffer.append(readMessage); + + // Flush if we expect to wait or buffer is getting full + if (!reader.available() || buffer.length() >= BUFFER_SIZE) { + sendInstruction(buffer.toString()); + buffer.setLength(0); + } + + } + + // No more data + closeConnection(session, GuacamoleStatus.SUCCESS); + + } + + // Catch any thrown guacamole exception and attempt + // to pass within the WebSocket connection, logging + // each error appropriately. + catch (GuacamoleClientException e) { + logger.info("WebSocket connection terminated: {}", e.getMessage()); + logger.debug("WebSocket connection terminated due to client error.", e); + closeConnection(session, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + closeConnection(session, GuacamoleStatus.SUCCESS); + } + catch (GuacamoleException e) { + logger.error("Connection to guacd terminated abnormally: {}", e.getMessage()); + logger.debug("Internal error during connection to guacd.", e); + closeConnection(session, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + + } + catch (IOException e) { + logger.debug("I/O error prevents further reads.", e); + closeConnection(session, GuacamoleStatus.SERVER_ERROR); + } + + } + + }; + + readThread.start(); + + } + + @Override + public void onWebSocketText(String message) { + + // Ignore inbound messages if there is no associated tunnel + if (tunnel == null) + return; + + // Filter received instructions, handling tunnel-internal instructions + // without passing through to guacd + GuacamoleWriter writer = new FilteredGuacamoleWriter(tunnel.acquireWriter(), new GuacamoleFilter() { + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Filter out all tunnel-internal instructions + if (instruction.getOpcode().equals(GuacamoleTunnel.INTERNAL_DATA_OPCODE)) { + + // Respond to ping requests + List args = instruction.getArgs(); + if (args.size() >= 2 && args.get(0).equals(PING_OPCODE)) { + + try { + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + PING_OPCODE, args.get(1) + )); + } + catch (IOException e) { + logger.debug("Unable to send \"ping\" response for WebSocket tunnel.", e); + } + + } + + return null; + + } + + // Pass through all non-internal instructions untouched + return instruction; + + } + + }); + + try { + // Write received message + writer.write(message.toCharArray()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + } + catch (GuacamoleException e) { + logger.debug("WebSocket tunnel write failed.", e); + } + + tunnel.releaseWriter(); + + } + + @Override + public void onWebSocketBinary(byte[] payload, int offset, int length) { + throw new UnsupportedOperationException("Binary WebSocket messages are not supported."); + } + + @Override + public void onWebSocketError(Throwable t) { + + logger.debug("WebSocket tunnel closing due to error.", t); + + try { + if (tunnel != null) + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close connection to guacd.", e); + } + + } + + + @Override + public void onWebSocketClose(int statusCode, String reason) { + + try { + if (tunnel != null) + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close connection to guacd.", e); + } + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketCreator.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketCreator.java new file mode 100644 index 0000000..97489f5 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketCreator.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty9; + +import org.eclipse.jetty.websocket.api.UpgradeRequest; +import org.eclipse.jetty.websocket.api.UpgradeResponse; +import org.eclipse.jetty.websocket.servlet.WebSocketCreator; +import org.apache.guacamole.tunnel.TunnelRequestService; + +/** + * WebSocketCreator which selects the appropriate WebSocketListener + * implementation if the "guacamole" subprotocol is in use. + */ +public class RestrictedGuacamoleWebSocketCreator implements WebSocketCreator { + + /** + * Service for handling tunnel requests. + */ + private final TunnelRequestService tunnelRequestService; + + /** + * Creates a new WebSocketCreator which uses the given TunnelRequestService + * to create new GuacamoleTunnels for inbound requests. + * + * @param tunnelRequestService The service to use for inbound tunnel + * requests. + */ + public RestrictedGuacamoleWebSocketCreator(TunnelRequestService tunnelRequestService) { + this.tunnelRequestService = tunnelRequestService; + } + + @Override + public Object createWebSocket(UpgradeRequest request, UpgradeResponse response) { + + // Validate and use "guacamole" subprotocol + for (String subprotocol : request.getSubProtocols()) { + + if ("guacamole".equals(subprotocol)) { + response.setAcceptedSubProtocol(subprotocol); + return new RestrictedGuacamoleWebSocketTunnelListener(tunnelRequestService); + } + + } + + // Invalid protocol + return null; + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketTunnelListener.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketTunnelListener.java new file mode 100644 index 0000000..48fad55 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketTunnelListener.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty9; + +import org.eclipse.jetty.websocket.api.Session; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.tunnel.TunnelRequestService; + +/** + * WebSocket listener implementation which properly parses connection IDs + * included in the connection request. + */ +public class RestrictedGuacamoleWebSocketTunnelListener extends GuacamoleWebSocketTunnelListener { + + /** + * Service for handling tunnel requests. + */ + private final TunnelRequestService tunnelRequestService; + + /** + * Creates a new WebSocketListener which uses the given TunnelRequestService + * to create new GuacamoleTunnels for inbound requests. + * + * @param tunnelRequestService The service to use for inbound tunnel + * requests. + */ + public RestrictedGuacamoleWebSocketTunnelListener(TunnelRequestService tunnelRequestService) { + this.tunnelRequestService = tunnelRequestService; + } + + @Override + protected GuacamoleTunnel createTunnel(Session session) throws GuacamoleException { + return tunnelRequestService.createTunnel(new WebSocketTunnelRequest(session.getUpgradeRequest())); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketTunnelServlet.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketTunnelServlet.java new file mode 100644 index 0000000..2b60216 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/RestrictedGuacamoleWebSocketTunnelServlet.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty9; + +import javax.inject.Inject; +import javax.inject.Singleton; +import org.eclipse.jetty.websocket.servlet.WebSocketServlet; +import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; +import org.apache.guacamole.tunnel.TunnelRequestService; + +/** + * A WebSocketServlet partial re-implementation of GuacamoleTunnelServlet. + */ +@Singleton +public class RestrictedGuacamoleWebSocketTunnelServlet extends WebSocketServlet { + + /** + * Service for handling tunnel requests. + */ + @Inject + private TunnelRequestService tunnelRequestService; + + @Override + public void configure(WebSocketServletFactory factory) { + + // Register WebSocket implementation + factory.setCreator(new RestrictedGuacamoleWebSocketCreator(tunnelRequestService)); + + } + +} + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/WebSocketTunnelModule.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/WebSocketTunnelModule.java new file mode 100644 index 0000000..5366672 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/WebSocketTunnelModule.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty9; + +import com.google.inject.servlet.ServletModule; +import org.apache.guacamole.tunnel.TunnelLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Loads the Jetty 9 WebSocket tunnel implementation. + */ +public class WebSocketTunnelModule extends ServletModule implements TunnelLoader { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(WebSocketTunnelModule.class); + + @Override + public boolean isSupported() { + + try { + + // Attempt to find WebSocket servlet + Class.forName("org.apache.guacamole.tunnel.websocket.jetty9.RestrictedGuacamoleWebSocketTunnelServlet"); + + // Support found + return true; + + } + + // If no such servlet class, this particular WebSocket support + // is not present + catch (ClassNotFoundException e) {} + catch (NoClassDefFoundError e) {} + + // Support not found + return false; + + } + + @Override + public void configureServlets() { + + logger.info("Loading Jetty 9 WebSocket support..."); + serve("/websocket-tunnel").with(RestrictedGuacamoleWebSocketTunnelServlet.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/WebSocketTunnelRequest.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/WebSocketTunnelRequest.java new file mode 100644 index 0000000..2875bc9 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/WebSocketTunnelRequest.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.jetty9; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.eclipse.jetty.websocket.api.UpgradeRequest; +import org.apache.guacamole.tunnel.TunnelRequest; + +/** + * Jetty 9 WebSocket-specific implementation of TunnelRequest. + */ +public class WebSocketTunnelRequest extends TunnelRequest { + + /** + * All parameters passed via HTTP to the WebSocket handshake. + */ + private final Map handshakeParameters; + + /** + * Creates a TunnelRequest implementation which delegates parameter and + * session retrieval to the given UpgradeRequest. + * + * @param request The UpgradeRequest to wrap. + */ + public WebSocketTunnelRequest(UpgradeRequest request) { + this.handshakeParameters = request.getParameterMap(); + } + + @Override + public String getParameter(String name) { + + // Pull list of values, if present + List values = getParameterValues(name); + if (values == null || values.isEmpty()) + return null; + + // Return first parameter value arbitrarily + return values.get(0); + + } + + @Override + public List getParameterValues(String name) { + + String[] values = handshakeParameters.get(name); + if (values == null) + return null; + + return Arrays.asList(values); + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/package-info.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/package-info.java new file mode 100644 index 0000000..ca23366 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Jetty 9 WebSocket tunnel implementation. The classes here require at least + * Jetty 9, prior to Jetty 9.1 (when support for JSR 356 was implemented). + */ +package org.apache.guacamole.tunnel.websocket.jetty9; + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/package-info.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/package-info.java new file mode 100644 index 0000000..62590be --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/package-info.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Standard WebSocket tunnel implementation. The classes here require a recent + * servlet container that supports JSR 356. + */ +package org.apache.guacamole.tunnel.websocket; + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java new file mode 100644 index 0000000..215cc8f --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java @@ -0,0 +1,399 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.tomcat; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.io.GuacamoleReader; +import org.apache.guacamole.io.GuacamoleWriter; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.catalina.websocket.StreamInbound; +import org.apache.catalina.websocket.WebSocketServlet; +import org.apache.catalina.websocket.WsOutbound; +import org.apache.guacamole.GuacamoleClientException; +import org.apache.guacamole.GuacamoleConnectionClosedException; +import org.apache.guacamole.protocol.FilteredGuacamoleWriter; +import org.apache.guacamole.protocol.GuacamoleFilter; +import org.apache.guacamole.protocol.GuacamoleInstruction; +import org.apache.guacamole.tunnel.http.HTTPTunnelRequest; +import org.apache.guacamole.tunnel.TunnelRequest; +import org.apache.guacamole.protocol.GuacamoleStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A WebSocketServlet partial re-implementation of GuacamoleTunnelServlet. + */ +public abstract class GuacamoleWebSocketTunnelServlet extends WebSocketServlet { + + /** + * The default, minimum buffer size for instructions. + */ + private static final int BUFFER_SIZE = 8192; + + /** + * The opcode of the instruction used to indicate a connection stability + * test ping request or response. Note that this instruction is + * encapsulated within an internal tunnel instruction (with the opcode + * being the empty string), thus this will actually be the value of the + * first element of the received instruction. + */ + private static final String PING_OPCODE = "ping"; + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(GuacamoleWebSocketTunnelServlet.class); + + /** + * Sends the given Guacamole and WebSocket numeric status + * on the given WebSocket connection and closes the + * connection. + * + * @param outbound + * The outbound WebSocket connection to close. + * + * @param guacamoleStatusCode + * The status to send. + * + * @param webSocketCode + * The numeric WebSocket status code to send. + */ + private void closeConnection(WsOutbound outbound, int guacamoleStatusCode, + int webSocketCode) { + + try { + byte[] message = Integer.toString(guacamoleStatusCode).getBytes("UTF-8"); + outbound.close(webSocketCode, ByteBuffer.wrap(message)); + } + catch (IOException e) { + logger.debug("Unable to close WebSocket tunnel.", e); + } + + } + + /** + * Sends the given status on the given WebSocket connection + * and closes the connection. + * + * @param outbound + * The outbound WebSocket connection to close. + * + * @param guacStatus + * The status to send. + */ + private void closeConnection(WsOutbound outbound, + GuacamoleStatus guacStatus) { + + closeConnection(outbound, guacStatus.getGuacamoleStatusCode(), + guacStatus.getWebSocketCode()); + + } + + @Override + protected String selectSubProtocol(List subProtocols) { + + // Search for expected protocol + for (String protocol : subProtocols) + if ("guacamole".equals(protocol)) + return "guacamole"; + + // Otherwise, fail + return null; + + } + + @Override + public StreamInbound createWebSocketInbound(String protocol, + HttpServletRequest request) { + + final TunnelRequest tunnelRequest = new HTTPTunnelRequest(request); + + // Return new WebSocket which communicates through tunnel + return new StreamInbound() { + + /** + * The GuacamoleTunnel associated with the connected WebSocket. If + * the WebSocket has not yet been connected, this will be null. + */ + private GuacamoleTunnel tunnel = null; + + /** + * The outbound half of the WebSocket connection. This value will + * always be non-null if tunnel is non-null. + */ + private WsOutbound outbound = null; + + /** + * Sends a Guacamole instruction along the outbound WebSocket + * connection to the connected Guacamole client. If an instruction + * is already in the process of being sent by another thread, this + * function will block until in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from + * being sent. + */ + private void sendInstruction(CharSequence instruction) + throws IOException { + + // NOTE: Synchronization on the non-final remote field here is + // intentional. The outbound websocket connection is only + // sensitive to simultaneous attempts to send messages with + // respect to itself. If the connection changes, then + // synchronization need only be performed in context of the new + // connection + synchronized (outbound) { + outbound.writeTextMessage(CharBuffer.wrap(instruction)); + } + + } + + /** + * Sends a Guacamole instruction along the outbound WebSocket + * connection to the connected Guacamole client. If an instruction + * is already in the process of being sent by another thread, this + * function will block until in-progress instructions are complete. + * + * @param instruction + * The instruction to send. + * + * @throws IOException + * If an I/O error occurs preventing the given instruction from being + * sent. + */ + private void sendInstruction(GuacamoleInstruction instruction) + throws IOException { + sendInstruction(instruction.toString()); + } + + @Override + protected void onTextData(Reader reader) throws IOException { + + // Ignore inbound messages if there is no associated tunnel + if (tunnel == null) + return; + + // Filter received instructions, handling tunnel-internal + // instructions without passing through to guacd + GuacamoleWriter writer = new FilteredGuacamoleWriter(tunnel.acquireWriter(), new GuacamoleFilter() { + + @Override + public GuacamoleInstruction filter(GuacamoleInstruction instruction) + throws GuacamoleException { + + // Filter out all tunnel-internal instructions + if (instruction.getOpcode().equals(GuacamoleTunnel.INTERNAL_DATA_OPCODE)) { + + // Respond to ping requests + List args = instruction.getArgs(); + if (args.size() >= 2 && args.get(0).equals(PING_OPCODE)) { + + try { + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + PING_OPCODE, args.get(1) + )); + } + catch (IOException e) { + logger.debug("Unable to send \"ping\" response for WebSocket tunnel.", e); + } + + } + + return null; + + } + + // Pass through all non-internal instructions untouched + return instruction; + + } + + }); + + // Write all available data + try { + + char[] buffer = new char[BUFFER_SIZE]; + + int num_read; + while ((num_read = reader.read(buffer)) > 0) + writer.write(buffer, 0, num_read); + + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + } + catch (GuacamoleException e) { + logger.debug("WebSocket tunnel write failed.", e); + } + + tunnel.releaseWriter(); + } + + @Override + public void onOpen(final WsOutbound outbound) { + + // Store outbound connection for future use via sendInstruction() + this.outbound = outbound; + + try { + tunnel = doConnect(tunnelRequest); + } + catch (GuacamoleException e) { + logger.error("Creation of WebSocket tunnel to guacd failed: {}", e.getMessage()); + logger.debug("Error connecting WebSocket tunnel.", e); + closeConnection(outbound, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + return; + } + + // Do not start connection if tunnel does not exist + if (tunnel == null) { + closeConnection(outbound, GuacamoleStatus.RESOURCE_NOT_FOUND); + return; + } + + Thread readThread = new Thread() { + + @Override + public void run() { + + StringBuilder buffer = new StringBuilder(BUFFER_SIZE); + GuacamoleReader reader = tunnel.acquireReader(); + char[] readMessage; + + try { + + // Send tunnel UUID + sendInstruction(new GuacamoleInstruction( + GuacamoleTunnel.INTERNAL_DATA_OPCODE, + tunnel.getUUID().toString() + )); + + try { + + // Attempt to read + while ((readMessage = reader.read()) != null) { + + // Buffer message + buffer.append(readMessage); + + // Flush if we expect to wait or buffer is getting full + if (!reader.available() || buffer.length() >= BUFFER_SIZE) { + sendInstruction(CharBuffer.wrap(buffer)); + buffer.setLength(0); + } + + } + + // No more data + closeConnection(outbound, GuacamoleStatus.SUCCESS); + + } + + // Catch any thrown guacamole exception and attempt + // to pass within the WebSocket connection, logging + // each error appropriately. + catch (GuacamoleClientException e) { + logger.info("WebSocket connection terminated: {}", e.getMessage()); + logger.debug("WebSocket connection terminated due to client error.", e); + closeConnection(outbound, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + catch (GuacamoleConnectionClosedException e) { + logger.debug("Connection to guacd closed.", e); + closeConnection(outbound, GuacamoleStatus.SUCCESS); + } + catch (GuacamoleException e) { + logger.error("Connection to guacd terminated abnormally: {}", e.getMessage()); + logger.debug("Internal error during connection to guacd.", e); + closeConnection(outbound, e.getStatus().getGuacamoleStatusCode(), + e.getWebSocketCode()); + } + + } + catch (IOException e) { + logger.debug("I/O error prevents further reads.", e); + closeConnection(outbound, GuacamoleStatus.SERVER_ERROR); + } + + } + + }; + + readThread.start(); + + } + + @Override + public void onClose(int i) { + try { + if (tunnel != null) + tunnel.close(); + } + catch (GuacamoleException e) { + logger.debug("Unable to close connection to guacd.", e); + } + } + + @Override + protected void onBinaryData(InputStream in) throws IOException { + throw new UnsupportedOperationException("Not supported yet."); + } + + }; + + } + + /** + * Called whenever the JavaScript Guacamole client makes a connection + * request. It it up to the implementor of this function to define what + * conditions must be met for a tunnel to be configured and returned as a + * result of this connection request (whether some sort of credentials must + * be specified, for example). + * + * @param request + * The TunnelRequest associated with the connection request received. + * Any parameters specified along with the connection request can be + * read from this object. + * + * @return + * A newly constructed GuacamoleTunnel if successful, null otherwise. + * + * @throws GuacamoleException + * If an error occurs while constructing the GuacamoleTunnel, or if the + * conditions required for connection are not met. + */ + protected abstract GuacamoleTunnel doConnect(TunnelRequest request) + throws GuacamoleException; + +} + diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/RestrictedGuacamoleWebSocketTunnelServlet.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/RestrictedGuacamoleWebSocketTunnelServlet.java new file mode 100644 index 0000000..5101495 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/RestrictedGuacamoleWebSocketTunnelServlet.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.tomcat; + +import javax.inject.Inject; +import javax.inject.Singleton; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.tunnel.TunnelRequestService; +import org.apache.guacamole.tunnel.TunnelRequest; + +/** + * Tunnel servlet implementation which uses WebSocket as a tunnel backend, + * rather than HTTP, properly parsing connection IDs included in the connection + * request. + */ +@Singleton +public class RestrictedGuacamoleWebSocketTunnelServlet extends GuacamoleWebSocketTunnelServlet { + + /** + * Service for handling tunnel requests. + */ + @Inject + private TunnelRequestService tunnelRequestService; + + @Override + protected GuacamoleTunnel doConnect(TunnelRequest request) + throws GuacamoleException { + return tunnelRequestService.createTunnel(request); + }; + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/WebSocketTunnelModule.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/WebSocketTunnelModule.java new file mode 100644 index 0000000..5529fab --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/WebSocketTunnelModule.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.tunnel.websocket.tomcat; + +import com.google.inject.servlet.ServletModule; +import org.apache.guacamole.tunnel.TunnelLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Loads the Jetty 9 WebSocket tunnel implementation. + */ +public class WebSocketTunnelModule extends ServletModule implements TunnelLoader { + + /** + * Logger for this class. + */ + private final Logger logger = LoggerFactory.getLogger(WebSocketTunnelModule.class); + + @Override + public boolean isSupported() { + + try { + + // Attempt to find WebSocket servlet + Class.forName("org.apache.guacamole.tunnel.websocket.tomcat.RestrictedGuacamoleWebSocketTunnelServlet"); + + // Support found + return true; + + } + + // If no such servlet class, this particular WebSocket support + // is not present + catch (ClassNotFoundException e) {} + catch (NoClassDefFoundError e) {} + + // Support not found + return false; + + } + + @Override + public void configureServlets() { + + logger.info("Loading Tomcat 7 WebSocket support..."); + serve("/websocket-tunnel").with(RestrictedGuacamoleWebSocketTunnelServlet.class); + + } + +} diff --git a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/package-info.java b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/package-info.java new file mode 100644 index 0000000..4606e43 --- /dev/null +++ b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/package-info.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Tomcat WebSocket tunnel implementation. The classes here require at least + * Tomcat 7.0, and may change significantly as there is no common WebSocket + * API for Java yet. + */ +package org.apache.guacamole.tunnel.websocket.tomcat; + diff --git a/guacamole/src/main/webapp/WEB-INF/web.xml b/guacamole/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..ba1f611 --- /dev/null +++ b/guacamole/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,64 @@ + + + + + + + index.html + + + + + cacheRevalidationFilter + org.apache.guacamole.CacheRevalidationFilter + + + cacheRevalidationFilter + /index.html + + + + + guiceFilter + com.google.inject.servlet.GuiceFilter + + + guiceFilter + /* + + + org.apache.guacamole.GuacamoleServletContextListener + + + + + mp3 + audio/mpeg + + + ogg + audio/ogg + + + diff --git a/guacamole/util/check-translation.py b/guacamole/util/check-translation.py new file mode 100755 index 0000000..25de49c --- /dev/null +++ b/guacamole/util/check-translation.py @@ -0,0 +1,309 @@ +#!/usr/bin/python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import argparse +import json +import os +import re +import sys + +parser = argparse.ArgumentParser(description='Compares two JSON translation ' + 'files, as used by the Apache Guacamole web application, listing ' + 'the strings which appear to be missing or incorrect.') + +parser.add_argument('--no-missing', dest='check_missing', action='store_false', + help='Disables checking for strings which are present in ORIGINAL but ' + 'are missing from TRANSLATED. Assuming ORIGINAL represents the set of ' + 'strings actually used by the web application, these strings are ' + 'those which are missing and need to be defined for the translation ' + 'to be complete. By default, the comparison will check for missing ' + 'translations.') + +parser.add_argument('--no-unused', dest='check_unused', action='store_false', + help='Disables checking for strings which are present in TRANSLATED ' + 'but not in ORIGINAL. Assuming ORIGINAL represents the set of strings ' + 'actually used by the web application, these strings are those which ' + 'are defined by the translation but unused. By default, the ' + 'comparison will check for unused translations.') + +parser.add_argument('--check-copied', action='store_true', help='Enables ' + 'checking for strings defined in TRANSLATED which are identical to ' + 'the corresponding strings in ORIGINAL. Such strings may have been ' + 'incorrectly copied verbatim from the original without being ' + 'translated at all. It is also possible that both languages simply ' + 'use the same text for that string, and the string is correct. As ' + 'this test can produce false positives, it is disabled by default.') + +parser.add_argument('ORIGINAL', nargs='?', help='The JSON file which should ' + 'be used as the basis for comparison. This should be JSON which can ' + 'be expected to contain every string used by the web application and ' + 'no others. Typically, this will be the primary, original language of ' + 'the web application. In the case of Apache Guacamole, this should be ' + 'English. If omitted, the file "en.json" within the same directory ' + 'as TRANSLATED will be used by default.') + +parser.add_argument('TRANSLATED', help='The JSON file which should be ' + 'compared against ORIGINAL. This should be the JSON which has been ' + 'translated from ORIGINAL, and thus should contain the same set of ' + 'strings if the translation is complete.') + +args = parser.parse_args() + +def flatten_strings(translation, prefix=u''): + """Reads all translation strings from the given JSON, taking into account + namespacing, flattening nested namespaces into a single set of key/value + pairs. + + For example, the following call: + + flatten_strings({ + u'TOP' : { + u'LETTERS' : { + u'A' : u'A', + u'B' : u'B' + }, + u'NUMBERS' : { + u'ONE' : u'1', + u'TWO' : u'2', + u'THREE' : u'3' + } + } + }) + + would return: + + { + u'TOP.LETTERS.A' : u'A', + u'TOP.LETTERS.B' : u'B', + u'TOP.NUMBERS.ONE' : u'1', + u'TOP.NUMBERS.TWO' : u'2', + u'TOP.NUMBERS.THREE' : u'3' + } + + Parameters + ---------- + translation : dict or unicode + The dict object to read translation strings from, where each key is a + translation key or namespace and each value is a translation string or + a dict containing the translations nested within that namespace. + this object is simply a Unicode string, it will be assumed to be the + value of a translation string, and the prefix provided will be assumed + to be the name. + + prefix : unicode, optional + The namespace prefix to apply to all translation strings within the + given object, if any. This parameter is optional. If omitted, an empty + string will be used. + + Returns + ------- + dict + An dict whose properties are the names of all translation strings + contained within the given object. + + """ + + strings = {} + + # If the provided object is a string, the prefix is the string name + if isinstance(translation, unicode): + strings[prefix] = translation + return strings + + # Otherwise, if the prefix is non-empty, append a period for children + if prefix: + prefix += u'.' + + # For each property of the given object, read all string names + for key, child in translation.items(): + + # Add all string names within the child under its prefix + for flattened, value in flatten_strings(child, prefix + key).items(): + strings[flattened] = value + + return strings + +class Translation: + """A set of namespaced translation strings read from a JSON file, as + supported by angular-translate and used by Apache Guacamole. + + Attributes + ---------- + lang_key : unicode + The unique key identifying the JSON translation file and the language + within that file. This will simply be the filename without the ".json" + extension. + lang_name : unicode + The name of the language as defined within the JSON translation file by + the special "NAME" key. Not all translations will define a "NAME", as + some translations (those provided by Guacamole extensions) are used as + overlays for the base translation for that language defined at the web + application level. If no "NAME" key is present, `lang_name` will be + `None`. + strings : dict + The flattened set of translation key/value pairs. Each key will contain + all applicable namespaces, separated by periods, as produced by + `flatten_strings()`. There will be no nested keys. + + """ + + + def __init__(self, path): + """ + Parses the details and contents of the JSON translation file at the + given path. + + Parameters + ---------- + path : str + The path to the JSON file containing the translation to be read. + + """ + + json_data = open(path).read() + filename = os.path.basename(path) + + self.lang_key = os.path.splitext(filename)[0] + self.strings = flatten_strings(json.loads(json_data)) + self.lang_name = self.strings.get(u'NAME', None) + + def get_missing(self, expected): + """Returns a list of translation keys which are present in the given + translation but missing from this translation. + + Parameters + ---------- + expected : Translation + The translation to compare this translation against. + + Returns + ------- + list + A list of translation keys which are present in the given + translation but are NOT present in this translation. + + """ + return [ key for key in expected.strings if not key in self.strings ] + + def get_identical(self, other): + """Returns a list of translation keys which map to the same exact value + in both this translation and the given translation. + + Parameters + ---------- + other : Translation + The translation to compare this translation against. + + Returns + ------- + list + A list of translation keys which map to the same exact value in + both translations. + + """ + return [ key for key, value in self.strings.items() + if key in other.strings and other.strings[key] == value ] + +# +# Translation keys which are expected to always be inherited from the base +# translation and thus should be missing from all translations +# + +expected_missing = { + u'APP.NAME', + u'APP.VERSION' +} + +# +# Regular expression which matches strings that are expected to be copied +# verbatim +# + +expected_copied = re.compile('|'.join([ + '^$', # Empty string + '^@:', # References to other strings + '^\\d+$', # Numbers + '^(VNC|RDP|SSH|SFTP|Telnet)$', # Protocol names + '^(Apache )?Guacamole$' # Guacamole itself +])) + +# +# Read provided input files +# + +orig = Translation(args.ORIGINAL + or '{}/en.json'.format(os.path.dirname(args.TRANSLATED))) + +trans = Translation(args.TRANSLATED) + +print u'Original language: {} ({})'.format(orig.lang_key, orig.lang_name) +print u'Translation language: {} ({})'.format(trans.lang_key, trans.lang_name) + +# Ignore keys that are expected to be missing +orig.strings = { key:value for key, value in orig.strings.items() + if key not in expected_missing } + +# +# Perform requested tests +# + +missing = trans.get_missing(orig) if args.check_missing else [] +unused = orig.get_missing(trans) if args.check_unused else [] +copied = orig.get_identical(trans) if args.check_copied else [] + +# Exclude keys which are expected to be copied +copied = [ key for key in copied + if not expected_copied.match(orig.strings[key]) ] + +# +# Group any errors encountered by type +# + +if missing: + print('\nThe following strings are missing from the translation and ' + 'should be added:\n') + for name in sorted(missing): + print ' {}'.format(name) + +if unused: + print('\nThe following strings are either NOT defined for the original ' + 'language or are expected to be inherited from the original ' + 'language and should be removed:\n') + for name in sorted(unused): + print ' {}'.format(name) + +if copied: + print('\nThe following strings are identical to the original language ' + 'and MIGHT be untranslated:\n') + for name in sorted(copied): + print ' {}'.format(name) + +# +# Count total number of errors and summarize result +# + +errors = len(missing) + len(unused) + len(copied) + +if errors: + print '\n{} error(s) total.'.format(errors) + sys.exit(1) + +print '\nCheck completed successfully. No errors.' + diff --git a/guacamole/util/run-npm.sh b/guacamole/util/run-npm.sh new file mode 100755 index 0000000..6b688f0 --- /dev/null +++ b/guacamole/util/run-npm.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# +# run-npm.sh - Convenience script for automatically running the version of NPM +# used by the "guacamole" build. All command-line options given to this script +# are passed directly to NPM. The Guacamole build must have run at least once, +# even unsuccessfully, for copies of Node.js and NPM to have been downloaded. +# + +## +## The directory containing this script. +## +UTIL_DIR="`dirname "$0"`" + +## +## The directory containing the "guacamole" project. +## +PROJECT_DIR="$UTIL_DIR/.." + +## +## The directory containing copies of Node.js and NPM that were downloaded by +## the "guacamole" project build process. +## +NODE_DIR="$PROJECT_DIR/target/node" + +# Invoke NPM with provided arguments, using the Node.js and NPM versions +# downloaded by the "guacamole" project build +exec "$NODE_DIR/node" "$NODE_DIR/node_modules/npm/bin/npm-cli.js" "$@" + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..098b386 --- /dev/null +++ b/pom.xml @@ -0,0 +1,580 @@ + + + + + 4.0.0 + org.apache.guacamole + guacamole-client + pom + 1.6.0 + guacamole-client + http://guacamole.apache.org/ + + + + + UTF-8 + + + 32.1.3-jre + 5.1.0 + 2.6.1 + 5.5.1 + 2.18.3 + 2.18.3 + 2.46 + 5.12.0 + 4.13.2 + 1.3.15 + 2.0.17 + + + ${project.build.directory}/dependencies + + + false + + + false + + + + + + + guacamole + + + guacamole-common + + + guacamole-ext + + + guacamole-common-js + + + extensions + + + doc/guacamole-example + doc/guacamole-playback-example + + + + + + + + + org.apache.rat + apache-rat-plugin + 0.13 + + + validate-licenses + validate + + check + + + ${basedir}/.ratignore + + .dockerignore + .ratignore + **/*.md + **/*.json + **/*.svg + **/node_modules/**/* + **/templates/*.html + src/licenses/**/* + target/**/* + + ${ignoreLicenseErrors} + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + + + define-project-root + + rootlocation + + + + + + define-build-timestamp + + guacamole.build.identifier + build + yyyyMMddHHmmss + + + timestamp-property + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + list-maven-runtime-dependencies + generate-resources + + runtime + false + org.apache.guacamole + ${dependency.list.directory}/maven-runtime-dependencies.txt + + + list + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M3 + + + enforce + + + + + + + + enforce + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + -Xlint:all + + true + true + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + generate-license-files + none + + ${rootlocation}/doc/licenses/generate-license-files.sh + + ${dependency.list.directory} + ${project.build.directory}/licenses + + + ${ignoreLicenseErrors} + + + + exec + + + + + + + + com.github.buckelieg + minify-maven-plugin + 2.0.1 + + + org.codehaus.plexus + plexus-utils + 3.5.1 + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + false + 8 + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar + + + + + + + + + + + + + + + + com.google.guava + guava + ${guava.version} + + + + + com.google.inject + guice + ${guice.version} + + + com.google.inject.extensions + guice-assistedinject + ${guice.version} + + + com.google.inject.extensions + guice-servlet + ${guice.version} + + + + + com.github.seancfoley + ipaddress + ${ipaddress.version} + + + + + org.glassfish.jersey.containers + jersey-container-servlet-core + ${jersey.version} + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + org.glassfish.hk2 + guice-bridge + ${hk2.version} + + + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + + + javax.xml.stream + stax-api + + + + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson.version} + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jul-to-slf4j + ${slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + + + org.junit.jupiter + junit-jupiter-params + ${junit.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + + + junit + junit + ${junit4.version} + test + + + + + + + + + + build-dist-archive + + src/main/assembly/dist.xml + + + + + maven-assembly-plugin + 3.3.0 + + + make-dist-archive + package + + false + posix + + src/main/assembly/dist.xml + + + + single + + + + + + + + + + + check-dependencies + + + checkDependencies + true + + + + + + + + org.codehaus.mojo + versions-maven-plugin + 2.16.0 + + false + *:*:*:*:*:provided,*:*:*:*:*:system + ${project.build.directory}/dependency-update-report.txt + + + + regex + (.+-SNAPSHOT|.+-(M|RC)\d+) + + + regex + .+-(alpha|Alpha|beta|Beta)[0-9]*\b.*? + + + + + ch.qos.logback + logback-classic + + + regex + 1\.[45]\..+ + + + + + + + + + check-dependency-updates + validate + + display-dependency-updates + + + + + + + + org.owasp + dependency-check-maven + 8.3.1 + + true + true + true + /-/npm/v1/security/advisories/bulk + + + + check-dependency-updates + validate + + check + + + + + + + + + + + + diff --git a/src/main/assembly/dist.xml b/src/main/assembly/dist.xml new file mode 100644 index 0000000..53a98e6 --- /dev/null +++ b/src/main/assembly/dist.xml @@ -0,0 +1,55 @@ + + + + + project + + tar.gz + + + + + + + ${project.basedir} + true + + **/*.log + **/node_modules/** + **/${project.build.directory}/** + + + + + + ${project.basedir} + false + + **/.gitignore + + + + + + diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..c9b8f72 --- /dev/null +++ b/start.sh @@ -0,0 +1,1276 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn start.sh +## +## Automatically configures and starts Guacamole under Tomcat. Guacamole's +## guacamole.properties file will be automatically generated based on the +## linked database container (either MySQL, PostgreSQL or SQLServer) and the linked guacd +## container. The Tomcat process will ultimately replace the process of this +## script, running in the foreground until terminated. +## + +GUACAMOLE_HOME_TEMPLATE="$GUACAMOLE_HOME" + +GUACAMOLE_HOME="$HOME/.guacamole" +GUACAMOLE_EXT="$GUACAMOLE_HOME/extensions" +GUACAMOLE_LIB="$GUACAMOLE_HOME/lib" +GUACAMOLE_PROPERTIES="$GUACAMOLE_HOME/guacamole.properties" + +## +## Sets the given property to the given value within guacamole.properties, +## creating guacamole.properties first if necessary. +## +## @param NAME +## The name of the property to set. +## +## @param VALUE +## The value to set the property to. +## +set_property() { + + NAME="$1" + VALUE="$2" + + # Ensure guacamole.properties exists + if [ ! -e "$GUACAMOLE_PROPERTIES" ]; then + mkdir -p "$GUACAMOLE_HOME" + echo "# guacamole.properties - generated $(date)" >"$GUACAMOLE_PROPERTIES" + fi + + # Set property + echo "$NAME: $VALUE" >>"$GUACAMOLE_PROPERTIES" + +} + +## +## Sets the given property to the given value within guacamole.properties only +## if a value is provided, creating guacamole.properties first if necessary. +## +## @param NAME +## The name of the property to set. +## +## @param VALUE +## The value to set the property to, if any. If omitted or empty, the +## property will not be set. +## +set_optional_property() { + + NAME="$1" + VALUE="$2" + + # Set the property only if a value is provided + if [ -n "$VALUE" ]; then + set_property "$NAME" "$VALUE" + fi + +} + +# Print error message regarding missing required variables for MySQL authentication +mysql_missing_vars() { + cat <= 40 characters. +## +associate_duo() { + # Verify required parameters are present + if [ -z "$DUO_INTEGRATION_KEY" ] || + [ -z "$DUO_SECRET_KEY" ] || + [ ${#DUO_APPLICATION_KEY} -lt 40 ]; then + cat < element + xmlstarlet edit --inplace \ + --insert '/Server/Service/Engine/Host/*' --type elem -n Valve \ + --insert '/Server/Service/Engine/Host/Valve[not(@className)]' --type attr -n className -v org.apache.catalina.valves.RemoteIpValve \ + $CATALINA_BASE/conf/server.xml + + # Allowed IPs + if [ -z "$PROXY_ALLOWED_IPS_REGEX" ]; then + echo "Using default Tomcat allowed IPs regex" + else + xmlstarlet edit --inplace \ + --insert '/Server/Service/Engine/Host/Valve[@className="org.apache.catalina.valves.RemoteIpValve"]' \ + --type attr -n internalProxies -v "$PROXY_ALLOWED_IPS_REGEX" \ + $CATALINA_BASE/conf/server.xml + fi + + # X-Forwarded-For + if [ -z "$PROXY_IP_HEADER" ]; then + echo "Using default Tomcat proxy IP header" + else + xmlstarlet edit --inplace \ + --insert "/Server/Service/Engine/Host/Valve[@className='org.apache.catalina.valves.RemoteIpValve']" \ + --type attr -n remoteIpHeader -v "$PROXY_IP_HEADER" \ + $CATALINA_BASE/conf/server.xml + fi + + # X-Forwarded-Proto + if [ -z "$PROXY_PROTOCOL_HEADER" ]; then + echo "Using default Tomcat proxy protocol header" + else + xmlstarlet edit --inplace \ + --insert "/Server/Service/Engine/Host/Valve[@className='org.apache.catalina.valves.RemoteIpValve']" \ + --type attr -n protocolHeader -v "$PROXY_PROTOCOL_HEADER" \ + $CATALINA_BASE/conf/server.xml + fi + + # X-Forwarded-By + if [ -z "$PROXY_BY_HEADER" ]; then + echo "Using default Tomcat proxy forwarded by header" + else + xmlstarlet edit --inplace \ + --insert "/Server/Service/Engine/Host/Valve[@className='org.apache.catalina.valves.RemoteIpValve']" \ + --type attr -n remoteIpProxiesHeader -v "$PROXY_BY_HEADER" \ + $CATALINA_BASE/conf/server.xml + fi +} + +## +## Adds api-session-timeout to guacamole.properties +## +associate_apisessiontimeout() { + set_optional_property "api-session-timeout" "$API_SESSION_TIMEOUT" +} + +## +## Starts Guacamole under Tomcat, replacing the current process with the +## Tomcat process. As the current process will be replaced, this MUST be the +## last function run within the script. +## +start_guacamole() { + + # User-only writable CATALINA_BASE + CATALINA_BASE=$HOME/tomcat + CATALINA_HOME=/usr/local/tomcat + export CATALINA_BASE=$HOME/tomcat + export CATALINA_HOME=/usr/local/tomcat + for dir in logs temp webapps work; do + mkdir -p $CATALINA_BASE/$dir + done + cp -R /usr/local/tomcat/conf $CATALINA_BASE + + # Set up Tomcat RemoteIPValve + if [ "$REMOTE_IP_VALVE_ENABLED" = "true" ]; then + enable_remote_ip_valve + fi + + # Install webapp + ln -sf /opt/guacamole/guacamole.war $CATALINA_BASE/webapps/${WEBAPP_CONTEXT:-guacamole}.war + + # Start tomcat + cd /usr/local/tomcat + exec bin/catalina.sh run + +} + +# +# Start with a fresh GUACAMOLE_HOME +# + +rm -Rf "$GUACAMOLE_HOME" + +# +# Copy contents of provided GUACAMOLE_HOME template, if any +# + +if [ -n "$GUACAMOLE_HOME_TEMPLATE" ]; then + cp -a "$GUACAMOLE_HOME_TEMPLATE/." "$GUACAMOLE_HOME/" +fi + +# +# Create and define Guacamole lib and extensions directories +# + +mkdir -p "$GUACAMOLE_EXT" +mkdir -p "$GUACAMOLE_LIB" + +# +# Point to associated guacd +# + +# Use linked container for guacd if specified +if [ -n "$GUACD_NAME" ]; then + GUACD_HOSTNAME="$GUACD_PORT_4822_TCP_ADDR" + GUACD_PORT="$GUACD_PORT_4822_TCP_PORT" +fi + +# Use default guacd port if none specified +GUACD_PORT="${GUACD_PORT-4822}" + +# Verify required guacd connection information is present +if [ -z "$GUACD_HOSTNAME" -o -z "$GUACD_PORT" ]; then + cat </dev/null) + if [[ "$(echo $?)" == "1" ]]; then + echo "Database already exists" + /usr/bin/mariadb -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE -h $MYSQL_HOSTNAME --port $MYSQL_PORT <$i + break + else + echo "MYSQL database automaticaly initialized." + fi + done +fi + +# +# Finally start Guacamole (under Tomcat) +# + +start_guacamole